|
-
- #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) = freqency 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);
- }
- }
-
|