c2-utopia/lib/OSC/examples/UDPReceive/UDPReceive.ino

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);
}
}