#include #include #include #include #include /* * 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); } }