diff --git a/arduino/rainboard-pad/rainboard-pad.ino b/arduino/rainboard-pad/rainboard-pad.ino new file mode 100644 index 0000000..a1c32b6 --- /dev/null +++ b/arduino/rainboard-pad/rainboard-pad.ino @@ -0,0 +1,103 @@ +// +// ringringrain - pad(digital input) part. (arduino micro) +// +// D. Yi @ 2023 5 5 +// + +////pin usage +// 5 6 7 8 9 10 11 12 + 18(a0) 19(a1) 20(a2) 21(a3) 22(a4) 23(a5) == 14 digital in +// +// 0 1 => uart +// 0 1 => all works.. use serial (TTL+WIFI) or (RS232) + +////pad structure + +#define FLIPPED +// --> comment/uncomment for horizontal flipping of the installation. + +#define NUMKEYS 14 // columns : 14, rows : 1 +// --> 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] = {5, 6, 7, 8, 9, 10, 11, 12, 18, 19, 20, 21, 22, 23}; //14 +// --> cols is horizontal offsets on the board +// --> to be read as input. +#else +int pins_cols[NUMCOLS] = {23, 22, 21, 20, 19, 18, 12, 11, 10, 9, 8, 7, 6, 5}; //14 +// --> cols is horizontal offsets on the board +// --> to be read as input. +#endif + +void setup() +{ + //disable TX/RX led blinking: Arduino Micro specific + // pinMode(LED_BUILTIN_TX,INPUT); + // pinMode(LED_BUILTIN_RX,INPUT); + + //serial + Serial.begin(57600); //debug (USB) + Serial1.begin(57600); //esp8266 + + //pinmodes + // cols : to be read as input. (PULL-UP) + for (int idx = 0; idx < NUMCOLS; idx++) { + pinMode(pins_cols[idx], INPUT_PULLUP); + } +} + +void loop() +{ + // perform a full scan of the key statuses! + + // read all cols + for (int col = 0; col < NUMCOLS; col++) { + int key = col; + if (key < NUMKEYS) { + int state = !digitalRead(pins_cols[col]); //logic inversion. (HIGH = noteoff, LOW = noteon.) + + // if it is 'changed', + if (state != keystat[key]) { + // if there is a room to record this change, + if (n_keychg < MAXCHANGES) { + // make a memo. + int keycoded = (key) * 10 + state; // for example : C4 note-on --> 601 ( == 60*10 + 1) + keychanges[n_keychg] = keycoded; + n_keychg++; + // send msg. over Serial. + byte * b = (byte*)&keycoded; + Serial1.write(b, 2); + // + // Serial.printf("sizeof(keycoded): %d\n", sizeof(keycoded)); // result == 2 (16bit machine) + } + } + + // okay. good. now, apply the change. + keystat[key] = state; + } + } + + // 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; + } + + // + delay(50); +} diff --git a/arduino/rainboard-wifi/rainboard-wifi.ino b/arduino/rainboard-wifi/rainboard-wifi.ino new file mode 100644 index 0000000..f58ab80 --- /dev/null +++ b/arduino/rainboard-wifi/rainboard-wifi.ino @@ -0,0 +1,136 @@ +// +// ringringrain - WIFI part. (esp8266) +// +// D. Yi @ 2023 5 5 +// + +////network! +const char* ssid = "nolink"; +const char* password = "2222277777"; +const int NETWORK_PORT = 27016; + +//wi-fi +#include + +//wi-fi event handlers : re-connect automatically +WiFiEventHandler wifiConnectHandler; +WiFiEventHandler wifiDisconnectHandler; +void onWifiConnect(const WiFiEventStationModeGotIP& event) { + Serial.println("Connected to Wi-Fi sucessfully."); + Serial.print("IP address: "); + Serial.println("Mac address: " + WiFi.macAddress()); + Serial.println(WiFi.localIP()); + digitalWrite(2, HIGH); +} + +void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) { + Serial.println("Disconnected from Wi-Fi, trying to reconnect..."); + WiFi.disconnect(); + WiFi.begin(ssid, password); + digitalWrite(2, LOW); +} + +//firmata over wi-fi +#include +#include "utility/WiFiClientStream.h" +#include "utility/WiFiServerStream.h" +WiFiServerStream serverStream(NETWORK_PORT); + +//firmware update over the air +#include + +//client device @ soft-serial (only RX valid. tx. is dummy.) +#include +SoftwareSerial client(D2, D8); // RX | TX +//==> NO way to do RX/TX only mode?? how bad. later change library? + +//// +void setup() +{ + //wifi indicator + pinMode(2, OUTPUT); + digitalWrite(2, LOW); //disconnected. + + //serial (for debug & info) + Serial.begin(115200); + + //to get data frames from the client device. + client.begin(57600); + + //wifi + wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect); + wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect); + 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) { + // Serial.print("."); + delay(500); + } + Serial.println(""); + + //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() +{ + // process client data frame + if (client.available() >= 2) { + // + int keycoded = 0; //==> NOTE init=0 is mandatory! (sender is 16bit device. receiver 32bit device.) + byte * b = (byte*)&keycoded; + client.readBytes(b, 2); + Serial.println(keycoded); + + // + Firmata.sendAnalog(0, keycoded); + } + + // send out alive counter every 1sec. + static unsigned long last = 0; + unsigned long now = millis(); + if (now > last + 500) { + last = now; + // + static int alivecounter = 0; + Firmata.sendAnalog(1, alivecounter); + alivecounter++; + if (alivecounter == 1000) alivecounter = 0; + // + } + + //firmata over wi-fi + serverStream.maintain(); + + // + ArduinoOTA.handle(); + + //for wdt + yield(); +} diff --git a/ringringrain_rev2.pd b/ringringrain_rev2.pd index 447a389..d1b3240 100644 --- a/ringringrain_rev2.pd +++ b/ringringrain_rev2.pd @@ -16,8 +16,7 @@ #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; @@ -27,7 +26,7 @@ #X obj 235 97 tabread pitches; #X floatatom 235 120 5 0 0 0 - - - 0; #X obj 235 68 unpack f f; -#N canvas 575 33 434 533 rain 1; +#N canvas 1004 214 434 533 rain 0; #X obj 27 80 loadbang; #N canvas 0 22 450 300 (subpatch) 0; #X array raining 2.57403e+06 float 0; @@ -40,13 +39,10 @@ #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; @@ -76,8 +72,7 @@ #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; @@ -104,14 +99,12 @@ #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 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; @@ -214,19 +207,16 @@ #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; @@ -265,11 +255,10 @@ #X obj 342 303 throw~ front; #X obj 628 303 throw~ right; #X obj 842 303 throw~ right; -#N canvas 588 200 852 598 ringringrain_A 0; +#N canvas 0 33 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 336 t a a; #X obj 182 359 / 10; @@ -290,30 +279,20 @@ #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; @@ -333,12 +312,10 @@ #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 ==>; @@ -347,27 +324,21 @@ #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; @@ -378,17 +349,18 @@ #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 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 182 316 5 0 0 0 - - - 0; -#X obj 28 348 sel 431 151 401 121; #X obj 108 298 sel 121 151; +#X obj 308 323 del 1500; +#X obj 501 323 del 1500; +#X text 420 445 <== DEACTIVATED synth(lower); +#X obj 20 560 print noteonA; #X connect 0 0 3 0; #X connect 0 1 2 0; #X connect 1 0 0 1; -#X connect 3 0 49 0; +#X connect 3 0 47 0; #X connect 4 0 5 0; #X connect 4 1 7 0; #X connect 5 0 6 0; @@ -399,8 +371,8 @@ #X connect 8 0 15 1; #X connect 8 0 17 1; #X connect 9 0 11 0; -#X connect 10 0 67 0; -#X connect 11 0 59 0; +#X connect 10 0 63 0; +#X connect 11 0 57 0; #X connect 12 0 13 0; #X connect 13 0 17 0; #X connect 14 0 19 0; @@ -420,54 +392,53 @@ #X connect 27 0 33 0; #X connect 28 0 20 0; #X connect 33 0 28 0; -#X connect 33 1 42 0; +#X connect 33 1 41 0; #X connect 34 0 35 0; #X connect 35 0 37 0; -#X connect 35 0 41 0; +#X connect 35 0 40 0; #X connect 36 0 38 0; #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; -#X connect 49 0 48 0; -#X connect 49 1 55 0; -#X connect 50 0 51 0; -#X connect 51 0 53 0; -#X connect 51 0 47 0; -#X connect 52 0 54 0; -#X connect 53 0 52 0; -#X connect 53 1 52 1; -#X connect 55 0 50 0; -#X connect 56 0 24 1; -#X connect 57 0 0 1; -#X connect 58 0 61 0; -#X connect 58 1 61 1; +#X connect 39 0 42 0; +#X connect 40 0 64 0; +#X connect 41 0 34 0; +#X connect 44 0 43 0; +#X connect 45 0 65 0; +#X connect 46 0 21 0; +#X connect 47 0 46 0; +#X connect 47 1 53 0; +#X connect 48 0 49 0; +#X connect 49 0 51 0; +#X connect 49 0 45 0; +#X connect 50 0 52 0; +#X connect 51 0 50 0; +#X connect 51 1 50 1; +#X connect 53 0 48 0; +#X connect 54 0 24 1; +#X connect 55 0 0 1; +#X connect 56 0 59 0; +#X connect 56 1 59 1; +#X connect 57 0 56 0; +#X connect 57 1 56 1; +#X connect 58 0 67 0; #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 67 2 65 0; +#X connect 60 0 61 0; +#X connect 61 0 54 0; +#X connect 61 0 55 0; +#X connect 61 1 25 0; +#X connect 61 1 1 0; +#X connect 62 0 4 0; +#X connect 63 2 62 0; +#X connect 64 0 39 0; +#X connect 64 0 44 0; +#X connect 65 0 44 0; +#X connect 65 0 39 0; #X restore 21 19 pd ringringrain_A ........ front wall; #X f 54; -#N canvas 564 23 863 598 ringringrain_B 0; +#N canvas 0 86 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; @@ -488,30 +459,20 @@ #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; @@ -531,12 +492,10 @@ #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; @@ -545,40 +504,41 @@ #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 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 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 obj 308 323 del 1500; +#X obj 501 323 del 1500; +#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 text 420 445 <== DEACTIVATED synth(lower); +#X obj 20 560 print noteonB; #X connect 0 0 3 0; #X connect 0 1 2 0; #X connect 1 0 0 1; -#X connect 3 0 49 0; +#X connect 3 0 47 0; #X connect 4 0 5 0; #X connect 4 1 7 0; #X connect 5 0 6 0; @@ -590,6 +550,7 @@ #X connect 8 0 17 1; #X connect 9 0 11 0; #X connect 10 0 4 0; +#X connect 11 0 61 0; #X connect 12 0 13 0; #X connect 13 0 17 0; #X connect 14 0 19 0; @@ -609,51 +570,55 @@ #X connect 27 0 33 0; #X connect 32 0 20 0; #X connect 33 0 32 0; -#X connect 33 1 42 0; +#X connect 33 1 41 0; #X connect 34 0 35 0; #X connect 35 0 37 0; -#X connect 35 0 41 0; +#X connect 35 0 40 0; #X connect 36 0 38 0; #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; -#X connect 49 0 48 0; -#X connect 49 1 55 0; -#X connect 50 0 51 0; -#X connect 51 0 53 0; -#X connect 51 0 47 0; -#X connect 52 0 54 0; -#X connect 53 0 52 0; -#X connect 53 1 52 1; -#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 59 1 25 0; -#X connect 59 1 1 0; +#X connect 39 0 42 0; +#X connect 40 0 58 0; +#X connect 41 0 34 0; +#X connect 44 0 43 0; +#X connect 45 0 59 0; +#X connect 46 0 21 0; +#X connect 47 0 46 0; +#X connect 47 1 53 0; +#X connect 48 0 49 0; +#X connect 49 0 51 0; +#X connect 49 0 45 0; +#X connect 50 0 52 0; +#X connect 51 0 50 0; +#X connect 51 1 50 1; +#X connect 53 0 48 0; +#X connect 54 0 24 1; +#X connect 55 0 0 1; +#X connect 56 0 57 0; +#X connect 57 0 54 0; +#X connect 57 0 55 0; +#X connect 57 1 25 0; +#X connect 57 1 1 0; +#X connect 58 0 39 0; +#X connect 58 0 44 0; +#X connect 59 0 44 0; +#X connect 59 0 39 0; +#X connect 60 0 63 0; +#X connect 60 1 63 1; +#X connect 61 0 60 0; +#X connect 61 1 60 1; +#X connect 62 0 65 0; +#X connect 63 0 62 0; #X restore 521 19 pd ringringrain_B ........ right wall; #X f 54; #N canvas 531 237 553 436 timer 0; #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 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 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; @@ -663,8 +628,7 @@ #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 362 tgl 15 0 ONOFF empty s:ONOFF 17 7 0 10 #fcfcfc #000000 #000000 0 1; #X obj 66 280 expr if($f1 > 900 \, if($f1 < 1830 \, 1 \, 0) \, 0); #X connect 0 0 2 0; #X connect 0 1 3 0; @@ -676,7 +640,6 @@ #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; @@ -685,8 +648,7 @@ #X connect 15 0 16 0; #X connect 17 0 13 0; #X restore 420 33 pd timer; -#X obj 411 131 tgl 25 0 ONOFF empty s:ONOFF 17 7 0 10 #ffc7c6 #000000 -#000000 0 1; +#X obj 411 131 tgl 25 0 ONOFF empty s:ONOFF 17 7 0 10 #ffc7c6 #000000 #000000 0 1; #X msg 411 106 set \$1; #X obj 411 85 r ONOFF; #X connect 0 0 16 0;