diff --git a/arduino/rainboard/rainboard.ino b/arduino/rainboard/rainboard.ino deleted file mode 120000 index e816499..0000000 --- a/arduino/rainboard/rainboard.ino +++ /dev/null @@ -1 +0,0 @@ -src/rainboard.ino \ No newline at end of file diff --git a/arduino/rainboard/rainboard.ino b/arduino/rainboard/rainboard.ino new file mode 100644 index 0000000..cac05b8 --- /dev/null +++ b/arduino/rainboard/rainboard.ino @@ -0,0 +1,198 @@ +// +// a 2-dimensional ringringrain touch-pad(board) +// +// D. Yi @ 2023 4 9 +// + +////network! + +#include + +const char* ssid = "nolink2"; +const char* password = "2222277777"; +const int NETWORK_PORT = 27016; + +#include +#include "utility/WiFiClientStream.h" +#include "utility/WiFiServerStream.h" +WiFiServerStream serverStream(NETWORK_PORT); + +#include + +////pad structure + +// #define FLIPPED +// --> comment/uncomment for horizontal flipping of the installation. + +#define NUMKEYS 42 // columns : 14, rows : 3 +// --> how many keys are available for this pad + +int keystat[NUMKEYS] = {0, }; +// --> a buffer to store statuses of all keys +// --> needed to extract only 'the change' of key statuses + +#define MAXCHANGES 10 +int keychanges[MAXCHANGES] = {0, }; +int n_keychg = 0; +// --> for monitoring only 'changed' keys. + +#define NUMCOLS 14 +#ifdef FLIPPED +int pins_cols[NUMCOLS] = {16, 15, 17, 18, 20, 19, 33, 34, 35, 36, 37, 38, 39, 40}; //14 +// --> cols is horizontal offsets on the board +// --> to be read as input. +#else +int pins_cols[NUMCOLS] = {40, 39, 38, 37, 36, 35, 34, 33, 19, 20, 18, 17, 15, 16}; //14 +// --> cols is horizontal offsets on the board +// --> to be read as input. +#endif + +#define NUMROWS 2 +int pins_rows[NUMROWS] = {7, 6}; //2 +// #define NUMROWS 3 +// int pins_rows[NUMROWS] = {8, 7, 6}; //3 +// --> rows is vertical offsets on the board +// --> to be driven as output (or high impedance) + +void setup() +{ + //serial + Serial.begin(115200); + + //pinmodes + // cols : to be read as input. (PULL-UP) + for (int idx = 0; idx < NUMCOLS; idx++) { + pinMode(pins_cols[idx], INPUT_PULLUP); + } + + //wifi + WiFi.mode(WIFI_STA); + // Connect to WiFi network + Serial.println(); + Serial.println(); + Serial.print("Connecting to "); + Serial.println(ssid); + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(""); + + Serial.println("WiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + Serial.println("Mac address: " + WiFi.macAddress()); + + //firmata + Firmata.disableBlinkVersion(); + Firmata.begin(serverStream); + + //ota + ArduinoOTA.onStart([]() { + Serial.println("Start"); + }); + ArduinoOTA.onEnd([]() { + Serial.println("\nEnd"); + }); + ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { + Serial.printf("Progress: %u%%\r", (progress / (total / 100))); + }); + ArduinoOTA.onError([](ota_error_t error) { + Serial.printf("Error[%u]: ", error); + if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); + else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); + else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); + else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); + else if (error == OTA_END_ERROR) Serial.println("End Failed"); + }); + ArduinoOTA.begin(); +} + +void loop() +{ + // perform a full scan of the key statuses! + + // update row voltages + static int row = 0; + pinMode(pins_rows[row], INPUT); // let old 'on' row goes 'hi-z' first. + row++; + if (row >= NUMROWS) { + row = 0; + } + pinMode(pins_rows[row], OUTPUT); + digitalWrite(pins_rows[row], LOW); // let new 'hi-z' row goes 'on'.. -> ready to scan. + + // 100us ~ 200us, waiting for the electricity ready... + //delayMicroseconds(200); + delay(2); // 2000us == 2ms + + // read all cols + for (int col = 0; col < NUMCOLS; col++) { + int key = row * NUMCOLS + col; + if (key < NUMKEYS) { + int cur_key = !digitalRead(pins_cols[col]); //logic inversion. (HIGH = noteoff, LOW = noteon.) + + // if it is 'changed', + if (cur_key != keystat[key]) { + // if there is a room to record this change, + if (n_keychg < MAXCHANGES) { + // make a memo. + int keycoded = (key) * 10 + cur_key; // for example : C4 note-on --> 601 ( == 60*10 + 1) + keychanges[n_keychg] = keycoded; + n_keychg++; + // send Firmata msg. over WIFI. + Firmata.sendAnalog(0, keycoded); + //@Pd + //[pduino/arduino] will divide this by 1023.0 to map 0-1023 -> 0.0-1.0 + //so, to recover original values, multiply back by 1023.0. + } + } + + // okay. good. now, apply the change. + keystat[key] = cur_key; + } + } + + // at the moment of 'full scan done' + if (row == NUMROWS - 1) { + + // // print out the buffer status. + // for (int key = 0; key < NUMKEYS; key++) { + // Serial.print(keystat[key]); Serial.print(" "); + // } + // Serial.println(); + + // print out the changes. + for (int chg = 0; chg < n_keychg; chg++) { + Serial.print(keychanges[chg]); + Serial.print(" "); + } + + // clear 'keychanges' array + for (int idx = 0; idx < MAXCHANGES; idx++) { + keychanges[idx] = 0; + n_keychg = 0; + } + + // send out alive counter + static int loopcounter = 0; + static int alivecounter = 0; + loopcounter++; + if (loopcounter % 100 == 0) { + Firmata.sendAnalog(1, alivecounter); + alivecounter++; + if (alivecounter == 1000) { + alivecounter = 0; + } + } + } + // + // // discard all incoming MIDI msgs. + // while (usbMIDI.read()) { } + + serverStream.maintain(); + + // + ArduinoOTA.handle(); +} diff --git a/arduino/rainboard/src/rainboard.ino b/arduino/rainboard/src/rainboard.ino deleted file mode 100644 index cac05b8..0000000 --- a/arduino/rainboard/src/rainboard.ino +++ /dev/null @@ -1,198 +0,0 @@ -// -// a 2-dimensional ringringrain touch-pad(board) -// -// D. Yi @ 2023 4 9 -// - -////network! - -#include - -const char* ssid = "nolink2"; -const char* password = "2222277777"; -const int NETWORK_PORT = 27016; - -#include -#include "utility/WiFiClientStream.h" -#include "utility/WiFiServerStream.h" -WiFiServerStream serverStream(NETWORK_PORT); - -#include - -////pad structure - -// #define FLIPPED -// --> comment/uncomment for horizontal flipping of the installation. - -#define NUMKEYS 42 // columns : 14, rows : 3 -// --> how many keys are available for this pad - -int keystat[NUMKEYS] = {0, }; -// --> a buffer to store statuses of all keys -// --> needed to extract only 'the change' of key statuses - -#define MAXCHANGES 10 -int keychanges[MAXCHANGES] = {0, }; -int n_keychg = 0; -// --> for monitoring only 'changed' keys. - -#define NUMCOLS 14 -#ifdef FLIPPED -int pins_cols[NUMCOLS] = {16, 15, 17, 18, 20, 19, 33, 34, 35, 36, 37, 38, 39, 40}; //14 -// --> cols is horizontal offsets on the board -// --> to be read as input. -#else -int pins_cols[NUMCOLS] = {40, 39, 38, 37, 36, 35, 34, 33, 19, 20, 18, 17, 15, 16}; //14 -// --> cols is horizontal offsets on the board -// --> to be read as input. -#endif - -#define NUMROWS 2 -int pins_rows[NUMROWS] = {7, 6}; //2 -// #define NUMROWS 3 -// int pins_rows[NUMROWS] = {8, 7, 6}; //3 -// --> rows is vertical offsets on the board -// --> to be driven as output (or high impedance) - -void setup() -{ - //serial - Serial.begin(115200); - - //pinmodes - // cols : to be read as input. (PULL-UP) - for (int idx = 0; idx < NUMCOLS; idx++) { - pinMode(pins_cols[idx], INPUT_PULLUP); - } - - //wifi - WiFi.mode(WIFI_STA); - // Connect to WiFi network - Serial.println(); - Serial.println(); - Serial.print("Connecting to "); - Serial.println(ssid); - WiFi.begin(ssid, password); - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - Serial.println(""); - - Serial.println("WiFi connected"); - Serial.println("IP address: "); - Serial.println(WiFi.localIP()); - Serial.println("Mac address: " + WiFi.macAddress()); - - //firmata - Firmata.disableBlinkVersion(); - Firmata.begin(serverStream); - - //ota - ArduinoOTA.onStart([]() { - Serial.println("Start"); - }); - ArduinoOTA.onEnd([]() { - Serial.println("\nEnd"); - }); - ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { - Serial.printf("Progress: %u%%\r", (progress / (total / 100))); - }); - ArduinoOTA.onError([](ota_error_t error) { - Serial.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) Serial.println("End Failed"); - }); - ArduinoOTA.begin(); -} - -void loop() -{ - // perform a full scan of the key statuses! - - // update row voltages - static int row = 0; - pinMode(pins_rows[row], INPUT); // let old 'on' row goes 'hi-z' first. - row++; - if (row >= NUMROWS) { - row = 0; - } - pinMode(pins_rows[row], OUTPUT); - digitalWrite(pins_rows[row], LOW); // let new 'hi-z' row goes 'on'.. -> ready to scan. - - // 100us ~ 200us, waiting for the electricity ready... - //delayMicroseconds(200); - delay(2); // 2000us == 2ms - - // read all cols - for (int col = 0; col < NUMCOLS; col++) { - int key = row * NUMCOLS + col; - if (key < NUMKEYS) { - int cur_key = !digitalRead(pins_cols[col]); //logic inversion. (HIGH = noteoff, LOW = noteon.) - - // if it is 'changed', - if (cur_key != keystat[key]) { - // if there is a room to record this change, - if (n_keychg < MAXCHANGES) { - // make a memo. - int keycoded = (key) * 10 + cur_key; // for example : C4 note-on --> 601 ( == 60*10 + 1) - keychanges[n_keychg] = keycoded; - n_keychg++; - // send Firmata msg. over WIFI. - Firmata.sendAnalog(0, keycoded); - //@Pd - //[pduino/arduino] will divide this by 1023.0 to map 0-1023 -> 0.0-1.0 - //so, to recover original values, multiply back by 1023.0. - } - } - - // okay. good. now, apply the change. - keystat[key] = cur_key; - } - } - - // at the moment of 'full scan done' - if (row == NUMROWS - 1) { - - // // print out the buffer status. - // for (int key = 0; key < NUMKEYS; key++) { - // Serial.print(keystat[key]); Serial.print(" "); - // } - // Serial.println(); - - // print out the changes. - for (int chg = 0; chg < n_keychg; chg++) { - Serial.print(keychanges[chg]); - Serial.print(" "); - } - - // clear 'keychanges' array - for (int idx = 0; idx < MAXCHANGES; idx++) { - keychanges[idx] = 0; - n_keychg = 0; - } - - // send out alive counter - static int loopcounter = 0; - static int alivecounter = 0; - loopcounter++; - if (loopcounter % 100 == 0) { - Firmata.sendAnalog(1, alivecounter); - alivecounter++; - if (alivecounter == 1000) { - alivecounter = 0; - } - } - } - // - // // discard all incoming MIDI msgs. - // while (usbMIDI.read()) { } - - serverStream.maintain(); - - // - ArduinoOTA.handle(); -} diff --git a/arduino/rainboard/src/rainboard.ino b/arduino/rainboard/src/rainboard.ino new file mode 120000 index 0000000..58c7a59 --- /dev/null +++ b/arduino/rainboard/src/rainboard.ino @@ -0,0 +1 @@ +../rainboard.ino \ No newline at end of file diff --git a/ringringrain_rev2.pd b/ringringrain_rev2.pd index 73b470e..792608b 100644 --- a/ringringrain_rev2.pd +++ b/ringringrain_rev2.pd @@ -1,4 +1,4 @@ -#N canvas 0 33 1006 580 10; +#N canvas 4 23 1006 580 10; #X obj 924 484 loadbang; #X obj 21 181 pack f f; #X obj 128 274 clone ringringrain_piano_node 10; @@ -16,7 +16,8 @@ #X floatatom 21 120 5 0 0 0 - - - 0; #X msg 924 530 \; pd dsp 1; #X obj 924 507 del 5000; -#X msg 19 515 \; pitches 0 60 62 64 65 67 69 71 72 74 76 77 79 81 83 84 86 88 89 91 93 95 96 98 100 101 103 105 107 108; +#X msg 19 515 \; pitches 0 60 62 64 65 67 69 71 72 74 76 77 79 81 83 +84 86 88 89 91 93 95 96 98 100 101 103 105 107 108; #X obj 21 68 unpack f f; #X listbox 21 220 7 0 0 0 - - - 0; #X obj 235 181 pack f f; @@ -39,10 +40,13 @@ #X obj 169 392 *~; #X obj 169 431 hip~ 5; #X msg 42 284 bang; -#X obj 120 331 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000; -#X obj 27 186 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000; +#X obj 120 331 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc +#000000 #000000; +#X obj 27 186 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 +#000000; #X obj 42 210 delay 2000; -#X obj 42 234 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000; +#X obj 42 234 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 +#000000; #X obj 184 290 * 6; #X text 32 21 sound generators - sample sound; #X floatatom 184 220 5 0 0 1 hands - - 0; @@ -72,7 +76,8 @@ #X restore 89 215 pd pan; #X obj 153 107 snapshot~; #X floatatom 228 147 5 0 0 0 - - - 0; -#X obj 36 42 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000; +#X obj 36 42 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 +#000000; #X obj 160 50 +~ 1; #X obj 160 77 *~ 0.5; #X obj 160 22 osc~ 0.1; @@ -99,18 +104,20 @@ #X obj 182 267 +; #X obj 152 267 f; #X obj 152 238 t b a; -#X obj 117 217 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000; +#X obj 117 217 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc +#000000 #000000; #X msg 199 113 0; -#X obj 152 72 t b a b; +#X obj 133 76 t b a b; #X obj 152 215 tabread hands; #X obj 18 65 metro 100; -#X obj 18 45 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 18 45 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 +0 1; #X obj 117 285 f; #X obj 18 22 loadbang; #X floatatom 117 308 5 0 0 0 - - - 0; #X obj 117 330 outlet; #X obj 228 21 table hands 60; -#X msg 152 49 60; +#X msg 133 53 60; #X msg 275 80 \; hands const 0; #X connect 0 0 1 0; #X connect 1 0 2 0; @@ -207,16 +214,19 @@ #X obj 955 390 + 40; #N canvas 40 465 713 292 main 0; #X obj 377 175 env~; -#X obj 427 126 vu 15 120 empty empty -1 -8 0 10 #404040 #000000 1 0; +#X obj 427 126 vu 15 120 empty empty -1 -8 0 10 #404040 #000000 1 0 +; #X obj 377 199 - 100; #X obj 377 75 catch~ front; #X obj 306 129 dac~ 4 7 8; #X obj 587 175 env~; -#X obj 637 126 vu 15 120 empty empty -1 -8 0 10 #404040 #000000 1 0; +#X obj 637 126 vu 15 120 empty empty -1 -8 0 10 #404040 #000000 1 0 +; #X obj 587 199 - 100; #X obj 516 129 dac~ 2 5 6; #X obj 157 175 env~; -#X obj 207 126 vu 15 120 empty empty -1 -8 0 10 #404040 #000000 1 0; +#X obj 207 126 vu 15 120 empty empty -1 -8 0 10 #404040 #000000 1 0 +; #X obj 157 199 - 100; #X obj 16 129 dac~ 1 2 3 4 5 6 7 8; #X obj 157 75 catch~ rain; @@ -259,44 +269,55 @@ #X msg 473 508 4.8; #X msg 632 508 2.4; #X msg 579 508 1.8; -#N canvas 586 33 852 598 ringringrain_A 0; +#N canvas 503 23 852 598 ringringrain_A 0; #X obj 388 102 arduino-wifi; #X msg 478 102 disconnect; -#X obj 457 139 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 457 139 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 +#000000 0 1; #X obj 388 165 route analog; -#X obj 182 326 t a a; -#X obj 182 349 / 10; -#X obj 182 372 int; -#X obj 227 349 mod 10; -#X obj 227 372 int; -#X obj 110 390 pack f f; -#X floatatom 182 298 5 0 0 1 interlaced - - 0; -#X listbox 110 413 7 0 0 0 midi-like - - 0; -#X obj 182 421 moses 28; -#X floatatom 182 444 5 0 0 0 - - - 0; +#X obj 182 336 t a a; +#X obj 182 359 / 10; +#X obj 182 382 int; +#X obj 227 359 mod 10; +#X obj 227 382 int; +#X obj 110 400 pack f f; +#X floatatom 108 278 5 0 0 1 interlaced - - 0; +#X listbox 110 423 7 0 0 0 midi-like - - 0; +#X obj 182 431 moses 28; +#X floatatom 182 454 5 0 0 0 - - - 0; #X floatatom 385 445 5 0 0 0 - - - 0; #X obj 385 500 pack f f; #X listbox 385 523 7 0 0 1 synth(lower) - - 0; -#X obj 182 500 pack f f; -#X listbox 182 523 7 0 0 0 synth(upper) - - 0; +#X obj 182 510 pack f f; +#X listbox 182 533 7 0 0 0 synth(upper) - - 0; #X obj 385 472 - 28; #X obj 108 250 expr if($f1 < 140 \, $f1 \, $f1+140); #X obj 388 250 expr if($f1 < 140 \, $f1+140 \, $f1+280); #N canvas 273 125 970 258 simulation 0; -#X obj 35 48 tgl 15 0 empty empty on/off\ (normal:z\ to\ i\ 28keys) 17 7 0 10 #fcfcfc #000000 #000000 0 1; -#X obj 515 48 tgl 15 0 empty empty on/off\ (+shift:Z\ to\ I\ 28keys) 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 35 48 tgl 15 0 empty empty on/off\\\ (normal:z\\\ to\\\ i\\\ 28keys) +17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 515 48 tgl 15 0 empty empty on/off\\\ (+shift:Z\\\ to\\\ I\\\ 28keys) +17 7 0 10 #fcfcfc #000000 #000000 0 1; #X obj 515 150 keyhands; #X floatatom 515 173 5 0 0 0 - - - 0; -#X obj 562 181 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 562 181 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc +#000000 #000000; #X obj 49 69 loadbang; -#X msg 49 91 keys 122 \\\; 120 \\\; 99 \\\; 118 \\\; 98 \\\; 110 \\\; 109 \\\; 44 \\\; 46 \\\; 47 \\\; 97 \\\; 115 \\\; 100 \\\; 102 \\\; 103 \\\; 104 \\\; 106 \\\; 107 \\\; 108 \\\; 59 \\\; 113 \\\; 119 \\\; 101 \\\; 114 \\\; 116 \\\; 121 \\\; 117 \\\; 105 \\\;, f 66; +#X msg 49 91 keys 122 \\\; 120 \\\; 99 \\\; 118 \\\; 98 \\\; 110 \\\; +109 \\\; 44 \\\; 46 \\\; 47 \\\; 97 \\\; 115 \\\; 100 \\\; 102 \\\; +103 \\\; 104 \\\; 106 \\\; 107 \\\; 108 \\\; 59 \\\; 113 \\\; 119 \\\; +101 \\\; 114 \\\; 116 \\\; 121 \\\; 117 \\\; 105 \\\;, f 66; #X obj 866 19 key; #X floatatom 866 42 5 0 0 0 - - - 0; -#X msg 529 91 keys 90 \\\; 88 \\\; 67 \\\; 86 \\\; 66 \\\; 78 \\\; 77 \\\; 60 \\\; 62 \\\; 63 \\\; 65 \\\; 83 \\\; 68 \\\; 70 \\\; 71 \\\; 72 \\\; 74 \\\; 75 \\\; 76 \\\; 58 \\\; 81 \\\; 87 \\\; 69 \\\; 82 \\\; 84 \\\; 89 \\\; 85 \\\; 73 \\\;, f 66; +#X msg 529 91 keys 90 \\\; 88 \\\; 67 \\\; 86 \\\; 66 \\\; 78 \\\; +77 \\\; 60 \\\; 62 \\\; 63 \\\; 65 \\\; 83 \\\; 68 \\\; 70 \\\; 71 +\\\; 72 \\\; 74 \\\; 75 \\\; 76 \\\; 58 \\\; 81 \\\; 87 \\\; 69 \\\; +82 \\\; 84 \\\; 89 \\\; 85 \\\; 73 \\\;, f 66; #X obj 529 69 loadbang; #X obj 35 150 keyhands; #X floatatom 35 173 5 0 0 0 - - - 0; -#X obj 82 181 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 82 181 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 +#000000; #X obj 35 211 outlet; #X obj 515 211 outlet; #X obj 272 9 inlet; @@ -316,43 +337,57 @@ #X connect 16 0 0 0; #X connect 16 0 1 0; #X restore 650 234 pd simulation left right paper; -#X obj 650 214 tgl 15 0 empty empty on/off 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 650 214 tgl 15 0 empty empty on/off 17 7 0 10 #fcfcfc #000000 +#000000 0 1; #X obj 108 102 arduino-wifi; #X msg 198 102 disconnect; -#X obj 177 139 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 177 139 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 +#000000 0 1; #X obj 108 165 route analog; #X obj 108 211 * 1023; #X text 22 251 interlace ==>; -#X text 253 421 <== split: upper/lower; +#X text 253 431 <== split: upper/lower; #X obj 182 561 outlet; #X obj 385 561 outlet; #X obj 108 188 route 0 1, f 17; #X floatatom 221 189 5 0 0 2 alivecounter - - 0; -#X obj 221 211 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 221 211 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc +#000000 #000000; #X obj 303 188 timer; #X obj 303 165 t b b; #X floatatom 303 211 5 0 0 0 - - - 0; #X obj 308 323 del 1000; -#X obj 308 346 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 308 346 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc +#000000 #000000; #X msg 308 300 stop \, bang; #X obj 157 211 * 1023; #X obj 308 561 outlet; #X obj 501 561 outlet; #X obj 501 323 del 1000; -#X obj 501 346 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 501 346 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc +#000000 #000000; #X msg 501 300 stop \, bang; #X obj 388 211 * 1023; #X obj 388 188 route 0 1, f 17; #X floatatom 501 189 5 0 0 2 alivecounter - - 0; -#X obj 501 211 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 501 211 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc +#000000 #000000; #X obj 583 188 timer; #X obj 583 165 t b b; #X floatatom 583 211 5 0 0 0 - - - 0; #X obj 437 211 * 1023; #X msg 177 77 connect 192.168.88.111 27016; #X msg 457 77 connect 192.168.88.112 27016; -#X obj 331 19 loadbang; -#X obj 331 42 del 5000; +#X obj 110 464 swap; +#X obj 110 443 unpack f f; +#X obj 110 506 route 1; +#X obj 110 485 pack f f; +#X obj 20 560 print noteon; +#X obj 273 13 tgl 15 0 empty ONOFF r:ONOFF 17 7 0 10 #fcfcfc #000000 +#000000 0 1; +#X obj 273 33 sel 1 0; +#X floatatom 219 319 5 0 0 0 - - - 0; +#X obj 108 298 sel 401 431 121 151; #X connect 0 0 3 0; #X connect 0 1 2 0; #X connect 1 0 0 1; @@ -367,9 +402,9 @@ #X connect 8 0 15 1; #X connect 8 0 17 1; #X connect 9 0 11 0; -#X connect 10 0 4 0; +#X connect 10 0 66 0; +#X connect 11 0 59 0; #X connect 12 0 13 0; -#X connect 12 1 14 0; #X connect 13 0 17 0; #X connect 14 0 19 0; #X connect 15 0 16 0; @@ -396,10 +431,12 @@ #X connect 37 0 36 0; #X connect 37 1 36 1; #X connect 39 0 40 0; +#X connect 39 0 46 0; #X connect 40 0 43 0; #X connect 41 0 39 0; #X connect 42 0 34 0; #X connect 45 0 46 0; +#X connect 45 0 40 0; #X connect 46 0 44 0; #X connect 47 0 45 0; #X connect 48 0 21 0; @@ -414,15 +451,26 @@ #X connect 55 0 50 0; #X connect 56 0 24 1; #X connect 57 0 0 1; -#X connect 58 0 59 0; -#X connect 59 0 56 0; -#X connect 59 0 57 0; +#X connect 58 0 61 0; +#X connect 58 1 61 1; +#X connect 59 0 58 0; +#X connect 59 1 58 1; +#X connect 60 0 62 0; +#X connect 61 0 60 0; +#X connect 63 0 64 0; +#X connect 64 0 56 0; +#X connect 64 0 57 0; +#X connect 64 1 25 0; +#X connect 64 1 1 0; +#X connect 65 0 4 0; +#X connect 66 4 65 0; #X restore 21 19 pd ringringrain_A ........ front wall; #X f 54; -#N canvas 575 33 863 598 ringringrain_B 0; +#N canvas 564 23 863 598 ringringrain_B 0; #X obj 388 102 arduino-wifi; #X msg 478 102 disconnect; -#X obj 457 139 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 457 139 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 +#000000 0 1; #X obj 388 165 route analog; #X obj 182 326 t a a; #X obj 182 349 / 10; @@ -443,20 +491,30 @@ #X obj 108 250 expr if($f1 < 140 \, $f1 \, $f1+140); #X obj 388 250 expr if($f1 < 140 \, $f1+140 \, $f1+280); #N canvas 273 125 970 258 simulation 0; -#X obj 35 48 tgl 15 0 empty empty on/off\ (normal:z\ to\ i\ 28keys) 17 7 0 10 #fcfcfc #000000 #000000 0 1; -#X obj 515 48 tgl 15 0 empty empty on/off\ (+shift:Z\ to\ I\ 28keys) 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 35 48 tgl 15 0 empty empty on/off\\\ (normal:z\\\ to\\\ i\\\ 28keys) +17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 515 48 tgl 15 0 empty empty on/off\\\ (+shift:Z\\\ to\\\ I\\\ 28keys) +17 7 0 10 #fcfcfc #000000 #000000 0 1; #X obj 515 150 keyhands; #X floatatom 515 173 5 0 0 0 - - - 0; -#X obj 562 181 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 562 181 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc +#000000 #000000; #X obj 49 69 loadbang; -#X msg 49 91 keys 122 \\\; 120 \\\; 99 \\\; 118 \\\; 98 \\\; 110 \\\; 109 \\\; 44 \\\; 46 \\\; 47 \\\; 97 \\\; 115 \\\; 100 \\\; 102 \\\; 103 \\\; 104 \\\; 106 \\\; 107 \\\; 108 \\\; 59 \\\; 113 \\\; 119 \\\; 101 \\\; 114 \\\; 116 \\\; 121 \\\; 117 \\\; 105 \\\;, f 66; +#X msg 49 91 keys 122 \\\; 120 \\\; 99 \\\; 118 \\\; 98 \\\; 110 \\\; +109 \\\; 44 \\\; 46 \\\; 47 \\\; 97 \\\; 115 \\\; 100 \\\; 102 \\\; +103 \\\; 104 \\\; 106 \\\; 107 \\\; 108 \\\; 59 \\\; 113 \\\; 119 \\\; +101 \\\; 114 \\\; 116 \\\; 121 \\\; 117 \\\; 105 \\\;, f 66; #X obj 866 19 key; #X floatatom 866 42 5 0 0 0 - - - 0; -#X msg 529 91 keys 90 \\\; 88 \\\; 67 \\\; 86 \\\; 66 \\\; 78 \\\; 77 \\\; 60 \\\; 62 \\\; 63 \\\; 65 \\\; 83 \\\; 68 \\\; 70 \\\; 71 \\\; 72 \\\; 74 \\\; 75 \\\; 76 \\\; 58 \\\; 81 \\\; 87 \\\; 69 \\\; 82 \\\; 84 \\\; 89 \\\; 85 \\\; 73 \\\;, f 66; +#X msg 529 91 keys 90 \\\; 88 \\\; 67 \\\; 86 \\\; 66 \\\; 78 \\\; +77 \\\; 60 \\\; 62 \\\; 63 \\\; 65 \\\; 83 \\\; 68 \\\; 70 \\\; 71 +\\\; 72 \\\; 74 \\\; 75 \\\; 76 \\\; 58 \\\; 81 \\\; 87 \\\; 69 \\\; +82 \\\; 84 \\\; 89 \\\; 85 \\\; 73 \\\;, f 66; #X obj 529 69 loadbang; #X obj 35 150 keyhands; #X floatatom 35 173 5 0 0 0 - - - 0; -#X obj 82 181 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 82 181 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 +#000000; #X obj 35 211 outlet; #X obj 515 211 outlet; #X obj 272 9 inlet; @@ -476,10 +534,12 @@ #X connect 16 0 0 0; #X connect 16 0 1 0; #X restore 650 234 pd simulation left right paper; -#X obj 650 214 tgl 15 0 empty empty on/off 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 650 214 tgl 15 0 empty empty on/off 17 7 0 10 #fcfcfc #000000 +#000000 0 1; #X obj 108 102 arduino-wifi; #X msg 198 102 disconnect; -#X obj 177 139 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 177 139 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 +#000000 0 1; #X obj 108 165 route analog; #X text 22 251 interlace ==>; #X text 253 421 <== split: upper/lower; @@ -488,31 +548,36 @@ #X obj 108 211 * 1023; #X obj 108 188 route 0 1, f 17; #X floatatom 221 189 5 0 0 2 alivecounter - - 0; -#X obj 221 211 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 221 211 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc +#000000 #000000; #X obj 303 188 timer; #X obj 303 165 t b b; #X floatatom 303 211 5 0 0 0 - - - 0; #X obj 308 323 del 1000; -#X obj 308 346 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 308 346 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc +#000000 #000000; #X msg 308 300 stop \, bang; #X obj 157 211 * 1023; #X obj 308 561 outlet; #X obj 501 561 outlet; #X obj 501 323 del 1000; -#X obj 501 346 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 501 346 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc +#000000 #000000; #X msg 501 300 stop \, bang; #X obj 388 211 * 1023; #X obj 388 188 route 0 1, f 17; #X floatatom 501 189 5 0 0 2 alivecounter - - 0; -#X obj 501 211 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 501 211 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc +#000000 #000000; #X obj 583 188 timer; #X obj 583 165 t b b; #X floatatom 583 211 5 0 0 0 - - - 0; #X obj 437 211 * 1023; -#X obj 331 19 loadbang; -#X obj 331 42 del 5000; #X msg 177 77 connect 192.168.88.113 27016; #X msg 457 77 connect 192.168.88.114 27016; +#X obj 273 13 tgl 15 0 empty ONOFF r:ONOFF 17 7 0 10 #fcfcfc #000000 +#000000 0 1; +#X obj 273 33 sel 1 0; #X connect 0 0 3 0; #X connect 0 1 2 0; #X connect 1 0 0 1; @@ -556,10 +621,12 @@ #X connect 37 0 36 0; #X connect 37 1 36 1; #X connect 39 0 40 0; +#X connect 39 0 46 0; #X connect 40 0 43 0; #X connect 41 0 39 0; #X connect 42 0 34 0; #X connect 45 0 46 0; +#X connect 45 0 40 0; #X connect 46 0 44 0; #X connect 47 0 45 0; #X connect 48 0 21 0; @@ -572,13 +639,56 @@ #X connect 53 0 52 0; #X connect 53 1 52 1; #X connect 55 0 50 0; -#X connect 56 0 57 0; -#X connect 57 0 58 0; -#X connect 57 0 59 0; -#X connect 58 0 24 1; -#X connect 59 0 0 1; +#X connect 56 0 24 1; +#X connect 57 0 0 1; +#X connect 58 0 59 0; +#X connect 59 0 56 0; +#X connect 59 0 57 0; +#X connect 59 1 25 0; +#X connect 59 1 1 0; #X restore 521 19 pd ringringrain_B ........ right wall; #X f 54; +#N canvas 152 189 553 436 timer 1; +#X obj 66 161 time, f 24; +#X obj 66 141 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 +#000000; +#X floatatom 66 182 5 0 0 0 - - - 0; +#X floatatom 113 182 5 0 0 0 - - - 0; +#X floatatom 160 182 5 0 0 0 - - - 0; +#X obj 66 120 metro 1000; +#X obj 66 100 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 +#000000 0 1; +#X obj 66 19 loadbang; +#X obj 66 42 del 5000; +#X msg 66 63 1; +#X obj 66 202 * 100; +#X obj 66 223 +; +#X floatatom 66 244 5 0 0 0 - - - 0; +#X floatatom 66 301 5 0 0 0 - - - 0; +#X obj 66 321 change; +#X floatatom 66 342 5 0 0 0 - - - 0; +#X obj 66 362 tgl 15 0 ONOFF empty s:ONOFF 17 7 0 10 #fcfcfc #000000 +#000000 0 1; +#X obj 66 280 expr if($f1 > 930 \, if($f1 < 1810 \, 1 \, 0) \, 0); +#X connect 0 0 2 0; +#X connect 0 1 3 0; +#X connect 0 2 4 0; +#X connect 1 0 0 0; +#X connect 2 0 10 0; +#X connect 3 0 11 1; +#X connect 5 0 1 0; +#X connect 6 0 5 0; +#X connect 7 0 8 0; +#X connect 8 0 9 0; +#X connect 9 0 6 0; +#X connect 10 0 11 0; +#X connect 11 0 12 0; +#X connect 12 0 17 0; +#X connect 13 0 14 0; +#X connect 14 0 15 0; +#X connect 15 0 16 0; +#X connect 17 0 13 0; +#X restore 420 33 pd timer; #X connect 0 0 16 0; #X connect 1 0 10 0; #X connect 1 0 19 0;