OSC Receiver program on mbed supporting types i:int32, b:blob, s:string, f:float32, m:MIDI. Attached OSC Sender program(in processing). Plese refer for detail:http://opensoundcontrol.org/introduction-osc

Dependencies:   EthernetNetIf mbed

Committer:
xshige
Date:
Mon Jan 10 04:08:25 2011 +0000
Revision:
0:cbfa819100c7

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xshige 0:cbfa819100c7 1 //
xshige 0:cbfa819100c7 2 // OSC Receiver
xshige 0:cbfa819100c7 3 //
xshige 0:cbfa819100c7 4 // date: 2011/1/10
xshige 0:cbfa819100c7 5 // version: 0.7
xshige 0:cbfa819100c7 6 // written by: xshige
xshige 0:cbfa819100c7 7 //
xshige 0:cbfa819100c7 8 // please find OSC Sender program at the bottom of this file
xshige 0:cbfa819100c7 9 //
xshige 0:cbfa819100c7 10 /*
xshige 0:cbfa819100c7 11 The followings are supported:
xshige 0:cbfa819100c7 12
xshige 0:cbfa819100c7 13 Transport Type:
xshige 0:cbfa819100c7 14 UDP
xshige 0:cbfa819100c7 15
xshige 0:cbfa819100c7 16 Features:
xshige 0:cbfa819100c7 17 Packet Parsing (Client)
xshige 0:cbfa819100c7 18 Not Supported:Packet Construction (Server)
xshige 0:cbfa819100c7 19 Bundle NOT Support
xshige 0:cbfa819100c7 20 Timetag NOT Support
xshige 0:cbfa819100c7 21
xshige 0:cbfa819100c7 22 Type Support:
xshige 0:cbfa819100c7 23 i: int32
xshige 0:cbfa819100c7 24 b: blob
xshige 0:cbfa819100c7 25 s: string
xshige 0:cbfa819100c7 26 f: float32
xshige 0:cbfa819100c7 27 m: MIDI message(port id, status byte, data1, data2) // I don't know the detail
xshige 0:cbfa819100c7 28
xshige 0:cbfa819100c7 29 */
xshige 0:cbfa819100c7 30
xshige 0:cbfa819100c7 31
xshige 0:cbfa819100c7 32 #include "mbed.h"
xshige 0:cbfa819100c7 33 #include "EthernetNetIf.h"
xshige 0:cbfa819100c7 34 #include "UDPSocket.h"
xshige 0:cbfa819100c7 35
xshige 0:cbfa819100c7 36 //#define DHCP
xshige 0:cbfa819100c7 37
xshige 0:cbfa819100c7 38 //#define INPUT_PORT 12000
xshige 0:cbfa819100c7 39 #define INPUT_PORT 57130
xshige 0:cbfa819100c7 40
xshige 0:cbfa819100c7 41 #ifdef DHCP
xshige 0:cbfa819100c7 42 EthernetNetIf eth;
xshige 0:cbfa819100c7 43 #else
xshige 0:cbfa819100c7 44 EthernetNetIf eth(
xshige 0:cbfa819100c7 45 IpAddr(192,168,0,25), //IP Address
xshige 0:cbfa819100c7 46 IpAddr(255,255,255,0), //Network Mask
xshige 0:cbfa819100c7 47 IpAddr(192,168,0,1), //Gateway
xshige 0:cbfa819100c7 48 IpAddr(192,168,0,1) //DNS
xshige 0:cbfa819100c7 49 );
xshige 0:cbfa819100c7 50 #endif
xshige 0:cbfa819100c7 51
xshige 0:cbfa819100c7 52 //--- OSC related stuff ---
xshige 0:cbfa819100c7 53 union OSCarg {
xshige 0:cbfa819100c7 54 // char*, int and float are assumed four bytes
xshige 0:cbfa819100c7 55 char *address;
xshige 0:cbfa819100c7 56 char *typeTag;
xshige 0:cbfa819100c7 57 int i;
xshige 0:cbfa819100c7 58 float f;
xshige 0:cbfa819100c7 59 char *s;
xshige 0:cbfa819100c7 60 struct {
xshige 0:cbfa819100c7 61 int len; // is "int i"
xshige 0:cbfa819100c7 62 char *p;
xshige 0:cbfa819100c7 63 } blob;
xshige 0:cbfa819100c7 64 char m[4]; // for MIDI
xshige 0:cbfa819100c7 65 char _b[4]; // endian conversion temp variable
xshige 0:cbfa819100c7 66 };
xshige 0:cbfa819100c7 67
xshige 0:cbfa819100c7 68 void getOSCmsg(char *packet , union OSCarg *msg){
xshige 0:cbfa819100c7 69 // Caution: the returned result points to packet as blobs or strings (not newly allocatd)
xshige 0:cbfa819100c7 70 char *p, *typeTag; char c;
xshige 0:cbfa819100c7 71
xshige 0:cbfa819100c7 72 msg[0].address = packet; // address
xshige 0:cbfa819100c7 73 msg[1].typeTag = packet+4*(strlen(msg[0].s)/4+1);//typeTag
xshige 0:cbfa819100c7 74 typeTag=msg[1].s+1; // skip ','
xshige 0:cbfa819100c7 75 p= msg[1].s+4*(strlen(msg[1].s)/4+1);
xshige 0:cbfa819100c7 76 for(int n=0; n<strlen(typeTag); n++){
xshige 0:cbfa819100c7 77 c = typeTag[n];
xshige 0:cbfa819100c7 78 if (('s'==c)) {
xshige 0:cbfa819100c7 79 msg[n+2].s=p;
xshige 0:cbfa819100c7 80 p += 4*(strlen(msg[n+2].s)/4+1);
xshige 0:cbfa819100c7 81 } else if (('i'==c)||('f'==c)) {
xshige 0:cbfa819100c7 82 // chang endian (big to little)
xshige 0:cbfa819100c7 83 msg[n+2]._b[3]=p[0];
xshige 0:cbfa819100c7 84 msg[n+2]._b[2]=p[1];
xshige 0:cbfa819100c7 85 msg[n+2]._b[1]=p[2];
xshige 0:cbfa819100c7 86 msg[n+2]._b[0]=p[3];
xshige 0:cbfa819100c7 87 p +=4;
xshige 0:cbfa819100c7 88 } else if ('b'==c) {
xshige 0:cbfa819100c7 89 // chang endian (big to little)
xshige 0:cbfa819100c7 90 // get lenth of blog (copy to msg[n].blog.len)
xshige 0:cbfa819100c7 91 msg[n+2]._b[3]=p[0];
xshige 0:cbfa819100c7 92 msg[n+2]._b[2]=p[1];
xshige 0:cbfa819100c7 93 msg[n+2]._b[1]=p[2];
xshige 0:cbfa819100c7 94 msg[n+2]._b[0]=p[3];
xshige 0:cbfa819100c7 95 p +=4;
xshige 0:cbfa819100c7 96 // get ponter of blog (copy to msg[n].blog.p)
xshige 0:cbfa819100c7 97 msg[n+2].blob.p=p;
xshige 0:cbfa819100c7 98 p += 4*(msg[n+2].blob.len/4+1);
xshige 0:cbfa819100c7 99 } else if ('m'==c) {
xshige 0:cbfa819100c7 100 // get midi data (copy to msg[n].m[])
xshige 0:cbfa819100c7 101 msg[n+2].m[0]=p[0];
xshige 0:cbfa819100c7 102 msg[n+2].m[1]=p[1];
xshige 0:cbfa819100c7 103 msg[n+2].m[2]=p[2];
xshige 0:cbfa819100c7 104 msg[n+2].m[3]=p[3];
xshige 0:cbfa819100c7 105 p +=4;
xshige 0:cbfa819100c7 106 } else {
xshige 0:cbfa819100c7 107 printf("*** Not Supported TypeTag:%s ****\n",typeTag);
xshige 0:cbfa819100c7 108 }
xshige 0:cbfa819100c7 109 };
xshige 0:cbfa819100c7 110
xshige 0:cbfa819100c7 111 }
xshige 0:cbfa819100c7 112 //-------------------------------------------
xshige 0:cbfa819100c7 113
xshige 0:cbfa819100c7 114 UDPSocket udp;
xshige 0:cbfa819100c7 115
xshige 0:cbfa819100c7 116
xshige 0:cbfa819100c7 117 void onUDPSocketEvent(UDPSocketEvent e)
xshige 0:cbfa819100c7 118 {
xshige 0:cbfa819100c7 119 union OSCarg msg[10];
xshige 0:cbfa819100c7 120
xshige 0:cbfa819100c7 121 switch(e)
xshige 0:cbfa819100c7 122 {
xshige 0:cbfa819100c7 123 case UDPSOCKET_READABLE: //The only event for now
xshige 0:cbfa819100c7 124 char buf[256] = {0};
xshige 0:cbfa819100c7 125 Host host;
xshige 0:cbfa819100c7 126 while( int len = udp.recvfrom( buf, 256, &host ) )
xshige 0:cbfa819100c7 127 {
xshige 0:cbfa819100c7 128 if( len <= 0 )
xshige 0:cbfa819100c7 129 break;
xshige 0:cbfa819100c7 130 printf("\r\nFrom %d.%d.%d.%d:\r\n",
xshige 0:cbfa819100c7 131 host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3]);
xshige 0:cbfa819100c7 132
xshige 0:cbfa819100c7 133 getOSCmsg(buf,msg);
xshige 0:cbfa819100c7 134 // address pattern samples
xshige 0:cbfa819100c7 135 if (strcmp(msg[0].address,"/test")==0) {
xshige 0:cbfa819100c7 136 printf("OSCmsg: %s %s %d %f %s %d\n",
xshige 0:cbfa819100c7 137 msg[0].address, msg[1].typeTag,msg[2].i, msg[3].f, msg[4].s, msg[5].blob.len);
xshige 0:cbfa819100c7 138 printf("blob content:\n");
xshige 0:cbfa819100c7 139 char *p=msg[5].blob.p;
xshige 0:cbfa819100c7 140 for(int n=0; n<msg[5].blob.len; p++,n++) printf(" %02X",(unsigned char)(*p));
xshige 0:cbfa819100c7 141 printf("\n");
xshige 0:cbfa819100c7 142 break;
xshige 0:cbfa819100c7 143 }
xshige 0:cbfa819100c7 144 if (strcmp(msg[0].address,"/kb/m")==0) {
xshige 0:cbfa819100c7 145 printf("OSCmsg: %s %s %d %d %d\n",
xshige 0:cbfa819100c7 146 msg[0].address, msg[1].typeTag,msg[2].i, msg[3].i, msg[4].i);
xshige 0:cbfa819100c7 147 break;
xshige 0:cbfa819100c7 148 }
xshige 0:cbfa819100c7 149 if (strcmp(msg[0].address,"/cc/m")==0) {
xshige 0:cbfa819100c7 150 printf("OSCmsg: %s %s %d %d %d\n",
xshige 0:cbfa819100c7 151 msg[0].address, msg[1].typeTag,msg[2].i, msg[3].i, msg[4].i);
xshige 0:cbfa819100c7 152 break;
xshige 0:cbfa819100c7 153 }
xshige 0:cbfa819100c7 154 if (strcmp(msg[0].address,"/1/fader1")==0) {
xshige 0:cbfa819100c7 155 printf("OSCmsg: %s %s %f\n",
xshige 0:cbfa819100c7 156 msg[0].address, msg[1].typeTag,msg[2].f);
xshige 0:cbfa819100c7 157 break;
xshige 0:cbfa819100c7 158 }
xshige 0:cbfa819100c7 159 if (strcmp(msg[0].address,"/1/knob1")==0) {
xshige 0:cbfa819100c7 160 printf("OSCmsg: %s %s %f\n",
xshige 0:cbfa819100c7 161 msg[0].address, msg[1].typeTag, msg[2].f);
xshige 0:cbfa819100c7 162 break;
xshige 0:cbfa819100c7 163 }
xshige 0:cbfa819100c7 164 if (strcmp(msg[0].address,"/1/butt/A1")==0) {
xshige 0:cbfa819100c7 165 printf("OSCmsg: %s %s %i\n",
xshige 0:cbfa819100c7 166 msg[0].address, msg[1].typeTag, msg[2].i);
xshige 0:cbfa819100c7 167 break;
xshige 0:cbfa819100c7 168 }
xshige 0:cbfa819100c7 169 if (strcmp(msg[0].address,"/1/butt/B1")==0) {
xshige 0:cbfa819100c7 170 printf("OSCmsg: %s %s %i\n",
xshige 0:cbfa819100c7 171 msg[0].address, msg[1].typeTag, msg[2].i);
xshige 0:cbfa819100c7 172 break;
xshige 0:cbfa819100c7 173 }
xshige 0:cbfa819100c7 174 if (strcmp(msg[0].address,"/mouse/dragged")==0) {
xshige 0:cbfa819100c7 175 printf("OSCmsg: %s %s %i %i\n",
xshige 0:cbfa819100c7 176 msg[0].address, msg[1].typeTag, msg[2].i, msg[3].i);
xshige 0:cbfa819100c7 177 break;
xshige 0:cbfa819100c7 178 }
xshige 0:cbfa819100c7 179 if (strcmp(msg[0].address,"/mouse/pressed")==0) {
xshige 0:cbfa819100c7 180 printf("OSCmsg: %s %s %i %i\n",
xshige 0:cbfa819100c7 181 msg[0].address, msg[1].typeTag, msg[2].i, msg[3].i);
xshige 0:cbfa819100c7 182 break;
xshige 0:cbfa819100c7 183 }
xshige 0:cbfa819100c7 184 if (strcmp(msg[0].address,"/1/xy")==0) {
xshige 0:cbfa819100c7 185 printf("OSCmsg: %s %s %f %f %d\n",
xshige 0:cbfa819100c7 186 msg[0].address, msg[1].typeTag, msg[2].f, msg[3].f, msg[4].i);
xshige 0:cbfa819100c7 187 break;
xshige 0:cbfa819100c7 188 }
xshige 0:cbfa819100c7 189 printf("undefined OSCmsg:%s %s\n",msg[0].address, msg[1].typeTag);
xshige 0:cbfa819100c7 190 } // while
xshige 0:cbfa819100c7 191 break;
xshige 0:cbfa819100c7 192 } // case
xshige 0:cbfa819100c7 193 }
xshige 0:cbfa819100c7 194
xshige 0:cbfa819100c7 195 int main() {
xshige 0:cbfa819100c7 196 // make debug port Fast
xshige 0:cbfa819100c7 197 Serial pc(USBTX, USBRX);
xshige 0:cbfa819100c7 198 // pc.baud(9600);
xshige 0:cbfa819100c7 199 pc.baud(115200);
xshige 0:cbfa819100c7 200 // pc.baud(230400);
xshige 0:cbfa819100c7 201
xshige 0:cbfa819100c7 202 printf("Setting up...\r\n");
xshige 0:cbfa819100c7 203 EthernetErr ethErr = eth.setup();
xshige 0:cbfa819100c7 204 if(ethErr)
xshige 0:cbfa819100c7 205 {
xshige 0:cbfa819100c7 206 printf("Error %d in setup.\r\n", ethErr);
xshige 0:cbfa819100c7 207 return -1;
xshige 0:cbfa819100c7 208 }
xshige 0:cbfa819100c7 209 printf("Setup OK\r\n");
xshige 0:cbfa819100c7 210
xshige 0:cbfa819100c7 211
xshige 0:cbfa819100c7 212 // port setup
xshige 0:cbfa819100c7 213 Host recHost(IpAddr(192, 168, 0, 7), INPUT_PORT, NULL);
xshige 0:cbfa819100c7 214 udp.setOnEvent(&onUDPSocketEvent);
xshige 0:cbfa819100c7 215 udp.bind(recHost);
xshige 0:cbfa819100c7 216
xshige 0:cbfa819100c7 217 Timer tmr;
xshige 0:cbfa819100c7 218 tmr.start();
xshige 0:cbfa819100c7 219 while(true)
xshige 0:cbfa819100c7 220 {
xshige 0:cbfa819100c7 221 Net::poll();
xshige 0:cbfa819100c7 222 if(tmr.read() > 5)
xshige 0:cbfa819100c7 223 {
xshige 0:cbfa819100c7 224 tmr.reset();
xshige 0:cbfa819100c7 225 }
xshige 0:cbfa819100c7 226 }
xshige 0:cbfa819100c7 227
xshige 0:cbfa819100c7 228
xshige 0:cbfa819100c7 229 }
xshige 0:cbfa819100c7 230 //----------------------------------------------------------------------------------------------------------
xshige 0:cbfa819100c7 231 /*
xshige 0:cbfa819100c7 232
xshige 0:cbfa819100c7 233 //
xshige 0:cbfa819100c7 234 // OSC mouse (OSC Sender)
xshige 0:cbfa819100c7 235 //
xshige 0:cbfa819100c7 236 // written in: processing(refer to: http://processing.org/)
xshige 0:cbfa819100c7 237 //
xshige 0:cbfa819100c7 238 // please install oscP5 lib
xshige 0:cbfa819100c7 239 // you can download this from: http://www.sojamo.de/libraries/oscP5/
xshige 0:cbfa819100c7 240
xshige 0:cbfa819100c7 241 import oscP5.*;
xshige 0:cbfa819100c7 242
xshige 0:cbfa819100c7 243 // initialise all OSC functionality
xshige 0:cbfa819100c7 244 void initOsc() {
xshige 0:cbfa819100c7 245 host = "192.168.0.25"; // mbed IP address (change this to fit your mbed)
xshige 0:cbfa819100c7 246 sendToPort = 57130; // mbed port# (chang this if you need)
xshige 0:cbfa819100c7 247 receiveAtPort = 12000; // not used at this time
xshige 0:cbfa819100c7 248 oscP5event = "oscEvent"; // the analyser method
xshige 0:cbfa819100c7 249 oscP5 = new OscP5(this, host, sendToPort, receiveAtPort, oscP5event);
xshige 0:cbfa819100c7 250 }
xshige 0:cbfa819100c7 251
xshige 0:cbfa819100c7 252 // oscP5 instance for the osc communication
xshige 0:cbfa819100c7 253 OscP5 oscP5;
xshige 0:cbfa819100c7 254 int receiveAtPort;
xshige 0:cbfa819100c7 255 int sendToPort;
xshige 0:cbfa819100c7 256 String host;
xshige 0:cbfa819100c7 257 String oscP5event;
xshige 0:cbfa819100c7 258
xshige 0:cbfa819100c7 259 void setup(){
xshige 0:cbfa819100c7 260 background(0);
xshige 0:cbfa819100c7 261 size(400, 400);
xshige 0:cbfa819100c7 262 initOsc();
xshige 0:cbfa819100c7 263 sendTestMsg();
xshige 0:cbfa819100c7 264 }
xshige 0:cbfa819100c7 265
xshige 0:cbfa819100c7 266 void oscEvent(OscIn oscIn) {
xshige 0:cbfa819100c7 267 println("\n\nreceived a message ... forwarding to analyseMessage(OscIn)");
xshige 0:cbfa819100c7 268 analyseMessage(oscIn);
xshige 0:cbfa819100c7 269 }
xshige 0:cbfa819100c7 270
xshige 0:cbfa819100c7 271 void analyseMessage(OscIn oscIn) {
xshige 0:cbfa819100c7 272 println("you have received an osc message "+
xshige 0:cbfa819100c7 273 oscIn.getAddrPatternAsBytes()+" "+oscIn.getTypetagAsBytes()
xshige 0:cbfa819100c7 274 );
xshige 0:cbfa819100c7 275 byte[] o = oscIn.getBytes();
xshige 0:cbfa819100c7 276 for(int i=0;i<o.length;i++) {
xshige 0:cbfa819100c7 277 if ((i%4)==0) println("\n--------------------");
xshige 0:cbfa819100c7 278 print(hex(o[i],2)+"("+char(o[i])+")"+":");
xshige 0:cbfa819100c7 279 if ((((i+1)%4)==0)&&((i+1)>=4)) {
xshige 0:cbfa819100c7 280 int data= (0x1000000*(o[i-3]&0xFF)+
xshige 0:cbfa819100c7 281 0x10000*(o[i-2]&0xFF)+
xshige 0:cbfa819100c7 282 0x100*(o[i-1]&0xFF)+
xshige 0:cbfa819100c7 283 (o[i]&0xFF));
xshige 0:cbfa819100c7 284 print("\nint: "+data);
xshige 0:cbfa819100c7 285 print("\nfloat: "+Float.intBitsToFloat(data));
xshige 0:cbfa819100c7 286 }
xshige 0:cbfa819100c7 287 }
xshige 0:cbfa819100c7 288 }
xshige 0:cbfa819100c7 289
xshige 0:cbfa819100c7 290 void draw() {
xshige 0:cbfa819100c7 291 }
xshige 0:cbfa819100c7 292
xshige 0:cbfa819100c7 293 void sendTestMsg() {
xshige 0:cbfa819100c7 294 OscMessage oscMsg= oscP5.newMsg("/test");
xshige 0:cbfa819100c7 295 oscMsg.add(mouseY);
xshige 0:cbfa819100c7 296 oscMsg.add(34.55);
xshige 0:cbfa819100c7 297 oscMsg.add("yippyy!");
xshige 0:cbfa819100c7 298 // add a byte blob to the osc message
xshige 0:cbfa819100c7 299 oscMsg.add(
xshige 0:cbfa819100c7 300 new byte[] {0x00, 0x01, 0x10, 0x20,0x30,0x40,0x50,0x60,0x7F,
xshige 0:cbfa819100c7 301 -128,-1,(byte)0x80,(byte)0x90,(byte)0xA0,(byte)0xB0,(byte)0xC0,
xshige 0:cbfa819100c7 302 (byte)0xD0,(byte)0xE0,(byte)0xFF});
xshige 0:cbfa819100c7 303 // 0x80,0x90,0xFE,0xFF etc do not work because byte is 127 thru -128.
xshige 0:cbfa819100c7 304 // so do it like: (byte)0xFF
xshige 0:cbfa819100c7 305 oscP5.send(oscMsg);
xshige 0:cbfa819100c7 306 }
xshige 0:cbfa819100c7 307
xshige 0:cbfa819100c7 308 void mousePressed() {
xshige 0:cbfa819100c7 309 OscMessage oscMsg= oscP5.newMsg("/mouse/pressed");
xshige 0:cbfa819100c7 310 oscMsg.add(mouseX);
xshige 0:cbfa819100c7 311 oscMsg.add(mouseY);
xshige 0:cbfa819100c7 312 oscP5.send(oscMsg);
xshige 0:cbfa819100c7 313 //
xshige 0:cbfa819100c7 314 oscMsg= oscP5.newMsg("/1/xy");
xshige 0:cbfa819100c7 315 oscMsg.add(mouseX*1.0/width);
xshige 0:cbfa819100c7 316 oscMsg.add(mouseY*1.0/height);
xshige 0:cbfa819100c7 317 oscMsg.add(1);// button status:pressed
xshige 0:cbfa819100c7 318 oscP5.send(oscMsg);
xshige 0:cbfa819100c7 319 }
xshige 0:cbfa819100c7 320
xshige 0:cbfa819100c7 321 void mouseDragged() {
xshige 0:cbfa819100c7 322 OscMessage oscMsg= oscP5.newMsg("/mouse/dragged");
xshige 0:cbfa819100c7 323 oscMsg.add(mouseX);
xshige 0:cbfa819100c7 324 oscMsg.add(mouseY);
xshige 0:cbfa819100c7 325 oscP5.send(oscMsg);
xshige 0:cbfa819100c7 326 //
xshige 0:cbfa819100c7 327 oscMsg= oscP5.newMsg("/1/xy");
xshige 0:cbfa819100c7 328 oscMsg.add(mouseX*1.0/width);
xshige 0:cbfa819100c7 329 oscMsg.add(mouseY*1.0/height);
xshige 0:cbfa819100c7 330 oscMsg.add(1); // button status:pressed
xshige 0:cbfa819100c7 331 oscP5.send(oscMsg);
xshige 0:cbfa819100c7 332 }
xshige 0:cbfa819100c7 333
xshige 0:cbfa819100c7 334 void mouseReleased() {
xshige 0:cbfa819100c7 335 OscMessage oscMsg= oscP5.newMsg("/1/xy");
xshige 0:cbfa819100c7 336 oscMsg.add(mouseX*1.0/width);
xshige 0:cbfa819100c7 337 oscMsg.add(mouseY*1.0/height);
xshige 0:cbfa819100c7 338 oscMsg.add(0); // button status:released
xshige 0:cbfa819100c7 339 oscP5.send(oscMsg);
xshige 0:cbfa819100c7 340 }
xshige 0:cbfa819100c7 341 */
xshige 0:cbfa819100c7 342 //----------------------------------------------------------------------------------------------------------