This commit is contained in:
Dooho Yi 2023-05-02 16:40:23 +09:00
parent ba1720f74d
commit 752b1f1bc3
3 changed files with 377 additions and 267 deletions

View file

@ -1 +0,0 @@
src/rainboard.ino

View file

@ -0,0 +1,198 @@
//
// a 2-dimensional ringringrain touch-pad(board)
//
// D. Yi @ 2023 4 9
//
////network!
#include <ConfigurableFirmata.h>
const char* ssid = "nolink2";
const char* password = "2222277777";
const int NETWORK_PORT = 27016;
#include <WiFi.h>
#include "utility/WiFiClientStream.h"
#include "utility/WiFiServerStream.h"
WiFiServerStream serverStream(NETWORK_PORT);
#include <ArduinoOTA.h>
////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();
}

View file

@ -1,198 +0,0 @@
//
// a 2-dimensional ringringrain touch-pad(board)
//
// D. Yi @ 2023 4 9
//
////network!
#include <ConfigurableFirmata.h>
const char* ssid = "nolink2";
const char* password = "2222277777";
const int NETWORK_PORT = 27016;
#include <WiFi.h>
#include "utility/WiFiClientStream.h"
#include "utility/WiFiServerStream.h"
WiFiServerStream serverStream(NETWORK_PORT);
#include <ArduinoOTA.h>
////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();
}

View file

@ -0,0 +1 @@
../rainboard.ino

View file

@ -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;