107 lines
2.1 KiB
C++
107 lines
2.1 KiB
C++
|
|
#include <Ethernet.h>
|
|
#include <EthernetUdp.h>
|
|
#include <SPI.h>
|
|
|
|
#include <OSCBundle.h>
|
|
#include <OSCBoards.h>
|
|
|
|
/*
|
|
* UDPReceiveOSC
|
|
* Set a tone according to incoming OSC control
|
|
* Adrian Freed
|
|
*/
|
|
|
|
//UDP communication
|
|
|
|
|
|
EthernetUDP Udp;
|
|
byte mac[] = {
|
|
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // you can find this written on the board of some Arduino Ethernets or shields
|
|
|
|
//the Arduino's IP
|
|
IPAddress ip(128, 32, 122, 252);
|
|
|
|
//port numbers
|
|
const unsigned int inPort = 8888;
|
|
|
|
//converts the pin to an osc address
|
|
char * numToOSCAddress( int pin){
|
|
static char s[10];
|
|
int i = 9;
|
|
|
|
s[i--]= '\0';
|
|
do
|
|
{
|
|
s[i] = "0123456789"[pin % 10];
|
|
--i;
|
|
pin /= 10;
|
|
}
|
|
while(pin && i);
|
|
s[i] = '/';
|
|
return &s[i];
|
|
}
|
|
|
|
/**
|
|
* TONE
|
|
*
|
|
* square wave output "/tone"
|
|
*
|
|
* format:
|
|
* /tone/pin
|
|
*
|
|
* (digital value) (float value) = frequency in Hz
|
|
* (no value) disable tone
|
|
*
|
|
**/
|
|
|
|
void routeTone(OSCMessage &msg, int addrOffset ){
|
|
//iterate through all the analog pins
|
|
for(byte pin = 0; pin < NUM_DIGITAL_PINS; pin++){
|
|
//match against the pin number strings
|
|
int pinMatched = msg.match(numToOSCAddress(pin), addrOffset);
|
|
if(pinMatched){
|
|
unsigned int frequency = 0;
|
|
//if it has an int, then it's an integers frequency in Hz
|
|
if (msg.isInt(0)){
|
|
frequency = msg.getInt(0);
|
|
} //otherwise it's a floating point frequency in Hz
|
|
else if(msg.isFloat(0)){
|
|
frequency = msg.getFloat(0);
|
|
}
|
|
else
|
|
noTone(pin);
|
|
if(frequency>0)
|
|
{
|
|
if(msg.isInt(1))
|
|
tone(pin, frequency, msg.getInt(1));
|
|
else
|
|
tone(pin, frequency);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void setup() {
|
|
//setup ethernet part
|
|
Ethernet.begin(mac,ip);
|
|
Udp.begin(inPort);
|
|
|
|
}
|
|
//reads and dispatches the incoming message
|
|
void loop(){
|
|
OSCBundle bundleIN;
|
|
int size;
|
|
|
|
if( (size = Udp.parsePacket())>0)
|
|
{
|
|
while(size--)
|
|
bundleIN.fill(Udp.read());
|
|
|
|
if(!bundleIN.hasError())
|
|
bundleIN.route("/tone", routeTone);
|
|
}
|
|
}
|
|
|
|
|