From 2369ed5ddf2140d0f890ccb99242f4cfc59b5f13 Mon Sep 17 00:00:00 2001 From: Kieran McAuliffe Date: Mon, 5 Aug 2024 15:32:06 +0200 Subject: [PATCH] instance numbering --- enums.js | 5 +- example.maxpat | 253 +++++++++++++++++++++++++------------------------ lfogui.js | 75 +++++++++------ modulators.js | 26 +++-- 4 files changed, 193 insertions(+), 166 deletions(-) diff --git a/enums.js b/enums.js index 9297cd7..0c911af 100644 --- a/enums.js +++ b/enums.js @@ -20,6 +20,7 @@ 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)), @@ -45,7 +46,7 @@ function denumerate(inval, count, keys, vals){ } -function enumerate(name, inval, count, keys, vals){ +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]){ @@ -66,6 +67,6 @@ function enumerate(name, inval, count, keys, vals){ } if (name !== "NONE") - window.max.outlet(name + " " + output); + window.max.outlet(inst + " " + name + " " + output); } diff --git a/example.maxpat b/example.maxpat index c0df0ff..3c32050 100644 --- a/example.maxpat +++ b/example.maxpat @@ -10,7 +10,7 @@ } , "classnamespace" : "box", - "rect" : [ 533.0, 91.0, 1344.0, 869.0 ], + "rect" : [ 112.0, 87.0, 1344.0, 869.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -40,13 +40,51 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-53", - "maxclass" : "button", + "id" : "obj-66", + "maxclass" : "newobj", "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 495.0, 633.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-57", + "maxclass" : "message", + "numinlets" : 2, "numoutlets" : 1, - "outlettype" : [ "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 737.0, 43.0, 24.0, 24.0 ] + "outlettype" : [ "" ], + "patching_rect" : [ 845.0, 552.0, 207.0, 22.0 ], + "text" : "1 metriclarity 20.101808" + } + + } +, { + "box" : { + "id" : "obj-9", + "linecount" : 6, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 305.0, 580.0, 50.0, 89.0 ], + "text" : "\"1 metriclarity 22.01256628793118\"" } } @@ -73,18 +111,6 @@ "text" : "prepend tempo" } - } -, { - "box" : { - "id" : "obj-49", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 868.0, 96.0, 150.0, 33.0 ], - "text" : "ADD SUPPORT FOR MUSICAL TIMINGS" - } - } , { "box" : { @@ -142,10 +168,10 @@ "outlettype" : [ "" ], "patching_rect" : [ 523.0, 747.0, 116.0, 22.0 ], "saved_object_attributes" : { - "client_rect" : [ 1071, 252, 1680, 568 ], + "client_rect" : [ 4, 87, 990, 730 ], "parameter_enable" : 0, "parameter_mappable" : 0, - "storage_rect" : [ 780, 524, 1380, 824 ] + "storage_rect" : [ 583, 69, 1034, 197 ] } , "text" : "pattrstorage storage", @@ -163,9 +189,9 @@ "patching_rect" : [ 643.0, 770.0, 40.0, 22.0 ], "restore" : [ { "data" : { - "enumArrays" : [ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ "3", 2, 2, "2", "2", "2", "2", "2", "2", "2" ], [ "meter", "NONE", "NONE", "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 ] ], [ [ "3 4", "4 4", "7 8", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine" ], [ "meter", "eventfulness", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE" ], [ "0.1hz", "1hz", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "0.5", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ], [ "2.5", "0", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ] ] + "enumArrays" : [ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "2", "2", "2", "2", "2", "2", "2", "2", "2", "2" ], [ "scale", "attenuation", "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 ] ], [ [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine" ], [ "metriclarity", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE" ], [ "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz" ], [ "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ], [ "4", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ] ] } } @@ -184,9 +210,9 @@ "box" : { "data" : { "data" : { - "enumArrays" : [ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ "3", 2, 2, "2", "2", "2", "2", "2", "2", "2" ], [ "meter", "NONE", "NONE", "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 ] ], [ [ "3 4", "4 4", "7 8", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine" ], [ "meter", "eventfulness", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE" ], [ "0.1hz", "1hz", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "0.5", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ], [ "2.5", "0", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ] ] + "enumArrays" : [ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "2", "2", "2", "2", "2", "2", "2", "2", "2", "2" ], [ "scale", "attenuation", "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 ] ], [ [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "param", "param", "param", "param" ], [ "param", "param", "param", "param", "param", "param", "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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine", "Sine" ], [ "metriclarity", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE", "NONE" ], [ "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz", "1hz" ], [ "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ], [ "4", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ], [ "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ] ] } } @@ -207,17 +233,6 @@ "varname" : "dict" } - } -, { - "box" : { - "id" : "obj-13", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 971.0, 590.0, 32.0, 22.0 ], - "text" : "print" - } - } , { "box" : { @@ -250,7 +265,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "bang" ], - "patching_rect" : [ 1041.0, 687.0, 22.0, 22.0 ], + "patching_rect" : [ 980.368419170379639, 702.0, 22.0, 22.0 ], "text" : "t b" } @@ -261,7 +276,7 @@ "maxclass" : "dict.view", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 1009.631580829620361, 742.0, 231.0, 134.0 ] + "patching_rect" : [ 949.0, 757.0, 231.0, 134.0 ] } } @@ -274,7 +289,7 @@ "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" + "text" : "this param is sent in its already enumerated form, so it will first be turned into a number halfway between the enumeration boundaries" } } @@ -285,8 +300,8 @@ "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 22.0, 444.0, 105.0, 22.0 ], - "text" : "param meter \"3 4\"" + "patching_rect" : [ 22.0, 444.0, 115.0, 22.0 ], + "text" : "param 4 meter \"4 4\"" } } @@ -298,7 +313,7 @@ "numoutlets" : 1, "outlettype" : [ "" ], "patching_rect" : [ 949.0, 647.0, 156.0, 22.0 ], - "text" : "attenuation 200" + "text" : "meter 7 8" } } @@ -310,7 +325,7 @@ "numoutlets" : 1, "outlettype" : [ "" ], "patching_rect" : [ 824.0, 647.0, 101.0, 22.0 ], - "text" : "scale pentatonic" + "text" : "attenuation 200" } } @@ -322,44 +337,20 @@ "numoutlets" : 1, "outlettype" : [ "" ], "patching_rect" : [ 662.0, 647.0, 157.0, 22.0 ], - "text" : "harmoniclarity 33.124751" + "text" : "scale minor" } } , { "box" : { "id" : "obj-33", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 569.0, 647.0, 87.0, 22.0 ], - "text" : "meter 4 4" - } - - } -, { - "box" : { - "id" : "obj-31", "linecount" : 2, "maxclass" : "message", "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 485.0, 647.0, 80.0, 35.0 ], - "text" : "stream 0.207125" - } - - } -, { - "box" : { - "id" : "obj-29", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 347.0, 647.0, 133.0, 22.0 ], - "text" : "metriclarity 20" + "patching_rect" : [ 569.0, 647.0, 87.0, 35.0 ], + "text" : "metriclarity 22.087936" } } @@ -367,11 +358,11 @@ "box" : { "id" : "obj-27", "maxclass" : "newobj", - "numinlets" : 9, - "numoutlets" : 9, - "outlettype" : [ "", "", "", "", "", "", "", "", "" ], - "patching_rect" : [ 423.5, 588.0, 441.0, 22.0 ], - "text" : "routepass metriclarity stream meter harmoniclarity scale attenuation saved debug" + "numinlets" : 3, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 423.5, 588.0, 133.0, 22.0 ], + "text" : "routepass saved debug" } } @@ -455,8 +446,8 @@ "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 59.0, 256.0, 94.0, 22.0 ], - "text" : "param scale 1.6" + "patching_rect" : [ 59.0, 256.0, 104.0, 22.0 ], + "text" : "param 2 scale 1.6" } } @@ -505,8 +496,8 @@ "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 48.0, 181.0, 121.0, 22.0 ], - "text" : "param metriclarity 20" + "patching_rect" : [ 45.0, 180.0, 131.0, 22.0 ], + "text" : "param 1 metriclarity 20" } } @@ -517,8 +508,8 @@ "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 28.0, 331.0, 129.0, 22.0 ], - "text" : "param attenuation 200" + "patching_rect" : [ 28.0, 331.0, 139.0, 22.0 ], + "text" : "param 3 attenuation 200" } } @@ -541,7 +532,7 @@ "numinlets" : 2, "numoutlets" : 4, "outlettype" : [ "dictionary", "", "", "" ], - "patching_rect" : [ 1041.0, 711.0, 97.0, 22.0 ], + "patching_rect" : [ 980.368419170379639, 726.0, 97.0, 22.0 ], "saved_object_attributes" : { "embed" : 0, "parameter_enable" : 0, @@ -619,7 +610,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 402.0, 174.0, 788.631580829620361, 367.0 ], + "patching_rect" : [ 402.0, 173.0, 838.631580829620361, 368.0 ], "rendermode" : 0, "url" : "file://lfogui.html" } @@ -707,57 +698,22 @@ } , { "patchline" : { - "destination" : [ "obj-13", 0 ], - "source" : [ "obj-27", 7 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-29", 1 ], + "destination" : [ "obj-40", 0 ], "source" : [ "obj-27", 0 ] } } , { "patchline" : { - "destination" : [ "obj-31", 1 ], - "source" : [ "obj-27", 1 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-33", 1 ], + "destination" : [ "obj-63", 0 ], "source" : [ "obj-27", 2 ] } } , { "patchline" : { - "destination" : [ "obj-35", 1 ], - "source" : [ "obj-27", 3 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-39", 1 ], - "source" : [ "obj-27", 4 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-40", 0 ], - "source" : [ "obj-27", 6 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-41", 1 ], - "source" : [ "obj-27", 5 ] + "destination" : [ "obj-66", 0 ], + "source" : [ "obj-27", 1 ] } } @@ -778,7 +734,7 @@ , { "patchline" : { "destination" : [ "obj-15", 0 ], - "order" : 2, + "order" : 3, "source" : [ "obj-37", 0 ] } @@ -790,6 +746,14 @@ "source" : [ "obj-37", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-22", 0 ], + "order" : 5, + "source" : [ "obj-37", 0 ] + } + } , { "patchline" : { @@ -798,6 +762,22 @@ "source" : [ "obj-37", 0 ] } + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "order" : 2, + "source" : [ "obj-37", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "order" : 4, + "source" : [ "obj-37", 0 ] + } + } , { "patchline" : { @@ -852,8 +832,29 @@ } , { "patchline" : { - "destination" : [ "obj-47", 0 ], - "source" : [ "obj-53", 0 ] + "destination" : [ "obj-33", 1 ], + "source" : [ "obj-63", 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 ] } } diff --git a/lfogui.js b/lfogui.js index 1095aff..ee5aeff 100644 --- a/lfogui.js +++ b/lfogui.js @@ -24,8 +24,8 @@ const ViewModes = Object.freeze({ var modPhases = Array(MAXLFOS).fill(0); var firstUpdateTime = Date.now(); -const MODULATORLABELS = ["-type-", "---shape---", "-------param-------", "--timebase--", "-min-", "-max", "-phase-", "center"]; -const ENUMERATORLABELS = ["---parameter---", "-# points-"]; +const MODULATORLABELS = ["inst", "-type-", "---shape---", "-------param-------", "--timebase--", "-min-", "-max", "-phase-", "center"]; +const ENUMERATORLABELS = ["inst", "---parameter---", "-# points-"]; @@ -46,8 +46,9 @@ function MasterLfoHandler(){ /// MODULATOR ARRAYS const [modVisibleArr, setModVisibleArr] = React.useState(initVisArr); + const [modInstanceNumArr, setModInstanceNumArr] = React.useState(Array(MAXLFOS).fill('1')); - const [modCenterVals, setModCenterVals] = React.useState({}); + const [modCenterVals, setModCenterVals] = React.useState({'1':{}, '2':{}, '3':{}, '4':{}}); const [bpm, setBpm] = React.useState(100); const [beatsInMeasure, setBeatsInMeasure] = React.useState(4); @@ -63,13 +64,14 @@ function MasterLfoHandler(){ const [phaseArr, setPhaseArr] = React.useState(Array(MAXLFOS).fill('0')); - const allModArrays = [modVisibleArr, shapeArr, djParamArr, freqArr, minArr, maxArr, phaseArr]; - const allModSetters = [setModVisibleArr, setShapeArr, setDjParamArr, setFreqArr, setMinArr, setMaxArr, setPhaseArr]; - const modBlankVals = [true, SHAPETYPES[0], MODPARAMOPTIONS[0], '1', '0', '1', '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')); @@ -93,14 +95,14 @@ function MasterLfoHandler(){ let baseEnumNames = Array(MAXENUMS).fill(0).map(x => Array(MAXENUMPOINTS).fill('param')); const [enumNames, setEnumNames] = React.useState(baseEnumNames); - const allEnumArrays = [enumVisibleArr, enumItemCounts, enumDjParamArr]; - const allEnumArrSetters = [setEnumVisibleArr, setEnumItemCounts, setEnumDjParamArr]; + 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, 2, MODPARAMOPTIONS[0]]; + const enumBlankVals = [true, '1', 2, MODPARAMOPTIONS[0]]; const [render, rerender] = React.useState(false); // BAD. I SHOULDN'T BE DOING THIS @@ -138,21 +140,22 @@ function MasterLfoHandler(){ // only called internally by 1. Handler after modulator processing 2. LFO outputs function handleEnum(event){ - let name = event.detail[0]; - let val = event.detail[1]; + let inst = event.detail[0]; + let name = event.detail[1]; + let val = event.detail[2]; // if none of the Enums use this param, then we output it let i = 0; while (i < MAXENUMS){ - if (enumVisibleArr[i] && enumDjParamArr[i] == name) + if (enumVisibleArr[i] && enumDjParamArr[i] == name && enumInstanceNumArr[i] == inst) break; i++ } if (i == MAXENUMS){ - window.max.outlet(name + ' ' + val); + window.max.outlet(inst + ' ' + name + ' ' + val); } else { - enumerate(name, val, enumItemCounts[i], enumBreakPoints[i], enumNames[i]); + enumerate(name, inst, val, enumItemCounts[i], enumBreakPoints[i], enumNames[i]); } @@ -160,11 +163,15 @@ function MasterLfoHandler(){ function handleParam(event) { - - let name = event.detail[0]; - let val = event.detail[1]; + let inst = event.detail[0]; // djster instance + let name = event.detail[1]; + let val = event.detail[2]; // CHECK FOR INDEX OF THIS NAME IN ENUM MATRIX, AND IF IT IS THERE DENUMERATE - let index = enumDjParamArr.indexOf(name); + let index = -1; + for (let i = 0; i < MAXENUMS; i++){ + if (enumDjParamArr[i] == name && enumInstanceNumArr[i] == inst) + index = i; + } if (index != -1){ val = denumerate(val, enumItemCounts[index], enumBreakPoints[index], enumNames[index]); } @@ -173,16 +180,16 @@ function MasterLfoHandler(){ // if none of the LFOs use this param, then we send it straight to the enum let i = 0; while (i < MAXLFOS){ - if (modVisibleArr[i] && djParamArr[i] == name) + if (modVisibleArr[i] && djParamArr[i] == name && modInstanceNumArr[i] == inst) break; - i++ + i++; } if (i == MAXLFOS){ - window.dispatchEvent(new CustomEvent('enum', {'detail' : [name, val]})); + window.dispatchEvent(new CustomEvent('enum', {'detail' : [inst, name, val]})); } - modCenterVals[name] = val; + modCenterVals[inst][name] = val; setModCenterVals(modCenterVals); rerender(!render); // BAD! SHOULD NOT BE DOING THIS! @@ -191,7 +198,7 @@ function MasterLfoHandler(){ function handleTick(event) { let time = (Date.now() - firstUpdateTime) / 1000; - operateModulators(modVisibleArr, djParamArr, modCenterVals, freqArr, minArr, maxArr, shapeArr, phaseArr, time, bpm, beatsInMeasure); + operateModulators(modVisibleArr, modInstanceNumArr, djParamArr, modCenterVals, freqArr, minArr, maxArr, shapeArr, phaseArr, time, bpm, beatsInMeasure); } function handleBpm(event) { @@ -223,7 +230,13 @@ function MasterLfoHandler(){ }, [...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 @@ -235,6 +248,8 @@ function MasterLfoHandler(){ modContents.push( e(LfoRow, { + instanceNum : modInstanceNumArr[i], + setInstanceNum: CreateParamChanger(modInstanceNumArr, setModInstanceNumArr, i), shape: shapeArr[i], setShape: CreateParamChanger(shapeArr, setShapeArr, i), djParam: djParamArr[i], @@ -256,7 +271,7 @@ function MasterLfoHandler(){ setPhase: CreateParamChanger(phaseArr, setPhaseArr, i), visible: modVisibleArr[i], - linked: enumDjParamArr.includes(djParamArr[i]), + linked: CheckLinked(modInstanceNumArr[i], djParamArr[i], enumInstanceNumArr, enumDjParamArr), addLfo: () => { if (id < MAXLFOS - 1){ if (modVisibleArr[id + 1]){ @@ -305,6 +320,9 @@ function MasterLfoHandler(){ enumContents.push( e(EnumeratorRow, { index: i, + + instanceNum : enumInstanceNumArr[i], + setInstanceNum: CreateParamChanger(enumInstanceNumArr, setEnumInstanceNumArr, i), enumItems: enumItemCounts[i], setEnumItemCounts: CreateParamChanger(enumItemCounts, setEnumItemCounts, i), enumBreakPoints: enumBreakPoints, @@ -314,7 +332,7 @@ function MasterLfoHandler(){ visible: enumVisibleArr[i], djParam: enumDjParamArr[i], setDjParam: CreateParamChanger(enumDjParamArr, setEnumDjParamArr, i), - linked: djParamArr.includes(enumDjParamArr[i]), + linked: CheckLinked(enumInstanceNumArr[i], enumDjParamArr[i], modInstanceNumArr, djParamArr), addEnum: () => { if (id < MAXLFOS - 1){ if (enumVisibleArr[id + 1]){ // if we need to open up space @@ -401,8 +419,9 @@ if (!DEBUG){ window.dispatchEvent(new CustomEvent('saveDict', {'detail' : dictId})); }); - window.max.bindInlet("param", (paramName, val) => { - window.dispatchEvent(new CustomEvent('param', {'detail' : [paramName, val]})); + window.max.bindInlet("param", (inst, paramName, val) => { + + window.dispatchEvent(new CustomEvent('param', {'detail' : [inst, paramName, val]})); }); window.max.bindInlet("tempo", (val) => { diff --git a/modulators.js b/modulators.js index 3037999..23e7e0d 100644 --- a/modulators.js +++ b/modulators.js @@ -4,6 +4,8 @@ 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"]; @@ -17,11 +19,12 @@ function ControlType(){ function LfoRow(props){ let linkedText = props.linked ? "-> enums" : ""; - let center = props.centerVals[props.djParam]; + let center = props.centerVals[props.instanceNum][props.djParam]; if (!center) center = 0; - let content = e('ul', {className: 'lfo-item'}, + 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})), @@ -31,7 +34,7 @@ function LfoRow(props){ //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.djParam}`})), + 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)), @@ -56,27 +59,30 @@ function indexWave(type, phase){ } } -function operateModulators(visibleArr, paramNames, centers, freqs, mins, maxs, waveTypes, phaseArr, currTime, bpm, beatsInMeasure){ +function operateModulators(visibleArr, instanceNumArr, paramNames, centers, freqs, mins, maxs, waveTypes, phaseArr, currTime, bpm, beatsInMeasure){ for (let i=0; i