osc --> mesh done.
This commit is contained in:
parent
2d41b9b4f6
commit
b31db0e5e5
5 changed files with 159 additions and 36 deletions
147
osc/src/main.cpp
147
osc/src/main.cpp
|
|
@ -1,19 +1,34 @@
|
||||||
//arduino
|
//
|
||||||
#include <Arduino.h>
|
// wirelessly connected cloud (Wireless Mesh Networking)
|
||||||
|
// MIDI-like
|
||||||
|
// spacial
|
||||||
|
// sampler keyboard
|
||||||
|
//
|
||||||
|
|
||||||
//osc
|
//
|
||||||
#include <OSCBundle.h>
|
// COSMO40 @ Incheon w/ Factory2
|
||||||
#ifdef SLIP_USBSERIAL
|
// RTA @ Seoul w/ Post Territory Ujeongguk
|
||||||
#include <SLIPEncodedUSBSerial.h>
|
//
|
||||||
SLIPEncodedUSBSerial SLIPSerial(Serial);
|
|
||||||
|
|
||||||
//i2c
|
//
|
||||||
#include <Wire.h>
|
// 2019 12 11
|
||||||
const int16_t I2C_ADDR = 3;
|
//
|
||||||
#define POST_LENGTH 32
|
// (part-2) teensy35 : 'client:osc' (osc over slip --> mesh post)
|
||||||
#define POST_BUFF_LEN (POST_LENGTH + 1)
|
//
|
||||||
//==========<protocol>==========
|
// especially, MIDI-like.
|
||||||
// postman's protocol
|
// collect following OSC msg.
|
||||||
|
//
|
||||||
|
// "/note/onoff"
|
||||||
|
// "/note/velocity"
|
||||||
|
// "/note/key"
|
||||||
|
//
|
||||||
|
// and build a MIDI-like letter post.
|
||||||
|
// and give it to the postman
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// --[post]--> "sampler"
|
||||||
|
//
|
||||||
// letter frame ( '[' + 30 bytes + ']' )
|
// letter frame ( '[' + 30 bytes + ']' )
|
||||||
// : [123456789012345678901234567890]
|
// : [123456789012345678901234567890]
|
||||||
// 'MIDI' letter frame
|
// 'MIDI' letter frame
|
||||||
|
|
@ -25,33 +40,45 @@ const int16_t I2C_ADDR = 3;
|
||||||
// .substring(4, 7);
|
// .substring(4, 7);
|
||||||
// : G - Gate (note on/off)
|
// : G - Gate (note on/off)
|
||||||
// .substring(7, 8);
|
// .substring(7, 8);
|
||||||
//==========</protocol>=========
|
//
|
||||||
|
|
||||||
|
//arduino
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
//osc
|
||||||
|
#include <OSCBundle.h>
|
||||||
|
#include <SLIPEncodedUSBSerial.h>
|
||||||
|
SLIPEncodedUSBSerial SLIPSerial(Serial);
|
||||||
|
|
||||||
|
//i2c
|
||||||
|
#include <Wire.h>
|
||||||
|
// --[post]--> "sampler"
|
||||||
|
#include "../../sampler/post_sampler.h"
|
||||||
void receiveEvent(int howMany) {
|
void receiveEvent(int howMany) {
|
||||||
// nothing to expect.. but.. let's just print out..
|
// nothing to expect.. but.. let's just print out..
|
||||||
while (Wire.available())
|
// while (Wire.available())
|
||||||
Serial.print(Wire.read());
|
// Serial.print(Wire.read());
|
||||||
Serial.println();
|
// Serial.println();
|
||||||
}
|
}
|
||||||
// well. i don't know how fast should i be able to send msg.. to the net..
|
// well. i don't know how fast should i be able to send msg.. to the net..
|
||||||
// first test, and then.. if needed. will come back.
|
// first test, and then.. if needed. will come back.
|
||||||
bool new_letter;
|
bool new_letter = false;
|
||||||
char letter_outro[POST_BUFF_LEN] = "................................";
|
char letter_outro[POST_BUFF_LEN] = "................................";
|
||||||
|
void letter_outro_clear() {
|
||||||
|
// clear the letter buff
|
||||||
|
letter_outro[0] = '[';
|
||||||
|
for (int i = 1; i < POST_LENGTH-1; i++) letter_outro[i] = '.';
|
||||||
|
letter_outro[POST_LENGTH-1] = ']';
|
||||||
|
}
|
||||||
void requestEvent() {
|
void requestEvent() {
|
||||||
if (random(1000) == 0) {
|
if (new_letter) {
|
||||||
Wire.write("[bcdefghabcdefghabcdefghabcdefg]"); //32 bytes
|
Wire.write(letter_outro, POST_LENGTH);
|
||||||
|
new_letter = false;
|
||||||
} else {
|
} else {
|
||||||
Wire.write(" "); // no letter to send
|
Wire.write(" "); // no letter to send
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void I2CPrint(const String & str); // for DEBUG w/ I2C
|
||||||
//
|
|
||||||
void midinote(OSCMessage &msg, int offset) {
|
|
||||||
// msg.match("/oncnt");
|
|
||||||
if (msg.match("/onoff")) {
|
|
||||||
msg.match("/velocity");
|
|
||||||
msg.match("/pitch");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
void setup() {
|
void setup() {
|
||||||
|
|
@ -64,7 +91,43 @@ void setup() {
|
||||||
SLIPSerial.begin(57600);
|
SLIPSerial.begin(57600);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
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;
|
||||||
|
// (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 > 127) velocity = 127;
|
||||||
|
}
|
||||||
|
// (3) --> /pitch
|
||||||
|
if (msg.fullMatch("/pitch", offset)) {
|
||||||
|
pitch = msg.getInt(0);
|
||||||
|
if (pitch < 0) pitch = 0;
|
||||||
|
if (pitch > 127) pitch = 127;
|
||||||
|
//
|
||||||
|
// while (new_letter != false) {}; // <-- sort of semaphore.. but it doesn't work yet.. buggy.
|
||||||
|
sprintf(letter_outro, "[%03d%03d%01d.......................]", pitch, velocity, onoff);
|
||||||
|
new_letter = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
void loop() {
|
void loop() {
|
||||||
|
static String str = "";
|
||||||
//osc
|
//osc
|
||||||
OSCBundle bundleIN;
|
OSCBundle bundleIN;
|
||||||
int size;
|
int size;
|
||||||
|
|
@ -78,4 +141,28 @@ void loop() {
|
||||||
if(!bundleIN.hasError()) {
|
if(!bundleIN.hasError()) {
|
||||||
bundleIN.route("/note", midinote);
|
bundleIN.route("/note", midinote);
|
||||||
}
|
}
|
||||||
|
// else {
|
||||||
|
// str = "error! : " + String(bundleIN.getError());
|
||||||
|
// I2CPrint(str);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========<I2CPrint>==========
|
||||||
|
// utility func. -> for DEBUG w/ I2C
|
||||||
|
char buff[POST_LENGTH] = "";
|
||||||
|
void I2CPrint(const String & str) {
|
||||||
|
const char * buff = str.c_str();
|
||||||
|
int len = str.length();
|
||||||
|
// while (new_letter != false) {};
|
||||||
|
letter_outro[0] = '[';
|
||||||
|
if (len > (POST_LENGTH - 2)) len = (POST_LENGTH - 2);
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
letter_outro[i+1] = buff[i];
|
||||||
|
}
|
||||||
|
for (int j = len; j < (POST_LENGTH - 2); j++) {
|
||||||
|
letter_outro[j+1] = '_';
|
||||||
|
}
|
||||||
|
letter_outro[POST_LENGTH-1] = ']';
|
||||||
|
new_letter = true;
|
||||||
|
}
|
||||||
|
//==========</I2CPrint>=========
|
||||||
|
|
|
||||||
5
post.h
Normal file
5
post.h
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define I2C_ADDR 3
|
||||||
|
#define POST_LENGTH 32
|
||||||
|
#define POST_BUFF_LEN (POST_LENGTH + 1)
|
||||||
17
sampler/post_sampler.h
Normal file
17
sampler/post_sampler.h
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "../post.h"
|
||||||
|
|
||||||
|
//
|
||||||
|
// letter frame ( '[' + 30 bytes + ']' )
|
||||||
|
// : [123456789012345678901234567890]
|
||||||
|
// 'MIDI' letter frame
|
||||||
|
// : [123456789012345678901234567890]
|
||||||
|
// : [KKKVVVG.......................]
|
||||||
|
// : KKK - Key
|
||||||
|
// .substring(1, 4);
|
||||||
|
// : VVV - Velocity (volume/amp.)
|
||||||
|
// .substring(4, 7);
|
||||||
|
// : G - Gate (note on/off)
|
||||||
|
// .substring(7, 8);
|
||||||
|
//
|
||||||
|
|
@ -1,12 +1,28 @@
|
||||||
|
//
|
||||||
|
// wirelessly connected cloud (Wireless Mesh Networking)
|
||||||
|
// MIDI-like
|
||||||
|
// spacial
|
||||||
|
// sampler keyboard
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// COSMO40 @ Incheon w/ Factory2
|
||||||
|
// RTA @ Seoul w/ Post Territory Ujeongguk
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// 2019 12 11
|
||||||
|
//
|
||||||
|
// (part-3) teensy35 : 'client:sampler' (mesh post --> play sounds)
|
||||||
|
//
|
||||||
|
|
||||||
//HACK: let auto-poweroff speakers stay turned ON! - (creative muvo mini)
|
//HACK: let auto-poweroff speakers stay turned ON! - (creative muvo mini)
|
||||||
#define IDLE_FREQ 22000
|
#define IDLE_FREQ 22000
|
||||||
#define IDLE_AMP 0 // --> creative muvo 2 doesn't need this. they just stay on!
|
#define IDLE_AMP 0 // --> creative muvo 2 doesn't need this. they just stay on!
|
||||||
|
|
||||||
//i2c
|
//i2c
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#define I2C_ADDR 3
|
#include "../post_sampler.h"
|
||||||
#define POST_LENGTH 32
|
|
||||||
#define POST_BUFF_LEN (POST_LENGTH + 1)
|
|
||||||
|
|
||||||
//teensy audio
|
//teensy audio
|
||||||
#include <Audio.h>
|
#include <Audio.h>
|
||||||
|
|
|
||||||
|
|
@ -75,9 +75,7 @@
|
||||||
|
|
||||||
//i2c
|
//i2c
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#define I2C_ADDR 3
|
#include "../post.h"
|
||||||
#define POST_LENGTH 32
|
|
||||||
#define POST_BUFF_LEN (POST_LENGTH + 1)
|
|
||||||
|
|
||||||
//painlessmesh
|
//painlessmesh
|
||||||
#include <painlessMesh.h>
|
#include <painlessMesh.h>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue