├── .gitmodules ├── LICENSE ├── README.md ├── fade-in.js ├── hueshift.js ├── jsui-dial.js ├── jsui-dial.maxpat ├── lode-alp ├── Lode Project │ ├── Ableton Project Info │ │ ├── Cache.cfg │ │ └── Project8_1.cfg │ ├── Icon │ ├── Lode Lessons │ │ ├── Large │ │ │ ├── fors.png │ │ │ ├── fors_bg.png │ │ │ └── lode.png │ │ ├── LessonsEN.txt │ │ ├── fors.png │ │ ├── fors_bg.png │ │ └── lode.png │ ├── Lode.als │ ├── Lode.amxd │ └── Presets │ │ ├── Classic.adv │ │ ├── Deep.adv │ │ ├── Detuned.adv │ │ ├── Dreamy.adv │ │ ├── Fadein.adv │ │ ├── Fifth.adv │ │ ├── Fourth.adv │ │ ├── Grumpy.adv │ │ ├── Harmonics.adv │ │ ├── Howler.adv │ │ ├── Huge.adv │ │ ├── Kick.adv │ │ ├── Laser.adv │ │ ├── Overtone.adv │ │ ├── Phasey.adv │ │ ├── Plucky.adv │ │ ├── Rboken.adv │ │ ├── Resonant.adv │ │ ├── Sawtooth.adv │ │ ├── Siney.adv │ │ ├── Softer.adv │ │ ├── Standard.adv │ │ ├── Twinkle.adv │ │ └── Twosaw.adv └── Lode.alp ├── lode-dev.amxd ├── poly.lowpass.maxpat ├── poly.monobass.maxpat ├── poly.template.maxpat ├── set-name.js ├── template.amxd └── ui-panel.maxpat /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "m4l-versioncheck"] 2 | path = m4l-versioncheck 3 | url = git@github.com:fors-fm/m4l-versioncheck.git 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2023 Fors FM AB 2 | 3 | Permission is hereby granted, free of charge, to any 4 | person obtaining a copy of this software and associated 5 | documentation files (the "Software"), to deal in the 6 | Software without restriction, including without 7 | limitation the rights to use, copy, modify, merge, 8 | publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software 10 | is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice 14 | shall be included in all copies or substantial portions 15 | of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 18 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 19 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 20 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 22 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 24 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 | DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Lode 2 | 3 | **Subtractive monobass synth & device template for Max for Live** 4 | 5 | Lode is a monophonic bass synthesizer inspired by our most beloved vintage pieces. You can read more about it, and download it for free, [on the Fors website](https://fors.fm/lode). 6 | It's built on a framework made for rapid development of [Max for Live](https://www.ableton.com/en/live/max-for-live/) synthesizers with custom elements, leveraging Javascript to dynamically change the interface without having to alter the patch itself. 7 | 8 | Provided is the development device of Lode (`lode-dev.amxd`) and a template device (`template.amxd`) to get you started on building your own device in the same format. 9 | 10 | ## Using the template device 11 | 12 | The `template.amxd` device is a simple polyphonic sinewave synthesizer with an ADSR amp envelope. 13 | To build your own device from the template provided, drag and drop `template.amxd` to a track in Live and open it for editing in Max. 14 | 15 | It may however be a good idea to create a renamed copy of `template.amxd` and `poly.template.maxpat` to get started on a new project. 16 | 17 | ### Changing the synth voice 18 | The DSP is written in [`Gen~`](https://docs.cycling74.com/max8/vignettes/gen_topic) and uses [`poly~`](https://docs.cycling74.com/max8/refpages/poly~) for polyphony (and voice muting). The DSP voice is wrapped into `poly.template.maxpat` which is then instantiated in the main patch. It can be edited by opening the `p dsp` subpatch, then double-clicking on `poly.template.maxpat`, and finally open the `gen~` object inside to view the DSP code. 19 | 20 | The DSP is written in a single `codebox` object using `genexpr`. The template synth is a very simple sinewave lookup oscillator using the built-in `cycle` object: 21 | ``` 22 | osc = cycle(freq) * amp_env; 23 | ``` 24 | 25 | By changing the `osc` output it's possible to build your own synthesizer voice. One nice addition could for example be to add phase modulation from a second oscillator. We can also change the placeholder parameter names `ctl0` and `ctl1` to something more specific pertaining to the functionality of the parameter: 26 | 27 | ``` 28 | // parameters 29 | 30 | mod_ratio = in5; 31 | mod_depth = in6; 32 | 33 | ... 34 | 35 | mod_phase = phasor(freq * mod_ratio); 36 | osc_phase = phasor(freq); 37 | 38 | mod = cycle(mod_phase, index = "phase") * mod_depth; 39 | osc = cycle(osc_phase + mod, index = "phase") * amp_env; 40 | ``` 41 | 42 | Note that `Gen~` will only compile for the current voice. Save the `poly.template` patch to apply it to all voices. Another option is to simply set the amount of voices used by the `poly~` object to 1 while working on the `gen~` code. 43 | 44 | ### Configuring parameters 45 | 46 | The UI is built with the [`JSUI`](https://docs.cycling74.com/max8/refpages/jsui) object, using Javascript and [mgraphics](https://docs.cycling74.com/max8/vignettes/jsmgraphics). The interface is configured using the object `dict ---parameters` on launch. This stores a unique configuration of the UI elements in JSON format. From the dict you can edit the look, name and polarity of each parameter of eight. 47 | 48 | The parameters are configured in the subpatch `p config`, double-click to open it, then double-click on the `dict ---parameters` object to edit the JSON data. 49 | 50 | ``` 51 | "param_0" : { 52 | "title" : "Ctrl 1", 53 | "style" : "dial", 54 | "bipolar" : 0 55 | } 56 | ``` 57 | 58 | **`title`** sets the title above the parameter 59 | 60 | **`style`** sets the visual look of the UI object, available styles are: 61 | * `dial`, a standard control dial 62 | * `slider`, a standard slider 63 | * `decay`, exponential decay curve 64 | 65 | **`bipolar`** configures whether the control has an indicator of a bipolar range, i.e a triangle to denote the middle on the dial style. 66 | 67 | This lets you draft an interface quickly and with ease. It's also possible to add your own styles in `dial.js` by adding a type to the style switch case in: 68 | ``` 69 | function paint() { 70 | with (mgraphics) { 71 | switch (style) { 72 | case "dial": 73 | ... 74 | ``` 75 | 76 | The hue and lightness of the accent color can also be changed by altering the last entry in `dict --parameters`, with `hue` ranging from 0 to 1 and `lightness` being lighter with lower values: 77 | ``` 78 | "color" : { 79 | "hue" : 0, 80 | "lightness" : 2 81 | } 82 | ``` 83 | 84 | Finally, you might want to change the ranges or naming of the `live.numbox` objects at the top-level of the patcher. These hook in the `JSUI` front-end UI to the controls of the Live API. Note that the values sent/received from the `JSUI` objects use the raw float value `0.0 .. 1.0` 85 | 86 | ## License 87 | MIT license ([LICENSE](LICENSE) or ) 88 | 89 | ## Contributing 90 | We provide this software as-is and in a finished state. We however encourage derivate work in form of forks using Lode or the template synthesizer as a base. 91 | -------------------------------------------------------------------------------- /fade-in.js: -------------------------------------------------------------------------------- 1 | outlets = 1 2 | 3 | var color = new Array(4) 4 | 5 | var fade_task = new Task(fade_in, this) 6 | 7 | var repeats = 50 8 | var interval = 10 9 | 10 | var done = false 11 | 12 | function set_color(r, g, b, a) { 13 | color[0] = r 14 | color[1] = g 15 | color[2] = b 16 | color[3] = a 17 | 18 | if (!done) { 19 | outlet(0, "bgfillcolor", color) 20 | } 21 | } 22 | 23 | function fade_in() { 24 | if (arguments.callee.task.iterations >= repeats) { 25 | done = true 26 | color[3] = 0 27 | } else { 28 | color[3] = 1 - sigmoid(arguments.callee.task.iterations / repeats, -0.75) 29 | } 30 | outlet(0, "bgfillcolor", color) 31 | } 32 | 33 | function bang() { 34 | fade_task.interval = interval 35 | fade_task.repeat(repeats) 36 | fade_task.execute() 37 | } 38 | 39 | function init() { 40 | color[3] = 1 41 | outlet(0, "bgfillcolor", color) 42 | } 43 | 44 | function sigmoid(x, y) { 45 | return (x - x * y) / (y - Math.abs(x) * 2 * y + 1) 46 | } 47 | -------------------------------------------------------------------------------- /hueshift.js: -------------------------------------------------------------------------------- 1 | var input_color = [] 2 | var input_inactive = [] 3 | var output_color = [] 4 | var hue_shift = 0 5 | var light = 2 6 | var alpha = 1 7 | var sat = 4 8 | 9 | var parameters = new Dict("---parameters") 10 | 11 | var fade_task = new Task(color_fade, this) 12 | 13 | var repeats = 50 14 | var interval = 10 15 | 16 | var fade_direction = 0 17 | 18 | function color_fade() { 19 | var mix_factor 20 | 21 | if (fade_direction) { 22 | if (arguments.callee.task.iterations >= repeats) { 23 | mix_factor = 1 24 | } else { 25 | mix_factor = sigmoid(arguments.callee.task.iterations / repeats, -0.75) 26 | } 27 | } else { 28 | if (arguments.callee.task.iterations >= repeats) { 29 | mix_factor = 0 30 | } else { 31 | mix_factor = 1 - sigmoid(arguments.callee.task.iterations / repeats, -0.85) 32 | } 33 | } 34 | 35 | var r = mix(output_color[0], input_inactive[0], mix_factor) 36 | var g = mix(output_color[1], input_inactive[1], mix_factor) 37 | var b = mix(output_color[2], input_inactive[2], mix_factor) 38 | 39 | outlet(0, r, g, b, alpha) 40 | } 41 | 42 | function bang() { 43 | var hue = parameters.get("color::hue") 44 | var lightness = parameters.get("color::lightness") 45 | 46 | set_hue(hue) 47 | set_light(lightness) 48 | } 49 | 50 | function set_state(x) { 51 | if (x) { 52 | fade_direction = 0 53 | fade_task.interval = interval 54 | fade_task.repeat(repeats) 55 | fade_task.execute() 56 | } else { 57 | fade_direction = 1 58 | fade_task.interval = interval 59 | fade_task.repeat(repeats) 60 | fade_task.execute() 61 | } 62 | } 63 | 64 | function set_hue(x) { 65 | hue_shift = x 66 | convert(input_color[0], input_color[1], input_color[2]) 67 | } 68 | 69 | function set_light(x) { 70 | light = x 71 | convert(input_color[0], input_color[1], input_color[2]) 72 | } 73 | 74 | function set_sat(x) { 75 | sat = x 76 | convert(input_color[0], input_color[1], input_color[2]) 77 | } 78 | 79 | function set_inactive(r, g, b, a) { 80 | input_inactive[0] = r 81 | input_inactive[1] = g 82 | input_inactive[2] = b 83 | input_inactive[3] = a 84 | } 85 | 86 | function input(r, g, b, a) { 87 | input_color[0] = r 88 | input_color[1] = g 89 | input_color[2] = b 90 | input_color[3] = a 91 | 92 | alpha = a 93 | convert(r, g, b) 94 | } 95 | 96 | function convert(r, g, b) { 97 | var hsl_conv = rgb2hsl(r * 255, g * 255, b * 255) 98 | 99 | output_color = hsl2rgb(hsl_conv[0] + hue_shift, hsl_conv[1], hsl_conv[2]) 100 | outlet(0, [output_color[0], output_color[1], output_color[2], alpha]) 101 | } 102 | 103 | function rgb2hsl(r, g, b) { 104 | (r /= 255), (g /= 255), (b /= 255) 105 | 106 | var max = Math.max(r, g, b), min = Math.min(r, g, b) 107 | var h, s, l = (max + min) / light 108 | 109 | if (max == min) { 110 | h = s = 0 111 | } else { 112 | var d = max - min 113 | s = l > 0.5 ? d / (2 - max - min) : d / (max + min) 114 | 115 | switch (max) { 116 | case r: 117 | h = (g - b) / d + (g < b ? 6 : 0) 118 | break 119 | 120 | case g: 121 | h = (b - r) / d + 2 122 | break 123 | 124 | case b: 125 | h = (r - g) / d + 4 126 | break 127 | } 128 | h /= 6 129 | } 130 | return [h, s, l] 131 | } 132 | 133 | function hsl2rgb(h, s, l) { 134 | var r, g, b 135 | 136 | if (s == 0) { 137 | r = g = b = l 138 | } else { 139 | function hue2rgb(p, q, t) { 140 | if (t < 0) t += 1 141 | if (t > 1) t -= 1 142 | if (t < 1 / 6) return p + (q - p) * 6 * t 143 | if (t < 1 / 2) return q 144 | if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6 145 | 146 | return p 147 | } 148 | 149 | var q = l < 0.5 ? l * (1 + s) : l + s - l * s 150 | var p = 2 * l - q 151 | 152 | r = hue2rgb(p, q, h + 1 / 3) 153 | g = hue2rgb(p, q, h) 154 | b = hue2rgb(p, q, h - 1 / 3) 155 | } 156 | 157 | return [r, g, b] 158 | } 159 | 160 | function clamp(num, min, max) { 161 | return num <= min ? min : num >= max ? max : num 162 | } 163 | 164 | function sigmoid(x, y) { 165 | return (x - x * y) / (y - Math.abs(x) * 2 * y + 1) 166 | } 167 | 168 | function mix(x, y, a) { 169 | return x + a * (y - x) 170 | } 171 | -------------------------------------------------------------------------------- /jsui-dial.js: -------------------------------------------------------------------------------- 1 | outlets = 1 2 | 3 | mgraphics.init() 4 | mgraphics.autofill = 0 5 | mgraphics.relative_coords = 0 6 | 7 | var parameters = new Dict("---parameters") 8 | 9 | var style = "dial" 10 | var bipolar = false 11 | 12 | function set_id(x) { 13 | param_style = parameters.get("param_" + x + "::style") 14 | param_range = parameters.get("param_" + x + "::bipolar") 15 | 16 | set_style(param_style) 17 | set_range(param_range) 18 | } 19 | 20 | function set_style(x) { 21 | style = x 22 | refresh() 23 | mgraphics.redraw() 24 | } 25 | 26 | function set_range(x) { 27 | bipolar = x ? true : false 28 | refresh() 29 | mgraphics.redraw() 30 | } 31 | 32 | var value = 0 33 | 34 | function set_value(x) { 35 | value = x 36 | refresh() 37 | mgraphics.redraw() 38 | } 39 | 40 | // color handling 41 | 42 | var lcdcolor = [0.993, 0.654, 0.155, 1.0] 43 | var inactivelcdcolor = [0.475, 0.475, 0.475, 1.0] 44 | var lcdbgcolor = [0.02, 0.02, 0.02, 1.0] 45 | var hovercolor = [ 46 | inactivelcdcolor[0] * 1.7, 47 | inactivelcdcolor[1] * 1.7, 48 | inactivelcdcolor[2] * 1.7, 49 | 1.0, 50 | ] 51 | 52 | function set_lcdcolor(r, g, b, a) { 53 | lcdcolor = [r, g, b, a] 54 | refresh() 55 | mgraphics.redraw() 56 | } 57 | 58 | function set_lcdbgcolor(r, g, b, a) { 59 | lcdbgcolor = [r, g, b, a] 60 | refresh() 61 | mgraphics.redraw() 62 | } 63 | 64 | function set_inactivelcdcolor(r, g, b, a) { 65 | inactivelcdcolor = [r, g, b, a] 66 | hovercolor = [ 67 | inactivelcdcolor[0] * 1.7, 68 | inactivelcdcolor[1] * 1.7, 69 | inactivelcdcolor[2] * 1.7, 70 | 1, 71 | ] 72 | refresh() 73 | mgraphics.redraw() 74 | } 75 | 76 | // hover transition task 77 | 78 | var hover_state = 0 79 | var click_state = 0 80 | 81 | var hover_task = new Task(hover_transition, this) 82 | var click_task = new Task(click_transition, this) 83 | 84 | var repeats = 50 85 | var repeats_click = 25 86 | var interval = 10 87 | 88 | function hover_transition() { 89 | if (arguments.callee.task.iterations >= repeats) { 90 | if (hover) { 91 | hover_state = 1 92 | mgraphics.redraw() 93 | } else { 94 | hover_state = 0 95 | mgraphics.redraw() 96 | } 97 | 98 | arguments.callee.task.cancel() 99 | } else { 100 | mgraphics.redraw() 101 | 102 | if (hover) { 103 | hover_state = sigmoid( 104 | arguments.callee.task.iterations / repeats, 105 | -0.85 106 | ) 107 | } else { 108 | hover_state = sigmoid( 109 | 1 - arguments.callee.task.iterations / repeats, 110 | 0.5 111 | ) 112 | } 113 | } 114 | } 115 | 116 | function click_transition() { 117 | if (arguments.callee.task.iterations >= repeats_click) { 118 | if (clicked) { 119 | click_state = 1 120 | mgraphics.redraw() 121 | } else { 122 | click_state = 0 123 | mgraphics.redraw() 124 | } 125 | 126 | arguments.callee.task.cancel() 127 | } else { 128 | mgraphics.redraw() 129 | 130 | if (clicked) { 131 | click_state = sigmoid( 132 | arguments.callee.task.iterations / repeats_click, 133 | -0.85 134 | ) 135 | } else { 136 | click_state = sigmoid( 137 | 1 - arguments.callee.task.iterations / repeats_click, 138 | 0.7 139 | ) 140 | } 141 | } 142 | } 143 | 144 | // mousing states 145 | 146 | var hover = 0 147 | var hover_in = false 148 | var click_in = false 149 | var clicked = false 150 | 151 | var last_x = 0, last_y = 0 152 | var ratio_x = 0, ratio_y = 0 153 | var click_x = 0, click_y = 0 154 | var first_drag = true 155 | 156 | function onidle(x, y, button, cmd, shift, capslock, option, ctrl) { 157 | hover = 1 158 | 159 | if (!hover_in) { 160 | hover_task.interval = interval 161 | hover_task.repeat(repeats) 162 | hover_task.execute() 163 | 164 | hover_in = true 165 | } 166 | 167 | mgraphics.redraw() 168 | } 169 | 170 | function onidleout(x, y) { 171 | hover = 0 172 | 173 | if (hover_in) { 174 | hover_task.interval = interval 175 | hover_task.repeat(repeats) 176 | hover_task.execute() 177 | 178 | hover_in = false 179 | } 180 | 181 | mgraphics.redraw() 182 | } 183 | 184 | function onclick(x, y, but, cmd, shift, capslock, option, ctrl) { 185 | max.hidecursor() 186 | 187 | if (!click_in) { 188 | clicked = true 189 | 190 | click_task.interval = interval 191 | click_task.repeat(repeats_click) 192 | click_task.execute() 193 | 194 | click_in = true 195 | } 196 | 197 | // calculate the UI zoom factor by getting the ratio of the original box size 198 | // and the current bpatcher window location affected by the zoom factor 199 | ratio_x = (patcher.wind.location[2] - patcher.wind.location[0]) / box.rect[2] 200 | ratio_y = (patcher.wind.location[3] - patcher.wind.location[1]) / box.rect[3] 201 | 202 | // store bpatcher position which will be used to calculate the cursor delta 203 | last_x = patcher.wind.location[0] 204 | last_y = patcher.wind.location[1] 205 | 206 | // get and scale relative cursor position for resetting to initial click location 207 | click_x = Math.round(patcher.wind.location[0] + x * ratio_x) 208 | click_y = Math.round(patcher.wind.location[1] + y * ratio_y) 209 | 210 | // initialize drag detection 211 | first_drag = true 212 | } 213 | 214 | function ondblclick(x, y) { 215 | if (bipolar) { 216 | value = 0.5 217 | } else { 218 | value = 0 219 | } 220 | 221 | outlet(0, value) 222 | mgraphics.redraw() 223 | } 224 | 225 | function ondrag(x, y, but, cmd, shift, capslock, option, ctrl) { 226 | var dy = 0, 227 | d2y = 0 228 | var dx = 0, 229 | d2x = 0 230 | 231 | var delta_x 232 | var delta_y 233 | 234 | if (!but) { 235 | if (click_in) { 236 | clicked = false 237 | 238 | click_task.interval = interval 239 | click_task.repeat(repeats_click) 240 | click_task.execute() 241 | 242 | click_in = false 243 | } 244 | max.pupdate(click_x, click_y) 245 | max.showcursor() 246 | 247 | mgraphics.redraw() 248 | } 249 | 250 | // ensure we get the delta after the mouse has been re-positioned 251 | if (first_drag) { 252 | if (!but) { 253 | max.pupdate(click_x, click_y) 254 | } else { 255 | max.pupdate(last_x, last_y) 256 | first_drag = false 257 | } 258 | } else { 259 | // calculate the delta between initial cursor position and after drag 260 | dx = last_x + x - last_x 261 | dy = last_y + y - last_y 262 | 263 | // increase resolution if shift modifier key is held down 264 | if (shift) { 265 | delta_x = 0.0007874015748 266 | delta_y = 0.0007874015748 267 | } else { 268 | delta_x = 0.007874015748 269 | delta_y = 0.007874015748 270 | } 271 | 272 | if (style == "slope") { 273 | delta_x *= 0.5 274 | delta_y *= 0.5 275 | } 276 | 277 | d2x = dx * delta_x 278 | d2y = dy * delta_y 279 | 280 | // add scaled delta to the output value and clamp to parameter range 281 | value = clamp(value - d2y, 0, 1) 282 | 283 | // reset cursor position if it has changed, we do this to be able to 284 | // calculate the delta from the same exact position on every drag 285 | if (dy > 0 || dy < 0 || dx > 0 || dx < 0) { 286 | max.pupdate(last_x, last_y) 287 | } 288 | 289 | mgraphics.redraw() 290 | outlet(0, value) 291 | } 292 | } 293 | 294 | function paint() { 295 | mgraphics.set_line_cap("round") 296 | mgraphics.set_line_join("round") 297 | mgraphics.set_line_width(2) 298 | 299 | with (mgraphics) { 300 | switch (style) { 301 | case "dial": 302 | set_source_rgba(inactivelcdcolor) 303 | 304 | arc( 305 | 18, 306 | 18, 307 | 12 + click_state, 308 | (50 * Math.PI) / 180, 309 | (130 * Math.PI) / 180 310 | ) 311 | stroke() 312 | 313 | get_lcdcolor(hover_state) 314 | 315 | set_line_width(2 + click_state) 316 | arc( 317 | 18, 318 | 18, 319 | 12 + click_state, 320 | (130 * Math.PI) / 180, 321 | (410 * Math.PI) / 180 322 | ) 323 | stroke() 324 | 325 | set_line_width(2 + click_state) 326 | line_to_angle(18, 18, -230 + value * 280, 0, 7) 327 | stroke() 328 | 329 | set_line_width(2) 330 | 331 | if (bipolar) { 332 | move_to(14, 3 - click_state * 2) 333 | rel_line_to(8 + click_state, 0) 334 | rel_line_to(0, 2 + click_state) 335 | rel_line_to(-4 - click_state, 4) 336 | rel_line_to(-4 - click_state, -4) 337 | rel_line_to(0, -2 - click_state) 338 | fill_preserve() 339 | 340 | set_source_rgba(lcdbgcolor) 341 | stroke() 342 | } 343 | 344 | break 345 | 346 | case "slider": 347 | set_source_rgba(inactivelcdcolor) 348 | 349 | for (i = 0; i < 5; ++i) { 350 | if (bipolar && i == 2) { 351 | rectangle(12, 7 + i * 5, 12, 2) 352 | } else { 353 | rectangle(14, 7 + i * 5, 8, 2) 354 | } 355 | fill() 356 | } 357 | 358 | get_lcdcolor(hover_state) 359 | 360 | rectangle_rounded( 361 | 11 - 1 * click_state, 362 | 24 - value * 20, 363 | 14 + 2 * click_state, 364 | 8, 365 | 4, 366 | 4 367 | ) 368 | fill() 369 | 370 | set_source_rgba(lcdbgcolor) 371 | rectangle( 372 | 14 - 1 * click_state, 373 | 27 - value * 20, 374 | 8 + 2 * click_state, 375 | 2 376 | ) 377 | fill() 378 | break 379 | 380 | case "decay": 381 | set_source_rgba(inactivelcdcolor) 382 | 383 | move_to(7 + value * 23, 29) 384 | line_to(30, 29) 385 | stroke() 386 | 387 | move_to(6, 29) 388 | rel_line_to(0, -21) 389 | stroke() 390 | 391 | get_lcdcolor(hover_state) 392 | set_line_width(2 + 1 * click_state) 393 | 394 | var x_point = 7 + value * 23 395 | 396 | move_to(6, 7) 397 | curve_to( 398 | x_point - 20 * value + 0.01, 399 | 29, 400 | x_point, 401 | 29, 402 | x_point, 403 | 29 404 | ) 405 | stroke() 406 | break 407 | 408 | case "slope": 409 | var value_bi = value * 2 - 1 410 | 411 | var value_dec = 412 | Math.abs(clamp(value_bi, -1, 0)) * 0.5 + 413 | (clamp(value, 0.5, 1) - 0.5) * 2 414 | var value_atk = Math.abs(clamp(value_bi, -1, 0)) * 0.5 415 | 416 | set_source_rgba(inactivelcdcolor) 417 | 418 | move_to(7 + value_dec * 23 + value_atk * 23, 29) 419 | line_to(30, 29) 420 | stroke() 421 | 422 | get_lcdcolor(hover_state) 423 | set_line_width(2 + 1 * click_state) 424 | 425 | move_to(6, 29) 426 | rel_line_to(value_atk * 22, -21) 427 | 428 | var x_point = 7 + value_dec * 23 + value_atk * 23 429 | 430 | move_to(6 + value_atk * 23, 7) 431 | curve_to( 432 | x_point - 20 * value_dec + 0.01, 433 | 29, 434 | x_point, 435 | 29, 436 | x_point, 437 | 29 438 | ) 439 | stroke() 440 | break 441 | 442 | case "shape": 443 | set_source_rgba(inactivelcdcolor) 444 | 445 | get_lcdcolor(hover_state) 446 | set_line_width(2 + 1 * click_state) 447 | 448 | var saw = (1 - clamp(value, 0, 0.5) * 2) * 11 449 | var pw = (clamp(value, 0.5, 1) - 0.5) * 2 * 6 450 | 451 | move_to(6, 18) 452 | rel_line_to(0, -11) 453 | rel_line_to(12 + pw, saw) 454 | rel_line_to(0, 11 - saw) 455 | rel_line_to(0, 11 - saw) 456 | rel_line_to(12 - pw, saw) 457 | rel_line_to(0, -11) 458 | stroke() 459 | 460 | break 461 | } 462 | } 463 | } 464 | 465 | // utility functions 466 | 467 | function get_lcdcolor(state) { 468 | mgraphics.set_source_rgba( 469 | mix(lcdcolor[0], hovercolor[0], state), 470 | mix(lcdcolor[1], hovercolor[1], state), 471 | mix(lcdcolor[2], hovercolor[2], state), 472 | mix(lcdcolor[3], hovercolor[3], state) 473 | ) 474 | } 475 | 476 | function sigmoid(x, y) { 477 | return (x - x * y) / (y - Math.abs(x) * 2 * y + 1) 478 | } 479 | 480 | function mix(x, y, a) { 481 | return x + a * (y - x) 482 | } 483 | 484 | function clamp(num, min, max) { 485 | return num <= min ? min : num >= max ? max : num 486 | } 487 | 488 | function line_to_angle(x, y, degrees, offset, length) { 489 | var angle = (degrees * Math.PI) / 180 490 | var cos_angle = Math.cos(angle) 491 | var sin_angle = Math.sin(angle) 492 | 493 | var x_origin = cos_angle * offset + x 494 | var y_origin = sin_angle * offset + y 495 | var x_destination = cos_angle * length + x_origin 496 | var y_destination = sin_angle * length + y_origin 497 | 498 | with (mgraphics) { 499 | move_to(x_origin, y_origin) 500 | line_to(x_destination, y_destination) 501 | } 502 | } 503 | -------------------------------------------------------------------------------- /jsui-dial.maxpat: -------------------------------------------------------------------------------- 1 | { 2 | "patcher" : { 3 | "fileversion" : 1, 4 | "appversion" : { 5 | "major" : 8, 6 | "minor" : 5, 7 | "revision" : 5, 8 | "architecture" : "x64", 9 | "modernui" : 1 10 | } 11 | , 12 | "classnamespace" : "box", 13 | "rect" : [ 517.0, 393.0, 640.0, 480.0 ], 14 | "bglocked" : 0, 15 | "openinpresentation" : 1, 16 | "default_fontsize" : 12.0, 17 | "default_fontface" : 0, 18 | "default_fontname" : "Arial", 19 | "gridonopen" : 1, 20 | "gridsize" : [ 15.0, 15.0 ], 21 | "gridsnaponopen" : 1, 22 | "objectsnaponopen" : 1, 23 | "statusbarvisible" : 2, 24 | "toolbarvisible" : 1, 25 | "lefttoolbarpinned" : 0, 26 | "toptoolbarpinned" : 0, 27 | "righttoolbarpinned" : 0, 28 | "bottomtoolbarpinned" : 0, 29 | "toolbars_unpinned_last_save" : 0, 30 | "tallnewobj" : 0, 31 | "boxanimatetime" : 200, 32 | "enablehscroll" : 1, 33 | "enablevscroll" : 1, 34 | "devicewidth" : 0.0, 35 | "description" : "", 36 | "digest" : "", 37 | "tags" : "", 38 | "style" : "", 39 | "subpatcher_template" : "", 40 | "assistshowspatchername" : 0, 41 | "boxes" : [ { 42 | "box" : { 43 | "comment" : "", 44 | "id" : "obj-3", 45 | "index" : 0, 46 | "maxclass" : "inlet", 47 | "numinlets" : 0, 48 | "numoutlets" : 1, 49 | "outlettype" : [ "" ], 50 | "patching_rect" : [ 30.0, 30.0, 30.0, 30.0 ] 51 | } 52 | 53 | } 54 | , { 55 | "box" : { 56 | "comment" : "", 57 | "id" : "obj-2", 58 | "index" : 0, 59 | "maxclass" : "outlet", 60 | "numinlets" : 1, 61 | "numoutlets" : 0, 62 | "patching_rect" : [ 30.0, 150.0, 30.0, 30.0 ] 63 | } 64 | 65 | } 66 | , { 67 | "box" : { 68 | "border" : 0, 69 | "filename" : "jsui-dial.js", 70 | "id" : "obj-1", 71 | "maxclass" : "jsui", 72 | "numinlets" : 1, 73 | "numoutlets" : 1, 74 | "outlettype" : [ "" ], 75 | "parameter_enable" : 0, 76 | "patching_rect" : [ 30.0, 90.0, 36.0, 36.0 ], 77 | "presentation" : 1, 78 | "presentation_rect" : [ 0.0, 0.0, 36.0, 36.0 ] 79 | } 80 | 81 | } 82 | ], 83 | "lines" : [ { 84 | "patchline" : { 85 | "destination" : [ "obj-2", 0 ], 86 | "source" : [ "obj-1", 0 ] 87 | } 88 | 89 | } 90 | , { 91 | "patchline" : { 92 | "destination" : [ "obj-1", 0 ], 93 | "source" : [ "obj-3", 0 ] 94 | } 95 | 96 | } 97 | ], 98 | "dependency_cache" : [ { 99 | "name" : "jsui-dial.js", 100 | "bootpath" : "~/Dev/fors/lode", 101 | "patcherrelativepath" : ".", 102 | "type" : "TEXT", 103 | "implicit" : 1 104 | } 105 | ], 106 | "autosave" : 0 107 | } 108 | 109 | } 110 | -------------------------------------------------------------------------------- /lode-alp/Lode Project/Ableton Project Info/Cache.cfg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Ableton Project Info/Cache.cfg -------------------------------------------------------------------------------- /lode-alp/Lode Project/Ableton Project Info/Project8_1.cfg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Ableton Project Info/Project8_1.cfg -------------------------------------------------------------------------------- /lode-alp/Lode Project/Icon : -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Icon -------------------------------------------------------------------------------- /lode-alp/Lode Project/Lode Lessons/Large/fors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Lode Lessons/Large/fors.png -------------------------------------------------------------------------------- /lode-alp/Lode Project/Lode Lessons/Large/fors_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Lode Lessons/Large/fors_bg.png -------------------------------------------------------------------------------- /lode-alp/Lode Project/Lode Lessons/Large/lode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Lode Lessons/Large/lode.png -------------------------------------------------------------------------------- /lode-alp/Lode Project/Lode Lessons/LessonsEN.txt: -------------------------------------------------------------------------------- 1 | $Page Lode by Fors 2 | $TargetName Lode 3 | 4 | lode.png 5 | 6 | *Lode* by $Link *Fors* 7 | 8 | Vivid memories of transistors and warm plastic from a faraway place were distilled into a single voice of what we loved most. Lode is a monophonic bass synthesizer inspired by our most beloved vintage pieces; instruments that were greater than the sum of their parts and full of charm. 9 | 10 | With simplicity there is a great reward in exploring inherent boundaries and making the most out of them. Something that may seem uncomplicated at first often reveals a depth in its subtleties and rich character. 11 | 12 | Lode is a collection of subtleties that we cherish, a humble but strong bass synth that is a joy to use. 13 | 14 | *Learn:* 15 | 16 | -> $Link Structure 17 | -> $Link Parameters 18 | 19 | Divider.tif 20 | 21 | fors.png 22 | 23 | $Comment -------------------------------------------------------------------------------- 24 | $Page Structure 25 | $TargetName Structure 26 | 27 | lode.png 28 | 29 | Lode is based on an analog-inspired engine, equipped with one unison oscillator, one sub oscillator and a resonant 4-pole lowpass filter. 30 | The unison oscillator has a variable waveshape, from saw to square with adjustable pulse width. By increasing the detune amount, a second oscillator with the same timbre will be mixed in. The sub oscillator has a static square waveshape, its output can be mixed between 1 or 2 octaves below the fundamental pitch. 31 | 32 | The filter is tuned for a rougher edge, with the capability of creating resonant overtones that can be played chromatically. This lets you dial in the filter just right to find different overtones and pockets of sound that yield a great depth in sound design. 33 | 34 | When playing Lode, it's important to note that legato notes will have a slide for that classic bassline sound. 35 | 36 | Divider.tif 37 | 38 | → $Link Parameters 39 | 40 | ↑ $Link Top 41 | 42 | $Comment -------------------------------------------------------------------------------- 43 | $Page Parameters 44 | $TargetName Parameters 45 | 46 | lode.png 47 | 48 | Lode has 8 different parameters, each controlling a different component of the synthesizer engine. 49 | 50 | *Oscillator controls* 51 | 52 | -> *Shape* 53 | 54 | This controls the waveshape of the main oscillator. 55 | Between -50 and 0 this blends between a sawtooth and a squarewave, while 0 to +50 controls the pulse width of the square. 56 | 57 | -> *Detune* 58 | 59 | This controls the amount of unison detune in the main oscillator. 60 | 61 | When increased, this brings in a second oscillator with a frequency offset. Lower values (0 to 40) will result in beatings while higher values will result in pitch ratios. At a value of 50 the offset is equivalent to 7 semitones, a perfect fifth and at a value of 100 the offset is at an octave. 62 | 63 | -> *Sub* 64 | 65 | This controls the amplitude of the sub oscillator. 66 | When increased, the first sub output is heard, which is one octave below the main oscillator. As the value is increased further, a second octave is mixed in for ultra-low bass. 67 | 68 | -> *Decay* 69 | 70 | This controls the decay time of the amp envelope. 71 | The envelope has a hold and decay stage, as a note is being held the envelope will be continually outputting sound. as the note is released, the decay stage is activated and a fade-out occurs. 72 | 73 | *Filter controls* 74 | 75 | -> *Cutoff* 76 | 77 | This controls the cutoff frequency of the lowpass filter. 78 | The lowpass filter is always tracking the frequency of the main oscillator. This means that the cutoff setting is relative, and results in a natural sound. By decreasing the cutoff frequency less harmonics will be heard in the sound, resulting a warmer tone. 79 | 80 | -> *Res* 81 | 82 | This controls the resonance amount in the lowpass filter. 83 | Increasing this will result in a peak at the cutoff frequency. 84 | 85 | -> *Sweep* 86 | 87 | This controls the time of the filter cutoff envelope and is bi-directional. 88 | Increasing the sweep time (0 .. 50) will create longer decaying sweeps while decreasing into the negative range (-50 .. 0) will make it into a slope, meaning that it will also have a fade-in segment. 89 | 90 | -> *Depth* 91 | 92 | This controls the depth of the filter envelope modulation. 93 | 94 | → $Link Credits 95 | 96 | ↑ $Link Top 97 | 98 | $Comment -------------------------------------------------------------------------------- 99 | $Page Credits 100 | $TargetName Credits 101 | 102 | fors_bg.png 103 | 104 | Thank you for the support, always. 105 | We hope you enjoy this instrument. 106 | 107 | *Credits:* 108 | 109 | Design & Development by Ess Mattisson 110 | 111 | If there are any questions, issues, or if you just want to say hello, please contact us via $Link hi@fors.fm 112 | 113 | Divider.tif 114 | 115 | ↑ $Link Top -------------------------------------------------------------------------------- /lode-alp/Lode Project/Lode Lessons/fors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Lode Lessons/fors.png -------------------------------------------------------------------------------- /lode-alp/Lode Project/Lode Lessons/fors_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Lode Lessons/fors_bg.png -------------------------------------------------------------------------------- /lode-alp/Lode Project/Lode Lessons/lode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Lode Lessons/lode.png -------------------------------------------------------------------------------- /lode-alp/Lode Project/Lode.als: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Lode.als -------------------------------------------------------------------------------- /lode-alp/Lode Project/Lode.amxd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Lode.amxd -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Classic.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Classic.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Deep.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Deep.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Detuned.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Detuned.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Dreamy.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Dreamy.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Fadein.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Fadein.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Fifth.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Fifth.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Fourth.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Fourth.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Grumpy.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Grumpy.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Harmonics.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Harmonics.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Howler.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Howler.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Huge.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Huge.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Kick.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Kick.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Laser.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Laser.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Overtone.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Overtone.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Phasey.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Phasey.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Plucky.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Plucky.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Rboken.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Rboken.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Resonant.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Resonant.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Sawtooth.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Sawtooth.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Siney.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Siney.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Softer.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Softer.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Standard.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Standard.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Twinkle.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Twinkle.adv -------------------------------------------------------------------------------- /lode-alp/Lode Project/Presets/Twosaw.adv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode Project/Presets/Twosaw.adv -------------------------------------------------------------------------------- /lode-alp/Lode.alp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-alp/Lode.alp -------------------------------------------------------------------------------- /lode-dev.amxd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/lode-dev.amxd -------------------------------------------------------------------------------- /poly.lowpass.maxpat: -------------------------------------------------------------------------------- 1 | { 2 | "patcher" : { 3 | "fileversion" : 1, 4 | "appversion" : { 5 | "major" : 8, 6 | "minor" : 5, 7 | "revision" : 5, 8 | "architecture" : "x64", 9 | "modernui" : 1 10 | } 11 | , 12 | "classnamespace" : "box", 13 | "rect" : [ 660.0, 379.0, 202.0, 191.0 ], 14 | "bglocked" : 0, 15 | "openinpresentation" : 0, 16 | "default_fontsize" : 12.0, 17 | "default_fontface" : 0, 18 | "default_fontname" : "Arial", 19 | "gridonopen" : 1, 20 | "gridsize" : [ 15.0, 15.0 ], 21 | "gridsnaponopen" : 1, 22 | "objectsnaponopen" : 1, 23 | "statusbarvisible" : 2, 24 | "toolbarvisible" : 1, 25 | "lefttoolbarpinned" : 0, 26 | "toptoolbarpinned" : 0, 27 | "righttoolbarpinned" : 0, 28 | "bottomtoolbarpinned" : 0, 29 | "toolbars_unpinned_last_save" : 0, 30 | "tallnewobj" : 0, 31 | "boxanimatetime" : 200, 32 | "enablehscroll" : 1, 33 | "enablevscroll" : 1, 34 | "devicewidth" : 0.0, 35 | "description" : "", 36 | "digest" : "", 37 | "tags" : "", 38 | "style" : "", 39 | "subpatcher_template" : "", 40 | "assistshowspatchername" : 0, 41 | "boxes" : [ { 42 | "box" : { 43 | "id" : "obj-7", 44 | "maxclass" : "newobj", 45 | "numinlets" : 1, 46 | "numoutlets" : 0, 47 | "patching_rect" : [ 30.0, 120.0, 42.0, 22.0 ], 48 | "saved_object_attributes" : { 49 | "attr_comment" : "" 50 | } 51 | , 52 | "text" : "out~ 1" 53 | } 54 | 55 | } 56 | , { 57 | "box" : { 58 | "id" : "obj-6", 59 | "maxclass" : "newobj", 60 | "numinlets" : 1, 61 | "numoutlets" : 1, 62 | "outlettype" : [ "signal" ], 63 | "patching_rect" : [ 116.0, 30.0, 35.0, 22.0 ], 64 | "saved_object_attributes" : { 65 | "attr_comment" : "" 66 | } 67 | , 68 | "text" : "in~ 3" 69 | } 70 | 71 | } 72 | , { 73 | "box" : { 74 | "id" : "obj-5", 75 | "maxclass" : "newobj", 76 | "numinlets" : 1, 77 | "numoutlets" : 1, 78 | "outlettype" : [ "signal" ], 79 | "patching_rect" : [ 73.0, 30.0, 35.0, 22.0 ], 80 | "saved_object_attributes" : { 81 | "attr_comment" : "" 82 | } 83 | , 84 | "text" : "in~ 2" 85 | } 86 | 87 | } 88 | , { 89 | "box" : { 90 | "id" : "obj-4", 91 | "maxclass" : "newobj", 92 | "numinlets" : 1, 93 | "numoutlets" : 1, 94 | "outlettype" : [ "signal" ], 95 | "patching_rect" : [ 30.0, 30.0, 35.0, 22.0 ], 96 | "saved_object_attributes" : { 97 | "attr_comment" : "" 98 | } 99 | , 100 | "text" : "in~ 1" 101 | } 102 | 103 | } 104 | , { 105 | "box" : { 106 | "id" : "obj-1", 107 | "maxclass" : "newobj", 108 | "numinlets" : 3, 109 | "numoutlets" : 1, 110 | "outlettype" : [ "signal" ], 111 | "patcher" : { 112 | "fileversion" : 1, 113 | "appversion" : { 114 | "major" : 8, 115 | "minor" : 5, 116 | "revision" : 5, 117 | "architecture" : "x64", 118 | "modernui" : 1 119 | } 120 | , 121 | "classnamespace" : "dsp.gen", 122 | "rect" : [ 790.0, 100.0, 688.0, 848.0 ], 123 | "bglocked" : 0, 124 | "openinpresentation" : 0, 125 | "default_fontsize" : 12.0, 126 | "default_fontface" : 0, 127 | "default_fontname" : "Arial", 128 | "gridonopen" : 1, 129 | "gridsize" : [ 15.0, 15.0 ], 130 | "gridsnaponopen" : 1, 131 | "objectsnaponopen" : 1, 132 | "statusbarvisible" : 2, 133 | "toolbarvisible" : 1, 134 | "lefttoolbarpinned" : 0, 135 | "toptoolbarpinned" : 0, 136 | "righttoolbarpinned" : 0, 137 | "bottomtoolbarpinned" : 0, 138 | "toolbars_unpinned_last_save" : 0, 139 | "tallnewobj" : 0, 140 | "boxanimatetime" : 200, 141 | "enablehscroll" : 1, 142 | "enablevscroll" : 1, 143 | "devicewidth" : 0.0, 144 | "description" : "", 145 | "digest" : "", 146 | "tags" : "", 147 | "style" : "", 148 | "subpatcher_template" : "", 149 | "assistshowspatchername" : 0, 150 | "boxes" : [ { 151 | "box" : { 152 | "id" : "obj-10", 153 | "maxclass" : "newobj", 154 | "numinlets" : 1, 155 | "numoutlets" : 0, 156 | "patching_rect" : [ 15.0, 810.0, 35.0, 22.0 ], 157 | "text" : "out 1" 158 | } 159 | 160 | } 161 | , { 162 | "box" : { 163 | "id" : "obj-8", 164 | "maxclass" : "newobj", 165 | "numinlets" : 0, 166 | "numoutlets" : 1, 167 | "outlettype" : [ "" ], 168 | "patching_rect" : [ 641.0, 15.0, 28.0, 22.0 ], 169 | "text" : "in 3" 170 | } 171 | 172 | } 173 | , { 174 | "box" : { 175 | "id" : "obj-7", 176 | "maxclass" : "newobj", 177 | "numinlets" : 0, 178 | "numoutlets" : 1, 179 | "outlettype" : [ "" ], 180 | "patching_rect" : [ 328.0, 15.0, 28.0, 22.0 ], 181 | "text" : "in 2" 182 | } 183 | 184 | } 185 | , { 186 | "box" : { 187 | "id" : "obj-6", 188 | "maxclass" : "newobj", 189 | "numinlets" : 0, 190 | "numoutlets" : 1, 191 | "outlettype" : [ "" ], 192 | "patching_rect" : [ 15.0, 15.0, 28.0, 22.0 ], 193 | "text" : "in 1" 194 | } 195 | 196 | } 197 | , { 198 | "box" : { 199 | "code" : "// padé approximation of tan by michael massberg\r\n\r\ntan_a(x) {\n\tx2 = x * x;\n\treturn x * (0.999999492001 + x2 * -0.096524608111) / \r\n\t(1 + x2 * (-0.429867256894 + x2 * 0.009981877999));\n}\r\n\r\n// asymmetrical nonlinearity for filter loop\r\n\r\nasym(x) {\r\n\treturn (exp(x * 1.19) - exp(-x * 1.047)) / (exp(x * 1.2) + exp(-x));\r\n}\r\n\r\n// sallen-key lowpass coefficients calculation\r\n\r\nlp_calc(cf, q) {\r\n\tT = 1 / samplerate;\n T_div_two = T / 2;\n two_div_T = 2 / T;\n\n wd = twopi * cf;\n wa = two_div_T * tan_a(wd * T_div_two);\n g = wa * T_div_two;\n G = g / (1 + g);\r\n\r\n\tK = 0.1 + ((2 - 0.1) * (q / 10));\r\n\r\n\tlpf2_beta = (K - (K * G)) / (1 + g);\n hpf1_beta = -1 / (1 + g);\n alpha = 1 / (1 - (K * G) + (K * G * G));\r\n\r\n\treturn wd, wa, g, G, K, lpf2_beta, hpf1_beta, alpha;\r\n}\r\n\r\n// sallen-key lowpass filter process\r\n\r\nlp_process(xin, wd, wa, g, G, K, lpf2_beta, hpf1_beta, alpha) {\n History z1(0), z2(0), z3(0), S35(0);\n\n v1 = (xin - z1) * G;\n lp1 = v1 + z1;\n z1 = lp1 + v1;\n\r\n\trand0 = noise() > 0.925;\r\n\trand1 = latch(noise(), delta(rand0));\r\n\trand2 = rand0 * rand1;\r\n\n u = alpha * (lp1 + S35);\r\n\tu = asym(u);\n\n v2 = (u - z2) * G;\n lp2 = v2 + z2;\n z2 = lp2 + v2;\n y = K * lp2;\n\n v3 = (y - z3) * G;\n lp3 = v3 + z3;\n z3 = lp3 + v3;\n\n S35 = (lpf2_beta * z2) + (hpf1_beta * z3);\n\n return ((K > 0) ? (y / K) : y) + rand2 * 0.0001;\n}\r\n\r\nxin = in1;\ncut = in2;\nres = in3;\r\n\r\nwd, wa, g, G, K, lpf2_beta, hpf1_beta, alpha = lp_calc(cut, res);\n\nlp0 = lp_process(xin * 0.25, wd, wa, g, G, K, lpf2_beta, hpf1_beta, alpha);\r\nlp1 = lp_process(lp0 * 0.25, wd, wa, g, G, K, lpf2_beta, hpf1_beta, alpha);\r\n\r\nout1 = lp1 / clip(res * 0.26, 1, 9);", 200 | "fontface" : 0, 201 | "fontname" : "", 202 | "fontsize" : 12.0, 203 | "id" : "obj-5", 204 | "maxclass" : "codebox", 205 | "numinlets" : 3, 206 | "numoutlets" : 1, 207 | "outlettype" : [ "" ], 208 | "patching_rect" : [ 15.0, 60.0, 645.0, 735.0 ] 209 | } 210 | 211 | } 212 | ], 213 | "lines" : [ { 214 | "patchline" : { 215 | "destination" : [ "obj-10", 0 ], 216 | "source" : [ "obj-5", 0 ] 217 | } 218 | 219 | } 220 | , { 221 | "patchline" : { 222 | "destination" : [ "obj-5", 0 ], 223 | "source" : [ "obj-6", 0 ] 224 | } 225 | 226 | } 227 | , { 228 | "patchline" : { 229 | "destination" : [ "obj-5", 1 ], 230 | "source" : [ "obj-7", 0 ] 231 | } 232 | 233 | } 234 | , { 235 | "patchline" : { 236 | "destination" : [ "obj-5", 2 ], 237 | "source" : [ "obj-8", 0 ] 238 | } 239 | 240 | } 241 | ], 242 | "saved_attribute_attributes" : { 243 | "default_plcolor" : { 244 | "expression" : "" 245 | } 246 | 247 | } 248 | 249 | } 250 | , 251 | "patching_rect" : [ 30.0, 75.0, 105.0, 22.0 ], 252 | "text" : "gen~" 253 | } 254 | 255 | } 256 | ], 257 | "lines" : [ { 258 | "patchline" : { 259 | "destination" : [ "obj-7", 0 ], 260 | "source" : [ "obj-1", 0 ] 261 | } 262 | 263 | } 264 | , { 265 | "patchline" : { 266 | "destination" : [ "obj-1", 0 ], 267 | "source" : [ "obj-4", 0 ] 268 | } 269 | 270 | } 271 | , { 272 | "patchline" : { 273 | "destination" : [ "obj-1", 1 ], 274 | "source" : [ "obj-5", 0 ] 275 | } 276 | 277 | } 278 | , { 279 | "patchline" : { 280 | "destination" : [ "obj-1", 2 ], 281 | "source" : [ "obj-6", 0 ] 282 | } 283 | 284 | } 285 | ], 286 | "saved_attribute_attributes" : { 287 | "default_plcolor" : { 288 | "expression" : "" 289 | } 290 | 291 | } 292 | 293 | } 294 | 295 | } 296 | -------------------------------------------------------------------------------- /poly.monobass.maxpat: -------------------------------------------------------------------------------- 1 | { 2 | "patcher" : { 3 | "fileversion" : 1, 4 | "appversion" : { 5 | "major" : 8, 6 | "minor" : 6, 7 | "revision" : 0, 8 | "architecture" : "x64", 9 | "modernui" : 1 10 | } 11 | , 12 | "classnamespace" : "box", 13 | "rect" : [ 341.0, 100.0, 1137.0, 751.0 ], 14 | "bglocked" : 0, 15 | "openinpresentation" : 0, 16 | "default_fontsize" : 12.0, 17 | "default_fontface" : 0, 18 | "default_fontname" : "Arial", 19 | "gridonopen" : 1, 20 | "gridsize" : [ 15.0, 15.0 ], 21 | "gridsnaponopen" : 1, 22 | "objectsnaponopen" : 1, 23 | "statusbarvisible" : 2, 24 | "toolbarvisible" : 1, 25 | "lefttoolbarpinned" : 0, 26 | "toptoolbarpinned" : 0, 27 | "righttoolbarpinned" : 0, 28 | "bottomtoolbarpinned" : 0, 29 | "toolbars_unpinned_last_save" : 0, 30 | "tallnewobj" : 0, 31 | "boxanimatetime" : 200, 32 | "enablehscroll" : 1, 33 | "enablevscroll" : 1, 34 | "devicewidth" : 0.0, 35 | "description" : "", 36 | "digest" : "", 37 | "tags" : "", 38 | "style" : "", 39 | "subpatcher_template" : "", 40 | "assistshowspatchername" : 0, 41 | "boxes" : [ { 42 | "box" : { 43 | "id" : "obj-49", 44 | "maxclass" : "newobj", 45 | "numinlets" : 1, 46 | "numoutlets" : 1, 47 | "outlettype" : [ "signal" ], 48 | "patching_rect" : [ 121.0, 322.0, 39.0, 22.0 ], 49 | "text" : "click~" 50 | } 51 | 52 | } 53 | , { 54 | "box" : { 55 | "id" : "obj-16", 56 | "maxclass" : "newobj", 57 | "numinlets" : 1, 58 | "numoutlets" : 1, 59 | "outlettype" : [ "signal" ], 60 | "patcher" : { 61 | "fileversion" : 1, 62 | "appversion" : { 63 | "major" : 8, 64 | "minor" : 6, 65 | "revision" : 0, 66 | "architecture" : "x64", 67 | "modernui" : 1 68 | } 69 | , 70 | "classnamespace" : "dsp.gen", 71 | "rect" : [ 59.0, 119.0, 451.0, 443.0 ], 72 | "bglocked" : 0, 73 | "openinpresentation" : 0, 74 | "default_fontsize" : 12.0, 75 | "default_fontface" : 0, 76 | "default_fontname" : "Arial", 77 | "gridonopen" : 1, 78 | "gridsize" : [ 15.0, 15.0 ], 79 | "gridsnaponopen" : 1, 80 | "objectsnaponopen" : 1, 81 | "statusbarvisible" : 2, 82 | "toolbarvisible" : 1, 83 | "lefttoolbarpinned" : 0, 84 | "toptoolbarpinned" : 0, 85 | "righttoolbarpinned" : 0, 86 | "bottomtoolbarpinned" : 0, 87 | "toolbars_unpinned_last_save" : 0, 88 | "tallnewobj" : 0, 89 | "boxanimatetime" : 200, 90 | "enablehscroll" : 1, 91 | "enablevscroll" : 1, 92 | "devicewidth" : 0.0, 93 | "description" : "", 94 | "digest" : "", 95 | "tags" : "", 96 | "style" : "", 97 | "subpatcher_template" : "", 98 | "assistshowspatchername" : 0, 99 | "boxes" : [ { 100 | "box" : { 101 | "id" : "obj-8", 102 | "maxclass" : "newobj", 103 | "numinlets" : 1, 104 | "numoutlets" : 0, 105 | "patching_rect" : [ 15.0, 405.0, 35.0, 22.0 ], 106 | "text" : "out 1" 107 | } 108 | 109 | } 110 | , { 111 | "box" : { 112 | "id" : "obj-7", 113 | "maxclass" : "newobj", 114 | "numinlets" : 0, 115 | "numoutlets" : 1, 116 | "outlettype" : [ "" ], 117 | "patching_rect" : [ 15.0, 15.0, 28.0, 22.0 ], 118 | "text" : "in 1" 119 | } 120 | 121 | } 122 | , { 123 | "box" : { 124 | "code" : "History phase(0);\r\n\r\ndec = 1 / (samplerate / 2);\r\n\r\nif (in1) {\r\n\tphase = 1;\r\n}\r\n\r\nif (phase > 0) {\r\n\tphase -= dec;\r\n\t\r\n\tif (phase < 0) {\r\n\t\tphase = 0;\r\n\t}\r\n}\r\n\r\nout1 = phase;", 125 | "fontface" : 0, 126 | "fontname" : "", 127 | "fontsize" : 12.0, 128 | "id" : "obj-5", 129 | "maxclass" : "codebox", 130 | "numinlets" : 1, 131 | "numoutlets" : 1, 132 | "outlettype" : [ "" ], 133 | "patching_rect" : [ 15.0, 60.0, 405.0, 315.0 ] 134 | } 135 | 136 | } 137 | ], 138 | "lines" : [ { 139 | "patchline" : { 140 | "destination" : [ "obj-8", 0 ], 141 | "source" : [ "obj-5", 0 ] 142 | } 143 | 144 | } 145 | , { 146 | "patchline" : { 147 | "destination" : [ "obj-5", 0 ], 148 | "source" : [ "obj-7", 0 ] 149 | } 150 | 151 | } 152 | ], 153 | "saved_attribute_attributes" : { 154 | "default_plcolor" : { 155 | "expression" : "" 156 | } 157 | 158 | } 159 | 160 | } 161 | , 162 | "patching_rect" : [ 121.0, 358.0, 36.0, 22.0 ], 163 | "text" : "gen~" 164 | } 165 | 166 | } 167 | , { 168 | "box" : { 169 | "id" : "obj-52", 170 | "maxclass" : "newobj", 171 | "numinlets" : 0, 172 | "numoutlets" : 2, 173 | "outlettype" : [ "bang", "bang" ], 174 | "patcher" : { 175 | "fileversion" : 1, 176 | "appversion" : { 177 | "major" : 8, 178 | "minor" : 6, 179 | "revision" : 0, 180 | "architecture" : "x64", 181 | "modernui" : 1 182 | } 183 | , 184 | "classnamespace" : "box", 185 | "rect" : [ 59.0, 119.0, 631.0, 180.0 ], 186 | "bglocked" : 0, 187 | "openinpresentation" : 0, 188 | "default_fontsize" : 12.0, 189 | "default_fontface" : 0, 190 | "default_fontname" : "Arial", 191 | "gridonopen" : 1, 192 | "gridsize" : [ 15.0, 15.0 ], 193 | "gridsnaponopen" : 1, 194 | "objectsnaponopen" : 1, 195 | "statusbarvisible" : 2, 196 | "toolbarvisible" : 1, 197 | "lefttoolbarpinned" : 0, 198 | "toptoolbarpinned" : 0, 199 | "righttoolbarpinned" : 0, 200 | "bottomtoolbarpinned" : 0, 201 | "toolbars_unpinned_last_save" : 0, 202 | "tallnewobj" : 0, 203 | "boxanimatetime" : 200, 204 | "enablehscroll" : 1, 205 | "enablevscroll" : 1, 206 | "devicewidth" : 0.0, 207 | "description" : "", 208 | "digest" : "", 209 | "tags" : "", 210 | "style" : "", 211 | "subpatcher_template" : "", 212 | "assistshowspatchername" : 0, 213 | "boxes" : [ { 214 | "box" : { 215 | "comment" : "", 216 | "id" : "obj-5", 217 | "index" : 2, 218 | "maxclass" : "outlet", 219 | "numinlets" : 1, 220 | "numoutlets" : 0, 221 | "patching_rect" : [ 75.0, 120.0, 30.0, 30.0 ] 222 | } 223 | 224 | } 225 | , { 226 | "box" : { 227 | "id" : "obj-2", 228 | "maxclass" : "newobj", 229 | "numinlets" : 1, 230 | "numoutlets" : 2, 231 | "outlettype" : [ "bang", "bang" ], 232 | "patching_rect" : [ 30.0, 75.0, 64.0, 22.0 ], 233 | "text" : "t b b" 234 | } 235 | 236 | } 237 | , { 238 | "box" : { 239 | "comment" : "", 240 | "id" : "obj-1", 241 | "index" : 1, 242 | "maxclass" : "outlet", 243 | "numinlets" : 1, 244 | "numoutlets" : 0, 245 | "patching_rect" : [ 30.0, 120.0, 30.0, 30.0 ] 246 | } 247 | 248 | } 249 | , { 250 | "box" : { 251 | "id" : "obj-9", 252 | "maxclass" : "newobj", 253 | "numinlets" : 0, 254 | "numoutlets" : 1, 255 | "outlettype" : [ "" ], 256 | "patching_rect" : [ 555.0, 30.0, 46.0, 22.0 ], 257 | "text" : "r ---ctl7" 258 | } 259 | 260 | } 261 | , { 262 | "box" : { 263 | "id" : "obj-10", 264 | "maxclass" : "newobj", 265 | "numinlets" : 0, 266 | "numoutlets" : 1, 267 | "outlettype" : [ "" ], 268 | "patching_rect" : [ 255.0, 30.0, 46.0, 22.0 ], 269 | "text" : "r ---ctl3" 270 | } 271 | 272 | } 273 | , { 274 | "box" : { 275 | "id" : "obj-12", 276 | "maxclass" : "newobj", 277 | "numinlets" : 0, 278 | "numoutlets" : 1, 279 | "outlettype" : [ "" ], 280 | "patching_rect" : [ 480.0, 30.0, 46.0, 22.0 ], 281 | "text" : "r ---ctl6" 282 | } 283 | 284 | } 285 | , { 286 | "box" : { 287 | "id" : "obj-14", 288 | "maxclass" : "newobj", 289 | "numinlets" : 0, 290 | "numoutlets" : 1, 291 | "outlettype" : [ "" ], 292 | "patching_rect" : [ 105.0, 30.0, 46.0, 22.0 ], 293 | "text" : "r ---ctl1" 294 | } 295 | 296 | } 297 | , { 298 | "box" : { 299 | "id" : "obj-6", 300 | "maxclass" : "newobj", 301 | "numinlets" : 0, 302 | "numoutlets" : 1, 303 | "outlettype" : [ "" ], 304 | "patching_rect" : [ 180.0, 30.0, 46.0, 22.0 ], 305 | "text" : "r ---ctl2" 306 | } 307 | 308 | } 309 | , { 310 | "box" : { 311 | "id" : "obj-8", 312 | "maxclass" : "newobj", 313 | "numinlets" : 0, 314 | "numoutlets" : 1, 315 | "outlettype" : [ "" ], 316 | "patching_rect" : [ 30.0, 30.0, 46.0, 22.0 ], 317 | "text" : "r ---ctl0" 318 | } 319 | 320 | } 321 | , { 322 | "box" : { 323 | "id" : "obj-4", 324 | "maxclass" : "newobj", 325 | "numinlets" : 0, 326 | "numoutlets" : 1, 327 | "outlettype" : [ "" ], 328 | "patching_rect" : [ 405.0, 30.0, 46.0, 22.0 ], 329 | "text" : "r ---ctl5" 330 | } 331 | 332 | } 333 | , { 334 | "box" : { 335 | "id" : "obj-3", 336 | "maxclass" : "newobj", 337 | "numinlets" : 0, 338 | "numoutlets" : 1, 339 | "outlettype" : [ "" ], 340 | "patching_rect" : [ 330.0, 30.0, 46.0, 22.0 ], 341 | "text" : "r ---ctl4" 342 | } 343 | 344 | } 345 | ], 346 | "lines" : [ { 347 | "patchline" : { 348 | "destination" : [ "obj-2", 0 ], 349 | "midpoints" : [ 264.5, 63.0, 39.5, 63.0 ], 350 | "source" : [ "obj-10", 0 ] 351 | } 352 | 353 | } 354 | , { 355 | "patchline" : { 356 | "destination" : [ "obj-2", 0 ], 357 | "midpoints" : [ 489.5, 63.0, 39.5, 63.0 ], 358 | "source" : [ "obj-12", 0 ] 359 | } 360 | 361 | } 362 | , { 363 | "patchline" : { 364 | "destination" : [ "obj-2", 0 ], 365 | "midpoints" : [ 114.5, 63.0, 39.5, 63.0 ], 366 | "source" : [ "obj-14", 0 ] 367 | } 368 | 369 | } 370 | , { 371 | "patchline" : { 372 | "destination" : [ "obj-1", 0 ], 373 | "source" : [ "obj-2", 0 ] 374 | } 375 | 376 | } 377 | , { 378 | "patchline" : { 379 | "destination" : [ "obj-5", 0 ], 380 | "source" : [ "obj-2", 1 ] 381 | } 382 | 383 | } 384 | , { 385 | "patchline" : { 386 | "destination" : [ "obj-2", 0 ], 387 | "midpoints" : [ 339.5, 63.0, 39.5, 63.0 ], 388 | "source" : [ "obj-3", 0 ] 389 | } 390 | 391 | } 392 | , { 393 | "patchline" : { 394 | "destination" : [ "obj-2", 0 ], 395 | "midpoints" : [ 414.5, 63.0, 39.5, 63.0 ], 396 | "source" : [ "obj-4", 0 ] 397 | } 398 | 399 | } 400 | , { 401 | "patchline" : { 402 | "destination" : [ "obj-2", 0 ], 403 | "midpoints" : [ 189.5, 63.0, 39.5, 63.0 ], 404 | "source" : [ "obj-6", 0 ] 405 | } 406 | 407 | } 408 | , { 409 | "patchline" : { 410 | "destination" : [ "obj-2", 0 ], 411 | "source" : [ "obj-8", 0 ] 412 | } 413 | 414 | } 415 | , { 416 | "patchline" : { 417 | "destination" : [ "obj-2", 0 ], 418 | "midpoints" : [ 564.5, 63.0, 39.5, 63.0 ], 419 | "source" : [ "obj-9", 0 ] 420 | } 421 | 422 | } 423 | ], 424 | "saved_attribute_attributes" : { 425 | "default_plcolor" : { 426 | "expression" : "" 427 | } 428 | 429 | } 430 | 431 | } 432 | , 433 | "patching_rect" : [ 82.0, 285.0, 58.0, 22.0 ], 434 | "saved_attribute_attributes" : { 435 | "default_plcolor" : { 436 | "expression" : "" 437 | } 438 | 439 | } 440 | , 441 | "saved_object_attributes" : { 442 | "description" : "", 443 | "digest" : "", 444 | "editing_bgcolor" : [ 0.203921568627451, 0.203921568627451, 0.215686274509804, 1.0 ], 445 | "globalpatchername" : "", 446 | "locked_bgcolor" : [ 0.203921568627451, 0.203921568627451, 0.215686274509804, 1.0 ], 447 | "tags" : "" 448 | } 449 | , 450 | "text" : "p change" 451 | } 452 | 453 | } 454 | , { 455 | "box" : { 456 | "id" : "obj-2", 457 | "maxclass" : "newobj", 458 | "numinlets" : 2, 459 | "numoutlets" : 1, 460 | "outlettype" : [ "signal" ], 461 | "patching_rect" : [ 180.0, 420.0, 40.0, 22.0 ], 462 | "text" : "==~ 0" 463 | } 464 | 465 | } 466 | , { 467 | "box" : { 468 | "id" : "obj-45", 469 | "maxclass" : "newobj", 470 | "numinlets" : 1, 471 | "numoutlets" : 1, 472 | "outlettype" : [ "bang" ], 473 | "patching_rect" : [ 52.0, 420.0, 22.0, 22.0 ], 474 | "text" : "t b" 475 | } 476 | 477 | } 478 | , { 479 | "box" : { 480 | "id" : "obj-44", 481 | "maxclass" : "newobj", 482 | "numinlets" : 1, 483 | "numoutlets" : 0, 484 | "patching_rect" : [ 240.0, 585.0, 42.0, 22.0 ], 485 | "saved_object_attributes" : { 486 | "attr_comment" : "" 487 | } 488 | , 489 | "text" : "out~ 1" 490 | } 491 | 492 | } 493 | , { 494 | "box" : { 495 | "id" : "obj-40", 496 | "maxclass" : "newobj", 497 | "numinlets" : 1, 498 | "numoutlets" : 1, 499 | "outlettype" : [ "" ], 500 | "patching_rect" : [ 474.0, 45.0, 28.0, 22.0 ], 501 | "saved_object_attributes" : { 502 | "attr_comment" : "" 503 | } 504 | , 505 | "text" : "in 2" 506 | } 507 | 508 | } 509 | , { 510 | "box" : { 511 | "id" : "obj-38", 512 | "maxclass" : "newobj", 513 | "numinlets" : 1, 514 | "numoutlets" : 1, 515 | "outlettype" : [ "" ], 516 | "patching_rect" : [ 240.0, 45.0, 28.0, 22.0 ], 517 | "saved_object_attributes" : { 518 | "attr_comment" : "" 519 | } 520 | , 521 | "text" : "in 1" 522 | } 523 | 524 | } 525 | , { 526 | "box" : { 527 | "id" : "obj-60", 528 | "maxclass" : "message", 529 | "numinlets" : 2, 530 | "numoutlets" : 1, 531 | "outlettype" : [ "" ], 532 | "patching_rect" : [ 144.0, 480.0, 59.0, 22.0 ], 533 | "text" : "mute 1, 1" 534 | } 535 | 536 | } 537 | , { 538 | "box" : { 539 | "id" : "obj-30", 540 | "maxclass" : "message", 541 | "numinlets" : 2, 542 | "numoutlets" : 1, 543 | "outlettype" : [ "" ], 544 | "patching_rect" : [ 52.0, 480.0, 59.0, 22.0 ], 545 | "text" : "mute 0, 1" 546 | } 547 | 548 | } 549 | , { 550 | "box" : { 551 | "id" : "obj-31", 552 | "maxclass" : "newobj", 553 | "numinlets" : 1, 554 | "numoutlets" : 2, 555 | "outlettype" : [ "bang", "bang" ], 556 | "patching_rect" : [ 121.0, 420.0, 42.0, 22.0 ], 557 | "text" : "edge~" 558 | } 559 | 560 | } 561 | , { 562 | "box" : { 563 | "id" : "obj-33", 564 | "maxclass" : "newobj", 565 | "numinlets" : 1, 566 | "numoutlets" : 0, 567 | "patching_rect" : [ 52.0, 585.0, 35.0, 22.0 ], 568 | "saved_object_attributes" : { 569 | "attr_comment" : "" 570 | } 571 | , 572 | "text" : "out 1" 573 | } 574 | 575 | } 576 | , { 577 | "box" : { 578 | "id" : "obj-34", 579 | "maxclass" : "newobj", 580 | "numinlets" : 1, 581 | "numoutlets" : 3, 582 | "outlettype" : [ "int", "int", "int" ], 583 | "patching_rect" : [ 52.0, 529.0, 56.0, 22.0 ], 584 | "text" : "thispoly~" 585 | } 586 | 587 | } 588 | , { 589 | "box" : { 590 | "id" : "obj-27", 591 | "maxclass" : "newobj", 592 | "numinlets" : 1, 593 | "numoutlets" : 1, 594 | "outlettype" : [ "signal" ], 595 | "patching_rect" : [ 474.0, 285.0, 31.0, 22.0 ], 596 | "text" : "sig~" 597 | } 598 | 599 | } 600 | , { 601 | "box" : { 602 | "id" : "obj-18", 603 | "maxclass" : "newobj", 604 | "numinlets" : 2, 605 | "numoutlets" : 1, 606 | "outlettype" : [ "signal" ], 607 | "patching_rect" : [ 240.0, 529.0, 40.0, 22.0 ], 608 | "text" : "*~ 2.4" 609 | } 610 | 611 | } 612 | , { 613 | "box" : { 614 | "addpoints_with_curve" : [ 0.0, 0.0, 0, 0.0, 0.5, 0.5, 0, -0.6, 1.0, 1.0, 0, 0.6 ], 615 | "classic_curve" : 1, 616 | "domain" : 1.0, 617 | "gridstep_x" : 1.0, 618 | "id" : "obj-42", 619 | "maxclass" : "function", 620 | "mode" : 1, 621 | "numinlets" : 1, 622 | "numoutlets" : 4, 623 | "outlettype" : [ "float", "", "", "bang" ], 624 | "parameter_enable" : 0, 625 | "patching_rect" : [ 1740.0, 120.0, 195.0, 105.0 ] 626 | } 627 | 628 | } 629 | , { 630 | "box" : { 631 | "addpoints_with_curve" : [ 0.0, 0.0, 0, 0.0, 0.5, 0.583333333333333, 0, 0.6, 0.75, 0.75, 0, 0.3, 0.887978142076503, 0.95, 0, 0.0, 1.0, 1.0, 0, -0.5 ], 632 | "classic_curve" : 1, 633 | "domain" : 1.0, 634 | "gridstep_x" : 1.0, 635 | "id" : "obj-41", 636 | "maxclass" : "function", 637 | "mode" : 1, 638 | "numinlets" : 1, 639 | "numoutlets" : 4, 640 | "outlettype" : [ "float", "", "", "bang" ], 641 | "parameter_enable" : 0, 642 | "patching_rect" : [ 705.0, 120.0, 195.0, 105.0 ] 643 | } 644 | 645 | } 646 | , { 647 | "box" : { 648 | "id" : "obj-28", 649 | "maxclass" : "newobj", 650 | "numinlets" : 2, 651 | "numoutlets" : 1, 652 | "outlettype" : [ "signal" ], 653 | "patching_rect" : [ 240.0, 480.0, 97.0, 22.0 ], 654 | "text" : "*~ 0." 655 | } 656 | 657 | } 658 | , { 659 | "box" : { 660 | "id" : "obj-24", 661 | "maxclass" : "newobj", 662 | "numinlets" : 3, 663 | "numoutlets" : 1, 664 | "outlettype" : [ "signal" ], 665 | "patching_rect" : [ 240.0, 420.0, 253.0, 22.0 ], 666 | "text" : "poly~ poly.lowpass up 2" 667 | } 668 | 669 | } 670 | , { 671 | "box" : { 672 | "addpoints_with_curve" : [ 0.0, 0.0, 0, 0.0, 1.0, 1.0, 0, 0.7 ], 673 | "classic_curve" : 1, 674 | "domain" : 1.0, 675 | "gridstep_x" : 1.0, 676 | "id" : "obj-26", 677 | "maxclass" : "function", 678 | "mode" : 1, 679 | "numinlets" : 1, 680 | "numoutlets" : 4, 681 | "outlettype" : [ "float", "", "", "bang" ], 682 | "parameter_enable" : 0, 683 | "patching_rect" : [ 1185.0, 120.0, 195.0, 105.0 ] 684 | } 685 | 686 | } 687 | , { 688 | "box" : { 689 | "addpoints_with_curve" : [ 0.0, 0.0, 0, 0.0, 0.45, 0.5, 0, -0.5, 0.5, 0.5, 0, -0.5, 0.55, 0.5, 0, 0.0, 1.0, 1.0, 0, -0.4 ], 690 | "classic_curve" : 1, 691 | "domain" : 1.0, 692 | "gridstep_x" : 1.0, 693 | "id" : "obj-19", 694 | "maxclass" : "function", 695 | "mode" : 1, 696 | "numinlets" : 1, 697 | "numoutlets" : 4, 698 | "outlettype" : [ "float", "", "", "bang" ], 699 | "parameter_enable" : 0, 700 | "patching_rect" : [ 945.0, 120.0, 195.0, 105.0 ] 701 | } 702 | 703 | } 704 | , { 705 | "box" : { 706 | "addpoints_with_curve" : [ 0.0, 0.0, 0, 0.0, 1.0, 1.0, 0, -0.5 ], 707 | "classic_curve" : 1, 708 | "domain" : 1.0, 709 | "gridstep_x" : 1.0, 710 | "id" : "obj-17", 711 | "maxclass" : "function", 712 | "mode" : 1, 713 | "numinlets" : 1, 714 | "numoutlets" : 4, 715 | "outlettype" : [ "float", "", "", "bang" ], 716 | "parameter_enable" : 0, 717 | "patching_rect" : [ 1500.0, 120.0, 195.0, 105.0 ] 718 | } 719 | 720 | } 721 | , { 722 | "box" : { 723 | "id" : "obj-9", 724 | "maxclass" : "newobj", 725 | "numinlets" : 0, 726 | "numoutlets" : 1, 727 | "outlettype" : [ "" ], 728 | "patching_rect" : [ 1965.0, 45.0, 46.0, 22.0 ], 729 | "text" : "r ---ctl7" 730 | } 731 | 732 | } 733 | , { 734 | "box" : { 735 | "id" : "obj-10", 736 | "maxclass" : "newobj", 737 | "numinlets" : 0, 738 | "numoutlets" : 1, 739 | "outlettype" : [ "" ], 740 | "patching_rect" : [ 1185.0, 45.0, 46.0, 22.0 ], 741 | "text" : "r ---ctl3" 742 | } 743 | 744 | } 745 | , { 746 | "box" : { 747 | "id" : "obj-12", 748 | "maxclass" : "newobj", 749 | "numinlets" : 0, 750 | "numoutlets" : 1, 751 | "outlettype" : [ "" ], 752 | "patching_rect" : [ 1740.0, 45.0, 46.0, 22.0 ], 753 | "text" : "r ---ctl6" 754 | } 755 | 756 | } 757 | , { 758 | "box" : { 759 | "id" : "obj-14", 760 | "maxclass" : "newobj", 761 | "numinlets" : 0, 762 | "numoutlets" : 1, 763 | "outlettype" : [ "" ], 764 | "patching_rect" : [ 705.0, 45.0, 46.0, 22.0 ], 765 | "text" : "r ---ctl1" 766 | } 767 | 768 | } 769 | , { 770 | "box" : { 771 | "id" : "obj-6", 772 | "maxclass" : "newobj", 773 | "numinlets" : 0, 774 | "numoutlets" : 1, 775 | "outlettype" : [ "" ], 776 | "patching_rect" : [ 945.0, 45.0, 46.0, 22.0 ], 777 | "text" : "r ---ctl2" 778 | } 779 | 780 | } 781 | , { 782 | "box" : { 783 | "id" : "obj-8", 784 | "maxclass" : "newobj", 785 | "numinlets" : 0, 786 | "numoutlets" : 1, 787 | "outlettype" : [ "" ], 788 | "patching_rect" : [ 585.0, 45.0, 46.0, 22.0 ], 789 | "text" : "r ---ctl0" 790 | } 791 | 792 | } 793 | , { 794 | "box" : { 795 | "id" : "obj-4", 796 | "maxclass" : "newobj", 797 | "numinlets" : 0, 798 | "numoutlets" : 1, 799 | "outlettype" : [ "" ], 800 | "patching_rect" : [ 1500.0, 45.0, 46.0, 22.0 ], 801 | "text" : "r ---ctl5" 802 | } 803 | 804 | } 805 | , { 806 | "box" : { 807 | "id" : "obj-3", 808 | "maxclass" : "newobj", 809 | "numinlets" : 0, 810 | "numoutlets" : 1, 811 | "outlettype" : [ "" ], 812 | "patching_rect" : [ 1410.0, 45.0, 46.0, 22.0 ], 813 | "text" : "r ---ctl4" 814 | } 815 | 816 | } 817 | , { 818 | "box" : { 819 | "id" : "obj-43", 820 | "maxclass" : "message", 821 | "numinlets" : 2, 822 | "numoutlets" : 1, 823 | "outlettype" : [ "" ], 824 | "patching_rect" : [ 1740.0, 285.0, 48.0, 22.0 ], 825 | "text" : "fdec $1" 826 | } 827 | 828 | } 829 | , { 830 | "box" : { 831 | "id" : "obj-39", 832 | "maxclass" : "toggle", 833 | "numinlets" : 1, 834 | "numoutlets" : 1, 835 | "outlettype" : [ "int" ], 836 | "parameter_enable" : 0, 837 | "patching_rect" : [ 396.0, 206.0, 24.0, 24.0 ] 838 | } 839 | 840 | } 841 | , { 842 | "box" : { 843 | "id" : "obj-37", 844 | "maxclass" : "newobj", 845 | "numinlets" : 1, 846 | "numoutlets" : 1, 847 | "outlettype" : [ "signal" ], 848 | "patching_rect" : [ 396.0, 285.0, 31.0, 22.0 ], 849 | "text" : "sig~" 850 | } 851 | 852 | } 853 | , { 854 | "box" : { 855 | "id" : "obj-36", 856 | "maxclass" : "newobj", 857 | "numinlets" : 2, 858 | "numoutlets" : 2, 859 | "outlettype" : [ "bang", "" ], 860 | "patching_rect" : [ 303.0, 206.0, 34.0, 22.0 ], 861 | "text" : "sel 0" 862 | } 863 | 864 | } 865 | , { 866 | "box" : { 867 | "id" : "obj-32", 868 | "maxclass" : "newobj", 869 | "numinlets" : 1, 870 | "numoutlets" : 2, 871 | "outlettype" : [ "int", "int" ], 872 | "patching_rect" : [ 240.0, 104.0, 175.0, 22.0 ], 873 | "text" : "unpack" 874 | } 875 | 876 | } 877 | , { 878 | "box" : { 879 | "id" : "obj-29", 880 | "maxclass" : "newobj", 881 | "numinlets" : 2, 882 | "numoutlets" : 2, 883 | "outlettype" : [ "int", "int" ], 884 | "patching_rect" : [ 240.0, 142.0, 175.0, 22.0 ], 885 | "text" : "ddg.mono @legatomode 1" 886 | } 887 | 888 | } 889 | , { 890 | "box" : { 891 | "id" : "obj-25", 892 | "maxclass" : "message", 893 | "numinlets" : 2, 894 | "numoutlets" : 1, 895 | "outlettype" : [ "" ], 896 | "patching_rect" : [ 945.0, 285.0, 45.0, 22.0 ], 897 | "text" : "sub $1" 898 | } 899 | 900 | } 901 | , { 902 | "box" : { 903 | "id" : "obj-15", 904 | "maxclass" : "message", 905 | "numinlets" : 2, 906 | "numoutlets" : 1, 907 | "outlettype" : [ "" ], 908 | "patching_rect" : [ 585.0, 285.0, 58.0, 22.0 ], 909 | "text" : "shape $1" 910 | } 911 | 912 | } 913 | , { 914 | "box" : { 915 | "id" : "obj-13", 916 | "maxclass" : "message", 917 | "numinlets" : 2, 918 | "numoutlets" : 1, 919 | "outlettype" : [ "" ], 920 | "patching_rect" : [ 705.0, 285.0, 62.0, 22.0 ], 921 | "text" : "detune $1" 922 | } 923 | 924 | } 925 | , { 926 | "box" : { 927 | "id" : "obj-11", 928 | "maxclass" : "message", 929 | "numinlets" : 2, 930 | "numoutlets" : 1, 931 | "outlettype" : [ "" ], 932 | "patching_rect" : [ 1965.0, 285.0, 61.0, 22.0 ], 933 | "text" : "fil_dep $1" 934 | } 935 | 936 | } 937 | , { 938 | "box" : { 939 | "id" : "obj-7", 940 | "maxclass" : "message", 941 | "numinlets" : 2, 942 | "numoutlets" : 1, 943 | "outlettype" : [ "" ], 944 | "patching_rect" : [ 1185.0, 285.0, 45.0, 22.0 ], 945 | "text" : "dec $1" 946 | } 947 | 948 | } 949 | , { 950 | "box" : { 951 | "id" : "obj-23", 952 | "maxclass" : "message", 953 | "numinlets" : 2, 954 | "numoutlets" : 1, 955 | "outlettype" : [ "" ], 956 | "patching_rect" : [ 1500.0, 289.0, 42.0, 22.0 ], 957 | "text" : "res $1" 958 | } 959 | 960 | } 961 | , { 962 | "box" : { 963 | "id" : "obj-22", 964 | "maxclass" : "newobj", 965 | "numinlets" : 1, 966 | "numoutlets" : 1, 967 | "outlettype" : [ "signal" ], 968 | "patching_rect" : [ 318.0, 285.0, 39.0, 22.0 ], 969 | "text" : "click~" 970 | } 971 | 972 | } 973 | , { 974 | "box" : { 975 | "id" : "obj-21", 976 | "maxclass" : "newobj", 977 | "numinlets" : 1, 978 | "numoutlets" : 1, 979 | "outlettype" : [ "bang" ], 980 | "patching_rect" : [ 318.0, 253.0, 22.0, 22.0 ], 981 | "text" : "t b" 982 | } 983 | 984 | } 985 | , { 986 | "box" : { 987 | "id" : "obj-5", 988 | "maxclass" : "message", 989 | "numinlets" : 2, 990 | "numoutlets" : 1, 991 | "outlettype" : [ "" ], 992 | "patching_rect" : [ 1410.0, 289.0, 41.0, 22.0 ], 993 | "text" : "cut $1" 994 | } 995 | 996 | } 997 | , { 998 | "box" : { 999 | "id" : "obj-1", 1000 | "maxclass" : "newobj", 1001 | "numinlets" : 4, 1002 | "numoutlets" : 4, 1003 | "outlettype" : [ "signal", "signal", "signal", "signal" ], 1004 | "patcher" : { 1005 | "fileversion" : 1, 1006 | "appversion" : { 1007 | "major" : 8, 1008 | "minor" : 6, 1009 | "revision" : 0, 1010 | "architecture" : "x64", 1011 | "modernui" : 1 1012 | } 1013 | , 1014 | "classnamespace" : "dsp.gen", 1015 | "rect" : [ 494.0, 100.0, 861.0, 848.0 ], 1016 | "bglocked" : 0, 1017 | "openinpresentation" : 0, 1018 | "default_fontsize" : 12.0, 1019 | "default_fontface" : 0, 1020 | "default_fontname" : "Arial", 1021 | "gridonopen" : 1, 1022 | "gridsize" : [ 15.0, 15.0 ], 1023 | "gridsnaponopen" : 1, 1024 | "objectsnaponopen" : 1, 1025 | "statusbarvisible" : 2, 1026 | "toolbarvisible" : 1, 1027 | "lefttoolbarpinned" : 0, 1028 | "toptoolbarpinned" : 0, 1029 | "righttoolbarpinned" : 0, 1030 | "bottomtoolbarpinned" : 0, 1031 | "toolbars_unpinned_last_save" : 0, 1032 | "tallnewobj" : 0, 1033 | "boxanimatetime" : 200, 1034 | "enablehscroll" : 1, 1035 | "enablevscroll" : 1, 1036 | "devicewidth" : 0.0, 1037 | "description" : "", 1038 | "digest" : "", 1039 | "tags" : "", 1040 | "style" : "", 1041 | "subpatcher_template" : "", 1042 | "assistshowspatchername" : 0, 1043 | "boxes" : [ { 1044 | "box" : { 1045 | "id" : "obj-8", 1046 | "maxclass" : "newobj", 1047 | "numinlets" : 0, 1048 | "numoutlets" : 1, 1049 | "outlettype" : [ "" ], 1050 | "patching_rect" : [ 656.0, 15.0, 28.0, 22.0 ], 1051 | "text" : "in 4" 1052 | } 1053 | 1054 | } 1055 | , { 1056 | "box" : { 1057 | "id" : "obj-1", 1058 | "maxclass" : "newobj", 1059 | "numinlets" : 0, 1060 | "numoutlets" : 1, 1061 | "outlettype" : [ "" ], 1062 | "patching_rect" : [ 442.333333333333314, 15.0, 28.0, 22.0 ], 1063 | "text" : "in 3" 1064 | } 1065 | 1066 | } 1067 | , { 1068 | "box" : { 1069 | "id" : "obj-9", 1070 | "maxclass" : "newobj", 1071 | "numinlets" : 0, 1072 | "numoutlets" : 1, 1073 | "outlettype" : [ "" ], 1074 | "patching_rect" : [ 228.666666666666657, 15.0, 28.0, 22.0 ], 1075 | "text" : "in 2" 1076 | } 1077 | 1078 | } 1079 | , { 1080 | "box" : { 1081 | "id" : "obj-4", 1082 | "maxclass" : "newobj", 1083 | "numinlets" : 1, 1084 | "numoutlets" : 0, 1085 | "patching_rect" : [ 656.0, 810.0, 35.0, 22.0 ], 1086 | "text" : "out 4" 1087 | } 1088 | 1089 | } 1090 | , { 1091 | "box" : { 1092 | "id" : "obj-3", 1093 | "maxclass" : "newobj", 1094 | "numinlets" : 1, 1095 | "numoutlets" : 0, 1096 | "patching_rect" : [ 442.333333333333314, 810.0, 35.0, 22.0 ], 1097 | "text" : "out 3" 1098 | } 1099 | 1100 | } 1101 | , { 1102 | "box" : { 1103 | "id" : "obj-2", 1104 | "maxclass" : "newobj", 1105 | "numinlets" : 1, 1106 | "numoutlets" : 0, 1107 | "patching_rect" : [ 228.666666666666657, 810.0, 35.0, 22.0 ], 1108 | "text" : "out 2" 1109 | } 1110 | 1111 | } 1112 | , { 1113 | "box" : { 1114 | "id" : "obj-7", 1115 | "maxclass" : "newobj", 1116 | "numinlets" : 0, 1117 | "numoutlets" : 1, 1118 | "outlettype" : [ "" ], 1119 | "patching_rect" : [ 15.0, 15.0, 28.0, 22.0 ], 1120 | "text" : "in 1" 1121 | } 1122 | 1123 | } 1124 | , { 1125 | "box" : { 1126 | "id" : "obj-6", 1127 | "maxclass" : "newobj", 1128 | "numinlets" : 1, 1129 | "numoutlets" : 0, 1130 | "patching_rect" : [ 15.0, 810.0, 35.0, 22.0 ], 1131 | "text" : "out 1" 1132 | } 1133 | 1134 | } 1135 | , { 1136 | "box" : { 1137 | "code" : "// attack-release envelope \r\n\r\nar(trig, gate, attack, release) {\n\tHistory env(0), stage(0),\n\t\t\tatk_rate(0), atk_coeff(0), atk_offset(0),\n\t\t\trel_rate(0), rel_coeff(0), rel_offset(0);\n\t\t\r\n\tif (trig) {\r\n\t\t// rate in seconds\n\t\tatk_rate = samplerate * attack;\n\t\trel_rate = samplerate * release;\n\t\t\n\t\t// slope 0 = linear, slope -n = log/exp\n\t\trel_slope = exp(-8);\n\t\t\n\t\t// calculate coefficients\n\t\tatk_offset = 1 / atk_rate;\n\t\t\n\t\trel_coeff = exp(-log((1 + rel_slope) / rel_slope) / rel_rate);\n\t\trel_offset = -rel_slope * (1 - rel_coeff);\n\t\t\n\t\t// reset & trigger envelope\n\t\tstage = 1;\n\t}\t\n\n\t// stage 0 = idle, 1 = attack, 2 = decay\n\tif (stage == 0) {\n\t\tenv = 0;\n\t} else if (stage == 1) {\n\t\tenv = atk_offset + env;\r\n\t\t\r\n\t\tif (!gate) {\r\n\t\t\tstage = 2;\r\n\t\t}\n\t\t\n\t\tif (env >= 1 || attack <= 0) {\n\t\t\tenv = 1;\n\t\t\tstage = 2;\n\t\t}\r\n\t} else {\n\t\tenv = rel_offset + env * rel_coeff;\n\t\t\n\t\tif (env <= 0 || release <= 0) {\n\t\t\tenv = 0;\n\t\t\tstage = 0;\n\t\t}\r\n\t}\n\treturn env;\n}\r\n\r\n// attack-hold-release envelope\r\n\r\nahr(trig, gate, attack, release) {\n\tHistory env(0), stage(0), trigged(0), gating(0),\n\t\t\tatk_rate(0), atk_coeff(0), atk_offset(0),\n\t\t\trel_rate(0), rel_coeff(0), rel_offset(0);\n\t\t\r\n\tif (trig) {\r\n\t\tif (gate && trigged) {\r\n\t\t\t// do nothing\r\n\t\t} else {\r\n\t\t\ttrigged = 1;\r\n\t\t\t\r\n\t\t\t// rate in seconds\n\t\t\tatk_rate = samplerate * attack;\n\t\t\trel_rate = samplerate * release;\n\t\t\n\t\t\t// slope 0 = linear, slope -n = log/exp\n\t\t\trel_slope = exp(-8);\n\t\t\n\t\t\t// calculate coefficients\r\n\t\t\tatk_offset = 1 / atk_rate;\n\t\t\n\t\t\trel_coeff = exp(-log((1 + rel_slope) / rel_slope) / rel_rate);\n\t\t\trel_offset = -rel_slope * (1 - rel_coeff);\n\t\t\n\t\t\t// reset & trigger envelope\n\t\t\tstage = 1;\r\n\t\t}\n\t}\t\n\n\t// stage 0 = idle, 1 = attack, 2 = decay\n\tif (stage == 0) {\n\t\tenv = 0;\n\t} else if (gate && trigged) {\r\n \t\tif (stage == 1) {\n\t\t\tenv = atk_offset + env;\n\t\t\n\t\t\tif (env >= 1 || attack <= 0) {\n\t\t\t\tenv = 1;\n\t\t\t\tstage = 2;\n\t\t\t}\r\n\t\t} else {\n\t\t\tenv = env;\n\t\t}\r\n\t} else {\r\n\t\ttrigged = 0;\r\n\t\t\n\t\tenv = rel_offset + env * rel_coeff;\n\t\t\n\t\tif (env <= 0 || release <= 0) {\n\t\t\tenv = 0;\n\t\t\tstage = 0;\n\t\t}\r\n\t} \n\treturn env, trigged;\n}\r\n\r\n// branchless phasor\r\n\r\nph(freq) {\r\n\tHistory phase(0);\r\n\t\r\n\tinc = freq / samplerate;\r\n\t\r\n\tphase += inc;\r\n\tphase -= phase >= 1;\r\n\t\r\n\treturn phase;\r\n}\r\n\r\n// frequency-compensated phase modulation operator\r\n\r\nop(freq, mult, ph, pm, fb) {\r\n\tHistory fbk(0), osc(0);\r\n\t\r\n\tratio = freq * mult;\r\n\t\r\n\tnorm_freq = (ratio) / samplerate;\r\n\tfb_factor = 13 * pow(0.5 - norm_freq, 4);\r\n\t\r\n\tphase = ph(ratio);\r\n\tosc = cycle((phase - 0.25 + ph) + fbk + pm, index = \"phase\");\r\n\t\r\n\tif (fb > 0) {\r\n\t\tfbk = mix(osc * (fb * fb_factor), fbk, 0.5);\r\n\t}\r\n\tif (fb < 0) {\r\n\t\tfbk = mix((osc * osc) * (fb * fb_factor), fbk, 0.5);\r\n\t}\r\n\t\r\n\treturn osc;\r\n}\r\n\r\n// pm-based squarewave oscillator with adjustable duty\r\n\r\npulse(freq, width, factor) {\r\n\tHistory pw, pwm, osc;\r\n\t\r\n\twidth = width + 0.02;\r\n\t\r\n\tpw = op(freq, -1, 0.40, 0, 0) * width * factor;\r\n\tpulse = op(freq, 2, 0, pw * 0.8, 0.375) * 0.145 * factor;\r\n\tosc = op(freq, 1, 0, pulse + pw * 0.41, -0.24);\r\n\t\r\n\treturn osc;\r\n}\r\n\r\n// pm-based sawtooth oscillator\r\n\r\nsaw(freq, width, factor) {\r\n\tHistory osc;\r\n\t\r\n\tshaper = op(freq, 1, 0.0795, 0, 0.4) * 0.2 * factor;\r\n\tosc = op(freq, 1, 0.0795, shaper, 0.3);\r\n\t\r\n\treturn osc;\r\n}\r\n\r\n// onepole smoother for event rate signals\r\n\r\nsmooth(x, time) { \n History prev;\n prev = prev + time * (x - prev); \n\n return prev;\n}\r\n\r\nParam \tcut, res, fil_dep,\r\n\t\tshape, sub, detune, slide,\r\n\t\tatk, dec, fdec;\r\n\r\nHistory slide_time;\r\n\r\n// inputs\r\n\r\nnote = in1;\r\ntrig = in2;\r\ngate = in3;\r\nbend = in4;\r\n\r\n// parameters\r\n\r\ncut_ = smooth(cut * 127, 0.005);\r\nres_ = smooth(res * 8.3 + 1, 0.005);\r\nshape_ = smooth(shape, 0.005);\r\nsub_ = smooth(sub, 0.005);\r\n\r\ndetune_hz = smooth(detune * 128, 0.005);\r\ndetune_note = smooth(detune * 12, 0.005);\r\ndetune_type = (clip(detune, 0.05, 0.1) - 0.05) * 20;\r\n\r\nfdec_uni = fdec * 2 - 1;\r\nfatk = abs(clip(fdec_uni, -1, 0)) * 8;\r\nfatk = smooth(fatk + 0.004, 0.005);\r\n\r\ndec_ = smooth(dec * 16 + 0.01, 0.005);\r\nfdec_ = smooth(abs(fdec_uni) * 32 + 0.01, 0.005);\r\n\r\nshape_mix = clip(shape_, 0, 0.5) * 2;\r\npulse_width = (clip(shape_, 0.5, 1) - 0.5) * 2;\r\n\r\ndetune_mix = smooth(clip(detune_note, 0, 0.0001) * 10000, 0.0001);\r\n\r\nsub_oct1_mix = clip(sub_, 0, 0.5) * 2;\r\nsub_oct2_mix = (clip(sub_, 0.5, 1) - 0.5) * 2;\r\n\r\n// envelopes\r\n\r\namp_env, trig_state = ahr(trig, gate, 0.004, dec_);\r\nfil_env = ar(trig, gate, fatk, fdec_);\r\n\r\n// frequency calculations\r\n\r\nnote = note + (bend * 48);\r\n\r\nlast_note = latch(note, delta(trig_state) > 0);\r\nslide_ms = mstosamps(24);\r\n\r\nif (trig_state) {\r\n\tif (note != last_note) {\r\n\t\tslide_time = slide_ms;\r\n\t}\r\n} else {\r\n\tslide_time = 0;\r\n}\r\n\r\nnote_ = slide(note, slide_time, slide_time);\r\n\r\nfreq = mtof(note_);\r\n\r\nfreq_detune = mtof(note_ + detune_note * detune_type) + detune_hz * (1 - detune_type);\r\nfreq_sub_oct1 = mtof(note_ - 12);\r\nfreq_sub_oct2 = mtof(note_ - 24);\r\n\r\nfil_dep_ = smooth(fil_dep * 127, 0.005);\r\n\r\ncutoff = mtof(smooth(cut_, 0.005) + (note_ - 24) + fil_env * fil_dep_);\r\ncutoff = clip(cutoff, 1, samplerate / 2 - 500);\r\n\r\nnorm_freq = freq / samplerate;\r\nnorm_freq_detune = freq_detune / samplerate;\r\nnorm_freq_sub = freq_sub_oct1 / samplerate;\r\n\r\npm_factor = 14 * pow(0.5 - norm_freq, 4);\r\npm_factor_detune = 14 * pow(0.5 - norm_freq_detune, 4);\r\npm_factor_sub = 14 * pow(0.5 - norm_freq_sub, 4);\r\n\r\n// oscillators\r\n\r\nosc_pulse = pulse(freq, pulse_width, pm_factor);\r\nosc_pulse_detune = pulse(freq_detune, pulse_width, pm_factor_detune);\r\n\r\npulse_mix = osc_pulse + osc_pulse_detune * detune_mix;\r\n\r\nosc_saw = saw(freq, 0, pm_factor);\r\nosc_saw_detune = saw(freq_detune, 0, pm_factor_detune);\r\n\r\nsaw_mix = osc_saw + osc_saw_detune * detune_mix;\r\n\r\nosc_sub_oct1 = pulse(freq_sub_oct1, 0, pm_factor_sub);\r\nosc_sub_oct2 = pulse(freq_sub_oct2, 0, pm_factor_sub);\r\n\r\nsub_mix = mix(osc_sub_oct1 * sub_oct1_mix, osc_sub_oct2, sub_oct2_mix);\r\nosc_mix = mix(saw_mix, pulse_mix, shape_mix) + sub_mix;\r\n\r\nout1 = osc_mix;\r\nout2 = amp_env;\r\nout3 = cutoff;\r\nout4 = res_;", 1138 | "fontface" : 0, 1139 | "fontname" : "", 1140 | "fontsize" : 12.0, 1141 | "id" : "obj-5", 1142 | "maxclass" : "codebox", 1143 | "numinlets" : 4, 1144 | "numoutlets" : 4, 1145 | "outlettype" : [ "", "", "", "" ], 1146 | "patching_rect" : [ 15.0, 45.0, 660.0, 750.0 ] 1147 | } 1148 | 1149 | } 1150 | ], 1151 | "lines" : [ { 1152 | "patchline" : { 1153 | "destination" : [ "obj-5", 2 ], 1154 | "source" : [ "obj-1", 0 ] 1155 | } 1156 | 1157 | } 1158 | , { 1159 | "patchline" : { 1160 | "destination" : [ "obj-2", 0 ], 1161 | "source" : [ "obj-5", 1 ] 1162 | } 1163 | 1164 | } 1165 | , { 1166 | "patchline" : { 1167 | "destination" : [ "obj-3", 0 ], 1168 | "source" : [ "obj-5", 2 ] 1169 | } 1170 | 1171 | } 1172 | , { 1173 | "patchline" : { 1174 | "destination" : [ "obj-4", 0 ], 1175 | "source" : [ "obj-5", 3 ] 1176 | } 1177 | 1178 | } 1179 | , { 1180 | "patchline" : { 1181 | "destination" : [ "obj-6", 0 ], 1182 | "source" : [ "obj-5", 0 ] 1183 | } 1184 | 1185 | } 1186 | , { 1187 | "patchline" : { 1188 | "destination" : [ "obj-5", 0 ], 1189 | "source" : [ "obj-7", 0 ] 1190 | } 1191 | 1192 | } 1193 | , { 1194 | "patchline" : { 1195 | "destination" : [ "obj-5", 3 ], 1196 | "source" : [ "obj-8", 0 ] 1197 | } 1198 | 1199 | } 1200 | , { 1201 | "patchline" : { 1202 | "destination" : [ "obj-5", 1 ], 1203 | "source" : [ "obj-9", 0 ] 1204 | } 1205 | 1206 | } 1207 | ], 1208 | "saved_attribute_attributes" : { 1209 | "default_plcolor" : { 1210 | "expression" : "" 1211 | } 1212 | 1213 | } 1214 | 1215 | } 1216 | , 1217 | "patching_rect" : [ 240.0, 358.0, 253.0, 22.0 ], 1218 | "text" : "gen~" 1219 | } 1220 | 1221 | } 1222 | ], 1223 | "lines" : [ { 1224 | "patchline" : { 1225 | "destination" : [ "obj-24", 2 ], 1226 | "source" : [ "obj-1", 3 ] 1227 | } 1228 | 1229 | } 1230 | , { 1231 | "patchline" : { 1232 | "destination" : [ "obj-24", 1 ], 1233 | "midpoints" : [ 405.5, 399.5, 366.5, 399.5 ], 1234 | "source" : [ "obj-1", 2 ] 1235 | } 1236 | 1237 | } 1238 | , { 1239 | "patchline" : { 1240 | "destination" : [ "obj-24", 0 ], 1241 | "source" : [ "obj-1", 0 ] 1242 | } 1243 | 1244 | } 1245 | , { 1246 | "patchline" : { 1247 | "destination" : [ "obj-28", 1 ], 1248 | "order" : 0, 1249 | "source" : [ "obj-1", 1 ] 1250 | } 1251 | 1252 | } 1253 | , { 1254 | "patchline" : { 1255 | "destination" : [ "obj-31", 0 ], 1256 | "midpoints" : [ 327.5, 399.5, 130.5, 399.5 ], 1257 | "order" : 1, 1258 | "source" : [ "obj-1", 1 ] 1259 | } 1260 | 1261 | } 1262 | , { 1263 | "patchline" : { 1264 | "destination" : [ "obj-26", 0 ], 1265 | "source" : [ "obj-10", 0 ] 1266 | } 1267 | 1268 | } 1269 | , { 1270 | "patchline" : { 1271 | "destination" : [ "obj-1", 0 ], 1272 | "midpoints" : [ 1974.5, 332.0, 249.5, 332.0 ], 1273 | "source" : [ "obj-11", 0 ] 1274 | } 1275 | 1276 | } 1277 | , { 1278 | "patchline" : { 1279 | "destination" : [ "obj-42", 0 ], 1280 | "source" : [ "obj-12", 0 ] 1281 | } 1282 | 1283 | } 1284 | , { 1285 | "patchline" : { 1286 | "destination" : [ "obj-1", 0 ], 1287 | "midpoints" : [ 714.5, 332.0, 249.5, 332.0 ], 1288 | "source" : [ "obj-13", 0 ] 1289 | } 1290 | 1291 | } 1292 | , { 1293 | "patchline" : { 1294 | "destination" : [ "obj-41", 0 ], 1295 | "source" : [ "obj-14", 0 ] 1296 | } 1297 | 1298 | } 1299 | , { 1300 | "patchline" : { 1301 | "destination" : [ "obj-1", 0 ], 1302 | "midpoints" : [ 594.5, 332.0, 249.5, 332.0 ], 1303 | "source" : [ "obj-15", 0 ] 1304 | } 1305 | 1306 | } 1307 | , { 1308 | "patchline" : { 1309 | "destination" : [ "obj-31", 0 ], 1310 | "source" : [ "obj-16", 0 ] 1311 | } 1312 | 1313 | } 1314 | , { 1315 | "patchline" : { 1316 | "destination" : [ "obj-23", 0 ], 1317 | "source" : [ "obj-17", 0 ] 1318 | } 1319 | 1320 | } 1321 | , { 1322 | "patchline" : { 1323 | "destination" : [ "obj-44", 0 ], 1324 | "source" : [ "obj-18", 0 ] 1325 | } 1326 | 1327 | } 1328 | , { 1329 | "patchline" : { 1330 | "destination" : [ "obj-25", 0 ], 1331 | "source" : [ "obj-19", 0 ] 1332 | } 1333 | 1334 | } 1335 | , { 1336 | "patchline" : { 1337 | "destination" : [ "obj-22", 0 ], 1338 | "source" : [ "obj-21", 0 ] 1339 | } 1340 | 1341 | } 1342 | , { 1343 | "patchline" : { 1344 | "destination" : [ "obj-1", 1 ], 1345 | "source" : [ "obj-22", 0 ] 1346 | } 1347 | 1348 | } 1349 | , { 1350 | "patchline" : { 1351 | "destination" : [ "obj-1", 0 ], 1352 | "midpoints" : [ 1509.5, 332.0, 249.5, 332.0 ], 1353 | "source" : [ "obj-23", 0 ] 1354 | } 1355 | 1356 | } 1357 | , { 1358 | "patchline" : { 1359 | "destination" : [ "obj-28", 0 ], 1360 | "source" : [ "obj-24", 0 ] 1361 | } 1362 | 1363 | } 1364 | , { 1365 | "patchline" : { 1366 | "destination" : [ "obj-1", 0 ], 1367 | "midpoints" : [ 954.5, 332.0, 249.5, 332.0 ], 1368 | "source" : [ "obj-25", 0 ] 1369 | } 1370 | 1371 | } 1372 | , { 1373 | "patchline" : { 1374 | "destination" : [ "obj-7", 0 ], 1375 | "source" : [ "obj-26", 0 ] 1376 | } 1377 | 1378 | } 1379 | , { 1380 | "patchline" : { 1381 | "destination" : [ "obj-1", 3 ], 1382 | "source" : [ "obj-27", 0 ] 1383 | } 1384 | 1385 | } 1386 | , { 1387 | "patchline" : { 1388 | "destination" : [ "obj-18", 0 ], 1389 | "source" : [ "obj-28", 0 ] 1390 | } 1391 | 1392 | } 1393 | , { 1394 | "patchline" : { 1395 | "destination" : [ "obj-1", 0 ], 1396 | "source" : [ "obj-29", 0 ] 1397 | } 1398 | 1399 | } 1400 | , { 1401 | "patchline" : { 1402 | "destination" : [ "obj-36", 0 ], 1403 | "midpoints" : [ 405.5, 184.5, 312.5, 184.5 ], 1404 | "order" : 1, 1405 | "source" : [ "obj-29", 1 ] 1406 | } 1407 | 1408 | } 1409 | , { 1410 | "patchline" : { 1411 | "destination" : [ "obj-39", 0 ], 1412 | "order" : 0, 1413 | "source" : [ "obj-29", 1 ] 1414 | } 1415 | 1416 | } 1417 | , { 1418 | "patchline" : { 1419 | "destination" : [ "obj-5", 0 ], 1420 | "source" : [ "obj-3", 0 ] 1421 | } 1422 | 1423 | } 1424 | , { 1425 | "patchline" : { 1426 | "destination" : [ "obj-34", 0 ], 1427 | "source" : [ "obj-30", 0 ] 1428 | } 1429 | 1430 | } 1431 | , { 1432 | "patchline" : { 1433 | "destination" : [ "obj-60", 0 ], 1434 | "source" : [ "obj-31", 1 ] 1435 | } 1436 | 1437 | } 1438 | , { 1439 | "patchline" : { 1440 | "destination" : [ "obj-29", 1 ], 1441 | "source" : [ "obj-32", 1 ] 1442 | } 1443 | 1444 | } 1445 | , { 1446 | "patchline" : { 1447 | "destination" : [ "obj-29", 0 ], 1448 | "source" : [ "obj-32", 0 ] 1449 | } 1450 | 1451 | } 1452 | , { 1453 | "patchline" : { 1454 | "destination" : [ "obj-33", 0 ], 1455 | "source" : [ "obj-34", 0 ] 1456 | } 1457 | 1458 | } 1459 | , { 1460 | "patchline" : { 1461 | "destination" : [ "obj-21", 0 ], 1462 | "source" : [ "obj-36", 1 ] 1463 | } 1464 | 1465 | } 1466 | , { 1467 | "patchline" : { 1468 | "destination" : [ "obj-1", 2 ], 1469 | "source" : [ "obj-37", 0 ] 1470 | } 1471 | 1472 | } 1473 | , { 1474 | "patchline" : { 1475 | "destination" : [ "obj-32", 0 ], 1476 | "order" : 0, 1477 | "source" : [ "obj-38", 0 ] 1478 | } 1479 | 1480 | } 1481 | , { 1482 | "patchline" : { 1483 | "destination" : [ "obj-45", 0 ], 1484 | "midpoints" : [ 249.5, 90.0, 61.5, 90.0 ], 1485 | "order" : 1, 1486 | "source" : [ "obj-38", 0 ] 1487 | } 1488 | 1489 | } 1490 | , { 1491 | "patchline" : { 1492 | "destination" : [ "obj-37", 0 ], 1493 | "source" : [ "obj-39", 0 ] 1494 | } 1495 | 1496 | } 1497 | , { 1498 | "patchline" : { 1499 | "destination" : [ "obj-17", 0 ], 1500 | "source" : [ "obj-4", 0 ] 1501 | } 1502 | 1503 | } 1504 | , { 1505 | "patchline" : { 1506 | "destination" : [ "obj-27", 0 ], 1507 | "source" : [ "obj-40", 0 ] 1508 | } 1509 | 1510 | } 1511 | , { 1512 | "patchline" : { 1513 | "destination" : [ "obj-13", 0 ], 1514 | "source" : [ "obj-41", 0 ] 1515 | } 1516 | 1517 | } 1518 | , { 1519 | "patchline" : { 1520 | "destination" : [ "obj-43", 0 ], 1521 | "source" : [ "obj-42", 0 ] 1522 | } 1523 | 1524 | } 1525 | , { 1526 | "patchline" : { 1527 | "destination" : [ "obj-1", 0 ], 1528 | "midpoints" : [ 1749.5, 332.0, 249.5, 332.0 ], 1529 | "source" : [ "obj-43", 0 ] 1530 | } 1531 | 1532 | } 1533 | , { 1534 | "patchline" : { 1535 | "destination" : [ "obj-30", 0 ], 1536 | "source" : [ "obj-45", 0 ] 1537 | } 1538 | 1539 | } 1540 | , { 1541 | "patchline" : { 1542 | "destination" : [ "obj-16", 0 ], 1543 | "source" : [ "obj-49", 0 ] 1544 | } 1545 | 1546 | } 1547 | , { 1548 | "patchline" : { 1549 | "destination" : [ "obj-1", 0 ], 1550 | "midpoints" : [ 1419.5, 332.0, 249.5, 332.0 ], 1551 | "source" : [ "obj-5", 0 ] 1552 | } 1553 | 1554 | } 1555 | , { 1556 | "patchline" : { 1557 | "destination" : [ "obj-30", 0 ], 1558 | "midpoints" : [ 91.5, 457.0, 61.5, 457.0 ], 1559 | "source" : [ "obj-52", 0 ] 1560 | } 1561 | 1562 | } 1563 | , { 1564 | "patchline" : { 1565 | "destination" : [ "obj-49", 0 ], 1566 | "source" : [ "obj-52", 1 ] 1567 | } 1568 | 1569 | } 1570 | , { 1571 | "patchline" : { 1572 | "destination" : [ "obj-19", 0 ], 1573 | "source" : [ "obj-6", 0 ] 1574 | } 1575 | 1576 | } 1577 | , { 1578 | "patchline" : { 1579 | "destination" : [ "obj-34", 0 ], 1580 | "midpoints" : [ 153.5, 515.0, 61.5, 515.0 ], 1581 | "source" : [ "obj-60", 0 ] 1582 | } 1583 | 1584 | } 1585 | , { 1586 | "patchline" : { 1587 | "destination" : [ "obj-1", 0 ], 1588 | "midpoints" : [ 1194.5, 332.0, 249.5, 332.0 ], 1589 | "source" : [ "obj-7", 0 ] 1590 | } 1591 | 1592 | } 1593 | , { 1594 | "patchline" : { 1595 | "destination" : [ "obj-15", 0 ], 1596 | "source" : [ "obj-8", 0 ] 1597 | } 1598 | 1599 | } 1600 | , { 1601 | "patchline" : { 1602 | "destination" : [ "obj-11", 0 ], 1603 | "source" : [ "obj-9", 0 ] 1604 | } 1605 | 1606 | } 1607 | ], 1608 | "saved_attribute_attributes" : { 1609 | "default_plcolor" : { 1610 | "expression" : "" 1611 | } 1612 | 1613 | } 1614 | 1615 | } 1616 | 1617 | } 1618 | -------------------------------------------------------------------------------- /poly.template.maxpat: -------------------------------------------------------------------------------- 1 | { 2 | "patcher" : { 3 | "fileversion" : 1, 4 | "appversion" : { 5 | "major" : 8, 6 | "minor" : 5, 7 | "revision" : 5, 8 | "architecture" : "x64", 9 | "modernui" : 1 10 | } 11 | , 12 | "classnamespace" : "box", 13 | "rect" : [ 278.0, 272.0, 1200.0, 662.0 ], 14 | "bglocked" : 0, 15 | "openinpresentation" : 0, 16 | "default_fontsize" : 12.0, 17 | "default_fontface" : 0, 18 | "default_fontname" : "Arial", 19 | "gridonopen" : 1, 20 | "gridsize" : [ 15.0, 15.0 ], 21 | "gridsnaponopen" : 1, 22 | "objectsnaponopen" : 1, 23 | "statusbarvisible" : 2, 24 | "toolbarvisible" : 1, 25 | "lefttoolbarpinned" : 0, 26 | "toptoolbarpinned" : 0, 27 | "righttoolbarpinned" : 0, 28 | "bottomtoolbarpinned" : 0, 29 | "toolbars_unpinned_last_save" : 0, 30 | "tallnewobj" : 0, 31 | "boxanimatetime" : 200, 32 | "enablehscroll" : 1, 33 | "enablevscroll" : 1, 34 | "devicewidth" : 0.0, 35 | "description" : "", 36 | "digest" : "", 37 | "tags" : "", 38 | "style" : "", 39 | "subpatcher_template" : "", 40 | "assistshowspatchername" : 0, 41 | "boxes" : [ { 42 | "box" : { 43 | "id" : "obj-11", 44 | "maxclass" : "newobj", 45 | "numinlets" : 1, 46 | "numoutlets" : 1, 47 | "outlettype" : [ "signal" ], 48 | "patching_rect" : [ 369.0, 285.0, 31.0, 22.0 ], 49 | "text" : "sig~" 50 | } 51 | 52 | } 53 | , { 54 | "box" : { 55 | "id" : "obj-10", 56 | "maxclass" : "newobj", 57 | "numinlets" : 1, 58 | "numoutlets" : 1, 59 | "outlettype" : [ "signal" ], 60 | "patching_rect" : [ 993.000000000000114, 119.0, 35.0, 22.0 ], 61 | "text" : "in~ 9" 62 | } 63 | 64 | } 65 | , { 66 | "box" : { 67 | "id" : "obj-9", 68 | "maxclass" : "newobj", 69 | "numinlets" : 1, 70 | "numoutlets" : 1, 71 | "outlettype" : [ "signal" ], 72 | "patching_rect" : [ 915.000000000000114, 119.0, 35.0, 22.0 ], 73 | "text" : "in~ 8" 74 | } 75 | 76 | } 77 | , { 78 | "box" : { 79 | "id" : "obj-8", 80 | "maxclass" : "newobj", 81 | "numinlets" : 1, 82 | "numoutlets" : 1, 83 | "outlettype" : [ "signal" ], 84 | "patching_rect" : [ 837.000000000000114, 119.0, 35.0, 22.0 ], 85 | "text" : "in~ 7" 86 | } 87 | 88 | } 89 | , { 90 | "box" : { 91 | "id" : "obj-7", 92 | "maxclass" : "newobj", 93 | "numinlets" : 1, 94 | "numoutlets" : 1, 95 | "outlettype" : [ "signal" ], 96 | "patching_rect" : [ 759.000000000000114, 119.0, 35.0, 22.0 ], 97 | "text" : "in~ 6" 98 | } 99 | 100 | } 101 | , { 102 | "box" : { 103 | "id" : "obj-6", 104 | "maxclass" : "newobj", 105 | "numinlets" : 1, 106 | "numoutlets" : 1, 107 | "outlettype" : [ "signal" ], 108 | "patching_rect" : [ 681.000000000000114, 119.0, 35.0, 22.0 ], 109 | "text" : "in~ 5" 110 | } 111 | 112 | } 113 | , { 114 | "box" : { 115 | "id" : "obj-5", 116 | "maxclass" : "newobj", 117 | "numinlets" : 1, 118 | "numoutlets" : 1, 119 | "outlettype" : [ "signal" ], 120 | "patching_rect" : [ 603.0, 119.0, 35.0, 22.0 ], 121 | "text" : "in~ 4" 122 | } 123 | 124 | } 125 | , { 126 | "box" : { 127 | "id" : "obj-4", 128 | "maxclass" : "newobj", 129 | "numinlets" : 1, 130 | "numoutlets" : 1, 131 | "outlettype" : [ "signal" ], 132 | "patching_rect" : [ 525.0, 119.0, 35.0, 22.0 ], 133 | "text" : "in~ 3" 134 | } 135 | 136 | } 137 | , { 138 | "box" : { 139 | "id" : "obj-3", 140 | "maxclass" : "newobj", 141 | "numinlets" : 1, 142 | "numoutlets" : 1, 143 | "outlettype" : [ "signal" ], 144 | "patching_rect" : [ 447.000000000000057, 119.0, 35.0, 22.0 ], 145 | "text" : "in~ 2" 146 | } 147 | 148 | } 149 | , { 150 | "box" : { 151 | "id" : "obj-2", 152 | "maxclass" : "newobj", 153 | "numinlets" : 1, 154 | "numoutlets" : 2, 155 | "outlettype" : [ "", "bang" ], 156 | "patching_rect" : [ 55.5, 82.0, 29.5, 22.0 ], 157 | "text" : "t l b" 158 | } 159 | 160 | } 161 | , { 162 | "box" : { 163 | "id" : "obj-44", 164 | "maxclass" : "newobj", 165 | "numinlets" : 1, 166 | "numoutlets" : 0, 167 | "patching_rect" : [ 993.000000000000114, 585.0, 42.0, 22.0 ], 168 | "saved_object_attributes" : { 169 | "attr_comment" : "" 170 | } 171 | , 172 | "text" : "out~ 1" 173 | } 174 | 175 | } 176 | , { 177 | "box" : { 178 | "id" : "obj-38", 179 | "maxclass" : "newobj", 180 | "numinlets" : 1, 181 | "numoutlets" : 1, 182 | "outlettype" : [ "" ], 183 | "patching_rect" : [ 55.5, 45.0, 28.0, 22.0 ], 184 | "saved_object_attributes" : { 185 | "attr_comment" : "" 186 | } 187 | , 188 | "text" : "in 1" 189 | } 190 | 191 | } 192 | , { 193 | "box" : { 194 | "id" : "obj-60", 195 | "maxclass" : "message", 196 | "numinlets" : 2, 197 | "numoutlets" : 1, 198 | "outlettype" : [ "" ], 199 | "patching_rect" : [ 158.0, 480.0, 59.0, 22.0 ], 200 | "text" : "mute 1, 1" 201 | } 202 | 203 | } 204 | , { 205 | "box" : { 206 | "id" : "obj-30", 207 | "maxclass" : "message", 208 | "numinlets" : 2, 209 | "numoutlets" : 1, 210 | "outlettype" : [ "" ], 211 | "patching_rect" : [ 66.0, 480.0, 59.0, 22.0 ], 212 | "text" : "mute 0, 1" 213 | } 214 | 215 | } 216 | , { 217 | "box" : { 218 | "id" : "obj-31", 219 | "maxclass" : "newobj", 220 | "numinlets" : 1, 221 | "numoutlets" : 2, 222 | "outlettype" : [ "bang", "bang" ], 223 | "patching_rect" : [ 135.0, 420.0, 42.0, 22.0 ], 224 | "text" : "edge~" 225 | } 226 | 227 | } 228 | , { 229 | "box" : { 230 | "id" : "obj-33", 231 | "maxclass" : "newobj", 232 | "numinlets" : 1, 233 | "numoutlets" : 0, 234 | "patching_rect" : [ 66.0, 585.0, 35.0, 22.0 ], 235 | "saved_object_attributes" : { 236 | "attr_comment" : "" 237 | } 238 | , 239 | "text" : "out 1" 240 | } 241 | 242 | } 243 | , { 244 | "box" : { 245 | "id" : "obj-34", 246 | "maxclass" : "newobj", 247 | "numinlets" : 1, 248 | "numoutlets" : 3, 249 | "outlettype" : [ "int", "int", "int" ], 250 | "patching_rect" : [ 66.0, 529.0, 56.0, 22.0 ], 251 | "text" : "thispoly~" 252 | } 253 | 254 | } 255 | , { 256 | "box" : { 257 | "id" : "obj-39", 258 | "maxclass" : "toggle", 259 | "numinlets" : 1, 260 | "numoutlets" : 1, 261 | "outlettype" : [ "int" ], 262 | "parameter_enable" : 0, 263 | "patching_rect" : [ 291.0, 219.0, 24.0, 24.0 ] 264 | } 265 | 266 | } 267 | , { 268 | "box" : { 269 | "id" : "obj-37", 270 | "maxclass" : "newobj", 271 | "numinlets" : 1, 272 | "numoutlets" : 1, 273 | "outlettype" : [ "signal" ], 274 | "patching_rect" : [ 291.0, 285.0, 31.0, 22.0 ], 275 | "text" : "sig~" 276 | } 277 | 278 | } 279 | , { 280 | "box" : { 281 | "id" : "obj-36", 282 | "maxclass" : "newobj", 283 | "numinlets" : 2, 284 | "numoutlets" : 2, 285 | "outlettype" : [ "bang", "" ], 286 | "patching_rect" : [ 198.0, 219.0, 34.0, 22.0 ], 287 | "text" : "sel 0" 288 | } 289 | 290 | } 291 | , { 292 | "box" : { 293 | "id" : "obj-32", 294 | "maxclass" : "newobj", 295 | "numinlets" : 1, 296 | "numoutlets" : 2, 297 | "outlettype" : [ "int", "int" ], 298 | "patching_rect" : [ 135.0, 119.0, 175.0, 22.0 ], 299 | "text" : "unpack" 300 | } 301 | 302 | } 303 | , { 304 | "box" : { 305 | "id" : "obj-22", 306 | "maxclass" : "newobj", 307 | "numinlets" : 1, 308 | "numoutlets" : 1, 309 | "outlettype" : [ "signal" ], 310 | "patching_rect" : [ 213.0, 285.0, 39.0, 22.0 ], 311 | "text" : "click~" 312 | } 313 | 314 | } 315 | , { 316 | "box" : { 317 | "id" : "obj-21", 318 | "maxclass" : "newobj", 319 | "numinlets" : 1, 320 | "numoutlets" : 1, 321 | "outlettype" : [ "bang" ], 322 | "patching_rect" : [ 213.0, 253.0, 22.0, 22.0 ], 323 | "text" : "t b" 324 | } 325 | 326 | } 327 | , { 328 | "box" : { 329 | "id" : "obj-1", 330 | "maxclass" : "newobj", 331 | "numinlets" : 12, 332 | "numoutlets" : 2, 333 | "outlettype" : [ "signal", "signal" ], 334 | "patcher" : { 335 | "fileversion" : 1, 336 | "appversion" : { 337 | "major" : 8, 338 | "minor" : 5, 339 | "revision" : 5, 340 | "architecture" : "x64", 341 | "modernui" : 1 342 | } 343 | , 344 | "classnamespace" : "dsp.gen", 345 | "rect" : [ 151.0, 100.0, 993.0, 848.0 ], 346 | "bglocked" : 0, 347 | "openinpresentation" : 0, 348 | "default_fontsize" : 12.0, 349 | "default_fontface" : 0, 350 | "default_fontname" : "Arial", 351 | "gridonopen" : 1, 352 | "gridsize" : [ 15.0, 15.0 ], 353 | "gridsnaponopen" : 1, 354 | "objectsnaponopen" : 1, 355 | "statusbarvisible" : 2, 356 | "toolbarvisible" : 1, 357 | "lefttoolbarpinned" : 0, 358 | "toptoolbarpinned" : 0, 359 | "righttoolbarpinned" : 0, 360 | "bottomtoolbarpinned" : 0, 361 | "toolbars_unpinned_last_save" : 0, 362 | "tallnewobj" : 0, 363 | "boxanimatetime" : 200, 364 | "enablehscroll" : 1, 365 | "enablevscroll" : 1, 366 | "devicewidth" : 0.0, 367 | "description" : "", 368 | "digest" : "", 369 | "tags" : "", 370 | "style" : "", 371 | "subpatcher_template" : "", 372 | "assistshowspatchername" : 0, 373 | "boxes" : [ { 374 | "box" : { 375 | "id" : "obj-3", 376 | "maxclass" : "newobj", 377 | "numinlets" : 0, 378 | "numoutlets" : 1, 379 | "outlettype" : [ "" ], 380 | "patching_rect" : [ 656.0, 15.0, 35.0, 22.0 ], 381 | "text" : "in 12" 382 | } 383 | 384 | } 385 | , { 386 | "box" : { 387 | "id" : "obj-15", 388 | "maxclass" : "newobj", 389 | "numinlets" : 0, 390 | "numoutlets" : 1, 391 | "outlettype" : [ "" ], 392 | "patching_rect" : [ 597.727272727272748, 15.0, 34.0, 22.0 ], 393 | "text" : "in 11" 394 | } 395 | 396 | } 397 | , { 398 | "box" : { 399 | "id" : "obj-14", 400 | "maxclass" : "newobj", 401 | "numinlets" : 0, 402 | "numoutlets" : 1, 403 | "outlettype" : [ "" ], 404 | "patching_rect" : [ 539.454545454545496, 15.0, 35.0, 22.0 ], 405 | "text" : "in 10" 406 | } 407 | 408 | } 409 | , { 410 | "box" : { 411 | "id" : "obj-13", 412 | "maxclass" : "newobj", 413 | "numinlets" : 0, 414 | "numoutlets" : 1, 415 | "outlettype" : [ "" ], 416 | "patching_rect" : [ 481.181818181818187, 15.0, 28.0, 22.0 ], 417 | "text" : "in 9" 418 | } 419 | 420 | } 421 | , { 422 | "box" : { 423 | "id" : "obj-12", 424 | "maxclass" : "newobj", 425 | "numinlets" : 0, 426 | "numoutlets" : 1, 427 | "outlettype" : [ "" ], 428 | "patching_rect" : [ 422.909090909090935, 15.0, 28.0, 22.0 ], 429 | "text" : "in 8" 430 | } 431 | 432 | } 433 | , { 434 | "box" : { 435 | "id" : "obj-11", 436 | "maxclass" : "newobj", 437 | "numinlets" : 0, 438 | "numoutlets" : 1, 439 | "outlettype" : [ "" ], 440 | "patching_rect" : [ 364.772727272727309, 15.0, 28.0, 22.0 ], 441 | "text" : "in 7" 442 | } 443 | 444 | } 445 | , { 446 | "box" : { 447 | "id" : "obj-10", 448 | "maxclass" : "newobj", 449 | "numinlets" : 0, 450 | "numoutlets" : 1, 451 | "outlettype" : [ "" ], 452 | "patching_rect" : [ 306.363636363636374, 15.0, 28.0, 22.0 ], 453 | "text" : "in 6" 454 | } 455 | 456 | } 457 | , { 458 | "box" : { 459 | "id" : "obj-9", 460 | "maxclass" : "newobj", 461 | "numinlets" : 0, 462 | "numoutlets" : 1, 463 | "outlettype" : [ "" ], 464 | "patching_rect" : [ 248.090909090909122, 15.0, 28.0, 22.0 ], 465 | "text" : "in 5" 466 | } 467 | 468 | } 469 | , { 470 | "box" : { 471 | "id" : "obj-4", 472 | "maxclass" : "newobj", 473 | "numinlets" : 0, 474 | "numoutlets" : 1, 475 | "outlettype" : [ "" ], 476 | "patching_rect" : [ 189.818181818181813, 15.0, 28.0, 22.0 ], 477 | "text" : "in 4" 478 | } 479 | 480 | } 481 | , { 482 | "box" : { 483 | "id" : "obj-8", 484 | "maxclass" : "newobj", 485 | "numinlets" : 0, 486 | "numoutlets" : 1, 487 | "outlettype" : [ "" ], 488 | "patching_rect" : [ 131.545454545454561, 15.0, 28.0, 22.0 ], 489 | "text" : "in 3" 490 | } 491 | 492 | } 493 | , { 494 | "box" : { 495 | "id" : "obj-1", 496 | "maxclass" : "newobj", 497 | "numinlets" : 0, 498 | "numoutlets" : 1, 499 | "outlettype" : [ "" ], 500 | "patching_rect" : [ 73.27272727272728, 15.0, 28.0, 22.0 ], 501 | "text" : "in 2" 502 | } 503 | 504 | } 505 | , { 506 | "box" : { 507 | "id" : "obj-2", 508 | "maxclass" : "newobj", 509 | "numinlets" : 1, 510 | "numoutlets" : 0, 511 | "patching_rect" : [ 656.0, 810.0, 35.0, 22.0 ], 512 | "text" : "out 2" 513 | } 514 | 515 | } 516 | , { 517 | "box" : { 518 | "id" : "obj-7", 519 | "maxclass" : "newobj", 520 | "numinlets" : 0, 521 | "numoutlets" : 1, 522 | "outlettype" : [ "" ], 523 | "patching_rect" : [ 15.0, 15.0, 28.0, 22.0 ], 524 | "text" : "in 1" 525 | } 526 | 527 | } 528 | , { 529 | "box" : { 530 | "id" : "obj-6", 531 | "maxclass" : "newobj", 532 | "numinlets" : 1, 533 | "numoutlets" : 0, 534 | "patching_rect" : [ 15.0, 810.0, 35.0, 22.0 ], 535 | "text" : "out 1" 536 | } 537 | 538 | } 539 | , { 540 | "box" : { 541 | "code" : "// attack-decay-sustain-release envelope\r\n\r\nadsr(trig, gate, attack, decay, sustain, release) {\n\tHistory env(0), stage(0), trigged(0), gating(0),\r\n\t\n\t\t\tatk_rate(0), atk_coeff(0), atk_offset(0),\r\n\t\t\tdec_rate(0), dec_coeff(0), dec_offset(0),\n\t\t\trel_rate(0), rel_coeff(0), rel_offset(0);\r\n\t\t\t\r\n\t// slope 0 = linear, slope -n = log/exp\n\trise_slope = exp(-1.5);\r\n\tfall_slope = exp(-8);\n\t\t\r\n\tif (trig) {\r\n\t\tif (gate && trigged) {\r\n\t\t\t// do nothing\r\n\t\t} else {\r\n\t\t\ttrigged = 1;\r\n\t\t\t\r\n\t\t\t// rate in seconds\n\t\t\tatk_rate = samplerate * attack;\r\n\t\t\tdec_rate = samplerate * decay;\n\t\t\trel_rate = samplerate * release;\n\t\t\n\t\t\t// calculate coefficients\r\n\t\t\tatk_coeff = exp(-log((1 + rise_slope) / rise_slope) / atk_rate);\r\n\t\t\tatk_offset = (1 + rise_slope) * (1 - atk_coeff);\r\n\t\t\t\r\n\t\t\tdec_coeff = exp(-log((1 + fall_slope) / fall_slope) / dec_rate);\n\t\t\tdec_offset = (sustain - fall_slope) * (1 - dec_coeff);\n\t\t\n\t\t\trel_coeff = exp(-log((1 + fall_slope) / fall_slope) / rel_rate);\n\t\t\trel_offset = -fall_slope * (1 - rel_coeff);\n\t\t\n\t\t\t// reset & trigger envelope\n\t\t\tstage = 1;\r\n\t\t}\n\t}\t\n\t// stage 0 = idle, 1 = attack, 2 = release\n\tif (stage == 0) {\n\t\tenv = 0;\n\t} else if (gate && trigged) {\r\n \t\tif (stage == 1) {\n\t\t\tenv = atk_offset + env;\n\t\t\n\t\t\tif (env >= 1 || attack <= 0) {\n\t\t\t\tenv = 1;\n\t\t\t\tstage = 2;\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (env <= sustain) {\r\n\t\t\t\tenv = sustain;\r\n\t\t\t} else {\r\n\t\t\t\tdec_offset = (sustain - fall_slope) * (1 - dec_coeff);\r\n\t\t\t\tenv = dec_offset + env * dec_coeff;\r\n\t\t\t}\n\t\t}\r\n\t} else {\r\n\t\ttrigged = 0;\r\n\t\t\n\t\tenv = rel_offset + env * rel_coeff;\n\t\t\n\t\tif (env <= 0 || release <= 0) {\n\t\t\tenv = 0;\n\t\t\tstage = 0;\n\t\t}\r\n\t} \n\treturn env, trigged;\n}\r\n\r\n// onepole smoother for event rate signals\r\n\r\nsmooth(x, time) { \n History prev;\n prev = prev + time * (x - prev); \n\n return prev;\n}\r\n\r\n// inputs\r\n\r\nnote = in1;\r\ntrig = in2;\r\ngate = in3;\r\nvelo = pow(latch(in4, trig) / 127, 2);\r\n\r\n// parameters\r\n\r\nctl0 = in5;\r\nctl1 = in6;\r\nctl2 = in7;\r\nctl3 = in8;\r\n\r\natk = in9;\r\ndec = in10;\r\nsus = in11;\r\nrel = in12;\r\n\r\n// envelopes\r\n\r\namp_env = adsr(trig, gate, atk, dec, sus, rel);\r\n\r\n// frequency calculations\r\n\r\nfreq = mtof(note);\r\n\r\nosc = cycle(freq) * amp_env;\r\n\r\nout1 = amp_env;\r\nout2 = osc * velo;", 542 | "fontface" : 0, 543 | "fontname" : "", 544 | "fontsize" : 12.0, 545 | "id" : "obj-5", 546 | "maxclass" : "codebox", 547 | "numinlets" : 12, 548 | "numoutlets" : 2, 549 | "outlettype" : [ "", "" ], 550 | "patching_rect" : [ 15.0, 45.0, 660.0, 750.0 ] 551 | } 552 | 553 | } 554 | ], 555 | "lines" : [ { 556 | "patchline" : { 557 | "destination" : [ "obj-5", 1 ], 558 | "source" : [ "obj-1", 0 ] 559 | } 560 | 561 | } 562 | , { 563 | "patchline" : { 564 | "destination" : [ "obj-5", 5 ], 565 | "source" : [ "obj-10", 0 ] 566 | } 567 | 568 | } 569 | , { 570 | "patchline" : { 571 | "destination" : [ "obj-5", 6 ], 572 | "source" : [ "obj-11", 0 ] 573 | } 574 | 575 | } 576 | , { 577 | "patchline" : { 578 | "destination" : [ "obj-5", 7 ], 579 | "source" : [ "obj-12", 0 ] 580 | } 581 | 582 | } 583 | , { 584 | "patchline" : { 585 | "destination" : [ "obj-5", 8 ], 586 | "source" : [ "obj-13", 0 ] 587 | } 588 | 589 | } 590 | , { 591 | "patchline" : { 592 | "destination" : [ "obj-5", 9 ], 593 | "source" : [ "obj-14", 0 ] 594 | } 595 | 596 | } 597 | , { 598 | "patchline" : { 599 | "destination" : [ "obj-5", 10 ], 600 | "source" : [ "obj-15", 0 ] 601 | } 602 | 603 | } 604 | , { 605 | "patchline" : { 606 | "destination" : [ "obj-5", 11 ], 607 | "source" : [ "obj-3", 0 ] 608 | } 609 | 610 | } 611 | , { 612 | "patchline" : { 613 | "destination" : [ "obj-5", 3 ], 614 | "source" : [ "obj-4", 0 ] 615 | } 616 | 617 | } 618 | , { 619 | "patchline" : { 620 | "destination" : [ "obj-2", 0 ], 621 | "source" : [ "obj-5", 1 ] 622 | } 623 | 624 | } 625 | , { 626 | "patchline" : { 627 | "destination" : [ "obj-6", 0 ], 628 | "source" : [ "obj-5", 0 ] 629 | } 630 | 631 | } 632 | , { 633 | "patchline" : { 634 | "destination" : [ "obj-5", 0 ], 635 | "source" : [ "obj-7", 0 ] 636 | } 637 | 638 | } 639 | , { 640 | "patchline" : { 641 | "destination" : [ "obj-5", 2 ], 642 | "source" : [ "obj-8", 0 ] 643 | } 644 | 645 | } 646 | , { 647 | "patchline" : { 648 | "destination" : [ "obj-5", 4 ], 649 | "source" : [ "obj-9", 0 ] 650 | } 651 | 652 | } 653 | ], 654 | "autosave" : 0 655 | } 656 | , 657 | "patching_rect" : [ 135.0, 358.0, 877.000000000000114, 22.0 ], 658 | "saved_object_attributes" : { 659 | 660 | } 661 | , 662 | "text" : "gen~" 663 | } 664 | 665 | } 666 | ], 667 | "lines" : [ { 668 | "patchline" : { 669 | "destination" : [ "obj-31", 0 ], 670 | "source" : [ "obj-1", 0 ] 671 | } 672 | 673 | } 674 | , { 675 | "patchline" : { 676 | "destination" : [ "obj-44", 0 ], 677 | "source" : [ "obj-1", 1 ] 678 | } 679 | 680 | } 681 | , { 682 | "patchline" : { 683 | "destination" : [ "obj-1", 11 ], 684 | "source" : [ "obj-10", 0 ] 685 | } 686 | 687 | } 688 | , { 689 | "patchline" : { 690 | "destination" : [ "obj-1", 3 ], 691 | "source" : [ "obj-11", 0 ] 692 | } 693 | 694 | } 695 | , { 696 | "patchline" : { 697 | "destination" : [ "obj-30", 0 ], 698 | "source" : [ "obj-2", 1 ] 699 | } 700 | 701 | } 702 | , { 703 | "patchline" : { 704 | "destination" : [ "obj-32", 0 ], 705 | "midpoints" : [ 65.0, 111.0, 144.5, 111.0 ], 706 | "source" : [ "obj-2", 0 ] 707 | } 708 | 709 | } 710 | , { 711 | "patchline" : { 712 | "destination" : [ "obj-22", 0 ], 713 | "source" : [ "obj-21", 0 ] 714 | } 715 | 716 | } 717 | , { 718 | "patchline" : { 719 | "destination" : [ "obj-1", 1 ], 720 | "source" : [ "obj-22", 0 ] 721 | } 722 | 723 | } 724 | , { 725 | "patchline" : { 726 | "destination" : [ "obj-1", 4 ], 727 | "source" : [ "obj-3", 0 ] 728 | } 729 | 730 | } 731 | , { 732 | "patchline" : { 733 | "destination" : [ "obj-34", 0 ], 734 | "source" : [ "obj-30", 0 ] 735 | } 736 | 737 | } 738 | , { 739 | "patchline" : { 740 | "destination" : [ "obj-60", 0 ], 741 | "source" : [ "obj-31", 1 ] 742 | } 743 | 744 | } 745 | , { 746 | "patchline" : { 747 | "destination" : [ "obj-1", 0 ], 748 | "source" : [ "obj-32", 0 ] 749 | } 750 | 751 | } 752 | , { 753 | "patchline" : { 754 | "destination" : [ "obj-11", 0 ], 755 | "midpoints" : [ 300.5, 179.5, 378.5, 179.5 ], 756 | "order" : 0, 757 | "source" : [ "obj-32", 1 ] 758 | } 759 | 760 | } 761 | , { 762 | "patchline" : { 763 | "destination" : [ "obj-36", 0 ], 764 | "midpoints" : [ 300.5, 179.5, 207.5, 179.5 ], 765 | "order" : 2, 766 | "source" : [ "obj-32", 1 ] 767 | } 768 | 769 | } 770 | , { 771 | "patchline" : { 772 | "destination" : [ "obj-39", 0 ], 773 | "order" : 1, 774 | "source" : [ "obj-32", 1 ] 775 | } 776 | 777 | } 778 | , { 779 | "patchline" : { 780 | "destination" : [ "obj-33", 0 ], 781 | "source" : [ "obj-34", 0 ] 782 | } 783 | 784 | } 785 | , { 786 | "patchline" : { 787 | "destination" : [ "obj-21", 0 ], 788 | "source" : [ "obj-36", 1 ] 789 | } 790 | 791 | } 792 | , { 793 | "patchline" : { 794 | "destination" : [ "obj-1", 2 ], 795 | "source" : [ "obj-37", 0 ] 796 | } 797 | 798 | } 799 | , { 800 | "patchline" : { 801 | "destination" : [ "obj-2", 0 ], 802 | "source" : [ "obj-38", 0 ] 803 | } 804 | 805 | } 806 | , { 807 | "patchline" : { 808 | "destination" : [ "obj-37", 0 ], 809 | "source" : [ "obj-39", 0 ] 810 | } 811 | 812 | } 813 | , { 814 | "patchline" : { 815 | "destination" : [ "obj-1", 5 ], 816 | "source" : [ "obj-4", 0 ] 817 | } 818 | 819 | } 820 | , { 821 | "patchline" : { 822 | "destination" : [ "obj-1", 6 ], 823 | "source" : [ "obj-5", 0 ] 824 | } 825 | 826 | } 827 | , { 828 | "patchline" : { 829 | "destination" : [ "obj-1", 7 ], 830 | "source" : [ "obj-6", 0 ] 831 | } 832 | 833 | } 834 | , { 835 | "patchline" : { 836 | "destination" : [ "obj-34", 0 ], 837 | "midpoints" : [ 167.5, 515.0, 75.5, 515.0 ], 838 | "source" : [ "obj-60", 0 ] 839 | } 840 | 841 | } 842 | , { 843 | "patchline" : { 844 | "destination" : [ "obj-1", 8 ], 845 | "source" : [ "obj-7", 0 ] 846 | } 847 | 848 | } 849 | , { 850 | "patchline" : { 851 | "destination" : [ "obj-1", 9 ], 852 | "source" : [ "obj-8", 0 ] 853 | } 854 | 855 | } 856 | , { 857 | "patchline" : { 858 | "destination" : [ "obj-1", 10 ], 859 | "source" : [ "obj-9", 0 ] 860 | } 861 | 862 | } 863 | ], 864 | "saved_attribute_attributes" : { 865 | "default_plcolor" : { 866 | "expression" : "" 867 | } 868 | 869 | } 870 | 871 | } 872 | 873 | } 874 | -------------------------------------------------------------------------------- /set-name.js: -------------------------------------------------------------------------------- 1 | var parameters = new Dict("---parameters") 2 | 3 | function bang() { 4 | var param_title = "" 5 | 6 | for (i = 0; i < 8; ++i) { 7 | param_title = parameters.get("param_" + i + "::title") 8 | outlet(0, i, "set", param_title) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /template.amxd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fors-fm/lode/94b55ef18b1bcc5f02bfed96e8d9b9bde3396482/template.amxd -------------------------------------------------------------------------------- /ui-panel.maxpat: -------------------------------------------------------------------------------- 1 | { 2 | "patcher" : { 3 | "fileversion" : 1, 4 | "appversion" : { 5 | "major" : 8, 6 | "minor" : 5, 7 | "revision" : 5, 8 | "architecture" : "x64", 9 | "modernui" : 1 10 | } 11 | , 12 | "classnamespace" : "box", 13 | "rect" : [ 34.0, 100.0, 1444.0, 848.0 ], 14 | "bglocked" : 0, 15 | "openinpresentation" : 1, 16 | "default_fontsize" : 12.0, 17 | "default_fontface" : 0, 18 | "default_fontname" : "Arial", 19 | "gridonopen" : 1, 20 | "gridsize" : [ 15.0, 15.0 ], 21 | "gridsnaponopen" : 1, 22 | "objectsnaponopen" : 1, 23 | "statusbarvisible" : 2, 24 | "toolbarvisible" : 1, 25 | "lefttoolbarpinned" : 0, 26 | "toptoolbarpinned" : 0, 27 | "righttoolbarpinned" : 0, 28 | "bottomtoolbarpinned" : 0, 29 | "toolbars_unpinned_last_save" : 0, 30 | "tallnewobj" : 0, 31 | "boxanimatetime" : 200, 32 | "enablehscroll" : 1, 33 | "enablevscroll" : 1, 34 | "devicewidth" : 0.0, 35 | "description" : "", 36 | "digest" : "", 37 | "tags" : "", 38 | "style" : "", 39 | "subpatcher_template" : "", 40 | "assistshowspatchername" : 0, 41 | "boxes" : [ { 42 | "box" : { 43 | "id" : "obj-73", 44 | "maxclass" : "newobj", 45 | "numinlets" : 2, 46 | "numoutlets" : 2, 47 | "outlettype" : [ "", "" ], 48 | "patching_rect" : [ 1468.0, 649.0, 46.0, 22.0 ], 49 | "text" : "route 7" 50 | } 51 | 52 | } 53 | , { 54 | "box" : { 55 | "id" : "obj-77", 56 | "maxclass" : "newobj", 57 | "numinlets" : 0, 58 | "numoutlets" : 1, 59 | "outlettype" : [ "" ], 60 | "patching_rect" : [ 1468.0, 619.0, 52.0, 22.0 ], 61 | "text" : "r ---titles" 62 | } 63 | 64 | } 65 | , { 66 | "box" : { 67 | "id" : "obj-78", 68 | "maxclass" : "newobj", 69 | "numinlets" : 2, 70 | "numoutlets" : 2, 71 | "outlettype" : [ "", "" ], 72 | "patching_rect" : [ 1075.0, 649.0, 46.0, 22.0 ], 73 | "text" : "route 6" 74 | } 75 | 76 | } 77 | , { 78 | "box" : { 79 | "id" : "obj-81", 80 | "maxclass" : "newobj", 81 | "numinlets" : 0, 82 | "numoutlets" : 1, 83 | "outlettype" : [ "" ], 84 | "patching_rect" : [ 1075.0, 619.0, 52.0, 22.0 ], 85 | "text" : "r ---titles" 86 | } 87 | 88 | } 89 | , { 90 | "box" : { 91 | "id" : "obj-83", 92 | "maxclass" : "newobj", 93 | "numinlets" : 2, 94 | "numoutlets" : 2, 95 | "outlettype" : [ "", "" ], 96 | "patching_rect" : [ 656.0, 649.0, 46.0, 22.0 ], 97 | "text" : "route 5" 98 | } 99 | 100 | } 101 | , { 102 | "box" : { 103 | "id" : "obj-91", 104 | "maxclass" : "newobj", 105 | "numinlets" : 0, 106 | "numoutlets" : 1, 107 | "outlettype" : [ "" ], 108 | "patching_rect" : [ 656.0, 619.0, 52.0, 22.0 ], 109 | "text" : "r ---titles" 110 | } 111 | 112 | } 113 | , { 114 | "box" : { 115 | "id" : "obj-92", 116 | "maxclass" : "newobj", 117 | "numinlets" : 2, 118 | "numoutlets" : 2, 119 | "outlettype" : [ "", "" ], 120 | "patching_rect" : [ 263.0, 649.0, 46.0, 22.0 ], 121 | "text" : "route 4" 122 | } 123 | 124 | } 125 | , { 126 | "box" : { 127 | "id" : "obj-93", 128 | "maxclass" : "newobj", 129 | "numinlets" : 0, 130 | "numoutlets" : 1, 131 | "outlettype" : [ "" ], 132 | "patching_rect" : [ 263.0, 619.0, 52.0, 22.0 ], 133 | "text" : "r ---titles" 134 | } 135 | 136 | } 137 | , { 138 | "box" : { 139 | "id" : "obj-65", 140 | "maxclass" : "newobj", 141 | "numinlets" : 2, 142 | "numoutlets" : 2, 143 | "outlettype" : [ "", "" ], 144 | "patching_rect" : [ 1468.0, 354.0, 46.0, 22.0 ], 145 | "text" : "route 3" 146 | } 147 | 148 | } 149 | , { 150 | "box" : { 151 | "id" : "obj-66", 152 | "maxclass" : "newobj", 153 | "numinlets" : 0, 154 | "numoutlets" : 1, 155 | "outlettype" : [ "" ], 156 | "patching_rect" : [ 1468.0, 324.0, 52.0, 22.0 ], 157 | "text" : "r ---titles" 158 | } 159 | 160 | } 161 | , { 162 | "box" : { 163 | "id" : "obj-69", 164 | "maxclass" : "newobj", 165 | "numinlets" : 2, 166 | "numoutlets" : 2, 167 | "outlettype" : [ "", "" ], 168 | "patching_rect" : [ 1075.0, 354.0, 46.0, 22.0 ], 169 | "text" : "route 2" 170 | } 171 | 172 | } 173 | , { 174 | "box" : { 175 | "id" : "obj-70", 176 | "maxclass" : "newobj", 177 | "numinlets" : 0, 178 | "numoutlets" : 1, 179 | "outlettype" : [ "" ], 180 | "patching_rect" : [ 1075.0, 324.0, 52.0, 22.0 ], 181 | "text" : "r ---titles" 182 | } 183 | 184 | } 185 | , { 186 | "box" : { 187 | "id" : "obj-60", 188 | "maxclass" : "newobj", 189 | "numinlets" : 2, 190 | "numoutlets" : 2, 191 | "outlettype" : [ "", "" ], 192 | "patching_rect" : [ 656.0, 354.0, 46.0, 22.0 ], 193 | "text" : "route 1" 194 | } 195 | 196 | } 197 | , { 198 | "box" : { 199 | "id" : "obj-63", 200 | "maxclass" : "newobj", 201 | "numinlets" : 0, 202 | "numoutlets" : 1, 203 | "outlettype" : [ "" ], 204 | "patching_rect" : [ 656.0, 324.0, 52.0, 22.0 ], 205 | "text" : "r ---titles" 206 | } 207 | 208 | } 209 | , { 210 | "box" : { 211 | "id" : "obj-54", 212 | "maxclass" : "newobj", 213 | "numinlets" : 2, 214 | "numoutlets" : 2, 215 | "outlettype" : [ "", "" ], 216 | "patching_rect" : [ 263.0, 354.0, 46.0, 22.0 ], 217 | "text" : "route 0" 218 | } 219 | 220 | } 221 | , { 222 | "box" : { 223 | "id" : "obj-50", 224 | "maxclass" : "newobj", 225 | "numinlets" : 0, 226 | "numoutlets" : 1, 227 | "outlettype" : [ "" ], 228 | "patching_rect" : [ 263.0, 324.0, 52.0, 22.0 ], 229 | "text" : "r ---titles" 230 | } 231 | 232 | } 233 | , { 234 | "box" : { 235 | "id" : "obj-46", 236 | "maxclass" : "newobj", 237 | "numinlets" : 1, 238 | "numoutlets" : 0, 239 | "patching_rect" : [ 45.0, 135.0, 54.0, 22.0 ], 240 | "text" : "s ---titles" 241 | } 242 | 243 | } 244 | , { 245 | "box" : { 246 | "id" : "obj-40", 247 | "maxclass" : "newobj", 248 | "numinlets" : 1, 249 | "numoutlets" : 1, 250 | "outlettype" : [ "" ], 251 | "patching_rect" : [ 45.0, 75.0, 54.0, 22.0 ], 252 | "text" : "deferlow" 253 | } 254 | 255 | } 256 | , { 257 | "box" : { 258 | "id" : "obj-45", 259 | "maxclass" : "newobj", 260 | "numinlets" : 1, 261 | "numoutlets" : 0, 262 | "patching_rect" : [ 1350.0, 728.0, 52.0, 22.0 ], 263 | "text" : "s ---val7" 264 | } 265 | 266 | } 267 | , { 268 | "box" : { 269 | "id" : "obj-42", 270 | "maxclass" : "newobj", 271 | "numinlets" : 1, 272 | "numoutlets" : 0, 273 | "patching_rect" : [ 957.0, 728.0, 52.0, 22.0 ], 274 | "text" : "s ---val6" 275 | } 276 | 277 | } 278 | , { 279 | "box" : { 280 | "id" : "obj-41", 281 | "maxclass" : "newobj", 282 | "numinlets" : 1, 283 | "numoutlets" : 0, 284 | "patching_rect" : [ 538.0, 728.0, 52.0, 22.0 ], 285 | "text" : "s ---val5" 286 | } 287 | 288 | } 289 | , { 290 | "box" : { 291 | "id" : "obj-36", 292 | "maxclass" : "newobj", 293 | "numinlets" : 1, 294 | "numoutlets" : 0, 295 | "patching_rect" : [ 145.0, 728.0, 52.0, 22.0 ], 296 | "text" : "s ---val4" 297 | } 298 | 299 | } 300 | , { 301 | "box" : { 302 | "id" : "obj-33", 303 | "maxclass" : "newobj", 304 | "numinlets" : 1, 305 | "numoutlets" : 0, 306 | "patching_rect" : [ 1350.0, 428.0, 52.0, 22.0 ], 307 | "text" : "s ---val3" 308 | } 309 | 310 | } 311 | , { 312 | "box" : { 313 | "id" : "obj-32", 314 | "maxclass" : "newobj", 315 | "numinlets" : 1, 316 | "numoutlets" : 0, 317 | "patching_rect" : [ 957.0, 428.0, 52.0, 22.0 ], 318 | "text" : "s ---val2" 319 | } 320 | 321 | } 322 | , { 323 | "box" : { 324 | "id" : "obj-31", 325 | "maxclass" : "newobj", 326 | "numinlets" : 1, 327 | "numoutlets" : 0, 328 | "patching_rect" : [ 538.0, 428.0, 52.0, 22.0 ], 329 | "text" : "s ---val1" 330 | } 331 | 332 | } 333 | , { 334 | "box" : { 335 | "id" : "obj-30", 336 | "maxclass" : "newobj", 337 | "numinlets" : 1, 338 | "numoutlets" : 0, 339 | "patching_rect" : [ 145.0, 428.0, 52.0, 22.0 ], 340 | "text" : "s ---val0" 341 | } 342 | 343 | } 344 | , { 345 | "box" : { 346 | "id" : "obj-11", 347 | "maxclass" : "newobj", 348 | "numinlets" : 1, 349 | "numoutlets" : 1, 350 | "outlettype" : [ "" ], 351 | "patching_rect" : [ 1441.0, 549.0, 107.0, 22.0 ], 352 | "text" : "prepend set_value" 353 | } 354 | 355 | } 356 | , { 357 | "box" : { 358 | "id" : "obj-15", 359 | "maxclass" : "newobj", 360 | "numinlets" : 0, 361 | "numoutlets" : 1, 362 | "outlettype" : [ "" ], 363 | "patching_rect" : [ 1441.0, 510.0, 46.0, 22.0 ], 364 | "text" : "r ---ctl7" 365 | } 366 | 367 | } 368 | , { 369 | "box" : { 370 | "id" : "obj-16", 371 | "maxclass" : "newobj", 372 | "numinlets" : 1, 373 | "numoutlets" : 1, 374 | "outlettype" : [ "" ], 375 | "patching_rect" : [ 1048.0, 549.0, 107.0, 22.0 ], 376 | "text" : "prepend set_value" 377 | } 378 | 379 | } 380 | , { 381 | "box" : { 382 | "id" : "obj-19", 383 | "maxclass" : "newobj", 384 | "numinlets" : 0, 385 | "numoutlets" : 1, 386 | "outlettype" : [ "" ], 387 | "patching_rect" : [ 1048.0, 510.0, 46.0, 22.0 ], 388 | "text" : "r ---ctl6" 389 | } 390 | 391 | } 392 | , { 393 | "box" : { 394 | "id" : "obj-24", 395 | "maxclass" : "newobj", 396 | "numinlets" : 1, 397 | "numoutlets" : 1, 398 | "outlettype" : [ "" ], 399 | "patching_rect" : [ 629.0, 549.0, 107.0, 22.0 ], 400 | "text" : "prepend set_value" 401 | } 402 | 403 | } 404 | , { 405 | "box" : { 406 | "id" : "obj-25", 407 | "maxclass" : "newobj", 408 | "numinlets" : 0, 409 | "numoutlets" : 1, 410 | "outlettype" : [ "" ], 411 | "patching_rect" : [ 629.0, 510.0, 46.0, 22.0 ], 412 | "text" : "r ---ctl5" 413 | } 414 | 415 | } 416 | , { 417 | "box" : { 418 | "id" : "obj-27", 419 | "maxclass" : "newobj", 420 | "numinlets" : 1, 421 | "numoutlets" : 1, 422 | "outlettype" : [ "" ], 423 | "patching_rect" : [ 236.0, 549.0, 107.0, 22.0 ], 424 | "text" : "prepend set_value" 425 | } 426 | 427 | } 428 | , { 429 | "box" : { 430 | "id" : "obj-28", 431 | "maxclass" : "newobj", 432 | "numinlets" : 0, 433 | "numoutlets" : 1, 434 | "outlettype" : [ "" ], 435 | "patching_rect" : [ 236.0, 510.0, 46.0, 22.0 ], 436 | "text" : "r ---ctl4" 437 | } 438 | 439 | } 440 | , { 441 | "box" : { 442 | "id" : "obj-9", 443 | "maxclass" : "newobj", 444 | "numinlets" : 1, 445 | "numoutlets" : 1, 446 | "outlettype" : [ "" ], 447 | "patching_rect" : [ 1441.0, 249.0, 107.0, 22.0 ], 448 | "text" : "prepend set_value" 449 | } 450 | 451 | } 452 | , { 453 | "box" : { 454 | "id" : "obj-10", 455 | "maxclass" : "newobj", 456 | "numinlets" : 0, 457 | "numoutlets" : 1, 458 | "outlettype" : [ "" ], 459 | "patching_rect" : [ 1441.0, 210.0, 46.0, 22.0 ], 460 | "text" : "r ---ctl3" 461 | } 462 | 463 | } 464 | , { 465 | "box" : { 466 | "id" : "obj-7", 467 | "maxclass" : "newobj", 468 | "numinlets" : 1, 469 | "numoutlets" : 1, 470 | "outlettype" : [ "" ], 471 | "patching_rect" : [ 1048.0, 249.0, 107.0, 22.0 ], 472 | "text" : "prepend set_value" 473 | } 474 | 475 | } 476 | , { 477 | "box" : { 478 | "id" : "obj-8", 479 | "maxclass" : "newobj", 480 | "numinlets" : 0, 481 | "numoutlets" : 1, 482 | "outlettype" : [ "" ], 483 | "patching_rect" : [ 1048.0, 210.0, 46.0, 22.0 ], 484 | "text" : "r ---ctl2" 485 | } 486 | 487 | } 488 | , { 489 | "box" : { 490 | "id" : "obj-5", 491 | "maxclass" : "newobj", 492 | "numinlets" : 1, 493 | "numoutlets" : 1, 494 | "outlettype" : [ "" ], 495 | "patching_rect" : [ 629.0, 249.0, 107.0, 22.0 ], 496 | "text" : "prepend set_value" 497 | } 498 | 499 | } 500 | , { 501 | "box" : { 502 | "id" : "obj-6", 503 | "maxclass" : "newobj", 504 | "numinlets" : 0, 505 | "numoutlets" : 1, 506 | "outlettype" : [ "" ], 507 | "patching_rect" : [ 629.0, 210.0, 46.0, 22.0 ], 508 | "text" : "r ---ctl1" 509 | } 510 | 511 | } 512 | , { 513 | "box" : { 514 | "id" : "obj-4", 515 | "maxclass" : "newobj", 516 | "numinlets" : 1, 517 | "numoutlets" : 1, 518 | "outlettype" : [ "" ], 519 | "patching_rect" : [ 236.0, 249.0, 107.0, 22.0 ], 520 | "text" : "prepend set_value" 521 | } 522 | 523 | } 524 | , { 525 | "box" : { 526 | "id" : "obj-2", 527 | "maxclass" : "newobj", 528 | "numinlets" : 0, 529 | "numoutlets" : 1, 530 | "outlettype" : [ "" ], 531 | "patching_rect" : [ 236.0, 210.0, 46.0, 22.0 ], 532 | "text" : "r ---ctl0" 533 | } 534 | 535 | } 536 | , { 537 | "box" : { 538 | "id" : "obj-109", 539 | "maxclass" : "newobj", 540 | "numinlets" : 0, 541 | "numoutlets" : 1, 542 | "outlettype" : [ "" ], 543 | "patching_rect" : [ 1350.0, 510.0, 43.0, 22.0 ], 544 | "text" : "r ---init" 545 | } 546 | 547 | } 548 | , { 549 | "box" : { 550 | "id" : "obj-111", 551 | "maxclass" : "message", 552 | "numinlets" : 2, 553 | "numoutlets" : 1, 554 | "outlettype" : [ "" ], 555 | "patching_rect" : [ 1350.0, 549.0, 51.0, 22.0 ], 556 | "text" : "set_id 7" 557 | } 558 | 559 | } 560 | , { 561 | "box" : { 562 | "id" : "obj-107", 563 | "maxclass" : "newobj", 564 | "numinlets" : 0, 565 | "numoutlets" : 1, 566 | "outlettype" : [ "" ], 567 | "patching_rect" : [ 957.0, 510.0, 43.0, 22.0 ], 568 | "text" : "r ---init" 569 | } 570 | 571 | } 572 | , { 573 | "box" : { 574 | "id" : "obj-108", 575 | "maxclass" : "message", 576 | "numinlets" : 2, 577 | "numoutlets" : 1, 578 | "outlettype" : [ "" ], 579 | "patching_rect" : [ 957.0, 549.0, 51.0, 22.0 ], 580 | "text" : "set_id 6" 581 | } 582 | 583 | } 584 | , { 585 | "box" : { 586 | "id" : "obj-105", 587 | "maxclass" : "newobj", 588 | "numinlets" : 0, 589 | "numoutlets" : 1, 590 | "outlettype" : [ "" ], 591 | "patching_rect" : [ 538.0, 510.0, 43.0, 22.0 ], 592 | "text" : "r ---init" 593 | } 594 | 595 | } 596 | , { 597 | "box" : { 598 | "id" : "obj-106", 599 | "maxclass" : "message", 600 | "numinlets" : 2, 601 | "numoutlets" : 1, 602 | "outlettype" : [ "" ], 603 | "patching_rect" : [ 538.0, 549.0, 51.0, 22.0 ], 604 | "text" : "set_id 5" 605 | } 606 | 607 | } 608 | , { 609 | "box" : { 610 | "id" : "obj-98", 611 | "maxclass" : "newobj", 612 | "numinlets" : 0, 613 | "numoutlets" : 1, 614 | "outlettype" : [ "" ], 615 | "patching_rect" : [ 145.0, 510.0, 43.0, 22.0 ], 616 | "text" : "r ---init" 617 | } 618 | 619 | } 620 | , { 621 | "box" : { 622 | "id" : "obj-99", 623 | "maxclass" : "message", 624 | "numinlets" : 2, 625 | "numoutlets" : 1, 626 | "outlettype" : [ "" ], 627 | "patching_rect" : [ 145.0, 549.0, 51.0, 22.0 ], 628 | "text" : "set_id 4" 629 | } 630 | 631 | } 632 | , { 633 | "box" : { 634 | "id" : "obj-90", 635 | "maxclass" : "newobj", 636 | "numinlets" : 0, 637 | "numoutlets" : 1, 638 | "outlettype" : [ "" ], 639 | "patching_rect" : [ 1350.0, 210.0, 43.0, 22.0 ], 640 | "text" : "r ---init" 641 | } 642 | 643 | } 644 | , { 645 | "box" : { 646 | "id" : "obj-95", 647 | "maxclass" : "message", 648 | "numinlets" : 2, 649 | "numoutlets" : 1, 650 | "outlettype" : [ "" ], 651 | "patching_rect" : [ 1350.0, 249.0, 51.0, 22.0 ], 652 | "text" : "set_id 3" 653 | } 654 | 655 | } 656 | , { 657 | "box" : { 658 | "id" : "obj-88", 659 | "maxclass" : "newobj", 660 | "numinlets" : 0, 661 | "numoutlets" : 1, 662 | "outlettype" : [ "" ], 663 | "patching_rect" : [ 957.0, 210.0, 43.0, 22.0 ], 664 | "text" : "r ---init" 665 | } 666 | 667 | } 668 | , { 669 | "box" : { 670 | "id" : "obj-89", 671 | "maxclass" : "message", 672 | "numinlets" : 2, 673 | "numoutlets" : 1, 674 | "outlettype" : [ "" ], 675 | "patching_rect" : [ 957.0, 249.0, 51.0, 22.0 ], 676 | "text" : "set_id 2" 677 | } 678 | 679 | } 680 | , { 681 | "box" : { 682 | "id" : "obj-86", 683 | "maxclass" : "newobj", 684 | "numinlets" : 0, 685 | "numoutlets" : 1, 686 | "outlettype" : [ "" ], 687 | "patching_rect" : [ 538.0, 210.0, 43.0, 22.0 ], 688 | "text" : "r ---init" 689 | } 690 | 691 | } 692 | , { 693 | "box" : { 694 | "id" : "obj-87", 695 | "maxclass" : "message", 696 | "numinlets" : 2, 697 | "numoutlets" : 1, 698 | "outlettype" : [ "" ], 699 | "patching_rect" : [ 538.0, 249.0, 51.0, 22.0 ], 700 | "text" : "set_id 1" 701 | } 702 | 703 | } 704 | , { 705 | "box" : { 706 | "id" : "obj-85", 707 | "maxclass" : "newobj", 708 | "numinlets" : 0, 709 | "numoutlets" : 1, 710 | "outlettype" : [ "" ], 711 | "patching_rect" : [ 145.0, 210.0, 43.0, 22.0 ], 712 | "text" : "r ---init" 713 | } 714 | 715 | } 716 | , { 717 | "box" : { 718 | "id" : "obj-84", 719 | "maxclass" : "message", 720 | "numinlets" : 2, 721 | "numoutlets" : 1, 722 | "outlettype" : [ "" ], 723 | "patching_rect" : [ 145.0, 249.0, 51.0, 22.0 ], 724 | "text" : "set_id 0" 725 | } 726 | 727 | } 728 | , { 729 | "box" : { 730 | "id" : "obj-26", 731 | "maxclass" : "newobj", 732 | "numinlets" : 0, 733 | "numoutlets" : 1, 734 | "outlettype" : [ "" ], 735 | "patching_rect" : [ 45.0, 45.0, 43.0, 22.0 ], 736 | "text" : "r ---init" 737 | } 738 | 739 | } 740 | , { 741 | "box" : { 742 | "id" : "obj-3", 743 | "maxclass" : "newobj", 744 | "numinlets" : 1, 745 | "numoutlets" : 1, 746 | "outlettype" : [ "" ], 747 | "patching_rect" : [ 45.0, 105.0, 83.0, 22.0 ], 748 | "saved_object_attributes" : { 749 | "filename" : "set-name.js", 750 | "parameter_enable" : 0 751 | } 752 | , 753 | "text" : "js set-name.js" 754 | } 755 | 756 | } 757 | , { 758 | "box" : { 759 | "id" : "obj-38", 760 | "maxclass" : "newobj", 761 | "numinlets" : 0, 762 | "numoutlets" : 1, 763 | "outlettype" : [ "" ], 764 | "patching_rect" : [ 1490.0, 690.0, 80.0, 22.0 ], 765 | "text" : "r ---text_color" 766 | } 767 | 768 | } 769 | , { 770 | "box" : { 771 | "id" : "obj-39", 772 | "maxclass" : "newobj", 773 | "numinlets" : 0, 774 | "numoutlets" : 1, 775 | "outlettype" : [ "" ], 776 | "patching_rect" : [ 1250.0, 549.0, 79.0, 22.0 ], 777 | "text" : "r ---jsui_color" 778 | } 779 | 780 | } 781 | , { 782 | "box" : { 783 | "id" : "obj-43", 784 | "maxclass" : "live.comment", 785 | "numinlets" : 1, 786 | "numoutlets" : 0, 787 | "patching_rect" : [ 1468.0, 732.0, 102.0, 18.0 ], 788 | "presentation" : 1, 789 | "presentation_rect" : [ 147.0, 89.0, 40.0, 18.0 ], 790 | "saved_attribute_attributes" : { 791 | "textcolor" : { 792 | "expression" : "" 793 | } 794 | 795 | } 796 | , 797 | "text" : "Ctrl 8", 798 | "textcolor" : [ 0.494117647058824, 0.494117647058824, 0.509803921568627, 1.0 ], 799 | "textjustification" : 1, 800 | "varname" : "---text7" 801 | } 802 | 803 | } 804 | , { 805 | "box" : { 806 | "id" : "obj-44", 807 | "maxclass" : "newobj", 808 | "numinlets" : 1, 809 | "numoutlets" : 1, 810 | "outlettype" : [ "" ], 811 | "patching_rect" : [ 1350.0, 690.0, 98.0, 22.0 ], 812 | "text" : "prepend rawfloat" 813 | } 814 | 815 | } 816 | , { 817 | "box" : { 818 | "bgmode" : 0, 819 | "border" : 0, 820 | "clickthrough" : 0, 821 | "enablehscroll" : 0, 822 | "enablevscroll" : 0, 823 | "id" : "obj-47", 824 | "lockeddragscroll" : 0, 825 | "lockedsize" : 0, 826 | "maxclass" : "bpatcher", 827 | "name" : "jsui-dial.maxpat", 828 | "numinlets" : 1, 829 | "numoutlets" : 1, 830 | "offset" : [ 0.0, 0.0 ], 831 | "outlettype" : [ "" ], 832 | "patching_rect" : [ 1350.0, 635.0, 36.0, 36.0 ], 833 | "presentation" : 1, 834 | "presentation_rect" : [ 149.0, 104.0, 36.0, 36.0 ], 835 | "varname" : "---dial7", 836 | "viewvisibility" : 1 837 | } 838 | 839 | } 840 | , { 841 | "box" : { 842 | "id" : "obj-48", 843 | "maxclass" : "newobj", 844 | "numinlets" : 0, 845 | "numoutlets" : 1, 846 | "outlettype" : [ "" ], 847 | "patching_rect" : [ 1490.0, 390.0, 80.0, 22.0 ], 848 | "text" : "r ---text_color" 849 | } 850 | 851 | } 852 | , { 853 | "box" : { 854 | "id" : "obj-49", 855 | "maxclass" : "newobj", 856 | "numinlets" : 0, 857 | "numoutlets" : 1, 858 | "outlettype" : [ "" ], 859 | "patching_rect" : [ 1250.0, 249.0, 79.0, 22.0 ], 860 | "text" : "r ---jsui_color" 861 | } 862 | 863 | } 864 | , { 865 | "box" : { 866 | "id" : "obj-61", 867 | "maxclass" : "live.comment", 868 | "numinlets" : 1, 869 | "numoutlets" : 0, 870 | "patching_rect" : [ 1468.0, 432.0, 101.0, 18.0 ], 871 | "presentation" : 1, 872 | "presentation_rect" : [ 147.0, 14.0, 40.0, 18.0 ], 873 | "saved_attribute_attributes" : { 874 | "textcolor" : { 875 | "expression" : "" 876 | } 877 | 878 | } 879 | , 880 | "text" : "Ctrl 4", 881 | "textcolor" : [ 0.494117647058824, 0.494117647058824, 0.509803921568627, 1.0 ], 882 | "textjustification" : 1, 883 | "varname" : "---text3" 884 | } 885 | 886 | } 887 | , { 888 | "box" : { 889 | "id" : "obj-62", 890 | "maxclass" : "newobj", 891 | "numinlets" : 1, 892 | "numoutlets" : 1, 893 | "outlettype" : [ "" ], 894 | "patching_rect" : [ 1350.0, 390.0, 98.0, 22.0 ], 895 | "text" : "prepend rawfloat" 896 | } 897 | 898 | } 899 | , { 900 | "box" : { 901 | "bgmode" : 0, 902 | "border" : 0, 903 | "clickthrough" : 0, 904 | "enablehscroll" : 0, 905 | "enablevscroll" : 0, 906 | "id" : "obj-64", 907 | "lockeddragscroll" : 0, 908 | "lockedsize" : 0, 909 | "maxclass" : "bpatcher", 910 | "name" : "jsui-dial.maxpat", 911 | "numinlets" : 1, 912 | "numoutlets" : 1, 913 | "offset" : [ 0.0, 0.0 ], 914 | "outlettype" : [ "" ], 915 | "patching_rect" : [ 1350.0, 335.0, 36.0, 36.0 ], 916 | "presentation" : 1, 917 | "presentation_rect" : [ 149.0, 29.0, 36.0, 36.0 ], 918 | "varname" : "---dial3", 919 | "viewvisibility" : 1 920 | } 921 | 922 | } 923 | , { 924 | "box" : { 925 | "id" : "obj-67", 926 | "maxclass" : "newobj", 927 | "numinlets" : 0, 928 | "numoutlets" : 1, 929 | "outlettype" : [ "" ], 930 | "patching_rect" : [ 1097.0, 690.0, 80.0, 22.0 ], 931 | "text" : "r ---text_color" 932 | } 933 | 934 | } 935 | , { 936 | "box" : { 937 | "id" : "obj-68", 938 | "maxclass" : "newobj", 939 | "numinlets" : 0, 940 | "numoutlets" : 1, 941 | "outlettype" : [ "" ], 942 | "patching_rect" : [ 857.0, 549.0, 79.0, 22.0 ], 943 | "text" : "r ---jsui_color" 944 | } 945 | 946 | } 947 | , { 948 | "box" : { 949 | "id" : "obj-71", 950 | "maxclass" : "live.comment", 951 | "numinlets" : 1, 952 | "numoutlets" : 0, 953 | "patching_rect" : [ 1075.0, 732.0, 102.0, 18.0 ], 954 | "presentation" : 1, 955 | "presentation_rect" : [ 102.0, 89.0, 40.0, 18.0 ], 956 | "saved_attribute_attributes" : { 957 | "textcolor" : { 958 | "expression" : "" 959 | } 960 | 961 | } 962 | , 963 | "text" : "Ctrl 7", 964 | "textcolor" : [ 0.494117647058824, 0.494117647058824, 0.509803921568627, 1.0 ], 965 | "textjustification" : 1, 966 | "varname" : "---text6" 967 | } 968 | 969 | } 970 | , { 971 | "box" : { 972 | "id" : "obj-72", 973 | "maxclass" : "newobj", 974 | "numinlets" : 1, 975 | "numoutlets" : 1, 976 | "outlettype" : [ "" ], 977 | "patching_rect" : [ 957.0, 690.0, 98.0, 22.0 ], 978 | "text" : "prepend rawfloat" 979 | } 980 | 981 | } 982 | , { 983 | "box" : { 984 | "bgmode" : 0, 985 | "border" : 0, 986 | "clickthrough" : 0, 987 | "enablehscroll" : 0, 988 | "enablevscroll" : 0, 989 | "id" : "obj-74", 990 | "lockeddragscroll" : 0, 991 | "lockedsize" : 0, 992 | "maxclass" : "bpatcher", 993 | "name" : "jsui-dial.maxpat", 994 | "numinlets" : 1, 995 | "numoutlets" : 1, 996 | "offset" : [ 0.0, 0.0 ], 997 | "outlettype" : [ "" ], 998 | "patching_rect" : [ 957.0, 635.0, 36.0, 36.0 ], 999 | "presentation" : 1, 1000 | "presentation_rect" : [ 104.0, 104.0, 36.0, 36.0 ], 1001 | "varname" : "---dial6", 1002 | "viewvisibility" : 1 1003 | } 1004 | 1005 | } 1006 | , { 1007 | "box" : { 1008 | "id" : "obj-75", 1009 | "maxclass" : "newobj", 1010 | "numinlets" : 0, 1011 | "numoutlets" : 1, 1012 | "outlettype" : [ "" ], 1013 | "patching_rect" : [ 1097.0, 390.0, 80.0, 22.0 ], 1014 | "text" : "r ---text_color" 1015 | } 1016 | 1017 | } 1018 | , { 1019 | "box" : { 1020 | "id" : "obj-76", 1021 | "maxclass" : "newobj", 1022 | "numinlets" : 0, 1023 | "numoutlets" : 1, 1024 | "outlettype" : [ "" ], 1025 | "patching_rect" : [ 857.0, 249.0, 79.0, 22.0 ], 1026 | "text" : "r ---jsui_color" 1027 | } 1028 | 1029 | } 1030 | , { 1031 | "box" : { 1032 | "id" : "obj-79", 1033 | "maxclass" : "live.comment", 1034 | "numinlets" : 1, 1035 | "numoutlets" : 0, 1036 | "patching_rect" : [ 1075.0, 432.0, 102.0, 18.0 ], 1037 | "presentation" : 1, 1038 | "presentation_rect" : [ 102.0, 14.0, 40.0, 18.0 ], 1039 | "saved_attribute_attributes" : { 1040 | "textcolor" : { 1041 | "expression" : "" 1042 | } 1043 | 1044 | } 1045 | , 1046 | "text" : "Ctrl 3", 1047 | "textcolor" : [ 0.494117647058824, 0.494117647058824, 0.509803921568627, 1.0 ], 1048 | "textjustification" : 1, 1049 | "varname" : "---text2" 1050 | } 1051 | 1052 | } 1053 | , { 1054 | "box" : { 1055 | "id" : "obj-80", 1056 | "maxclass" : "newobj", 1057 | "numinlets" : 1, 1058 | "numoutlets" : 1, 1059 | "outlettype" : [ "" ], 1060 | "patching_rect" : [ 957.0, 390.0, 98.0, 22.0 ], 1061 | "text" : "prepend rawfloat" 1062 | } 1063 | 1064 | } 1065 | , { 1066 | "box" : { 1067 | "bgmode" : 0, 1068 | "border" : 0, 1069 | "clickthrough" : 0, 1070 | "enablehscroll" : 0, 1071 | "enablevscroll" : 0, 1072 | "id" : "obj-82", 1073 | "lockeddragscroll" : 0, 1074 | "lockedsize" : 0, 1075 | "maxclass" : "bpatcher", 1076 | "name" : "jsui-dial.maxpat", 1077 | "numinlets" : 1, 1078 | "numoutlets" : 1, 1079 | "offset" : [ 0.0, 0.0 ], 1080 | "outlettype" : [ "" ], 1081 | "patching_rect" : [ 957.0, 335.0, 36.0, 36.0 ], 1082 | "presentation" : 1, 1083 | "presentation_rect" : [ 104.0, 29.0, 36.0, 36.0 ], 1084 | "varname" : "---dial2", 1085 | "viewvisibility" : 1 1086 | } 1087 | 1088 | } 1089 | , { 1090 | "box" : { 1091 | "id" : "obj-13", 1092 | "maxclass" : "newobj", 1093 | "numinlets" : 0, 1094 | "numoutlets" : 1, 1095 | "outlettype" : [ "" ], 1096 | "patching_rect" : [ 678.0, 690.0, 80.0, 22.0 ], 1097 | "text" : "r ---text_color" 1098 | } 1099 | 1100 | } 1101 | , { 1102 | "box" : { 1103 | "id" : "obj-14", 1104 | "maxclass" : "newobj", 1105 | "numinlets" : 0, 1106 | "numoutlets" : 1, 1107 | "outlettype" : [ "" ], 1108 | "patching_rect" : [ 438.0, 549.0, 79.0, 22.0 ], 1109 | "text" : "r ---jsui_color" 1110 | } 1111 | 1112 | } 1113 | , { 1114 | "box" : { 1115 | "id" : "obj-17", 1116 | "maxclass" : "live.comment", 1117 | "numinlets" : 1, 1118 | "numoutlets" : 0, 1119 | "patching_rect" : [ 656.0, 732.0, 101.0, 18.0 ], 1120 | "presentation" : 1, 1121 | "presentation_rect" : [ 57.0, 89.0, 40.0, 18.0 ], 1122 | "saved_attribute_attributes" : { 1123 | "textcolor" : { 1124 | "expression" : "" 1125 | } 1126 | 1127 | } 1128 | , 1129 | "text" : "Ctrl 6", 1130 | "textcolor" : [ 0.494117647058824, 0.494117647058824, 0.509803921568627, 1.0 ], 1131 | "textjustification" : 1, 1132 | "varname" : "---text5" 1133 | } 1134 | 1135 | } 1136 | , { 1137 | "box" : { 1138 | "id" : "obj-18", 1139 | "maxclass" : "newobj", 1140 | "numinlets" : 1, 1141 | "numoutlets" : 1, 1142 | "outlettype" : [ "" ], 1143 | "patching_rect" : [ 538.0, 690.0, 98.0, 22.0 ], 1144 | "text" : "prepend rawfloat" 1145 | } 1146 | 1147 | } 1148 | , { 1149 | "box" : { 1150 | "bgmode" : 0, 1151 | "border" : 0, 1152 | "clickthrough" : 0, 1153 | "enablehscroll" : 0, 1154 | "enablevscroll" : 0, 1155 | "id" : "obj-20", 1156 | "lockeddragscroll" : 0, 1157 | "lockedsize" : 0, 1158 | "maxclass" : "bpatcher", 1159 | "name" : "jsui-dial.maxpat", 1160 | "numinlets" : 1, 1161 | "numoutlets" : 1, 1162 | "offset" : [ 0.0, 0.0 ], 1163 | "outlettype" : [ "" ], 1164 | "patching_rect" : [ 538.0, 635.0, 36.0, 36.0 ], 1165 | "presentation" : 1, 1166 | "presentation_rect" : [ 59.0, 104.0, 36.0, 36.0 ], 1167 | "varname" : "---dial5", 1168 | "viewvisibility" : 1 1169 | } 1170 | 1171 | } 1172 | , { 1173 | "box" : { 1174 | "id" : "obj-22", 1175 | "maxclass" : "newobj", 1176 | "numinlets" : 0, 1177 | "numoutlets" : 1, 1178 | "outlettype" : [ "" ], 1179 | "patching_rect" : [ 678.0, 395.0, 80.0, 22.0 ], 1180 | "text" : "r ---text_color" 1181 | } 1182 | 1183 | } 1184 | , { 1185 | "box" : { 1186 | "id" : "obj-23", 1187 | "maxclass" : "newobj", 1188 | "numinlets" : 0, 1189 | "numoutlets" : 1, 1190 | "outlettype" : [ "" ], 1191 | "patching_rect" : [ 438.0, 249.0, 79.0, 22.0 ], 1192 | "text" : "r ---jsui_color" 1193 | } 1194 | 1195 | } 1196 | , { 1197 | "box" : { 1198 | "id" : "obj-29", 1199 | "maxclass" : "live.comment", 1200 | "numinlets" : 1, 1201 | "numoutlets" : 0, 1202 | "patching_rect" : [ 656.0, 437.0, 101.0, 18.0 ], 1203 | "presentation" : 1, 1204 | "presentation_rect" : [ 57.0, 14.0, 40.0, 18.0 ], 1205 | "saved_attribute_attributes" : { 1206 | "textcolor" : { 1207 | "expression" : "" 1208 | } 1209 | 1210 | } 1211 | , 1212 | "text" : "Ctrl 2", 1213 | "textcolor" : [ 0.494117647058824, 0.494117647058824, 0.509803921568627, 1.0 ], 1214 | "textjustification" : 1, 1215 | "varname" : "---text1" 1216 | } 1217 | 1218 | } 1219 | , { 1220 | "box" : { 1221 | "id" : "obj-35", 1222 | "maxclass" : "newobj", 1223 | "numinlets" : 1, 1224 | "numoutlets" : 1, 1225 | "outlettype" : [ "" ], 1226 | "patching_rect" : [ 538.0, 395.0, 98.0, 22.0 ], 1227 | "text" : "prepend rawfloat" 1228 | } 1229 | 1230 | } 1231 | , { 1232 | "box" : { 1233 | "bgmode" : 0, 1234 | "border" : 0, 1235 | "clickthrough" : 0, 1236 | "enablehscroll" : 0, 1237 | "enablevscroll" : 0, 1238 | "id" : "obj-37", 1239 | "lockeddragscroll" : 0, 1240 | "lockedsize" : 0, 1241 | "maxclass" : "bpatcher", 1242 | "name" : "jsui-dial.maxpat", 1243 | "numinlets" : 1, 1244 | "numoutlets" : 1, 1245 | "offset" : [ 0.0, 0.0 ], 1246 | "outlettype" : [ "" ], 1247 | "patching_rect" : [ 538.0, 340.0, 36.0, 36.0 ], 1248 | "presentation" : 1, 1249 | "presentation_rect" : [ 59.0, 29.0, 36.0, 36.0 ], 1250 | "varname" : "---dial1", 1251 | "viewvisibility" : 1 1252 | } 1253 | 1254 | } 1255 | , { 1256 | "box" : { 1257 | "id" : "obj-52", 1258 | "maxclass" : "newobj", 1259 | "numinlets" : 0, 1260 | "numoutlets" : 1, 1261 | "outlettype" : [ "" ], 1262 | "patching_rect" : [ 285.0, 690.0, 80.0, 22.0 ], 1263 | "text" : "r ---text_color" 1264 | } 1265 | 1266 | } 1267 | , { 1268 | "box" : { 1269 | "id" : "obj-53", 1270 | "maxclass" : "newobj", 1271 | "numinlets" : 0, 1272 | "numoutlets" : 1, 1273 | "outlettype" : [ "" ], 1274 | "patching_rect" : [ 45.0, 549.0, 79.0, 22.0 ], 1275 | "text" : "r ---jsui_color" 1276 | } 1277 | 1278 | } 1279 | , { 1280 | "box" : { 1281 | "id" : "obj-56", 1282 | "maxclass" : "live.comment", 1283 | "numinlets" : 1, 1284 | "numoutlets" : 0, 1285 | "patching_rect" : [ 263.0, 732.0, 100.0, 18.0 ], 1286 | "presentation" : 1, 1287 | "presentation_rect" : [ 12.0, 89.0, 40.0, 18.0 ], 1288 | "saved_attribute_attributes" : { 1289 | "textcolor" : { 1290 | "expression" : "" 1291 | } 1292 | 1293 | } 1294 | , 1295 | "text" : "Ctrl 5", 1296 | "textcolor" : [ 0.494117647058824, 0.494117647058824, 0.509803921568627, 1.0 ], 1297 | "textjustification" : 1, 1298 | "varname" : "---text4" 1299 | } 1300 | 1301 | } 1302 | , { 1303 | "box" : { 1304 | "id" : "obj-57", 1305 | "maxclass" : "newobj", 1306 | "numinlets" : 1, 1307 | "numoutlets" : 1, 1308 | "outlettype" : [ "" ], 1309 | "patching_rect" : [ 145.0, 690.0, 98.0, 22.0 ], 1310 | "text" : "prepend rawfloat" 1311 | } 1312 | 1313 | } 1314 | , { 1315 | "box" : { 1316 | "bgmode" : 0, 1317 | "border" : 0, 1318 | "clickthrough" : 0, 1319 | "enablehscroll" : 0, 1320 | "enablevscroll" : 0, 1321 | "id" : "obj-59", 1322 | "lockeddragscroll" : 0, 1323 | "lockedsize" : 0, 1324 | "maxclass" : "bpatcher", 1325 | "name" : "jsui-dial.maxpat", 1326 | "numinlets" : 1, 1327 | "numoutlets" : 1, 1328 | "offset" : [ 0.0, 0.0 ], 1329 | "outlettype" : [ "" ], 1330 | "patching_rect" : [ 145.0, 635.0, 36.0, 36.0 ], 1331 | "presentation" : 1, 1332 | "presentation_rect" : [ 14.0, 104.0, 36.0, 36.0 ], 1333 | "varname" : "---dial4", 1334 | "viewvisibility" : 1 1335 | } 1336 | 1337 | } 1338 | , { 1339 | "box" : { 1340 | "id" : "obj-51", 1341 | "maxclass" : "newobj", 1342 | "numinlets" : 0, 1343 | "numoutlets" : 1, 1344 | "outlettype" : [ "" ], 1345 | "patching_rect" : [ 285.0, 390.0, 80.0, 22.0 ], 1346 | "text" : "r ---text_color" 1347 | } 1348 | 1349 | } 1350 | , { 1351 | "box" : { 1352 | "id" : "obj-34", 1353 | "maxclass" : "newobj", 1354 | "numinlets" : 0, 1355 | "numoutlets" : 1, 1356 | "outlettype" : [ "" ], 1357 | "patching_rect" : [ 45.0, 249.0, 79.0, 22.0 ], 1358 | "text" : "r ---jsui_color" 1359 | } 1360 | 1361 | } 1362 | , { 1363 | "box" : { 1364 | "id" : "obj-21", 1365 | "maxclass" : "live.comment", 1366 | "numinlets" : 1, 1367 | "numoutlets" : 0, 1368 | "patching_rect" : [ 263.0, 432.0, 102.0, 18.0 ], 1369 | "presentation" : 1, 1370 | "presentation_rect" : [ 12.0, 14.0, 40.0, 18.0 ], 1371 | "saved_attribute_attributes" : { 1372 | "textcolor" : { 1373 | "expression" : "" 1374 | } 1375 | 1376 | } 1377 | , 1378 | "text" : "Ctrl 1", 1379 | "textcolor" : [ 0.494117647058824, 0.494117647058824, 0.509803921568627, 1.0 ], 1380 | "textjustification" : 1, 1381 | "varname" : "---text0" 1382 | } 1383 | 1384 | } 1385 | , { 1386 | "box" : { 1387 | "id" : "obj-12", 1388 | "maxclass" : "newobj", 1389 | "numinlets" : 1, 1390 | "numoutlets" : 1, 1391 | "outlettype" : [ "" ], 1392 | "patching_rect" : [ 145.0, 390.0, 98.0, 22.0 ], 1393 | "text" : "prepend rawfloat" 1394 | } 1395 | 1396 | } 1397 | , { 1398 | "box" : { 1399 | "args" : [ "set_style", ",", "set_range" ], 1400 | "bgmode" : 0, 1401 | "border" : 0, 1402 | "clickthrough" : 0, 1403 | "enablehscroll" : 0, 1404 | "enablevscroll" : 0, 1405 | "id" : "obj-1", 1406 | "lockeddragscroll" : 0, 1407 | "lockedsize" : 0, 1408 | "maxclass" : "bpatcher", 1409 | "name" : "jsui-dial.maxpat", 1410 | "numinlets" : 1, 1411 | "numoutlets" : 1, 1412 | "offset" : [ 0.0, 0.0 ], 1413 | "outlettype" : [ "" ], 1414 | "patching_rect" : [ 145.0, 335.0, 36.0, 36.0 ], 1415 | "presentation" : 1, 1416 | "presentation_rect" : [ 14.0, 29.0, 36.0, 36.0 ], 1417 | "varname" : "---dial0", 1418 | "viewvisibility" : 1 1419 | } 1420 | 1421 | } 1422 | ], 1423 | "lines" : [ { 1424 | "patchline" : { 1425 | "destination" : [ "obj-12", 0 ], 1426 | "source" : [ "obj-1", 0 ] 1427 | } 1428 | 1429 | } 1430 | , { 1431 | "patchline" : { 1432 | "destination" : [ "obj-9", 0 ], 1433 | "source" : [ "obj-10", 0 ] 1434 | } 1435 | 1436 | } 1437 | , { 1438 | "patchline" : { 1439 | "destination" : [ "obj-106", 0 ], 1440 | "source" : [ "obj-105", 0 ] 1441 | } 1442 | 1443 | } 1444 | , { 1445 | "patchline" : { 1446 | "destination" : [ "obj-20", 0 ], 1447 | "source" : [ "obj-106", 0 ] 1448 | } 1449 | 1450 | } 1451 | , { 1452 | "patchline" : { 1453 | "destination" : [ "obj-108", 0 ], 1454 | "source" : [ "obj-107", 0 ] 1455 | } 1456 | 1457 | } 1458 | , { 1459 | "patchline" : { 1460 | "destination" : [ "obj-74", 0 ], 1461 | "source" : [ "obj-108", 0 ] 1462 | } 1463 | 1464 | } 1465 | , { 1466 | "patchline" : { 1467 | "destination" : [ "obj-111", 0 ], 1468 | "source" : [ "obj-109", 0 ] 1469 | } 1470 | 1471 | } 1472 | , { 1473 | "patchline" : { 1474 | "destination" : [ "obj-47", 0 ], 1475 | "midpoints" : [ 1450.5, 602.5, 1359.5, 602.5 ], 1476 | "source" : [ "obj-11", 0 ] 1477 | } 1478 | 1479 | } 1480 | , { 1481 | "patchline" : { 1482 | "destination" : [ "obj-47", 0 ], 1483 | "source" : [ "obj-111", 0 ] 1484 | } 1485 | 1486 | } 1487 | , { 1488 | "patchline" : { 1489 | "destination" : [ "obj-30", 0 ], 1490 | "source" : [ "obj-12", 0 ] 1491 | } 1492 | 1493 | } 1494 | , { 1495 | "patchline" : { 1496 | "destination" : [ "obj-17", 0 ], 1497 | "source" : [ "obj-13", 0 ] 1498 | } 1499 | 1500 | } 1501 | , { 1502 | "patchline" : { 1503 | "destination" : [ "obj-20", 0 ], 1504 | "midpoints" : [ 447.5, 602.5, 547.5, 602.5 ], 1505 | "source" : [ "obj-14", 0 ] 1506 | } 1507 | 1508 | } 1509 | , { 1510 | "patchline" : { 1511 | "destination" : [ "obj-11", 0 ], 1512 | "source" : [ "obj-15", 0 ] 1513 | } 1514 | 1515 | } 1516 | , { 1517 | "patchline" : { 1518 | "destination" : [ "obj-74", 0 ], 1519 | "midpoints" : [ 1057.5, 602.5, 966.5, 602.5 ], 1520 | "source" : [ "obj-16", 0 ] 1521 | } 1522 | 1523 | } 1524 | , { 1525 | "patchline" : { 1526 | "destination" : [ "obj-41", 0 ], 1527 | "source" : [ "obj-18", 0 ] 1528 | } 1529 | 1530 | } 1531 | , { 1532 | "patchline" : { 1533 | "destination" : [ "obj-16", 0 ], 1534 | "source" : [ "obj-19", 0 ] 1535 | } 1536 | 1537 | } 1538 | , { 1539 | "patchline" : { 1540 | "destination" : [ "obj-4", 0 ], 1541 | "source" : [ "obj-2", 0 ] 1542 | } 1543 | 1544 | } 1545 | , { 1546 | "patchline" : { 1547 | "destination" : [ "obj-18", 0 ], 1548 | "source" : [ "obj-20", 0 ] 1549 | } 1550 | 1551 | } 1552 | , { 1553 | "patchline" : { 1554 | "destination" : [ "obj-29", 0 ], 1555 | "source" : [ "obj-22", 0 ] 1556 | } 1557 | 1558 | } 1559 | , { 1560 | "patchline" : { 1561 | "destination" : [ "obj-37", 0 ], 1562 | "midpoints" : [ 447.5, 305.0, 547.5, 305.0 ], 1563 | "source" : [ "obj-23", 0 ] 1564 | } 1565 | 1566 | } 1567 | , { 1568 | "patchline" : { 1569 | "destination" : [ "obj-20", 0 ], 1570 | "midpoints" : [ 638.5, 602.5, 547.5, 602.5 ], 1571 | "source" : [ "obj-24", 0 ] 1572 | } 1573 | 1574 | } 1575 | , { 1576 | "patchline" : { 1577 | "destination" : [ "obj-24", 0 ], 1578 | "source" : [ "obj-25", 0 ] 1579 | } 1580 | 1581 | } 1582 | , { 1583 | "patchline" : { 1584 | "destination" : [ "obj-40", 0 ], 1585 | "source" : [ "obj-26", 0 ] 1586 | } 1587 | 1588 | } 1589 | , { 1590 | "patchline" : { 1591 | "destination" : [ "obj-59", 0 ], 1592 | "midpoints" : [ 245.5, 602.5, 154.5, 602.5 ], 1593 | "source" : [ "obj-27", 0 ] 1594 | } 1595 | 1596 | } 1597 | , { 1598 | "patchline" : { 1599 | "destination" : [ "obj-27", 0 ], 1600 | "source" : [ "obj-28", 0 ] 1601 | } 1602 | 1603 | } 1604 | , { 1605 | "patchline" : { 1606 | "destination" : [ "obj-46", 0 ], 1607 | "source" : [ "obj-3", 0 ] 1608 | } 1609 | 1610 | } 1611 | , { 1612 | "patchline" : { 1613 | "destination" : [ "obj-1", 0 ], 1614 | "midpoints" : [ 54.5, 302.5, 154.5, 302.5 ], 1615 | "source" : [ "obj-34", 0 ] 1616 | } 1617 | 1618 | } 1619 | , { 1620 | "patchline" : { 1621 | "destination" : [ "obj-31", 0 ], 1622 | "source" : [ "obj-35", 0 ] 1623 | } 1624 | 1625 | } 1626 | , { 1627 | "patchline" : { 1628 | "destination" : [ "obj-35", 0 ], 1629 | "source" : [ "obj-37", 0 ] 1630 | } 1631 | 1632 | } 1633 | , { 1634 | "patchline" : { 1635 | "destination" : [ "obj-43", 0 ], 1636 | "source" : [ "obj-38", 0 ] 1637 | } 1638 | 1639 | } 1640 | , { 1641 | "patchline" : { 1642 | "destination" : [ "obj-47", 0 ], 1643 | "midpoints" : [ 1259.5, 602.5, 1359.5, 602.5 ], 1644 | "source" : [ "obj-39", 0 ] 1645 | } 1646 | 1647 | } 1648 | , { 1649 | "patchline" : { 1650 | "destination" : [ "obj-1", 0 ], 1651 | "midpoints" : [ 245.5, 302.5, 154.5, 302.5 ], 1652 | "source" : [ "obj-4", 0 ] 1653 | } 1654 | 1655 | } 1656 | , { 1657 | "patchline" : { 1658 | "destination" : [ "obj-3", 0 ], 1659 | "source" : [ "obj-40", 0 ] 1660 | } 1661 | 1662 | } 1663 | , { 1664 | "patchline" : { 1665 | "destination" : [ "obj-45", 0 ], 1666 | "source" : [ "obj-44", 0 ] 1667 | } 1668 | 1669 | } 1670 | , { 1671 | "patchline" : { 1672 | "destination" : [ "obj-44", 0 ], 1673 | "source" : [ "obj-47", 0 ] 1674 | } 1675 | 1676 | } 1677 | , { 1678 | "patchline" : { 1679 | "destination" : [ "obj-61", 0 ], 1680 | "source" : [ "obj-48", 0 ] 1681 | } 1682 | 1683 | } 1684 | , { 1685 | "patchline" : { 1686 | "destination" : [ "obj-64", 0 ], 1687 | "midpoints" : [ 1259.5, 302.5, 1359.5, 302.5 ], 1688 | "source" : [ "obj-49", 0 ] 1689 | } 1690 | 1691 | } 1692 | , { 1693 | "patchline" : { 1694 | "destination" : [ "obj-37", 0 ], 1695 | "midpoints" : [ 638.5, 305.0, 547.5, 305.0 ], 1696 | "source" : [ "obj-5", 0 ] 1697 | } 1698 | 1699 | } 1700 | , { 1701 | "patchline" : { 1702 | "destination" : [ "obj-54", 0 ], 1703 | "source" : [ "obj-50", 0 ] 1704 | } 1705 | 1706 | } 1707 | , { 1708 | "patchline" : { 1709 | "destination" : [ "obj-21", 0 ], 1710 | "source" : [ "obj-51", 0 ] 1711 | } 1712 | 1713 | } 1714 | , { 1715 | "patchline" : { 1716 | "destination" : [ "obj-56", 0 ], 1717 | "source" : [ "obj-52", 0 ] 1718 | } 1719 | 1720 | } 1721 | , { 1722 | "patchline" : { 1723 | "destination" : [ "obj-59", 0 ], 1724 | "midpoints" : [ 54.5, 602.5, 154.5, 602.5 ], 1725 | "source" : [ "obj-53", 0 ] 1726 | } 1727 | 1728 | } 1729 | , { 1730 | "patchline" : { 1731 | "destination" : [ "obj-21", 0 ], 1732 | "source" : [ "obj-54", 0 ] 1733 | } 1734 | 1735 | } 1736 | , { 1737 | "patchline" : { 1738 | "destination" : [ "obj-36", 0 ], 1739 | "source" : [ "obj-57", 0 ] 1740 | } 1741 | 1742 | } 1743 | , { 1744 | "patchline" : { 1745 | "destination" : [ "obj-57", 0 ], 1746 | "source" : [ "obj-59", 0 ] 1747 | } 1748 | 1749 | } 1750 | , { 1751 | "patchline" : { 1752 | "destination" : [ "obj-5", 0 ], 1753 | "source" : [ "obj-6", 0 ] 1754 | } 1755 | 1756 | } 1757 | , { 1758 | "patchline" : { 1759 | "destination" : [ "obj-29", 0 ], 1760 | "source" : [ "obj-60", 0 ] 1761 | } 1762 | 1763 | } 1764 | , { 1765 | "patchline" : { 1766 | "destination" : [ "obj-33", 0 ], 1767 | "source" : [ "obj-62", 0 ] 1768 | } 1769 | 1770 | } 1771 | , { 1772 | "patchline" : { 1773 | "destination" : [ "obj-60", 0 ], 1774 | "source" : [ "obj-63", 0 ] 1775 | } 1776 | 1777 | } 1778 | , { 1779 | "patchline" : { 1780 | "destination" : [ "obj-62", 0 ], 1781 | "source" : [ "obj-64", 0 ] 1782 | } 1783 | 1784 | } 1785 | , { 1786 | "patchline" : { 1787 | "destination" : [ "obj-61", 0 ], 1788 | "source" : [ "obj-65", 0 ] 1789 | } 1790 | 1791 | } 1792 | , { 1793 | "patchline" : { 1794 | "destination" : [ "obj-65", 0 ], 1795 | "source" : [ "obj-66", 0 ] 1796 | } 1797 | 1798 | } 1799 | , { 1800 | "patchline" : { 1801 | "destination" : [ "obj-71", 0 ], 1802 | "source" : [ "obj-67", 0 ] 1803 | } 1804 | 1805 | } 1806 | , { 1807 | "patchline" : { 1808 | "destination" : [ "obj-74", 0 ], 1809 | "midpoints" : [ 866.5, 602.5, 966.5, 602.5 ], 1810 | "source" : [ "obj-68", 0 ] 1811 | } 1812 | 1813 | } 1814 | , { 1815 | "patchline" : { 1816 | "destination" : [ "obj-79", 0 ], 1817 | "source" : [ "obj-69", 0 ] 1818 | } 1819 | 1820 | } 1821 | , { 1822 | "patchline" : { 1823 | "destination" : [ "obj-82", 0 ], 1824 | "midpoints" : [ 1057.5, 302.5, 966.5, 302.5 ], 1825 | "source" : [ "obj-7", 0 ] 1826 | } 1827 | 1828 | } 1829 | , { 1830 | "patchline" : { 1831 | "destination" : [ "obj-69", 0 ], 1832 | "source" : [ "obj-70", 0 ] 1833 | } 1834 | 1835 | } 1836 | , { 1837 | "patchline" : { 1838 | "destination" : [ "obj-42", 0 ], 1839 | "source" : [ "obj-72", 0 ] 1840 | } 1841 | 1842 | } 1843 | , { 1844 | "patchline" : { 1845 | "destination" : [ "obj-43", 0 ], 1846 | "source" : [ "obj-73", 0 ] 1847 | } 1848 | 1849 | } 1850 | , { 1851 | "patchline" : { 1852 | "destination" : [ "obj-72", 0 ], 1853 | "source" : [ "obj-74", 0 ] 1854 | } 1855 | 1856 | } 1857 | , { 1858 | "patchline" : { 1859 | "destination" : [ "obj-79", 0 ], 1860 | "source" : [ "obj-75", 0 ] 1861 | } 1862 | 1863 | } 1864 | , { 1865 | "patchline" : { 1866 | "destination" : [ "obj-82", 0 ], 1867 | "midpoints" : [ 866.5, 302.5, 966.5, 302.5 ], 1868 | "source" : [ "obj-76", 0 ] 1869 | } 1870 | 1871 | } 1872 | , { 1873 | "patchline" : { 1874 | "destination" : [ "obj-73", 0 ], 1875 | "source" : [ "obj-77", 0 ] 1876 | } 1877 | 1878 | } 1879 | , { 1880 | "patchline" : { 1881 | "destination" : [ "obj-71", 0 ], 1882 | "source" : [ "obj-78", 0 ] 1883 | } 1884 | 1885 | } 1886 | , { 1887 | "patchline" : { 1888 | "destination" : [ "obj-7", 0 ], 1889 | "source" : [ "obj-8", 0 ] 1890 | } 1891 | 1892 | } 1893 | , { 1894 | "patchline" : { 1895 | "destination" : [ "obj-32", 0 ], 1896 | "source" : [ "obj-80", 0 ] 1897 | } 1898 | 1899 | } 1900 | , { 1901 | "patchline" : { 1902 | "destination" : [ "obj-78", 0 ], 1903 | "source" : [ "obj-81", 0 ] 1904 | } 1905 | 1906 | } 1907 | , { 1908 | "patchline" : { 1909 | "destination" : [ "obj-80", 0 ], 1910 | "source" : [ "obj-82", 0 ] 1911 | } 1912 | 1913 | } 1914 | , { 1915 | "patchline" : { 1916 | "destination" : [ "obj-17", 0 ], 1917 | "source" : [ "obj-83", 0 ] 1918 | } 1919 | 1920 | } 1921 | , { 1922 | "patchline" : { 1923 | "destination" : [ "obj-1", 0 ], 1924 | "source" : [ "obj-84", 0 ] 1925 | } 1926 | 1927 | } 1928 | , { 1929 | "patchline" : { 1930 | "destination" : [ "obj-84", 0 ], 1931 | "source" : [ "obj-85", 0 ] 1932 | } 1933 | 1934 | } 1935 | , { 1936 | "patchline" : { 1937 | "destination" : [ "obj-87", 0 ], 1938 | "source" : [ "obj-86", 0 ] 1939 | } 1940 | 1941 | } 1942 | , { 1943 | "patchline" : { 1944 | "destination" : [ "obj-37", 0 ], 1945 | "source" : [ "obj-87", 0 ] 1946 | } 1947 | 1948 | } 1949 | , { 1950 | "patchline" : { 1951 | "destination" : [ "obj-89", 0 ], 1952 | "source" : [ "obj-88", 0 ] 1953 | } 1954 | 1955 | } 1956 | , { 1957 | "patchline" : { 1958 | "destination" : [ "obj-82", 0 ], 1959 | "source" : [ "obj-89", 0 ] 1960 | } 1961 | 1962 | } 1963 | , { 1964 | "patchline" : { 1965 | "destination" : [ "obj-64", 0 ], 1966 | "midpoints" : [ 1450.5, 302.5, 1359.5, 302.5 ], 1967 | "source" : [ "obj-9", 0 ] 1968 | } 1969 | 1970 | } 1971 | , { 1972 | "patchline" : { 1973 | "destination" : [ "obj-95", 0 ], 1974 | "source" : [ "obj-90", 0 ] 1975 | } 1976 | 1977 | } 1978 | , { 1979 | "patchline" : { 1980 | "destination" : [ "obj-83", 0 ], 1981 | "source" : [ "obj-91", 0 ] 1982 | } 1983 | 1984 | } 1985 | , { 1986 | "patchline" : { 1987 | "destination" : [ "obj-56", 0 ], 1988 | "source" : [ "obj-92", 0 ] 1989 | } 1990 | 1991 | } 1992 | , { 1993 | "patchline" : { 1994 | "destination" : [ "obj-92", 0 ], 1995 | "source" : [ "obj-93", 0 ] 1996 | } 1997 | 1998 | } 1999 | , { 2000 | "patchline" : { 2001 | "destination" : [ "obj-64", 0 ], 2002 | "source" : [ "obj-95", 0 ] 2003 | } 2004 | 2005 | } 2006 | , { 2007 | "patchline" : { 2008 | "destination" : [ "obj-99", 0 ], 2009 | "source" : [ "obj-98", 0 ] 2010 | } 2011 | 2012 | } 2013 | , { 2014 | "patchline" : { 2015 | "destination" : [ "obj-59", 0 ], 2016 | "source" : [ "obj-99", 0 ] 2017 | } 2018 | 2019 | } 2020 | ], 2021 | "autosave" : 0 2022 | } 2023 | 2024 | } 2025 | --------------------------------------------------------------------------------