diff --git a/max-lfo-table-nogit/common.js b/max-lfo-table-nogit/common.js new file mode 100644 index 0000000..96cb58e --- /dev/null +++ b/max-lfo-table-nogit/common.js @@ -0,0 +1,62 @@ +function isNumeric(str) { + if (typeof str != "string") return false // we only process strings! + return !isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)... + !isNaN(parseFloat(str)) // ...and ensure strings of whitespace fail + } + +function DropDown(props) { + return e('select', {type: "number", onChange: props.onChange, value: props.value}, + ...props.options.map((item) => Option(item))); +} + +function ListItem(child){ + return e('li', null, child); +} + +function Label(text){ + return e('div', {className: 'label'}, text); +} + +function NumberBox(props){ + return e('input', {type: "number", onChange: props.onChange, step: props.step, value: props.value, className: props.className}, null); +} + +function TextBox(props){ + return e('input', {type: "text", value: props.value, onChange: props.onChange, id: props.id}); +} + +function Option(str, value){ + return e("option", {value: value}, str); +} + +function Button(props){ + return e('button', {onClick: props.onClick}, props.text); +} + +function Switch(props){ + return e('label', {className: 'switch'}, + e('input', {type: 'checkbox', onClick: props.ontoggle}, null), + e('span', {className: 'slider round'}, null)) +} + +function CreateParamChanger(arr, setArr, index, postCB=() => {}, preCB=(val) => val){ + return (event) => { + let newArr = arr.slice(); + newArr[index] = preCB(event.target.value); + setArr(newArr); + postCB(); + log(`${index} ${event.target.value}`); + } +} + +function CreateMatrixParamChanger(matrix, setMatrix, i, j){ + return (event) => { + var newMatrix = matrix.map(function(arr) { + return arr.slice(); + }); + newMatrix[i][j] = event.target.value; + setMatrix(newMatrix); + log(`${i}, ${j} ${event.target.value}`); + + } +} \ No newline at end of file diff --git a/max-lfo-table-nogit/enums.js b/max-lfo-table-nogit/enums.js new file mode 100644 index 0000000..0c911af --- /dev/null +++ b/max-lfo-table-nogit/enums.js @@ -0,0 +1,72 @@ +///////////////////////// +// ENUMERATORS +///////////////////////// + + + +// NOT A REACT FUNCTIONAL COMPONENT. MERELY RETURNS AN ARRAY WHICH IS UNPACKED +function EnumeratorItems(index, enumBreakPoints, setEnumBreakPoints, enumNames, setEnumNames, djParam){ + let items = []; + for (let i = 0; i < MAXENUMPOINTS; i++){ + + items.push(ListItem(e(TextBox, {onChange: CreateMatrixParamChanger(enumNames, setEnumNames, index, i), value: enumNames[index][i], id:`text-${djParam}-${enumNames[index][i]}`}, null))); + // Add 1 to make up for the lower enum bound + items.push(ListItem(e(NumberBox, {onChange: CreateMatrixParamChanger(enumBreakPoints, setEnumBreakPoints, index, i + 1), value:enumBreakPoints[index][i + 1]}, null))); + } + return items; +} + +function EnumeratorRow(props){ + let linkedText = props.linked ? "<- mods" : ""; + + let content = e('ul', {className: 'lfo-item', id: `${props.djParam}-enum-row`}, + ListItem(DropDown({onChange: props.setInstanceNum, value:props.instanceNum, options: INSTANCEOPTIONS})), + ListItem(DropDown({onChange: props.setDjParam, value: props.djParam, options: MODPARAMOPTIONS})), + ListItem(e(NumberBox, {onChange: props.setEnumItemCounts, step:1, value:props.enumItems, className: 'enum-count'}, null)), + ListItem(e(NumberBox, {onChange: CreateMatrixParamChanger(props.enumBreakPoints, props.setEnumBreakPoints, props.index, 0), value:props.enumBreakPoints[props.index][0], step:0.1}, null)), + ...(EnumeratorItems(props.index, props.enumBreakPoints, props.setEnumBreakPoints, props.enumNames, props.setEnumNames, props.djParam).slice(0, props.enumItems * 2)), + ListItem(e(Button, {text:'+', onClick: props.addEnum}, null)), + ListItem(e(Button, {text:'-', onClick: props.removeEnum}, null)), + ListItem(e("div", {className:"linked"}, linkedText)) + ); + if (props.visible){ + return content; + }; +} + +function denumerate(inval, count, keys, vals){ + let output = inval; + for (let i=0; i < count; i++){ + log(vals[i]); + if (inval == vals[i]){ + output = (parseFloat(keys[i]) + parseFloat(keys[i+1])) / 2; // linear interpolate + } + } + return output; +} + + +function enumerate(name, inst, inval, count, keys, vals){ + let output = "OUT OF RANGE"; + for (let i=0; i < count + 1; i++){ + if (inval <= keys[i]){ + if (i > 0) + output = vals[i - 1]; + break + } + } + let highlightedItem = document.getElementById(`text-${name}-${output}`); + + if (highlightedItem){ + + highlightedItem.style.animation = "pulse-animation 0.5s normal"; + + highlightedItem.addEventListener('animationend', () => { + highlightedItem.style.animation = ""; + }); + } + + if (name !== "NONE") + window.max.outlet(inst + " " + name + " " + output); +} + diff --git a/max-lfo-table-nogit/example-with-dj.maxpat b/max-lfo-table-nogit/example-with-dj.maxpat new file mode 100644 index 0000000..3e26901 --- /dev/null +++ b/max-lfo-table-nogit/example-with-dj.maxpat @@ -0,0 +1,2680 @@ +{ + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 6, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 87.0, 170.0, 1345.0, 588.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" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 869.0, 74.0, 168.0, 33.0 ], + "text" : "TODO - must deenumerate inputs coming from DJster" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 663.516963958740234, 70.850461006164551, 101.0, 22.0 ], + "text" : "load localStorage" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 999.866710782051086, 199.542056441307068, 104.0, 22.0 ], + "text" : "save localStorage" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 663.516963958740234, 40.817753553390503, 55.0, 22.0 ], + "text" : "del 1000" + } + + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 663.516963958740234, 4.317753553390503, 58.0, 22.0 ], + "text" : "loadbang" + } + + } +, { + "box" : { + "data" : { + "data" : { + "enumArrays" : [ [ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 2, 2, 2, 2, 2, "2", "2", "2", "2", "2" ], [ "meter", "stream", "scale", "NONE", "NONE", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation" ] ], + "enumMats" : [ [ [ "0", "1", "2", 3, 4, 5, 6, 7, 8, 9, 10 ], [ "0", "1", "2", 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] ], [ [ "3 4", "7 8", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "0", "1", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "pentatonic", "major", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ] ] ], + "modArrays" : [ [ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ "Sine", "SawUp", "SawDown", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine" ], [ "metriclarity", "stream", "meter", "harmoniclarity", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation" ], [ "0.6", "0.3", "0.1", "0.6", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "30", "2", "2", "36", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "0", "0", "0", "0.5", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ] ] + } + + } +, + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 4, + "outlettype" : [ "dictionary", "", "", "" ], + "patching_rect" : [ 702.514054298400879, 148.869158983230591, 159.0, 22.0 ], + "saved_object_attributes" : { + "embed" : 1, + "parameter_enable" : 0, + "parameter_mappable" : 0 + } +, + "text" : "dict localStorage @embed 1" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 839.266704782050965, 318.971981048583984, 71.0, 22.0 ], + "text" : "fromsymbol" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 68.8047869048537, 208.411226630210876, 90.0, 22.0 ], + "text" : "prepend param" + } + + } +, { + "box" : { + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-1", + "lockeddragscroll" : 0, + "lockedsize" : 0, + "maxclass" : "bpatcher", + "name" : "DJster.maxpat", + "numinlets" : 1, + "numoutlets" : 4, + "offset" : [ 0.0, 0.0 ], + "outlettype" : [ "", "bang", "", "dictionary" ], + "patching_rect" : [ 839.266704782050965, 346.653744474845894, 465.200012000000015, 171.399993999999992 ], + "varname" : "Djster.µbus[1]", + "viewvisibility" : 1 + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "jweb", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 68.8047869048537, 239.018703579902649, 710.105266809463501, 317.0 ], + "rendermode" : 0, + "url" : "file://lfogui.html" + } + + } +, { + "box" : { + "bgmode" : 0, + "border" : 0, + "clickthrough" : 0, + "embed" : 1, + "enablehscroll" : 0, + "enablevscroll" : 0, + "id" : "obj-55", + "lockeddragscroll" : 0, + "lockedsize" : 0, + "maxclass" : "bpatcher", + "name" : "DJster-control-guts.maxpat", + "numinlets" : 0, + "numoutlets" : 1, + "offset" : [ 0.0, 0.0 ], + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 6, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 490.0, 157.0, 1441.0, 699.0 ], + "bglocked" : 0, + "openinpresentation" : 1, + "default_fontsize" : 10.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-43", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 893.53335600000014, 47.0, 76.0, 20.0 ], + "text" : "prepend sorted" + } + + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 708.958344000000011, 41.0, 81.0, 20.0 ], + "text" : "prepend overlap" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 328.816681000000017, 41.0, 79.0, 20.0 ], + "text" : "prepend stream" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 219.583333333333371, 355.0, 128.0, 20.0 ], + "text" : "prepend melodic_cohesion" + } + + } +, { + "box" : { + "annotation" : "Silent downbeat. This parameter switches the relative probabilities for the first and second pulses", + "bordercolor" : [ 1.0, 0.709803921568627, 0.196078431372549, 1.0 ], + "focusbordercolor" : [ 0.764705882352941, 0.764705882352941, 0.764705882352941, 1.0 ], + "id" : "obj-217", + "maxclass" : "live.toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 1, + "patching_rect" : [ 709.458344000000011, 13.0, 15.0, 15.0 ], + "presentation" : 1, + "presentation_rect" : [ 96.252646684646606, 133.5, 15.0, 15.0 ], + "saved_attribute_attributes" : { + "bordercolor" : { + "expression" : "themecolor.live_control_selection" + } +, + "focusbordercolor" : { + "expression" : "themecolor.live_control_zombie" + } +, + "valueof" : { + "parameter_enum" : [ "off", "on" ], + "parameter_info" : "Silent downbeat. This parameter switches the relative probabilities for the first and second pulses", + "parameter_initial" : [ 1 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Overlap", + "parameter_mmax" : 1, + "parameter_shortname" : "Overlap", + "parameter_type" : 2 + } + + } +, + "varname" : "overlap" + } + + } +, { + "box" : { + "fontname" : "Ableton Sans Medium", + "fontsize" : 9.5, + "id" : "obj-215", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 1190.645843000000013, 312.0, 101.0, 18.0 ], + "presentation" : 1, + "presentation_rect" : [ 52.0, 131.5, 45.0, 18.0 ], + "saved_attribute_attributes" : { + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } + + } +, + "text" : "Overlap:", + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ] + } + + } +, { + "box" : { + "fontname" : "Ableton Sans Medium", + "fontsize" : 9.5, + "id" : "obj-207", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 694.049987999999871, 67.0, 75.0, 18.0 ], + "presentation" : 1, + "presentation_rect" : [ 389.850013136863708, 0.0, 77.0, 18.0 ], + "saved_attribute_attributes" : { + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } + + } +, + "text" : "Chordal Weight", + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ] + } + + } +, { + "box" : { + "activebgcolor" : [ 0.529411764705882, 0.529411764705882, 0.529411764705882, 1.0 ], + "annotation" : "Set the number of intervals in a chord. A maximum of 5 notes can be played together in each stream. ", + "appearance" : 2, + "bordercolor" : [ 1.0, 0.709803921568627, 0.196078431372549, 1.0 ], + "id" : "obj-206", + "maxclass" : "live.numbox", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 708.958344000000011, 96.5, 44.0, 15.0 ], + "presentation" : 1, + "presentation_rect" : [ 414.350013136863708, 20.0, 28.0, 15.0 ], + "saved_attribute_attributes" : { + "activebgcolor" : { + "expression" : "themecolor.live_surface_bg" + } +, + "bordercolor" : { + "expression" : "themecolor.live_control_selection" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_enum" : [ "1", "2", "3", "4", "5" ], + "parameter_info" : "Set the number of intervals in a chord. A maximum of 5 notes can be played together in each stream. ", + "parameter_initial" : [ 1 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Chordal Weight", + "parameter_mmax" : 5.0, + "parameter_mmin" : 1.0, + "parameter_shortname" : "Chordal Weight", + "parameter_type" : 1, + "parameter_unitstyle" : 9 + } + + } +, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "textjustification" : 0, + "varname" : "chordal_weight" + } + + } +, { + "box" : { + "id" : "obj-165", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 173.75, 435.0, 74.0, 20.0 ], + "text" : "prepend meter" + } + + } +, { + "box" : { + "annotation" : "Transport on: set subdivisions of the current beat; transport off: set meter", + "bgcolor" : [ 0.2, 0.2, 0.2, 0.0 ], + "bgfillcolor_color" : [ 0.2, 0.2, 0.2, 0.0 ], + "bgfillcolor_color1" : [ 0.301961, 0.301961, 0.301961, 1 ], + "bgfillcolor_color2" : [ 0.2, 0.2, 0.2, 1 ], + "bgfillcolor_type" : "color", + "id" : "obj-158", + "items" : [ 1, ",", 2, ",", 3, ",", 2, 2, ",", "2+3", ",", "3+2", ",", 2, 3, ",", 3, 2, ",", "2+2+3", ",", "2+3+2", ",", "3+2+2", ",", 2, 2, 2, ",", "2+3+3", ",", "3+2+3", ",", "3+3+2", ",", 3, 3, ",", 2, 5, ",", 11, ",", 3, 2, 2, ",", 2, 3, 2, ",", 2, 2, 3, ",", "my-meter" ], + "maxclass" : "umenu", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "int", "", "" ], + "parameter_enable" : 1, + "parameter_mappable" : 0, + "patching_rect" : [ 174.324981500000035, 388.166666895151138, 17.850037000000043, 20.0 ], + "pattrmode" : 1, + "presentation" : 1, + "presentation_rect" : [ 194.0, 0.0, 18.0, 20.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_enum" : [ "1", "2", "3", "2 2", "2+3", "3+2", "2 3", "3 2", "2+2+3", "2+3+2", "3+2+2", "2 2 2", "2+3+3", "3+2+3", "3+3+2", "3 3", "2 5", "11", "3 2 2", "2 3 2", "2 2 3", "my-meter" ], + "parameter_longname" : "Subdivisions", + "parameter_mmax" : 21, + "parameter_shortname" : "Subdivision", + "parameter_type" : 2 + } + + } +, + "textcolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "varname" : "subdivision" + } + + } +, { + "box" : { + "fontname" : "Ableton Sans Medium", + "fontsize" : 9.5, + "id" : "obj-138", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 1243.395843000000013, 339.5, 37.0, 18.0 ], + "presentation" : 1, + "presentation_rect" : [ 293.594707787036896, 0.0, 37.0, 18.0 ], + "saved_attribute_attributes" : { + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } + + } +, + "text" : "Sorted", + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ] + } + + } +, { + "box" : { + "annotation" : "Silent downbeat. This parameter switches the relative probabilities for the first and second pulses", + "bordercolor" : [ 1.0, 0.709803921568627, 0.196078431372549, 1.0 ], + "focusbordercolor" : [ 0.764705882352941, 0.764705882352941, 0.764705882352941, 1.0 ], + "id" : "obj-136", + "maxclass" : "live.toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 1, + "patching_rect" : [ 894.03335600000014, 13.0, 15.0, 15.0 ], + "presentation" : 1, + "presentation_rect" : [ 304.594707787036896, 20.0, 15.0, 15.0 ], + "saved_attribute_attributes" : { + "bordercolor" : { + "expression" : "themecolor.live_control_selection" + } +, + "focusbordercolor" : { + "expression" : "themecolor.live_control_zombie" + } +, + "valueof" : { + "parameter_enum" : [ "harm", "scale" ], + "parameter_info" : "Silent downbeat. This parameter switches the relative probabilities for the first and second pulses", + "parameter_initial" : [ 0.0 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Sorted", + "parameter_mmax" : 1, + "parameter_shortname" : "Sorted", + "parameter_type" : 2 + } + + } +, + "varname" : "sorted" + } + + } +, { + "box" : { + "activedialcolor" : [ 0.047058823529412, 0.423529411764706, 0.847058823529412, 1.0 ], + "activefgdialcolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "activeneedlecolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "annotation" : "A measure of the preservation of the scale used as input for the stocastic process. The values range from -1 (preserved sequence played backward) to 0 (weighted randomness) to 1 (preserved sequence played forward).\nThe scale can be represented either as an ascending sequence or as sequence, the order of which depending on its members' harmonic distance from the tonic or an arbitrarily assignedpriority value (use the Sort switch to toggle between these modes).\n", + "appearance" : 1, + "fontsize" : 9.0, + "id" : "obj-77", + "maxclass" : "live.dial", + "needlecolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 221.816681000000017, 295.0, 53.0, 36.0 ], + "presentation" : 1, + "presentation_rect" : [ 384.094707787036896, 47.0, 72.5, 36.0 ], + "prototypename" : "amount", + "saved_attribute_attributes" : { + "activedialcolor" : { + "expression" : "" + } +, + "activefgdialcolor" : { + "expression" : "" + } +, + "activeneedlecolor" : { + "expression" : "" + } +, + "needlecolor" : { + "expression" : "themecolor.live_macro_title" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_info" : "A measure of the preservation of the scale used as input for the stocastic process. The values range from -1 (preserved sequence played backward) to 0 (weighted randomness) to 1 (preserved sequence played forward).\nThe scale can be represented either as an ascending sequence or as sequence, the order of which depending on its members' harmonic distance from the tonic or an arbitrarily assignedpriority value (use the Sort switch to toggle between these modes).\n", + "parameter_initial" : [ 0 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Cohesion", + "parameter_mmax" : 100.0, + "parameter_mmin" : -100.0, + "parameter_shortname" : "Melodic Cohesion", + "parameter_type" : 0, + "parameter_unitstyle" : 5 + } + + } +, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "triangle" : 1, + "varname" : "melodic_cohesion" + } + + } +, { + "box" : { + "id" : "obj-134", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1128.283339999999953, 165.0, 112.0, 20.0 ], + "text" : "prepend ostinato-buffer" + } + + } +, { + "box" : { + "activebgcolor" : [ 0.529411764705882, 0.529411764705882, 0.529411764705882, 1.0 ], + "annotation" : "Ostinato Buffer: Switch between different buffers", + "appearance" : 1, + "id" : "obj-128", + "maxclass" : "live.tab", + "num_lines_patching" : 3, + "num_lines_presentation" : 3, + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 1128.283339999999953, 86.0, 30.725006000000121, 36.75 ], + "presentation" : 1, + "presentation_rect" : [ 215.955291986465454, 4.0, 32.589416027069092, 36.0 ], + "saved_attribute_attributes" : { + "activebgcolor" : { + "expression" : "themecolor.live_surface_bg" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_enum" : [ "0", "1", "2", "3", "4", "5" ], + "parameter_info" : "Ostinato Buffer: Switch between different buffers", + "parameter_initial" : [ 0.0 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Ostinato Buffer", + "parameter_mmax" : 5, + "parameter_shortname" : "Ostinato Buffer", + "parameter_type" : 2, + "parameter_unitstyle" : 9 + } + + } +, + "spacing_y" : 3.0, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "varname" : "ostinato-buffer" + } + + } +, { + "box" : { + "id" : "obj-112", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 972.470916500000158, 377.25, 105.0, 20.0 ], + "text" : "prepend event_length" + } + + } +, { + "box" : { + "activedialcolor" : [ 0.047058823529412, 0.423529411764706, 0.847058823529412, 1.0 ], + "activefgdialcolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "activeneedlecolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "annotation" : "The length in pulses of every event generated; a value of 1 is similar to ‘staccato’, a large value to ‘legato’.", + "appearance" : 1, + "fontsize" : 9.0, + "id" : "obj-110", + "maxclass" : "live.dial", + "needlecolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 972.470916500000158, 303.5, 59.5, 36.0 ], + "presentation" : 1, + "presentation_rect" : [ 155.0, 47.0, 64.0, 36.0 ], + "prototypename" : "amount", + "saved_attribute_attributes" : { + "activedialcolor" : { + "expression" : "" + } +, + "activefgdialcolor" : { + "expression" : "" + } +, + "activeneedlecolor" : { + "expression" : "" + } +, + "needlecolor" : { + "expression" : "themecolor.live_macro_title" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_exponent" : 4.0, + "parameter_info" : "The length in pulses of every event generated; a value of 1 is similar to ‘staccato’, a large value to ‘legato’.", + "parameter_initial" : [ 100 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Event Length Percent", + "parameter_mmax" : 1000.0, + "parameter_mmin" : 1.0, + "parameter_shortname" : "Event Length", + "parameter_type" : 0, + "parameter_unitstyle" : 5 + } + + } +, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "triangle" : 1, + "varname" : "event_length" + } + + } +, { + "box" : { + "fontname" : "Ableton Sans Medium", + "fontsize" : 9.5, + "id" : "obj-108", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 1253.645843000000013, 285.5, 38.0, 18.0 ], + "presentation" : 1, + "presentation_rect" : [ 355.444720923900604, 0.0, 46.0, 18.0 ], + "saved_attribute_attributes" : { + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } + + } +, + "text" : "Outset", + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ] + } + + } +, { + "box" : { + "fontname" : "Ableton Sans Medium", + "fontsize" : 9.5, + "id" : "obj-113", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 1073.733351999999968, 95.0, 26.0, 18.0 ], + "presentation" : 1, + "presentation_rect" : [ 328.76971435546875, 0.0, 30.0, 18.0 ], + "saved_attribute_attributes" : { + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } + + } +, + "text" : "SDB", + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ] + } + + } +, { + "box" : { + "activebgcolor" : [ 0.647, 0.647, 0.647, 1.0 ], + "activebgoncolor" : [ 1.0, 0.71, 0.196, 1.0 ], + "annotation" : "Turn event generation on/off", + "bordercolor" : [ 1.0, 0.709803921568627, 0.196078431372549, 1.0 ], + "focusbordercolor" : [ 0.764705882352941, 0.764705882352941, 0.764705882352941, 1.0 ], + "id" : "obj-109", + "maxclass" : "live.toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 1, + "patching_rect" : [ 329.316681000000017, 13.0, 15.0, 15.0 ], + "presentation" : 1, + "presentation_rect" : [ 10.25, 23.0, 15.0, 15.0 ], + "saved_attribute_attributes" : { + "activebgcolor" : { + "expression" : "" + } +, + "activebgoncolor" : { + "expression" : "" + } +, + "bordercolor" : { + "expression" : "themecolor.live_control_selection" + } +, + "focusbordercolor" : { + "expression" : "themecolor.live_control_zombie" + } +, + "valueof" : { + "parameter_enum" : [ "off", "on" ], + "parameter_info" : "Turn event generation on/off", + "parameter_initial" : [ 0.0 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "stream", + "parameter_mmax" : 1, + "parameter_shortname" : "Play", + "parameter_type" : 2 + } + + } +, + "varname" : "stream" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-3", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 53.75, 327.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-48", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1051.0, 228.0, 120.0, 20.0 ], + "text" : "prepend silent_downbeat" + } + + } +, { + "box" : { + "annotation" : "Silent downbeat. This parameter switches the relative probabilities for the first and second pulses", + "bordercolor" : [ 1.0, 0.709803921568627, 0.196078431372549, 1.0 ], + "focusbordercolor" : [ 0.764705882352941, 0.764705882352941, 0.764705882352941, 1.0 ], + "id" : "obj-47", + "maxclass" : "live.toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 1, + "patching_rect" : [ 1051.5, 96.5, 15.0, 15.0 ], + "presentation" : 1, + "presentation_rect" : [ 335.26971435546875, 20.0, 15.0, 15.0 ], + "saved_attribute_attributes" : { + "bordercolor" : { + "expression" : "themecolor.live_control_selection" + } +, + "focusbordercolor" : { + "expression" : "themecolor.live_control_zombie" + } +, + "valueof" : { + "parameter_enum" : [ "off", "on" ], + "parameter_info" : "Silent downbeat. This parameter switches the relative probabilities for the first and second pulses", + "parameter_initial" : [ 0.0 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Silent Downbeat", + "parameter_mmax" : 1, + "parameter_shortname" : "Silent Downbeat", + "parameter_type" : 2 + } + + } +, + "varname" : "silent_downbeat" + } + + } +, { + "box" : { + "fontname" : "Ableton Sans Medium", + "fontsize" : 9.5, + "id" : "obj-45", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 1228.645843000000013, 285.5, 21.0, 18.0 ], + "presentation" : 1, + "presentation_rect" : [ 7.0, 3.0, 33.0, 18.0 ], + "saved_attribute_attributes" : { + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } + + } +, + "text" : "On", + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 155.0, 179.0, 74.0, 20.0 ], + "text" : "prepend meter" + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 53.75, 228.0, 71.0, 20.0 ], + "text" : "prepend scale" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 255.28334000000001, 135.0, 83.0, 20.0 ], + "text" : "prepend ostinato" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 990.216675000000009, 192.0, 97.0, 20.0 ], + "text" : "prepend attenuation" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 933.683350000000019, 219.0, 90.0, 20.0 ], + "text" : "prepend dynamics" + } + + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 877.15002400000003, 161.0, 100.0, 20.0 ], + "text" : "prepend pitch_range" + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 820.61669900000004, 190.0, 102.0, 20.0 ], + "text" : "prepend pitch_center" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 764.083312999999976, 161.0, 110.0, 20.0 ], + "text" : "prepend harmoniclarity" + } + + } +, { + "box" : { + "id" : "obj-33", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 709.549987999999985, 190.0, 115.0, 20.0 ], + "text" : "prepend chordal_weight" + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 654.016662999999994, 158.5, 96.0, 20.0 ], + "text" : "prepend tonic_pitch" + } + + } +, { + "box" : { + "id" : "obj-35", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 587.416687000000024, 190.0, 112.0, 20.0 ], + "text" : "prepend melody_scope" + } + + } +, { + "box" : { + "id" : "obj-37", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 481.416687000000024, 190.0, 104.0, 20.0 ], + "text" : "prepend eventfulness" + } + + } +, { + "box" : { + "id" : "obj-38", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 424.883330999999998, 161.0, 105.0, 20.0 ], + "text" : "prepend pulse_length" + } + + } +, { + "box" : { + "id" : "obj-39", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 368.350006000000008, 190.0, 96.0, 20.0 ], + "text" : "prepend metriclarity" + } + + } +, { + "box" : { + "id" : "obj-40", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 311.816681000000017, 161.0, 110.0, 20.0 ], + "text" : "prepend outset_pulses" + } + + } +, { + "box" : { + "activebgcolor" : [ 0.529411764705882, 0.529411764705882, 0.529411764705882, 1.0 ], + "annotation" : "Ostinato: modes are none, talea (rhythmic ostinato) and ostinato (melodic ostinato)", + "appearance" : 1, + "id" : "obj-29", + "maxclass" : "live.tab", + "num_lines_patching" : 3, + "num_lines_presentation" : 3, + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 255.28334000000001, 86.0, 42.450012000000015, 36.0 ], + "presentation" : 1, + "presentation_rect" : [ 251.155292212963104, 4.0, 44.589416027069092, 36.0 ], + "saved_attribute_attributes" : { + "activebgcolor" : { + "expression" : "themecolor.live_surface_bg" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_enum" : [ "off", "talea", "ostinato" ], + "parameter_info" : "Ostinato: modes are none, talea (rhythmic ostinato) and ostinato (melodic ostinato)", + "parameter_longname" : "Ostinato", + "parameter_mmax" : 2, + "parameter_shortname" : "Ostinato", + "parameter_type" : 2, + "parameter_unitstyle" : 9 + } + + } +, + "spacing_y" : 3.0, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "varname" : "ostinato" + } + + } +, { + "box" : { + "activedialcolor" : [ 0.047, 0.424, 0.847, 1.0 ], + "activefgdialcolor" : [ 0.745, 0.745, 0.745, 1.0 ], + "activeneedlecolor" : [ 0.745, 0.745, 0.745, 1.0 ], + "annotation" : "The time interval between pulses", + "appearance" : 1, + "dialcolor" : [ 0.411764705882353, 0.411764705882353, 0.411764705882353, 1.0 ], + "fontsize" : 9.0, + "id" : "obj-22", + "maxclass" : "live.dial", + "needlecolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 424.883330999999998, 86.0, 59.5, 36.0 ], + "presentation" : 1, + "presentation_rect" : [ 6.0, 47.0, 64.0, 36.0 ], + "prototypename" : "amount", + "saved_attribute_attributes" : { + "activedialcolor" : { + "expression" : "" + } +, + "activefgdialcolor" : { + "expression" : "" + } +, + "activeneedlecolor" : { + "expression" : "" + } +, + "dialcolor" : { + "expression" : "themecolor.live_dial_needle_zombie" + } +, + "needlecolor" : { + "expression" : "themecolor.live_macro_title" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_exponent" : 5.0, + "parameter_info" : "The time interval between pulses", + "parameter_initial" : [ 200 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Pulse Length", + "parameter_mmax" : 20000.0, + "parameter_mmin" : 10.0, + "parameter_shortname" : "Pulse Length", + "parameter_type" : 0, + "parameter_unitstyle" : 2 + } + + } +, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "triangle" : 1, + "varname" : "pulse_length" + } + + } +, { + "box" : { + "annotation" : "Enter a meter into text field: separate strata with spaces (prime numbers up to 41 allowed) and use + for additive meters (numbers 2 and 3 allowed)", + "autoscroll" : 0, + "bgcolor" : [ 0.4, 0.4, 0.4, 1.0 ], + "fontname" : "Ableton Sans Medium", + "fontsize" : 9.5, + "id" : "obj-20", + "keymode" : 1, + "lines" : 1, + "maxclass" : "textedit", + "numinlets" : 1, + "numoutlets" : 4, + "outlettype" : [ "", "int", "", "" ], + "parameter_enable" : 0, + "patching_rect" : [ 173.75, 123.0, 62.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 121.0, 22.0, 78.0, 20.0 ], + "rounded" : 0.0, + "text" : "2 2 2", + "varname" : "textedit", + "wordwrap" : 0 + } + + } +, { + "box" : { + "activedialcolor" : [ 0.047058823529412, 0.423529411764706, 0.847058823529412, 1.0 ], + "activefgdialcolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "activeneedlecolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "annotation" : "The maximum velocity of the stream. Values may be attenuated dependimg on the Attenuation parameter setting.", + "appearance" : 1, + "fontsize" : 9.0, + "id" : "obj-27", + "maxclass" : "live.dial", + "needlecolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 933.683350000000019, 86.0, 47.0, 36.0 ], + "presentation" : 1, + "presentation_rect" : [ 307.76971435546875, 92.0, 47.0, 36.0 ], + "prototypename" : "amount", + "saved_attribute_attributes" : { + "activedialcolor" : { + "expression" : "" + } +, + "activefgdialcolor" : { + "expression" : "" + } +, + "activeneedlecolor" : { + "expression" : "" + } +, + "needlecolor" : { + "expression" : "themecolor.live_macro_title" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_info" : "The maximum velocity of the stream. Values may be attenuated dependimg on the Attenuation parameter setting.", + "parameter_initial" : [ 64 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Dynamics", + "parameter_shortname" : "Dynamics", + "parameter_type" : 1, + "parameter_units" : "vel", + "parameter_unitstyle" : 9 + } + + } +, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "triangle" : 1, + "varname" : "dynamics" + } + + } +, { + "box" : { + "activedialcolor" : [ 0.047058823529412, 0.423529411764706, 0.847058823529412, 1.0 ], + "activefgdialcolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "activeneedlecolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "annotation" : "The extent to which the dynamics may deviate from the dynamics value; at minimum ‘metriclarity’ this is decided at random, whereas at maximum ‘metriclarity’ the deviation is related to the ‘indispensability’ of the pulse - the metriclarity is then dynamically amplified; this may be useful in the case of maximum eventfulness where agogic elements are neutralized.", + "appearance" : 1, + "fontsize" : 9.0, + "id" : "obj-28", + "maxclass" : "live.dial", + "needlecolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "parameter_mappable" : 0, + "patching_rect" : [ 990.216675000000009, 86.0, 53.5, 36.0 ], + "presentation" : 1, + "presentation_rect" : [ 384.094707787036896, 92.0, 55.0, 36.0 ], + "prototypename" : "amount", + "saved_attribute_attributes" : { + "activedialcolor" : { + "expression" : "" + } +, + "activefgdialcolor" : { + "expression" : "" + } +, + "activeneedlecolor" : { + "expression" : "" + } +, + "needlecolor" : { + "expression" : "themecolor.live_macro_title" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_initial" : [ 12.5 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Attenuation", + "parameter_mmax" : 100.0, + "parameter_shortname" : "Attenuation", + "parameter_type" : 0, + "parameter_unitstyle" : 5 + } + + } +, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "triangle" : 1, + "varname" : "attenuation" + } + + } +, { + "box" : { + "activedialcolor" : [ 0.047058823529412, 0.423529411764706, 0.847058823529412, 1.0 ], + "activefgdialcolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "activeneedlecolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "annotation" : "The interval in semitones (floating point) from the pitch center defining the range the melody is allowed to move in.", + "appearance" : 1, + "fontsize" : 9.0, + "id" : "obj-26", + "maxclass" : "live.dial", + "needlecolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 877.15002400000003, 86.0, 56.0, 36.0 ], + "presentation" : 1, + "presentation_rect" : [ 232.094707787036896, 92.0, 60.0, 36.0 ], + "prototypename" : "amount", + "saved_attribute_attributes" : { + "activedialcolor" : { + "expression" : "" + } +, + "activefgdialcolor" : { + "expression" : "" + } +, + "activeneedlecolor" : { + "expression" : "" + } +, + "needlecolor" : { + "expression" : "themecolor.live_macro_title" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_exponent" : 2.0, + "parameter_info" : "The interval in semitones (floating point) from the pitch center defining the range the melody is allowed to move in.", + "parameter_initial" : [ 7 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Pitch Range", + "parameter_mmax" : 96.0, + "parameter_shortname" : "Pitch Range", + "parameter_type" : 0, + "parameter_units" : "st", + "parameter_unitstyle" : 7 + } + + } +, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "triangle" : 1, + "varname" : "pitch_range" + } + + } +, { + "box" : { + "activedialcolor" : [ 0.047058823529412, 0.423529411764706, 0.847058823529412, 1.0 ], + "activefgdialcolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "activeneedlecolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "annotation" : "The MIDI pitch (floating point) of the center of pitch window (i.e. the range the melody is allowed to move in)", + "appearance" : 1, + "fontsize" : 9.0, + "id" : "obj-25", + "maxclass" : "live.dial", + "needlecolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 820.61669900000004, 86.0, 58.0, 36.0 ], + "presentation" : 1, + "presentation_rect" : [ 155.0, 92.0, 60.0, 36.0 ], + "prototypename" : "pitch", + "saved_attribute_attributes" : { + "activedialcolor" : { + "expression" : "" + } +, + "activefgdialcolor" : { + "expression" : "" + } +, + "activeneedlecolor" : { + "expression" : "" + } +, + "needlecolor" : { + "expression" : "themecolor.live_macro_title" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_info" : "The MIDI pitch (floating point) of the center of pitch window (i.e. the range the melody is allowed to move in)", + "parameter_initial" : [ 60 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Pitch Center", + "parameter_mmax" : 96.0, + "parameter_shortname" : "Pitch Center", + "parameter_type" : 0, + "parameter_units" : "nt", + "parameter_unitstyle" : 8 + } + + } +, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "triangle" : 1, + "varname" : "pitch_center" + } + + } +, { + "box" : { + "activedialcolor" : [ 0.047058823529412, 0.423529411764706, 0.847058823529412, 1.0 ], + "activefgdialcolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "activeneedlecolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "annotation" : "Analogous to metriclarity, a minimum value accords all pitches in the scale an equal probability, thus weakening the key-feeling; at maximum the opposite is true. Note that this description particularly holds in the case of scales such as the chromatic; a major scale would introduce its own intrinsic key-feeling even at the minimum Parameter value.", + "appearance" : 1, + "fontsize" : 9.0, + "id" : "obj-24", + "maxclass" : "live.dial", + "needlecolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 764.083312999999976, 86.0, 66.0, 36.0 ], + "presentation" : 1, + "presentation_rect" : [ 307.76971435546875, 47.0, 71.0, 36.0 ], + "saved_attribute_attributes" : { + "activedialcolor" : { + "expression" : "" + } +, + "activefgdialcolor" : { + "expression" : "" + } +, + "activeneedlecolor" : { + "expression" : "" + } +, + "needlecolor" : { + "expression" : "themecolor.live_macro_title" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_initial" : [ 50 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Harmoniclarity", + "parameter_mmax" : 100.0, + "parameter_shortname" : "Harmoniclarity", + "parameter_type" : 0, + "parameter_unitstyle" : 5 + } + + } +, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "triangle" : 1, + "varname" : "harmoniclarity" + } + + } +, { + "box" : { + "activedialcolor" : [ 0.047058823529412, 0.423529411764706, 0.847058823529412, 1.0 ], + "activefgdialcolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "activeneedlecolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "annotation" : "The MIDI pitch (floating point) the selected tonality profile is anchored on. ", + "appearance" : 1, + "fontsize" : 9.0, + "id" : "obj-52", + "maxclass" : "live.dial", + "needlecolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 654.016662999999994, 86.0, 53.0, 36.0 ], + "presentation" : 1, + "presentation_rect" : [ 82.0, 92.0, 55.0, 36.0 ], + "prototypename" : "pitch", + "saved_attribute_attributes" : { + "activedialcolor" : { + "expression" : "" + } +, + "activefgdialcolor" : { + "expression" : "" + } +, + "activeneedlecolor" : { + "expression" : "" + } +, + "needlecolor" : { + "expression" : "themecolor.live_macro_title" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_info" : "The MIDI pitch (floating point) the selected tonality profile is anchored on. ", + "parameter_initial" : [ 36 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Tonic Pitch", + "parameter_shortname" : "Tonic Pitch", + "parameter_type" : 0, + "parameter_units" : "nt", + "parameter_unitstyle" : 8 + } + + } +, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "triangle" : 1, + "varname" : "tonic_pitch" + } + + } +, { + "box" : { + "activedialcolor" : [ 0.047058823529412, 0.423529411764706, 0.847058823529412, 1.0 ], + "activefgdialcolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "activeneedlecolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "annotation" : "The maximum number of semitones permitted between the MIDI number of any event and the one following it.", + "appearance" : 1, + "fontsize" : 9.0, + "id" : "obj-13", + "maxclass" : "live.dial", + "needlecolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 587.416687000000024, 86.0, 68.0, 36.0 ], + "presentation" : 1, + "presentation_rect" : [ 6.0, 92.0, 64.5, 36.0 ], + "prototypename" : "amount", + "saved_attribute_attributes" : { + "activedialcolor" : { + "expression" : "" + } +, + "activefgdialcolor" : { + "expression" : "" + } +, + "activeneedlecolor" : { + "expression" : "" + } +, + "needlecolor" : { + "expression" : "themecolor.live_macro_title" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_exponent" : 2.0, + "parameter_initial" : [ 7 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Melody Scope", + "parameter_mmax" : 96.0, + "parameter_shortname" : "Melody Scope", + "parameter_type" : 0, + "parameter_units" : "st", + "parameter_unitstyle" : 7 + } + + } +, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "triangle" : 1, + "varname" : "melody_scope" + } + + } +, { + "box" : { + "activedialcolor" : [ 0.047058823529412, 0.423529411764706, 0.847058823529412, 1.0 ], + "activefgdialcolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "activeneedlecolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "annotation" : "At minimum the stream is inactive, at maximum it is saturated with attacks, e.g. every available pulse in the metre accorded to this stream is played. ", + "appearance" : 1, + "fontsize" : 9.0, + "id" : "obj-11", + "maxclass" : "live.dial", + "needlecolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 481.416687000000024, 86.0, 67.0, 36.0 ], + "presentation" : 1, + "presentation_rect" : [ 78.0, 47.0, 64.0, 36.0 ], + "prototypename" : "amount", + "saved_attribute_attributes" : { + "activedialcolor" : { + "expression" : "" + } +, + "activefgdialcolor" : { + "expression" : "" + } +, + "activeneedlecolor" : { + "expression" : "" + } +, + "needlecolor" : { + "expression" : "themecolor.live_macro_title" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_info" : "At minimum the stream is inactive, at maximum it is saturated with attacks, e.g. every available pulse in the metre accorded to this stream is played. ", + "parameter_initial" : [ 100.0 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Eventfulness", + "parameter_mmax" : 100.0, + "parameter_shortname" : "Eventfulness", + "parameter_type" : 0, + "parameter_unitstyle" : 5 + } + + } +, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "triangle" : 1, + "varname" : "eventfulness" + } + + } +, { + "box" : { + "activedialcolor" : [ 0.047058823529412, 0.423529411764706, 0.847058823529412, 1.0 ], + "activefgdialcolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "activeneedlecolor" : [ 0.745098039215686, 0.745098039215686, 0.745098039215686, 1.0 ], + "annotation" : "A measure of the resultant clarity of the metre as played in the stream - at minimum all pulses are accorded equal probability and the metre cannot be musically detected, whereas at maximum the opposite is true.", + "appearance" : 1, + "fontsize" : 9.0, + "id" : "obj-5", + "maxclass" : "live.dial", + "needlecolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 368.350006000000008, 86.0, 53.0, 36.0 ], + "presentation" : 1, + "presentation_rect" : [ 232.094707787036896, 47.0, 60.0, 36.0 ], + "prototypename" : "amount", + "saved_attribute_attributes" : { + "activedialcolor" : { + "expression" : "" + } +, + "activefgdialcolor" : { + "expression" : "" + } +, + "activeneedlecolor" : { + "expression" : "" + } +, + "needlecolor" : { + "expression" : "themecolor.live_macro_title" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_initial" : [ 100.0 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Metriclarity", + "parameter_mmax" : 100.0, + "parameter_shortname" : "Metriclarity", + "parameter_type" : 0, + "parameter_unitstyle" : 5 + } + + } +, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "triangle" : 1, + "varname" : "metriclarity" + } + + } +, { + "box" : { + "activebgcolor" : [ 0.529411764705882, 0.529411764705882, 0.529411764705882, 1.0 ], + "annotation" : "Outset pulses: This parameter allows the metric profile for the given meter to be set to the indicated pulse number. If set to 2, the metric profile is shifted by 1. The downbeat would have the probablity of the second pulse, the second pulse that of the third pulse and so on.", + "appearance" : 2, + "bordercolor" : [ 1.0, 0.709803921568627, 0.196078431372549, 1.0 ], + "id" : "obj-1", + "maxclass" : "live.numbox", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "float" ], + "parameter_enable" : 1, + "patching_rect" : [ 311.816681000000017, 96.5, 44.0, 15.0 ], + "presentation" : 1, + "presentation_rect" : [ 360.76971435546875, 20.0, 28.0, 15.0 ], + "saved_attribute_attributes" : { + "activebgcolor" : { + "expression" : "themecolor.live_surface_bg" + } +, + "bordercolor" : { + "expression" : "themecolor.live_control_selection" + } +, + "textcolor" : { + "expression" : "themecolor.maxwindow_posttext" + } +, + "valueof" : { + "parameter_info" : "Outset pulses: This parameter allows the metric profile for the given meter to be set to the indicated pulse number. If set to 2, the metric profile is shifted by 1. The downbeat would have the probablity of the second pulse, the second pulse that of the third pulse and so on.", + "parameter_initial" : [ 1 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "Outset Pulses", + "parameter_mmax" : 8.0, + "parameter_mmin" : 1.0, + "parameter_shortname" : "Outset Pulses", + "parameter_type" : 1, + "parameter_unitstyle" : 0 + } + + } +, + "textcolor" : [ 0.968627, 0.968627, 0.968627, 1.0 ], + "textjustification" : 0, + "varname" : "outset_pulses" + } + + } +, { + "box" : { + "allowdrag" : 0, + "annotation" : " Here one of the scales can be choosen by its name as shown in the Scale Menu. Drag and drop additional Scala file ", + "bgcolor" : [ 0.4, 0.4, 0.4, 1 ], + "bgfillcolor_color" : [ 0.4, 0.4, 0.4, 1 ], + "bgfillcolor_color1" : [ 0.301961, 0.301961, 0.301961, 1 ], + "bgfillcolor_color2" : [ 0.2, 0.2, 0.2, 1 ], + "bgfillcolor_type" : "color", + "fontsize" : 11.0, + "id" : "obj-16", + "items" : [ "Major", ",", "Minor", ",", "Dorian", ",", "Mixolydian", ",", "Lydian", ",", "Phrygian", ",", "Locrian", ",", "Whole Tone", ",", "Half-whole Dim.", ",", "Whole-half Dim.", ",", "Minor Blues", ",", "Minor Pentatonic", ",", "Major Pentatonic", ",", "Harmonic Minor", ",", "Harmonic Major", ",", "Dorian #4", ",", "Phrygian Dominant", ",", "Melodic Minor", ",", "Lydian Augmented", ",", "Lydian Dominant", ",", "Super Locrian", ",", "8-Tone Spanish", ",", "Bhairav", ",", "Hungarian Minor", ",", "Hirajoshi", ",", "In-sen", ",", "Iwato", ",", "Kumoi", ",", "Pelog Selisir", ",", "Pelog Tembung", ",", "Messiaen 3", ",", "Messiaen 4", ",", "Messiaen 5", ",", "Messiaen 6", ",", "Messiaen 7", ",", "Chromatic", ",", "my-scale" ], + "maxclass" : "umenu", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "int", "", "" ], + "parameter_enable" : 1, + "patching_rect" : [ 13.25, 122.5, 100.0, 21.0 ], + "pattrmode" : 1, + "presentation" : 1, + "presentation_rect" : [ 32.0, 21.0, 77.0, 21.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_enum" : [ "Major", "Minor", "Dorian", "Mixolydian", "Lydian", "Phrygian", "Locrian", "Whole Tone", "Half-whole Dim.", "Whole-half Dim.", "Minor Blues", "Minor Pentatonic", "Major Pentatonic", "Harmonic Minor", "Harmonic Major", "Dorian #4", "Phrygian Dominant", "Melodic Minor", "Lydian Augmented", "Lydian Dominant", "Super Locrian", "8-Tone Spanish", "Bhairav", "Hungarian Minor", "Hirajoshi", "In-sen", "Iwato", "Kumoi", "Pelog Selisir", "Pelog Tembung", "Messiaen 3", "Messiaen 4", "Messiaen 5", "Messiaen 6", "Messiaen 7", "Chromatic", "my-scale" ], + "parameter_longname" : "Scale", + "parameter_mmax" : 36, + "parameter_shortname" : "Scale", + "parameter_type" : 2 + } + + } +, + "varname" : "scale" + } + + } +, { + "box" : { + "angle" : 270.0, + "bgcolor" : [ 0.4, 0.4, 0.4, 1.0 ], + "border" : 1, + "bordercolor" : [ 0.32549, 0.345098, 0.372549, 1.0 ], + "id" : "obj-42", + "maxclass" : "panel", + "mode" : 0, + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 1269.645843000000013, 239.5, 37.0, 35.0 ], + "presentation" : 1, + "presentation_rect" : [ 0.0, 0.0, 464.5, 171.625 ], + "proportion" : 0.39 + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-40", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-109", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-112", 0 ], + "source" : [ "obj-110", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-112", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-134", 0 ], + "source" : [ "obj-128", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 0 ], + "source" : [ "obj-13", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-134", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-43", 0 ], + "source" : [ "obj-136", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-165", 0 ], + "source" : [ "obj-158", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-16", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-165", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-20", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-33", 0 ], + "source" : [ "obj-206", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-36", 0 ], + "source" : [ "obj-217", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-38", 0 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-24", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-25", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-27", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-28", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-29", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-35", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-37", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-38", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-39", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-40", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-43", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-48", 0 ], + "source" : [ "obj-47", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-48", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-39", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-52", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-77", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-8", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-9", 0 ] + } + + } + ], + "styles" : [ { + "name" : "black on white", + "umenu" : { + "bgfillcolor" : { + "angle" : 270.0, + "autogradient" : 0, + "color" : [ 1.0, 1.0, 1.0, 1.0 ], + "color1" : [ 0.862745, 0.870588, 0.878431, 1.0 ], + "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "proportion" : 0.39, + "type" : "color" + } +, + "textcolor_inverse" : [ 0.239216, 0.254902, 0.278431, 1.0 ] + } +, + "number" : { + "fontname" : [ "Arial" ], + "fontsize" : [ 12.0 ], + "textcolor_inverse" : [ 0.239216, 0.254902, 0.278431, 1.0 ] + } +, + "parentstyle" : "", + "multi" : 0 + } +, { + "name" : "panel_blue_yellow", + "default" : { + "bgfillcolor" : { + "angle" : -90.0, + "autogradient" : 0, + "color" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "color1" : [ 0.0, 0.078431, 0.321569, 1.0 ], + "color2" : [ 0.960784, 0.827451, 0.156863, 1.0 ], + "proportion" : 0.736715, + "type" : "gradient" + } + + } +, + "parentstyle" : "", + "multi" : 0 + } +, { + "name" : "section info emph", + "default" : { + "fontface" : [ 1 ], + "fontname" : [ "Helvetica Neue" ], + "fontsize" : [ 12.0 ], + "textcolor" : [ 0.225893, 0.506614, 0.765943, 1.0 ] + } +, + "parentstyle" : "", + "multi" : 0 + } + ] + } +, + "patching_rect" : [ 77.8047869048537, 25.600006000000008, 465.200012000000015, 171.399993999999992 ], + "varname" : "Djster.µbus", + "viewvisibility" : 1 + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-20", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-55", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-6", 0 ] + } + + } + ], + "parameters" : { + "obj-1::obj-1" : [ "Outset Pulses[1]", "Outset Pulses", 0 ], + "obj-1::obj-104" : [ "Tonality Profile", "Tonality Profile", 0 ], + "obj-1::obj-109" : [ "Play", "Play", 0 ], + "obj-1::obj-11" : [ "Eventfulness[1]", "Eventfulness", 0 ], + "obj-1::obj-110" : [ "Event Length", "Event Length", 0 ], + "obj-1::obj-122" : [ "Choice", "Choice", 0 ], + "obj-1::obj-128" : [ "Ostinato Buffer[1]", "Ostinato Buffer", 0 ], + "obj-1::obj-13" : [ "Melody Scope[1]", "Melody Scope", 0 ], + "obj-1::obj-136" : [ "Sorted[1]", "Sorted", 0 ], + "obj-1::obj-155" : [ "Use Transport", "Use Transport", 0 ], + "obj-1::obj-158" : [ "Subdivision", "Subdivision", 0 ], + "obj-1::obj-16" : [ "Scale[1]", "Scale", 0 ], + "obj-1::obj-187" : [ "meters", "meters", 0 ], + "obj-1::obj-188" : [ "Pitchsets", "Pitchsets", 0 ], + "obj-1::obj-206" : [ "Chordal Weight[1]", "Chordal Weight", 0 ], + "obj-1::obj-217" : [ "Overlap[1]", "Overlap", 0 ], + "obj-1::obj-22" : [ "Pulse Length[1]", "Pulse Length", 0 ], + "obj-1::obj-24" : [ "Harmoniclarity[1]", "Harmoniclarity", 0 ], + "obj-1::obj-25" : [ "Pitch Center[1]", "Pitch Center", 0 ], + "obj-1::obj-26" : [ "Pitch Range[1]", "Pitch Range", 0 ], + "obj-1::obj-27" : [ "Dynamics[1]", "Dynamics", 0 ], + "obj-1::obj-28" : [ "Attenuation[1]", "Attenuation", 0 ], + "obj-1::obj-29" : [ "Ostinato[1]", "Ostinato", 0 ], + "obj-1::obj-32" : [ "live.text[1]", "Clear Scales", 0 ], + "obj-1::obj-47" : [ "Silent Downbeat[1]", "Silent Downbeat", 0 ], + "obj-1::obj-49" : [ "Sync", "Sync", 0 ], + "obj-1::obj-5" : [ "Metriclarity[1]", "Metriclarity", 0 ], + "obj-1::obj-52" : [ "Tonic Pitch[1]", "Tonic Pitch", 0 ], + "obj-1::obj-53" : [ "Precision", "Precision", 0 ], + "obj-1::obj-56" : [ "Precision[1]", "Preset Tab", 0 ], + "obj-1::obj-77" : [ "Melodic Cohesion", "Melodic Cohesion", 0 ], + "obj-1::obj-87" : [ "Sync Type", "menu", 0 ], + "obj-1::obj-88" : [ "Scala Browser", "Scala Browser", 0 ], + "obj-55::obj-1" : [ "Outset Pulses", "Outset Pulses", 0 ], + "obj-55::obj-109" : [ "stream", "Play", 0 ], + "obj-55::obj-11" : [ "Eventfulness", "Eventfulness", 0 ], + "obj-55::obj-110" : [ "Event Length Percent", "Event Length", 0 ], + "obj-55::obj-128" : [ "Ostinato Buffer", "Ostinato Buffer", 0 ], + "obj-55::obj-13" : [ "Melody Scope", "Melody Scope", 0 ], + "obj-55::obj-136" : [ "Sorted", "Sorted", 0 ], + "obj-55::obj-158" : [ "Subdivisions", "Subdivision", 0 ], + "obj-55::obj-16" : [ "Scale", "Scale", 0 ], + "obj-55::obj-206" : [ "Chordal Weight", "Chordal Weight", 0 ], + "obj-55::obj-217" : [ "Overlap", "Overlap", 0 ], + "obj-55::obj-22" : [ "Pulse Length", "Pulse Length", 0 ], + "obj-55::obj-24" : [ "Harmoniclarity", "Harmoniclarity", 0 ], + "obj-55::obj-25" : [ "Pitch Center", "Pitch Center", 0 ], + "obj-55::obj-26" : [ "Pitch Range", "Pitch Range", 0 ], + "obj-55::obj-27" : [ "Dynamics", "Dynamics", 0 ], + "obj-55::obj-28" : [ "Attenuation", "Attenuation", 0 ], + "obj-55::obj-29" : [ "Ostinato", "Ostinato", 0 ], + "obj-55::obj-47" : [ "Silent Downbeat", "Silent Downbeat", 0 ], + "obj-55::obj-5" : [ "Metriclarity", "Metriclarity", 0 ], + "obj-55::obj-52" : [ "Tonic Pitch", "Tonic Pitch", 0 ], + "obj-55::obj-77" : [ "Cohesion", "Melodic Cohesion", 0 ], + "parameterbanks" : { + "0" : { + "index" : 0, + "name" : "", + "parameters" : [ "-", "-", "-", "-", "-", "-", "-", "-" ] + } + + } +, + "parameter_overrides" : { + "obj-1::obj-1" : { + "parameter_longname" : "Outset Pulses[1]", + "parameter_range" : [ 1, 56 ] + } +, + "obj-1::obj-11" : { + "parameter_longname" : "Eventfulness[1]" + } +, + "obj-1::obj-128" : { + "parameter_longname" : "Ostinato Buffer[1]" + } +, + "obj-1::obj-13" : { + "parameter_longname" : "Melody Scope[1]", + "parameter_unitstyle" : 7 + } +, + "obj-1::obj-136" : { + "parameter_longname" : "Sorted[1]" + } +, + "obj-1::obj-206" : { + "parameter_longname" : "Chordal Weight[1]" + } +, + "obj-1::obj-217" : { + "parameter_longname" : "Overlap[1]" + } +, + "obj-1::obj-22" : { + "parameter_longname" : "Pulse Length[1]" + } +, + "obj-1::obj-24" : { + "parameter_longname" : "Harmoniclarity[1]" + } +, + "obj-1::obj-25" : { + "parameter_longname" : "Pitch Center[1]", + "parameter_unitstyle" : 8 + } +, + "obj-1::obj-26" : { + "parameter_longname" : "Pitch Range[1]", + "parameter_unitstyle" : 7 + } +, + "obj-1::obj-27" : { + "parameter_longname" : "Dynamics[1]" + } +, + "obj-1::obj-28" : { + "parameter_longname" : "Attenuation[1]" + } +, + "obj-1::obj-29" : { + "parameter_longname" : "Ostinato[1]" + } +, + "obj-1::obj-47" : { + "parameter_longname" : "Silent Downbeat[1]" + } +, + "obj-1::obj-5" : { + "parameter_longname" : "Metriclarity[1]" + } +, + "obj-1::obj-52" : { + "parameter_longname" : "Tonic Pitch[1]", + "parameter_unitstyle" : 8 + } + + } +, + "inherited_shortname" : 1 + } +, + "dependency_cache" : [ { + "name" : "AdditiveMeter2.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "Autobusk-µPlayer.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/core", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/core", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "DJster.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "Inner-Equation.5.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "Inside.3.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "Mod.2.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "Pof_(Qi)(i=0toz-r-1).2.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "Pof_(Qj)(j=1toz).2.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "Pof_(Qz+1-k)(k=0tor).2.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "Qz+1-k2.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "Qz-r2.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "TIE.7.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "Total-Internal-Equation.6.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "bytecount.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/core", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/core", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "composite-meters.txt", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "dispenser.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "djster.accum.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/core", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/core", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "dumper.2.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "harmonic-energy-profile.txt", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/Profiles", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/Profiles", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "harmonicity.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/Tonality", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/Tonality", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "indigestibility.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/Tonality", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/Tonality", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "meter-subpatch.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/core", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/core", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "mxj.mxo", + "type" : "iLaX" + } +, { + "name" : "outset.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/core", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/core", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "packback.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/abstractions", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/abstractions", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "platform.js", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/javascript", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/javascript", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "primefactors.txt", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/maps/microMaps", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/maps/microMaps", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "psi-functions.txt", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "reader.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "reader2.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/dispenser", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "scalaFileBase.js", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/javascript", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/javascript", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "scale-subpatch-exp.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/patchers/DJster/core", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/patchers/DJster/core", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "scriptingname.js", + "bootpath" : "~/Documents/Max 8/Packages/MaxScore/javascript", + "patcherrelativepath" : "../../Max 8/Packages/MaxScore/javascript", + "type" : "TEXT", + "implicit" : 1 + } + ], + "autosave" : 0 + } + +} diff --git a/max-lfo-table-nogit/example.maxpat b/max-lfo-table-nogit/example.maxpat new file mode 100644 index 0000000..879f8c6 --- /dev/null +++ b/max-lfo-table-nogit/example.maxpat @@ -0,0 +1,1013 @@ +{ + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 6, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 112.0, 87.0, 1344.0, 869.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" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 45.0, 289.0, 104.0, 22.0 ], + "text" : "param 2 scale 0.5" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 45.0, 154.0, 131.0, 22.0 ], + "text" : "param 1 metriclarity 40" + } + + } +, { + "box" : { + "id" : "obj-86", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 28.0, 473.0, 115.0, 22.0 ], + "text" : "param 4 meter \"3 4\"" + } + + } +, { + "box" : { + "id" : "obj-85", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 28.0, 361.5, 139.0, 22.0 ], + "text" : "param 3 attenuation 100" + } + + } +, { + "box" : { + "id" : "obj-84", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 586.0, 713.0, 89.0, 35.0 ], + "text" : "harmoniclarity 20.2" + } + + } +, { + "box" : { + "id" : "obj-80", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 491.0, 713.0, 85.0, 35.0 ], + "text" : "event_length 70.2" + } + + } +, { + "box" : { + "id" : "obj-78", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 385.0, 715.0, 84.0, 35.0 ], + "text" : "metriclarity 69.626659" + } + + } +, { + "box" : { + "id" : "obj-76", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 4, + "outlettype" : [ "", "", "", "" ], + "patching_rect" : [ 410.0, 671.0, 273.0, 22.0 ], + "text" : "routepass metriclarity event_length harmoniclarity" + } + + } +, { + "box" : { + "id" : "obj-75", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 1066.052632331848145, 53.0, 99.894735336303711, 87.0 ], + "text" : "You can use Hz, seconds, ms, hh:mm:ss, or bars.beats.ticks for the period/frequency" + } + + } +, { + "box" : { + "id" : "obj-73", + "linecount" : 8, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 1181.315790414810181, 40.0, 81.0, 114.0 ], + "text" : "Min and max must be ADDED to the center value to determine the true bounds. " + } + + } +, { + "box" : { + "id" : "obj-72", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 913.0, 107.0, 150.0, 60.0 ], + "text" : "center values are read only, they must be configured by an upstream value" + } + + } +, { + "box" : { + "id" : "obj-66", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 480.5, 613.0, 32.0, 22.0 ], + "text" : "print" + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 13.0, + "id" : "obj-63", + "maxclass" : "newobj", + "numinlets" : 5, + "numoutlets" : 5, + "outlettype" : [ "", "", "", "", "" ], + "patching_rect" : [ 626.0, 613.0, 81.0, 23.0 ], + "text" : "route 1 2 3 4" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 684.0, 146.0, 94.0, 22.0 ], + "text" : "prepend timesig" + } + + } +, { + "box" : { + "id" : "obj-52", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 545.0, 135.0, 89.0, 22.0 ], + "text" : "prepend tempo" + } + + } +, { + "box" : { + "id" : "obj-37", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 325.0, 17.0, 55.0, 22.0 ], + "text" : "del 1000" + } + + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 485.0, 40.0, 49.0, 22.0 ], + "text" : "r reload" + } + + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 200.0, 807.0, 51.0, 22.0 ], + "text" : "s reload" + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "preset", + "numinlets" : 1, + "numoutlets" : 5, + "outlettype" : [ "preset", "int", "preset", "int", "" ], + "patching_rect" : [ 190.0, 752.0, 100.0, 40.0 ], + "pattrstorage" : "storage" + } + + } +, { + "box" : { + "id" : "obj-28", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 460.0, 789.0, 116.0, 22.0 ], + "saved_object_attributes" : { + "client_rect" : [ 903, 252, 1512, 568 ], + "parameter_enable" : 0, + "parameter_mappable" : 0, + "storage_rect" : [ 780, 524, 1380, 824 ] + } +, + "text" : "pattrstorage storage", + "varname" : "storage" + } + + } +, { + "box" : { + "id" : "obj-26", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 643.0, 770.0, 40.0, 22.0 ], + "restore" : [ { + "data" : { + "enumArrays" : [ [ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ "2", "4", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "2", "4", "2", "2", "2", "2", "2", "2", "2", "2" ], [ "scale", "meter", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation" ] ], + "enumMats" : [ [ [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] ], [ [ "major", "minor", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "4 4", "3 4", "7 8", "2 4", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ] ] ], + "modArrays" : [ [ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ "1", "1", "1", "4", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "Sine", "SawUp", "SawUp", "Tri", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine" ], [ "metriclarity", "event_length", "harmoniclarity", "meter", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE" ], [ "0.2hz", "2s", "0:0:02", "0.5.0", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz" ], [ "-10", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ], [ "30", "100", "100", "2", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "0", "0", "0.5", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ] ], + "modCenters" : { + "1" : { + "metriclarity" : 40 + } +, + "2" : { + "scale" : 1.6 + } +, + "3" : { + "attenuation" : 100 + } +, + "4" : { + "meter" : 0.5 + } + + } + + } + + } + ], + "saved_object_attributes" : { + "parameter_enable" : 0, + "parameter_mappable" : 0 + } +, + "text" : "pattr", + "varname" : "u560003760" + } + + } +, { + "box" : { + "data" : { + "data" : { + "enumArrays" : [ [ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ "2", "4", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "2", "4", "2", "2", "2", "2", "2", "2", "2", "2" ], [ "scale", "meter", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation", "attenuation" ] ], + "enumMats" : [ [ [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] ], [ [ "major", "minor", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "4 4", "3 4", "7 8", "2 4", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ] ] ], + "modArrays" : [ [ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ "1", "1", "1", "4", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "Sine", "SawUp", "SawUp", "Tri", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine" ], [ "metriclarity", "event_length", "harmoniclarity", "meter", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE" ], [ "0.2hz", "2s", "0:0:02", "0.5.0", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz" ], [ "-10", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ], [ "30", "100", "100", "2", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "0", "0", "0.5", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ] ], + "modCenters" : { + "1" : { + "metriclarity" : 40 + } +, + "2" : { + "scale" : 1.6 + } +, + "3" : { + "attenuation" : 100 + } +, + "4" : { + "meter" : 0.5 + } + + } + + } + + } +, + "id" : "obj-25", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 4, + "outlettype" : [ "dictionary", "", "", "" ], + "patching_rect" : [ 773.0, 808.0, 166.0, 22.0 ], + "saved_object_attributes" : { + "embed" : 1, + "parameter_enable" : 0, + "parameter_mappable" : 0 + } +, + "text" : "dict localStorage2 @embed 1", + "varname" : "dict" + } + + } +, { + "box" : { + "id" : "obj-47", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 9, + "outlettype" : [ "int", "int", "float", "float", "float", "", "int", "float", "" ], + "patching_rect" : [ 744.815790414810181, 107.0, 103.0, 22.0 ], + "text" : "transport" + } + + } +, { + "box" : { + "id" : "obj-40", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 980.368419170379639, 702.0, 22.0, 22.0 ], + "text" : "t b" + } + + } +, { + "box" : { + "id" : "obj-38", + "maxclass" : "dict.view", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 1107.0, 573.0, 263.0, 384.0 ] + } + + } +, { + "box" : { + "bubble" : 1, + "id" : "obj-30", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 137.5, 440.0, 246.0, 64.0 ], + "text" : "this param is sent in its already enumerated form, so it will first be turned into a number halfway between the enumeration boundaries" + } + + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 22.0, 444.0, 115.0, 22.0 ], + "text" : "param 4 meter \"4 4\"" + } + + } +, { + "box" : { + "id" : "obj-41", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 949.0, 647.0, 156.0, 22.0 ], + "text" : "meter 3 4" + } + + } +, { + "box" : { + "id" : "obj-39", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 824.0, 647.0, 101.0, 22.0 ], + "text" : "attenuation 100" + } + + } +, { + "box" : { + "id" : "obj-35", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 662.0, 647.0, 157.0, 22.0 ], + "text" : "scale minor" + } + + } +, { + "box" : { + "id" : "obj-27", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 423.5, 588.0, 133.0, 22.0 ], + "text" : "routepass saved debug" + } + + } +, { + "box" : { + "id" : "obj-17", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 504.0, 546.5, 268.0, 33.0 ], + "text" : "we can only output symbols from jweb, so this turns them into lists" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 423.5, 552.0, 71.0, 22.0 ], + "text" : "fromsymbol" + } + + } +, { + "box" : { + "id" : "obj-19", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 548.52631402015686, 80.0, 150.0, 33.0 ], + "text" : "see below for why we use separate names..." + } + + } +, { + "box" : { + "id" : "obj-14", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 781.0, 17.0, 150.0, 47.0 ], + "text" : "self explanatory. Warning-will overwrite whatever is saved." + } + + } +, { + "box" : { + "id" : "obj-11", + "linecount" : 7, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 1261.315790414810181, 47.0, 78.0, 100.0 ], + "text" : "You can use the `phase` control to phase offset two LFOs of the same frequency" + } + + } +, { + "box" : { + "bubble" : 1, + "id" : "obj-7", + "linecount" : 5, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 169.0, 246.0, 197.0, 78.0 ], + "text" : "This parameter is defined in the enumerators but not the modulators. It will be enumerated and immediately output" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 45.0, 256.0, 104.0, 22.0 ], + "text" : "param 2 scale 1.6" + } + + } +, { + "box" : { + "bubble" : 1, + "id" : "obj-24", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 169.0, 332.5, 226.0, 64.0 ], + "text" : "This parameter is not defined by either the Modulators or Enumerators, so it will be passed directly to the output" + } + + } +, { + "box" : { + "bubble" : 1, + "id" : "obj-23", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 183.0, 154.0, 197.0, 64.0 ], + "text" : "This parameter is defined in the modulators, and when sent will act as the center value for that LFO" + } + + } +, { + "box" : { + "id" : "obj-21", + "linecount" : 11, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 564.0, 254.0, 154.0 ], + "text" : "The operation runs\n\nInput > Denumeration > Modulators > Enumerators > Output\n\nA parameter from the input not established by a Modulator will be passed directly to the Enumerators\n\nLikewise, the Enumerators will pass not established parameters" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 45.0, 180.0, 131.0, 22.0 ], + "text" : "param 1 metriclarity 20" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 28.0, 331.0, 139.0, 22.0 ], + "text" : "param 3 attenuation 200" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 438.52631402015686, 69.0, 108.0, 22.0 ], + "text" : "load localStorage2" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 4, + "outlettype" : [ "dictionary", "", "", "" ], + "patching_rect" : [ 980.368419170379639, 726.0, 97.0, 22.0 ], + "saved_object_attributes" : { + "embed" : 0, + "parameter_enable" : 0, + "parameter_mappable" : 0 + } +, + "text" : "dict localStorage" + } + + } +, { + "box" : { + "id" : "obj-6", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 504.0, 6.0, 150.0, 33.0 ], + "text" : "required due to the asynchronous operation" + } + + } +, { + "box" : { + "id" : "obj-45", + "linecount" : 8, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 773.0, 692.0, 150.0, 114.0 ], + "text" : "Storage for the matrix. Unfortunately, jsweb dictionary handling isn't great, so we can't use it like a native dict object and need to do this wild hack for usage with pattrstorage" + } + + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 217.0, 6.0, 58.0, 22.0 ], + "text" : "loadbang" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 700.894735336303711, 69.0, 104.0, 22.0 ], + "text" : "save localStorage" + } + + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 217.0, 69.0, 106.0, 22.0 ], + "text" : "readfile lfogui.html" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "jweb", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 402.0, 173.0, 838.631580829620361, 368.0 ], + "rendermode" : 0, + "url" : "file://lfogui.html" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-27", 0 ], + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "order" : 1, + "source" : [ "obj-20", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "order" : 0, + "source" : [ "obj-20", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-26", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-40", 0 ], + "source" : [ "obj-27", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-63", 0 ], + "source" : [ "obj-27", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-66", 0 ], + "source" : [ "obj-27", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-31", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "source" : [ "obj-32", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "order" : 1, + "source" : [ "obj-37", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-47", 0 ], + "order" : 0, + "source" : [ "obj-37", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "order" : 1, + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-38", 0 ], + "order" : 0, + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-40", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-47", 5 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-52", 0 ], + "source" : [ "obj-47", 4 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-52", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 1 ], + "source" : [ "obj-63", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-39", 1 ], + "source" : [ "obj-63", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-41", 1 ], + "source" : [ "obj-63", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-76", 0 ], + "source" : [ "obj-63", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-78", 1 ], + "source" : [ "obj-76", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-80", 1 ], + "source" : [ "obj-76", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-84", 1 ], + "source" : [ "obj-76", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-8", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-85", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-86", 0 ] + } + + } + ], + "dependency_cache" : [ ], + "autosave" : 0 + } + +} diff --git a/max-lfo-table-nogit/lfogui.css b/max-lfo-table-nogit/lfogui.css new file mode 100644 index 0000000..5860643 --- /dev/null +++ b/max-lfo-table-nogit/lfogui.css @@ -0,0 +1,181 @@ +html, + body { + width: 100%; + height: 100%; + margin: 0px; + border: 0; + overflow: hidden; /* Disable scrollbars */ + display: block; /* No floating content on sides */ + } + + ul { + list-style-type: none; + margin: 0; + padding: 0; + overflow: hidden; + background-color: #333333; + } + + li { + float: left; + } + + + input[type=number] { + width: 50px; + margin: 0; + padding: 0; + } + + input[type=text] { + width: 60px; + margin: 0; + padding: 0; + font-weight: bold; + } + + .timeInput { + width: 80px; + margin: 0; + padding: 0; + } + + #matrix { + background-color: aquamarine; + height: 100%; + width: 100%; + } + + .numbox-unclicked { + user-select: none; + border: solid; + font-size: 12vw; + } + + .numbox-clicked { + user-select: none; + border : solid; + font-size: 12vw; + } + + .param-input-label { + width: 93%; + font-size: 5vw; + } + + .lfo-input-label { + width: 40%; + font-size: 5vw; + } + + /* The switch - the box around the slider */ + .switch { + position: relative; + display: inline-block; + width: 30px; + height: 17px; + } + + /* Hide default HTML checkbox */ + .switch input { + opacity: 0; + width: 0; + height: 0; + } + + /* The slider */ + .slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + -webkit-transition: .4s; + transition: .4s; + } + + .slider:before { + position: absolute; + content: ""; + height: 13px; + width: 13px; + left: 2px; + bottom: 2px; + background-color: white; + -webkit-transition: .4s; + transition: .4s; + } + + input:checked + .slider { + background-color: #2196F3; + } + + input:focus + .slider { + box-shadow: 0 0 1px #2196F3; + } + + input:checked + .slider:before { + -webkit-transform: translateX(13px); + -ms-transform: translateX(13px); + transform: translateX(13px); + } + + /* Rounded sliders */ + .slider.round { + border-radius: 17px; + } + + .slider.round:before { + border-radius: 50%; + } + + h5 { + margin: 0; + padding: 0; + } + + .enum-count { + background-color: aquamarine; + } + + .label { + background-color: aliceblue; + padding: 0 4px 0 4px; + margin: 0 2px 0 2px; + border-color: #333333; + border-width: 1px; + } + + .base-val { + background-color: lightgray; + border-color: #333333; + border-width: 1px; + width: 50px; + margin-left: 2px; + margin-top: 1px; + } + + .linked { + color: red; + border-width: 1px; + width: 50px; + font-size: small; + margin-left: 2px; + margin-top: 5px; + } + + + @keyframes pulse-animation { + 0% { + color: black; + } + 100% { + color: red; + } + } + + #pulse { + animation: pulse-animation 0.2s normal; + } \ No newline at end of file diff --git a/max-lfo-table-nogit/lfogui.html b/max-lfo-table-nogit/lfogui.html new file mode 100644 index 0000000..6151e8e --- /dev/null +++ b/max-lfo-table-nogit/lfogui.html @@ -0,0 +1,29 @@ + + + + + + + + + + +
+ + + + + + + + + + + + diff --git a/max-lfo-table-nogit/lfogui.js b/max-lfo-table-nogit/lfogui.js new file mode 100644 index 0000000..ccf164f --- /dev/null +++ b/max-lfo-table-nogit/lfogui.js @@ -0,0 +1,445 @@ +// const { createElement } = require("./react"); +const DEBUG = false; +var log; +if (DEBUG) + log = console.log; +else + log = (msg) => {window.max.outlet("debug " + msg)}; + +const e = React.createElement; + +let lfos = []; +const MAXLFOS = 20; +const MAXENUMS = 20; +const MAXENUMPOINTS = 10; + + + +const ViewModes = Object.freeze({ + MOD: 0, + ENUM: 1 +}); + + +var modPhases = Array(MAXLFOS).fill(0); +var firstUpdateTime = Date.now(); + +const MODULATORLABELS = ["inst", "-type-", "---shape---", "-------param-------", "--timebase--", "-min-", "-max", "-phase-", "center"]; +const ENUMERATORLABELS = ["inst", "---parameter---", "-# points-"]; + + + + +function MasterLfoHandler(){ + + let initVisArr = Array(MAXLFOS).fill(false); + initVisArr[0] = true; + + const [viewMode, setViewMode] = React.useState(ViewModes.MOD); + const toggleViewMode = () => { + if (viewMode === ViewModes.MOD) + setViewMode(ViewModes.ENUM); + else + setViewMode(ViewModes.MOD); + }; + + /// MODULATOR ARRAYS + + const [modVisibleArr, setModVisibleArr] = React.useState(initVisArr); + const [modInstanceNumArr, setModInstanceNumArr] = React.useState(Array(MAXLFOS).fill('1')); + + const [modCenterVals, setModCenterVals] = React.useState({'1':{}, '2':{}, '3':{}, '4':{}}); + + const [bpm, setBpm] = React.useState(100); + const [beatsInMeasure, setBeatsInMeasure] = React.useState(4); + + const [shapeArr, setShapeArr] = React.useState(Array(MAXLFOS).fill('Sine')); + const [djParamArr, setDjParamArr] = React.useState(Array(MAXLFOS).fill('NONE')); + + const [freqArr, setFreqArr] = React.useState(Array(MAXLFOS).fill('1hz')); + + // const [ampArr, setAmpArr] = React.useState(Array(MAXLFOS).fill('1')); + const [minArr, setMinArr] = React.useState(Array(MAXLFOS).fill('0')); + const [maxArr, setMaxArr] = React.useState(Array(MAXLFOS).fill('1')); + + const [phaseArr, setPhaseArr] = React.useState(Array(MAXLFOS).fill('0')); + + const allModArrays = [modVisibleArr, modInstanceNumArr, shapeArr, djParamArr, freqArr, minArr, maxArr, phaseArr]; + const allModSetters = [setModVisibleArr, setModInstanceNumArr, setShapeArr, setDjParamArr, setFreqArr, setMinArr, setMaxArr, setPhaseArr]; + const modBlankVals = [true, '1', SHAPETYPES[0], MODPARAMOPTIONS[0], '1hz', '0', '1', '0']; + + + /// ENUMERATOR ARRAYS + const [enumVisibleArr, setEnumVisibleArr] = React.useState(initVisArr); + const [enumInstanceNumArr, setEnumInstanceNumArr] = React.useState(Array(MAXLFOS).fill('1')); + const [enumItemCounts, setEnumItemCounts] = React.useState(Array(MAXENUMPOINTS).fill('2')); + const [enumDjParamArr, setEnumDjParamArr] = React.useState(Array(MAXENUMPOINTS).fill('attenuation')); + + let baseEnumBreakpoints = Array(MAXENUMS).fill(0).map(x => Array(MAXENUMPOINTS+ 1).fill(0)); + for (let i = 0; i < MAXENUMS; i++){ + for (let j=0; j < MAXENUMPOINTS + 1; j++){ + baseEnumBreakpoints[i][j] = j; + } + } + const [enumBreakPoints, setEnumBreakPoints] = React.useState(baseEnumBreakpoints); + + const getBlankEnumBreakPointRow = () => { + let arr = [] + for (let i=0; i< MAXENUMPOINTS + 1; i++) + arr.push(i) + return arr; + } + + const getBlankEnumNameRow = () => {return Array(MAXENUMPOINTS).fill('param')}; + + let baseEnumNames = Array(MAXENUMS).fill(0).map(x => Array(MAXENUMPOINTS).fill('param')); + const [enumNames, setEnumNames] = React.useState(baseEnumNames); + + const allEnumArrays = [enumVisibleArr, enumInstanceNumArr, enumItemCounts, enumDjParamArr]; + const allEnumArrSetters = [setEnumVisibleArr, setEnumInstanceNumArr, setEnumItemCounts, setEnumDjParamArr]; + + const allEnumMats = [enumBreakPoints, enumNames]; + const allEnumMatSetters = [setEnumBreakPoints, setEnumNames]; + const allGetEnumMatBlankVals = [getBlankEnumBreakPointRow, getBlankEnumNameRow] + + const enumBlankVals = [true, '1', 2, MODPARAMOPTIONS[0]]; + + const [render, rerender] = React.useState(false); // BAD. I SHOULDN'T BE DOING THIS + + + + React.useEffect(() => { + function handleLoad(event) { + + window.max.getDict(event.detail, (dict) => { + + for (let i = 0; i { + window.removeEventListener('loadDict', handleLoad); + window.removeEventListener('saveDict', handleSave); + window.removeEventListener('tick', handleTick); + window.removeEventListener('param', handleParam); + window.removeEventListener('enum', handleEnum); + window.removeEventListener('tempo', handleBpm); + window.removeEventListener('timesig', handleTimeSig); + }; + }, [...allModArrays, ...allEnumArrays, ...allEnumMats, modCenterVals, render, bpm, beatsInMeasure]); + + + function CheckLinked(inst, param, checkInstArr, checkParamArr){ + for (let i = 0; i < checkInstArr.length; i++){ + if (checkInstArr[i] == inst && checkParamArr[i] == param) + return true; + } + return false; + } + + /////// + // Generate Modulators + /////// + let modContents = [] + for (var i = 0; i { + if (id < MAXLFOS - 1){ + if (modVisibleArr[id + 1]){ + + let emptyIndex = modVisibleArr.findIndex((item) => !item); + if (emptyIndex != -1){ + for (var j = 0; j < allModArrays.length; j++){ + let array = allModArrays[j]; + // remove from all arrays + array.splice(emptyIndex, 1); + // add empty item at opened index + array.splice(id + 1, 0, modBlankVals[j]); + allModSetters[j](array); + } + } + } + else { + for (var j = 0; j < allModArrays.length; j++){ // no space below, easy. + let array = allModArrays[j]; + array[id + 1] = modBlankVals[j]; + allModSetters[j](array); + } + } + rerender(!render); + } + }, + removeLfo: () => { + if (modVisibleArr.filter(x=>x).length > 1){ + let newArr = modVisibleArr.slice(); + newArr[id] = false; + setModVisibleArr(newArr); + } + + } + }, + null)); + } + + + /////// + // Generate Enumerators + /////// + let enumContents = [] + for (var i = 0; i { + if (id < MAXLFOS - 1){ + if (enumVisibleArr[id + 1]){ // if we need to open up space + let emptyIndex = enumVisibleArr.findIndex((item) => !item); + if (emptyIndex != -1){ + for (var j = 0; j < allEnumArrays.length; j++){ + let array = allEnumArrays[j]; + // remove from all arrays + array.splice(emptyIndex, 1); + // add empty item at opened index + array.splice(id + 1, 0, enumBlankVals[j]); + allEnumArrSetters[j](array); + } + + // Now do the same with matrices + + for (var j = 0; j < allEnumMats.length; j++){ + let mat = allEnumMats[j]; + mat.splice(emptyIndex, 1); + mat.splice(id + 1, 0, 0); + mat[id + 1] = allGetEnumMatBlankVals[j](); + allEnumMatSetters[j](mat); + } + } + } + else { + for (var j = 0; j < allEnumArrays.length; j++){ + let array = allEnumArrays[j]; + array[id+1] = enumBlankVals[j]; + allEnumArrSetters[j](array); + } + + // Now do the same with matrices + + for (var j = 0; j < allEnumMats.length; j++){ + let mat = allEnumMats[j]; + mat[id + 1] = allGetEnumMatBlankVals[j](); + allEnumMatSetters[j](mat); + } + } + rerender(!render); + } + }, + removeEnum: () => { + if (enumVisibleArr.filter(x=>x).length > 1){ + let newArr = enumVisibleArr.slice(); + newArr[id] = false; + setEnumVisibleArr(newArr); + } + } + }, null) + ); + } + + + var grid; + var title; + var labels; + if (viewMode === ViewModes.MOD){ + grid = modContents; + title = "MODULATORS"; + labels = MODULATORLABELS; + } + else { + grid = enumContents; + title = "ENUMERATORS"; + labels = ENUMERATORLABELS; + } + + return e('div', null, + e(Switch, {ontoggle: toggleViewMode}, null), + e('h5', null, title), + e('ul', null, ...labels.map(x => ListItem(Label(x)))), + e('div', {id: 'grid'}, ...grid) + ); +} + +if (!DEBUG){ + window.max.bindInlet("load", (dictId) => { + window.dispatchEvent(new CustomEvent('loadDict', {'detail' : dictId})); + }); + + window.max.bindInlet("save", (dictId) => { + window.dispatchEvent(new CustomEvent('saveDict', {'detail' : dictId})); + }); + + window.max.bindInlet("param", (inst, paramName, val) => { + + window.dispatchEvent(new CustomEvent('param', {'detail' : [inst, paramName, val]})); + }); + + window.max.bindInlet("tempo", (val) => { + window.dispatchEvent(new CustomEvent('tempo', {'detail' : val})); + }); + + window.max.bindInlet("timesig", (top, bottom) => { + window.dispatchEvent(new CustomEvent('timesig', {'detail' : [top, bottom]})); + }); + + setInterval(() => { + window.dispatchEvent(new CustomEvent('tick')); + }, 200); +} + + +const root = ReactDOM.createRoot(document.getElementById('lfo-container')); +root.render(e(MasterLfoHandler, null, null)); \ No newline at end of file diff --git a/max-lfo-table-nogit/modulators.js b/max-lfo-table-nogit/modulators.js new file mode 100644 index 0000000..23e7e0d --- /dev/null +++ b/max-lfo-table-nogit/modulators.js @@ -0,0 +1,122 @@ +///////////////////////// +// MODULATORS +///////////////////////// + +var SHAPETYPES = ["Sine", "SawUp", "SawDown", "Tri", "Square"]; + +var INSTANCEOPTIONS = ["1", "2", "3", "4"]; + +const MODPARAMOPTIONS = ["NONE", "stream", "pulse_length", "eventfulness", "event_length", "metriclarity", + "harmoniclarity", "melodic_cohesion", "melody_scope", "tonic_pitch", "pitch_center", "pitch_range", "dynamics", + "attenuation", "chordal_weight", "tonality-profile", "ostinato-buffer", "ostinato", "meter", "scale"]; + +function ControlType(){ + return e('select', {className: 'control-type'}, Option("LFO")); +} + + + +function LfoRow(props){ + + let linkedText = props.linked ? "-> enums" : ""; + let center = props.centerVals[props.instanceNum][props.djParam]; + if (!center) + center = 0; + + let content = e('ul', {className: 'lfo-item'}, + ListItem(DropDown({onChange: props.setInstanceNum, value:props.instanceNum, options: INSTANCEOPTIONS})), + ListItem(ControlType()), + ListItem(DropDown({onChange: props.setShape, value:props.shape, options: SHAPETYPES})), + ListItem(DropDown({onChange: props.setDjParam, value: props.djParam, options: MODPARAMOPTIONS})), + ListItem(e("input", {onChange:props.setFreq, value:props.freq, className:"timeInput"}, null)), + ListItem(e(NumberBox, {onChange:props.setMin, value:props.min, step:0.1}, null)), + ListItem(e(NumberBox, {onChange:props.setMax, value:props.max, step:0.1}, null)), + //ListItem(e(NumberBox, {onChange:props.setAmp, value:props.amp, step:0.1}, null)), + ListItem(e(NumberBox, {onChange:props.setPhase, value:props.phase, step:0.1}, null)), + ListItem(e("div", {className:"base-val"}, center.toString())), + ListItem(e("input", {type: 'range', min: 0, max: 1, step: 0.01, readonly: true, id: `slider-${props.instanceNum}-${props.djParam}`})), + ListItem(e(Button, {text:'+', onClick: props.addLfo}, null)), + ListItem(e(Button, {text:'-', onClick: props.removeLfo}, null)), + ListItem(e("div", {className:"linked"}, linkedText)), + ); + if (props.visible){ + return content + }; +} + +function indexWave(type, phase){ + switch (type){ + case "Sine": + return (Math.sin(phase * Math.PI * 2) / 2) + 0.5; + case "SawUp": + return phase; + case "SawDown": + return 1 - phase; + case "Tri": + return phase > 0.5? (1-phase) * 2 : phase * 2; + case "Square": + return +(phase > 0.5); + } +} + +function operateModulators(visibleArr, instanceNumArr, paramNames, centers, freqs, mins, maxs, waveTypes, phaseArr, currTime, bpm, beatsInMeasure){ + for (let i=0; i>>0,s=0;sWe(e)?(r=e+1,t-We(e)):(r=e,t);return{year:r,dayOfYear:n}}function Be(e,t,n){var s,i,r=qe(e.year(),t,n),r=Math.floor((e.dayOfYear()-r-1)/7)+1;return r<1?s=r+N(i=e.year()-1,t,n):r>N(e.year(),t,n)?(s=r-N(e.year(),t,n),i=e.year()+1):(i=e.year(),s=r),{week:s,year:i}}function N(e,t,n){var s=qe(e,t,n),t=qe(e+1,t,n);return(We(e)-s+t)/7}s("w",["ww",2],"wo","week"),s("W",["WW",2],"Wo","isoWeek"),h("w",n,u),h("ww",n,t),h("W",n,u),h("WW",n,t),Oe(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=M(e)});function Je(e,t){return e.slice(t,7).concat(e.slice(0,t))}s("d",0,"do","day"),s("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),s("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),s("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),s("e",0,0,"weekday"),s("E",0,0,"isoWeekday"),h("d",n),h("e",n),h("E",n),h("dd",function(e,t){return t.weekdaysMinRegex(e)}),h("ddd",function(e,t){return t.weekdaysShortRegex(e)}),h("dddd",function(e,t){return t.weekdaysRegex(e)}),Oe(["dd","ddd","dddd"],function(e,t,n,s){s=n._locale.weekdaysParse(e,s,n._strict);null!=s?t.d=s:p(n).invalidWeekday=e}),Oe(["d","e","E"],function(e,t,n,s){t[s]=M(e)});var Qe="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Xe="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Ke="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),et=i,tt=i,nt=i;function st(){function e(e,t){return t.length-e.length}for(var t,n,s,i=[],r=[],a=[],o=[],u=0;u<7;u++)s=l([2e3,1]).day(u),t=f(this.weekdaysMin(s,"")),n=f(this.weekdaysShort(s,"")),s=f(this.weekdays(s,"")),i.push(t),r.push(n),a.push(s),o.push(t),o.push(n),o.push(s);i.sort(e),r.sort(e),a.sort(e),o.sort(e),this._weekdaysRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+i.join("|")+")","i")}function it(){return this.hours()%12||12}function rt(e,t){s(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function at(e,t){return t._meridiemParse}s("H",["HH",2],0,"hour"),s("h",["hh",2],0,it),s("k",["kk",2],0,function(){return this.hours()||24}),s("hmm",0,0,function(){return""+it.apply(this)+r(this.minutes(),2)}),s("hmmss",0,0,function(){return""+it.apply(this)+r(this.minutes(),2)+r(this.seconds(),2)}),s("Hmm",0,0,function(){return""+this.hours()+r(this.minutes(),2)}),s("Hmmss",0,0,function(){return""+this.hours()+r(this.minutes(),2)+r(this.seconds(),2)}),rt("a",!0),rt("A",!1),h("a",at),h("A",at),h("H",n,d),h("h",n,u),h("k",n,u),h("HH",n,t),h("hh",n,t),h("kk",n,t),h("hmm",me),h("hmmss",_e),h("Hmm",me),h("Hmmss",_e),v(["H","HH"],O),v(["k","kk"],function(e,t,n){e=M(e);t[O]=24===e?0:e}),v(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),v(["h","hh"],function(e,t,n){t[O]=M(e),p(n).bigHour=!0}),v("hmm",function(e,t,n){var s=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s)),p(n).bigHour=!0}),v("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s,2)),t[T]=M(e.substr(i)),p(n).bigHour=!0}),v("Hmm",function(e,t,n){var s=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s))}),v("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s,2)),t[T]=M(e.substr(i))});i=Re("Hours",!0);var ot,ut={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Fe,monthsShort:Le,week:{dow:0,doy:6},weekdays:Qe,weekdaysMin:Ke,weekdaysShort:Xe,meridiemParse:/[ap]\.?m?\.?/i},W={},lt={};function dt(e){return e&&e.toLowerCase().replace("_","-")}function ht(e){for(var t,n,s,i,r=0;r=t&&function(e,t){for(var n=Math.min(e.length,t.length),s=0;s=t-1)break;t--}r++}return ot}function ct(t){var e,n;if(void 0===W[t]&&"undefined"!=typeof module&&module&&module.exports&&(n=t)&&n.match("^[^/\\\\]*$"))try{e=ot._abbr,require("./locale/"+t),ft(e)}catch(e){W[t]=null}return W[t]}function ft(e,t){return e&&((t=g(t)?P(e):mt(e,t))?ot=t:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),ot._abbr}function mt(e,t){if(null===t)return delete W[e],null;var n,s=ut;if(t.abbr=e,null!=W[e])Q("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=W[e]._config;else if(null!=t.parentLocale)if(null!=W[t.parentLocale])s=W[t.parentLocale]._config;else{if(null==(n=ct(t.parentLocale)))return lt[t.parentLocale]||(lt[t.parentLocale]=[]),lt[t.parentLocale].push({name:e,config:t}),null;s=n._config}return W[e]=new K(X(s,t)),lt[e]&<[e].forEach(function(e){mt(e.name,e.config)}),ft(e),W[e]}function P(e){var t;if(!(e=e&&e._locale&&e._locale._abbr?e._locale._abbr:e))return ot;if(!y(e)){if(t=ct(e))return t;e=[e]}return ht(e)}function _t(e){var t=e._a;return t&&-2===p(e).overflow&&(t=t[Y]<0||11He(t[D],t[Y])?S:t[O]<0||24N(r,u,l)?p(s)._overflowWeeks=!0:null!=d?p(s)._overflowWeekday=!0:(h=$e(r,a,o,u,l),s._a[D]=h.year,s._dayOfYear=h.dayOfYear)),null!=e._dayOfYear&&(i=bt(e._a[D],n[D]),(e._dayOfYear>We(i)||0===e._dayOfYear)&&(p(e)._overflowDayOfYear=!0),d=ze(i,0,e._dayOfYear),e._a[Y]=d.getUTCMonth(),e._a[S]=d.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=c[t]=n[t];for(;t<7;t++)e._a[t]=c[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[O]&&0===e._a[b]&&0===e._a[T]&&0===e._a[Te]&&(e._nextDay=!0,e._a[O]=0),e._d=(e._useUTC?ze:Ze).apply(null,c),r=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[O]=24),e._w&&void 0!==e._w.d&&e._w.d!==r&&(p(e).weekdayMismatch=!0)}}function xt(e){if(e._f===_.ISO_8601)Yt(e);else if(e._f===_.RFC_2822)Ot(e);else{e._a=[],p(e).empty=!0;for(var t,n,s,i,r,a=""+e._i,o=a.length,u=0,l=ae(e._f,e._locale).match(te)||[],d=l.length,h=0;he.valueOf():e.valueOf()"}),u.toJSON=function(){return this.isValid()?this.toISOString():null},u.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},u.unix=function(){return Math.floor(this.valueOf()/1e3)},u.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},u.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},u.eraName=function(){for(var e,t=this.localeData().eras(),n=0,s=t.length;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},u.isLocal=function(){return!!this.isValid()&&!this._isUTC},u.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},u.isUtc=At,u.isUTC=At,u.zoneAbbr=function(){return this._isUTC?"UTC":""},u.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},u.dates=e("dates accessor is deprecated. Use date instead.",ge),u.months=e("months accessor is deprecated. Use month instead",Ie),u.years=e("years accessor is deprecated. Use year instead",Pe),u.zone=e("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?(this.utcOffset(e="string"!=typeof e?-e:e,t),this):-this.utcOffset()}),u.isDSTShifted=e("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){var e,t;return g(this._isDSTShifted)&&(q(e={},this),(e=Nt(e))._a?(t=(e._isUTC?l:R)(e._a),this._isDSTShifted=this.isValid()&&0 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + printWarning('warn', format, args); + } + } + } + function error(format) { + { + if (!suppressWarning) { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + printWarning('error', format, args); + } + } + } + + function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. + { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); + + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } // eslint-disable-next-line react-internal/safe-string-coercion + + + var argsWithFormat = args.map(function (item) { + return String(item); + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); + } + } + + var FunctionComponent = 0; + var ClassComponent = 1; + var IndeterminateComponent = 2; // Before we know whether it is function or class + + var HostRoot = 3; // Root of a host tree. Could be nested inside another node. + + var HostPortal = 4; // A subtree. Could be an entry point to a different renderer. + + var HostComponent = 5; + var HostText = 6; + var Fragment = 7; + var Mode = 8; + var ContextConsumer = 9; + var ContextProvider = 10; + var ForwardRef = 11; + var Profiler = 12; + var SuspenseComponent = 13; + var MemoComponent = 14; + var SimpleMemoComponent = 15; + var LazyComponent = 16; + var IncompleteClassComponent = 17; + var DehydratedFragment = 18; + var SuspenseListComponent = 19; + var ScopeComponent = 21; + var OffscreenComponent = 22; + var LegacyHiddenComponent = 23; + var CacheComponent = 24; + var TracingMarkerComponent = 25; + + // ----------------------------------------------------------------------------- + + var enableClientRenderFallbackOnTextMismatch = true; // TODO: Need to review this code one more time before landing + // the react-reconciler package. + + var enableNewReconciler = false; // Support legacy Primer support on internal FB www + + var enableLazyContextPropagation = false; // FB-only usage. The new API has different semantics. + + var enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber + + var enableSuspenseAvoidThisFallback = false; // Enables unstable_avoidThisFallback feature in Fizz + // React DOM Chopping Block + // + // Similar to main Chopping Block but only flags related to React DOM. These are + // grouped because we will likely batch all of them into a single major release. + // ----------------------------------------------------------------------------- + // Disable support for comment nodes as React DOM containers. Already disabled + // in open source, but www codebase still relies on it. Need to remove. + + var disableCommentsAsDOMContainers = true; // Disable javascript: URL strings in href for XSS protection. + // and client rendering, mostly to allow JSX attributes to apply to the custom + // element's object properties instead of only HTML attributes. + // https://github.com/facebook/react/issues/11347 + + var enableCustomElementPropertySupport = false; // Disables children for