From dc892d2a4fc6e0e022c2d740a79a2ccc5b27159f Mon Sep 17 00:00:00 2001 From: equilet <2237372+equilet@users.noreply.github.com> Date: Tue, 30 May 2023 13:44:11 -0400 Subject: [PATCH] removing build files from repo --- docs/morphograph.maxref.xml | 4 +- help/morphograph.maxhelp | 449 ++++++++++++++---- .../UserInterfaceState.xcuserstate | Bin 31674 -> 37033 bytes source/mgraph.h | 40 +- source/morphograph.cpp | 382 ++++++++++----- 5 files changed, 639 insertions(+), 236 deletions(-) diff --git a/docs/morphograph.maxref.xml b/docs/morphograph.maxref.xml index 00db4e0..66f2b1f 100644 --- a/docs/morphograph.maxref.xml +++ b/docs/morphograph.maxref.xml @@ -1,7 +1,7 @@ - + analyze an audio buffer, and export a graphic score @@ -18,7 +18,7 @@ - Jeff Lubow, Carmine Cella + Linda Bouchard, Jeff Lubow, Carmine Cella Analysis Composition Generative diff --git a/help/morphograph.maxhelp b/help/morphograph.maxhelp index 95a0095..6476364 100644 --- a/help/morphograph.maxhelp +++ b/help/morphograph.maxhelp @@ -10,7 +10,7 @@ } , "classnamespace" : "box", - "rect" : [ 86.0, 104.0, 1009.0, 647.0 ], + "rect" : [ 196.0, 129.0, 985.0, 642.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -21,12 +21,12 @@ "gridsnaponopen" : 1, "objectsnaponopen" : 1, "statusbarvisible" : 2, - "toolbarvisible" : 1, - "lefttoolbarpinned" : 0, - "toptoolbarpinned" : 0, - "righttoolbarpinned" : 0, - "bottomtoolbarpinned" : 0, - "toolbars_unpinned_last_save" : 0, + "toolbarvisible" : 0, + "lefttoolbarpinned" : 2, + "toptoolbarpinned" : 2, + "righttoolbarpinned" : 2, + "bottomtoolbarpinned" : 2, + "toolbars_unpinned_last_save" : 15, "tallnewobj" : 0, "boxanimatetime" : 200, "enablehscroll" : 1, @@ -39,13 +39,256 @@ "subpatcher_template" : "Untitled5_template", "assistshowspatchername" : 0, "boxes" : [ { + "box" : { + "id" : "obj-54", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "signal" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 3, + "revision" : 3, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 59.0, 104.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 14.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "Untitled5_template", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-42", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 100.0, 95.0, 24.0 ], + "text" : "prepend open" + } + + } +, { + "box" : { + "id" : "obj-29", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "signal", "bang" ], + "patching_rect" : [ 118.0, 134.0, 53.0, 24.0 ], + "text" : "sfplay~" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-43", + "index" : 2, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 94.0, 36.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-51", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 28.0, 36.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-53", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 118.0, 216.0, 30.0, 30.0 ] + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-53", 0 ], + "source" : [ "obj-29", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-29", 0 ], + "source" : [ "obj-42", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-42", 0 ], + "source" : [ "obj-43", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-29", 0 ], + "source" : [ "obj-51", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 441.5, 482.0, 66.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "fontsize" : 14.0, + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p playback" + } + + } +, { + "box" : { + "channels" : 1, + "id" : "obj-38", + "lastchannelcount" : 0, + "maxclass" : "live.gain~", + "numinlets" : 1, + "numoutlets" : 4, + "outlettype" : [ "signal", "", "float", "list" ], + "parameter_enable" : 1, + "patching_rect" : [ 441.5, 512.0, 37.0, 107.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "out", + "parameter_mmax" : 6.0, + "parameter_mmin" : -70.0, + "parameter_shortname" : "out", + "parameter_type" : 0, + "parameter_unitstyle" : 4 + } + + } +, + "varname" : "live.gain~" + } + + } +, { + "box" : { + "id" : "obj-37", + "maxclass" : "ezdac~", + "numinlets" : 2, + "numoutlets" : 0, + "patching_rect" : [ 488.0, 587.5, 32.0, 32.0 ] + } + + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 413.0, 482.0, 22.0, 22.0 ] + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 13.0, + "id" : "obj-27", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 101.0, 94.0, 426.0, 53.0 ], + "text" : "The Ocular Scores Morphograph object performs user-specified analyses on audio material. It allows the user to choose how these analyses will affect graphic objects in an output SVG score", + "textcolor" : [ 0.537254901960784, 0.537254901960784, 0.537254901960784, 1.0 ] + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 13.0, + "id" : "obj-23", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 101.0, 68.0, 372.0, 22.0 ], + "text" : "analyze an audio buffer, and export graphic score elements" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 36.0, + "id" : "obj-17", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 101.0, 27.0, 611.0, 50.0 ], + "text" : "Ocular Scores, featuring Morphograph" + } + + } +, { "box" : { "id" : "obj-15", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "bang" ], - "patching_rect" : [ 830.0, 499.5, 58.0, 22.0 ], + "patching_rect" : [ 859.0, 452.0, 58.0, 22.0 ], "text" : "loadbang" } @@ -53,13 +296,13 @@ , { "box" : { "id" : "obj-12", - "linecount" : 5, + "linecount" : 4, "maxclass" : "message", "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 830.0, 529.5, 114.0, 76.0 ], - "text" : "/Users/jml/Documents/freelance/linda_bouchard/mgraph_project/mgraph_patchers/" + "patching_rect" : [ 859.0, 482.0, 114.0, 62.0 ], + "text" : "/Users/jml/Documents/freelance/linda_bouchard/mgraph_project/demo/" } } @@ -69,9 +312,9 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 298.5, 212.0, 22.0, 20.0 ], + "patching_rect" : [ 308.5, 208.0, 22.0, 20.0 ], "text" : "3. ", - "textcolor" : [ 1.0, 0.058823529411765, 0.058823529411765, 1.0 ] + "textcolor" : [ 0.988235294117647, 0.0, 0.996078431372549, 1.0 ] } } @@ -81,9 +324,9 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 806.0, 367.0, 150.0, 20.0 ], + "patching_rect" : [ 816.0, 363.0, 150.0, 20.0 ], "text" : "1. define SVG write path", - "textcolor" : [ 1.0, 0.058823529411765, 0.058823529411765, 1.0 ] + "textcolor" : [ 0.988235294117647, 0.0, 0.996078431372549, 1.0 ] } } @@ -94,7 +337,7 @@ "numinlets" : 1, "numoutlets" : 5, "outlettype" : [ "", "", "", "", "" ], - "patching_rect" : [ 780.0, 425.0, 90.0, 22.0 ], + "patching_rect" : [ 790.0, 421.0, 90.0, 22.0 ], "text" : "regexp .+:(.+)" } @@ -107,7 +350,7 @@ "numoutlets" : 1, "outlettype" : [ "bang" ], "parameter_enable" : 0, - "patching_rect" : [ 780.0, 367.0, 24.0, 24.0 ] + "patching_rect" : [ 790.0, 363.0, 24.0, 24.0 ] } } @@ -118,7 +361,7 @@ "numinlets" : 1, "numoutlets" : 2, "outlettype" : [ "", "bang" ], - "patching_rect" : [ 780.0, 401.0, 90.0, 22.0 ], + "patching_rect" : [ 790.0, 397.0, 90.0, 22.0 ], "text" : "opendialog fold" } @@ -130,26 +373,10 @@ "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 316.5, 212.0, 51.0, 22.0 ], + "patching_rect" : [ 326.5, 208.0, 51.0, 22.0 ], "text" : "process" } - } -, { - "box" : { - "border" : 0, - "filename" : "helpdetails.js", - "id" : "obj-2", - "ignoreclick" : 1, - "jsarguments" : [ "morphograph" ], - "maxclass" : "jsui", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "parameter_enable" : 0, - "patching_rect" : [ 14.0, 15.5, 637.0, 113.0 ] - } - } , { "box" : { @@ -229,7 +456,7 @@ "numoutlets" : 1, "outlettype" : [ "" ], "patching_rect" : [ 55.0, 247.0, 109.0, 24.0 ], - "text" : "713728." + "text" : "416990." } } @@ -357,7 +584,7 @@ ] } , - "patching_rect" : [ 285.0, 596.5, 51.0, 22.0 ], + "patching_rect" : [ 295.0, 587.5, 51.0, 22.0 ], "saved_object_attributes" : { "description" : "", "digest" : "", @@ -377,9 +604,9 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 566.0, 159.5, 150.0, 33.0 ], + "patching_rect" : [ 576.0, 155.5, 150.0, 33.0 ], "text" : "2. dbl-click for example specification; edit", - "textcolor" : [ 1.0, 0.058823529411765, 0.058823529411765, 1.0 ] + "textcolor" : [ 0.988235294117647, 0.0, 0.996078431372549, 1.0 ] } } @@ -389,7 +616,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 24.0, 307.0, 94.0, 20.0 ], + "patching_rect" : [ 34.0, 303.0, 94.0, 20.0 ], "text" : "post information" } @@ -400,7 +627,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 28.0, 190.0, 93.0, 20.0 ], + "patching_rect" : [ 37.0, 186.0, 93.0, 20.0 ], "text" : "set active buffer" } @@ -411,7 +638,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 183.0, 190.0, 110.0, 20.0 ], + "patching_rect" : [ 192.0, 186.0, 110.0, 20.0 ], "text" : "set svg export path" } @@ -419,11 +646,10 @@ , { "box" : { "id" : "obj-26", - "linecount" : 2, "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 418.0, 159.5, 76.0, 33.0 ], + "patching_rect" : [ 413.0, 186.0, 124.0, 20.0 ], "text" : "load svg file from disk" } @@ -436,7 +662,7 @@ "numoutlets" : 1, "outlettype" : [ "bang" ], "parameter_enable" : 0, - "patching_rect" : [ 389.0, 159.5, 24.0, 24.0 ] + "patching_rect" : [ 399.0, 155.5, 24.0, 24.0 ] } } @@ -447,7 +673,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 389.0, 237.0, 79.0, 22.0 ], + "patching_rect" : [ 399.0, 233.0, 79.0, 22.0 ], "text" : "prepend load" } @@ -459,7 +685,7 @@ "numinlets" : 1, "numoutlets" : 2, "outlettype" : [ "", "bang" ], - "patching_rect" : [ 389.0, 212.0, 133.0, 22.0 ], + "patching_rect" : [ 399.0, 208.0, 133.0, 22.0 ], "text" : "opendialog @types svg" } @@ -518,7 +744,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 796.0, 367.0, 140.0, 87.0 ], + "patching_rect" : [ 796.0, 367.0, 143.0, 87.0 ], "text" : "hint: the transform properties that you issue with the input dictionary determine the default dimensions for the generated shapes." } @@ -1756,7 +1982,7 @@ ] } , - "patching_rect" : [ 780.0, 310.152261123267749, 87.0, 22.0 ], + "patching_rect" : [ 790.0, 306.152261123267749, 122.0, 22.0 ], "saved_object_attributes" : { "description" : "", "digest" : "", @@ -1765,7 +1991,7 @@ "tags" : "" } , - "text" : "p mapping_api" + "text" : "p \"mapping api / info\"" } } @@ -1776,7 +2002,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 107.0, 549.0, 95.0, 22.0 ], + "patching_rect" : [ 117.0, 540.0, 95.0, 22.0 ], "text" : "prepend replace" } @@ -1788,7 +2014,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 39.0, 486.0, 85.0, 22.0 ], + "patching_rect" : [ 49.0, 474.0, 85.0, 22.0 ], "text" : "prepend prefix" } @@ -1800,7 +2026,7 @@ "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 39.0, 457.0, 80.0, 22.0 ], + "patching_rect" : [ 49.0, 445.0, 80.0, 22.0 ], "text" : "r morphopath" } @@ -1811,7 +2037,7 @@ "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 798.0, 467.652261123267749, 82.0, 22.0 ], + "patching_rect" : [ 808.0, 575.652261123267749, 82.0, 22.0 ], "text" : "s morphopath" } @@ -1823,7 +2049,7 @@ "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 170.0, 159.5, 80.0, 22.0 ], + "patching_rect" : [ 180.0, 155.5, 80.0, 22.0 ], "text" : "r morphopath" } @@ -1832,14 +2058,14 @@ "box" : { "autopopulate" : 1, "id" : "obj-25", - "items" : [ "Brahms_4.wav", ",", "Koonitz.wav" ], + "items" : [ "Allora_1_prt1.aif", ",", "BassGesture.aif", ",", "BowedCymbalNORM.wav", ",", "Brahms_4.wav", ",", "Calzadilla_1.aif", ",", "Coda_Box3_a.aif", ",", "Cymbal_onHead2.wav", ",", "Koonitz.wav", ",", "LoriFreedman_Improv4.wav", ",", "Meandre_1.aif", ",", "Pointillistic.aif", ",", "ReceidingSimple.aif", ",", "Scen2Box(a).aif", ",", "scene 3-box 4.aif", ",", "SustainedTextured_Crackel-Mix.aif", ",", "tongue6.wav", ",", "tongue7_FH.wav", ",", "TrombDrum.wav" ], "maxclass" : "umenu", "numinlets" : 1, "numoutlets" : 3, "outlettype" : [ "int", "", "" ], "parameter_enable" : 0, - "patching_rect" : [ 39.0, 521.0, 155.0, 22.0 ], - "prefix" : "~/Documents/freelance/linda_bouchard/mgraph_project/mgraph_patchers/", + "patching_rect" : [ 49.0, 513.0, 155.0, 22.0 ], + "prefix" : "~/Documents/freelance/linda_bouchard/mgraph_project/demo/", "types" : [ "WAVE", "AIFF", "MP3" ] } @@ -1851,7 +2077,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "bang" ], - "patching_rect" : [ 14.0, 159.5, 58.0, 22.0 ], + "patching_rect" : [ 24.0, 155.5, 58.0, 22.0 ], "text" : "loadbang" } @@ -2032,7 +2258,7 @@ ] } , - "patching_rect" : [ 780.0, 336.152261123267749, 80.0, 22.0 ], + "patching_rect" : [ 790.0, 332.152261123267749, 80.0, 22.0 ], "saved_object_attributes" : { "description" : "", "digest" : "", @@ -2051,7 +2277,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 716.0, 190.0, 150.0, 20.0 ], + "patching_rect" : [ 726.0, 186.0, 150.0, 20.0 ], "text" : "errors if cannot find" } @@ -2063,7 +2289,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 170.0, 212.0, 102.0, 22.0 ], + "patching_rect" : [ 180.0, 208.0, 102.0, 22.0 ], "text" : "prepend set_path" } @@ -2075,7 +2301,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "dictionary" ], - "patching_rect" : [ 540.0, 271.0, 29.0, 22.0 ], + "patching_rect" : [ 550.0, 254.0, 29.0, 22.0 ], "text" : "thru" } @@ -2088,7 +2314,7 @@ "numoutlets" : 1, "outlettype" : [ "bang" ], "parameter_enable" : 0, - "patching_rect" : [ 540.0, 159.5, 24.0, 24.0 ] + "patching_rect" : [ 550.0, 107.5, 44.5, 44.5 ] } } @@ -2097,18 +2323,18 @@ "data" : { "filename" : "mgraph_example.svg", "shape" : "triangles", - "style" : "stroke", + "style" : "both", "descmap" : { "energy" : "size", - "zcr" : "ylocation", - "speckurt" : "xscale", - "speccentr" : "brightness" + "speccrest" : "xscale", + "speckurt" : "brightness", + "zcr" : "ylocation" } , "transform" : { - "width" : 300, - "height" : 300, - "zoom" : 1.0 + "width" : 600, + "height" : 600, + "zoom" : 1 } } @@ -2118,7 +2344,7 @@ "numinlets" : 2, "numoutlets" : 4, "outlettype" : [ "dictionary", "", "", "" ], - "patching_rect" : [ 540.0, 212.0, 164.0, 22.0 ], + "patching_rect" : [ 550.0, 208.0, 164.0, 22.0 ], "saved_object_attributes" : { "embed" : 1, "parameter_enable" : 0, @@ -2137,7 +2363,7 @@ "numoutlets" : 1, "outlettype" : [ "bang" ], "parameter_enable" : 0, - "patching_rect" : [ 170.0, 462.0, 24.0, 24.0 ] + "patching_rect" : [ 180.0, 477.0, 24.0, 24.0 ] } } @@ -2148,7 +2374,7 @@ "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 716.0, 212.0, 89.0, 22.0 ], + "patching_rect" : [ 726.0, 208.0, 89.0, 22.0 ], "text" : "dictionary putty" } @@ -2159,7 +2385,7 @@ "maxclass" : "dict.view", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 540.0, 307.0, 221.0, 315.0 ] + "patching_rect" : [ 550.0, 303.0, 207.0, 264.0 ] } } @@ -2171,7 +2397,7 @@ "numoutlets" : 1, "outlettype" : [ "bang" ], "p_hopsize" : 1024, - "patching_rect" : [ 170.0, 320.652261123267749, 352.0, 132.347738876732251 ] + "patching_rect" : [ 180.0, 299.65226100000001, 357.0, 162.999999999999943 ] } } @@ -2182,7 +2408,7 @@ "numinlets" : 1, "numoutlets" : 2, "outlettype" : [ "float", "bang" ], - "patching_rect" : [ 107.0, 572.5, 197.0, 22.0 ], + "patching_rect" : [ 117.0, 563.5, 197.0, 22.0 ], "text" : "buffer~ morph1 Brahms_4.wav -1 1" } @@ -2195,7 +2421,7 @@ "numoutlets" : 1, "outlettype" : [ "bang" ], "parameter_enable" : 0, - "patching_rect" : [ 28.0, 271.0, 24.0, 24.0 ] + "patching_rect" : [ 38.0, 267.0, 24.0, 24.0 ] } } @@ -2206,7 +2432,7 @@ "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 14.0, 212.0, 69.0, 22.0 ], + "patching_rect" : [ 24.0, 208.0, 69.0, 22.0 ], "text" : "set morph1" } @@ -2218,7 +2444,7 @@ "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 85.0, 212.0, 33.0, 22.0 ], + "patching_rect" : [ 95.0, 208.0, 33.0, 22.0 ], "text" : "view" } @@ -2297,6 +2523,16 @@ , { "patchline" : { "destination" : [ "obj-40", 0 ], + "order" : 1, + "source" : [ "obj-25", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-54", 1 ], + "hidden" : 1, + "order" : 0, "source" : [ "obj-25", 1 ] } @@ -2337,6 +2573,14 @@ "source" : [ "obj-33", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-54", 0 ], + "hidden" : 1, + "source" : [ "obj-34", 0 ] + } + } , { "patchline" : { @@ -2344,6 +2588,24 @@ "source" : [ "obj-35", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-37", 1 ], + "hidden" : 1, + "order" : 0, + "source" : [ "obj-38", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "hidden" : 1, + "order" : 1, + "source" : [ "obj-38", 0 ] + } + } , { "patchline" : { @@ -2386,6 +2648,13 @@ "source" : [ "obj-5", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-38", 0 ], + "source" : [ "obj-54", 0 ] + } + } , { "patchline" : { @@ -2409,13 +2678,21 @@ } ], - "dependency_cache" : [ { - "name" : "helpdetails.js", - "bootpath" : "C74:/help/resources", - "type" : "TEXT", - "implicit" : 1 + "parameters" : { + "obj-38" : [ "out", "out", 0 ], + "parameterbanks" : { + "0" : { + "index" : 0, + "name" : "", + "parameters" : [ "-", "-", "-", "-", "-", "-", "-", "-" ] + } + } -, { +, + "inherited_shortname" : 1 + } +, + "dependency_cache" : [ { "name" : "morphograph.mxo", "type" : "iLaX" } diff --git a/morphograph.xcodeproj/project.xcworkspace/xcuserdata/jml.xcuserdatad/UserInterfaceState.xcuserstate b/morphograph.xcodeproj/project.xcworkspace/xcuserdata/jml.xcuserdatad/UserInterfaceState.xcuserstate index 2b32e9c652d691bce4ddfb488a125d65c104cb3f..4ea22b5acf8e5f022137002c1367fc9e3b9cc156 100644 GIT binary patch delta 18991 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 pPS>0+W7oS~YrA%KebjZV>&&p(_LefnXa# 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 diff --git a/source/mgraph.h b/source/mgraph.h index 4d11111..3254f82 100644 --- a/source/mgraph.h +++ b/source/mgraph.h @@ -15,32 +15,34 @@ #define SHAPE_DIVISOR 8 //#define MAX_NUM_SHAPES 12 //unimplemented -#define NUM_FEATURES 14 +//#define NUM_FEATURES 14 +#define NUM_FEATURES 8 #define FEATURE_ENERGY 0 #define FEATURE_ZCR 1 #define FEATURE_HFC 2 -#define FEATURE_INHARM 3 -#define FEATURE_SPECIRR 4 -#define FEATURE_SPECCENTER 5 -#define FEATURE_SPECSPREAD 6 +#define FEATURE_SPECIRR 3 +#define FEATURE_SPECKURT 4 +#define FEATURE_SPECCREST 5 +#define FEATURE_SPECFLAT 6 #define FEATURE_SPECSKEW 7 -#define FEATURE_SPECKURT 8 -#define FEATURE_SPECFLUX 9 -#define FEATURE_SPECDECR 10 -#define FEATURE_SPECSLOPE 11 -#define FEATURE_SPECFLAT 12 -#define FEATURE_SPECCREST 13 +//#define FEATURE_SPECCENTER 8 +//#define FEATURE_SPECSPREAD 9 +//#define FEATURE_SPECFLUX 10 +//#define FEATURE_SPECDECR 11 +//#define FEATURE_SPECSLOPE 12 +//#define FEATURE_INHARM 13 -#define NUM_ACTIONS 7 +//#define NUM_ACTIONS 7 +#define NUM_ACTIONS 5 -#define PARAM_ROTATION 0 -#define PARAM_XSCALE 1 -#define PARAM_YSCALE 2 -#define PARAM_SIZE 3 -#define PARAM_YLOC 4 -#define PARAM_XDEV 5 -#define PARAM_BRIGHTNESS 6 +#define PARAM_XSCALE 0 +#define PARAM_YSCALE 1 +#define PARAM_SIZE 2 +#define PARAM_YLOC 3 +#define PARAM_BRIGHTNESS 4 +//#define PARAM_ROTATION 5 +//#define PARAM_XDEV 6 #define NUM_SHAPES 6 #define NUM_STYLES 3 diff --git a/source/morphograph.cpp b/source/morphograph.cpp index beeacc1..b42725b 100644 --- a/source/morphograph.cpp +++ b/source/morphograph.cpp @@ -2,6 +2,11 @@ #include "ext.h" //core externals header #include "ext_obex.h" //basic max object functionality + +//need to include??? +#include "ext_path.h" +#include "ext_sysfile.h" + #include "ext_dictobj.h" #include "ext_buffer.h" #include "z_dsp.h" @@ -51,6 +56,12 @@ void morphograph_size(t_morphograph *x, long width, long height); //ui size void morphograph_load(t_morphograph *x, t_symbol *s); void morphograph_process(t_morphograph *x); +//------------------TEST FILE WRITER------------------------------- +//----------------------------------------------------------------- +void morphograph_writefile(t_morphograph *x, char *filename, short path); +void morphograph_dowrite(t_morphograph *x, t_symbol *s); +void morphograph_write(t_morphograph *x, t_symbol *s); + t_max_err morphograph_notify(t_morphograph *x, t_symbol *s, t_symbol *msg, void *sender, void *data); //buffer related //custom/private user methods- internal only @@ -91,7 +102,7 @@ class ShapeWriter { Document *doc; Parameters *params; std::string shape; - float rotation, size, width, height, y, xdev, linewidth; + float rotation, size, width, height, y, xdev, linewidth, trilen, yoffset; unsigned idx, vecsize, bright; double rv; short drawstyle; @@ -102,8 +113,8 @@ private: public: -// ShapeWriter(t_morphograph *_x, std::string &_shape, Document *_doc, double scf, double scnrg, long vsize) { -ShapeWriter(t_morphograph *_x, std::string &_shape, Document *_doc) { + ShapeWriter(t_morphograph *_x, std::string &_shape, Document *_doc) { + //fork out primitive code to be the default, then stroke/fill x = _x; doc = _doc; shape = _shape; @@ -115,9 +126,9 @@ ShapeWriter(t_morphograph *_x, std::string &_shape, Document *_doc) { height = 1.0; y = 0.5; xdev = 0.; - bright = 128; + bright = 0; linewidth = 0.5; - + drawstyle = 0; //stroke } virtual ~ShapeWriter() { @@ -127,10 +138,10 @@ ShapeWriter(t_morphograph *_x, std::string &_shape, Document *_doc) { void draw(){ if(shape == std::string("circles")){ - draw_circle(drawstyle); + draw_circle(); } if(shape == std::string("rectangles")){ - draw_rectangle(drawstyle); + draw_rectangle(); } if(shape == std::string("ellipses")){ draw_ellipse(); @@ -140,7 +151,7 @@ ShapeWriter(t_morphograph *_x, std::string &_shape, Document *_doc) { } if(shape == std::string("triangles")){ //object_error((t_object *)x, "triangle is not implemented."); - draw_triangle(drawstyle); + draw_triangle(); } } @@ -172,10 +183,9 @@ ShapeWriter(t_morphograph *_x, std::string &_shape, Document *_doc) { void set_idx(unsigned _i){ idx = _i; } - void set_brightness(unsigned _bright){ + void set_brightness(char _bright){ bright = _bright; } - void set_drawstyle(std::string _style){ if(_style == std::string("stroke")){ @@ -191,34 +201,86 @@ ShapeWriter(t_morphograph *_x, std::string &_shape, Document *_doc) { private: - void draw_triangle(short style){ - - - double tx = (double)idx / vecsize * params->width; - double ty = y * params->height; - - //Polygon pg = Polygon(Stroke(1, Color(0,0,0))); - Polygon pg = Polygon(Fill(Color(0,0,0))); - - pg << pPoint(tx, ty); - //pPoint p2 = pPoint((tx + 10), ty + 0); - pPoint p2 = pPoint((tx + 10) + (size * 20), ty + 0); - pg << p2; - //pPoint p3 = pPoint((tx + 5), (ty + 10)); - pPoint p3 = pPoint((tx + 5) + (size * 10), (ty + 10) + (size * 20)); - pg << p3; - - (*doc) << pg; + void draw_triangle(){ + switch(drawstyle){ + case 0: { //stroke + //initial pos + double tx = (double)idx / vecsize * params->width; + double ty = (y * params->height) - 10.; + Polygon pg = Polygon(Fill(), Stroke(linewidth, Color(0,0,0))); + pg << pPoint(tx, ty); + double p2x = (tx + (size * 20)) * width; + pPoint p2 = pPoint(p2x, ty + 0); + pg << p2; + double p2y = (ty + (size * 20)) * height; + pPoint p3 = pPoint(tx, p2y); + pg << p3; + + (*doc) << pg; + } + break; + case 1: { //fill + //initial pos + double tx = (double)idx / vecsize * params->width; + double ty = (y * params->height) - 10.; + Polygon pg = Polygon(Fill(Color(bright, bright, bright))); + pg << pPoint(tx, ty); + double p2x = (tx + (size * 20)) * width; + pPoint p2 = pPoint(p2x, ty + 0); + pg << p2; + double p2y = (ty + (size * 20)) * height; + pPoint p3 = pPoint(tx, p2y); + pg << p3; + + (*doc) << pg; + } + break; + + case 2: { //both + //initial pos + double tx = (double)idx / vecsize * params->width; + double ty = (y * params->height) - 10.; + Polygon pg = Polygon(Fill(Color(bright, bright, bright)), Stroke(linewidth, Color(0,0,0))); + pg << pPoint(tx, ty); + double p2x = (tx + (size * 20)) * width; + pPoint p2 = pPoint(p2x, ty + 0); + pg << p2; + double p2y = (ty + (size * 20)) * height; + pPoint p3 = pPoint(tx, p2y); + pg << p3; + + (*doc) << pg; + } + break; + + default: { + //initial pos + double tx = (double)idx / vecsize * params->width; + double ty = (y * params->height) - 10.; + Polygon pg = Polygon(Fill(Color(bright, bright, bright))); + pg << pPoint(tx, ty); + double p2x = (tx + (size * 20)) * width; + pPoint p2 = pPoint(p2x, ty + 0); + pg << p2; + double p2y = (ty + (size * 20)) * height; + pPoint p3 = pPoint(tx, p2y); + pg << p3; + + (*doc) << pg; + } + break; + } + } - void draw_circle(short style){ - switch(style){ + void draw_circle(){ + switch(drawstyle){ case 0: //stroke (*doc) << Circle( pPoint (((double)idx / vecsize) * params->width, y * params->height), (params->width / SHAPE_DIVISOR) * size, Fill(), - Stroke(1, Color (0, 0, 0)) + Stroke(linewidth, Color (0, 0, 0)) ); break; case 1: //fill @@ -248,10 +310,11 @@ private: } } - void draw_rectangle(short style){ + void draw_rectangle(){ //Rectangle(pPoint, width, height); - switch(style){ + switch(drawstyle){ case 0: //stroke + (*doc) << Rectangle( pPoint(((double)idx / vecsize) * params->width, y * params->height), ((width * params->width) / SHAPE_DIVISOR) * size, ((height * params->height) / SHAPE_DIVISOR) * size, @@ -260,6 +323,7 @@ private: ); break; case 1: //fill + object_post((t_object *)x, "fill rectangle called"); (*doc) << Rectangle( pPoint(((double)idx / vecsize) * params->width, y * params->height), ((width * params->width) / SHAPE_DIVISOR) * size, ((height * params->height) / SHAPE_DIVISOR) * size, @@ -267,6 +331,7 @@ private: ); break; case 2: //both + object_post((t_object *)x, "both rectangle called"); (*doc) << Rectangle( pPoint(((double)idx / vecsize) * params->width, y * params->height), ((width * params->width) / SHAPE_DIVISOR) * size, ((height * params->height) / SHAPE_DIVISOR) * size, @@ -276,6 +341,7 @@ private: break; default: + object_post((t_object *)x, "default rectangle called"); (*doc) << Rectangle( pPoint(((double)idx / vecsize) * params->width, y * params->height), ((width * params->width) / SHAPE_DIVISOR) * size, ((height * params->height) / SHAPE_DIVISOR) * size, @@ -392,7 +458,7 @@ public: fname = std::string(x->l_fnamesvg->s_name); fpath = std::string(x->l_filepath->s_name); - Dimensions dims (params.width + OFFSET, params.height + OFFSET); + Dimensions dims (params.width, params.height); doc = new Document (fpath + fname, Layout(dims, Layout::BottomLeft, params.zoom)); } @@ -470,33 +536,33 @@ public: case FEATURE_HFC: { curr_feature_datum = layers[i].desc.hfc[j]; } break; - case FEATURE_INHARM: { - curr_feature_datum = layers[i].desc.inharmonicity[j]; - } break; +// case FEATURE_INHARM: { +// curr_feature_datum = layers[i].desc.inharmonicity[j]; +// } break; case FEATURE_SPECIRR: { curr_feature_datum = layers[i].desc.specirr[j]; } break; - case FEATURE_SPECCENTER: { - curr_feature_datum = layers[i].desc.speccentr[j]; - } break; - case FEATURE_SPECSPREAD: { - curr_feature_datum = layers[i].desc.specspread[j]; - } break; +// case FEATURE_SPECCENTER: { +// curr_feature_datum = layers[i].desc.speccentr[j]; +// } break; +// case FEATURE_SPECSPREAD: { +// curr_feature_datum = layers[i].desc.specspread[j]; +// } break; case FEATURE_SPECSKEW: { curr_feature_datum = layers[i].desc.specskew[j]; } break; case FEATURE_SPECKURT: { curr_feature_datum = layers[i].desc.speckurt[j]; } break; - case FEATURE_SPECFLUX: { - curr_feature_datum = layers[i].desc.specflux[j]; - } break; - case FEATURE_SPECDECR: { - curr_feature_datum = layers[i].desc.specdecr[j]; - } break; - case FEATURE_SPECSLOPE: { - curr_feature_datum = layers[i].desc.specslope[j]; - } break; +// case FEATURE_SPECFLUX: { +// curr_feature_datum = layers[i].desc.specflux[j]; +// } break; +// case FEATURE_SPECDECR: { +// curr_feature_datum = layers[i].desc.specdecr[j]; +// } break; +// case FEATURE_SPECSLOPE: { +// curr_feature_datum = layers[i].desc.specslope[j]; +// } break; case FEATURE_SPECFLAT: { curr_feature_datum = layers[i].desc.specflat[j]; } break; @@ -511,10 +577,10 @@ public: } switch(get_action_id(x, k)){ - case PARAM_ROTATION: { - //unimplemented - object_error((t_object *)x, "render: rotation is unimplemented."); - } break; +// case PARAM_ROTATION: { +// //unimplemented +// object_error((t_object *)x, "render: rotation is unimplemented."); +// } break; case PARAM_XSCALE: { //object_post((t_object *)x, "detected xscale"); swrite.set_width(curr_feature_datum); @@ -532,10 +598,10 @@ public: swrite.set_y(curr_feature_datum); } break; - case PARAM_XDEV: { - //unimplemented - object_error((t_object *)x, "x deviation is unimplemented."); - } break; +// case PARAM_XDEV: { +// //unimplemented +// object_error((t_object *)x, "x deviation is unimplemented."); +// } break; case PARAM_BRIGHTNESS: { char b = curr_feature_datum * 255; swrite.set_brightness(b); @@ -703,8 +769,9 @@ static void analyse_cpp(t_morphograph *x, Descriptors &d, BufferInstance *b) { } int ptr = 0; + bool feature_valid = true; - while (ptr < nsamps) { + while (ptr < nsamps && feature_valid) { if (p.fft_size + ptr > nsamps) break; // discard incomplete frame //run fft() @@ -733,6 +800,8 @@ static void analyse_cpp(t_morphograph *x, Descriptors &d, BufferInstance *b) { sum += a * a; } double e = std::sqrt (sum / p.fft_size); //we push this later + d.energy.push_back(e * 10.); + //d.energy.push_back(e); //centroid double sc = speccentr(&s[0], &freqs[0], p.fft_size / 2); @@ -750,7 +819,7 @@ static void analyse_cpp(t_morphograph *x, Descriptors &d, BufferInstance *b) { switch(get_feature_id(x, i)) { case FEATURE_ENERGY: { object_post((t_object *)x, "spec energy: %f", e * 10.); - d.energy.push_back(e * 10.); + //d.energy.push_back(e * 10.); } break; case FEATURE_ZCR: { //double z = zcr(&vsamples[ptr], p.fft_size / 2); @@ -763,65 +832,65 @@ static void analyse_cpp(t_morphograph *x, Descriptors &d, BufferInstance *b) { object_post((t_object *)x, "hfc: %f", h); d.hfc.push_back(h); } break; - case FEATURE_INHARM: { - //don't understand how to implement this - //double ih = inharmonicity(&s[0], &freqs[0], p.fft_size, <#T f0#>, <#T R#>, <#T &sumAmpl#>) - object_error((t_object *)x, "inharmonicity is currently unimplemented."); - return; - } break; +// case FEATURE_INHARM: { +// //don't understand how to implement this +// //double ih = inharmonicity(&s[0], &freqs[0], p.fft_size, <#T f0#>, <#T R#>, <#T &sumAmpl#>) +// object_error((t_object *)x, "inharmonicity is currently unimplemented."); +// feature_valid = false; +// } break; case FEATURE_SPECIRR: { double si = specirr(&s[0], p.fft_size / 2); - object_post((t_object *)x, "spec irr: %f", si); - d.specirr.push_back(si); - } break; - case FEATURE_SPECCENTER: { - //skip bc we already compute - should take this out - object_post((t_object *)x, "spec centroid: %f", sc); - } break; - case FEATURE_SPECSPREAD:{ - //skip bc we already compute - should take this out - object_post((t_object *)x, "spec spread: %f", sspr); + object_post((t_object *)x, "spec irr: %f", si * 0.001); + d.specirr.push_back(si * 0.001); } break; +// case FEATURE_SPECCENTER: { +// //skip bc we already compute - should take this out +// object_post((t_object *)x, "spec centroid: %f", sc); +// } break; +// case FEATURE_SPECSPREAD:{ +// //skip bc we already compute - should take this out +// object_post((t_object *)x, "spec spread: %f", sspr); +// } break; case FEATURE_SPECSKEW: { double ssk = specskew(&s[0], &freqs[0], p.fft_size / 2, sc, sspr); - object_post((t_object *)x, "spec skew: %f", ssk); - d.specskew.push_back(ssk); + object_post((t_object *)x, "spec skew: %f", ssk * 0.1); + d.specskew.push_back(ssk * 0.1); } break; case FEATURE_SPECKURT: { double k = speckurt(&s[0], &freqs[0], p.fft_size / 2, sc, sspr); object_post((t_object *)x, "spec kurt: %f", k); d.speckurt.push_back(k * 0.01); } break; - case FEATURE_SPECFLUX: { - //how to calculate the old amplitudes... ??? - //double f = specflux(&s[0], oa, p.fft_size); - object_error((t_object *)x, "spectral flux is currently unimplemented."); - return; - } break; - case FEATURE_SPECDECR: { - double sd = specdecr(&s[0], p.fft_size / 2); - object_post((t_object *)x, "spec decrease: %f", sd); - d.specdecr.push_back(sd); - } break; - case FEATURE_SPECSLOPE: { - double ssl = specslope(&s[0], &freqs[0], p.fft_size / 2); - object_post((t_object *)x, "spec slope: %f", ssl); - d.specslope.push_back(ssl); - } break; +// case FEATURE_SPECFLUX: { +// //how to calculate the old amplitudes... ??? +// //double f = specflux(&s[0], oa, p.fft_size); +// object_error((t_object *)x, "spectral flux is currently unimplemented."); +// feature_valid = false; +// } break; +// case FEATURE_SPECDECR: { +// double sd = specdecr(&s[0], p.fft_size / 2); +// object_post((t_object *)x, "spec decrease: %f", sd); +// d.specdecr.push_back(sd); +// } break; +// case FEATURE_SPECSLOPE: { +// double ssl = specslope(&s[0], &freqs[0], p.fft_size / 2); +// object_post((t_object *)x, "spec slope: %f", ssl); +// d.specslope.push_back(ssl); +// } break; case FEATURE_SPECFLAT: { double sf = specflat(&s[0], p.fft_size / 2); - object_post((t_object *)x, "spec flatness: %f", sf); - d.specflat.push_back(sf); + object_post((t_object *)x, "spec flatness: %f", sf * 10000.); + d.specflat.push_back(sf * 10000.); } break; case FEATURE_SPECCREST: { double scr = speccrest(&s[0], p.fft_size / 2); - object_post((t_object *)x, "spec crest: %f", scr); - d.speccrest.push_back(scr); + object_post((t_object *)x, "spec crest: %f", scr * 10); + d.speccrest.push_back(scr * 10); } break; default: { object_error((t_object *)x, "analysis: cannot find valid feature id."); - return; + feature_valid = false; } } } @@ -1036,27 +1105,31 @@ static void populate_features(t_morphograph *x){ x->l_features[0] = (char *)"energy"; x->l_features[1] = (char *)"zcr"; x->l_features[2] = (char *)"hfc"; - x->l_features[3] = (char *)"inharmonicity"; - x->l_features[4] = (char *)"specirr"; - x->l_features[5] = (char *)"speccentr"; - x->l_features[6] = (char *)"specspread"; + x->l_features[3] = (char *)"specirr"; + x->l_features[4] = (char *)"speckurt"; + x->l_features[5] = (char *)"speccrest"; + x->l_features[6] = (char *)"specflat"; x->l_features[7] = (char *)"specskew"; - x->l_features[8] = (char *)"speckurt"; - x->l_features[9] = (char *)"specflux"; - x->l_features[10] = (char *)"specdecr"; - x->l_features[11] = (char *)"specslope"; - x->l_features[12] = (char *)"specflat"; - x->l_features[13] = (char *)"speccrest"; + +// x->l_features[8] = (char *)"speccentr"; +// x->l_features[9] = (char *)"specspread"; +// x->l_features[10] = (char *)"specflux"; +// x->l_features[11] = (char *)"specdecr"; +// x->l_features[12] = (char *)"specslope"; +// x->l_features[13] = (char *)"inharmonicity"; } static void populate_actions(t_morphograph *x){ - x->l_actions[0] = (char *)"rotation"; - x->l_actions[1] = (char *)"xscale"; - x->l_actions[2] = (char *)"yscale"; - x->l_actions[3] = (char *)"size"; - x->l_actions[4] = (char *)"ylocation"; - x->l_actions[5] = (char *)"xdeviation"; - x->l_actions[6] = (char *)"brightness"; + + x->l_actions[0] = (char *)"xscale"; + x->l_actions[1] = (char *)"yscale"; + x->l_actions[2] = (char *)"size"; + x->l_actions[3] = (char *)"ylocation"; + x->l_actions[4] = (char *)"brightness"; + +// x->l_actions[5] = (char *)"rotation"; +// x->l_actions[6] = (char *)"xdeviation"; + } static void populate_shapes(t_morphograph *x){ @@ -1170,7 +1243,7 @@ void morphograph_set(t_morphograph *x, t_symbol *s) { void morphograph_set_path(t_morphograph *x, t_symbol *s) { x->l_filepath = s; - object_post((t_object *)x, "the path: %s", x->l_filepath->s_name); + object_post((t_object *)x, "svg write path: %s", x->l_filepath->s_name); } //this should be handled by the process_descmap() function @@ -1278,6 +1351,7 @@ void morphograph_load(t_morphograph *x, t_symbol *s){ } else { //path is input by user (via open dialog object for ex) strcpy(filename,s->s_name); + // locatefile_extended(<#char *name#>, <#short *outvol#>, <#t_fourcc *outtype#>, <#const t_fourcc *filetypelist#>, <#short numtypes#>) if (!locatefile_extended(filename, &pathid, &outtype, type, ntype)) { //continue } else { @@ -1337,20 +1411,21 @@ void morphograph_paint(t_morphograph *x, t_object *patcherview) { jsvg_render(x->l_svg, g); }else{ - t_jrgba color, color_r; - double offset = 5.; - double offset2 = 10.; + t_jrgba color_bg, color_rr; + double offset = 2.; + double offset2 = 7.; //alpha is transparent if zero - color.red = 0.; color.green = 1.; color.blue = 0.; color.alpha = 1.; - color_r.red = 0.2; color_r.green = 0.5; color_r.blue = 0.; color_r.alpha = 1.; - + color_bg.red = 0.064286; color_bg.green = 0.315738; color_bg.blue = 0.364286; color_bg.alpha = 1.; + color_rr.red = 0.217857; color_rr.green = 0.492961; color_rr.blue = 0.496429; color_rr.alpha = 1.; - jgraphics_set_source_jrgba(g, &color); - jgraphics_rectangle(g, offset, offset, rect.width - offset*2, rect.height - offset*2); + + + jgraphics_set_source_jrgba(g, &color_bg); + jgraphics_rectangle(g, 0, 0, rect.width, rect.height); jgraphics_fill(g); - jgraphics_set_source_jrgba(g, &color_r); + jgraphics_set_source_jrgba(g, &color_rr); jgraphics_rectangle_rounded(g, offset2, offset2, rect.width - offset2*2, rect.height - offset2*2, 30, 30); jgraphics_fill(g); } @@ -1358,10 +1433,57 @@ void morphograph_paint(t_morphograph *x, t_object *patcherview) { } + + //------------------------------------------------------------------------------------------------- //c functions: std max api //------------------------------------------------------------------------------------------------- +//test filewriter --------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------- +void morphograph_write(t_morphograph *x, t_symbol *s){ + defer(x, (method)morphograph_dowrite, s, 0, NULL); +} + +void morphograph_dowrite(t_morphograph *x, t_symbol *s){ +// long filetype = 'TEXT', outtype; + char filename[512]; + //short path; + + //jml + short pathid; + t_fourcc type = NULL; + t_fourcc otype; + + //prev + //saveasdialog_extended(filename, &path, &outtype, &filetype, 1) + + if (s == gensym("")) { // if no argument supplied, ask for file + if (saveasdialog_extended(filename, &pathid, &otype, &type, 1)) // non-zero: user cancelled + return; + } else { + strcpy(filename, s->s_name); + pathid = path_getdefault(); + } + morphograph_writefile(x, filename, pathid); +} + +void morphograph_writefile(t_morphograph *x, char *filename, short path){ + + char *buf = (char *)"write me into a file"; + + long err; + t_filehandle fh; + + err = path_createsysfile(filename, path, 'TEXT', &fh); + if (err) + return; + err = sysfile_writetextfile(fh, &buf, TEXT_LB_NATIVE); + sysfile_close(fh); + +} +//------------------------------------------------------------------------------------------------- + void morphograph_anything(t_morphograph *x, const t_symbol * const s, const long ac, const t_atom *av){ } @@ -1490,7 +1612,9 @@ void ext_main(void *r) { class_addmethod(c, (method)morphograph_anything, "anything", A_GIMME, 0); class_addmethod(c, (method)morphograph_bang, "bang", 0); class_addmethod(c, (method)morphograph_assist, "assist", A_CANT, 0); - + //test text stuff + class_addmethod(c, (method)morphograph_write, "write", A_DEFSYM, 0); + //register custom user methods class_addmethod(c, (method)morphograph_set, "set", A_SYM, 0); class_addmethod(c, (method)morphograph_size, "size", A_LONG, A_LONG, 0); -- 2.34.1