forest-all-around/osc/src/main.cpp

195 lines
4.2 KiB
C++

//
// wirelessly connected cloud (Wireless Mesh Networking)
//
//
// Conversations about the ROOT @ SEMA warehouses, Seoul
//
//
// 2021 02 15
//
// (part-2) teensy35 : 'client:osc' (osc over slip --> mesh post)
//
//arduino
#include <Arduino.h>
//osc (already included in "framework-arduinoteensy")
#include <OSCBundle.h>
#include <SLIPEncodedUSBSerial.h>
SLIPEncodedUSBSerial SLIPSerial(Serial);
//post definition
#include "../../post.h"
//postman's uart
#define POSTMAN_SERIAL (Serial3)
// --[post]--> "sampler"
#include "../../post.h"
//
void setup() {
//osc
SLIPSerial.begin(57600);
//
POSTMAN_SERIAL.begin(115200);
}
//
void midinote(OSCMessage& msg, int offset) {
// matches will happen in the order. that the bundle is packed.
static int pitch = 0;
static int velocity = 0;
static int onoff = 0;
static int x1 = 0;
static int x2 = 0;
static int x3 = 0;
static int x4 = 0;
static int ps = 0;
// (1) --> /onoff
if (msg.fullMatch("/onoff", offset)) {
//
pitch = 0;
velocity = 0;
onoff = 0;
//
onoff = msg.getInt(0);
if (onoff != 0) onoff = 1;
}
// (2) --> /velocity
if (msg.fullMatch("/velocity", offset)) {
velocity = msg.getInt(0);
if (velocity < 0) velocity = 0;
if (velocity > 999) velocity = 999;
}
// (3) --> /pitch
if (msg.fullMatch("/pitch", offset)) {
pitch = msg.getInt(0);
if (pitch < 0) pitch = 0;
if (pitch > 999) pitch = 999;
}
// (4) --> /x
if (msg.fullMatch("/x", offset)) {
x1 = msg.getInt(0);
x2 = msg.getInt(1);
x3 = msg.getInt(2);
x4 = msg.getInt(3);
ps = msg.getInt(4);
char letter[POST_BUFF_LEN] = "";
snprintf(letter, POST_BUFF_LEN, "[%03d%03d%01dX%05d%05d%05d%05d%02d]",
pitch,
velocity,
onoff,
x1,
x2,
x3,
x4,
ps);
POSTMAN_SERIAL.print(letter);
}
}
//
void loop() {
//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()) {
bundleIN.route("/note", midinote);
}
}
//postman (serial comm.)
static bool insync = false;
if (insync == false) {
while (POSTMAN_SERIAL.available() > 0) {
// check the last byte
char last = POSTMAN_SERIAL.read();
// expectable last of the messages
if (last == ']' || last == '}') {
insync = true;
}
}
}
if (POSTMAN_SERIAL.available() > POST_LENGTH) {
char cstr[POST_BUFF_LEN] = "................................";
// fetch all the bytes
POSTMAN_SERIAL.readBytes(cstr, POST_LENGTH);
// protocol checks
char first = cstr[0];
char last = cstr[POST_LENGTH-1];
if (first != '[' && first != '{') {
insync = false;
}
if (last != ']' && last != '}') {
insync = false;
}
//// OK -> parse && compose & send OSC message!
String msg = String(cstr);
// hello frame ( '{' + 30 bytes + '}' )
// : {123456789012345678901234567890}
// hello frame
// : {123456789012345678901234567890}
// : {IIIA111111222222333333444444__}
// : III - ID_KEY
// .substring(1, 4);
// : 1 - data of 6 letters
// .substring(9, 14);
// : 2 - data of 6 letters
// .substring(14, 19);
// : 3 - data of 6 letters
// .substring(19, 24);
// : 4 - data of 6 letters
// .substring(24, 29);
// received a hello.
String str_id = msg.substring(1, 4);
int id = str_id.toInt();
//
OSCMessage hello("/hello");
hello.add(id);
//
String str_aa = msg.substring(4, 5);
//
if (str_aa == "A") {
//
String str_h1 = msg.substring(5, 11);
String str_h2 = msg.substring(11, 17);
String str_h3 = msg.substring(17, 23);
String str_h4 = msg.substring(23, 29);
//
hello.add(str_h1.toInt());
hello.add(str_h2.toInt());
hello.add(str_h3.toInt());
hello.add(str_h4.toInt());
}
//
SLIPSerial.beginPacket();
hello.send(SLIPSerial);
SLIPSerial.endPacket();
hello.empty();
}
}