From 240e35be80dbb5332664b886a2563079e6511e72 Mon Sep 17 00:00:00 2001 From: Tom Igoe Date: Thu, 16 Apr 2009 19:09:13 +0000 Subject: [PATCH] max patch updated --- .../VirtualColorMixer/VirtualColorMixer.pde | 941 +++++++++++++----- 1 file changed, 684 insertions(+), 257 deletions(-) diff --git a/build/shared/dist/examples/Communication/VirtualColorMixer/VirtualColorMixer.pde b/build/shared/dist/examples/Communication/VirtualColorMixer/VirtualColorMixer.pde index b67711765..c34852002 100644 --- a/build/shared/dist/examples/Communication/VirtualColorMixer/VirtualColorMixer.pde +++ b/build/shared/dist/examples/Communication/VirtualColorMixer/VirtualColorMixer.pde @@ -1,6 +1,23 @@ -int redPin = 0; -int greenPin = 1; -int bluePin = 2; +/* + This example reads three analog sensors (potentiometers are easiest) + and sends their values serially. The Processing and Max/MSP programs at the bottom + take those three values and use them to change the background color of the screen. + + The circuit: + * potentiometers attached to analog inputs 0, 1, and 2 + + http://www.arduino.cc/en/Tutorial/VirtualColorMixer + + created 2 Dec 2006 + by David A. Mellis + modified 14 Apr 2009 + by Tom Igoe and Scott Fitzgerald + + */ + +#define redPin 0 +#define greenPin 1 +#define bluePin 2 void setup() { @@ -9,262 +26,672 @@ void setup() void loop() { - Serial.print("R"); - Serial.println(analogRead(redPin)); - Serial.print("G"); - Serial.println(analogRead(greenPin)); - Serial.print("B"); + Serial.print(analogRead(redPin)); + Serial.print(","); + Serial.print(analogRead(greenPin)); + Serial.print(","); Serial.println(analogRead(bluePin)); - delay(100); } - + /* Processing code for this example - -// Color Mixer -// by David A. Mellis -// -// Created 2 December 2006 -// -// based on Analog In -// by Josh Nimoy. -// -// Created 8 February 2003 -// Updated 2 April 2005 - -import processing.serial.*; - -String buff = ""; -int rval = 0, gval = 0, bval = 0; -int NEWLINE = 10; - -Serial port; - -void setup() -{ - size(200, 200); - - // Print a list in case COM1 doesn't work out - println("Available serial ports:"); - println(Serial.list()); - - //port = new Serial(this, "COM1", 9600); - // Uses the first available port - port = new Serial(this, Serial.list()[0], 9600); -} - -void draw() -{ - while (port.available() > 0) { - serialEvent(port.read()); - } - background(rval, gval, bval); -} - -void serialEvent(int serial) -{ - // If the variable "serial" is not equal to the value for - // a new line, add the value to the variable "buff". If the - // value "serial" is equal to the value for a new line, - // save the value of the buffer into the variable "val". - if(serial != NEWLINE) { - buff += char(serial); - } else { - // The first character tells us which color this value is for - char c = buff.charAt(0); - // Remove it from the string - buff = buff.substring(1); - // Discard the carriage return at the end of the buffer - buff = buff.substring(0, buff.length()-1); - // Parse the String into an integer - if (c == 'R') - rval = Integer.parseInt(buff); - else if (c == 'G') - gval = Integer.parseInt(buff); - else if (c == 'B') - bval = Integer.parseInt(buff); - // Clear the value of "buff" - buff = ""; - } -} -*/ + + + import processing.serial.*; + + float redValue = 0; // red value + float greenValue = 0; // green value + float blueValue = 0; // blue value + + Serial myPort; + + void setup() { + size(200, 200); + + // List all the available serial ports + println(Serial.list()); + // I know that the first port in the serial list on my mac + // is always my Arduino, so I open Serial.list()[0]. + // Open whatever port is the one you're using. + myPort = new Serial(this, Serial.list()[0], 9600); + // don't generate a serialEvent() unless you get a newline character: + myPort.bufferUntil('\n'); + } + + void draw() { + // set the background color with the color values: + background(redValue, greenValue, blueValue); + } + + void serialEvent(Serial myPort) { + // get the ASCII string: + String inString = myPort.readStringUntil('\n'); + + if (inString != null) { + // trim off any whitespace: + inString = trim(inString); + // split the string on the commas and convert the + // resulting substrings into an integer array: + float[] colors = float(split(inString, ",")); + // if the array has at least three elements, you know + // you got the whole thing. Put the numbers in the + // color variables: + if (colors.length >=3) { + // map them to the range 0-255: + redValue = map(colors[0], 0, 1023, 0, 255); + greenValue = map(colors[1], 0, 1023, 0, 255); + blueValue = map(colors[2], 0, 1023, 0, 255); + } + } + } + */ /* Max/MSP patch for this example - -max v2; -#N vpatcher 0 44 587 638; -#P window setfont "Sans Serif" 9.; -#P comment 137 34 100 196617 Read the serial port every two milliseconds; -#P window linecount 1; -#P newex 156 276 27 196617 / 4; -#P number 156 254 35 9 0 1023 3 3 0 0 0 221 221 221 222 222 222 0 0 0; -#P newex 106 276 27 196617 / 4; -#P number 106 254 35 9 0 1023 3 3 0 0 0 221 221 221 222 222 222 0 0 0; -#P newex 55 276 27 196617 / 4; -#P number 55 254 35 9 0 1023 3 3 0 0 0 221 221 221 222 222 222 0 0 0; -#P hidden newex 55 303 112 196617 bgcolor 220 120 192; -#P user multiSlider 167 145 125 91 0. 1023. 1 3449 15 0 0 2 0 0 0; -#M frgb 0 0 0; -#M brgb 255 255 255; -#M rgb2 127 127 127; -#M rgb3 0 0 0; -#M rgb4 37 52 91; -#M rgb5 74 105 182; -#M rgb6 112 158 18; -#M rgb7 149 211 110; -#M rgb8 187 9 201; -#M rgb9 224 62 37; -#M rgb10 7 114 128; -#P user multiSlider 438 145 125 91 0. 1023. 1 3449 15 0 0 2 0 0 0; -#M frgb 0 0 0; -#M brgb 255 255 255; -#M rgb2 127 127 127; -#M rgb3 0 0 0; -#M rgb4 37 52 91; -#M rgb5 74 105 182; -#M rgb6 112 158 18; -#M rgb7 149 211 110; -#M rgb8 187 9 201; -#M rgb9 224 62 37; -#M rgb10 7 114 128; -#P user multiSlider 301 144 125 91 0. 1023. 1 3449 15 0 0 2 0 0 0; -#M frgb 0 0 0; -#M brgb 255 255 255; -#M rgb2 127 127 127; -#M rgb3 0 0 0; -#M rgb4 37 52 91; -#M rgb5 74 105 182; -#M rgb6 112 158 18; -#M rgb7 149 211 110; -#M rgb8 187 9 201; -#M rgb9 224 62 37; -#M rgb10 7 114 128; -#N vpatcher 20 74 303 387; -#P window setfont "Sans Serif" 9.; -#P newex 92 248 62 196617 fromsymbol; -#B color 5; -#P message 134 231 73 196617 -; -#P newex 134 211 62 196617 prepend set; -#B color 5; -#P newex 92 211 40 196617 itoa; -#B color 5; -#P newex 92 191 55 196617 zl group 4; -#P newex 50 158 52 196617 select 10; -#P message 130 86 14 196617 1; -#P message 112 86 14 196617 0; -#P newex 50 132 27 196617 gate; -#P newex 130 64 52 196617 select 82; -#P comment 151 45 25 196617 "R"; -#P inlet 130 44 15 0; -#P outlet 92 270 15 0; -#P fasten 5 0 4 0 117 111 55 111; -#P fasten 6 0 4 0 135 111 55 111; -#P connect 4 0 7 0; -#P fasten 3 1 4 1 177 128 72 128; -#P connect 7 0 8 0; -#P connect 7 1 8 0; -#P connect 8 0 9 0; -#P connect 9 0 12 0; -#P connect 12 0 0 0; -#P connect 7 0 5 0; -#P connect 1 0 3 0; -#P connect 3 0 6 0; -#P connect 9 0 10 0; -#P connect 10 0 11 0; -#P pop; -#P newobj 55 96 49 196617 p parseR; -#N vpatcher 20 74 620 474; -#P window setfont "Sans Serif" 9.; -#P newex 92 250 62 196617 fromsymbol; -#B color 5; -#P message 134 233 73 196617 501 -; -#P newex 134 213 62 196617 prepend set; -#B color 5; -#P newex 92 213 40 196617 itoa; -#B color 5; -#P newex 92 193 55 196617 zl group 4; -#P newex 50 160 52 196617 select 10; -#P message 130 88 14 196617 1; -#P message 112 88 14 196617 0; -#P newex 50 134 27 196617 gate; -#P newex 130 66 52 196617 select 66; -#P comment 169 50 25 196617 "B"; -#P inlet 130 46 15 0; -#P outlet 92 272 15 0; -#P fasten 5 0 4 0 117 113 55 113; -#P fasten 6 0 4 0 135 113 55 113; -#P connect 4 0 7 0; -#P fasten 3 1 4 1 177 130 72 130; -#P connect 7 0 8 0; -#P connect 7 1 8 0; -#P connect 8 0 9 0; -#P connect 9 0 12 0; -#P connect 12 0 0 0; -#P connect 7 0 5 0; -#P connect 1 0 3 0; -#P connect 3 0 6 0; -#P connect 9 0 10 0; -#P connect 10 0 11 0; -#P pop; -#P newobj 156 96 49 196617 p parseB; -#N vpatcher 589 252 861 563; -#P window setfont "Sans Serif" 9.; -#P comment 153 47 25 196617 "G"; -#P newex 92 250 62 196617 fromsymbol; -#B color 5; -#P message 134 233 73 196617 718 -; -#P newex 134 213 62 196617 prepend set; -#B color 5; -#P newex 92 213 40 196617 itoa; -#B color 5; -#P newex 92 193 55 196617 zl group 4; -#P newex 50 160 52 196617 select 10; -#P message 130 88 14 196617 1; -#P message 112 88 14 196617 0; -#P newex 50 134 27 196617 gate; -#P newex 130 66 52 196617 select 71; -#P inlet 130 46 15 0; -#P outlet 92 272 15 0; -#P fasten 5 0 3 0 135 113 55 113; -#P fasten 4 0 3 0 117 113 55 113; -#P connect 3 0 6 0; -#P fasten 2 1 3 1 177 130 72 130; -#P connect 6 0 7 0; -#P connect 6 1 7 0; -#P connect 7 0 8 0; -#P connect 8 0 11 0; -#P connect 11 0 0 0; -#P connect 6 0 4 0; -#P connect 1 0 2 0; -#P connect 2 0 5 0; -#P connect 8 0 9 0; -#P connect 9 0 10 0; -#P pop; -#P newobj 106 96 49 196617 p parseG; -#P toggle 55 34 15 0; -#P hidden newex 55 52 46 196617 metro 2; -#P newex 55 72 71 196617 serial a 9600; -#B color 5; -#P window linecount 3; -#P comment 319 50 100 196617 Virtual Color Fader Most of the code by Jamie Allen; -#P connect 3 0 2 0; -#P connect 2 0 1 0; -#P connect 1 0 6 0; -#P connect 6 0 11 0; -#P connect 11 0 12 0; -#P fasten 12 0 10 0 60 298 60 298; -#P fasten 1 0 4 0 60 92 111 92; -#P fasten 4 0 13 0 111 243 111 243; -#P connect 13 0 14 0; -#P connect 14 0 10 1; -#P fasten 1 0 5 0 60 92 161 92; -#P fasten 5 0 15 0 161 243 161 243; -#P connect 15 0 16 0; -#P fasten 16 0 10 2 161 298 162 298; -#P fasten 6 0 9 0 60 129 172 129; -#P fasten 4 0 7 0 111 129 306 129; -#P fasten 5 0 8 0 161 129 443 129; -#P pop; -*/ + { + "boxes" : [ { + "box" : { + "maxclass" : "newobj", + "text" : "/ 4", + "patching_rect" : [ 448.0, 502.0, 32.5, 20.0 ], + "numoutlets" : 1, + "fontsize" : 12.0, + "outlettype" : [ "int" ], + "id" : "obj-25", + "fontname" : "Arial", + "numinlets" : 2 + } + + } + , { + "box" : { + "maxclass" : "newobj", + "text" : "/ 4", + "patching_rect" : [ 398.0, 502.0, 32.5, 20.0 ], + "numoutlets" : 1, + "fontsize" : 12.0, + "outlettype" : [ "int" ], + "id" : "obj-24", + "fontname" : "Arial", + "numinlets" : 2 + } + + } + , { + "box" : { + "maxclass" : "newobj", + "text" : "/ 4", + "patching_rect" : [ 348.0, 502.0, 32.5, 20.0 ], + "numoutlets" : 1, + "fontsize" : 12.0, + "outlettype" : [ "int" ], + "id" : "obj-23", + "fontname" : "Arial", + "numinlets" : 2 + } + + } + , { + "box" : { + "maxclass" : "comment", + "text" : "Virtual color mixer\n\nThis patch takes a string, containing three comma-separated ASCII formatted numbers from 0 to 1023, with a carriage return and linefeed at the end. It converts the string to three integers and uses them to set the background color.\n\n created 2 Dec 2006\n by David A. Mellis\nmodified 14 Apr 2009\nby Scott Fitzgerald and Tom Igoe", + "linecount" : 11, + "patching_rect" : [ 524.0, 51.0, 398.0, 158.0 ], + "numoutlets" : 0, + "fontsize" : 12.0, + "id" : "obj-32", + "fontname" : "Arial", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "newobj", + "text" : "select 0 1", + "patching_rect" : [ 372.0, 125.0, 62.0, 20.0 ], + "numoutlets" : 3, + "fontsize" : 12.0, + "outlettype" : [ "bang", "bang", "" ], + "id" : "obj-30", + "fontname" : "Arial", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "comment", + "text" : "click here to close the serial port", + "patching_rect" : [ 457.0, 276.0, 206.0, 20.0 ], + "numoutlets" : 0, + "fontsize" : 12.0, + "id" : "obj-26", + "fontname" : "Arial", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "comment", + "text" : "click here to open the serial port", + "patching_rect" : [ 457.0, 250.0, 206.0, 20.0 ], + "numoutlets" : 0, + "fontsize" : 12.0, + "id" : "obj-27", + "fontname" : "Arial", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "message", + "text" : "close", + "patching_rect" : [ 372.0, 276.0, 39.0, 18.0 ], + "numoutlets" : 1, + "fontsize" : 12.0, + "outlettype" : [ "" ], + "id" : "obj-21", + "fontname" : "Arial", + "numinlets" : 2 + } + + } + , { + "box" : { + "maxclass" : "message", + "text" : "port a", + "patching_rect" : [ 394.0, 250.0, 41.0, 18.0 ], + "numoutlets" : 1, + "fontsize" : 12.0, + "outlettype" : [ "" ], + "id" : "obj-19", + "fontname" : "Arial", + "numinlets" : 2 + } + + } + , { + "box" : { + "maxclass" : "comment", + "text" : "Click here to get a list of serial ports", + "patching_rect" : [ 457.0, 224.0, 207.0, 20.0 ], + "numoutlets" : 0, + "fontsize" : 12.0, + "id" : "obj-2", + "fontname" : "Arial", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "comment", + "text" : "Convert ASCII to symbol", + "patching_rect" : [ 424.0, 423.0, 147.0, 20.0 ], + "numoutlets" : 0, + "fontsize" : 12.0, + "id" : "obj-4", + "fontname" : "Arial", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "comment", + "text" : "Convert integer to ASCII", + "patching_rect" : [ 424.0, 400.0, 147.0, 20.0 ], + "numoutlets" : 0, + "fontsize" : 12.0, + "id" : "obj-5", + "fontname" : "Arial", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "newobj", + "text" : "fromsymbol", + "patching_rect" : [ 347.0, 423.0, 74.0, 20.0 ], + "numoutlets" : 1, + "fontsize" : 12.0, + "outlettype" : [ "" ], + "id" : "obj-7", + "fontname" : "Arial", + "color" : [ 1.0, 0.890196, 0.090196, 1.0 ], + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "newobj", + "text" : "itoa", + "patching_rect" : [ 347.0, 400.0, 46.0, 20.0 ], + "numoutlets" : 1, + "fontsize" : 12.0, + "outlettype" : [ "int" ], + "id" : "obj-8", + "fontname" : "Arial", + "color" : [ 1.0, 0.890196, 0.090196, 1.0 ], + "numinlets" : 3 + } + + } + , { + "box" : { + "maxclass" : "newobj", + "text" : "zl group", + "patching_rect" : [ 347.0, 377.0, 53.0, 20.0 ], + "numoutlets" : 2, + "fontsize" : 12.0, + "outlettype" : [ "", "" ], + "id" : "obj-9", + "fontname" : "Arial", + "numinlets" : 2 + } + + } + , { + "box" : { + "maxclass" : "newobj", + "text" : "select 10 13", + "patching_rect" : [ 289.0, 326.0, 77.0, 20.0 ], + "numoutlets" : 3, + "fontsize" : 12.0, + "outlettype" : [ "bang", "bang", "" ], + "id" : "obj-10", + "fontname" : "Arial", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "toggle", + "patching_rect" : [ 289.0, 88.0, 15.0, 15.0 ], + "numoutlets" : 1, + "outlettype" : [ "int" ], + "id" : "obj-11", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "newobj", + "text" : "qmetro 10", + "patching_rect" : [ 289.0, 125.0, 65.0, 20.0 ], + "numoutlets" : 1, + "fontsize" : 12.0, + "outlettype" : [ "bang" ], + "id" : "obj-12", + "fontname" : "Arial", + "numinlets" : 2 + } + + } + , { + "box" : { + "maxclass" : "message", + "text" : "print", + "patching_rect" : [ 414.0, 224.0, 36.0, 18.0 ], + "numoutlets" : 1, + "fontsize" : 12.0, + "outlettype" : [ "" ], + "id" : "obj-13", + "fontname" : "Arial", + "numinlets" : 2 + } + + } + , { + "box" : { + "maxclass" : "newobj", + "text" : "serial a 9600", + "patching_rect" : [ 289.0, 300.0, 84.0, 20.0 ], + "numoutlets" : 2, + "fontsize" : 12.0, + "outlettype" : [ "int", "" ], + "id" : "obj-14", + "fontname" : "Arial", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "comment", + "text" : "Read serial input buffer every 10 milliseconds", + "linecount" : 2, + "patching_rect" : [ 98.0, 117.0, 185.0, 34.0 ], + "numoutlets" : 0, + "fontsize" : 12.0, + "id" : "obj-15", + "fontname" : "Arial", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "comment", + "text" : "If you get newline (ASCII 10), send the list. If you get return (ASCII 13) do nothing. Any other value, add to the list", + "linecount" : 3, + "patching_rect" : [ 377.0, 314.0, 320.0, 48.0 ], + "numoutlets" : 0, + "fontsize" : 12.0, + "id" : "obj-16", + "fontname" : "Arial", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "comment", + "text" : "Click to open/close serial port and start/stop patch", + "linecount" : 2, + "patching_rect" : [ 316.0, 77.0, 199.0, 34.0 ], + "numoutlets" : 0, + "fontsize" : 12.0, + "id" : "obj-17", + "fontname" : "Arial", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "newobj", + "text" : "bgcolor 0 0 0", + "patching_rect" : [ 348.0, 585.0, 169.0, 19.0 ], + "numoutlets" : 0, + "fontsize" : 10.0, + "id" : "obj-6", + "fontname" : "Verdana", + "numinlets" : 4 + } + + } + , { + "box" : { + "maxclass" : "newobj", + "text" : "unpack 0 0 0 0 0", + "patching_rect" : [ 347.0, 470.0, 119.0, 19.0 ], + "numoutlets" : 5, + "fontsize" : 10.0, + "outlettype" : [ "int", "int", "int", "int", "int" ], + "id" : "obj-20", + "fontname" : "Verdana", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "number", + "patching_rect" : [ 448.0, 535.0, 50.0, 19.0 ], + "numoutlets" : 2, + "fontsize" : 10.0, + "outlettype" : [ "int", "bang" ], + "id" : "obj-18", + "fontname" : "Verdana", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "number", + "patching_rect" : [ 398.0, 535.0, 50.0, 19.0 ], + "numoutlets" : 2, + "fontsize" : 10.0, + "outlettype" : [ "int", "bang" ], + "id" : "obj-1", + "fontname" : "Verdana", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "number", + "patching_rect" : [ 348.0, 535.0, 50.0, 19.0 ], + "numoutlets" : 2, + "fontsize" : 10.0, + "outlettype" : [ "int", "bang" ], + "id" : "obj-22", + "fontname" : "Verdana", + "numinlets" : 1 + } + + } + , { + "box" : { + "maxclass" : "comment", + "text" : "Here's the numbers from Arduino's analog input", + "linecount" : 3, + "patching_rect" : [ 198.0, 484.0, 138.0, 48.0 ], + "numoutlets" : 0, + "fontsize" : 12.0, + "id" : "obj-3", + "fontname" : "Arial", + "numinlets" : 1 + } + + } + ], + "lines" : [ { + "patchline" : { + "source" : [ "obj-18", 0 ], + "destination" : [ "obj-6", 2 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-1", 0 ], + "destination" : [ "obj-6", 1 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-22", 0 ], + "destination" : [ "obj-6", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-25", 0 ], + "destination" : [ "obj-18", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-20", 4 ], + "destination" : [ "obj-25", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-20", 2 ], + "destination" : [ "obj-24", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-24", 0 ], + "destination" : [ "obj-1", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-23", 0 ], + "destination" : [ "obj-22", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-20", 0 ], + "destination" : [ "obj-23", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-8", 0 ], + "destination" : [ "obj-7", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-14", 0 ], + "destination" : [ "obj-10", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-12", 0 ], + "destination" : [ "obj-14", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-11", 0 ], + "destination" : [ "obj-12", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-13", 0 ], + "destination" : [ "obj-14", 0 ], + "hidden" : 0, + "midpoints" : [ 423.5, 245.5, 298.5, 245.5 ] + } + + } + , { + "patchline" : { + "source" : [ "obj-19", 0 ], + "destination" : [ "obj-14", 0 ], + "hidden" : 0, + "midpoints" : [ 403.5, 273.5, 298.5, 273.5 ] + } + + } + , { + "patchline" : { + "source" : [ "obj-21", 0 ], + "destination" : [ "obj-14", 0 ], + "hidden" : 0, + "midpoints" : [ 381.5, 296.5, 298.5, 296.5 ] + } + + } + , { + "patchline" : { + "source" : [ "obj-30", 0 ], + "destination" : [ "obj-21", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-30", 1 ], + "destination" : [ "obj-19", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-11", 0 ], + "destination" : [ "obj-30", 0 ], + "hidden" : 0, + "midpoints" : [ 298.0, 116.0, 381.5, 116.0 ] + } + + } + , { + "patchline" : { + "source" : [ "obj-7", 0 ], + "destination" : [ "obj-20", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-9", 0 ], + "destination" : [ "obj-8", 0 ], + "hidden" : 0, + "midpoints" : [ ] + } + + } + , { + "patchline" : { + "source" : [ "obj-10", 0 ], + "destination" : [ "obj-9", 0 ], + "hidden" : 0, + "midpoints" : [ 298.5, 353.0, 356.5, 353.0 ] + } + + } + , { + "patchline" : { + "source" : [ "obj-10", 2 ], + "destination" : [ "obj-9", 0 ], + "hidden" : 0, + "midpoints" : [ 356.5, 365.0, 356.5, 365.0 ] + } + + } + ] + } + + */