diff --git a/.gitignore b/.gitignore index 3af64a4..521fbc2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,9 +3,13 @@ gen_dsp/ build/ source/build* notes/ +graham/ examples/*.cpp examples/*.h +examples/*.json help/*.cpp help/*.h +help/*.json templates/*.cpp -templates/*.h \ No newline at end of file +templates/*.h +templates/*.json \ No newline at end of file diff --git a/README.md b/README.md index 4d9131f..6fe7c9d 100644 --- a/README.md +++ b/README.md @@ -33,9 +33,7 @@ Hardware voltages are mapped to gen~ -1..1 ### MIDI -- `in midi` will give you a signal packed with any incoming MIDI bytes (see examples on parsing the signal). `` just needs to be an output channel number that isn't being used for anything else. - -For MIDI output features, see the [wiki page](https://github.com/electro-smith/oopsy/wiki/MIDI-output) documentation. +For [MIDI input](https://github.com/electro-smith/oopsy/wiki/MIDI-Input) and [MIDI output](https://github.com/electro-smith/oopsy/wiki/MIDI-output) features, see the wiki pages documentation. ## Using from within Max diff --git a/code/oopsy.ctrl.smooth2.gendsp b/code/oopsy.ctrl.smooth2.gendsp index e26e7f3..98b2870 100644 --- a/code/oopsy.ctrl.smooth2.gendsp +++ b/code/oopsy.ctrl.smooth2.gendsp @@ -45,7 +45,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 254.0, 61.0, 150.0, 114.0 ], + "patching_rect" : [ 304.0, 62.0, 150.0, 114.0 ], "text" : "A 2-pole lowpass filter at 10Hz seems to effectively silence noise from hardware input ADCs.\n\nBut a 10Hz filter might be too slow to respond, if so, try the smooth3 option." } @@ -104,20 +104,6 @@ "text" : "mix" } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-10", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 127.5, 53.0, 109.0, 23.0 ], - "text" : "* twopi/samplerate" - } - } , { "box" : { @@ -139,11 +125,11 @@ "fontsize" : 12.0, "id" : "obj-5", "maxclass" : "newobj", - "numinlets" : 1, + "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 127.5, 84.0, 26.0, 23.0 ], - "text" : "sin" + "patching_rect" : [ 127.5, 84.0, 158.0, 23.0 ], + "text" : "fastsin 10*twopi/samplerate" } } @@ -160,20 +146,6 @@ "text" : "in 1" } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 127.5, 23.0, 22.0, 23.0 ], - "text" : "10" - } - } ], "lines" : [ { @@ -182,13 +154,6 @@ "source" : [ "obj-1", 0 ] } - } -, { - "patchline" : { - "destination" : [ "obj-5", 0 ], - "source" : [ "obj-10", 0 ] - } - } , { "patchline" : { @@ -196,13 +161,6 @@ "source" : [ "obj-14", 0 ] } - } -, { - "patchline" : { - "destination" : [ "obj-10", 0 ], - "source" : [ "obj-2", 0 ] - } - } , { "patchline" : { diff --git a/code/oopsy.ctrl.smooth3.gendsp b/code/oopsy.ctrl.smooth3.gendsp index 9cb3de8..5f9e69a 100644 --- a/code/oopsy.ctrl.smooth3.gendsp +++ b/code/oopsy.ctrl.smooth3.gendsp @@ -45,7 +45,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 276.0, 35.0, 150.0, 181.0 ], + "patching_rect" : [ 304.0, 35.0, 150.0, 181.0 ], "text" : "A 3-pole lowpass filter at 30Hz seems to effectively silence any noise from hardware input ADCs.\n\nMost of the time this level of aggressive smoothing is probably unnecessary, but for some applications that are very sensitive (e.g. setting long delay line lengths) it might be needed." } @@ -132,20 +132,6 @@ "text" : "mix" } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-10", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 127.5, 53.0, 109.0, 23.0 ], - "text" : "* twopi/samplerate" - } - } , { "box" : { @@ -167,11 +153,11 @@ "fontsize" : 12.0, "id" : "obj-5", "maxclass" : "newobj", - "numinlets" : 1, + "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 127.5, 84.0, 26.0, 23.0 ], - "text" : "sin" + "patching_rect" : [ 127.5, 84.0, 158.0, 23.0 ], + "text" : "fastsin 30*twopi/samplerate" } } @@ -188,20 +174,6 @@ "text" : "in 1" } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 127.5, 23.0, 22.0, 23.0 ], - "text" : "30" - } - } ], "lines" : [ { @@ -210,13 +182,6 @@ "source" : [ "obj-1", 0 ] } - } -, { - "patchline" : { - "destination" : [ "obj-5", 0 ], - "source" : [ "obj-10", 0 ] - } - } , { "patchline" : { @@ -248,13 +213,6 @@ "source" : [ "obj-14", 0 ] } - } -, { - "patchline" : { - "destination" : [ "obj-10", 0 ], - "source" : [ "obj-2", 0 ] - } - } , { "patchline" : { @@ -324,8 +282,7 @@ } } - ], - "autosave" : 0 + ] } } diff --git a/code/oopsy.cv2hz.gendsp b/code/oopsy.cv2hz.gendsp index 49d76ce..60800a0 100644 --- a/code/oopsy.cv2hz.gendsp +++ b/code/oopsy.cv2hz.gendsp @@ -104,8 +104,8 @@ "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 421.0, 150.0, 42.0, 22.0 ], - "text" : "pow" + "patching_rect" : [ 421.0, 150.0, 50.0, 22.0 ], + "text" : "fastpow" } } @@ -124,11 +124,11 @@ , { "box" : { "id" : "obj-15", - "linecount" : 14, + "linecount" : 13, "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 23.0, 20.0, 354.0, 194.0 ], + "patching_rect" : [ 23.0, 20.0, 356.0, 181.0 ], "text" : "CV to Hz is somewhat arbitrary, with a variety of conventions in wide use. \n\nOne widespread convention is that adding one volt will increase pitch by one octave (every 2^1/12 volt is a semitone), which is implemented here. The base tuning of an integer voltage is mostly a \"C\", which is also implemented here, but see https://learningmodular.com/matching-octaves-in-your-modular to see how much the register can vary in hardware; 0v, 1v, 2v and 3v are all widespread tunings for MIDI note 60 (C4) for example.\n\nYou can shift the register simply by adding an integer to the input CV. Here we chose 3v == C4/MIDI 60 as a default." } diff --git a/code/oopsy.gate.trig.gendsp b/code/oopsy.gate.trig.gendsp new file mode 100644 index 0000000..716b5dd --- /dev/null +++ b/code/oopsy.gate.trig.gendsp @@ -0,0 +1,173 @@ +{ + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 84.0, 103.0, 579.0, 331.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "fontname" : "Courier", + "id" : "obj-5", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 124.0, 217.0, 409.0, 42.0 ], + "text" : "e.g. \nINPUT: 0 0 0 0 1 1 1 1 0 0 0 0 -1 -1 -1 0 0 0 0\nOUTPUT: 0 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0" + } + + } +, { + "box" : { + "fontname" : "Geneva", + "fontsize" : 10.0, + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 28.0, 87.5, 25.0, 21.0 ], + "text" : "int" + } + + } +, { + "box" : { + "fontname" : "Arial", + "id" : "obj-2", + "linecount" : 10, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 124.0, 58.0, 409.0, 141.0 ], + "text" : "Converts any gate-like signal into a signed trig of its rising and falling edges. \n\nEncoders and switches output gates like 0, 1, and sometimes -1, but since they are sampled at block rate (normally 48 samples), this results in a step function. \n\nIf you want a single-sample trigger for these events, e.g. for routing an encoder into an [accum] for an endless rotary kind of behaviour, this simple circuit will do the job." + } + + } +, { + "box" : { + "fontname" : "Geneva", + "fontsize" : 10.0, + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 46.5, 131.0, 54.0, 21.0 ], + "text" : "change" + } + + } +, { + "box" : { + "fontname" : "Geneva", + "fontsize" : 10.0, + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 28.0, 155.0, 35.0, 21.0 ], + "text" : "eqp" + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 28.0, 24.0, 154.0, 22.0 ], + "text" : "in 1 gate-switch-or-encoder" + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 28.0, 268.0, 133.0, 22.0 ], + "text" : "out 1 single-sample-trig" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-13", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "order" : 1, + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "order" : 0, + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 1 ], + "source" : [ "obj-8", 0 ] + } + + } + ] + } + +} diff --git a/code/oopsy.gate2clock.gendsp b/code/oopsy.gate2clock.gendsp new file mode 100644 index 0000000..6a0785e --- /dev/null +++ b/code/oopsy.gate2clock.gendsp @@ -0,0 +1,725 @@ +{ + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 84.0, 103.0, 928.0, 506.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-8", + "linecount" : 14, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 592.0, 24.0, 315.0, 194.0 ], + "text" : "Note: this doesn't do anything clever in terms of tracking an unstable tempo, it just compares the duration of the last two triggers and syncs to the last one. \n\nThis should work fine for gate inputs. In fact it will also handle irregular step patterns in an interesting and useful way. Try sending a varying gate pattern (based on a common meter) to the input; it works great!\n\nBut if your clock source is a little unstable (very possible with MIDI clocks sources) and you know it should really be a steady pulse, you probably want to average durations over several triggers and insert a phase locked loop algorithm to keep things in sync. " + } + + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 209.0, 384.0, 160.0, 20.0 ], + "text" : "a tempo-synced phasor" + } + + } +, { + "box" : { + "id" : "obj-19", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 109.0, 418.0, 160.0, 60.0 ], + "text" : "a single-sample impulse;\nif you need to send this to a gate output, pass it through [oopsy.gate.min] first" + } + + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 453.5, 252.0, 29.0, 22.0 ], + "text" : "/ 60" + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 453.5, 310.0, 62.0, 22.0 ], + "text" : "out 5 bpm" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 265.5, 310.0, 83.0, 22.0 ], + "text" : "out 3 samples" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 160.0, 173.0, 44.0, 22.0 ], + "text" : "history" + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 127.0, 232.0, 52.0, 22.0 ], + "text" : "switch 0" + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 209.0, 173.0, 25.0, 22.0 ], + "text" : "!/ 1" + } + + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 127.0, 263.0, 55.0, 22.0 ], + "text" : "wrap 0 1" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 160.0, 202.0, 68.0, 22.0 ], + "text" : "+" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 127.0, 384.0, 75.0, 22.0 ], + "text" : "out 2 phasor" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 50.0, 418.0, 55.0, 22.0 ], + "text" : "out 1 trig" + } + + } +, { + "box" : { + "id" : "obj-1", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 150.0, 24.0, 314.0, 47.0 ], + "text" : "any signal that rises from exactly zero or less to anything above zero will be treated as a clock trigger; a \"param gate\" will work for this, as should a \"param midi_clock\"" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 109.0, 128.0, 600.0, 450.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 114.0, 26.0, 22.0 ], + "text" : "> 0" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 80.0, 48.0, 22.0 ], + "text" : "change" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 14.0, 28.0, 22.0 ], + "text" : "in 1" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 50.0, 26.0, 22.0 ], + "text" : "> 0" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 50.0, 155.0, 35.0, 22.0 ], + "text" : "out 1" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-6", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 50.0, 49.0, 95.0, 22.0 ], + "text" : "gen @title zerox" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 369.5, 194.0, 78.0, 22.0 ], + "text" : "!/ samplerate" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 396.5, 131.0, 150.0, 20.0 ], + "text" : "interval in samples" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 858.0, 238.0, 346.0, 368.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-3", + "linecount" : 7, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 103.0, 120.0, 44.0, 100.0 ], + "text" : "count every frame since the last trig" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 195.0, 232.0, 150.0, 20.0 ], + "text" : "update only on trig" + } + + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 131.0, 29.5, 22.0 ], + "text" : "? 0" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 159.0, 44.0, 22.0 ], + "text" : "history" + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 232.0, 137.0, 22.0 ], + "text" : "latch @init samplerate/4" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 183.0, 26.0, 22.0 ], + "text" : "+ 1" + } + + } +, { + "box" : { + "id" : "obj-45", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 23.0, 28.0, 22.0 ], + "text" : "in 1" + } + + } +, { + "box" : { + "id" : "obj-46", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 50.0, 288.0, 35.0, 22.0 ], + "text" : "out 1" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "order" : 1, + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 1 ], + "midpoints" : [ 59.5, 215.0, 99.75, 215.0, 99.75, 120.0, 70.0, 120.0 ], + "order" : 0, + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-46", 0 ], + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 1 ], + "midpoints" : [ 59.5, 89.5, 177.5, 89.5 ], + "order" : 0, + "source" : [ "obj-45", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 0 ], + "order" : 1, + "source" : [ "obj-45", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 265.5, 130.0, 121.0, 22.0 ], + "text" : "gen @title getinterval" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 18.0, 55.0, 22.0 ], + "text" : "in 1 gate" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 369.5, 310.0, 53.0, 22.0 ], + "text" : "out 4 Hz" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-14", 1 ], + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "midpoints" : [ 136.5, 295.0, 117.0, 295.0, 117.0, 162.0, 169.5, 162.0 ], + "order" : 0, + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "order" : 1, + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "midpoints" : [ 59.5, 101.0, 136.5, 101.0 ], + "order" : 1, + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "order" : 2, + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "midpoints" : [ 59.5, 100.0, 275.0, 100.0 ], + "order" : 0, + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 1 ], + "source" : [ "obj-13", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-11", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "order" : 0, + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "order" : 1, + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "order" : 2, + "source" : [ "obj-9", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "order" : 1, + "source" : [ "obj-9", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "order" : 0, + "source" : [ "obj-9", 0 ] + } + + } + ] + } + +} diff --git a/code/oopsy.midi.format.gendsp b/code/oopsy.midi.format.gendsp index 0c93927..fff1ae5 100644 --- a/code/oopsy.midi.format.gendsp +++ b/code/oopsy.midi.format.gendsp @@ -232,7 +232,7 @@ } , { "box" : { - "code" : "History written, read;\nData outbuf(2048);\nchannel = in15;\nnotetrig, notenum, notevel = in1, in2, in3;\nif (notetrig) {\n\tpoke(outbuf, (144+wrap(channel, 0, 16))/256, written+1, boundmode=\"wrap\");\n\tpoke(outbuf, (notenum)/256, written+2, boundmode=\"wrap\");\n\tpoke(outbuf, (notevel*127)/256, written+3, boundmode=\"wrap\");\n\twritten += 3;\n}\npressuretrig, pressure, pressureispoly, pressurenote = in4, in5, in6, in7;\nif (pressuretrig && pressureispoly) {\n\tpoke(outbuf, (160+wrap(channel, 0, 16))/256, written+1, boundmode=\"wrap\");\n\tpoke(outbuf, (pressurenote)/256, written+2, boundmode=\"wrap\");\n\tpoke(outbuf, (pressure*127)/256, written+3, boundmode=\"wrap\");\n\twritten += 3;\n} else if (pressuretrig) {\n\tpoke(outbuf, (208+wrap(channel, 0, 16))/256, written+1, boundmode=\"wrap\");\n\tpoke(outbuf, (pressure*127)/256, written+2, boundmode=\"wrap\");\n\twritten += 2;\n}\ncctrig, ccnum, ccval = in8, in9, in10;\nif (cctrig) {\n\tpoke(outbuf, (176+wrap(channel, 0, 16))/256, written+1, boundmode=\"wrap\");\n\tpoke(outbuf, (ccnum)/256, written+2, boundmode=\"wrap\");\n\tpoke(outbuf, (ccval*127)/256, written+3, boundmode=\"wrap\");\n\twritten += 3;\n}\nprogramtrig, program = in11, in12;\nif (programtrig) {\n\tpoke(outbuf, (192+wrap(channel, 0, 16))/256, written+1, boundmode=\"wrap\");\n\tpoke(outbuf, (program)/256, written+2, boundmode=\"wrap\");\n\twritten += 2;\n}\nbendtrig, bend = in13, in14;\nif (bendtrig) {\n\tc = int(bend*8192)-8192;\n\tpoke(outbuf, (224+wrap(channel, 0, 16))/256, written+1, boundmode=\"wrap\");\n\tpoke(outbuf, (floor(c/128))/256, written+2, boundmode=\"wrap\");\n\tpoke(outbuf, (wrap(c, 0, 128))/256, written+3, boundmode=\"wrap\");\n\twritten += 3;\n}\n// TODO: sysex, clock, etc.\n\nwritten = wrap(written, 0, dim(outbuf));\nnewdata = (read != written);\nread = wrap(read + newdata, 0, dim(outbuf));\nout1 = newdata ? peek(outbuf, read) : -1;", + "code" : "History written, read;\nData outbuf(2048);\nchannel = wrap(int(in15-1), 0, 16);\nnotetrig, notenum, notevel = in1, in2, in3;\nif (notetrig) {\n\tpoke(outbuf, (144+channel)/256, written+1, boundmode=\"wrap\");\n\tpoke(outbuf, (notenum)/256, written+2, boundmode=\"wrap\");\n\tpoke(outbuf, (notevel*127)/256, written+3, boundmode=\"wrap\");\n\twritten += 3;\n}\npressuretrig, pressure, pressureispoly, pressurenote = in4, in5, in6, in7;\nif (pressuretrig && pressureispoly) {\n\tpoke(outbuf, (160+channel)/256, written+1, boundmode=\"wrap\");\n\tpoke(outbuf, (pressurenote)/256, written+2, boundmode=\"wrap\");\n\tpoke(outbuf, (pressure*127)/256, written+3, boundmode=\"wrap\");\n\twritten += 3;\n} else if (pressuretrig) {\n\tpoke(outbuf, (208+channel)/256, written+1, boundmode=\"wrap\");\n\tpoke(outbuf, (pressure*127)/256, written+2, boundmode=\"wrap\");\n\twritten += 2;\n}\ncctrig, ccnum, ccval = in8, in9, in10;\nif (cctrig) {\n\tpoke(outbuf, (176+channel)/256, written+1, boundmode=\"wrap\");\n\tpoke(outbuf, (ccnum)/256, written+2, boundmode=\"wrap\");\n\tpoke(outbuf, (ccval*127)/256, written+3, boundmode=\"wrap\");\n\twritten += 3;\n}\nprogramtrig, program = in11, in12;\nif (programtrig) {\n\tpoke(outbuf, (192+channel)/256, written+1, boundmode=\"wrap\");\n\tpoke(outbuf, (program)/256, written+2, boundmode=\"wrap\");\n\twritten += 2;\n}\nbendtrig, bend = in13, in14;\nif (bendtrig) {\n\tc = int(bend*8192)-8192;\n\tpoke(outbuf, (224+channel)/256, written+1, boundmode=\"wrap\");\n\tpoke(outbuf, (floor(c/128))/256, written+2, boundmode=\"wrap\");\n\tpoke(outbuf, (wrap(c, 0, 128))/256, written+3, boundmode=\"wrap\");\n\twritten += 3;\n}\n// TODO: sysex, clock, etc.\n\nwritten = wrap(written, 0, dim(outbuf));\nnewdata = (read != written);\nread = wrap(read + newdata, 0, dim(outbuf));\nout1 = newdata ? peek(outbuf, read) : -1;", "fontface" : 0, "fontname" : "", "fontsize" : 12.0, @@ -369,7 +369,8 @@ } } - ] + ], + "autosave" : 0 } } diff --git a/code/oopsy.suggestions.gendsp b/code/oopsy.suggestions.gendsp index ed1bcef..d96986e 100644 --- a/code/oopsy.suggestions.gendsp +++ b/code/oopsy.suggestions.gendsp @@ -10,7 +10,7 @@ } , "classnamespace" : "dsp.gen", - "rect" : [ 84.0, 103.0, 640.0, 480.0 ], + "rect" : [ 84.0, 103.0, 716.0, 697.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -39,6 +39,31 @@ "subpatcher_template" : "", "assistshowspatchername" : 0, "boxes" : [ { + "box" : { + "id" : "obj-5", + "linecount" : 7, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 50.0, 350.0, 404.0, 100.0 ], + "presentation_linecount" : 7, + "text" : "Since input gates are sampled at block rate, they will actually produce a step function. If you need a single-sample edge you can feed it through [change], which will give a 1 on a rising step or a -1 on a falling step. \n\nSometimes you only want triggers on transitions to non-zero values, e.g. converting a gate onset to a trig, or feeding an encoder into an [accum] for an endless rotary. This abstraction will achieve this:" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 452.0, 86.0, 22.0 ], + "text" : "oopsy.gate.trig" + } + + } +, { "box" : { "id" : "obj-3", "linecount" : 4, @@ -46,7 +71,6 @@ "numinlets" : 1, "numoutlets" : 0, "patching_rect" : [ 50.0, 235.0, 404.0, 60.0 ], - "presentation_linecount" : 4, "text" : "Similarly, output gates that are shorter than 1ms may be missed, because of control-rate sampling. This subpatcher ensures even a single-sample click will be extended to the minimum gate duration for the hardware (1ms by default):" } diff --git a/examples/dattoro.maxpat b/examples/dattoro.maxpat new file mode 100644 index 0000000..d17eae8 --- /dev/null +++ b/examples/dattoro.maxpat @@ -0,0 +1,3298 @@ +{ + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 763.0, 98.0, 501.0, 583.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Lato", + "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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "args" : [ "patch" ], + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-1", + "lockeddragscroll" : 0, + "maxclass" : "bpatcher", + "name" : "oopsy.maxpat", + "numinlets" : 1, + "numoutlets" : 0, + "offset" : [ 0.0, 0.0 ], + "patching_rect" : [ 307.0, 440.0, 128.0, 128.0 ], + "viewvisibility" : 1 + } + + } +, { + "box" : { + "attr" : "indiffusion2", + "id" : "obj-40", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 265.5, 326.732635000000016, 201.0, 23.0 ], + "text_width" : 150.0 + } + + } +, { + "box" : { + "attr" : "indiffusion1", + "id" : "obj-41", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 265.5, 295.610535000000027, 201.0, 23.0 ], + "text_width" : 150.0 + } + + } +, { + "box" : { + "attr" : "drywet", + "id" : "obj-39", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 265.5, 140.0, 201.0, 23.0 ], + "text_width" : 150.0 + } + + } +, { + "box" : { + "attr" : "decay", + "id" : "obj-37", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 265.5, 171.122100999999986, 201.0, 23.0 ], + "text_width" : 150.0 + } + + } +, { + "box" : { + "attr" : "damping", + "id" : "obj-38", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 265.5, 202.244216999999992, 201.0, 23.0 ], + "text_width" : 150.0 + } + + } +, { + "box" : { + "attr" : "decaydiffusion2", + "id" : "obj-36", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 265.5, 388.976836999999989, 201.0, 23.0 ], + "text_width" : 150.0 + } + + } +, { + "box" : { + "attr" : "decaydiffusion1", + "id" : "obj-35", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 265.5, 357.854736000000003, 201.0, 23.0 ], + "text_width" : 150.0 + } + + } +, { + "box" : { + "fontsize" : 13.0, + "id" : "obj-6", + "lastchannelcount" : 0, + "maxclass" : "live.gain~", + "numinlets" : 2, + "numoutlets" : 5, + "orientation" : 1, + "outlettype" : [ "signal", "signal", "", "float", "list" ], + "parameter_enable" : 1, + "patching_rect" : [ 15.0, 463.0, 136.0, 41.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_initial" : [ -70 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "live.gain~", + "parameter_mmax" : 6.0, + "parameter_mmin" : -70.0, + "parameter_shortname" : "live.gain~", + "parameter_type" : 0, + "parameter_unitstyle" : 4 + } + + } +, + "showname" : 0, + "varname" : "live.gain~" + } + + } +, { + "box" : { + "id" : "obj-8", + "local" : 1, + "maxclass" : "ezdac~", + "numinlets" : 2, + "numoutlets" : 0, + "patching_rect" : [ 15.0, 514.0, 44.0, 44.0 ], + "prototypename" : "helpfile" + } + + } +, { + "box" : { + "args" : [ "@loop", 1, "@file", "drumLoop.aif" ], + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-7", + "lockeddragscroll" : 0, + "maxclass" : "bpatcher", + "name" : "demosound.maxpat", + "numinlets" : 0, + "numoutlets" : 1, + "offset" : [ 0.0, 0.0 ], + "outlettype" : [ "signal" ], + "patching_rect" : [ 15.0, 113.0, 225.0, 105.0 ], + "viewvisibility" : 1 + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "signal", "signal" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 204.0, 79.0, 554.0, 602.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Lato", + "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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-97", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 10.499992000000001, 448.0, 30.0, 23.0 ], + "text" : "in 1" + } + + } +, { + "box" : { + "id" : "obj-101", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 154.0, 364.0, 71.0, 21.0 ], + "text" : "output taps" + } + + } +, { + "box" : { + "id" : "obj-99", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 133.5, 452.0, 191.0, 23.0 ], + "text" : "param drywet 0.5 @min 0 @max 1" + } + + } +, { + "box" : { + "id" : "obj-96", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 85.166663999999997, 500.0, 40.0, 23.0 ], + "text" : "mix" + } + + } +, { + "box" : { + "id" : "obj-95", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 28.5, 500.0, 40.0, 23.0 ], + "text" : "mix" + } + + } +, { + "box" : { + "id" : "obj-94", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 85.166663999999997, 530.0, 38.0, 23.0 ], + "text" : "out 2" + } + + } +, { + "box" : { + "id" : "obj-93", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 28.5, 530.0, 38.0, 23.0 ], + "text" : "out 1" + } + + } +, { + "box" : { + "id" : "obj-92", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 95.666663999999997, 393.0, 35.0, 23.0 ], + "text" : "* 0.6" + } + + } +, { + "box" : { + "id" : "obj-91", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 39.0, 393.0, 35.0, 23.0 ], + "text" : "* 0.6" + } + + } +, { + "box" : { + "id" : "obj-90", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 95.666663999999997, 364.0, 47.333331999999999, 23.0 ], + "text" : "-" + } + + } +, { + "box" : { + "id" : "obj-89", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 39.0, 364.0, 47.333331999999999, 23.0 ], + "text" : "-" + } + + } +, { + "box" : { + "id" : "obj-88", + "maxclass" : "newobj", + "numinlets" : 5, + "numoutlets" : 4, + "outlettype" : [ "", "", "", "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 669.0, 79.0, 737.0, 764.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-88", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 113.5, 661.5, 37.0, 22.0 ], + "text" : "out 3" + } + + } +, { + "box" : { + "id" : "obj-89", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 71.5, 661.5, 37.0, 22.0 ], + "text" : "out 2" + } + + } +, { + "box" : { + "id" : "obj-72", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 125.5, 598.5, 37.0, 22.0 ], + "text" : "2673" + } + + } +, { + "box" : { + "id" : "obj-78", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 80.5, 598.5, 37.0, 22.0 ], + "text" : "1066" + } + + } +, { + "box" : { + "id" : "obj-70", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 535.5, 598.5, 37.0, 22.0 ], + "text" : "1996" + } + + } +, { + "box" : { + "id" : "obj-71", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 499.5, 598.5, 31.0, 22.0 ], + "text" : "121" + } + + } +, { + "box" : { + "id" : "obj-54", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 541.5, 661.5, 37.0, 22.0 ], + "text" : "out 1" + } + + } +, { + "box" : { + "id" : "obj-69", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 499.5, 661.5, 37.0, 22.0 ], + "text" : "out 4" + } + + } +, { + "box" : { + "id" : "obj-49", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 607.5, 546.5, 37.0, 22.0 ], + "text" : "out 2" + } + + } +, { + "box" : { + "id" : "obj-52", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 565.5, 546.5, 37.0, 22.0 ], + "text" : "out 4" + } + + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 614.5, 459.5, 37.0, 22.0 ], + "text" : "1913" + } + + } +, { + "box" : { + "id" : "obj-43", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 578.5, 459.5, 31.0, 22.0 ], + "text" : "335" + } + + } +, { + "box" : { + "id" : "obj-35", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 175.5, 546.5, 37.0, 22.0 ], + "text" : "out 4" + } + + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 133.5, 546.5, 37.0, 22.0 ], + "text" : "out 2" + } + + } +, { + "box" : { + "id" : "obj-33", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 186.5, 465.5, 37.0, 22.0 ], + "text" : "1228" + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 150.5, 465.5, 31.0, 22.0 ], + "text" : "187" + } + + } +, { + "box" : { + "id" : "obj-31", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 529.5, 324.0, 37.0, 22.0 ], + "text" : "out 4" + } + + } +, { + "box" : { + "id" : "obj-30", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 489.5, 324.0, 37.0, 22.0 ], + "text" : "out 1" + } + + } +, { + "box" : { + "id" : "obj-27", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 578.5, 266.0, 35.0, 22.0 ], + "text" : "2111" + } + + } +, { + "box" : { + "id" : "obj-28", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 536.0, 266.0, 37.0, 22.0 ], + "text" : "2974" + } + + } +, { + "box" : { + "id" : "obj-29", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 499.5, 266.0, 31.0, 22.0 ], + "text" : "266" + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 150.5, 266.0, 37.0, 22.0 ], + "text" : "1990" + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 101.5, 324.0, 37.0, 22.0 ], + "text" : "out 2" + } + + } +, { + "box" : { + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 61.5, 324.0, 37.0, 22.0 ], + "text" : "out 3" + } + + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 108.0, 266.0, 37.0, 22.0 ], + "text" : "3627" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 71.5, 266.0, 31.0, 22.0 ], + "text" : "353" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 508.5, 695.5, 30.0, 22.0 ], + "text" : "in 5" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 508.5, 418.5, 30.0, 22.0 ], + "text" : "in 5" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 469.5, 418.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 80.5, 418.5, 30.0, 22.0 ], + "text" : "in 5" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 80.5, 695.5, 30.0, 22.0 ], + "text" : "in 5" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 585.5, 347.5, 30.0, 22.0 ], + "text" : "in 4" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 614.5, 382.5, 47.0, 22.0 ], + "text" : "history" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 469.5, 382.5, 135.0, 22.0 ], + "text" : "mix" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 157.5, 347.5, 30.0, 22.0 ], + "text" : "in 4" + } + + } +, { + "box" : { + "id" : "obj-62", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 469.5, 695.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-63", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 469.5, 631.5, 79.0, 22.0 ], + "text" : "delay 3163 3" + } + + } +, { + "box" : { + "id" : "obj-64", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 469.5, 508.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-65", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 520.5, 546.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-66", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 469.5, 465.5, 29.5, 22.0 ], + "text" : "-" + } + + } +, { + "box" : { + "id" : "obj-67", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 469.5, 546.5, 29.5, 22.0 ], + "text" : "+" + } + + } +, { + "box" : { + "id" : "obj-68", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 520.5, 504.5, 79.0, 22.0 ], + "text" : "delay 2656 3" + } + + } +, { + "box" : { + "id" : "obj-73", + "maxclass" : "newobj", + "numinlets" : 5, + "numoutlets" : 4, + "outlettype" : [ "", "", "", "" ], + "patching_rect" : [ 469.5, 293.5, 79.0, 22.0 ], + "text" : "delay 4217 4" + } + + } +, { + "box" : { + "id" : "obj-74", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 563.5, 87.5, 64.0, 22.0 ], + "text" : "cycle 0.07" + } + + } +, { + "box" : { + "id" : "obj-75", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 563.5, 118.5, 33.0, 22.0 ], + "text" : "* 16" + } + + } +, { + "box" : { + "id" : "obj-76", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 563.5, 148.5, 41.0, 22.0 ], + "text" : "+ 908" + } + + } +, { + "box" : { + "id" : "obj-77", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 469.5, 191.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-79", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 520.5, 229.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-80", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 469.5, 148.5, 29.5, 22.0 ], + "text" : "+" + } + + } +, { + "box" : { + "id" : "obj-81", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 469.5, 229.5, 29.5, 22.0 ], + "text" : "!-" + } + + } +, { + "box" : { + "id" : "obj-82", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 520.5, 187.5, 62.0, 22.0 ], + "text" : "delay 924" + } + + } +, { + "box" : { + "id" : "obj-61", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 41.5, 695.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-60", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 41.5, 631.5, 79.0, 22.0 ], + "text" : "delay 3720 3" + } + + } +, { + "box" : { + "id" : "obj-55", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 41.5, 508.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-56", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 92.5, 546.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-57", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 41.5, 465.5, 29.5, 22.0 ], + "text" : "-" + } + + } +, { + "box" : { + "id" : "obj-58", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 41.5, 546.5, 29.5, 22.0 ], + "text" : "+" + } + + } +, { + "box" : { + "id" : "obj-59", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 92.5, 504.5, 79.0, 22.0 ], + "text" : "delay 1800 3" + } + + } +, { + "box" : { + "id" : "obj-53", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 41.5, 418.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-51", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 186.5, 382.5, 47.0, 22.0 ], + "text" : "history" + } + + } +, { + "box" : { + "id" : "obj-50", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 41.5, 382.5, 135.0, 22.0 ], + "text" : "mix" + } + + } +, { + "box" : { + "id" : "obj-48", + "maxclass" : "newobj", + "numinlets" : 5, + "numoutlets" : 4, + "outlettype" : [ "", "", "", "" ], + "patching_rect" : [ 41.5, 293.5, 79.0, 22.0 ], + "text" : "delay 4453 4" + } + + } +, { + "box" : { + "id" : "obj-47", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 135.5, 87.5, 57.0, 22.0 ], + "text" : "cycle 0.1" + } + + } +, { + "box" : { + "id" : "obj-46", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 135.5, 118.5, 33.0, 22.0 ], + "text" : "* 16" + } + + } +, { + "box" : { + "id" : "obj-45", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 135.5, 148.5, 41.0, 22.0 ], + "text" : "+ 672" + } + + } +, { + "box" : { + "id" : "obj-44", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 41.5, 191.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-42", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 92.5, 229.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-41", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 41.5, 148.5, 29.5, 22.0 ], + "text" : "+" + } + + } +, { + "box" : { + "id" : "obj-40", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 41.5, 229.5, 29.5, 22.0 ], + "text" : "!-" + } + + } +, { + "box" : { + "id" : "obj-39", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 92.5, 187.5, 62.0, 22.0 ], + "text" : "delay 688" + } + + } +, { + "box" : { + "id" : "obj-38", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 469.5, 87.5, 29.5, 22.0 ], + "text" : "+" + } + + } +, { + "box" : { + "id" : "obj-37", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 41.5, 87.5, 29.5, 22.0 ], + "text" : "+" + } + + } +, { + "box" : { + "id" : "obj-83", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 343.5, 14.0, 30.0, 22.0 ], + "text" : "in 1" + } + + } +, { + "box" : { + "id" : "obj-84", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 198.5, 148.5, 30.0, 22.0 ], + "text" : "in 2" + } + + } +, { + "box" : { + "id" : "obj-85", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 103.0, 465.5, 30.0, 22.0 ], + "text" : "in 3" + } + + } +, { + "box" : { + "id" : "obj-86", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 628.0, 148.5, 30.0, 22.0 ], + "text" : "in 2" + } + + } +, { + "box" : { + "id" : "obj-87", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 531.0, 459.5, 30.0, 22.0 ], + "text" : "in 3" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-50", 2 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 2 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-48", 2 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-48", 3 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-48", 4 ], + "source" : [ "obj-25", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-73", 4 ], + "source" : [ "obj-27", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-73", 3 ], + "source" : [ "obj-28", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-73", 2 ], + "source" : [ "obj-29", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 1 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-59", 2 ], + "source" : [ "obj-32", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-59", 3 ], + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-68", 3 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-41", 0 ], + "source" : [ "obj-37", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-80", 0 ], + "source" : [ "obj-38", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-40", 1 ], + "order" : 1, + "source" : [ "obj-39", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-42", 0 ], + "order" : 0, + "source" : [ "obj-39", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "order" : 0, + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "order" : 1, + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-48", 0 ], + "source" : [ "obj-40", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-39", 0 ], + "order" : 0, + "source" : [ "obj-41", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-44", 0 ], + "order" : 1, + "source" : [ "obj-41", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-41", 1 ], + "midpoints" : [ 102.0, 262.5, 19.75, 262.5, 19.75, 137.5, 61.5, 137.5 ], + "source" : [ "obj-42", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-68", 2 ], + "source" : [ "obj-43", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-40", 0 ], + "source" : [ "obj-44", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-39", 1 ], + "source" : [ "obj-45", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-45", 0 ], + "source" : [ "obj-46", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-46", 0 ], + "source" : [ "obj-47", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-23", 0 ], + "source" : [ "obj-48", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-23", 0 ], + "source" : [ "obj-48", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-24", 0 ], + "source" : [ "obj-48", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-50", 0 ], + "source" : [ "obj-48", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-61", 1 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-51", 0 ], + "order" : 0, + "source" : [ "obj-50", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-53", 0 ], + "order" : 1, + "source" : [ "obj-50", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-50", 1 ], + "source" : [ "obj-51", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-57", 0 ], + "source" : [ "obj-53", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-58", 0 ], + "source" : [ "obj-55", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-57", 1 ], + "midpoints" : [ 102.0, 579.5, 19.75, 579.5, 19.75, 454.5, 61.5, 454.5 ], + "source" : [ "obj-56", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-55", 0 ], + "order" : 1, + "source" : [ "obj-57", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-59", 0 ], + "order" : 0, + "source" : [ "obj-57", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-60", 0 ], + "source" : [ "obj-58", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "source" : [ "obj-59", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 0 ], + "source" : [ "obj-59", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-56", 0 ], + "order" : 0, + "source" : [ "obj-59", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-58", 1 ], + "order" : 1, + "source" : [ "obj-59", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-53", 1 ], + "source" : [ "obj-6", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-61", 0 ], + "source" : [ "obj-60", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-88", 0 ], + "source" : [ "obj-60", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-89", 0 ], + "source" : [ "obj-60", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-38", 0 ], + "midpoints" : [ 51.0, 731.5, 359.5, 731.5, 359.5, 76.5, 479.0, 76.5 ], + "source" : [ "obj-61", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 1 ], + "midpoints" : [ 479.0, 730.5, 349.0, 730.5, 349.0, 76.5, 61.5, 76.5 ], + "source" : [ "obj-62", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-54", 0 ], + "source" : [ "obj-63", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-62", 0 ], + "source" : [ "obj-63", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-69", 0 ], + "source" : [ "obj-63", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-67", 0 ], + "source" : [ "obj-64", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-66", 1 ], + "midpoints" : [ 530.0, 579.5, 447.75, 579.5, 447.75, 454.5, 489.5, 454.5 ], + "source" : [ "obj-65", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-64", 0 ], + "order" : 1, + "source" : [ "obj-66", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-68", 0 ], + "order" : 0, + "source" : [ "obj-66", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-63", 0 ], + "source" : [ "obj-67", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-49", 0 ], + "source" : [ "obj-68", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-52", 0 ], + "source" : [ "obj-68", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-65", 0 ], + "order" : 0, + "source" : [ "obj-68", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-67", 1 ], + "order" : 1, + "source" : [ "obj-68", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 1 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-63", 3 ], + "source" : [ "obj-70", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-63", 2 ], + "source" : [ "obj-71", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-60", 3 ], + "source" : [ "obj-72", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 0 ], + "source" : [ "obj-73", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 0 ], + "source" : [ "obj-73", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-73", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-73", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-75", 0 ], + "source" : [ "obj-74", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-76", 0 ], + "source" : [ "obj-75", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-82", 1 ], + "source" : [ "obj-76", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-81", 0 ], + "source" : [ "obj-77", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-60", 2 ], + "source" : [ "obj-78", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-80", 1 ], + "midpoints" : [ 530.0, 262.5, 447.75, 262.5, 447.75, 137.5, 489.5, 137.5 ], + "source" : [ "obj-79", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-66", 0 ], + "source" : [ "obj-8", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-77", 0 ], + "order" : 1, + "source" : [ "obj-80", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-82", 0 ], + "order" : 0, + "source" : [ "obj-80", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-73", 0 ], + "source" : [ "obj-81", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-79", 0 ], + "order" : 0, + "source" : [ "obj-82", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-81", 1 ], + "order" : 1, + "source" : [ "obj-82", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "midpoints" : [ 353.0, 61.75, 51.0, 61.75 ], + "order" : 1, + "source" : [ "obj-83", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-38", 1 ], + "midpoints" : [ 353.0, 61.75, 489.5, 61.75 ], + "order" : 0, + "source" : [ "obj-83", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-42", 1 ], + "order" : 0, + "source" : [ "obj-84", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-44", 1 ], + "order" : 1, + "source" : [ "obj-84", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-55", 1 ], + "order" : 1, + "source" : [ "obj-85", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-56", 1 ], + "order" : 0, + "source" : [ "obj-85", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-77", 1 ], + "order" : 1, + "source" : [ "obj-86", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-79", 1 ], + "order" : 0, + "source" : [ "obj-86", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-64", 1 ], + "order" : 1, + "source" : [ "obj-87", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-65", 1 ], + "order" : 0, + "source" : [ "obj-87", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-62", 1 ], + "source" : [ "obj-9", 0 ] + } + + } + ], + "editing_bgcolor" : [ 0.9, 0.9, 0.9, 1.0 ] + } +, + "patching_rect" : [ 39.0, 331.5, 104.0, 23.0 ], + "text" : "gen @title tank" + } + + } +, { + "box" : { + "id" : "obj-54", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 81.5, 252.333327999999995, 238.0, 23.0 ], + "text" : "param decaydiffusion2 0.5 @min 0 @max 1" + } + + } +, { + "box" : { + "id" : "obj-52", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 124.0, 305.0, 184.0, 23.0 ], + "text" : "param decay 0.5 @min 0 @max 1" + } + + } +, { + "box" : { + "id" : "obj-49", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 102.75, 278.666655999999989, 199.0, 23.0 ], + "text" : "param damping 0.5 @min 0 @max 1" + } + + } +, { + "box" : { + "id" : "obj-43", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 60.25, 226.0, 238.0, 23.0 ], + "text" : "param decaydiffusion1 0.7 @min 0 @max 1" + } + + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 181.0, 40.0, 70.0, 23.0 ], + "text" : "mstosamps" + } + + } +, { + "box" : { + "id" : "obj-35", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 80.0, 104.0, 372.0, 680.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 25.0, 605.5, 29.5, 22.0 ], + "text" : "+" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 25.0, 526.5, 29.5, 22.0 ], + "text" : "-" + } + + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 25.0, 565.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 118.0, 605.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 118.0, 565.5, 62.0, 22.0 ], + "text" : "delay 277" + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 25.0, 467.5, 29.5, 22.0 ], + "text" : "+" + } + + } +, { + "box" : { + "id" : "obj-26", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 25.0, 388.5, 29.5, 22.0 ], + "text" : "-" + } + + } +, { + "box" : { + "id" : "obj-27", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 25.0, 427.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-28", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 118.0, 467.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-29", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 118.0, 427.5, 62.0, 22.0 ], + "text" : "delay 379" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 25.0, 301.5, 29.5, 22.0 ], + "text" : "+" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 25.0, 222.5, 29.5, 22.0 ], + "text" : "-" + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 25.0, 261.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 118.0, 301.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 118.0, 261.5, 62.0, 22.0 ], + "text" : "delay 107" + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 25.0, 163.5, 29.5, 22.0 ], + "text" : "+" + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 25.0, 84.5, 29.5, 22.0 ], + "text" : "-" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 25.0, 123.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 118.0, 163.5, 29.5, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 118.0, 123.5, 62.0, 22.0 ], + "text" : "delay 142" + } + + } +, { + "box" : { + "id" : "obj-31", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 25.0, 29.0, 30.0, 22.0 ], + "text" : "in 1" + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 270.5, 29.0, 30.0, 22.0 ], + "text" : "in 2" + } + + } +, { + "box" : { + "id" : "obj-33", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 280.5, 333.0, 30.0, 22.0 ], + "text" : "in 3" + } + + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 25.0, 645.0, 38.0, 22.0 ], + "text" : "out 1" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "order" : 1, + "source" : [ "obj-13", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "order" : 0, + "source" : [ "obj-13", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-26", 0 ], + "midpoints" : [ 34.5, 355.5, 34.5, 355.5 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "order" : 1, + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "order" : 0, + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 1 ], + "midpoints" : [ 127.5, 334.5, 211.25, 334.5, 211.25, 211.5, 45.0, 211.5 ], + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 1 ], + "order" : 1, + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "order" : 0, + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "source" : [ "obj-20", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 0 ], + "order" : 1, + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-24", 0 ], + "order" : 0, + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-21", 1 ], + "midpoints" : [ 127.5, 638.5, 211.25, 638.5, 211.25, 515.5, 45.0, 515.5 ], + "source" : [ "obj-23", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 1 ], + "order" : 1, + "source" : [ "obj-24", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-23", 0 ], + "order" : 0, + "source" : [ "obj-24", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-25", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-27", 0 ], + "order" : 1, + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-29", 0 ], + "order" : 0, + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-27", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-26", 1 ], + "midpoints" : [ 127.5, 500.5, 211.25, 500.5, 211.25, 377.5, 45.0, 377.5 ], + "source" : [ "obj-28", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 1 ], + "order" : 1, + "source" : [ "obj-29", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-28", 0 ], + "order" : 0, + "source" : [ "obj-29", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-31", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-12", 1 ], + "order" : 3, + "source" : [ "obj-32", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 1 ], + "order" : 2, + "source" : [ "obj-32", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 1 ], + "order" : 0, + "source" : [ "obj-32", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-9", 1 ], + "order" : 1, + "source" : [ "obj-32", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 1 ], + "order" : 2, + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-23", 1 ], + "order" : 0, + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-27", 1 ], + "order" : 3, + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-28", 1 ], + "order" : 1, + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 1 ], + "order" : 1, + "source" : [ "obj-8", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "order" : 0, + "source" : [ "obj-8", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 1 ], + "midpoints" : [ 127.5, 196.5, 211.25, 196.5, 211.25, 73.5, 45.0, 73.5 ], + "source" : [ "obj-9", 0 ] + } + + } + ], + "editing_bgcolor" : [ 0.9, 0.9, 0.9, 1.0 ] + } +, + "patching_rect" : [ 39.0, 167.5, 223.0, 23.0 ], + "text" : "gen @title \"input diffusion allpass series\"" + } + + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 289.0, 136.0, 230.0, 23.0 ], + "text" : "param indiffusion2 0.625 @min 0 @max 1" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 60.0, 136.0, 224.0, 23.0 ], + "text" : "param indiffusion1 0.75 @min 0 @max 1" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 70.5, 68.0, 219.0, 23.0 ], + "text" : "param inbandwidth 0.5 @min 0 @max 1" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 101.5, 98.0, 47.0, 23.0 ], + "text" : "history" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 39.0, 98.0, 40.0, 23.0 ], + "text" : "mix" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 181.0, 11.0, 210.0, 23.0 ], + "text" : "param predelay 10 @min 0 @max 100" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 49.5, 40.0, 120.0, 23.0 ], + "text" : "delay samplerate*0.1" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 49.5, 12.0, 30.0, 23.0 ], + "text" : "in 1" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 1 ], + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 2 ], + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 1 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-88", 0 ], + "source" : [ "obj-35", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 1 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-36", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-88", 1 ], + "source" : [ "obj-43", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-88", 3 ], + "source" : [ "obj-49", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 0 ], + "order" : 1, + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "order" : 0, + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-88", 4 ], + "source" : [ "obj-52", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-88", 2 ], + "source" : [ "obj-54", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-6", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 2 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-89", 1 ], + "source" : [ "obj-88", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-89", 0 ], + "source" : [ "obj-88", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-90", 1 ], + "source" : [ "obj-88", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-90", 0 ], + "source" : [ "obj-88", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-91", 0 ], + "source" : [ "obj-89", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-92", 0 ], + "source" : [ "obj-90", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-95", 1 ], + "source" : [ "obj-91", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-96", 1 ], + "source" : [ "obj-92", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-93", 0 ], + "source" : [ "obj-95", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-94", 0 ], + "source" : [ "obj-96", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-95", 0 ], + "order" : 1, + "source" : [ "obj-97", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-96", 0 ], + "order" : 0, + "source" : [ "obj-97", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-95", 2 ], + "order" : 1, + "source" : [ "obj-99", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-96", 2 ], + "order" : 0, + "source" : [ "obj-99", 0 ] + } + + } + ], + "bgcolor" : [ 0.9, 0.9, 0.9, 1.0 ], + "editing_bgcolor" : [ 0.9, 0.9, 0.9, 1.0 ] + } +, + "patching_rect" : [ 15.0, 429.0, 150.0, 23.0 ], + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", + "exportname" : "gen_7e_2edattorro_reverb" + } +, + "text" : "gen~", + "varname" : "gen_7e_2edattorro_reverb" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-3", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 15.0, 45.0, 252.0, 64.0 ], + "text" : "Based on Jon Dattorro's Effect Design Part 1: Reverberator and Other Filters, located here: https://ccrma.stanford.edu/~dattorro/EffectDesignPart1.pdf" + } + + } +, { + "box" : { + "fontface" : 3, + "fontname" : "Lato", + "fontsize" : 18.0, + "id" : "obj-2", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 15.0, 15.0, 227.0, 28.0 ], + "text" : "Dattorro Reverb" + } + + } +, { + "box" : { + "attr" : "predelay", + "id" : "obj-10", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 265.5, 233.366318000000007, 201.0, 23.0 ], + "text_width" : 150.0 + } + + } +, { + "box" : { + "attr" : "inbandwidth", + "id" : "obj-32", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 265.5, 264.488433999999984, 201.0, 23.0 ], + "text_width" : 150.0 + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-32", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-35", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-37", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-38", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-39", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 1 ], + "source" : [ "obj-4", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-40", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-41", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 1 ], + "source" : [ "obj-6", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-6", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-7", 0 ] + } + + } + ], + "parameters" : { + "obj-1::obj-32" : [ "live.text[2]", "FILTER", 0 ], + "obj-1::obj-4" : [ "live.menu[6]", "live.menu", 0 ], + "obj-6" : [ "live.gain~", "live.gain~", 0 ], + "obj-7::obj-21::obj-6" : [ "live.tab[3]", "live.tab[1]", 0 ], + "obj-7::obj-35" : [ "[5]", "Level", 0 ], + "parameterbanks" : { + + } +, + "inherited_shortname" : 1 + } +, + "dependency_cache" : [ { + "name" : "demosound.maxpat", + "bootpath" : "C74:/help/msp", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "sine.svg", + "bootpath" : "C74:/media/max/picts/m4l-picts", + "type" : "svg", + "implicit" : 1 + } +, { + "name" : "saw.svg", + "bootpath" : "C74:/media/max/picts/m4l-picts", + "type" : "svg", + "implicit" : 1 + } +, { + "name" : "square.svg", + "bootpath" : "C74:/media/max/picts/m4l-picts", + "type" : "svg", + "implicit" : 1 + } +, { + "name" : "random.svg", + "bootpath" : "C74:/media/max/picts/m4l-picts", + "type" : "svg", + "implicit" : 1 + } +, { + "name" : "interfacecolor.js", + "bootpath" : "C74:/interfaces", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "oopsy.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/patchers", + "patcherrelativepath" : "../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "oopsy.snoop.js", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/javascript", + "patcherrelativepath" : "../javascript", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "oopsy.node4max.js", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/javascript", + "patcherrelativepath" : "../javascript", + "type" : "TEXT", + "implicit" : 1 + } + ], + "autosave" : 0 + } + +} diff --git a/examples/drumloop.wav b/examples/drumloop.wav new file mode 100755 index 0000000..a2e35c7 Binary files /dev/null and b/examples/drumloop.wav differ diff --git a/examples/midi_io.maxpat b/examples/midi_io.maxpat index 5df75f3..c17cae3 100644 --- a/examples/midi_io.maxpat +++ b/examples/midi_io.maxpat @@ -10,7 +10,7 @@ } , "classnamespace" : "box", - "rect" : [ 96.0, 333.0, 890.0, 644.0 ], + "rect" : [ 433.0, 210.0, 1174.0, 718.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -40,11 +40,246 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-20", + "args" : [ "patch" ], + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-99", + "lockeddragscroll" : 0, + "maxclass" : "bpatcher", + "name" : "oopsy.maxpat", + "numinlets" : 1, + "numoutlets" : 0, + "offset" : [ 0.0, 0.0 ], + "patching_rect" : [ 33.5, 520.5, 128.0, 128.0 ], + "viewvisibility" : 1 + } + + } +, { + "box" : { + "id" : "obj-98", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 532.166655999999875, 152.0, 109.0, 47.0 ], + "presentation_linecount" : 11, + "text" : "note 36 on/off\n\nnote 38 on/off" + } + + } +, { + "box" : { + "id" : "obj-96", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 492.666655999999989, 180.0, 32.0, 22.0 ], + "text" : "38 0" + } + + } +, { + "box" : { + "id" : "obj-97", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 443.0, 180.0, 45.0, 22.0 ], + "text" : "38 127" + } + + } +, { + "box" : { + "id" : "obj-95", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 492.666655999999989, 152.0, 32.0, 22.0 ], + "text" : "36 0" + } + + } +, { + "box" : { + "id" : "obj-94", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 443.0, 152.0, 45.0, 22.0 ], + "text" : "36 127" + } + + } +, { + "box" : { + "id" : "obj-92", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 823.0, 152.0, 62.0, 33.0 ], + "presentation_linecount" : 5, + "text" : "program change" + } + + } +, { + "box" : { + "id" : "obj-91", + "maxclass" : "number", + "maximum" : 127, + "minimum" : 0, + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 772.700000000000045, 152.0, 50.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-87", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 930.800000000000068, 152.0, 60.0, 20.0 ], + "presentation_linecount" : 2, + "text" : "pressure" + } + + } +, { + "box" : { + "id" : "obj-85", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 882.600000000000136, 184.0, 40.0, 22.0 ], + "text" : "* 127." + } + + } +, { + "box" : { + "format" : 6, + "id" : "obj-86", + "maxclass" : "flonum", + "maximum" : 1.0, + "minimum" : 0.0, + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 882.600000000000136, 152.0, 50.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-83", + "maxclass" : "newobj", + "numinlets" : 6, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 992.500000000000114, 184.0, 107.0, 22.0 ], + "text" : "scale -1. 1. 0. 127." + } + + } +, { + "box" : { + "id" : "obj-81", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 1047.699999999999818, 152.0, 52.0, 20.0 ], + "presentation_linecount" : 2, + "text" : "bend" + } + + } +, { + "box" : { + "format" : 6, + "id" : "obj-82", + "maxclass" : "flonum", + "maximum" : 1.0, + "minimum" : -1.0, + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 992.500000000000114, 152.0, 50.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-80", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 716.0, 152.0, 30.0, 20.0 ], + "text" : "cc1" + } + + } +, { + "box" : { + "id" : "obj-78", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 662.800000000000068, 216.0, 68.0, 22.0 ], + "text" : "prepend 1" + } + + } +, { + "box" : { + "id" : "obj-77", "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 662.800000000000068, 184.0, 40.0, 22.0 ], + "text" : "* 127." + } + + } +, { + "box" : { + "format" : 6, + "id" : "obj-76", + "maxclass" : "flonum", + "maximum" : 1.0, + "minimum" : 0.0, "numinlets" : 1, "numoutlets" : 2, - "outlettype" : [ "signal", "signal" ], + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 662.800000000000068, 152.0, 50.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-73", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, "patcher" : { "fileversion" : 1, "appversion" : { @@ -56,7 +291,7 @@ } , "classnamespace" : "box", - "rect" : [ 227.0, 327.0, 529.0, 292.0 ], + "rect" : [ 262.0, 347.0, 529.0, 292.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -84,7 +319,6 @@ "style" : "", "subpatcher_template" : "", "assistshowspatchername" : 0, - "visible" : 1, "boxes" : [ { "box" : { "bgmode" : 0, @@ -99,64 +333,10 @@ "numinlets" : 1, "numoutlets" : 0, "offset" : [ 0.0, 0.0 ], - "patching_rect" : [ 321.0, 72.0, 128.0, 128.0 ], + "patching_rect" : [ 389.0, 72.0, 128.0, 128.0 ], "viewvisibility" : 1 } - } -, { - "box" : { - "id" : "obj-41", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 91.500000000000057, 218.0, 48.0, 20.0 ], - "text" : "gate" - } - - } -, { - "box" : { - "id" : "obj-40", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 151.833333333333343, 218.0, 48.0, 20.0 ], - "text" : "gain" - } - - } -, { - "box" : { - "fontface" : 0, - "fontname" : "Arial", - "fontsize" : 12.0, - "id" : "obj-12", - "maxclass" : "number~", - "mode" : 2, - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "signal", "float" ], - "patching_rect" : [ 151.833333333333343, 192.0, 56.0, 22.0 ], - "sig" : 0.0 - } - - } -, { - "box" : { - "fontface" : 0, - "fontname" : "Arial", - "fontsize" : 12.0, - "id" : "obj-4", - "maxclass" : "number~", - "mode" : 2, - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "signal", "float" ], - "patching_rect" : [ 91.500000000000057, 192.0, 56.0, 22.0 ], - "sig" : 0.0 - } - } , { "box" : { @@ -164,9 +344,9 @@ "fontsize" : 24.0, "id" : "obj-16", "maxclass" : "newobj", - "numinlets" : 5, - "numoutlets" : 7, - "outlettype" : [ "signal", "signal", "signal", "signal", "signal", "signal", "signal" ], + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "signal" ], "patcher" : { "fileversion" : 1, "appversion" : { @@ -178,7 +358,7 @@ } , "classnamespace" : "dsp.gen", - "rect" : [ 651.0, 178.0, 982.0, 532.0 ], + "rect" : [ 429.0, 127.0, 790.0, 297.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -208,883 +388,1833 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 581.5, 232.0, 19.0, 22.0 ], - "text" : "1" - } - - } -, { - "box" : { - "id" : "obj-5", + "id" : "obj-7", "maxclass" : "newobj", "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 508.0, 103.0, 171.0, 22.0 ], - "text" : "param period 300 @max 1000" + "patching_rect" : [ 424.0, 63.0, 103.0, 22.0 ], + "text" : "param midi_vel38" } } , { "box" : { - "id" : "obj-3", - "maxclass" : "newobj", + "id" : "obj-8", + "linecount" : 6, + "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 27.0, 467.0, 35.0, 22.0 ], - "text" : "out 1" + "patching_rect" : [ 449.0, 101.0, 306.0, 87.0 ], + "presentation_linecount" : 6, + "text" : "Simple fixed-pitch note out events for drum-like gates. \nVelocity is mapped to 0..1; where 0 means note off, any other number is note on. \nChannel: 1. Add _ch2 etc. for a different channel. \nWarning: note events shorter than the block size could be missed. " } } , { "box" : { - "id" : "obj-31", - "linecount" : 12, + "id" : "obj-6", "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 144.0, 217.5, 302.0, 167.0 ], - "text" : "This abstraction parses MIDI byte signals into specific kinds of input including notes, CC's, program change, note/channel pressure, bend, sysex, midi clock, active sensing etc. It also supports running status. \n\nIf you don't need all of this, e.g. you only care about clock input, duplicate the patcher and delete the parts you don't want, to save processing power.\n\nNote that MIDI input data is normalized in a 0..1 range to protect hardware, and needs to be scaled x256 to recover their integer values." + "patching_rect" : [ 80.0, 207.0, 166.0, 20.0 ], + "text" : "basic gate (ignoring velocity)" } } , { "box" : { - "fontname" : "Arial Bold Italic", - "fontsize" : 24.0, - "id" : "obj-1", - "maxclass" : "comment", + "id" : "obj-2", + "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 508.0, 19.0, 144.0, 33.0 ], - "text" : "OUTPUT" + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 47.0, 207.0, 29.0, 22.0 ], + "text" : "!= 0" } } , { "box" : { - "fontname" : "Arial Bold Italic", - "fontsize" : 24.0, - "id" : "obj-49", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 55.0, 19.0, 144.0, 33.0 ], - "text" : "INPUT" + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 47.0, 63.0, 115.0, 22.0 ], + "text" : "param midi_drum36" } } , { "box" : { - "id" : "obj-32", - "linecount" : 3, + "id" : "obj-3", + "linecount" : 6, "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 202.0, 389.5, 261.0, 47.0 ], - "text" : "here's a demo patcher to show how to turn note data into a simple, last-note-priority monophonic CV/gate/gain controller. " + "patching_rect" : [ 80.0, 101.0, 304.0, 87.0 ], + "text" : "Simple fixed-pitch note out events for drum gates. \nVelocity is mapped to 0..1; where 0 means note off, any other number is note on. \nChannel: 10. Add _ch2 etc. for a different channel. \nWarning: note events shorter than the block size could be missed. " } } -, { - "box" : { - "id" : "obj-30", - "linecount" : 4, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 117.0, 72.0, 261.0, 60.0 ], - "text" : "any input object tagged \"midi\" will receive midi byte data instead of audio signals. It reports one byte per passing sampleclock time, or -1 if there is no more pending midi input data." + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-1", 0 ] } } -, { - "box" : { - "id" : "obj-139", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 3, - "outlettype" : [ "", "", "" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } + ] + } , - "classnamespace" : "dsp.gen", - "rect" : [ 514.0, 141.0, 628.0, 603.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-114", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 116.5, 227.0, 54.5, 20.0 ], - "text" : "midinote" - } + "patching_rect" : [ 42.333333333333343, 165.0, 294.0, 35.0 ], + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", + "exportname" : "midi_drum_ins" + } +, + "text" : "gen~ @title midi_drum_ins", + "textcolor" : [ 0.996078431372549, 0.996078431372549, 0.996078431372549, 1.0 ], + "varname" : "midi_drum_ins" + } + + } + ], + "lines" : [ ] + } +, + "patching_rect" : [ 33.5, 191.0, 113.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p midi_drum_inputs" + } + + } +, { + "box" : { + "id" : "obj-72", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 529.0, 148.0, 529.0, 292.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-13", + "lockeddragscroll" : 0, + "maxclass" : "bpatcher", + "name" : "oopsy.maxpat", + "numinlets" : 1, + "numoutlets" : 0, + "offset" : [ 0.0, 0.0 ], + "patching_rect" : [ 389.0, 72.0, 128.0, 128.0 ], + "viewvisibility" : 1 + } + + } +, { + "box" : { + "color" : [ 0.254901960784314, 0.533333333333333, 0.258823529411765, 1.0 ], + "fontsize" : 24.0, + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "signal" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 334.0, 309.0, 736.0, 320.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-9", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 397.0, 140.0, 288.0, 33.0 ], + "presentation_linecount" : 2, + "text" : "outputs zero after a MIDI \"stop\" event, and non-zero after a MIDI \"play\" or \"continue\" event." + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 375.0, 110.5, 97.0, 22.0 ], + "text" : "param midi_play" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 72.0, 226.0, 150.0, 20.0 ], + "text" : "a single-sample pulse" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 43.0, 199.0, 48.0, 22.0 ], + "text" : "change" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 43.0, 226.0, 26.0, 22.0 ], + "text" : "> 0" + } + + } +, { + "box" : { + "id" : "obj-2", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 72.0, 140.0, 285.0, 47.0 ], + "text" : "outputs a pulse of value 1 after each MIDI clock (24ppqn) received, followed by zeroes. The duration of this pulse is equal to the current block size." + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 43.0, 110.5, 102.0, 22.0 ], + "text" : "param midi_clock" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-4", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 42.333333333333343, 165.0, 334.0, 35.0 ], + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", + "exportname" : "midi_transport_ins" + } +, + "text" : "gen~ @title midi_transport_ins", + "textcolor" : [ 0.996078431372549, 0.996078431372549, 0.996078431372549, 1.0 ], + "varname" : "midi_transport_ins" + } + + } + ], + "lines" : [ ] + } +, + "patching_rect" : [ 187.5, 154.0, 133.0, 22.0 ], + "presentation_linecount" : 3, + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p midi_transport_inputs" + } + + } +, { + "box" : { + "id" : "obj-71", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 117.0, 177.0, 529.0, 292.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-13", + "lockeddragscroll" : 0, + "maxclass" : "bpatcher", + "name" : "oopsy.maxpat", + "numinlets" : 1, + "numoutlets" : 0, + "offset" : [ 0.0, 0.0 ], + "patching_rect" : [ 389.0, 72.0, 128.0, 128.0 ], + "viewvisibility" : 1 + } + + } +, { + "box" : { + "color" : [ 0.254901960784314, 0.533333333333333, 0.258823529411765, 1.0 ], + "fontsize" : 24.0, + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "signal" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 119.0, 473.0, 687.0, 407.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "fontname" : "Arial Bold", + "id" : "obj-10", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 348.0, 285.5, 319.0, 33.0 ], + "presentation_linecount" : 2, + "text" : "NOTE: for a multi-app firmware, program change events will switch apps." + } - } -, { - "box" : { - "id" : "obj-113", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 47.5, 227.0, 54.5, 20.0 ], - "text" : "gate" - } + } +, { + "box" : { + "id" : "obj-7", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 348.0, 226.5, 299.0, 47.0 ], + "presentation_linecount" : 4, + "text" : "MIDI program changes will need @min 0 @max 127\nChannels: responds to all channels by default. Add _ch3 etc. for a specific channel. " + } - } -, { - "box" : { - "id" : "obj-112", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 288.0, 227.0, 54.5, 20.0 ], - "text" : "velocity" - } + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 348.0, 198.5, 226.0, 22.0 ], + "text" : "param midi_program @min 0 @max 127" + } - } -, { - "box" : { - "id" : "obj-110", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 202.5, 323.5, 29.5, 22.0 ], - "text" : "*" - } + } +, { + "box" : { + "id" : "obj-6", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 49.0, 226.5, 281.0, 87.0 ], + "presentation_linecount" : 6, + "text" : "Channel pressure maps to 0..1 (or @min..@max)\nChannels: responds to all channels by default. Add _ch3 etc. for a specific channel. \n\nThis is not polyphonic aftertouch; for that, see the note out example." + } - } -, { - "box" : { - "id" : "obj-101", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } + } +, { + "box" : { + "id" : "obj-5", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 348.0, 109.5, 281.0, 47.0 ], + "presentation_linecount" : 3, + "text" : "Maps full range of MIDI pitch bend to @min..@max \nChannels: responds to all channels by default. Add _ch3 etc. for a specific channel. " + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 49.0, 80.5, 219.0, 22.0 ], + "text" : "param midi_cc1_ch3 @min 1 @max 10" + } + + } +, { + "box" : { + "id" : "obj-3", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 49.0, 109.5, 281.0, 47.0 ], + "presentation_linecount" : 2, + "text" : "Range: MIDI 0..127 maps to 0..1 (or @min..@max)\nChannels: responds to all channels by default. Add _ch3 etc. for a specific channel. " + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 49.0, 198.5, 104.0, 22.0 ], + "text" : "param midi_press" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 348.0, 80.5, 198.0, 22.0 ], + "text" : "param midi_bend @min -3 @max 3" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 49.0, 49.5, 193.0, 22.0 ], + "text" : "param midi_cc1 @min 1 @max 10" + } + + } + ], + "lines" : [ ] + } , - "classnamespace" : "dsp.gen", - "rect" : [ 109.0, 128.0, 640.0, 480.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-19", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 50.0, 177.0, 44.0, 22.0 ], - "text" : "history" - } + "patching_rect" : [ 42.333333333333343, 165.0, 311.0, 35.0 ], + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", + "exportname" : "midi_control_ins" + } +, + "text" : "gen~ @title midi_control_ins", + "textcolor" : [ 0.996078431372549, 0.996078431372549, 0.996078431372549, 1.0 ], + "varname" : "midi_control_ins" + } + + } + ], + "lines" : [ ] + } +, + "patching_rect" : [ 33.5, 154.0, 122.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p midi_control_inputs" + } + + } +, { + "box" : { + "fontname" : "Arial Bold", + "id" : "obj-70", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 33.5, 125.0, 249.0, 20.0 ], + "text" : "MIDI INPUTS" + } + + } +, { + "box" : { + "fontname" : "Arial Bold", + "id" : "obj-69", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 33.5, 342.0, 249.0, 20.0 ], + "text" : "MIDI OUTPUTS" + } + + } +, { + "box" : { + "id" : "obj-68", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 865.0, 321.0, 529.0, 292.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-13", + "lockeddragscroll" : 0, + "maxclass" : "bpatcher", + "name" : "oopsy.maxpat", + "numinlets" : 1, + "numoutlets" : 0, + "offset" : [ 0.0, 0.0 ], + "patching_rect" : [ 389.0, 72.0, 128.0, 128.0 ], + "viewvisibility" : 1 + } - } -, { - "box" : { - "id" : "obj-20", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 109.0, 177.0, 54.0, 22.0 ], - "text" : "mix 0.04" - } + } +, { + "box" : { + "color" : [ 0.254901960784314, 0.533333333333333, 0.258823529411765, 1.0 ], + "fontsize" : 24.0, + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "signal" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 429.0, 127.0, 415.0, 300.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-19", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 39.0, 179.0, 304.0, 47.0 ], + "text" : "Any of: midi_clock, midi_start, midi_continue, midi_stop, midi_sense (active sensing), midi_reset\nBinary output, triggers on a rising edge" + } - } -, { - "box" : { - "id" : "obj-11", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 85.0, 136.0, 44.0, 22.0 ], - "text" : "history" - } + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 39.0, 102.375, 29.0, 22.0 ], + "text" : "% 2" + } - } -, { - "box" : { - "id" : "obj-10", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 144.0, 136.0, 40.0, 22.0 ], - "text" : "mix" - } + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 39.0, 78.375, 30.0, 22.0 ], + "text" : "* 48" + } - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 174.5, 100.0, 69.0, 22.0 ], - "text" : "? 0.5 0.001" - } + } +, { + "box" : { + "id" : "obj-29", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 74.0, 92.625, 54.0, 20.0 ], + "text" : "24ppqn" + } - } -, { - "box" : { - "id" : "obj-22", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 153.25, 40.0, 28.0, 22.0 ], - "text" : "in 1" - } + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 39.0, 141.0, 127.0, 22.0 ], + "text" : "history midi_clock_out" + } - } -, { - "box" : { - "id" : "obj-23", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 109.0, 264.900391000000013, 35.0, 22.0 ], - "text" : "out 1" - } + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 39.0, 47.0, 45.0, 22.0 ], + "text" : "phasor" + } - } + } ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-11", 0 ], - "order" : 1, - "source" : [ "obj-10", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-20", 1 ], - "order" : 0, - "source" : [ "obj-10", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-10", 0 ], - "source" : [ "obj-11", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-20", 0 ], - "source" : [ "obj-19", 0 ] - } + "lines" : [ { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-12", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-19", 0 ], - "order" : 1, - "source" : [ "obj-20", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-2", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-23", 0 ], - "order" : 0, - "source" : [ "obj-20", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-6", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-10", 1 ], - "order" : 1, - "source" : [ "obj-22", 0 ] - } + } + ] + } +, + "patching_rect" : [ 42.333333333333343, 165.0, 348.0, 35.0 ], + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", + "exportname" : "midi_transport_outs" + } +, + "text" : "gen~ @title midi_transport_outs", + "textcolor" : [ 0.996078431372549, 0.996078431372549, 0.996078431372549, 1.0 ], + "varname" : "midi_transport_outs" + } - } -, { - "patchline" : { - "destination" : [ "obj-9", 0 ], - "order" : 0, - "source" : [ "obj-22", 0 ] - } + } + ], + "lines" : [ ] + } +, + "patching_rect" : [ 183.5, 372.0, 141.0, 22.0 ], + "presentation_linecount" : 3, + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p midi_transport_outputs" + } - } -, { - "patchline" : { - "destination" : [ "obj-10", 2 ], - "source" : [ "obj-9", 0 ] - } + } +, { + "box" : { + "id" : "obj-67", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 227.0, 651.0, 529.0, 292.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-13", + "lockeddragscroll" : 0, + "maxclass" : "bpatcher", + "name" : "oopsy.maxpat", + "numinlets" : 1, + "numoutlets" : 0, + "offset" : [ 0.0, 0.0 ], + "patching_rect" : [ 389.0, 72.0, 128.0, 128.0 ], + "viewvisibility" : 1 + } - } - ] - } + } +, { + "box" : { + "color" : [ 0.254901960784314, 0.533333333333333, 0.258823529411765, 1.0 ], + "fontsize" : 24.0, + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "signal" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } , - "patching_rect" : [ 202.5, 381.0, 151.0, 22.0 ], - "text" : "gen @title cheap-envelope" - } + "classnamespace" : "dsp.gen", + "rect" : [ 429.0, 127.0, 750.0, 270.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 395.0, 65.125, 36.0, 22.0 ], + "text" : "> 0.5" + } - } -, { - "box" : { - "id" : "obj-103", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 104.0, 350.0, 32.0, 22.0 ], - "text" : "mtof" - } + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 395.0, 39.125, 55.0, 22.0 ], + "text" : "phasor 2" + } - } -, { - "box" : { - "id" : "obj-104", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 104.0, 381.0, 36.0, 22.0 ], - "text" : "cycle" - } + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 52.0, 65.125, 36.0, 22.0 ], + "text" : "> 0.5" + } - } -, { - "box" : { - "id" : "obj-12", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 104.0, 414.5, 117.5, 22.0 ], - "text" : "*" - } + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 52.0, 39.125, 55.0, 22.0 ], + "text" : "phasor 4" + } - } -, { - "box" : { - "id" : "obj-108", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 104.0, 323.5, 80.0, 22.0 ], - "text" : "slide 100 300" - } + } +, { + "box" : { + "id" : "obj-37", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 52.0, 119.5, 140.0, 22.0 ], + "text" : "history midi_drum36_out" + } - } -, { - "box" : { - "id" : "obj-109", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 104.0, 447.0, 89.0, 22.0 ], - "text" : "out 1 minisynth" - } + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 395.0, 120.0, 128.0, 22.0 ], + "text" : "history midi_vel60_out" + } - } -, { - "box" : { - "id" : "obj-21", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 271.5, 259.5, 79.0, 22.0 ], - "text" : "out 3 velocity" - } + } +, { + "box" : { + "id" : "obj-4", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 416.0, 150.0, 304.0, 87.0 ], + "text" : "Simple fixed-pitch note out events. \nSend 0 for note off, any number between 0 and 1 for note on (0..1 is mapped to velocity)\nChannel: 1. Add _ch2 etc. for a different channel. \nWarning: note events shorter than the block size could be missed; using [oopsy.gate.min] may help" + } - } -, { - "box" : { - "id" : "obj-19", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 271.5, 200.0, 44.0, 22.0 ], - "text" : "latch" - } + } +, { + "box" : { + "id" : "obj-3", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 80.0, 150.0, 304.0, 87.0 ], + "text" : "Simple fixed-pitch note out events for drum gates. \nSend 0 for note off, any number between 0 and 1 for note on (0..1 is mapped to velocity)\nChannel: 10. Add _ch2 etc. for a different channel. \nWarning: note events shorter than the block size could be missed; using [oopsy.gate.min] may help" + } - } -, { - "box" : { - "id" : "obj-18", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 157.5, 200.0, 109.0, 20.0 ], - "text" : "will pass through" - } + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "source" : [ "obj-15", 0 ] + } - } -, { - "box" : { - "id" : "obj-15", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 104.0, 200.0, 44.0, 22.0 ], - "text" : "latch" - } + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-17", 0 ] + } - } -, { - "box" : { - "id" : "obj-14", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 36.0, 200.0, 44.0, 22.0 ], - "text" : "latch" - } + } +, { + "patchline" : { + "destination" : [ "obj-36", 0 ], + "source" : [ "obj-21", 0 ] + } - } -, { - "box" : { - "id" : "obj-13", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 36.0, 263.5, 62.0, 22.0 ], - "text" : "out 2 gate" - } + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-22", 0 ] + } - } -, { - "box" : { - "id" : "obj-10", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 163.0, 159.5, 109.0, 33.0 ], - "text" : "any noteon OR matching noteoff" - } + } + ] + } +, + "patching_rect" : [ 42.333333333333343, 165.0, 308.0, 35.0 ], + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", + "exportname" : "midi_drum_outs" + } +, + "text" : "gen~ @title midi_drum_outs", + "textcolor" : [ 0.996078431372549, 0.996078431372549, 0.996078431372549, 1.0 ], + "varname" : "midi_drum_outs" + } - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 129.0, 159.5, 29.5, 22.0 ], - "text" : "or" - } + } + ], + "lines" : [ ] + } +, + "patching_rect" : [ 33.5, 402.0, 121.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p midi_drum_outputs" + } - } -, { - "box" : { - "id" : "obj-8", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 198.5, 125.0, 109.0, 20.0 ], - "text" : "matches new pitch" - } + } +, { + "box" : { + "id" : "obj-65", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 227.0, 327.0, 529.0, 292.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-13", + "lockeddragscroll" : 0, + "maxclass" : "bpatcher", + "name" : "oopsy.maxpat", + "numinlets" : 1, + "numoutlets" : 0, + "offset" : [ 0.0, 0.0 ], + "patching_rect" : [ 389.0, 72.0, 128.0, 128.0 ], + "viewvisibility" : 1 + } + + } +, { + "box" : { + "color" : [ 0.254901960784314, 0.533333333333333, 0.258823529411765, 1.0 ], + "fontsize" : 24.0, + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "signal" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 429.0, 127.0, 796.0, 511.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 422.0, 302.0, 68.0, 22.0 ], + "text" : "triangle 0.5" + } - } -, { - "box" : { - "id" : "obj-7", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 139.5, 125.0, 29.5, 22.0 ], - "text" : "==" - } + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 422.0, 276.0, 55.0, 22.0 ], + "text" : "phasor 3" + } - } -, { - "box" : { - "id" : "obj-3", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 202.5, 88.5, 105.0, 20.0 ], - "text" : "last note pitch" - } + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 171.0, 302.0, 43.0, 22.0 ], + "text" : "% 128" + } - } -, { - "box" : { - "id" : "obj-1", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 157.5, 88.5, 44.0, 22.0 ], - "text" : "history" - } + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 69.0, 276.0, 121.0, 22.0 ], + "text" : "counter 1/samplerate" + } - } -, { - "box" : { - "id" : "obj-6", - "linecount" : 10, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 380.0, 26.5, 192.0, 141.0 ], - "text" : "One approach to a mono synth is to allow note on pitch to update with most recent key, but allow noteoff only if it matches this most recent pitch.\n\n(A better method might store all currently held notes and keep the gate high as long as at least one pitch is held). " - } + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 70.0, 74.0, 81.0, 22.0 ], + "text" : "scale -1 1 0 1" + } - } -, { - "box" : { - "id" : "obj-16", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 36.0, 26.5, 55.0, 22.0 ], - "text" : "in 1 gate" - } + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 422.0, 50.0, 46.0, 22.0 ], + "text" : "cycle 3" + } - } -, { - "box" : { - "id" : "obj-5", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 271.5, 26.5, 71.0, 22.0 ], - "text" : "in 3 velocity" - } + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 70.0, 50.0, 46.0, 22.0 ], + "text" : "cycle 1" + } - } -, { - "box" : { - "id" : "obj-4", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 104.0, 26.5, 57.0, 22.0 ], - "text" : "in 2 pitch" - } + } +, { + "box" : { + "id" : "obj-41", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 70.0, 351.5, 144.0, 22.0 ], + "text" : "history midi_program_out" + } - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-7", 1 ], - "source" : [ "obj-1", 0 ] - } + } +, { + "box" : { + "id" : "obj-42", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 98.0, 383.0, 304.0, 47.0 ], + "text" : "Send MIDI program change. Values from 0..127.\nChannel: 1. Add _ch2 etc. for a different channel. \nMessage is sent when the input changes. " + } - } -, { - "patchline" : { - "destination" : [ "obj-12", 1 ], - "source" : [ "obj-101", 0 ] - } + } +, { + "box" : { + "id" : "obj-39", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 422.0, 351.5, 129.0, 22.0 ], + "text" : "history midi_press_out" + } - } -, { - "patchline" : { - "destination" : [ "obj-104", 0 ], - "source" : [ "obj-103", 0 ] - } + } +, { + "box" : { + "id" : "obj-40", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 435.0, 383.0, 304.0, 87.0 ], + "text" : "Send MIDI channel pressure; values from 0..1 are mapped to the MIDI pressure range.\nChannel: 1. Add _ch2 etc. for a different channel. \nWarning: controls sampled at block rate at best, and possibly slower depending on MIDI baud rate congestion." + } - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "source" : [ "obj-104", 0 ] - } + } +, { + "box" : { + "id" : "obj-38", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 422.0, 135.5, 126.0, 22.0 ], + "text" : "history midi_bend_out" + } - } -, { - "patchline" : { - "destination" : [ "obj-103", 0 ], - "source" : [ "obj-108", 0 ] - } + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 70.0, 135.0, 124.0, 22.0 ], + "text" : "history midi_cc11_out" + } - } -, { - "patchline" : { - "destination" : [ "obj-101", 0 ], - "source" : [ "obj-110", 0 ] - } + } +, { + "box" : { + "id" : "obj-18", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 435.0, 167.0, 304.0, 87.0 ], + "text" : "Send MIDI pitch bend; values from -1..1 are mapped to the MIDI bend range.\nChannel: 1. Add _ch2 etc. for a different channel. \nWarning: controls sampled at block rate at best, and possibly slower depending on MIDI baud rate congestion." + } - } -, { - "patchline" : { - "destination" : [ "obj-109", 0 ], - "source" : [ "obj-12", 0 ] - } + } +, { + "box" : { + "id" : "obj-16", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 98.0, 166.5, 304.0, 87.0 ], + "text" : "Send MIDI continuous controller. Values from 0..1 are mapped to the MIDI 0-127 range.\nChannel: 1. Add _ch2 etc. for a different channel. \nWarning: controls sampled at block rate at best, and possibly slower depending on MIDI baud rate congestion." + } - } -, { - "patchline" : { - "destination" : [ "obj-110", 0 ], - "midpoints" : [ 45.5, 253.25, 212.0, 253.25 ], - "order" : 0, - "source" : [ "obj-14", 0 ] - } + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-13", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-13", 0 ], - "order" : 1, - "source" : [ "obj-14", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-39", 0 ], + "source" : [ "obj-14", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "midpoints" : [ 113.5, 232.0, 96.25, 232.0, 96.25, 78.5, 167.0, 78.5 ], - "order" : 0, - "source" : [ "obj-15", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-38", 0 ], + "source" : [ "obj-5", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-108", 0 ], - "order" : 1, - "source" : [ "obj-15", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "source" : [ "obj-7", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-14", 0 ], - "midpoints" : [ 45.5, 123.75, 45.5, 123.75 ], - "order" : 1, - "source" : [ "obj-16", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-8", 2 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-9", 0 ], - "midpoints" : [ 45.5, 151.5, 138.5, 151.5 ], - "order" : 0, - "source" : [ "obj-16", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-41", 0 ], + "source" : [ "obj-9", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-110", 1 ], - "midpoints" : [ 281.0, 252.25, 222.5, 252.25 ], - "order" : 1, - "source" : [ "obj-19", 0 ] - } + } + ] + } +, + "patching_rect" : [ 42.333333333333343, 165.0, 326.0, 35.0 ], + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", + "exportname" : "midi_control_outs" + } +, + "text" : "gen~ @title midi_control_outs", + "textcolor" : [ 0.996078431372549, 0.996078431372549, 0.996078431372549, 1.0 ], + "varname" : "midi_control_outs" + } - } -, { - "patchline" : { - "destination" : [ "obj-21", 0 ], - "order" : 0, - "source" : [ "obj-19", 0 ] - } + } + ], + "lines" : [ ] + } +, + "patching_rect" : [ 33.5, 372.0, 129.0, 22.0 ], + "presentation_linecount" : 4, + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p midi_control_outputs" + } - } -, { - "patchline" : { - "destination" : [ "obj-15", 0 ], - "midpoints" : [ 113.5, 123.75, 113.5, 123.75 ], - "order" : 1, - "source" : [ "obj-4", 0 ] - } + } +, { + "box" : { + "fontname" : "Arial Bold", + "id" : "obj-64", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 443.0, 125.0, 249.0, 20.0 ], + "text" : "MIDI INPUT TESTING" + } - } -, { - "patchline" : { - "destination" : [ "obj-7", 0 ], - "midpoints" : [ 113.5, 115.25, 149.0, 115.25 ], - "order" : 0, - "source" : [ "obj-4", 0 ] - } + } +, { + "box" : { + "fontsize" : 11.0, + "id" : "obj-63", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 493.0, 293.0, 226.0, 19.0 ], + "text" : "<< double-click to select your MIDI device" + } - } -, { - "patchline" : { - "destination" : [ "obj-19", 0 ], - "source" : [ "obj-5", 0 ] - } + } +, { + "box" : { + "fontname" : "Arial Bold", + "id" : "obj-62", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 443.0, 342.0, 249.0, 20.0 ], + "text" : "MIDI OUTPUT LOGGING" + } - } -, { - "patchline" : { - "destination" : [ "obj-9", 1 ], - "source" : [ "obj-7", 0 ] - } + } +, { + "box" : { + "id" : "obj-61", + "maxclass" : "toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 465.0, 408.0, 24.0, 24.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-14", 1 ], - "midpoints" : [ 138.5, 190.25, 70.5, 190.25 ], - "order" : 2, - "source" : [ "obj-9", 0 ] - } + } +, { + "box" : { + "fontsize" : 11.0, + "id" : "obj-54", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 493.0, 408.0, 30.0, 21.0 ], + "text" : "gate" + } - } -, { - "patchline" : { - "destination" : [ "obj-15", 1 ], - "order" : 1, - "source" : [ "obj-9", 0 ] - } + } +, { + "box" : { + "fontsize" : 11.0, + "id" : "obj-53", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 489.0, 372.0, 226.0, 19.0 ], + "text" : "<< double-click to select your MIDI device" + } - } -, { - "patchline" : { - "destination" : [ "obj-19", 1 ], - "midpoints" : [ 138.5, 190.25, 306.0, 190.25 ], - "order" : 0, - "source" : [ "obj-9", 0 ] - } + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 793.0, 636.0, 849.0, 324.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "fontsize" : 18.0, + "id" : "obj-81", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 60.333333333333343, 59.5, 628.0, 27.0 ], + "text" : "MIDI note output with variable pitch, velocity, pressure, etc." + } + + } +, { + "box" : { + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-13", + "lockeddragscroll" : 0, + "maxclass" : "bpatcher", + "name" : "oopsy.maxpat", + "numinlets" : 1, + "numoutlets" : 0, + "offset" : [ 0.0, 0.0 ], + "patching_rect" : [ 373.0, 110.0, 128.0, 128.0 ], + "viewvisibility" : 1 + } - } - ] - } + } +, { + "box" : { + "color" : [ 0.254901960784314, 0.533333333333333, 0.258823529411765, 1.0 ], + "fontsize" : 24.0, + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "signal" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } , - "patching_rect" : [ 27.166666666666664, 414.5, 131.0, 22.0 ], - "text" : "gen @title monophonic" + "classnamespace" : "dsp.gen", + "rect" : [ 429.0, 127.0, 1028.0, 565.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-83", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 640.0, 112.0, 68.0, 22.0 ], + "text" : "triangle 0.5" } } , { "box" : { - "id" : "obj-25", + "id" : "obj-82", "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 25, - "outlettype" : [ "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" ], - "patching_rect" : [ 55.0, 185.0, 271.0, 22.0 ], - "text" : "oopsy.midi.parse" + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 640.0, 88.0, 55.0, 22.0 ], + "text" : "phasor 3" } } , { "box" : { - "id" : "obj-41", + "id" : "obj-79", "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 832.0, 88.0, 19.0, 22.0 ], + "text" : "1" + } + + } +, { + "box" : { + "id" : "obj-77", + "linecount" : 5, + "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 148.333333333333286, 467.0, 51.0, 22.0 ], - "text" : "out 6 cv" + "patching_rect" : [ 832.0, 188.0, 161.0, 74.0 ], + "presentation_linecount" : 5, + "text" : "Optional: set MIDI channel for a note. MID channel can be 1, 2, 3 etc. up to 16. \nIf absent, channel 1 is assumed. " } } , { "box" : { - "id" : "obj-4", + "id" : "obj-78", "maxclass" : "newobj", "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 832.0, 164.0, 162.0, 22.0 ], + "text" : "history midi_note1_chan_out" + } + + } +, { + "box" : { + "id" : "obj-76", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 83.166666666666657, 467.0, 62.0, 22.0 ], - "text" : "out 5 gate" + "patching_rect" : [ 640.0, 188.0, 161.0, 47.0 ], + "presentation_linecount" : 3, + "text" : "Optional: polyphonic pressure (aftertouch) also ranges from 0 to 1" } } , { "box" : { - "id" : "obj-16", + "id" : "obj-75", "maxclass" : "newobj", - "numinlets" : 0, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 55.0, 72.0, 53.0, 22.0 ], - "text" : "in 5 midi" + "patching_rect" : [ 640.0, 164.0, 165.0, 22.0 ], + "text" : "history midi_note1_press_out" } } , { "box" : { - "id" : "obj-12", + "id" : "obj-74", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 218.0, 286.0, 79.0, 22.0 ], + "text" : "*" + } + + } +, { + "box" : { + "id" : "obj-73", "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 3, - "outlettype" : [ "", "", "" ], + "numoutlets" : 2, + "outlettype" : [ "", "" ], "patcher" : { "fileversion" : 1, "appversion" : { @@ -1096,7 +2226,7 @@ } , "classnamespace" : "dsp.gen", - "rect" : [ 689.0, 219.0, 640.0, 480.0 ], + "rect" : [ 84.0, 103.0, 600.0, 450.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -1126,167 +2256,84 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-13", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 65.428571428571431, 291.25, 23.0, 22.0 ], - "text" : "* 3" - } - - } -, { - "box" : { - "id" : "obj-12", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 65.428571428571431, 262.5, 32.0, 22.0 ], - "text" : "floor" - } - - } -, { - "box" : { - "id" : "obj-9", + "id" : "obj-1", "maxclass" : "newobj", "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 28.0, 23.0, 47.0, 22.0 ], - "text" : "in 1 ms" + "patching_rect" : [ 52.0, 32.0, 32.0, 22.0 ], + "text" : "0.25" } } , { "box" : { - "id" : "obj-7", + "id" : "obj-17", "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 28.0, 59.0, 70.0, 22.0 ], - "text" : "mstosamps" - } - - } -, { - "box" : { - "id" : "obj-6", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 65.428571428571431, 180.0, 37.0, 22.0 ], - "text" : "noise" + "numoutlets" : 0, + "patching_rect" : [ 180.0, 380.0, 84.0, 22.0 ], + "text" : "out 2 midinote" } } , { "box" : { - "id" : "obj-5", + "id" : "obj-16", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 65.428571428571431, 208.0, 28.0, 22.0 ], - "text" : "abs" + "patching_rect" : [ 180.0, 297.0, 32.0, 22.0 ], + "text" : "+ 36" } } , { "box" : { - "id" : "obj-4", + "id" : "obj-15", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 65.428571428571431, 235.0, 30.0, 22.0 ], - "text" : "* 12" + "patching_rect" : [ 180.0, 273.0, 23.0, 22.0 ], + "text" : "* 3" } } , { "box" : { - "id" : "obj-3", + "id" : "obj-14", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 65.428571428571431, 320.0, 32.0, 22.0 ], - "text" : "+ 36" - } - - } -, { - "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 65.428571428571431, 350.0, 63.0, 22.0 ], - "text" : "latch" + "patching_rect" : [ 180.0, 249.0, 32.0, 22.0 ], + "text" : "floor" } } , { "box" : { - "id" : "obj-1", + "id" : "obj-13", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 109.428571428571445, 180.0, 26.0, 22.0 ], - "text" : "> 0" + "patching_rect" : [ 180.0, 225.0, 23.0, 22.0 ], + "text" : "* 8" } } , { "box" : { - "id" : "obj-47", + "id" : "obj-12", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 28.0, 141.0, 48.0, 22.0 ], - "text" : "change" - } - - } -, { - "box" : { - "id" : "obj-48", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 28.0, 92.0, 40.0, 22.0 ], - "text" : "train" - } - - } -, { - "box" : { - "id" : "obj-8", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 132.0, 141.0, 35.0, 22.0 ], - "text" : "out 3" - } - - } -, { - "box" : { - "id" : "obj-10", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 28.0, 385.0, 35.0, 22.0 ], - "text" : "out 1" + "patching_rect" : [ 180.0, 201.0, 28.0, 22.0 ], + "text" : "abs" } } @@ -1294,1242 +2341,1292 @@ "box" : { "id" : "obj-11", "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 65.428571428571431, 385.0, 35.0, 22.0 ], - "text" : "out 2" - } - - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-2", 1 ], - "source" : [ "obj-1", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-13", 0 ], - "source" : [ "obj-12", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-3", 0 ], - "source" : [ "obj-13", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-11", 0 ], - "source" : [ "obj-2", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-3", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "source" : [ "obj-4", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "order" : 0, - "source" : [ "obj-47", 0 ] + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 180.0, 177.0, 37.0, 22.0 ], + "text" : "noise" } } , { - "patchline" : { - "destination" : [ "obj-10", 0 ], - "order" : 1, - "source" : [ "obj-47", 0 ] + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 180.0, 327.0, 125.0, 22.0 ], + "text" : "latch" } } , { - "patchline" : { - "destination" : [ "obj-47", 0 ], - "order" : 1, - "source" : [ "obj-48", 0 ] + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 286.0, 201.0, 26.0, 22.0 ], + "text" : "> 0" } } , { - "patchline" : { - "destination" : [ "obj-8", 0 ], - "order" : 0, - "source" : [ "obj-48", 0 ] + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 286.0, 177.0, 48.0, 22.0 ], + "text" : "change" } } , { - "patchline" : { - "destination" : [ "obj-4", 0 ], - "source" : [ "obj-5", 0 ] + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 52.0, 380.0, 62.0, 22.0 ], + "text" : "out 1 gate" } } , { - "patchline" : { - "destination" : [ "obj-5", 0 ], - "source" : [ "obj-6", 0 ] + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 52.0, 60.0, 37.0, 22.0 ], + "text" : "* rate" } } , { - "patchline" : { - "destination" : [ "obj-48", 0 ], - "source" : [ "obj-7", 0 ] + "box" : { + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 52.0, 131.0, 36.0, 22.0 ], + "text" : "< 0.5" } } , { - "patchline" : { - "destination" : [ "obj-7", 0 ], - "source" : [ "obj-9", 0 ] + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 52.0, 104.5, 45.0, 22.0 ], + "text" : "phasor" } } - ] - } -, - "patching_rect" : [ 508.0, 138.0, 96.0, 22.0 ], - "text" : "gen @title demo" - } - - } -, { - "box" : { - "id" : "obj-7", - "linecount" : 3, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 676.0, 185.0, 263.0, 47.0 ], - "text" : "A subpatcher designed to convert various kinds of events into midi bytes packed into an audio signal. Modify however you need it!" - } - - } -, { - "box" : { - "id" : "obj-46", - "maxclass" : "newobj", - "numinlets" : 15, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 508.0, 285.0, 166.0, 22.0 ], - "text" : "oopsy.midi.format" - } - - } -, { - "box" : { - "id" : "obj-50", - "linecount" : 5, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 526.0, 382.0, 261.0, 74.0 ], - "text" : "Any output object tagged \"midi\" will send midi byte data instead of audio signals. It should send one byte per passing sampleclock time, or a negative value if there is no more pending midi output data." - } - - } -, { - "box" : { - "id" : "obj-51", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 508.0, 467.0, 61.0, 22.0 ], - "text" : "out 7 midi" - } - - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 635.0, 138.0, 261.0, 20.0 ], - "text" : "Just a simple demo to generate midi notes" - } - - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-46", 9 ], - "source" : [ "obj-12", 2 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-46", 7 ], - "source" : [ "obj-12", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-3", 0 ], - "source" : [ "obj-139", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-4", 0 ], - "source" : [ "obj-139", 1 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-41", 0 ], - "source" : [ "obj-139", 2 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-25", 0 ], - "source" : [ "obj-16", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-46", 8 ], - "source" : [ "obj-2", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-139", 2 ], - "source" : [ "obj-25", 3 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-139", 1 ], - "source" : [ "obj-25", 2 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-139", 0 ], - "source" : [ "obj-25", 1 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-51", 0 ], - "source" : [ "obj-46", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "source" : [ "obj-5", 0 ] - } - - } - ] - } -, - "patching_rect" : [ 32.333333333333343, 113.0, 214.0, 35.0 ], - "saved_object_attributes" : { - "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", - "exportname" : "midi_io" - } -, - "text" : "gen~", - "textcolor" : [ 0.996078431372549, 0.996078431372549, 0.996078431372549, 1.0 ], - "varname" : "midi_io" - } - - } -, { - "box" : { - "comment" : "", - "id" : "obj-14", - "index" : 1, - "maxclass" : "inlet", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "signal" ], - "patching_rect" : [ 227.333333333333371, 51.0, 30.0, 30.0 ] - } - - } -, { - "box" : { - "comment" : "", - "id" : "obj-15", - "index" : 2, - "maxclass" : "outlet", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 227.333333333333343, 165.0, 30.0, 30.0 ] - } - - } -, { - "box" : { - "comment" : "", - "id" : "obj-18", - "index" : 1, - "maxclass" : "outlet", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 32.333333333333343, 165.0, 30.0, 30.0 ] - } - - } ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-16", 4 ], - "source" : [ "obj-14", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "source" : [ "obj-16", 5 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-15", 0 ], - "source" : [ "obj-16", 6 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-18", 0 ], - "source" : [ "obj-16", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-4", 0 ], - "source" : [ "obj-16", 4 ] - } - - } - ] - } -, - "patching_rect" : [ 29.333333333333343, 344.0, 90.0, 22.0 ], - "saved_object_attributes" : { - "description" : "", - "digest" : "", - "globalpatchername" : "", - "tags" : "" - } -, - "text" : "p midi-example" - } + "lines" : [ { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-1", 0 ] + } - } -, { - "box" : { - "id" : "obj-6", - "lastchannelcount" : 0, - "maxclass" : "live.gain~", - "numinlets" : 2, - "numoutlets" : 5, - "outlettype" : [ "signal", "signal", "", "float", "list" ], - "parameter_enable" : 1, - "patching_rect" : [ 29.333333333333343, 384.0, 48.0, 136.0 ], - "saved_attribute_attributes" : { - "valueof" : { - "parameter_longname" : "live.gain~", - "parameter_mmax" : 6.0, - "parameter_mmin" : -70.0, - "parameter_shortname" : "live.gain~", - "parameter_type" : 0, - "parameter_unitstyle" : 4 - } + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-10", 0 ] + } - } -, - "varname" : "live.gain~" - } + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-11", 0 ] + } - } -, { - "box" : { - "id" : "obj-19", - "maxclass" : "ezdac~", - "numinlets" : 2, - "numoutlets" : 0, - "patching_rect" : [ 29.333333333333343, 532.0, 45.0, 45.0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-12", 0 ] + } - } -, { - "box" : { - "id" : "obj-8", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "patching_rect" : [ 64.333333333333371, 82.0, 58.0, 22.0 ], - "text" : "loadbang" - } + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-13", 0 ] + } - } -, { - "box" : { - "id" : "obj-43", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 115.333333333333371, 236.0, 152.0, 33.0 ], - "text" : "emulate the midibyte input as signal in exported code" - } + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-14", 0 ] + } - } -, { - "box" : { - "id" : "obj-39", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "float", "float" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "box", - "rect" : [ 807.0, 214.0, 431.0, 392.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-1", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 50.0, 176.0, 29.5, 22.0 ], - "text" : "* 3" - } + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-16", 0 ] + } - } -, { - "box" : { - "id" : "obj-2", - "maxclass" : "number", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "", "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 100.0, 69.0, 50.0, 22.0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "order" : 1, + "source" : [ "obj-23", 0 ] + } - } -, { - "box" : { - "id" : "obj-35", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 201.0, 204.0, 32.0, 22.0 ], - "text" : "+ 50" - } + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "order" : 0, + "source" : [ "obj-23", 0 ] + } - } -, { - "box" : { - "id" : "obj-34", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 201.0, 148.0, 73.0, 22.0 ], - "text" : "random 200" - } + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-5", 0 ] + } - } -, { - "box" : { - "id" : "obj-32", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 126.0, 204.0, 32.0, 22.0 ], - "text" : "+ 20" - } + } +, { + "patchline" : { + "destination" : [ "obj-23", 0 ], + "source" : [ "obj-6", 0 ] + } - } -, { - "box" : { - "id" : "obj-31", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 126.0, 148.0, 73.0, 22.0 ], - "text" : "random 100" - } + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-8", 0 ] + } - } -, { - "box" : { - "id" : "obj-30", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 2, - "outlettype" : [ "float", "float" ], - "patching_rect" : [ 50.0, 244.0, 170.0, 22.0 ], - "text" : "makenote" - } + } +, { + "patchline" : { + "destination" : [ "obj-10", 1 ], + "source" : [ "obj-9", 0 ] + } - } -, { - "box" : { - "id" : "obj-27", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 50.0, 204.0, 32.0, 22.0 ], - "text" : "+ 36" - } + } + ] + } +, + "patching_rect" : [ 218.0, 426.5, 217.0, 22.0 ], + "text" : "gen @title demo" + } - } -, { - "box" : { - "id" : "obj-82", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "patching_rect" : [ 50.0, 100.0, 69.0, 22.0 ], - "text" : "qmetro 300" - } + } +, { + "box" : { + "id" : "obj-71", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 218.0, 455.5, 161.0, 22.0 ], + "text" : "history midi_note2_pitch_out" + } - } -, { - "box" : { - "id" : "obj-80", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 50.0, 148.0, 66.0, 22.0 ], - "text" : "random 12" - } + } +, { + "box" : { + "id" : "obj-72", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 416.0, 455.5, 151.0, 22.0 ], + "text" : "history midi_note2_vel_out" + } - } -, { - "box" : { - "comment" : "", - "id" : "obj-36", - "index" : 1, - "maxclass" : "inlet", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 50.0, 23.0, 30.0, 30.0 ] - } + } +, { + "box" : { + "id" : "obj-70", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 218.0, 60.0, 186.0, 22.0 ], + "text" : "param rate 1 @min 0.1 @max 10" + } + + } +, { + "box" : { + "id" : "obj-69", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 84.0, 103.0, 600.0, 450.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 180.0, 380.0, 84.0, 22.0 ], + "text" : "out 2 midinote" + } - } -, { - "box" : { - "comment" : "", - "id" : "obj-37", - "index" : 1, - "maxclass" : "outlet", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 50.0, 280.0, 30.0, 30.0 ] - } + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 180.0, 297.0, 32.0, 22.0 ], + "text" : "+ 36" + } - } -, { - "box" : { - "comment" : "", - "id" : "obj-38", - "index" : 2, - "maxclass" : "outlet", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 201.0, 280.0, 30.0, 30.0 ] - } + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 180.0, 273.0, 23.0, 22.0 ], + "text" : "* 3" + } - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-27", 0 ], - "source" : [ "obj-1", 0 ] - } + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 180.0, 249.0, 32.0, 22.0 ], + "text" : "floor" + } - } -, { - "patchline" : { - "destination" : [ "obj-82", 1 ], - "source" : [ "obj-2", 0 ] - } + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 180.0, 225.0, 23.0, 22.0 ], + "text" : "* 8" + } - } -, { - "patchline" : { - "destination" : [ "obj-30", 0 ], - "source" : [ "obj-27", 0 ] - } + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 180.0, 201.0, 28.0, 22.0 ], + "text" : "abs" + } - } -, { - "patchline" : { - "destination" : [ "obj-37", 0 ], - "source" : [ "obj-30", 0 ] - } + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 180.0, 177.0, 37.0, 22.0 ], + "text" : "noise" + } - } -, { - "patchline" : { - "destination" : [ "obj-38", 0 ], - "source" : [ "obj-30", 1 ] - } + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 180.0, 327.0, 125.0, 22.0 ], + "text" : "latch" + } - } -, { - "patchline" : { - "destination" : [ "obj-32", 0 ], - "source" : [ "obj-31", 0 ] - } + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 286.0, 201.0, 26.0, 22.0 ], + "text" : "> 0" + } - } -, { - "patchline" : { - "destination" : [ "obj-30", 1 ], - "source" : [ "obj-32", 0 ] - } + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 286.0, 177.0, 48.0, 22.0 ], + "text" : "change" + } - } -, { - "patchline" : { - "destination" : [ "obj-35", 0 ], - "source" : [ "obj-34", 0 ] - } + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 52.0, 380.0, 62.0, 22.0 ], + "text" : "out 1 gate" + } - } -, { - "patchline" : { - "destination" : [ "obj-30", 2 ], - "source" : [ "obj-35", 0 ] - } + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 52.0, 60.0, 28.0, 22.0 ], + "text" : "in 1" + } - } -, { - "patchline" : { - "destination" : [ "obj-82", 0 ], - "source" : [ "obj-36", 0 ] - } + } +, { + "box" : { + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 52.0, 131.0, 36.0, 22.0 ], + "text" : "< 0.5" + } - } -, { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-80", 0 ] - } + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 52.0, 104.5, 45.0, 22.0 ], + "text" : "phasor" + } - } -, { - "patchline" : { - "destination" : [ "obj-31", 0 ], - "order" : 1, - "source" : [ "obj-82", 0 ] - } + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-10", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-34", 0 ], - "order" : 0, - "source" : [ "obj-82", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-11", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-80", 0 ], - "order" : 2, - "source" : [ "obj-82", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-12", 0 ] + } - } - ] - } -, - "patching_rect" : [ 29.333333333333343, 116.0, 49.0, 22.0 ], - "saved_object_attributes" : { - "description" : "", - "digest" : "", - "globalpatchername" : "", - "tags" : "" - } -, - "text" : "p demo" - } + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-13", 0 ] + } - } -, { - "box" : { - "id" : "obj-84", - "maxclass" : "toggle", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "parameter_enable" : 0, - "patching_rect" : [ 29.333333333333343, 83.0, 24.0, 24.0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-14", 0 ] + } - } -, { - "box" : { - "id" : "obj-17", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 29.333333333333343, 219.0, 54.0, 22.0 ], - "text" : "pack 0 0" - } + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-16", 0 ] + } - } -, { - "box" : { - "id" : "obj-9", - "inputmode" : 1, - "maxclass" : "kslider", - "mode" : 1, - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "int", "int" ], - "parameter_enable" : 0, - "patching_rect" : [ 29.333333333333343, 151.0, 252.0, 53.0 ], - "range" : 36 - } + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "order" : 1, + "source" : [ "obj-23", 0 ] + } - } -, { - "box" : { - "id" : "obj-10", - "maxclass" : "newobj", - "numinlets" : 7, - "numoutlets" : 2, - "outlettype" : [ "int", "" ], - "patching_rect" : [ 29.333333333333343, 247.0, 82.0, 22.0 ], - "text" : "midiformat" - } + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "order" : 0, + "source" : [ "obj-23", 0 ] + } - } -, { - "box" : { - "id" : "obj-11", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "signal" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "box", - "rect" : [ 84.0, 103.0, 556.0, 328.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-1", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 50.0, 105.0, 91.0, 22.0 ], - "text" : "route midievent" - } + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-5", 0 ] + } - } -, { - "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 50.0, 144.0, 25.0, 22.0 ], - "text" : "iter" - } + } +, { + "patchline" : { + "destination" : [ "obj-23", 0 ], + "source" : [ "obj-6", 0 ] + } - } -, { - "box" : { - "id" : "obj-3", - "linecount" : 6, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 89.0, 6.0, 419.0, 87.0 ], - "text" : "helper patcher to turn midi events into audio signals at the byte level\neach event's bytes are piped into a ringbuffer, and the gen~ object flushes events from that buffer one sample at a time\n(that way, if a bunch of messages are received at once, they will be forwarded as a series at sample rate)\nThe max no. of events per IO vector is set by the buffer size." - } + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-8", 0 ] + } - } -, { - "box" : { - "id" : "obj-59", - "linecount" : 5, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 259.5, 202.0, 211.0, 74.0 ], - "text" : "buffer size is the size of the message cache -- the maximum no. messages that can be transcoded before a dropout occurs. Should be at least larger than vectorsize." - } + } +, { + "patchline" : { + "destination" : [ "obj-10", 1 ], + "source" : [ "obj-9", 0 ] + } - } -, { - "box" : { - "id" : "obj-50", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "signal" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } + } + ] + } , - "classnamespace" : "dsp.gen", - "rect" : [ 837.0, 78.0, 474.0, 378.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { + "patching_rect" : [ 218.0, 88.0, 217.0, 22.0 ], + "text" : "gen @title demo" + } + + } +, { "box" : { - "id" : "obj-6", + "id" : "obj-68", + "linecount" : 2, "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 209.0, 221.0, 89.0, 20.0 ], - "text" : "the midi byte" + "patching_rect" : [ 28.0, 158.5, 173.0, 33.0 ], + "presentation_linecount" : 3, + "text" : "A note output needs at minimum a pitch and a velocity" } } , { "box" : { - "id" : "obj-4", + "id" : "obj-67", + "linecount" : 4, "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 170.0, 177.0, 75.0, 20.0 ], - "text" : "new index" + "patching_rect" : [ 28.0, 261.0, 173.0, 60.0 ], + "presentation_linecount" : 4, + "text" : "Only integer (whole number) pitches are handled. For microtonalities you will need to use pitch bend." } } , { "box" : { - "id" : "obj-20", - "linecount" : 15, + "id" : "obj-66", + "linecount" : 2, "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 309.0, 34.0, 153.0, 208.0 ], - "text" : "Simple ringbuffer reader.\n\n\n\nIf the held read index does not match the new write index, there is new data. \n\n\nIf so, increment it by 1 (wrapping at buffer size) \n\n\nand read out that buffer index." + "patching_rect" : [ 218.0, 188.0, 161.0, 33.0 ], + "presentation_linecount" : 2, + "text" : "Pitches use standard MIDI note values of 0..127" } } , { "box" : { - "id" : "obj-3", - "linecount" : 3, + "id" : "obj-65", + "linecount" : 2, "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 111.0, 270.0, 150.0, 47.0 ], - "text" : "absence of midi data marked by negative values" + "patching_rect" : [ 416.0, 188.0, 161.0, 33.0 ], + "text" : "Velocities range from 0 to 1 (where 0 means note-off)" } } , { "box" : { - "id" : "obj-27", + "id" : "obj-63", "maxclass" : "newobj", - "numinlets" : 0, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 56.0, 270.0, 29.0, 22.0 ], - "text" : "-0.1" + "patching_rect" : [ 218.0, 164.0, 161.0, 22.0 ], + "text" : "history midi_note1_pitch_out" } } , { "box" : { - "id" : "obj-22", + "id" : "obj-62", "maxclass" : "newobj", - "numinlets" : 3, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 23.0, 301.0, 52.0, 22.0 ], - "text" : "?" + "patching_rect" : [ 416.0, 164.0, 151.0, 22.0 ], + "text" : "history midi_note1_vel_out" } } , { "box" : { - "id" : "obj-5", - "maxclass" : "newobj", + "id" : "obj-61", + "linecount" : 3, + "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 23.0, 334.0, 89.0, 22.0 ], - "text" : "out 1 midibytes" + "patching_rect" : [ 28.0, 430.5, 173.0, 47.0 ], + "text" : "For a polyphonic patcher, use note1, note2, note3, etc. as needed" } } , { "box" : { - "id" : "obj-1", + "id" : "obj-56", "maxclass" : "newobj", - "numinlets" : 1, + "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 23.0, 63.0, 21.0, 22.0 ], - "text" : "int" + "patching_rect" : [ 278.0, 261.0, 185.0, 22.0 ], + "text" : "param vibrato 0 @min 0 @max 1" } } , { "box" : { - "id" : "obj-32", + "id" : "obj-55", "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 111.0, 151.0, 29.5, 22.0 ], - "text" : "+" + "numinlets" : 0, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 218.0, 261.0, 53.0, 22.0 ], + "text" : "cycle 10" } } , { "box" : { - "id" : "obj-31", + "id" : "obj-54", "maxclass" : "newobj", - "numinlets" : 3, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 111.0, 177.0, 56.0, 22.0 ], - "text" : "wrap" + "patching_rect" : [ 218.0, 310.0, 126.0, 22.0 ], + "text" : "history midi_bend_out" } } -, { - "box" : { - "id" : "obj-25", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 23.0, 96.0, 29.5, 22.0 ], - "text" : "!=" + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-74", 0 ], + "source" : [ "obj-55", 0 ] } } , { - "box" : { - "id" : "obj-24", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 121.5, 34.0, 100.0, 22.0 ], - "text" : "history readindex" + "patchline" : { + "destination" : [ "obj-74", 1 ], + "source" : [ "obj-56", 0 ] } } , { - "box" : { - "id" : "obj-16", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 111.0, 220.0, 93.0, 22.0 ], - "text" : "peek messages" + "patchline" : { + "destination" : [ "obj-62", 0 ], + "source" : [ "obj-69", 1 ] } } , { - "box" : { - "id" : "obj-10", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 148.0, 151.0, 97.0, 22.0 ], - "text" : "buffer messages" + "patchline" : { + "destination" : [ "obj-63", 0 ], + "source" : [ "obj-69", 0 ] } - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 23.0, 34.0, 85.0, 22.0 ], - "text" : "in 1 writeindex" + } +, { + "patchline" : { + "destination" : [ "obj-69", 0 ], + "source" : [ "obj-70", 0 ] } } - ], - "lines" : [ { +, { "patchline" : { - "destination" : [ "obj-25", 0 ], - "source" : [ "obj-1", 0 ] + "destination" : [ "obj-71", 0 ], + "source" : [ "obj-73", 0 ] } } , { "patchline" : { - "destination" : [ "obj-31", 2 ], - "source" : [ "obj-10", 0 ] + "destination" : [ "obj-72", 0 ], + "source" : [ "obj-73", 1 ] } } , { "patchline" : { - "destination" : [ "obj-22", 1 ], - "midpoints" : [ 120.5, 258.0, 49.0, 258.0 ], - "source" : [ "obj-16", 0 ] + "destination" : [ "obj-54", 0 ], + "source" : [ "obj-74", 0 ] } } , { "patchline" : { - "destination" : [ "obj-5", 0 ], - "source" : [ "obj-22", 0 ] + "destination" : [ "obj-78", 0 ], + "source" : [ "obj-79", 0 ] } } , { "patchline" : { - "destination" : [ "obj-25", 1 ], - "midpoints" : [ 131.0, 86.5, 43.0, 86.5 ], - "order" : 1, - "source" : [ "obj-24", 0 ] + "destination" : [ "obj-83", 0 ], + "source" : [ "obj-82", 0 ] } } , { "patchline" : { - "destination" : [ "obj-32", 1 ], - "order" : 0, - "source" : [ "obj-24", 0 ] + "destination" : [ "obj-75", 0 ], + "source" : [ "obj-83", 0 ] } - } -, { - "patchline" : { - "destination" : [ "obj-22", 0 ], - "order" : 1, - "source" : [ "obj-25", 0 ] - } + } + ] + } +, + "patching_rect" : [ 60.333333333333343, 203.0, 287.0, 35.0 ], + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", + "exportname" : "midi_noteouts" + } +, + "text" : "gen~ @title midi_noteouts", + "textcolor" : [ 0.996078431372549, 0.996078431372549, 0.996078431372549, 1.0 ], + "varname" : "midi_noteouts" + } + + } + ], + "lines" : [ ] + } +, + "patching_rect" : [ 183.5, 402.0, 93.0, 22.0 ], + "presentation_linecount" : 3, + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p midi_noteouts" + } + + } +, { + "box" : { + "fontsize" : 11.0, + "id" : "obj-60", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 493.0, 431.0, 30.0, 21.0 ], + "text" : "print" + } + + } +, { + "box" : { + "id" : "obj-50", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 443.0, 293.0, 47.0, 22.0 ], + "text" : "midiout" + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-29", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 1034.0, 534.0, 50.0, 31.0 ], + "text" : "MIDI \nChannel", + "textcolor" : [ 0.501961, 0.501961, 0.501961, 1.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-27", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 939.5, 534.0, 36.0, 31.0 ], + "text" : "Pitch\nBend", + "textcolor" : [ 0.501961, 0.501961, 0.501961, 1.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-26", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 816.0, 558.0, 63.0, 19.0 ], + "text" : "Aftertouch", + "textcolor" : [ 0.501961, 0.501961, 0.501961, 1.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-25", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 751.833312999999976, 534.0, 53.0, 31.0 ], + "text" : "Pgm \nChange", + "textcolor" : [ 0.501961, 0.501961, 0.501961, 1.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-24", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 657.666655999999989, 534.0, 54.0, 31.0 ], + "text" : "Control \nChange", + "textcolor" : [ 0.501961, 0.501961, 0.501961, 1.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-18", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 562.666655999999989, 534.0, 55.0, 31.0 ], + "text" : "Poly \nPressure", + "textcolor" : [ 0.501961, 0.501961, 0.501961, 1.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-21", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 465.0, 534.0, 47.0, 31.0 ], + "text" : "Note \nOn/Off", + "textcolor" : [ 0.501961, 0.501961, 0.501961, 1.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "int", "int" ], + "patching_rect" : [ 443.0, 481.0, 57.0, 21.0 ], + "text" : "unpack i i" + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-23", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 443.0, 505.0, 36.0, 21.0 ] + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 443.0, 534.0, 20.0, 20.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-14", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 489.0, 505.0, 35.0, 21.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-28", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 583.166655999999989, 505.0, 37.0, 21.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-16", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 537.166655999999989, 505.0, 37.0, 21.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-30", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "int", "int" ], + "patching_rect" : [ 537.166655999999989, 481.0, 57.0, 21.0 ], + "text" : "unpack i i" + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-31", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 678.166655999999989, 505.0, 37.0, 21.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-32", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 632.166655999999989, 505.0, 37.0, 21.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-33", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "int", "int" ], + "patching_rect" : [ 632.166655999999989, 481.0, 57.0, 21.0 ], + "text" : "unpack i i" + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-34", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 726.0, 505.0, 52.0, 21.0 ] + } + + } +, { + "box" : { + "id" : "obj-35", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 726.0, 534.0, 20.0, 20.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-36", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 8, + "outlettype" : [ "", "", "", "int", "int", "", "int", "" ], + "patching_rect" : [ 443.0, 457.0, 678.400000000000091, 21.0 ], + "text" : "midiparse" + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-40", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 1009.0, 505.0, 52.0, 21.0 ] + } + + } +, { + "box" : { + "id" : "obj-41", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 1009.0, 534.0, 20.0, 20.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-42", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 914.0, 505.0, 52.0, 21.0 ] + } + + } +, { + "box" : { + "id" : "obj-37", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 914.0, 534.0, 20.0, 20.0 ] + } + + } +, { + "box" : { + "id" : "obj-44", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 820.0, 534.0, 20.0, 20.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-32", 0 ], - "midpoints" : [ 32.5, 126.0, 120.5, 126.0 ], - "order" : 0, - "source" : [ "obj-25", 0 ] - } + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-45", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 820.0, 505.0, 52.0, 21.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-22", 2 ], - "source" : [ "obj-27", 0 ] - } + } +, { + "box" : { + "id" : "obj-47", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 537.166655999999989, 534.0, 20.0, 20.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-16", 0 ], - "order" : 1, - "source" : [ "obj-31", 0 ] - } + } +, { + "box" : { + "id" : "obj-48", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 632.166655999999989, 534.0, 20.0, 20.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-24", 0 ], - "midpoints" : [ 120.5, 209.0, 294.5, 209.0, 294.5, 23.0, 131.0, 23.0 ], - "order" : 0, - "source" : [ "obj-31", 0 ] - } + } +, { + "box" : { + "fontsize" : 11.0, + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 443.0, 372.0, 37.0, 21.0 ], + "text" : "midiin" + } - } -, { - "patchline" : { - "destination" : [ "obj-31", 0 ], - "source" : [ "obj-32", 0 ] - } + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 227.0, 327.0, 886.0, 365.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "fontsize" : 18.0, + "id" : "obj-81", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 32.333333333333343, 19.5, 292.0, 27.0 ], + "text" : "MIDI raw byte stream input" + } - } -, { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-9", 0 ] - } + } +, { + "box" : { + "id" : "obj-7", + "linecount" : 17, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 484.0, 31.0, 343.0, 234.0 ], + "text" : "This example demonstrates how raw MIDI input bytes can be handled. MIDI bytes received by the Daisy hardware will sent to any [in] object that is tagged \"midi\".\n\nWithin gen~, the MIDI bytes are scaled by 1/256, so that accidental patching to audio output will not cause problems. A negative number means no MIDI bytes are available/pending.\n\nInside the gen~ patcher there are subpatchers demonstrating how to parse most of the common kinds of MIDI data, from notes, CCs, pressure, bend, program changes etc. up to midi clock and sysex. Copy these subpatchers & delete any parts you don't need to save on processing!\n\nAs a demo, the gen~ patcher also implements a very simple midinote to monophonic CV/gate/gain conversion, with last note priority." + } - } - ] - } -, - "patching_rect" : [ 50.0, 202.0, 194.0, 22.0 ], - "saved_object_attributes" : { - "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", - "exportname" : "midimessages2signal", - "poll" : 1 - } -, - "text" : "gen~ @messages #0-messages", - "varname" : "midimessages2signal" + } +, { + "box" : { + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-13", + "lockeddragscroll" : 0, + "maxclass" : "bpatcher", + "name" : "oopsy.maxpat", + "numinlets" : 1, + "numoutlets" : 0, + "offset" : [ 0.0, 0.0 ], + "patching_rect" : [ 319.0, 72.0, 128.0, 128.0 ], + "viewvisibility" : 1 } } , { "box" : { - "id" : "obj-32", + "color" : [ 0.254901960784314, 0.533333333333333, 0.258823529411765, 1.0 ], + "fontsize" : 24.0, + "id" : "obj-16", "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "float" ], + "numinlets" : 6, + "numoutlets" : 8, + "outlettype" : [ "signal", "signal", "signal", "signal", "signal", "signal", "signal", "signal" ], "patcher" : { "fileversion" : 1, "appversion" : { @@ -2541,7 +3638,7 @@ } , "classnamespace" : "dsp.gen", - "rect" : [ 639.0, 268.0, 423.0, 269.0 ], + "rect" : [ 171.0, 89.0, 809.0, 570.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -2570,898 +3667,852 @@ "subpatcher_template" : "", "assistshowspatchername" : 0, "boxes" : [ { + "box" : { + "fontname" : "Arial Bold", + "id" : "obj-5", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 491.0, 217.5, 274.0, 47.0 ], + "presentation_linecount" : 3, + "text" : "For many common kinds of midi inputs, there are dedicated [param] alternatives that will be easier to use than this." + } + + } +, { "box" : { "id" : "obj-2", - "maxclass" : "newobj", + "linecount" : 3, + "maxclass" : "comment", "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 88.666666666666671, 122.0, 35.0, 22.0 ], - "text" : "/ 256" + "numoutlets" : 0, + "patching_rect" : [ 491.0, 72.0, 261.0, 47.0 ], + "presentation_linecount" : 3, + "text" : "\"midithru\" does the same thing, but it ALSO forwards all incoming MIDI data to the hardware output." } } , { "box" : { - "id" : "obj-17", + "id" : "obj-1", "maxclass" : "newobj", "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 196.0, 85.0, 19.0, 22.0 ], - "text" : "1" + "patching_rect" : [ 406.0, 72.0, 74.0, 22.0 ], + "text" : "in 6 midithru" } } , { "box" : { - "id" : "obj-16", + "id" : "obj-3", "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 3, - "outlettype" : [ "", "", "" ], - "patching_rect" : [ 196.0, 122.0, 49.0, 22.0 ], - "text" : "counter" + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 25.0, 448.0, 35.0, 22.0 ], + "text" : "out 1" } } , { "box" : { - "id" : "obj-12", - "maxclass" : "newobj", + "id" : "obj-31", + "linecount" : 12, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 171.0, 217.5, 302.0, 167.0 ], + "text" : "This abstraction parses MIDI byte signals into specific kinds of input including notes, CC's, program change, note/channel pressure, bend, sysex, midi clock, active sensing etc. It also supports running status. \n\nIf you don't need all of this, e.g. you only care about clock input, duplicate the patcher and delete the parts you don't want, to save processing power.\n\nNote that MIDI input data is normalized in a 0..1 range to protect hardware, and needs to be scaled x256 to recover their integer values." + } + + } +, { + "box" : { + "id" : "obj-32", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 184.0, 395.5, 261.0, 47.0 ], + "text" : "here's a demo patcher to show how to turn note data into a simple, last-note-priority monophonic CV/gate/gain controller. " + } + + } +, { + "box" : { + "id" : "obj-30", + "linecount" : 4, + "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 196.0, 210.0, 104.0, 22.0 ], - "text" : "out 1 \"write index\"" + "patching_rect" : [ 117.0, 72.0, 261.0, 60.0 ], + "text" : "any input object tagged \"midi\" will receive midi byte data instead of audio signals. It reports one byte per passing sampleclock time, or -1 if there is no more pending midi input data." } - } -, { - "box" : { - "id" : "obj-11", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 0, - "patching_rect" : [ 88.666666666666671, 210.0, 103.0, 22.0 ], - "text" : "poke messages 0" - } + } +, { + "box" : { + "id" : "obj-139", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 514.0, 141.0, 628.0, 603.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-114", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 116.5, 227.0, 54.5, 20.0 ], + "text" : "midinote" + } + + } +, { + "box" : { + "id" : "obj-113", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 47.5, 227.0, 54.5, 20.0 ], + "text" : "gate" + } - } -, { - "box" : { - "id" : "obj-5", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 241.0, 85.0, 97.0, 22.0 ], - "text" : "buffer messages" - } + } +, { + "box" : { + "id" : "obj-112", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 288.0, 227.0, 54.5, 20.0 ], + "text" : "velocity" + } - } -, { - "box" : { - "id" : "obj-1", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 88.666666666666671, 85.0, 28.0, 22.0 ], - "text" : "in 1" - } + } +, { + "box" : { + "id" : "obj-110", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 202.5, 323.5, 29.5, 22.0 ], + "text" : "*" + } - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-1", 0 ] - } + } +, { + "box" : { + "id" : "obj-101", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 109.0, 128.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 177.0, 44.0, 22.0 ], + "text" : "history" + } - } -, { - "patchline" : { - "destination" : [ "obj-11", 1 ], - "midpoints" : [ 205.5, 173.0, 140.166666666666686, 173.0 ], - "order" : 1, - "source" : [ "obj-16", 0 ] - } + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 109.0, 177.0, 54.0, 22.0 ], + "text" : "mix 0.04" + } - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "midpoints" : [ 205.5, 171.0, 205.5, 171.0 ], - "order" : 0, - "source" : [ "obj-16", 0 ] - } + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 85.0, 136.0, 44.0, 22.0 ], + "text" : "history" + } - } -, { - "patchline" : { - "destination" : [ "obj-16", 0 ], - "source" : [ "obj-17", 0 ] - } + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 144.0, 136.0, 40.0, 22.0 ], + "text" : "mix" + } - } -, { - "patchline" : { - "destination" : [ "obj-11", 0 ], - "source" : [ "obj-2", 0 ] - } + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 174.5, 100.0, 69.0, 22.0 ], + "text" : "? 0.5 0.001" + } - } -, { - "patchline" : { - "destination" : [ "obj-16", 2 ], - "midpoints" : [ 250.5, 114.5, 235.5, 114.5 ], - "source" : [ "obj-5", 0 ] - } + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 153.25, 40.0, 28.0, 22.0 ], + "text" : "in 1" + } - } - ] - } -, - "patching_rect" : [ 50.0, 170.0, 187.0, 22.0 ], - "saved_object_attributes" : { - "poll" : 1 - } -, - "text" : "gen @messages #0-messages" - } + } +, { + "box" : { + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 109.0, 264.900391000000013, 35.0, 22.0 ], + "text" : "out 1" + } - } -, { - "box" : { - "id" : "obj-31", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "float", "bang" ], - "patching_rect" : [ 239.5, 170.0, 216.0, 22.0 ], - "text" : "buffer~ #0-messages @samps 2048" - } + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-11", 0 ], + "order" : 1, + "source" : [ "obj-10", 0 ] + } - } -, { - "box" : { - "comment" : "", - "id" : "obj-99", - "index" : 1, - "maxclass" : "inlet", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 50.0, 16.0, 30.0, 30.0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-20", 1 ], + "order" : 0, + "source" : [ "obj-10", 0 ] + } - } -, { - "box" : { - "comment" : "", - "id" : "obj-100", - "index" : 1, - "maxclass" : "outlet", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 50.0, 236.0, 30.0, 30.0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-11", 0 ] + } - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-1", 1 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-19", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-1", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "order" : 1, + "source" : [ "obj-20", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-32", 0 ], - "source" : [ "obj-2", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-23", 0 ], + "order" : 0, + "source" : [ "obj-20", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-50", 0 ], - "source" : [ "obj-32", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-10", 1 ], + "order" : 1, + "source" : [ "obj-22", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-100", 0 ], - "source" : [ "obj-50", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "order" : 0, + "source" : [ "obj-22", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-99", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-10", 2 ], + "source" : [ "obj-9", 0 ] + } - } + } ] - } -, - "patching_rect" : [ 29.333333333333343, 273.0, 133.0, 22.0 ], - "saved_object_attributes" : { - "description" : "", - "digest" : "", - "globalpatchername" : "", - "tags" : "" - } + } , - "text" : "p midimessages2signal" - } - - } -, { - "box" : { - "id" : "obj-7", - "linecount" : 21, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 515.0, 54.0, 343.0, 288.0 ], - "text" : "This example demonstrates how raw MIDI input and output can be handled. MIDI bytes received by the Daisy hardware will sent to any [in] object that is tagged \"midi\", and midi bytes sent to any [out] object tagged \"midi\" will be forwarded to the Daisy midi output. \n\nWithin gen~, the MIDI bytes are scaled by 1/256, so that accidental patching to audio output will not cause problems. A negative number means no MIDI bytes are available/pending.\n\nInside the gen~ patcher there are subpatchers demonstrating how to parse and generate most of the common kinds of MIDI data, from notes, CCs, pressure, bend, program changes etc. up to midi clock and sysex. Copy these subpatchers & delete any parts you don't need to save on processing!\n\nAs a demo, the gen~ patcher also implements a very simple midinote to monophonic CV/gate/gain conversion, with last note priority, as well as a very simple midinote generator. \n\nNote: the hardware TRS jacks are type A" - } + "patching_rect" : [ 202.5, 381.0, 151.0, 22.0 ], + "text" : "gen @title cheap-envelope" + } - } -, { - "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "float" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "box", - "rect" : [ 84.0, 103.0, 640.0, 480.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-1", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 52.0, 359.0, 40.0, 22.0 ], - "text" : "* 256." - } + } +, { + "box" : { + "id" : "obj-103", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 104.0, 350.0, 32.0, 22.0 ], + "text" : "mtof" + } - } -, { - "box" : { - "id" : "obj-30", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 67.0, 82.0, 419.0, 33.0 ], - "text" : "MIDI byte signals. If any sample time step has no valid midi byte, this input signal should be negative. " - } + } +, { + "box" : { + "id" : "obj-104", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 104.0, 381.0, 36.0, 22.0 ], + "text" : "cycle" + } - } -, { - "box" : { - "id" : "obj-29", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 88.0, 396.0, 129.0, 20.0 ], - "text" : "MIDI byte messages" - } + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 104.0, 414.5, 117.5, 22.0 ], + "text" : "*" + } - } -, { - "box" : { - "id" : "obj-26", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 52.0, 322.0, 130.0, 22.0 ], - "text" : "peek~ #0-messages" - } + } +, { + "box" : { + "id" : "obj-108", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 104.0, 323.5, 80.0, 22.0 ], + "text" : "slide 100 300" + } - } -, { - "box" : { - "id" : "obj-18", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 52.0, 293.0, 58.5, 22.0 ], - "text" : "+" - } + } +, { + "box" : { + "id" : "obj-109", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 104.0, 447.0, 89.0, 22.0 ], + "text" : "out 1 minisynth" + } - } -, { - "box" : { - "id" : "obj-17", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 31.0, 232.0, 29.5, 22.0 ], - "text" : "int" - } + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 271.5, 259.5, 79.0, 22.0 ], + "text" : "out 3 velocity" + } - } -, { - "box" : { - "id" : "obj-11", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 3, - "outlettype" : [ "bang", "bang", "int" ], - "patching_rect" : [ 31.0, 256.0, 40.0, 22.0 ], - "text" : "uzi" - } + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 271.5, 200.0, 44.0, 22.0 ], + "text" : "latch" + } - } -, { - "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 31.0, 154.0, 81.0, 22.0 ], - "text" : "snapshot~ 10" - } + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 157.5, 200.0, 109.0, 20.0 ], + "text" : "will pass through" + } - } -, { - "box" : { - "id" : "obj-3", - "linecount" : 3, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 31.0, 13.0, 419.0, 47.0 ], - "text" : "Helper patcher to turn signals into midi events. \nEach new valid byte is poked into a ringbuffer, and the gen object flushes events from that buffer one byte at a time." - } + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 104.0, 200.0, 44.0, 22.0 ], + "text" : "latch" + } - } -, { - "box" : { - "id" : "obj-59", - "linecount" : 5, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 280.5, 165.0, 211.0, 74.0 ], - "text" : "buffer size is the size of the message cache -- the maximum no. messages that can be transcoded before a dropout occurs. Should be at least larger than vectorsize." - } + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 36.0, 200.0, 44.0, 22.0 ], + "text" : "latch" + } - } -, { - "box" : { - "id" : "obj-50", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "signal" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "dsp.gen", - "rect" : [ 837.0, 78.0, 656.0, 423.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-31", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 472.666666666666629, 356.0, 150.0, 33.0 ], - "text" : "output new written position in buffer" - } + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 36.0, 263.5, 62.0, 22.0 ], + "text" : "out 2 gate" + } - } -, { - "box" : { - "id" : "obj-30", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 370.666666666666629, 356.0, 93.0, 22.0 ], - "text" : "out 1 writeindex" - } + } +, { + "box" : { + "id" : "obj-10", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 163.0, 159.5, 109.0, 33.0 ], + "text" : "any noteon OR matching noteoff" + } - } -, { - "box" : { - "id" : "obj-29", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 192.666666666666657, 357.0, 150.0, 20.0 ], - "text" : "store new byte into buffer" - } + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 129.0, 159.5, 29.5, 22.0 ], + "text" : "or" + } - } -, { - "box" : { - "id" : "obj-28", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 275.666666666666629, 181.5, 150.0, 20.0 ], - "text" : "within bounds of buffer" - } + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 198.5, 125.0, 109.0, 20.0 ], + "text" : "matches new pitch" + } - } -, { - "box" : { - "id" : "obj-26", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 275.666666666666629, 150.0, 150.0, 20.0 ], - "text" : "increment write position" - } + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 139.5, 125.0, 29.5, 22.0 ], + "text" : "==" + } - } -, { - "box" : { - "id" : "obj-23", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 161.666666666666657, 67.0, 150.0, 20.0 ], - "text" : "if byte is vaid" - } + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 202.5, 88.5, 105.0, 20.0 ], + "text" : "last note pitch" + } - } -, { - "box" : { - "id" : "obj-21", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 168.666666666666657, 291.0, 150.0, 33.0 ], - "text" : "negative means don't write" - } + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 157.5, 88.5, 44.0, 22.0 ], + "text" : "history" + } - } -, { - "box" : { - "id" : "obj-18", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 128.666666666666657, 291.0, 29.0, 22.0 ], - "text" : "-0.1" - } + } +, { + "box" : { + "id" : "obj-6", + "linecount" : 10, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 380.0, 26.5, 192.0, 141.0 ], + "text" : "One approach to a mono synth is to allow note on pitch to update with most recent key, but allow noteoff only if it matches this most recent pitch.\n\n(A better method might store all currently held notes and keep the gate high as long as at least one pitch is held). " + } - } -, { - "box" : { - "id" : "obj-17", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 80.666666666666657, 318.0, 67.0, 22.0 ], - "text" : "?" - } + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 36.0, 26.5, 55.0, 22.0 ], + "text" : "in 1 gate" + } - } -, { - "box" : { - "id" : "obj-15", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 140.666666666666657, 150.0, 97.0, 22.0 ], - "text" : "buffer messages" - } + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 271.5, 26.5, 71.0, 22.0 ], + "text" : "in 3 velocity" + } - } -, { - "box" : { - "id" : "obj-14", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 104.666666666666657, 181.5, 40.0, 22.0 ], - "text" : "wrap" - } + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 104.0, 26.5, 57.0, 22.0 ], + "text" : "in 2 pitch" + } - } -, { - "box" : { - "id" : "obj-13", - "linecount" : 2, - "maxclass" : "newobj", - "numinlets" : 4, - "numoutlets" : 0, - "patching_rect" : [ 44.0, 357.0, 129.0, 35.0 ], - "text" : "poke messages @boundmode ignore" - } + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-7", 1 ], + "source" : [ "obj-1", 0 ] + } - } -, { - "box" : { - "id" : "obj-11", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 104.666666666666657, 150.0, 29.5, 22.0 ], - "text" : "+" - } + } +, { + "patchline" : { + "destination" : [ "obj-12", 1 ], + "source" : [ "obj-101", 0 ] + } - } -, { - "box" : { - "id" : "obj-8", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 115.166666666666657, 114.0, 44.0, 22.0 ], - "text" : "history" - } + } +, { + "patchline" : { + "destination" : [ "obj-104", 0 ], + "source" : [ "obj-103", 0 ] + } - } -, { - "box" : { - "id" : "obj-7", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 80.666666666666657, 67.0, 33.0, 22.0 ], - "text" : ">= 0" - } + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-104", 0 ] + } - } -, { - "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 44.0, 23.0, 82.0, 22.0 ], - "text" : "in 1 midibytes" - } + } +, { + "patchline" : { + "destination" : [ "obj-103", 0 ], + "source" : [ "obj-108", 0 ] + } - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-11", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-101", 0 ], + "source" : [ "obj-110", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-17", 1 ], - "order" : 2, - "source" : [ "obj-14", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-109", 0 ], + "source" : [ "obj-12", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-30", 0 ], - "midpoints" : [ 114.166666666666657, 216.25, 380.166666666666629, 216.25 ], - "order" : 0, - "source" : [ "obj-14", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-110", 0 ], + "midpoints" : [ 45.5, 253.25, 212.0, 253.25 ], + "order" : 0, + "source" : [ "obj-14", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-8", 0 ], - "midpoints" : [ 114.166666666666657, 216.5, 264.416666666666629, 216.5, 264.416666666666629, 103.0, 124.666666666666657, 103.0 ], - "order" : 1, - "source" : [ "obj-14", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "order" : 1, + "source" : [ "obj-14", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-14", 2 ], - "source" : [ "obj-15", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "midpoints" : [ 113.5, 232.0, 96.25, 232.0, 96.25, 78.5, 167.0, 78.5 ], + "order" : 0, + "source" : [ "obj-15", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-13", 1 ], - "source" : [ "obj-17", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-108", 0 ], + "order" : 1, + "source" : [ "obj-15", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-17", 2 ], - "source" : [ "obj-18", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "midpoints" : [ 45.5, 123.75, 45.5, 123.75 ], + "order" : 1, + "source" : [ "obj-16", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-13", 0 ], - "order" : 1, - "source" : [ "obj-2", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "midpoints" : [ 45.5, 151.5, 138.5, 151.5 ], + "order" : 0, + "source" : [ "obj-16", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-7", 0 ], - "order" : 0, - "source" : [ "obj-2", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-110", 1 ], + "midpoints" : [ 281.0, 252.25, 222.5, 252.25 ], + "order" : 1, + "source" : [ "obj-19", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-11", 0 ], - "order" : 0, - "source" : [ "obj-7", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "order" : 0, + "source" : [ "obj-19", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-17", 0 ], - "order" : 1, - "source" : [ "obj-7", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "midpoints" : [ 113.5, 123.75, 113.5, 123.75 ], + "order" : 1, + "source" : [ "obj-4", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-11", 1 ], - "source" : [ "obj-8", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "midpoints" : [ 113.5, 115.25, 149.0, 115.25 ], + "order" : 0, + "source" : [ "obj-4", 0 ] + } - } - ] - } -, - "patching_rect" : [ 31.0, 124.0, 194.0, 22.0 ], - "saved_object_attributes" : { - "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", - "exportname" : "signal2midimessages", - "poll" : 1 - } -, - "text" : "gen~ @messages #0-messages", - "varname" : "signal2midimessages" - } + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 0 ] + } - } -, { - "box" : { - "id" : "obj-32", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "float", "float" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "dsp.gen", - "rect" : [ 1294.0, 98.0, 323.0, 300.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-11", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 109.0, 218.0, 65.0, 22.0 ], - "text" : "out 2 base" - } + } +, { + "patchline" : { + "destination" : [ "obj-9", 1 ], + "source" : [ "obj-7", 0 ] + } - } -, { - "box" : { - "id" : "obj-10", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 71.166666666666686, 144.0, 97.0, 22.0 ], - "text" : "buffer messages" - } + } +, { + "patchline" : { + "destination" : [ "obj-14", 1 ], + "midpoints" : [ 138.5, 190.25, 70.5, 190.25 ], + "order" : 2, + "source" : [ "obj-9", 0 ] + } - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 28.666666666666671, 174.0, 40.0, 22.0 ], - "text" : "wrap" - } + } +, { + "patchline" : { + "destination" : [ "obj-15", 1 ], + "order" : 1, + "source" : [ "obj-9", 0 ] + } - } -, { - "box" : { - "id" : "obj-4", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 28.666666666666671, 130.0, 29.5, 22.0 ], - "text" : "-" - } + } +, { + "patchline" : { + "destination" : [ "obj-19", 1 ], + "midpoints" : [ 138.5, 190.25, 306.0, 190.25 ], + "order" : 0, + "source" : [ "obj-9", 0 ] + } - } -, { - "box" : { - "id" : "obj-3", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 28.666666666666671, 82.0, 21.0, 22.0 ], - "text" : "int" + } + ] + } +, + "patching_rect" : [ 25.166666666666664, 395.5, 131.0, 22.0 ], + "text" : "gen @title monophonic" } } , { "box" : { - "id" : "obj-2", + "id" : "obj-25", "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 71.166666666666686, 104.0, 100.0, 22.0 ], - "text" : "history readindex" + "numoutlets" : 25, + "outlettype" : [ "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" ], + "patching_rect" : [ 55.0, 185.0, 271.0, 22.0 ], + "text" : "oopsy.midi.parse" } } , { "box" : { - "id" : "obj-12", + "id" : "obj-4", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 28.666666666666671, 218.0, 68.0, 22.0 ], - "text" : "out 1 count" + "patching_rect" : [ 81.166666666666657, 448.0, 62.0, 22.0 ], + "text" : "out 5 gate" } } , { "box" : { - "id" : "obj-1", + "id" : "obj-16", "maxclass" : "newobj", "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 28.666666666666671, 37.0, 85.0, 22.0 ], - "text" : "in 1 writeindex" + "patching_rect" : [ 55.0, 72.0, 53.0, 22.0 ], + "text" : "in 5 midi" } } @@ -3469,187 +4520,65 @@ "lines" : [ { "patchline" : { "destination" : [ "obj-3", 0 ], - "source" : [ "obj-1", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-9", 2 ], - "source" : [ "obj-10", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-11", 0 ], - "order" : 0, - "source" : [ "obj-2", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-4", 1 ], - "order" : 1, - "source" : [ "obj-2", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-2", 0 ], - "order" : 0, - "source" : [ "obj-3", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-4", 0 ], - "order" : 1, - "source" : [ "obj-3", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-9", 0 ], - "source" : [ "obj-4", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "source" : [ "obj-9", 0 ] - } - - } - ] - } -, - "patching_rect" : [ 31.0, 198.0, 231.0, 22.0 ], - "saved_object_attributes" : { - "poll" : 1 - } -, - "text" : "gen @messages #0-messages @poll 1" - } - - } -, { - "box" : { - "id" : "obj-31", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "float", "bang" ], - "patching_rect" : [ 280.5, 137.0, 216.0, 22.0 ], - "text" : "buffer~ #0-messages @samps 2048" - } - - } -, { - "box" : { - "comment" : "", - "id" : "obj-99", - "index" : 1, - "maxclass" : "inlet", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "signal" ], - "patching_rect" : [ 31.0, 82.0, 30.0, 30.0 ] - } - - } -, { - "box" : { - "comment" : "", - "id" : "obj-100", - "index" : 1, - "maxclass" : "outlet", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 52.0, 396.0, 30.0, 30.0 ] - } - - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-100", 0 ], - "source" : [ "obj-1", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-18", 0 ], - "source" : [ "obj-11", 2 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-11", 0 ], - "source" : [ "obj-17", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-18", 0 ] - } + "source" : [ "obj-139", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-32", 0 ], - "source" : [ "obj-2", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-139", 1 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-26", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-16", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-17", 0 ], - "source" : [ "obj-32", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-139", 2 ], + "source" : [ "obj-25", 3 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-18", 1 ], - "source" : [ "obj-32", 1 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-139", 1 ], + "source" : [ "obj-25", 2 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-50", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-139", 0 ], + "source" : [ "obj-25", 1 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-50", 0 ], - "source" : [ "obj-99", 0 ] + } + ] + } +, + "patching_rect" : [ 32.333333333333343, 72.0, 266.0, 35.0 ], + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", + "exportname" : "midi_raw_in" + } +, + "text" : "gen~ @title midi_raw_in", + "textcolor" : [ 0.996078431372549, 0.996078431372549, 0.996078431372549, 1.0 ], + "varname" : "midi_raw_in" } } - ] + ], + "lines" : [ ] } , - "patching_rect" : [ 115.333333333333371, 384.0, 133.0, 22.0 ], + "patching_rect" : [ 187.5, 191.0, 83.0, 22.0 ], "saved_object_attributes" : { "description" : "", "digest" : "", @@ -3657,31 +4586,31 @@ "tags" : "" } , - "text" : "p signal2midimessages" + "text" : "p midi_raw_in" } } , { "box" : { - "id" : "obj-1", - "linecount" : 4, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 137.333333333333371, 404.0, 201.0, 60.0 ], - "text" : "This subpatcher converts the midi byte signals to midi messages in Max, in a similar way to the Daisy wrapper code." + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 7, + "numoutlets" : 2, + "outlettype" : [ "int", "" ], + "patching_rect" : [ 443.0, 260.0, 678.400000000000091, 22.0 ], + "text" : "midiformat" } } , { "box" : { - "id" : "obj-5", - "maxclass" : "newobj", + "id" : "obj-7", + "linecount" : 3, + "maxclass" : "comment", "numinlets" : 1, - "numoutlets" : 8, - "outlettype" : [ "", "", "", "int", "int", "", "int", "" ], - "patching_rect" : [ 115.333333333333371, 478.0, 173.5, 22.0 ], - "text" : "midiparse" + "numoutlets" : 0, + "patching_rect" : [ 443.0, 601.5, 627.0, 47.0 ], + "text" : "Note: a multi-app firmware will respond to MIDI program change events by switching apps.\nNote: to have the Daisy hardware output act as a midi thru, create an [in 5 midithru] object in the gen~ patcher.\nNote: the Daisy hardware TRS jacks are type A." } } @@ -3693,143 +4622,403 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 25.0, 27.0, 102.0, 33.0 ], + "patching_rect" : [ 33.5, 39.0, 102.0, 33.0 ], "text" : "MIDI IO" } + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-50", 0 ], + "source" : [ "obj-10", 0 ] + } + } , { - "box" : { - "id" : "obj-3", - "inputmode" : 1, - "maxclass" : "kslider", - "mode" : 1, - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "int", "int" ], - "parameter_enable" : 0, - "patching_rect" : [ 115.333333333333371, 507.0, 252.0, 53.0 ], - "range" : 36 + "patchline" : { + "destination" : [ "obj-47", 0 ], + "source" : [ "obj-16", 0 ] } } - ], - "lines" : [ { +, { "patchline" : { - "destination" : [ "obj-11", 0 ], - "source" : [ "obj-10", 0 ] + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-22", 1 ] } } , { "patchline" : { - "destination" : [ "obj-20", 0 ], - "source" : [ "obj-11", 0 ] + "destination" : [ "obj-23", 0 ], + "source" : [ "obj-22", 0 ] } } , { "patchline" : { - "destination" : [ "obj-10", 0 ], - "source" : [ "obj-17", 0 ] + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-23", 0 ] } } , { "patchline" : { - "destination" : [ "obj-5", 0 ], - "source" : [ "obj-2", 0 ] + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-30", 0 ] } } , { "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-20", 1 ] + "destination" : [ "obj-28", 0 ], + "source" : [ "obj-30", 1 ] } } , { "patchline" : { - "destination" : [ "obj-6", 0 ], - "source" : [ "obj-20", 0 ] + "destination" : [ "obj-48", 0 ], + "source" : [ "obj-32", 0 ] } } , { "patchline" : { - "destination" : [ "obj-9", 1 ], - "midpoints" : [ 68.833333333333343, 144.0, 271.833333333333371, 144.0 ], - "source" : [ "obj-39", 1 ] + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-33", 1 ] } } , { "patchline" : { - "destination" : [ "obj-9", 0 ], - "source" : [ "obj-39", 0 ] + "destination" : [ "obj-32", 0 ], + "source" : [ "obj-33", 0 ] } } , { "patchline" : { - "destination" : [ "obj-3", 0 ], - "source" : [ "obj-5", 0 ] + "destination" : [ "obj-35", 0 ], + "source" : [ "obj-34", 0 ] } } , { "patchline" : { - "destination" : [ "obj-19", 1 ], - "order" : 0, - "source" : [ "obj-6", 0 ] + "destination" : [ "obj-22", 0 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 0 ], + "source" : [ "obj-36", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-33", 0 ], + "source" : [ "obj-36", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "source" : [ "obj-36", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-40", 0 ], + "source" : [ "obj-36", 6 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-42", 0 ], + "source" : [ "obj-36", 5 ] } } , { "patchline" : { - "destination" : [ "obj-19", 0 ], + "destination" : [ "obj-45", 0 ], + "source" : [ "obj-36", 4 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-36", 0 ], "order" : 1, - "source" : [ "obj-6", 0 ] + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-54", 1 ], + "order" : 0, + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-41", 0 ], + "source" : [ "obj-40", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "source" : [ "obj-42", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-44", 0 ], + "source" : [ "obj-45", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-60", 0 ], + "source" : [ "obj-54", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-54", 0 ], + "source" : [ "obj-61", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-77", 0 ], + "source" : [ "obj-76", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-78", 0 ], + "source" : [ "obj-77", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 2 ], + "source" : [ "obj-78", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-83", 0 ], + "source" : [ "obj-82", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 5 ], + "source" : [ "obj-83", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 4 ], + "source" : [ "obj-85", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-85", 0 ], + "source" : [ "obj-86", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 3 ], + "source" : [ "obj-91", 0 ] } } , { "patchline" : { - "destination" : [ "obj-84", 0 ], - "source" : [ "obj-8", 0 ] + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-94", 0 ] } } , { "patchline" : { - "destination" : [ "obj-39", 0 ], - "source" : [ "obj-84", 0 ] + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-95", 0 ] } } , { "patchline" : { - "destination" : [ "obj-17", 1 ], - "midpoints" : [ 271.833333333333371, 211.0, 73.833333333333343, 211.0 ], - "source" : [ "obj-9", 1 ] + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-96", 0 ] } } , { "patchline" : { - "destination" : [ "obj-17", 0 ], - "source" : [ "obj-9", 0 ] + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-97", 0 ] } } ], "parameters" : { + "obj-12::obj-13::obj-32" : [ "live.text[8]", "FILTER", 0 ], + "obj-12::obj-13::obj-33" : [ "live.text[7]", "FILTER", 0 ], + "obj-12::obj-13::obj-34" : [ "live.text[9]", "FILTER", 0 ], "obj-20::obj-13::obj-32" : [ "live.text[2]", "FILTER", 0 ], - "obj-20::obj-13::obj-36" : [ "live.menu[1]", "live.menu", 0 ], - "obj-6" : [ "live.gain~", "live.gain~", 0 ], + "obj-20::obj-13::obj-33" : [ "live.text[1]", "FILTER", 0 ], + "obj-20::obj-13::obj-34" : [ "live.text[3]", "FILTER", 0 ], + "obj-65::obj-13::obj-32" : [ "live.text[10]", "FILTER", 0 ], + "obj-65::obj-13::obj-33" : [ "live.text[11]", "FILTER", 0 ], + "obj-65::obj-13::obj-34" : [ "live.text[12]", "FILTER", 0 ], + "obj-67::obj-13::obj-32" : [ "live.text[16]", "FILTER", 0 ], + "obj-67::obj-13::obj-33" : [ "live.text[14]", "FILTER", 0 ], + "obj-67::obj-13::obj-34" : [ "live.text[15]", "FILTER", 0 ], + "obj-68::obj-13::obj-32" : [ "live.text[19]", "FILTER", 0 ], + "obj-68::obj-13::obj-33" : [ "live.text[18]", "FILTER", 0 ], + "obj-68::obj-13::obj-34" : [ "live.text[17]", "FILTER", 0 ], + "obj-71::obj-13::obj-32" : [ "live.text[22]", "FILTER", 0 ], + "obj-71::obj-13::obj-33" : [ "live.text[20]", "FILTER", 0 ], + "obj-71::obj-13::obj-34" : [ "live.text[21]", "FILTER", 0 ], + "obj-72::obj-13::obj-32" : [ "live.text[13]", "FILTER", 0 ], + "obj-72::obj-13::obj-33" : [ "live.text[23]", "FILTER", 0 ], + "obj-72::obj-13::obj-34" : [ "live.text[24]", "FILTER", 0 ], + "obj-73::obj-13::obj-32" : [ "live.text[25]", "FILTER", 0 ], + "obj-73::obj-13::obj-33" : [ "live.text[26]", "FILTER", 0 ], + "obj-73::obj-13::obj-34" : [ "live.text[27]", "FILTER", 0 ], + "obj-99::obj-32" : [ "live.text[28]", "FILTER", 0 ], + "obj-99::obj-33" : [ "live.text[29]", "FILTER", 0 ], + "obj-99::obj-34" : [ "live.text[30]", "FILTER", 0 ], "parameterbanks" : { + } +, + "parameter_overrides" : { + "obj-12::obj-13::obj-32" : { + "parameter_longname" : "live.text[8]" + } +, + "obj-12::obj-13::obj-33" : { + "parameter_longname" : "live.text[7]" + } +, + "obj-12::obj-13::obj-34" : { + "parameter_longname" : "live.text[9]" + } +, + "obj-65::obj-13::obj-32" : { + "parameter_longname" : "live.text[10]" + } +, + "obj-65::obj-13::obj-33" : { + "parameter_longname" : "live.text[11]" + } +, + "obj-65::obj-13::obj-34" : { + "parameter_longname" : "live.text[12]" + } +, + "obj-67::obj-13::obj-32" : { + "parameter_longname" : "live.text[16]" + } +, + "obj-67::obj-13::obj-33" : { + "parameter_longname" : "live.text[14]" + } +, + "obj-67::obj-13::obj-34" : { + "parameter_longname" : "live.text[15]" + } +, + "obj-68::obj-13::obj-32" : { + "parameter_longname" : "live.text[19]" + } +, + "obj-68::obj-13::obj-33" : { + "parameter_longname" : "live.text[18]" + } +, + "obj-68::obj-13::obj-34" : { + "parameter_longname" : "live.text[17]" + } +, + "obj-71::obj-13::obj-32" : { + "parameter_longname" : "live.text[22]" + } +, + "obj-71::obj-13::obj-33" : { + "parameter_longname" : "live.text[20]" + } +, + "obj-71::obj-13::obj-34" : { + "parameter_longname" : "live.text[21]" + } +, + "obj-72::obj-13::obj-32" : { + "parameter_longname" : "live.text[13]" + } +, + "obj-72::obj-13::obj-33" : { + "parameter_longname" : "live.text[23]" + } +, + "obj-72::obj-13::obj-34" : { + "parameter_longname" : "live.text[24]" + } +, + "obj-73::obj-13::obj-32" : { + "parameter_longname" : "live.text[25]" + } +, + "obj-73::obj-13::obj-33" : { + "parameter_longname" : "live.text[26]" + } +, + "obj-73::obj-13::obj-34" : { + "parameter_longname" : "live.text[27]" + } +, + "obj-99::obj-32" : { + "parameter_longname" : "live.text[28]" + } +, + "obj-99::obj-33" : { + "parameter_longname" : "live.text[29]" + } +, + "obj-99::obj-34" : { + "parameter_longname" : "live.text[30]" + } + } , "inherited_shortname" : 1 @@ -3842,13 +5031,6 @@ "type" : "gDSP", "implicit" : 1 } -, { - "name" : "oopsy.midi.format.gendsp", - "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", - "patcherrelativepath" : "../code", - "type" : "gDSP", - "implicit" : 1 - } , { "name" : "oopsy.maxpat", "bootpath" : "~/Documents/Max 8/Packages/oopsy/patchers", diff --git a/examples/midside.maxpat b/examples/midside.maxpat index c91d084..e5a32bb 100644 --- a/examples/midside.maxpat +++ b/examples/midside.maxpat @@ -4,13 +4,13 @@ "appversion" : { "major" : 8, "minor" : 1, - "revision" : 5, + "revision" : 8, "architecture" : "x64", "modernui" : 1 } , "classnamespace" : "box", - "rect" : [ 59.0, 78.0, 586.0, 640.0 ], + "rect" : [ 927.0, 579.0, 618.0, 437.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -66,7 +66,7 @@ "numoutlets" : 5, "outlettype" : [ "signal", "signal", "", "float", "list" ], "parameter_enable" : 1, - "patching_rect" : [ 24.0, 377.0, 48.0, 136.0 ], + "patching_rect" : [ 62.0, 225.0, 48.0, 136.0 ], "saved_attribute_attributes" : { "valueof" : { "parameter_longname" : "live.gain~", @@ -95,13 +95,13 @@ "appversion" : { "major" : 8, "minor" : 1, - "revision" : 5, + "revision" : 8, "architecture" : "x64", "modernui" : 1 } , "classnamespace" : "dsp.gen", - "rect" : [ 761.0, 119.0, 634.0, 454.0 ], + "rect" : [ 977.0, 78.0, 634.0, 454.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -377,7 +377,7 @@ ] } , - "patching_rect" : [ 24.0, 272.0, 50.5, 22.0 ], + "patching_rect" : [ 62.0, 120.0, 50.5, 22.0 ], "saved_object_attributes" : { "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", "exportname" : "midside" @@ -408,7 +408,7 @@ "maxclass" : "ezdac~", "numinlets" : 2, "numoutlets" : 0, - "patching_rect" : [ 24.0, 523.0, 45.0, 45.0 ] + "patching_rect" : [ 62.0, 371.0, 45.0, 45.0 ] } } @@ -439,6 +439,7 @@ "obj-4" : [ "live.gain~", "live.gain~", 0 ], "obj-9::obj-32" : [ "live.text[4]", "FILTER", 0 ], "obj-9::obj-36" : [ "live.menu[1]", "live.menu", 0 ], + "obj-9::obj-4" : [ "live.menu[2]", "live.menu", 0 ], "parameterbanks" : { } diff --git a/examples/modfm.maxpat b/examples/modfm.maxpat index 7c4c7a3..e5c7ce1 100644 --- a/examples/modfm.maxpat +++ b/examples/modfm.maxpat @@ -10,7 +10,7 @@ } , "classnamespace" : "box", - "rect" : [ 202.0, 154.0, 703.0, 623.0 ], + "rect" : [ 205.0, 226.0, 703.0, 623.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -176,7 +176,7 @@ } , "classnamespace" : "dsp.gen", - "rect" : [ 822.0, 139.0, 770.0, 813.0 ], + "rect" : [ 443.0, 170.0, 770.0, 813.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -295,8 +295,8 @@ "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 491.0, 116.0, 218.0, 22.0 ], - "text" : "param knob4_octave @min -4 @max 6" + "patching_rect" : [ 491.0, 116.0, 237.0, 22.0 ], + "text" : "param knob4_int_octave @min -4 @max 6" } } @@ -398,42 +398,6 @@ "text" : "Harmonic" } - } -, { - "box" : { - "id" : "obj-35", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 130.0, 232.5, 26.0, 22.0 ], - "text" : "> 0" - } - - } -, { - "box" : { - "id" : "obj-34", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 130.0, 204.0, 48.0, 22.0 ], - "text" : "change" - } - - } -, { - "box" : { - "id" : "obj-33", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 130.0, 178.0, 107.0, 22.0 ], - "text" : "param gate1_sync" - } - } , { "box" : { @@ -913,27 +877,6 @@ "source" : [ "obj-32", 0 ] } - } -, { - "patchline" : { - "destination" : [ "obj-34", 0 ], - "source" : [ "obj-33", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-35", 0 ], - "source" : [ "obj-34", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-32", 1 ], - "source" : [ "obj-35", 0 ] - } - } , { "patchline" : { @@ -1216,7 +1159,56 @@ } } - ] + ], + "parameters" : { + "obj-11" : [ "live.gain~[1]", "live.gain~", 0 ], + "obj-9::obj-32" : [ "live.text[2]", "FILTER", 0 ], + "obj-9::obj-33" : [ "live.text[1]", "FILTER", 0 ], + "obj-9::obj-34" : [ "live.text[3]", "FILTER", 0 ], + "parameterbanks" : { + + } +, + "inherited_shortname" : 1 + } +, + "dependency_cache" : [ { + "name" : "oopsy.ctrl.smooth3.gendsp", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", + "patcherrelativepath" : "../code", + "type" : "gDSP", + "implicit" : 1 + } +, { + "name" : "oopsy.cv2hz.gendsp", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", + "patcherrelativepath" : "../code", + "type" : "gDSP", + "implicit" : 1 + } +, { + "name" : "oopsy.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/patchers", + "patcherrelativepath" : "../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "oopsy.snoop.js", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/javascript", + "patcherrelativepath" : "../javascript", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "oopsy.node4max.js", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/javascript", + "patcherrelativepath" : "../javascript", + "type" : "TEXT", + "implicit" : 1 + } + ], + "autosave" : 0 } } diff --git a/examples/multi_app.maxpat b/examples/multi_app.maxpat index a2b4591..fc604c7 100644 --- a/examples/multi_app.maxpat +++ b/examples/multi_app.maxpat @@ -10,7 +10,7 @@ } , "classnamespace" : "box", - "rect" : [ 903.0, 136.0, 583.0, 369.0 ], + "rect" : [ 199.0, 220.0, 1288.0, 750.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -40,56 +40,97 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-15", - "maxclass" : "newobj", - "numinlets" : 0, + "id" : "obj-22", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 33.0, 271.0, 43.0, 22.0 ], - "text" : "reverb" + "patching_rect" : [ 898.600008249282837, 157.0, 175.0, 60.0 ], + "text" : "A midi-enabled multi-app Oopsy program will respond to program-change MIDI events to by switching between apps " } } , { "box" : { - "id" : "obj-14", + "id" : "obj-20", "maxclass" : "newobj", - "numinlets" : 0, + "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 104.0, 235.0, 50.0, 22.0 ], - "text" : "midside" + "patching_rect" : [ 909.000008404254913, 370.0, 47.0, 22.0 ], + "text" : "midiout" } } , { "box" : { - "id" : "obj-13", + "id" : "obj-19", + "maxclass" : "number", + "minimum" : 20, + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 984.500008404254913, 239.59999805688858, 50.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 940.500008404254913, 239.59999805688858, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-9", "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 0, - "patching_rect" : [ 33.0, 235.0, 61.0, 22.0 ], - "text" : "crossover" + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 940.500008404254913, 265.59999805688858, 63.0, 22.0 ], + "text" : "metro 250" } } , { "box" : { - "id" : "obj-12", + "id" : "obj-8", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 940.500008404254913, 316.39999920129776, 50.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-4", "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 0, - "patching_rect" : [ 88.0, 197.0, 41.0, 22.0 ], - "text" : "pulsar" + "numinlets" : 5, + "numoutlets" : 4, + "outlettype" : [ "int", "", "", "int" ], + "patching_rect" : [ 940.500008404254913, 290.799998819828033, 69.0, 22.0 ], + "text" : "counter 1 8" } } , { "box" : { - "id" : "obj-11", + "id" : "obj-2", "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 0, - "patching_rect" : [ 33.0, 197.0, 45.0, 22.0 ], - "text" : "modfm" + "numinlets" : 7, + "numoutlets" : 2, + "outlettype" : [ "int", "" ], + "patching_rect" : [ 909.000008404254913, 342.799999594688416, 82.0, 22.0 ], + "text" : "midiformat" } } @@ -100,7 +141,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 26.0, 50.0, 402.0, 47.0 ], + "patching_rect" : [ 28.0, 77.59999805688858, 402.0, 47.0 ], "text" : "Oopsy will snoop for all gen~ objects in the same patcher or subpatchers, producing a 'multi-app' binary for the Daisy hardwares that support app switching, e.g. Patch, Field, Petal. " } @@ -113,14 +154,14 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 14.0, 15.0, 266.0, 27.0 ], + "patching_rect" : [ 28.0, 34.5, 266.0, 27.0 ], "text" : "Multi-app" } } , { "box" : { - "args" : [ "patch" ], + "args" : [ "@samplerate", "48kHz" ], "bgmode" : 0, "border" : 0, "clickthrough" : 0, @@ -133,17 +174,87 @@ "numinlets" : 1, "numoutlets" : 0, "offset" : [ 0.0, 0.0 ], - "patching_rect" : [ 296.0, 157.0, 128.0, 128.0 ], + "patching_rect" : [ 621.0, 158.0, 128.0, 128.0 ], "viewvisibility" : 1 } } , { "box" : { + "attr" : "ctrl4_damping", "id" : "obj-1", - "maxclass" : "newobj", - "numinlets" : 0, + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 254.0, 227.133757961783431, 150.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "ezdac~", + "numinlets" : 2, "numoutlets" : 0, + "patching_rect" : [ 24.0, 416.072072072072046, 45.0, 45.0 ] + } + + } +, { + "box" : { + "id" : "obj-11", + "lastchannelcount" : 0, + "maxclass" : "live.gain~", + "numinlets" : 2, + "numoutlets" : 5, + "outlettype" : [ "signal", "signal", "", "float", "list" ], + "parameter_enable" : 1, + "patching_rect" : [ 24.0, 328.0, 45.0, 75.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "live.gain~", + "parameter_mmax" : 6.0, + "parameter_mmin" : -70.0, + "parameter_shortname" : "live.gain~", + "parameter_type" : 0, + "parameter_unitstyle" : 4 + } + + } +, + "varname" : "live.gain~" + } + + } +, { + "box" : { + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-6", + "lockeddragscroll" : 0, + "maxclass" : "bpatcher", + "name" : "demosound.maxpat", + "numinlets" : 0, + "numoutlets" : 1, + "offset" : [ 0.0, 0.0 ], + "outlettype" : [ "signal" ], + "patching_rect" : [ 24.0, 157.0, 231.0, 96.0 ], + "viewvisibility" : 1 + } + + } +, { + "box" : { + "fontsize" : 18.0, + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 4, + "outlettype" : [ "signal", "signal", "signal", "signal" ], "patcher" : { "fileversion" : 1, "appversion" : { @@ -154,8 +265,8 @@ "modernui" : 1 } , - "classnamespace" : "box", - "rect" : [ 84.0, 103.0, 688.0, 569.0 ], + "classnamespace" : "dsp.gen", + "rect" : [ 77.0, 103.0, 1537.0, 893.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -185,79 +296,11 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "attr" : "ctrl4_damping", - "id" : "obj-7", - "maxclass" : "attrui", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 430.0, 103.0, 150.0, 22.0 ] - } - - } -, { - "box" : { - "id" : "obj-13", - "maxclass" : "ezdac~", - "numinlets" : 2, - "numoutlets" : 0, - "patching_rect" : [ 48.0, 470.0, 45.0, 45.0 ] - } - - } -, { - "box" : { - "id" : "obj-11", - "lastchannelcount" : 0, - "maxclass" : "live.gain~", - "numinlets" : 2, - "numoutlets" : 5, - "outlettype" : [ "signal", "signal", "", "float", "list" ], - "parameter_enable" : 1, - "patching_rect" : [ 48.0, 364.0, 44.0, 90.0 ], - "saved_attribute_attributes" : { - "valueof" : { - "parameter_longname" : "live.gain~", - "parameter_mmax" : 6.0, - "parameter_mmin" : -70.0, - "parameter_shortname" : "live.gain~", - "parameter_type" : 0, - "parameter_unitstyle" : 4 - } - - } -, - "varname" : "live.gain~" - } - - } -, { - "box" : { - "bgmode" : 0, - "border" : 0, - "clickthrough" : 0, - "enablehscroll" : 0, - "enablevscroll" : 0, - "id" : "obj-2", - "lockeddragscroll" : 0, - "maxclass" : "bpatcher", - "name" : "demosound.maxpat", - "numinlets" : 0, - "numoutlets" : 1, - "offset" : [ 0.0, 0.0 ], - "outlettype" : [ "signal" ], - "patching_rect" : [ 48.0, 156.0, 231.0, 96.0 ], - "viewvisibility" : 1 - } - - } -, { - "box" : { - "id" : "obj-12", + "id" : "obj-87", "maxclass" : "newobj", "numinlets" : 2, - "numoutlets" : 4, - "outlettype" : [ "signal", "signal", "signal", "signal" ], + "numoutlets" : 1, + "outlettype" : [ "" ], "patcher" : { "fileversion" : 1, "appversion" : { @@ -269,7 +312,7 @@ } , "classnamespace" : "dsp.gen", - "rect" : [ 77.0, 103.0, 1537.0, 893.0 ], + "rect" : [ 109.0, 128.0, 600.0, 450.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -299,1571 +342,414 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-87", + "id" : "obj-16", "maxclass" : "newobj", "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "dsp.gen", - "rect" : [ 109.0, 128.0, 600.0, 450.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-16", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 111.5, 198.5, 29.5, 22.0 ], - "text" : "-" - } - - } -, { - "box" : { - "id" : "obj-15", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 146.0, 125.0, 26.0, 22.0 ], - "text" : "+ 1" - } - - } -, { - "box" : { - "id" : "obj-14", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 146.0, 157.0, 47.0, 22.0 ], - "text" : "clip 0 1" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-12", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 219.0, 235.0, 47.0, 23.0 ], - "text" : "history" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-13", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 272.0, 235.0, 88.0, 23.0 ], - "text" : "mix" - } - - } -, { - "box" : { - "id" : "obj-11", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 341.0, 157.0, 47.0, 22.0 ], - "text" : "clip 0 1" - } - - } -, { - "box" : { - "id" : "obj-7", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 77.0, 281.0, 35.0, 22.0 ], - "text" : "out 1" - } - - } -, { - "box" : { - "id" : "obj-6", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 111.5, 60.0, 28.0, 22.0 ], - "text" : "in 1" - } - - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 341.0, 125.0, 28.0, 22.0 ], - "text" : "in 2" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-233", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 26.0, 235.0, 47.0, 23.0 ], - "text" : "history" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-234", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 77.0, 235.0, 88.0, 23.0 ], - "text" : "mix" - } - - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-13", 2 ], - "source" : [ "obj-11", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-13", 0 ], - "source" : [ "obj-12", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "order" : 0, - "source" : [ "obj-13", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-16", 1 ], - "midpoints" : [ 281.5, 268.0, 206.5, 268.0, 206.5, 187.5, 131.5, 187.5 ], - "order" : 1, - "source" : [ "obj-13", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-234", 2 ], - "source" : [ "obj-14", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-15", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-234", 1 ], - "source" : [ "obj-16", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-234", 0 ], - "source" : [ "obj-233", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-233", 0 ], - "order" : 1, - "source" : [ "obj-234", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-7", 0 ], - "order" : 0, - "source" : [ "obj-234", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-13", 1 ], - "midpoints" : [ 121.0, 101.5, 316.0, 101.5 ], - "order" : 0, - "source" : [ "obj-6", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-16", 0 ], - "order" : 1, - "source" : [ "obj-6", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-11", 0 ], - "order" : 0, - "source" : [ "obj-9", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-15", 0 ], - "order" : 1, - "source" : [ "obj-9", 0 ] - } - - } - ] - } -, - "patching_rect" : [ 77.00000399999999, 562.0, 78.0, 22.0 ], - "text" : "gen @title tilt" + "patching_rect" : [ 111.5, 198.5, 29.5, 22.0 ], + "text" : "-" } } , { "box" : { - "id" : "obj-83", + "id" : "obj-15", "maxclass" : "newobj", - "numinlets" : 2, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "dsp.gen", - "rect" : [ 109.0, 128.0, 600.0, 450.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-16", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 111.5, 198.5, 29.5, 22.0 ], - "text" : "-" - } - - } -, { - "box" : { - "id" : "obj-15", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 146.0, 125.0, 26.0, 22.0 ], - "text" : "+ 1" - } - - } -, { - "box" : { - "id" : "obj-14", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 146.0, 157.0, 47.0, 22.0 ], - "text" : "clip 0 1" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-12", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 219.0, 235.0, 47.0, 23.0 ], - "text" : "history" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-13", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 272.0, 235.0, 88.0, 23.0 ], - "text" : "mix" - } - - } -, { - "box" : { - "id" : "obj-11", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 341.0, 157.0, 47.0, 22.0 ], - "text" : "clip 0 1" - } - - } -, { - "box" : { - "id" : "obj-7", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 77.0, 281.0, 35.0, 22.0 ], - "text" : "out 1" - } - - } -, { - "box" : { - "id" : "obj-6", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 111.5, 60.0, 28.0, 22.0 ], - "text" : "in 1" - } - - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 341.0, 125.0, 28.0, 22.0 ], - "text" : "in 2" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-233", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 26.0, 235.0, 47.0, 23.0 ], - "text" : "history" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-234", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 77.0, 235.0, 88.0, 23.0 ], - "text" : "mix" - } - - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-13", 2 ], - "source" : [ "obj-11", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-13", 0 ], - "source" : [ "obj-12", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "order" : 0, - "source" : [ "obj-13", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-16", 1 ], - "midpoints" : [ 281.5, 268.0, 206.5, 268.0, 206.5, 187.5, 131.5, 187.5 ], - "order" : 1, - "source" : [ "obj-13", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-234", 2 ], - "source" : [ "obj-14", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-15", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-234", 1 ], - "source" : [ "obj-16", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-234", 0 ], - "source" : [ "obj-233", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-233", 0 ], - "order" : 1, - "source" : [ "obj-234", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-7", 0 ], - "order" : 0, - "source" : [ "obj-234", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-13", 1 ], - "midpoints" : [ 121.0, 101.5, 316.0, 101.5 ], - "order" : 0, - "source" : [ "obj-6", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-16", 0 ], - "order" : 1, - "source" : [ "obj-6", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-11", 0 ], - "order" : 0, - "source" : [ "obj-9", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-15", 0 ], - "order" : 1, - "source" : [ "obj-9", 0 ] - } - - } - ] - } -, - "patching_rect" : [ 227.0, 562.0, 78.0, 22.0 ], - "text" : "gen @title tilt" + "patching_rect" : [ 146.0, 125.0, 26.0, 22.0 ], + "text" : "+ 1" } } , { "box" : { - "id" : "obj-82", + "id" : "obj-14", "maxclass" : "newobj", - "numinlets" : 2, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "dsp.gen", - "rect" : [ 109.0, 128.0, 600.0, 450.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-16", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 111.5, 198.5, 29.5, 22.0 ], - "text" : "-" - } - - } -, { - "box" : { - "id" : "obj-15", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 146.0, 125.0, 26.0, 22.0 ], - "text" : "+ 1" - } - - } -, { - "box" : { - "id" : "obj-14", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 146.0, 157.0, 47.0, 22.0 ], - "text" : "clip 0 1" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-12", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 219.0, 235.0, 47.0, 23.0 ], - "text" : "history" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-13", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 272.0, 235.0, 88.0, 23.0 ], - "text" : "mix" - } - - } -, { - "box" : { - "id" : "obj-11", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 341.0, 157.0, 47.0, 22.0 ], - "text" : "clip 0 1" - } - - } -, { - "box" : { - "id" : "obj-7", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 77.0, 281.0, 35.0, 22.0 ], - "text" : "out 1" - } - - } -, { - "box" : { - "id" : "obj-6", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 111.5, 60.0, 28.0, 22.0 ], - "text" : "in 1" - } - - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 341.0, 125.0, 28.0, 22.0 ], - "text" : "in 2" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-233", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 26.0, 235.0, 47.0, 23.0 ], - "text" : "history" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-234", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 77.0, 235.0, 88.0, 23.0 ], - "text" : "mix" - } - - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-13", 2 ], - "source" : [ "obj-11", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-13", 0 ], - "source" : [ "obj-12", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "order" : 0, - "source" : [ "obj-13", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-16", 1 ], - "midpoints" : [ 281.5, 268.0, 206.5, 268.0, 206.5, 187.5, 131.5, 187.5 ], - "order" : 1, - "source" : [ "obj-13", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-234", 2 ], - "source" : [ "obj-14", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-15", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-234", 1 ], - "source" : [ "obj-16", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-234", 0 ], - "source" : [ "obj-233", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-233", 0 ], - "order" : 1, - "source" : [ "obj-234", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-7", 0 ], - "order" : 0, - "source" : [ "obj-234", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-13", 1 ], - "midpoints" : [ 121.0, 101.5, 316.0, 101.5 ], - "order" : 0, - "source" : [ "obj-6", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-16", 0 ], - "order" : 1, - "source" : [ "obj-6", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-11", 0 ], - "order" : 0, - "source" : [ "obj-9", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-15", 0 ], - "order" : 1, - "source" : [ "obj-9", 0 ] - } - - } - ] - } -, - "patching_rect" : [ 377.0, 562.0, 78.0, 22.0 ], - "text" : "gen @title tilt" + "patching_rect" : [ 146.0, 157.0, 47.0, 22.0 ], + "text" : "clip 0 1" } } , { "box" : { - "id" : "obj-80", + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-12", "maxclass" : "newobj", - "numinlets" : 2, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "dsp.gen", - "rect" : [ 109.0, 128.0, 600.0, 450.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-16", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 111.5, 198.5, 29.5, 22.0 ], - "text" : "-" - } - - } -, { - "box" : { - "id" : "obj-15", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 146.0, 125.0, 26.0, 22.0 ], - "text" : "+ 1" - } - - } -, { - "box" : { - "id" : "obj-14", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 146.0, 157.0, 47.0, 22.0 ], - "text" : "clip 0 1" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-12", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 219.0, 235.0, 47.0, 23.0 ], - "text" : "history" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-13", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 272.0, 235.0, 88.0, 23.0 ], - "text" : "mix" - } - - } -, { - "box" : { - "id" : "obj-11", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 341.0, 157.0, 47.0, 22.0 ], - "text" : "clip 0 1" - } - - } -, { - "box" : { - "id" : "obj-7", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 77.0, 281.0, 35.0, 22.0 ], - "text" : "out 1" - } - - } -, { - "box" : { - "id" : "obj-6", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 111.5, 60.0, 28.0, 22.0 ], - "text" : "in 1" - } - - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 341.0, 125.0, 28.0, 22.0 ], - "text" : "in 2" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-233", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 26.0, 235.0, 47.0, 23.0 ], - "text" : "history" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-234", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 77.0, 235.0, 88.0, 23.0 ], - "text" : "mix" - } - - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-13", 2 ], - "source" : [ "obj-11", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-13", 0 ], - "source" : [ "obj-12", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "order" : 0, - "source" : [ "obj-13", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-16", 1 ], - "midpoints" : [ 281.5, 268.0, 206.5, 268.0, 206.5, 187.5, 131.5, 187.5 ], - "order" : 1, - "source" : [ "obj-13", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-234", 2 ], - "source" : [ "obj-14", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-15", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-234", 1 ], - "source" : [ "obj-16", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-234", 0 ], - "source" : [ "obj-233", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-233", 0 ], - "order" : 1, - "source" : [ "obj-234", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-7", 0 ], - "order" : 0, - "source" : [ "obj-234", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-13", 1 ], - "midpoints" : [ 121.0, 101.5, 316.0, 101.5 ], - "order" : 0, - "source" : [ "obj-6", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-16", 0 ], - "order" : 1, - "source" : [ "obj-6", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-11", 0 ], - "order" : 0, - "source" : [ "obj-9", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-15", 0 ], - "order" : 1, - "source" : [ "obj-9", 0 ] - } - - } - ] - } -, - "patching_rect" : [ 527.0, 562.0, 78.0, 22.0 ], - "text" : "gen @title tilt" + "patching_rect" : [ 219.0, 235.0, 47.0, 23.0 ], + "text" : "history" } } , { "box" : { - "id" : "obj-61", + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-13", "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 895.750066000000061, 1459.0, 35.0, 22.0 ], - "text" : "out 2" + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 272.0, 235.0, 88.0, 23.0 ], + "text" : "mix" } } , { "box" : { - "id" : "obj-60", + "id" : "obj-11", "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 351.500035000000025, 1459.0, 35.0, 22.0 ], - "text" : "out 1" + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 341.0, 157.0, 47.0, 22.0 ], + "text" : "clip 0 1" } } , { "box" : { - "id" : "obj-34", + "id" : "obj-7", "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1011.750066000000061, 1400.0, 108.0, 22.0 ], - "text" : "oopsy.ctrl.smooth3" + "numoutlets" : 0, + "patching_rect" : [ 77.0, 281.0, 35.0, 22.0 ], + "text" : "out 1" } } , { "box" : { - "id" : "obj-23", + "id" : "obj-6", "maxclass" : "newobj", "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 1011.750066000000061, 1376.0, 207.0, 22.0 ], - "text" : "param ctrl1_wet 0.5 @min 0 @max 1" + "patching_rect" : [ 111.5, 60.0, 28.0, 22.0 ], + "text" : "in 1" } } , { "box" : { - "id" : "obj-22", + "id" : "obj-9", "maxclass" : "newobj", "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 895.750066000000061, 1400.0, 28.0, 22.0 ], + "patching_rect" : [ 341.0, 125.0, 28.0, 22.0 ], "text" : "in 2" } } , { "box" : { - "id" : "obj-21", + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-233", "maxclass" : "newobj", - "numinlets" : 3, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 895.750066000000061, 1431.0, 70.0, 22.0 ], - "text" : "mix" + "patching_rect" : [ 26.0, 235.0, 47.0, 23.0 ], + "text" : "history" } } , { "box" : { - "id" : "obj-20", + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-234", "maxclass" : "newobj", - "numinlets" : 0, + "numinlets" : 3, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 351.500035000000025, 1400.0, 28.0, 22.0 ], - "text" : "in 1" + "patching_rect" : [ 77.0, 235.0, 88.0, 23.0 ], + "text" : "mix" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-13", 2 ], + "source" : [ "obj-11", 0 ] } } , { - "box" : { - "id" : "obj-19", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 351.500035000000025, 1431.0, 70.0, 22.0 ], - "text" : "mix" + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-12", 0 ] } } , { - "box" : { - "id" : "obj-78", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 621.5, 911.5, 119.499964999999975, 22.0 ], - "text" : "mix" + "patchline" : { + "destination" : [ "obj-12", 0 ], + "order" : 0, + "source" : [ "obj-13", 0 ] } } , { - "box" : { - "id" : "obj-75", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 77.00000399999999, 911.5, 119.499964999999975, 22.0 ], - "text" : "mix" + "patchline" : { + "destination" : [ "obj-16", 1 ], + "midpoints" : [ 281.5, 268.0, 206.5, 268.0, 206.5, 187.5, 131.5, 187.5 ], + "order" : 1, + "source" : [ "obj-13", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-66", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 776.0, 850.5, 203.0, 23.0 ], - "text" : "param early_late 0.5 @min 0 @max 1" + "patchline" : { + "destination" : [ "obj-234", 2 ], + "source" : [ "obj-14", 0 ] } } , { - "box" : { - "id" : "obj-59", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 872.0, 173.000003499999991, 29.5, 22.0 ], - "text" : "*" + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-15", 0 ] } } , { - "box" : { - "id" : "obj-58", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1067.0, 77.5, 25.0, 22.0 ], - "text" : "not" + "patchline" : { + "destination" : [ "obj-234", 1 ], + "source" : [ "obj-16", 0 ] } } , { - "box" : { - "id" : "obj-56", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1067.0, 104.0, 108.0, 22.0 ], - "text" : "oopsy.ctrl.smooth3" + "patchline" : { + "destination" : [ "obj-234", 0 ], + "source" : [ "obj-233", 0 ] } } , { - "box" : { - "id" : "obj-55", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1197.25, 316.0, 29.5, 22.0 ], - "text" : "? 1" + "patchline" : { + "destination" : [ "obj-233", 0 ], + "order" : 1, + "source" : [ "obj-234", 0 ] } } , { - "box" : { - "id" : "obj-54", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1197.25, 32.0, 116.0, 22.0 ], - "text" : "param gate1_freeze" + "patchline" : { + "destination" : [ "obj-7", 0 ], + "order" : 0, + "source" : [ "obj-234", 0 ] } } , { - "box" : { - "id" : "obj-53", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1212.0, 230.0, 43.0, 22.0 ], - "text" : "* 1000" + "patchline" : { + "destination" : [ "obj-13", 1 ], + "midpoints" : [ 121.0, 101.5, 316.0, 101.5 ], + "order" : 0, + "source" : [ "obj-6", 0 ] } } , { - "box" : { - "id" : "obj-50", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1212.0, 257.000014999999962, 70.0, 22.0 ], - "text" : "mstosamps" + "patchline" : { + "destination" : [ "obj-16", 0 ], + "order" : 1, + "source" : [ "obj-6", 0 ] } } , { - "box" : { - "id" : "obj-48", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1212.0, 286.000014999999962, 25.0, 22.0 ], - "text" : "t60" + "patchline" : { + "destination" : [ "obj-11", 0 ], + "order" : 0, + "source" : [ "obj-9", 0 ] } } , { - "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 677.5, 81.74999200000002, 41.0, 22.0 ], - "text" : "pow 2" + "patchline" : { + "destination" : [ "obj-15", 0 ], + "order" : 1, + "source" : [ "obj-9", 0 ] } } -, { + ] + } +, + "patching_rect" : [ 77.00000399999999, 562.0, 78.0, 22.0 ], + "text" : "gen @title tilt" + } + + } +, { + "box" : { + "id" : "obj-83", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 109.0, 128.0, 600.0, 450.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { "box" : { - "id" : "obj-29", + "id" : "obj-16", "maxclass" : "newobj", - "numinlets" : 0, + "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 861.000035000000025, 948.0, 22.0, 22.0 ], - "text" : "32" + "patching_rect" : [ 111.5, 198.5, 29.5, 22.0 ], + "text" : "-" } } , { "box" : { - "id" : "obj-26", + "id" : "obj-15", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 776.0, 875.5, 108.0, 22.0 ], - "text" : "oopsy.ctrl.smooth3" + "patching_rect" : [ 146.0, 125.0, 26.0, 22.0 ], + "text" : "+ 1" } } , { "box" : { - "id" : "obj-9", + "id" : "obj-14", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 354.25, 236.0, 108.0, 22.0 ], - "text" : "oopsy.ctrl.smooth3" + "patching_rect" : [ 146.0, 157.0, 47.0, 22.0 ], + "text" : "clip 0 1" } } , { "box" : { - "id" : "obj-8", + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-12", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 677.5, 52.49999200000002, 108.0, 22.0 ], - "text" : "oopsy.ctrl.smooth2" + "patching_rect" : [ 219.0, 235.0, 47.0, 23.0 ], + "text" : "history" } } , { "box" : { - "id" : "obj-16", + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-13", "maxclass" : "newobj", - "numinlets" : 0, + "numinlets" : 3, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 909.5, 87.5, 28.0, 22.0 ], - "text" : "in 2" + "patching_rect" : [ 272.0, 235.0, 88.0, 23.0 ], + "text" : "mix" } } , { "box" : { - "id" : "obj-15", + "id" : "obj-11", "maxclass" : "newobj", - "numinlets" : 0, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 872.0, 87.5, 28.0, 22.0 ], - "text" : "in 1" + "patching_rect" : [ 341.0, 157.0, 47.0, 22.0 ], + "text" : "clip 0 1" } } , { "box" : { - "id" : "obj-13", + "id" : "obj-7", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 951.0, 1311.0, 35.0, 22.0 ], - "text" : "out 4" + "patching_rect" : [ 77.0, 281.0, 35.0, 22.0 ], + "text" : "out 1" } } , { "box" : { - "id" : "obj-12", + "id" : "obj-6", "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 405.75, 1311.0, 35.0, 22.0 ], - "text" : "out 3" - } - - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-303", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 522.000035000000025, 1197.0, 60.0, 35.0 ], - "text" : "Diffusion\nchains" + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 111.5, 60.0, 28.0, 22.0 ], + "text" : "in 1" } } , { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-298", + "id" : "obj-9", "maxclass" : "newobj", - "numinlets" : 1, + "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 872.0, 124.0, 33.0, 23.0 ], - "text" : "* 0.5" + "patching_rect" : [ 341.0, 125.0, 28.0, 22.0 ], + "text" : "in 2" } } @@ -1871,13 +757,13 @@ "box" : { "fontname" : "Lato", "fontsize" : 12.0, - "id" : "obj-289", + "id" : "obj-233", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 527.0, 741.0, 36.0, 23.0 ], - "text" : "* 0.5" + "patching_rect" : [ 26.0, 235.0, 47.0, 23.0 ], + "text" : "history" } } @@ -1885,237 +771,212 @@ "box" : { "fontname" : "Lato", "fontsize" : 12.0, - "id" : "obj-288", + "id" : "obj-234", "maxclass" : "newobj", - "numinlets" : 1, + "numinlets" : 3, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 377.0, 741.0, 38.0, 23.0 ], - "text" : "* -0.5" + "patching_rect" : [ 77.0, 235.0, 88.0, 23.0 ], + "text" : "mix" } } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-287", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 227.0, 741.0, 36.0, 23.0 ], - "text" : "* 0.5" + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-13", 2 ], + "source" : [ "obj-11", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-286", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 77.00000399999999, 741.0, 36.0, 23.0 ], - "text" : "* 0.5" + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-12", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-263", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 527.0, 703.0, 32.5, 23.0 ], - "text" : "+" + "patchline" : { + "destination" : [ "obj-12", 0 ], + "order" : 0, + "source" : [ "obj-13", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-262", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 377.0, 703.0, 32.5, 23.0 ], - "text" : "+" + "patchline" : { + "destination" : [ "obj-16", 1 ], + "midpoints" : [ 281.5, 268.0, 206.5, 268.0, 206.5, 187.5, 131.5, 187.5 ], + "order" : 1, + "source" : [ "obj-13", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-261", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 227.0, 703.0, 32.5, 23.0 ], - "text" : "-" + "patchline" : { + "destination" : [ "obj-234", 2 ], + "source" : [ "obj-14", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-260", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 467.0, 656.0, 32.5, 23.0 ], - "text" : "-" + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-15", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-259", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 77.00000399999999, 703.0, 32.5, 23.0 ], - "text" : "-" + "patchline" : { + "destination" : [ "obj-234", 1 ], + "source" : [ "obj-16", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-258", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 392.0, 656.0, 32.5, 23.0 ], - "text" : "+" + "patchline" : { + "destination" : [ "obj-234", 0 ], + "source" : [ "obj-233", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-257", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 167.0, 656.0, 32.5, 23.0 ], - "text" : "-" + "patchline" : { + "destination" : [ "obj-233", 0 ], + "order" : 1, + "source" : [ "obj-234", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-256", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 92.0, 656.0, 32.5, 23.0 ], - "text" : "+" + "patchline" : { + "destination" : [ "obj-7", 0 ], + "order" : 0, + "source" : [ "obj-234", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-249", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 287.0, 650.0, 60.0, 35.0 ], - "text" : "FDN matrix" + "patchline" : { + "destination" : [ "obj-13", 1 ], + "midpoints" : [ 121.0, 101.5, 316.0, 101.5 ], + "order" : 0, + "source" : [ "obj-6", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-245", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 557.0, 771.0, 32.5, 23.0 ], - "text" : "+" + "patchline" : { + "destination" : [ "obj-16", 0 ], + "order" : 1, + "source" : [ "obj-6", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-246", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 407.0, 771.0, 32.5, 23.0 ], - "text" : "+" + "patchline" : { + "destination" : [ "obj-11", 0 ], + "order" : 0, + "source" : [ "obj-9", 0 ] } } , { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "order" : 1, + "source" : [ "obj-9", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 227.0, 562.0, 78.0, 22.0 ], + "text" : "gen @title tilt" + } + + } +, { + "box" : { + "id" : "obj-82", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 109.0, 128.0, 600.0, 450.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-247", + "id" : "obj-16", "maxclass" : "newobj", "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 257.0, 771.0, 32.5, 23.0 ], - "text" : "+" + "patching_rect" : [ 111.5, 198.5, 29.5, 22.0 ], + "text" : "-" } } , { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-248", + "id" : "obj-15", "maxclass" : "newobj", - "numinlets" : 2, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 107.0, 771.0, 32.5, 23.0 ], - "text" : "+" + "patching_rect" : [ 146.0, 125.0, 26.0, 22.0 ], + "text" : "+ 1" } } , { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-231", + "id" : "obj-14", "maxclass" : "newobj", - "numinlets" : 2, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 542.0, 451.0, 113.0, 23.0 ], - "text" : "expr -pow(in2\\,in1)" + "patching_rect" : [ 146.0, 157.0, 47.0, 22.0 ], + "text" : "clip 0 1" } } @@ -2123,13 +984,13 @@ "box" : { "fontname" : "Lato", "fontsize" : 12.0, - "id" : "obj-232", + "id" : "obj-12", "maxclass" : "newobj", - "numinlets" : 2, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 527.0, 481.0, 32.5, 23.0 ], - "text" : "*" + "patching_rect" : [ 219.0, 235.0, 47.0, 23.0 ], + "text" : "history" } } @@ -2137,69 +998,60 @@ "box" : { "fontname" : "Lato", "fontsize" : 12.0, - "id" : "obj-236", + "id" : "obj-13", "maxclass" : "newobj", - "numinlets" : 2, + "numinlets" : 3, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 527.0, 418.0, 78.0, 23.0 ], - "text" : "delay 48000" + "patching_rect" : [ 272.0, 235.0, 88.0, 23.0 ], + "text" : "mix" } } , { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-238", + "id" : "obj-11", "maxclass" : "newobj", - "numinlets" : 2, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 392.0, 451.0, 113.0, 23.0 ], - "text" : "expr -pow(in2\\,in1)" + "patching_rect" : [ 341.0, 157.0, 47.0, 22.0 ], + "text" : "clip 0 1" } } , { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-239", + "id" : "obj-7", "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 377.0, 481.0, 32.5, 23.0 ], - "text" : "*" + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 77.0, 281.0, 35.0, 22.0 ], + "text" : "out 1" } } , { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-243", + "id" : "obj-6", "maxclass" : "newobj", - "numinlets" : 2, + "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 377.0, 418.0, 78.0, 23.0 ], - "text" : "delay 48000" + "patching_rect" : [ 111.5, 60.0, 28.0, 22.0 ], + "text" : "in 1" } } , { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-224", + "id" : "obj-9", "maxclass" : "newobj", - "numinlets" : 2, + "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 242.0, 451.0, 113.0, 23.0 ], - "text" : "expr -pow(in2\\,in1)" + "patching_rect" : [ 341.0, 125.0, 28.0, 22.0 ], + "text" : "in 2" } } @@ -2207,13 +1059,13 @@ "box" : { "fontname" : "Lato", "fontsize" : 12.0, - "id" : "obj-225", + "id" : "obj-233", "maxclass" : "newobj", - "numinlets" : 2, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 227.0, 481.0, 32.5, 23.0 ], - "text" : "*" + "patching_rect" : [ 26.0, 235.0, 47.0, 23.0 ], + "text" : "history" } } @@ -2221,250 +1073,212 @@ "box" : { "fontname" : "Lato", "fontsize" : 12.0, - "id" : "obj-229", + "id" : "obj-234", "maxclass" : "newobj", - "numinlets" : 2, + "numinlets" : 3, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 227.0, 418.0, 78.0, 23.0 ], - "text" : "delay 48000" + "patching_rect" : [ 77.0, 235.0, 88.0, 23.0 ], + "text" : "mix" } } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-214", - "maxclass" : "newobj", - "numinlets" : 5, - "numoutlets" : 4, - "outlettype" : [ "", "", "", "" ], - "patching_rect" : [ 872.0, 632.0, 465.0, 23.0 ], - "text" : "delay 48000 4" + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-13", 2 ], + "source" : [ "obj-11", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-213", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 812.0, 632.0, 60.0, 35.0 ], - "text" : "Tap delays" + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-12", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-212", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 932.0, 256.000014999999962, 75.0, 21.0 ], - "text" : "prediffuse" + "patchline" : { + "destination" : [ "obj-12", 0 ], + "order" : 0, + "source" : [ "obj-13", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-204", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1322.0, 692.0, 32.5, 23.0 ], - "text" : "*" + "patchline" : { + "destination" : [ "obj-16", 1 ], + "midpoints" : [ 281.5, 268.0, 206.5, 268.0, 206.5, 187.5, 131.5, 187.5 ], + "order" : 1, + "source" : [ "obj-13", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-205", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1337.0, 662.0, 109.0, 23.0 ], - "text" : "expr pow(in2\\,in1)" + "patchline" : { + "destination" : [ "obj-234", 2 ], + "source" : [ "obj-14", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-202", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1172.0, 692.0, 32.5, 23.0 ], - "text" : "*" + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-15", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-203", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1187.0, 662.0, 109.0, 23.0 ], - "text" : "expr pow(in2\\,in1)" + "patchline" : { + "destination" : [ "obj-234", 1 ], + "source" : [ "obj-16", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-200", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1022.0, 692.0, 32.5, 23.0 ], - "text" : "*" + "patchline" : { + "destination" : [ "obj-234", 0 ], + "source" : [ "obj-233", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-201", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1037.0, 662.0, 109.0, 23.0 ], - "text" : "expr pow(in2\\,in1)" + "patchline" : { + "destination" : [ "obj-233", 0 ], + "order" : 1, + "source" : [ "obj-234", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-199", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 872.0, 692.0, 32.5, 23.0 ], - "text" : "*" + "patchline" : { + "destination" : [ "obj-7", 0 ], + "order" : 0, + "source" : [ "obj-234", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-198", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 887.0, 662.0, 109.0, 23.0 ], - "text" : "expr pow(in2\\,in1)" + "patchline" : { + "destination" : [ "obj-13", 1 ], + "midpoints" : [ 121.0, 101.5, 316.0, 101.5 ], + "order" : 0, + "source" : [ "obj-6", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-197", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1337.0, 602.0, 28.0, 23.0 ], - "text" : "+ 5" + "patchline" : { + "destination" : [ "obj-16", 0 ], + "order" : 1, + "source" : [ "obj-6", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-196", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1187.0, 602.0, 28.0, 23.0 ], - "text" : "+ 5" + "patchline" : { + "destination" : [ "obj-11", 0 ], + "order" : 0, + "source" : [ "obj-9", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-195", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1037.0, 602.0, 28.0, 23.0 ], - "text" : "+ 5" + "patchline" : { + "destination" : [ "obj-15", 0 ], + "order" : 1, + "source" : [ "obj-9", 0 ] } } -, { + ] + } +, + "patching_rect" : [ 377.0, 562.0, 78.0, 22.0 ], + "text" : "gen @title tilt" + } + + } +, { + "box" : { + "id" : "obj-80", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 109.0, 128.0, 600.0, 450.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-194", + "id" : "obj-16", "maxclass" : "newobj", - "numinlets" : 1, + "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 887.0, 602.0, 28.0, 23.0 ], - "text" : "+ 5" + "patching_rect" : [ 111.5, 198.5, 29.5, 22.0 ], + "text" : "-" } } , { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-191", + "id" : "obj-15", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 1187.0, 572.0, 50.0, 23.0 ], - "text" : "* 0.155" + "patching_rect" : [ 146.0, 125.0, 26.0, 22.0 ], + "text" : "+ 1" } } , { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-192", + "id" : "obj-14", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 1037.0, 572.0, 36.0, 23.0 ], - "text" : "* 0.3" + "patching_rect" : [ 146.0, 157.0, 47.0, 22.0 ], + "text" : "clip 0 1" } } @@ -2472,13 +1286,13 @@ "box" : { "fontname" : "Lato", "fontsize" : 12.0, - "id" : "obj-193", + "id" : "obj-12", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 887.0, 572.0, 43.0, 23.0 ], - "text" : "* 0.41" + "patching_rect" : [ 219.0, 235.0, 47.0, 23.0 ], + "text" : "history" } } @@ -2486,69 +1300,60 @@ "box" : { "fontname" : "Lato", "fontsize" : 12.0, - "id" : "obj-173", + "id" : "obj-13", "maxclass" : "newobj", - "numinlets" : 1, + "numinlets" : 3, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 951.000035000000025, 1068.0, 49.0, 23.0 ], - "text" : "!- 1341" + "patching_rect" : [ 272.0, 235.0, 88.0, 23.0 ], + "text" : "mix" } } , { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-174", + "id" : "obj-11", "maxclass" : "newobj", - "numinlets" : 2, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 906.000035000000025, 1068.0, 32.5, 23.0 ], - "text" : "!-" + "patching_rect" : [ 341.0, 157.0, 47.0, 22.0 ], + "text" : "clip 0 1" } } , { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-175", + "id" : "obj-7", "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 906.000035000000025, 1038.0, 42.0, 23.0 ], - "text" : "+ 369" + "numoutlets" : 0, + "patching_rect" : [ 77.0, 281.0, 35.0, 22.0 ], + "text" : "out 1" } } , { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-176", + "id" : "obj-6", "maxclass" : "newobj", - "numinlets" : 1, + "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 951.000035000000025, 1038.0, 42.0, 23.0 ], - "text" : "+ 931" + "patching_rect" : [ 111.5, 60.0, 28.0, 22.0 ], + "text" : "in 1" } } , { "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-177", + "id" : "obj-9", "maxclass" : "newobj", - "numinlets" : 1, + "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 951.000035000000025, 1008.0, 74.0, 23.0 ], - "text" : "* -0.380445" + "patching_rect" : [ 341.0, 125.0, 28.0, 22.0 ], + "text" : "in 2" } } @@ -2556,13 +1361,13 @@ "box" : { "fontname" : "Lato", "fontsize" : 12.0, - "id" : "obj-178", + "id" : "obj-233", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 861.000035000000025, 1068.0, 42.0, 23.0 ], - "text" : "+ 159" + "patching_rect" : [ 26.0, 235.0, 47.0, 23.0 ], + "text" : "history" } } @@ -2570,4661 +1375,5634 @@ "box" : { "fontname" : "Lato", "fontsize" : 12.0, - "id" : "obj-179", + "id" : "obj-234", "maxclass" : "newobj", - "numinlets" : 1, + "numinlets" : 3, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 861.000035000000025, 1008.0, 74.0, 23.0 ], - "text" : "* -0.568366" + "patching_rect" : [ 77.0, 235.0, 88.0, 23.0 ], + "text" : "mix" } } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-134", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 921.000035000000025, 1278.0, 45.0, 23.0 ], - "text" : "+" + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-13", 2 ], + "source" : [ "obj-11", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-136", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 921.000035000000025, 1248.0, 50.0, 23.0 ], - "text" : "* 0.625" + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-12", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-137", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 921.000035000000025, 1218.0, 32.5, 23.0 ], - "text" : "-" + "patchline" : { + "destination" : [ "obj-12", 0 ], + "order" : 0, + "source" : [ "obj-13", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-140", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 936.000035000000025, 1188.0, 50.0, 23.0 ], - "text" : "* 0.625" + "patchline" : { + "destination" : [ "obj-16", 1 ], + "midpoints" : [ 281.5, 268.0, 206.5, 268.0, 206.5, 187.5, 131.5, 187.5 ], + "order" : 1, + "source" : [ "obj-13", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-141", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 966.000035000000025, 1158.0, 78.0, 23.0 ], - "text" : "delay 12000" + "patchline" : { + "destination" : [ "obj-234", 2 ], + "source" : [ "obj-14", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-142", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 996.000095999999985, 1128.0, 32.5, 23.0 ], - "text" : "*" + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-15", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-144", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 771.000035000000025, 1278.0, 45.0, 23.0 ], - "text" : "+" + "patchline" : { + "destination" : [ "obj-234", 1 ], + "source" : [ "obj-16", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-146", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 771.000035000000025, 1248.0, 50.0, 23.0 ], - "text" : "* 0.625" + "patchline" : { + "destination" : [ "obj-234", 0 ], + "source" : [ "obj-233", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-147", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 771.000035000000025, 1218.0, 32.5, 23.0 ], - "text" : "-" + "patchline" : { + "destination" : [ "obj-233", 0 ], + "order" : 1, + "source" : [ "obj-234", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-150", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 786.000035000000025, 1188.0, 50.0, 23.0 ], - "text" : "* 0.625" + "patchline" : { + "destination" : [ "obj-7", 0 ], + "order" : 0, + "source" : [ "obj-234", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-151", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 816.000035000000025, 1158.0, 78.0, 23.0 ], - "text" : "delay 16000" + "patchline" : { + "destination" : [ "obj-13", 1 ], + "midpoints" : [ 121.0, 101.5, 316.0, 101.5 ], + "order" : 0, + "source" : [ "obj-6", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-152", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 846.000035000000025, 1128.0, 32.5, 23.0 ], - "text" : "*" + "patchline" : { + "destination" : [ "obj-16", 0 ], + "order" : 1, + "source" : [ "obj-6", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-154", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 621.000035000000025, 1278.0, 45.0, 23.0 ], - "text" : "+" + "patchline" : { + "destination" : [ "obj-11", 0 ], + "order" : 0, + "source" : [ "obj-9", 0 ] } } , { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-156", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 621.000035000000025, 1248.0, 43.0, 23.0 ], - "text" : "* 0.75" + "patchline" : { + "destination" : [ "obj-15", 0 ], + "order" : 1, + "source" : [ "obj-9", 0 ] } } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-157", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 621.000035000000025, 1218.0, 32.5, 23.0 ], - "text" : "-" - } + ] + } +, + "patching_rect" : [ 527.0, 562.0, 78.0, 22.0 ], + "text" : "gen @title tilt" + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-160", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 636.000035000000025, 1188.0, 43.0, 23.0 ], - "text" : "* 0.75" - } + } +, { + "box" : { + "id" : "obj-61", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 895.750066000000061, 1459.0, 35.0, 22.0 ], + "text" : "out 2" + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-161", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 666.000035000000025, 1158.0, 71.0, 23.0 ], - "text" : "delay 7000" - } + } +, { + "box" : { + "id" : "obj-60", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 351.500035000000025, 1459.0, 35.0, 22.0 ], + "text" : "out 1" + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-162", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 696.000035000000025, 1128.0, 32.5, 23.0 ], - "text" : "*" - } + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1011.750066000000061, 1400.0, 108.0, 22.0 ], + "text" : "oopsy.ctrl.smooth3" + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-131", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 272.000035000000025, 1068.0, 49.0, 23.0 ], - "text" : "!- 1341" - } + } +, { + "box" : { + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1011.750066000000061, 1376.0, 207.0, 22.0 ], + "text" : "param ctrl1_wet 0.5 @min 0 @max 1" + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-129", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 212.000035000000025, 1068.0, 32.5, 23.0 ], - "text" : "!-" - } + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 895.750066000000061, 1400.0, 28.0, 22.0 ], + "text" : "in 2" + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-127", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 212.000035000000025, 1038.0, 42.0, 23.0 ], - "text" : "+ 369" - } + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 895.750066000000061, 1431.0, 70.0, 22.0 ], + "text" : "mix" + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-125", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 272.000035000000025, 1038.0, 42.0, 23.0 ], - "text" : "+ 931" - } + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 351.500035000000025, 1400.0, 28.0, 22.0 ], + "text" : "in 1" + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-124", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 272.000035000000025, 1008.0, 70.0, 23.0 ], - "text" : "* 0.376623" - } + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 351.500035000000025, 1431.0, 70.0, 22.0 ], + "text" : "mix" + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-112", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 377.000035000000025, 1278.0, 45.0, 23.0 ], - "text" : "+" - } + } +, { + "box" : { + "id" : "obj-78", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 621.5, 911.5, 119.499964999999975, 22.0 ], + "text" : "mix" + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-114", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 377.000035000000025, 1248.0, 50.0, 23.0 ], - "text" : "* 0.625" - } + } +, { + "box" : { + "id" : "obj-75", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 77.00000399999999, 911.5, 119.499964999999975, 22.0 ], + "text" : "mix" + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-116", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 377.000035000000025, 1218.0, 32.5, 23.0 ], - "text" : "-" - } + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-66", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 776.0, 850.5, 203.0, 23.0 ], + "text" : "param early_late 0.5 @min 0 @max 1" + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-119", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 392.000035000000025, 1188.0, 50.0, 23.0 ], - "text" : "* 0.625" - } + } +, { + "box" : { + "id" : "obj-59", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 872.0, 173.000003499999991, 29.5, 22.0 ], + "text" : "*" + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-120", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 422.000035000000025, 1158.0, 78.0, 23.0 ], - "text" : "delay 10000" - } + } +, { + "box" : { + "id" : "obj-58", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1067.0, 77.5, 25.0, 22.0 ], + "text" : "not" + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-121", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 452.000095999999985, 1128.0, 32.5, 23.0 ], - "text" : "*" - } + } +, { + "box" : { + "id" : "obj-56", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1067.0, 104.0, 108.0, 22.0 ], + "text" : "oopsy.ctrl.smooth3" + } + + } +, { + "box" : { + "id" : "obj-55", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1197.25, 316.0, 29.5, 22.0 ], + "text" : "? 1" + } + + } +, { + "box" : { + "id" : "obj-54", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1197.25, 32.0, 116.0, 22.0 ], + "text" : "param gate1_freeze" + } + + } +, { + "box" : { + "id" : "obj-53", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1212.0, 230.0, 43.0, 22.0 ], + "text" : "* 1000" + } + + } +, { + "box" : { + "id" : "obj-50", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1212.0, 257.000014999999962, 70.0, 22.0 ], + "text" : "mstosamps" + } + + } +, { + "box" : { + "id" : "obj-48", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1212.0, 286.000014999999962, 25.0, 22.0 ], + "text" : "t60" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 677.5, 81.74999200000002, 41.0, 22.0 ], + "text" : "pow 2" + } + + } +, { + "box" : { + "id" : "obj-29", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 861.000035000000025, 948.0, 22.0, 22.0 ], + "text" : "32" + } + + } +, { + "box" : { + "id" : "obj-26", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 776.0, 875.5, 108.0, 22.0 ], + "text" : "oopsy.ctrl.smooth3" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 354.25, 236.0, 108.0, 22.0 ], + "text" : "oopsy.ctrl.smooth3" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 677.5, 52.49999200000002, 108.0, 22.0 ], + "text" : "oopsy.ctrl.smooth2" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 909.5, 87.5, 28.0, 22.0 ], + "text" : "in 2" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 872.0, 87.5, 28.0, 22.0 ], + "text" : "in 1" + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 951.0, 1311.0, 35.0, 22.0 ], + "text" : "out 4" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 405.75, 1311.0, 35.0, 22.0 ], + "text" : "out 3" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-303", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 522.000035000000025, 1197.0, 60.0, 35.0 ], + "text" : "Diffusion\nchains" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-298", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 872.0, 124.0, 33.0, 23.0 ], + "text" : "* 0.5" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-289", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 527.0, 741.0, 36.0, 23.0 ], + "text" : "* 0.5" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-288", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 377.0, 741.0, 38.0, 23.0 ], + "text" : "* -0.5" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-287", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 227.0, 741.0, 36.0, 23.0 ], + "text" : "* 0.5" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-286", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 77.00000399999999, 741.0, 36.0, 23.0 ], + "text" : "* 0.5" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-263", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 527.0, 703.0, 32.5, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-262", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 377.0, 703.0, 32.5, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-261", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 227.0, 703.0, 32.5, 23.0 ], + "text" : "-" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-260", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 467.0, 656.0, 32.5, 23.0 ], + "text" : "-" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-259", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 77.00000399999999, 703.0, 32.5, 23.0 ], + "text" : "-" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-258", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 392.0, 656.0, 32.5, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-257", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 167.0, 656.0, 32.5, 23.0 ], + "text" : "-" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-256", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 92.0, 656.0, 32.5, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-249", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 287.0, 650.0, 60.0, 35.0 ], + "text" : "FDN matrix" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-245", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 557.0, 771.0, 32.5, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-246", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 407.0, 771.0, 32.5, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-247", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 257.0, 771.0, 32.5, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-248", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 107.0, 771.0, 32.5, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-231", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 542.0, 451.0, 113.0, 23.0 ], + "text" : "expr -pow(in2\\,in1)" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-232", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 527.0, 481.0, 32.5, 23.0 ], + "text" : "*" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-236", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 527.0, 418.0, 78.0, 23.0 ], + "text" : "delay 48000" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-238", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 392.0, 451.0, 113.0, 23.0 ], + "text" : "expr -pow(in2\\,in1)" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-239", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 377.0, 481.0, 32.5, 23.0 ], + "text" : "*" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-243", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 377.0, 418.0, 78.0, 23.0 ], + "text" : "delay 48000" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-224", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 242.0, 451.0, 113.0, 23.0 ], + "text" : "expr -pow(in2\\,in1)" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-225", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 227.0, 481.0, 32.5, 23.0 ], + "text" : "*" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-229", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 227.0, 418.0, 78.0, 23.0 ], + "text" : "delay 48000" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-214", + "maxclass" : "newobj", + "numinlets" : 5, + "numoutlets" : 4, + "outlettype" : [ "", "", "", "" ], + "patching_rect" : [ 872.0, 632.0, 465.0, 23.0 ], + "text" : "delay 48000 4" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-213", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 812.0, 632.0, 60.0, 35.0 ], + "text" : "Tap delays" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-212", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 932.0, 256.000014999999962, 75.0, 21.0 ], + "text" : "prediffuse" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-204", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1322.0, 692.0, 32.5, 23.0 ], + "text" : "*" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-205", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1337.0, 662.0, 109.0, 23.0 ], + "text" : "expr pow(in2\\,in1)" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-202", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1172.0, 692.0, 32.5, 23.0 ], + "text" : "*" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-203", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1187.0, 662.0, 109.0, 23.0 ], + "text" : "expr pow(in2\\,in1)" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-200", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1022.0, 692.0, 32.5, 23.0 ], + "text" : "*" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-201", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1037.0, 662.0, 109.0, 23.0 ], + "text" : "expr pow(in2\\,in1)" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-199", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 872.0, 692.0, 32.5, 23.0 ], + "text" : "*" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-198", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 887.0, 662.0, 109.0, 23.0 ], + "text" : "expr pow(in2\\,in1)" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-197", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1337.0, 602.0, 28.0, 23.0 ], + "text" : "+ 5" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-196", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1187.0, 602.0, 28.0, 23.0 ], + "text" : "+ 5" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-195", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1037.0, 602.0, 28.0, 23.0 ], + "text" : "+ 5" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-194", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 887.0, 602.0, 28.0, 23.0 ], + "text" : "+ 5" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-191", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1187.0, 572.0, 50.0, 23.0 ], + "text" : "* 0.155" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-192", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1037.0, 572.0, 36.0, 23.0 ], + "text" : "* 0.3" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-193", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 887.0, 572.0, 43.0, 23.0 ], + "text" : "* 0.41" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-173", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 951.000035000000025, 1068.0, 49.0, 23.0 ], + "text" : "!- 1341" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-174", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 906.000035000000025, 1068.0, 32.5, 23.0 ], + "text" : "!-" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-175", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 906.000035000000025, 1038.0, 42.0, 23.0 ], + "text" : "+ 369" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-176", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 951.000035000000025, 1038.0, 42.0, 23.0 ], + "text" : "+ 931" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-177", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 951.000035000000025, 1008.0, 74.0, 23.0 ], + "text" : "* -0.380445" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-178", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 861.000035000000025, 1068.0, 42.0, 23.0 ], + "text" : "+ 159" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-179", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 861.000035000000025, 1008.0, 74.0, 23.0 ], + "text" : "* -0.568366" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-134", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 921.000035000000025, 1278.0, 45.0, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-136", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 921.000035000000025, 1248.0, 50.0, 23.0 ], + "text" : "* 0.625" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-137", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 921.000035000000025, 1218.0, 32.5, 23.0 ], + "text" : "-" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-140", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 936.000035000000025, 1188.0, 50.0, 23.0 ], + "text" : "* 0.625" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-141", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 966.000035000000025, 1158.0, 78.0, 23.0 ], + "text" : "delay 12000" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-142", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 996.000095999999985, 1128.0, 32.5, 23.0 ], + "text" : "*" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-144", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 771.000035000000025, 1278.0, 45.0, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-146", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 771.000035000000025, 1248.0, 50.0, 23.0 ], + "text" : "* 0.625" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-147", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 771.000035000000025, 1218.0, 32.5, 23.0 ], + "text" : "-" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-150", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 786.000035000000025, 1188.0, 50.0, 23.0 ], + "text" : "* 0.625" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-151", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 816.000035000000025, 1158.0, 78.0, 23.0 ], + "text" : "delay 16000" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-152", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 846.000035000000025, 1128.0, 32.5, 23.0 ], + "text" : "*" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-154", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 621.000035000000025, 1278.0, 45.0, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-156", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 621.000035000000025, 1248.0, 43.0, 23.0 ], + "text" : "* 0.75" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-157", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 621.000035000000025, 1218.0, 32.5, 23.0 ], + "text" : "-" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-160", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 636.000035000000025, 1188.0, 43.0, 23.0 ], + "text" : "* 0.75" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-161", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 666.000035000000025, 1158.0, 71.0, 23.0 ], + "text" : "delay 7000" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-162", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 696.000035000000025, 1128.0, 32.5, 23.0 ], + "text" : "*" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-131", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 272.000035000000025, 1068.0, 49.0, 23.0 ], + "text" : "!- 1341" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-129", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 212.000035000000025, 1068.0, 32.5, 23.0 ], + "text" : "!-" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-127", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 212.000035000000025, 1038.0, 42.0, 23.0 ], + "text" : "+ 369" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-125", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 272.000035000000025, 1038.0, 42.0, 23.0 ], + "text" : "+ 931" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-124", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 272.000035000000025, 1008.0, 70.0, 23.0 ], + "text" : "* 0.376623" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-112", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 377.000035000000025, 1278.0, 45.0, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-114", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 377.000035000000025, 1248.0, 50.0, 23.0 ], + "text" : "* 0.625" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-116", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 377.000035000000025, 1218.0, 32.5, 23.0 ], + "text" : "-" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-119", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 392.000035000000025, 1188.0, 50.0, 23.0 ], + "text" : "* 0.625" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-120", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 422.000035000000025, 1158.0, 78.0, 23.0 ], + "text" : "delay 10000" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-121", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 452.000095999999985, 1128.0, 32.5, 23.0 ], + "text" : "*" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-98", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 227.000035000000025, 1278.0, 45.0, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-100", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 227.000035000000025, 1248.0, 50.0, 23.0 ], + "text" : "* 0.625" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-102", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 227.000035000000025, 1218.0, 32.5, 23.0 ], + "text" : "-" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-105", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 242.000035000000025, 1188.0, 50.0, 23.0 ], + "text" : "* 0.625" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-106", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 272.000035000000025, 1158.0, 78.0, 23.0 ], + "text" : "delay 15000" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-107", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 302.000035000000025, 1128.0, 32.5, 23.0 ], + "text" : "*" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-95", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 167.00000399999999, 1068.0, 42.0, 23.0 ], + "text" : "+ 159" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-88", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 167.00000399999999, 1008.0, 70.0, 23.0 ], + "text" : "* 0.125541" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-77", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 77.00000399999999, 1278.0, 45.0, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-79", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 77.00000399999999, 1248.0, 43.0, 23.0 ], + "text" : "* 0.75" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-81", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 77.00000399999999, 1218.0, 32.5, 23.0 ], + "text" : "-" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-84", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 92.00000399999999, 1188.0, 43.0, 23.0 ], + "text" : "* 0.75" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-85", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 122.00000399999999, 1158.0, 71.0, 23.0 ], + "text" : "delay 5000" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-86", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 152.00000399999999, 1128.0, 32.5, 23.0 ], + "text" : "*" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-74", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 872.0, 316.0, 45.0, 23.0 ], + "text" : "+" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-72", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 872.0, 286.0, 43.0, 23.0 ], + "text" : "* 0.75" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-67", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 872.0, 256.000014999999962, 32.5, 23.0 ], + "text" : "-" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-64", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 887.0, 226.000014999999962, 43.0, 23.0 ], + "text" : "* 0.75" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-63", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 917.0, 196.000014999999962, 71.0, 23.0 ], + "text" : "delay 6000" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-62", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 969.0, 168.0, 70.0, 23.0 ], + "text" : "* 0.110732" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-52", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 700.000035000000025, 1068.0, 32.0, 23.0 ], + "text" : "2.31" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-45", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 92.0, 451.0, 113.0, 23.0 ], + "text" : "expr -pow(in2\\,in1)" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-44", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 77.00000399999999, 481.0, 32.5, 23.0 ], + "text" : "*" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-42", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 587.0, 361.0, 63.0, 23.0 ], + "text" : "* 0.63245" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-43", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 437.0, 361.0, 57.0, 23.0 ], + "text" : "* 0.7071" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-41", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 287.0, 361.0, 63.0, 23.0 ], + "text" : "* 0.81649" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-40", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 137.0, 361.0, 26.0, 23.0 ], + "text" : "* 1" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-33", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 122.0, 511.0, 60.0, 35.0 ], + "text" : "FDN dampers" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-30", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 77.00000399999999, 418.0, 78.0, 23.0 ], + "text" : "delay 48000" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-28", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 62.0, 346.0, 75.0, 50.0 ], + "text" : "Feeedback delay network" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-11", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 677.5, 115.99999200000002, 74.0, 23.0 ], + "text" : "* samplerate" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 354.25, 192.0, 235.0, 23.0 ], + "text" : "param ctrl4_damping -0.7 @min -1 @max 1" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1212.0, 198.0, 259.0, 23.0 ], + "text" : "param ctrl3_len_seconds 11 @min 0.1 @max 24" + } + + } +, { + "box" : { + "fontname" : "Lato", + "fontsize" : 12.0, + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 677.5, 19.0, 239.0, 23.0 ], + "text" : "param ctrl2_roomsize 0.5 @min 0.1 @max 1" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-98", 0 ], + "source" : [ "obj-100", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-100", 0 ], + "order" : 1, + "source" : [ "obj-102", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-106", 0 ], + "order" : 0, + "source" : [ "obj-102", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-102", 1 ], + "source" : [ "obj-105", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-105", 0 ], + "order" : 1, + "source" : [ "obj-106", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-98", 1 ], + "order" : 0, + "source" : [ "obj-106", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-106", 1 ], + "source" : [ "obj-107", 0 ] + } + + } +, { + "patchline" : { + "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], + "destination" : [ "obj-191", 0 ], + "midpoints" : [ 687.0, 355.5, 1196.5, 355.5 ], + "order" : 1, + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], + "destination" : [ "obj-192", 0 ], + "midpoints" : [ 687.0, 355.5, 1046.5, 355.5 ], + "order" : 2, + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], + "destination" : [ "obj-193", 0 ], + "midpoints" : [ 687.0, 355.5, 896.5, 355.5 ], + "order" : 4, + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], + "destination" : [ "obj-197", 0 ], + "midpoints" : [ 687.0, 354.394897000000014, 1346.5, 354.394897000000014 ], + "order" : 0, + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], + "destination" : [ "obj-40", 0 ], + "midpoints" : [ 687.0, 353.166504000000032, 146.5, 353.166504000000032 ], + "order" : 8, + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], + "destination" : [ "obj-41", 0 ], + "midpoints" : [ 687.0, 353.166504000000032, 296.5, 353.166504000000032 ], + "order" : 7, + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], + "destination" : [ "obj-42", 0 ], + "midpoints" : [ 687.0, 354.630584999999996, 596.5, 354.630584999999996 ], + "order" : 5, + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], + "destination" : [ "obj-43", 0 ], + "midpoints" : [ 687.0, 351.702393000000029, 446.5, 351.702393000000029 ], + "order" : 6, + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], + "destination" : [ "obj-62", 0 ], + "midpoints" : [ 687.0, 160.679504000000009, 978.5, 160.679504000000009 ], + "order" : 3, + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "order" : 0, + "source" : [ "obj-112", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 1 ], + "order" : 1, + "source" : [ "obj-112", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-112", 0 ], + "source" : [ "obj-114", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-114", 0 ], + "order" : 1, + "source" : [ "obj-116", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-120", 0 ], + "order" : 0, + "source" : [ "obj-116", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-116", 1 ], + "source" : [ "obj-119", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-112", 1 ], + "order" : 0, + "source" : [ "obj-120", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-119", 0 ], + "order" : 1, + "source" : [ "obj-120", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-120", 1 ], + "source" : [ "obj-121", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-125", 0 ], + "source" : [ "obj-124", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-129", 1 ], + "order" : 1, + "source" : [ "obj-125", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-131", 0 ], + "order" : 0, + "source" : [ "obj-125", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-129", 0 ], + "source" : [ "obj-127", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-107", 1 ], + "source" : [ "obj-129", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-121", 1 ], + "source" : [ "obj-131", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "order" : 0, + "source" : [ "obj-134", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-21", 1 ], + "order" : 1, + "source" : [ "obj-134", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-134", 0 ], + "source" : [ "obj-136", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-136", 0 ], + "order" : 1, + "source" : [ "obj-137", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-141", 0 ], + "order" : 0, + "source" : [ "obj-137", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-137", 1 ], + "source" : [ "obj-140", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-98", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 227.000035000000025, 1278.0, 45.0, 23.0 ], - "text" : "+" - } + } +, { + "patchline" : { + "destination" : [ "obj-134", 1 ], + "order" : 0, + "source" : [ "obj-141", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-100", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 227.000035000000025, 1248.0, 50.0, 23.0 ], - "text" : "* 0.625" - } + } +, { + "patchline" : { + "destination" : [ "obj-140", 0 ], + "order" : 1, + "source" : [ "obj-141", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-102", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 227.000035000000025, 1218.0, 32.5, 23.0 ], - "text" : "-" - } + } +, { + "patchline" : { + "destination" : [ "obj-141", 1 ], + "source" : [ "obj-142", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-105", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 242.000035000000025, 1188.0, 50.0, 23.0 ], - "text" : "* 0.625" - } + } +, { + "patchline" : { + "destination" : [ "obj-137", 0 ], + "source" : [ "obj-144", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-106", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 272.000035000000025, 1158.0, 78.0, 23.0 ], - "text" : "delay 15000" - } + } +, { + "patchline" : { + "destination" : [ "obj-144", 0 ], + "source" : [ "obj-146", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-107", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 302.000035000000025, 1128.0, 32.5, 23.0 ], - "text" : "*" - } + } +, { + "patchline" : { + "destination" : [ "obj-146", 0 ], + "order" : 1, + "source" : [ "obj-147", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-95", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 167.00000399999999, 1068.0, 42.0, 23.0 ], - "text" : "+ 159" - } + } +, { + "patchline" : { + "destination" : [ "obj-151", 0 ], + "order" : 0, + "source" : [ "obj-147", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-88", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 167.00000399999999, 1008.0, 70.0, 23.0 ], - "text" : "* 0.125541" - } + } +, { + "patchline" : { + "destination" : [ "obj-298", 0 ], + "source" : [ "obj-15", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-77", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 77.00000399999999, 1278.0, 45.0, 23.0 ], - "text" : "+" - } + } +, { + "patchline" : { + "destination" : [ "obj-147", 1 ], + "source" : [ "obj-150", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-144", 1 ], + "order" : 0, + "source" : [ "obj-151", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-150", 0 ], + "order" : 1, + "source" : [ "obj-151", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-151", 1 ], + "source" : [ "obj-152", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-147", 0 ], + "source" : [ "obj-154", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-154", 0 ], + "source" : [ "obj-156", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-156", 0 ], + "order" : 1, + "source" : [ "obj-157", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-161", 0 ], + "order" : 0, + "source" : [ "obj-157", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-298", 0 ], + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-157", 1 ], + "source" : [ "obj-160", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-154", 1 ], + "order" : 0, + "source" : [ "obj-161", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-160", 0 ], + "order" : 1, + "source" : [ "obj-161", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-161", 1 ], + "source" : [ "obj-162", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-142", 1 ], + "source" : [ "obj-173", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-152", 1 ], + "source" : [ "obj-174", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-174", 0 ], + "source" : [ "obj-175", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-173", 0 ], + "order" : 0, + "source" : [ "obj-176", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-174", 1 ], + "order" : 1, + "source" : [ "obj-176", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-176", 0 ], + "source" : [ "obj-177", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-162", 1 ], + "source" : [ "obj-178", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-175", 0 ], + "order" : 0, + "source" : [ "obj-179", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-178", 0 ], + "order" : 1, + "source" : [ "obj-179", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-60", 0 ], + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-196", 0 ], + "source" : [ "obj-191", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-79", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 77.00000399999999, 1248.0, 43.0, 23.0 ], - "text" : "* 0.75" - } + } +, { + "patchline" : { + "destination" : [ "obj-195", 0 ], + "source" : [ "obj-192", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-81", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 77.00000399999999, 1218.0, 32.5, 23.0 ], - "text" : "-" - } + } +, { + "patchline" : { + "destination" : [ "obj-194", 0 ], + "source" : [ "obj-193", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-84", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 92.00000399999999, 1188.0, 43.0, 23.0 ], - "text" : "* 0.75" - } + } +, { + "patchline" : { + "destination" : [ "obj-198", 0 ], + "order" : 1, + "source" : [ "obj-194", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-85", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 122.00000399999999, 1158.0, 71.0, 23.0 ], - "text" : "delay 5000" - } + } +, { + "patchline" : { + "destination" : [ "obj-214", 1 ], + "order" : 0, + "source" : [ "obj-194", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-86", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 152.00000399999999, 1128.0, 32.5, 23.0 ], - "text" : "*" - } + } +, { + "patchline" : { + "destination" : [ "obj-201", 0 ], + "order" : 1, + "source" : [ "obj-195", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-74", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 872.0, 316.0, 45.0, 23.0 ], - "text" : "+" - } + } +, { + "patchline" : { + "destination" : [ "obj-214", 2 ], + "order" : 0, + "source" : [ "obj-195", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-72", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 872.0, 286.0, 43.0, 23.0 ], - "text" : "* 0.75" - } + } +, { + "patchline" : { + "destination" : [ "obj-203", 0 ], + "order" : 1, + "source" : [ "obj-196", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-67", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 872.0, 256.000014999999962, 32.5, 23.0 ], - "text" : "-" - } + } +, { + "patchline" : { + "destination" : [ "obj-214", 3 ], + "order" : 0, + "source" : [ "obj-196", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-64", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 887.0, 226.000014999999962, 43.0, 23.0 ], - "text" : "* 0.75" - } + } +, { + "patchline" : { + "destination" : [ "obj-205", 0 ], + "order" : 0, + "source" : [ "obj-197", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-63", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 917.0, 196.000014999999962, 71.0, 23.0 ], - "text" : "delay 6000" - } + } +, { + "patchline" : { + "destination" : [ "obj-214", 4 ], + "order" : 1, + "source" : [ "obj-197", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-62", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 969.0, 168.0, 70.0, 23.0 ], - "text" : "* 0.110732" - } + } +, { + "patchline" : { + "destination" : [ "obj-199", 1 ], + "source" : [ "obj-198", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-52", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 700.000035000000025, 1068.0, 32.0, 23.0 ], - "text" : "2.31" - } + } +, { + "patchline" : { + "destination" : [ "obj-248", 1 ], + "order" : 1, + "source" : [ "obj-199", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-45", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 92.0, 451.0, 113.0, 23.0 ], - "text" : "expr -pow(in2\\,in1)" - } + } +, { + "patchline" : { + "destination" : [ "obj-75", 1 ], + "midpoints" : [ 881.5, 816.25, 136.749986499999977, 816.25 ], + "order" : 0, + "source" : [ "obj-199", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-44", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 77.00000399999999, 481.0, 32.5, 23.0 ], - "text" : "*" - } + } +, { + "patchline" : { + "destination" : [ "obj-11", 0 ], + "source" : [ "obj-2", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-42", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 587.0, 361.0, 63.0, 23.0 ], - "text" : "* 0.63245" - } + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-20", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-43", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 437.0, 361.0, 57.0, 23.0 ], - "text" : "* 0.7071" - } + } +, { + "patchline" : { + "destination" : [ "obj-247", 1 ], + "order" : 1, + "source" : [ "obj-200", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-78", 1 ], + "midpoints" : [ 1031.5, 801.25, 681.249982499999987, 801.25 ], + "order" : 0, + "source" : [ "obj-200", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-41", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 287.0, 361.0, 63.0, 23.0 ], - "text" : "* 0.81649" - } + } +, { + "patchline" : { + "destination" : [ "obj-200", 1 ], + "source" : [ "obj-201", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-40", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 137.0, 361.0, 26.0, 23.0 ], - "text" : "* 1" - } + } +, { + "patchline" : { + "destination" : [ "obj-246", 1 ], + "order" : 0, + "source" : [ "obj-202", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-33", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 122.0, 511.0, 60.0, 35.0 ], - "text" : "FDN dampers" - } + } +, { + "patchline" : { + "destination" : [ "obj-75", 1 ], + "midpoints" : [ 1181.5, 816.25, 136.749986499999977, 816.25 ], + "order" : 1, + "source" : [ "obj-202", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-30", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 77.00000399999999, 418.0, 78.0, 23.0 ], - "text" : "delay 48000" - } + } +, { + "patchline" : { + "destination" : [ "obj-202", 1 ], + "source" : [ "obj-203", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-28", - "linecount" : 3, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 62.0, 346.0, 75.0, 50.0 ], - "text" : "Feeedback delay network" - } + } +, { + "patchline" : { + "destination" : [ "obj-245", 1 ], + "order" : 1, + "source" : [ "obj-204", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-11", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 677.5, 115.99999200000002, 74.0, 23.0 ], - "text" : "* samplerate" - } + } +, { + "patchline" : { + "destination" : [ "obj-78", 1 ], + "midpoints" : [ 1331.5, 801.25, 681.249982499999987, 801.25 ], + "order" : 0, + "source" : [ "obj-204", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-5", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 354.25, 192.0, 235.0, 23.0 ], - "text" : "param ctrl4_damping -0.7 @min -1 @max 1" - } + } +, { + "patchline" : { + "destination" : [ "obj-204", 1 ], + "source" : [ "obj-205", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-4", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 1212.0, 198.0, 259.0, 23.0 ], - "text" : "param ctrl3_len_seconds 11 @min 0.1 @max 24" - } + } +, { + "patchline" : { + "destination" : [ "obj-61", 0 ], + "source" : [ "obj-21", 0 ] + } - } -, { - "box" : { - "fontname" : "Lato", - "fontsize" : 12.0, - "id" : "obj-3", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 677.5, 19.0, 239.0, 23.0 ], - "text" : "param ctrl2_roomsize 0.5 @min 0.1 @max 1" - } + } +, { + "patchline" : { + "destination" : [ "obj-199", 0 ], + "source" : [ "obj-214", 0 ] + } - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-98", 0 ], - "source" : [ "obj-100", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-200", 0 ], + "source" : [ "obj-214", 1 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-100", 0 ], - "order" : 1, - "source" : [ "obj-102", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-202", 0 ], + "source" : [ "obj-214", 2 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-106", 0 ], - "order" : 0, - "source" : [ "obj-102", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-204", 0 ], + "source" : [ "obj-214", 3 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-102", 1 ], - "source" : [ "obj-105", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-22", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-105", 0 ], - "order" : 1, - "source" : [ "obj-106", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-225", 1 ], + "source" : [ "obj-224", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-98", 1 ], - "order" : 0, - "source" : [ "obj-106", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-83", 0 ], + "source" : [ "obj-225", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-106", 1 ], - "source" : [ "obj-107", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-225", 0 ], + "source" : [ "obj-229", 0 ] + } - } -, { - "patchline" : { - "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], - "destination" : [ "obj-191", 0 ], - "midpoints" : [ 687.0, 355.5, 1196.5, 355.5 ], - "order" : 1, - "source" : [ "obj-11", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "source" : [ "obj-23", 0 ] + } - } -, { - "patchline" : { - "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], - "destination" : [ "obj-192", 0 ], - "midpoints" : [ 687.0, 355.5, 1046.5, 355.5 ], - "order" : 2, - "source" : [ "obj-11", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-232", 1 ], + "source" : [ "obj-231", 0 ] + } - } -, { - "patchline" : { - "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], - "destination" : [ "obj-193", 0 ], - "midpoints" : [ 687.0, 355.5, 896.5, 355.5 ], - "order" : 4, - "source" : [ "obj-11", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-80", 0 ], + "source" : [ "obj-232", 0 ] + } - } -, { - "patchline" : { - "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], - "destination" : [ "obj-197", 0 ], - "midpoints" : [ 687.0, 354.394897000000014, 1346.5, 354.394897000000014 ], - "order" : 0, - "source" : [ "obj-11", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-232", 0 ], + "source" : [ "obj-236", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-239", 1 ], + "source" : [ "obj-238", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-82", 0 ], + "source" : [ "obj-239", 0 ] + } - } -, { - "patchline" : { - "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], - "destination" : [ "obj-40", 0 ], - "midpoints" : [ 687.0, 353.166504000000032, 146.5, 353.166504000000032 ], - "order" : 8, - "source" : [ "obj-11", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-239", 0 ], + "source" : [ "obj-243", 0 ] + } - } -, { - "patchline" : { - "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], - "destination" : [ "obj-41", 0 ], - "midpoints" : [ 687.0, 353.166504000000032, 296.5, 353.166504000000032 ], - "order" : 7, - "source" : [ "obj-11", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-236", 0 ], + "midpoints" : [ 566.5, 803.0, 520.5, 803.0, 520.5, 411.0, 536.5, 411.0 ], + "source" : [ "obj-245", 0 ] + } - } -, { - "patchline" : { - "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], - "destination" : [ "obj-42", 0 ], - "midpoints" : [ 687.0, 354.630584999999996, 596.5, 354.630584999999996 ], - "order" : 5, - "source" : [ "obj-11", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-243", 0 ], + "midpoints" : [ 416.5, 804.0, 371.5, 804.0, 371.5, 411.0, 386.5, 411.0 ], + "source" : [ "obj-246", 0 ] + } - } -, { - "patchline" : { - "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], - "destination" : [ "obj-43", 0 ], - "midpoints" : [ 687.0, 351.702393000000029, 446.5, 351.702393000000029 ], - "order" : 6, - "source" : [ "obj-11", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-229", 0 ], + "midpoints" : [ 266.5, 805.0, 220.5, 805.0, 220.5, 411.0, 236.5, 411.0 ], + "source" : [ "obj-247", 0 ] + } - } -, { - "patchline" : { - "color" : [ 0.827451, 0.737255, 0.835294, 1.0 ], - "destination" : [ "obj-62", 0 ], - "midpoints" : [ 687.0, 160.679504000000009, 978.5, 160.679504000000009 ], - "order" : 3, - "source" : [ "obj-11", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-30", 0 ], + "midpoints" : [ 116.5, 804.0, 71.5, 804.0, 71.5, 411.0, 86.50000399999999, 411.0 ], + "source" : [ "obj-248", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "order" : 0, - "source" : [ "obj-112", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-259", 0 ], + "order" : 1, + "source" : [ "obj-256", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-19", 1 ], - "order" : 1, - "source" : [ "obj-112", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-263", 0 ], + "order" : 0, + "source" : [ "obj-256", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-112", 0 ], - "source" : [ "obj-114", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-261", 0 ], + "order" : 1, + "source" : [ "obj-257", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-114", 0 ], - "order" : 1, - "source" : [ "obj-116", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-262", 0 ], + "order" : 0, + "source" : [ "obj-257", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-120", 0 ], - "order" : 0, - "source" : [ "obj-116", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-259", 1 ], + "order" : 1, + "source" : [ "obj-258", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-116", 1 ], - "source" : [ "obj-119", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-263", 1 ], + "order" : 0, + "source" : [ "obj-258", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-112", 1 ], - "order" : 0, - "source" : [ "obj-120", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-286", 0 ], + "source" : [ "obj-259", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-119", 0 ], - "order" : 1, - "source" : [ "obj-120", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-75", 2 ], + "midpoints" : [ 785.5, 904.0, 186.999968999999965, 904.0 ], + "order" : 1, + "source" : [ "obj-26", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-120", 1 ], - "source" : [ "obj-121", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-78", 2 ], + "midpoints" : [ 785.5, 904.0, 731.499964999999975, 904.0 ], + "order" : 0, + "source" : [ "obj-26", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-125", 0 ], - "source" : [ "obj-124", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-261", 1 ], + "order" : 1, + "source" : [ "obj-260", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-129", 1 ], - "order" : 1, - "source" : [ "obj-125", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-262", 1 ], + "order" : 0, + "source" : [ "obj-260", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-131", 0 ], - "order" : 0, - "source" : [ "obj-125", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-287", 0 ], + "source" : [ "obj-261", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-129", 0 ], - "source" : [ "obj-127", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-288", 0 ], + "source" : [ "obj-262", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-107", 1 ], - "source" : [ "obj-129", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-289", 0 ], + "source" : [ "obj-263", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-121", 1 ], - "source" : [ "obj-131", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-248", 0 ], + "order" : 0, + "source" : [ "obj-286", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-13", 0 ], - "order" : 0, - "source" : [ "obj-134", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-75", 0 ], + "midpoints" : [ 86.50000399999999, 846.25, 86.50000399999999, 846.25 ], + "order" : 1, + "source" : [ "obj-286", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-21", 1 ], - "order" : 1, - "source" : [ "obj-134", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-247", 0 ], + "order" : 1, + "source" : [ "obj-287", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-134", 0 ], - "source" : [ "obj-136", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-78", 0 ], + "midpoints" : [ 236.5, 846.25, 631.0, 846.25 ], + "order" : 0, + "source" : [ "obj-287", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-136", 0 ], - "order" : 1, - "source" : [ "obj-137", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-246", 0 ], + "order" : 0, + "source" : [ "obj-288", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-141", 0 ], - "order" : 0, - "source" : [ "obj-137", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-75", 0 ], + "midpoints" : [ 386.5, 856.25, 86.50000399999999, 856.25 ], + "order" : 1, + "source" : [ "obj-288", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-137", 1 ], - "source" : [ "obj-140", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-245", 0 ], + "order" : 1, + "source" : [ "obj-289", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-134", 1 ], - "order" : 0, - "source" : [ "obj-141", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-78", 0 ], + "midpoints" : [ 536.5, 846.25, 631.0, 846.25 ], + "order" : 0, + "source" : [ "obj-289", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-140", 0 ], - "order" : 1, - "source" : [ "obj-141", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-124", 0 ], + "midpoints" : [ 870.500035000000025, 995.0, 281.500035000000025, 995.0 ], + "order" : 2, + "source" : [ "obj-29", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-141", 1 ], - "source" : [ "obj-142", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-177", 0 ], + "midpoints" : [ 870.500035000000025, 995.0, 960.500035000000025, 995.0 ], + "order" : 0, + "source" : [ "obj-29", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-137", 0 ], - "source" : [ "obj-144", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-179", 0 ], + "midpoints" : [ 870.500035000000025, 995.0, 870.500035000000025, 995.0 ], + "order" : 1, + "source" : [ "obj-29", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-144", 0 ], - "source" : [ "obj-146", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-88", 0 ], + "midpoints" : [ 870.500035000000025, 995.0, 176.50000399999999, 995.0 ], + "order" : 3, + "source" : [ "obj-29", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-146", 0 ], - "order" : 1, - "source" : [ "obj-147", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-59", 0 ], + "source" : [ "obj-298", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-151", 0 ], - "order" : 0, - "source" : [ "obj-147", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-3", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-298", 0 ], - "source" : [ "obj-15", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-44", 0 ], + "source" : [ "obj-30", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-147", 1 ], - "source" : [ "obj-150", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-19", 2 ], + "midpoints" : [ 1021.250066000000061, 1425.0, 412.000035000000025, 1425.0 ], + "order" : 1, + "source" : [ "obj-34", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-144", 1 ], - "order" : 0, - "source" : [ "obj-151", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-21", 2 ], + "midpoints" : [ 1021.250066000000061, 1426.0, 956.250066000000061, 1426.0 ], + "order" : 0, + "source" : [ "obj-34", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-150", 0 ], - "order" : 1, - "source" : [ "obj-151", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-53", 0 ], + "source" : [ "obj-4", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-151", 1 ], - "source" : [ "obj-152", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-30", 1 ], + "order" : 0, + "source" : [ "obj-40", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-147", 0 ], - "source" : [ "obj-154", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-45", 0 ], + "order" : 1, + "source" : [ "obj-40", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-154", 0 ], - "source" : [ "obj-156", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-224", 0 ], + "order" : 1, + "source" : [ "obj-41", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-156", 0 ], - "order" : 1, - "source" : [ "obj-157", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-229", 1 ], + "order" : 0, + "source" : [ "obj-41", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-161", 0 ], - "order" : 0, - "source" : [ "obj-157", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-231", 0 ], + "order" : 1, + "source" : [ "obj-42", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-298", 0 ], - "source" : [ "obj-16", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-236", 1 ], + "order" : 0, + "source" : [ "obj-42", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-157", 1 ], - "source" : [ "obj-160", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-238", 0 ], + "order" : 1, + "source" : [ "obj-43", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-154", 1 ], - "order" : 0, - "source" : [ "obj-161", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-243", 1 ], + "order" : 0, + "source" : [ "obj-43", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-160", 0 ], - "order" : 1, - "source" : [ "obj-161", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-87", 0 ], + "source" : [ "obj-44", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-161", 1 ], - "source" : [ "obj-162", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-44", 1 ], + "source" : [ "obj-45", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-142", 1 ], - "source" : [ "obj-173", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-55", 1 ], + "source" : [ "obj-48", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-152", 1 ], - "source" : [ "obj-174", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-5", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-174", 0 ], - "source" : [ "obj-175", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-48", 0 ], + "source" : [ "obj-50", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-173", 0 ], - "order" : 0, - "source" : [ "obj-176", 0 ] - } + } +, { + "patchline" : { + "color" : [ 0.67451, 0.819608, 0.572549, 1.0 ], + "destination" : [ "obj-107", 0 ], + "midpoints" : [ 709.500035000000025, 1107.5, 311.500035000000025, 1107.5 ], + "order" : 4, + "source" : [ "obj-52", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-174", 1 ], - "order" : 1, - "source" : [ "obj-176", 0 ] - } + } +, { + "patchline" : { + "color" : [ 0.67451, 0.819608, 0.572549, 1.0 ], + "destination" : [ "obj-121", 0 ], + "midpoints" : [ 709.500035000000025, 1107.5, 461.500095999999985, 1107.5 ], + "order" : 3, + "source" : [ "obj-52", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-176", 0 ], - "source" : [ "obj-177", 0 ] - } + } +, { + "patchline" : { + "color" : [ 0.67451, 0.819608, 0.572549, 1.0 ], + "destination" : [ "obj-142", 0 ], + "midpoints" : [ 709.500035000000025, 1107.5, 1005.500095999999985, 1107.5 ], + "order" : 0, + "source" : [ "obj-52", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-162", 1 ], - "source" : [ "obj-178", 0 ] - } + } +, { + "patchline" : { + "color" : [ 0.67451, 0.819608, 0.572549, 1.0 ], + "destination" : [ "obj-152", 0 ], + "midpoints" : [ 709.500035000000025, 1107.5, 855.500035000000025, 1107.5 ], + "order" : 1, + "source" : [ "obj-52", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-175", 0 ], - "order" : 0, - "source" : [ "obj-179", 0 ] - } + } +, { + "patchline" : { + "color" : [ 0.67451, 0.819608, 0.572549, 1.0 ], + "destination" : [ "obj-162", 0 ], + "midpoints" : [ 709.500035000000025, 1107.5, 705.500035000000025, 1107.5 ], + "order" : 2, + "source" : [ "obj-52", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-178", 0 ], - "order" : 1, - "source" : [ "obj-179", 0 ] - } + } +, { + "patchline" : { + "color" : [ 0.67451, 0.819608, 0.572549, 1.0 ], + "destination" : [ "obj-86", 0 ], + "midpoints" : [ 709.500035000000025, 1107.5, 161.50000399999999, 1107.5 ], + "order" : 5, + "source" : [ "obj-52", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-60", 0 ], - "source" : [ "obj-19", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-50", 0 ], + "source" : [ "obj-53", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-196", 0 ], - "source" : [ "obj-191", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-55", 0 ], + "order" : 0, + "source" : [ "obj-54", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-195", 0 ], - "source" : [ "obj-192", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-58", 0 ], + "order" : 1, + "source" : [ "obj-54", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-194", 0 ], - "source" : [ "obj-193", 0 ] - } + } +, { + "patchline" : { + "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], + "destination" : [ "obj-198", 1 ], + "midpoints" : [ 1206.75, 445.869415000000004, 986.5, 445.869415000000004 ], + "order" : 3, + "source" : [ "obj-55", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-198", 0 ], - "order" : 1, - "source" : [ "obj-194", 0 ] - } + } +, { + "patchline" : { + "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], + "destination" : [ "obj-201", 1 ], + "midpoints" : [ 1206.75, 445.869415000000004, 1136.5, 445.869415000000004 ], + "order" : 2, + "source" : [ "obj-55", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-214", 1 ], - "order" : 0, - "source" : [ "obj-194", 0 ] - } + } +, { + "patchline" : { + "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], + "destination" : [ "obj-203", 1 ], + "midpoints" : [ 1206.75, 447.333495999999968, 1286.5, 447.333495999999968 ], + "order" : 1, + "source" : [ "obj-55", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-201", 0 ], - "order" : 1, - "source" : [ "obj-195", 0 ] - } + } +, { + "patchline" : { + "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], + "destination" : [ "obj-205", 1 ], + "midpoints" : [ 1206.75, 444.405304000000001, 1436.5, 444.405304000000001 ], + "order" : 0, + "source" : [ "obj-55", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-214", 2 ], - "order" : 0, - "source" : [ "obj-195", 0 ] - } + } +, { + "patchline" : { + "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], + "destination" : [ "obj-224", 1 ], + "midpoints" : [ 1206.75, 445.0, 345.5, 445.0 ], + "order" : 6, + "source" : [ "obj-55", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-203", 0 ], - "order" : 1, - "source" : [ "obj-196", 0 ] - } + } +, { + "patchline" : { + "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], + "destination" : [ "obj-231", 1 ], + "midpoints" : [ 1206.75, 445.0, 645.5, 445.0 ], + "order" : 4, + "source" : [ "obj-55", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-214", 3 ], - "order" : 0, - "source" : [ "obj-196", 0 ] - } + } +, { + "patchline" : { + "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], + "destination" : [ "obj-238", 1 ], + "midpoints" : [ 1206.75, 445.0, 495.5, 445.0 ], + "order" : 5, + "source" : [ "obj-55", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-205", 0 ], - "order" : 0, - "source" : [ "obj-197", 0 ] - } + } +, { + "patchline" : { + "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], + "destination" : [ "obj-45", 1 ], + "midpoints" : [ 1206.75, 445.0, 195.5, 445.0 ], + "order" : 7, + "source" : [ "obj-55", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-214", 4 ], - "order" : 1, - "source" : [ "obj-197", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-59", 1 ], + "source" : [ "obj-56", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-199", 1 ], - "source" : [ "obj-198", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-56", 0 ], + "source" : [ "obj-58", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-248", 1 ], - "order" : 1, - "source" : [ "obj-199", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-67", 0 ], + "source" : [ "obj-59", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-75", 1 ], - "midpoints" : [ 881.5, 816.25, 136.749986499999977, 816.25 ], - "order" : 0, - "source" : [ "obj-199", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-63", 1 ], + "source" : [ "obj-62", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-11", 0 ], - "source" : [ "obj-2", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-64", 0 ], + "order" : 1, + "source" : [ "obj-63", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-19", 0 ], - "source" : [ "obj-20", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-74", 1 ], + "order" : 0, + "source" : [ "obj-63", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-247", 1 ], - "order" : 1, - "source" : [ "obj-200", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-67", 1 ], + "source" : [ "obj-64", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-78", 1 ], - "midpoints" : [ 1031.5, 801.25, 681.249982499999987, 801.25 ], - "order" : 0, - "source" : [ "obj-200", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-26", 0 ], + "source" : [ "obj-66", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-200", 1 ], - "source" : [ "obj-201", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-63", 0 ], + "order" : 0, + "source" : [ "obj-67", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-246", 1 ], - "order" : 0, - "source" : [ "obj-202", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-72", 0 ], + "order" : 1, + "source" : [ "obj-67", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-75", 1 ], - "midpoints" : [ 1181.5, 816.25, 136.749986499999977, 816.25 ], - "order" : 1, - "source" : [ "obj-202", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-74", 0 ], + "source" : [ "obj-72", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-202", 1 ], - "source" : [ "obj-203", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-214", 0 ], + "source" : [ "obj-74", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-245", 1 ], - "order" : 1, - "source" : [ "obj-204", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-81", 0 ], + "source" : [ "obj-75", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-78", 1 ], - "midpoints" : [ 1331.5, 801.25, 681.249982499999987, 801.25 ], - "order" : 0, - "source" : [ "obj-204", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-102", 0 ], + "source" : [ "obj-77", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-204", 1 ], - "source" : [ "obj-205", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-157", 0 ], + "source" : [ "obj-78", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-61", 0 ], - "source" : [ "obj-21", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-77", 0 ], + "source" : [ "obj-79", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-8", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-199", 0 ], - "source" : [ "obj-214", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-258", 1 ], + "order" : 1, + "source" : [ "obj-80", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-200", 0 ], - "source" : [ "obj-214", 1 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-260", 1 ], + "order" : 0, + "source" : [ "obj-80", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-202", 0 ], - "source" : [ "obj-214", 2 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-79", 0 ], + "order" : 1, + "source" : [ "obj-81", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-204", 0 ], - "source" : [ "obj-214", 3 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-85", 0 ], + "order" : 0, + "source" : [ "obj-81", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-21", 0 ], - "source" : [ "obj-22", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-258", 0 ], + "order" : 1, + "source" : [ "obj-82", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-225", 1 ], - "source" : [ "obj-224", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-260", 0 ], + "order" : 0, + "source" : [ "obj-82", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-83", 0 ], - "source" : [ "obj-225", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-256", 1 ], + "order" : 1, + "source" : [ "obj-83", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-225", 0 ], - "source" : [ "obj-229", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-257", 1 ], + "order" : 0, + "source" : [ "obj-83", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-34", 0 ], - "source" : [ "obj-23", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-81", 1 ], + "source" : [ "obj-84", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-232", 1 ], - "source" : [ "obj-231", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-77", 1 ], + "order" : 0, + "source" : [ "obj-85", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-80", 0 ], - "source" : [ "obj-232", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-84", 0 ], + "order" : 1, + "source" : [ "obj-85", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-232", 0 ], - "source" : [ "obj-236", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-85", 1 ], + "source" : [ "obj-86", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-239", 1 ], - "source" : [ "obj-238", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-256", 0 ], + "order" : 1, + "source" : [ "obj-87", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-82", 0 ], - "source" : [ "obj-239", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-257", 0 ], + "order" : 0, + "source" : [ "obj-87", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-239", 0 ], - "source" : [ "obj-243", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-127", 0 ], + "order" : 0, + "source" : [ "obj-88", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-236", 0 ], - "midpoints" : [ 566.5, 803.0, 520.5, 803.0, 520.5, 411.0, 536.5, 411.0 ], - "source" : [ "obj-245", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-95", 0 ], + "order" : 1, + "source" : [ "obj-88", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-243", 0 ], - "midpoints" : [ 416.5, 804.0, 371.5, 804.0, 371.5, 411.0, 386.5, 411.0 ], - "source" : [ "obj-246", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-80", 1 ], + "midpoints" : [ 363.75, 550.0, 595.5, 550.0 ], + "order" : 0, + "source" : [ "obj-9", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-229", 0 ], - "midpoints" : [ 266.5, 805.0, 220.5, 805.0, 220.5, 411.0, 236.5, 411.0 ], - "source" : [ "obj-247", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-82", 1 ], + "midpoints" : [ 363.75, 550.0, 445.5, 550.0 ], + "order" : 1, + "source" : [ "obj-9", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-30", 0 ], - "midpoints" : [ 116.5, 804.0, 71.5, 804.0, 71.5, 411.0, 86.50000399999999, 411.0 ], - "source" : [ "obj-248", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-83", 1 ], + "midpoints" : [ 363.75, 550.0, 295.5, 550.0 ], + "order" : 2, + "source" : [ "obj-9", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-259", 0 ], - "order" : 1, - "source" : [ "obj-256", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-87", 1 ], + "midpoints" : [ 363.75, 549.0, 145.50000399999999, 549.0 ], + "order" : 3, + "source" : [ "obj-9", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-263", 0 ], - "order" : 0, - "source" : [ "obj-256", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-86", 1 ], + "source" : [ "obj-95", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-261", 0 ], - "order" : 1, - "source" : [ "obj-257", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-116", 0 ], + "source" : [ "obj-98", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-262", 0 ], - "order" : 0, - "source" : [ "obj-257", 0 ] - } + } + ] + } +, + "patching_rect" : [ 24.0, 284.0, 139.0, 29.0 ], + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", + "exportname" : "giga" + } +, + "text" : "gen~ @title giga", + "varname" : "giga" + } - } -, { - "patchline" : { - "destination" : [ "obj-259", 1 ], - "order" : 1, - "source" : [ "obj-258", 0 ] - } + } +, { + "box" : { + "automatic" : 1, + "id" : "obj-10", + "maxclass" : "scope~", + "numinlets" : 2, + "numoutlets" : 0, + "patching_rect" : [ 76.0, 324.0, 170.0, 137.072072072072046 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-263", 1 ], - "order" : 0, - "source" : [ "obj-258", 0 ] - } + } +, { + "box" : { + "attr" : "ctrl1_wet", + "id" : "obj-14", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 254.0, 158.0, 150.0, 22.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-286", 0 ], - "source" : [ "obj-259", 0 ] - } + } +, { + "box" : { + "attr" : "ctrl2_roomsize", + "id" : "obj-15", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 254.0, 181.044585987261144, 150.0, 22.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-75", 2 ], - "midpoints" : [ 785.5, 904.0, 186.999968999999965, 904.0 ], - "order" : 1, - "source" : [ "obj-26", 0 ] - } + } +, { + "box" : { + "attr" : "ctrl3_len_seconds", + "id" : "obj-21", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 254.0, 204.089171974522287, 150.0, 22.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-78", 2 ], - "midpoints" : [ 785.5, 904.0, 731.499964999999975, 904.0 ], - "order" : 0, - "source" : [ "obj-26", 0 ] - } + } +, { + "box" : { + "attr" : "early_late", + "id" : "obj-17", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 254.0, 273.222929936305718, 150.0, 22.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-261", 1 ], - "order" : 1, - "source" : [ "obj-260", 0 ] - } + } +, { + "box" : { + "attr" : "gate1_freeze", + "displaymode" : 8, + "id" : "obj-23", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 254.0, 250.178343949044574, 150.0, 22.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-262", 1 ], - "order" : 0, - "source" : [ "obj-260", 0 ] - } + } +, { + "box" : { + "automatic" : 1, + "id" : "obj-24", + "maxclass" : "scope~", + "numinlets" : 2, + "numoutlets" : 0, + "patching_rect" : [ 438.0, 325.0, 176.0, 147.438596491228054 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-287", 0 ], - "source" : [ "obj-261", 0 ] - } + } +, { + "box" : { + "fontsize" : 18.0, + "id" : "obj-25", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "signal", "signal" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 75.0, 160.0, 658.0, 425.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 191.0, 380.0, 35.0, 22.0 ], + "text" : "out 2" + } - } -, { - "patchline" : { - "destination" : [ "obj-288", 0 ], - "source" : [ "obj-262", 0 ] - } + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 191.0, 347.5, 29.5, 22.0 ], + "text" : "*" + } - } -, { - "patchline" : { - "destination" : [ "obj-289", 0 ], - "source" : [ "obj-263", 0 ] - } + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 14.0, 347.5, 29.5, 22.0 ], + "text" : "*" + } - } -, { - "patchline" : { - "destination" : [ "obj-248", 0 ], - "order" : 0, - "source" : [ "obj-286", 0 ] - } + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 49.5, 309.0, 108.0, 22.0 ], + "text" : "oopsy.ctrl.smooth3" + } - } -, { - "patchline" : { - "destination" : [ "obj-75", 0 ], - "midpoints" : [ 86.50000399999999, 846.25, 86.50000399999999, 846.25 ], - "order" : 1, - "source" : [ "obj-286", 0 ] - } + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 49.5, 280.5, 203.0, 22.0 ], + "text" : "param cv4_vca 0.5 @min 0 @max 1" + } - } -, { - "patchline" : { - "destination" : [ "obj-247", 0 ], - "order" : 1, - "source" : [ "obj-287", 0 ] - } + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 212.0, 60.0, 108.0, 22.0 ], + "text" : "oopsy.ctrl.smooth3" + } - } -, { - "patchline" : { - "destination" : [ "obj-78", 0 ], - "midpoints" : [ 236.5, 846.25, 631.0, 846.25 ], - "order" : 0, - "source" : [ "obj-287", 0 ] - } + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 425.5, 60.0, 108.0, 22.0 ], + "text" : "oopsy.ctrl.smooth3" + } - } -, { - "patchline" : { - "destination" : [ "obj-246", 0 ], - "order" : 0, - "source" : [ "obj-288", 0 ] - } + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 14.0, 60.0, 74.0, 22.0 ], + "text" : "oopsy.cv2hz" + } - } -, { - "patchline" : { - "destination" : [ "obj-75", 0 ], - "midpoints" : [ 386.5, 856.25, 86.50000399999999, 856.25 ], - "order" : 1, - "source" : [ "obj-288", 0 ] - } + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 14.0, 31.5, 190.0, 22.0 ], + "text" : "param cv1_pitch @min 0 @max 5" + } - } -, { - "patchline" : { - "destination" : [ "obj-245", 0 ], - "order" : 1, - "source" : [ "obj-289", 0 ] - } + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 14.0, 103.5, 45.0, 22.0 ], + "text" : "phasor" + } - } -, { - "patchline" : { - "destination" : [ "obj-78", 0 ], - "midpoints" : [ 536.5, 846.25, 631.0, 846.25 ], - "order" : 0, - "source" : [ "obj-289", 0 ] - } + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 425.5, 31.5, 196.0, 22.0 ], + "text" : "param cv3_skew @min -1 @max 1" + } - } -, { - "patchline" : { - "destination" : [ "obj-124", 0 ], - "midpoints" : [ 870.500035000000025, 995.0, 281.500035000000025, 995.0 ], - "order" : 2, - "source" : [ "obj-29", 0 ] + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 212.0, 31.5, 201.0, 22.0 ], + "text" : "param cv2_square @min 0 @max 1" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 134.0, 153.0, 1227.0, 863.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 213.0, 194.499999642372131, 35.0, 22.0 ], + "text" : "out 2" } } , { - "patchline" : { - "destination" : [ "obj-177", 0 ], - "midpoints" : [ 870.500035000000025, 995.0, 960.500035000000025, 995.0 ], - "order" : 0, - "source" : [ "obj-29", 0 ] + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 213.0, 132.833332538604736, 45.0, 22.0 ], + "text" : "* twopi" } } , { - "patchline" : { - "destination" : [ "obj-179", 0 ], - "midpoints" : [ 870.500035000000025, 995.0, 870.500035000000025, 995.0 ], - "order" : 1, - "source" : [ "obj-29", 0 ] + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 213.0, 159.833332538604736, 24.0, 22.0 ], + "text" : "sin" } } , { - "patchline" : { - "destination" : [ "obj-88", 0 ], - "midpoints" : [ 870.500035000000025, 995.0, 176.50000399999999, 995.0 ], - "order" : 3, - "source" : [ "obj-29", 0 ] + "box" : { + "id" : "obj-5", + "linecount" : 5, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 587.499988436698914, 23.5, 568.000011563301086, 74.0 ], + "text" : "// Rewritten and rewritten re-implementation of the CSound squinewave by Rasmus Ekman\n// https://csound.com/docs/manual/squinewave.html\n// first re-implemented in gen~ by Volker Bohm\n// https://cycling74.com/forums/ann-squinewave-bandlimited-oscil-with-morphing-waveform-and-hardsync\n// This version by graham wakefield 2020" } } , { - "patchline" : { - "destination" : [ "obj-59", 0 ], - "source" : [ "obj-298", 0 ] + "box" : { + "id" : "obj-82", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 409.0, 926.999999642372131, 99.0, 47.0 ], + "text" : "switch between two segments at transition point" } } , { - "patchline" : { - "destination" : [ "obj-8", 0 ], - "source" : [ "obj-3", 0 ] + "box" : { + "id" : "obj-81", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 213.333333194255829, 991.999999642372131, 79.0, 47.0 ], + "text" : "apply cosine shape to the ramps" } } , { - "patchline" : { - "destination" : [ "obj-44", 0 ], - "source" : [ "obj-30", 0 ] + "box" : { + "id" : "obj-80", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 180.0, 948.999999642372131, 227.0, 22.0 ], + "text" : "?" } } , { - "patchline" : { - "destination" : [ "obj-19", 2 ], - "midpoints" : [ 1021.250066000000061, 1425.0, 412.000035000000025, 1425.0 ], - "order" : 1, - "source" : [ "obj-34", 0 ] + "box" : { + "id" : "obj-79", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 180.0, 920.999999642372131, 45.0, 22.0 ], + "text" : "<=" } } , { - "patchline" : { - "destination" : [ "obj-21", 2 ], - "midpoints" : [ 1021.250066000000061, 1426.0, 956.250066000000061, 1426.0 ], - "order" : 0, - "source" : [ "obj-34", 0 ] + "box" : { + "id" : "obj-78", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 447.5, 893.0, 174.0, 20.0 ], + "text" : "falling shape" } } , { - "patchline" : { - "destination" : [ "obj-53", 0 ], - "source" : [ "obj-4", 0 ] + "box" : { + "id" : "obj-77", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 388.0, 893.0, 56.0, 22.0 ], + "text" : "!- 1" } } , { - "patchline" : { - "destination" : [ "obj-30", 1 ], - "order" : 0, - "source" : [ "obj-40", 0 ] + "box" : { + "id" : "obj-76", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 447.5, 865.0, 185.0, 20.0 ], + "text" : "and clamp for square section of it" } } , { - "patchline" : { - "destination" : [ "obj-45", 0 ], - "order" : 1, - "source" : [ "obj-40", 0 ] + "box" : { + "id" : "obj-75", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 388.0, 865.0, 61.0, 22.0 ], + "text" : "clamp 0 1" } } , { - "patchline" : { - "destination" : [ "obj-224", 0 ], - "order" : 1, - "source" : [ "obj-41", 0 ] + "box" : { + "id" : "obj-74", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 284.0, 865.0, 61.0, 22.0 ], + "text" : "clamp 0 1" } } , { - "patchline" : { - "destination" : [ "obj-229", 1 ], - "order" : 0, - "source" : [ "obj-41", 0 ] + "box" : { + "id" : "obj-73", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 447.5, 838.0, 174.0, 20.0 ], + "text" : "spread phase over ramp width" } } , { - "patchline" : { - "destination" : [ "obj-231", 0 ], - "order" : 1, - "source" : [ "obj-42", 0 ] + "box" : { + "id" : "obj-72", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 436.0, 786.0, 178.0, 33.0 ], + "text" : "shift phasor to commence at transition point for 2nd segment" } } , { - "patchline" : { - "destination" : [ "obj-236", 1 ], - "order" : 0, - "source" : [ "obj-42", 0 ] + "box" : { + "id" : "obj-70", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 388.0, 796.0, 45.5, 22.0 ], + "text" : "-" } } , { - "patchline" : { - "destination" : [ "obj-238", 0 ], - "order" : 1, - "source" : [ "obj-43", 0 ] + "box" : { + "id" : "obj-69", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 388.0, 838.0, 32.0, 22.0 ], + "text" : "/" } } , { - "patchline" : { - "destination" : [ "obj-243", 1 ], - "order" : 0, - "source" : [ "obj-43", 0 ] + "box" : { + "id" : "obj-68", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 284.0, 838.0, 32.0, 22.0 ], + "text" : "/" } } , { - "patchline" : { - "destination" : [ "obj-87", 0 ], - "source" : [ "obj-44", 0 ] + "box" : { + "id" : "obj-67", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 238.0, 706.0, 26.0, 22.0 ], + "text" : "!- 1" } } , { - "patchline" : { - "destination" : [ "obj-44", 1 ], - "source" : [ "obj-45", 0 ] + "box" : { + "id" : "obj-66", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 206.0, 738.0, 51.0, 22.0 ], + "text" : "clamp" } } , { - "patchline" : { - "destination" : [ "obj-55", 1 ], - "source" : [ "obj-48", 0 ] + "box" : { + "id" : "obj-65", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 419.0, 716.0, 191.0, 47.0 ], + "text" : "derive the *actual* (limited) midpoint-phase between the two segments" } } , { - "patchline" : { - "destination" : [ "obj-9", 0 ], - "source" : [ "obj-5", 0 ] + "box" : { + "id" : "obj-63", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 458.0, 633.0, 175.0, 47.0 ], + "text" : "clamp the rising & falling segment widths according to the min frequency-limited width" } } , { - "patchline" : { - "destination" : [ "obj-48", 0 ], - "source" : [ "obj-50", 0 ] + "box" : { + "id" : "obj-59", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 401.0, 655.0, 51.0, 22.0 ], + "text" : "clamp" } } , { - "patchline" : { - "color" : [ 0.67451, 0.819608, 0.572549, 1.0 ], - "destination" : [ "obj-107", 0 ], - "midpoints" : [ 709.500035000000025, 1107.5, 311.500035000000025, 1107.5 ], - "order" : 4, - "source" : [ "obj-52", 0 ] + "box" : { + "id" : "obj-58", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 297.0, 655.0, 51.0, 22.0 ], + "text" : "clamp" } } , { - "patchline" : { - "color" : [ 0.67451, 0.819608, 0.572549, 1.0 ], - "destination" : [ "obj-121", 0 ], - "midpoints" : [ 709.500035000000025, 1107.5, 461.500095999999985, 1107.5 ], - "order" : 3, - "source" : [ "obj-52", 0 ] + "box" : { + "id" : "obj-57", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 329.0, 619.0, 26.0, 22.0 ], + "text" : "!- 1" } } , { - "patchline" : { - "color" : [ 0.67451, 0.819608, 0.572549, 1.0 ], - "destination" : [ "obj-142", 0 ], - "midpoints" : [ 709.500035000000025, 1107.5, 1005.500095999999985, 1107.5 ], - "order" : 0, - "source" : [ "obj-52", 0 ] + "box" : { + "id" : "obj-55", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 390.0, 393.166666388511658, 672.0, 60.0 ], + "text" : "very high frequencies would require very fast ramps, which can alias even when cosine-smoothed. to avoid this, we limit the maximum slope of any segment. this implies limiting the duration (pulse width) of any ramp segment. that is, overly-sharp transitions will be stretched back out. as we approach the limit, the waveform will become sinusoidal regardless the skew/squareness" } } , { - "patchline" : { - "color" : [ 0.67451, 0.819608, 0.572549, 1.0 ], - "destination" : [ "obj-152", 0 ], - "midpoints" : [ 709.500035000000025, 1107.5, 855.500035000000025, 1107.5 ], - "order" : 1, - "source" : [ "obj-52", 0 ] + "box" : { + "id" : "obj-52", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 313.0, 400.166666388511658, 71.0, 22.0 ], + "text" : "clamp 0 0.5" } } , { - "patchline" : { - "color" : [ 0.67451, 0.819608, 0.572549, 1.0 ], - "destination" : [ "obj-162", 0 ], - "midpoints" : [ 709.500035000000025, 1107.5, 705.500035000000025, 1107.5 ], - "order" : 2, - "source" : [ "obj-52", 0 ] + "box" : { + "id" : "obj-51", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 313.0, 372.166666388511658, 33.0, 22.0 ], + "text" : "* 0.5" } } , { - "patchline" : { - "color" : [ 0.67451, 0.819608, 0.572549, 1.0 ], - "destination" : [ "obj-86", 0 ], - "midpoints" : [ 709.500035000000025, 1107.5, 161.50000399999999, 1107.5 ], - "order" : 5, - "source" : [ "obj-52", 0 ] + "box" : { + "id" : "obj-50", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 313.0, 344.166666388511658, 93.0, 22.0 ], + "text" : "* 20/samplerate" } } , { - "patchline" : { - "destination" : [ "obj-50", 0 ], - "source" : [ "obj-53", 0 ] + "box" : { + "id" : "obj-49", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 382.0, 265.833332538604736, 61.0, 22.0 ], + "text" : "mix 0.999" } } , { - "patchline" : { - "destination" : [ "obj-55", 0 ], - "order" : 0, - "source" : [ "obj-54", 0 ] + "box" : { + "id" : "obj-48", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 313.0, 295.833332538604736, 88.0, 22.0 ], + "text" : "?" } } , { - "patchline" : { - "destination" : [ "obj-58", 0 ], - "order" : 1, - "source" : [ "obj-54", 0 ] + "box" : { + "id" : "obj-47", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 424.0, 231.833332538604736, 44.0, 22.0 ], + "text" : "history" } } , { - "patchline" : { - "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], - "destination" : [ "obj-198", 1 ], - "midpoints" : [ 1206.75, 445.869415000000004, 986.5, 445.869415000000004 ], - "order" : 3, - "source" : [ "obj-55", 0 ] + "box" : { + "id" : "obj-46", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 313.0, 265.833332538604736, 29.5, 22.0 ], + "text" : ">" } } , { - "patchline" : { - "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], - "destination" : [ "obj-201", 1 ], - "midpoints" : [ 1206.75, 445.869415000000004, 1136.5, 445.869415000000004 ], - "order" : 2, - "source" : [ "obj-55", 0 ] + "box" : { + "id" : "obj-45", + "linecount" : 7, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 486.0, 231.833332538604736, 234.0, 100.0 ], + "text" : "in reality, frequency may be modulating, so we put a little smoothing here. in particular, aliasing can happen if we underestimate frequency, so we allow it to rise immediately but fall slowly. this will handle even quite sudden changes of frequency, including changes of direction" } } , { - "patchline" : { - "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], - "destination" : [ "obj-203", 1 ], - "midpoints" : [ 1206.75, 447.333495999999968, 1286.5, 447.333495999999968 ], - "order" : 1, - "source" : [ "obj-55", 0 ] + "box" : { + "id" : "obj-43", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 390.0, 172.499999642372131, 119.0, 47.0 ], + "text" : "infer absolute instantaneous frequency from delta" } } , { - "patchline" : { - "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], - "destination" : [ "obj-205", 1 ], - "midpoints" : [ 1206.75, 444.405304000000001, 1436.5, 444.405304000000001 ], - "order" : 0, - "source" : [ "obj-55", 0 ] + "box" : { + "id" : "obj-42", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 313.0, 194.499999642372131, 28.0, 22.0 ], + "text" : "abs" } } , { - "patchline" : { - "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], - "destination" : [ "obj-224", 1 ], - "midpoints" : [ 1206.75, 445.0, 345.5, 445.0 ], - "order" : 6, - "source" : [ "obj-55", 0 ] + "box" : { + "id" : "obj-41", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 313.0, 172.499999642372131, 76.0, 22.0 ], + "text" : "* samplerate" } } , { - "patchline" : { - "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], - "destination" : [ "obj-231", 1 ], - "midpoints" : [ 1206.75, 445.0, 645.5, 445.0 ], - "order" : 4, - "source" : [ "obj-55", 0 ] + "box" : { + "id" : "obj-40", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 390.0, 102.16666579246521, 151.0, 60.0 ], + "text" : "wrap this delta, so that we get the same slope value even when input phase wraps from 1->0 (or 0->1) " } } , { - "patchline" : { - "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], - "destination" : [ "obj-238", 1 ], - "midpoints" : [ 1206.75, 445.0, 495.5, 445.0 ], - "order" : 5, - "source" : [ "obj-55", 0 ] + "box" : { + "id" : "obj-38", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 351.0, 64.5, 178.0, 33.0 ], + "text" : "phase change frame-to-frame (ramp slope per frame)" } } , { - "patchline" : { - "color" : [ 0.917647, 0.937255, 0.670588, 1.0 ], - "destination" : [ "obj-45", 1 ], - "midpoints" : [ 1206.75, 445.0, 195.5, 445.0 ], - "order" : 7, - "source" : [ "obj-55", 0 ] + "box" : { + "id" : "obj-36", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 313.0, 102.16666579246521, 79.0, 22.0 ], + "text" : "wrap -0.5 0.5" } } , { - "patchline" : { - "destination" : [ "obj-59", 1 ], - "source" : [ "obj-56", 0 ] + "box" : { + "id" : "obj-35", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 313.0, 64.5, 35.0, 22.0 ], + "text" : "delta" } } , { - "patchline" : { - "destination" : [ "obj-56", 0 ], - "source" : [ "obj-58", 0 ] + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-34", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 180.0, 23.5, 165.0, 21.0 ], + "text" : "in 1 @comment phasor:unipolar" } } , { - "patchline" : { - "destination" : [ "obj-67", 0 ], - "source" : [ "obj-59", 0 ] + "box" : { + "id" : "obj-33", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 401.0, 523.0, 26.0, 22.0 ], + "text" : "!- 1" } } , { - "patchline" : { - "destination" : [ "obj-63", 1 ], - "source" : [ "obj-62", 0 ] + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 401.0, 565.0, 24.5, 22.0 ], + "text" : "/" } } , { - "patchline" : { - "destination" : [ "obj-64", 0 ], - "order" : 1, - "source" : [ "obj-63", 0 ] + "box" : { + "id" : "obj-31", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 297.0, 565.0, 22.5, 22.0 ], + "text" : "/" } } , { - "patchline" : { - "destination" : [ "obj-74", 1 ], - "order" : 0, - "source" : [ "obj-63", 0 ] + "box" : { + "id" : "obj-30", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 519.5, 489.500001549720764, 225.0, 60.0 ], + "text" : "derive the fractions of a period occupied by the rising & falling segments, \n\nalso taking into account the squareness" } } , { - "patchline" : { - "destination" : [ "obj-67", 1 ], - "source" : [ "obj-64", 0 ] + "box" : { + "id" : "obj-28", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 61.833332777023315, 409.500001549720764, 115.0, 87.0 ], + "text" : "convert skew to desired pulsewidth: this marks the boundary between the two halves of the waveform" } } , { - "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-66", 0 ] + "box" : { + "id" : "obj-24", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 944.0, 489.500001549720764, 83.0, 60.0 ], + "text" : "convert square factor [0,1] to range [1, ..inf)" } } , { - "patchline" : { - "destination" : [ "obj-63", 0 ], - "order" : 0, - "source" : [ "obj-67", 0 ] + "box" : { + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 20.0, 440.500001549720764, 36.0, 22.0 ], + "text" : "!- 0.5" } } , { - "patchline" : { - "destination" : [ "obj-72", 0 ], - "order" : 1, - "source" : [ "obj-67", 0 ] + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 20.0, 409.500001549720764, 33.0, 22.0 ], + "text" : "* 0.5" } } , { - "patchline" : { - "destination" : [ "obj-74", 0 ], - "source" : [ "obj-72", 0 ] + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-20", + "linecount" : 2, + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 20.0, 369.166667819023132, 153.0, 33.0 ], + "text" : "in 3 @comment skew:bipolar @min -1 @max 1" } } , { - "patchline" : { - "destination" : [ "obj-214", 0 ], - "source" : [ "obj-74", 0 ] + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 882.5, 515.0, 25.0, 22.0 ], + "text" : "!/ 1" } } , { - "patchline" : { - "destination" : [ "obj-81", 0 ], - "source" : [ "obj-75", 0 ] + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 882.5, 489.500001549720764, 63.0, 22.0 ], + "text" : "!- 1.00001" } } , { - "patchline" : { - "destination" : [ "obj-102", 0 ], - "source" : [ "obj-77", 0 ] + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 882.5, 465.333333611488342, 273.0, 21.0 ], + "text" : "in 2 @comment squareness:unipolar @min 0 @max 1" } } , { - "patchline" : { - "destination" : [ "obj-157", 0 ], - "source" : [ "obj-78", 0 ] + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 180.0, 991.999999642372131, 26.0, 22.0 ], + "text" : "* pi" } } , { - "patchline" : { - "destination" : [ "obj-77", 0 ], - "source" : [ "obj-79", 0 ] + "box" : { + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 180.0, 1018.999999642372131, 27.0, 22.0 ], + "text" : "cos" } } , { - "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-8", 0 ] + "box" : { + "id" : "obj-13", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 410.5, 344.166666388511658, 676.0, 47.0 ], + "text" : "This parameter sets the frequency at which the waveform becomes a pure sine, regardless of desired shape. Increasing this parameter will introduce more non-bandlimited aliasing noise; decreasing this parameter sounds a bit like a low pass filter over the oscillator. Samplerate/20 sounds like a reasonable compromise." } } , { - "patchline" : { - "destination" : [ "obj-258", 1 ], - "order" : 1, - "source" : [ "obj-80", 0 ] + "box" : { + "fontname" : "Arial", + "fontsize" : 11.0, + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 180.0, 1045.999999642372131, 124.0, 21.0 ], + "text" : "out 1 squinewave:audio" } } -, { + ], + "lines" : [ { "patchline" : { - "destination" : [ "obj-260", 1 ], - "order" : 0, - "source" : [ "obj-80", 0 ] + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-1", 0 ] } } , { "patchline" : { - "destination" : [ "obj-79", 0 ], - "order" : 1, - "source" : [ "obj-81", 0 ] + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-10", 0 ] } } , { "patchline" : { - "destination" : [ "obj-85", 0 ], - "order" : 0, - "source" : [ "obj-81", 0 ] + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-12", 0 ] } } , { "patchline" : { - "destination" : [ "obj-258", 0 ], - "order" : 1, - "source" : [ "obj-82", 0 ] + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-15", 0 ] } } , { "patchline" : { - "destination" : [ "obj-260", 0 ], - "order" : 0, - "source" : [ "obj-82", 0 ] + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-16", 0 ] } } , { "patchline" : { - "destination" : [ "obj-256", 1 ], + "color" : [ 0.0, 0.0, 0.738115787506104, 1.0 ], + "destination" : [ "obj-31", 1 ], + "midpoints" : [ 892.0, 554.5, 310.25, 554.5 ], "order" : 1, - "source" : [ "obj-83", 0 ] + "source" : [ "obj-17", 0 ] } } , { "patchline" : { - "destination" : [ "obj-257", 1 ], + "destination" : [ "obj-32", 1 ], + "midpoints" : [ 892.0, 554.0, 416.0, 554.0 ], "order" : 0, - "source" : [ "obj-83", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-81", 1 ], - "source" : [ "obj-84", 0 ] + "source" : [ "obj-17", 0 ] } } , { "patchline" : { - "destination" : [ "obj-77", 1 ], - "order" : 0, - "source" : [ "obj-85", 0 ] + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-2", 0 ] } } , { "patchline" : { - "destination" : [ "obj-84", 0 ], - "order" : 1, - "source" : [ "obj-85", 0 ] + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-20", 0 ] } } , { "patchline" : { - "destination" : [ "obj-85", 1 ], - "source" : [ "obj-86", 0 ] + "destination" : [ "obj-22", 0 ], + "source" : [ "obj-21", 0 ] } } , { "patchline" : { - "destination" : [ "obj-256", 0 ], + "color" : [ 0.0, 0.643394768238068, 0.716167688369751, 1.0 ], + "destination" : [ "obj-31", 0 ], + "midpoints" : [ 29.5, 509.25, 306.5, 509.25 ], "order" : 1, - "source" : [ "obj-87", 0 ] + "source" : [ "obj-22", 0 ] } } , { "patchline" : { - "destination" : [ "obj-257", 0 ], + "color" : [ 0.0, 0.643394768238068, 0.716167688369751, 1.0 ], + "destination" : [ "obj-33", 0 ], + "midpoints" : [ 29.5, 506.25, 410.5, 506.25 ], "order" : 0, - "source" : [ "obj-87", 0 ] + "source" : [ "obj-22", 0 ] } } , { "patchline" : { - "destination" : [ "obj-127", 0 ], - "order" : 0, - "source" : [ "obj-88", 0 ] + "color" : [ 0.0, 0.643394768238068, 0.716167688369751, 1.0 ], + "destination" : [ "obj-66", 0 ], + "midpoints" : [ 29.5, 512.25, 215.5, 512.25 ], + "order" : 2, + "source" : [ "obj-22", 0 ] } } , { "patchline" : { - "destination" : [ "obj-95", 0 ], - "order" : 1, - "source" : [ "obj-88", 0 ] + "destination" : [ "obj-58", 0 ], + "source" : [ "obj-31", 0 ] } } , { "patchline" : { - "destination" : [ "obj-80", 1 ], - "midpoints" : [ 363.75, 550.0, 595.5, 550.0 ], - "order" : 0, - "source" : [ "obj-9", 0 ] + "destination" : [ "obj-59", 0 ], + "source" : [ "obj-32", 0 ] } } , { "patchline" : { - "destination" : [ "obj-82", 1 ], - "midpoints" : [ 363.75, 550.0, 445.5, 550.0 ], - "order" : 1, - "source" : [ "obj-9", 0 ] + "destination" : [ "obj-32", 0 ], + "source" : [ "obj-33", 0 ] } } , { "patchline" : { - "destination" : [ "obj-83", 1 ], - "midpoints" : [ 363.75, 550.0, 295.5, 550.0 ], - "order" : 2, - "source" : [ "obj-9", 0 ] + "destination" : [ "obj-1", 0 ], + "order" : 3, + "source" : [ "obj-34", 0 ] } } , { "patchline" : { - "destination" : [ "obj-87", 1 ], - "midpoints" : [ 363.75, 549.0, 145.50000399999999, 549.0 ], - "order" : 3, - "source" : [ "obj-9", 0 ] + "color" : [ 0.779206395149231, 0.0, 0.0, 1.0 ], + "destination" : [ "obj-35", 0 ], + "midpoints" : [ 189.5, 54.0, 322.5, 54.0 ], + "order" : 1, + "source" : [ "obj-34", 0 ] } } , { "patchline" : { - "destination" : [ "obj-86", 1 ], - "source" : [ "obj-95", 0 ] + "color" : [ 0.779206395149231, 0.0, 0.0, 1.0 ], + "destination" : [ "obj-68", 0 ], + "midpoints" : [ 189.5, 788.5, 293.5, 788.5 ], + "order" : 2, + "source" : [ "obj-34", 0 ] } } , { "patchline" : { - "destination" : [ "obj-116", 0 ], - "source" : [ "obj-98", 0 ] + "color" : [ 0.779206395149231, 0.0, 0.0, 1.0 ], + "destination" : [ "obj-70", 0 ], + "midpoints" : [ 189.5, 787.5, 397.5, 787.5 ], + "order" : 0, + "source" : [ "obj-34", 0 ] } } - ] - } -, - "patching_rect" : [ 48.0, 310.0, 96.0, 22.0 ], - "saved_object_attributes" : { - "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", - "exportname" : "giga" - } -, - "text" : "gen~ @title giga", - "varname" : "giga" - } - - } -, { - "box" : { - "automatic" : 1, - "id" : "obj-9", - "maxclass" : "scope~", - "numinlets" : 2, - "numoutlets" : 0, - "patching_rect" : [ 138.0, 354.0, 222.0, 179.0 ] - } - - } -, { - "box" : { - "args" : [ "patch" ], - "bgmode" : 0, - "border" : 0, - "clickthrough" : 0, - "enablehscroll" : 0, - "enablevscroll" : 0, - "id" : "obj-1", - "lockeddragscroll" : 0, - "maxclass" : "bpatcher", - "name" : "oopsy.maxpat", - "numinlets" : 1, - "numoutlets" : 0, - "offset" : [ 0.0, 0.0 ], - "patching_rect" : [ 486.0, 158.0, 128.0, 128.0 ], - "viewvisibility" : 1 - } - - } -, { - "box" : { - "attr" : "ctrl1_wet", - "id" : "obj-19", - "maxclass" : "attrui", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 430.0, 24.0, 150.0, 22.0 ] - } - - } -, { - "box" : { - "attr" : "ctrl2_roomsize", - "id" : "obj-20", - "maxclass" : "attrui", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 430.0, 48.0, 150.0, 22.0 ] - } - - } -, { - "box" : { - "attr" : "ctrl3_len_seconds", - "id" : "obj-21", - "maxclass" : "attrui", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 430.0, 76.0, 150.0, 22.0 ] - } - - } -, { - "box" : { - "attr" : "early_late", - "id" : "obj-22", - "maxclass" : "attrui", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 272.0, 71.0, 150.0, 22.0 ] - } - - } -, { - "box" : { - "attr" : "gate1_freeze", - "displaymode" : 8, - "id" : "obj-6", - "maxclass" : "attrui", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 291.0, 264.0, 150.0, 22.0 ] - } - - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-13", 1 ], - "source" : [ "obj-11", 1 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-13", 0 ], - "source" : [ "obj-11", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-11", 1 ], - "order" : 1, - "source" : [ "obj-12", 1 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-11", 0 ], - "order" : 1, - "source" : [ "obj-12", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-9", 0 ], - "order" : 0, - "source" : [ "obj-12", 1 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-9", 0 ], - "order" : 0, - "source" : [ "obj-12", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "source" : [ "obj-19", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 1 ], - "order" : 0, - "source" : [ "obj-2", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "order" : 1, - "source" : [ "obj-2", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "source" : [ "obj-20", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "source" : [ "obj-21", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "source" : [ "obj-22", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "source" : [ "obj-6", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "source" : [ "obj-7", 0 ] - } - - } - ] - } -, - "patching_rect" : [ 33.0, 157.0, 65.0, 22.0 ], - "saved_object_attributes" : { - "description" : "", - "digest" : "", - "globalpatchername" : "", - "tags" : "" - } -, - "text" : "p gigaverb" - } - - } -, { - "box" : { - "id" : "obj-18", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 0, - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "box", - "rect" : [ 625.0, 528.0, 640.0, 480.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "args" : [ "patch" ], - "bgmode" : 0, - "border" : 0, - "clickthrough" : 0, - "enablehscroll" : 0, - "enablevscroll" : 0, - "id" : "obj-7", - "lockeddragscroll" : 0, - "maxclass" : "bpatcher", - "name" : "oopsy.maxpat", - "numinlets" : 1, - "numoutlets" : 0, - "offset" : [ 0.0, 0.0 ], - "patching_rect" : [ 480.0, 35.0, 128.0, 128.0 ], - "viewvisibility" : 1 - } - - } -, { - "box" : { - "automatic" : 1, - "id" : "obj-6", - "maxclass" : "scope~", - "numinlets" : 2, - "numoutlets" : 0, - "patching_rect" : [ 50.0, 194.0, 228.0, 191.0 ] - } +, { + "patchline" : { + "color" : [ 0.779206395149231, 0.0, 0.0, 1.0 ], + "destination" : [ "obj-79", 0 ], + "order" : 4, + "source" : [ "obj-34", 0 ] + } - } -, { - "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "signal", "signal" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "dsp.gen", - "rect" : [ 75.0, 160.0, 658.0, 425.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-14", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 191.0, 380.0, 35.0, 22.0 ], - "text" : "out 2" + } +, { + "patchline" : { + "destination" : [ "obj-36", 0 ], + "source" : [ "obj-35", 0 ] } } , { - "box" : { - "id" : "obj-13", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 191.0, 347.5, 29.5, 22.0 ], - "text" : "*" + "patchline" : { + "destination" : [ "obj-41", 0 ], + "source" : [ "obj-36", 0 ] } } , { - "box" : { - "id" : "obj-12", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 14.0, 347.5, 29.5, 22.0 ], - "text" : "*" + "patchline" : { + "destination" : [ "obj-42", 0 ], + "source" : [ "obj-41", 0 ] } } , { - "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 49.5, 309.0, 108.0, 22.0 ], - "text" : "oopsy.ctrl.smooth3" + "patchline" : { + "destination" : [ "obj-46", 0 ], + "order" : 2, + "source" : [ "obj-42", 0 ] } } , { - "box" : { - "id" : "obj-11", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 49.5, 280.5, 203.0, 22.0 ], - "text" : "param cv4_vca 0.5 @min 0 @max 1" + "patchline" : { + "destination" : [ "obj-48", 1 ], + "order" : 1, + "source" : [ "obj-42", 0 ] } } , { - "box" : { - "id" : "obj-10", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 212.0, 60.0, 108.0, 22.0 ], - "text" : "oopsy.ctrl.smooth3" + "patchline" : { + "destination" : [ "obj-49", 0 ], + "order" : 0, + "source" : [ "obj-42", 0 ] } } , { - "box" : { - "id" : "obj-7", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 425.5, 60.0, 108.0, 22.0 ], - "text" : "oopsy.ctrl.smooth3" + "patchline" : { + "destination" : [ "obj-48", 0 ], + "source" : [ "obj-46", 0 ] } } , { - "box" : { - "id" : "obj-1", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 14.0, 60.0, 74.0, 22.0 ], - "text" : "oopsy.cv2hz" + "patchline" : { + "destination" : [ "obj-46", 1 ], + "order" : 1, + "source" : [ "obj-47", 0 ] } } , { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 14.0, 31.5, 190.0, 22.0 ], - "text" : "param cv1_pitch @min 0 @max 5" + "patchline" : { + "destination" : [ "obj-49", 1 ], + "order" : 0, + "source" : [ "obj-47", 0 ] } } , { - "box" : { - "id" : "obj-8", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 14.0, 103.5, 45.0, 22.0 ], - "text" : "phasor" + "patchline" : { + "destination" : [ "obj-47", 0 ], + "order" : 0, + "source" : [ "obj-48", 0 ] } } , { - "box" : { - "id" : "obj-6", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 425.5, 31.5, 196.0, 22.0 ], - "text" : "param cv3_skew @min -1 @max 1" + "patchline" : { + "destination" : [ "obj-50", 0 ], + "order" : 1, + "source" : [ "obj-48", 0 ] } } , { - "box" : { - "id" : "obj-5", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 212.0, 31.5, 201.0, 22.0 ], - "text" : "param cv2_square @min 0 @max 1" + "patchline" : { + "destination" : [ "obj-48", 2 ], + "source" : [ "obj-49", 0 ] } } , { - "box" : { - "id" : "obj-3", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 1, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "dsp.gen", - "rect" : [ 134.0, 153.0, 1227.0, 863.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.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" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-3", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 213.0, 194.499999642372131, 35.0, 22.0 ], - "text" : "out 2" - } - - } -, { - "box" : { - "id" : "obj-1", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 213.0, 132.833332538604736, 45.0, 22.0 ], - "text" : "* twopi" - } - - } -, { - "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 213.0, 159.833332538604736, 24.0, 22.0 ], - "text" : "sin" - } - - } -, { - "box" : { - "id" : "obj-5", - "linecount" : 5, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 587.499988436698914, 23.5, 568.000011563301086, 74.0 ], - "text" : "// Rewritten and rewritten re-implementation of the CSound squinewave by Rasmus Ekman\n// https://csound.com/docs/manual/squinewave.html\n// first re-implemented in gen~ by Volker Bohm\n// https://cycling74.com/forums/ann-squinewave-bandlimited-oscil-with-morphing-waveform-and-hardsync\n// This version by graham wakefield 2020" - } - - } -, { - "box" : { - "id" : "obj-82", - "linecount" : 3, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 409.0, 926.999999642372131, 99.0, 47.0 ], - "text" : "switch between two segments at transition point" - } - - } -, { - "box" : { - "id" : "obj-81", - "linecount" : 3, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 213.333333194255829, 991.999999642372131, 79.0, 47.0 ], - "text" : "apply cosine shape to the ramps" - } - - } -, { - "box" : { - "id" : "obj-80", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 180.0, 948.999999642372131, 227.0, 22.0 ], - "text" : "?" - } - - } -, { - "box" : { - "id" : "obj-79", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 180.0, 920.999999642372131, 45.0, 22.0 ], - "text" : "<=" - } - - } -, { - "box" : { - "id" : "obj-78", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 447.5, 893.0, 174.0, 20.0 ], - "text" : "falling shape" - } - - } -, { - "box" : { - "id" : "obj-77", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 388.0, 893.0, 56.0, 22.0 ], - "text" : "!- 1" - } - - } -, { - "box" : { - "id" : "obj-76", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 447.5, 865.0, 185.0, 20.0 ], - "text" : "and clamp for square section of it" - } - - } -, { - "box" : { - "id" : "obj-75", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 388.0, 865.0, 61.0, 22.0 ], - "text" : "clamp 0 1" - } - - } -, { - "box" : { - "id" : "obj-74", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 284.0, 865.0, 61.0, 22.0 ], - "text" : "clamp 0 1" - } - - } -, { - "box" : { - "id" : "obj-73", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 447.5, 838.0, 174.0, 20.0 ], - "text" : "spread phase over ramp width" - } - - } -, { - "box" : { - "id" : "obj-72", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 436.0, 786.0, 178.0, 33.0 ], - "text" : "shift phasor to commence at transition point for 2nd segment" - } - - } -, { - "box" : { - "id" : "obj-70", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 388.0, 796.0, 45.5, 22.0 ], - "text" : "-" - } - - } -, { - "box" : { - "id" : "obj-69", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 388.0, 838.0, 32.0, 22.0 ], - "text" : "/" - } - - } -, { - "box" : { - "id" : "obj-68", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 284.0, 838.0, 32.0, 22.0 ], - "text" : "/" - } - - } -, { - "box" : { - "id" : "obj-67", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 238.0, 706.0, 26.0, 22.0 ], - "text" : "!- 1" - } - - } -, { - "box" : { - "id" : "obj-66", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 206.0, 738.0, 51.0, 22.0 ], - "text" : "clamp" - } - - } -, { - "box" : { - "id" : "obj-65", - "linecount" : 3, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 419.0, 716.0, 191.0, 47.0 ], - "text" : "derive the *actual* (limited) midpoint-phase between the two segments" - } - - } -, { - "box" : { - "id" : "obj-63", - "linecount" : 3, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 458.0, 633.0, 175.0, 47.0 ], - "text" : "clamp the rising & falling segment widths according to the min frequency-limited width" - } - - } -, { - "box" : { - "id" : "obj-59", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 401.0, 655.0, 51.0, 22.0 ], - "text" : "clamp" - } - - } -, { - "box" : { - "id" : "obj-58", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 297.0, 655.0, 51.0, 22.0 ], - "text" : "clamp" - } - - } -, { - "box" : { - "id" : "obj-57", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 329.0, 619.0, 26.0, 22.0 ], - "text" : "!- 1" - } - - } -, { - "box" : { - "id" : "obj-55", - "linecount" : 4, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 390.0, 393.166666388511658, 672.0, 60.0 ], - "text" : "very high frequencies would require very fast ramps, which can alias even when cosine-smoothed. to avoid this, we limit the maximum slope of any segment. this implies limiting the duration (pulse width) of any ramp segment. that is, overly-sharp transitions will be stretched back out. as we approach the limit, the waveform will become sinusoidal regardless the skew/squareness" - } - - } -, { - "box" : { - "id" : "obj-52", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 313.0, 400.166666388511658, 71.0, 22.0 ], - "text" : "clamp 0 0.5" - } - - } -, { - "box" : { - "id" : "obj-51", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 313.0, 372.166666388511658, 33.0, 22.0 ], - "text" : "* 0.5" - } - - } -, { - "box" : { - "id" : "obj-50", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 313.0, 344.166666388511658, 93.0, 22.0 ], - "text" : "* 20/samplerate" - } - - } -, { - "box" : { - "id" : "obj-49", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 382.0, 265.833332538604736, 61.0, 22.0 ], - "text" : "mix 0.999" - } - - } -, { - "box" : { - "id" : "obj-48", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 313.0, 295.833332538604736, 88.0, 22.0 ], - "text" : "?" - } - - } -, { - "box" : { - "id" : "obj-47", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 424.0, 231.833332538604736, 44.0, 22.0 ], - "text" : "history" - } - - } -, { - "box" : { - "id" : "obj-46", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 313.0, 265.833332538604736, 29.5, 22.0 ], - "text" : ">" - } - - } -, { - "box" : { - "id" : "obj-45", - "linecount" : 7, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 486.0, 231.833332538604736, 234.0, 100.0 ], - "text" : "in reality, frequency may be modulating, so we put a little smoothing here. in particular, aliasing can happen if we underestimate frequency, so we allow it to rise immediately but fall slowly. this will handle even quite sudden changes of frequency, including changes of direction" - } - - } -, { - "box" : { - "id" : "obj-43", - "linecount" : 3, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 390.0, 172.499999642372131, 119.0, 47.0 ], - "text" : "infer absolute instantaneous frequency from delta" - } - - } -, { - "box" : { - "id" : "obj-42", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 313.0, 194.499999642372131, 28.0, 22.0 ], - "text" : "abs" - } - - } -, { - "box" : { - "id" : "obj-41", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 313.0, 172.499999642372131, 76.0, 22.0 ], - "text" : "* samplerate" - } - - } -, { - "box" : { - "id" : "obj-40", - "linecount" : 4, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 390.0, 102.16666579246521, 151.0, 60.0 ], - "text" : "wrap this delta, so that we get the same slope value even when input phase wraps from 1->0 (or 0->1) " - } - - } -, { - "box" : { - "id" : "obj-38", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 351.0, 64.5, 178.0, 33.0 ], - "text" : "phase change frame-to-frame (ramp slope per frame)" - } - - } -, { - "box" : { - "id" : "obj-36", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 313.0, 102.16666579246521, 79.0, 22.0 ], - "text" : "wrap -0.5 0.5" - } - - } -, { - "box" : { - "id" : "obj-35", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 313.0, 64.5, 35.0, 22.0 ], - "text" : "delta" - } - - } -, { - "box" : { - "fontname" : "Arial", - "fontsize" : 11.0, - "id" : "obj-34", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 180.0, 23.5, 165.0, 21.0 ], - "text" : "in 1 @comment phasor:unipolar" - } - - } -, { - "box" : { - "id" : "obj-33", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 401.0, 523.0, 26.0, 22.0 ], - "text" : "!- 1" - } - - } -, { - "box" : { - "id" : "obj-32", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 401.0, 565.0, 24.5, 22.0 ], - "text" : "/" - } - - } -, { - "box" : { - "id" : "obj-31", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 297.0, 565.0, 22.5, 22.0 ], - "text" : "/" - } - - } -, { - "box" : { - "id" : "obj-30", - "linecount" : 4, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 519.5, 489.500001549720764, 225.0, 60.0 ], - "text" : "derive the fractions of a period occupied by the rising & falling segments, \n\nalso taking into account the squareness" - } - - } -, { - "box" : { - "id" : "obj-28", - "linecount" : 6, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 61.833332777023315, 409.500001549720764, 115.0, 87.0 ], - "text" : "convert skew to desired pulsewidth: this marks the boundary between the two halves of the waveform" - } - - } -, { - "box" : { - "id" : "obj-24", - "linecount" : 4, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 944.0, 489.500001549720764, 83.0, 60.0 ], - "text" : "convert square factor [0,1] to range [1, ..inf)" - } - - } -, { - "box" : { - "id" : "obj-22", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 20.0, 440.500001549720764, 36.0, 22.0 ], - "text" : "!- 0.5" - } - - } -, { - "box" : { - "id" : "obj-21", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 20.0, 409.500001549720764, 33.0, 22.0 ], - "text" : "* 0.5" - } - - } -, { - "box" : { - "fontname" : "Arial", - "fontsize" : 11.0, - "id" : "obj-20", - "linecount" : 2, - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 20.0, 369.166667819023132, 153.0, 33.0 ], - "text" : "in 3 @comment skew:bipolar @min -1 @max 1" - } - - } -, { - "box" : { - "id" : "obj-17", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 882.5, 515.0, 25.0, 22.0 ], - "text" : "!/ 1" - } - - } -, { - "box" : { - "id" : "obj-16", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 882.5, 489.500001549720764, 63.0, 22.0 ], - "text" : "!- 1.00001" - } - - } -, { - "box" : { - "fontname" : "Arial", - "fontsize" : 11.0, - "id" : "obj-10", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 882.5, 465.333333611488342, 273.0, 21.0 ], - "text" : "in 2 @comment squareness:unipolar @min 0 @max 1" - } - - } -, { - "box" : { - "id" : "obj-15", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 180.0, 991.999999642372131, 26.0, 22.0 ], - "text" : "* pi" - } - - } -, { - "box" : { - "id" : "obj-12", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 180.0, 1018.999999642372131, 27.0, 22.0 ], - "text" : "cos" - } - - } -, { - "box" : { - "id" : "obj-13", - "linecount" : 3, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 410.5, 344.166666388511658, 676.0, 47.0 ], - "text" : "This parameter sets the frequency at which the waveform becomes a pure sine, regardless of desired shape. Increasing this parameter will introduce more non-bandlimited aliasing noise; decreasing this parameter sounds a bit like a low pass filter over the oscillator. Samplerate/20 sounds like a reasonable compromise." - } - - } -, { - "box" : { - "fontname" : "Arial", - "fontsize" : 11.0, - "id" : "obj-4", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 180.0, 1045.999999642372131, 124.0, 21.0 ], - "text" : "out 1 squinewave:audio" - } - - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-1", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-16", 0 ], - "source" : [ "obj-10", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-4", 0 ], - "source" : [ "obj-12", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "source" : [ "obj-15", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-17", 0 ], - "source" : [ "obj-16", 0 ] - } - - } -, { - "patchline" : { - "color" : [ 0.0, 0.0, 0.738115787506104, 1.0 ], - "destination" : [ "obj-31", 1 ], - "midpoints" : [ 892.0, 554.5, 310.25, 554.5 ], - "order" : 1, - "source" : [ "obj-17", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-32", 1 ], - "midpoints" : [ 892.0, 554.0, 416.0, 554.0 ], - "order" : 0, - "source" : [ "obj-17", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-3", 0 ], - "source" : [ "obj-2", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-21", 0 ], - "source" : [ "obj-20", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-22", 0 ], - "source" : [ "obj-21", 0 ] - } - - } -, { - "patchline" : { - "color" : [ 0.0, 0.643394768238068, 0.716167688369751, 1.0 ], - "destination" : [ "obj-31", 0 ], - "midpoints" : [ 29.5, 509.25, 306.5, 509.25 ], - "order" : 1, - "source" : [ "obj-22", 0 ] - } - - } -, { - "patchline" : { - "color" : [ 0.0, 0.643394768238068, 0.716167688369751, 1.0 ], - "destination" : [ "obj-33", 0 ], - "midpoints" : [ 29.5, 506.25, 410.5, 506.25 ], - "order" : 0, - "source" : [ "obj-22", 0 ] - } - - } -, { - "patchline" : { - "color" : [ 0.0, 0.643394768238068, 0.716167688369751, 1.0 ], - "destination" : [ "obj-66", 0 ], - "midpoints" : [ 29.5, 512.25, 215.5, 512.25 ], - "order" : 2, - "source" : [ "obj-22", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-58", 0 ], - "source" : [ "obj-31", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-59", 0 ], - "source" : [ "obj-32", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-32", 0 ], - "source" : [ "obj-33", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "order" : 3, - "source" : [ "obj-34", 0 ] - } - - } -, { - "patchline" : { - "color" : [ 0.779206395149231, 0.0, 0.0, 1.0 ], - "destination" : [ "obj-35", 0 ], - "midpoints" : [ 189.5, 54.0, 322.5, 54.0 ], - "order" : 1, - "source" : [ "obj-34", 0 ] - } - - } -, { - "patchline" : { - "color" : [ 0.779206395149231, 0.0, 0.0, 1.0 ], - "destination" : [ "obj-68", 0 ], - "midpoints" : [ 189.5, 788.5, 293.5, 788.5 ], - "order" : 2, - "source" : [ "obj-34", 0 ] - } - - } -, { - "patchline" : { - "color" : [ 0.779206395149231, 0.0, 0.0, 1.0 ], - "destination" : [ "obj-70", 0 ], - "midpoints" : [ 189.5, 787.5, 397.5, 787.5 ], - "order" : 0, - "source" : [ "obj-34", 0 ] - } - - } -, { - "patchline" : { - "color" : [ 0.779206395149231, 0.0, 0.0, 1.0 ], - "destination" : [ "obj-79", 0 ], - "order" : 4, - "source" : [ "obj-34", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-36", 0 ], - "source" : [ "obj-35", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-41", 0 ], - "source" : [ "obj-36", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-42", 0 ], - "source" : [ "obj-41", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-46", 0 ], - "order" : 2, - "source" : [ "obj-42", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-48", 1 ], - "order" : 1, - "source" : [ "obj-42", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-49", 0 ], - "order" : 0, - "source" : [ "obj-42", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-48", 0 ], - "source" : [ "obj-46", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-46", 1 ], - "order" : 1, - "source" : [ "obj-47", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-49", 1 ], - "order" : 0, - "source" : [ "obj-47", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-47", 0 ], - "order" : 0, - "source" : [ "obj-48", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-50", 0 ], - "order" : 1, - "source" : [ "obj-48", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-48", 2 ], - "source" : [ "obj-49", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-51", 0 ], - "source" : [ "obj-50", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-52", 0 ], - "source" : [ "obj-51", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-57", 0 ], - "midpoints" : [ 322.5, 612.0, 338.5, 612.0 ], - "order" : 1, - "source" : [ "obj-52", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-58", 1 ], - "order" : 2, - "source" : [ "obj-52", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-59", 1 ], - "midpoints" : [ 322.5, 613.0, 426.5, 613.0 ], - "order" : 0, - "source" : [ "obj-52", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-58", 2 ], - "order" : 1, - "source" : [ "obj-57", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-59", 2 ], - "midpoints" : [ 338.5, 648.0, 442.5, 648.0 ], - "order" : 0, - "source" : [ "obj-57", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-66", 1 ], - "midpoints" : [ 306.5, 689.0, 231.5, 689.0 ], - "order" : 1, - "source" : [ "obj-58", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-68", 1 ], - "order" : 0, - "source" : [ "obj-58", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-67", 0 ], - "midpoints" : [ 410.5, 698.5, 247.5, 698.5 ], - "order" : 1, - "source" : [ "obj-59", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-69", 1 ], - "order" : 0, - "source" : [ "obj-59", 0 ] - } - - } -, { - "patchline" : { - "color" : [ 0.0, 0.748078107833862, 0.0, 1.0 ], - "destination" : [ "obj-70", 1 ], - "midpoints" : [ 215.5, 772.5, 424.0, 772.5 ], - "order" : 0, - "source" : [ "obj-66", 0 ] - } - - } -, { - "patchline" : { - "color" : [ 0.0, 0.748078107833862, 0.0, 1.0 ], - "destination" : [ "obj-79", 1 ], - "order" : 1, - "source" : [ "obj-66", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-66", 2 ], - "source" : [ "obj-67", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-74", 0 ], - "source" : [ "obj-68", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-75", 0 ], - "source" : [ "obj-69", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-69", 0 ], - "source" : [ "obj-70", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-80", 1 ], - "source" : [ "obj-74", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-77", 0 ], - "source" : [ "obj-75", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-80", 2 ], - "source" : [ "obj-77", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-80", 0 ], - "source" : [ "obj-79", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-15", 0 ], - "source" : [ "obj-80", 0 ] - } - - } - ] - } -, - "patching_rect" : [ 14.0, 230.0, 196.0, 22.0 ], - "text" : "gen @title squinewave" + "patchline" : { + "destination" : [ "obj-51", 0 ], + "source" : [ "obj-50", 0 ] } } , { - "box" : { - "id" : "obj-4", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 14.0, 380.0, 35.0, 22.0 ], - "text" : "out 1" + "patchline" : { + "destination" : [ "obj-52", 0 ], + "source" : [ "obj-51", 0 ] } } - ], - "lines" : [ { +, { "patchline" : { - "destination" : [ "obj-8", 0 ], - "source" : [ "obj-1", 0 ] + "destination" : [ "obj-57", 0 ], + "midpoints" : [ 322.5, 612.0, 338.5, 612.0 ], + "order" : 1, + "source" : [ "obj-52", 0 ] } } , { "patchline" : { - "destination" : [ "obj-3", 1 ], - "source" : [ "obj-10", 0 ] + "destination" : [ "obj-58", 1 ], + "order" : 2, + "source" : [ "obj-52", 0 ] } } , { "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-11", 0 ] + "destination" : [ "obj-59", 1 ], + "midpoints" : [ 322.5, 613.0, 426.5, 613.0 ], + "order" : 0, + "source" : [ "obj-52", 0 ] } } , { "patchline" : { - "destination" : [ "obj-4", 0 ], - "source" : [ "obj-12", 0 ] + "destination" : [ "obj-58", 2 ], + "order" : 1, + "source" : [ "obj-57", 0 ] } } , { "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-13", 0 ] + "destination" : [ "obj-59", 2 ], + "midpoints" : [ 338.5, 648.0, 442.5, 648.0 ], + "order" : 0, + "source" : [ "obj-57", 0 ] } } , { "patchline" : { - "destination" : [ "obj-12", 1 ], + "destination" : [ "obj-66", 1 ], + "midpoints" : [ 306.5, 689.0, 231.5, 689.0 ], "order" : 1, - "source" : [ "obj-2", 0 ] + "source" : [ "obj-58", 0 ] } } , { "patchline" : { - "destination" : [ "obj-13", 1 ], + "destination" : [ "obj-68", 1 ], "order" : 0, - "source" : [ "obj-2", 0 ] + "source" : [ "obj-58", 0 ] } } , { "patchline" : { - "destination" : [ "obj-12", 0 ], - "source" : [ "obj-3", 0 ] + "destination" : [ "obj-67", 0 ], + "midpoints" : [ 410.5, 698.5, 247.5, 698.5 ], + "order" : 1, + "source" : [ "obj-59", 0 ] } } , { "patchline" : { - "destination" : [ "obj-13", 0 ], - "source" : [ "obj-3", 1 ] + "destination" : [ "obj-69", 1 ], + "order" : 0, + "source" : [ "obj-59", 0 ] } } , { "patchline" : { - "destination" : [ "obj-10", 0 ], - "source" : [ "obj-5", 0 ] + "color" : [ 0.0, 0.748078107833862, 0.0, 1.0 ], + "destination" : [ "obj-70", 1 ], + "midpoints" : [ 215.5, 772.5, 424.0, 772.5 ], + "order" : 0, + "source" : [ "obj-66", 0 ] } } , { "patchline" : { - "destination" : [ "obj-7", 0 ], - "source" : [ "obj-6", 0 ] + "color" : [ 0.0, 0.748078107833862, 0.0, 1.0 ], + "destination" : [ "obj-79", 1 ], + "order" : 1, + "source" : [ "obj-66", 0 ] } } , { "patchline" : { - "destination" : [ "obj-3", 2 ], - "source" : [ "obj-7", 0 ] + "destination" : [ "obj-66", 2 ], + "source" : [ "obj-67", 0 ] } } , { "patchline" : { - "destination" : [ "obj-3", 0 ], - "source" : [ "obj-8", 0 ] + "destination" : [ "obj-74", 0 ], + "source" : [ "obj-68", 0 ] } } , { "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-9", 0 ] + "destination" : [ "obj-75", 0 ], + "source" : [ "obj-69", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-69", 0 ], + "source" : [ "obj-70", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-80", 1 ], + "source" : [ "obj-74", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-77", 0 ], + "source" : [ "obj-75", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-80", 2 ], + "source" : [ "obj-77", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-80", 0 ], + "source" : [ "obj-79", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-80", 0 ] } } ] } , - "patching_rect" : [ 50.0, 161.0, 108.0, 22.0 ], - "saved_object_attributes" : { - "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", - "exportname" : "squine" - } -, - "text" : "gen~ @title squine", - "varname" : "squine" + "patching_rect" : [ 14.0, 230.0, 196.0, 22.0 ], + "text" : "gen @title squinewave" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 14.0, 380.0, 35.0, 22.0 ], + "text" : "out 1" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-1", 0 ] } } , { - "box" : { - "attr" : "cv1_pitch", - "id" : "obj-1", - "maxclass" : "attrui", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 103.0, 34.0, 150.0, 22.0 ] + "patchline" : { + "destination" : [ "obj-3", 1 ], + "source" : [ "obj-10", 0 ] } } , { - "box" : { - "attr" : "cv2_square", - "id" : "obj-3", - "maxclass" : "attrui", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 103.0, 61.0, 150.0, 22.0 ] + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-11", 0 ] } } , { - "box" : { - "attr" : "cv3_skew", - "id" : "obj-4", - "maxclass" : "attrui", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 103.0, 88.0, 150.0, 22.0 ] + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-12", 0 ] } } , { - "box" : { - "attr" : "cv4_vca", - "id" : "obj-5", - "maxclass" : "attrui", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 103.0, 112.0, 150.0, 22.0 ] + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-13", 0 ] } } - ], - "lines" : [ { +, { "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-1", 0 ] + "destination" : [ "obj-12", 1 ], + "order" : 1, + "source" : [ "obj-2", 0 ] } } , { "patchline" : { - "destination" : [ "obj-6", 0 ], + "destination" : [ "obj-13", 1 ], + "order" : 0, "source" : [ "obj-2", 0 ] } } , { "patchline" : { - "destination" : [ "obj-2", 0 ], + "destination" : [ "obj-12", 0 ], "source" : [ "obj-3", 0 ] } } , { "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-4", 0 ] + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-3", 1 ] } } , { "patchline" : { - "destination" : [ "obj-2", 0 ], + "destination" : [ "obj-10", 0 ], "source" : [ "obj-5", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-6", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 2 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-8", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-9", 0 ] + } + } ] } , - "patching_rect" : [ 104.0, 157.0, 82.0, 22.0 ], + "patching_rect" : [ 438.0, 285.0, 158.0, 29.0 ], "saved_object_attributes" : { - "description" : "", - "digest" : "", - "globalpatchername" : "", - "tags" : "" + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", + "exportname" : "squine" } , - "text" : "p squinewave" + "text" : "gen~ @title squine", + "varname" : "squine" } } - ], - "lines" : [ ], - "parameters" : { - "obj-11::obj-11" : [ "live.gain~[1]", "live.gain~", 0 ], - "obj-11::obj-9::obj-32" : [ "live.text[6]", "FILTER", 0 ], - "obj-11::obj-9::obj-36" : [ "live.menu[7]", "live.menu", 0 ], - "obj-11::obj-9::obj-4" : [ "live.menu[8]", "live.menu", 0 ], - "obj-12::obj-11" : [ "live.gain~[2]", "live.gain~", 0 ], - "obj-12::obj-9::obj-32" : [ "live.text[7]", "FILTER", 0 ], - "obj-12::obj-9::obj-36" : [ "live.menu[9]", "live.menu", 0 ], - "obj-12::obj-9::obj-4" : [ "live.menu[10]", "live.menu", 0 ], - "obj-13::obj-11" : [ "live.gain~[3]", "live.gain~", 0 ], - "obj-13::obj-12" : [ "live.gain~[4]", "live.gain~", 0 ], - "obj-13::obj-7::obj-21::obj-6" : [ "live.tab[1]", "live.tab[1]", 0 ], - "obj-13::obj-7::obj-35" : [ "[1]", "Level", 0 ], - "obj-13::obj-9::obj-32" : [ "live.text[8]", "FILTER", 0 ], - "obj-13::obj-9::obj-36" : [ "live.menu[11]", "live.menu", 0 ], - "obj-13::obj-9::obj-4" : [ "live.menu[12]", "live.menu", 0 ], - "obj-14::obj-4" : [ "live.gain~[5]", "live.gain~", 0 ], - "obj-14::obj-9::obj-32" : [ "live.text[9]", "FILTER", 0 ], - "obj-14::obj-9::obj-36" : [ "live.menu[13]", "live.menu", 0 ], - "obj-14::obj-9::obj-4" : [ "live.menu[14]", "live.menu", 0 ], - "obj-15::obj-4" : [ "live.gain~[6]", "live.gain~", 0 ], - "obj-15::obj-9::obj-32" : [ "live.text[10]", "FILTER", 0 ], - "obj-15::obj-9::obj-36" : [ "live.menu[15]", "live.menu", 0 ], - "obj-15::obj-9::obj-4" : [ "live.menu[16]", "live.menu", 0 ], - "obj-18::obj-7::obj-32" : [ "live.text[3]", "FILTER", 0 ], - "obj-18::obj-7::obj-36" : [ "live.menu[3]", "live.menu", 0 ], - "obj-18::obj-7::obj-4" : [ "live.menu[2]", "live.menu", 0 ], - "obj-1::obj-11" : [ "live.gain~", "live.gain~", 0 ], - "obj-1::obj-1::obj-32" : [ "live.text[2]", "FILTER", 0 ], - "obj-1::obj-1::obj-36" : [ "live.menu[1]", "live.menu", 0 ], - "obj-1::obj-1::obj-4" : [ "live.menu[4]", "live.menu", 0 ], - "obj-1::obj-2::obj-21::obj-6" : [ "live.tab[3]", "live.tab[1]", 0 ], - "obj-1::obj-2::obj-35" : [ "[5]", "Level", 0 ], - "obj-3::obj-32" : [ "live.text[5]", "FILTER", 0 ], - "obj-3::obj-36" : [ "live.menu[5]", "live.menu", 0 ], - "obj-3::obj-4" : [ "live.menu[6]", "live.menu", 0 ], - "parameterbanks" : { +, { + "box" : { + "attr" : "cv1_pitch", + "id" : "obj-26", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 438.0, 158.0, 150.0, 22.0 ] + } } -, - "parameter_overrides" : { - "obj-11::obj-11" : { - "parameter_initial" : -70.0, - "parameter_initial_enable" : 1, - "parameter_longname" : "live.gain~[1]" +, { + "box" : { + "attr" : "cv2_square", + "id" : "obj-27", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 438.0, 180.879999999999995, 150.0, 22.0 ] } -, - "obj-11::obj-9::obj-32" : { - "parameter_longname" : "live.text[6]" + + } +, { + "box" : { + "attr" : "cv3_skew", + "id" : "obj-28", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 438.0, 203.759999999999991, 150.0, 22.0 ] } -, - "obj-11::obj-9::obj-36" : { - "parameter_longname" : "live.menu[7]" + + } +, { + "box" : { + "attr" : "cv4_vca", + "id" : "obj-29", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 438.0, 226.639999999999986, 150.0, 22.0 ] } -, - "obj-11::obj-9::obj-4" : { - "parameter_longname" : "live.menu[8]" + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-1", 0 ] } -, - "obj-12::obj-11" : { - "parameter_initial" : -70.0, - "parameter_initial_enable" : 1, - "parameter_longname" : "live.gain~[2]" + + } +, { + "patchline" : { + "destination" : [ "obj-13", 1 ], + "source" : [ "obj-11", 1 ] } -, - "obj-12::obj-9::obj-32" : { - "parameter_longname" : "live.text[7]" + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-11", 0 ] } -, - "obj-12::obj-9::obj-36" : { - "parameter_longname" : "live.menu[9]" + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "order" : 0, + "source" : [ "obj-12", 1 ] } -, - "obj-12::obj-9::obj-4" : { - "parameter_longname" : "live.menu[10]" + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "order" : 0, + "source" : [ "obj-12", 0 ] } -, - "obj-13::obj-11" : { - "parameter_longname" : "live.gain~[3]" + + } +, { + "patchline" : { + "destination" : [ "obj-11", 1 ], + "order" : 1, + "source" : [ "obj-12", 1 ] } -, - "obj-13::obj-12" : { - "parameter_longname" : "live.gain~[4]" + + } +, { + "patchline" : { + "destination" : [ "obj-11", 0 ], + "order" : 1, + "source" : [ "obj-12", 0 ] } -, - "obj-13::obj-7::obj-21::obj-6" : { - "parameter_longname" : "live.tab[1]" + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-14", 0 ] } -, - "obj-13::obj-7::obj-35" : { - "parameter_longname" : "[1]" + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-15", 0 ] } -, - "obj-13::obj-9::obj-32" : { - "parameter_longname" : "live.text[8]" + + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-16", 0 ] } -, - "obj-13::obj-9::obj-36" : { - "parameter_longname" : "live.menu[11]" + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-17", 0 ] } -, - "obj-13::obj-9::obj-4" : { - "parameter_longname" : "live.menu[12]" + + } +, { + "patchline" : { + "destination" : [ "obj-9", 1 ], + "source" : [ "obj-19", 0 ] } -, - "obj-14::obj-4" : { - "parameter_longname" : "live.gain~[5]" + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-2", 0 ] } -, - "obj-14::obj-9::obj-32" : { - "parameter_longname" : "live.text[9]" + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-21", 0 ] } -, - "obj-14::obj-9::obj-36" : { - "parameter_longname" : "live.menu[13]" + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-23", 0 ] } -, - "obj-14::obj-9::obj-4" : { - "parameter_longname" : "live.menu[14]" + + } +, { + "patchline" : { + "destination" : [ "obj-24", 0 ], + "source" : [ "obj-25", 0 ] } -, - "obj-15::obj-4" : { - "parameter_longname" : "live.gain~[6]" + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-26", 0 ] } -, - "obj-15::obj-9::obj-32" : { - "parameter_longname" : "live.text[10]" + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-27", 0 ] } -, - "obj-15::obj-9::obj-36" : { - "parameter_longname" : "live.menu[15]" + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-28", 0 ] } -, - "obj-15::obj-9::obj-4" : { - "parameter_longname" : "live.menu[16]" + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-29", 0 ] } -, - "obj-18::obj-7::obj-32" : { - "parameter_longname" : "live.text[3]" + + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-4", 0 ] } -, - "obj-18::obj-7::obj-36" : { - "parameter_longname" : "live.menu[3]" + + } +, { + "patchline" : { + "destination" : [ "obj-12", 1 ], + "order" : 0, + "source" : [ "obj-6", 0 ] } -, - "obj-1::obj-1::obj-4" : { - "parameter_longname" : "live.menu[4]" + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "order" : 1, + "source" : [ "obj-6", 0 ] } -, - "obj-3::obj-32" : { - "parameter_longname" : "live.text[5]" + + } +, { + "patchline" : { + "destination" : [ "obj-2", 3 ], + "source" : [ "obj-8", 0 ] } -, - "obj-3::obj-36" : { - "parameter_longname" : "live.menu[5]" + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-9", 0 ] } + + } + ], + "parameters" : { + "obj-11" : [ "live.gain~", "live.gain~", 0 ], + "obj-3::obj-32" : [ "live.text[5]", "FILTER", 0 ], + "obj-3::obj-33" : [ "live.text[1]", "FILTER", 0 ], + "obj-3::obj-34" : [ "live.text[3]", "FILTER", 0 ], + "obj-6::obj-21::obj-6" : [ "live.tab[3]", "live.tab[1]", 0 ], + "obj-6::obj-35" : [ "[5]", "Level", 0 ], + "parameterbanks" : { + + } , - "obj-3::obj-4" : { - "parameter_longname" : "live.menu[6]" + "parameter_overrides" : { + "obj-3::obj-32" : { + "parameter_longname" : "live.text[5]" } } @@ -7246,27 +7024,6 @@ "type" : "gDSP", "implicit" : 1 } -, { - "name" : "oopsy.maxpat", - "bootpath" : "~/Documents/Max 8/Packages/oopsy/patchers", - "patcherrelativepath" : "../patchers", - "type" : "JSON", - "implicit" : 1 - } -, { - "name" : "oopsy.snoop.js", - "bootpath" : "~/Documents/Max 8/Packages/oopsy/javascript", - "patcherrelativepath" : "../javascript", - "type" : "TEXT", - "implicit" : 1 - } -, { - "name" : "oopsy.node4max.js", - "bootpath" : "~/Documents/Max 8/Packages/oopsy/javascript", - "patcherrelativepath" : "../javascript", - "type" : "TEXT", - "implicit" : 1 - } , { "name" : "oopsy.ctrl.smooth2.gendsp", "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", @@ -7311,38 +7068,24 @@ "implicit" : 1 } , { - "name" : "modfm.maxpat", - "bootpath" : "~/Documents/Max 8/Packages/oopsy/examples", - "patcherrelativepath" : ".", - "type" : "JSON", - "implicit" : 1 - } -, { - "name" : "pulsar.maxpat", - "bootpath" : "~/Documents/Max 8/Packages/oopsy/examples", - "patcherrelativepath" : ".", - "type" : "JSON", - "implicit" : 1 - } -, { - "name" : "crossover.maxpat", - "bootpath" : "~/Documents/Max 8/Packages/oopsy/examples", - "patcherrelativepath" : ".", + "name" : "oopsy.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/patchers", + "patcherrelativepath" : "../patchers", "type" : "JSON", "implicit" : 1 } , { - "name" : "midside.maxpat", - "bootpath" : "~/Documents/Max 8/Packages/oopsy/examples", - "patcherrelativepath" : ".", - "type" : "JSON", + "name" : "oopsy.snoop.js", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/javascript", + "patcherrelativepath" : "../javascript", + "type" : "TEXT", "implicit" : 1 } , { - "name" : "reverb.maxpat", - "bootpath" : "~/Documents/Max 8/Packages/oopsy/examples", - "patcherrelativepath" : ".", - "type" : "JSON", + "name" : "oopsy.node4max.js", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/javascript", + "patcherrelativepath" : "../javascript", + "type" : "TEXT", "implicit" : 1 } ], diff --git a/examples/pulsar.maxpat b/examples/pulsar.maxpat index b0bff78..25ca87d 100644 --- a/examples/pulsar.maxpat +++ b/examples/pulsar.maxpat @@ -10,7 +10,7 @@ } , "classnamespace" : "box", - "rect" : [ 60.0, 78.0, 712.0, 597.0 ], + "rect" : [ 934.0, 410.0, 712.0, 597.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -39,6 +39,17 @@ "subpatcher_template" : "oopsy_patch", "assistshowspatchername" : 0, "boxes" : [ { + "box" : { + "automatic" : 1, + "id" : "obj-12", + "maxclass" : "scope~", + "numinlets" : 2, + "numoutlets" : 0, + "patching_rect" : [ 233.0, 411.0, 130.0, 130.0 ] + } + + } +, { "box" : { "automatic" : 1, "id" : "obj-7", @@ -60,17 +71,6 @@ "text" : "sig~ 110" } - } -, { - "box" : { - "id" : "obj-1", - "maxclass" : "spectroscope~", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 238.0, 411.0, 418.0, 129.0 ] - } - } , { "box" : { @@ -184,7 +184,7 @@ } , { "box" : { - "args" : [ "field", "@target", "patch" ], + "args" : [ "@samplerate", "48kHz" ], "bgmode" : 0, "border" : 0, "clickthrough" : 0, @@ -221,7 +221,7 @@ } , "classnamespace" : "dsp.gen", - "rect" : [ 301.0, 134.0, 924.0, 833.0 ], + "rect" : [ 949.0, 78.0, 695.0, 814.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -251,7 +251,7 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-19", + "id" : "obj-23", "maxclass" : "newobj", "numinlets" : 3, "numoutlets" : 1, @@ -1143,14 +1143,14 @@ ] } , - "patching_rect" : [ 746.0, 600.25, 85.0, 22.0 ], + "patching_rect" : [ 740.5, 600.400002896785736, 85.0, 22.0 ], "text" : "gen @title imp" } } , { "box" : { - "id" : "obj-23", + "id" : "obj-24", "maxclass" : "newobj", "numinlets" : 3, "numoutlets" : 1, @@ -2042,14 +2042,14 @@ ] } , - "patching_rect" : [ 646.0, 600.25, 85.0, 22.0 ], + "patching_rect" : [ 642.5, 600.400002896785736, 85.0, 22.0 ], "text" : "gen @title imp" } } , { "box" : { - "id" : "obj-24", + "id" : "obj-27", "maxclass" : "newobj", "numinlets" : 3, "numoutlets" : 1, @@ -2941,14 +2941,14 @@ ] } , - "patching_rect" : [ 547.0, 600.25, 85.0, 22.0 ], + "patching_rect" : [ 543.666666999999961, 600.400002896785736, 85.0, 22.0 ], "text" : "gen @title imp" } } , { "box" : { - "id" : "obj-36", + "id" : "obj-28", "maxclass" : "newobj", "numinlets" : 3, "numoutlets" : 1, @@ -2964,7 +2964,7 @@ } , "classnamespace" : "dsp.gen", - "rect" : [ 84.0, 103.0, 600.0, 450.0 ], + "rect" : [ 1037.0, 306.0, 609.0, 710.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -3840,7 +3840,7 @@ ] } , - "patching_rect" : [ 449.0, 600.25, 85.0, 22.0 ], + "patching_rect" : [ 449.0, 600.400002896785736, 85.0, 22.0 ], "text" : "gen @title imp" } @@ -6560,7 +6560,7 @@ } , "classnamespace" : "dsp.gen", - "rect" : [ 84.0, 103.0, 600.0, 450.0 ], + "rect" : [ 1037.0, 306.0, 609.0, 710.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -7555,7 +7555,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 449.0, 642.5, 27.0, 22.0 ], + "patching_rect" : [ 449.0, 638.499999940395355, 27.0, 22.0 ], "text" : "* -1" } @@ -7662,8 +7662,8 @@ "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 218.583333333333371, 443.5, 150.0, 22.0 ], - "text" : "out 5 cv1 @min 1 @max 4" + "patching_rect" : [ 218.583333333333371, 443.5, 57.0, 22.0 ], + "text" : "out 5 cv1" } } @@ -8089,13 +8089,6 @@ "source" : [ "obj-18", 0 ] } - } -, { - "patchline" : { - "destination" : [ "obj-35", 0 ], - "source" : [ "obj-19", 0 ] - } - } , { "patchline" : { @@ -8150,31 +8143,45 @@ } , { "patchline" : { - "destination" : [ "obj-19", 0 ], + "destination" : [ "obj-23", 0 ], "source" : [ "obj-26", 3 ] } } , { "patchline" : { - "destination" : [ "obj-23", 0 ], + "destination" : [ "obj-24", 0 ], "source" : [ "obj-26", 2 ] } } , { "patchline" : { - "destination" : [ "obj-24", 0 ], + "destination" : [ "obj-27", 0 ], "source" : [ "obj-26", 1 ] } } , { "patchline" : { - "destination" : [ "obj-36", 0 ], + "destination" : [ "obj-28", 0 ], "source" : [ "obj-26", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-35", 0 ], + "source" : [ "obj-27", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 0 ], + "source" : [ "obj-28", 0 ] + } + } , { "patchline" : { @@ -8219,13 +8226,6 @@ "source" : [ "obj-35", 0 ] } - } -, { - "patchline" : { - "destination" : [ "obj-35", 0 ], - "source" : [ "obj-36", 0 ] - } - } , { "patchline" : { @@ -8282,7 +8282,7 @@ } , { "patchline" : { - "destination" : [ "obj-19", 2 ], + "destination" : [ "obj-23", 2 ], "order" : 0, "source" : [ "obj-43", 0 ] } @@ -8290,7 +8290,7 @@ } , { "patchline" : { - "destination" : [ "obj-23", 2 ], + "destination" : [ "obj-24", 2 ], "order" : 2, "source" : [ "obj-43", 0 ] } @@ -8298,7 +8298,7 @@ } , { "patchline" : { - "destination" : [ "obj-24", 2 ], + "destination" : [ "obj-27", 2 ], "order" : 4, "source" : [ "obj-43", 0 ] } @@ -8306,7 +8306,7 @@ } , { "patchline" : { - "destination" : [ "obj-36", 2 ], + "destination" : [ "obj-28", 2 ], "order" : 6, "source" : [ "obj-43", 0 ] } @@ -8400,7 +8400,7 @@ } , { "patchline" : { - "destination" : [ "obj-19", 1 ], + "destination" : [ "obj-23", 1 ], "order" : 0, "source" : [ "obj-81", 0 ] } @@ -8408,7 +8408,7 @@ } , { "patchline" : { - "destination" : [ "obj-23", 1 ], + "destination" : [ "obj-24", 1 ], "order" : 2, "source" : [ "obj-81", 0 ] } @@ -8416,7 +8416,7 @@ } , { "patchline" : { - "destination" : [ "obj-24", 1 ], + "destination" : [ "obj-27", 1 ], "order" : 4, "source" : [ "obj-81", 0 ] } @@ -8424,7 +8424,7 @@ } , { "patchline" : { - "destination" : [ "obj-36", 1 ], + "destination" : [ "obj-28", 1 ], "order" : 6, "source" : [ "obj-81", 0 ] } @@ -8507,7 +8507,7 @@ ] } , - "patching_rect" : [ 24.0, 338.0, 194.0, 35.0 ], + "patching_rect" : [ 24.0, 312.0, 194.0, 35.0 ], "saved_object_attributes" : { "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/examples/", "exportname" : "pulsar" @@ -8585,24 +8585,25 @@ } , { "patchline" : { - "destination" : [ "obj-1", 0 ], - "order" : 0, - "source" : [ "obj-3", 0 ] + "destination" : [ "obj-11", 1 ], + "order" : 1, + "source" : [ "obj-3", 1 ] } } , { "patchline" : { - "destination" : [ "obj-11", 1 ], - "source" : [ "obj-3", 1 ] + "destination" : [ "obj-11", 0 ], + "order" : 1, + "source" : [ "obj-3", 0 ] } } , { "patchline" : { - "destination" : [ "obj-11", 0 ], - "order" : 2, - "source" : [ "obj-3", 0 ] + "destination" : [ "obj-12", 0 ], + "order" : 0, + "source" : [ "obj-3", 1 ] } } @@ -8616,7 +8617,7 @@ , { "patchline" : { "destination" : [ "obj-18", 0 ], - "order" : 1, + "order" : 0, "source" : [ "obj-3", 0 ] } @@ -8656,7 +8657,60 @@ } } - ] + ], + "parameters" : { + "obj-11" : [ "live.gain~[2]", "live.gain~", 0 ], + "obj-9::obj-32" : [ "live.text[2]", "FILTER", 0 ], + "obj-9::obj-36" : [ "live.menu[1]", "live.menu", 0 ], + "obj-9::obj-4" : [ "live.menu[2]", "live.menu", 0 ], + "parameterbanks" : { + + } +, + "parameter_overrides" : { + "obj-9::obj-36" : { + "parameter_longname" : "live.menu[1]" + } +, + "obj-9::obj-4" : { + "parameter_longname" : "live.menu[2]" + } + + } +, + "inherited_shortname" : 1 + } +, + "dependency_cache" : [ { + "name" : "oopsy.ctrl.smooth3.gendsp", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", + "patcherrelativepath" : "../code", + "type" : "gDSP", + "implicit" : 1 + } +, { + "name" : "oopsy.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/patchers", + "patcherrelativepath" : "../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "oopsy.snoop.js", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/javascript", + "patcherrelativepath" : "../javascript", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "oopsy.node4max.js", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/javascript", + "patcherrelativepath" : "../javascript", + "type" : "TEXT", + "implicit" : 1 + } + ], + "autosave" : 0 } } diff --git a/examples/sdcard-minimal.maxpat b/examples/sdcard-minimal.maxpat new file mode 100644 index 0000000..afda78e --- /dev/null +++ b/examples/sdcard-minimal.maxpat @@ -0,0 +1,518 @@ +{ + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 94.0, 78.0, 856.0, 468.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-16", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 555.0, 308.0, 218.0, 33.0 ], + "presentation_linecount" : 3, + "text" : "This is how long your gen~ data object needs to be to fit the wav data into it." + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 745.0, 142.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "format" : 6, + "id" : "obj-11", + "maxclass" : "flonum", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 555.0, 272.0, 110.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 555.0, 243.0, 53.0, 22.0 ], + "text" : "* 44100." + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 618.0, 214.0, 47.0, 22.0 ], + "text" : "* 0.001" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 9, + "outlettype" : [ "float", "list", "float", "float", "float", "float", "float", "", "int" ], + "patching_rect" : [ 555.0, 181.0, 103.0, 22.0 ], + "text" : "info~ drumloop" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "live.scope~", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 105.0, 220.0, 178.0, 136.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial Italic", + "fontsize" : 18.0, + "id" : "obj-7", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 19.0, 24.0, 576.0, 27.0 ], + "text" : "Minimal example of loading WAV file into gen~ data exported by Oopsy" + } + + } +, { + "box" : { + "id" : "obj-6", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 321.0, 142.0, 196.0, 60.0 ], + "text" : "\"@drumloop_wav drumloop\" automatically loads the content of [buffer~ drumloop] into the gen~ object's [data drumloop_wav]" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "signal", "signal" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 567.0, 254.0, 530.0, 354.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-3", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 265.0, 265.0, 232.0, 47.0 ], + "text" : "Oopsy can read 16, 24 and 32 bit PCM wav files. Note that file names are case sensitive. " + } + + } +, { + "box" : { + "id" : "obj-2", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 265.0, 69.0, 232.0, 33.0 ], + "text" : "In this case, there should be a file \"drumloop.wav\" in the root of the SD card:" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 108.0, 148.0, 35.0, 22.0 ], + "text" : "out 2" + } + + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 48.0, 69.0, 65.0, 22.0 ], + "text" : "phasor 0.5" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 48.0, 119.0, 139.0, 22.0 ], + "text" : "sample drumloop_wav 2" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 265.0, 119.0, 167.0, 22.0 ], + "text" : "data drumloop_wav 153400 2" + } + + } +, { + "box" : { + "id" : "obj-10", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 265.0, 17.0, 232.0, 47.0 ], + "text" : "Any [data] whose name ends with \"_wav\" will tell Oopsy to try to load a corresponding .wav file from the SDcard" + } + + } +, { + "box" : { + "id" : "obj-7", + "linecount" : 7, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 265.0, 150.0, 240.0, 100.0 ], + "text" : "Note that the [data] still needs a length and number of channels defined\n\nWhile developing in Max, a [data foo_wav] can be automatically associated with a [buffer~ bar] by adding a \"@foo_wav bar\" attribute to the gen~ object." + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 48.0, 148.0, 35.0, 22.0 ], + "text" : "out 1" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-6", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-6", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 55.0, 142.0, 256.0, 22.0 ], + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/graham/", + "exportname" : "sdcard" + } +, + "text" : "gen~ @title sdcard @drumloop_wav drumloop", + "varname" : "sdcard" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "ezdac~", + "numinlets" : 2, + "numoutlets" : 0, + "patching_rect" : [ 55.0, 366.0, 45.0, 45.0 ] + } + + } +, { + "box" : { + "id" : "obj-14", + "lastchannelcount" : 0, + "maxclass" : "live.gain~", + "numinlets" : 2, + "numoutlets" : 5, + "outlettype" : [ "signal", "signal", "", "float", "list" ], + "parameter_enable" : 1, + "patching_rect" : [ 55.0, 220.0, 48.0, 136.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "live.gain~", + "parameter_mmax" : 6.0, + "parameter_mmin" : -70.0, + "parameter_shortname" : "live.gain~", + "parameter_type" : 0, + "parameter_unitstyle" : 4 + } + + } +, + "varname" : "live.gain~" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "float", "bang" ], + "patching_rect" : [ 555.0, 142.0, 181.0, 22.0 ], + "text" : "buffer~ drumloop drumLoop.wav" + } + + } +, { + "box" : { + "args" : [ "patch" ], + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-2", + "lockeddragscroll" : 0, + "maxclass" : "bpatcher", + "name" : "oopsy.maxpat", + "numinlets" : 1, + "numoutlets" : 0, + "offset" : [ 0.0, 0.0 ], + "patching_rect" : [ 321.0, 220.0, 128.0, 128.0 ], + "viewvisibility" : 1 + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-1", 6 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-13", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 1 ], + "source" : [ "obj-14", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-3", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 1 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "order" : 1, + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "order" : 0, + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-11", 0 ], + "source" : [ "obj-8", 0 ] + } + + } + ], + "parameters" : { + "obj-14" : [ "live.gain~", "live.gain~", 0 ], + "obj-2::obj-32" : [ "live.text[2]", "FILTER", 0 ], + "obj-2::obj-33" : [ "live.text[1]", "FILTER", 0 ], + "obj-2::obj-34" : [ "live.text[3]", "FILTER", 0 ], + "parameterbanks" : { + + } +, + "inherited_shortname" : 1 + } +, + "dependency_cache" : [ { + "name" : "oopsy.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/patchers", + "patcherrelativepath" : "../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "oopsy.snoop.js", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/javascript", + "patcherrelativepath" : "../javascript", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "oopsy.node4max.js", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/javascript", + "patcherrelativepath" : "../javascript", + "type" : "TEXT", + "implicit" : 1 + } + ], + "autosave" : 0 + } + +} diff --git a/javascript/oopsy.node4max.js b/javascript/oopsy.node4max.js index 63521b1..52b4fdb 100644 --- a/javascript/oopsy.node4max.js +++ b/javascript/oopsy.node4max.js @@ -5,21 +5,7 @@ const path = require("path"), const maxAPI = require("max-api"); const run = require(path.join(__dirname, "..", "source", "oopsy.js")); -let filter -if (os.platform() == "win32") { - filter = function(str) { - maxAPI.outlet(str) - } -} else { - filter = function(str) { - let match - if (match = label.match(/^Building/gm)) { - maxAPI.outlet(str) - } else { - maxAPI.outlet("--" + str) - } - } -} +let msgs = [] // duplicate stdout here so we can filter it and display more useful things in Max: // dup stdout to our handler: @@ -29,13 +15,21 @@ process.stdout.write = (function() { stdout_write.apply(process.stdout, arguments); let match if (match = str.match(/^oopsy (.*)/i)) { - maxAPI.outlet(match[1]) + //maxAPI.outlet(match[1]) // Node was timing out here, so we set up an interval reader instead + msgs.push(match[1]) } } })(); +setInterval(function() { + while (msgs.length) { + maxAPI.outlet(msgs.pop()) + } +}, 250) + try { run(...process.argv.slice(2)) + } catch(e) { maxAPI.post(e.message ? e.message : e, maxAPI.POST_LEVELS.ERROR); } \ No newline at end of file diff --git a/javascript/oopsy.snoop.js b/javascript/oopsy.snoop.js index e31b3b1..a3ff7d8 100644 --- a/javascript/oopsy.snoop.js +++ b/javascript/oopsy.snoop.js @@ -3,10 +3,14 @@ autowatch = 1; inlets = 2; outlets = 3; -var path = "" -var target = "patch" -var samplerate = "48" -var sep = "/" +var path = ""; +var target = "patch"; +var samplerate = "48kHz"; +var blocksize = "48"; +var boost = 1; +var fastmath = 0; +var sep = "/"; +var dict = new Dict(); function bang() { configure(true); @@ -30,9 +34,11 @@ function configure(doExport) { var names = []; var cpps = []; + var errors = 0; // find gen~ objects in a patcher: function find_gens(pat) { + dict.clear(); var default_name = pat.name || "gen"; // iterate all gen~ objects in the patcher // to set their export name, path, and scripting name @@ -44,15 +50,11 @@ function configure(doExport) { } else if (obj.maxclass.toString() == "gen~") { var name = default_name; - if (obj.getattr("exportname")) { - name = obj.getattr("exportname").toString(); - } else if (obj.getattr("title")) { + if (obj.getattr("title")) { name = obj.getattr("title").toString(); } else if (obj.getattr("gen")) { name = obj.getattr("gen").toString(); - } else if (obj.varname.toString()) { - name = obj.varname.toString(); - } + } // sanitize: name = safename(name); // sanitize via scripting name too: @@ -65,9 +67,60 @@ function configure(doExport) { obj.message("exportname", name); // ensure each gen~ has an export path configured: obj.message("exportfolder", export_path); + + if (doExport) { + obj.message("export_json"); + + // this might not work on the first pass, since it can take a little time. + dict.import_json(obj.getattr("exportfolder") + obj.getattr("exportname") + ".json") + + var ast = JSON.parse(dict.stringify()) + if (ast.class == "Module") { + var nodes = ast.block.children; + for (var i=0; i 0 && chans > 0) { + var wavname = node.name + ".wav" + // write out that file so it can be referenced: + buffer.send("write", obj.getattr("exportfolder") + wavname); + //post("found buffer mapped Data", node.name, bufname, wavname, frames, chans) + } + } else if (node.typename == "Buffer") { + // find the corresponding buffer~: + var bufname = obj.getattr(node.name) + var buffer = new Buffer(bufname) + var frames = buffer.framecount() + var chans = buffer.channelcount() + + if (frames < 0 || chans < 0) { + error("oopsy: can't find buffer~ "+bufname); + return; + } + + // write it out: + //buffer.send("write", obj.getattr("exportfolder") + bufname + ".wav"); + + post("oopsy: consider replacing [buffer "+node.name+"] with [data "+node.name+" "+frames+" "+chans+"]\n"); + if (node.name != bufname) { + post("and set @"+node.name, bufname, "on the gen~\n"); + } + error("gen~ cannot export with [buffer] objects\n") + errors = 1; + return; + } + } + } + } - if (doExport) obj.message("exportcode"); - + if (doExport) { + obj.message("exportcode"); + } names.push(name); cpps.push(path + sep + name + ".cpp") @@ -77,15 +130,20 @@ function configure(doExport) { } find_gens(pat, names, cpps, export_path) - if (names.length < 1) { - post("oopsy: didn't find any gen~ objects\n") + if (errors) { + post("oopsy: aborting due to errors\n") + return; + } else if (names.length < 1) { + post("oopsy: didn't find any valid gen~ objects\n") return; } var name = names.join("_") outlet(1, name) - var args = [target, samplerate].concat(cpps); + var args = [target, samplerate, "block"+blocksize].concat(cpps); + if (boost) args.push("boost"); + if (fastmath) args.push("fastmath"); outlet(0, args) } diff --git a/media/oopsy_noise_engineering_versio.png b/media/oopsy_noise_engineering_versio.png new file mode 100644 index 0000000..57e5e68 Binary files /dev/null and b/media/oopsy_noise_engineering_versio.png differ diff --git a/patchers/oopsy.maxpat b/patchers/oopsy.maxpat index 6f30098..8c83ea1 100644 --- a/patchers/oopsy.maxpat +++ b/patchers/oopsy.maxpat @@ -10,7 +10,7 @@ } , "classnamespace" : "box", - "rect" : [ 460.0, 133.0, 641.0, 773.0 ], + "rect" : [ 356.0, 113.0, 1246.0, 808.0 ], "bglocked" : 0, "openinpresentation" : 1, "default_fontsize" : 12.0, @@ -40,101 +40,765 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-17", + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 54.0, 260.0, 97.0, 22.0 ], + "text" : "loadmess 48kHz" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 326.5, 655.0, 35.0, 22.0 ], + "text" : "clear" + } + + } +, { + "box" : { + "id" : "obj-54", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 399.5, 615.0, 96.0, 22.0 ], + "text" : "prepend append" + } + + } +, { + "box" : { + "id" : "obj-50", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 399.5, 588.0, 38.0, 22.0 ], + "text" : "zl.reg" + } + + } +, { + "box" : { + "id" : "obj-37", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 742.0, 546.5, 33.0, 22.0 ], + "text" : "== 0" + } + + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 742.0, 491.0, 70.0, 22.0 ], + "text" : "loadmess 1" + } + + } +, { + "box" : { + "automation" : "Off", + "automationon" : "On", + "id" : "obj-34", + "maxclass" : "live.text", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "parameter_enable" : 1, + "patching_rect" : [ 735.0, 298.0, 52.5, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 75.0, 37.0, 54.0, 15.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_enum" : [ "Off", "On" ], + "parameter_initial" : [ 0 ], + "parameter_linknames" : 1, + "parameter_longname" : "live.text[3]", + "parameter_mmax" : 1, + "parameter_shortname" : "FILTER", + "parameter_type" : 2 + } + + } +, + "text" : "FASTMATH", + "texton" : "FASTMATH", + "varname" : "live.text[3]" + } + + } +, { + "box" : { + "automation" : "Off", + "automationon" : "On", + "id" : "obj-33", + "maxclass" : "live.text", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "parameter_enable" : 1, + "patching_rect" : [ 554.0, 298.0, 43.5, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 37.0, 37.0, 40.0, 15.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_enum" : [ "Off", "On" ], + "parameter_initial" : [ 0 ], + "parameter_linknames" : 1, + "parameter_longname" : "live.text[1]", + "parameter_mmax" : 1, + "parameter_shortname" : "FILTER", + "parameter_type" : 2 + } + + } +, + "text" : "BOOST", + "texton" : "BOOST", + "varname" : "live.text[1]" + } + + } +, { + "box" : { + "fontsize" : 9.0, + "id" : "obj-24", + "items" : [ 48, ",", 32, ",", 16, ",", 8, ",", 4, ",", 2, ",", 1 ], + "maxclass" : "umenu", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "int", "", "" ], + "parameter_enable" : 0, + "patching_rect" : [ 179.0, 315.0, 85.0, 19.0 ], + "presentation" : 1, + "presentation_rect" : [ 86.0, 19.0, 42.0, 19.0 ] + } + + } +, { + "box" : { + "id" : "obj-25", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 76.5, 235.0, 94.0, 22.0 ], + "patching_rect" : [ 206.0, 287.191986000000043, 94.0, 22.0 ], "text" : "prepend symbol" } - } -, { - "box" : { - "id" : "obj-10", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "bang", "" ], - "patching_rect" : [ 82.5, 291.0, 29.5, 22.0 ], - "text" : "t b l" - } + } +, { + "box" : { + "id" : "obj-27", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 212.0, 344.25, 149.0, 22.0 ], + "text" : "prepend setprop blocksize" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 750.0, 270.191986000000043, 70.0, 22.0 ], + "text" : "loadmess 0" + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 735.0, 344.25, 145.0, 22.0 ], + "text" : "prepend setprop fastmath" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 567.5, 270.191986000000043, 70.0, 22.0 ], + "text" : "loadmess 1" + } + + } +, { + "box" : { + "id" : "obj-63", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 580.0, 233.0, 150.0, 20.0 ], + "text" : "boost CPU performance" + } + + } +, { + "box" : { + "fontsize" : 9.0, + "id" : "obj-62", + "items" : [ "96kHz", ",", "48kHz", ",", "32kHz" ], + "maxclass" : "umenu", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "int", "", "" ], + "parameter_enable" : 0, + "patching_rect" : [ 4.0, 315.0, 85.0, 19.0 ], + "presentation" : 1, + "presentation_rect" : [ 38.0, 19.0, 50.0, 19.0 ] + } + + } +, { + "box" : { + "automation" : "Off", + "automationon" : "On", + "id" : "obj-32", + "maxclass" : "live.text", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "parameter_enable" : 1, + "patching_rect" : [ 742.0, 516.0, 62.0, 16.0 ], + "presentation" : 1, + "presentation_rect" : [ -1.0, 37.0, 39.999999642372131, 15.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_enum" : [ "Off", "On" ], + "parameter_initial" : [ 0 ], + "parameter_linknames" : 1, + "parameter_longname" : "live.text[2]", + "parameter_mmax" : 1, + "parameter_shortname" : "FILTER", + "parameter_type" : 2 + } + + } +, + "text" : "QUIET", + "texton" : "QUIET", + "varname" : "live.text[2]" + } + + } +, { + "box" : { + "id" : "obj-57", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 554.0, 344.25, 129.0, 22.0 ], + "text" : "prepend setprop boost" + } + + } +, { + "box" : { + "fontsize" : 10.0, + "id" : "obj-81", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 377.5, 263.0, 41.0, 19.0 ], + "presentation" : 1, + "presentation_rect" : [ 86.0, 0.0, 42.0, 19.0 ], + "text" : "Browse" + } + + } +, { + "box" : { + "fontsize" : 9.0, + "id" : "obj-76", + "items" : [ "patch", ",", "field", ",", "petal", ",", "pod", ",", "versio" ], + "maxclass" : "umenu", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "int", "", "" ], + "parameter_enable" : 0, + "patching_rect" : [ 330.5, 315.0, 100.0, 19.0 ], + "presentation" : 1, + "presentation_rect" : [ 38.0, 0.0, 50.0, 19.0 ] + } + + } +, { + "box" : { + "id" : "obj-75", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 839.0, 277.0, 807.0, 498.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-31", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 522.0, 296.0, 29.5, 22.0 ], + "text" : "t l l" + } + + } +, { + "box" : { + "id" : "obj-29", + "maxclass" : "newobj", + "numinlets" : 6, + "numoutlets" : 6, + "outlettype" : [ "", "", "", "", "", "" ], + "patching_rect" : [ 59.0, 140.0, 207.0, 22.0 ], + "text" : "routepass patch field petal pod versio" + } + + } +, { + "box" : { + "id" : "obj-28", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 464.0, 102.0, 62.0, 20.0 ], + "text" : "browse" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-25", + "index" : 2, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 430.0, 101.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "malconformed_path" ], + "patching_rect" : [ 640.0, 294.0, 121.0, 22.0 ], + "text" : "t malconformed_path" + } + + } +, { + "box" : { + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "bang", "" ], + "patching_rect" : [ 640.0, 267.0, 34.0, 22.0 ], + "text" : "sel 0" + } + + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 430.0, 257.0, 81.0, 22.0 ], + "text" : "prepend error" + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 430.0, 281.0, 32.0, 22.0 ], + "text" : "print" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 430.0, 209.0, 111.0, 22.0 ], + "text" : "routepass notfound" + } + + } +, { + "box" : { + "id" : "obj-27", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 430.0, 179.0, 77.0, 22.0 ], + "text" : "absolutepath", + "varname" : "example[4]" + } + + } +, { + "box" : { + "id" : "obj-72", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "int" ], + "patching_rect" : [ 522.0, 237.0, 137.0, 22.0 ], + "text" : "conformpath native boot" + } + + } +, { + "box" : { + "id" : "obj-53", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 532.5, 330.0, 96.0, 22.0 ], + "text" : "prepend append" + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "patching_rect" : [ 430.0, 140.0, 103.0, 22.0 ], + "text" : "opendialog JSON" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 16.0, 47.0, 413.0, 22.0 ], + "text" : "clear, append patch, append field, append petal, append pod, append versio" + } + + } +, { + "box" : { + "id" : "obj-37", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 59.0, 330.0, 94.0, 22.0 ], + "text" : "prepend symbol" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-73", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 59.0, 101.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-74", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 16.0, 390.0, 30.0, 30.0 ] + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-22", 0 ], + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-72", 0 ], + "source" : [ "obj-16", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-27", 0 ], + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-74", 0 ], + "midpoints" : [ 25.5, 229.0, 25.5, 229.0 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-24", 0 ], + "source" : [ "obj-23", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 0 ], + "source" : [ "obj-24", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-25", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-27", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-27", 0 ], + "source" : [ "obj-29", 5 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "source" : [ "obj-29", 4 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "source" : [ "obj-29", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "source" : [ "obj-29", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "source" : [ "obj-29", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "source" : [ "obj-29", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "midpoints" : [ 531.5, 323.5, 68.5, 323.5 ], + "source" : [ "obj-31", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-53", 0 ], + "source" : [ "obj-31", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-74", 0 ], + "midpoints" : [ 68.5, 370.5, 25.5, 370.5 ], + "source" : [ "obj-37", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-74", 0 ], + "midpoints" : [ 542.0, 370.5, 25.5, 370.5 ], + "source" : [ "obj-53", 0 ] + } - } -, { - "box" : { - "id" : "obj-16", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 93.0, 323.25, 159.0, 22.0 ], - "text" : "prepend setprop samplerate" - } + } +, { + "patchline" : { + "destination" : [ "obj-23", 0 ], + "source" : [ "obj-72", 1 ] + } - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 49.5, 204.0, 89.0, 22.0 ], - "text" : "loadmess set 1" - } + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-72", 0 ] + } - } -, { - "box" : { - "id" : "obj-4", - "maxclass" : "live.menu", - "numinlets" : 1, - "numoutlets" : 3, - "outlettype" : [ "", "", "float" ], - "parameter_enable" : 1, - "patching_rect" : [ 76.5, 269.0, 31.0, 15.0 ], - "presentation" : 1, - "presentation_rect" : [ 31.0, 13.5, 45.0, 15.0 ], - "saved_attribute_attributes" : { - "valueof" : { - "parameter_enum" : [ "96kHz", "48kHz", "32kHz" ], - "parameter_initial" : [ 0 ], - "parameter_longname" : "live.menu[2]", - "parameter_mmax" : 2, - "parameter_shortname" : "live.menu", - "parameter_type" : 2 - } + } +, { + "patchline" : { + "destination" : [ "obj-29", 0 ], + "source" : [ "obj-73", 0 ] + } + } + ] + } +, + "patching_rect" : [ 330.5, 287.191986000000043, 66.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" } , - "varname" : "live.menu[1]" + "text" : "p gettarget" } } , { "box" : { - "id" : "obj-20", + "id" : "obj-17", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 399.0, 421.0, 72.0, 22.0 ], - "text" : "prepend set" + "patching_rect" : [ 31.0, 287.191986000000043, 94.0, 22.0 ], + "text" : "prepend symbol" } } , { "box" : { - "id" : "obj-18", - "maxclass" : "live.comment", + "id" : "obj-16", + "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 399.0, 446.0, 433.0, 18.0 ], - "presentation" : 1, - "presentation_rect" : [ 76.0, 13.5, 318.0, 18.0 ], - "textjustification" : 0 + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 37.0, 344.25, 159.0, 22.0 ], + "text" : "prepend setprop samplerate" } } @@ -145,7 +809,7 @@ "numinlets" : 3, "numoutlets" : 3, "outlettype" : [ "", "", "" ], - "patching_rect" : [ 552.0, 594.0, 106.0, 22.0 ], + "patching_rect" : [ 650.0, 615.0, 106.0, 22.0 ], "text" : "route stdout stderr" } @@ -157,7 +821,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "bang" ], - "patching_rect" : [ 222.0, 166.0, 58.0, 22.0 ], + "patching_rect" : [ 330.5, 113.75, 58.0, 22.0 ], "text" : "loadbang" } @@ -169,7 +833,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 516.0, 193.0, 150.0, 33.0 ], + "patching_rect" : [ 514.0, 27.0, 120.0, 33.0 ], "text" : "saving a patcher will also trigger compile" } @@ -181,7 +845,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 521.0, 323.25, 150.0, 33.0 ], + "patching_rect" : [ 614.0, 139.0, 150.0, 33.0 ], "text" : "audio must be on for exportcode to work" } @@ -193,7 +857,7 @@ "numinlets" : 2, "numoutlets" : 2, "outlettype" : [ "", "int" ], - "patching_rect" : [ 425.0, 323.25, 91.0, 22.0 ], + "patching_rect" : [ 591.0, 183.75, 91.0, 22.0 ], "text" : "adstatus switch" } @@ -205,7 +869,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "bang" ], - "patching_rect" : [ 445.0, 204.0, 61.0, 22.0 ], + "patching_rect" : [ 514.0, 64.0, 61.0, 22.0 ], "text" : "savebang" } @@ -219,7 +883,7 @@ "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 222.0, 53.0, 30.0, 30.0 ] + "patching_rect" : [ 320.0, 27.0, 30.0, 30.0 ] } } @@ -228,10 +892,10 @@ "id" : "obj-41", "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "bang", "int" ], - "patching_rect" : [ 406.0, 291.0, 32.0, 22.0 ], - "text" : "t b 1" + "numoutlets" : 3, + "outlettype" : [ "bang", "outputvalue", "int" ], + "patching_rect" : [ 514.0, 150.0, 97.0, 22.0 ], + "text" : "t b outputvalue 1" } } @@ -242,33 +906,21 @@ "numinlets" : 2, "numoutlets" : 2, "outlettype" : [ "bang", "" ], - "patching_rect" : [ 222.0, 90.0, 136.0, 22.0 ], + "patching_rect" : [ 320.0, 64.0, 136.0, 22.0 ], "text" : "sel bang" } - } -, { - "box" : { - "id" : "obj-37", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 222.0, 235.0, 94.0, 22.0 ], - "text" : "prepend symbol" - } - } , { "box" : { "id" : "obj-21", - "linecount" : 3, + "linecount" : 4, "maxclass" : "newobj", - "numinlets" : 4, - "numoutlets" : 4, - "outlettype" : [ "", "", "", "" ], - "patching_rect" : [ 339.0, 166.0, 73.0, 49.0 ], - "text" : "route target samplerate done" + "numinlets" : 5, + "numoutlets" : 5, + "outlettype" : [ "", "", "", "", "" ], + "patching_rect" : [ 437.0, 113.75, 71.0, 62.0 ], + "text" : "route samplerate blocksize target done" } } @@ -279,7 +931,7 @@ "numinlets" : 1, "numoutlets" : 2, "outlettype" : [ "", "" ], - "patching_rect" : [ 222.0, 193.0, 72.0, 22.0 ], + "patching_rect" : [ 330.5, 140.75, 72.0, 22.0 ], "text" : "patcherargs" } @@ -291,7 +943,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 39.5, 65.0, 152.0, 47.0 ], + "patching_rect" : [ 164.5, 27.0, 152.0, 47.0 ], "text" : "bang will trigger compile,\nother messages route to patcherattrs parser first" } @@ -314,7 +966,7 @@ } , "classnamespace" : "box", - "rect" : [ 0.0, 0.0, 640.0, 480.0 ], + "rect" : [ 84.0, 103.0, 640.0, 480.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -461,7 +1113,7 @@ ] } , - "patching_rect" : [ 273.0, 538.0, 53.0, 22.0 ], + "patching_rect" : [ 371.0, 655.0, 53.0, 22.0 ], "saved_object_attributes" : { "description" : "", "digest" : "", @@ -478,96 +1130,31 @@ "id" : "obj-51", "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "clear" ], - "patching_rect" : [ 329.5, 538.0, 41.0, 22.0 ], - "text" : "t clear" + "numoutlets" : 2, + "outlettype" : [ "bang", "clear" ], + "patching_rect" : [ 399.5, 562.0, 127.0, 22.0 ], + "text" : "t b clear" } } , { "box" : { + "bgcolor" : [ 0.184313725490196, 0.184313725490196, 0.184313725490196, 1.0 ], + "bordercolor" : [ 0.223529411764706, 0.223529411764706, 0.223529411764706, 1.0 ], + "fontsize" : 10.0, "id" : "obj-47", "maxclass" : "textedit", "numinlets" : 1, "numoutlets" : 4, "outlettype" : [ "", "int", "", "" ], "parameter_enable" : 0, - "patching_rect" : [ 273.0, 573.0, 136.0, 75.0 ], + "patching_rect" : [ 371.0, 690.0, 114.0, 58.0 ], "presentation" : 1, - "presentation_rect" : [ 0.0, 32.0, 128.0, 92.0 ], + "presentation_rect" : [ 0.0, 48.0, 129.0, 80.0 ], "readonly" : 1, - "separator" : "newline" - } - - } -, { - "box" : { - "id" : "obj-36", - "maxclass" : "live.menu", - "numinlets" : 1, - "numoutlets" : 3, - "outlettype" : [ "", "", "float" ], - "parameter_enable" : 1, - "patching_rect" : [ 222.0, 269.0, 100.0, 15.0 ], - "presentation" : 1, - "presentation_rect" : [ 31.0, 0.0, 45.0, 15.0 ], - "saved_attribute_attributes" : { - "valueof" : { - "parameter_enum" : [ "patch", "field", "petal", "pod" ], - "parameter_longname" : "live.menu[1]", - "parameter_mmax" : 3, - "parameter_shortname" : "live.menu", - "parameter_type" : 2 - } - - } -, - "varname" : "live.menu" - } - - } -, { - "box" : { - "automation" : "Off", - "automationon" : "On", - "id" : "obj-32", - "maxclass" : "live.text", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "parameter_enable" : 1, - "patching_rect" : [ 502.0, 533.191986000000043, 62.0, 16.0 ], - "presentation" : 1, - "presentation_rect" : [ 76.0, 0.0, 52.0, 15.0 ], - "saved_attribute_attributes" : { - "valueof" : { - "parameter_enum" : [ "Off", "On" ], - "parameter_initial" : [ 0 ], - "parameter_linknames" : 1, - "parameter_longname" : "live.text[2]", - "parameter_mmax" : 1, - "parameter_shortname" : "FILTER", - "parameter_type" : 2 - } - - } -, - "text" : "DISCREET", - "texton" : "VERBOSE", - "varname" : "live.text[2]" - } - - } -, { - "box" : { - "id" : "obj-6", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "bang", "" ], - "patching_rect" : [ 262.5, 291.0, 29.5, 22.0 ], - "text" : "t b l" + "rounded" : 0.0, + "separator" : "newline", + "textcolor" : [ 1.0, 1.0, 1.0, 1.0 ] } } @@ -578,7 +1165,7 @@ "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 552.0, 562.0, 32.0, 22.0 ], + "patching_rect" : [ 650.0, 583.0, 32.0, 22.0 ], "text" : "gate" } @@ -590,8 +1177,8 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 49.5, 166.0, 150.0, 33.0 ], - "text" : "choose device target to compile for" + "patching_rect" : [ 41.5, 160.0, 150.0, 33.0 ], + "text" : "choose device target & options to compile for" } } @@ -602,7 +1189,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 39.5, 466.0, 224.0, 74.0 ], + "patching_rect" : [ 137.5, 487.0, 224.0, 74.0 ], "text" : "the node.js script is a thin wrapper around oopsy.js, which will generate the glue code between gen~ export and the Daisy APIs, compile it, and try to upload it to a device." } @@ -614,7 +1201,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 39.5, 376.000003099441528, 223.5, 60.0 ], + "patching_rect" : [ 137.5, 397.000003099441528, 223.5, 60.0 ], "text" : "oopsy.snoop will find all the gen~ objects in the parent patcher, configure them for export, trigger the export, then notify the node.js script" } @@ -626,7 +1213,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 456.0, 376.000003099441528, 114.0, 33.0 ], + "patching_rect" : [ 554.0, 397.000003099441528, 114.0, 33.0 ], "text" : "turn Max-style path into OS path" } @@ -638,7 +1225,7 @@ "numinlets" : 2, "numoutlets" : 4, "outlettype" : [ "dictionary", "", "", "" ], - "patching_rect" : [ 482.0, 594.0, 50.5, 22.0 ], + "patching_rect" : [ 580.0, 615.0, 50.5, 22.0 ], "saved_object_attributes" : { "embed" : 0, "parameter_enable" : 0, @@ -655,7 +1242,7 @@ "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 552.0, 626.0, 114.0, 22.0 ], + "patching_rect" : [ 650.0, 647.0, 114.0, 22.0 ], "text" : "print oopsy-verbose" } @@ -667,7 +1254,7 @@ "numinlets" : 2, "numoutlets" : 2, "outlettype" : [ "", "" ], - "patching_rect" : [ 482.0, 562.0, 65.0, 22.0 ], + "patching_rect" : [ 580.0, 583.0, 65.0, 22.0 ], "text" : "route error" } @@ -679,7 +1266,7 @@ "numinlets" : 2, "numoutlets" : 2, "outlettype" : [ "", "" ], - "patching_rect" : [ 482.0, 501.0, 102.0, 22.0 ], + "patching_rect" : [ 580.0, 522.0, 102.0, 22.0 ], "text" : "route terminated" } @@ -692,9 +1279,9 @@ "numoutlets" : 1, "outlettype" : [ "bang" ], "parameter_enable" : 0, - "patching_rect" : [ 406.0, 235.0, 30.0, 30.0 ], + "patching_rect" : [ 514.0, 116.0, 28.0, 28.0 ], "presentation" : 1, - "presentation_rect" : [ 0.0, 0.0, 30.0, 30.0 ] + "presentation_rect" : [ 0.0, 0.0, 38.0, 38.0 ] } } @@ -707,7 +1294,7 @@ "numinlets" : 1, "numoutlets" : 2, "outlettype" : [ "", "" ], - "patching_rect" : [ 273.0, 466.0, 228.0, 26.0 ], + "patching_rect" : [ 371.0, 494.0, 228.0, 26.0 ], "saved_object_attributes" : { "autostart" : 0, "defer" : 0, @@ -725,7 +1312,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 273.0, 430.0, 111.0, 22.0 ], + "patching_rect" : [ 371.0, 451.0, 111.0, 22.0 ], "text" : "prepend script start" } @@ -737,7 +1324,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 273.0, 323.25, 130.0, 22.0 ], + "patching_rect" : [ 371.0, 344.25, 130.0, 22.0 ], "text" : "prepend setprop target" } @@ -882,7 +1469,7 @@ ] } , - "patching_rect" : [ 397.0, 376.000003099441528, 54.0, 22.0 ], + "patching_rect" : [ 495.0, 397.000003099441528, 54.0, 22.0 ], "saved_object_attributes" : { "description" : "", "digest" : "", @@ -903,7 +1490,7 @@ "numinlets" : 2, "numoutlets" : 3, "outlettype" : [ "", "", "" ], - "patching_rect" : [ 273.0, 376.000003099441528, 114.0, 26.0 ], + "patching_rect" : [ 371.0, 397.000003099441528, 114.0, 26.0 ], "saved_object_attributes" : { "filename" : "oopsy.snoop", "parameter_enable" : 0 @@ -923,8 +1510,8 @@ } , { "patchline" : { - "destination" : [ "obj-16", 0 ], - "source" : [ "obj-10", 1 ] + "destination" : [ "obj-47", 0 ], + "source" : [ "obj-10", 0 ] } } @@ -945,7 +1532,7 @@ , { "patchline" : { "destination" : [ "obj-5", 0 ], - "midpoints" : [ 282.5, 363.750001549720764, 282.5, 363.750001549720764 ], + "midpoints" : [ 380.5, 384.750001549720764, 380.5, 384.750001549720764 ], "source" : [ "obj-14", 0 ] } @@ -959,7 +1546,7 @@ } , { "patchline" : { - "destination" : [ "obj-37", 0 ], + "destination" : [ "obj-75", 0 ], "source" : [ "obj-15", 0 ] } @@ -967,21 +1554,30 @@ , { "patchline" : { "destination" : [ "obj-5", 0 ], - "midpoints" : [ 102.5, 360.125001549720764, 282.5, 360.125001549720764 ], + "midpoints" : [ 46.5, 381.125001549720764, 380.5, 381.125001549720764 ], "source" : [ "obj-16", 0 ] } } , { "patchline" : { - "destination" : [ "obj-4", 0 ], + "destination" : [ "obj-62", 0 ], "source" : [ "obj-17", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "midpoints" : [ 744.5, 381.125001549720764, 380.5, 381.125001549720764 ], + "source" : [ "obj-19", 0 ] + } + } , { "patchline" : { "destination" : [ "obj-13", 1 ], + "midpoints" : [ 380.5, 551.5, 672.5, 551.5 ], "order" : 0, "source" : [ "obj-2", 0 ] } @@ -1004,31 +1600,47 @@ } , { "patchline" : { - "destination" : [ "obj-18", 0 ], - "source" : [ "obj-20", 0 ] + "destination" : [ "obj-17", 0 ], + "midpoints" : [ 446.5, 211.0, 40.5, 211.0 ], + "source" : [ "obj-21", 0 ] } } , { "patchline" : { - "destination" : [ "obj-17", 0 ], - "midpoints" : [ 366.5, 231.0, 86.0, 231.0 ], + "destination" : [ "obj-25", 0 ], + "midpoints" : [ 459.5, 220.470993000000021, 215.5, 220.470993000000021 ], "source" : [ "obj-21", 1 ] } } , { "patchline" : { - "destination" : [ "obj-37", 0 ], - "midpoints" : [ 348.5, 227.5, 231.5, 227.5 ], - "source" : [ "obj-21", 0 ] + "destination" : [ "obj-75", 0 ], + "midpoints" : [ 472.5, 230.970993000000021, 340.0, 230.970993000000021 ], + "source" : [ "obj-21", 2 ] } } , { "patchline" : { - "destination" : [ "obj-7", 0 ], - "source" : [ "obj-21", 2 ] + "destination" : [ "obj-27", 0 ], + "source" : [ "obj-24", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-24", 0 ], + "source" : [ "obj-25", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "midpoints" : [ 221.5, 381.125001549720764, 380.5, 381.125001549720764 ], + "source" : [ "obj-27", 0 ] } } @@ -1055,10 +1667,24 @@ } , { "patchline" : { - "destination" : [ "obj-13", 0 ], + "destination" : [ "obj-37", 0 ], "source" : [ "obj-32", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-57", 0 ], + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-34", 0 ] + } + } , { "patchline" : { @@ -1069,14 +1695,14 @@ } , { "patchline" : { - "destination" : [ "obj-6", 0 ], - "source" : [ "obj-36", 1 ] + "destination" : [ "obj-32", 0 ], + "source" : [ "obj-36", 0 ] } } , { "patchline" : { - "destination" : [ "obj-36", 0 ], + "destination" : [ "obj-13", 0 ], "source" : [ "obj-37", 0 ] } @@ -1091,21 +1717,22 @@ , { "patchline" : { "destination" : [ "obj-7", 0 ], - "midpoints" : [ 231.5, 131.0, 415.5, 131.0 ], + "midpoints" : [ 329.5, 96.0, 523.5, 96.0 ], "source" : [ "obj-38", 0 ] } } , { "patchline" : { - "destination" : [ "obj-10", 0 ], - "source" : [ "obj-4", 1 ] + "destination" : [ "obj-33", 0 ], + "source" : [ "obj-4", 0 ] } } , { "patchline" : { "destination" : [ "obj-13", 1 ], + "midpoints" : [ 380.5, 482.5, 672.5, 482.5 ], "order" : 0, "source" : [ "obj-40", 0 ] } @@ -1122,7 +1749,7 @@ , { "patchline" : { "destination" : [ "obj-51", 0 ], - "midpoints" : [ 282.5, 458.5, 339.0, 458.5 ], + "midpoints" : [ 380.5, 481.5, 409.0, 481.5 ], "order" : 1, "source" : [ "obj-40", 0 ] } @@ -1130,15 +1757,33 @@ } , { "patchline" : { - "destination" : [ "obj-48", 0 ], + "destination" : [ "obj-33", 0 ], + "order" : 1, + "source" : [ "obj-41", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "midpoints" : [ 562.5, 257.0, 744.5, 257.0 ], + "order" : 0, "source" : [ "obj-41", 1 ] } + } +, { + "patchline" : { + "destination" : [ "obj-48", 0 ], + "midpoints" : [ 601.5, 172.875, 600.5, 172.875 ], + "source" : [ "obj-41", 2 ] + } + } , { "patchline" : { "destination" : [ "obj-5", 0 ], - "midpoints" : [ 415.5, 358.500001549720764, 282.5, 358.500001549720764 ], + "midpoints" : [ 523.5, 379.500001549720764, 380.5, 379.500001549720764 ], "source" : [ "obj-41", 0 ] } @@ -1187,29 +1832,66 @@ } , { "patchline" : { - "destination" : [ "obj-20", 0 ], + "destination" : [ "obj-40", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-50", 1 ], "source" : [ "obj-5", 1 ] } } , { "patchline" : { - "destination" : [ "obj-40", 0 ], - "source" : [ "obj-5", 0 ] + "destination" : [ "obj-54", 0 ], + "source" : [ "obj-50", 0 ] } } , { "patchline" : { "destination" : [ "obj-47", 0 ], + "midpoints" : [ 517.0, 684.5, 380.5, 684.5 ], + "source" : [ "obj-51", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-50", 0 ], "source" : [ "obj-51", 0 ] } } , { "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-6", 1 ] + "destination" : [ "obj-47", 0 ], + "source" : [ "obj-54", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "midpoints" : [ 563.5, 381.125001549720764, 380.5, 381.125001549720764 ], + "source" : [ "obj-57", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "source" : [ "obj-6", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-62", 1 ] } } @@ -1222,8 +1904,28 @@ } , { "patchline" : { - "destination" : [ "obj-4", 0 ], - "midpoints" : [ 59.0, 261.5, 86.0, 261.5 ], + "destination" : [ "obj-76", 0 ], + "source" : [ "obj-75", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-76", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-75", 1 ], + "source" : [ "obj-81", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], "source" : [ "obj-9", 0 ] } @@ -1231,8 +1933,8 @@ ], "parameters" : { "obj-32" : [ "live.text[2]", "FILTER", 0 ], - "obj-36" : [ "live.menu[1]", "live.menu", 0 ], - "obj-4" : [ "live.menu[2]", "live.menu", 0 ], + "obj-33" : [ "live.text[1]", "FILTER", 0 ], + "obj-34" : [ "live.text[3]", "FILTER", 0 ], "parameterbanks" : { } diff --git a/source/changelog.md b/source/changelog.md index 05fbf2c..ec36d7a 100644 --- a/source/changelog.md +++ b/source/changelog.md @@ -1,5 +1,50 @@ # Changelog +- Params: + - Params like "knob1_int_foo" or "knob2_bool_bar" will be locked to integer/bool values within their respective @min/@max ranges +- MIDI: + - API change: [out N midi*] no longer supported. Use [history midi_*_out] instead. Raw MIDI output was causing unpredictable behaviour and could overload the MIDI baud rate too easily. Better handlers for specific MIDI messages have been added instead. + - Added support for a few [param] midi handling types such as midi_cc, midi_bend, midi_vel, midi_clock, etc. + - Added support for history-based MIDI outputs: + - [history midi_cc1_out], [history midi_cc11_ch2_out], etc.: 0..1 outputs midi CC (default channel 1) + - [history midi_bend_out], [history midi_bend_ch2_out], etc.: -1..1 outputs midi CC (default channel 1) + - [history midi_press_out], [history midi_press_ch2_out], etc.: 0..1 outputs midi channel pressure (default channel 1) + - [history midi_program_out], [history midi_program_ch2_out], etc.: 0..127 outputs midi program change (default channel 1) + - [history midi_drum36_out] etc.: 0..1 outputs note velocity on channel 10 + - [history midi_vel36_out], [history midi_vel36_ch2_out] etc.: 0..1 outputs note velocity (default channel 1) + - [history midi_clock_out], [history midi_stop_out], [history midi_start_out], [history midi_continue_out], [history midi_reset_out], [history midi_sense_out]: rising edge gate outputs transport etc. midi messages + - Added midi note output mechanics: + - [history midi_note1_pitch_out] and [history midi_note1_vel_out] at minimum required to create a note out. Use note1, note2, noteN etc. to define your polyphony. + - [history midi_note1_chan_out] and [history midi_note1_press_out] are optional for setting a midi channel (other than channel 1) and polyphonic pressure (aka polyphonic aftertouch) + - Added [in N midithru], which works the same as [in N midi] (giving you raw bytes scaled by 1/256), but also passes all MIDI received in the hardware input through to the hardware output + - Moved midi handling into app-level code to support custom midi handlers as [param]; raw midi handling not generated if not used + - Fix: ensure program-change midi handling is generated for multi-app even when no apps used midi +- Data/Buffer & SDCard: + - [data foo_wav 512 2] will try to auto-load from "foo.wav" from the SDcard + - [data foo 512 2] will try to auto-load from "foo.wav" from the SDcard if there is a "foo.wav" in the same folder as the Max patcher + - gen~ cannot export patchers with [buffer]; oopsy now warns with messages like "consider replacing [buffer fooz] with [data fooz 10 1]" +- Patcher UI: + - Added "boost" option to Max and Node.js which boosts CPU frequency from 400 to 480MHz + - Added "fastmath" option to Max and Node.js interfaces to replace transcendental functions with cheaper and smaller approximations + - Added blocksize selection to Max and Node.js interfaces + - Better error handling and messaging, also fixes endless node.script restart bug + - Template patcher cosmetics +- Code generation: + - Oopsy checks for gcc/dfu-util in /opt/homebrew or /usr/local and flags an error if neither are found + - Oopsy reports total binary size + - Code generation now uses the xoshiro PRNG for [noise], to match MSP's [noise~] + - Updates to makefiles to support SDcard and fix some compilation errors + - Code generation cleanup +- Targets: + - Support for Noise Engineering's Versio, including all on-panel controls and LEDs, and template patch. + - Param view added to Daisy Field; params not tweakable (because of no encoder) but at least visible + - Added ability to select custom JSON config from within oopsy.maxpat via "browse" button or @target argument + - Modified config JSON and genlib_daisy.h to create more flexibiity for custom Seed targets +- OLED UI: + - Removed endless menu rotation so that scrolling to beginning/end is easier + +## v0.3.0-beta + - Added OLED parameter view, displaying input mapping, current value, and ability to modify non-mapped params via encoder/switches - Added more IO channel options to OLED display - Multi-app binaries will switch app according to MIDI program-change messages diff --git a/source/daisy.field.json b/source/daisy.field.json index 839a618..c508e8b 100644 --- a/source/daisy.field.json +++ b/source/daisy.field.json @@ -1,8 +1,15 @@ { "max_apps":8, "defines": { - "OOPSY_TARGET_FIELD": 1 + "OOPSY_TARGET_FIELD": 1, + "OOPSY_TARGET_HAS_OLED": 1, + "OOPSY_TARGET_HAS_MIDI_INPUT": 1, + "OOPSY_TARGET_HAS_MIDI_OUTPUT": 1 }, + "inserts": [ + { "where": "header", "code": "#include \"daisy_field.h\"" }, + { "where": "header", "code": "typedef daisy::DaisyField Daisy;" } + ], "labels": { "params": { "knob1": "kn1", @@ -85,144 +92,124 @@ "inputs": { "kn1": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_1)" + "code": "hardware.GetKnobValue(hardware.KNOB_1);" }, "kn2": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_2)" + "code": "hardware.GetKnobValue(hardware.KNOB_2);" }, "kn3": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_3)" + "code": "hardware.GetKnobValue(hardware.KNOB_3);" }, "kn4": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_4)" + "code": "hardware.GetKnobValue(hardware.KNOB_4);" }, "kn5": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_5)" + "code": "hardware.GetKnobValue(hardware.KNOB_5);" }, "kn6": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_6)" + "code": "hardware.GetKnobValue(hardware.KNOB_6);" }, "kn7": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_7)" + "code": "hardware.GetKnobValue(hardware.KNOB_7);" }, "kn8": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_8)" + "code": "hardware.GetKnobValue(hardware.KNOB_8);" }, "kA1": { - "getter": "(hardware.KeyboardState(0)?1.f:0.f)" + "code": "(hardware.KeyboardState(0)?1.f:0.f);" }, "kA2": { - "getter": "(hardware.KeyboardState(1)?1.f:0.f)" + "code": "(hardware.KeyboardState(1)?1.f:0.f);" }, "kA3": { - "getter": "(hardware.KeyboardState(2)?1.f:0.f)" + "code": "(hardware.KeyboardState(2)?1.f:0.f);" }, "kA4": { - "getter": "(hardware.KeyboardState(3)?1.f:0.f)" + "code": "(hardware.KeyboardState(3)?1.f:0.f);" }, "kA5": { - "getter": "(hardware.KeyboardState(4)?1.f:0.f)" + "code": "(hardware.KeyboardState(4)?1.f:0.f);" }, "kA6": { - "getter": "(hardware.KeyboardState(5)?1.f:0.f)" + "code": "(hardware.KeyboardState(5)?1.f:0.f);" }, "kA7": { - "getter": "(hardware.KeyboardState(6)?1.f:0.f)" + "code": "(hardware.KeyboardState(6)?1.f:0.f);" }, "kA8": { - "getter": "(hardware.KeyboardState(7)?1.f:0.f)" + "code": "(hardware.KeyboardState(7)?1.f:0.f);" }, "kB1": { - "getter": "(hardware.KeyboardState(8)?1.f:0.f)" + "code": "(hardware.KeyboardState(8)?1.f:0.f);" }, "kB2": { - "getter": "(hardware.KeyboardState(9)?1.f:0.f)" + "code": "(hardware.KeyboardState(9)?1.f:0.f);" }, "kB3": { - "getter": "(hardware.KeyboardState(10)?1.f:0.f)" + "code": "(hardware.KeyboardState(10)?1.f:0.f);" }, "kB4": { - "getter": "(hardware.KeyboardState(11)?1.f:0.f)" + "code": "(hardware.KeyboardState(11)?1.f:0.f);" }, "kB5": { - "getter": "(hardware.KeyboardState(12)?1.f:0.f)" + "code": "(hardware.KeyboardState(12)?1.f:0.f);" }, "kB6": { - "getter": "(hardware.KeyboardState(13)?1.f:0.f)" + "code": "(hardware.KeyboardState(13)?1.f:0.f);" }, "kB7": { - "getter": "(hardware.KeyboardState(14)?1.f:0.f)" + "code": "(hardware.KeyboardState(14)?1.f:0.f);" }, "kB8": { - "getter": "(hardware.KeyboardState(15)?1.f:0.f)" + "code": "(hardware.KeyboardState(15)?1.f:0.f);" }, "sw1": { - "getter": "(hardware.GetSwitch(0)->Pressed()?1.f:0.f)" + "code": "(hardware.GetSwitch(0)->Pressed()?1.f:0.f);" }, "sw2": { - "getter": "(hardware.GetSwitch(1)->Pressed()?1.f:0.f)" + "code": "(hardware.GetSwitch(1)->Pressed()?1.f:0.f);" }, "cv1": { - "nick": "cv1", - "getter": "hardware.GetCvValue(0)" + "code": "hardware.GetCvValue(0);" }, "cv2": { - "nick": "cv2", - "getter": "hardware.GetCvValue(1)" + "code": "hardware.GetCvValue(1);" }, "cv3": { - "nick": "cv3", - "getter": "hardware.GetCvValue(2)" + "code": "hardware.GetCvValue(2);" }, "cv4": { - "nick": "cv4", - "getter": "hardware.GetCvValue(3)" + "code": "hardware.GetCvValue(3);" }, "gt1": { - "nick": "gt1", - "getter": "(hardware.gate_in.State()?1.f:0.f)" + "code": "(hardware.gate_in.State()?1.f:0.f);" } }, "outputs": { "cvout1": { "where":"main", - "setter": "dsy_dac_write(DSY_DAC_CHN1, $ * 4095)" + "code": "hardware.SetCvOut1($ * 4095);" }, "cvout2": { "where":"main", - "setter": "dsy_dac_write(DSY_DAC_CHN2, $ * 4095)" + "code": "hardware.SetCvOut2($ * 4095);" }, "gateout1": { "where":"audio", - "setter": "dsy_gpio_write(&hardware.gate_out, $ > 0.f)" + "code": "dsy_gpio_write(&hardware.gate_out, $ > 0.f);" } }, "datahandlers": { "dsy_leds": { "where":"display", - "setter": "daisy.setFieldLedsFromData($)" + "code": "daisy.setFieldLedsFromData($);" } - }, - "audio_ins": [ - "dsy_in1", - "dsy_in2" - ], - "audio_outs": [ - "dsy_out1", - "dsy_out2" - ], - "midi_ins": [ - "dsy_midi_in1" - ], - "midi_outs": [ - "dsy_midi_out1" - ], - "oled": true + } } diff --git a/source/daisy.patch.json b/source/daisy.patch.json index bdb0c0a..4e3fc0b 100644 --- a/source/daisy.patch.json +++ b/source/daisy.patch.json @@ -1,8 +1,17 @@ { "max_apps":8, "defines": { - "OOPSY_TARGET_PATCH": 1 + "OOPSY_TARGET_PATCH": 1, + "OOPSY_TARGET_HAS_OLED": 1, + "OOPSY_IO_COUNT": 4, + "OOPSY_TARGET_HAS_MIDI_INPUT": 1, + "OOPSY_TARGET_HAS_MIDI_OUTPUT": 1, + "OOPSY_HAS_ENCODER": 1 }, + "inserts": [ + { "where": "header", "code": "#include \"daisy_patch.h\"" }, + { "where": "header", "code": "typedef daisy::DaisyPatch Daisy;" } + ], "labels": { "params": { "knob1": "kn1", @@ -40,65 +49,46 @@ "inputs": { "kn1": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.CTRL_1)" + "code": "hardware.GetKnobValue(hardware.CTRL_1);" }, "kn2": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.CTRL_2)" + "code": "hardware.GetKnobValue(hardware.CTRL_2);" }, "kn3": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.CTRL_3)" + "code": "hardware.GetKnobValue(hardware.CTRL_3);" }, "kn4": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.CTRL_4)" + "code": "hardware.GetKnobValue(hardware.CTRL_4);" }, "gt1": { - "getter": "(hardware.gate_input[hardware.GATE_IN_1].State()?1.f:0.f)" + "code": "(hardware.gate_input[hardware.GATE_IN_1].State()?1.f:0.f);" }, "gt2": { - "getter": "(hardware.gate_input[hardware.GATE_IN_2].State()?1.f:0.f)" + "code": "(hardware.gate_input[hardware.GATE_IN_2].State()?1.f:0.f);" } }, "outputs": { "cvout1": { "where": "main", - "setter": "dsy_dac_write(DSY_DAC_CHN1, $ * 4095)" + "code": "hardware.seed.dac.WriteValue(daisy::DacHandle::Channel::ONE, $ * 4095);" }, "cvout2": { "where": "main", - "setter": "dsy_dac_write(DSY_DAC_CHN2, $ * 4095)" + "code": "hardware.seed.dac.WriteValue(daisy::DacHandle::Channel::TWO, $ * 4095);" }, "gateout1": { "where": "audio", - "setter": "dsy_gpio_write(&hardware.gate_output, $ > 0.f)" + "code": "dsy_gpio_write(&hardware.gate_output, $ > 0.f);" } }, "datahandlers": { "dsy_midi_out": { "where":"main", "init": "daisy.midi_nullData($)", - "setter": "daisy.midi_fromData($)" + "code": "daisy.midi_fromData($);" } - }, - "audio_ins": [ - "dsy_in1", - "dsy_in2", - "dsy_in3", - "dsy_in4" - ], - "audio_outs": [ - "dsy_out1", - "dsy_out2", - "dsy_out3", - "dsy_out4" - ], - "midi_ins": [ - "dsy_midi_in1" - ], - "midi_outs": [ - "dsy_midi_out1" - ], - "oled": true + } } diff --git a/source/daisy.petal.json b/source/daisy.petal.json index bc769ae..c6eab52 100644 --- a/source/daisy.petal.json +++ b/source/daisy.petal.json @@ -1,8 +1,13 @@ { "max_apps":8, "defines": { - "OOPSY_TARGET_PETAL": 1 + "OOPSY_TARGET_PETAL": 1, + "OOPSY_HAS_ENCODER": 1 }, + "inserts": [ + { "where": "header", "code": "#include \"daisy_petal.h\"" }, + { "where": "header", "code": "typedef daisy::DaisyPetal Daisy;" } + ], "labels": { "params": { "knob1": "kn1", @@ -50,81 +55,71 @@ "inputs": { "kn1": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_1)" + "code": "hardware.GetKnobValue(hardware.KNOB_1);" }, "kn2": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_2)" + "code": "hardware.GetKnobValue(hardware.KNOB_2);" }, "kn3": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_3)" + "code": "hardware.GetKnobValue(hardware.KNOB_3);" }, "kn4": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_4)" + "code": "hardware.GetKnobValue(hardware.KNOB_4);" }, "kn5": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_5)" + "code": "hardware.GetKnobValue(hardware.KNOB_5);" }, "kn6": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_6)" + "code": "hardware.GetKnobValue(hardware.KNOB_6);" }, "sw1": { - "getter": "(hardware.switches[0].Pressed()?1.f:0.f)" + "code": "(hardware.switches[0].Pressed()?1.f:0.f);" }, "sw2": { - "getter": "(hardware.switches[1].Pressed()?1.f:0.f)" + "code": "(hardware.switches[1].Pressed()?1.f:0.f);" }, "sw3": { - "getter": "(hardware.switches[2].Pressed()?1.f:0.f)" + "code": "(hardware.switches[2].Pressed()?1.f:0.f);" }, "sw4": { - "getter": "(hardware.switches[3].Pressed()?1.f:0.f)" + "code": "(hardware.switches[3].Pressed()?1.f:0.f);" }, "sw5": { - "getter": "(hardware.switches[4].Pressed()?1.f:0.f)" + "code": "(hardware.switches[4].Pressed()?1.f:0.f);" }, "sw6": { - "getter": "(hardware.switches[5].Pressed()?1.f:0.f)" + "code": "(hardware.switches[5].Pressed()?1.f:0.f);" }, "sw7": { - "getter": "(hardware.switches[6].Pressed()?1.f:0.f)" + "code": "(hardware.switches[6].Pressed()?1.f:0.f);" }, "exp": { - "getter": "(hardware.GetExpression())" + "code": "(hardware.GetExpression());" } }, "outputs": { "led1": { "where": "display", - "setter": "hardware.SetFootswitchLed(daisy::DaisyPetal::FOOTSWITCH_LED_1, $)" + "code": "hardware.SetFootswitchLed(daisy::DaisyPetal::FOOTSWITCH_LED_1, $);" }, "led2": { "where": "display", - "setter": "hardware.SetFootswitchLed(daisy::DaisyPetal::FOOTSWITCH_LED_2, $)" + "code": "hardware.SetFootswitchLed(daisy::DaisyPetal::FOOTSWITCH_LED_2, $);" }, "led3": { "where": "display", - "setter": "hardware.SetFootswitchLed(daisy::DaisyPetal::FOOTSWITCH_LED_3, $)" + "code": "hardware.SetFootswitchLed(daisy::DaisyPetal::FOOTSWITCH_LED_3, $);" }, "led4": { "where": "display", - "setter": "hardware.SetFootswitchLed(daisy::DaisyPetal::FOOTSWITCH_LED_4, $)" + "code": "hardware.SetFootswitchLed(daisy::DaisyPetal::FOOTSWITCH_LED_4, $);" } }, "datahandlers": { - }, - "audio_ins": [ - "dsy_in1", - "dsy_in2" - ], - "audio_outs": [ - "dsy_out1", - "dsy_out2" - ], - "midi_ins": [], - "midi_outs": [] + } } \ No newline at end of file diff --git a/source/daisy.pod.json b/source/daisy.pod.json index cd31910..4005887 100644 --- a/source/daisy.pod.json +++ b/source/daisy.pod.json @@ -1,8 +1,15 @@ { "max_apps":1, "defines": { - "OOPSY_TARGET_POD": 1 + "OOPSY_TARGET_POD": 1, + "OOPSY_TARGET_HAS_MIDI_INPUT": 1, + "OOPSY_HAS_ENCODER": 1 }, + "inserts": [ + { "where": "header", "code": "#include \"daisy_pod.h\"" }, + { "where": "header", "code": "typedef daisy::DaisyPod Daisy;" }, + { "where": "post_audio", "code": "hardware.UpdateLeds();" } + ], "labels": { "params": { "knob1": "kn1", @@ -33,46 +40,34 @@ "inputs": { "kn1": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_1)" + "code": "hardware.GetKnobValue(hardware.KNOB_1);" }, "kn2": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_2)" + "code": "hardware.GetKnobValue(hardware.KNOB_2);" }, "sw1": { - "getter": "(hardware.button1.Pressed()?1.f:0.f)" + "code": "(hardware.button1.Pressed()?1.f:0.f);" }, "sw2": { - "getter": "(hardware.button2.Pressed()?1.f:0.f)" + "code": "(hardware.button2.Pressed()?1.f:0.f);" }, "enc": { - "getter": "(hardware.encoder.Increment()*0.5f+0.5f)" + "code": "(hardware.encoder.Increment()*0.5f+0.5f);" }, "enp": { - "getter": "(hardware.encoder.Pressed())" + "code": "(hardware.encoder.Pressed());" } }, "outputs": { "led1": { "where": "audio", - "setter": "hardware.led1.Set(clamp(-$, 0.f, 1.f), clamp($, 0.f, 1.f), 0.f)" + "code": "hardware.led1.Set(clamp(-$, 0.f, 1.f), clamp($, 0.f, 1.f), 0.f);" }, "led2": { "where": "audio", - "setter": "hardware.led2.Set(clamp(-$, 0.f, 1.f), clamp($, 0.f, 1.f), 0.f)" + "code": "hardware.led2.Set(clamp(-$, 0.f, 1.f), clamp($, 0.f, 1.f), 0.f);" } }, - "datahandlers": {}, - "audio_ins": [ - "dsy_in1", - "dsy_in2" - ], - "audio_outs": [ - "dsy_out1", - "dsy_out2" - ], - "midi_ins": [ - "dsy_midi_in1" - ], - "midi_outs": [] + "datahandlers": {} } \ No newline at end of file diff --git a/source/daisy.versio.json b/source/daisy.versio.json index 9cc51d3..9f0a7bb 100644 --- a/source/daisy.versio.json +++ b/source/daisy.versio.json @@ -3,6 +3,11 @@ "defines": { "OOPSY_TARGET_VERSIO": 1 }, + "inserts": [ + { "where": "header", "code": "#include \"daisy_versio.h\"" }, + { "where": "header", "code": "typedef daisy::DaisyVersio Daisy;" }, + { "where": "post_audio", "code": "hardware.UpdateLeds();" } + ], "labels": { "params": { "knob1": "kn1", @@ -41,70 +46,82 @@ "switch": "sw1", "gate": "gt1", - "tap": "bt1", "fsu": "bt1", "abc": "sw1", - "xyz": "sw2" - + "xyz": "sw2" }, "outs": { - + "led1": "led1", + "led2": "led2", + "led3": "led3", + "led4": "led4" }, "datas": {} }, "inputs": { "kn1": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_0)" + "code": "hardware.GetKnobValue(hardware.KNOB_0);" }, "kn2": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_1)" + "code": "hardware.GetKnobValue(hardware.KNOB_1);" }, "kn3": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_2)" + "code": "hardware.GetKnobValue(hardware.KNOB_2);" }, "kn4": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_3)" + "code": "hardware.GetKnobValue(hardware.KNOB_3);" }, "kn5": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_4)" + "code": "hardware.GetKnobValue(hardware.KNOB_4);" }, "kn6": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_5)" + "code": "hardware.GetKnobValue(hardware.KNOB_5);" }, "kn7": { "automap": true, - "getter": "hardware.GetKnobValue(hardware.KNOB_6)" + "code": "hardware.GetKnobValue(hardware.KNOB_6);" }, "sw1": { - "getter": "(hardware.sw_[0].Read())" + "code": "(hardware.sw[0].Read()/2.f);" }, "sw2": { - "getter": "(hardware.sw_[1].Read())" + "code": "(hardware.sw[1].Read()/2.f);" }, "bt1": { - "getter": "(hardware.SwitchPressed()?1.f:0.f)" + "code": "(hardware.tap.Pressed()?1.f:0.f);", + "update": { + "where": "audio", + "code": "hardware.tap.Debounce();" + } }, "gt1": { - "getter": "(hardware.Gate()?1.f:0.f)" + "code": "(hardware.Gate()?1.f:0.f);" + } + }, + "outputs": { + "led1": { + "where": "audio", + "code": "hardware.leds[0].Set(clamp(-$, 0.f, 1.f), clamp($, 0.f, 1.f), 0.f);" + }, + "led2": { + "where": "audio", + "code": "hardware.leds[1].Set(clamp(-$, 0.f, 1.f), clamp($, 0.f, 1.f), 0.f);" + }, + "led3": { + "where": "audio", + "code": "hardware.leds[2].Set(clamp(-$, 0.f, 1.f), clamp($, 0.f, 1.f), 0.f);" + }, + "led4": { + "where": "audio", + "code": "hardware.leds[3].Set(clamp(-$, 0.f, 1.f), clamp($, 0.f, 1.f), 0.f);" } }, - "outputs": {}, - "datahandlers": {}, - "audio_ins": [ - "dsy_in1", - "dsy_in2" - ], - "audio_outs": [ - "dsy_out1", - "dsy_out2" - ], - "midi_ins": [], - "midi_outs": [] + "datahandlers": {} } \ No newline at end of file diff --git a/source/gen_dsp/genlib.h b/source/gen_dsp/genlib.h index 2962b96..7551733 100644 --- a/source/gen_dsp/genlib.h +++ b/source/gen_dsp/genlib.h @@ -24,11 +24,10 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI #ifndef GENLIB_H #define GENLIB_H 1 -#if defined(ARM_MATH_CM4) || defined(ARM_MATH_CM7) // embedded ARM cortex support -#define GENLIB_NO_STDLIB -#define GENLIB_USE_ARMMATH -#define GENLIB_USE_FASTMATH -#endif // defined(ARM_MATH_CM4) || defined(ARM_MATH_CM7) +// #if defined(ARM_MATH_CM4) || defined(ARM_MATH_CM7) // embedded ARM cortex support +// #define GENLIB_USE_ARMMATH +// #define GENLIB_USE_FASTMATH +// #endif // defined(ARM_MATH_CM4) || defined(ARM_MATH_CM7) #if defined (__arm__) // general ARM support #define GENLIB_USE_FLOAT32 @@ -212,18 +211,18 @@ extern "C" { #endif // MSP_ON_CLANG -#if defined(GENLIB_USE_ARMMATH) // ARM embedded support -# include "arm_math.h" -# define sin(x) arm_sin_f32(x) -# define sinf(x) arm_sin_f32(x) -# define cos(x) arm_cos_f32(x) -# define cosf(x) arm_cos_f32(x) -# define sqrt(x) arm_sqrtf(x) -# define sqrtf(x) arm_sqrtf(x) -# define rand(...) arm_rand32() -# undef RAND_MAX -# define RAND_MAX UINT32_MAX -#endif // GENLIB_USE_ARMMATH +// #if defined(GENLIB_USE_ARMMATH) // ARM embedded support +// # include "arm_math.h" +// # define sin(x) arm_sin_f32(x) +// # define sinf(x) arm_sin_f32(x) +// # define cos(x) arm_cos_f32(x) +// # define cosf(x) arm_cos_f32(x) +// # define sqrt(x) arm_sqrtf(x) +// # define sqrtf(x) arm_sqrtf(x) +// # define rand(...) arm_rand32() +// # undef RAND_MAX +// # define RAND_MAX UINT32_MAX +// #endif // GENLIB_USE_ARMMATH #if defined(GENLIB_USE_FASTMATH) # include @@ -235,8 +234,8 @@ extern "C" { # define atan2(x,y) fasteratan2(x,y) # define tanh(x) fastertanh(x) # if !defined(GENLIB_USE_ARMMATH) -# define sin(x) fastersinfull(x); -# define cos(x) fastercosfull(x); +# define sin(x) fastersinfull(x) +# define cos(x) fastercosfull(x) # endif #endif // GENLIB_USE_FASTMATH diff --git a/source/gen_dsp/genlib_ops.h b/source/gen_dsp/genlib_ops.h index 0b67db7..c645fba 100644 --- a/source/gen_dsp/genlib_ops.h +++ b/source/gen_dsp/genlib_ops.h @@ -609,11 +609,13 @@ inline T1 ltep(T1 x, T2 y) { return ((((x) <= T1(y))) ? (x) : T1(0)); } inline t_sample fract(t_sample x) { double unused; return (t_sample)modf((double)x, &unused); } +#ifndef __arm__ // log2(x) = log(x)/log(2) template inline T log2(T x) { return log(x)*GENLIB_1_OVER_LOG_2; } +#endif inline t_sample atodb(t_sample in) { return t_sample((in <= 0.) ? -999. : (20. * log10(in))); @@ -798,29 +800,120 @@ struct DCBlock { } }; +#ifdef GENLIB_USE_FLOAT32 struct Noise { - unsigned long last; - static long uniqueTickCount(void) { - static long lasttime = 0; - long time = genlib_ticks(); + uint32_t state[4]; + + // uses system clock to generate a random seed + // ensures distinct seeds even if creating several Noise objects at the same clock value + static uint64_t uniqueTickCount(void) { + static uint64_t lasttime = 0; + uint64_t time = genlib_ticks(); return (time <= lasttime) ? (++lasttime) : (lasttime = time); } - - Noise() { reset(); } - Noise(t_sample seed) { reset(seed); } - void reset() { last = uniqueTickCount() * uniqueTickCount(); } - void reset(t_sample seed) { last = (unsigned long)(seed); } - + + Noise() { reset(); } + Noise(t_sample seed) { reset(seed); } + + void reset(t_sample seed) { + //uint64_t x = (uint64_t)(ldexp((double)seed, 53)); + uint64_t x = (uint64_t)(seed*exp2f(53.f)); + state[3] = splitmix32(state[2] = splitmix32(state[1] = splitmix32(state[0] = splitmix32(x)))); + } + void reset() { reset( uniqueTickCount() ); } + + // adapted from the xoshiro128+ PRNG, see http://prng.di.unimi.it + /* xoshiro128+: Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org) + To the extent possible under law, the author has dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + See . */ inline t_sample operator()() { - last = 1664525L * last + 1013904223L; - union { - uint32_t ui32; - float f; - } u = { uint32_t(0x3f800000 | (0x007fffff & last)) }; // type-punning + const uint32_t result = state[0] + state[3]; + const uint32_t t = state[1] << 9; + state[2] ^= state[0]; + state[3] ^= state[1]; + state[1] ^= state[2]; + state[0] ^= state[3]; + state[2] ^= t; + state[3] = (state[3] << 11) | (state[3] >> 21); // rotl(s[3], 11) => (x << k) | (x >> (32 - k)) + // discard lower 8 bits (exponent), convert to double in 0..2, map to -1..1: + // exactly quivalent to ldexpf((t_sample)(result >> 8), -23) - 1.0; + // but much cheaper on ARM CPU + static const t_sample EXP2_NEG23 = exp2f(-23.f); + return ((result >> 8)*EXP2_NEG23) - 1.f; + } + + // splitmix32 suggested by David Blackman and Sebastiano Vigna as a good seed for xoshiro256+: + /* This is a fixed-increment version of Java 8's SplittableRandom generator + See http://dx.doi.org/10.1145/2714064.2660195 and + http://docs.oracle.com/javase/8/docs/api/java/util/SplittableRandom.html + It is a very fast generator passing BigCrush, and it can be useful if + for some reason you absolutely want 64 bits of state. */ + uint32_t splitmix32(uint64_t seed) { + uint64_t z = (seed += 0x9e3779b97f4a7c15); + z = (z ^ (z >> 33)) * 0x62a9d9ed799705f5; + z = (z ^ (z >> 28)) * 0xcb24d0a5c88c35b3; + return z >> 32; + } +}; +#else +struct Noise { + uint64_t state[4]; - return (u.f * 2.f) - 3.f; + // uses system clock to generate a random seed + // ensures distinct seeds even if creating several Noise objects at the same clock value + static uint64_t uniqueTickCount(void) { + static uint64_t lasttime = 0; + uint64_t time = genlib_ticks(); + return (time <= lasttime) ? (++lasttime) : (lasttime = time); } + + Noise() { reset(); } + Noise(t_sample seed) { reset(seed); } + + void reset(t_sample seed) { + //uint64_t x = (uint64_t)(ldexp((double)seed, 53)); + uint64_t x = (uint64_t)(seed*exp2(53.0)); + state[3] = splitmix64(state[2] = splitmix64(state[1] = splitmix64(state[0] = splitmix64(x)))); + } + void reset() { reset( uniqueTickCount() ); } + + // adapted from the xoshiro256+ PRNG, see http://prng.di.unimi.it + /* xoshiro256+: Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org) + To the extent possible under law, the author has dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + See . */ + inline t_sample operator()() { + const uint64_t result = state[0] + state[3]; + const uint64_t t = state[1] << 17; + state[2] ^= state[0]; + state[3] ^= state[1]; + state[1] ^= state[2]; + state[0] ^= state[3]; + state[2] ^= t; + state[3] = (state[3] << 45) | (state[3] >> 19); // rotl(s[3], 45) => (x << k) | (x >> (64 - k)) + // discard lower 11 bits, convert to double in 0..2, map to -1..1: + // exactly quivalent to ldexp((double)(result >> 11), -52) - 1.0; + static const t_sample EXP2_NEG52 = exp2(-52); + return ((result >> 11)*EXP2_NEG52) - 1.0; + } + + // splitmix64 suggested by David Blackman and Sebastiano Vigna as a good seed for xoshiro256+: + /* This is a fixed-increment version of Java 8's SplittableRandom generator + See http://dx.doi.org/10.1145/2714064.2660195 and + http://docs.oracle.com/javase/8/docs/api/java/util/SplittableRandom.html + It is a very fast generator passing BigCrush, and it can be useful if + for some reason you absolutely want 64 bits of state. */ + uint64_t splitmix64(uint64_t seed) { + uint64_t z = (seed += 0x9e3779b97f4a7c15); + z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9; + z = (z ^ (z >> 27)) * 0x94d049bb133111eb; + return z ^ (z >> 31); + } }; +#endif struct Phasor { t_sample phase; diff --git a/source/genlib_daisy.cpp b/source/genlib_daisy.cpp index 09c1372..c4ab909 100644 --- a/source/genlib_daisy.cpp +++ b/source/genlib_daisy.cpp @@ -187,7 +187,7 @@ void genlib_data_resize(t_genlib_data *b, long s, long c) { // check allocation: if (replaced == 0) { - genlib_report_error("allocating [data]: out of memory"); + genlib_report_error("data: out of memory"); // try to reallocate with a default/minimal size instead: if (s > 512 || c > 1) { genlib_data_resize((t_genlib_data *)self, 512, 1); diff --git a/source/genlib_daisy.h b/source/genlib_daisy.h index 1ee2fa6..8c2322a 100644 --- a/source/genlib_daisy.h +++ b/source/genlib_daisy.h @@ -1,54 +1,49 @@ #ifndef GENLIB_DAISY_H #define GENLIB_DAISY_H +/* +Oopsy was authored in 2020-2021 by Graham Wakefield. Copyright 2021 Electrosmith, Corp. and Graham Wakefield. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + #include "daisy.h" #include "genlib.h" #include "genlib_ops.h" #include "genlib_exportfunctions.h" +#include "daisy_seed.h" + #include #include #include // memset #include // vprintf -//#define OOPSY_USE_LOGGING 1 - -#if defined(OOPSY_TARGET_PATCH) - #include "daisy_patch.h" - #define OOPSY_IO_COUNT (4) - typedef daisy::DaisyPatch Daisy; - -#elif defined(OOPSY_TARGET_FIELD) - #include "daisy_field.h" - #define OOPSY_IO_COUNT (2) - typedef daisy::DaisyField Daisy; - -#elif defined(OOPSY_TARGET_PETAL) - #include "daisy_petal.h" - #define OOPSY_IO_COUNT (2) - typedef daisy::DaisyPetal Daisy; - -#elif defined(OOPSY_TARGET_POD) - #include "daisy_pod.h" - #define OOPSY_IO_COUNT (2) - typedef daisy::DaisyPod Daisy; - -#elif defined(OOPSY_TARGET_VERSIO) - #include "daisy_versio.h" - #define OOPSY_IO_COUNT (2) - typedef daisy::DaisyVersio Daisy; - -#else - #include "daisy_seed.h" - #define OOPSY_IO_COUNT (2) - typedef daisy::DaisySeed Daisy; - +// #if defined(OOPSY_TARGET_SEED) +// typedef struct { +// daisy::DaisySeed seed; + +// void Init() { +// seed.Configure(); +// seed.Init(); +// } +// } Daisy; +// #endif + +#ifdef OOPSY_USE_USB_SERIAL_INPUT +static char sumbuff[1024]; +static uint32_t rx_size = 0; +static bool update = false; #endif ////////////////////////// DAISY EXPORT INTERFACING ////////////////////////// -#define OOPSY_BUFFER_SIZE 48 -#define OOPSY_MIDI_BUFFER_SIZE 256 -#define OOPSY_LONG_PRESS_MS 250 +#define OOPSY_MIDI_BUFFER_SIZE (1024) +#define OOPSY_LONG_PRESS_MS (333) +#define OOPSY_SUPER_LONG_PRESS_MS (20000) #define OOPSY_DISPLAY_PERIOD_MS 10 #define OOPSY_SCOPE_MAX_ZOOM (8) static const uint32_t OOPSY_SRAM_SIZE = 512 * 1024; @@ -133,19 +128,16 @@ namespace oopsy { void (*load)(); }; typedef enum { - MODE_NONE = 0, - #ifdef OOPSY_MULTI_APP - MODE_MENU, - #endif - #ifdef OOPSY_TARGET_HAS_OLED - MODE_CONSOLE, + MODE_SCOPE, #ifdef OOPSY_HAS_PARAM_VIEW MODE_PARAMS, #endif - MODE_SCOPE, + MODE_CONSOLE, + #endif + #ifdef OOPSY_MULTI_APP + MODE_MENU, #endif - MODE_COUNT } Mode; @@ -154,8 +146,8 @@ namespace oopsy { Daisy hardware; AppDef * appdefs = nullptr; - int mode, mode_default; - int app_count = 1, app_selected = 0, app_selecting = 0; + int mode, screensave=0; + int app_count = 1, app_selected = 0, app_selecting = 0, app_load_scheduled = 0; int menu_button_held = 0, menu_button_released = 0, menu_button_held_ms = 0, menu_button_incr = 0; int is_mode_selecting = 0; int param_count = 0; @@ -163,14 +155,11 @@ namespace oopsy { int param_selected = 0, param_is_tweaking = 0, param_scroll = 0; #endif - uint32_t t = 0, dt = 10, frames = 0; + uint32_t t = 0, dt = 10, blockcount = 0; Timer uitimer; - // microseconds spent in audio callback - float audioCpuUs = 0; - - float samplerate; // default 48014 - size_t blocksize; // default 48 + // percent (0-100) of available processing time used + float audioCpuUsage = 0; void (*mainloopCallback)(uint32_t t, uint32_t dt); void (*displayCallback)(uint32_t t, uint32_t dt); @@ -182,6 +171,10 @@ namespace oopsy { bool nullAudioCallbackRunning = false; #ifdef OOPSY_TARGET_HAS_OLED + + // TODO: fix this once width & height can be derived as static constexpr from the display class: + #define OLED_DISPLAY_WIDTH (128) + #define OLED_DISPLAY_HEIGHT (64) enum { SCOPESTYLE_OVERLAY = 0, @@ -206,28 +199,199 @@ namespace oopsy { char * console_stats; char * console_memory; char ** console_lines; - float scope_data[SSD1309_WIDTH*2][2]; // 128 pixels + float scope_data[OLED_DISPLAY_WIDTH*2][2]; // 128 pixels char scope_label[11]; #endif // OOPSY_TARGET_HAS_OLED #ifdef OOPSY_TARGET_USES_MIDI_UART + + struct MidiNote { + uint8_t chan, pitch, vel, press; + + void init() { + chan = 0; + pitch = 36; + vel = press = 0; + } + + // call at block rate + // (so long as at least velocity out is defined) + void update(GenDaisy& daisy, uint8_t v, uint8_t p=36, uint8_t c=0) { + // a change of pitch or chan must stop an ongoing note + if (vel && (p != pitch || c != chan)) { + // send note off to stop old note + vel = 0; + daisy.midi_message3(144 + chan, pitch, vel); + } + pitch = p; + chan = c; + // a change of velocity between zero and nonzero should trigger a note on/off + if ((!v) != (!vel)) { + daisy.midi_message3(144 + chan, pitch, v); + } + vel = v; + } + + // call in the throttled section (if a pressure output was defined) + void update_pressure(GenDaisy& daisy, uint8_t pressure) { + if (vel && pressure != press) { + // send pressure + daisy.midi_message3(160 + chan, pitch, pressure); + } + press = pressure; + } + }; + + struct { + uint8_t status=0; + uint8_t lastbyte=0; + uint8_t byte[2]; + } midi; + daisy::UartHandler uart; - uint8_t midi_in_written = 0, midi_out_written = 0; + uint32_t midi_out_writeidx = 0; + uint32_t midi_out_readidx = 0; + + uint8_t midi_in_written = 0;//, midi_out_written = 0; uint8_t midi_in_active = 0, midi_out_active = 0; uint8_t midi_out_data[OOPSY_MIDI_BUFFER_SIZE]; - float midi_in_data[OOPSY_BUFFER_SIZE]; + float midi_in_data[OOPSY_BLOCK_SIZE]; int midi_data_idx = 0; int midi_parse_state = 0; #endif //OOPSY_TARGET_USES_MIDI_UART + #ifdef OOPSY_TARGET_USES_SDMMC + struct WavFormatChunk { + uint32_t size; // 16 + uint16_t format; // 1=PCM + uint16_t chans; // e.g. 2 + uint32_t samplerate; // e.g. 44100 + uint32_t bytespersecond; // bytes per second, = sr * bitspersample * chans/8 + uint16_t bytesperframe; // bytes per frame, = bitspersample * chans/8 + uint16_t bitspersample; // e.g. 16 for 16-bit + }; + + // at minimum this should fit one frame of 4 bytes-per-sample x numchans + #define OOPSY_WAV_WORKSPACE_BYTES (256) + + daisy::SdmmcHandler handler; + uint8_t workspace[OOPSY_WAV_WORKSPACE_BYTES]; + + void sdcard_init() { + daisy::SdmmcHandler::Config sdconfig; + sdconfig.Defaults(); // 4-bit, 50MHz + // sdconfig.clock_powersave = false; + // sdconfig.speed = daisy::SdmmcHandler::Speed::FAST; + // sdconfig.width = daisy::SdmmcHandler::BusWidth::BITS_4; + // handler.Init(sdconfig); + handler.Init(sdconfig); + dsy_fatfs_init(); + f_mount(&SDFatFS, SDPath, 1); + } + + // TODO: resizing without wasting memory + int sdcard_load_wav(const char * filename, Data& gendata) { + float * buffer = gendata.mData; + size_t buffer_frames = gendata.dim; + size_t buffer_channels = gendata.channels; + size_t bytesread = 0; + WavFormatChunk format; + uint32_t header[3]; + uint32_t marker, frames, chunksize, frames_per_read, frames_to_read, frames_read, total_frames_to_read; + uint32_t buffer_index = 0; + size_t bytespersample; + if(f_open(&SDFile, filename, (FA_OPEN_EXISTING | FA_READ)) != FR_OK) { + log("no %s", filename); + return -1; + } + if (f_eof(&SDFile) + || f_read(&SDFile, (void *)&header, sizeof(header), &bytesread) != FR_OK + || header[0] != daisy::kWavFileChunkId + || header[2] != daisy::kWavFileWaveId) goto badwav; + // find the format chunk: + do { + if (f_eof(&SDFile) || f_read(&SDFile, (void *)&marker, sizeof(marker), &bytesread) != FR_OK) break; + } while (marker != daisy::kWavFileSubChunk1Id); + if (f_eof(&SDFile) + || f_read(&SDFile, (void *)&format, sizeof(format), &bytesread) != FR_OK + || format.chans == 0 + || format.samplerate == 0 + || format.bitspersample == 0) goto badwav; + // find the data chunk: + do { + if (f_eof(&SDFile) || f_read(&SDFile, (void *)&marker, sizeof(marker), &bytesread) != FR_OK) break; + } while (marker != daisy::kWavFileSubChunk2Id); + bytespersample = format.bytesperframe / format.chans; + if (f_eof(&SDFile) + || f_read(&SDFile, (void *)&chunksize, sizeof(chunksize), &bytesread) != FR_OK + || format.format != 1 + || bytespersample < 2 + || bytespersample > 4) goto badwav; // only 16/24/32-bit PCM, sorry + // make sure we read in (multiples of) whole frames + frames = chunksize / format.bytesperframe; + frames_per_read = OOPSY_WAV_WORKSPACE_BYTES / format.bytesperframe; + frames_to_read = frames_per_read; + total_frames_to_read = buffer_frames; + // log("b=%u c=%u t=%u", buffer_frames, buffer_channels, total_frames_to_read); + // log("f=%u c=%u p=%u", frames, format.chans, frames_per_read); + // log("bp=%u c=%u p=%u", frames_to_read * format.bytesperframe); + do { + if (frames_to_read > total_frames_to_read) frames_to_read = total_frames_to_read; + f_read(&SDFile, workspace, frames_to_read * format.bytesperframe, &bytesread); + frames_read = bytesread / format.bytesperframe; + //log("_r=%u t=%u", frames_read, frames_to_read); + switch (bytespersample) { + case 2: { // 16 bit + for (size_t f=0; f> 8; + buffer[(buffer_index+f)*buffer_channels + c] = (float)(((double)b) * 0.00000011920928955078125); + } + } + } break; + case 4: { // 32 bit + for (size_t f=0; f 0 && total_frames_to_read > 0); + f_close(&SDFile); + log("read %s", filename); + return buffer_index; + badwav: + f_close(&SDFile); + log("bad %s", filename); + return -1; + } + #endif + template void reset(A& newapp) { // first, remove callbacks: mainloopCallback = nullMainloopCallback; displayCallback = nullMainloopCallback; nullAudioCallbackRunning = false; - hardware.ChangeAudioCallback(nullAudioCallback); - while (!nullAudioCallbackRunning) dsy_system_delay(1); + hardware.seed.ChangeAudioCallback(nullAudioCallback); + while (!nullAudioCallbackRunning) daisy::System::Delay(1); // reset memory oopsy::init(); // install new app: @@ -236,44 +400,70 @@ namespace oopsy { // install new callbacks: mainloopCallback = newapp.staticMainloopCallback; displayCallback = newapp.staticDisplayCallback; - #ifdef OOPSY_HAS_PARAM_VIEW + #if defined(OOPSY_TARGET_HAS_OLED) && defined(OOPSY_HAS_PARAM_VIEW) paramCallback = newapp.staticParamCallback; #endif - hardware.ChangeAudioCallback(newapp.staticAudioCallback); + hardware.seed.ChangeAudioCallback(newapp.staticAudioCallback); log("gen~ %s", appdefs[app_selected].name); - log("SR %dkHz / %dHz", (int)(samplerate/1000), (int)hardware.seed.AudioCallbackRate()); - log("%d/%dK + %d/%dM", oopsy::sram_used/1024, OOPSY_SRAM_SIZE/1024, oopsy::sdram_used/1048576, OOPSY_SDRAM_SIZE/1048576); + log("SR %dkHz / %dHz", (int)(hardware.seed.AudioSampleRate()/1000), (int)hardware.seed.AudioCallbackRate()); + { + log("%d%s/%dKB+%d%s/%dMB", + oopsy::sram_used > 1024 ? oopsy::sram_used/1024 : oopsy::sram_used, + (oopsy::sram_used > 1024 || oopsy::sram_used == 0) ? "" : "B", + OOPSY_SRAM_SIZE/1024, + oopsy::sdram_used > 1048576 ? oopsy::sdram_used/1048576 : oopsy::sdram_used/1024, + (oopsy::sdram_used > 1048576 || oopsy::sdram_used == 0) ? "" : "KB", + OOPSY_SDRAM_SIZE/1048576); + // console_display(); + // hardware.display.Update(); + } // reset some state: menu_button_incr = 0; #ifdef OOPSY_TARGET_USES_MIDI_UART + midi_out_writeidx = 0; + midi_out_readidx = 0; midi_data_idx = 0; - midi_in_written = 0, midi_out_written = 0; + midi_in_written = 0;//, midi_out_written = 0; midi_in_active = 0, midi_out_active = 0; - frames = 0; + // reset: + midi_message1(255); + midi_message3(176, 123, 0); #endif + blockcount = 0; } - int run(AppDef * appdefs, int count, daisy::SaiHandle::Config::SampleRate SR) { + #ifdef OOPSY_USE_USB_SERIAL_INPUT + static void UsbCallback(uint8_t* buf, uint32_t* len) { + memcpy(sumbuff, buf, *len); + rx_size = *len; + update = true; + } + #endif + + int run(AppDef * appdefs, int count) { this->appdefs = appdefs; app_count = count; - - mode_default = (Mode)(MODE_COUNT-1); - mode = mode_default; + mode = 0; - hardware.Init(); - hardware.seed.SetAudioSampleRate(SR); - samplerate = hardware.seed.AudioSampleRate(); - blocksize = hardware.seed.AudioBlockSize(); // default 48 + #ifdef OOPSY_USE_USB_SERIAL_INPUT + hardware.seed.usb_handle.Init(daisy::UsbHandle::FS_INTERNAL); + daisy::System::Delay(500); + hardware.seed.usb_handle.SetReceiveCallback(UsbCallback, daisy::UsbHandle::FS_INTERNAL); + #endif #ifdef OOPSY_USE_LOGGING - hardware.seed.StartLog(true); - //daisy::Logger::StartLog(false); + daisy::Logger::StartLog(false); + + //usbhandle SetReceiveCallback(ReceiveCallback cb, UsbPeriph dev); + + // TODO REMOVE THIS HACK WHEN STARTING SERIAL OVER USB DOESN'T FREAK OUT WITH AUDIO CALLBACK + daisy::System::Delay(275); #endif #ifdef OOPSY_TARGET_HAS_OLED - console_cols = SSD1309_WIDTH / font.FontWidth + 1; // +1 to accommodate null terminators. - console_rows = SSD1309_HEIGHT / font.FontHeight; + console_cols = OLED_DISPLAY_WIDTH / font.FontWidth + 1; // +1 to accommodate null terminators. + console_rows = OLED_DISPLAY_HEIGHT / font.FontHeight; console_memory = (char *)calloc(console_cols, console_rows); console_stats = (char *)calloc(console_cols, 1); for (int i=0; i= 128 && byte < 240) { - // status byte: - midi_parse_state = (byte/16)-7; - } else if (midi_parse_state == 5) { - midi_parse_state = 0; - // program change => load a new app - app_selected = app_selecting = byte % app_count; - appdefs[app_selected].load(); - continue; - } else { - // ignored: - midi_parse_state = 0; - } - #endif // OOPSY_MULTI_APP - - // gen~ level handling here: - if (midi_in_written < OOPSY_BUFFER_SIZE) { - // scale (0, 255) to (0.0, 1.0) - // to protect hardware from accidental patching - midi_in_data[midi_in_written] = byte / 256.0f; - midi_in_written++; - } - midi_in_active = 1; - } - // output: - if (midi_out_written) { + // send data if there's something to read: + if (midi_out_readidx != midi_out_writeidx) { + uint32_t size = (OOPSY_MIDI_BUFFER_SIZE + midi_out_writeidx - midi_out_readidx) % OOPSY_MIDI_BUFFER_SIZE; + size = ((midi_out_readidx + size) <= OOPSY_MIDI_BUFFER_SIZE) ? size : OOPSY_MIDI_BUFFER_SIZE - midi_out_readidx; + //for (uint32_t i=0; i OOPSY_LONG_PRESS_MS) { - // LONG PRESS - is_mode_selecting = 1; + #ifdef OOPSY_USE_USB_SERIAL_INPUT + if(update && rx_size > 0) { + // TODO check bytes for a reset message and jump to bootloader + update = false; + log(sumbuff); } + #endif // CLEAR DISPLAY #ifdef OOPSY_TARGET_HAS_OLED @@ -377,8 +558,11 @@ namespace oopsy { #ifdef OOPSY_TARGET_PETAL hardware.ClearLeds(); #endif - - #ifdef OOPSY_TARGET_PETAL + + if (menu_button_held_ms > OOPSY_LONG_PRESS_MS * 48/OOPSY_BLOCK_SIZE) { + is_mode_selecting = 1; + } + #ifdef OOPSY_TARGET_PETAL // has no mode selection is_mode_selecting = 0; #if defined(OOPSY_MULTI_APP) @@ -415,8 +599,15 @@ namespace oopsy { // Handle encoder increment actions: if (is_mode_selecting) { mode += menu_button_incr; + #ifdef OOPSY_TARGET_FIELD + // mode menu rotates infinitely if (mode >= MODE_COUNT) mode = 0; - if (mode < 0) mode = MODE_COUNT-1; + if (mode < 0) mode = MODE_COUNT-1; + #else + // mode menu clamps at either end + if (mode >= MODE_COUNT) mode = MODE_COUNT-1; + if (mode < 0) mode = 0; + #endif #ifdef OOPSY_MULTI_APP } else if (mode == MODE_MENU) { #ifdef OOPSY_TARGET_VERSIO @@ -450,7 +641,7 @@ namespace oopsy { #endif //OOPSY_HAS_PARAM_VIEW #endif //OOPSY_TARGET_HAS_OLED } - + // SHORT PRESS if (menu_button_released) { menu_button_released = 0; @@ -461,19 +652,19 @@ namespace oopsy { if (app_selected != app_selecting) { app_selected = app_selecting; #ifndef OOPSY_TARGET_HAS_OLED - mode = mode_default; + mode = 0; #endif - appdefs[app_selected].load(); - continue; + schedule_app_load(app_selected); //appdefs[app_selected].load(); + //continue; } #endif #ifdef OOPSY_TARGET_HAS_OLED } else if (mode == MODE_SCOPE) { scope_option = (scope_option + 1) % SCOPEOPTION_COUNT; - #ifdef OOPSY_HAS_PARAM_VIEW + #if defined (OOPSY_HAS_PARAM_VIEW) && defined(OOPSY_CAN_PARAM_TWEAK) } else if (mode == MODE_PARAMS) { param_is_tweaking = !param_is_tweaking; - #endif //OOPSY_HAS_PARAM_VIEW + #endif //OOPSY_HAS_PARAM_VIEW && OOPSY_CAN_PARAM_TWEAK #endif //OOPSY_TARGET_HAS_OLED } } @@ -513,8 +704,8 @@ namespace oopsy { #endif // OOPSY_HAS_PARAM_VIEW case MODE_SCOPE: { showstats = 1; - uint8_t h = SSD1309_HEIGHT; - uint8_t w2 = SSD1309_WIDTH/2, w4 = SSD1309_WIDTH/4; + uint8_t h = OLED_DISPLAY_HEIGHT; + uint8_t w2 = OLED_DISPLAY_WIDTH/2, w4 = OLED_DISPLAY_WIDTH/4; uint8_t h2 = h/2, h4 = h/4; size_t zoomlevel = scope_samples(); hardware.display.Fill(false); @@ -523,7 +714,7 @@ namespace oopsy { switch (scope_style) { case SCOPESTYLE_OVERLAY: { // stereo overlay: - for (uint_fast8_t i=0; i' : ' '); midi_in_active = midi_out_active = 0; #endif - offset += snprintf(console_stats+offset, console_cols-offset, "%02d%%", int(0.0001f*audioCpuUs*(samplerate)/blocksize)); + offset += snprintf(console_stats+offset, console_cols-offset, "%02d%%", int(audioCpuUsage)); // stats: - hardware.display.SetCursor(SSD1309_WIDTH - (offset) * font.FontWidth, font.FontHeight * 0); + hardware.display.SetCursor(OLED_DISPLAY_WIDTH - (offset) * font.FontWidth, font.FontHeight * 0); hardware.display.WriteString(console_stats, font, true); } #endif //OOPSY_TARGET_HAS_OLED - menu_button_incr = 0; // handle app-level code (e.g. for LED etc.) @@ -636,17 +826,21 @@ namespace oopsy { #ifdef OOPSY_TARGET_HAS_OLED hardware.display.Update(); #endif //OOPSY_TARGET_HAS_OLED - #if (OOPSY_TARGET_PETAL || OOPSY_TARGET_VERSIO) - hardware.UpdateLeds(); - #endif //(OOPSY_TARGET_PETAL || OOPSY_TARGET_VERSIO) - + #if (OOPSY_TARGET_PETAL) + hardware.UpdateLeds(); + #endif //(OOPSY_TARGET_PETAL) } // uitimer.ready } return 0; } + void schedule_app_load(int which) { + app_selected = app_selecting = which % app_count; + app_load_scheduled = 1; + } + void audio_preperform(size_t size) { #ifdef OOPSY_TARGET_USES_MIDI_UART // fill remainder of midi buffer with non-data: @@ -655,31 +849,20 @@ namespace oopsy { midi_in_written = 0; #endif - /* - #if (OOPSY_TARGET_FIELD || OOPSY_TARGET_VERSIO) - hardware.ProcessAnalogControls(); - #if OOPSY_TARGET_FIELD - hardware.UpdateDigitalControls(); - #endif - #else - hardware.DebounceControls(); - hardware.UpdateAnalogControls(); - #endif - */ - hardware.ProcessAllControls(); + hardware.ProcessAllControls(); - #ifdef OOPSY_TARGET_FIELD + #if defined(OOPSY_TARGET_FIELD) menu_button_held = hardware.GetSwitch(0)->Pressed(); menu_button_incr += hardware.GetSwitch(1)->FallingEdge(); menu_button_held_ms = hardware.GetSwitch(0)->TimeHeldMs(); if (hardware.GetSwitch(0)->FallingEdge()) menu_button_released = 1; - #elif OOPSY_TARGET_VERSIO - // menu_button_held = hardware.tap_.Pressed(); + #elif defined(OOPSY_TARGET_VERSIO) + // menu_button_held = hardware.tap.Pressed(); // menu_button_incr += hardware.GetKnobValue(6) * app_count; - // menu_button_held_ms = hardware.tap_.TimeHeldMs(); + // menu_button_held_ms = hardware.tap.TimeHeldMs(); // if (hardware.tap_.FallingEdge()) menu_button_released = 1; - #else - menu_button_held = hardware.encoder.Pressed(); + #elif defined(OOPSY_TARGET_POD) || defined(OOPSY_TARGET_PETAL) || defined(OOPSY_TARGET_PATCH) + menu_button_held = hardware.encoder.Pressed(); menu_button_incr += hardware.encoder.Increment(); menu_button_held_ms = hardware.encoder.TimeHeldMs(); if (hardware.encoder.FallingEdge()) menu_button_released = 1; @@ -700,6 +883,8 @@ namespace oopsy { // float * buf0 = scope_source ? buffers[0] : buffers[2]; // float * buf1 = scope_source ? buffers[1] : buffers[3]; size_t samples = scope_samples(); + if (samples > size) samples=size; + for (size_t i=0; i= SSD1309_WIDTH*2) scope_step = 0; + if (scope_step >= OLED_DISPLAY_WIDTH*2) scope_step = 0; } } #endif - #if (OOPSY_TARGET_POD) - hardware.UpdateLeds(); - #endif - frames++; + blockcount++; } #ifdef OOPSY_TARGET_HAS_OLED @@ -761,22 +943,57 @@ namespace oopsy { #if OOPSY_TARGET_USES_MIDI_UART void midi_postperform(float * buf, size_t size) { - for (size_t i=0; i= 0.f) { - // scale (0.0, 1.0) back to (0, 255) for MIDI bytes - midi_out_data[midi_out_written] = buf[i] * 256.0f; - midi_out_written++; - } + size_t i = 0; + int8_t byte = buf[i] * 256.0f; + uint32_t w1 = (midi_out_writeidx+1) % OOPSY_MIDI_BUFFER_SIZE; + while (byte >= 0 && i < size && w1 != midi_out_readidx) { + // scale (0.0, 1.0) back to (0, 255) for MIDI bytes + midi_out_data[midi_out_writeidx] = byte; + midi_out_writeidx = w1; + w1 = (midi_out_writeidx+1) % OOPSY_MIDI_BUFFER_SIZE; + i++; + byte = buf[i] * 256.0f; } + // for (size_t i=0; i= 0.f) { + // // scale (0.0, 1.0) back to (0, 255) for MIDI bytes + // midi_out_data[midi_out_written] = buf[i] * 256.0f; + // midi_out_written++; + // } + // } + } + + void midi_message1(uint8_t byte) { + uint32_t r = (midi_out_readidx + OOPSY_MIDI_BUFFER_SIZE - midi_out_writeidx) % OOPSY_MIDI_BUFFER_SIZE; + if (r > 0 && r <= 1) { log("midi buffer full"); return; } + uint32_t i0 = midi_out_writeidx; + uint32_t i1 = (midi_out_writeidx+1) % OOPSY_MIDI_BUFFER_SIZE; + midi_out_data[i0] = byte; + midi_out_writeidx = i1; + } + + void midi_message2(uint8_t status, uint8_t b1) { + uint32_t r = (midi_out_readidx + OOPSY_MIDI_BUFFER_SIZE - midi_out_writeidx) % OOPSY_MIDI_BUFFER_SIZE; + if (r > 0 && r <= 2) { log("midi buffer full"); return; } + uint32_t i0 = midi_out_writeidx; + uint32_t i1 = (midi_out_writeidx+1) % OOPSY_MIDI_BUFFER_SIZE; + uint32_t i2 = (midi_out_writeidx+2) % OOPSY_MIDI_BUFFER_SIZE; + midi_out_data[i0] = status; + midi_out_data[i1] = b1; + midi_out_writeidx = i2; } void midi_message3(uint8_t status, uint8_t b1, uint8_t b2) { - if (midi_out_written+3 < OOPSY_MIDI_BUFFER_SIZE) { - midi_out_data[midi_out_written] = status; - midi_out_data[midi_out_written+1] = b1; - midi_out_data[midi_out_written+2] = b2; - midi_out_written += 3; - } + uint32_t r = (midi_out_readidx + OOPSY_MIDI_BUFFER_SIZE - midi_out_writeidx) % OOPSY_MIDI_BUFFER_SIZE; + if (r > 0 && r <= 3) { log("midi buffer full"); return; } + uint32_t i0 = midi_out_writeidx; + uint32_t i1 = (midi_out_writeidx+1) % OOPSY_MIDI_BUFFER_SIZE; + uint32_t i2 = (midi_out_writeidx+2) % OOPSY_MIDI_BUFFER_SIZE; + uint32_t i3 = (midi_out_writeidx+3) % OOPSY_MIDI_BUFFER_SIZE; + midi_out_data[i0] = status; + midi_out_data[i1] = b1; + midi_out_data[i2] = b2; + midi_out_writeidx = i3; } void midi_nullData(Data& data) { @@ -787,11 +1004,12 @@ namespace oopsy { void midi_fromData(Data& data) { double b = data.read(midi_data_idx, 0); - while (b >= 0. && midi_out_written < OOPSY_MIDI_BUFFER_SIZE-1) { + while (b >= 0. && midi_out_writeidx != midi_out_readidx) { // erase it from [data midi] data.write(-1, midi_data_idx, 0); // write it to our active outbuffer: - midi_out_data[midi_out_written++] = b; + midi_out_data[midi_out_writeidx] = b; + midi_out_writeidx = (midi_out_writeidx+1) % OOPSY_MIDI_BUFFER_SIZE; // and advance one index in the [data midi] midi_data_idx++; if (midi_data_idx >= data.dim) midi_data_idx = 0; b = data.read(midi_data_idx, 0); @@ -812,16 +1030,16 @@ namespace oopsy { }; #endif - static void nullAudioCallback(float **hardware_ins, float **hardware_outs, size_t size); + static void nullAudioCallback(daisy::AudioHandle::InputBuffer ins, daisy::AudioHandle::OutputBuffer outs, size_t size); static void nullMainloopCallback(uint32_t t, uint32_t dt) {} } daisy; - void GenDaisy::nullAudioCallback(float **hardware_ins, float **hardware_outs, size_t size) { + void GenDaisy::nullAudioCallback(daisy::AudioHandle::InputBuffer ins, daisy::AudioHandle::OutputBuffer outs, size_t size) { daisy.nullAudioCallbackRunning = true; // zero audio outs: for (int i=0; iaudioCallback(daisy, hardware_ins, hardware_outs, size); #if (OOPSY_IO_COUNT == 4) - float * buffers[] = {hardware_ins[0], hardware_ins[1], hardware_ins[2], hardware_ins[3], hardware_outs[0], hardware_outs[1], hardware_outs[2], hardware_outs[3]}; + float * buffers[] = { + (float *)hardware_ins[0], (float *)hardware_ins[1], (float *)hardware_ins[2], (float *)hardware_ins[3], + hardware_outs[0], hardware_outs[1], hardware_outs[2], hardware_outs[3]}; #else - float * buffers[] = {hardware_ins[0], hardware_ins[1], hardware_outs[0], hardware_outs[1]}; + float * buffers[] = {(float *)hardware_ins[0], (float *)hardware_ins[1], hardware_outs[0], hardware_outs[1]}; #endif daisy.audio_postperform(buffers, size); - // convert elapsed time (200Mhz ticks) to CPU percentage (with a slew to capture fluctuations) - daisy.audioCpuUs += 0.03f*(((dsy_tim_get_tick() - start) / 200.f) - daisy.audioCpuUs); + // convert elapsed time (us) to CPU percentage (0-100) of available processing time + // 100 (%) * (0.000001 * used_us) * callbackrateHz + float percent = (daisy::System::GetUs() - start)*0.0001f*daisy.hardware.seed.AudioCallbackRate(); + percent = percent > 100.f ? 100.f : percent; + // with a falling-only slew to capture spikes, since we care most about worst-case performance + daisy.audioCpuUsage = (percent > daisy.audioCpuUsage) ? percent + : daisy.audioCpuUsage + 0.02f*(percent - daisy.audioCpuUsage); } - #ifdef OOPSY_HAS_PARAM_VIEW + #if defined(OOPSY_TARGET_HAS_OLED) && defined(OOPSY_HAS_PARAM_VIEW) static void staticParamCallback(int idx, char * label, int len, bool tweak) { T& self = *(T *)daisy.app; self.paramCallback(daisy, idx, label, len, tweak); } - #endif //OOPSY_HAS_PARAM_VIEW + #endif //defined(OOPSY_TARGET_HAS_OLED) && defined(OOPSY_HAS_PARAM_VIEW) }; }; // oopsy:: @@ -867,7 +1092,9 @@ namespace oopsy { void genlib_report_error(const char *s) { oopsy::daisy.log(s); } void genlib_report_message(const char *s) { oopsy::daisy.log(s); } -unsigned long genlib_ticks() { return dsy_system_getnow(); } +unsigned long genlib_ticks() { + return 0; //daisy::System::GetTick(); +} t_ptr genlib_sysmem_newptr(t_ptr_size size) { return (t_ptr)oopsy::allocate(size); diff --git a/source/libdaisy b/source/libdaisy index 7e578bb..df034a5 160000 --- a/source/libdaisy +++ b/source/libdaisy @@ -1 +1 @@ -Subproject commit 7e578bb13e80ecc406df01543116f46790ad3386 +Subproject commit df034a52c97f21c84b034b89fc53cc7ccf23245f diff --git a/source/oopsy.js b/source/oopsy.js index 7565047..7abf5ee 100755 --- a/source/oopsy.js +++ b/source/oopsy.js @@ -3,7 +3,35 @@ /* Generates and compiles wrapper code for gen~ export to Daisy hardware - Oopsy was authored by Graham Wakefield in 2020. + Oopsy was authored by Graham Wakefield in 2020-2021. + + Main entry-point is `run(...args)` + + Args are a command-line style argument list, see `help` below + At minimum they should include at least one path to a .cpp file exported from gen~ + + `run`: + - parses these args + - configures a target (JSON definition, #defines, samplerate, etc) + - visits each .cpp file via `analyze_cpp()` to define "app" data structures + - further configuration according to cpp analysis + - visits each "app" via `generate_app()` to prepare data for code generation + - generates a .cpp file according to the apps and options + - invokes arm-gcc to compile .cpp to binary, then dfu-util to upload to daisy + + `analyze_cpp`: + - defines a "gen" data structure representing features in the gen patcher + + `generate_app`: + - configure an "daisy" object representing features in the hardware + - configure a "gen" object representing features in the .cpp patch + + The general idea here is that there is a list of named "nodes" making a graph + most nodes are sources, + they may have a list of `to` destinations + they may have a `src` field naming another node they map from + some nodes are sinks, and have a list of 'from' sources + */ const fs = require("fs"), path = require("path"), @@ -21,28 +49,94 @@ function interpolate(str, data) { return str.replace(/\$<([^>]+)>/gm, (s, key) => data[key]) } +const template = (template, vars = {}) => { + const handler = new Function( + "vars", + [ + "const f = (" + Object.keys(vars).join(", ") + ")=>", + "`" + template + "`", + "return f(...Object.values(vars))" + ].join("\n") + ); + // console.log(Object.keys(vars)); + // console.log(handler); + return handler(vars); +}; + // prints a number as a C-style float: -function toCfloat(n) { +function asCppNumber(n, type="float") { let s = (+n).toString(); - // add point if needed: - if (s.includes("e")) { - return s; - } else if (s.includes(".")) { - return s + "f"; + if (type == "int" || type == "uint8_t" || type == "bool") { + return Math.trunc(n).toString() } else { - return s + ".f"; + // add point if needed: + if (s.includes("e")) { + return s; + } else if (s.includes(".")) { + return s + "f"; + } else { + return s + ".f"; + } + } +} + +let build_tools_path; +let has_dfu_util; +function checkBuildEnvironment() { + // check for available build tools: + if (os.platform == "win32") { + has_dfu_util = false; + try { + execSync("arm-none-eabi-gcc --version") + execSync("dfu-util --version") + // assume true for now, until we know how to test for it: + has_dfu_util = true; + } catch (e) { + console.warn(`oopsy can't find the ARM GCC build tools, will not be able to upload binary to the Daisy. Please check https://github.com/electro-smith/DaisyWiki/wiki/1e.-Getting-Started-With-Oopsy-(Gen~-Integration) for installation instructions.`) + process.exit(-1); + } + + } else { + // OSX: + let locations = ["/opt/homebrew/bin", "/usr/local/bin"] + for (loc of locations) { + if (fs.existsSync(`${loc}/arm-none-eabi-gcc`)) { + build_tools_path = loc; + console.log(`using build tools found in ${build_tools_path}`); + break; + } + } + if (!build_tools_path) { + console.log("oopsy can't find an ARM-GCC toolchain. Please check https://github.com/electro-smith/DaisyWiki/wiki/1e.-Getting-Started-With-Oopsy-(Gen~-Integration) for installation instructions.") + process.exit(-1); + } + if (fs.existsSync(`${build_tools_path}/dfu-util`)) { + has_dfu_util = true; + } else { + console.warn(`oopsy can't find the dfu-util binary in ${build_tools_path}, will not be able to upload binary to the Daisy. Please check https://github.com/electro-smith/DaisyWiki/wiki/1e.-Getting-Started-With-Oopsy-(Gen~-Integration) for installation instructions.`) + } } } const help = ` -<[cmds]> <[target]> <[cpps]> +<[cmds]> <[options]> <[cpps]> cmds: up/upload = (default) generate & upload gen/generate = generate only target: path to a JSON for the hardware config, or simply "patch", "field", "petal", "pod" etc. - Defaults to "patch" + Defaults to "daisy.patch.json" + +32kHz, 48kHz, "96kHz" will set the sampling rate of the binary + +block1, block2, etc. up to block256 will set the block size + +fastmath will replace some expensive math operations with faster approximations + +boost will increase the CPU from 400Mhz to 480Mhz + +nooled will disable code generration for OLED (it will be blank) cpps: paths to the gen~ exported cpp files first item will be the default app @@ -51,6 +145,263 @@ watch: script will not terminate actions will be re-run each time any of the cpp files are modified ` +const component_defs = { + Switch: { + typename: "daisy::Switch", + pin: "a", + type: "daisy::Switch::TYPE_MOMENTARY", + polarity: "daisy::Switch::POLARITY_INVERTED", + pull: "daisy::Switch::PULL_UP", + process: "${name}.Debounce();", + updaterate: "${name}.SetUpdateRate(seed.AudioCallbackRate());", + mapping: [ + { name: "${name}", get: "(hardware.${name}.Pressed()?1.f:0.f)", range: [0, 1] }, + { + name: "${name}_rise", + get: "(hardware.${name}.RisingEdge()?1.f:0.f)", + range: [0, 1] + }, + { + name: "${name}_fall", + get: "(hardware.${name}.FallingEdge()?1.f:0.f)", + range: [0, 1] + }, + { + name: "${name}_seconds", + get: "(hardware.${name}.TimeHeldMs()*0.001f)", + range: null + } + ] + }, + Switch3: { + typename: "daisy::Switch3", + pin: "a,b", + mapping: [ + { name: "${name}", get: "(hardware.${name}.Read()*0.5f+0.5f)", range: [0, 2] } + ] + }, + Encoder: { + typename: "daisy::Encoder", + pin: "a,b,click", + process: "${name}.Debounce();", + updaterate: "${name}.SetUpdateRate(seed.AudioCallbackRate());", + mapping: [ + { + name: "${name}", + get: "(hardware.${name}.Increment()*0.5f+0.5f)", + range: [-1, 1] + }, + { + name: "${name}_press", + get: "(hardware.${name}.Pressed()?1.f:0.f)", + range: [0, 1] + }, + { + name: "${name}_rise", + get: "(hardware.${name}.RisingEdge()?1.f:0.f)", + range: [0, 1] + }, + { + name: "${name}_fall", + get: "(hardware.${name}.FallingEdge()?1.f:0.f)", + range: [0, 1] + }, + { + name: "${name}_seconds", + get: "(hardware.${name}.TimeHeldMs()*0.001f)", + range: null + } + ] + }, + GateIn: { + typename: "daisy::GateIn", + pin: "a", + mapping: [ + { name: "${name}", get: "(hardware.${name}.State()?1.f:0.f)", range: [0, 1] }, + { name: "${name}_trig", get: "(hardware.${name}.Trig()?1.f:0.f)", range: [0, 1] } + ] + }, + AnalogControl: { + typename: "daisy::AnalogControl", + pin: "a", + flip: false, + invert: false, + slew: "1.0/seed.AudioCallbackRate()", + process: "${name}.Process();", + updaterate: "${name}.SetSampleRate(seed.AudioCallbackRate());", + mapping: [{ name: "${name}", get: "(hardware.${name}.Value())", range: [0, 1] }] + }, + Led: { + typename: "daisy::Led", + pin: "a", + invert: true, + postprocess: "${name}.Update();", + mapping: [{ name: "${name}", set: "hardware.${name}.Set($);" }] + }, + RgbLed: { + typename: "daisy::RgbLed", + pin: "r,g,b", + invert: true, + postprocess: "${name}.Update();", + mapping: [ + { name: "${name}_red", set: "hardware.${name}.SetRed($);" }, + { name: "${name}_green", set: "hardware.${name}.SetGreen($);" }, + { name: "${name}_blue", set: "hardware.${name}.SetBlue($);" }, + { name: "${name}", set: "hardware.${name}.Set(clamp(-$, 0.f, 1.f), 0.f, clamp($, 0.f, 1.f));" }, + { name: "${name}_white", set: "hardware.${name}.Set($,$,$);" } + ] + }, + GateOut: { + typename: "daisy::dsy_gpio", + pin: "a", + mode: "DSY_GPIO_MODE_OUTPUT_PP", + pull: "DSY_GPIO_NOPULL", + mapping: [ + { name: "${name}", set: "dsy_gpio_write(&hardware.${name}, $ } 0.f);" } + ] + }, + CVOuts: { + typename: "daisy::DacHandle::Config", + pin: "", + bitdepth: "daisy::DacHandle::BitDepth::BITS_12", + buff_state: "daisy::DacHandle::BufferState::ENABLED", + mode: "daisy::DacHandle::Mode::POLLING", + channel: "daisy::DacHandle::Channel::BOTH", + mapping: [ + { + name: "${name}1", + set: "hardware.${name}.WriteValue(daisy::DacHandle::Channel::ONE, $ * 4095)", + where: "main" + }, + { + name: "${name}2", + set: "hardware.${name}.WriteValue(daisy::DacHandle::Channel::TWO, $ * 4095)", + where: "main" + } + ] + } +}; + +// generate the struct +function generate_target_struct(target) { + + // flesh out target components: + let components = Object.entries(target.components) + .sort((a, b) => + a[1].component < b[1].component + ? -1 + : a[1].component > b[1].component + ? 1 + : 0 + ) + .map((pair) => { + let [name, def] = pair; + def.name = name; + let component = component_defs[def.component]; + if (component) { + // copy component defaults into the def + // TODO this should be recursive for object structures... + for (let k of Object.keys(component)) { + if (def[k] == undefined) def[k] = component[k]; + } + } else { + throw new Error("undefined component kind: " + def.component); + } + return def; + }); + target.components = components; + target.name = target.name || "custom" + + return ` +#include "daisy_seed.h" +// name: ${target.name} +struct Daisy { + + void Init(bool boost = false) { + seed.Configure(); + seed.Init(boost); + ${components.filter((e) => e.init) + .map((e) => ` + ${template(e.init, e)}` + ).join("")} + ${components.filter((e) => e.typename == "daisy::Switch") + .map((e, i) => ` + ${e.name}.Init(seed.GetPin(${e.pin}), seed.AudioCallbackRate(), ${e.type}, ${e.polarity}, ${e.pull});` + ).join("")} + ${components.filter((e) => e.typename == "daisy::Switch3").map((e, i) => ` + ${e.name}.Init(seed.GetPin(${e.pin.a}), seed.GetPin(${e.pin.b}));` + ).join("")} + ${components.filter((e) => e.typename == "daisy::GateIn").map((e, i) => ` + dsy_gpio_pin ${e.name}_pin = seed.GetPin(${e.pin}); + ${e.name}.Init(&${e.name}_pin);` + ).join("")} + ${components.filter((e) => e.typename == "daisy::Encoder").map((e, i) => ` + ${e.name}.Init(seed.GetPin(${e.pin.a}), seed.GetPin(${e.pin.b}), seed.GetPin(${e.pin.click}), seed.AudioCallbackRate());` + ).join("")} + static const int ANALOG_COUNT = ${ + components.filter((e) => e.typename == "daisy::AnalogControl").length}; + daisy::AdcChannelConfig cfg[ANALOG_COUNT]; + ${components.filter((e) => e.typename == "daisy::AnalogControl").map((e, i) => ` + cfg[${i}].InitSingle(seed.GetPin(${e.pin}));`).join("")} + seed.adc.Init(cfg, ANALOG_COUNT); + ${components.filter((e) => e.typename == "daisy::AnalogControl").map((e, i) => ` + ${e.name}.Init(seed.adc.GetPtr(${i}), seed.AudioCallbackRate());`).join("")} + ${components.filter((e) => e.typename == "daisy::Led").map((e, i) => ` + ${e.name}.Init(seed.GetPin(${e.pin}), ${e.invert}); + ${e.name}.Set(0.0f);`).join("")} + ${components.filter((e) => e.typename == "daisy::RgbLed").map((e, i) => ` + ${e.name}.Init(seed.GetPin(${e.pin.r}), seed.GetPin(${e.pin.g}), seed.GetPin(${e.pin.b}), ${e.invert}); + ${e.name}.Set(0.0f, 0.0f, 0.0f);`).join("")} + ${components.filter((e) => e.typename == "daisy::dsy_gpio").map((e, i) => ` + ${e.name}.pin = seed.GetPin(${e.pin}); + ${e.name}.mode = ${e.mode}; + ${e.name}.pull = ${e.pull}; + dsy_gpio_init(&${e.name});`).join("")} + ${components.filter((e) => e.typename == "daisy::DacHandle::Config").map((e, i) => ` + ${e.name}.bitdepth = ${e.bitdepth}; + ${e.name}.buff_state = ${e.buff_state}; + ${e.name}.mode = ${e.mode}; + ${e.name}.chn = ${e.channel}; + seed.dac.Init(${e.name}); + seed.dac.WriteValue(${e.channel}, 0);`).join("")} + } + + void ProcessAllControls() { + ${components.filter((e) => e.process).map((e) => ` + ${template(e.process, e)}`).join("")} + } + + void PostProcess() { + ${components.filter((e) => e.postprocess).map((e) => ` + ${template(e.postprocess, e)}`).join("")} + } + + void Display() { + ${components.filter((e) => e.display).map((e) => ` + ${template(e.display, e)}`).join("")} + } + + void SetAudioSampleRate(daisy::SaiHandle::Config::SampleRate samplerate) { + seed.SetAudioSampleRate(samplerate); + SetHidUpdateRates(); + } + + void SetAudioBlockSize(size_t size) { + seed.SetAudioBlockSize(size); + SetHidUpdateRates(); + } + + void SetHidUpdateRates() { + ${components.filter((e) => e.updaterate).map((e) => ` + ${template(e.updaterate, e)}`).join("")} + } + + daisy::DaisySeed seed; + ${components.map((e) => ` + ${e.typename} ${e.name};`).join("")} +};`; +} + let watchers = [] // the script can be invoked directly as a command-line program, @@ -69,7 +420,11 @@ function run() { let watch = false let cpps = [] let samplerate = 48 + let blocksize = 48 + let options = {} + checkBuildEnvironment(); + if (args.length == 0) { console.log(help) return; @@ -79,42 +434,62 @@ function run() { switch (arg) { case "help": {console.log(help); process.exit(0);} break; case "generate": - case "gen": {action="generate";} break; + case "gen": action="generate"; break; case "upload": - case "up": {action="upload";} break; + case "up": action="upload"; break; case "pod": case "field": case "petal": case "patch": - case "versio": {target = arg;} break; + case "versio": target = arg; break; case "watch": watch=true; break; - case "96": - case "96kHz": samplerate = 96; break; - case "48": - case "48kHz": samplerate = 48; break; - case "32": - case "32kHz": samplerate = 32; break; - default: { + case "96kHz": + case "48kHz": + case "32kHz": samplerate = +(arg.match(/(\d+)kHz/)[1]); break; + + case "block1": + case "block2": + case "block4": + case "block6": + case "block8": + case "block12": + case "block16": + case "block24": + case "block32": + case "block48": + case "block64": + case "block96": + case "block128": + case "block256": blocksize = +(arg.match(/block(\d+)/)[1]); break; + + case "writejson": + case "nooled": + case "boost": + case "fastmath": options[arg] = true; break; - if (fs.existsSync(arg)) { - if (fs.lstatSync(arg).isDirectory()) { - // add a whole folder full of cpps: - cpps = cpps.concat(fs.readdirSync(arg) - .filter(s => path.parse(s).ext == ".cpp") - .map(s => path.join(arg, s)) - ) - } else { - let p = path.parse(arg); - switch(p.ext) { - case ".json": {target_path = arg; target = ""}; break; - case ".cpp": cpps.push(arg); break; - // case ".gendsp": - // case ".maxpat": - // case ".maxhelp": {pat_path = arg}; break; - default: { - console.warn("unexpected input", arg); - } + default: { + // assume anything else is a file path: + if (!fs.existsSync(arg)) { + console.log(`oopsy error: ${arg} is not a recognized argument or a path that does not exist`) + process.exit(-1) + } + if (fs.lstatSync(arg).isDirectory()) { + // add a whole folder full of cpps: + cpps = cpps.concat(fs.readdirSync(arg) + .filter(s => path.parse(s).ext == ".cpp") + .map(s => path.join(arg, s)) + ) + } else { + let p = path.parse(arg); + switch(p.ext) { + case ".json": {target_path = arg; target = ""}; break; + case ".cpp": cpps.push(arg); break; + // case ".gendsp": + // case ".maxpat": + // case ".maxhelp": {pat_path = arg}; break; + default: { + console.warn("unexpected input", arg); } } } @@ -127,18 +502,93 @@ function run() { if (acc.indexOf(s) === -1) acc.push(s) return acc }, []); + cpps.sort((a,b)=>{ + return path.basename(a) < path.basename(b) ? -1 : 0; + }) + + let OOPSY_TARGET_SEED = 0 // configure target: if (!target && !target_path) target = "patch"; if (!target_path) { target_path = path.join(__dirname, `daisy.${target}.json`); } else { - target = path.parse(target_path).name; + OOPSY_TARGET_SEED = 1 + target = path.parse(target_path).name.replace(".", "_") } console.log(`Target ${target} configured in path ${target_path}`) assert(fs.existsSync(target_path), `couldn't find target configuration file ${target_path}`); const hardware = JSON.parse(fs.readFileSync(target_path, "utf8")); + hardware.max_apps = hardware.max_apps || 1 + + // The following is compatibility code, so that the new JSON structure will generate the old JSON structure + // At the point that the old one can be retired (because e.g. Patch, Petal etc can be defined in the new format) + // this script should be revised to eliminate the old workflow + { + hardware.inputs = hardware.inputs || {} + hardware.outputs = hardware.outputs || {} + hardware.datahandlers = hardware.datahandlers || {} + hardware.labels = hardware.labels || { + "params": {}, + "outs": {}, + "datas": {} + } + hardware.inserts = hardware.inserts || [] + hardware.defines = hardware.defines || {} + hardware.struct = ""; + + if (hardware.components) { + hardware.struct = generate_target_struct(hardware); + // generate IO + for (let component of hardware.components) { + for (let mapping of component.mapping) { + let name = template(mapping.name, component); + if (mapping.get) { + // an input + hardware.inputs[name] = { + code: template(mapping.get, component), + automap: component.automap && name == component.name, + range: mapping.range, + where: mapping.where + } + hardware.labels.params[name] = name + } + if (mapping.set) { + // an output + hardware.outputs[name] = { + code: template(mapping.set, component), + automap: component.automap && name == component.name, + range: mapping.range, + where: mapping.where || "audio" + } + hardware.labels.outs[name] = name + } + } + } + } + for (let alias in hardware.aliases) { + let map = hardware.aliases[alias] + if (hardware.labels.params[map]) hardware.labels.params[alias] = map + if (hardware.labels.outs[map]) hardware.labels.outs[alias] = map + if (hardware.labels.datas[map]) hardware.labels.datas[alias] = map + } + + if (OOPSY_TARGET_SEED) hardware.defines.OOPSY_TARGET_SEED = OOPSY_TARGET_SEED + } + + // consolidate hardware definition: hardware.samplerate = samplerate + if (hardware.defines.OOPSY_IO_COUNT == undefined) hardware.defines.OOPSY_IO_COUNT = 2 + if (!hardware.max_apps) hardware.max_apps = 1; + + hardware.defines.OOPSY_SAMPLERATE = samplerate * 1000 + hardware.defines.OOPSY_BLOCK_SIZE = blocksize + hardware.defines.OOPSY_BLOCK_RATE = hardware.defines.OOPSY_SAMPLERATE / blocksize + + //hardware.defines.OOPSY_USE_LOGGING = 1 + //hardware.defines.OOPSY_USE_USB_SERIAL_INPUT = 1 + + //console.log(hardware) // verify and analyze cpps: assert(cpps.length > 0, "an argument specifying the path to at least one gen~ exported cpp file is required"); @@ -150,11 +600,12 @@ function run() { assert(fs.existsSync(cpp_path), `couldn't find source C++ file ${cpp_path}`); return { path: cpp_path, - patch: analyze_cpp(fs.readFileSync(cpp_path, "utf8")) + patch: analyze_cpp(fs.readFileSync(cpp_path, "utf8"), hardware, cpp_path) } }) let build_name = apps.map(v=>v.patch.name).join("_") + // configure build path: const build_path = path.join(__dirname, `build_${build_name}_${target}`) console.log(`Building to ${build_path}`) @@ -168,12 +619,29 @@ function run() { hardware: hardware, apps: apps, } - - // add watcher - if (watch && watchers.length < 1) { - watchers = cpps.map(cpp_path => fs.watch(cpp_path, (event, filepath)=>{ - run(...args); - })) + + let defines = hardware.defines; + + if (defines.OOPSY_TARGET_HAS_MIDI_INPUT || defines.OOPSY_TARGET_HAS_MIDI_OUTPUT) { + defines.OOPSY_TARGET_USES_MIDI_UART = 1 + } + + if (apps.length > 1) { + defines.OOPSY_MULTI_APP = 1 + // generate midi-handling code for any multi-app on a midi-enabled platform + // so that program-change messages for apps will work: + if (hardware.defines.OOPSY_TARGET_HAS_MIDI_INPUT) { + hardware.defines.OOPSY_TARGET_USES_MIDI_UART = 1 + } + } + if (options.nooled && defines.OOPSY_TARGET_HAS_OLED) { + delete defines.OOPSY_TARGET_HAS_OLED; + } + if (defines.OOPSY_TARGET_HAS_OLED && defines.OOPSY_HAS_PARAM_VIEW && defines.OOPSY_HAS_ENCODER) { + defines.OOPSY_CAN_PARAM_TWEAK = 1 + } + if (options.fastmath) { + hardware.defines.GENLIB_USE_FASTMATH = 1; } const makefile_path = path.join(build_path, `Makefile`) @@ -186,6 +654,7 @@ TARGET = ${build_name} CPP_SOURCES = ${posixify_path(path.relative(build_path, maincpp_path).replace(" ", "\\ "))} # Library Locations LIBDAISY_DIR = ${(posixify_path(path.relative(build_path, path.join(__dirname, "libdaisy"))).replace(" ", "\\ "))} +${hardware.defines.OOPSY_TARGET_USES_SDMMC ? `USE_FATFS = 1`:``} # Optimize (i.e. CFLAGS += -O3): OPT = -O3 # Core location, and generic Makefile. @@ -196,33 +665,53 @@ CFLAGS+=-I"${posixify_path(path.relative(build_path, path.join(__dirname, "gen_d # Silence irritating warnings: CFLAGS+=-O3 -Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable CPPFLAGS+=-O3 -Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable + `, "utf-8"); - // didn't seem to be working: - //# Enable printing of floats (for OLED display) - //LDFLAGS+=-u _printf_float console.log(`Will ${action} from ${cpps.join(", ")} by writing to:`) console.log(`\t${maincpp_path}`) console.log(`\t${makefile_path}`) console.log(`\t${bin_path}`) - - let defines = Object.assign({}, hardware.defines); - if (target == "patch") defines.OOPSY_HAS_PARAM_VIEW = 1 - if (apps.length > 1) defines.OOPSY_MULTI_APP = 1 - if (hardware.oled) defines.OOPSY_TARGET_HAS_OLED = 1 + + // add watcher + if (watch && watchers.length < 1) { + watchers = cpps.map(cpp_path => fs.watch(cpp_path, (event, filepath)=>{ + run(...args); + })) + } apps.map(app => { - generate_app(app, hardware, target, defines); + generate_app(app, hardware, target, config); return app; }) // store for debugging: - //fs.writeFileSync(path.join(build_path, `${build_name}_${target}.json`), JSON.stringify(config,null," "),"utf8"); + if (options.writejson) fs.writeFileSync(path.join(build_path, `${build_name}_${target}.json`), JSON.stringify(config,null," "),"utf8"); + + const cppcode = ` +/* + +This code was generated by Oopsy (https://github.com/electro-smith/oopsy) on ${new Date().toString()} + +Oopsy was authored in 2020-2021 by Graham Wakefield. Copyright 2021 Electrosmith, Corp. and Graham Wakefield. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - const cppcode = `${Object.keys(defines).map(k => ` -#define ${k} (${defines[k]})`).join("")} +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +/* + For details of the licensing terms of code exported from gen~ see https://support.cycling74.com/hc/en-us/articles/360050779193-Gen-Code-Export-Licensing-FAQ +*/ +${Object.keys(hardware.defines).map(k=>` +#define ${k} (${hardware.defines[k]})`).join("")} +${hardware.struct} + +${hardware.inserts.filter(o => o.where == "header").map(o => o.code).join("\n")} #include "../genlib_daisy.h" #include "../genlib_daisy.cpp" + ${apps.map(app => `#include "${posixify_path(path.relative(build_path, app.path))}"`).join("\n")} ${apps.map(app => app.cpp.struct).join("\n")} @@ -236,7 +725,12 @@ oopsy::AppDef appdefs[] = { }; int main(void) { - return oopsy::daisy.run(appdefs, ${apps.length}, daisy::SaiHandle::Config::SampleRate::SAI_${samplerate}KHZ); + oopsy::daisy.hardware.Init(${options.boost|false}); + oopsy::daisy.hardware.SetAudioSampleRate(daisy::SaiHandle::Config::SampleRate::SAI_${hardware.samplerate}KHZ); + oopsy::daisy.hardware.SetAudioBlockSize(${hardware.defines.OOPSY_BLOCK_SIZE}); + ${hardware.inserts.filter(o => o.where == "init").map(o => o.code).join("\n\t")} + // insert custom hardware initialization here + return oopsy::daisy.run(appdefs, ${apps.length}); } ` fs.writeFileSync(maincpp_path, cppcode, "utf-8"); @@ -245,60 +739,150 @@ int main(void) { // now try to make: try { - try { - if (os.platform() == "win32") { - // Don't use `make clean`, as `rm` is not default on Windows - // /Q suppresses the Y/n prompt - console.log(execSync("del /Q build", { cwd: build_path }).toString()) - // Gather up make output to run command per line as child process - let build_cmd = execSync("make -n", { cwd: build_path }).toString().split(os.EOL) - build_cmd.forEach(line => { - // Silently execute the commands line-by-line. - if (line.length > 0) - execSync(line, { cwd: build_path }).toString() - }) - } else { - console.log(execSync("make clean", { cwd: build_path }).toString()) - console.log(execSync("export PATH=$PATH:/usr/local/bin && make", { cwd: build_path }).toString()) - } - - console.log("oopsy compiled code") - } catch (e) { - // errors from make here - console.error("make failed"); - } - // if successful, try to upload to hardware: - if (fs.existsSync(bin_path) && action=="upload") { - - console.log("oopsy flashing...") - - if (os.platform() == "win32") { - console.log(execSync("set PATH=%PATH%;/usr/local/bin && make program-dfu", { cwd: build_path }).toString()) - } else { - console.log(execSync("export PATH=$PATH:/usr/local/bin && make program-dfu", { cwd: build_path, stdio:'inherit' }).toString()) - //console.log(execSync("export PATH=$PATH:/usr/local/bin && make program-dfu", { cwd: build_path }).toString()) - //console.log(execSync("export PATH=$PATH:/usr/local/bin && make program-dfu", { cwd: build_path, stdio:'inherit' }) + console.log("oopsy compiling...") + if (os.platform() == "win32") { + // Don't use `make clean`, as `rm` is not default on Windows + // /Q suppresses the Y/n prompt + console.log(execSync("del /Q build", { cwd: build_path }).toString()) + // Gather up make output to run command per line as child process + let build_cmd = execSync("make -n", { cwd: build_path }).toString().split(os.EOL) + build_cmd.forEach(line => { + // Silently execute the commands line-by-line. + if (line.length > 0) + execSync(line, { cwd: build_path }).toString() + }) + console.log(`oopsy created binary ${Math.ceil(fs.statSync(posixify_path(path.join(build_path, "build", build_name+".bin")))["size"]/1024)}KB`) + // if successful, try to upload to hardware: + if (has_dfu_util && action=="upload") { + console.log("oopsy flashing...") + + exec(`make program-dfu`, { cwd: build_path }, (err, stdout, stderr)=>{ + console.log("stdout", stdout) + console.log("stderr", stderr) + if (err) { + if (err.message.includes("No DFU capable USB device available")) { + console.log("oopsy daisy not ready on USB") + return; + } else if (stdout.includes("File downloaded successfully")) { + console.log("oopsy flashed") + } else { + console.log("oopsy dfu error") + console.log(err.message); + return; + } + } else if (stderr) { + console.log("oopsy dfu error") + console.log(stderr); + return; + } + }); } - - console.log("oopsy flashed") + } else { + exec(`export PATH=$PATH:${build_tools_path} && make clean && make`, { cwd: build_path }, (err, stdout, stderr)=>{ + if (err) { + console.log("oopsy compiler error") + console.log(err); + console.log(stderr); + return; + } + console.log(`oopsy created binary ${Math.ceil(fs.statSync(posixify_path(path.join(build_path, "build", build_name+".bin")))["size"]/1024)}KB`) + // if successful, try to upload to hardware: + if (has_dfu_util && action=="upload") { + console.log("oopsy flashing...") + exec(`export PATH=$PATH:${build_tools_path} && make program-dfu`, { cwd: build_path }, (err, stdout, stderr)=>{ + console.log("stdout", stdout) + console.log("stderr", stderr) + if (err) { + if (err.message.includes("No DFU capable USB device available")) { + console.log("oopsy daisy not ready on USB") + return; + } else if (stdout.includes("File downloaded successfully")) { + console.log("oopsy flashed") + } else { + console.log("oopsy dfu error") + console.log(err.message); + return; + } + } else if (stderr) { + console.log("oopsy dfu error") + console.log(stderr); + return; + } + }); + } + }); } } catch (e) { // errors from make here - console.log("upload failed"); + console.log("oopsy build failed", e); } - console.log("oopsy done") } -function analyze_cpp(cpp) { +function analyze_cpp(cpp, hardware, cpp_path) { + + // helper function to parse initializers: + function constexpr(s) { + return eval(s + // remove any (int) or (t_sample) casts + .replace("(int)", "") + .replace("(t_sample)", "") + // then replace any samplerate or vectorsize constants + .replace("samplerate", hardware.defines.OOPSY_SAMPLERATE) + .replace("vectorsize", hardware.defines.OOPSY_BLOCK_SIZE) + // remove extraneous whitespace + .trim() + // then compute the result via eval + ) + } + let gen = { name: /namespace\s+(\w+)\s+{/gm.exec(cpp)[1], ins: (/gen_kernel_innames\[\]\s=\s{\s([^}]*)/g).exec(cpp)[1].split(",").map(s => s.replace(/"/g, "").trim()), outs: (/gen_kernel_outnames\[\]\s=\s{\s([^}]*)/g).exec(cpp)[1].split(",").map(s => s.replace(/"/g, "").trim()), params: [], datas: [], + + // search for history outs: + // i.e. any history with "_out" on its name + histories: (cpp.match(/t_sample\s+(m_([\w]+)_out_\d+);/gm) || []).map(s=>{ + + const match = /t_sample\s+(m_([\w]+)_out_\d+);/gm.exec(s); + let cname = match[1] + let name = match[2]; + let result = { + cname: cname, + name: name, + } + + // if this is a midi output, decode the features + let midimatch + if (midimatch = /midi_note(\d*)(_(pitch|vel|press|chan))?/g.exec(name) ) { + result.midi_type = "note"; + result.midi_num = midimatch[1] !== "" && midimatch[1] !== undefined ? +midimatch[1] : 1; + result.midi_notetype = midimatch[3] || "pitch" + } else + if (midimatch = /midi_(program|cc|vel|drum)(\d*)(_ch(\d+))?/g.exec(name)) { + result.midi_type = midimatch[1]; + result.midi_num = midimatch[2] !== "" && midimatch[2] !== undefined ? +midimatch[2] : 1; + result.midi_chan = +midimatch[4] || 1; + } else + if (midimatch = /midi_(bend|press)(_ch(\d+))?/g.exec(name)) { + result.midi_type = midimatch[1]; + result.midi_chan = +midimatch[3] || 1; + } else + if (midimatch = /midi_(clock|stop|start|continue|sense|reset)?/g.exec(name)) { + result.midi_type = midimatch[1]; + } + + // find the initializer: + result.default = constexpr( new RegExp(`\\s${cname}\\s+=\\s+([^;]+);`, "gm").exec(cpp)[1] ); + + return result; + }), } + let paramdefinitions = (cpp.match(/pi = self->__commonstate.params([^\/]+)/gm) || []); - paramdefinitions.forEach((s, i)=>{ + paramdefinitions.forEach((s)=>{ let type = /pi->paramtype\s+=\s+([^;]+)/gm.exec(s)[1]; let param = { name: /pi->name\s+=\s+"([^"]+)/gm.exec(s)[1], @@ -312,61 +896,79 @@ function analyze_cpp(cpp) { //param.default = +new RegExp(`\\s${param.cname}\\s+=\\s+\\(\\(\\w+\\)([^\\)]+)`, "gm").exec(cpp)[1] param.default = +new RegExp(`\\s${param.cname}\\s+=[^\\d\\.-]*([\\d\\.-]+)`, "gm").exec(cpp)[1] gen.params.push(param) + // enable display of params: + if (hardware.defines.OOPSY_TARGET_HAS_OLED) hardware.defines.OOPSY_HAS_PARAM_VIEW = 1; } else if (type == "GENLIB_PARAMTYPE_SYM") { - let match = new RegExp(`\\s([\\w]+)\\.reset\\("${param.name}",\\s+\\(\\(int\\)(\\d+)\\), \\(\\(int\\)(\\d+)\\)\\);`, 'gm').exec(cpp) - param.cname = match[1], param.dim = match[2], param.chans = match[3] - gen.datas.push(param) + /* + General form: + m_huge_7.reset("huge", , ); + + Some possible variant forms of : + // (note: same format can appear in length and channels clauses) + m_huge_7.reset("huge", ((int)16384), ((int)1)); + m_huge_7.reset("huge", samplerate, ((int)1)); + m_huge_7.reset("huge", (samplerate * 2), ((int)1)); + m_huge_7.reset("huge", ((t_sample)3.1415926535898), ((int)1)); + m_huge_7.reset("huge", (3.1415926535898 * 10), ((int)1)); + m_huge_7.reset("huge", (vectorsize * 8), ((int)1)); + m_huge_7.reset("huge", ((16 * 16) * 4096), ((int)1)); + + Ignore any (int) or (t_sample) + Replace any samplerate or vectorsize + Compute any math + + \s([\w]+)\.reset\("huge",\s+\(\(int\)(\d+)\), \(\(int\)(\d+)\)\); + + + \s([\w]+)\.reset\("huge",\s+[^,]+,\s+[^,]+); + */ + + //let pat = `\\s([\\w]+)\\.reset\\("${param.name}",\\s+\\(\\(int\\)(\\d+)\\), \\(\\(int\\)(\\d+)\\)\\);`; + let pat = `\\s([\\w]+)\\.reset\\("${param.name}",([^;]+);` + let match = new RegExp(pat, 'gm').exec(cpp) + if (match) { + param.cname = match[1] + // for the length & channel arguments: + // first trim of the trailing ")" + // then split by the comma to [length, channel] + // then apply a series of replacements and finally eval() the result + let args = match[2].slice(0, -1).split(",").map(s => constexpr(s)) + + assert(typeof args[0] == "number" && args[0] > 0, `failed to derive length of data ${param.name}`) + assert(typeof args[1] == "number" && args[0] > 0, `failed to derive channels of data ${param.name}`) + + param.dim = Math.round(args[0]) + param.chans = Math.round(args[1]) + gen.datas.push(param) + + let wavname + let wavmatch = /(\w+)_wav$/g.exec(param.name) + if (wavmatch) { + wavname = wavmatch[1]+".wav"; + } else { + let wavpath = path.join(cpp_path, "..", param.name+".wav") + if (fs.existsSync(wavpath)) { + console.log(`[data ${param.name}] has possible source: ${path.resolve( wavpath )}`) + wavname = param.name+".wav"; + //wavpath = path.resolve( wavpath ) + } + } + if (wavname) { + param.wavname = wavname + // mark hardware accordingly: + hardware.defines.OOPSY_TARGET_USES_SDMMC = 1 + hardware.defines.USE_FATFS = 1 + } + } else { + console.error("failed to match details of data "+param.name) + } } }) return gen; } -function generate_daisy(hardware, nodes, target) { +function generate_daisy(hardware, nodes) { let daisy = { - audio_ins: hardware.audio_ins.map((v, i)=>{ - let name = `dsy_in${i+1}` - nodes[name] = { - name: name, - // name: name, - // kind: "input_buffer", - // index: i, - to: [], - } - return name; - }), - audio_outs: hardware.audio_outs.map((v, i)=>{ - let name = `dsy_out${i+1}` - nodes[name] = { - name: name, - // name: name, - // kind: "output_buffer", - // index: i, - to: [], // what non-audio outputs it maps to - src: null, // what audio content it draws from - } - return name; - }), - midi_ins: hardware.midi_ins.map((v, i)=>{ - let name = `dsy_midi_in${i+1}` - nodes[name] = { - name: name, - // buffername: name, - // index: i, - to: [], - } - return name; - }), - midi_outs: hardware.midi_outs.map((v, i)=>{ - let name = `dsy_midi_out${i+1}` - nodes[name] = { - name: name, - // buffername: name, - // index: i, - from: [], - } - return name; - }), - // DEVICE INPUTS: device_inputs: Object.keys(hardware.inputs).map(v => { let name = v @@ -377,7 +979,6 @@ function generate_daisy(hardware, nodes, target) { return name; }), - // DEVICE OUTPUTS: datahandlers: Object.keys(hardware.datahandlers).map(name => { nodes[name] = Object.assign({ name: name, @@ -395,34 +996,83 @@ function generate_daisy(hardware, nodes, target) { } return name; }), + // configured below + audio_ins: [], + audio_outs: [], + } + let input_count = hardware.defines.OOPSY_IO_COUNT; + let output_count = hardware.defines.OOPSY_IO_COUNT; + for (let i=0; i{ let name = "gen_in"+(i+1) let label = s.replace(/"/g, "").trim(); let src = null; // figure out the src: - if (label == "midi") { + if (label == "midi" || label == "midithru") { if (daisy.midi_ins.length) { src = daisy.midi_ins[0] app.has_midi_in = true; + app.has_generic_midi_in = true; + if (label == "midithru") app.has_generic_midi_thru = true; } } else if (daisy.audio_ins.length > 0) { src = daisy.audio_ins[i % daisy.audio_ins.length]; @@ -439,6 +1089,7 @@ function generate_app(app, hardware, target, defines) { return name; }) + gen.audio_outs = app.patch.outs.map((s, i)=>{ let name = "gen_out"+(i+1) let label = s.replace(/"/g, "").trim(); @@ -477,49 +1128,7 @@ function generate_app(app, hardware, target, defines) { } }) - // check for dedicated midi patterns: - let match - // e.g. - // [out 5 midi_cc100_ch1] // input is 0..1 for cc value - // [out 6 midi_cc74] // default channel 1 - if (match = (/^midi_cc(\d+)(_(ch)?(\d+))?/g).exec(label)) { - app.has_midi_out = true; - node.midi_setter = `daisy.midi_message3(${176+(((+match[4])||1)-1)%16}, ${(+match[1])%128}, (uint8_t(${node.src}[size-1]*127.f)) & 0x7F)`; - } - - // e.g. - // [out 5 midi_bend_ch1] // input is -1..1 for full bend range - // [out 6 midi_bend] // default channel 1 - else if (match = (/^midi_bend(_(ch)?(\d+))?/g).exec(label)) { - let ch = +match[3] || 1; - let status = 224 + (ch-1)%16; - app.has_midi_out = true; - console.log(label, "MIDI BEND", ch, status) - - app.has_midi_out = true; - node.midi_setter = `daisy.midi_message3(${224+(((+match[4])||1)-1)%16}, 0, (uint8_t((${node.src}[size-1]+1.f)*64.f)) & 0x7F)`; - //node.midi_setter = `daisy.midi_message3(${224+(((+match[4])||1)-1)%16}, uint8_t((${node.src}[size-1]+1.f)*8192.f) & 0x7F, 64)`; - } - - // e.g. - // [out 5 midi_drum36] - else if (match = (/^midi_drum(\d+)?/g).exec(label)) { - app.has_midi_out = true; - node.midi_setter = `daisy.midi_message3(153, ${(+match[1])%128}, (uint8_t(${node.src}[size-1]*127.f)) & 0x7F)`; - } - - // e.g. - // [out 5 midi_note36_ch10] // input is 0..1 for note velocity - // [out 6 midi_note60] // default channel 1 - else if (match = (/^midi_note(\d+)(_(ch)?(\d+))?/g).exec(label)) { - app.has_midi_out = true; - node.midi_setter = `daisy.midi_message3(${144+(((+match[4])||1)-1)%16}, ${(+match[1])%128}, (uint8_t(${node.src}[size-1]*127.f)) & 0x7F)`; - } - - else if (label == "midi") { - map = daisy.midi_outs[0] - app.has_midi_out = true; - } else if (map) { + if (map) { label = maplabel } else { // else it is audio data @@ -534,23 +1143,136 @@ function generate_app(app, hardware, target, defines) { return name; }) + gen.histories = app.patch.histories.map(history=>{ + const name = history.name + const varname = "gen_history_"+name; + let node = Object.assign({ + varname: varname, + }, history); + + if (node.midi_type) { + if (node.midi_type == "note") { + let id = node.midi_num-1 + + // get or create: + let noteout = app.midi_noteouts[id] + if (!noteout) { + noteout = {} + app.midi_noteouts[id] = noteout + } + noteout.id = id + noteout.cname = `midinote${node.midi_num}` + noteout[node.midi_notetype] = node + + // if (node.midi_notetype == "press") { + // node.midi_throttle = true; + // node.setter_src = `gen.${node.cname}` + // app.midi_outs.push(node) + // } + + } else { + + app.midi_outs.push(node) + node.setter_src = "gen."+node.cname + if (node.midi_type == "cc") { + app.has_midi_out = true; + let statusbyte = 176+((node.midi_chan)-1)%16; + node.setter = `daisy.midi_message3(${statusbyte}, ${(node.midi_num)%128}, ((uint8_t)(${node.varname}*127.f)) & 0x7F);`; + node.type = "float"; + node.midi_throttle = true; + node.midi_only_when_changed = true; + nodes[name] = node + } else if (node.midi_type == "press") { + app.has_midi_out = true; + let statusbyte = 208+((node.midi_chan)-1)%16; + node.setter = `daisy.midi_message2(${statusbyte}, ((uint8_t)(${node.varname}*127.f)) & 0x7F);`; + node.type = "float"; + node.midi_throttle = true; + node.midi_only_when_changed = true; + nodes[name] = node; + } else if (node.midi_type == "bend") { + app.has_midi_out = true; + let statusbyte = 224+((node.midi_chan)-1)%16; + let float = `((${node.varname}+1.f)*64.f)`; + let lsb = `((uint8_t)(${float}*128.f)) & 0x7F`; + let msb = `((uint8_t)${float}) & 0x7F`; + node.setter = `daisy.midi_message3(${statusbyte}, ${lsb}, ${msb});`; + node.type = "float"; + node.midi_throttle = true; + node.midi_only_when_changed = true; + nodes[name] = node; + } else if (node.midi_type == "program") { + app.has_midi_out = true; + let statusbyte = 192+((node.midi_chan)-1)%16; + node.setter = `daisy.midi_message2(${statusbyte}, ${node.varname} & 0x7F);`; + node.type = "uint8_t"; + nodes[name] = node; + } else if (node.midi_type == "drum") { + app.has_midi_out = true; + node.setter = `daisy.midi_message3(153, ${(node.midi_num)%128}, ((uint8_t)(${node.varname}*127.f)) & 0x7F);`; + node.type = "float"; + nodes[name] = node + } else if (node.midi_type == "vel") { + app.has_midi_out = true; + let statusbyte = 144+((node.midi_chan)-1)%16; + node.setter = `daisy.midi_message3(${statusbyte}, ${(node.midi_num)%128}, ((uint8_t)(${node.varname}*127.f)) & 0x7F);`; + node.type = "float"; + nodes[name] = node + } else if (node.midi_type == "clock" + || node.midi_type == "stop" + || node.midi_type == "start" + || node.midi_type == "continue" + || node.midi_type == "sense" + || node.midi_type == "reset") { + app.has_midi_out = true; + if (node.midi_type == "clock") { + node.setter = `daisy.midi_message1(248);`; + } else if (node.midi_type == "stop") { + node.setter = `daisy.midi_message1(252);`; + } else if (node.midi_type == "start") { + node.setter = `daisy.midi_message1(250);`; + } else if (node.midi_type == "continue") { + node.setter = `daisy.midi_message1(251);`; + } else if (node.midi_type == "sense") { + node.setter = `daisy.midi_message1(254);`; + } else if (node.midi_type == "reset") { + node.setter = `daisy.midi_message1(255);`; + } + node.type = "uint8_t"; + nodes[name] = node + } + } + } else { + + // search for a matching [out] name / prefix: + let map + let maplabel + Object.keys(hardware.labels.outs).sort().forEach(k => { + let match + if (match = new RegExp(`^${k}_?(.+)?`).exec(name)) { + map = hardware.labels.outs[k]; + maplabel = match[1] || name + } + }) + + // was this history mapped to something? + if (map) { + nodes[name] = node + node.type = "t_sample"; + nodes[map].src = "gen."+node.cname; //from.push(src); + // nodes[src].to.push(map) + } + + } + return name; + }) + gen.params = app.patch.params.map((param, i)=>{ const varname = "gen_param_"+param.name; - let src, label; + let src, label=param.name, type="float"; - // search for a matching [out] name / prefix: - Object.keys(hardware.labels.params).sort().forEach(k => { - let match - if (match = new RegExp(`^${k}_?(.+)?`).exec(param.name)) { - src = hardware.labels.params[k]; - label = match[1] || param.name - } - }) - let node = Object.assign({ varname: varname, - label: label || param.name, - src: src, }, param); // figure out parameter range: @@ -558,25 +1280,139 @@ function generate_app(app, hardware, target, defines) { node.min = node.min || 0; node.default = node.default || 0; node.range = node.max - node.min; - // figure out a suitable encoder step division for this parameter + + let match + // check for dedicated midi patterns: + // e.g. + // [param midi_cc100_ch1] // input is 0..1 for cc value + // [param midi_cc74] // default channel 1 + if (match = (/^midi_cc(\d+)(_(ch)?(\d+))?/g).exec(param.name)) { + let ch = match[4] ? ((+match[4])+15)%16 : null; + let cc = (+match[1])%128; + app.has_midi_in = true; + node.where = "midi_msg" + // need to set "src" to something to prevent this being automapped + src = node.where + node.code = `if (daisy.midi.lastbyte == 1 && ${ch != null ? `daisy.midi.status == ${176+ch}` : `daisy.midi.status/16 == 11`} && daisy.midi.byte[0] == ${cc}) { + ${node.varname} = (daisy.midi.byte[1]/127.f)*${asCppNumber(node.range)} + ${asCppNumber(node.min)}; + }`; + } else + if (match = (/^midi_press(_(ch)?(\d+))?/g).exec(param.name)) { + let ch = match[3] ? ((+match[3])+15)%16 : null; + app.has_midi_in = true; + node.where = "midi_msg" + // need to set "src" to something to prevent this being automapped + src = node.where + node.code = `if (daisy.midi.lastbyte == 1 && ${ch != null ? `daisy.midi.status == ${208+ch}` : `daisy.midi.status/16 == 13`}) { + ${node.varname} = (daisy.midi.byte[0]/127.f)*${asCppNumber(node.range)} + ${asCppNumber(node.min)}; + }`; + } else + if (match = (/^midi_program(_(ch)?(\d+))?/g).exec(param.name)) { + let ch = match[3] ? ((+match[3])+15)%16 : null; + app.has_midi_in = true; + node.where = "midi_msg" + // need to set "src" to something to prevent this being automapped + src = node.where + node.code = `if (daisy.midi.lastbyte == 1 && ${ch != null ? `daisy.midi.status == ${192+ch}` : `daisy.midi.status/16 == 12`}) { + ${node.varname} = (daisy.midi.byte[0]/127.f)*${asCppNumber(node.range)} + ${asCppNumber(node.min)}; + }`; + } else + if (match = (/^midi_(vel|drum)(\d+)(_(ch)?(\d+))?/g).exec(param.name)) { + let ch = match[5] ? ((+match[5])+15)%16 : (match[1] == "drum" ? 9 : null); + let note = (+match[2])%128; + app.has_midi_in = true; + node.where = "midi_msg" + // need to set "src" to something to prevent this being automapped + src = node.where + node.code = `if (daisy.midi.lastbyte == 1 && ${ch != null ? `(daisy.midi.status == ${128+ch} || daisy.midi.status == ${144+ch})` : `(daisy.midi.status/16 == 8 || daisy.midi.status/16 == 9)`} && daisy.midi.byte[0] == ${note}) { + ${node.varname} = (daisy.midi.byte[1]/127.f)*${asCppNumber(node.range)} + ${asCppNumber(node.min)}; + }`; + } else + if (match = (/^midi_bend(_(ch)?(\d+))?/g).exec(param.name)) { + let ch = match[3] ? ((+match[3])+15)%16 : null; + app.has_midi_in = true; + node.where = "midi_msg" + // need to set "src" to something to prevent this being automapped + src = node.where + node.code = `if (daisy.midi.lastbyte == 1 && ${ch != null ? `daisy.midi.status == ${224+ch}` : `daisy.midi.status/16 == 14`}) { + ${node.varname} = ((daisy.midi.byte[0] + daisy.midi.byte[1]/128.f)/128.f)*${asCppNumber(node.range)} + ${asCppNumber(node.min)}; + }`; + } else + if (param.name == "midi_clock") { + app.has_midi_in = true; + node.where = "midi_status" + // need to set "src" to something to prevent this being automapped + src = node.where + node.code = `if (byte == 248) { + ${node.varname} = 1.f; + }`; + // reset: + app.inserts.push({ + where: "post_audio", + code: `${node.varname} = 0.f;` + }) + } else if (param.name == "midi_play") { + app.has_midi_in = true; + node.where = "midi_status" + // need to set "src" to something to prevent this being automapped + src = node.where + node.code = `if (byte == 250 || byte == 251) { + ${node.varname} = 1.f; + } else if (byte == 252) { + ${node.varname} = 0.f; + }`; + // reset: + app.inserts.push({ + where: "post_audio", + code: `${node.varname} = 0.f;` + }) + } else { + // search for a matching [out] name / prefix: + Object.keys(hardware.labels.params).sort().forEach(k => { + if (match = new RegExp(`^${k}_?(.+)?`).exec(param.name)) { + src = hardware.labels.params[k]; + label = match[1] || param.name + + // search for any type qualifiers: + //if (match = label.match(/^((.+)_)?(int|bool)(_(.*))?$/)) { + if (match = label.match(/^(int|bool)(_(.*))?$/)) { + //type = match[3]; + type = match[1] + // trim type from label: + //label = (match[2] || "") + (match[5] || "") + label = match[3] || label + } + } + }) + } + + node.type = type; + node.src = src; + node.label = label; + let ideal_steps = 100 // about 4 good twists of the encoder - if (node.range > 2 && Number.isInteger(node.max) && Number.isInteger(node.max) && Number.isInteger(node.default)) { - if (node.range < 10) { - // might be v/oct - node.stepsize = 1/12 - } else { - // find a suitable subdivision: - let power = Math.round(Math.log2(node.range / ideal_steps)) - node.stepsize = Math.pow(2, power) - } - } + if (node.type == "bool" || node.type == "int") { + node.stepsize = 1 + } else { + // figure out a suitable encoder step division for this parameter + if (node.range > 2 && Number.isInteger(node.max) && Number.isInteger(node.max) && Number.isInteger(node.default)) { + if (node.range < 10) { + // might be v/oct + node.stepsize = 1/12 + } else { + // find a suitable subdivision: + let power = Math.round(Math.log2(node.range / ideal_steps)) + node.stepsize = Math.pow(2, power) + } + } + } if (!node.stepsize) { // general case: node.stepsize = node.range / ideal_steps } - + nodes[varname] = node; - if (src) { + if (src && nodes[src]) { nodes[src].to.push(varname) } return varname; @@ -613,7 +1449,7 @@ function generate_app(app, hardware, target, defines) { return varname; }) - if ((app.has_midi_in && hardware.midi_ins.length) || (app.has_midi_out && hardware.midi_outs.length)) { + if ((app.has_midi_in && hardware.defines.OOPSY_TARGET_HAS_MIDI_INPUT) || (app.has_midi_out && hardware.defines.OOPSY_TARGET_HAS_MIDI_OUTPUT)) { defines.OOPSY_TARGET_USES_MIDI_UART = 1 } @@ -628,7 +1464,7 @@ function generate_app(app, hardware, target, defines) { // find next param without a src: while (param && !!nodes[param].src) param = gen.params[++upi]; if (param) { - //console.log("map to", param) + //console.log(name, "map to", param) nodes[param].src = name; node.to.push(param); } @@ -648,94 +1484,77 @@ function generate_app(app, hardware, target, defines) { } }); } - // normal cv outs etc. in the same way - { - let available = [] - let i=0 - daisy.device_outs.forEach(name => { - const node = nodes[name]; - // does this output have an cv source? - if (node.from.length) { - available.push(name); - } else if (available.length) { - node.src = available[i++ % available.length]; - } - }) - } const struct = ` struct App_${name} : public oopsy::App { ${gen.params - .concat(daisy.device_outs) .map(name=>` - float ${name};`).join("")} + ${nodes[name].type} ${name};`).join("")} + ${app.midi_noteouts.map(note=>` + oopsy::GenDaisy::MidiNote ${note.cname};`).join("")} + ${gen.histories.map(name=>nodes[name]).filter(node => node && node.midi_type).map(node=>` + ${node.type} ${node.varname};`).join("")} + ${gen.audio_outs.map(name=>nodes[name]).filter(node => node && node.midi_type).map(node=>` + ${node.type} ${node.varname};`).join("")} + ${daisy.device_outs.map(name => nodes[name]) + .filter(node => node.src || node.from.length) + .map(node=>` + float ${node.name};`).join("")} ${app.audio_outs.map(name=>` - float ${name}[OOPSY_BUFFER_SIZE];`).join("")} + float ${name}[OOPSY_BLOCK_SIZE];`).join("")} void init(oopsy::GenDaisy& daisy) { - daisy.gen = ${name}::create(daisy.samplerate, daisy.blocksize); + daisy.gen = ${name}::create(daisy.hardware.seed.AudioSampleRate(), daisy.hardware.seed.AudioBlockSize()); ${name}::State& gen = *(${name}::State *)daisy.gen; + daisy.param_count = ${gen.params.length}; ${(defines.OOPSY_HAS_PARAM_VIEW) ? `daisy.param_selected = ${Math.max(0, gen.params.map(name=>nodes[name].src).indexOf(undefined))};`:``} ${gen.params.map(name=>nodes[name]) .map(node=>` - ${node.varname} = ${toCfloat(node.default)};`).join("")} - ${daisy.device_outs.map(name=>` - ${name} = 0.f;`).join("")} - ${daisy.datahandlers.map(name => nodes[name]) - .filter(node => node.init) - .filter(node => node.data) - .map(node =>` - ${interpolate(node.init, node)};`).join("")} - } - - void mainloopCallback(oopsy::GenDaisy& daisy, uint32_t t, uint32_t dt) { - Daisy& hardware = daisy.hardware; - ${name}::State& gen = *(${name}::State *)daisy.gen; - ${daisy.datahandlers.map(name => nodes[name]) - .filter(node => node.where == "main") - .filter(node => node.data) - .map(node =>` - ${interpolate(node.setter, node)};`).join("")} + ${node.varname} = ${asCppNumber(node.default, node.type)};`).join("")} ${daisy.device_outs.map(name => nodes[name]) .filter(node => node.src || node.from.length) - .filter(node => node.config.where == "main") .map(node=>` - ${interpolate(node.config.setter, node)};`).join("")} - } - - void displayCallback(oopsy::GenDaisy& daisy, uint32_t t, uint32_t dt) { - Daisy& hardware = daisy.hardware; - ${name}::State& gen = *(${name}::State *)daisy.gen; + ${node.name} = 0.f;`).join("")} + ${gen.histories.map(name=>nodes[name]).filter(node => node && node.midi_type).map(node=>` + ${node.varname} = ${asCppNumber(node.default, node.type)};`).join("")} ${daisy.datahandlers.map(name => nodes[name]) - .filter(node => node.where == "display") + .filter(node => node.init) .filter(node => node.data) .map(node =>` - ${interpolate(node.setter, node)};`).join("")} - ${daisy.device_outs.map(name => nodes[name]) - .filter(node => node.src || node.from.length) - .filter(node => node.config.where == "display") + ${interpolate(node.init, node)};`).join("")} + ${gen.datas.map(name=>nodes[name]) + .filter(node => node.wavname) .map(node=>` - ${interpolate(node.config.setter, node)};`).join("")} + daisy.sdcard_load_wav("${node.wavname}", gen.${node.cname});`).join("")} } - void audioCallback(oopsy::GenDaisy& daisy, float **hardware_ins, float **hardware_outs, size_t size) { + void audioCallback(oopsy::GenDaisy& daisy, daisy::AudioHandle::InputBuffer hardware_ins, daisy::AudioHandle::OutputBuffer hardware_outs, size_t size) { Daisy& hardware = daisy.hardware; ${name}::State& gen = *(${name}::State *)daisy.gen; + ${app.inserts.concat(hardware.inserts).filter(o => o.where == "audio").map(o => o.code).join("\n\t")} ${daisy.device_inputs.map(name => nodes[name]) .filter(node => node.to.length) + .filter(node => node.update && node.update.where == "audio") .map(node=>` - float ${node.name} = ${node.getter};`).join("")} + ${interpolate(node.update.code, node)};`).join("")} + ${daisy.device_inputs.map(name => nodes[name]) + .filter(node => node.to.length) + .map(node=>` + float ${node.name} = ${node.code};`).join("")} ${gen.params - .filter(name => nodes[name].src) - .map(name=>` - ${name} = ${nodes[name].src}*${toCfloat(nodes[name].max-nodes[name].min)} + ${toCfloat(nodes[name].min)};`).join("")} + .map(name=>nodes[name]) + .filter(node => node.src) + .filter(node => node.where == "audio" || node.where == undefined) + .map(node=>` + ${node.varname} = (${node.type})(${node.src}*${asCppNumber(node.range)} + ${asCppNumber(node.min + (node.type == "int" || node.type == "bool" ? 0.5 : 0))});`).join("")} ${gen.params - .map(name=>` - gen.set_${nodes[name].name}(${name});`).join("")} + .map(name=>nodes[name]) + .map(node=>` + gen.set_${node.name}(${node.varname});`).join("")} ${daisy.audio_ins.map((name, i)=>` - float * ${name} = hardware_ins[${i}];`).join("")} + float * ${name} = (float *)hardware_ins[${i}];`).join("")} ${daisy.audio_outs.map((name, i)=>` float * ${name} = hardware_outs[${i}];`).join("")} ${app.has_midi_in ? daisy.midi_ins.map(name=>` @@ -749,24 +1568,48 @@ struct App_${name} : public oopsy::App { .filter(node => node.src || node.from.length) .map(node => node.src ? ` ${node.name} = ${node.src};` : ` - ${node.name} = ${node.from.map(name=>name+"[ size-1]").join(" + ")};`).join("")} + ${node.name} = ${node.from.map(name=>name+"[ size-1]").join(" + ")}; // device out`).join("")} ${daisy.device_outs.map(name => nodes[name]) .filter(node => node.src || node.from.length) .filter(node => node.config.where == "audio") .map(node=>` - ${interpolate(node.config.setter, node)};`).join("")} + ${interpolate(node.config.code, node)} // set out`).join("")} ${daisy.datahandlers.map(name => nodes[name]) .filter(node => node.where == "audio") .filter(node => node.data) .map(node =>` - ${interpolate(node.setter, node)};`).join("")} - ${(function() { - let midisetters = gen.audio_outs.map(name=>nodes[name]).filter(node=>node.midi_setter); - return `${midisetters.length > 0 ? - `if (daisy.frames % ${Math.ceil(midisetters.length*hardware.samplerate/32)} == 0){ // throttle output for MIDI baud limits - ${midisetters.map(node=>` - ${node.midi_setter};`).join(``)} - }` : ``}` })()} + ${interpolate(node.code, node)} // data out`).join("")} + ${app.midi_outs + .filter(node=>!node.midi_throttle) + .map(node=>` + if (${node.varname} != (${node.type})${node.setter_src}) { + ${node.varname} = ${node.setter_src}; + ${node.setter} + }`).join("")} + ${app.midi_noteouts + .filter(note=>note.vel && note.pitch) + .map(note=>` + ${note.cname}.update(daisy, + ((uint8_t)(gen.${note.vel.cname}*127.f)) & 0x7F, + ((uint8_t)gen.${note.pitch.cname}) & 0x7F, + ${note.chan ? `((uint8_t)(gen.${note.chan.cname})-1) % 16` : "0"});`).join("")} + // msgs: ${(app.midi_outs.filter(node=>node.midi_throttle).length + app.midi_noteouts.filter(note=>note.press).length)} + // rate: ${hardware.defines.OOPSY_BLOCK_RATE/500} + ${(app.midi_outs.filter(node=>node.midi_throttle).length + app.midi_noteouts.filter(note=>note.press).length) > 0 ? ` + if (daisy.blockcount % ${ Math.ceil((app.midi_outs.filter(node=>node.midi_throttle).length + app.midi_noteouts + .filter(note=>note.press).length) * hardware.defines.OOPSY_BLOCK_RATE/500)} == 0){ // throttle output for MIDI baud limits + ${app.midi_outs + .filter(node=>node.midi_throttle) + .map(node=>` + ${node.midi_only_when_changed ? `if (${node.varname} != (${node.type})${node.setter_src}) {` : `{`} + ${node.varname} = ${node.setter_src}; + ${node.setter} + }`).join("")} + ${app.midi_noteouts + .filter(note=>note.press) + .map(note=>` + ${note.cname}.update_pressure(daisy, ((uint8_t)gen.${note.press.cname}) & 0x7F);`).join("")} + }` : ''} ${app.has_midi_out ? daisy.midi_outs.map(name=>nodes[name].from.map(name=>` daisy.midi_postperform(${name}, size);`).join("")).join("") : ''} ${daisy.audio_outs.map(name=>nodes[name]) @@ -774,22 +1617,100 @@ struct App_${name} : public oopsy::App { .map(node=>node.src ? ` memcpy(${node.name}, ${node.src}, sizeof(float)*size);` : ` memset(${node.name}, 0, sizeof(float)*size);`).join("")} + ${app.inserts.concat(hardware.inserts).filter(o => o.where == "post_audio").map(o => o.code).join("\n\t")} + ${hardware.defines.OOPSY_TARGET_SEED ? "hardware.PostProcess();" : ""} } + void mainloopCallback(oopsy::GenDaisy& daisy, uint32_t t, uint32_t dt) { + Daisy& hardware = daisy.hardware; + ${name}::State& gen = *(${name}::State *)daisy.gen; + ${app.inserts.concat(hardware.inserts).filter(o => o.where == "main").map(o => o.code).join("\n\t")} + ${daisy.datahandlers.map(name => nodes[name]) + .filter(node => node.where == "main") + .filter(node => node.data) + .map(node =>` + ${interpolate(node.code, node)}`).join("")} + ${daisy.device_outs.map(name => nodes[name]) + .filter(node => node.src || node.from.length) + .filter(node => node.config.where == "main") + .map(node=>` + ${interpolate(node.config.code, node)}`).join("")} + ${defines.OOPSY_TARGET_USES_MIDI_UART ? ` + while(daisy.uart.Readable()) { + uint8_t byte = daisy.uart.PopRx(); + if (byte >= 128) { // status byte + ${gen.params + .map(name=>nodes[name]) + .filter(node => node.where == "midi_status") + .map(node=>node.code) + .concat(`if (byte == 0xFF) { // reset event -> go to bootloader + daisy.log("reboot"); + daisy::System::ResetToBootloader(); + } + if (byte <= 240 || byte == 247) { + daisy.midi.status = byte; + daisy.midi.lastbyte = 255; // means 'no bytes received' + }`) + .join(" else ")} + } else { + daisy.midi.lastbyte = !daisy.midi.lastbyte; + daisy.midi.byte[daisy.midi.lastbyte] = byte; + ${gen.params + .map(name=>nodes[name]) + .filter(node => node.where == "midi_msg") + .map(node=>node.code) + .concat(defines.OOPSY_MULTI_APP ? ` + if (daisy.midi.status/16 == 12) { // program change -> app change + daisy.schedule_app_load(daisy.midi.byte[daisy.midi.lastbyte]); + }`:[]) + .join(" else ")} + } + ${app.has_generic_midi_in ? ` + ${app.has_generic_midi_thru ? `daisy.midi_message1(byte); // thru` : ``} + if (daisy.midi_in_written < OOPSY_BLOCK_SIZE) { + // scale (0, 255) to (0.0, 1.0) to protect hardware from accidental patching + daisy.midi_in_data[daisy.midi_in_written] = byte / 256.0f; + daisy.midi_in_written++; + }` : ""} + daisy.midi_in_active = 1; + }` : "// no midi input handling"} + } + + void displayCallback(oopsy::GenDaisy& daisy, uint32_t t, uint32_t dt) { + Daisy& hardware = daisy.hardware; + ${name}::State& gen = *(${name}::State *)daisy.gen; + ${app.inserts.concat(hardware.inserts).filter(o => o.where == "display").map(o => o.code).join("\n\t")} + ${daisy.datahandlers.map(name => nodes[name]) + .filter(node => node.where == "display") + .filter(node => node.data) + .map(node =>` + ${interpolate(node.code, node)}`).join("")} + ${daisy.device_outs.map(name => nodes[name]) + .filter(node => node.src || node.from.length) + .filter(node => node.config.where == "display") + .map(node=>` + ${interpolate(node.config.code, node)}`).join("")} + ${hardware.defines.OOPSY_TARGET_SEED ? "hardware.Display();" : ""} + } + ${defines.OOPSY_HAS_PARAM_VIEW ? ` float setparam(int idx, float val) { switch(idx) { - ${gen.params.map(name=>nodes[name]).map((node, i)=>` - case ${i}: return ${node.varname} = (val > ${toCfloat(node.max)}) ? ${toCfloat(node.max)} : (val < ${toCfloat(node.min)}) ? ${toCfloat(node.min)} : val;`).join("")} + ${gen.params + .map(name=>nodes[name]) + .map((node, i)=>` + case ${i}: return ${node.varname} = (${node.type})(val > ${asCppNumber(node.max, node.type)}) ? ${asCppNumber(node.max, node.type)} : (val < ${asCppNumber(node.min, node.type)}) ? ${asCppNumber(node.min, node.type)} : val;`).join("")} } return 0.f; } - #ifdef OOPSY_TARGET_HAS_OLED + #if defined(OOPSY_TARGET_HAS_OLED) && defined(OOPSY_HAS_PARAM_VIEW) void paramCallback(oopsy::GenDaisy& daisy, int idx, char * label, int len, bool tweak) { switch(idx) { ${gen.params.map(name=>nodes[name]).map((node, i)=>` case ${i}: - if (tweak) setparam(${i}, ${node.varname} + daisy.menu_button_incr * ${toCfloat(node.stepsize)}); + #ifdef OOPSY_CAN_PARAM_TWEAK + if (tweak) setparam(${i}, ${node.varname} + daisy.menu_button_incr ${node.type == "float" ? '* ' + asCppNumber(node.stepsize, node.type) : ""}); + #endif //OOPSY_CAN_PARAM_TWEAK snprintf(label, len, "${node.src ? `${node.src.substring(0,3).padEnd(3," ")} ${node.label.substring(0,11).padEnd(11," ")}" FLT_FMT3 ""` : @@ -798,7 +1719,7 @@ struct App_${name} : public oopsy::App { break;`).join("")} } } - #endif + #endif //defined(OOPSY_TARGET_HAS_OLED) && defined(OOPSY_HAS_PARAM_VIEW) ` : ``} };` app.cpp = { diff --git a/source/readme.md b/source/readme.md index 2c7761f..4fb605b 100644 --- a/source/readme.md +++ b/source/readme.md @@ -23,4 +23,4 @@ Memory allocation for the exported gen~ code happens only when an app is loaded. Oopsy uses two pre-allocated blocks of memory, a smaller one in SRAM (around 500Kb) and a larger one in SDRAM (64Mb). Both memory blocks are reset when an app is loaded, so that each gen~ has the full blocks available. Generally SRAM seems to offer faster access, so allocations go to this block if they will fit, which is the case for most gen~ patchers and gen~ operators. Only `data` and `delay` operators with large contents that do not fit in SRAM will use the SDRAM block. -The Daisy offers 128k for code size. Initial testing showed that multiple apps have very limited impact on code size. \ No newline at end of file +The Daisy offers 128k for code size. Initial testing showed that the baseline for libdaisy and Oopsy is about 50-60k, and each app adds around 5-10k. \ No newline at end of file diff --git a/source/seed.pod.json b/source/seed.pod.json new file mode 100644 index 0000000..23721dd --- /dev/null +++ b/source/seed.pod.json @@ -0,0 +1,52 @@ +{ + "name":"pod", + "defines": { + "OOPSY_TARGET_HAS_MIDI_INPUT": 1 + }, + "components": { + "sw1": { + "component": "Switch", + "pin": 27 + }, + "sw2": { + "component": "Switch", + "pin": 28 + }, + "knob1": { + "component": "AnalogControl", + "pin": 21 + }, + "knob2": { + "component": "AnalogControl", + "pin": 15 + }, + "encoder": { + "component": "Encoder", + "pin": {"a":26, "b":25, "click":13 } + }, + "led1": { + "component": "RgbLed", + "pin": {"r":20, "g":19, "b":18 } + }, + "led2": { + "component": "RgbLed", + "pin": {"r":17, "g":24, "b":23 } + } + }, + "aliases": { + "switch": "sw1", + "button": "sw1", + "switch1": "sw1", + "button1": "sw1", + "switch2": "sw2", + "button2": "sw2", + "enp": "encoder_press", + "switch3": "encoder_press", + "press": "encoder_press", + "knob": "knob1", + "ctrl": "knob1", + "ctrl1": "knob1", + "ctrl2": "knob2", + "led": "led1" + } +} \ No newline at end of file diff --git a/source/seed.versio.json b/source/seed.versio.json new file mode 100644 index 0000000..34e9c81 --- /dev/null +++ b/source/seed.versio.json @@ -0,0 +1,98 @@ +{ + "name":"versio", + "defines": {}, + "components": { + "knob1": { + "component": "AnalogControl", + "pin": 21 + }, + "knob2": { + "component": "AnalogControl", + "pin": 22 + }, + "knob3": { + "component": "AnalogControl", + "pin": 28 + }, + "knob4": { + "component": "AnalogControl", + "pin": 23 + }, + "knob5": { + "component": "AnalogControl", + "pin": 16 + }, + "knob6": { + "component": "AnalogControl", + "pin": 17 + }, + "knob7": { + "component": "AnalogControl", + "pin": 19 + }, + + "button1": { + "component": "Switch", + "pin": 30 + }, + "gate1": { + "component": "GateIn", + "pin": 24 + }, + "sw1": { + "component": "Switch3", + "pin": {"a":6, "b":5 } + }, + "sw2": { + "component": "Switch3", + "pin": {"a":1, "b":0 } + }, + "led1": { + "component": "RgbLed", + "pin": {"r":10, "g":3, "b":4 } + }, + "led2": { + "component": "RgbLed", + "pin": {"r":12, "g":13, "b":11 } + }, + "led3": { + "component": "RgbLed", + "pin": {"r":25, "g":26, "b":14 } + }, + "led4": { + "component": "RgbLed", + "pin": {"r":29, "g":27, "b":15 } + } + }, + "aliases": { + "switch1": "sw1", + "switch2": "sw2", + + "ctrl1": "knob1", + "ctrl2": "knob2", + "ctrl3": "knob3", + "ctrl4": "knob4", + "ctrl5": "knob5", + "ctrl6": "knob6", + "ctrl7": "knob7", + "cv1": "knob1", + "cv2": "knob2", + "cv3": "knob3", + "cv4": "knob4", + "cv5": "knob5", + "cv6": "knob6", + "cv7": "knob7", + + "ctrl": "knob1", + "cv": "knob1", + "led": "led1", + "gate": "gate1", + "switch": "sw1", + "knob": "knob1", + "button": "button1", + "tap": "button1", + "fsu": "button1", + "abc": "sw1", + "xyz": "sw2" + } +} \ No newline at end of file diff --git a/source/test.sh b/source/test.sh index 3565731..59d9587 100755 --- a/source/test.sh +++ b/source/test.sh @@ -1,6 +1,8 @@ -node oopsy.js ../templates/oopsy_patch.cpp patch && \ -node oopsy.js ../templates/oopsy_field.cpp field && \ -node oopsy.js ../templates/oopsy_petal.cpp petal && \ -node oopsy.js ../templates/oopsy_pod.cpp pod && \ -node oopsy.js ../examples/crossover.cpp ../examples/modfm.cpp ../examples/pulsar.cpp ../examples/reverb.cpp ../examples/squine.cpp && \ -echo OK \ No newline at end of file +rm -rf build_* && \ +node oopsy.js writejson ../templates/oopsy_patch.cpp patch && \ +node oopsy.js writejson ../templates/oopsy_field.cpp field && \ +node oopsy.js writejson ../templates/oopsy_petal.cpp petal && \ +node oopsy.js writejson ../templates/oopsy_pod.cpp pod && \ +node oopsy.js writejson ../templates/oopsy_versio.cpp versio && \ +node oopsy.js writejson ../templates/oopsy_pod.cpp seed.pod.json && \ +node oopsy.js writejson ../templates/oopsy_versio.cpp seed.versio.json \ No newline at end of file diff --git a/templates/oopsy_field.maxpat b/templates/oopsy_field.maxpat index 401ab1d..ba8488f 100644 --- a/templates/oopsy_field.maxpat +++ b/templates/oopsy_field.maxpat @@ -36,7 +36,7 @@ "digest" : "", "tags" : "", "style" : "", - "subpatcher_template" : "", + "subpatcher_template" : "oopsy_field", "assistshowspatchername" : 0, "boxes" : [ { "box" : { @@ -275,7 +275,7 @@ } , "classnamespace" : "dsp.gen", - "rect" : [ 84.0, 103.0, 1095.0, 792.0 ], + "rect" : [ 84.0, 103.0, 1280.0, 913.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -304,6 +304,286 @@ "subpatcher_template" : "", "assistshowspatchername" : 0, "boxes" : [ { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 913.133333333333326, 740.0, 79.0, 22.0 ], + "text" : "param knob8" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 926.800000000000182, 771.0, 22.0, 22.0 ], + "text" : "23" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 0, + "patching_rect" : [ 913.133333333333439, 796.0, 60.0, 22.0 ], + "text" : "poke leds" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 830.990476190476215, 740.0, 79.0, 22.0 ], + "text" : "param knob7" + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 843.800000000000068, 771.0, 22.0, 22.0 ], + "text" : "22" + } + + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 0, + "patching_rect" : [ 830.133333333333439, 796.0, 60.0, 22.0 ], + "text" : "poke leds" + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 748.847619047619105, 740.0, 79.0, 22.0 ], + "text" : "param knob6" + } + + } +, { + "box" : { + "id" : "obj-62", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 762.800000000000182, 771.0, 22.0, 22.0 ], + "text" : "21" + } + + } +, { + "box" : { + "id" : "obj-112", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 0, + "patching_rect" : [ 748.133333333333553, 796.0, 60.0, 22.0 ], + "text" : "poke leds" + } + + } +, { + "box" : { + "id" : "obj-113", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 666.704761904761995, 740.0, 79.0, 22.0 ], + "text" : "param knob5" + } + + } +, { + "box" : { + "id" : "obj-114", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 679.800000000000068, 771.0, 22.0, 22.0 ], + "text" : "20" + } + + } +, { + "box" : { + "id" : "obj-115", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 0, + "patching_rect" : [ 666.133333333333439, 796.0, 60.0, 22.0 ], + "text" : "poke leds" + } + + } +, { + "box" : { + "id" : "obj-116", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 584.561904761904884, 740.0, 79.0, 22.0 ], + "text" : "param knob4" + } + + } +, { + "box" : { + "id" : "obj-117", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 598.800000000000182, 771.0, 22.0, 22.0 ], + "text" : "19" + } + + } +, { + "box" : { + "id" : "obj-118", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 0, + "patching_rect" : [ 584.561904761904884, 796.0, 60.0, 22.0 ], + "text" : "poke leds" + } + + } +, { + "box" : { + "id" : "obj-119", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 502.419047619047774, 740.0, 79.0, 22.0 ], + "text" : "param knob3" + } + + } +, { + "box" : { + "id" : "obj-120", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 515.800000000000068, 771.0, 22.0, 22.0 ], + "text" : "18" + } + + } +, { + "box" : { + "id" : "obj-121", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 0, + "patching_rect" : [ 502.133333333333439, 796.0, 60.0, 22.0 ], + "text" : "poke leds" + } + + } +, { + "box" : { + "id" : "obj-122", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 420.276190476190607, 740.0, 79.0, 22.0 ], + "text" : "param knob2" + } + + } +, { + "box" : { + "id" : "obj-123", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 434.800000000000182, 771.0, 22.0, 22.0 ], + "text" : "17" + } + + } +, { + "box" : { + "id" : "obj-124", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 0, + "patching_rect" : [ 421.133333333333553, 796.0, 60.0, 22.0 ], + "text" : "poke leds" + } + + } +, { + "box" : { + "id" : "obj-125", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 338.133333333333439, 740.0, 79.0, 22.0 ], + "text" : "param knob1" + } + + } +, { + "box" : { + "id" : "obj-126", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 351.800000000000068, 771.0, 22.0, 22.0 ], + "text" : "16" + } + + } +, { + "box" : { + "id" : "obj-127", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 0, + "patching_rect" : [ 338.133333333333439, 796.0, 60.0, 22.0 ], + "text" : "poke leds" + } + + } +, { "box" : { "id" : "obj-36", "maxclass" : "comment", @@ -1125,7 +1405,7 @@ "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 394.899999999999977, 154.0, 80.0, 49.0 ], + "patching_rect" : [ 394.899999999999977, 154.0, 82.0, 49.0 ], "text" : "param knob8 @min 0 @max 1" } @@ -1574,6 +1854,83 @@ "source" : [ "obj-110", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-115", 0 ], + "source" : [ "obj-113", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-115", 1 ], + "source" : [ "obj-114", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-118", 0 ], + "source" : [ "obj-116", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-118", 1 ], + "source" : [ "obj-117", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-121", 0 ], + "source" : [ "obj-119", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-121", 1 ], + "source" : [ "obj-120", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-124", 0 ], + "source" : [ "obj-122", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-124", 1 ], + "source" : [ "obj-123", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-127", 0 ], + "source" : [ "obj-125", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-127", 1 ], + "source" : [ "obj-126", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 1 ], + "source" : [ "obj-13", 0 ] + } + } , { "patchline" : { @@ -1637,6 +1994,13 @@ "source" : [ "obj-23", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-112", 0 ], + "source" : [ "obj-25", 0 ] + } + } , { "patchline" : { @@ -1735,6 +2099,13 @@ "source" : [ "obj-58", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-6", 0 ] + } + } , { "patchline" : { @@ -1742,6 +2113,13 @@ "source" : [ "obj-60", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-112", 1 ], + "source" : [ "obj-62", 0 ] + } + } , { "patchline" : { @@ -1770,6 +2148,13 @@ "source" : [ "obj-68", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-8", 1 ], + "source" : [ "obj-7", 0 ] + } + } , { "patchline" : { @@ -1868,6 +2253,13 @@ "source" : [ "obj-89", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-9", 0 ] + } + } , { "patchline" : { @@ -1915,7 +2307,13 @@ } , "patching_rect" : [ 24.0, 290.0, 194.0, 35.0 ], - "text" : "gen~" + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/templates/", + "exportname" : "oopsy_field" + } +, + "text" : "gen~", + "varname" : "oopsy_field" } } @@ -2126,7 +2524,7 @@ "obj-7::obj-21::obj-6" : [ "live.tab[3]", "live.tab[1]", 0 ], "obj-7::obj-35" : [ "[5]", "Level", 0 ], "obj-9::obj-32" : [ "live.text[2]", "FILTER", 0 ], - "obj-9::obj-36" : [ "live.menu[1]", "live.menu", 0 ], + "obj-9::obj-4" : [ "live.menu[6]", "live.menu", 0 ], "parameterbanks" : { } @@ -2162,6 +2560,13 @@ "type" : "gDSP", "implicit" : 1 } +, { + "name" : "oopsy.gate.min.gendsp", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", + "patcherrelativepath" : "../code", + "type" : "gDSP", + "implicit" : 1 + } , { "name" : "oopsy.ctrl.smooth3.gendsp", "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", @@ -2169,6 +2574,13 @@ "type" : "gDSP", "implicit" : 1 } +, { + "name" : "oopsy.ctrl.smooth2.gendsp", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", + "patcherrelativepath" : "../code", + "type" : "gDSP", + "implicit" : 1 + } , { "name" : "demosound.maxpat", "bootpath" : "C74:/help/msp", diff --git a/templates/oopsy_patch.maxpat b/templates/oopsy_patch.maxpat index 17d3384..d97ad08 100644 --- a/templates/oopsy_patch.maxpat +++ b/templates/oopsy_patch.maxpat @@ -10,7 +10,7 @@ } , "classnamespace" : "box", - "rect" : [ 431.0, 199.0, 711.0, 513.0 ], + "rect" : [ 431.0, 199.0, 800.0, 598.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -39,6 +39,120 @@ "subpatcher_template" : "", "assistshowspatchername" : 0, "boxes" : [ { + "box" : { + "id" : "obj-25", + "maxclass" : "live.dial", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 471.833333333333314, 121.5, 41.999999999999943, 48.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "knob4", + "parameter_mmax" : 1.0, + "parameter_modmode" : 1, + "parameter_shortname" : "knob4", + "parameter_type" : 0, + "parameter_unitstyle" : 1 + } + + } +, + "varname" : "live.dial[3]" + } + + } +, { + "box" : { + "id" : "obj-27", + "maxclass" : "live.dial", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 425.166666666666629, 121.5, 42.0, 48.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "knob3", + "parameter_mmax" : 1.0, + "parameter_modmode" : 1, + "parameter_shortname" : "knob3", + "parameter_type" : 0, + "parameter_unitstyle" : 1 + } + + } +, + "varname" : "live.dial[4]" + } + + } +, { + "box" : { + "id" : "obj-28", + "maxclass" : "live.dial", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 378.499999999999943, 121.5, 42.0, 48.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "knob2", + "parameter_mmax" : 1.0, + "parameter_modmode" : 1, + "parameter_shortname" : "knob2", + "parameter_type" : 0, + "parameter_unitstyle" : 1 + } + + } +, + "varname" : "live.dial[5]" + } + + } +, { + "box" : { + "id" : "obj-29", + "maxclass" : "live.dial", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 331.833333333333258, 121.5, 42.0, 48.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "knob1", + "parameter_mmax" : 1.0, + "parameter_modmode" : 1, + "parameter_shortname" : "knob1", + "parameter_type" : 0, + "parameter_unitstyle" : 1 + } + + } +, + "varname" : "live.dial[6]" + } + + } +, { + "box" : { + "angle" : 270.0, + "bgcolor" : [ 0.796078431372549, 0.796078431372549, 0.796078431372549, 1.0 ], + "id" : "obj-65", + "maxclass" : "panel", + "mode" : 0, + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 327.0, 108.0, 194.0, 74.0 ], + "proportion" : 0.5 + } + + } +, { "box" : { "fontname" : "Arial Italic", "fontsize" : 18.0, @@ -59,7 +173,7 @@ "numoutlets" : 1, "outlettype" : [ "int" ], "parameter_enable" : 0, - "patching_rect" : [ 243.0, 365.0, 24.0, 24.0 ] + "patching_rect" : [ 266.0, 461.0, 25.0, 25.0 ] } } @@ -70,7 +184,7 @@ "numinlets" : 1, "numoutlets" : 2, "outlettype" : [ "bang", "bang" ], - "patching_rect" : [ 243.0, 333.0, 42.0, 22.0 ], + "patching_rect" : [ 266.0, 429.0, 43.0, 22.0 ], "text" : "edge~" } @@ -81,7 +195,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 243.0, 391.0, 42.0, 20.0 ], + "patching_rect" : [ 266.0, 487.0, 43.0, 20.0 ], "text" : "gate" } @@ -92,7 +206,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 183.0, 391.0, 42.0, 20.0 ], + "patching_rect" : [ 206.0, 487.0, 43.0, 20.0 ], "text" : "cv2" } @@ -103,7 +217,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 122.0, 389.0, 42.0, 20.0 ], + "patching_rect" : [ 145.0, 485.0, 43.0, 20.0 ], "text" : "cv1" } @@ -119,7 +233,7 @@ "numinlets" : 2, "numoutlets" : 2, "outlettype" : [ "signal", "float" ], - "patching_rect" : [ 183.0, 365.0, 56.0, 22.0 ], + "patching_rect" : [ 206.0, 461.0, 57.0, 22.0 ], "sig" : 0.0 } @@ -135,7 +249,7 @@ "numinlets" : 2, "numoutlets" : 2, "outlettype" : [ "signal", "float" ], - "patching_rect" : [ 122.0, 365.0, 56.0, 22.0 ], + "patching_rect" : [ 145.0, 461.0, 57.0, 22.0 ], "sig" : 0.0 } @@ -146,7 +260,7 @@ "maxclass" : "ezdac~", "numinlets" : 2, "numoutlets" : 0, - "patching_rect" : [ 24.0, 425.0, 45.0, 45.0 ] + "patching_rect" : [ 47.0, 521.0, 46.0, 46.0 ] } } @@ -159,7 +273,7 @@ "numoutlets" : 5, "outlettype" : [ "signal", "signal", "", "float", "list" ], "parameter_enable" : 1, - "patching_rect" : [ 73.0, 319.0, 44.0, 90.0 ], + "patching_rect" : [ 96.0, 415.0, 45.0, 87.0 ], "saved_attribute_attributes" : { "valueof" : { "parameter_longname" : "live.gain~[1]", @@ -185,7 +299,7 @@ "numoutlets" : 5, "outlettype" : [ "signal", "signal", "", "float", "list" ], "parameter_enable" : 1, - "patching_rect" : [ 24.0, 319.0, 44.0, 90.0 ], + "patching_rect" : [ 47.0, 415.0, 45.0, 87.0 ], "saved_attribute_attributes" : { "valueof" : { "parameter_longname" : "live.gain~", @@ -211,7 +325,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 269.0, 211.714285714285666, 150.0, 22.0 ] + "patching_rect" : [ 327.0, 317.0, 151.0, 22.0 ] } } @@ -231,7 +345,7 @@ "numoutlets" : 1, "offset" : [ 0.0, 0.0 ], "outlettype" : [ "signal" ], - "patching_rect" : [ 24.0, 97.0, 225.0, 105.0 ], + "patching_rect" : [ 47.0, 108.0, 226.0, 102.0 ], "viewvisibility" : 1 } @@ -251,7 +365,7 @@ "numinlets" : 1, "numoutlets" : 0, "offset" : [ 0.0, 0.0 ], - "patching_rect" : [ 485.5, 97.0, 128.0, 128.0 ], + "patching_rect" : [ 614.5, 22.0, 128.0, 128.0 ], "viewvisibility" : 1 } @@ -801,8 +915,14 @@ ] } , - "patching_rect" : [ 24.0, 267.0, 194.0, 35.0 ], - "text" : "gen~" + "patching_rect" : [ 47.0, 363.0, 195.0, 35.0 ], + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/templates/", + "exportname" : "oopsy_patch" + } +, + "text" : "gen~", + "varname" : "oopsy_patch" } } @@ -814,7 +934,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 269.0, 97.0, 150.0, 22.0 ] + "patching_rect" : [ 327.0, 202.285714285714334, 151.0, 22.0 ] } } @@ -826,7 +946,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 269.0, 119.942857142857122, 150.0, 22.0 ] + "patching_rect" : [ 327.0, 225.228571428571456, 151.0, 22.0 ] } } @@ -838,7 +958,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 269.0, 142.885714285714272, 150.0, 22.0 ] + "patching_rect" : [ 327.0, 248.171428571428578, 151.0, 22.0 ] } } @@ -850,7 +970,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 269.0, 165.828571428571394, 150.0, 22.0 ] + "patching_rect" : [ 327.0, 271.114285714285757, 151.0, 22.0 ] } } @@ -863,7 +983,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 269.0, 188.771428571428544, 150.0, 22.0 ] + "patching_rect" : [ 327.0, 294.057142857142878, 151.0, 22.0 ] } } @@ -909,6 +1029,34 @@ "source" : [ "obj-20", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-25", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-27", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-28", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-29", 0 ] + } + } , { "patchline" : { @@ -979,10 +1127,35 @@ "source" : [ "obj-6", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-3", 3 ], + "order" : 0, + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 2 ], + "order" : 1, + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 1 ], + "order" : 2, + "source" : [ "obj-7", 0 ] + } + } , { "patchline" : { "destination" : [ "obj-3", 0 ], + "order" : 3, "source" : [ "obj-7", 0 ] } @@ -998,10 +1171,15 @@ "parameters" : { "obj-11" : [ "live.gain~", "live.gain~", 0 ], "obj-12" : [ "live.gain~[1]", "live.gain~", 0 ], + "obj-25" : [ "knob4", "knob4", 0 ], + "obj-27" : [ "knob3", "knob3", 0 ], + "obj-28" : [ "knob2", "knob2", 0 ], + "obj-29" : [ "knob1", "knob1", 0 ], "obj-7::obj-21::obj-6" : [ "live.tab[3]", "live.tab[1]", 0 ], "obj-7::obj-35" : [ "[5]", "Level", 0 ], "obj-9::obj-32" : [ "live.text[2]", "FILTER", 0 ], - "obj-9::obj-36" : [ "live.menu[1]", "live.menu", 0 ], + "obj-9::obj-33" : [ "live.text[1]", "FILTER", 0 ], + "obj-9::obj-34" : [ "live.text[3]", "FILTER", 0 ], "parameterbanks" : { } diff --git a/templates/oopsy_petal.maxpat b/templates/oopsy_petal.maxpat index 5b6bbb8..8a397d6 100644 --- a/templates/oopsy_petal.maxpat +++ b/templates/oopsy_petal.maxpat @@ -148,6 +148,8 @@ "patching_rect" : [ 17.333333333333343, 287.0, 44.0, 90.0 ], "saved_attribute_attributes" : { "valueof" : { + "parameter_initial" : [ -70.0 ], + "parameter_initial_enable" : 1, "parameter_longname" : "live.gain~", "parameter_mmax" : 6.0, "parameter_mmin" : -70.0, @@ -773,7 +775,13 @@ } , "patching_rect" : [ 17.333333333333343, 222.0, 71.5, 35.0 ], - "text" : "gen~" + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/templates/", + "exportname" : "oopsy_petal" + } +, + "text" : "gen~", + "varname" : "oopsy_petal" } } @@ -875,7 +883,8 @@ "obj-7::obj-21::obj-6" : [ "live.tab[3]", "live.tab[1]", 0 ], "obj-7::obj-35" : [ "[5]", "Level", 0 ], "obj-9::obj-32" : [ "live.text[2]", "FILTER", 0 ], - "obj-9::obj-36" : [ "live.menu[1]", "live.menu", 0 ], + "obj-9::obj-33" : [ "live.text[1]", "FILTER", 0 ], + "obj-9::obj-34" : [ "live.text[3]", "FILTER", 0 ], "parameterbanks" : { } @@ -890,6 +899,13 @@ "type" : "gDSP", "implicit" : 1 } +, { + "name" : "oopsy.gate.trig.gendsp", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", + "patcherrelativepath" : "../code", + "type" : "gDSP", + "implicit" : 1 + } , { "name" : "oopsy.gate.min.gendsp", "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", diff --git a/templates/oopsy_pod.maxpat b/templates/oopsy_pod.maxpat index 2669437..6feb625 100644 --- a/templates/oopsy_pod.maxpat +++ b/templates/oopsy_pod.maxpat @@ -86,15 +86,75 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-18", + "id" : "obj-26", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 140.0, 240.0, 43.0, 22.0 ], + "text" : "* 1000" + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 90.0, 240.0, 43.0, 22.0 ], + "text" : "* 1000" + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 128.0, 276.400900900363922, 36.0, 22.0 ], + "text" : "cycle" + } + + } +, { + "box" : { + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 84.0, 276.400900900363922, 36.0, 22.0 ], + "text" : "cycle" + } + + } +, { + "box" : { + "id" : "obj-22", "maxclass" : "newobj", "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 133.5, 303.0, 37.0, 22.0 ], + "patching_rect" : [ 37.5, 243.900900900363922, 37.0, 22.0 ], "text" : "noise" } + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 37.5, 276.400900900363922, 33.0, 22.0 ], + "text" : "* 0.1" + } + } , { "box" : { @@ -398,6 +458,15 @@ , { "patchline" : { "destination" : [ "obj-21", 1 ], + "order" : 0, + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-26", 0 ], + "order" : 1, "source" : [ "obj-14", 0 ] } @@ -437,6 +506,15 @@ , { "patchline" : { "destination" : [ "obj-16", 0 ], + "order" : 0, + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "order" : 1, "source" : [ "obj-2", 0 ] } @@ -447,6 +525,41 @@ "source" : [ "obj-21", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-23", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-24", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-23", 0 ], + "source" : [ "obj-25", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-24", 0 ], + "source" : [ "obj-26", 0 ] + } + } , { "patchline" : { @@ -491,6 +604,8 @@ "patching_rect" : [ 18.0, 323.0, 44.0, 90.0 ], "saved_attribute_attributes" : { "valueof" : { + "parameter_initial" : [ -70.0 ], + "parameter_initial_enable" : 1, "parameter_longname" : "live.gain~", "parameter_mmax" : 6.0, "parameter_mmin" : -70.0, @@ -717,8 +832,8 @@ "obj-7::obj-21::obj-6" : [ "live.tab[3]", "live.tab[1]", 0 ], "obj-7::obj-35" : [ "[5]", "Level", 0 ], "obj-9::obj-32" : [ "live.text[2]", "FILTER", 0 ], - "obj-9::obj-36" : [ "live.menu[1]", "live.menu", 0 ], - "obj-9::obj-4" : [ "live.menu[2]", "live.menu", 0 ], + "obj-9::obj-33" : [ "live.text[1]", "FILTER", 0 ], + "obj-9::obj-34" : [ "live.text[3]", "FILTER", 0 ], "parameterbanks" : { } @@ -790,6 +905,13 @@ "type" : "gDSP", "implicit" : 1 } +, { + "name" : "oopsy.gate.trig.gendsp", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", + "patcherrelativepath" : "../code", + "type" : "gDSP", + "implicit" : 1 + } , { "name" : "oopsy.gate.min.gendsp", "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", diff --git a/templates/oopsy_versio.maxpat b/templates/oopsy_versio.maxpat new file mode 100644 index 0000000..8396f7b --- /dev/null +++ b/templates/oopsy_versio.maxpat @@ -0,0 +1,2739 @@ +{ + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 288.0, 78.0, 679.0, 709.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "activebgcolor" : [ -0.0, 0.0, 0.0, 1.0 ], + "bgcolor" : [ 1.0, 0.0, 0.0, 1.0 ], + "blinktime" : 20, + "id" : "obj-85", + "maxclass" : "live.button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 1, + "parameter_mappable" : 0, + "patching_rect" : [ 547.833333333333258, 111.5, 16.0, 16.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_enum" : [ "off", "on" ], + "parameter_initial" : [ 0.0 ], + "parameter_longname" : "live.button[5]", + "parameter_mmax" : 1.0, + "parameter_shortname" : "live.button", + "parameter_type" : 1 + } + + } +, + "varname" : "live.button[2]" + } + + } +, { + "box" : { + "activebgcolor" : [ -0.0, 0.0, 0.0, 1.0 ], + "bgcolor" : [ 1.0, 0.0, 0.0, 1.0 ], + "blinktime" : 20, + "id" : "obj-86", + "maxclass" : "live.button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 1, + "patching_rect" : [ 528.5, 111.5, 16.0, 16.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_enum" : [ "off", "on" ], + "parameter_initial" : [ 0.0 ], + "parameter_longname" : "live.button[6]", + "parameter_mmax" : 1.0, + "parameter_shortname" : "live.button", + "parameter_type" : 1 + } + + } +, + "varname" : "live.button[3]" + } + + } +, { + "box" : { + "activebgcolor" : [ -0.0, 0.0, 0.0, 1.0 ], + "bgcolor" : [ 1.0, 0.0, 0.0, 1.0 ], + "blinktime" : 20, + "id" : "obj-83", + "maxclass" : "live.button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 1, + "parameter_mappable" : 0, + "patching_rect" : [ 502.333333333333314, 111.5, 16.0, 16.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_enum" : [ "off", "on" ], + "parameter_initial" : [ 0.0 ], + "parameter_longname" : "live.button[3]", + "parameter_mmax" : 1.0, + "parameter_shortname" : "live.button", + "parameter_type" : 1 + } + + } +, + "varname" : "live.button[1]" + } + + } +, { + "box" : { + "activebgcolor" : [ -0.0, 0.0, 0.0, 1.0 ], + "bgcolor" : [ 1.0, 0.0, 0.0, 1.0 ], + "blinktime" : 20, + "id" : "obj-73", + "maxclass" : "live.button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 1, + "patching_rect" : [ 483.0, 111.5, 16.0, 16.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_enum" : [ "off", "on" ], + "parameter_initial" : [ 0.0 ], + "parameter_longname" : "live.button", + "parameter_mmax" : 1.0, + "parameter_shortname" : "live.button", + "parameter_type" : 1 + } + + } +, + "varname" : "live.button" + } + + } +, { + "box" : { + "attr" : "ctrl7", + "id" : "obj-61", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 521.0, 462.355421686746922, 113.0, 22.0 ], + "text_width" : 60.0 + } + + } +, { + "box" : { + "attr" : "ctrl6", + "id" : "obj-58", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 521.0, 440.379518072289102, 113.0, 22.0 ], + "text_width" : 60.0 + } + + } +, { + "box" : { + "attr" : "ctrl5", + "id" : "obj-59", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 521.0, 418.403614457831281, 113.0, 22.0 ], + "text_width" : 60.0 + } + + } +, { + "box" : { + "attr" : "ctrl4", + "id" : "obj-60", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 521.0, 396.427710843373461, 113.0, 22.0 ], + "text_width" : 60.0 + } + + } +, { + "box" : { + "attr" : "ctrl3", + "id" : "obj-57", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 521.0, 374.451807228915641, 113.0, 22.0 ], + "text_width" : 60.0 + } + + } +, { + "box" : { + "attr" : "ctrl2", + "id" : "obj-56", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 521.0, 352.47590361445782, 113.0, 22.0 ], + "text_width" : 60.0 + } + + } +, { + "box" : { + "attr" : "sw2", + "id" : "obj-54", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 408.5, 437.855421686746922, 99.0, 22.0 ], + "text_width" : 63.0 + } + + } +, { + "box" : { + "attr" : "button", + "displaymode" : 8, + "id" : "obj-14", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 408.5, 462.355421686746922, 99.0, 22.0 ], + "text_width" : 63.0 + } + + } +, { + "box" : { + "attr" : "ctrl1", + "id" : "obj-1", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 521.0, 330.5, 113.0, 22.0 ], + "text_width" : 60.0 + } + + } +, { + "box" : { + "attr" : "sw1", + "id" : "obj-53", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 408.5, 413.855421686746922, 99.0, 22.0 ], + "text_width" : 63.0 + } + + } +, { + "box" : { + "angle" : 270.0, + "bgcolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "id" : "obj-38", + "maxclass" : "panel", + "mode" : 0, + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 401.75, 328.284172661870343, 242.25, 161.0 ], + "proportion" : 0.5, + "rounded" : 0 + } + + } +, { + "box" : { + "id" : "obj-33", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "int", "float" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 84.0, 103.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 228.000000000000057, 250.0, 22.0, 22.0 ], + "text" : "t 1" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 194.0, 250.0, 22.0, 22.0 ], + "text" : "t 0" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 160.0, 250.0, 32.0, 22.0 ], + "text" : "t 0.5" + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 4, + "outlettype" : [ "bang", "bang", "bang", "" ], + "patching_rect" : [ 160.0, 224.0, 121.000000000000057, 22.0 ], + "text" : "sel 0 1 2" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-18", + "index" : 2, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 160.0, 293.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-19", + "index" : 2, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 160.0, 171.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 89.000000000000057, 250.0, 22.0, 22.0 ], + "text" : "t 1" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 55.0, 250.0, 22.0, 22.0 ], + "text" : "t 0" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 21.0, 250.0, 32.0, 22.0 ], + "text" : "t 0.5" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 4, + "outlettype" : [ "bang", "bang", "bang", "" ], + "patching_rect" : [ 21.0, 224.0, 121.000000000000057, 22.0 ], + "text" : "sel 0 1 2" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-2", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 21.0, 293.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-1", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 21.0, 171.0, 30.0, 30.0 ] + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-17", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-17", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-6", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-6", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-6", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-8", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-9", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 404.5, 330.5, 58.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p convert" + } + + } +, { + "box" : { + "id" : "obj-29", + "maxclass" : "live.tab", + "num_lines_patching" : 1, + "num_lines_presentation" : 0, + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 443.5, 253.5, 29.0, 17.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_enum" : [ "A", "B", "C" ], + "parameter_initial" : [ 0 ], + "parameter_linknames" : 1, + "parameter_longname" : "live.tab[4]", + "parameter_mmax" : 2, + "parameter_shortname" : "live.tab[3]", + "parameter_type" : 2, + "parameter_unitstyle" : 9 + } + + } +, + "spacing_x" : 3.0, + "varname" : "live.tab[4]" + } + + } +, { + "box" : { + "handoff" : "", + "id" : "obj-45", + "maxclass" : "ubutton", + "numinlets" : 1, + "numoutlets" : 4, + "outlettype" : [ "bang", "bang", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 513.0, 294.0, 24.0, 24.0 ], + "rounded" : 20.0 + } + + } +, { + "box" : { + "id" : "obj-30", + "maxclass" : "live.text", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "parameter_enable" : 1, + "patching_rect" : [ 513.0, 294.0, 24.0, 24.0 ], + "rounded" : 22.0, + "saved_attribute_attributes" : { + "valueof" : { + "parameter_enum" : [ "val1", "val2" ], + "parameter_longname" : "live.text", + "parameter_mmax" : 1, + "parameter_shortname" : "live.text", + "parameter_type" : 2 + } + + } +, + "text" : " ", + "texton" : " ", + "varname" : "live.text" + } + + } +, { + "box" : { + "id" : "obj-26", + "maxclass" : "live.tab", + "num_lines_patching" : 1, + "num_lines_presentation" : 0, + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 443.5, 290.0, 29.0, 17.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_enum" : [ "X", "Y", "Z" ], + "parameter_initial" : [ 0 ], + "parameter_linknames" : 1, + "parameter_longname" : "live.tab[2]", + "parameter_mmax" : 2, + "parameter_shortname" : "live.tab[3]", + "parameter_type" : 2, + "parameter_unitstyle" : 9 + } + + } +, + "spacing_x" : 3.0, + "varname" : "live.tab[2]" + } + + } +, { + "box" : { + "appearance" : 3, + "id" : "obj-20", + "maxclass" : "live.dial", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "panelcolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "parameter_enable" : 1, + "patching_rect" : [ 564.0, 252.0, 50.0, 43.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "knob7", + "parameter_mmax" : 1.0, + "parameter_modmode" : 1, + "parameter_shortname" : "knob7", + "parameter_type" : 0, + "parameter_unitstyle" : 1 + } + + } +, + "showname" : 0, + "shownumber" : 0, + "varname" : "live.dial" + } + + } +, { + "box" : { + "appearance" : 3, + "id" : "obj-18", + "maxclass" : "live.dial", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "panelcolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "parameter_enable" : 1, + "patching_rect" : [ 564.0, 174.0, 50.0, 43.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "knob6", + "parameter_mmax" : 1.0, + "parameter_modmode" : 1, + "parameter_shortname" : "knob6", + "parameter_type" : 0, + "parameter_unitstyle" : 1 + } + + } +, + "showname" : 0, + "shownumber" : 0, + "varname" : "live.dial[1]" + } + + } +, { + "box" : { + "appearance" : 3, + "id" : "obj-19", + "maxclass" : "live.dial", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "panelcolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "parameter_enable" : 1, + "patching_rect" : [ 564.0, 96.0, 50.0, 43.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "knob5", + "parameter_mmax" : 1.0, + "parameter_modmode" : 1, + "parameter_shortname" : "knob5", + "parameter_type" : 0, + "parameter_unitstyle" : 1 + } + + } +, + "showname" : 0, + "shownumber" : 0, + "varname" : "live.dial[2]" + } + + } +, { + "box" : { + "appearance" : 3, + "id" : "obj-16", + "maxclass" : "live.dial", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "panelcolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "parameter_enable" : 1, + "patching_rect" : [ 496.0, 210.0, 50.0, 43.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "knob4", + "parameter_mmax" : 1.0, + "parameter_modmode" : 1, + "parameter_shortname" : "knob4", + "parameter_type" : 0, + "parameter_unitstyle" : 1 + } + + } +, + "showname" : 0, + "shownumber" : 0, + "varname" : "live.dial[3]" + } + + } +, { + "box" : { + "appearance" : 3, + "id" : "obj-17", + "maxclass" : "live.dial", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "panelcolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "parameter_enable" : 1, + "patching_rect" : [ 496.0, 134.0, 50.0, 43.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "knob3", + "parameter_mmax" : 1.0, + "parameter_modmode" : 1, + "parameter_shortname" : "knob3", + "parameter_type" : 0, + "parameter_unitstyle" : 1 + } + + } +, + "showname" : 0, + "shownumber" : 0, + "varname" : "live.dial[4]" + } + + } +, { + "box" : { + "appearance" : 3, + "id" : "obj-12", + "maxclass" : "live.dial", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "panelcolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "parameter_enable" : 1, + "patching_rect" : [ 431.0, 174.0, 50.0, 43.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "knob2", + "parameter_mmax" : 1.0, + "parameter_modmode" : 1, + "parameter_shortname" : "knob2", + "parameter_type" : 0, + "parameter_unitstyle" : 1 + } + + } +, + "showname" : 0, + "shownumber" : 0, + "varname" : "live.dial[5]" + } + + } +, { + "box" : { + "appearance" : 3, + "id" : "obj-10", + "maxclass" : "live.dial", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "panelcolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "parameter_enable" : 1, + "patching_rect" : [ 431.0, 96.0, 50.0, 43.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "knob1", + "parameter_mmax" : 1.0, + "parameter_modmode" : 1, + "parameter_shortname" : "knob1", + "parameter_type" : 0, + "parameter_unitstyle" : 1 + } + + } +, + "showname" : 0, + "shownumber" : 0, + "varname" : "live.dial[6]" + } + + } +, { + "box" : { + "fontname" : "Arial Italic", + "fontsize" : 18.0, + "id" : "obj-24", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 18.0, 34.715827338129543, 325.0, 27.0 ], + "text" : "Template for Noise Engineering Versio" + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "ezdac~", + "numinlets" : 2, + "numoutlets" : 0, + "patching_rect" : [ 18.0, 638.0, 45.0, 45.0 ] + } + + } +, { + "box" : { + "id" : "obj-11", + "lastchannelcount" : 0, + "maxclass" : "live.gain~", + "numinlets" : 2, + "numoutlets" : 5, + "outlettype" : [ "signal", "signal", "", "float", "list" ], + "parameter_enable" : 1, + "patching_rect" : [ 18.0, 532.0, 44.0, 90.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_longname" : "live.gain~", + "parameter_mmax" : 6.0, + "parameter_mmin" : -70.0, + "parameter_shortname" : "live.gain~", + "parameter_type" : 0, + "parameter_unitstyle" : 4 + } + + } +, + "varname" : "live.gain~" + } + + } +, { + "box" : { + "args" : [ "@loop", 1, "@file", "jongly.aif" ], + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-7", + "lockeddragscroll" : 0, + "maxclass" : "bpatcher", + "name" : "demosound.maxpat", + "numinlets" : 0, + "numoutlets" : 1, + "offset" : [ 0.0, 0.0 ], + "outlettype" : [ "signal" ], + "patching_rect" : [ 18.0, 179.0, 225.0, 105.0 ], + "viewvisibility" : 1 + } + + } +, { + "box" : { + "args" : [ "@target", "versio" ], + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-9", + "lockeddragscroll" : 0, + "maxclass" : "bpatcher", + "name" : "oopsy.maxpat", + "numinlets" : 1, + "numoutlets" : 0, + "offset" : [ 0.0, 0.0 ], + "patching_rect" : [ 252.0, 179.0, 128.0, 128.0 ], + "viewvisibility" : 1 + } + + } +, { + "box" : { + "fontsize" : 24.0, + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 6, + "outlettype" : [ "signal", "signal", "signal", "signal", "signal", "signal" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "dsp.gen", + "rect" : [ 84.0, 102.0, 1119.0, 564.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 427.0, 175.0, 29.5, 22.0 ], + "text" : "or" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 314.5, 284.514606741573061, 69.0, 22.0 ], + "text" : "param ctrl7" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 314.5, 260.514606741573061, 69.0, 22.0 ], + "text" : "param ctrl6" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 314.5, 236.83820224719102, 69.0, 22.0 ], + "text" : "param ctrl5" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 314.5, 212.83820224719102, 69.0, 22.0 ], + "text" : "param ctrl4" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 297.0, 165.0, 69.0, 22.0 ], + "text" : "param ctrl2" + } + + } +, { + "box" : { + "id" : "obj-80", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 427.0, 450.0, 61.0, 22.0 ], + "text" : "out 6 led4" + } + + } +, { + "box" : { + "id" : "obj-73", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 314.5, 450.0, 61.0, 22.0 ], + "text" : "out 5 led3" + } + + } +, { + "box" : { + "id" : "obj-72", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 218.0, 450.0, 61.0, 22.0 ], + "text" : "out 4 led2" + } + + } +, { + "box" : { + "id" : "obj-71", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 152.5, 450.0, 61.0, 22.0 ], + "text" : "out 3 led1" + } + + } +, { + "box" : { + "id" : "obj-70", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 539.0, 31.0, 100.0, 87.0 ], + "text" : "The \"FSU\" momentary button functions similar to the gate input, but is independent" + } + + } +, { + "box" : { + "id" : "obj-69", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 539.0, 139.5, 79.0, 22.0 ], + "text" : "param button" + } + + } +, { + "box" : { + "id" : "obj-39", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 930.5, 44.5, 107.0, 22.0 ], + "text" : "oopsy.suggestions" + } + + } +, { + "box" : { + "id" : "obj-58", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 29.5, 395.0, 69.0, 20.0 ], + "text" : "OUTPUTS" + } + + } +, { + "box" : { + "id" : "obj-59", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 29.5, 141.0, 69.0, 20.0 ], + "text" : "INPUTS" + } + + } +, { + "box" : { + "id" : "obj-27", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 427.0, 31.0, 110.0, 87.0 ], + "text" : "Gate inputs are similar to CVs, but the input is always either @min or @max, also 0 or 1 by default." + } + + } +, { + "box" : { + "id" : "obj-26", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 427.0, 139.5, 69.0, 22.0 ], + "text" : "param gate" + } + + } +, { + "box" : { + "id" : "obj-64", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 314.5, 188.83820224719102, 69.0, 22.0 ], + "text" : "param ctrl3" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 278.5, 141.0, 69.0, 22.0 ], + "text" : "param ctrl1" + } + + } +, { + "box" : { + "id" : "obj-65", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 278.5, 31.0, 132.0, 87.0 ], + "text" : "Knob/CV/Gate etc.\nEach hardware knob + cv will handle 0-5v, which is mapped to @min-@max in gen~ (default 0-1)" + } + + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 137.5, 106.0, 65.0, 20.0 ], + "text" : "Audio IOs" + } + + } +, { + "box" : { + "id" : "obj-67", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 178.5, 141.0, 28.0, 22.0 ], + "text" : "in 2" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 178.5, 395.0, 35.0, 22.0 ], + "text" : "out 2" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 137.5, 141.0, 28.0, 22.0 ], + "text" : "in 1" + } + + } +, { + "box" : { + "id" : "obj-68", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 137.5, 395.0, 35.0, 22.0 ], + "text" : "out 1" + } + + } +, { + "box" : { + "id" : "obj-56", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 160.5, 482.0, 335.0, 33.0 ], + "text" : "Leds accept ranges of -1 to 1. -1 is red, 1 is green, and 0 is off; so they can operate well to visualize LFOs for example. " + } + + } +, { + "box" : { + "id" : "obj-41", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 657.0, 58.0, 179.0, 60.0 ], + "text" : "switches ABC/XYZ: \ncenter = @min or 0, \nleft = avg @min,@max or 0.5\nright = @max or 1" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 733.0, 139.5, 67.0, 22.0 ], + "text" : "param sw2" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 657.0, 139.5, 67.0, 22.0 ], + "text" : "param sw1" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-68", 0 ], + "order" : 1, + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-71", 0 ], + "midpoints" : [ 147.0, 433.0, 162.0, 433.0 ], + "order" : 0, + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-73", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-80", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "order" : 1, + "source" : [ "obj-67", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-72", 0 ], + "midpoints" : [ 188.0, 435.5, 227.5, 435.5 ], + "order" : 0, + "source" : [ "obj-67", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 1 ], + "source" : [ "obj-69", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 18.0, 483.0, 144.0, 35.0 ], + "saved_object_attributes" : { + "exportfolder" : "Macintosh HD:/Users/grrrwaaa/Documents/Max 8/Packages/oopsy/templates/", + "exportname" : "oopsy_versio" + } +, + "text" : "gen~", + "varname" : "oopsy_versio" + } + + } +, { + "box" : { + "autofit" : 1, + "forceaspect" : 1, + "id" : "obj-2", + "maxclass" : "fpic", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "jit_matrix" ], + "patching_rect" : [ 391.0, 18.715827338129543, 263.0, 533.568345323740914 ], + "pic" : "oopsy_noise_engineering_versio.png" + } + + } +, { + "box" : { + "id" : "obj-70", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 4, + "outlettype" : [ "", "", "", "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 1, + "revision" : 8, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 84.0, 103.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.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" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 513.0, 191.75, 29.0, 22.0 ], + "text" : "sqrt" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 448.0, 191.75, 29.0, 22.0 ], + "text" : "sqrt" + } + + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 378.0, 191.75, 29.0, 22.0 ], + "text" : "sqrt" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 313.0, 191.75, 29.0, 22.0 ], + "text" : "sqrt" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 244.0, 191.75, 29.0, 22.0 ], + "text" : "sqrt" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 179.0, 191.75, 29.0, 22.0 ], + "text" : "sqrt" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 109.0, 191.75, 29.0, 22.0 ], + "text" : "sqrt" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 44.0, 191.75, 29.0, 22.0 ], + "text" : "sqrt" + } + + } +, { + "box" : { + "id" : "obj-55", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 448.0, 130.5, 31.0, 22.0 ], + "text" : "* -1." + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-56", + "index" : 4, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "signal" ], + "patching_rect" : [ 448.0, 56.5, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-57", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 448.0, 98.0, 81.0, 22.0 ], + "text" : "snapshot~ 30" + } + + } +, { + "box" : { + "id" : "obj-58", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 448.0, 221.5, 84.0, 22.0 ], + "text" : "pack 0. 0." + } + + } +, { + "box" : { + "id" : "obj-59", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 513.0, 162.0, 53.0, 22.0 ], + "text" : "clip 0. 1." + } + + } +, { + "box" : { + "id" : "obj-60", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 448.0, 162.0, 53.0, 22.0 ], + "text" : "clip 0. 1." + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-61", + "index" : 4, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 448.0, 281.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-62", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 448.0, 251.0, 136.0, 22.0 ], + "text" : "activebgcolor $1 $2 0 1." + } + + } +, { + "box" : { + "id" : "obj-63", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 313.0, 130.5, 31.0, 22.0 ], + "text" : "* -1." + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-64", + "index" : 3, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "signal" ], + "patching_rect" : [ 313.0, 56.5, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-65", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 313.0, 98.0, 81.0, 22.0 ], + "text" : "snapshot~ 30" + } + + } +, { + "box" : { + "id" : "obj-66", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 313.0, 221.5, 84.0, 22.0 ], + "text" : "pack 0. 0." + } + + } +, { + "box" : { + "id" : "obj-67", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 378.0, 162.0, 53.0, 22.0 ], + "text" : "clip 0. 1." + } + + } +, { + "box" : { + "id" : "obj-68", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 313.0, 162.0, 53.0, 22.0 ], + "text" : "clip 0. 1." + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-69", + "index" : 3, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 313.0, 281.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-70", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 313.0, 251.0, 136.0, 22.0 ], + "text" : "activebgcolor $1 $2 0 1." + } + + } +, { + "box" : { + "id" : "obj-47", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 179.0, 130.5, 31.0, 22.0 ], + "text" : "* -1." + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-48", + "index" : 2, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "signal" ], + "patching_rect" : [ 179.0, 56.5, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-49", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 179.0, 98.0, 81.0, 22.0 ], + "text" : "snapshot~ 30" + } + + } +, { + "box" : { + "id" : "obj-50", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 179.0, 221.5, 84.0, 22.0 ], + "text" : "pack 0. 0." + } + + } +, { + "box" : { + "id" : "obj-51", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 244.0, 162.0, 53.0, 22.0 ], + "text" : "clip 0. 1." + } + + } +, { + "box" : { + "id" : "obj-52", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 179.0, 162.0, 53.0, 22.0 ], + "text" : "clip 0. 1." + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-53", + "index" : 2, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 179.0, 281.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-54", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 179.0, 251.0, 136.0, 22.0 ], + "text" : "activebgcolor $1 $2 0 1." + } + + } +, { + "box" : { + "id" : "obj-46", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 44.0, 130.5, 31.0, 22.0 ], + "text" : "* -1." + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-16", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "signal" ], + "patching_rect" : [ 44.0, 56.5, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 44.0, 98.0, 81.0, 22.0 ], + "text" : "snapshot~ 30" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 44.0, 221.5, 84.0, 22.0 ], + "text" : "pack 0. 0." + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 109.0, 162.0, 53.0, 22.0 ], + "text" : "clip 0. 1." + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 44.0, 162.0, 53.0, 22.0 ], + "text" : "clip 0. 1." + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-5", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 44.0, 281.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 44.0, 251.0, 136.0, 22.0 ], + "text" : "activebgcolor $1 $2 0 1." + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-66", 0 ], + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-66", 1 ], + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-58", 0 ], + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-46", 0 ], + "order" : 1, + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "order" : 0, + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-58", 1 ], + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 1 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-50", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-46", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-52", 0 ], + "source" : [ "obj-47", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-49", 0 ], + "source" : [ "obj-48", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-47", 0 ], + "order" : 1, + "source" : [ "obj-49", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-51", 0 ], + "order" : 0, + "source" : [ "obj-49", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-54", 0 ], + "source" : [ "obj-50", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-51", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-52", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-53", 0 ], + "source" : [ "obj-54", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-60", 0 ], + "source" : [ "obj-55", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-57", 0 ], + "source" : [ "obj-56", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-55", 0 ], + "order" : 1, + "source" : [ "obj-57", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-59", 0 ], + "order" : 0, + "source" : [ "obj-57", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-62", 0 ], + "source" : [ "obj-58", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-59", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-6", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-60", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-61", 0 ], + "source" : [ "obj-62", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-68", 0 ], + "source" : [ "obj-63", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-65", 0 ], + "source" : [ "obj-64", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-63", 0 ], + "order" : 1, + "source" : [ "obj-65", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-67", 0 ], + "order" : 0, + "source" : [ "obj-65", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-70", 0 ], + "source" : [ "obj-66", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-11", 0 ], + "source" : [ "obj-67", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-68", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-69", 0 ], + "source" : [ "obj-70", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-8", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-50", 1 ], + "source" : [ "obj-9", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 449.0, 523.0, 147.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p leds" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "hidden" : 1, + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 1 ], + "source" : [ "obj-11", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-56", 0 ], + "hidden" : 1, + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-60", 0 ], + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-57", 0 ], + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-58", 0 ], + "hidden" : 1, + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-59", 0 ], + "hidden" : 1, + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-61", 0 ], + "hidden" : 1, + "source" : [ "obj-20", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-33", 1 ], + "hidden" : 1, + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-33", 0 ], + "hidden" : 1, + "source" : [ "obj-29", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-11", 1 ], + "source" : [ "obj-3", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-11", 0 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-70", 3 ], + "hidden" : 1, + "midpoints" : [ 152.5, 520.0, 586.5, 520.0 ], + "source" : [ "obj-3", 5 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-70", 2 ], + "hidden" : 1, + "midpoints" : [ 127.5, 520.0, 543.833333333333371, 520.0 ], + "source" : [ "obj-3", 4 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-70", 1 ], + "hidden" : 1, + "midpoints" : [ 102.5, 520.0, 501.166666666666686, 520.0 ], + "source" : [ "obj-3", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-70", 0 ], + "hidden" : 1, + "midpoints" : [ 77.5, 520.0, 458.5, 520.0 ], + "source" : [ "obj-3", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-30", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-53", 0 ], + "hidden" : 1, + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-54", 0 ], + "hidden" : 1, + "source" : [ "obj-33", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 0 ], + "source" : [ "obj-45", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 0 ], + "source" : [ "obj-45", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-53", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-54", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-56", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-57", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-58", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-59", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-60", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-61", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 1 ], + "midpoints" : [ 27.5, 417.5, 152.5, 417.5 ], + "order" : 0, + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "order" : 1, + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-73", 0 ], + "hidden" : 1, + "source" : [ "obj-70", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-83", 0 ], + "hidden" : 1, + "source" : [ "obj-70", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-85", 0 ], + "hidden" : 1, + "source" : [ "obj-70", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-86", 0 ], + "hidden" : 1, + "source" : [ "obj-70", 2 ] + } + + } + ], + "parameters" : { + "obj-10" : [ "knob1", "knob1", 0 ], + "obj-11" : [ "live.gain~", "live.gain~", 0 ], + "obj-12" : [ "knob2", "knob2", 0 ], + "obj-16" : [ "knob4", "knob4", 0 ], + "obj-17" : [ "knob3", "knob3", 0 ], + "obj-18" : [ "knob6", "knob6", 0 ], + "obj-19" : [ "knob5", "knob5", 0 ], + "obj-20" : [ "knob7", "knob7", 0 ], + "obj-26" : [ "live.tab[2]", "live.tab[3]", 0 ], + "obj-29" : [ "live.tab[4]", "live.tab[3]", 0 ], + "obj-30" : [ "live.text", "live.text", 0 ], + "obj-73" : [ "live.button", "live.button", 0 ], + "obj-7::obj-21::obj-6" : [ "live.tab[3]", "live.tab[1]", 0 ], + "obj-7::obj-35" : [ "[5]", "Level", 0 ], + "obj-83" : [ "live.button[3]", "live.button", 0 ], + "obj-85" : [ "live.button[5]", "live.button", 0 ], + "obj-86" : [ "live.button[6]", "live.button", 0 ], + "obj-9::obj-32" : [ "live.text[2]", "FILTER", 0 ], + "obj-9::obj-33" : [ "live.text[1]", "FILTER", 0 ], + "obj-9::obj-34" : [ "live.text[3]", "FILTER", 0 ], + "parameterbanks" : { + + } +, + "inherited_shortname" : 1 + } +, + "dependency_cache" : [ { + "name" : "oopsy_noise_engineering_versio.png", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/media", + "patcherrelativepath" : "../media", + "type" : "PNG", + "implicit" : 1 + } +, { + "name" : "oopsy.suggestions.gendsp", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", + "patcherrelativepath" : "../code", + "type" : "gDSP", + "implicit" : 1 + } +, { + "name" : "oopsy.gate.min.gendsp", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", + "patcherrelativepath" : "../code", + "type" : "gDSP", + "implicit" : 1 + } +, { + "name" : "oopsy.ctrl.smooth3.gendsp", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", + "patcherrelativepath" : "../code", + "type" : "gDSP", + "implicit" : 1 + } +, { + "name" : "oopsy.ctrl.smooth2.gendsp", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", + "patcherrelativepath" : "../code", + "type" : "gDSP", + "implicit" : 1 + } +, { + "name" : "oopsy.gate.trig.gendsp", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/code", + "patcherrelativepath" : "../code", + "type" : "gDSP", + "implicit" : 1 + } +, { + "name" : "oopsy.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/patchers", + "patcherrelativepath" : "../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "oopsy.snoop.js", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/javascript", + "patcherrelativepath" : "../javascript", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "oopsy.node4max.js", + "bootpath" : "~/Documents/Max 8/Packages/oopsy/javascript", + "patcherrelativepath" : "../javascript", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "demosound.maxpat", + "bootpath" : "C74:/help/msp", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "sine.svg", + "bootpath" : "C74:/media/max/picts/m4l-picts", + "type" : "svg", + "implicit" : 1 + } +, { + "name" : "saw.svg", + "bootpath" : "C74:/media/max/picts/m4l-picts", + "type" : "svg", + "implicit" : 1 + } +, { + "name" : "square.svg", + "bootpath" : "C74:/media/max/picts/m4l-picts", + "type" : "svg", + "implicit" : 1 + } +, { + "name" : "random.svg", + "bootpath" : "C74:/media/max/picts/m4l-picts", + "type" : "svg", + "implicit" : 1 + } +, { + "name" : "interfacecolor.js", + "bootpath" : "C74:/interfaces", + "type" : "TEXT", + "implicit" : 1 + } + ], + "autosave" : 0, + "boxgroups" : [ { + "boxes" : [ "obj-2", "obj-38", "obj-14", "obj-70", "obj-54", "obj-53", "obj-56", "obj-57", "obj-60", "obj-59", "obj-58", "obj-61", "obj-30", "obj-45", "obj-33", "obj-1", "obj-10", "obj-12", "obj-17", "obj-16", "obj-19", "obj-18", "obj-20", "obj-26", "obj-29", "obj-73", "obj-83", "obj-86", "obj-85" ] + } + ] + } + +}