From 06dac6afed5a8c903976834bec7c7be3cae4c804 Mon Sep 17 00:00:00 2001 From: Dooho Yi Date: Fri, 17 Apr 2026 17:34:43 +0900 Subject: [PATCH] many updaates... not all of these is meaningful? --- faa_aout/faa_aout.ino | 187 ++++ faa_aout/message.h | 111 +++ faa_aout/sketch.yaml | 2 + faa_compass/faa_compass.ino | 338 +++++++ faa_compass/message.h | 111 +++ faa_compass/sketch.yaml | 2 + faa_compass_adafruit/faa_compass.ino | 266 ++++++ faa_compass_adafruit/message.h | 111 +++ faa_compass_adafruit/sketch.yaml | 2 + faa_id/faa_id.ino | 277 ++++++ faa_id/message.h | 111 +++ faa_id/sketch.yaml | 2 + faa_input/faa_input.ino | 14 +- faa_pix/faa_pix.ino | 207 ++++ faa_pix/message.h | 111 +++ faa_pixw/faa_pixw.ino | 207 ++++ faa_pixw/message.h | 111 +++ faa_radioooo/faa_radioooo.ino | 383 ++++++++ faa_radioooo/message.h | 111 +++ faa_radioooo/sketch.yaml | 2 + faa_roll8/faa_roll8.ino | 393 ++++++++ faa_roll8/message.h | 111 +++ faa_roll8/sketch.yaml | 2 + faa_roller/faa_roller.ino | 4 +- faa_saekki/faa_saekki.ino | 304 ++++++ faa_saekki/message.h | 111 +++ faa_saekki/sketch.yaml | 2 + faa_servo/faa_servo.ino | 181 ++++ faa_servo/message.h | 111 +++ faa_volume/faa_volume.ino | 2 +- faa_yellow/faa_yellow.ino | 392 ++++++++ faa_yellow/message.h | 111 +++ faa_yellow/sketch.yaml | 2 + puredata/radio_roller.pd | 10 +- puredata/sound-from-earth-workshop.zip | Bin 0 -> 58043 bytes .../sound-from-earth-workshop/newstart.pd | 125 +++ .../newstart_example.pd | 226 +++++ .../o.io.slipserial.pd | 0 puredata/sound-from-earth-workshop/onoff.pd | 46 + .../radio_chant.pd | 0 .../radio_chant_roller.pd | 0 .../radio_chant_taak.pd | 0 .../radio_chant_taakx.pd | 0 .../radio_roller.pd | 0 .../radio_spell_compass.pd | 428 +++++++++ .../radio_spell_scratch.pd | 0 .../radio_spell_start.pd | 0 .../radio_spell_start2.pd | 0 .../radio_spell_start3.pd | 894 ++++++++++++++++++ .../radio_spell_start_sensor.pd | 0 .../retro2.pd | 0 .../riff2_random-help.pd | 0 .../riff2_random.pd | 0 .../rscan2.pd | 0 .../select_wind.pd | 0 .../skip.pd | 0 .../vfreeverb~.pd | 0 .../world.pd | 0 puredata/sound_from_earth_snu.zip | Bin 0 -> 5817 bytes .../sound_from_earth_snu/o.io.slipserial.pd | 36 + .../radio_spell_start3.pd | 894 ++++++++++++++++++ puredata/sound_from_earth_snu/skip.pd | 41 + 62 files changed, 7081 insertions(+), 11 deletions(-) create mode 100644 faa_aout/faa_aout.ino create mode 100644 faa_aout/message.h create mode 100644 faa_aout/sketch.yaml create mode 100644 faa_compass/faa_compass.ino create mode 100644 faa_compass/message.h create mode 100644 faa_compass/sketch.yaml create mode 100644 faa_compass_adafruit/faa_compass.ino create mode 100644 faa_compass_adafruit/message.h create mode 100644 faa_compass_adafruit/sketch.yaml create mode 100644 faa_id/faa_id.ino create mode 100644 faa_id/message.h create mode 100644 faa_id/sketch.yaml create mode 100644 faa_pix/faa_pix.ino create mode 100644 faa_pix/message.h create mode 100644 faa_pixw/faa_pixw.ino create mode 100644 faa_pixw/message.h create mode 100644 faa_radioooo/faa_radioooo.ino create mode 100644 faa_radioooo/message.h create mode 100644 faa_radioooo/sketch.yaml create mode 100644 faa_roll8/faa_roll8.ino create mode 100644 faa_roll8/message.h create mode 100644 faa_roll8/sketch.yaml create mode 100644 faa_saekki/faa_saekki.ino create mode 100644 faa_saekki/message.h create mode 100644 faa_saekki/sketch.yaml create mode 100644 faa_servo/faa_servo.ino create mode 100644 faa_servo/message.h create mode 100644 faa_yellow/faa_yellow.ino create mode 100644 faa_yellow/message.h create mode 100644 faa_yellow/sketch.yaml create mode 100644 puredata/sound-from-earth-workshop.zip create mode 100644 puredata/sound-from-earth-workshop/newstart.pd create mode 100644 puredata/sound-from-earth-workshop/newstart_example.pd rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/o.io.slipserial.pd (100%) create mode 100644 puredata/sound-from-earth-workshop/onoff.pd rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/radio_chant.pd (100%) rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/radio_chant_roller.pd (100%) rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/radio_chant_taak.pd (100%) rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/radio_chant_taakx.pd (100%) rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/radio_roller.pd (100%) create mode 100644 puredata/sound-from-earth-workshop/radio_spell_compass.pd rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/radio_spell_scratch.pd (100%) rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/radio_spell_start.pd (100%) rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/radio_spell_start2.pd (100%) create mode 100644 puredata/sound-from-earth-workshop/radio_spell_start3.pd rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/radio_spell_start_sensor.pd (100%) rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/retro2.pd (100%) rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/riff2_random-help.pd (100%) rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/riff2_random.pd (100%) rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/rscan2.pd (100%) rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/select_wind.pd (100%) rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/skip.pd (100%) rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/vfreeverb~.pd (100%) rename puredata/{radio_spell_workshop => sound-from-earth-workshop}/world.pd (100%) create mode 100644 puredata/sound_from_earth_snu.zip create mode 100644 puredata/sound_from_earth_snu/o.io.slipserial.pd create mode 100644 puredata/sound_from_earth_snu/radio_spell_start3.pd create mode 100644 puredata/sound_from_earth_snu/skip.pd diff --git a/faa_aout/faa_aout.ino b/faa_aout/faa_aout.ino new file mode 100644 index 0000000..1f7fc73 --- /dev/null +++ b/faa_aout/faa_aout.ino @@ -0,0 +1,187 @@ +// +// wirelessly connected cloud (based on a LPWAN, called ESP-NOW) +// + +// +// puredata gathering @ ururu.cloud, Seoul +// + +// +// 2024 02 17 +// +// this module will be an esp-now node in a group. +// like, a bird in a group of birds. +// +// esp-now @ esp8266 w/ broadcast address (FF:FF:FF:FF:FF:FF) +// always broadcasting. everyone is 'talkative'. +// + +//======================== +#define MY_GROUP_ID (8000) +#define MY_ID (MY_GROUP_ID + 990) +#define MY_SIGN ("DAC") +//======================== + +//======================== +#define WIFI_CHANNEL 1 +//======================= + +//arduino +#include + +//message types +#include "message.h" + +//espnow +#include +#include + +//task +#include +Scheduler runner; + +//-*-*-*-*-*-*-*-*-*-*-*-*- +// dac +// my tasks +int dac = 0; +void set_aout() { + // + dacWrite(25, dac); + + Serial.print("set_aout:"); + Serial.println(dac); +} +Task set_aout_task(0, TASK_ONCE, &set_aout, &runner, false); +//*-*-*-*-*-*-*-*-*-*-*-*-* + +//task #0 : blink led +#define LED_PERIOD (11111) +#define LED_ONTIME (1) +#define LED_GAPTIME (222) +#define LED_PIN 2 +extern Task blink_task; +void blink() { + // + static int count = 0; + count++; + // + switch (count % 4) { + case 0: + digitalWrite(LED_PIN, LOW); // first ON + blink_task.delay(LED_ONTIME); + break; + case 1: + digitalWrite(LED_PIN, HIGH); // first OFF + blink_task.delay(LED_GAPTIME); + break; + case 2: + digitalWrite(LED_PIN, LOW); // second ON + blink_task.delay(LED_ONTIME); + break; + case 3: + digitalWrite(LED_PIN, HIGH); // second OFF + blink_task.delay(LED_PERIOD - 2* LED_ONTIME - LED_GAPTIME); + break; + } +} +Task blink_task(0, TASK_FOREVER, &blink, &runner, true); // -> ENABLED, at start-up. + +// on 'Note' +void onNoteHandler(Note & n) { + //is it for me? + if (n.id == MY_GROUP_ID || n.id == MY_ID) { + // + if (n.pitch == 0) { + dac = n.velocity; + // + set_aout_task.restartDelayed(10); + } + // + else if (n.pitch == 1) { + /////// + } + // + } +} + +// on 'receive' +void onDataReceive(const esp_now_recv_info_t * esp_now_info, const uint8_t *incomingData, int len) { + + // + Serial.write(incomingData, len); + + // open => identify => use. + if (incomingData[0] == '{' && incomingData[len - 1] == '}' && len == (sizeof(Hello) + 2)) { + Hello hello(""); + memcpy((uint8_t *) &hello, incomingData + 1, sizeof(Hello)); + // + Serial.println(hello.to_string()); + } + + // open => identify => use. + if (incomingData[0] == '[' && incomingData[len - 1] == ']' && len == (sizeof(Note) + 2)) { + Note note; + memcpy((uint8_t *) ¬e, incomingData + 1, sizeof(Note)); + onNoteHandler(note); + // + Serial.println(note.to_string()); + } +} + +// on 'sent' +void onDataSent(const uint8_t *mac_addr, esp_now_send_status_t sendStatus) { + char buff[256] = ""; + sprintf(buff, "Delivery failed! -> %02X:%02X:%02X:%02X:%02X:%02X", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); + if (sendStatus != 0) Serial.println(buff); +} + +// +void setup() { + + //led + pinMode(LED_PIN, OUTPUT); + + //serial + Serial.begin(115200); + delay(100); + + //info + Serial.println(); + Serial.println(); + Serial.println("\"hi, i m your postman.\""); + Serial.println("-"); + Serial.println("- my id: " + String(MY_ID) + ", gid: " + String(MY_GROUP_ID) + ", call me ==> \"" + String(MY_SIGN) + "\""); + Serial.println("- mac address: " + WiFi.macAddress() + ", channel: " + String(WIFI_CHANNEL)); + Serial.println("-"); + + //wifi - disable AP + WiFiMode_t node_type = WIFI_STA; + WiFi.setTxPower(WIFI_POWER_MINUS_1dBm); // Set WiFi RF power output to lowest level + WiFi.mode(node_type); + + //esp-now + if (esp_now_init() != 0) { + Serial.println("Error initializing ESP-NOW"); + return; + } + esp_now_register_send_cb(onDataSent); + esp_now_register_recv_cb(onDataReceive); + // + Serial.println("- ! (esp_now_add_peer) ==> add a 'broadcast peer' (FF:FF:FF:FF:FF:FF)."); + uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_peer_info_t peerInfo = {}; + memcpy(peerInfo.peer_addr, broadcastmac, 6); + peerInfo.channel = 0; + peerInfo.encrypt = false; + esp_now_add_peer(&peerInfo); + + Serial.println("-"); + Serial.println("\".-.-.-. :)\""); + Serial.println(); +} + +void loop() { + // + runner.execute(); + // +} diff --git a/faa_aout/message.h b/faa_aout/message.h new file mode 100644 index 0000000..8e2b9ab --- /dev/null +++ b/faa_aout/message.h @@ -0,0 +1,111 @@ +#pragma once + +//message type Note : '[' + Note + ']' +struct Note { + // + int32_t id; + float pitch; + float velocity; + float onoff; + float x1; + float x2; + float x3; + float x4; + float ps; + // + Note() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + Note(int32_t id_, float pitch_, float velocity_, float onoff_, float x1_, float x2_, float x3_, float x4_, float ps_) + { + id = id_; + pitch = pitch_; + velocity = velocity_; + onoff = onoff_; + x1 = x1_; + x2 = x2_; + x3 = x3_; + x4 = x4_; + ps = ps_; + } + // + void clear() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", pitch=" + String(pitch); + str += ", velocity=" + String(velocity); + str += ", onoff=" + String(onoff); + str += ", x1=" + String(x1); + str += ", x2=" + String(x2); + str += ", x3=" + String(x3); + str += ", x4=" + String(x4); + str += ", ps=" + String(ps); + str += " )"; + return str; + } +}; + +//message type Hello : '{' + Hello + '}' +#define SIGNATURE_LENGTH (20) +#define SIGNATURE_BUFF_LEN (SIGNATURE_LENGTH + 1) +struct Hello { + char sign[SIGNATURE_BUFF_LEN]; + int32_t id; + uint32_t mac32; + float h1; + float h2; + float h3; + float h4; + // + Hello(String sign_, int32_t id_ = 0, uint32_t mac32_ = 0, float h1_ = 0, float h2_ = 0, float h3_ = 0, float h4_ = 0) { + id = id_; + mac32 = mac32_; + h1 = h1_; + h2 = h2_; + h3 = h3_; + h4 = h4_; + sign_.toCharArray(sign, SIGNATURE_BUFF_LEN); + } + void clear() { + id = 0; + mac32 = 0; + h1 = 0; + h2 = 0; + h3 = 0; + h4 = 0; + sign[0] = '\0'; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", mac32=0x" + String(mac32, HEX); + str += ", sign=\"" + String(sign) + "\""; + str += ", h1=" + String(h1); + str += ", h2=" + String(h2); + str += ", h3=" + String(h3); + str += ", h4=" + String(h4); + str += " )"; + return str; + } +}; diff --git a/faa_aout/sketch.yaml b/faa_aout/sketch.yaml new file mode 100644 index 0000000..ee52428 --- /dev/null +++ b/faa_aout/sketch.yaml @@ -0,0 +1,2 @@ +default_fqbn: esp8266:esp8266:nodemcuv2:baud=460800 +default_port: /dev/tty.SLAB_USBtoUART diff --git a/faa_compass/faa_compass.ino b/faa_compass/faa_compass.ino new file mode 100644 index 0000000..69fce5b --- /dev/null +++ b/faa_compass/faa_compass.ino @@ -0,0 +1,338 @@ +// +// wirelessly connected cloud (based on a LPWAN, called ESP-NOW) +// + +// +// puredata gathering @ ururu.cloud, Seoul +// + +// +// 2024 02 17 +// +// this module will be an esp-now node in a group. +// like, a bird in a group of birds. +// +// esp-now @ esp8266 w/ broadcast address (FF:FF:FF:FF:FF:FF) +// always broadcasting. everyone is 'talkative'. +// + +//======================== +#define MY_GROUP_ID (6000) +#define MY_ID (MY_GROUP_ID + 5) +#define MY_SIGN ("VOLUME") +//======================== + +//======================== +#define WIFI_CHANNEL 1 +//======================= + +//arduino +#include + +//message types +#include "message.h" + +//espnow +#include +#include + +//task +#include +Scheduler runner; + +//-*-*-*-*-*-*-*-*-*-*-*-*- +#include +#include +#include +HMC5883L compass; +MPU6050 mpu; +float heading1; +float heading2; +extern Task compass_read_task; +// No tilt compensation +float noTiltCompensate(Vector mag) +{ + float heading = atan2(mag.YAxis, mag.XAxis); + return heading; +} + +// Tilt compensation +float tiltCompensate(Vector mag, Vector normAccel) +{ + // Pitch & Roll + + float roll; + float pitch; + + roll = asin(normAccel.YAxis); + pitch = asin(-normAccel.XAxis); + + if (roll > 0.78 || roll < -0.78 || pitch > 0.78 || pitch < -0.78) + { + return -1000; + } + + // Some of these are used twice, so rather than computing them twice in the algorithem we precompute them before hand. + float cosRoll = cos(roll); + float sinRoll = sin(roll); + float cosPitch = cos(pitch); + float sinPitch = sin(pitch); + + // Tilt compensation + float Xh = mag.XAxis * cosPitch + mag.ZAxis * sinPitch; + float Yh = mag.XAxis * sinRoll * sinPitch + mag.YAxis * cosRoll - mag.ZAxis * sinRoll * cosPitch; + + float heading = atan2(Yh, Xh); + + return heading; +} + +// Correct angle +float correctAngle(float heading) +{ + if (heading < 0) { heading += 2 * PI; } + if (heading > 2 * PI) { heading -= 2 * PI; } + + return heading; +} +void compass_read() { + // + if (compass_read_task.isFirstIteration()) { + //wire + Wire.begin(); + + while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G)) + { + Serial.println("Could not find a valid MPU6050 sensor, check wiring!"); + compass_read_task.disable(); + } + + mpu.setI2CMasterModeEnabled(false); + mpu.setI2CBypassEnabled(true); + mpu.setSleepEnabled(false); + + // Initialize Initialize HMC5883L + Serial.println("Initialize HMC5883L"); + while (!compass.begin()) + { + Serial.println("Could not find a valid HMC5883L sensor, check wiring!"); + compass_read_task.disable(); + } + + // Set measurement range + compass.setRange(HMC5883L_RANGE_1_3GA); + + // Set measurement mode + compass.setMeasurementMode(HMC5883L_CONTINOUS); + + // Set data rate + compass.setDataRate(HMC5883L_DATARATE_30HZ); + + // Set number of samples averaged + compass.setSamples(HMC5883L_SAMPLES_8); + + // Set calibration offset. See HMC5883L_calibration.ino + compass.setOffset(0, 0, 0); + } + + // Read vectors + Vector mag = compass.readNormalize(); + Vector acc = mpu.readScaledAccel(); + + // Calculate headings + heading1 = noTiltCompensate(mag); + heading2 = tiltCompensate(mag, acc); + + if (heading2 == -1000) + { + heading2 = heading1; + } + + // Set declination angle on your location and fix heading + // You can find your declination on: http://magnetic-declination.com/ + // (+) Positive or (-) for negative + // For Bytom / Poland declination angle is 4'26E (positive) + // Formula: (deg + (min / 60.0)) / (180 / PI); + float declinationAngle = (-9.0 + (5.0 / 60.0)) / (180 / PI); + heading1 += declinationAngle; + heading2 += declinationAngle; + + // Correct for heading < 0deg and heading > 360deg + heading1 = correctAngle(heading1); + heading2 = correctAngle(heading2); + + // Convert to degrees + heading1 = heading1 * 180/PI; + heading2 = heading2 * 180/PI; + + // + float val = heading2; + // + Serial.println(val); + // + byte mac[6]; + WiFi.macAddress(mac); + uint32_t mac32 = (((((mac[2] << 8) + mac[3]) << 8) + mac[4]) << 8) + mac[5]; + // + Hello hello(String(MY_SIGN), MY_ID, mac32); // the most basic 'hello' + // and you can append some floats + static int count = 0; + count++; + hello.h1 = (count % 1000); + hello.h2 = val; + // hello.h3 = 0; + // hello.h4 = 0; + // + uint8_t frm_size = sizeof(Hello) + 2; + uint8_t frm[frm_size]; + frm[0] = '{'; + memcpy(frm + 1, (uint8_t *) &hello, sizeof(Hello)); + frm[frm_size - 1] = '}'; + // + esp_now_send(NULL, frm, frm_size); // to all peers in the list. + // +} +Task compass_read_task(25, TASK_FOREVER, &compass_read, &runner, true); // every 1 ms +//*-*-*-*-*-*-*-*-*-*-*-*-* + +//task #0 : blink led +#define LED_PERIOD (11111) +#define LED_ONTIME (1) +#define LED_GAPTIME (222) +#define LED_PIN 2 +extern Task blink_task; +void blink() { + // + static int count = 0; + count++; + // + switch (count % 4) { + case 0: + digitalWrite(LED_PIN, LOW); // first ON + blink_task.delay(LED_ONTIME); + break; + case 1: + digitalWrite(LED_PIN, HIGH); // first OFF + blink_task.delay(LED_GAPTIME); + break; + case 2: + digitalWrite(LED_PIN, LOW); // second ON + blink_task.delay(LED_ONTIME); + break; + case 3: + digitalWrite(LED_PIN, HIGH); // second OFF + blink_task.delay(LED_PERIOD - 2* LED_ONTIME - LED_GAPTIME); + break; + } +} +Task blink_task(0, TASK_FOREVER, &blink, &runner, true); // -> ENABLED, at start-up. + +// on 'Note' +void onNoteHandler(Note & n) { + //is it for me? + if (n.id == MY_GROUP_ID || n.id == MY_ID) { + // + if (n.pitch < 0) n.pitch = 0; + // volume_pin = n.pitch; //useless: for esp8266, A0 is only one adc. + // + if (n.velocity < 0) n.velocity = 0; + // + if (n.velocity == 0) { + //schedule 1 read + compass_read_task.disable(); + compass_read_task.setIterations(1); + compass_read_task.restart(); + } else { + // limiting max. speed. + if (n.velocity < 20) n.velocity = 20; + compass_read_task.setIterations(TASK_FOREVER); + compass_read_task.setInterval(n.velocity); + compass_read_task.restart(); + } + //pull-up on/off + if (n.onoff == 1) { + // volume_pullup = true; //useless: for esp8266, A0 no support for internal pull-up ? + } else { + // volume_pullup = false; + } + } +} + +// on 'receive' +void onDataReceive(uint8_t * mac, uint8_t *incomingData, uint8_t len) { + + // + Serial.write(incomingData, len); + + // open => identify => use. + if (incomingData[0] == '{' && incomingData[len - 1] == '}' && len == (sizeof(Hello) + 2)) { + Hello hello(""); + memcpy((uint8_t *) &hello, incomingData + 1, sizeof(Hello)); + // + Serial.println(hello.to_string()); + } + + // open => identify => use. + if (incomingData[0] == '[' && incomingData[len - 1] == ']' && len == (sizeof(Note) + 2)) { + Note note; + memcpy((uint8_t *) ¬e, incomingData + 1, sizeof(Note)); + onNoteHandler(note); + // + Serial.println(note.to_string()); + } +} + +// on 'sent' +void onDataSent(uint8_t *mac, uint8_t sendStatus) { + char buff[256] = ""; + sprintf(buff, "Delivery failed! -> %02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + if (sendStatus != 0) Serial.println(buff); +} + +// +void setup() { + + //led + pinMode(LED_PIN, OUTPUT); + + //serial + Serial.begin(115200); + delay(100); + + //info + Serial.println(); + Serial.println(); + Serial.println("\"hi, i m your postman.\""); + Serial.println("-"); + Serial.println("- my id: " + String(MY_ID) + ", gid: " + String(MY_GROUP_ID) + ", call me ==> \"" + String(MY_SIGN) + "\""); + Serial.println("- mac address: " + WiFi.macAddress() + ", channel: " + String(WIFI_CHANNEL)); + Serial.println("-"); + + //wifi - disabled + system_phy_set_max_tpw(0); + WiFiMode_t node_type = WIFI_STA; + WiFi.mode(node_type); + + //esp-now + if (esp_now_init() != 0) { + Serial.println("Error initializing ESP-NOW"); + return; + } + esp_now_set_self_role(ESP_NOW_ROLE_COMBO); + esp_now_register_send_cb(onDataSent); + esp_now_register_recv_cb(onDataReceive); + // + Serial.println("- ! (esp_now_add_peer) ==> add a 'broadcast peer' (FF:FF:FF:FF:FF:FF)."); + uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_add_peer(broadcastmac, ESP_NOW_ROLE_COMBO, 1, NULL, 0); + + Serial.println("-"); + Serial.println("\".-.-.-. :)\""); + Serial.println(); +} + +void loop() { + // + runner.execute(); + // +} diff --git a/faa_compass/message.h b/faa_compass/message.h new file mode 100644 index 0000000..8e2b9ab --- /dev/null +++ b/faa_compass/message.h @@ -0,0 +1,111 @@ +#pragma once + +//message type Note : '[' + Note + ']' +struct Note { + // + int32_t id; + float pitch; + float velocity; + float onoff; + float x1; + float x2; + float x3; + float x4; + float ps; + // + Note() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + Note(int32_t id_, float pitch_, float velocity_, float onoff_, float x1_, float x2_, float x3_, float x4_, float ps_) + { + id = id_; + pitch = pitch_; + velocity = velocity_; + onoff = onoff_; + x1 = x1_; + x2 = x2_; + x3 = x3_; + x4 = x4_; + ps = ps_; + } + // + void clear() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", pitch=" + String(pitch); + str += ", velocity=" + String(velocity); + str += ", onoff=" + String(onoff); + str += ", x1=" + String(x1); + str += ", x2=" + String(x2); + str += ", x3=" + String(x3); + str += ", x4=" + String(x4); + str += ", ps=" + String(ps); + str += " )"; + return str; + } +}; + +//message type Hello : '{' + Hello + '}' +#define SIGNATURE_LENGTH (20) +#define SIGNATURE_BUFF_LEN (SIGNATURE_LENGTH + 1) +struct Hello { + char sign[SIGNATURE_BUFF_LEN]; + int32_t id; + uint32_t mac32; + float h1; + float h2; + float h3; + float h4; + // + Hello(String sign_, int32_t id_ = 0, uint32_t mac32_ = 0, float h1_ = 0, float h2_ = 0, float h3_ = 0, float h4_ = 0) { + id = id_; + mac32 = mac32_; + h1 = h1_; + h2 = h2_; + h3 = h3_; + h4 = h4_; + sign_.toCharArray(sign, SIGNATURE_BUFF_LEN); + } + void clear() { + id = 0; + mac32 = 0; + h1 = 0; + h2 = 0; + h3 = 0; + h4 = 0; + sign[0] = '\0'; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", mac32=0x" + String(mac32, HEX); + str += ", sign=\"" + String(sign) + "\""; + str += ", h1=" + String(h1); + str += ", h2=" + String(h2); + str += ", h3=" + String(h3); + str += ", h4=" + String(h4); + str += " )"; + return str; + } +}; diff --git a/faa_compass/sketch.yaml b/faa_compass/sketch.yaml new file mode 100644 index 0000000..ee52428 --- /dev/null +++ b/faa_compass/sketch.yaml @@ -0,0 +1,2 @@ +default_fqbn: esp8266:esp8266:nodemcuv2:baud=460800 +default_port: /dev/tty.SLAB_USBtoUART diff --git a/faa_compass_adafruit/faa_compass.ino b/faa_compass_adafruit/faa_compass.ino new file mode 100644 index 0000000..5392b61 --- /dev/null +++ b/faa_compass_adafruit/faa_compass.ino @@ -0,0 +1,266 @@ +// +// wirelessly connected cloud (based on a LPWAN, called ESP-NOW) +// + +// +// puredata gathering @ ururu.cloud, Seoul +// + +// +// 2024 02 17 +// +// this module will be an esp-now node in a group. +// like, a bird in a group of birds. +// +// esp-now @ esp8266 w/ broadcast address (FF:FF:FF:FF:FF:FF) +// always broadcasting. everyone is 'talkative'. +// + +//======================== +#define MY_GROUP_ID (6000) +#define MY_ID (MY_GROUP_ID + 3) +#define MY_SIGN ("VOLUME") +//======================== + +//======================== +#define WIFI_CHANNEL 1 +//======================= + +//arduino +#include + +//message types +#include "message.h" + +//espnow +#include +#include + +//task +#include +Scheduler runner; + +//-*-*-*-*-*-*-*-*-*-*-*-*- +#include +#include +#include +Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345); +extern Task compass_read_task; +void compass_read() { + // + if (compass_read_task.isFirstIteration()) { + //wire + Wire.begin(); + + /* Initialise the sensor */ + if(!mag.begin()) while(1); + + /* Display some basic information on this sensor */ + sensor_t sensor; + mag.getSensor(&sensor); + Serial.println("------------------------------------"); + Serial.print ("Sensor: "); Serial.println(sensor.name); + Serial.print ("Driver Ver: "); Serial.println(sensor.version); + Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id); + Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" uT"); + Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" uT"); + Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" uT"); + Serial.println("------------------------------------"); + Serial.println(""); + } + + /* Get a new sensor event */ + sensors_event_t event; + mag.getEvent(&event); + + float heading = atan2(event.magnetic.y, event.magnetic.x); + + // Once you have your heading, you must then add your 'Declination Angle', which is the 'Error' of the magnetic field in your location. + // Find yours here: http://www.magnetic-declination.com/ + // Mine is: -13* 2' W, which is ~13 Degrees, or (which we need) 0.22 radians + // If you cannot find your Declination, comment out these two lines, your compass will be slightly off. + float declinationAngle = 0.22; + heading += declinationAngle; + + // Correct for when signs are reversed. + if(heading < 0) + heading += 2*PI; + + // Check for wrap due to addition of declination. + if(heading > 2*PI) + heading -= 2*PI; + + // Convert radians to degrees for readability. + float headingDegrees = heading * 180/M_PI; + + // + float val = headingDegrees; + // + Serial.println(val); + // + byte mac[6]; + WiFi.macAddress(mac); + uint32_t mac32 = (((((mac[2] << 8) + mac[3]) << 8) + mac[4]) << 8) + mac[5]; + // + Hello hello(String(MY_SIGN), MY_ID, mac32); // the most basic 'hello' + // and you can append some floats + static int count = 0; + count++; + hello.h1 = (count % 1000); + hello.h2 = val; + // hello.h3 = 0; + // hello.h4 = 0; + // + uint8_t frm_size = sizeof(Hello) + 2; + uint8_t frm[frm_size]; + frm[0] = '{'; + memcpy(frm + 1, (uint8_t *) &hello, sizeof(Hello)); + frm[frm_size - 1] = '}'; + // + esp_now_send(NULL, frm, frm_size); // to all peers in the list. + // +} +Task compass_read_task(25, TASK_FOREVER, &compass_read, &runner, true); // every 1 ms +//*-*-*-*-*-*-*-*-*-*-*-*-* + +//task #0 : blink led +#define LED_PERIOD (11111) +#define LED_ONTIME (1) +#define LED_GAPTIME (222) +#define LED_PIN 2 +extern Task blink_task; +void blink() { + // + static int count = 0; + count++; + // + switch (count % 4) { + case 0: + digitalWrite(LED_PIN, LOW); // first ON + blink_task.delay(LED_ONTIME); + break; + case 1: + digitalWrite(LED_PIN, HIGH); // first OFF + blink_task.delay(LED_GAPTIME); + break; + case 2: + digitalWrite(LED_PIN, LOW); // second ON + blink_task.delay(LED_ONTIME); + break; + case 3: + digitalWrite(LED_PIN, HIGH); // second OFF + blink_task.delay(LED_PERIOD - 2* LED_ONTIME - LED_GAPTIME); + break; + } +} +Task blink_task(0, TASK_FOREVER, &blink, &runner, true); // -> ENABLED, at start-up. + +// on 'Note' +void onNoteHandler(Note & n) { + //is it for me? + if (n.id == MY_GROUP_ID || n.id == MY_ID) { + // + if (n.pitch < 0) n.pitch = 0; + // volume_pin = n.pitch; //useless: for esp8266, A0 is only one adc. + // + if (n.velocity < 0) n.velocity = 0; + // + if (n.velocity == 0) { + //schedule 1 read + compass_read_task.disable(); + compass_read_task.setIterations(1); + compass_read_task.restart(); + } else { + // limiting max. speed. + if (n.velocity < 20) n.velocity = 20; + compass_read_task.setIterations(TASK_FOREVER); + compass_read_task.setInterval(n.velocity); + compass_read_task.restart(); + } + //pull-up on/off + if (n.onoff == 1) { + // volume_pullup = true; //useless: for esp8266, A0 no support for internal pull-up ? + } else { + // volume_pullup = false; + } + } +} + +// on 'receive' +void onDataReceive(uint8_t * mac, uint8_t *incomingData, uint8_t len) { + + // + Serial.write(incomingData, len); + + // open => identify => use. + if (incomingData[0] == '{' && incomingData[len - 1] == '}' && len == (sizeof(Hello) + 2)) { + Hello hello(""); + memcpy((uint8_t *) &hello, incomingData + 1, sizeof(Hello)); + // + Serial.println(hello.to_string()); + } + + // open => identify => use. + if (incomingData[0] == '[' && incomingData[len - 1] == ']' && len == (sizeof(Note) + 2)) { + Note note; + memcpy((uint8_t *) ¬e, incomingData + 1, sizeof(Note)); + onNoteHandler(note); + // + Serial.println(note.to_string()); + } +} + +// on 'sent' +void onDataSent(uint8_t *mac, uint8_t sendStatus) { + char buff[256] = ""; + sprintf(buff, "Delivery failed! -> %02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + if (sendStatus != 0) Serial.println(buff); +} + +// +void setup() { + + //led + pinMode(LED_PIN, OUTPUT); + + //serial + Serial.begin(115200); + delay(100); + + //info + Serial.println(); + Serial.println(); + Serial.println("\"hi, i m your postman.\""); + Serial.println("-"); + Serial.println("- my id: " + String(MY_ID) + ", gid: " + String(MY_GROUP_ID) + ", call me ==> \"" + String(MY_SIGN) + "\""); + Serial.println("- mac address: " + WiFi.macAddress() + ", channel: " + String(WIFI_CHANNEL)); + Serial.println("-"); + + //wifi - disabled + system_phy_set_max_tpw(0); + WiFiMode_t node_type = WIFI_STA; + WiFi.mode(node_type); + + //esp-now + if (esp_now_init() != 0) { + Serial.println("Error initializing ESP-NOW"); + return; + } + esp_now_set_self_role(ESP_NOW_ROLE_COMBO); + esp_now_register_send_cb(onDataSent); + esp_now_register_recv_cb(onDataReceive); + // + Serial.println("- ! (esp_now_add_peer) ==> add a 'broadcast peer' (FF:FF:FF:FF:FF:FF)."); + uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_add_peer(broadcastmac, ESP_NOW_ROLE_COMBO, 1, NULL, 0); + + Serial.println("-"); + Serial.println("\".-.-.-. :)\""); + Serial.println(); +} + +void loop() { + // + runner.execute(); + // +} diff --git a/faa_compass_adafruit/message.h b/faa_compass_adafruit/message.h new file mode 100644 index 0000000..8e2b9ab --- /dev/null +++ b/faa_compass_adafruit/message.h @@ -0,0 +1,111 @@ +#pragma once + +//message type Note : '[' + Note + ']' +struct Note { + // + int32_t id; + float pitch; + float velocity; + float onoff; + float x1; + float x2; + float x3; + float x4; + float ps; + // + Note() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + Note(int32_t id_, float pitch_, float velocity_, float onoff_, float x1_, float x2_, float x3_, float x4_, float ps_) + { + id = id_; + pitch = pitch_; + velocity = velocity_; + onoff = onoff_; + x1 = x1_; + x2 = x2_; + x3 = x3_; + x4 = x4_; + ps = ps_; + } + // + void clear() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", pitch=" + String(pitch); + str += ", velocity=" + String(velocity); + str += ", onoff=" + String(onoff); + str += ", x1=" + String(x1); + str += ", x2=" + String(x2); + str += ", x3=" + String(x3); + str += ", x4=" + String(x4); + str += ", ps=" + String(ps); + str += " )"; + return str; + } +}; + +//message type Hello : '{' + Hello + '}' +#define SIGNATURE_LENGTH (20) +#define SIGNATURE_BUFF_LEN (SIGNATURE_LENGTH + 1) +struct Hello { + char sign[SIGNATURE_BUFF_LEN]; + int32_t id; + uint32_t mac32; + float h1; + float h2; + float h3; + float h4; + // + Hello(String sign_, int32_t id_ = 0, uint32_t mac32_ = 0, float h1_ = 0, float h2_ = 0, float h3_ = 0, float h4_ = 0) { + id = id_; + mac32 = mac32_; + h1 = h1_; + h2 = h2_; + h3 = h3_; + h4 = h4_; + sign_.toCharArray(sign, SIGNATURE_BUFF_LEN); + } + void clear() { + id = 0; + mac32 = 0; + h1 = 0; + h2 = 0; + h3 = 0; + h4 = 0; + sign[0] = '\0'; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", mac32=0x" + String(mac32, HEX); + str += ", sign=\"" + String(sign) + "\""; + str += ", h1=" + String(h1); + str += ", h2=" + String(h2); + str += ", h3=" + String(h3); + str += ", h4=" + String(h4); + str += " )"; + return str; + } +}; diff --git a/faa_compass_adafruit/sketch.yaml b/faa_compass_adafruit/sketch.yaml new file mode 100644 index 0000000..ee52428 --- /dev/null +++ b/faa_compass_adafruit/sketch.yaml @@ -0,0 +1,2 @@ +default_fqbn: esp8266:esp8266:nodemcuv2:baud=460800 +default_port: /dev/tty.SLAB_USBtoUART diff --git a/faa_id/faa_id.ino b/faa_id/faa_id.ino new file mode 100644 index 0000000..4a42d1d --- /dev/null +++ b/faa_id/faa_id.ino @@ -0,0 +1,277 @@ +// +// wirelessly connected cloud (based on a LPWAN, called ESP-NOW) +// + +// +// this module will be an esp-now node in a group. +// like, a bird in a group of birds. +// +// esp-now @ esp8266 w/ broadcast address (FF:FF:FF:FF:FF:FF) +// always broadcasting. everyone is 'talkative'. +// + +//======================== +#define MY_GROUP_ID (90000) +#define MY_ID (MY_GROUP_ID + 1) +#define MY_SIGN ("ID") +//======================== + +//======================== +#define WIFI_CHANNEL 1 +//======================= + +//arduino +#include + +//message types +#include "message.h" + +//espnow +#include +#include + +//task +#include +Scheduler runner; + +//-*-*-*-*-*-*-*-*-*-*-*-*- +// servo +#define MOTOR_1A (D6) +#define MOTOR_1B (D5) +// my tasks +int speed = 0; +bool isactive = false; +void set_speed() { + int r = speed; + // + if (r >= 0) { + digitalWrite(MOTOR_1A, LOW); + analogWrite(MOTOR_1B, r); + } else { + digitalWrite(MOTOR_1B, LOW); + analogWrite(MOTOR_1A, r*(-1)); + } + Serial.print("set_speed:"); + Serial.println(r); + isactive = true; +} +Task set_speed_task(0, TASK_ONCE, &set_speed, &runner, false); +// +void rest() { + analogWrite(MOTOR_1A, LOW); + analogWrite(MOTOR_1B, LOW); + isactive = false; +} +Task rest_task(0, TASK_ONCE, &rest, &runner, false); +// +uint8_t watch_counter = 0; +void watcher() { + if (isactive) { + if (watch_counter > 3) { + rest_task.restartDelayed(10); + watch_counter = 0; + } else { + watch_counter++; + } + } +} +Task watcher_task(1000, TASK_FOREVER, &watcher, &runner, true); +// +#define MOTOR_2A (D3) +#define MOTOR_2B (D2) +// my tasks +int speed2 = 0; +bool isactive2 = false; +void set_speed2() { + int r = speed2; + // + if (r >= 0) { + digitalWrite(MOTOR_2A, LOW); + analogWrite(MOTOR_2B, r); + } else { + digitalWrite(MOTOR_2B, LOW); + analogWrite(MOTOR_2A, r*(-1)); + } + Serial.print("set_speed2:"); + Serial.println(r); + isactive2 = true; +} +Task set_speed2_task(0, TASK_ONCE, &set_speed2, &runner, false); +// +void rest2() { + analogWrite(MOTOR_2A, LOW); + analogWrite(MOTOR_2B, LOW); + isactive2 = false; +} +Task rest2_task(0, TASK_ONCE, &rest2, &runner, false); +// +uint8_t watch2_counter = 0; +void watcher2() { + if (isactive2) { + if (watch2_counter > 3) { + rest2_task.restartDelayed(10); + watch2_counter = 0; + } else { + watch2_counter++; + } + } +} +Task watcher2_task(1000, TASK_FOREVER, &watcher2, &runner, true); +//*-*-*-*-*-*-*-*-*-*-*-*-* + +//task #0 : blink led +#define LED_PERIOD (11111) +#define LED_ONTIME (1) +#define LED_GAPTIME (222) +#define LED_PIN 2 +extern Task blink_task; +void blink() { + // + static int count = 0; + count++; + // + switch (count % 4) { + case 0: + digitalWrite(LED_PIN, LOW); // first ON + blink_task.delay(LED_ONTIME); + break; + case 1: + digitalWrite(LED_PIN, HIGH); // first OFF + blink_task.delay(LED_GAPTIME); + break; + case 2: + digitalWrite(LED_PIN, LOW); // second ON + blink_task.delay(LED_ONTIME); + break; + case 3: + digitalWrite(LED_PIN, HIGH); // second OFF + blink_task.delay(LED_PERIOD - 2* LED_ONTIME - LED_GAPTIME); + break; + } +} +Task blink_task(0, TASK_FOREVER, &blink, &runner, true); // -> ENABLED, at start-up. + +// on 'Note' +void onNoteHandler(Note & n) { + //is it for me? + if (n.id == MY_GROUP_ID || n.id == MY_ID) { + // + if (n.pitch == 0) { + speed = n.velocity; + // + if (n.onoff == 1) { + set_speed_task.restartDelayed(10); + watch_counter = 0; + } else if (n.onoff == 0) { + rest_task.restartDelayed(10); + } else if (n.onoff == 2) { + set_speed_task.restartDelayed(10); + rest_task.restartDelayed(10 + n.x1); + } + } + // + else if (n.pitch == 1) { + speed2 = n.velocity; + // + if (n.onoff == 1) { + set_speed2_task.restartDelayed(10); + watch2_counter = 0; + } else if (n.onoff == 0) { + rest2_task.restartDelayed(10); + } else if (n.onoff == 2) { + set_speed2_task.restartDelayed(10); + rest2_task.restartDelayed(10 + n.x1); + } + } + // + } +} + +// on 'receive' +void onDataReceive(uint8_t * mac, uint8_t *incomingData, uint8_t len) { + + // + // Serial.write(incomingData, len); + + // open => identify => use. + if (incomingData[0] == '{' && incomingData[len - 1] == '}' && len == (sizeof(Hello) + 2)) { + Hello hello(""); + memcpy((uint8_t *) &hello, incomingData + 1, sizeof(Hello)); + // + Serial.println(hello.to_string()); + } + + // open => identify => use. + if (incomingData[0] == '[' && incomingData[len - 1] == ']' && len == (sizeof(Note) + 2)) { + Note note; + memcpy((uint8_t *) ¬e, incomingData + 1, sizeof(Note)); + onNoteHandler(note); + // + Serial.println(note.to_string()); + } +} + +// on 'sent' +void onDataSent(uint8_t *mac, uint8_t sendStatus) { + char buff[256] = ""; + sprintf(buff, "Delivery failed! -> %02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + if (sendStatus != 0) Serial.println(buff); +} + +// +void setup() { + + //led + pinMode(LED_PIN, OUTPUT); + + //pwm freq. + analogWriteFreq(40000); + + //serial + Serial.begin(115200); + delay(100); + + //info + Serial.println(); + Serial.println(); + Serial.println("\"hi, i m your postman.\""); + Serial.println("-"); + Serial.println("- my id: " + String(MY_ID) + ", gid: " + String(MY_GROUP_ID) + ", call me ==> \"" + String(MY_SIGN) + "\""); + Serial.println("- mac address: " + WiFi.macAddress() + ", channel: " + String(WIFI_CHANNEL)); + Serial.println("-"); + + //wifi - disabled + system_phy_set_max_tpw(0); + WiFiMode_t node_type = WIFI_STA; + WiFi.mode(node_type); + + //esp-now + if (esp_now_init() != 0) { + Serial.println("Error initializing ESP-NOW"); + return; + } + esp_now_set_self_role(ESP_NOW_ROLE_COMBO); + esp_now_register_send_cb(onDataSent); + esp_now_register_recv_cb(onDataReceive); + // + Serial.println("- ! (esp_now_add_peer) ==> add a 'broadcast peer' (FF:FF:FF:FF:FF:FF)."); + uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_add_peer(broadcastmac, ESP_NOW_ROLE_COMBO, 1, NULL, 0); + + Serial.println("-"); + Serial.println("\".-.-.-. :)\""); + Serial.println(); + + //random seed + randomSeed(analogRead(0)); + + //tasks + rest_task.restartDelayed(500); + rest2_task.restartDelayed(500); +} + +void loop() { + // + runner.execute(); + // +} diff --git a/faa_id/message.h b/faa_id/message.h new file mode 100644 index 0000000..8e2b9ab --- /dev/null +++ b/faa_id/message.h @@ -0,0 +1,111 @@ +#pragma once + +//message type Note : '[' + Note + ']' +struct Note { + // + int32_t id; + float pitch; + float velocity; + float onoff; + float x1; + float x2; + float x3; + float x4; + float ps; + // + Note() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + Note(int32_t id_, float pitch_, float velocity_, float onoff_, float x1_, float x2_, float x3_, float x4_, float ps_) + { + id = id_; + pitch = pitch_; + velocity = velocity_; + onoff = onoff_; + x1 = x1_; + x2 = x2_; + x3 = x3_; + x4 = x4_; + ps = ps_; + } + // + void clear() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", pitch=" + String(pitch); + str += ", velocity=" + String(velocity); + str += ", onoff=" + String(onoff); + str += ", x1=" + String(x1); + str += ", x2=" + String(x2); + str += ", x3=" + String(x3); + str += ", x4=" + String(x4); + str += ", ps=" + String(ps); + str += " )"; + return str; + } +}; + +//message type Hello : '{' + Hello + '}' +#define SIGNATURE_LENGTH (20) +#define SIGNATURE_BUFF_LEN (SIGNATURE_LENGTH + 1) +struct Hello { + char sign[SIGNATURE_BUFF_LEN]; + int32_t id; + uint32_t mac32; + float h1; + float h2; + float h3; + float h4; + // + Hello(String sign_, int32_t id_ = 0, uint32_t mac32_ = 0, float h1_ = 0, float h2_ = 0, float h3_ = 0, float h4_ = 0) { + id = id_; + mac32 = mac32_; + h1 = h1_; + h2 = h2_; + h3 = h3_; + h4 = h4_; + sign_.toCharArray(sign, SIGNATURE_BUFF_LEN); + } + void clear() { + id = 0; + mac32 = 0; + h1 = 0; + h2 = 0; + h3 = 0; + h4 = 0; + sign[0] = '\0'; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", mac32=0x" + String(mac32, HEX); + str += ", sign=\"" + String(sign) + "\""; + str += ", h1=" + String(h1); + str += ", h2=" + String(h2); + str += ", h3=" + String(h3); + str += ", h4=" + String(h4); + str += " )"; + return str; + } +}; diff --git a/faa_id/sketch.yaml b/faa_id/sketch.yaml new file mode 100644 index 0000000..ee52428 --- /dev/null +++ b/faa_id/sketch.yaml @@ -0,0 +1,2 @@ +default_fqbn: esp8266:esp8266:nodemcuv2:baud=460800 +default_port: /dev/tty.SLAB_USBtoUART diff --git a/faa_input/faa_input.ino b/faa_input/faa_input.ino index a960dbf..576a0ab 100644 --- a/faa_input/faa_input.ino +++ b/faa_input/faa_input.ino @@ -18,7 +18,7 @@ //======================== #define MY_GROUP_ID (6000) -#define MY_ID (MY_GROUP_ID + 601) +#define MY_ID (MY_GROUP_ID + 909) #define MY_SIGN ("INP") //======================== @@ -211,14 +211,14 @@ void setup() { pinMode(LED_PIN, OUTPUT); //input - pinMode(D1, INPUT); - pinMode(D2, INPUT); + pinMode(D1, INPUT_PULLUP); + pinMode(D2, INPUT_PULLUP); pinMode(D3, INPUT); // - pinMode(D5, INPUT); - pinMode(D6, INPUT); - pinMode(D7, INPUT); - pinMode(D8, INPUT); + pinMode(D5, INPUT_PULLUP); + pinMode(D6, INPUT_PULLUP); + pinMode(D7, INPUT_PULLUP); + pinMode(D8, INPUT_PULLUP); //serial Serial.begin(115200); diff --git a/faa_pix/faa_pix.ino b/faa_pix/faa_pix.ino new file mode 100644 index 0000000..660227f --- /dev/null +++ b/faa_pix/faa_pix.ino @@ -0,0 +1,207 @@ +// +// wirelessly connected cloud (based on a LPWAN, called ESP-NOW) +// + +// +// this module will be an esp-now node in a group. +// like, a bird in a group of birds. +// +// esp-now @ esp8266 w/ broadcast address (FF:FF:FF:FF:FF:FF) +// always broadcasting. everyone is 'talkative'. +// + +//======================== +#define MY_GROUP_ID (8000) +#define MY_ID (MY_GROUP_ID + 101) +#define MY_SIGN ("PIXEL") +//======================== + +//======================== +#define WIFI_CHANNEL 1 +//======================= + +//arduino +#include + +//message types +#include "message.h" + +//espnow +#include +#include + +//task +#include +Scheduler runner; + +//-*-*-*-*-*-*-*-*-*-*-*-*- +#include +#define PIXEL_COUNT 8 +uint32_t PIXELS[PIXEL_COUNT] = {0, }; +uint8_t pix_brightness = 255; +uint8_t p_pix_brightness = 255; +#define PIXEL_PIN 12 // D6 +Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); +extern Task pixel_task; +void pixel() { + + /// + if (pixel_task.isFirstIteration()) { + strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED) + strip.show(); // Turn OFF all pixels ASAP + } + + /// + if (p_pix_brightness != pix_brightness) { + p_pix_brightness = pix_brightness; + strip.setBrightness(pix_brightness); // Set BRIGHTNESS to about 1/5 (max = 255) + } + + // + for (int idx = 0; idx < PIXEL_COUNT; idx++) { + strip.setPixelColor(idx, PIXELS[idx]); // Set pixel's color (in RAM) + } + + // + strip.show(); // Update strip to match +} +Task pixel_task(20, TASK_FOREVER, &pixel, &runner, true); // every 20 ms +//*-*-*-*-*-*-*-*-*-*-*-*-* + +//task #0 : blink led +#define LED_PERIOD (11111) +#define LED_ONTIME (1) +#define LED_GAPTIME (222) +#define LED_PIN 2 +extern Task blink_task; +void blink() { + // + static int count = 0; + count++; + // + switch (count % 4) { + case 0: + digitalWrite(LED_PIN, LOW); // first ON + blink_task.delay(LED_ONTIME); + break; + case 1: + digitalWrite(LED_PIN, HIGH); // first OFF + blink_task.delay(LED_GAPTIME); + break; + case 2: + digitalWrite(LED_PIN, LOW); // second ON + blink_task.delay(LED_ONTIME); + break; + case 3: + digitalWrite(LED_PIN, HIGH); // second OFF + blink_task.delay(LED_PERIOD - 2* LED_ONTIME - LED_GAPTIME); + break; + } +} +Task blink_task(0, TASK_FOREVER, &blink, &runner, true); // -> ENABLED, at start-up. + +// on 'Note' +void onNoteHandler(Note & n) { + //is it for me? + if (n.id == MY_GROUP_ID || n.id == MY_ID) { + // + int intensity = (int)n.velocity; + if (intensity < 0) intensity = 0; + if (intensity > 255) intensity = 255; + pix_brightness = intensity; + // + int idx = (int)n.pitch; + if (idx < 0) idx = 0; + if (idx > PIXEL_COUNT - 1) idx = PIXEL_COUNT - 1; + PIXELS[idx] = strip.Color(n.x1, n.x2, n.x3); + } +} + +// on 'receive' +void onDataReceive(uint8_t * mac, uint8_t *incomingData, uint8_t len) { + + // + Serial.write(incomingData, len); + + // open => identify => use. + if (incomingData[0] == '{' && incomingData[len - 1] == '}' && len == (sizeof(Hello) + 2)) { + Hello hello(""); + memcpy((uint8_t *) &hello, incomingData + 1, sizeof(Hello)); + // + Serial.println(hello.to_string()); + } + + // open => identify => use. + if (incomingData[0] == '[' && incomingData[len - 1] == ']' && len == (sizeof(Note) + 2)) { + Note note; + memcpy((uint8_t *) ¬e, incomingData + 1, sizeof(Note)); + onNoteHandler(note); + // + Serial.println(note.to_string()); + } +} + +// on 'sent' +void onDataSent(uint8_t *mac, uint8_t sendStatus) { + char buff[256] = ""; + sprintf(buff, "Delivery failed! -> %02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + if (sendStatus != 0) Serial.println(buff); +} + +// +void setup() { + + //led + pinMode(LED_PIN, OUTPUT); + + //input + pinMode(D1, INPUT); + pinMode(D2, INPUT); + pinMode(D3, INPUT); + // + pinMode(D5, INPUT); + pinMode(D6, INPUT); + pinMode(D7, INPUT); + pinMode(D8, INPUT); + + //serial + Serial.begin(115200); + delay(100); + + //info + Serial.println(); + Serial.println(); + Serial.println("\"hi, i m your postman.\""); + Serial.println("-"); + Serial.println("- my id: " + String(MY_ID) + ", gid: " + String(MY_GROUP_ID) + ", call me ==> \"" + String(MY_SIGN) + "\""); + Serial.println("- mac address: " + WiFi.macAddress() + ", channel: " + String(WIFI_CHANNEL)); + Serial.println("-"); + + //wifi - disabled + system_phy_set_max_tpw(0); + WiFiMode_t node_type = WIFI_STA; + WiFi.mode(node_type); + + //esp-now + if (esp_now_init() != 0) { + Serial.println("Error initializing ESP-NOW"); + return; + } + esp_now_set_self_role(ESP_NOW_ROLE_COMBO); + esp_now_register_send_cb(onDataSent); + esp_now_register_recv_cb(onDataReceive); + // + Serial.println("- ! (esp_now_add_peer) ==> add a 'broadcast peer' (FF:FF:FF:FF:FF:FF)."); + uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_add_peer(broadcastmac, ESP_NOW_ROLE_COMBO, 1, NULL, 0); + + Serial.println("-"); + Serial.println("\".-.-.-. :)\""); + Serial.println(); +} + +void loop() { + // + runner.execute(); + // +} diff --git a/faa_pix/message.h b/faa_pix/message.h new file mode 100644 index 0000000..8e2b9ab --- /dev/null +++ b/faa_pix/message.h @@ -0,0 +1,111 @@ +#pragma once + +//message type Note : '[' + Note + ']' +struct Note { + // + int32_t id; + float pitch; + float velocity; + float onoff; + float x1; + float x2; + float x3; + float x4; + float ps; + // + Note() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + Note(int32_t id_, float pitch_, float velocity_, float onoff_, float x1_, float x2_, float x3_, float x4_, float ps_) + { + id = id_; + pitch = pitch_; + velocity = velocity_; + onoff = onoff_; + x1 = x1_; + x2 = x2_; + x3 = x3_; + x4 = x4_; + ps = ps_; + } + // + void clear() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", pitch=" + String(pitch); + str += ", velocity=" + String(velocity); + str += ", onoff=" + String(onoff); + str += ", x1=" + String(x1); + str += ", x2=" + String(x2); + str += ", x3=" + String(x3); + str += ", x4=" + String(x4); + str += ", ps=" + String(ps); + str += " )"; + return str; + } +}; + +//message type Hello : '{' + Hello + '}' +#define SIGNATURE_LENGTH (20) +#define SIGNATURE_BUFF_LEN (SIGNATURE_LENGTH + 1) +struct Hello { + char sign[SIGNATURE_BUFF_LEN]; + int32_t id; + uint32_t mac32; + float h1; + float h2; + float h3; + float h4; + // + Hello(String sign_, int32_t id_ = 0, uint32_t mac32_ = 0, float h1_ = 0, float h2_ = 0, float h3_ = 0, float h4_ = 0) { + id = id_; + mac32 = mac32_; + h1 = h1_; + h2 = h2_; + h3 = h3_; + h4 = h4_; + sign_.toCharArray(sign, SIGNATURE_BUFF_LEN); + } + void clear() { + id = 0; + mac32 = 0; + h1 = 0; + h2 = 0; + h3 = 0; + h4 = 0; + sign[0] = '\0'; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", mac32=0x" + String(mac32, HEX); + str += ", sign=\"" + String(sign) + "\""; + str += ", h1=" + String(h1); + str += ", h2=" + String(h2); + str += ", h3=" + String(h3); + str += ", h4=" + String(h4); + str += " )"; + return str; + } +}; diff --git a/faa_pixw/faa_pixw.ino b/faa_pixw/faa_pixw.ino new file mode 100644 index 0000000..4d8464a --- /dev/null +++ b/faa_pixw/faa_pixw.ino @@ -0,0 +1,207 @@ +// +// wirelessly connected cloud (based on a LPWAN, called ESP-NOW) +// + +// +// this module will be an esp-now node in a group. +// like, a bird in a group of birds. +// +// esp-now @ esp8266 w/ broadcast address (FF:FF:FF:FF:FF:FF) +// always broadcasting. everyone is 'talkative'. +// + +//======================== +#define MY_GROUP_ID (8000) +#define MY_ID (MY_GROUP_ID + 101) +#define MY_SIGN ("PIXEL") +//======================== + +//======================== +#define WIFI_CHANNEL 1 +//======================= + +//arduino +#include + +//message types +#include "message.h" + +//espnow +#include +#include + +//task +#include +Scheduler runner; + +//-*-*-*-*-*-*-*-*-*-*-*-*- +#include +#define PIXEL_COUNT 8 +uint32_t PIXELS[PIXEL_COUNT] = {0, }; +uint8_t pix_brightness = 255; +uint8_t p_pix_brightness = 255; +#define PIXEL_PIN 12 // D6 +Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRBW + NEO_KHZ800); +extern Task pixel_task; +void pixel() { + + /// + if (pixel_task.isFirstIteration()) { + strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED) + strip.show(); // Turn OFF all pixels ASAP + } + + /// + if (p_pix_brightness != pix_brightness) { + p_pix_brightness = pix_brightness; + strip.setBrightness(pix_brightness); // Set BRIGHTNESS to about 1/5 (max = 255) + } + + // + for (int idx = 0; idx < PIXEL_COUNT; idx++) { + strip.setPixelColor(idx, PIXELS[idx]); // Set pixel's color (in RAM) + } + + // + strip.show(); // Update strip to match +} +Task pixel_task(20, TASK_FOREVER, &pixel, &runner, true); // every 20 ms +//*-*-*-*-*-*-*-*-*-*-*-*-* + +//task #0 : blink led +#define LED_PERIOD (11111) +#define LED_ONTIME (1) +#define LED_GAPTIME (222) +#define LED_PIN 2 +extern Task blink_task; +void blink() { + // + static int count = 0; + count++; + // + switch (count % 4) { + case 0: + digitalWrite(LED_PIN, LOW); // first ON + blink_task.delay(LED_ONTIME); + break; + case 1: + digitalWrite(LED_PIN, HIGH); // first OFF + blink_task.delay(LED_GAPTIME); + break; + case 2: + digitalWrite(LED_PIN, LOW); // second ON + blink_task.delay(LED_ONTIME); + break; + case 3: + digitalWrite(LED_PIN, HIGH); // second OFF + blink_task.delay(LED_PERIOD - 2* LED_ONTIME - LED_GAPTIME); + break; + } +} +Task blink_task(0, TASK_FOREVER, &blink, &runner, true); // -> ENABLED, at start-up. + +// on 'Note' +void onNoteHandler(Note & n) { + //is it for me? + if (n.id == MY_GROUP_ID || n.id == MY_ID) { + // + int intensity = (int)n.velocity; + if (intensity < 0) intensity = 0; + if (intensity > 255) intensity = 255; + pix_brightness = intensity; + // + int idx = (int)n.pitch; + if (idx < 0) idx = 0; + if (idx > PIXEL_COUNT - 1) idx = PIXEL_COUNT - 1; + PIXELS[idx] = strip.Color(n.x1, n.x2, n.x3, n.x4); + } +} + +// on 'receive' +void onDataReceive(uint8_t * mac, uint8_t *incomingData, uint8_t len) { + + // + Serial.write(incomingData, len); + + // open => identify => use. + if (incomingData[0] == '{' && incomingData[len - 1] == '}' && len == (sizeof(Hello) + 2)) { + Hello hello(""); + memcpy((uint8_t *) &hello, incomingData + 1, sizeof(Hello)); + // + Serial.println(hello.to_string()); + } + + // open => identify => use. + if (incomingData[0] == '[' && incomingData[len - 1] == ']' && len == (sizeof(Note) + 2)) { + Note note; + memcpy((uint8_t *) ¬e, incomingData + 1, sizeof(Note)); + onNoteHandler(note); + // + Serial.println(note.to_string()); + } +} + +// on 'sent' +void onDataSent(uint8_t *mac, uint8_t sendStatus) { + char buff[256] = ""; + sprintf(buff, "Delivery failed! -> %02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + if (sendStatus != 0) Serial.println(buff); +} + +// +void setup() { + + //led + pinMode(LED_PIN, OUTPUT); + + //input + pinMode(D1, INPUT); + pinMode(D2, INPUT); + pinMode(D3, INPUT); + // + pinMode(D5, INPUT); + pinMode(D6, INPUT); + pinMode(D7, INPUT); + pinMode(D8, INPUT); + + //serial + Serial.begin(115200); + delay(100); + + //info + Serial.println(); + Serial.println(); + Serial.println("\"hi, i m your postman.\""); + Serial.println("-"); + Serial.println("- my id: " + String(MY_ID) + ", gid: " + String(MY_GROUP_ID) + ", call me ==> \"" + String(MY_SIGN) + "\""); + Serial.println("- mac address: " + WiFi.macAddress() + ", channel: " + String(WIFI_CHANNEL)); + Serial.println("-"); + + //wifi - disabled + system_phy_set_max_tpw(0); + WiFiMode_t node_type = WIFI_STA; + WiFi.mode(node_type); + + //esp-now + if (esp_now_init() != 0) { + Serial.println("Error initializing ESP-NOW"); + return; + } + esp_now_set_self_role(ESP_NOW_ROLE_COMBO); + esp_now_register_send_cb(onDataSent); + esp_now_register_recv_cb(onDataReceive); + // + Serial.println("- ! (esp_now_add_peer) ==> add a 'broadcast peer' (FF:FF:FF:FF:FF:FF)."); + uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_add_peer(broadcastmac, ESP_NOW_ROLE_COMBO, 1, NULL, 0); + + Serial.println("-"); + Serial.println("\".-.-.-. :)\""); + Serial.println(); +} + +void loop() { + // + runner.execute(); + // +} diff --git a/faa_pixw/message.h b/faa_pixw/message.h new file mode 100644 index 0000000..8e2b9ab --- /dev/null +++ b/faa_pixw/message.h @@ -0,0 +1,111 @@ +#pragma once + +//message type Note : '[' + Note + ']' +struct Note { + // + int32_t id; + float pitch; + float velocity; + float onoff; + float x1; + float x2; + float x3; + float x4; + float ps; + // + Note() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + Note(int32_t id_, float pitch_, float velocity_, float onoff_, float x1_, float x2_, float x3_, float x4_, float ps_) + { + id = id_; + pitch = pitch_; + velocity = velocity_; + onoff = onoff_; + x1 = x1_; + x2 = x2_; + x3 = x3_; + x4 = x4_; + ps = ps_; + } + // + void clear() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", pitch=" + String(pitch); + str += ", velocity=" + String(velocity); + str += ", onoff=" + String(onoff); + str += ", x1=" + String(x1); + str += ", x2=" + String(x2); + str += ", x3=" + String(x3); + str += ", x4=" + String(x4); + str += ", ps=" + String(ps); + str += " )"; + return str; + } +}; + +//message type Hello : '{' + Hello + '}' +#define SIGNATURE_LENGTH (20) +#define SIGNATURE_BUFF_LEN (SIGNATURE_LENGTH + 1) +struct Hello { + char sign[SIGNATURE_BUFF_LEN]; + int32_t id; + uint32_t mac32; + float h1; + float h2; + float h3; + float h4; + // + Hello(String sign_, int32_t id_ = 0, uint32_t mac32_ = 0, float h1_ = 0, float h2_ = 0, float h3_ = 0, float h4_ = 0) { + id = id_; + mac32 = mac32_; + h1 = h1_; + h2 = h2_; + h3 = h3_; + h4 = h4_; + sign_.toCharArray(sign, SIGNATURE_BUFF_LEN); + } + void clear() { + id = 0; + mac32 = 0; + h1 = 0; + h2 = 0; + h3 = 0; + h4 = 0; + sign[0] = '\0'; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", mac32=0x" + String(mac32, HEX); + str += ", sign=\"" + String(sign) + "\""; + str += ", h1=" + String(h1); + str += ", h2=" + String(h2); + str += ", h3=" + String(h3); + str += ", h4=" + String(h4); + str += " )"; + return str; + } +}; diff --git a/faa_radioooo/faa_radioooo.ino b/faa_radioooo/faa_radioooo.ino new file mode 100644 index 0000000..d917655 --- /dev/null +++ b/faa_radioooo/faa_radioooo.ino @@ -0,0 +1,383 @@ +// +// wirelessly connected cloud (based on a LPWAN, called ESP-NOW) +// + +// +// () performance, hosted by Vegetable Wife +// @ 2025 Nov 10 ~ 11 +// + +// +// 2025 nov +// +// esp32 based radio streamer +// + +//======================== +#define MY_GROUP_ID (80000) +#define MY_ID (MY_GROUP_ID + 1) +#define MY_SIGN ("RADIOOOO") +//======================== + +//======================== +#define WIFI_SSID "Mullae 2F" +#define WIFI_PASSWD "sfacsfac1!" +// +#define WIFI_CHANNEL 1 +//======================= + +//arduino +#include + +//message types +#include "message.h" + +//espnow +#include +#include + +//task +#include +Scheduler runner; + +//screen +#include +#include +#define MAKEPYTHON_ESP32_SDA 4 +#define MAKEPYTHON_ESP32_SCL 5 +#define SCREEN_WIDTH 128 // OLED display width, in pixels +#define SCREEN_HEIGHT 64 // OLED display height, in pixels +#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) +Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); + +//-*-*-*-*-*-*-*-*-*-*-*-*- +// my tasks +// audio & sd & filesystem +#include "Audio.h" +#include "SPI.h" +#include "SD.h" +#include "FS.h" +//sdcard +#define SD_CS 22 +#define SPI_MOSI 23 +#define SPI_MISO 19 +#define SPI_SCK 18 +//digital i/o used (for) makerfabs audio v2.0 +#define I2S_DOUT 27 +#define I2S_BCLK 26 +#define I2S_LRC 25 +Audio audio; + +//screen task +String screen_myid = "my_id:" + String(MY_ID); +String screen_cmd = ""; +String screen_radiolink = "_no station_"; + +// +extern Task screen_cmd_notify_task; +bool cmd_notify = false; +bool cmd_notifying = false; +void screen_cmd_notify() { + if (screen_cmd_notify_task.isFirstIteration()) { cmd_notify = true; cmd_notifying=true; } + else if (screen_cmd_notify_task.isLastIteration()) { cmd_notify = false; cmd_notifying=false; } + else cmd_notify = !cmd_notify; +} +Task screen_cmd_notify_task(500, 10, &screen_cmd_notify, &runner, false); + +// +extern Task screen_task; +void screen() { + //clear screen + a + int line_step = 12; + int line = 0; + display.clearDisplay(); + display.setTextColor(SSD1306_WHITE); + display.setTextSize(1); + + //line0 - myid + display.setCursor(0, line); + display.println(screen_myid); + line += line_step; + + //line1 - mode line (playing / stopped) + notify mark + display.setCursor(0, line); + if (audio.isRunning()) display.println("= playing ==="); + else display.println("* stopped !:."); + if (cmd_notify) { + display.setCursor(120, line); + display.println("*"); + } + line += line_step; + + //line2 - info + display.setCursor(0, line); + if (cmd_notifying) { + display.println(screen_cmd.c_str()); //rf. last msg. + } else { + display.println(screen_radiolink.c_str()); //radiolink + } + line += line_step; + // + display.display(); + // +} +Task screen_task(200, TASK_FOREVER, &screen, &runner, false); + +//radio # +int radio_now = -1; //0~999 +std::vector radio_list = { + "http://radio.dianaband.in:8000/stream1", + "http://radio.dianaband.in:8000/stream2", + "http://radio.dianaband.in:8000/stream3", + "http://radio.dianaband.in:8000/stream4", + "http://radio.dianaband.in:8000/stream5", + "http://radio.dianaband.in:8000/stream6" +}; + +//on 'start' +void radio_player_start() +{ + //TEST + Serial.println("tune-in: " + radio_list[radio_now]); + screen_radiolink = radio_list[radio_now]; + + //start the radio streaming! + audio.connecttohost(radio_list[radio_now].c_str()); + + delay(10); +} +Task radio_player_start_task(0, TASK_ONCE, &radio_player_start, &runner, false); + +//on 'stop' +void radio_player_stop() { + //stop the player. + audio.stopSong(); +} +Task radio_player_stop_task(0, TASK_ONCE, &radio_player_stop, &runner, false); +//*-*-*-*-*-*-*-*-*-*-*-*-* + +// +extern Task hello_task; +static int hello_delay = 0; +void hello() { + // + byte mac[6]; + WiFi.macAddress(mac); + uint32_t mac32 = (((((mac[2] << 8) + mac[3]) << 8) + mac[4]) << 8) + mac[5]; + // + Hello hello(String(MY_SIGN), MY_ID, mac32); // the most basic 'hello' + // and you can append some floats + static int count = 0; + count++; + hello.h1 = (count % 1000); + hello.h2 = radio_now; + // hello.h3 = 0; + // hello.h4 = 0; + // + uint8_t frm_size = sizeof(Hello) + 2; + uint8_t frm[frm_size]; + frm[0] = '{'; + memcpy(frm + 1, (uint8_t *) &hello, sizeof(Hello)); + frm[frm_size - 1] = '}'; + // + esp_now_send(NULL, frm, frm_size); // to all peers in the list. + // + // MONITORING_SERIAL.write(frm, frm_size); + // MONITORING_SERIAL.println(" ==(esp_now_send/0)==> "); + // + if (hello_delay > 0) { + if (hello_delay < 100) hello_delay = 100; + hello_task.restartDelayed(hello_delay); + } +} +Task hello_task(0, TASK_ONCE, &hello, &runner, false); + +//task #0 : blink led +#define LED_PERIOD (11111) +#define LED_ONTIME (1) +#define LED_GAPTIME (222) +#define LED_PIN 2 +extern Task blink_task; +void blink() { + // + static int count = 0; + count++; + // + switch (count % 4) { + case 0: + digitalWrite(LED_PIN, LOW); // first ON + blink_task.delay(LED_ONTIME); + break; + case 1: + digitalWrite(LED_PIN, HIGH); // first OFF + blink_task.delay(LED_GAPTIME); + break; + case 2: + digitalWrite(LED_PIN, LOW); // second ON + blink_task.delay(LED_ONTIME); + break; + case 3: + digitalWrite(LED_PIN, HIGH); // second OFF + blink_task.delay(LED_PERIOD - 2* LED_ONTIME - LED_GAPTIME); + break; + } +} +Task blink_task(0, TASK_FOREVER, &blink, &runner, true); // -> ENABLED, at start-up. + +// on 'Note' +void onNoteHandler(Note & n) { + //is it for me? + if (n.id == MY_GROUP_ID || n.id == MY_ID) { + // + screen_cmd = n.to_string(); + screen_cmd_notify_task.restart(); + // + if (n.velocity != 0 || n.onoff == 2) { + audio.setVolume(n.velocity * 21 / 127.0); // 0...127 ==> 0...21 + } + // + if (n.onoff == 1) { + // filter out re-triggering same note while it is playing. + if (!audio.isRunning() || radio_now != n.pitch) { + radio_now = n.pitch; + radio_player_start_task.restartDelayed(10); + } + } else if (n.onoff == 0) { + radio_now = n.pitch; + radio_player_stop_task.restartDelayed(10); + } + // + } +} + +// on 'receive' +void onDataReceive(const esp_now_recv_info_t * esp_now_info, const uint8_t *incomingData, int len) { + + // + // Serial.write(incomingData, len); + + // open => identify => use. + if (incomingData[0] == '{' && incomingData[len - 1] == '}' && len == (sizeof(Hello) + 2)) { + Hello hello(""); + memcpy((uint8_t *) &hello, incomingData + 1, sizeof(Hello)); + // + Serial.println(hello.to_string()); + } + + // open => identify => use. + if (incomingData[0] == '[' && incomingData[len - 1] == ']' && len == (sizeof(Note) + 2)) { + Note note; + memcpy((uint8_t *) ¬e, incomingData + 1, sizeof(Note)); + onNoteHandler(note); + // + Serial.println(note.to_string()); + } +} + +// on 'sent' +void onDataSent(const uint8_t *mac_addr, esp_now_send_status_t sendStatus) { + char buff[256] = ""; + sprintf(buff, "Delivery failed! -> %02X:%02X:%02X:%02X:%02X:%02X", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); + if (sendStatus != 0) Serial.println(buff); +} + +// +void setup() { + + //led + pinMode(LED_PIN, OUTPUT); + + //serial + Serial.begin(115200); + delay(100); + + //screen + Wire.begin(MAKEPYTHON_ESP32_SDA, MAKEPYTHON_ESP32_SCL); + // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally + if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32 + Serial.println(F("SSD1306 allocation failed")); + for (;;) + ; // Don't proceed, loop forever + } + display.clearDisplay(); + + //audio(I2S) + // audio.setInBufferSize(2048); + audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT); + audio.setVolume(21); // 0...21 + // audio.setVolume(14.88); // 90 * 21 / 127 == 14.88 + + // audio.connecttoFS(SD, filename.c_str()); + + //info + Serial.println(); + Serial.println(); + Serial.println("\"hi, i m your postman.\""); + Serial.println("-"); + Serial.println("- my id: " + String(MY_ID) + ", gid: " + String(MY_GROUP_ID) + ", call me ==> \"" + String(MY_SIGN) + "\""); + Serial.println("- mac address: " + WiFi.macAddress() + ", channel: " + String(WIFI_CHANNEL)); + Serial.println("-"); + + //wifi - disable AP + WiFiMode_t node_type = WIFI_STA; + // WiFiMode_t node_type = WIFI_AP_STA; + WiFi.setTxPower(WIFI_POWER_MINUS_1dBm); // Set WiFi RF power output to lowest level + WiFi.mode(node_type); + + //wifi - establish connection + int line_step = 12; + int line = 0; + display.clearDisplay(); + display.setTextColor(SSD1306_WHITE); + display.setTextSize(1); + display.setCursor(0, line); + display.println("wifi connecting.."); + line += line_step; + display.setCursor(0, line); + display.println(WIFI_SSID); + line += line_step; + display.setCursor(0, line); + display.println(WIFI_PASSWD); + display.display(); + delay(1000); + WiFi.begin(WIFI_SSID, WIFI_PASSWD); + while (!WiFi.isConnected()) { + delay(10); + } + display.clearDisplay(); + display.setCursor(0, 0); + display.println("wifi connected!"); + display.display(); + delay(1000); + // + screen_task.restart(); + + //esp-now + if (esp_now_init() != 0) { + Serial.println("Error initializing ESP-NOW"); + return; + } + esp_now_register_send_cb(onDataSent); + esp_now_register_recv_cb(onDataReceive); + + // + Serial.println("- ! (esp_now_add_peer) ==> add a 'broadcast peer' (FF:FF:FF:FF:FF:FF)."); + uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_peer_info_t peerInfo = {}; + memcpy(peerInfo.peer_addr, broadcastmac, 6); + peerInfo.channel = 0; + peerInfo.encrypt = false; + esp_now_add_peer(&peerInfo); + + Serial.println("-"); + Serial.println("\".-.-.-. :)\""); + Serial.println(); +} + +void loop() { + // + audio.loop(); + // + runner.execute(); + // +} diff --git a/faa_radioooo/message.h b/faa_radioooo/message.h new file mode 100644 index 0000000..8e2b9ab --- /dev/null +++ b/faa_radioooo/message.h @@ -0,0 +1,111 @@ +#pragma once + +//message type Note : '[' + Note + ']' +struct Note { + // + int32_t id; + float pitch; + float velocity; + float onoff; + float x1; + float x2; + float x3; + float x4; + float ps; + // + Note() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + Note(int32_t id_, float pitch_, float velocity_, float onoff_, float x1_, float x2_, float x3_, float x4_, float ps_) + { + id = id_; + pitch = pitch_; + velocity = velocity_; + onoff = onoff_; + x1 = x1_; + x2 = x2_; + x3 = x3_; + x4 = x4_; + ps = ps_; + } + // + void clear() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", pitch=" + String(pitch); + str += ", velocity=" + String(velocity); + str += ", onoff=" + String(onoff); + str += ", x1=" + String(x1); + str += ", x2=" + String(x2); + str += ", x3=" + String(x3); + str += ", x4=" + String(x4); + str += ", ps=" + String(ps); + str += " )"; + return str; + } +}; + +//message type Hello : '{' + Hello + '}' +#define SIGNATURE_LENGTH (20) +#define SIGNATURE_BUFF_LEN (SIGNATURE_LENGTH + 1) +struct Hello { + char sign[SIGNATURE_BUFF_LEN]; + int32_t id; + uint32_t mac32; + float h1; + float h2; + float h3; + float h4; + // + Hello(String sign_, int32_t id_ = 0, uint32_t mac32_ = 0, float h1_ = 0, float h2_ = 0, float h3_ = 0, float h4_ = 0) { + id = id_; + mac32 = mac32_; + h1 = h1_; + h2 = h2_; + h3 = h3_; + h4 = h4_; + sign_.toCharArray(sign, SIGNATURE_BUFF_LEN); + } + void clear() { + id = 0; + mac32 = 0; + h1 = 0; + h2 = 0; + h3 = 0; + h4 = 0; + sign[0] = '\0'; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", mac32=0x" + String(mac32, HEX); + str += ", sign=\"" + String(sign) + "\""; + str += ", h1=" + String(h1); + str += ", h2=" + String(h2); + str += ", h3=" + String(h3); + str += ", h4=" + String(h4); + str += " )"; + return str; + } +}; diff --git a/faa_radioooo/sketch.yaml b/faa_radioooo/sketch.yaml new file mode 100644 index 0000000..ef1898f --- /dev/null +++ b/faa_radioooo/sketch.yaml @@ -0,0 +1,2 @@ +default_fqbn: esp32:esp32:esp32:JTAGAdapter=default,PSRAM=enabled,PartitionScheme=huge_app,CPUFreq=240,FlashMode=qio,FlashFreq=80,FlashSize=4M,UploadSpeed=921600,LoopCore=1,EventsCore=1,DebugLevel=none,EraseFlash=none,ZigbeeMode=default +default_port: /dev/ttyUSB0 diff --git a/faa_roll8/faa_roll8.ino b/faa_roll8/faa_roll8.ino new file mode 100644 index 0000000..7553390 --- /dev/null +++ b/faa_roll8/faa_roll8.ino @@ -0,0 +1,393 @@ +// +// wirelessly connected cloud (based on a LPWAN, called ESP-NOW) +// + +// +// puredata gathering @ ururu.cloud, Seoul +// + +// +// 2024 02 17 +// +// this module will be an esp-now node in a group. +// like, a bird in a group of birds. +// +// esp-now @ esp8266 w/ broadcast address (FF:FF:FF:FF:FF:FF) +// always broadcasting. everyone is 'talkative'. +// + +//======================== +#define MY_GROUP_ID (8888) +#define MY_ID (MY_GROUP_ID + 1) +#define MY_SIGN ("ROLL8") +//======================== + +//======================== +#define WIFI_CHANNEL 1 +//======================= + +//arduino +#include + +//message types +#include "message.h" + +//espnow +#include +#include + +//task +#include +Scheduler runner; + +//-*-*-*-*-*-*-*-*-*-*-*-*- +// my tasks +#define MOTOR_1A (D1) +#define MOTOR_1B (D2) +int speed = 0; +bool isactive = false; +void set_speed() { + int r = speed; + // + if (r >= 0) { + digitalWrite(MOTOR_1A, LOW); + analogWrite(MOTOR_1B, r); + } else { + digitalWrite(MOTOR_1B, LOW); + analogWrite(MOTOR_1A, r*(-1)); + } + Serial.print("set_speed:"); + Serial.println(r); + isactive = true; +} +Task set_speed_task(0, TASK_ONCE, &set_speed, &runner, false); +// +void rest() { + analogWrite(MOTOR_1A, LOW); + analogWrite(MOTOR_1B, LOW); + isactive = false; +} +Task rest_task(0, TASK_ONCE, &rest, &runner, false); +// +uint8_t watch_counter = 0; +void watcher() { + if (isactive) { + if (watch_counter > 3) { + rest_task.restartDelayed(10); + watch_counter = 0; + } else { + watch_counter++; + } + } +} +Task watcher_task(1000, TASK_FOREVER, &watcher, &runner, true); +// +#define MOTOR_2A (D3) +#define MOTOR_2B (D4) +// my tasks +int speed2 = 0; +bool isactive2 = false; +void set_speed2() { + int r = speed2; + // + if (r >= 0) { + digitalWrite(MOTOR_2A, LOW); + analogWrite(MOTOR_2B, r); + } else { + digitalWrite(MOTOR_2B, LOW); + analogWrite(MOTOR_2A, r*(-1)); + } + Serial.print("set_speed2:"); + Serial.println(r); + isactive2 = true; +} +Task set_speed2_task(0, TASK_ONCE, &set_speed2, &runner, false); +// +void rest2() { + analogWrite(MOTOR_2A, LOW); + analogWrite(MOTOR_2B, LOW); + isactive2 = false; +} +Task rest2_task(0, TASK_ONCE, &rest2, &runner, false); +// +uint8_t watch2_counter = 0; +void watcher2() { + if (isactive2) { + if (watch2_counter > 3) { + rest2_task.restartDelayed(10); + watch2_counter = 0; + } else { + watch2_counter++; + } + } +} +Task watcher2_task(1000, TASK_FOREVER, &watcher2, &runner, true); +// +#define MOTOR2_1A (D5) +#define MOTOR2_1B (D6) +// my tasks +int speed3 = 0; +bool isactive3 = false; +void set_speed3() { + int r = speed3; + // + if (r >= 0) { + digitalWrite(MOTOR2_1A, LOW); + analogWrite(MOTOR2_1B, r); + } else { + digitalWrite(MOTOR2_1B, LOW); + analogWrite(MOTOR2_1A, r*(-1)); + } + Serial.print("set_speed3:"); + Serial.println(r); + isactive3 = true; +} +Task set_speed3_task(0, TASK_ONCE, &set_speed3, &runner, false); +// +void rest3() { + analogWrite(MOTOR2_1A, LOW); + analogWrite(MOTOR2_1B, LOW); + isactive3 = false; +} +Task rest3_task(0, TASK_ONCE, &rest3, &runner, false); +// +uint8_t watch3_counter = 0; +void watcher3() { + if (isactive3) { + if (watch3_counter > 3) { + rest3_task.restartDelayed(10); + watch3_counter = 0; + } else { + watch3_counter++; + } + } +} +Task watcher3_task(1000, TASK_FOREVER, &watcher3, &runner, true); +// +#define MOTOR2_2A (D7) +#define MOTOR2_2B (D8) +// my tasks +int speed4 = 0; +bool isactive4 = false; +void set_speed4() { + int r = speed4; + // + if (r >= 0) { + digitalWrite(MOTOR2_2A, LOW); + analogWrite(MOTOR2_2B, r); + } else { + digitalWrite(MOTOR2_2B, LOW); + analogWrite(MOTOR2_2A, r*(-1)); + } + Serial.print("set_speed4:"); + Serial.println(r); + isactive4 = true; +} +Task set_speed4_task(0, TASK_ONCE, &set_speed4, &runner, false); +// +void rest4() { + analogWrite(MOTOR2_2A, LOW); + analogWrite(MOTOR2_2B, LOW); + isactive4 = false; +} +Task rest4_task(0, TASK_ONCE, &rest4, &runner, false); +// +uint8_t watch4_counter = 0; +void watcher4() { + if (isactive4) { + if (watch4_counter > 3) { + rest4_task.restartDelayed(10); + watch4_counter = 0; + } else { + watch4_counter++; + } + } +} +Task watcher4_task(1000, TASK_FOREVER, &watcher4, &runner, true); +//*-*-*-*-*-*-*-*-*-*-*-*-* + +//task #0 : blink led +#define LED_PERIOD (11111) +#define LED_ONTIME (1) +#define LED_GAPTIME (222) +#define LED_PIN 2 +extern Task blink_task; +void blink() { + // + static int count = 0; + count++; + // + switch (count % 4) { + case 0: + digitalWrite(LED_PIN, LOW); // first ON + blink_task.delay(LED_ONTIME); + break; + case 1: + digitalWrite(LED_PIN, HIGH); // first OFF + blink_task.delay(LED_GAPTIME); + break; + case 2: + digitalWrite(LED_PIN, LOW); // second ON + blink_task.delay(LED_ONTIME); + break; + case 3: + digitalWrite(LED_PIN, HIGH); // second OFF + blink_task.delay(LED_PERIOD - 2* LED_ONTIME - LED_GAPTIME); + break; + } +} +Task blink_task(0, TASK_FOREVER, &blink, &runner, false); // -> ENABLED, at start-up. // NEVER use this.. since pin D4 is in USE. + +// on 'Note' +void onNoteHandler(Note & n) { + //is it for me? + if (n.id == MY_GROUP_ID || n.id == MY_ID) { + // + if (n.pitch == 0) { + speed = n.velocity; + // + if (n.onoff == 1) { + set_speed_task.restartDelayed(10); + watch_counter = 0; + } else if (n.onoff == 0) { + rest_task.restartDelayed(10); + } else if (n.onoff == 2) { + set_speed_task.restartDelayed(10); + rest_task.restartDelayed(10 + n.x1); + } + } + // + else if (n.pitch == 1) { + speed2 = n.velocity; + // + if (n.onoff == 1) { + set_speed2_task.restartDelayed(10); + watch2_counter = 0; + } else if (n.onoff == 0) { + rest2_task.restartDelayed(10); + } else if (n.onoff == 2) { + set_speed2_task.restartDelayed(10); + rest2_task.restartDelayed(10 + n.x1); + } + } + // + else if (n.pitch == 2) { + speed3 = n.velocity; + // + if (n.onoff == 1) { + set_speed3_task.restartDelayed(10); + watch3_counter = 0; + } else if (n.onoff == 0) { + rest3_task.restartDelayed(10); + } else if (n.onoff == 2) { + set_speed3_task.restartDelayed(10); + rest3_task.restartDelayed(10 + n.x1); + } + } + // + else if (n.pitch == 3) { + speed4 = n.velocity; + // + if (n.onoff == 1) { + set_speed4_task.restartDelayed(10); + watch4_counter = 0; + } else if (n.onoff == 0) { + rest4_task.restartDelayed(10); + } else if (n.onoff == 2) { + set_speed4_task.restartDelayed(10); + rest4_task.restartDelayed(10 + n.x1); + } + } + // + } +} + +// on 'receive' +void onDataReceive(uint8_t * mac, uint8_t *incomingData, uint8_t len) { + + // + Serial.write(incomingData, len); + + // open => identify => use. + if (incomingData[0] == '{' && incomingData[len - 1] == '}' && len == (sizeof(Hello) + 2)) { + Hello hello(""); + memcpy((uint8_t *) &hello, incomingData + 1, sizeof(Hello)); + // + Serial.println(hello.to_string()); + } + + // open => identify => use. + if (incomingData[0] == '[' && incomingData[len - 1] == ']' && len == (sizeof(Note) + 2)) { + Note note; + memcpy((uint8_t *) ¬e, incomingData + 1, sizeof(Note)); + onNoteHandler(note); + // + Serial.println(note.to_string()); + } +} + +// on 'sent' +void onDataSent(uint8_t *mac, uint8_t sendStatus) { + char buff[256] = ""; + sprintf(buff, "Delivery failed! -> %02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + if (sendStatus != 0) Serial.println(buff); +} + +// +void setup() { + + //led + // pinMode(LED_PIN, OUTPUT); + // pin D4 is in USE for controller. + + //pwm freq. + analogWriteFreq(40000); + + //serial + Serial.begin(115200); + delay(100); + + //info + Serial.println(); + Serial.println(); + Serial.println("\"hi, i m your postman.\""); + Serial.println("-"); + Serial.println("- my id: " + String(MY_ID) + ", gid: " + String(MY_GROUP_ID) + ", call me ==> \"" + String(MY_SIGN) + "\""); + Serial.println("- mac address: " + WiFi.macAddress() + ", channel: " + String(WIFI_CHANNEL)); + Serial.println("-"); + + //wifi - disabled + system_phy_set_max_tpw(0); + WiFiMode_t node_type = WIFI_STA; + WiFi.mode(node_type); + + //esp-now + if (esp_now_init() != 0) { + Serial.println("Error initializing ESP-NOW"); + return; + } + esp_now_set_self_role(ESP_NOW_ROLE_COMBO); + esp_now_register_send_cb(onDataSent); + esp_now_register_recv_cb(onDataReceive); + // + Serial.println("- ! (esp_now_add_peer) ==> add a 'broadcast peer' (FF:FF:FF:FF:FF:FF)."); + uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_add_peer(broadcastmac, ESP_NOW_ROLE_COMBO, 1, NULL, 0); + + Serial.println("-"); + Serial.println("\".-.-.-. :)\""); + Serial.println(); + + //random seed + randomSeed(analogRead(0)); + + //tasks + rest_task.restartDelayed(500); + rest2_task.restartDelayed(500); +} + +void loop() { + // + runner.execute(); + // +} diff --git a/faa_roll8/message.h b/faa_roll8/message.h new file mode 100644 index 0000000..8e2b9ab --- /dev/null +++ b/faa_roll8/message.h @@ -0,0 +1,111 @@ +#pragma once + +//message type Note : '[' + Note + ']' +struct Note { + // + int32_t id; + float pitch; + float velocity; + float onoff; + float x1; + float x2; + float x3; + float x4; + float ps; + // + Note() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + Note(int32_t id_, float pitch_, float velocity_, float onoff_, float x1_, float x2_, float x3_, float x4_, float ps_) + { + id = id_; + pitch = pitch_; + velocity = velocity_; + onoff = onoff_; + x1 = x1_; + x2 = x2_; + x3 = x3_; + x4 = x4_; + ps = ps_; + } + // + void clear() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", pitch=" + String(pitch); + str += ", velocity=" + String(velocity); + str += ", onoff=" + String(onoff); + str += ", x1=" + String(x1); + str += ", x2=" + String(x2); + str += ", x3=" + String(x3); + str += ", x4=" + String(x4); + str += ", ps=" + String(ps); + str += " )"; + return str; + } +}; + +//message type Hello : '{' + Hello + '}' +#define SIGNATURE_LENGTH (20) +#define SIGNATURE_BUFF_LEN (SIGNATURE_LENGTH + 1) +struct Hello { + char sign[SIGNATURE_BUFF_LEN]; + int32_t id; + uint32_t mac32; + float h1; + float h2; + float h3; + float h4; + // + Hello(String sign_, int32_t id_ = 0, uint32_t mac32_ = 0, float h1_ = 0, float h2_ = 0, float h3_ = 0, float h4_ = 0) { + id = id_; + mac32 = mac32_; + h1 = h1_; + h2 = h2_; + h3 = h3_; + h4 = h4_; + sign_.toCharArray(sign, SIGNATURE_BUFF_LEN); + } + void clear() { + id = 0; + mac32 = 0; + h1 = 0; + h2 = 0; + h3 = 0; + h4 = 0; + sign[0] = '\0'; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", mac32=0x" + String(mac32, HEX); + str += ", sign=\"" + String(sign) + "\""; + str += ", h1=" + String(h1); + str += ", h2=" + String(h2); + str += ", h3=" + String(h3); + str += ", h4=" + String(h4); + str += " )"; + return str; + } +}; diff --git a/faa_roll8/sketch.yaml b/faa_roll8/sketch.yaml new file mode 100644 index 0000000..ee52428 --- /dev/null +++ b/faa_roll8/sketch.yaml @@ -0,0 +1,2 @@ +default_fqbn: esp8266:esp8266:nodemcuv2:baud=460800 +default_port: /dev/tty.SLAB_USBtoUART diff --git a/faa_roller/faa_roller.ino b/faa_roller/faa_roller.ino index c792068..a0db844 100644 --- a/faa_roller/faa_roller.ino +++ b/faa_roller/faa_roller.ino @@ -17,8 +17,8 @@ // //======================== -#define MY_GROUP_ID (4000) -#define MY_ID (MY_GROUP_ID + 1) +#define MY_GROUP_ID (8888) +#define MY_ID (MY_GROUP_ID + 2) #define MY_SIGN ("ROLLER2") //======================== diff --git a/faa_saekki/faa_saekki.ino b/faa_saekki/faa_saekki.ino new file mode 100644 index 0000000..6fd9e12 --- /dev/null +++ b/faa_saekki/faa_saekki.ino @@ -0,0 +1,304 @@ +// +// wirelessly connected cloud or crowd +// over WIFI over Internet over Mountains +// across Rivers and into the Universe +// + +// +// tailored for "Saekki-Chigi4" +// 2026 04 13 - Seoul +// + +// +// NOTES +// +// taskscheduler 기반으로 cnmat/osc/udp 로 esp8266에서 led를 on/off 하는 sub장치를 만드는데.. taskscheduler는 우선 필요없지만.. .. ? 그렇네.. + wifimanager를 넣어주고.. arduinoota도 기본으로 넣어주고.. taskscheduler는.. 그러니까... 모터 움직임 패턴을 읽어서.. 그대로 모터를 한번 돌려주는 걸로하고... 읽는 시간 rate 일정한 값 + 패턴 값 저장하는 어레이 2개.. 모터 2개 드라이브. roller2.. +// +// 1 taskschduler + array + roller2 기반.. reset되면 몇 초 후에.. 패턴 1을 재생하도록. +// 2 여기에 osc_udp 추가해서.. 외부에서, 패턴을 실행시킬 수 있도록. (pd로 osc로 전송) +// 3 pd에서 패턴값과.. 기본 파라미터를 조정하는 메세지 주기.. (+ 패턴값 체크하는 기능도 있으면 좋음...) +// +// -- 우선은 여기까지 하면, 갈수 있을지도 -- +// +// 4 여기에 wifimanager를 더해서.. 외부에서, 와이파이 설정도 하고, 상태 업데이트 할 수 있도록. (근데 이걸 위해서, 특수한 버튼 눌러야 한다면 flash버튼을 이용해 보던가.) +// 5 이 모듈이 접속할 웹 공간 준비. 도메인 + 서비스. 그곳에 world energy 패치 준비.. (pd 여도 좋음.) - 아니면, 웹페이지여도 좋음. / 여기서 WE가 취합되고, 평균되고, 발표됨. 각 모듈은 이 값을 읽어감. (여기까지가 기존의 셋업 -> 인터넷으로 옮겨간 상태임.) +// + +//arduino +#include + +//osc over UDP +#include +#include +#include +#include +#include +// +WiFiUDP Udp; +// +const IPAddress outIp(192,168,88,100); +const unsigned int outPort = 9999; +const unsigned int localPort = 8888; +OSCErrorCode error; +//// +unsigned int ledState = LOW; +//// +char ssid[] = "nosignal 2G"; +char pass[] = "1111100000"; + +//task +#include +Scheduler runner; + +//-*-*-*-*-*-*-*-*-*-*-*-*- +// servo +#define MOTOR_1A (D6) +#define MOTOR_1B (D5) +int speed = 0; +void set_speed() { + int r = speed; + // + if (r >= 0) { + digitalWrite(MOTOR_1A, LOW); + analogWrite(MOTOR_1B, r); + } else { + digitalWrite(MOTOR_1B, LOW); + analogWrite(MOTOR_1A, r*(-1)); + } + Serial.print("set_speed:"); + Serial.println(r); +} +Task set_speed_task(0, TASK_ONCE, &set_speed, &runner, false); +// +void rest() { + analogWrite(MOTOR_1A, LOW); + analogWrite(MOTOR_1B, LOW); +} +Task rest_task(0, TASK_ONCE, &rest, &runner, false); +// +#define MOTOR_2A (D3) +#define MOTOR_2B (D2) +int speed2 = 0; +void set_speed2() { + int r = speed2; + // + if (r >= 0) { + digitalWrite(MOTOR_2A, LOW); + analogWrite(MOTOR_2B, r); + } else { + digitalWrite(MOTOR_2B, LOW); + analogWrite(MOTOR_2A, r*(-1)); + } + Serial.print("set_speed2:"); + Serial.println(r); +} +Task set_speed2_task(0, TASK_ONCE, &set_speed2, &runner, false); +// +void rest2() { + analogWrite(MOTOR_2A, LOW); + analogWrite(MOTOR_2B, LOW); +} +Task rest2_task(0, TASK_ONCE, &rest2, &runner, false); + +//expressions +std::vector yellowA1 = {0.266667,0.285714,0.295238,0.32381,0.352381,0.371429,0.409525, + 0.2,0.228572,0.257143,0.276191,0.285715,0.314286,0.32381,0.352382,0.37143, + 0.390477,0.238095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.171429,0.209524,0.257143, + 0.276191,0.304763,0.333334,0.342858,-0.00952393,-0.00952393,-0.00952393, + -0.00952393,-0.00952393,-0.00952393,-0.00952393,-0.00952393,-0.00952393, + -0.00952393,-0.00952393}; //50 + +std::vector yellowA2 = {0.0380987,0.0380987,0.0380987,0.0476224,0.0571462,0.0571462,0.0666699, + 0.0761937,0.0952412,0.104765,0.123813,0.133337,0.161908,0.171432,0.200003, + 0.238098,0.26667,0.304765,0.34286,0.371431,0.409526,0.523809,0.590475, + 0.70476,0.809524,0.885714,0.666667,0.609525,0.552382,0.485716,0.428574, + 0.390479,0.34286,0.314289,0.276194,0.26667,0.228575,0.209527,0.180956, + 0.161909,0.152385,0.133337,0.123814,0.11429,0.11429,0.104766,0.0952425, + 0.076195,0.076195,0.0761944}; //50 + +std::vector yellowA3 = {0.885716,0.800003,0.685719,0.619054,-0.0190476,-0.0190476,-0.0190476, + 0.92381,0.914286,0.857145,0.800003,0.733337,0.685719,-0.0285714,-0.0285714, + -0.0285714,0.904762,0.866668,0.809526,0.771431,0.71429,0.666672,0.666672, + -0.0285714,-0.0285714,-0.0285714,0.914287,0.866669,0.771432,0.733338}; //30 + +std::vector yellowA4 = {0.580952,0.580952,0.580952,0.571429,0.571429,0.571429,0.571429, + 0.571429,0.561905,0.561905,0.561905,0.561905,0.561905,0.561905,0.561905, + 0.561905,0.561905,0.561905,0.561905,0.561905,0.561905,0.561905,0.561905, + 0.561905,0.561905,0.561905,0.561905,0.561905,0.561905,0.561905}; //30 + +std::vector yellowB1 = {0.685715,0.723811,0.800002,0.485714,0.519047,0.552381,0.580953, + 0.609524,0.626191,0.642858,0.659525,0.676191,0.685715,0.399999,0.495238, + 0.533333,0.571429,0.604762,0.638096,0.653969,0.669842,0.685715,0.695239, + 0.704763,0.561905,0.666667,0.704763,0.714287,0.266665,0.323808,0.35238, + 0.366666,0.380951,0.399999,0.423809,0.933336,0.952384,0.957145,0.961907, + 0.609524,0.628572,0.47619,0.523809,0.523809,0.523809,0.438095,0.457142, + 0.457142,0,0.361904}; //50 + +std::vector yellowB2 = {0.0380952,0.0380952,0.0380952,0.047619,0.047619,0.0571427,0.0761902, + 0.0952377,0.0952377,0.114285,0.142856,0.161904,0.180951,0.219046,0.247618, + 0.266665,0.276189,0.30476,0.333331,0.371426,0.419045,0.476188,0.542854, + 0.67619,0.761905,0.638095,0.542857,0.447616,0.409521,0.352379,0.333331, + 0.30476,0.266665,0.247618,0.199999,0.180951,0.161904,0.133333,0.114285, + 0.104761,0.085714,0.0761902,0.0666665,0.0666665,0.0571427,0.047619, + 0.047619,0.047619,0.0380952,0.0190477}; //50 + +std::vector yellowB3 = {0.742857,0.580951,0.466664,0.352378,0.276187,0.223806,0.885714, + 0.552379,0.409521,0.352378,0.257139,0.20952,0.123805,0.0857093,0.914286, + 0.599998,0.523807,0.447616,0.390473,0.323806,0.257139,0.20952,0.133329, + 0.971429,0.723808,0.647618,0.561903,0.485712,0.371425,0.323806}; //30 + +std::vector yellowB4 = {0.819048,0.819048,0.819048,0.819048,0.819048,0.819048,0.819048, + 0.819048,0.819048,0.828571,0.828571,0.828571,0.838095,0.838095,0.847619, + 0.847619,0.857143,0.857143,0.857143,0.857143,0.866666,0.866666,0.866666, + 0.866666,0.866666,0.866666,0.857143,0.847619,0.838095,0.809524}; //30 + +//*-*-*-*-*-*-*-*-*-*-*-*-* + +//task #0 : blink led +#define LED_PERIOD (11111) +#define LED_ONTIME (1) +#define LED_GAPTIME (222) +#define LED_PIN 2 +extern Task blink_task; +void blink() { + // + static int count = 0; + count++; + // + switch (count % 4) { + case 0: + digitalWrite(LED_PIN, LOW); // first ON + blink_task.delay(LED_ONTIME); + break; + case 1: + digitalWrite(LED_PIN, HIGH); // first OFF + blink_task.delay(LED_GAPTIME); + break; + case 2: + digitalWrite(LED_PIN, LOW); // second ON + blink_task.delay(LED_ONTIME); + break; + case 3: + digitalWrite(LED_PIN, HIGH); // second OFF + blink_task.delay(LED_PERIOD - 2* LED_ONTIME - LED_GAPTIME); + break; + } +} +Task blink_task(0, TASK_FOREVER, &blink, &runner, true); // -> ENABLED, at start-up. +//task #1 : osc processing +void route_note(OSCMessage& msg, int offset) { + //swap_println("got route_note!"); + // (1) --> /onoff + if (msg.fullMatch("/onoff", offset)) { + // + note.clear(); + // + note.onoff = msg.getFloat(0); + // if (note.onoff != 0) note.onoff = 1; + } + // (2) --> /velocity + if (msg.fullMatch("/velocity", offset)) { + note.velocity = msg.getFloat(0); + } + // (3) --> /pitch + if (msg.fullMatch("/pitch", offset)) { + note.pitch = msg.getFloat(0); + } + // (4) --> /id + if (msg.fullMatch("/id", offset)) { + note.id = msg.getInt(0); + } + // (5) --> /x + if (msg.fullMatch("/x", offset)) { + note.x1 = msg.getFloat(0); + note.x2 = msg.getFloat(1); + note.x3 = msg.getFloat(2); + note.x4 = msg.getFloat(3); + note.ps = msg.getFloat(4); + } +} +extern Task osc_task; +void osc() +{ + //osc + OSCBundle bundleIN; + int size; + if (SLIPSerial.available()) { + while(!SLIPSerial.endofPacket()) { + if( (size = SLIPSerial.available()) > 0) { + while(size--) { + bundleIN.fill(SLIPSerial.read()); + } + } + } + if(!bundleIN.hasError()) { + // on '/note' + bundleIN.route("/note", route_note); +#if defined(ESP32) + static int a = 0; + screen_text = String(a) + " => \n" + String(bundleIN.timetag.seconds-2208988800UL) + "\n" + String(bundleIN.timetag.fractionofseconds); + a++; +#endif + } + } +} +Task osc_task(0, TASK_FOREVER, &osc, &runner, true); // -> ENABLED, at start-up. + + +// +void setup() { + + //led + pinMode(LED_PIN, OUTPUT); + + //pwm freq. + analogWriteFreq(40000); + + //serial + Serial.begin(115200); + delay(100); + + //info + Serial.println(); + Serial.println(); + Serial.println("\"hi, i m your postman.\""); + Serial.println("-"); + Serial.println("- my id: " + String(MY_ID) + ", gid: " + String(MY_GROUP_ID) + ", call me ==> \"" + String(MY_SIGN) + "\""); + Serial.println("- mac address: " + WiFi.macAddress() + ", channel: " + String(WIFI_CHANNEL)); + Serial.println("-"); + + //wifi - disabled + system_phy_set_max_tpw(0); + WiFiMode_t node_type = WIFI_STA; + WiFi.mode(node_type); + + //esp-now + if (esp_now_init() != 0) { + Serial.println("Error initializing ESP-NOW"); + return; + } + esp_now_set_self_role(ESP_NOW_ROLE_COMBO); + esp_now_register_send_cb(onDataSent); + esp_now_register_recv_cb(onDataReceive); + // + Serial.println("- ! (esp_now_add_peer) ==> add a 'broadcast peer' (FF:FF:FF:FF:FF:FF)."); + uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_add_peer(broadcastmac, ESP_NOW_ROLE_COMBO, 1, NULL, 0); + + Serial.println("-"); + Serial.println("\".-.-.-. :)\""); + Serial.println(); + + //random seed + randomSeed(analogRead(0)); + + //tasks + rest_task.restartDelayed(500); + rest2_task.restartDelayed(500); +} + +void loop() { + // + runner.execute(); + // +} diff --git a/faa_saekki/message.h b/faa_saekki/message.h new file mode 100644 index 0000000..8e2b9ab --- /dev/null +++ b/faa_saekki/message.h @@ -0,0 +1,111 @@ +#pragma once + +//message type Note : '[' + Note + ']' +struct Note { + // + int32_t id; + float pitch; + float velocity; + float onoff; + float x1; + float x2; + float x3; + float x4; + float ps; + // + Note() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + Note(int32_t id_, float pitch_, float velocity_, float onoff_, float x1_, float x2_, float x3_, float x4_, float ps_) + { + id = id_; + pitch = pitch_; + velocity = velocity_; + onoff = onoff_; + x1 = x1_; + x2 = x2_; + x3 = x3_; + x4 = x4_; + ps = ps_; + } + // + void clear() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", pitch=" + String(pitch); + str += ", velocity=" + String(velocity); + str += ", onoff=" + String(onoff); + str += ", x1=" + String(x1); + str += ", x2=" + String(x2); + str += ", x3=" + String(x3); + str += ", x4=" + String(x4); + str += ", ps=" + String(ps); + str += " )"; + return str; + } +}; + +//message type Hello : '{' + Hello + '}' +#define SIGNATURE_LENGTH (20) +#define SIGNATURE_BUFF_LEN (SIGNATURE_LENGTH + 1) +struct Hello { + char sign[SIGNATURE_BUFF_LEN]; + int32_t id; + uint32_t mac32; + float h1; + float h2; + float h3; + float h4; + // + Hello(String sign_, int32_t id_ = 0, uint32_t mac32_ = 0, float h1_ = 0, float h2_ = 0, float h3_ = 0, float h4_ = 0) { + id = id_; + mac32 = mac32_; + h1 = h1_; + h2 = h2_; + h3 = h3_; + h4 = h4_; + sign_.toCharArray(sign, SIGNATURE_BUFF_LEN); + } + void clear() { + id = 0; + mac32 = 0; + h1 = 0; + h2 = 0; + h3 = 0; + h4 = 0; + sign[0] = '\0'; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", mac32=0x" + String(mac32, HEX); + str += ", sign=\"" + String(sign) + "\""; + str += ", h1=" + String(h1); + str += ", h2=" + String(h2); + str += ", h3=" + String(h3); + str += ", h4=" + String(h4); + str += " )"; + return str; + } +}; diff --git a/faa_saekki/sketch.yaml b/faa_saekki/sketch.yaml new file mode 100644 index 0000000..ee52428 --- /dev/null +++ b/faa_saekki/sketch.yaml @@ -0,0 +1,2 @@ +default_fqbn: esp8266:esp8266:nodemcuv2:baud=460800 +default_port: /dev/tty.SLAB_USBtoUART diff --git a/faa_servo/faa_servo.ino b/faa_servo/faa_servo.ino new file mode 100644 index 0000000..d2d6d7e --- /dev/null +++ b/faa_servo/faa_servo.ino @@ -0,0 +1,181 @@ +// +// wirelessly connected cloud (based on a LPWAN, called ESP-NOW) +// + +// +// puredata gathering @ ururu.cloud, Seoul +// + +// +// 2024 02 17 +// +// this module will be an esp-now node in a group. +// like, a bird in a group of birds. +// +// esp-now @ esp8266 w/ broadcast address (FF:FF:FF:FF:FF:FF) +// always broadcasting. everyone is 'talkative'. +// + +//======================== +#define MY_GROUP_ID (5000) +#define MY_ID (MY_GROUP_ID + 1) +#define MY_SIGN ("SERVO") +//======================== + +//======================== +#define WIFI_CHANNEL 1 +//======================= + +//arduino +#include + +//message types +#include "message.h" + +//espnow +#include +#include + +//task +#include +Scheduler runner; + +//-*-*-*-*-*-*-*-*-*-*-*-*- +// servo +#include +extern Task set_angle_task; +Servo myservo; +int angle = 0; +void set_angle() { + if (set_angle_task.isFirstIteration()) { + myservo.attach(2); + } + // + myservo.write(angle); +} +Task set_angle_task(0, TASK_ONCE, &set_angle, &runner, false); +// +//*-*-*-*-*-*-*-*-*-*-*-*-* + +//task #0 : blink led +#define LED_PERIOD (11111) +#define LED_ONTIME (1) +#define LED_GAPTIME (222) +#define LED_PIN 2 +extern Task blink_task; +void blink() { + // + static int count = 0; + count++; + // + switch (count % 4) { + case 0: + digitalWrite(LED_PIN, LOW); // first ON + blink_task.delay(LED_ONTIME); + break; + case 1: + digitalWrite(LED_PIN, HIGH); // first OFF + blink_task.delay(LED_GAPTIME); + break; + case 2: + digitalWrite(LED_PIN, LOW); // second ON + blink_task.delay(LED_ONTIME); + break; + case 3: + digitalWrite(LED_PIN, HIGH); // second OFF + blink_task.delay(LED_PERIOD - 2* LED_ONTIME - LED_GAPTIME); + break; + } +} +Task blink_task(0, TASK_FOREVER, &blink, &runner, true); // -> ENABLED, at start-up. + +// on 'Note' +void onNoteHandler(Note & n) { + //is it for me? + if (n.id == MY_GROUP_ID || n.id == MY_ID) { + angle = n.velocity; + set_angle_task.restartDelayed(10); + } +} + +// on 'receive' +void onDataReceive(uint8_t * mac, uint8_t *incomingData, uint8_t len) { + + // + Serial.write(incomingData, len); + + // open => identify => use. + if (incomingData[0] == '{' && incomingData[len - 1] == '}' && len == (sizeof(Hello) + 2)) { + Hello hello(""); + memcpy((uint8_t *) &hello, incomingData + 1, sizeof(Hello)); + // + Serial.println(hello.to_string()); + } + + // open => identify => use. + if (incomingData[0] == '[' && incomingData[len - 1] == ']' && len == (sizeof(Note) + 2)) { + Note note; + memcpy((uint8_t *) ¬e, incomingData + 1, sizeof(Note)); + onNoteHandler(note); + // + Serial.println(note.to_string()); + } +} + +// on 'sent' +void onDataSent(uint8_t *mac, uint8_t sendStatus) { + char buff[256] = ""; + sprintf(buff, "Delivery failed! -> %02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + if (sendStatus != 0) Serial.println(buff); +} + +// +void setup() { + + //led + pinMode(LED_PIN, OUTPUT); + + //serial + Serial.begin(115200); + delay(100); + + //info + Serial.println(); + Serial.println(); + Serial.println("\"hi, i m your postman.\""); + Serial.println("-"); + Serial.println("- my id: " + String(MY_ID) + ", gid: " + String(MY_GROUP_ID) + ", call me ==> \"" + String(MY_SIGN) + "\""); + Serial.println("- mac address: " + WiFi.macAddress() + ", channel: " + String(WIFI_CHANNEL)); + Serial.println("-"); + + //wifi - disabled + system_phy_set_max_tpw(0); + WiFiMode_t node_type = WIFI_STA; + WiFi.mode(node_type); + + //esp-now + if (esp_now_init() != 0) { + Serial.println("Error initializing ESP-NOW"); + return; + } + esp_now_set_self_role(ESP_NOW_ROLE_COMBO); + esp_now_register_send_cb(onDataSent); + esp_now_register_recv_cb(onDataReceive); + // + Serial.println("- ! (esp_now_add_peer) ==> add a 'broadcast peer' (FF:FF:FF:FF:FF:FF)."); + uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_add_peer(broadcastmac, ESP_NOW_ROLE_COMBO, 1, NULL, 0); + + Serial.println("-"); + Serial.println("\".-.-.-. :)\""); + Serial.println(); + + //random seed + randomSeed(analogRead(0)); +} + +void loop() { + // + runner.execute(); + // +} diff --git a/faa_servo/message.h b/faa_servo/message.h new file mode 100644 index 0000000..8e2b9ab --- /dev/null +++ b/faa_servo/message.h @@ -0,0 +1,111 @@ +#pragma once + +//message type Note : '[' + Note + ']' +struct Note { + // + int32_t id; + float pitch; + float velocity; + float onoff; + float x1; + float x2; + float x3; + float x4; + float ps; + // + Note() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + Note(int32_t id_, float pitch_, float velocity_, float onoff_, float x1_, float x2_, float x3_, float x4_, float ps_) + { + id = id_; + pitch = pitch_; + velocity = velocity_; + onoff = onoff_; + x1 = x1_; + x2 = x2_; + x3 = x3_; + x4 = x4_; + ps = ps_; + } + // + void clear() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", pitch=" + String(pitch); + str += ", velocity=" + String(velocity); + str += ", onoff=" + String(onoff); + str += ", x1=" + String(x1); + str += ", x2=" + String(x2); + str += ", x3=" + String(x3); + str += ", x4=" + String(x4); + str += ", ps=" + String(ps); + str += " )"; + return str; + } +}; + +//message type Hello : '{' + Hello + '}' +#define SIGNATURE_LENGTH (20) +#define SIGNATURE_BUFF_LEN (SIGNATURE_LENGTH + 1) +struct Hello { + char sign[SIGNATURE_BUFF_LEN]; + int32_t id; + uint32_t mac32; + float h1; + float h2; + float h3; + float h4; + // + Hello(String sign_, int32_t id_ = 0, uint32_t mac32_ = 0, float h1_ = 0, float h2_ = 0, float h3_ = 0, float h4_ = 0) { + id = id_; + mac32 = mac32_; + h1 = h1_; + h2 = h2_; + h3 = h3_; + h4 = h4_; + sign_.toCharArray(sign, SIGNATURE_BUFF_LEN); + } + void clear() { + id = 0; + mac32 = 0; + h1 = 0; + h2 = 0; + h3 = 0; + h4 = 0; + sign[0] = '\0'; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", mac32=0x" + String(mac32, HEX); + str += ", sign=\"" + String(sign) + "\""; + str += ", h1=" + String(h1); + str += ", h2=" + String(h2); + str += ", h3=" + String(h3); + str += ", h4=" + String(h4); + str += " )"; + return str; + } +}; diff --git a/faa_volume/faa_volume.ino b/faa_volume/faa_volume.ino index 30c9d5d..a8925a1 100644 --- a/faa_volume/faa_volume.ino +++ b/faa_volume/faa_volume.ino @@ -18,7 +18,7 @@ //======================== #define MY_GROUP_ID (6000) -#define MY_ID (MY_GROUP_ID + 3) +#define MY_ID (MY_GROUP_ID + 688) #define MY_SIGN ("VOLUME") //======================== diff --git a/faa_yellow/faa_yellow.ino b/faa_yellow/faa_yellow.ino new file mode 100644 index 0000000..0980a8e --- /dev/null +++ b/faa_yellow/faa_yellow.ino @@ -0,0 +1,392 @@ +// +// wirelessly connected cloud or crowd +// over WIFI over Internet over Mountains +// across Rivers and into the Universe +// + +// +// tailored for "Saekki-Chigi4" +// 2026 04 13 - Seoul +// + +// +// NOTES +// +// taskscheduler 기반으로 cnmat/osc/udp 로 esp8266에서 led를 on/off 하는 sub장치를 만드는데.. taskscheduler는 우선 필요없지만.. .. ? 그렇네.. + wifimanager를 넣어주고.. arduinoota도 기본으로 넣어주고.. taskscheduler는.. 그러니까... 모터 움직임 패턴을 읽어서.. 그대로 모터를 한번 돌려주는 걸로하고... 읽는 시간 rate 일정한 값 + 패턴 값 저장하는 어레이 2개.. 모터 2개 드라이브. roller2.. +// +// 1 taskschduler + array + roller2 기반.. reset되면 몇 초 후에.. 패턴 1을 재생하도록. -> DONE +// 2 여기에 osc_udp 추가해서.. 외부에서, 패턴을 실행시킬 수 있도록. (pd로 osc로 전송) +// 3 pd에서 패턴값과.. 기본 파라미터를 조정하는 메세지 주기.. (+ 패턴값 체크하는 기능도 있으면 좋음...) +// +// -- 우선은 여기까지 하면, 갈수 있을지도 -- +// +// 4 여기에 wifimanager를 더해서.. 외부에서, 와이파이 설정도 하고, 상태 업데이트 할 수 있도록. (근데 이걸 위해서, 특수한 버튼 눌러야 한다면 flash버튼을 이용해 보던가.) +// 5 이 모듈이 접속할 웹 공간 준비. 도메인 + 서비스. 그곳에 world energy 패치 준비.. (pd 여도 좋음.) - 아니면, 웹페이지여도 좋음. / 여기서 WE가 취합되고, 평균되고, 발표됨. 각 모듈은 이 값을 읽어감. (여기까지가 기존의 셋업 -> 인터넷으로 옮겨간 상태임.) +// + +// ** IDENTITY ** +#define MY_SPECIES ("YELLOW") +#define MY_NAME ("YELOWEE {a.k.a. yellow1}") + +//arduino +#include + +//osc over UDP +#include +#include +#include +#include +#include +// +WiFiUDP Udp; +// +const IPAddress outIp(192,168,88,100); +const unsigned int outPort = 9999; +const unsigned int localPort = 8888; +OSCErrorCode error; +//// +unsigned int ledState = LOW; +//// +char ssid[] = "nosignal 2G"; +char pass[] = "1111100000"; + +//task +#include +Scheduler runner; + +//-*-*-*-*-*-*-*-*-*-*-*-*- +// servo +#define MOTOR_1A (D6) +#define MOTOR_1B (D5) +int speed = 0; +bool isactive = false; +void set_speed() { + int r = speed; + // + if (r >= 0) { + digitalWrite(MOTOR_1A, LOW); + analogWrite(MOTOR_1B, r); + } else { + digitalWrite(MOTOR_1B, LOW); + analogWrite(MOTOR_1A, r*(-1)); + } + // Serial.print("set_speed:"); + // Serial.println(r); + isactive = true; +} +Task set_speed_task(0, TASK_ONCE, &set_speed, &runner, false); +// +void rest() { + analogWrite(MOTOR_1A, LOW); + analogWrite(MOTOR_1B, LOW); + isactive = false; +} +Task rest_task(0, TASK_ONCE, &rest, &runner, false); +// +#define MOTOR_2A (D3) +#define MOTOR_2B (D2) +int speed2 = 0; +void set_speed2() { + int r = speed2; + // + if (r >= 0) { + digitalWrite(MOTOR_2A, LOW); + analogWrite(MOTOR_2B, r); + } else { + digitalWrite(MOTOR_2B, LOW); + analogWrite(MOTOR_2A, r*(-1)); + } + // Serial.print("set_speed2:"); + // Serial.println(r); +} +Task set_speed2_task(0, TASK_ONCE, &set_speed2, &runner, false); +// +void rest2() { + analogWrite(MOTOR_2A, LOW); + analogWrite(MOTOR_2B, LOW); +} +Task rest2_task(0, TASK_ONCE, &rest2, &runner, false); +//*-*-*-*-*-*-*-*-*-*-*-*-* + +//*-*-*-*-*-*-*-*-*-*-*-*-* +//expressions +//riff_A +std::vector< std::vector > yellowA = { + {0.266667,0.285714,0.295238,0.32381,0.352381,0.371429,0.409525,0.2,0.228572,0.257143,0.276191,0.285715,0.314286,0.32381,0.352382,0.37143,0.390477,0.238095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.171429,0.209524,0.257143,0.276191,0.304763,0.333334,0.342858,-0.00952393,-0.00952393,-0.00952393,-0.00952393,-0.00952393,-0.00952393,-0.00952393,-0.00952393,-0.00952393,-0.00952393,-0.00952393}, + //50 + + {0.704762,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.733333,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.704762,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.695238,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.714286,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.0190475,0.704762,0.0190475}, + //50 + + {-0.00952327,0.771429,-0.00952327,-0.00952327,-0.00952327,-0.00952327,-0.00952327,-0.00952327,-0.00952327,-0.00952327,-0.00952327,-0.00952327,-0.00952327,0.771429,-0.00952327,-0.00952327,-0.00952327,1.78814e-07,1.78814e-07,1.78814e-07,1.78814e-07,1.78814e-07,1.78814e-07,1.78814e-07,1.78814e-07,1.78814e-07,0.780952,1.78814e-07,1.78814e-07,1.78814e-07,1.78814e-07,0,0,0,0,0,0,0,0,0,0,0,0,0.8,0,0,0,0,0,0,0,0,0,0,0,0,0,0.8,0,0,0,0,0,0,0,0,0,0,0,0.809524,0,0,0,0,0,0,0,0,0,0}, + //80 + + {0.790476,-0.00952387,-0.00952387,0,0,0,0,0.780952,0,0,0,0,0,0,0,0.771429,0,0,0,0,0,0,0,0,0.790476,0,0,0,0,0} + //30 +}; +// +extern Task riff_A_task; +int wordA = 0; +float rateA = 150.0; // * 100 (scaling factor) +// 94:b9:7e:?? ?? ?? => 100 +// 94:b9:7e:14:4e:2c => 150 (?) +// 94:b9:7e:14:49:b6 => 20 +float intervalA = 500.0; //500 ms +void riff_A() { + if (riff_A_task.isLastIteration()) { + //we are done. stop now. + rest_task.restart(); + } else { + //check out next letter! + speed = yellowA[wordA][riff_A_task.getRunCounter()-1] * rateA; + set_speed_task.restart(); + } + Serial.print("riff_A (i="); + Serial.print(riff_A_task.getRunCounter()-1); + Serial.print(", r="); + Serial.print(speed); + Serial.println(")"); +} +Task riff_A_task(0, TASK_ONCE, &riff_A, &runner, false); +// +void riff_A_start() { + riff_A_task.setInterval(intervalA); + riff_A_task.setIterations(yellowA[wordA].size()); + riff_A_task.restart(); + // + Serial.print("riff_A_start with wordA #"); + Serial.println(wordA); +} +Task riff_A_start_task(0, TASK_ONCE, &riff_A_start, &runner, false); +// +//riff_B +std::vector< std::vector > yellowB = { + {0.685715,0.723811,0.800002,0.485714,0.519047,0.552381,0.580953,0,0,0,0,0,0,0,0,0.533333,0.571429,0.604762,0.638096,0.653969,0.669842,0.685715,0.695239,4.17233e-07,0.00952381,0.00952381,0.00952381,0.00952381,0.00952381,0.00952381,0.00952381,0.366666,0.380951,0.399999,0.423809,0.933336,0.952384,0.957145,0.961907,0,0,0,0,0,0,0.438095,0.457142,0.457142,0,0.361904}, + //50 + + {0,0.742857,0.00952387,0.00952387,0.00952387,0.00952387,0.742857,0.00952387,0.00952387,0.00952387,0.00952387,0.00952387,0.00952387,0.742857,0.00952387,0.00952387,0.00952387,0.00952387,0.00952387,0.00952387,0.742857,0.00952387,0.00952387,0.00952387,0.00952387,0.00952387,0.00952387,0.742857,0.00952387,0.00952387,0.00952387,0.742857,0.00952387,0.00952387,0.00952387,0.00952387,0.00952387,0.742857,0.00952387,0.00952387,0.00952387,0.00952387,0.714286,0.00952387,0.00952387,0.00952387,0.00952387,0.00952387,0.00952387,-5.96046e-08}, + //50 + + {0,0.761905,0.685716,0.657145,0.504762,0.419048,0.390478,0,0,0,0,0,0,0,0,0,0.647619,0.8,0.609524,0.52381,0.428574,0,0,0,0,0,0,0,0,0,0.790476,0.685715,0.504764,0.476194,0.409528,0,0,0,0,0,0,0,0,0,0,0.8,0.647621,0.561909,0,0,0,0,0,0,0,0,0,0,0,0,0.847619,0.780953,0.704764,0.638098,0.552386,0.523815,0,0,0,0,0,0,0,0,0.866667,0.704763,0.619051,0.600003,0,0}, + //80 + + {0.819048,0.819048,0.819048,-0.323816,-0.323816,0.819048,0.819048,0.819048,0.819048,0.828571,0.828571,0.828571,0.838095,-0.361912,-0.361912,0.847619,0.857143,0.857143,0.857143,0.857143,0.866666,0.866666,0.866666,-0.428579,-0.428579,0.866666,0.857143,0.847619,0.838095,0.809524} + //30 +}; +// +extern Task riff_B_task; +int wordB = 0; +float rateB = 150.0; // * 100 (scaling factor) +// 94:b9:7e:?? ?? ?? => 100 +// 94:b9:7e:14:4e:2c => 150 (?) +// 94:b9:7e:14:49:b6 => 20 +float intervalB = 500.0; //500 ms +void riff_B() { + if (riff_B_task.isLastIteration()) { + //we are done. stop now. + rest2_task.restart(); + } else { + //check out next letter! + speed2 = yellowB[wordB][riff_B_task.getRunCounter()-1] * rateB; + set_speed2_task.restart(); + } + Serial.print("riff_B (i="); + Serial.print(riff_B_task.getRunCounter()-1); + Serial.print(", r="); + Serial.print(speed2); + Serial.println(")"); +} +Task riff_B_task(0, TASK_ONCE, &riff_B, &runner, false); +// +void riff_B_start() { + riff_B_task.setInterval(intervalB); + riff_B_task.setIterations(yellowB[wordB].size()); + riff_B_task.restart(); + // + Serial.print("riff_B_start with wordB #"); + Serial.println(wordB); +} +Task riff_B_start_task(0, TASK_ONCE, &riff_B_start, &runner, false); +//*-*-*-*-*-*-*-*-*-*-*-*-* + +//*-*-*-*-*-*-*-*-*-*-*-*-* +// conductor for today (temporary conductor until wifi enabled.) +// +extern Task conductor_lonely_task; +float lonelytime = 5000; //ms +void conductor_lonely() { + // + static int count = 0; + if (count == yellowA.size()) count = 0; + // + if (isactive == false) { // if no more movement, then start another lonely song. + // + isactive = true; + // + lonelytime = random(3, 10) * 10000.0; //ms + // + wordA = count; + riff_A_start_task.restartDelayed(lonelytime); + wordB = count; + riff_B_start_task.restartDelayed(lonelytime); + // + Serial.print("conductor_lonely with lonelytime => "); + Serial.println(lonelytime); + Serial.print("conductor_lonely with count #"); + Serial.println(count); + // + count++; + } +} +Task conductor_lonely_task(1000, TASK_FOREVER, &conductor_lonely, &runner, false); //check every 10 sec. +//*-*-*-*-*-*-*-*-*-*-*-*-* + +// ==[DISABLE]== +// //task #0 : blink led +// #define LED_PERIOD (11111) +// #define LED_ONTIME (1) +// #define LED_GAPTIME (222) +// #define LED_PIN 2 +// extern Task blink_task; +// void blink() { +// // +// static int count = 0; +// count++; +// // +// switch (count % 4) { +// case 0: +// digitalWrite(LED_PIN, LOW); // first ON +// blink_task.delay(LED_ONTIME); +// break; +// case 1: +// digitalWrite(LED_PIN, HIGH); // first OFF +// blink_task.delay(LED_GAPTIME); +// break; +// case 2: +// digitalWrite(LED_PIN, LOW); // second ON +// blink_task.delay(LED_ONTIME); +// break; +// case 3: +// digitalWrite(LED_PIN, HIGH); // second OFF +// blink_task.delay(LED_PERIOD - 2* LED_ONTIME - LED_GAPTIME); +// break; +// } +// } +// Task blink_task(0, TASK_FOREVER, &blink, &runner, true); // -> ENABLED, at start-up. + +//task #1 : osc processing +// void route_note(OSCMessage& msg, int offset) { +// //swap_println("got route_note!"); +// // (1) --> /onoff +// if (msg.fullMatch("/onoff", offset)) { +// // +// note.clear(); +// // +// note.onoff = msg.getFloat(0); +// // if (note.onoff != 0) note.onoff = 1; +// } +// // (2) --> /velocity +// if (msg.fullMatch("/velocity", offset)) { +// note.velocity = msg.getFloat(0); +// } +// // (3) --> /pitch +// if (msg.fullMatch("/pitch", offset)) { +// note.pitch = msg.getFloat(0); +// } +// // (4) --> /id +// if (msg.fullMatch("/id", offset)) { +// note.id = msg.getInt(0); +// } +// // (5) --> /x +// if (msg.fullMatch("/x", offset)) { +// note.x1 = msg.getFloat(0); +// note.x2 = msg.getFloat(1); +// note.x3 = msg.getFloat(2); +// note.x4 = msg.getFloat(3); +// note.ps = msg.getFloat(4); +// } +// } +// extern Task osc_task; +// void osc() +// { +// //osc +// OSCBundle bundleIN; +// int size; +// if (SLIPSerial.available()) { +// while(!SLIPSerial.endofPacket()) { +// if( (size = SLIPSerial.available()) > 0) { +// while(size--) { +// bundleIN.fill(SLIPSerial.read()); +// } +// } +// } +// if(!bundleIN.hasError()) { +// // on '/note' +// bundleIN.route("/note", route_note); +// #if defined(ESP32) +// static int a = 0; +// screen_text = String(a) + " => \n" + String(bundleIN.timetag.seconds-2208988800UL) + "\n" + String(bundleIN.timetag.fractionofseconds); +// a++; +// #endif +// } +// } +// } +// Task osc_task(0, TASK_FOREVER, &osc, &runner, true); // -> ENABLED, at start-up. + +// +void setup() { + + //led + // pinMode(LED_PIN, OUTPUT); + + //pwm freq. + analogWriteFreq(40000); + + //serial + Serial.begin(115200); + delay(100); + + //info + Serial.println(); + Serial.println(); + Serial.println("\"hi, i m your friend.\""); + Serial.println("-"); + Serial.println("- my species: \"" + String(MY_SPECIES) + "\""); + Serial.println("- call me ==> \"" + String(MY_NAME) + "\""); + Serial.println("- mac address: " + WiFi.macAddress()); + Serial.println("-"); + + // //wifi-manager + // system_phy_set_max_tpw(0); + // WiFiMode_t node_type = WIFI_STA; + // WiFi.mode(node_type); + + // + Serial.println("-"); + Serial.println("\".-.-.-. :)\""); + Serial.println(); + + //random seed + randomSeed(analogRead(0)); + + //tasks + // rest_task.restartDelayed(500); + // rest2_task.restartDelayed(500); + // + // wordA = 0; + // riff_A_start_task.restartDelayed(1000); + // wordB = 0; + // riff_B_start_task.restartDelayed(1000); + // + conductor_lonely_task.restartDelayed(5000); + // + // for (int idx = 0; idx < yellowA.size(); idx++) Serial.println(yellowA[idx].size()); + // for (int idx = 0; idx < yellowB.size(); idx++) Serial.println(yellowB[idx].size()); + // +} + +void loop() { + // + runner.execute(); + // +} diff --git a/faa_yellow/message.h b/faa_yellow/message.h new file mode 100644 index 0000000..8e2b9ab --- /dev/null +++ b/faa_yellow/message.h @@ -0,0 +1,111 @@ +#pragma once + +//message type Note : '[' + Note + ']' +struct Note { + // + int32_t id; + float pitch; + float velocity; + float onoff; + float x1; + float x2; + float x3; + float x4; + float ps; + // + Note() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + Note(int32_t id_, float pitch_, float velocity_, float onoff_, float x1_, float x2_, float x3_, float x4_, float ps_) + { + id = id_; + pitch = pitch_; + velocity = velocity_; + onoff = onoff_; + x1 = x1_; + x2 = x2_; + x3 = x3_; + x4 = x4_; + ps = ps_; + } + // + void clear() { + id = 0; + pitch = 0; + velocity = 0; + onoff = 0; + x1 = 0; + x2 = 0; + x3 = 0; + x4 = 0; + ps = 0; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", pitch=" + String(pitch); + str += ", velocity=" + String(velocity); + str += ", onoff=" + String(onoff); + str += ", x1=" + String(x1); + str += ", x2=" + String(x2); + str += ", x3=" + String(x3); + str += ", x4=" + String(x4); + str += ", ps=" + String(ps); + str += " )"; + return str; + } +}; + +//message type Hello : '{' + Hello + '}' +#define SIGNATURE_LENGTH (20) +#define SIGNATURE_BUFF_LEN (SIGNATURE_LENGTH + 1) +struct Hello { + char sign[SIGNATURE_BUFF_LEN]; + int32_t id; + uint32_t mac32; + float h1; + float h2; + float h3; + float h4; + // + Hello(String sign_, int32_t id_ = 0, uint32_t mac32_ = 0, float h1_ = 0, float h2_ = 0, float h3_ = 0, float h4_ = 0) { + id = id_; + mac32 = mac32_; + h1 = h1_; + h2 = h2_; + h3 = h3_; + h4 = h4_; + sign_.toCharArray(sign, SIGNATURE_BUFF_LEN); + } + void clear() { + id = 0; + mac32 = 0; + h1 = 0; + h2 = 0; + h3 = 0; + h4 = 0; + sign[0] = '\0'; + } + // + String to_string() { + String str = ""; + str += "( id=" + String(id); + str += ", mac32=0x" + String(mac32, HEX); + str += ", sign=\"" + String(sign) + "\""; + str += ", h1=" + String(h1); + str += ", h2=" + String(h2); + str += ", h3=" + String(h3); + str += ", h4=" + String(h4); + str += " )"; + return str; + } +}; diff --git a/faa_yellow/sketch.yaml b/faa_yellow/sketch.yaml new file mode 100644 index 0000000..35e1831 --- /dev/null +++ b/faa_yellow/sketch.yaml @@ -0,0 +1,2 @@ +default_fqbn: esp8266:esp8266:nodemcuv2:baud=460800 +default_port: /dev/ttyUSB0 diff --git a/puredata/radio_roller.pd b/puredata/radio_roller.pd index 1323267..cb880ab 100644 --- a/puredata/radio_roller.pd +++ b/puredata/radio_roller.pd @@ -1,5 +1,8 @@ #N canvas 250 164 818 587 10; -#N canvas 294 82 697 282 radio 0; +#X declare -path comport; +#X declare -path osc; +#X declare -path slip; +#N canvas 294 82 697 282 radio 1; #X obj 333 222 spigot; #X obj 382 207 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; #N canvas 676 408 512 395 buildOSC 0; @@ -81,6 +84,11 @@ #X obj 226 243 outlet; #X obj 325 10 inlet; #X obj 325 31 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#N canvas 415 258 450 300 externals 0; +#X obj 16 17 declare -path comport; +#X obj 16 40 declare -path osc; +#X obj 16 63 declare -path slip; +#X restore 608 12 pd externals; #X connect 0 0 16 0; #X connect 1 0 0 1; #X connect 2 0 14 0; diff --git a/puredata/sound-from-earth-workshop.zip b/puredata/sound-from-earth-workshop.zip new file mode 100644 index 0000000000000000000000000000000000000000..c61562e599f201f7251d4626ffc7a6b7e86f84f8 GIT binary patch literal 58043 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

_8!6A3zcj{+!)yDieEQ_5&w)?v*;XBWQ1 zyw~)y0eU6(iLI9%jjPn84mezg=Z(cPFHh9gK-o*CGo@A6+wf(oPx@g5X-lLH#%hwT ze$MSj$w8)Gtq6RPlw+(OPX~A!#g|8EtThSXn`PLXvW7nPa1Dtb&}4!vY9U*C2)#aG zQ8ONF)5GS?n2DrZ;@k+VyVh+^~Dq#r6Kb;EJJXcGEELW$v zFHAu~-Cfwr1`=L&ot@f^f$m`#P%%pVrEj)mD-1@;14AG)4|z^^DjwPsyOb(evc2C2 zvM0pW68m(H_6a$t9ac1E_91mrOcOh{$Fr6DCAJ>hRUJqD@21Er?J3kFIaL>9!xyxp zw67=p>FJywE=M-aZ-B90uR({cp+7udrk{1BVap@i(WJ{Bi&LF!l%(DB?jH#f9THDr_t)&87HF3w=D$T>v{cko@Nopl4dBY$(Cjr?-GC!XlB zEb9K8%YJ2@vh(jH#NMxX3+SNRT2Z)(mPL2&DF!@t?pS9MjexVo0B`;{V{h|*?wvQ? zy@c@hWjGJN*p20BWCh=U6h`tTblST94E9GIoC&IAqdRT!?Q3x)b#DJ0q~ei;t?gH| z2KjV3A=(L5Ob>(+HyP$aHJbvHM@3M-H&G^M>B@U9BnqI4AS6N2Bk7v2-47Pr;0B?4 zwk7)r?S0LduEx2hum1E`Fd^g_>G<^loW8QGA;b%Z%-hlqo2v_)9WiS|Bz2E1HFU)n zbXWxC2HUF|YRyRSa3(;F^4Kpr{5c+7dgyj_nfzxwFfyin)EQ}apZ#6^{FskQsCA$i zA)fjfEK8%va7iX!UW9&uV*&ZBEg3d}b1u45*3f5Ce@#;5L=GpRV~V_GA%=CWX}YSp zvZb~Cr%7h_9gXg6BvKviykEOZ`D*$-FR<t8%iFt~4Z1$g5bEBW#CZ<#*pauXM#P`iU5TD;vRGI93w#bR${JeZJRmB*w_K0eOR zyH*(q{fy_#ly)f|e8pt-LQ14RQudPE!_V@cK-N>qghNaoXmLw5_BxYkq10m9Zl4YX zeV+Z(Bo+S;O|s-aG|9yOu1S(e<-o50XH8P@ziW~!|Dj3#-4P;lRHIMvJDTbCjIu6W z#M|UD#ba;-O+?g!@vo#mfdQVzYZ)B#iY2|D1CD5{UyIxq@p02bua|_=VQtnN1l~ zk1f?-e}bFEYt{GL_Zv|)ZB$cpkDm8Uxmm+F^Kd9gv|qIP^I3vr>ikd7REN|hvmyQ) zW#<$gO4p^^*mkmG+qRP(+qP{xJNAxk+qP}nwv&_Z@4vgx>8m~$byrV4RX203HENFe z{_q#FfAN&zNvzdMs z_0e_zv8acd7)C-yy*SVI1J!1Tj-GYGUIX-DZ=8J5Fmr|ZFH5!WA4^qRy@joK_xSjl zdIO(zD7Opqh%8y9nwdy|nN3z2u@Jh*t(K*W9iR z`^~;T$cF1_WZ2aw;h(MO03Hxw6~?@^uMs@!s8#kZe;tOcAWMTiS5pJ&rvSnI3)4fA z==qcLFyEhXSRx_kq}_yNj-df^2vM4T zH;%HOeFP+-E1Ob}bEqa}*geQRgQz!hSRt!&SU7+~ODr#GOd>X|S05)G4%NMVW{4T1 zoaq*fE605e!z*%EByYn{8SQPp#d3%q)j{R-U6G%-B!$jFE!8`3 zWduRouEY$t9fDMGl_UKhOEn=C2(f?aooHp_7&K#;UDj(gdoIBY=UF=bmqQ?3=%M3x zXf{dU5f2(m^XKJ%$c#? zS|gIuStyLOS+;vWuH)7@#OMKt<~^y%qV)1ieaFFBMsP~V_qTVG`Kz?5EjC5D+shiu zw0`7sj#7u=BFpIY>~0(x&uy+X%iI92C>mZ@P_`W9UicH3ejI9c@bq8aG4}zprm3^& zB*57YiUiw5dQZkfY}svh7^o

Pi2s2t(p8F^3?N)%;r0aEh&@~S}YLjfX6rsQ?8 zk0KOi>G{}BM_J~@?vP1@BFdxP$nBIO=0tUuMWbaXhkuGJ@P%Sy{RE3jL~W$Qv4rbK zsq;8RsD$S;<&1n4Vu^IAl{NO33cTg@M2o!Rv@b^wO5!Li%$iUdSC)&+f=eV!9qCtZ zuvx;~O4G@*@)`_M^YR*?Xe8^+6NQ$N2J{pb@Y84o(HnJDMH2u1t>O10OUT2Xr4#{G z*rA|AWT7ZSSfnT;6S%`*As#_#{1Z-0U3d`f#7oVyjdyN?vk70=!?KBc?!2ClV3uG) zkc8Kmly8% zp7#%bsmz@?k%hWMB5xn z?u3zZfsa+dhrJ%v55IBBURmA*&@M0^EO*)-5H5Xsc!ZJyArg6%#QlLjbw{o>>|}QZ zJ8i0b6tH{J(~h=?cE5I03^v6R;(khl-umwTt7uzWppt(yOwx$(?DD%Iv%5uDV-kui z3%#RdAj`GmX_Prvk8(%mg$b!3A*`A)OF**Lr9On+Y02NdFR14iOH4Bb^Qj~~J7UBd zB_Qv>@Wwz@X^gyyobhjID7?@hl))H@fJP43DK+!-d|JT}>#W0^ktXVnKDxS3dG{cd zjz^+WO{EE)y@`NFnM5=rJOkLOr=U^~;^|_>y2zmik!mmu8 zY_GIi%0Y20sAzce!=Gs$SbuwtiQJrPy+XBr3EOhm5lpp$T4*$#+tD~+XM9wuc=95D z<<;ZZ9wV3ChX{I$P>Gu8wP?^k0Csy4x-r})S+WEd1|#oY3B2cPN{vBNZMwQalrS;p z<0DK8z-^$}3Us*D%MVIMj>zkDfWE%Q_sjUmtGF#W@+e|l+o4`K%^4M_elMWQcasdbx{|R6u{?=O&lPoa|v|j4{ zc&dc|>8ZY;uEhozqT|^3SOsW5(I*!riiw_OjFanrlEFH?lE@sZ))}}>Luq6lsZ;eC zRrCaft?WoTLIU@7b)oQGLz(`DR3Z@!jBBlcj?)Kn+PcRfa+^4 zeA=il>)zTfd4FP~P)y?hhz<{RBXDmHMT;mIm4^#3CYL#KP&$%D zH@HjX26xx^+*=?~RhHA-9cB+fl}fI5_lb4%u`W}b%uRKeF~OGwy}7}H)0x51oJmN` zqB7vF|H?o`4dDABFyQXDQxxH@GV0;XS>tx&@oqFWQ9i zwFgVjr02Enp86x^t9=`=14e&DRTIqTg?~g3U~Js)+~MO$8s0$Xf&+{|tStCMd0Y%9nF&r}J{L{N_4qlZV2MC`UNAZnZv zH|DF+7g|K0h;3yMwn0HG%iOf3a>?_~wz`pGz^|D;1&JD0ZO&9=@Tpm&B4%|v>(b=* zCFPN`n8}gK&rgcc^&ua0(hKg;f)AOo^eDP@rT_C=ED;J9s{1VLPO7Mjro0nQ}v)B0tV|6q+@`aJs+4&uXmErxCJ*qS|{k}61LGd*9^xnk$KzJ4d0 zS9bR^w_Y=7Fdg)QZ;7i=OvHvwIuW(m0TAma;s?ENNb|_~?6@<-ENPd~jwI7VwF4(p zv5h;H3`_L;?gC7UTA4|}sS$w1)4g!VdFidd=ALVJK-apC-?2R$MSV_*Qry6uTiZjE z^RX+nDnvrKJfp9;fI_qa|HL(te7V6zc|@>G5lR76xqx`YF4X1lP0nNE+#~`fSBQ5B zwUQ%rFiNAITVKLL=vU?Yt+H%ai1$59$IAoW?*Zr?E%YA%qw2=f+%a3o33;7qVNc#yAN}q#V1(iw@^hn>T?X#{AJ*7@AIPuv!!Q2s5 zmX}pnBd?(y?^f1RYW{}({{k@4{{k?{o?xg=K(hY>37zM9yR82tTweMR$&5nBuG{Mr7H0Uz=%l3MUbPY&&kPhigA$d zaF8>BNtMctpjl)<_IzsV-@fkOundRK$uFcn;rryXy1i~2g$!Orp z(W&38alv-P!9Y_WCWtg^(!F^zihgl7g6$#baMsTl9W$QM&#*q%Z0YKJ8{%4fz}1a@ zUeV5t8MwiUcLgy9IkTcSgJGtk-fxHp>Iv5^WX@*8l$fvl zlcTr6`EX@-8_Snl#qCnuS|@yQ_WL=nvzDfZr=XO>DM?AypU`;&rDi=GAS)7MDvKccG8e~PLL39V>9Xt^f<_eWHH@HoQkxcuaAgNrZh#=Wp+0wcpk z{t;D~fx;Tzg)T|9ZL5gH?u?yOe}h>d7u0ohFg0wRt>kdsnKqqPDV=!i7uy;j6}5%i zLOukl?l1!06<{LfVvw+s{$5JHGRxm%>5tm>a+CY!?r<9o>r;Gh>#rz8&z-Kl$O`!q zx31SJZH9d}+5INmbXl3FEm;-itk_4sxug2(RtS@cR^KTUO4iRvy0R@SPov`9C^wK! z`2rpl(`f@74Wa?!U%@^cvHti@S91^y7CZy8#&~It(ET4n^UiOnRms2s0RCVA08sod z5X^rms+DS*F-i0YKF_LB3vSON4_hyK3n@RB+i$4_jHj7=@;=C&%WW=ebq~KGv%Na% z!}QY)Gt(l^Q;Li6Cr=K51kfBLy%|4dteO_j-5`swK7MuB$SiO5MI5*2A7k4aY>I<^ zNRNF9ubrWHUCS(2!_5YCzOrd&}C>Pk|13m zi=QLV0E`4&Gz2@|IKaeneCmYKH08GdG2~`*t-WD91r%O(o3`JP*6e*U(+PvamD*Kz z&+dmrRvxG@SfFM3?eeU$UGb%;Yq4c};IWr0rm2oC6x7CzkE?WZ^{_6Li^2qS=k6CI z_#0$}6H^<>~Ee+T=o8fJZJ+64=6E$gNt;yKFrNg~3K&^Aj_Yf7|ui(xn*0 zd6-Zw5Tac$L9R=1EzA()ydSibTbLE-7(^Xt3E>EO4&07J41rw)!3nHr_~KgXPLp~* z25K0|7&ql|2lqZ#I5xRs&X_+ZxQEyzny|rk9*mroe4R6pCtIZUHGht*98|Qj1V(68 zXr1}o-fgxN+RWvd4IA^Ly`8r<>$o*Bi_(>6r)xjbGT4(eTT3CcNq-ixHS`9=i9T$e zs74Fslb)MwYp;9xwU>kRJk4oeA3zKqkNX|WwF^&^XA_lU!oI!_QRK`tqyKOvO?k z^YD(8Co@eSXS>iL*P+|xtHXqMc-{`5SG^0JZQom{txZDsE@k{iN~mv_i?k5I-M8yR zQ~;ib%}3LQQo!VL>YskDL1AF_QcrMa7P@Am=<1iv*~Tt~&-^76D$tUJhsv|38EsG3 z)|RV&DY0E=OoK-H@Z_KH*~ zxT$pWPiB*X0A_+%#&|56$boF+cHI}TV2{EJO$CfZ17a|?sly2GK{-5PE7jGbl|AGt z)sw`Qd4Teg?JN3Dj~e;{4!#*Ar5S5qY}@H<%!t*&LRtezF+{rRU=3GeTt{B_Mdg=1 zlyJSA4KO&#pX)z7tTLuG4bjt_Ue=<7F`}ntQz*q=XWiEph17jcC^lQa&NA=={ec8f zKm%fgYRyi9*IJV5?C|qIAe(2?F}~>Q^u5p#V3s72;RjBMDDgbBrQo#ut2+0m0}Y>Nqq4Pp9ZsS- zgv33}fR{sTO^4$>YR?mfjklA#KUAyRmqJOwXt6D>hDl)tqcKYfcu~zZAWbmT+Uu7j z_)T0Ch;kOVP+;hh{3!SY0N|Z=09o;Yeg(kXv5(xqDb!@f0R_czMH$h{)EAQ>%Tt1J z@-1^}BI~L%KD#iB^;&CQ1pN&WkGz)BH%BlVn8>qkCOc(@xZ_58oY8Y2gC$KclLJvj zqL`F$Fj4Lm5E;uKW!^DSU8$iSl%a}8rtoqg4Sw;0+V>jf;IKT5wuki!FT6oc1my*d zk*<~L4ZqK)DPUO1`>ii0oW>AB6HJ=Q0XYh{_c7qbm?>T0xcOV;A)F9#P;NyjCu3zW z3~4}^VlO6;9df$+XG%-FHZ`TJuGbs(dhbMhmZMePMn(JaU$XA|tE}wh_O3h4du}4> z*05JLf#)LxY8v{$n_9YF0+ctomu|VY#a0lX!5= z1Yf~evQ&-NUy?Qeq(a-b|NDoBG@pTb|HHImG86zn#?O3O`v1jh>u6_eWu5SG<{>0ySq-zmOykgnTY(3>y}^B8V}<&jw!mR>8^d5~khZL9KTi1Dv4>Y%;TKTY6^x&Kw$V3JPcCdOyNxSk{<6 z;GMHwBHaF2F~-mS}-Hz|O@G~&qc)*cD2w|G3o`UV@~bPGI&o&if^>d@*s;#T8waubDyhTacGq>~dfLpMV+ zV_D(oi2jR-5Mf+BM5Rlw32aThCM%=}D_<;+l>KG|{5c(r%cGM+Z+pW)x3&K`P30j0 zC>+_vNfBy`SB|tSyO!IwmDNx!ayQ7KVKj)s*pTq4#bPZFzl~&novYlG@D;v%N0hf8 zIvj(`XY#RfSe^`!Ji$We6V@!=vy$X`m(Y}*6&h^e_kBC=8h2hEnjTv9r9rH zx1uxGiiVTh?d9OA&Hc}fl~o2-Sv4>WW({j>-Oc{MumUrB&F>fI`6D6T2E3hy^zf7x zf@S4a1ILtOrcfVkJ{<7acSL|>5WR4Awcc+Ce)7b4fR3kXXw+}joJv8`NRy=My974L zCMo0)#o3)1Rp|mE4vUhh?`og63M3*vV>uWeOoV+T2d~ohveGwPQ=MgH#k_A9#txpq za<`;s<*+A^{bLqjzF-; zPZ~aP>Dd^PSao-Omtqwy10c$PN5IZ<#uX$UXET96ON>27#3mCI%GJV3WGEmH6YJ!X z6lfN%Dg0d){!~boqFNwL3m^J}g{8<`E=rIWCc-@_|MF)=Z4^}O2kE&Y5HO{f{M)#f z8BA&v8FTm{g_4d%u=1_8>T}Y7Le=L#b#A;l4E*AH=+8ey+B{`0Zw&9ids+F5gdj)K zMl>>TDJbtMya>oXq#Ps-9Es)b`7ZskBI`(`3RLWZxvI=EL%rDf;oU5&Za2kR(PhzucJI%4*pr6mz3vEb9LGe_C^O2 z=+OExa#UH{1wMDZhpIwo7dROToYd)9>4~CtTORS%?JRSHtZaTXPV33uC1^G@3zCx_ ze}-<$oe@-__szgRkD)7Z!7h9j+24zsaxeD^7LVU5>J&hfD#6?0>sVW*2O? z;P{%jhb+c?By@F0k}T#GU718#nfv_-Nleoot>F12$PpvrJyRPm59gu#Or+2QW{V!x$o)@F5mG@$xw@J1+6>u zEe)e9jT%2=;8l@W%8#18(>ozOLPppW9WpXyv*89fgs@c6T}7tM!jjRRjfnZ8T(H!K z@B@E^Mg<qRDrEI9Q9pl2hrB(E-2-9HXPmLkpr$kOnan}U+!#0ND^diQ7 z_pVGtk&fq)$eYnnt_aGJZsrcu-^mnSD?wIREa-VI$3=}j)x=O@!Yyoq{t>~L$)f1j zQ3zn%t&*>50JC>dElZ?IS)Wt z>?k5W1~Z11=m6pj|3qY_DR++eKx5_ta*pQ2;j*rBLv3L^c3WKDJ_b~a63I27LBJZg z0&3twaxPhwHI;-QYM3Op3PS5F20t))a=e_KJu=<+HPD&?gd;mc=@zicv6K9HqNXO< z%8e0ovAu|O8Xm#e<`-WluO4Dy@y_%bm!qAZRTdfX6Mk17RJEzL^9X3PJtqCL&Li<*el z7Si=pSZwWY6rUc8Z|O^1 z&kMuff*wBHiHVeB4j|OUQLW6Hvoq=neeSr&OxI8KwUu!i@ zx%S5cP-C+?`6*Zkbx>!2c}fh&1LK{ooFl`)8NYJ%jLFrglE6W!5Srzx>Oq}LXb$bI z%?EP+_HlWLgxBYnX)+qA5s;Wk8dN)wF+~`plx-}!mF+HM!9L(J5~$IsQbu2{qq3+0 zE%B886~9|uuBWf9s>-&^JSr@SUvNQ$v5?B2Z$8$nFD?lb)ALC7h{!0S&Q7pJtR-UP zk@r!zz8NgocM&ebjyr99Lv&ZSey#Hm9*7xvuzUS;W6n}ZP!#RB?*mLJ@LbN5l2-xX z0T@<}LmmMbBqG$-_eCHHYHS|*Y3P5d<~o++??eo1fWcq`jZ;Vq-^cmqnYof&T3Ig3 zVpIuVSsYd&v_WtU|1viEH(s|iv%eBz<+>U%va=6tNJ*5`?Peijf{I)IDr04AQ%-B< zax~lo;xDQ&F#JU+j-e$f60>ooz$Yo15+vPH@FXd!B+RkIQR?|ul#G)^gRY;cpQ#dZ zlFR^**NLSzD6Q-QsYXWOUU50t$Vk=Mbs-N6_p8@iHJc6Q=e0a zrC&*~CYF>^5q~!c=Y`UgT4AsV{PL9tJqxYJ`9$!g^*#^ZX3^@hB!S4UZL0azGUsI~S6(&J)uDHEEFVx+oq*(n zLbt;E%2W{4!K0-n(RTI#C$O>jsQsC?vvX=P6DhQoi)kjrilj?VMUEhkcyX0jekxI^ z2vlS)DMmwo=%SQ3wcZDaL7+3DMCcUI7EUtL7ULkReh~3${NS2K7vJh*{#imZM31e^^lCTWnlE0U8m9e`?ee_w)j}UW#1A3Iwkl=*o6Z=68-Wdkh1+qZOe$iO!ggw1oYG&b1%9l7Li~iDzu@| zjM~IgFJP52zklLmvXPkZD9MYmP{en5B|fag=2Ol4CW~0KqfXmgb!{C~;17)~R&ZS> zm~)!>u5VP9R>xf6XZ#ijt$No$sQwtnC_vCW^>gq{75Uu3GYm2!4A#z&1Ux=0_y}qa zdq9i@6HPkBzvu>Da!$oyR<~&4vumZ^>X89+Mu-SOcuN?svproE zuaEL%hj4S&21*@ROohS;QfxPbDA-alb~##qmySrV6`4QHBR%iOdL@BkAAhPVo{!^! zp?`e#wVprQW|MyZjhxKcoXREIf>BoBQe@et4# z@((CLk10p>o{CmW;3ohM5Rt?m8+4Y=#sVN1)2nK1^B(m=D7jpk28-pcA^d-mfRgv` zTs1xI@K}JhhnEx9#thaCMC-Tao4C-^?VxO@b+hsK&k^yg6?L(n?k`Ym5j;0J9UektAyy= z;KB|txKaQwdvk_6giDZ93ujTmn{UE_c@CKh<-Nj$IV0kWNsu^{gl5a*3i4c<3i%U% zlXtTtX%Oem5XwrDH%ORiMup@>S_+%zD;efv%%0_HUFG-y{C5HWCpRP_$HJoNC&+~j z{{M$kI2t;C>Uo_*`L4|&AizNn7yo<25j2sz9T_bZrN{ND_yMKXHJNWqJ8(W-LRM-g>r4U$sin zwX<>WGBP-l02H$UN@+NTram?%XNz8+xe?+7Tr5ovH-DF3YiL|1kp39?0i;krBivA^ z_CO*oOc;rAv`H3cE7(2D2@s8fxIA|ujJG(&n@3Q7Rs|*t#2Hp%P%a#7 zJ_AvrHhTE*CugD`hvnqzPx&qwZn_X8xa)fi)VN-gkYzFv=FoCBnS<7DkoywOt0X}O z68%H5zp!XcdHso7%VKu?@S1eRS+90{(gR|v)9wAvYZrW)M;~cz`_r*gkH=;a_G*0Q z`(R!@UHntgt?00j8$~UB^X@C4;H;oNqPYb{@S~MANL!J=ueV??cgrWkWyCj&tSJ@2eOG|sS!ufR4TeOEx!C5Zc|f~#c{^5- zw{7*6fePDUfh9c;_sl#%XREtkStLu+X%>GV7MecOLsTxf{)Ik_RNbPTO-y}N_P4Q= zen2Mnd{@VkU3B(zo@U-162+_(?>|s2@vo*bTXzI*<)x``+ zsEfx&%5UJPvB=VXfxVqdyh&|-%}|f~D>ng(9+)=Q`ZK)B5Ut;OQn9TJYp|!B1{`7LbUVY@YilGHdI~lQ8sCh4dC7w@zn+crxQu1UeX|`LV29WMN}hLSwIK{H5S{rro$Y2BJ*mpB^lXR1q5;o&OLe8EKZkqkcG!WL+ermkZ zn9rs}(ZQsAgqklxRn0FR`T8F>dqQuk0tMA|D-YkEi7A+wDS$yb7RR1m{upvKX-02`1};AB zmw|&$_-Rntg##`g5`~H8`B(ZWfmk89lsnH0=(&S!mN)n4Bw`Eru5?_5fO!5H=(}kH zWzNa*@n!c){SgWtL6q#Q91&>Qi}to3s>#00!qosPu`!5u#(K)(rQ3aOPL5)h^gs#e zd!TegZoI#-8W8QUvSa})_3CaMkdVO#fVkX3kX58Hq%r0|9DpW4&LEj#h=J0LQlI8} z>r}rqr0Fp)e}lEb3u(gtE>`K~n{)wdyN2fRV)h4g#DY@=zt+3|l;9eKLhyDvyYzT* zP^;eEYx;E-vDvf^GKD^DzXw~CGZgS_xak5uc|&6O3|(Ib`fR%L(mis$U;|ZcFMIKim=kzmCU)SPH)BqKOBCa33aMj1Odj;n6Tg zuhFw&h-MdZniI!36Nx{`k13Gl&l<4GITc6}q6ZxbKmyEQvwlb(4SmWX0m#BZM|Xkq zh-CJcUmfTY>4f`40)fXf3@L|pR_`3*>dfcFg~bd8RAR?26Kbevy|>I-@h<2jC*VqO zUi)PIsHWO=vP?Q`gmxj&`LmXzYY zwTpS7_awshtm)Fk=?Uz??)a(G6COziP$Q^cyB_CAQd$4ALoNci;7oVnR6bi2cQUOK zCr~eP`{NTl#&$X_)D$;Lx*+$9+YJ$R083E)#br;C0t;HrXscnG%VfTnqn{DnA6)Qobxa&N9CB3b8vAtMBp=T`Edm0!`lV`>^<~8- z;eeuy#yhY@YeAm61-Ze`av#phcy2r<@>X1->Hwyi0NKeZoAa*F{PZH5Mo7PE^Jp#cJ=4bnoHiyhqAU@u9G##np-TBb2-OYO-t_oY>Wb&x=r?jxyVZF& zjB^v(34t)mrpmf5?Rqw7@66fKOF}x`6JF1YM+JdJml#NGELzk)eR+-Pj-T#PzlwfV zGQAROj41Q@6`I$i-C4bx_w8ek(Z%iVB=nie6fUayl#584MtK%obp{3F-2fHq*BPGo z?J(;jDMeTmesq4jZ8_4)vWO9bM10v>H*OGpH+SH-ZJ`c1r*J=DU?uOLCX8y+y zeMBCvgi0QSS`NpJL@d9RGo}+=X9j_LsI{{KD4Zi4+TIw4KcPO&@2BxoOd67~W>TK3 zGKmygnEv26{6*@)&=73=yQa>2el&%$FJLO-yy*Ms5q><-3>Ypq=F>FpyzKtXiaB8IiG*QGxl)m#b@RPmmLG^Acoa|Ojk7qYEp9I7e zTG$0+VtoyFBZC$(Ohmx194K;ev;)B%?B7z{CiIr8w!%h8&AMTZqd{6~L|=XVoCA^< zT^YUXagFJ4Q_qvEGWMjiEXZaiYRfbjg-W9G9$t-cxT%qh2;wO@BNXiSHp>3?@v`l4 zi)L?&2oJ^e1QsIrPsg`dn3N%3+Ky_Z58}-&WV#iG_EQRZl_l7+_Ig zQ!fdra1HI3l;Ea-bSWf`5am2a;-G8N zF?y*QXxp{Tmer**6GKDtIEzv&55urN$avePBBONp?0uz?%31Sf2!#k! zx`C?J&lDf{--Z=#yEtmwmp~(c4}0GAGT~ubUSn?C_M9Fb&tEhjXaQo*=f#2O zH>ImprnhR=tP)AL;+?V`4hj)tr?yF&dk7OEhab&jhWxci?7zIZc5^RcQ?RSl{C?We zXML?D|8QY}w_ilTYC;zf?@~}sDL`n1rq9EqMbXr`em4X)u+tEHubZE0 zc7M6+enmz9>F6dRygvOi(mjtjTNvFEI{tB%Lqvz`RG*?ZVq7wBAaf0$vp)#H`H2T~ z!Va&eam5C7^6&+~*-7Rn^DP6QodjN^CD;%W$kqkA;HWn7GDl1L6g&U!Aa3Rh2T6MrJL5Y-(3^c2J7aqgJM)E&w3Z-b;Ct*A@uh4Q^jDC`gMrxq zL7eGg=qkyMQV`8P5$`ntx6)^TB6#cT&$)ZC-IDLKqTmUtDD}z9ci|L)*|}9(->841 z#ew{7Cz*_}AgIcQYhL%BBfo*(?Oa~oouI}qI%_RrS_x>;Q!`}(Yvsh~0TJ_Ic}^Q} z`h+U8MBFf@)6+^;#vIfZhsU$U6Mpui2qEvAD-VOR41llzO;@~4FT3xr%k&uAZHX&% zAR3r-_1PJngAZ(dJSer-^FdM|hp9V>4KvsW=g{!-6gYwSkFqh-r zSQFhI`Li541Kvonjf;6fmGL^?LV`IT!=S}~vz76ZgrrbjpqCH#)u_iKbi55AlPdd; zwnQ#8=L(k}(H%N~K1$0W6?fTHckR}`4MA_0ydibI_33yM>3HvVz6}kXL06a4dC@!u zXTDu2ifEKVYH+j_`f|6uwhcgkW!PEGKvwV0Kzc^-(z&hbsxQ1zKrd@??yeNM>Z5yc z<}#fz;c+?lm8(1VMd)PKu$_kt+hoqHKDzg`LW)euU|_vN_N~gXv%8=Kp;LqIE^>qF zn^I1M8@ybCOCE!Vy)+Y03kiwK(-@BUrr^~#$iMRV+E+r8Wghv*Qp!a~0DiaVi3mfB z7rq#<(yF~1H2M3nsZ8+2I|Tp1d>VH)Fyr`3j&f!>ZlE}`=0HDQ(_~e#1YK97mET0& zIIwFS=pa~P;Xs7)uzYWCLXbFFBZptg>T#Oh7iPVfR=LCspw$;KWpodJ=;dW~f zB23YM7~uK5bG6xib9Hmqz=Ko7gw5M?eD8$kGW?7eQ!KmYYR`TBAi}ly;Oya=<)o0# zMF!JHgZDkwyl4Ut{j1_vH0SC0?)F^QSP)yR%Nb9bYqF%eShbm!X&APh72C z?wr!Le1To7c#pSiX3!%|mwr)RyytyCv)~!4Wv$)e+CFgHO#EeKq|b-f6*Zp;I=Fo- zGU;o!uh!}xY}7nmh!DQZQa@?0L2N`8_|!HS z92YCsW&AuMRIIc4JU3jcVcPiYXUzN5a8NUOtT5u_p-J0cEoo9v#CTG2^M4x#7T*!k z(U^Y;tg=PLKK^kV^Ien>Y=n+ZV}DHaAFr_#=0+`CowrKH=B^5NUy(uznIv9O4Cu+a zs~IMSF;}AO_d!`kGSv6A;IY5M0H9pl2g7$M43{t$rtp-I7*t$>S)9*d_P|OCFaAy8 zNhwjE59K#9pI19NU&hRyX0?8a)hkZnIhIdbiISLCEW+f}KuIDNoCqeXPT`4l8Ezkh z88KXzCM*k$Abv?9WFp1_!^oK?PvLHXikLqv5U34H#UHz8m@ot;JILskCJlAF!fWr+ zfPmmtJuhQ}4Q7BJUNlGW$H;M7u6YWx^BZDyntH@SQ`EEEK)-xfvpwD0U_DJt2E82D-K^ClFBuLSQk^;` zlF!4abxK0PX2kudFKS~~B3f)T?0$G_fc-b?zBWyUT9-Smgu?p*M=@QkFH!v*I=&J{y^@X-_g3L$H5(=o*P+*v5Ex&8Zp$WFNIrM zS=u$E2b?mWgV70G+#|qQ2at4kSgKFB+jL+=b_Byrcmv@Z(bQ}$ioV1+BrN&Fm(%zA= z*-tu%_9mKcWefMdk|vI@uq&ma*5p7N&e`|+}IVs-7h`h!0piec8i&B{q(AbF^&ImiT~JJJr|$%Gog3> ze9~W`Xh?g)YNByyym8gXf4`V2-*`RU0g$Rg@UPZhI*zU^ljrPh-a7V>K=xYP1_d`& zqAR@h6TJTyYn_;eRBa;z0Pws1?=o5buOl7f57lZ&U9I}bWC^);57+fuL7#SmEgvAX z_XmLdkpm-UND&}L<&l?)$ygECT*&czOEuWD$qYR?zatYI_W)UqpKG!4@kzuf0Lh5O zwRq5mSIEUJ^`Jr)g0x$$J=_vZPjowj6Ok@3`sMH2@QAVyens3mL(d_UY~e-eqGcQD z6Yv9(okjWX20`%McLOzaqZq;_+RY5a1`qvnr1O4xdHS*_@ngV{-&6Lx4qcX8>!IMz z_E(Cvx^?K9V6S0b*~Of!NWq+rbPHh=ha=^VqXSBaI#|E6zR z#PFsBtTSr^b>buQcyJ5J;t0-nxQBb3R^6aL#W#RaZpP`xR@T(IdaG^QaP_{V(ak7W zU7`y{F>b;uZ`x+wPafFd5Z7lqpDy`~Vawd&?mT=@nb(|7)_|l8znC+LFkt}2gsvlG z;i?xMuZy*IWLDxLy*ebE2p8Pn^tNJE zrawdt6~kuDrv$Bg5S}w)UPYn`#Z{0<^4c+Z+27`>XkPM>N7r4t)}$LLDX-Vl+5UXZ z7uf-z-ZxuyI&`QMoXtnGFy!Czg6_=u0=)}2e&ZW)Dx%kAahI?LT*uV#gfRX$CG zLQ$i1W4s%>XGrm;(-UC7`SjEB`ss;bE{Hgfu=! zO}*m-lCuJ_3oO^}L9}-b)ZjD{WUjuhYW(am^_M<}orMM_q%6vb&=PjB#dlHmSl!@2 z2yAdB0f=ELcc9orwQ-St$8A&T60JYk#>){K{k9CdjOGolxO^8v`}_3apbYO_dRvDd zRw2TgNxcT)wp?#cufKf#mEzdK^PcVrW!^91I*b-k)VJgbG|hSn9TtTT#`S2Msl}@7fzRH2c$gXWmlMHI-J@m#;f^H@CN! zF%dA8k%^G5@wKS&?xKmu#Q^-se!@O*&&_~;4TKTzrx+RLKtvg>EYrzL^Ib8UK!T@Bo`%w{ht zIT}deN2nr_ghhIyt*QR#XI&U_x?M6SwJg#Q*&oU1?^aXu0r=@4^cI)TH)w8jI=fp? z@fwfRi9so*P@`Wr21sKnaB2L<8`k}gZ1B4rb76&D`cskIQF^Sc;8Q|1M&8_ zq7Z9rB$hRj@9YtByTfH?V0fO^)JiQ8F3~v^_3zP9N-G_yGSrI!UnkfgwLQ@{W%tcy zdNetM{=ClkgZs;r*ol8jp2_5wcJ_d32LH@$Z_?Sx=XkMP5KTrp<|LI^7S11NXqjQ+ zg`ypFCFAtbHLHAtc^D3e?|==EWaTP-Yq_kdkKn2#6ezRQegSjTMtNx5Pd@p1t$=+R zp&zS+D))IvlUk`d_i-XhFi+R>?Qnkre?PxYi==&9@*8z80Ic^D>b-X> z^|<^b8+|!q+SM5w!;SMtC}Wa8f-}k;)xacj-~$^k8OLhk{PkC`WRx>e29u~9=T8*| zLo{WC_}CujZ&d;t6UG#dAH}~R4;=BK0RHC*sox~P|IOV{b&ONxe)S*XQH3B;E3tr^Ot2cB5pFc=xDxf8G+()++5rbT}x6Sn{REuutr1 zJc#YhuJ6}pH`3OL$YzZ1>}&u&35+?rfZ4gvcY!T&g@R)=Eh|wbh+i}?xtWDRe{hu*%*9*VX&!IHCVMNbnuf+6Hz+Jc_J+|xcGVI0R?Ik~)^CX3wQ z|3le3M%fZHZK7@4IHzs9`?PJ_wr$(CZQHhO+cu})xwF>HcYl0y?^;z^yLRr(sudNv zD>5SEc@QE1&jw$5DuzTf@~YTpCH;ZT(9eWsNxY`9V3^x>xV%0#LgEckBHy3B2U^ML zIxV7=yWi+EKYwAbRwkW!gns1Qy$iN3ohpCV1$|P)osz{~u|+H3LFMN90TJNirr zg3z5|KXFzN5%?bt(ao*;g4NgP#K?Is{)6(t2U=n^!W{Y+(xZkV2Kj96v3X$&Sq zoR$tW3ARbYR+s2K=~&wLPkICRHW5)Rnjp(8e5lmu6pCmxd_3+wFlq#(%My3FK0Uu> ztkmdm`@Gx-$q^<}91oVK=gy46mibu-xkEhT>d@E^7ud@UGVfHI*KJ$W`))Qpu}G?k zoHSX`MGjl=(^TI?J29YF4r4l#9mxZ;0 zxw61#z!#m)K#(p3@zY5{j&ukN26Z3E7xETzwt3lgK%++*QJ58_W~cxra-qI9Pg}ZU zVOM%re|e#As<6_oFsM?gvk7Pr58HCn=z&hf52@a-)K@W6E~{`;9=Yi&JIMQ&Q|E|k z?4+2)a3ebv#~=dPCf9Qq6Y~{t8!+~5L7ApgX|d(wx*L2LvFA5D06b;FnL2dKI}vwc zZ|<5qvFCR@s}U9g-pzo)+B2cvCNnX}!G7(QSAvOY z7{=wqchhCL^Pa#$6bMO}?DZ-}4FehmEC*+PH>Jv!x8FA;8xzPcFd9O_RusldzaQu& z1gLCM5zlC#pJ*fq6b1&_fI*l_c;Gkk0o=Bg1;pB>t1jD%q|j>{3{(sXDk*|OmzD2p zCI%=V3aB6nH~$@h`YlxDHqR@*X+uJAuxZn>|d_k65D-^o@7mg=o z0Q8T%KASiPaL6tYTpuADh)f@TYhXbm0$d+P^t|&ff}?FJP9MH2;Gg)vfBeBh#OVL{ z1OD;qCI6atRr5f(ruuGfw|UX{I-?)>mK;0xn3wmW*nz6stcEVL;9a z91avboj3Sv^s;6tc8}O`>t1 zUAUgo8c;d>8o*_}gBe<6y&6tEHE<%;7^3bHsOs&45K`HvteW1%at1qTjTl;I5Dm z2zPmCZwUp#Z9M@{5Go>Dbto?fD&ne=;6gz-geRX6h~4iQMZTDw5D47wue^mow13-8 zQ0&_{PwR|?VL%+zFvRS>@t_fFBI3^x;mP3#g5>Ar`mUVlAFUd4Is4O)rdyeGR~~FN zxpW`0Y7lK8(vO?jm6`XD3NJQT*0&BO7u=8kxaf(1^p}k3wV64?I{v&5l{7>k?N+f~ zed+ahJlvZ7+*6&aU$XI)~sfAt1`BNS;^&Q^M7r#DY-#_GvuJ!n0$)G+kt2YQ+sz9Q$(;^(sy(X0E*a+vedQ9dtjXjT-VttRj!+_2pqKc9t z0E>a@;rV(0KG+bN((e5y>?#jPvC>BfBHs%(BwD@B1nMOj}8_GvFZs#fM|OPC72JD#}&GWB%19nN=-Uo zUv(sO?GX0ujUIs_Xx>(uaDx={1|pabW)#Us1YF4i90wCx_gl*Fbe|>uZpsc2BD<-sd+H@18D%)2dKEEUqZ9*^Io#a!q zzb#Ru>xTL!i;Yrooq#6Um1*m7G6zQE4OfVH+y|$0z1uWGzA%{2jwhECobe0$jHZ(V z;Gfz)^ka3zXaT4-q8=vK2}}kO-V{NURk$RR?wtl3^&`Wj{@!MjQp*NKHA~d=YKb^5xlq|wrj3d9}fF-xQ zy5MSAs*jkjH(L`)dXD(Az?BoGx&TBz8=5H$*0*>bSn3jUb`WG$KwJ^fLsZNhjJ(b` z7D)n(JSkA_Tsv4G$oFuy!JC1phGnGTU-s0UWweO{XU4%VkM)lu=aKNp0kd#)2{G&c zQCU@_Z{?a?Khrz;@xs(BNS%9B**ou-+Js&KGf2_3>W1fhJ>*1G9flES?=nCr zPPTm%X;q86TIM+^?yNe!?QH6U6yW73#Oiv$c;I9_;|O{~VZ!K-z>BEM5 zu8~&(K%C`~7;iNV^UsN>x7JQ(F!3ivN)C^9Z&EHVk57M**_0hZFM@c)HT9pjrw1q6 zC3g8}6cw4?@x_yaGm}wq=^+kh(k{(9tkbuHy)S2qt!?i~TJ6e`r>_Q79`#Xo*Jp|@ zou0x6J&zD{R@1K*lg6%#0)eJxvx2fp44g(%i36LJ1}1Vc#SN|YdDg3rsL5xnv=$+Y zWEL6UWLo}mK`XW9g?deOw1)CvdbFiHpRG}V^>_evdx$YXH&nF0oZsX7dUp!Uikz2~d?5tI? zW=h>m)UwWdUR6zk)U#M9vFWA)%_HV3c{mNg>-o~s5bJ1`Q~6kn1??zKrot?nsFna$ z^crbO%#n4aaIkB^kX+^=(WSub0YI|yz%NDz+yz+u6QPj_O(~_IgyxG-R(ybFq0WXP zofWvVe;Sb21EPbF^Rb$b<^HA@7)#ccg09_eHUKI<=h0V~V;IQ&#j5{{EW8Mq_1lc* zcUM;&0GXSts1Z3<8ZcytHh9kUWfJ+VmLqLJ$JmOr9`na8W(wmth;S{=aLrS>6Hj@I zWs0yh;mj;VXg#~0ym50nU_y3ro!sbuBe8ZwcX3CXc_h%@jc^a@a6dTP+Xo&oQt-5& zM*0K9Y8PPQWWp^0IBAO=PdnM+T4Zu3e6ycb{Q$n1{u(#|1dGsmDbxJFdTc$+a;SGL zM!(~)*{=){I$=7DIOe!7esIf{i1F8r4#VCW`m4Rf_^=m-3N)i|pY%rcYr=OfguLcn zd_vA}xohn%#e=fCCwDGbjYKU-Ztlg;WGW0ocZI9CBilUEZ0`wq^=7btgp7R-KXkUW zI!OON_pQ~%uoDkz-q&!m}YVv1=Y(L1M+_i}H4lL(9>&@0HWVYduv`Zuh+A9>> zv%Php!S(nLGVNrDI8@%nH>h6uig+HM4MRW)a`$XsU~w_ z5W6eFJk5y@)jMW3;WnL;1C zDCJ5(qZJ-+jL0&qwYkSK#Q4Boa$5DLi=k$_@qB^fLBP}WsNlhN1S#|WVEza8fBOoV z)os;g?7S;2evt{&jQ)T73K{?7D@^}zz-C4m@j0nk1q^nf z6cdj@m(y<%Vq;BziO=>8u)Si3@4n~|;(hA8#ac8K5fggAhB_AvaH?VI*7GqOjS5?~ zmvX|*wU?6Md*jFOU{5xZIX4hE3S{1*wOzX@qK1}->kq6u9T-?@pHkq=`wp)euymh{ z2Og?u{q4jz!+~$1AN8lN$MH+#GmII$k-t0q5{@~fAq>^RC<gzU>6{`;H45Q1nDwKxn52(a9y4IW6XX2;g=i-M%706?Et7DVzQYkbO z+H82gT?5v!%*%inB?*^i4ZI40`pK62)+Bi79TA@)0w80sq}On1KM^A|n|?T^JlGT5 zJVg56L_$--$#**#iQiQq!oDN{7$sNs;T_S7sq(q(FG)#l1?7BN0mWceu?WfLj4dFS#}<8Qp8u##T^*XT2P% zOso}d3#3C3xVN2G@5YO0?6|07UQuoGmD`!|gBz{XRMAV*8Uh1gY(DFaR;=|BeH8vP zwB4Wg7lT~6LaUZ47kZmX@Lwm`O?JMAGIcT|&-?ZxdO_VHiH*l&Jm2qQL#MY8({{CE zOiVs?@v?wopn4juN}lWC&e*Ds+Ra;*sjyp&bn}B!k^!MH4X>gh0*xBLUwhwXqrmAK zpmb|MgQ(z0yVmHvGeHp0wT=^QqBm=7*0Bh#su2}y?=4=9f&uxPOAo&3EOI1Gz)P(P zStTFZ^W!5B;u0}XvAfi%eK{3Y3oKsnw6rQx9lqah?ym0)HRnr}HfXa|dr!qXz3m?l zPS)kv?QSdGz!JR7=`4AmNCaC@{IG_l>{%TDSR-PhGZfIk4qg0c@YQXUJ{T*}$Z_^Z z^9$r=tbBsL(IzRmf&AB6rT7DtXgj@Nmi$2l}uCQq!_N3Jih2&xU9b@Hq(E;pFK zW4-(1F~862*e#v-ud=eI`!|l7tVWyxD=* z&!on@6ab0QQ^}}JmQ@>}dRb1!PseC8uBV-9}+)J?4{pA6;a0cc>0sk9F=(AiD(Uw)jf0DnB(cVn0Ysh{kLiQ8V0Z{v>$Ep)u# zUXr;Iy2M5XHw}$AunER8S$F7%v#!tMR0JX34gcY!i4}4NILaGuQX;SN_kd#}@}&_} zjbjV~|HoHt`cECMKPvCK(s{w6{iEGW4RQu?iw91=wowWJIo<{7vMP`my1;IwPL)A? zE_^*AsJN>t6SXP+;3!_!>eAHNDMRws-`(s%u)@DV=>9BjIH-S_+Yh8y4iey)pd#CS zzUQntAAKrWk~nauzQ2oB#DU|uVCIm6Ot1t_1=QVss0Eun0$bQTUu4CAjAzpIHiAwu zFlEJ`(ctg1^Q{Qv;GLY%p4Jaa7!?%egMAPVJKc+8Q*TE3tBGsZH69(nz> z21~V=$n#9V&0LPQaP%v;Lq*I3MUn9!$xtmL1h>q2rEb5$aXkTcc-%h`wEf-|jK4=j zz`3J;uw7qI?-y!tdAeU8$A$(9u>^GGf~Pk8LjTc`#EFdvw=>=sY|<1CmR<2<4;}0o zSqLwlX^k;Dv-I~avBN-#Hl)1DxNtL{(ORmNh*_rj4hT8^yQB?`EvxMgJ1D*EjyPXyZ&u0th#!iIGHIV)z6a z?%PlgjwvrxC9jmEz7x?Xs*c|mY0>Q$Kl2?)fh*T$FEx+LwOCxH08bE5phO&1oI!n^#y;uSHn2tS#=K}YU`$s#FTr(fHouf;}!E;vkJWc*sfU< zD$b_Kh|91qzvE|=VK-3HXf0YFK}4G;5mtgx&ZKTluFG3D18Im}ojtBEEE6h#$|+eP zsNxqOBc4({LB9OZ(lEPGu-xjmxV$YCi*U|;}XZWN4| zS6~(2K#yw-1RY3hyv(&Hjd2}M@XUmBE2^NU{X*ocv1LC;l@9Fcci&9WUht#!qP|B} z7SMTjzoeWD;Mrq%Ps`!{Oqx8<(IWvMX#+x%K@zR324spN`AtTT zDhKOy76Iu*TmZBg6zs*8gMXd3VBc-30PRFv@?ELMxfMPH%(2D1os_}74ZinfC4hD% zaqA_`2I8)B?`<&q?ZH(Kkk^Yj1-5*`AljM;_^>e1t49NT!H7vWW)$lh&!_K%S!<>aw%kL8sj8Cz2<2t} z_wX&oWr3ZSPYK`EArPT61I^zBng6z$CUD+D9b$Via92y|_YkzJMH3h(fltTNg&-TM z3At?~t{YE@e^(edcrLEH(1_IOAt!!Iqr(4LpAT9ALxz<9N{2N^YT!B8gGUTbXkFv1 zs%@1iGrYdEyrWfB+Pbcm6M1&d^!J`r#Ws5uQHnBEQmL0H8i8)E(Kn0)L{bsm_KcZY z7l|1VSqW4!pGG&o+&AnTh=je%SM2DWc>GC1afMc{Oef#tNrI_LCm+2?CqLc0s{=J| z8H*0RmhO92y$^wl9zrmgM)I%Jc97eP<$_hn ztyX7sP6+Pa#>AeFGv~V-i+v-kS80gOu>-@H+8xdd`;g# zvCdcX@lJqOU3!%XXO@ubgWJNVH|*Y2Jv6TEK&6%5@CR$c1-IiLP@2uYz);dLuUKR-Y}M&wffg^E_EyXGi{vc$lUydh(;s=P8;ID-5uHl|4kJ&!pJ}6jQlN31~;Z=l3n!47@s1BR{F_Pxi#W8~#&z zw^J7rEjLRPF$)yjRpOe*D9o;3PapLylO{T|^lw0B2l7-}LHqlrp6u!)ttb*IfXgKt zPrl`I&%C~$;Nh43-{N!B@{2Sp@r+I-JHo{VX&~ zQ9f;O^J>E|e*(U}zaH)%Mqq)L$qH`(W1?EOL@@a*?*XagbD=S2L>IH6I4SOSKY9%$ zl5M;=u<8VrI76dSbn-Qk+c}43xf&4%p=oGbq+M~XK+F=LtU$z016e4{4zL>$#qydm z2J_NpObJJOWA=`#*92oPzQ0VijNq*%?N>n8M+YNG3!)_V>v*x#3OB&44*9l>8|k5U z$>xSD&#ZZ-+RqJ|PwlC(ImT;A+JxAIl8j@ zo87sl-iyzQu?)=HZnCfQU|U?`Lo1v!KJPZ}R{SxVt5{a*3=6uF7b93QP;o0latCr| z^|?j`EfQ;C?b{-durl^-4I29e(w zUG+H;WG+Fll%COXM~RAf_m#-Xh|u&Y6z2{BgT`=t0rZo zPOeCuHp|Ho#8Kq=Qq@G0kb(y*_Z_h;mAK1t1c{a`1nn!19a0xP;UrV*L~sHzJr?Ek zV)Rj;$<*~?s&a8kUO9WEH!laNx@DMjs=;us#1Fg--+w?-9i`x zm-Wth!^vv9@ozEehf-B1^i}Rh>G?JHRd*)Q1SVm`gXXKh-j>2OGcG%$pTZ5`do! z_q?2u8Z2afS42(?XZX8G&dg5FTT7K-o~C@~l#MR=&cDy+j6k89B1fB|ZnG|Lc+_d zJ#*~1sUZSdYkckPrMwDqT@W+84v!hXH0OJj*DR9mB8#`-#Qb8UI_WOYO(UCDxNH_(beC+E>E#$w@~Qfnc}V% zrnzNp)-q==DP|Xx?o5}La<`Z2{GGK%pQ}iL#aC*7Z%tLWoubhQnKHB3*Uor>G4DT@ z{cYU%?uf*(TII0&*p>k_JXQ_KrB%UfY?9W{iAn}i0W#FIpRhR|v^jzPMiFxzYnSP& z!g)r4Oyl|QB+ev7U1}6{`yr-HY_v#otZ8$!YIE!__u2(%4pX&yMkB&W*2T*@`$cEN zA{px#YB##u7Z?8;`aRa6T=y93<|?wZ2qVO%$F{Lsyu=&6N-Jht((ke`r7`r(ViE{W z@*Z3_=dz_h&Ar4K^^;g!HYp8+)>w(Qc*@PytBxF@OPA`ndjt_KGLPhigxwO)m(TQD z;zRlBL$DEy)y;~rF!cTXL%T7<}Uu&SSo>#fequy^44M%(%^Dn zFx6(``Q=gP(T=wRONEP^X7~6nV_jkn$bIEwBWEK-47}z8s*x$$L=VfXx!Bvv;sqgp zXm#51dwsmWDfq#e5J>ALh7bqCq0Q_pNx7YTJCzhQ^ zad3XQWw_R&J-Q~Mp?NcWkA?d1XXSoDPRW=utAczmF#_+iHJmIceGXc}HrAbPM@cc0 zWC;8HIcEv@4k_q(@#!D!?31hWi2915tV#q5#SmCZJ}4U;FM*fA=ayPg#Y|h>CuLs>ii-dl%5XEaLhGDQM z&+8uO#u~1!(G?Bo+AWpD9`3%7W0Dfb(WfJKM8CM+pIsCYSXvQEK$7zSiK%zjxhcn2 ziiASENw+R#&^QFv$C2)~w}x@2BDZ+YZmB?|JuRuq3s2~NtT#`m!Cs-z?VZAIvECBn z^!>9}TC+j#f|~zxButGnxaV`Z(7+|&o~`_tCD)9`WxeBOOK5?U;F@iTg;fzl_#ddH z(2f3=a2bucPCp^~XDOA)q17%wQ$US?)<{>a(BHJ3hgM{mkdG2ufUy^VQ38M+0yyQ{ z9bg1!@gacAFYl819jHWX!+xf!d$+mn*Es42-@PIxh~RQDM*wr$FM$jBukrZ`>VJ zYw1F)Vb^%Am^9VpyPQIEZ#LGk?v-(iYI7^|6=}(Z#wEt%%88fa-kFJK!_!NXh?^Wx z$Vza`2lyjXwTlARUH#Ju4vP|73R(Eo#EIowauIv0@%d=sF$HTQ3+%nQ*iYwd-+8R< zcdX3ChdT5g0PT&%dRguubEX?3sWXlJn5mvN3rZ-gweh3d_x z+7NAQAq!WDsGx+`$hu4&#{C<1VOfV;cUtFa#rM7t3c%-qK>gpBNHD(l>RJH^!A$rT zWTU%={+)_8tPRsw9HulZh3i)Gv0irn;q`+AH0hzLG&9iKw5c4jOPD536S6=V-|vl5 zf+6(B=c!dgGX3>QdI2KUDka>@P#bc%gI9wD{}mMErT5Go(DQHRbm=i7B?)$J)U;202*8;$BsL`c_MmdJLj&1O04Py`??@93V!lWspDM> z$dBD8m8e$mTIs?(pIIWW<cV5PApM~qkcj==_pxh+K+sY zN*VnLzexAEaE8Tcxv{ZV*d7_uW`pie@8JS0q{6HQYb+r4cuAE#_V2f~ebrXJ`fVyw zI;cnJk~L`P`nP1l)H)%1O_7Xgd$m?lCJgvZ)QoM+fDtj}@LpWX5p8~GGKLxx4bGUN zcG&7&^TWPY7E|JsfxELm?EYr19QJ+rKT?DKxiecQKN|MuAFqn|HakjJ*9!JHn>Hg+ zDtLB1f6())?k>gN-l!Rkl9zGPk3J~R?pya!Li=%>!JE+rAHkF6_Gm33ACjw32+?)9 zoTa=TleidHqp*YhPHRq=6`+(?D> z#ut_18=}Xs9*v>aDXQN%B}GQ9#3(e3-`ic4Q{jpXKb*I;%c;9i)`@*}h4GsYbRAD_ z?qu4`E6|!vzFe)z4H47?f6!k{yv^*?`l!#{+PD9qy9Y2LPh{IzrKZoH)Li;zo*yKp z4=U_E%3+__IQBAY`2KX}cA2vb#`>ZI^6X}>&!HDK5w&Y0C^gqfo@#WYi(3H|))A)O zZ@+XxzX%i8QJq}Ukk`TF$cTFrHo~OXFqfj1~m@osn)c!b_M&$`Xl}USC;oBkZ+uz*))5_xe^xN1f;_*=_!}gwA_Tzt~)=dU6HX zGUWlhL>WC<(I61xC11{XEcIN;V5F^R$MdkH#y-R>E;&T202HKA5AP+ zX`#f0?jaYe8YdcP(i;%2KW6C{Ckh%9@zP)?On@5NfmzmX8mt*BN>|%Ppae2+6=?ou zGwA_3ADEir!qTH7v!lb^u>Fa_yP-Ni)+@^F=gpK3FM(C3v)9iu%_^Kr2| z%;^o=vokRhf^odTHAMGtO&^@*GDClT?BhrgOIQMw=fZ{xfy;p!%6VC~>%yT@Z}B^o z@)?3w#=~>Y6uVr*1EFN;^>;%E_(ih#nMCoWu5yJaF_ieT)8T&rO|%%>yFr0tuy9AAuHN`eISW%agYlhVm@rNyno*`@!`0 zi9-J*&X7o1u%&n7&K|MLq{kS!``(Vm6;1zRNcDziKn{*6!6k}0{~{aw$(5Mr32#&? z{R%<5i@OJUPwC3{$)}y`!%C~G4^IKa2(*C{N#}`8kxIoB7`_k-1B+l4OGU?T;A;rz zr-`5<%BJL73Ix*jrv}b-&8fBi1T;R>AaIZuZgEuV)+g>0o+AFjhB`i`^swSk6d`4- z>$K(KPynAQ(L+p={3Rb;{78VXI>|#$lj`@R{D|av%DxT#>B*kjFl`Od;@`Vp3@2qtpDCH)_v~{&`*ED zNG8nHBv+)$;3WoPxp2Xf#cwk4LN@V=)9F($1tGgN zW2DJQd2>e2wdtQ9MPuEOFo&>L*H2b&gh0#qcx}r za(sb$c-+yAiCPU{dN4t-`f+z}jj1qxxkK#0`jv_9;>LCbiR9^K1MaX|U1blfs7xb7W( zAt;>d!Hz1Mg~ENlJ#KN9V-=={t%}T>YE93(QcT9+?~0?eB$eV4O>OJlS{$kemSKeH zZFN*q)`)nL_C5djG?pDu-$o^rm(RP>J)k-TM=!bV~fzzI%gL1PksmiaG=L5BY z;RwhgEB8;wHpY7K4}^#!*>TZoln~?|U06 z9^fxKh12w9WYfjNC?zZ!{`ejWp+J`S%Pf(7(@ciiZVN}r-eg(mD}g0TfBm^$5WZ**HQ5G1WzL4Hvk>j*qVd z$csOH%6eu<$*^XPv+tMf2Qt}nQ8^O2{?qz3uP)HXRy@wCg3 z1Hcz!ja}T&eES}Xk9X0F0!8sfw~%ju-Ka8#Rl?9bsaB0YBPWGqZYjVLsjKu&e==QA zq&j^7kR&YuXN#^tP=Ay4qhoi0XKK;^g|I#;mb9y%H!^xq3VZ|zo0zVCJa7kGgh(c@FIm|M~@=k0k5y208{KS?73jJeM3&=gRO;6zLsNV8fY)Bs6czoc4tn+$J(=)MLo7yDu7|g z*ktyNFQcoD#<@s8g6jKw=&&6f4^ojjS0E{;=dP^FSPe1PD1u4iIy8GJ_iXlz(E*k% z7xWTqX$i^v7+!5DC$$^|l>zQlIu$Sux1?(tXu4itX}VgVZ~9D@aE}wE1w2#Q@1c6q zcSikX&H;P-VQqCP5RM}2MqFiaDSPG)NP(KamM2SVi5I(Q_%~fPfHebSejjT%eT81$ zWj$WzBs1j?4S2mQ8EgrF#K~e8K`&4*imtyufF%lG0f057=Jc3Yy~qX*ifrRS=)P!; z)ZZ(fOvF((Fo^r-eGBJVFNR3KE#H`)CjwaakM#kS5s$_sb)CJlsfhe`hHVv@o$4z6mmA?#I_B0J*i6Oz!ZQtd zwbIbcpDTV!#e8dQAp2S}WN&c=UTpE`A?3OI>KrGZg**t?TGXU$WO}0zNJx9YBZz;G zuu>xQfAaiiRq^^FMj*7=b9R{{3D!s4V&HC^I|0j0Smg265q88N5+TG8kb&D1$o^dE zlm}ttg^0zHoAA0|#OLw@ox&9h2NC4bK_X@Fn+c=J6JFJyhe;{QxU9-P8xji%G9wX| z$1&t%k>ktHogI??SC@}<0E4a>5CA~#FN+1?fA8`!aEHpv&+03z{)x{XghP3-UFt!29^^8#PaELS)GEjl{k%#l1qMAlJ$lQ$V=(6+^*(g;WdD1L_0Fd+vTBWxPz0B;X`z(SXd6trnjgcBz1e<%XZygUt5Ey zgEnf{&@!(}Dk2JRsWt{6iD`nDi`}Z`-0uS}6-nTmN|EJAQ(IFubyl%iD~FK0wAn<< zuKQYn0S2M!ZzQQcN5~gx_^G(dI&<56<^CB^sk|lrH-R}&tsTR#ewb1_8Jo!9HJo!ZBVPv)TR!rSDm$cjH zC1v~v=OkCCKS$>qM#%B9R@0!v=Hu1-Nr2&QjFI~aMuS*#sJ-}WSJ4y*q{o6AdQuW^ zVA3&=B$D*3(ztz$q%&V0>wGV487$p35&(-cNL;>*<0YU(QA}K*i3wb3#)OQNDHUiU zkzuu1F~?(SWpQ%oPr*E})wtu zn!budjST|u0-2;MK3HO|kmZx5QPvu;sT@3O`qVa8hN_?ZR=2;=`84Rmzi!jbhSp>^ z+{hF(!U%9WLo7b?DOyT&PX$~QEkoNNPizkb-+Xa+lB;zQ@?f|ols~Tgt7Lcw#ti$K$)YH-FVK^Q zP-Dj0NU0!aNbfP#0G7F;M*lzBtm`vdDM(U@6b&W>g z4c&?N zymu4sk{o-yUcR5&fW#8u2cJ0TEvMkWb7p?f`9Mm+Plew7BqjQ;Ur1t?fy?wLo!j4_ zuw`Dx(#J~ATkMt|AkQpA&z#i{RoG>pwx>M`;Fy{Rmsp#JjBm$6P+9y$f~VHnrwSZW zIGXcW#PjWTV&@oWWyd+-!Lw^Lv*D!HoTP%1kUoQ3@vF*<=q(m7in-V7T1aYdn95K* zWs+x`C5DA0mc)SMnzx6TE%!Ug)2+|-IR1PMCg6Sboj!+_CPZa1Us(cKfzRiNb{hCN zBmdifC+xOJDLt^arkz?2#p#;cnYqW!Pq zZjZyP8T=Q|Pyp`#%5n66jJw|<7pXY$pZ7%P2_=}V3@C{08&c4>zzo+Tf0rg}yXCIA6gH?OIX^GZg~!3nx@=f>V$%`Vv_)W0XG9j5!E z!F}+J1V5I0GHI|ByVK8RNPVN(xY7|uQ9nwsq{rtT#e7M9JuegqH8RmIhH)7NhGkYs zn#m|hGf&$XBAw8ofli6W1AASE*$RjwV04&`NRIw{sKFy234*9VU1IBIH=&;Dn3w&f z{1*C7XN$akMgw_Co)6p)VF_1_nJg=0*S$*JleO(V8lMhVd#95mVX@X}aLn=3Cch9N z*bI&pLV?NHiEnN5_woza7igD8#t#jxyf(0TI=i4Ct5Msv6VReDU%*~ zZjF=1+~R(F`<$Crt*<4B`lktD{>XuVs8dZsJX5w&e;WX*=wxiV1)RwdO(~kQ3sDYO z;(#W|DBxnSoXmj=`pPzSs;K&kIQzxAk#{M0VUKN7axzsZ)`H z9jA96Ba%XO1=SRR7+$K*{sO7eqdw_QKA6uu;u>=E^+?M9vhSP}nkMJD+;c9K2#A8G zsZbQ&?Zf%ryi-9a1!w6b&qgVgFo=tnsi7nc{w+aP)BD#=Nx1_!!u>5E*9W zf>sQ$;Q{{>KJUeu^`%w~iF)#?Qpl|uJl8H0LN$#l?Zuh9Kg_c#HL4noPs-D4ygUdO z(8U~=o6<-{U0N>Xu4hq5D5Z3ia^p~Bvml17gCk-#&pJYVt~L_V4x<=}{6|^R3B^1W z-ifwU>}HkT!biN%ZjoUrYsSb77p3BNj;0SNJEbnBp-iIH0Hu~@K2=`mRjfSVdSz;? z7`)$^|GtoA)=+w^6=BwrXV+f^qgBArxKvtmC0*U#7HpoHgo{WSHr<#dbJ@1TJ&Zdi zey}TFicRm0KzR873Ndy`Z}px60szSVLR|k}>`ey)J?sD2n^y5t(HV3oK`##|BI4*( z>O?v}2&p7)fz=(UQ3)7{6uVHFrpH$&`-VWNqtLT1GhZCf=kRdNUF$e)bh1$8bhAYO zV>`4JJ+~h|pOm@w0q1;BfBR%+fyF3t8+mW0UDh9&MYl>*FGh7c{>F{tw|TITmx!YT zDtI{SQ8m-x7x`g?ji#N_(<1H90X=(O3Y6iLEfkCA*4?;ZZF&IE#!MMA0u_NbZd@5- zJxCfMX{Nl&`^vO&g{wu>d`(|*?LLM;uQk}DX)*gD( zrvoIzh8DxQ5=*&)Q)hEgHWd!?oV<4VmIwrh#xj3?X;tfIg-4h-*2_DXFvPemA6a4l z&#%=^eW>dr?W`QY!`@62`(4G+GS}uev{k#ccZFStuCuD5bkiR-kur9Sl^AgcD6EbI z4v__&l~RX5I&|9CQpFM23d~29x(HdA;W$i`z&z+b)|l@eUkR?4&lo@LE@syMfjzgH?~@*&g8|#+kh!zq z$`@-sD2{Rkr}?v6E1{-hE zgJ~f(-!PQ%wBO_rj}F9m6NMy{+72G4axH{Hnf_1jvY$i{U=adm4swkG#>Y)F{~BIC zA7j~6Ub!gb3pbqS=}zpTDWJq)0eu_vcwn36tmNtN1-p_ANIGNmR&|u>lR%zl7Z#kQ zz(z5#sVft;r19|BWk1GHKgdx(%;qEr2qUA^a3ilUHzTzFbY-jF5v+p>T6;S#H_SA? zV9#I4M0fTl;QuOLg*TT4!C(2F|C-eJ|Gj)I%>JhZJy-WDSOl=$E}1(CqpCv=j%MJS z-pStmLVT3@LUT#tZJZ4XNIQx_-%i0CAFb=@4Uxs_o>s(45LJI@&@z-zT$T;ePRD?U zX?T&?APPC&!iES^;^1@Y?YP=f9jzS}o+Z`D5&@1^Aw_jpHbrDKph7}r70zgCGQoc+ z2nv&;rjR?%xvL@$oNqFmJ7HQEo&gVEPXRD6AY_hX>0;!UrVWIFjHtAN9_Amgxk+P#+YP27AWW-sd0e!>=XRCthNDKUHW+XdlJUMrf0h4+%t# ziQ8}S-lsFw-Z?cGm5);ujRW#}ueUo9wNg%G+QP>B5kK|tEeD_HGL{8gnPAlcZ$ zfWb!Kn$_SrITRR4xVDtWFup>i=6Y1$-!smuij_%gd|+5Bwqhy>ZK-&w}KYJVDth;|17`2m*`CY^ti3w+{9$)tk?kk8)dlO4JW{Vuox(D zAnrp2(zk~zw{?W$w=7DC_wH!-QH{^QZu9z9xqAAya!jf zS8(Pg4J_`^Ls}_=|JP{D?nCa6aS3^PA9>n)XSH>}5&{txB@c*!w0?eBamlzc^J3Gs zT5%z@w24mLyK=V~Xb1$|#xm@_I3Ys|zWUx{oy({2<$Oj8Egt#>8sCO_Zo~ZXw zhyY2~_V9We?D;d`?(!g!)mdmV@{gl8HTzEtV%6PoF@vS^##5PjGP;0_T;-nc%QD?R zUaFaNFet#-TQ#_kdNNWZv;WcAnLtCm{(pSPE>g)dRCcmVlF3>jVrH@=%Y-mOWSKE` zN=kMH6WRAY5m~N%NtUcJl$|VNk1Xl0@E^BdzdLh(_o{p6obUO5=bSm`_5M81^L@@d z&*$@eJ~ErOy{k@s@ymF{tK(vs>}lw+((+`7Y0J9de56LYP{;(3NwB;@EgUmT2|L+( zXs*iNqG#mOr1uOan(DbphgE?iH49mhC(xolbDW+|H}&O72}PBtTU3;BI)k3tDG-Kq zR_&Z7enF#`S}PvRzKddgx5KcgL8Y3wPI@VLj(%~d+{aDTG8PZ=6~x%ACsYR7HBC z@z?nt4&7mY80?`J^Ki(&k>XaVmQ(7v_Uui=Zpph`AZei&deoh>!K{*TyE@ zJg+*+pn0v+d7*2ETzCc6whPn<5Pf1^X>ErYENoVEYjDB=McSNgT$5B%mMg`=BQHzU zRL{4EKjyf0c2WHSP%QH8T0$4O-H}+)$bq$RfgHUPDtF7YK0O(7h%=pU_*4zPtHMkU z7!qPP23dYWhc3o>N{3NgY9^HF^myYC&$(3>eQGD-YURx=*6F*fxJ}eeJf{=BqbTt# zNN_i*Ea8DFINj($S1~&d&5+vrwD^m;Ii3+6+Zhwxel)7gh`!bNYT{J$Y-6Id9!v6! zcyK~V_|!rLsM}%PQ3h0@-|FyYk3k01q~Go^AIQm?Z_AQjeIoyGsp^!I)c5W$QZ0^6 zztet_mZ6pWT&#T@sN2_v(o6z3oT7E!juHKmB_Jz3%QkiFnnO>l)piSdioNxt^>u{`+vffXIv=qt4_86+M`>2D0*W)aFRN;v%N9hZ)3122uT{r+ z6+yVGgR7X8YRlERr-Q#ThfUWB09RieV{rS%kw&KZf`!3tFFBOT$|#p|XwbP(Vb~^~ zYiM^+%x!t*TY{(wrb+3|#_II7$o%TWx5|x|Ss23GwStrn4K>+fctLJ^J}Oo0^DD5fR3q5Af&*02fMu=aU+My4M6A8v*wq#{dOT!PV3#Uiil9 zJCsP|tSQ3H6M*Avoa-9Sxg;$YK!%aZTQ;!FJ9H)}WM_2L;XXE^GEoxPF@>`Zipqq$ z^l-qJByV71eT1^EfiLIAxL0youAX^yd-Aeekx&Z+Wi)#E@K?jcckASU>0QwsI7Fu5 zq*1rxWa@%8vdhQy6vm}g@k`k zzL8s5oN;*g`cCe7fvTcym**};71zI(D*MjYP+eLn?aB>d3(RXfju4;9=Z39ac*}{% zR_Blq4n84~u_{z*uM2umpZET)p)Q-@W~6-{XRf_-La`=e_|r9}WVp~=(uY?0B6$%3 zagIojk4ukUGxYfP$R>FW*twYa#IsWa9jP`bYwuBqGqq^0jBLaTB*=s$leuqqd<6er z$dcu|V6Kk#iP?D!SKy1w0s#m%W00*~~S_-DAnVi_XF6{`;`BHNLh^L0&#L_~<=qS2HSnF}C}V^6ll#cB#shBv{!M zlr0}bXQO>*(`%Tcj5W$bDO3JT;xkoFXddmOjb{^Y-clyRbgA66!$0Fyo>p!Pm(&<> zOZ{dT2yJ;hY^`DP!ojR0E8CcP#%#DTAShxs0?w(A1eZA(;lgtAtED0dRkq2zOrZ{jG4hh<+x%zSIP|e6nPwwm+SEeikMVY!RMkrk)i~zpCR*0y zO~6#=&17k>27Y)#HnyZ^_+`RqFL<`YCh!Gw-^)qGnEsk z=mM_dp_cds%9&FZis^$jI-@vqudnj-K>`b%XQl2G%eDhm(lLSQ6nW>MZa0re(zMl3 zjD9?+cyF>wlexn<^S#icJH>1;y}^FZ;|v#rEM=l8LV+soDOYy*$P6Pp!4!k>23LT0 z7WvITpu3|SO?}&B#GQrY6l((gPN^u~3d5#cPp1jFxFAS7kY-zekf-LC3N79|){)$c zH`{SjM(LgB4{?321)MPuvM!L}h(*`*4;&FS@}*L|5!OsL(-(bJ>pA8zdRDpG9iOX> zs!YL~pBNpee|7v82x;0?KTzL_Cda?<)H1F&OT+aUJX8*SdWtVy#eZy#xAb`b!=}51 zD)h?3)ZrG(5ZAeD>w#HEwCJi=M_GikO1tk{W4%Y_zi}8vaKe|eoPkpsUw96>Ds$qEwg@{U@n81 znZP-Yw@%-5Y{r7~O}MEt2b(ZH@WsOSL7_Kb6RxByiD8YAHh#h$Ehk}*mgm5ggewwl zyT44%jNbQ$F!^oCH*vvH(Jj#f4^JFhV&a0=lhbDA8iLfdv5~{LDTgbeEo9s|{kSA# z^VBC~_jH1dW~$wGcP9nZN84N5Q2fMwcN9N6B^#M+wT0Vwj7I$J^S`awKcdlik;>kJ z=eWn--1s?vWv6`aGrkh=cobn}8Qzn9($4|*P&|Z5RZDHV@-^FzajtYL)x+f8=eZs`6Z@jtERq* zeGOz0)!Iebz3=t5;i-Mv-5({gIUD6`z*tL1hUSo^T;By)?TVe0z>|f-wr-zO{$Rnh zJ33%Hj@vP8OEHQloA4@_bFnjm&`0P|MI;6?UT0kKtV;`ixA_b-T5@?&kGHx4fq<`(!a>sqGcvyJxVbb^p>o%i8se#!+rBq9#5G(4l$LabY`?9WE)HKg?=cY8 zI8W13Xg5STG8f-9{-Cag{f=mPQI zR9nJ|)_`hppyVBwgqm@~BbnE5o)O(+&Nh9_wL!1YIcM~z`?TOq)+!}T1@cW8-LrM4hDraQ*&UG5{OEdzm%vox(7g_jA?C z-|tCW#ryX^STuk+H_w~%t!naj2veF1VM^owFN=$iRzvzgmc51Rk2*3WSQ}_=|2~%1 zGUs>fe`FA2_m9B5a(;J2g0L-?PcT}P1UpF(^Y-WwnErD{fX@T3)b$FAJp+f3|IkxI{1E? z7-F(L`!AABz8Ajy8vy`!l?T6f_FpvjzJM?Ve;G-F=@^3PVk81iocmP)P6&j}-{Ai{ z*8T>Ms_pTVBH+Uacn}FbQt6-I-Tozi@sp^&Afb-~*!DfU#O=?j^K<@zEq{>d>X*%K zHg0s^h^7Mo5=8fldmn zZvv94t0Zsz5&=$%L<$blm4GN z<5y<_(&X~QeDVkXh`;YI{HG1@zZt8D1%RIXBLVyQtB3^v1TCAGq<=mJNRM6;3&3am zBLROL#3YvSs~tfa4oECxuU-1u`jP~C@ z(g+t~{@3bX<^QSMf3)|{Oeb}R6Qdyw2cmyC$N$RSpFv4otHe-r<3UhTN9$jaf7a5Z zPDf&L@9P7}-(8UZ21)86)AvoZNd5_{R$U*O-)q|Ahd;-)c5M NDm?%|@qYi?{{wb!TX6sY literal 0 HcmV?d00001 diff --git a/puredata/sound-from-earth-workshop/newstart.pd b/puredata/sound-from-earth-workshop/newstart.pd new file mode 100644 index 0000000..c4bfac7 --- /dev/null +++ b/puredata/sound-from-earth-workshop/newstart.pd @@ -0,0 +1,125 @@ +#N canvas 0 35 1536 744 10; +#N canvas 264 376 692 351 radio 0; +#X obj 333 282 spigot; +#X obj 382 267 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#N canvas 676 408 512 395 buildOSC 0; +#X obj 319 66 t a b; +#X msg 456 84 [; +#X msg 34 327 ]; +#X obj 68 236 r X1; +#X obj 98 236 r X2; +#X obj 128 236 r X3; +#X obj 158 236 r X4; +#X obj 53 266 f; +#X obj 34 126 t b b a; +#X obj 254 345 outlet; +#X obj 140 17 inlet; +#X obj 188 236 r PS; +#X obj 88 284 pack f f f f f; +#X msg 319 112 sendtyped /note/onoff f \$1; +#X msg 254 141 sendtyped /note/velocity f \$1; +#X msg 88 307 sendtyped /note/x fffff \$1 \$2 \$3 \$4 \$5; +#X msg 73 199 sendtyped /note/id i \$1; +#X msg 167 170 sendtyped /note/pitch f \$1; +#X obj 140 39 unpack f f f f; +#X connect 0 0 13 0; +#X connect 0 1 1 0; +#X connect 1 0 9 0; +#X connect 2 0 9 0; +#X connect 3 0 7 1; +#X connect 4 0 12 1; +#X connect 5 0 12 2; +#X connect 6 0 12 3; +#X connect 7 0 12 0; +#X connect 8 0 2 0; +#X connect 8 1 7 0; +#X connect 8 2 16 0; +#X connect 10 0 18 0; +#X connect 11 0 12 4; +#X connect 12 0 15 0; +#X connect 13 0 9 0; +#X connect 14 0 9 0; +#X connect 15 0 9 0; +#X connect 16 0 9 0; +#X connect 17 0 9 0; +#X connect 18 0 8 0; +#X connect 18 1 17 0; +#X connect 18 2 14 0; +#X connect 18 3 0 0; +#X restore 413 286 pd buildOSC for all; +#X obj 112 210 o.io.slipserial; +#X msg 138 98 devices; +#X msg 209 98 close; +#X obj 112 189 packOSC; +#X obj 112 144 r OSC; +#X obj 112 231 unpackOSC; +#X obj 112 286 routeOSC /hello; +#X obj 112 309 s HELLO; +#X obj 19 171 print OSC; +#X obj 19 144 spigot; +#X obj 68 129 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 413 309 s OSC; +#X obj 413 255 r NOTE; +#X obj 333 309 print NOTE; +#X text 414 234 /id /pitch /velocity /onoff; +#X floatatom 636 254 5 0 0 0 - - - 0; +#X obj 636 276 s PS; +#X obj 629 169 tgl 16 0 empty empty hello 20 8 0 10 #9c00fc #f8fc00 #9c00fc 0 1; +#X obj 629 121 loadbang; +#X msg 629 142 1; +#X obj 629 196 sel 1; +#X obj 19 282 spigot; +#X obj 68 267 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 19 309 print HELLO; +#X text 14 12 * a wireless "field synth" - based on 'esp now' protocol, f 14; +#X msg 629 217 2000; +#X obj 215 262 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 299 144 3 0 0 1 device\ id - - 0; +#X msg 299 164 open \$1 \, baud 57600 \, pollintervall 1 \, verbose 1; +#X obj 216 226 print info(\$0), f 8; +#X obj 226 303 outlet; +#X obj 209 15 inlet; +#X obj 209 36 tgl 16 0 empty empty empty 0 -8 0 10 #c6feff #000000 #000000 0 1; +#X obj 209 57 sel 0 1; +#X msg 258 98 devicename /dev/ttyUSB0 \, baud 57600 \, pollintervall 1 \, verbose 1; +#X connect 0 0 16 0; +#X connect 1 0 0 1; +#X connect 2 0 14 0; +#X connect 3 0 8 0; +#X connect 3 1 29 0; +#X connect 3 2 32 0; +#X connect 4 0 3 1; +#X connect 5 0 3 1; +#X connect 6 0 3 0; +#X connect 7 0 6 0; +#X connect 7 0 12 0; +#X connect 8 0 9 0; +#X connect 9 0 10 0; +#X connect 9 0 24 0; +#X connect 12 0 11 0; +#X connect 13 0 12 1; +#X connect 15 0 0 0; +#X connect 15 0 2 0; +#X connect 18 0 19 0; +#X connect 20 0 23 0; +#X connect 21 0 22 0; +#X connect 22 0 20 0; +#X connect 23 0 28 0; +#X connect 23 1 18 0; +#X connect 24 0 26 0; +#X connect 25 0 24 1; +#X connect 28 0 18 0; +#X connect 29 0 33 0; +#X connect 30 0 31 0; +#X connect 31 0 3 1; +#X connect 34 0 35 0; +#X connect 35 0 36 0; +#X connect 36 0 5 0; +#X connect 36 1 37 0; +#X connect 37 0 3 1; +#X restore 21 92 pd radio; +#X obj 21 113 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 21 71 tgl 16 0 empty empty connect/disconnect 0 -8 0 10 #c6feff #000000 #000000 0 1; +#X text 22 17 // + Sound From Earth @ Sandberg Instituut \, Amsterdam + //; +#X connect 0 0 1 0; +#X connect 2 0 0 0; diff --git a/puredata/sound-from-earth-workshop/newstart_example.pd b/puredata/sound-from-earth-workshop/newstart_example.pd new file mode 100644 index 0000000..ef847f1 --- /dev/null +++ b/puredata/sound-from-earth-workshop/newstart_example.pd @@ -0,0 +1,226 @@ +#N canvas 0 35 1313 593 10; +#N canvas 0 35 1536 744 radio 0; +#X obj 333 282 spigot; +#X obj 382 267 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#N canvas 676 408 512 395 buildOSC 0; +#X obj 319 66 t a b; +#X msg 456 84 [; +#X msg 34 327 ]; +#X obj 68 236 r X1; +#X obj 98 236 r X2; +#X obj 128 236 r X3; +#X obj 158 236 r X4; +#X obj 53 266 f; +#X obj 34 126 t b b a; +#X obj 254 345 outlet; +#X obj 140 17 inlet; +#X obj 188 236 r PS; +#X obj 88 284 pack f f f f f; +#X msg 319 112 sendtyped /note/onoff f \$1; +#X msg 254 141 sendtyped /note/velocity f \$1; +#X msg 88 307 sendtyped /note/x fffff \$1 \$2 \$3 \$4 \$5; +#X msg 73 199 sendtyped /note/id i \$1; +#X msg 167 170 sendtyped /note/pitch f \$1; +#X obj 140 39 unpack f f f f; +#X connect 0 0 13 0; +#X connect 0 1 1 0; +#X connect 1 0 9 0; +#X connect 2 0 9 0; +#X connect 3 0 7 1; +#X connect 4 0 12 1; +#X connect 5 0 12 2; +#X connect 6 0 12 3; +#X connect 7 0 12 0; +#X connect 8 0 2 0; +#X connect 8 1 7 0; +#X connect 8 2 16 0; +#X connect 10 0 18 0; +#X connect 11 0 12 4; +#X connect 12 0 15 0; +#X connect 13 0 9 0; +#X connect 14 0 9 0; +#X connect 15 0 9 0; +#X connect 16 0 9 0; +#X connect 17 0 9 0; +#X connect 18 0 8 0; +#X connect 18 1 17 0; +#X connect 18 2 14 0; +#X connect 18 3 0 0; +#X restore 413 286 pd buildOSC for all; +#X obj 112 210 o.io.slipserial; +#X msg 138 98 devices; +#X msg 209 98 close; +#X obj 112 189 packOSC; +#X obj 112 144 r OSC; +#X obj 112 231 unpackOSC; +#X obj 112 286 routeOSC /hello; +#X obj 112 309 s HELLO; +#X obj 19 171 print OSC; +#X obj 19 144 spigot; +#X obj 68 129 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 413 309 s OSC; +#X obj 413 255 r NOTE; +#X obj 333 309 print NOTE; +#X text 414 234 /id /pitch /velocity /onoff; +#X floatatom 636 254 5 0 0 0 - - - 0; +#X obj 636 276 s PS; +#X obj 629 169 tgl 16 0 empty empty hello 20 8 0 10 #9c00fc #f8fc00 #9c00fc 0 1; +#X obj 629 121 loadbang; +#X msg 629 142 1; +#X obj 629 196 sel 1; +#X obj 19 282 spigot; +#X obj 68 267 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 19 309 print HELLO; +#X text 14 12 * a wireless "field synth" - based on 'esp now' protocol, f 14; +#X msg 629 217 2000; +#X obj 215 262 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 299 144 3 0 0 1 device\ id - - 0; +#X msg 299 164 open \$1 \, baud 57600 \, pollintervall 1 \, verbose 1; +#X obj 216 226 print info(\$0), f 8; +#X obj 226 303 outlet; +#X obj 209 15 inlet; +#X obj 209 36 tgl 16 0 empty empty empty 0 -8 0 10 #c6feff #000000 #000000 0 1; +#X obj 209 57 sel 0 1; +#X msg 258 98 devicename /dev/ttyUSB0 \, baud 57600 \, pollintervall 1 \, verbose 1; +#X connect 0 0 16 0; +#X connect 1 0 0 1; +#X connect 2 0 14 0; +#X connect 3 0 8 0; +#X connect 3 1 29 0; +#X connect 3 2 32 0; +#X connect 4 0 3 1; +#X connect 5 0 3 1; +#X connect 6 0 3 0; +#X connect 7 0 6 0; +#X connect 7 0 12 0; +#X connect 8 0 9 0; +#X connect 9 0 10 0; +#X connect 9 0 24 0; +#X connect 12 0 11 0; +#X connect 13 0 12 1; +#X connect 15 0 0 0; +#X connect 15 0 2 0; +#X connect 18 0 19 0; +#X connect 20 0 23 0; +#X connect 21 0 22 0; +#X connect 22 0 20 0; +#X connect 23 0 28 0; +#X connect 23 1 18 0; +#X connect 24 0 26 0; +#X connect 25 0 24 1; +#X connect 28 0 18 0; +#X connect 29 0 33 0; +#X connect 30 0 31 0; +#X connect 31 0 3 1; +#X connect 34 0 35 0; +#X connect 35 0 36 0; +#X connect 36 0 5 0; +#X connect 36 1 37 0; +#X connect 37 0 3 1; +#X restore 21 92 pd radio; +#X obj 21 113 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 21 71 tgl 16 0 empty empty connect/disconnect 0 -8 0 10 #c6feff #000000 #000000 0 1; +#X text 22 17 // + Sound From Earth @ Sandberg Instituut \, Amsterdam + //; +#X obj 491 537 s array1; +#X msg 537 450 const 0; +#X msg 550 494 sinesum 100 0.15; +#X obj 73 424 s NOTE; +#X msg 73 375 4567 1 1000 1; +#X text 94 344 /id /motor# /speed /onoff; +#X obj 73 290 metro 1000; +#X obj 73 264 tgl 18 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 73 312 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#N canvas 0 50 450 250 (subpatch) 0; +#X array array1 67 float 3; +#A 0 0 0.0147026 0.0292635 0.0435427 0.0574025 0.0707095 0.0833355 0.095159 0.106066 0.115952 0.12472 0.132288 0.138582 0.143541 0.147118 0.149278 0.15 0.149278 0.147118 0.143541 0.138582 0.132288 0.12472 0.115952 0.106066 0.095159 0.0833355 0.0707095 0.0574025 0.0435427 0.0292635 0.0147026 1.83697e-17 -0.0147026 -0.0292635 -0.0435427 -0.0574025 -0.0707095 -0.0833355 -0.095159 -0.106066 -0.115952 -0.12472 -0.132288 -0.138582 -0.143541 -0.147118 -0.149278 -0.15 -0.149278 -0.147118 -0.143541 -0.138582 -0.132288 -0.12472 -0.115952 -0.106066 -0.095159 -0.0833355 -0.0707095 -0.0574025 -0.0435427 -0.0292635 -0.0147026 -3.67394e-17 0.0147026 0.0292635; +#X coords 0 1 67 -1 200 140 1; +#X restore 424 191 graph; +#X obj 325 509 s NOTE; +#X floatatom 325 353 5 0 0 0 - - - 0; +#X floatatom 325 399 5 0 0 0 - - - 0; +#X obj 325 377 tabread array1; +#X obj 764 471 f; +#X floatatom 755 437 5 0 0 0 - - - 0; +#X floatatom 801 435 5 0 0 0 - - - 0; +#X floatatom 764 493 5 0 0 0 - - - 0; +#X obj 714 436 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 325 271 f; +#X obj 364 270 + 1; +#X floatatom 325 293 5 0 0 0 - - - 0; +#X obj 325 314 mod 100; +#X floatatom 702 168 5 0 0 0 - - - 0; +#X listbox 702 269 20 0 0 0 - - - 0; +#X obj 702 247 list; +#X obj 702 189 pack f f; +#X floatatom 739 168 5 0 0 0 - - - 0; +#X msg 702 225 juju heerko \$1 \$2; +#X obj 325 420 * 1000; +#X floatatom 325 442 5 0 0 0 - - - 0; +#X msg 325 480 4567 1 \$1 1; +#X obj 325 186 tgl 18 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 325 232 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 325 209 metro 100; +#X text 384 100 scanning & loop over a array; +#X text 464 401 some array goodies helpful; +#X text 695 134 what is \$1 \$2 in the messages ?; +#X text 692 408 understanding what is [f ] object; +#X text 89 225 basic motor driving; +#X obj 1026 172 r HELLO; +#X obj 1026 236 unpack f f f f; +#X floatatom 1053 258 5 0 0 0 - - - 0; +#X obj 1053 279 / 1023; +#X floatatom 1053 301 5 0 0 0 - - - 0; +#X obj 1055 441 vsl 50 100 0 127 0 0 empty empty wind\ sensor 0 -9 0 10 #c6feff #000000 #000000 0 1; +#X obj 1053 322 * 127; +#X obj 1026 194 route 6002 6011; +#X obj 1151 286 unpack f f f f; +#X floatatom 1178 308 5 0 0 0 - - - 0; +#X obj 1178 329 / 1023; +#X floatatom 1178 351 5 0 0 0 - - - 0; +#X obj 1178 372 * 127; +#X obj 1178 439 vsl 50 100 0 127 0 0 empty empty light\ sensor 0 -9 0 10 #feffc6 #000000 #000000 0 1; +#X text 1075 128 getting sensor values; +#X connect 0 0 1 0; +#X connect 2 0 0 0; +#X connect 5 0 4 0; +#X connect 6 0 4 0; +#X connect 8 0 7 0; +#X connect 10 0 12 0; +#X connect 11 0 10 0; +#X connect 12 0 8 0; +#X connect 15 0 17 0; +#X connect 16 0 33 0; +#X connect 17 0 16 0; +#X connect 18 0 21 0; +#X connect 19 0 18 0; +#X connect 20 0 18 1; +#X connect 22 0 18 0; +#X connect 23 0 24 0; +#X connect 23 0 25 0; +#X connect 24 0 23 1; +#X connect 25 0 26 0; +#X connect 26 0 15 0; +#X connect 27 0 30 0; +#X connect 29 0 28 0; +#X connect 30 0 32 0; +#X connect 31 0 30 1; +#X connect 32 0 29 0; +#X connect 33 0 34 0; +#X connect 34 0 35 0; +#X connect 35 0 14 0; +#X connect 36 0 38 0; +#X connect 37 0 23 0; +#X connect 38 0 37 0; +#X connect 44 0 51 0; +#X connect 45 1 46 0; +#X connect 46 0 47 0; +#X connect 47 0 48 0; +#X connect 48 0 50 0; +#X connect 50 0 49 0; +#X connect 51 0 45 0; +#X connect 51 1 52 0; +#X connect 52 1 53 0; +#X connect 53 0 54 0; +#X connect 54 0 55 0; +#X connect 55 0 56 0; +#X connect 56 0 57 0; diff --git a/puredata/radio_spell_workshop/o.io.slipserial.pd b/puredata/sound-from-earth-workshop/o.io.slipserial.pd similarity index 100% rename from puredata/radio_spell_workshop/o.io.slipserial.pd rename to puredata/sound-from-earth-workshop/o.io.slipserial.pd diff --git a/puredata/sound-from-earth-workshop/onoff.pd b/puredata/sound-from-earth-workshop/onoff.pd new file mode 100644 index 0000000..88ed15f --- /dev/null +++ b/puredata/sound-from-earth-workshop/onoff.pd @@ -0,0 +1,46 @@ +#N canvas 287 163 333 477 12; +#X obj 88 12 inlet; +#X floatatom 88 43 5 0 0 0 - - -; +#X obj 172 315 until; +#X obj 106 104 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +-1 -1; +#X obj 172 341 f; +#X obj 220 341 + 1; +#X msg 190 185 0; +#X obj 107 393 ==; +#X msg 18 293 0 0 0 0 1; +#X msg 214 93 set; +#X msg 107 418 add2 \$1; +#X obj 172 290 \$1; +#X obj 145 165 \$1; +#X obj 145 190 != 0; +#X obj 106 235 spigot; +#X obj 145 215 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 +1; +#X obj 106 130 t b b; +#X obj 88 73 t b b a b b; +#X obj 18 318 outlet; +#X connect 0 0 1 0; +#X connect 1 0 17 0; +#X connect 2 0 4 0; +#X connect 3 0 16 0; +#X connect 4 0 5 0; +#X connect 5 0 4 1; +#X connect 5 0 7 0; +#X connect 6 0 4 1; +#X connect 7 0 10 0; +#X connect 8 0 18 0; +#X connect 9 0 8 0; +#X connect 10 0 8 0; +#X connect 11 0 2 0; +#X connect 12 0 13 0; +#X connect 13 0 15 0; +#X connect 14 0 11 0; +#X connect 15 0 14 1; +#X connect 16 0 14 0; +#X connect 16 1 12 0; +#X connect 17 0 8 0; +#X connect 17 1 3 0; +#X connect 17 2 7 1; +#X connect 17 3 6 0; +#X connect 17 4 9 0; diff --git a/puredata/radio_spell_workshop/radio_chant.pd b/puredata/sound-from-earth-workshop/radio_chant.pd similarity index 100% rename from puredata/radio_spell_workshop/radio_chant.pd rename to puredata/sound-from-earth-workshop/radio_chant.pd diff --git a/puredata/radio_spell_workshop/radio_chant_roller.pd b/puredata/sound-from-earth-workshop/radio_chant_roller.pd similarity index 100% rename from puredata/radio_spell_workshop/radio_chant_roller.pd rename to puredata/sound-from-earth-workshop/radio_chant_roller.pd diff --git a/puredata/radio_spell_workshop/radio_chant_taak.pd b/puredata/sound-from-earth-workshop/radio_chant_taak.pd similarity index 100% rename from puredata/radio_spell_workshop/radio_chant_taak.pd rename to puredata/sound-from-earth-workshop/radio_chant_taak.pd diff --git a/puredata/radio_spell_workshop/radio_chant_taakx.pd b/puredata/sound-from-earth-workshop/radio_chant_taakx.pd similarity index 100% rename from puredata/radio_spell_workshop/radio_chant_taakx.pd rename to puredata/sound-from-earth-workshop/radio_chant_taakx.pd diff --git a/puredata/radio_spell_workshop/radio_roller.pd b/puredata/sound-from-earth-workshop/radio_roller.pd similarity index 100% rename from puredata/radio_spell_workshop/radio_roller.pd rename to puredata/sound-from-earth-workshop/radio_roller.pd diff --git a/puredata/sound-from-earth-workshop/radio_spell_compass.pd b/puredata/sound-from-earth-workshop/radio_spell_compass.pd new file mode 100644 index 0000000..5d88335 --- /dev/null +++ b/puredata/sound-from-earth-workshop/radio_spell_compass.pd @@ -0,0 +1,428 @@ +#N struct 1005-point float x0 float y0 float size float fg float in float grid; +#N canvas 0 35 830 560 10; +#N canvas 248 138 692 351 radio 0; +#X obj 333 282 spigot; +#X obj 382 267 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#N canvas 676 408 512 395 buildOSC 0; +#X obj 319 66 t a b; +#X msg 456 84 [; +#X msg 34 327 ]; +#X obj 68 236 r X1; +#X obj 98 236 r X2; +#X obj 128 236 r X3; +#X obj 158 236 r X4; +#X obj 53 266 f; +#X obj 34 126 t b b a; +#X obj 254 345 outlet; +#X obj 140 17 inlet; +#X obj 188 236 r PS; +#X obj 88 284 pack f f f f f; +#X msg 319 112 sendtyped /note/onoff f \$1; +#X msg 254 141 sendtyped /note/velocity f \$1; +#X msg 88 307 sendtyped /note/x fffff \$1 \$2 \$3 \$4 \$5; +#X msg 73 199 sendtyped /note/id i \$1; +#X msg 167 170 sendtyped /note/pitch f \$1; +#X obj 140 39 unpack f f f f; +#X connect 0 0 13 0; +#X connect 0 1 1 0; +#X connect 1 0 9 0; +#X connect 2 0 9 0; +#X connect 3 0 7 1; +#X connect 4 0 12 1; +#X connect 5 0 12 2; +#X connect 6 0 12 3; +#X connect 7 0 12 0; +#X connect 8 0 2 0; +#X connect 8 1 7 0; +#X connect 8 2 16 0; +#X connect 10 0 18 0; +#X connect 11 0 12 4; +#X connect 12 0 15 0; +#X connect 13 0 9 0; +#X connect 14 0 9 0; +#X connect 15 0 9 0; +#X connect 16 0 9 0; +#X connect 17 0 9 0; +#X connect 18 0 8 0; +#X connect 18 1 17 0; +#X connect 18 2 14 0; +#X connect 18 3 0 0; +#X restore 413 286 pd buildOSC for all; +#X obj 112 210 o.io.slipserial; +#X msg 138 98 devices; +#X msg 209 98 close; +#X obj 112 189 packOSC; +#X obj 112 144 r OSC; +#X obj 112 231 unpackOSC; +#X obj 112 286 routeOSC /hello; +#X obj 112 309 s HELLO; +#X obj 19 171 print OSC; +#X obj 19 144 spigot; +#X obj 68 129 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 413 309 s OSC; +#X obj 413 255 r NOTE; +#X obj 333 309 print NOTE; +#X text 414 234 /id /pitch /velocity /onoff; +#X floatatom 636 254 5 0 0 0 - - - 0; +#X obj 636 276 s PS; +#X obj 629 169 tgl 16 0 empty empty hello 20 8 0 10 #9c00fc #f8fc00 #9c00fc 0 1; +#X obj 629 121 loadbang; +#X msg 629 142 1; +#X obj 629 196 sel 1; +#X obj 19 282 spigot; +#X obj 68 267 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 19 309 print HELLO; +#X text 14 12 * a wireless "field synth" - based on 'esp now' protocol, f 14; +#X msg 629 217 2000; +#X obj 215 262 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 299 144 3 0 0 1 device\ id - - 0; +#X msg 299 164 open \$1 \, baud 57600 \, pollintervall 1 \, verbose 1; +#X obj 216 226 print info(\$0), f 8; +#X obj 226 303 outlet; +#X obj 209 15 inlet; +#X obj 209 36 tgl 16 0 empty empty empty 0 -8 0 10 #c6feff #000000 #000000 0 1; +#X obj 209 57 sel 0 1; +#X msg 258 98 devicename /dev/ttyUSB0 \, baud 57600 \, pollintervall 1 \, verbose 1; +#X connect 0 0 16 0; +#X connect 1 0 0 1; +#X connect 2 0 14 0; +#X connect 3 0 8 0; +#X connect 3 1 29 0; +#X connect 3 2 32 0; +#X connect 4 0 3 1; +#X connect 5 0 3 1; +#X connect 6 0 3 0; +#X connect 7 0 6 0; +#X connect 7 0 12 0; +#X connect 8 0 9 0; +#X connect 9 0 10 0; +#X connect 9 0 24 0; +#X connect 12 0 11 0; +#X connect 13 0 12 1; +#X connect 15 0 0 0; +#X connect 15 0 2 0; +#X connect 18 0 19 0; +#X connect 20 0 23 0; +#X connect 21 0 22 0; +#X connect 22 0 20 0; +#X connect 23 0 28 0; +#X connect 23 1 18 0; +#X connect 24 0 26 0; +#X connect 25 0 24 1; +#X connect 28 0 18 0; +#X connect 29 0 33 0; +#X connect 30 0 31 0; +#X connect 31 0 3 1; +#X connect 34 0 35 0; +#X connect 35 0 36 0; +#X connect 36 0 5 0; +#X connect 36 1 37 0; +#X connect 37 0 3 1; +#X restore 31 72 pd radio; +#X obj 31 95 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 31 51 tgl 16 0 empty empty connect/disconnect 0 -8 0 10 #c6feff #000000 #000000 0 1; +#X obj 201 145 unpack f f f f; +#X floatatom 228 168 5 0 0 0 - - - 0; +#X obj 201 99 r HELLO; +#X obj 46 331 circle 127 -1 1 -1 1 1 0 -1 -1 0 -1 -1 255 0 0 1 0 0 -0.898793 -0.438373 empty empty 1; +#X obj 228 349 * 6.28319; +#X obj 228 323 / 360; +#X floatatom 228 372 5 0 0 0 - - - 0; +#X obj 228 229 + 90; +#X obj 228 252 mod 360; +#X floatatom 228 275 5 0 0 0 - - - 0; +#X obj 228 190 * -1; +#X obj 228 394 t b f; +#X obj 228 440 pol2car; +#X msg 228 417 1; +#X floatatom 228 473 5 0 0 0 - - - 0; +#X floatatom 273 473 5 0 0 0 - - - 0; +#X obj 228 495 pack f f; +#X obj 46 272 loadbang; +#X msg 341 120 0; +#X msg 392 140 1; +#X msg 443 160 2; +#X msg 494 180 3; +#X msg 545 200 4; +#X msg 596 220 5; +#X msg 647 240 6; +#X msg 698 260 7; +#X msg 749 260 0; +#X obj 473 238 change; +#X floatatom 473 260 5 0 0 0 - - - 0; +#X msg 46 300 grid 1 \, fgcolor 255 0 0; +#X obj 616 63 hradio 50 1 0 2 empty empty select\ compass! 0 -9 0 10 #feffc6 #0400ff #000000 0; +#X obj 238 43 sel 0 1; +#X msg 238 66 6003; +#X msg 287 76 6005; +#X floatatom 258 105 5 0 0 0 - - - 0; +#X obj 201 122 route; +#X obj 545 22 loadbang; +#X msg 545 45 0; +#X obj 546 292 onoff 2; +#X obj 502 384 spigot; +#X obj 582 384 spigot; +#X obj 615 361 tgl 18 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 535 361 tgl 18 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 546 315 unpack f f; +#N canvas 871 62 620 335 lightcompass 0; +#X obj 180 139 unpack f f f f f f f; +#N canvas 830 35 446 607 compass 0; +#X obj 108 32 inlet; +#X floatatom 108 63 5 0 0 0 - - - 0; +#X obj 192 335 until; +#X obj 126 124 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000; +#X obj 192 361 f; +#X obj 240 361 + 1; +#X msg 210 205 0; +#X msg 204 113 set; +#X msg 127 548 add2 \$1; +#X obj 165 210 != 0; +#X obj 126 255 spigot; +#X obj 165 235 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 126 150 t b b; +#X obj 108 93 t b b a b b; +#X obj 38 468 outlet; +#X obj 127 413 -; +#X msg 38 443 19442 16442 13442 10442 7442 10442 13442; +#X obj 165 185 7; +#X obj 192 310 7; +#X obj 231 244 loadbang; +#X msg 231 265 7; +#X obj 289 173 expr random(6000 \, 8000); +#X obj 289 150 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X floatatom 289 196 5 0 0 0 - - - 0; +#X obj 205 538 expr $f2*0 + 7000 + abs($f1*3000); +#X obj 289 27 loadbang; +#X obj 289 90 tgl 18 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 289 113 metro 5000; +#X obj 175 488 expr $f2*0 + $f3 + abs($f1*3000); +#X obj 371 54 inlet; +#X connect 0 0 1 0; +#X connect 1 0 13 0; +#X connect 2 0 4 0; +#X connect 3 0 12 0; +#X connect 4 0 5 0; +#X connect 5 0 4 1; +#X connect 5 0 15 0; +#X connect 6 0 4 1; +#X connect 7 0 16 0; +#X connect 8 0 16 0; +#X connect 9 0 11 0; +#X connect 10 0 18 0; +#X connect 11 0 10 1; +#X connect 12 0 10 0; +#X connect 12 1 17 0; +#X connect 13 0 16 0; +#X connect 13 1 3 0; +#X connect 13 2 15 1; +#X connect 13 2 28 1; +#X connect 13 3 6 0; +#X connect 13 4 7 0; +#X connect 15 0 28 0; +#X connect 16 0 14 0; +#X connect 17 0 9 0; +#X connect 18 0 2 0; +#X connect 19 0 20 0; +#X connect 20 0 17 1; +#X connect 20 0 18 1; +#X connect 21 0 23 0; +#X connect 22 0 21 0; +#X connect 23 0 28 2; +#X connect 26 0 27 0; +#X connect 27 0 22 0; +#X connect 28 0 8 0; +#X connect 29 0 22 0; +#X restore 180 116 pd compass; +#X obj 270 91 print compass; +#X msg 42 169 9001 0 \$1 0; +#X msg 122 209 9002 0 \$1 0; +#X msg 202 209 9003 0 \$1 0; +#X msg 282 209 9004 0 \$1 0; +#X msg 362 209 9005 0 \$1 0; +#X msg 442 209 9006 0 \$1 0; +#X msg 522 169 9007 0 \$1 0; +#X obj 42 272 s NOTE; +#X obj 122 272 s NOTE; +#X obj 202 272 s NOTE; +#X obj 282 272 s NOTE; +#X obj 362 272 s NOTE; +#X obj 442 272 s NOTE; +#X obj 522 272 s NOTE; +#X obj 153 48 sel 0; +#X msg 23 62 9000 0 20000 0; +#X obj 23 85 s NOTE; +#X obj 122 174 pipe 50; +#X obj 202 174 pipe 100; +#X obj 282 174 pipe 50; +#X obj 362 174 pipe 100; +#X obj 442 174 pipe 150; +#X obj 23 39 pipe 300; +#X obj 153 19 inlet; +#X obj 266 16 inlet; +#X connect 0 0 3 0; +#X connect 0 1 20 0; +#X connect 0 2 21 0; +#X connect 0 3 22 0; +#X connect 0 4 23 0; +#X connect 0 5 24 0; +#X connect 0 6 9 0; +#X connect 1 0 0 0; +#X connect 1 0 2 0; +#X connect 3 0 10 0; +#X connect 4 0 11 0; +#X connect 5 0 12 0; +#X connect 6 0 13 0; +#X connect 7 0 14 0; +#X connect 8 0 15 0; +#X connect 9 0 16 0; +#X connect 17 0 25 0; +#X connect 17 1 1 0; +#X connect 18 0 19 0; +#X connect 20 0 4 0; +#X connect 21 0 5 0; +#X connect 22 0 6 0; +#X connect 23 0 7 0; +#X connect 24 0 8 0; +#X connect 25 0 18 0; +#X connect 26 0 17 0; +#X connect 27 0 1 1; +#X restore 489 470 pd lightcompass; +#N canvas 332 77 370 553 spinningcompass 0; +#X obj 106 509 s NOTE; +#X obj 107 278 sel 0; +#X obj 134 374 + 9000; +#X floatatom 134 396 5 0 0 0 - - - 0; +#X obj 134 430 pack f 300; +#X msg 103 473 \$1 0 \$2 0; +#X floatatom 222 413 5 0 0 0 - - - 0; +#X obj 134 300 t a b; +#X obj 255 380 s NOTE; +#X obj 134 352 pipe 100; +#X obj 201 116 timer; +#X floatatom 201 138 5 0 0 0 - - - 0; +#X obj 201 87 t b b; +#X obj 201 64 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 201 189 expr 1/$f1; +#X floatatom 201 211 10 0 0 0 - - - 0; +#X obj 201 163 / 1000; +#X floatatom 201 254 8 0 0 0 - - - 0; +#X obj 107 46 t a b; +#X msg 255 358 9000 0 20000 0; +#X msg 29 340 9000 0 20000 0; +#X obj 107 17 inlet; +#X obj 201 232 * 130; +#X connect 1 0 20 0; +#X connect 1 1 7 0; +#X connect 2 0 3 0; +#X connect 3 0 4 0; +#X connect 4 0 5 0; +#X connect 5 0 0 0; +#X connect 6 0 4 1; +#X connect 7 0 9 0; +#X connect 7 1 19 0; +#X connect 9 0 2 0; +#X connect 10 0 11 0; +#X connect 11 0 16 0; +#X connect 12 0 10 0; +#X connect 12 1 10 1; +#X connect 13 0 12 0; +#X connect 14 0 15 0; +#X connect 15 0 22 0; +#X connect 16 0 14 0; +#X connect 17 0 4 1; +#X connect 18 0 1 0; +#X connect 18 1 13 0; +#X connect 19 0 8 0; +#X connect 20 0 0 0; +#X connect 21 0 18 0; +#X connect 22 0 17 0; +#X restore 618 444 pd spinningcompass; +#X obj 546 269 + 1; +#X obj 318 202 + 180; +#X obj 318 225 mod 360; +#X floatatom 318 248 5 0 0 0 - - - 0; +#X text 308 25 108 121 136 150 166 200 233 267 300; +#X obj 341 98 moses 103; +#X obj 698 238 moses 300; +#X obj 647 218 moses 240; +#X obj 596 198 moses 191; +#X obj 545 178 moses 162; +#X obj 494 158 moses 140; +#X obj 443 138 moses 125; +#X obj 392 118 moses 112; +#X obj 436 362 sel 0; +#X connect 0 0 1 0; +#X connect 2 0 0 0; +#X connect 3 1 4 0; +#X connect 4 0 13 0; +#X connect 4 0 50 0; +#X connect 5 0 38 0; +#X connect 7 0 9 0; +#X connect 8 0 7 0; +#X connect 9 0 14 0; +#X connect 10 0 11 0; +#X connect 11 0 12 0; +#X connect 12 0 8 0; +#X connect 13 0 10 0; +#X connect 14 0 16 0; +#X connect 14 1 15 1; +#X connect 15 0 17 0; +#X connect 15 1 18 0; +#X connect 16 0 15 0; +#X connect 17 0 19 0; +#X connect 18 0 19 1; +#X connect 19 0 6 0; +#X connect 20 0 32 0; +#X connect 21 0 30 0; +#X connect 22 0 30 0; +#X connect 23 0 30 0; +#X connect 24 0 30 0; +#X connect 25 0 30 0; +#X connect 26 0 30 0; +#X connect 27 0 30 0; +#X connect 28 0 30 0; +#X connect 29 0 30 0; +#X connect 30 0 31 0; +#X connect 31 0 42 0; +#X connect 31 0 43 0; +#X connect 31 0 62 0; +#X connect 32 0 6 0; +#X connect 33 0 34 0; +#X connect 33 0 49 0; +#X connect 34 0 35 0; +#X connect 34 1 36 0; +#X connect 35 0 37 0; +#X connect 36 0 37 0; +#X connect 37 0 38 1; +#X connect 38 0 3 0; +#X connect 39 0 40 0; +#X connect 40 0 33 0; +#X connect 41 0 46 0; +#X connect 42 0 47 0; +#X connect 43 0 48 0; +#X connect 44 0 43 1; +#X connect 45 0 42 1; +#X connect 46 0 45 0; +#X connect 46 1 44 0; +#X connect 49 0 41 0; +#X connect 50 0 51 0; +#X connect 51 0 52 0; +#X connect 52 0 54 0; +#X connect 54 0 21 0; +#X connect 54 1 61 0; +#X connect 55 0 28 0; +#X connect 55 1 29 0; +#X connect 56 0 27 0; +#X connect 56 1 55 0; +#X connect 57 0 26 0; +#X connect 57 1 56 0; +#X connect 58 0 25 0; +#X connect 58 1 57 0; +#X connect 59 0 24 0; +#X connect 59 1 58 0; +#X connect 60 0 23 0; +#X connect 60 1 59 0; +#X connect 61 0 22 0; +#X connect 61 1 60 0; +#X connect 62 0 47 1; diff --git a/puredata/radio_spell_workshop/radio_spell_scratch.pd b/puredata/sound-from-earth-workshop/radio_spell_scratch.pd similarity index 100% rename from puredata/radio_spell_workshop/radio_spell_scratch.pd rename to puredata/sound-from-earth-workshop/radio_spell_scratch.pd diff --git a/puredata/radio_spell_workshop/radio_spell_start.pd b/puredata/sound-from-earth-workshop/radio_spell_start.pd similarity index 100% rename from puredata/radio_spell_workshop/radio_spell_start.pd rename to puredata/sound-from-earth-workshop/radio_spell_start.pd diff --git a/puredata/radio_spell_workshop/radio_spell_start2.pd b/puredata/sound-from-earth-workshop/radio_spell_start2.pd similarity index 100% rename from puredata/radio_spell_workshop/radio_spell_start2.pd rename to puredata/sound-from-earth-workshop/radio_spell_start2.pd diff --git a/puredata/sound-from-earth-workshop/radio_spell_start3.pd b/puredata/sound-from-earth-workshop/radio_spell_start3.pd new file mode 100644 index 0000000..378b086 --- /dev/null +++ b/puredata/sound-from-earth-workshop/radio_spell_start3.pd @@ -0,0 +1,894 @@ +#N canvas 0 33 1536 765 10; +#N canvas 246 226 692 351 radio 0; +#X obj 333 282 spigot; +#X obj 382 267 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#N canvas 676 408 512 395 buildOSC 0; +#X obj 319 66 t a b; +#X msg 456 84 [; +#X msg 34 327 ]; +#X obj 68 236 r X1; +#X obj 98 236 r X2; +#X obj 128 236 r X3; +#X obj 158 236 r X4; +#X obj 53 266 f; +#X obj 34 126 t b b a; +#X obj 254 345 outlet; +#X obj 140 17 inlet; +#X obj 188 236 r PS; +#X obj 88 284 pack f f f f f; +#X msg 319 112 sendtyped /note/onoff f \$1; +#X msg 254 141 sendtyped /note/velocity f \$1; +#X msg 88 307 sendtyped /note/x fffff \$1 \$2 \$3 \$4 \$5; +#X msg 73 199 sendtyped /note/id i \$1; +#X msg 167 170 sendtyped /note/pitch f \$1; +#X obj 140 39 unpack f f f f; +#X connect 0 0 13 0; +#X connect 0 1 1 0; +#X connect 1 0 9 0; +#X connect 2 0 9 0; +#X connect 3 0 7 1; +#X connect 4 0 12 1; +#X connect 5 0 12 2; +#X connect 6 0 12 3; +#X connect 7 0 12 0; +#X connect 8 0 2 0; +#X connect 8 1 7 0; +#X connect 8 2 16 0; +#X connect 10 0 18 0; +#X connect 11 0 12 4; +#X connect 12 0 15 0; +#X connect 13 0 9 0; +#X connect 14 0 9 0; +#X connect 15 0 9 0; +#X connect 16 0 9 0; +#X connect 17 0 9 0; +#X connect 18 0 8 0; +#X connect 18 1 17 0; +#X connect 18 2 14 0; +#X connect 18 3 0 0; +#X restore 413 286 pd buildOSC for all; +#X obj 112 210 o.io.slipserial; +#X msg 138 98 devices; +#X msg 209 98 close; +#X obj 112 189 packOSC; +#X obj 112 144 r OSC; +#X obj 112 231 unpackOSC; +#X obj 112 286 routeOSC /hello; +#X obj 112 309 s HELLO; +#X obj 19 171 print OSC; +#X obj 19 144 spigot; +#X obj 68 129 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 413 309 s OSC; +#X obj 413 255 r NOTE; +#X obj 333 309 print NOTE; +#X text 414 234 /id /pitch /velocity /onoff; +#X floatatom 636 254 5 0 0 0 - - - 0; +#X obj 636 276 s PS; +#X obj 629 169 tgl 16 0 empty empty hello 20 8 0 10 #9c00fc #f8fc00 #9c00fc 0 1; +#X obj 629 121 loadbang; +#X msg 629 142 1; +#X obj 629 196 sel 1; +#X obj 19 282 spigot; +#X obj 68 267 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 19 309 print HELLO; +#X text 14 12 * a wireless "field synth" - based on 'esp now' protocol, f 14; +#X msg 629 217 2000; +#X obj 215 262 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 299 144 3 0 0 1 device\ id - - 0; +#X msg 299 164 open \$1 \, baud 57600 \, pollintervall 1 \, verbose 1; +#X obj 216 226 print info(\$0), f 8; +#X obj 226 303 outlet; +#X obj 209 15 inlet; +#X obj 209 36 tgl 16 0 empty empty empty 0 -8 0 10 #c6feff #000000 #000000 0 1; +#X obj 209 57 sel 0 1; +#X msg 258 98 devicename /dev/ttyACM0 \, baud 57600 \, pollintervall 1 \, verbose 1; +#X connect 0 0 16 0; +#X connect 1 0 0 1; +#X connect 2 0 14 0; +#X connect 3 0 8 0; +#X connect 3 1 29 0; +#X connect 3 2 32 0; +#X connect 4 0 3 1; +#X connect 5 0 3 1; +#X connect 6 0 3 0; +#X connect 7 0 6 0; +#X connect 7 0 12 0; +#X connect 8 0 9 0; +#X connect 9 0 10 0; +#X connect 9 0 24 0; +#X connect 12 0 11 0; +#X connect 13 0 12 1; +#X connect 15 0 0 0; +#X connect 15 0 2 0; +#X connect 18 0 19 0; +#X connect 20 0 23 0; +#X connect 21 0 22 0; +#X connect 22 0 20 0; +#X connect 23 0 28 0; +#X connect 23 1 18 0; +#X connect 24 0 26 0; +#X connect 25 0 24 1; +#X connect 28 0 18 0; +#X connect 29 0 33 0; +#X connect 30 0 31 0; +#X connect 31 0 3 1; +#X connect 34 0 35 0; +#X connect 35 0 36 0; +#X connect 36 0 5 0; +#X connect 36 1 37 0; +#X connect 37 0 3 1; +#X restore 11 102 pd radio; +#X obj 11 125 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 11 81 tgl 16 0 empty empty connect/disconnect 0 -8 0 10 #c6feff #000000 #000000 0 1; +#X text 208 78 H&D : 4201 4401 4843 4357; +#X text 208 98 teens : 4567 4676 4881 4787; +#N canvas 501 33 615 801 lfo 0; +#X obj 163 744 s NOTE; +#X floatatom 383 215 5 0 0 0 - - - 0; +#X floatatom 384 259 5 0 0 0 - - - 0; +#X floatatom 387 320 5 0 0 0 - - - 0; +#X obj 388 351 vsl 16 136 -1000 1000 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 387 298 rescale -100 100; +#X floatatom 433 273 5 0 0 0 - - - 0; +#X floatatom 480 276 5 0 0 0 - - - 0; +#X text 21 100 stick; +#X obj 70 258 unpack f f f f; +#X floatatom 70 280 5 0 0 0 - - - 0; +#X obj 70 300 / 1024; +#X floatatom 124 279 5 0 0 0 - - - 0; +#X obj 383 238 lfo -sin, f 15; +#X obj 194 409 del 5000; +#X obj 194 380 t b b; +#X msg 267 408 1; +#X msg 194 437 0; +#X obj 161 562 spigot; +#X obj 194 518 tgl 16 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 164 649 5 0 0 0 - - - 0; +#X obj 164 669 skip 100; +#X floatatom 164 690 5 0 0 0 - - - 0; +#X obj 545 227 vsl 16 136 0 1000 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 545 373 5 0 0 0 - - - 0; +#X obj 315 391 * -1; +#X obj 432 91 metro 300; +#X obj 432 133 * 0.1; +#X floatatom 432 154 5 0 0 0 - - - 0; +#X obj 432 50 tgl 16 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 432 174 + 1.5; +#X floatatom 432 195 5 0 0 0 - - - 0; +#X obj 431 24 loadbang; +#X obj 432 112 random 5; +#X floatatom 119 202 10 0 0 0 - - - 16; +#X obj 69 237 route; +#X obj 119 172 + 6001; +#X obj 23 134 r HELLO; +#X text 175 152 <=== WIND # check?; +#X text 18 186 DISCONNECTED; +#X msg 162 713 4888 0 \$1 1; +#X msg 238 712 4888 0 0 0; +#X floatatom 70 331 5 0 0 0 - - - 0; +#X obj 70 564 change; +#X obj 70 585 sel 1 0; +#X obj 70 606 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 91 383 f; +#X obj 70 406 -; +#X obj 70 357 t a a b; +#X obj 70 429 abs; +#X obj 70 452 * 10; +#X floatatom 70 475 5 0 0 0 - - - 0; +#X obj 70 502 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 70 540 > 0.2; +#X floatatom 512 69 5 0 0 0 - - - 0; +#X floatatom 238 270 5 0 0 0 - - - 0; +#X obj 238 247 * 3; +#X obj 119 106 vradio 18 1 0 3 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0; +#X connect 1 0 13 0; +#X connect 2 0 5 0; +#X connect 3 0 4 0; +#X connect 4 0 18 0; +#X connect 5 0 3 0; +#X connect 6 0 5 1; +#X connect 7 0 5 2; +#X connect 9 1 10 0; +#X connect 9 2 12 0; +#X connect 10 0 11 0; +#X connect 11 0 42 0; +#X connect 13 0 2 0; +#X connect 14 0 17 0; +#X connect 15 0 14 0; +#X connect 15 1 16 0; +#X connect 16 0 19 0; +#X connect 17 0 19 0; +#X connect 18 0 20 0; +#X connect 19 0 18 1; +#X connect 20 0 21 0; +#X connect 21 0 22 0; +#X connect 22 0 40 0; +#X connect 23 0 24 0; +#X connect 24 0 25 0; +#X connect 24 0 7 0; +#X connect 25 0 6 0; +#X connect 26 0 33 0; +#X connect 27 0 28 0; +#X connect 28 0 30 0; +#X connect 29 0 26 0; +#X connect 30 0 31 0; +#X connect 31 0 1 0; +#X connect 32 0 29 0; +#X connect 33 0 27 0; +#X connect 34 0 35 1; +#X connect 35 0 9 0; +#X connect 36 0 34 0; +#X connect 40 0 0 0; +#X connect 41 0 0 0; +#X connect 42 0 48 0; +#X connect 42 0 56 0; +#X connect 43 0 44 0; +#X connect 44 0 45 0; +#X connect 45 0 15 0; +#X connect 46 0 47 1; +#X connect 47 0 49 0; +#X connect 48 0 47 0; +#X connect 48 1 46 1; +#X connect 48 2 46 0; +#X connect 49 0 50 0; +#X connect 50 0 51 0; +#X connect 51 0 52 0; +#X connect 52 0 53 0; +#X connect 53 0 43 0; +#X connect 54 0 33 1; +#X connect 55 0 30 1; +#X connect 56 0 55 0; +#X connect 57 0 36 0; +#X restore 1492 53 pd lfo based templ; +#X obj 108 167 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 0; +#X floatatom 37 718 5 0 0 0 - - - 0; +#X obj 76 803 s NOTE; +#X obj 10 318 unpack f f f f; +#X floatatom 37 360 5 0 0 0 - - - 0; +#X obj 37 382 / 1024; +#X floatatom 37 405 5 0 0 0 - - - 0; +#X floatatom 37 261 10 0 0 0 - - - 16; +#X obj 10 295 route; +#X obj 37 232 + 6001; +#X obj 10 176 r HELLO; +#X obj 37 634 change; +#X obj 37 657 sel 1 0; +#X obj 37 681 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 58 453 f; +#X obj 37 476 -; +#X obj 37 427 t a a b; +#X obj 37 499 abs; +#X obj 37 522 * 10; +#X floatatom 37 545 5 0 0 0 - - - 0; +#X obj 37 572 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 37 610 > 0.2; +#X obj 488 167 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 2; +#X floatatom 417 718 5 0 0 0 - - - 0; +#X obj 456 803 s NOTE; +#X obj 390 318 unpack f f f f; +#X floatatom 417 360 5 0 0 0 - - - 0; +#X obj 417 382 / 1024; +#X floatatom 417 405 5 0 0 0 - - - 0; +#X floatatom 417 261 10 0 0 0 - - - 16; +#X obj 390 295 route; +#X obj 417 232 + 6001; +#X obj 390 176 r HELLO; +#X obj 417 634 change; +#X obj 417 657 sel 1 0; +#X obj 417 681 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 438 453 f; +#X obj 417 476 -; +#X obj 417 427 t a a b; +#X obj 417 499 abs; +#X obj 417 522 * 10; +#X floatatom 417 545 5 0 0 0 - - - 0; +#X obj 417 572 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 678 167 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 1; +#X floatatom 607 718 5 0 0 0 - - - 0; +#X obj 646 803 s NOTE; +#X obj 580 318 unpack f f f f; +#X floatatom 607 360 5 0 0 0 - - - 0; +#X obj 607 382 / 1024; +#X floatatom 607 405 5 0 0 0 - - - 0; +#X floatatom 607 261 10 0 0 0 - - - 16; +#X obj 580 295 route; +#X obj 607 232 + 6001; +#X obj 580 176 r HELLO; +#X obj 607 634 change; +#X obj 607 657 sel 1 0; +#X obj 607 681 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 628 453 f; +#X obj 607 476 -; +#X obj 607 427 t a a b; +#X obj 607 499 abs; +#X obj 607 522 * 10; +#X floatatom 607 545 5 0 0 0 - - - 0; +#X obj 607 572 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 607 610 > 0.2; +#X obj 868 167 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 0; +#X floatatom 797 718 5 0 0 0 - - - 0; +#X obj 836 803 s NOTE; +#X obj 770 318 unpack f f f f; +#X floatatom 797 360 5 0 0 0 - - - 0; +#X obj 797 382 / 1024; +#X floatatom 797 405 5 0 0 0 - - - 0; +#X floatatom 797 261 10 0 0 0 - - - 16; +#X obj 770 295 route; +#X obj 797 232 + 6001; +#X obj 770 176 r HELLO; +#X obj 797 634 change; +#X obj 797 657 sel 1 0; +#X obj 797 681 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 818 453 f; +#X obj 797 476 -; +#X obj 797 427 t a a b; +#X obj 797 499 abs; +#X obj 797 522 * 10; +#X floatatom 797 545 5 0 0 0 - - - 0; +#X obj 797 572 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 797 610 > 0.2; +#X obj 1058 167 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 2; +#X floatatom 987 718 5 0 0 0 - - - 0; +#X obj 1026 803 s NOTE; +#X obj 960 318 unpack f f f f; +#X floatatom 987 360 5 0 0 0 - - - 0; +#X obj 987 382 / 1024; +#X floatatom 987 405 5 0 0 0 - - - 0; +#X floatatom 987 261 10 0 0 0 - - - 16; +#X obj 960 295 route; +#X obj 987 232 + 6001; +#X obj 960 176 r HELLO; +#X obj 987 634 change; +#X obj 987 657 sel 1 0; +#X obj 987 681 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 1008 453 f; +#X obj 987 476 -; +#X obj 987 427 t a a b; +#X obj 987 499 abs; +#X obj 987 522 * 10; +#X floatatom 987 545 5 0 0 0 - - - 0; +#X obj 987 572 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 987 610 > 0.2; +#X msg 37 746 4200 0 \$1 1; +#X msg 119 746 4200 0 0 0, f 11; +#X msg 607 746 4810 0 \$1 1; +#X msg 689 746 4810 0 0 0, f 11; +#X msg 797 746 4842 0 \$1 1; +#X msg 879 746 4842 0 0 0, f 11; +#X obj 298 167 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 1; +#X floatatom 227 718 5 0 0 0 - - - 0; +#X obj 266 803 s NOTE; +#X obj 200 318 unpack f f f f; +#X floatatom 227 360 5 0 0 0 - - - 0; +#X obj 227 382 / 1024; +#X floatatom 227 405 5 0 0 0 - - - 0; +#X floatatom 227 261 10 0 0 0 - - - 16; +#X obj 200 295 route; +#X obj 227 232 + 6001; +#X obj 200 176 r HELLO; +#X obj 227 634 change; +#X obj 227 657 sel 1 0; +#X obj 227 681 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 248 453 f; +#X obj 227 476 -; +#X obj 227 427 t a a b; +#X obj 227 499 abs; +#X obj 227 522 * 10; +#X floatatom 227 545 5 0 0 0 - - - 0; +#X obj 227 572 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 227 610 > 0.2; +#X msg 987 746 4555 1 \$1 1; +#X msg 1069 746 4555 1 0 0, f 11; +#X obj 417 610 > 0.3; +#X obj 711 21 vsl 18 100 0 1 0 0 empty empty empty 0 -9 0 10 #c6ffc7 #000000 #000000 0 1; +#X obj 808 79 s OUTSIDE_SENSITIVTY; +#X obj 454 571 r OUTSIDE_SENSITIVTY; +#X floatatom 808 57 5 0 0 0 - - - 0; +#X obj 981 20 vsl 18 100 0 1 0 0 empty empty empty 0 -9 0 10 #c7c6ff #000000 #000000 0 1; +#X floatatom 1078 57 5 0 0 0 - - - 0; +#X obj 1078 79 s STICK_SENSITIVTY; +#X obj 264 571 r STICK_SENSITIVTY; +#X obj 643 577 r STICK_SENSITIVTY; +#X obj 1023 577 r STICK_SENSITIVTY; +#X obj 116 667 loadbang; +#X msg 116 690 500; +#X obj 306 667 loadbang; +#X msg 306 690 500; +#X obj 496 667 loadbang; +#X msg 496 690 500; +#X obj 686 667 loadbang; +#X msg 686 690 500; +#X obj 876 667 loadbang; +#X msg 876 690 500; +#X obj 1066 667 loadbang; +#X text 1969 831 ___; +#X text -23 -33 ___; +#X text 1153 -11 // ... libraries in use: comport \, osc \, slip \, else ... //; +#X text 362 -12 // ... at 2024-09-24 \, with ... Hackers & Designers \, dianaband \, Heeju and forest all around us. //, f 108; +#X text 12 -3 // + Sound From Earth @ bottle factory \, Seoul + //; +#X text 452 55 6001 -> blow, f 20; +#X text 452 79 6003 -> outside, f 20; +#X text 452 67 6002 -> stick sensor; +#X msg 227 746 4881 0 \$1 1; +#X msg 309 746 4881 0 0 0, f 11; +#X msg 417 746 4206 0 \$1 1; +#X msg 499 746 4206 0 0 0, f 11; +#X obj 1248 167 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 1; +#X floatatom 1177 718 5 0 0 0 - - - 0; +#X obj 1216 803 s NOTE; +#X obj 1150 318 unpack f f f f; +#X floatatom 1177 360 5 0 0 0 - - - 0; +#X obj 1177 382 / 1024; +#X floatatom 1177 405 5 0 0 0 - - - 0; +#X floatatom 1177 261 10 0 0 0 - - - 16; +#X obj 1150 295 route; +#X obj 1177 232 + 6001; +#X obj 1150 176 r HELLO; +#X obj 1177 634 change; +#X obj 1177 657 sel 1 0; +#X obj 1177 681 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 1198 453 f; +#X obj 1177 476 -; +#X obj 1177 427 t a a b; +#X obj 1177 499 abs; +#X obj 1177 522 * 10; +#X floatatom 1177 545 5 0 0 0 - - - 0; +#X obj 1177 572 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 1177 610 > 0.2; +#X obj 1213 577 r STICK_SENSITIVTY; +#X obj 1256 667 loadbang; +#X msg 1256 690 500; +#X msg 1177 746 4567 1 \$1 1; +#X msg 1259 746 4567 1 0 0, f 11; +#N canvas 0 35 636 619 waving 0; +#X obj 160 738 s NOTE; +#X floatatom 380 209 5 0 0 0 - - - 0; +#X floatatom 381 253 5 0 0 0 - - - 0; +#X floatatom 384 314 5 0 0 0 - - - 0; +#X obj 385 345 vsl 16 136 -1000 1000 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 384 292 rescale -100 100; +#X floatatom 430 267 5 0 0 0 - - - 0; +#X floatatom 477 270 5 0 0 0 - - - 0; +#X obj 67 252 unpack f f f f; +#X floatatom 67 274 5 0 0 0 - - - 0; +#X obj 67 294 / 1024; +#X floatatom 121 273 5 0 0 0 - - - 0; +#X obj 380 232 lfo -sin, f 15; +#X obj 191 403 del 5000; +#X obj 191 374 t b b; +#X msg 264 402 1; +#X msg 191 431 0; +#X obj 158 556 spigot; +#X obj 191 512 tgl 16 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 161 643 5 0 0 0 - - - 0; +#X obj 161 663 skip 100; +#X floatatom 161 684 5 0 0 0 - - - 0; +#X obj 542 221 vsl 16 136 0 1000 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 542 367 5 0 0 0 - - - 0; +#X obj 312 385 * -1; +#X obj 429 85 metro 300; +#X obj 429 127 * 0.1; +#X floatatom 429 148 5 0 0 0 - - - 0; +#X obj 429 44 tgl 16 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 429 168 + 1.5; +#X floatatom 429 189 5 0 0 0 - - - 0; +#X obj 428 18 loadbang; +#X obj 429 106 random 5; +#X floatatom 116 196 10 0 0 0 - - - 16; +#X obj 66 231 route; +#X obj 116 166 + 6001; +#X floatatom 67 325 5 0 0 0 - - - 0; +#X obj 67 558 change; +#X obj 67 579 sel 1 0; +#X obj 67 600 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 88 377 f; +#X obj 67 400 -; +#X obj 67 351 t a a b; +#X obj 67 423 abs; +#X obj 67 446 * 10; +#X floatatom 67 469 5 0 0 0 - - - 0; +#X obj 67 496 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 67 534 > 0.2; +#X floatatom 509 63 5 0 0 0 - - - 0; +#X floatatom 235 264 5 0 0 0 - - - 0; +#X obj 235 241 * 3; +#X obj 119 100 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 0; +#X obj 20 128 inlet; +#X msg 159 707 4200 0 \$1 1; +#X msg 235 706 4200 0 0 0; +#X connect 1 0 12 0; +#X connect 2 0 5 0; +#X connect 3 0 4 0; +#X connect 4 0 17 0; +#X connect 5 0 3 0; +#X connect 6 0 5 1; +#X connect 7 0 5 2; +#X connect 8 1 9 0; +#X connect 8 2 11 0; +#X connect 9 0 10 0; +#X connect 10 0 36 0; +#X connect 12 0 2 0; +#X connect 13 0 16 0; +#X connect 14 0 13 0; +#X connect 14 1 15 0; +#X connect 15 0 18 0; +#X connect 16 0 18 0; +#X connect 17 0 19 0; +#X connect 18 0 17 1; +#X connect 19 0 20 0; +#X connect 20 0 21 0; +#X connect 21 0 53 0; +#X connect 22 0 23 0; +#X connect 23 0 24 0; +#X connect 23 0 7 0; +#X connect 24 0 6 0; +#X connect 25 0 32 0; +#X connect 26 0 27 0; +#X connect 27 0 29 0; +#X connect 28 0 25 0; +#X connect 29 0 30 0; +#X connect 30 0 1 0; +#X connect 31 0 28 0; +#X connect 32 0 26 0; +#X connect 33 0 34 1; +#X connect 34 0 8 0; +#X connect 35 0 33 0; +#X connect 36 0 42 0; +#X connect 36 0 50 0; +#X connect 37 0 38 0; +#X connect 38 0 39 0; +#X connect 39 0 14 0; +#X connect 40 0 41 1; +#X connect 41 0 43 0; +#X connect 42 0 41 0; +#X connect 42 1 40 1; +#X connect 42 2 40 0; +#X connect 43 0 44 0; +#X connect 44 0 45 0; +#X connect 45 0 46 0; +#X connect 46 0 47 0; +#X connect 47 0 37 0; +#X connect 48 0 32 1; +#X connect 49 0 29 1; +#X connect 50 0 49 0; +#X connect 51 0 35 0; +#X connect 52 0 34 0; +#X connect 53 0 0 0; +#X connect 54 0 0 0; +#X restore 1126 205 pd waving; +#N canvas 484 95 636 799 waving 0; +#X obj 160 738 s NOTE; +#X floatatom 380 209 5 0 0 0 - - - 0; +#X floatatom 381 253 5 0 0 0 - - - 0; +#X floatatom 384 314 5 0 0 0 - - - 0; +#X obj 385 345 vsl 16 136 -1000 1000 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 384 292 rescale -100 100; +#X floatatom 430 267 5 0 0 0 - - - 0; +#X floatatom 477 270 5 0 0 0 - - - 0; +#X obj 67 252 unpack f f f f; +#X floatatom 67 274 5 0 0 0 - - - 0; +#X obj 67 294 / 1024; +#X floatatom 121 273 5 0 0 0 - - - 0; +#X obj 380 232 lfo -sin, f 15; +#X obj 191 403 del 5000; +#X obj 191 374 t b b; +#X msg 264 402 1; +#X msg 191 431 0; +#X obj 158 556 spigot; +#X obj 191 512 tgl 16 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 161 643 5 0 0 0 - - - 0; +#X obj 161 663 skip 100; +#X floatatom 161 684 5 0 0 0 - - - 0; +#X obj 542 221 vsl 16 136 0 1000 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 542 367 5 0 0 0 - - - 0; +#X obj 312 385 * -1; +#X obj 429 85 metro 300; +#X obj 429 127 * 0.1; +#X floatatom 429 148 5 0 0 0 - - - 0; +#X obj 429 44 tgl 16 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 429 168 + 1.5; +#X floatatom 429 189 5 0 0 0 - - - 0; +#X obj 428 18 loadbang; +#X obj 429 106 random 5; +#X floatatom 116 196 10 0 0 0 - - - 16; +#X obj 66 231 route; +#X obj 116 166 + 6001; +#X floatatom 67 325 5 0 0 0 - - - 0; +#X obj 67 558 change; +#X obj 67 579 sel 1 0; +#X obj 67 600 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 88 377 f; +#X obj 67 400 -; +#X obj 67 351 t a a b; +#X obj 67 423 abs; +#X obj 67 446 * 10; +#X floatatom 67 469 5 0 0 0 - - - 0; +#X obj 67 496 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 67 534 > 0.2; +#X floatatom 509 63 5 0 0 0 - - - 0; +#X floatatom 235 264 5 0 0 0 - - - 0; +#X obj 235 241 * 3; +#X obj 119 100 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 0; +#X obj 20 128 inlet; +#X msg 159 707 4200 0 \$1 1; +#X msg 235 706 4200 0 0 0; +#X connect 1 0 12 0; +#X connect 2 0 5 0; +#X connect 3 0 4 0; +#X connect 4 0 17 0; +#X connect 5 0 3 0; +#X connect 6 0 5 1; +#X connect 7 0 5 2; +#X connect 8 1 9 0; +#X connect 8 2 11 0; +#X connect 9 0 10 0; +#X connect 10 0 36 0; +#X connect 12 0 2 0; +#X connect 13 0 16 0; +#X connect 14 0 13 0; +#X connect 14 1 15 0; +#X connect 15 0 18 0; +#X connect 16 0 18 0; +#X connect 17 0 19 0; +#X connect 18 0 17 1; +#X connect 19 0 20 0; +#X connect 20 0 21 0; +#X connect 21 0 53 0; +#X connect 22 0 23 0; +#X connect 23 0 24 0; +#X connect 23 0 7 0; +#X connect 24 0 6 0; +#X connect 25 0 32 0; +#X connect 26 0 27 0; +#X connect 27 0 29 0; +#X connect 28 0 25 0; +#X connect 29 0 30 0; +#X connect 30 0 1 0; +#X connect 31 0 28 0; +#X connect 32 0 26 0; +#X connect 33 0 34 1; +#X connect 34 0 8 0; +#X connect 35 0 33 0; +#X connect 36 0 42 0; +#X connect 36 0 50 0; +#X connect 37 0 38 0; +#X connect 38 0 39 0; +#X connect 39 0 14 0; +#X connect 40 0 41 1; +#X connect 41 0 43 0; +#X connect 42 0 41 0; +#X connect 42 1 40 1; +#X connect 42 2 40 0; +#X connect 43 0 44 0; +#X connect 44 0 45 0; +#X connect 45 0 46 0; +#X connect 46 0 47 0; +#X connect 47 0 37 0; +#X connect 48 0 32 1; +#X connect 49 0 29 1; +#X connect 50 0 49 0; +#X connect 51 0 35 0; +#X connect 52 0 34 0; +#X connect 53 0 0 0; +#X connect 54 0 0 0; +#X restore 2 202 pd waving; +#X obj 1378 243 r HELLO; +#X obj 1378 266 route 6001 6002 6003; +#X obj 1486 319 print; +#X obj 1415 430 s NOTE; +#X msg 1393 379 4000 0 300 1; +#X obj 1313 361 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 1313 384 t b b; +#X obj 1313 430 del; +#X obj 1263 403 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 1313 407 expr random(30000 \, 60000); +#X floatatom 1253 496 12 0 0 0 - - - 0; +#X msg 1066 690 400; +#X connect 0 0 1 0; +#X connect 2 0 0 0; +#X connect 6 0 15 0; +#X connect 7 0 115 0; +#X connect 9 1 10 0; +#X connect 10 0 11 0; +#X connect 11 0 12 0; +#X connect 12 0 22 0; +#X connect 13 0 14 1; +#X connect 14 0 9 0; +#X connect 15 0 13 0; +#X connect 16 0 14 0; +#X connect 17 0 18 0; +#X connect 18 0 19 0; +#X connect 19 0 7 0; +#X connect 20 0 21 1; +#X connect 21 0 23 0; +#X connect 22 0 21 0; +#X connect 22 1 20 1; +#X connect 22 2 20 0; +#X connect 23 0 24 0; +#X connect 24 0 25 0; +#X connect 25 0 26 0; +#X connect 26 0 27 0; +#X connect 27 0 17 0; +#X connect 28 0 37 0; +#X connect 29 0 177 0; +#X connect 31 1 32 0; +#X connect 32 0 33 0; +#X connect 33 0 34 0; +#X connect 34 0 44 0; +#X connect 35 0 36 1; +#X connect 36 0 31 0; +#X connect 37 0 35 0; +#X connect 38 0 36 0; +#X connect 39 0 40 0; +#X connect 40 0 41 0; +#X connect 41 0 29 0; +#X connect 42 0 43 1; +#X connect 43 0 45 0; +#X connect 44 0 43 0; +#X connect 44 1 42 1; +#X connect 44 2 42 0; +#X connect 45 0 46 0; +#X connect 46 0 47 0; +#X connect 47 0 48 0; +#X connect 48 0 145 0; +#X connect 49 0 58 0; +#X connect 50 0 117 0; +#X connect 52 1 53 0; +#X connect 53 0 54 0; +#X connect 54 0 55 0; +#X connect 55 0 65 0; +#X connect 56 0 57 1; +#X connect 57 0 52 0; +#X connect 58 0 56 0; +#X connect 59 0 57 0; +#X connect 60 0 61 0; +#X connect 61 0 62 0; +#X connect 62 0 50 0; +#X connect 63 0 64 1; +#X connect 64 0 66 0; +#X connect 65 0 64 0; +#X connect 65 1 63 1; +#X connect 65 2 63 0; +#X connect 66 0 67 0; +#X connect 67 0 68 0; +#X connect 68 0 69 0; +#X connect 69 0 70 0; +#X connect 70 0 60 0; +#X connect 71 0 80 0; +#X connect 72 0 119 0; +#X connect 74 1 75 0; +#X connect 75 0 76 0; +#X connect 76 0 77 0; +#X connect 77 0 87 0; +#X connect 78 0 79 1; +#X connect 79 0 74 0; +#X connect 80 0 78 0; +#X connect 81 0 79 0; +#X connect 82 0 83 0; +#X connect 83 0 84 0; +#X connect 84 0 72 0; +#X connect 85 0 86 1; +#X connect 86 0 88 0; +#X connect 87 0 86 0; +#X connect 87 1 85 1; +#X connect 87 2 85 0; +#X connect 88 0 89 0; +#X connect 89 0 90 0; +#X connect 90 0 91 0; +#X connect 91 0 92 0; +#X connect 92 0 82 0; +#X connect 93 0 102 0; +#X connect 94 0 143 0; +#X connect 96 1 97 0; +#X connect 97 0 98 0; +#X connect 98 0 99 0; +#X connect 99 0 109 0; +#X connect 100 0 101 1; +#X connect 101 0 96 0; +#X connect 102 0 100 0; +#X connect 103 0 101 0; +#X connect 104 0 105 0; +#X connect 105 0 106 0; +#X connect 106 0 94 0; +#X connect 107 0 108 1; +#X connect 108 0 110 0; +#X connect 109 0 108 0; +#X connect 109 1 107 1; +#X connect 109 2 107 0; +#X connect 110 0 111 0; +#X connect 111 0 112 0; +#X connect 112 0 113 0; +#X connect 113 0 114 0; +#X connect 114 0 104 0; +#X connect 115 0 8 0; +#X connect 116 0 8 0; +#X connect 117 0 51 0; +#X connect 118 0 51 0; +#X connect 119 0 73 0; +#X connect 120 0 73 0; +#X connect 121 0 130 0; +#X connect 122 0 175 0; +#X connect 124 1 125 0; +#X connect 125 0 126 0; +#X connect 126 0 127 0; +#X connect 127 0 137 0; +#X connect 128 0 129 1; +#X connect 129 0 124 0; +#X connect 130 0 128 0; +#X connect 131 0 129 0; +#X connect 132 0 133 0; +#X connect 133 0 134 0; +#X connect 134 0 122 0; +#X connect 135 0 136 1; +#X connect 136 0 138 0; +#X connect 137 0 136 0; +#X connect 137 1 135 1; +#X connect 137 2 135 0; +#X connect 138 0 139 0; +#X connect 139 0 140 0; +#X connect 140 0 141 0; +#X connect 141 0 142 0; +#X connect 142 0 132 0; +#X connect 143 0 95 0; +#X connect 144 0 95 0; +#X connect 145 0 39 0; +#X connect 146 0 149 0; +#X connect 148 0 145 1; +#X connect 149 0 147 0; +#X connect 150 0 151 0; +#X connect 151 0 152 0; +#X connect 153 0 142 1; +#X connect 154 0 70 1; +#X connect 155 0 114 1; +#X connect 156 0 157 0; +#X connect 157 0 7 0; +#X connect 158 0 159 0; +#X connect 159 0 122 0; +#X connect 160 0 161 0; +#X connect 161 0 29 0; +#X connect 162 0 163 0; +#X connect 163 0 50 0; +#X connect 164 0 165 0; +#X connect 165 0 72 0; +#X connect 166 0 219 0; +#X connect 175 0 123 0; +#X connect 176 0 123 0; +#X connect 177 0 30 0; +#X connect 178 0 30 0; +#X connect 179 0 188 0; +#X connect 180 0 204 0; +#X connect 182 1 183 0; +#X connect 183 0 184 0; +#X connect 184 0 185 0; +#X connect 185 0 195 0; +#X connect 186 0 187 1; +#X connect 187 0 182 0; +#X connect 188 0 186 0; +#X connect 189 0 187 0; +#X connect 190 0 191 0; +#X connect 191 0 192 0; +#X connect 192 0 180 0; +#X connect 193 0 194 1; +#X connect 194 0 196 0; +#X connect 195 0 194 0; +#X connect 195 1 193 1; +#X connect 195 2 193 0; +#X connect 196 0 197 0; +#X connect 197 0 198 0; +#X connect 198 0 199 0; +#X connect 199 0 200 0; +#X connect 200 0 190 0; +#X connect 201 0 200 1; +#X connect 202 0 203 0; +#X connect 203 0 180 0; +#X connect 204 0 181 0; +#X connect 205 0 181 0; +#X connect 208 0 209 0; +#X connect 212 0 211 0; +#X connect 213 0 214 0; +#X connect 214 0 217 0; +#X connect 214 1 212 0; +#X connect 215 0 216 0; +#X connect 217 0 215 0; +#X connect 217 0 218 0; +#X connect 219 0 94 0; diff --git a/puredata/radio_spell_workshop/radio_spell_start_sensor.pd b/puredata/sound-from-earth-workshop/radio_spell_start_sensor.pd similarity index 100% rename from puredata/radio_spell_workshop/radio_spell_start_sensor.pd rename to puredata/sound-from-earth-workshop/radio_spell_start_sensor.pd diff --git a/puredata/radio_spell_workshop/retro2.pd b/puredata/sound-from-earth-workshop/retro2.pd similarity index 100% rename from puredata/radio_spell_workshop/retro2.pd rename to puredata/sound-from-earth-workshop/retro2.pd diff --git a/puredata/radio_spell_workshop/riff2_random-help.pd b/puredata/sound-from-earth-workshop/riff2_random-help.pd similarity index 100% rename from puredata/radio_spell_workshop/riff2_random-help.pd rename to puredata/sound-from-earth-workshop/riff2_random-help.pd diff --git a/puredata/radio_spell_workshop/riff2_random.pd b/puredata/sound-from-earth-workshop/riff2_random.pd similarity index 100% rename from puredata/radio_spell_workshop/riff2_random.pd rename to puredata/sound-from-earth-workshop/riff2_random.pd diff --git a/puredata/radio_spell_workshop/rscan2.pd b/puredata/sound-from-earth-workshop/rscan2.pd similarity index 100% rename from puredata/radio_spell_workshop/rscan2.pd rename to puredata/sound-from-earth-workshop/rscan2.pd diff --git a/puredata/radio_spell_workshop/select_wind.pd b/puredata/sound-from-earth-workshop/select_wind.pd similarity index 100% rename from puredata/radio_spell_workshop/select_wind.pd rename to puredata/sound-from-earth-workshop/select_wind.pd diff --git a/puredata/radio_spell_workshop/skip.pd b/puredata/sound-from-earth-workshop/skip.pd similarity index 100% rename from puredata/radio_spell_workshop/skip.pd rename to puredata/sound-from-earth-workshop/skip.pd diff --git a/puredata/radio_spell_workshop/vfreeverb~.pd b/puredata/sound-from-earth-workshop/vfreeverb~.pd similarity index 100% rename from puredata/radio_spell_workshop/vfreeverb~.pd rename to puredata/sound-from-earth-workshop/vfreeverb~.pd diff --git a/puredata/radio_spell_workshop/world.pd b/puredata/sound-from-earth-workshop/world.pd similarity index 100% rename from puredata/radio_spell_workshop/world.pd rename to puredata/sound-from-earth-workshop/world.pd diff --git a/puredata/sound_from_earth_snu.zip b/puredata/sound_from_earth_snu.zip new file mode 100644 index 0000000000000000000000000000000000000000..043ac116d2d7cb7828a9e57f704e2b2d6cc845c4 GIT binary patch literal 5817 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 literal 0 HcmV?d00001 diff --git a/puredata/sound_from_earth_snu/o.io.slipserial.pd b/puredata/sound_from_earth_snu/o.io.slipserial.pd new file mode 100644 index 0000000..53933ca --- /dev/null +++ b/puredata/sound_from_earth_snu/o.io.slipserial.pd @@ -0,0 +1,36 @@ +#N canvas 530 426 374 320 10; +#X obj 50 18 inlet; +#X obj 50 280 outlet; +#X obj 166 18 inlet; +#X obj 50 41 slipenc 65536; +#X obj 50 253 slipdec 65536; +#X msg 219 137 info; +#X obj 107 192 route open; +#X obj 166 41 t a a; +#X obj 219 93 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000; +#X obj 170 266 outlet; +#X obj 50 104 spigot; +#X obj 154 120 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 166 64 route open devicename close; +#X obj 219 114 del 200; +#X obj 50 169 comport 99; +#X obj 226 266 outlet; +#X connect 0 0 3 0; +#X connect 2 0 7 0; +#X connect 3 0 10 0; +#X connect 4 0 1 0; +#X connect 5 0 14 0; +#X connect 6 0 9 0; +#X connect 6 0 11 0; +#X connect 6 1 15 0; +#X connect 7 0 12 0; +#X connect 7 1 14 0; +#X connect 8 0 13 0; +#X connect 10 0 14 0; +#X connect 11 0 10 1; +#X connect 12 0 8 0; +#X connect 12 1 8 0; +#X connect 12 2 8 0; +#X connect 13 0 5 0; +#X connect 14 0 4 0; +#X connect 14 1 6 0; diff --git a/puredata/sound_from_earth_snu/radio_spell_start3.pd b/puredata/sound_from_earth_snu/radio_spell_start3.pd new file mode 100644 index 0000000..598a952 --- /dev/null +++ b/puredata/sound_from_earth_snu/radio_spell_start3.pd @@ -0,0 +1,894 @@ +#N canvas 0 33 1920 981 10; +#N canvas 246 226 692 351 radio 0; +#X obj 333 282 spigot; +#X obj 382 267 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#N canvas 676 408 512 395 buildOSC 0; +#X obj 319 66 t a b; +#X msg 456 84 [; +#X msg 34 327 ]; +#X obj 68 236 r X1; +#X obj 98 236 r X2; +#X obj 128 236 r X3; +#X obj 158 236 r X4; +#X obj 53 266 f; +#X obj 34 126 t b b a; +#X obj 254 345 outlet; +#X obj 140 17 inlet; +#X obj 188 236 r PS; +#X obj 88 284 pack f f f f f; +#X msg 319 112 sendtyped /note/onoff f \$1; +#X msg 254 141 sendtyped /note/velocity f \$1; +#X msg 88 307 sendtyped /note/x fffff \$1 \$2 \$3 \$4 \$5; +#X msg 73 199 sendtyped /note/id i \$1; +#X msg 167 170 sendtyped /note/pitch f \$1; +#X obj 140 39 unpack f f f f; +#X connect 0 0 13 0; +#X connect 0 1 1 0; +#X connect 1 0 9 0; +#X connect 2 0 9 0; +#X connect 3 0 7 1; +#X connect 4 0 12 1; +#X connect 5 0 12 2; +#X connect 6 0 12 3; +#X connect 7 0 12 0; +#X connect 8 0 2 0; +#X connect 8 1 7 0; +#X connect 8 2 16 0; +#X connect 10 0 18 0; +#X connect 11 0 12 4; +#X connect 12 0 15 0; +#X connect 13 0 9 0; +#X connect 14 0 9 0; +#X connect 15 0 9 0; +#X connect 16 0 9 0; +#X connect 17 0 9 0; +#X connect 18 0 8 0; +#X connect 18 1 17 0; +#X connect 18 2 14 0; +#X connect 18 3 0 0; +#X restore 413 286 pd buildOSC for all; +#X obj 112 210 o.io.slipserial; +#X msg 138 98 devices; +#X msg 209 98 close; +#X obj 112 189 packOSC; +#X obj 112 144 r OSC; +#X obj 112 231 unpackOSC; +#X obj 112 286 routeOSC /hello; +#X obj 112 309 s HELLO; +#X obj 19 171 print OSC; +#X obj 19 144 spigot; +#X obj 68 129 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 413 309 s OSC; +#X obj 413 255 r NOTE; +#X obj 333 309 print NOTE; +#X text 414 234 /id /pitch /velocity /onoff; +#X floatatom 636 254 5 0 0 0 - - - 0; +#X obj 636 276 s PS; +#X obj 629 169 tgl 16 0 empty empty hello 20 8 0 10 #9c00fc #f8fc00 #9c00fc 0 1; +#X obj 629 121 loadbang; +#X msg 629 142 1; +#X obj 629 196 sel 1; +#X obj 19 282 spigot; +#X obj 68 267 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 19 309 print HELLO; +#X text 14 12 * a wireless "field synth" - based on 'esp now' protocol, f 14; +#X msg 629 217 2000; +#X obj 215 262 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 299 144 3 0 0 1 device\ id - - 0; +#X msg 299 164 open \$1 \, baud 57600 \, pollintervall 1 \, verbose 1; +#X obj 216 226 print info(\$0), f 8; +#X obj 226 303 outlet; +#X obj 209 15 inlet; +#X obj 209 36 tgl 16 0 empty empty empty 0 -8 0 10 #c6feff #000000 #000000 0 1; +#X obj 209 57 sel 0 1; +#X msg 258 98 devicename /dev/ttyUSB0 \, baud 57600 \, pollintervall 1 \, verbose 1; +#X connect 0 0 16 0; +#X connect 1 0 0 1; +#X connect 2 0 14 0; +#X connect 3 0 8 0; +#X connect 3 1 29 0; +#X connect 3 2 32 0; +#X connect 4 0 3 1; +#X connect 5 0 3 1; +#X connect 6 0 3 0; +#X connect 7 0 6 0; +#X connect 7 0 12 0; +#X connect 8 0 9 0; +#X connect 9 0 10 0; +#X connect 9 0 24 0; +#X connect 12 0 11 0; +#X connect 13 0 12 1; +#X connect 15 0 0 0; +#X connect 15 0 2 0; +#X connect 18 0 19 0; +#X connect 20 0 23 0; +#X connect 21 0 22 0; +#X connect 22 0 20 0; +#X connect 23 0 28 0; +#X connect 23 1 18 0; +#X connect 24 0 26 0; +#X connect 25 0 24 1; +#X connect 28 0 18 0; +#X connect 29 0 33 0; +#X connect 30 0 31 0; +#X connect 31 0 3 1; +#X connect 34 0 35 0; +#X connect 35 0 36 0; +#X connect 36 0 5 0; +#X connect 36 1 37 0; +#X connect 37 0 3 1; +#X restore 11 102 pd radio; +#X obj 11 125 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 11 81 tgl 16 0 empty empty connect/disconnect 0 -8 0 10 #c6feff #000000 #000000 0 1; +#X text 208 78 H&D : 4201 4401 4843 4357; +#X text 208 98 teens : 4567 4676 4881 4787; +#N canvas 501 33 615 801 lfo 0; +#X obj 163 744 s NOTE; +#X floatatom 383 215 5 0 0 0 - - - 0; +#X floatatom 384 259 5 0 0 0 - - - 0; +#X floatatom 387 320 5 0 0 0 - - - 0; +#X obj 388 351 vsl 16 136 -1000 1000 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 387 298 rescale -100 100; +#X floatatom 433 273 5 0 0 0 - - - 0; +#X floatatom 480 276 5 0 0 0 - - - 0; +#X text 21 100 stick; +#X obj 70 258 unpack f f f f; +#X floatatom 70 280 5 0 0 0 - - - 0; +#X obj 70 300 / 1024; +#X floatatom 124 279 5 0 0 0 - - - 0; +#X obj 383 238 lfo -sin, f 15; +#X obj 194 409 del 5000; +#X obj 194 380 t b b; +#X msg 267 408 1; +#X msg 194 437 0; +#X obj 161 562 spigot; +#X obj 194 518 tgl 16 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 164 649 5 0 0 0 - - - 0; +#X obj 164 669 skip 100; +#X floatatom 164 690 5 0 0 0 - - - 0; +#X obj 545 227 vsl 16 136 0 1000 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 545 373 5 0 0 0 - - - 0; +#X obj 315 391 * -1; +#X obj 432 91 metro 300; +#X obj 432 133 * 0.1; +#X floatatom 432 154 5 0 0 0 - - - 0; +#X obj 432 50 tgl 16 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 432 174 + 1.5; +#X floatatom 432 195 5 0 0 0 - - - 0; +#X obj 431 24 loadbang; +#X obj 432 112 random 5; +#X floatatom 119 202 10 0 0 0 - - - 16; +#X obj 69 237 route; +#X obj 119 172 + 6001; +#X obj 23 134 r HELLO; +#X text 175 152 <=== WIND # check?; +#X text 18 186 DISCONNECTED; +#X msg 162 713 4888 0 \$1 1; +#X msg 238 712 4888 0 0 0; +#X floatatom 70 331 5 0 0 0 - - - 0; +#X obj 70 564 change; +#X obj 70 585 sel 1 0; +#X obj 70 606 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 91 383 f; +#X obj 70 406 -; +#X obj 70 357 t a a b; +#X obj 70 429 abs; +#X obj 70 452 * 10; +#X floatatom 70 475 5 0 0 0 - - - 0; +#X obj 70 502 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 70 540 > 0.2; +#X floatatom 512 69 5 0 0 0 - - - 0; +#X floatatom 238 270 5 0 0 0 - - - 0; +#X obj 238 247 * 3; +#X obj 119 106 vradio 18 1 0 3 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0; +#X connect 1 0 13 0; +#X connect 2 0 5 0; +#X connect 3 0 4 0; +#X connect 4 0 18 0; +#X connect 5 0 3 0; +#X connect 6 0 5 1; +#X connect 7 0 5 2; +#X connect 9 1 10 0; +#X connect 9 2 12 0; +#X connect 10 0 11 0; +#X connect 11 0 42 0; +#X connect 13 0 2 0; +#X connect 14 0 17 0; +#X connect 15 0 14 0; +#X connect 15 1 16 0; +#X connect 16 0 19 0; +#X connect 17 0 19 0; +#X connect 18 0 20 0; +#X connect 19 0 18 1; +#X connect 20 0 21 0; +#X connect 21 0 22 0; +#X connect 22 0 40 0; +#X connect 23 0 24 0; +#X connect 24 0 25 0; +#X connect 24 0 7 0; +#X connect 25 0 6 0; +#X connect 26 0 33 0; +#X connect 27 0 28 0; +#X connect 28 0 30 0; +#X connect 29 0 26 0; +#X connect 30 0 31 0; +#X connect 31 0 1 0; +#X connect 32 0 29 0; +#X connect 33 0 27 0; +#X connect 34 0 35 1; +#X connect 35 0 9 0; +#X connect 36 0 34 0; +#X connect 40 0 0 0; +#X connect 41 0 0 0; +#X connect 42 0 48 0; +#X connect 42 0 56 0; +#X connect 43 0 44 0; +#X connect 44 0 45 0; +#X connect 45 0 15 0; +#X connect 46 0 47 1; +#X connect 47 0 49 0; +#X connect 48 0 47 0; +#X connect 48 1 46 1; +#X connect 48 2 46 0; +#X connect 49 0 50 0; +#X connect 50 0 51 0; +#X connect 51 0 52 0; +#X connect 52 0 53 0; +#X connect 53 0 43 0; +#X connect 54 0 33 1; +#X connect 55 0 30 1; +#X connect 56 0 55 0; +#X connect 57 0 36 0; +#X restore 1492 53 pd lfo based templ; +#X obj 108 167 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 0; +#X floatatom 37 718 5 0 0 0 - - - 0; +#X obj 76 803 s NOTE; +#X obj 10 318 unpack f f f f; +#X floatatom 37 360 5 0 0 0 - - - 0; +#X obj 37 382 / 1024; +#X floatatom 37 405 5 0 0 0 - - - 0; +#X floatatom 37 261 10 0 0 0 - - - 16; +#X obj 10 295 route; +#X obj 37 232 + 6001; +#X obj 10 176 r HELLO; +#X obj 37 634 change; +#X obj 37 657 sel 1 0; +#X obj 37 681 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 58 453 f; +#X obj 37 476 -; +#X obj 37 427 t a a b; +#X obj 37 499 abs; +#X obj 37 522 * 10; +#X floatatom 37 545 5 0 0 0 - - - 0; +#X obj 37 572 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 37 610 > 0.2; +#X obj 488 167 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 2; +#X floatatom 417 718 5 0 0 0 - - - 0; +#X obj 456 803 s NOTE; +#X obj 390 318 unpack f f f f; +#X floatatom 417 360 5 0 0 0 - - - 0; +#X obj 417 382 / 1024; +#X floatatom 417 405 5 0 0 0 - - - 0; +#X floatatom 417 261 10 0 0 0 - - - 16; +#X obj 390 295 route; +#X obj 417 232 + 6001; +#X obj 390 176 r HELLO; +#X obj 417 634 change; +#X obj 417 657 sel 1 0; +#X obj 417 681 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 438 453 f; +#X obj 417 476 -; +#X obj 417 427 t a a b; +#X obj 417 499 abs; +#X obj 417 522 * 10; +#X floatatom 417 545 5 0 0 0 - - - 0; +#X obj 417 572 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 678 167 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 1; +#X floatatom 607 718 5 0 0 0 - - - 0; +#X obj 646 803 s NOTE; +#X obj 580 318 unpack f f f f; +#X floatatom 607 360 5 0 0 0 - - - 0; +#X obj 607 382 / 1024; +#X floatatom 607 405 5 0 0 0 - - - 0; +#X floatatom 607 261 10 0 0 0 - - - 16; +#X obj 580 295 route; +#X obj 607 232 + 6001; +#X obj 580 176 r HELLO; +#X obj 607 634 change; +#X obj 607 657 sel 1 0; +#X obj 607 681 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 628 453 f; +#X obj 607 476 -; +#X obj 607 427 t a a b; +#X obj 607 499 abs; +#X obj 607 522 * 10; +#X floatatom 607 545 5 0 0 0 - - - 0; +#X obj 607 572 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 607 610 > 0.2; +#X obj 868 167 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 0; +#X floatatom 797 718 5 0 0 0 - - - 0; +#X obj 836 803 s NOTE; +#X obj 770 318 unpack f f f f; +#X floatatom 797 360 5 0 0 0 - - - 0; +#X obj 797 382 / 1024; +#X floatatom 797 405 5 0 0 0 - - - 0; +#X floatatom 797 261 10 0 0 0 - - - 16; +#X obj 770 295 route; +#X obj 797 232 + 6001; +#X obj 770 176 r HELLO; +#X obj 797 634 change; +#X obj 797 657 sel 1 0; +#X obj 797 681 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 818 453 f; +#X obj 797 476 -; +#X obj 797 427 t a a b; +#X obj 797 499 abs; +#X obj 797 522 * 10; +#X floatatom 797 545 5 0 0 0 - - - 0; +#X obj 797 572 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 797 610 > 0.2; +#X obj 1058 167 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 2; +#X floatatom 987 718 5 0 0 0 - - - 0; +#X obj 1026 803 s NOTE; +#X obj 960 318 unpack f f f f; +#X floatatom 987 360 5 0 0 0 - - - 0; +#X obj 987 382 / 1024; +#X floatatom 987 405 5 0 0 0 - - - 0; +#X floatatom 987 261 10 0 0 0 - - - 16; +#X obj 960 295 route; +#X obj 987 232 + 6001; +#X obj 960 176 r HELLO; +#X obj 987 634 change; +#X obj 987 657 sel 1 0; +#X obj 987 681 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 1008 453 f; +#X obj 987 476 -; +#X obj 987 427 t a a b; +#X obj 987 499 abs; +#X obj 987 522 * 10; +#X floatatom 987 545 5 0 0 0 - - - 0; +#X obj 987 572 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 987 610 > 0.2; +#X msg 37 746 4200 0 \$1 1; +#X msg 119 746 4200 0 0 0, f 11; +#X msg 607 746 4810 0 \$1 1; +#X msg 689 746 4810 0 0 0, f 11; +#X msg 797 746 4842 0 \$1 1; +#X msg 879 746 4842 0 0 0, f 11; +#X obj 298 167 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 1; +#X floatatom 227 718 5 0 0 0 - - - 0; +#X obj 266 803 s NOTE; +#X obj 200 318 unpack f f f f; +#X floatatom 227 360 5 0 0 0 - - - 0; +#X obj 227 382 / 1024; +#X floatatom 227 405 5 0 0 0 - - - 0; +#X floatatom 227 261 10 0 0 0 - - - 16; +#X obj 200 295 route; +#X obj 227 232 + 6001; +#X obj 200 176 r HELLO; +#X obj 227 634 change; +#X obj 227 657 sel 1 0; +#X obj 227 681 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 248 453 f; +#X obj 227 476 -; +#X obj 227 427 t a a b; +#X obj 227 499 abs; +#X obj 227 522 * 10; +#X floatatom 227 545 5 0 0 0 - - - 0; +#X obj 227 572 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 227 610 > 0.2; +#X msg 987 746 4555 1 \$1 1; +#X msg 1069 746 4555 1 0 0, f 11; +#X obj 417 610 > 0.3; +#X obj 711 21 vsl 18 100 0 1 0 0 empty empty empty 0 -9 0 10 #c6ffc7 #000000 #000000 0 1; +#X obj 808 79 s OUTSIDE_SENSITIVTY; +#X obj 454 571 r OUTSIDE_SENSITIVTY; +#X floatatom 808 57 5 0 0 0 - - - 0; +#X obj 981 20 vsl 18 100 0 1 0 0 empty empty empty 0 -9 0 10 #c7c6ff #000000 #000000 0 1; +#X floatatom 1078 57 5 0 0 0 - - - 0; +#X obj 1078 79 s STICK_SENSITIVTY; +#X obj 264 571 r STICK_SENSITIVTY; +#X obj 643 577 r STICK_SENSITIVTY; +#X obj 1023 577 r STICK_SENSITIVTY; +#X obj 116 667 loadbang; +#X msg 116 690 500; +#X obj 306 667 loadbang; +#X msg 306 690 500; +#X obj 496 667 loadbang; +#X msg 496 690 500; +#X obj 686 667 loadbang; +#X msg 686 690 500; +#X obj 876 667 loadbang; +#X msg 876 690 500; +#X obj 1066 667 loadbang; +#X text 1969 831 ___; +#X text -23 -33 ___; +#X text 1153 -11 // ... libraries in use: comport \, osc \, slip \, else ... //; +#X text 362 -12 // ... at 2024-09-24 \, with ... Hackers & Designers \, dianaband \, Heeju and forest all around us. //, f 108; +#X text 12 -3 // + Sound From Earth @ bottle factory \, Seoul + //; +#X text 452 55 6001 -> blow, f 20; +#X text 452 79 6003 -> outside, f 20; +#X text 452 67 6002 -> stick sensor; +#X msg 227 746 4881 0 \$1 1; +#X msg 309 746 4881 0 0 0, f 11; +#X msg 417 746 4206 0 \$1 1; +#X msg 499 746 4206 0 0 0, f 11; +#X obj 1248 167 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 1; +#X floatatom 1177 718 5 0 0 0 - - - 0; +#X obj 1216 803 s NOTE; +#X obj 1150 318 unpack f f f f; +#X floatatom 1177 360 5 0 0 0 - - - 0; +#X obj 1177 382 / 1024; +#X floatatom 1177 405 5 0 0 0 - - - 0; +#X floatatom 1177 261 10 0 0 0 - - - 16; +#X obj 1150 295 route; +#X obj 1177 232 + 6001; +#X obj 1150 176 r HELLO; +#X obj 1177 634 change; +#X obj 1177 657 sel 1 0; +#X obj 1177 681 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 1198 453 f; +#X obj 1177 476 -; +#X obj 1177 427 t a a b; +#X obj 1177 499 abs; +#X obj 1177 522 * 10; +#X floatatom 1177 545 5 0 0 0 - - - 0; +#X obj 1177 572 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 1177 610 > 0.2; +#X obj 1213 577 r STICK_SENSITIVTY; +#X obj 1256 667 loadbang; +#X msg 1256 690 500; +#X msg 1177 746 4567 1 \$1 1; +#X msg 1259 746 4567 1 0 0, f 11; +#N canvas 0 35 636 619 waving 0; +#X obj 160 738 s NOTE; +#X floatatom 380 209 5 0 0 0 - - - 0; +#X floatatom 381 253 5 0 0 0 - - - 0; +#X floatatom 384 314 5 0 0 0 - - - 0; +#X obj 385 345 vsl 16 136 -1000 1000 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 384 292 rescale -100 100; +#X floatatom 430 267 5 0 0 0 - - - 0; +#X floatatom 477 270 5 0 0 0 - - - 0; +#X obj 67 252 unpack f f f f; +#X floatatom 67 274 5 0 0 0 - - - 0; +#X obj 67 294 / 1024; +#X floatatom 121 273 5 0 0 0 - - - 0; +#X obj 380 232 lfo -sin, f 15; +#X obj 191 403 del 5000; +#X obj 191 374 t b b; +#X msg 264 402 1; +#X msg 191 431 0; +#X obj 158 556 spigot; +#X obj 191 512 tgl 16 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 161 643 5 0 0 0 - - - 0; +#X obj 161 663 skip 100; +#X floatatom 161 684 5 0 0 0 - - - 0; +#X obj 542 221 vsl 16 136 0 1000 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 542 367 5 0 0 0 - - - 0; +#X obj 312 385 * -1; +#X obj 429 85 metro 300; +#X obj 429 127 * 0.1; +#X floatatom 429 148 5 0 0 0 - - - 0; +#X obj 429 44 tgl 16 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 429 168 + 1.5; +#X floatatom 429 189 5 0 0 0 - - - 0; +#X obj 428 18 loadbang; +#X obj 429 106 random 5; +#X floatatom 116 196 10 0 0 0 - - - 16; +#X obj 66 231 route; +#X obj 116 166 + 6001; +#X floatatom 67 325 5 0 0 0 - - - 0; +#X obj 67 558 change; +#X obj 67 579 sel 1 0; +#X obj 67 600 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 88 377 f; +#X obj 67 400 -; +#X obj 67 351 t a a b; +#X obj 67 423 abs; +#X obj 67 446 * 10; +#X floatatom 67 469 5 0 0 0 - - - 0; +#X obj 67 496 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 67 534 > 0.2; +#X floatatom 509 63 5 0 0 0 - - - 0; +#X floatatom 235 264 5 0 0 0 - - - 0; +#X obj 235 241 * 3; +#X obj 119 100 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 0; +#X obj 20 128 inlet; +#X msg 159 707 4200 0 \$1 1; +#X msg 235 706 4200 0 0 0; +#X connect 1 0 12 0; +#X connect 2 0 5 0; +#X connect 3 0 4 0; +#X connect 4 0 17 0; +#X connect 5 0 3 0; +#X connect 6 0 5 1; +#X connect 7 0 5 2; +#X connect 8 1 9 0; +#X connect 8 2 11 0; +#X connect 9 0 10 0; +#X connect 10 0 36 0; +#X connect 12 0 2 0; +#X connect 13 0 16 0; +#X connect 14 0 13 0; +#X connect 14 1 15 0; +#X connect 15 0 18 0; +#X connect 16 0 18 0; +#X connect 17 0 19 0; +#X connect 18 0 17 1; +#X connect 19 0 20 0; +#X connect 20 0 21 0; +#X connect 21 0 53 0; +#X connect 22 0 23 0; +#X connect 23 0 24 0; +#X connect 23 0 7 0; +#X connect 24 0 6 0; +#X connect 25 0 32 0; +#X connect 26 0 27 0; +#X connect 27 0 29 0; +#X connect 28 0 25 0; +#X connect 29 0 30 0; +#X connect 30 0 1 0; +#X connect 31 0 28 0; +#X connect 32 0 26 0; +#X connect 33 0 34 1; +#X connect 34 0 8 0; +#X connect 35 0 33 0; +#X connect 36 0 42 0; +#X connect 36 0 50 0; +#X connect 37 0 38 0; +#X connect 38 0 39 0; +#X connect 39 0 14 0; +#X connect 40 0 41 1; +#X connect 41 0 43 0; +#X connect 42 0 41 0; +#X connect 42 1 40 1; +#X connect 42 2 40 0; +#X connect 43 0 44 0; +#X connect 44 0 45 0; +#X connect 45 0 46 0; +#X connect 46 0 47 0; +#X connect 47 0 37 0; +#X connect 48 0 32 1; +#X connect 49 0 29 1; +#X connect 50 0 49 0; +#X connect 51 0 35 0; +#X connect 52 0 34 0; +#X connect 53 0 0 0; +#X connect 54 0 0 0; +#X restore 1126 205 pd waving; +#N canvas 484 95 636 799 waving 0; +#X obj 160 738 s NOTE; +#X floatatom 380 209 5 0 0 0 - - - 0; +#X floatatom 381 253 5 0 0 0 - - - 0; +#X floatatom 384 314 5 0 0 0 - - - 0; +#X obj 385 345 vsl 16 136 -1000 1000 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 384 292 rescale -100 100; +#X floatatom 430 267 5 0 0 0 - - - 0; +#X floatatom 477 270 5 0 0 0 - - - 0; +#X obj 67 252 unpack f f f f; +#X floatatom 67 274 5 0 0 0 - - - 0; +#X obj 67 294 / 1024; +#X floatatom 121 273 5 0 0 0 - - - 0; +#X obj 380 232 lfo -sin, f 15; +#X obj 191 403 del 5000; +#X obj 191 374 t b b; +#X msg 264 402 1; +#X msg 191 431 0; +#X obj 158 556 spigot; +#X obj 191 512 tgl 16 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 161 643 5 0 0 0 - - - 0; +#X obj 161 663 skip 100; +#X floatatom 161 684 5 0 0 0 - - - 0; +#X obj 542 221 vsl 16 136 0 1000 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X floatatom 542 367 5 0 0 0 - - - 0; +#X obj 312 385 * -1; +#X obj 429 85 metro 300; +#X obj 429 127 * 0.1; +#X floatatom 429 148 5 0 0 0 - - - 0; +#X obj 429 44 tgl 16 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 429 168 + 1.5; +#X floatatom 429 189 5 0 0 0 - - - 0; +#X obj 428 18 loadbang; +#X obj 429 106 random 5; +#X floatatom 116 196 10 0 0 0 - - - 16; +#X obj 66 231 route; +#X obj 116 166 + 6001; +#X floatatom 67 325 5 0 0 0 - - - 0; +#X obj 67 558 change; +#X obj 67 579 sel 1 0; +#X obj 67 600 bng 16 250 50 0 empty empty empty 0 -8 0 10 #fcfcfc #000000 #000000; +#X obj 88 377 f; +#X obj 67 400 -; +#X obj 67 351 t a a b; +#X obj 67 423 abs; +#X obj 67 446 * 10; +#X floatatom 67 469 5 0 0 0 - - - 0; +#X obj 67 496 vsl 18 30 0 1 0 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 67 534 > 0.2; +#X floatatom 509 63 5 0 0 0 - - - 0; +#X floatatom 235 264 5 0 0 0 - - - 0; +#X obj 235 241 * 3; +#X obj 119 100 vradio 16 1 1 3 empty empty Select\ wind 0 -8 0 10 #faff00 #000000 #000000 0; +#X obj 20 128 inlet; +#X msg 159 707 4200 0 \$1 1; +#X msg 235 706 4200 0 0 0; +#X connect 1 0 12 0; +#X connect 2 0 5 0; +#X connect 3 0 4 0; +#X connect 4 0 17 0; +#X connect 5 0 3 0; +#X connect 6 0 5 1; +#X connect 7 0 5 2; +#X connect 8 1 9 0; +#X connect 8 2 11 0; +#X connect 9 0 10 0; +#X connect 10 0 36 0; +#X connect 12 0 2 0; +#X connect 13 0 16 0; +#X connect 14 0 13 0; +#X connect 14 1 15 0; +#X connect 15 0 18 0; +#X connect 16 0 18 0; +#X connect 17 0 19 0; +#X connect 18 0 17 1; +#X connect 19 0 20 0; +#X connect 20 0 21 0; +#X connect 21 0 53 0; +#X connect 22 0 23 0; +#X connect 23 0 24 0; +#X connect 23 0 7 0; +#X connect 24 0 6 0; +#X connect 25 0 32 0; +#X connect 26 0 27 0; +#X connect 27 0 29 0; +#X connect 28 0 25 0; +#X connect 29 0 30 0; +#X connect 30 0 1 0; +#X connect 31 0 28 0; +#X connect 32 0 26 0; +#X connect 33 0 34 1; +#X connect 34 0 8 0; +#X connect 35 0 33 0; +#X connect 36 0 42 0; +#X connect 36 0 50 0; +#X connect 37 0 38 0; +#X connect 38 0 39 0; +#X connect 39 0 14 0; +#X connect 40 0 41 1; +#X connect 41 0 43 0; +#X connect 42 0 41 0; +#X connect 42 1 40 1; +#X connect 42 2 40 0; +#X connect 43 0 44 0; +#X connect 44 0 45 0; +#X connect 45 0 46 0; +#X connect 46 0 47 0; +#X connect 47 0 37 0; +#X connect 48 0 32 1; +#X connect 49 0 29 1; +#X connect 50 0 49 0; +#X connect 51 0 35 0; +#X connect 52 0 34 0; +#X connect 53 0 0 0; +#X connect 54 0 0 0; +#X restore 2 202 pd waving; +#X obj 1378 243 r HELLO; +#X obj 1378 266 route 6001 6002 6003; +#X obj 1486 319 print; +#X obj 1415 430 s NOTE; +#X msg 1393 379 4000 0 300 1; +#X obj 1313 361 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 1313 384 t b b; +#X obj 1313 430 del; +#X obj 1263 403 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000; +#X obj 1313 407 expr random(30000 \, 60000); +#X floatatom 1253 496 12 0 0 0 - - - 0; +#X msg 1066 690 400; +#X connect 0 0 1 0; +#X connect 2 0 0 0; +#X connect 6 0 15 0; +#X connect 7 0 115 0; +#X connect 9 1 10 0; +#X connect 10 0 11 0; +#X connect 11 0 12 0; +#X connect 12 0 22 0; +#X connect 13 0 14 1; +#X connect 14 0 9 0; +#X connect 15 0 13 0; +#X connect 16 0 14 0; +#X connect 17 0 18 0; +#X connect 18 0 19 0; +#X connect 19 0 7 0; +#X connect 20 0 21 1; +#X connect 21 0 23 0; +#X connect 22 0 21 0; +#X connect 22 1 20 1; +#X connect 22 2 20 0; +#X connect 23 0 24 0; +#X connect 24 0 25 0; +#X connect 25 0 26 0; +#X connect 26 0 27 0; +#X connect 27 0 17 0; +#X connect 28 0 37 0; +#X connect 29 0 177 0; +#X connect 31 1 32 0; +#X connect 32 0 33 0; +#X connect 33 0 34 0; +#X connect 34 0 44 0; +#X connect 35 0 36 1; +#X connect 36 0 31 0; +#X connect 37 0 35 0; +#X connect 38 0 36 0; +#X connect 39 0 40 0; +#X connect 40 0 41 0; +#X connect 41 0 29 0; +#X connect 42 0 43 1; +#X connect 43 0 45 0; +#X connect 44 0 43 0; +#X connect 44 1 42 1; +#X connect 44 2 42 0; +#X connect 45 0 46 0; +#X connect 46 0 47 0; +#X connect 47 0 48 0; +#X connect 48 0 145 0; +#X connect 49 0 58 0; +#X connect 50 0 117 0; +#X connect 52 1 53 0; +#X connect 53 0 54 0; +#X connect 54 0 55 0; +#X connect 55 0 65 0; +#X connect 56 0 57 1; +#X connect 57 0 52 0; +#X connect 58 0 56 0; +#X connect 59 0 57 0; +#X connect 60 0 61 0; +#X connect 61 0 62 0; +#X connect 62 0 50 0; +#X connect 63 0 64 1; +#X connect 64 0 66 0; +#X connect 65 0 64 0; +#X connect 65 1 63 1; +#X connect 65 2 63 0; +#X connect 66 0 67 0; +#X connect 67 0 68 0; +#X connect 68 0 69 0; +#X connect 69 0 70 0; +#X connect 70 0 60 0; +#X connect 71 0 80 0; +#X connect 72 0 119 0; +#X connect 74 1 75 0; +#X connect 75 0 76 0; +#X connect 76 0 77 0; +#X connect 77 0 87 0; +#X connect 78 0 79 1; +#X connect 79 0 74 0; +#X connect 80 0 78 0; +#X connect 81 0 79 0; +#X connect 82 0 83 0; +#X connect 83 0 84 0; +#X connect 84 0 72 0; +#X connect 85 0 86 1; +#X connect 86 0 88 0; +#X connect 87 0 86 0; +#X connect 87 1 85 1; +#X connect 87 2 85 0; +#X connect 88 0 89 0; +#X connect 89 0 90 0; +#X connect 90 0 91 0; +#X connect 91 0 92 0; +#X connect 92 0 82 0; +#X connect 93 0 102 0; +#X connect 94 0 143 0; +#X connect 96 1 97 0; +#X connect 97 0 98 0; +#X connect 98 0 99 0; +#X connect 99 0 109 0; +#X connect 100 0 101 1; +#X connect 101 0 96 0; +#X connect 102 0 100 0; +#X connect 103 0 101 0; +#X connect 104 0 105 0; +#X connect 105 0 106 0; +#X connect 106 0 94 0; +#X connect 107 0 108 1; +#X connect 108 0 110 0; +#X connect 109 0 108 0; +#X connect 109 1 107 1; +#X connect 109 2 107 0; +#X connect 110 0 111 0; +#X connect 111 0 112 0; +#X connect 112 0 113 0; +#X connect 113 0 114 0; +#X connect 114 0 104 0; +#X connect 115 0 8 0; +#X connect 116 0 8 0; +#X connect 117 0 51 0; +#X connect 118 0 51 0; +#X connect 119 0 73 0; +#X connect 120 0 73 0; +#X connect 121 0 130 0; +#X connect 122 0 175 0; +#X connect 124 1 125 0; +#X connect 125 0 126 0; +#X connect 126 0 127 0; +#X connect 127 0 137 0; +#X connect 128 0 129 1; +#X connect 129 0 124 0; +#X connect 130 0 128 0; +#X connect 131 0 129 0; +#X connect 132 0 133 0; +#X connect 133 0 134 0; +#X connect 134 0 122 0; +#X connect 135 0 136 1; +#X connect 136 0 138 0; +#X connect 137 0 136 0; +#X connect 137 1 135 1; +#X connect 137 2 135 0; +#X connect 138 0 139 0; +#X connect 139 0 140 0; +#X connect 140 0 141 0; +#X connect 141 0 142 0; +#X connect 142 0 132 0; +#X connect 143 0 95 0; +#X connect 144 0 95 0; +#X connect 145 0 39 0; +#X connect 146 0 149 0; +#X connect 148 0 145 1; +#X connect 149 0 147 0; +#X connect 150 0 151 0; +#X connect 151 0 152 0; +#X connect 153 0 142 1; +#X connect 154 0 70 1; +#X connect 155 0 114 1; +#X connect 156 0 157 0; +#X connect 157 0 7 0; +#X connect 158 0 159 0; +#X connect 159 0 122 0; +#X connect 160 0 161 0; +#X connect 161 0 29 0; +#X connect 162 0 163 0; +#X connect 163 0 50 0; +#X connect 164 0 165 0; +#X connect 165 0 72 0; +#X connect 166 0 219 0; +#X connect 175 0 123 0; +#X connect 176 0 123 0; +#X connect 177 0 30 0; +#X connect 178 0 30 0; +#X connect 179 0 188 0; +#X connect 180 0 204 0; +#X connect 182 1 183 0; +#X connect 183 0 184 0; +#X connect 184 0 185 0; +#X connect 185 0 195 0; +#X connect 186 0 187 1; +#X connect 187 0 182 0; +#X connect 188 0 186 0; +#X connect 189 0 187 0; +#X connect 190 0 191 0; +#X connect 191 0 192 0; +#X connect 192 0 180 0; +#X connect 193 0 194 1; +#X connect 194 0 196 0; +#X connect 195 0 194 0; +#X connect 195 1 193 1; +#X connect 195 2 193 0; +#X connect 196 0 197 0; +#X connect 197 0 198 0; +#X connect 198 0 199 0; +#X connect 199 0 200 0; +#X connect 200 0 190 0; +#X connect 201 0 200 1; +#X connect 202 0 203 0; +#X connect 203 0 180 0; +#X connect 204 0 181 0; +#X connect 205 0 181 0; +#X connect 208 0 209 0; +#X connect 212 0 211 0; +#X connect 213 0 214 0; +#X connect 214 0 217 0; +#X connect 214 1 212 0; +#X connect 215 0 216 0; +#X connect 217 0 215 0; +#X connect 217 0 218 0; +#X connect 219 0 94 0; diff --git a/puredata/sound_from_earth_snu/skip.pd b/puredata/sound_from_earth_snu/skip.pd new file mode 100644 index 0000000..7386eaa --- /dev/null +++ b/puredata/sound_from_earth_snu/skip.pd @@ -0,0 +1,41 @@ +#N canvas 240 23 254 344 12; +#X floatatom 18 49 5 0 0 0 - - -; +#X obj 18 108 change; +#X obj 18 78 spigot; +#X obj 18 138 t a b; +#X obj 50 168 t b b; +#X msg 118 278 0; +#X obj 73 63 tgl 15 0 empty \$0-gate r:0-gate 17 7 0 10 -262144 -1 +-1 1 1; +#X msg 50 278 1; +#X msg 161 43 1; +#X floatatom 167 265 5 0 0 0 - - -; +#X obj 18 19 inlet; +#X obj 161 19 loadbang; +#X obj 161 73 tgl 15 0 \$0-gate empty s:0-gate 17 7 0 10 -262144 -1 +-1 1 1; +#X obj 50 308 tgl 15 0 \$0-gate empty s:0-gate 17 7 0 10 -262144 -1 +-1 1 1; +#X obj 50 198 del \$1; +#X obj 50 222 t b b; +#X obj 81 108 v \$0-track; +#X obj 82 246 v \$0-track; +#X obj 167 294 outlet; +#X connect 0 0 2 0; +#X connect 0 0 16 0; +#X connect 1 0 3 0; +#X connect 2 0 1 0; +#X connect 3 1 4 0; +#X connect 4 0 14 0; +#X connect 4 1 5 0; +#X connect 5 0 13 0; +#X connect 6 0 2 1; +#X connect 7 0 13 0; +#X connect 8 0 12 0; +#X connect 9 0 18 0; +#X connect 10 0 0 0; +#X connect 11 0 8 0; +#X connect 14 0 15 0; +#X connect 15 0 7 0; +#X connect 15 1 17 0; +#X connect 17 0 9 0;