// To receive from OSS. static void *midireceiver(void *arg){ struct Data *data=(struct Data*)arg; int fd=open("/dev/midi1",O_RDONLY|O_NDELAY); char dasbyte; int byte; int ret; int val1=-1,val2=0; bool lastwasval2=false; if(fd==-1){ close(fd); fprintf(stderr,"vstclient: Could not open midi\n"); return NULL; } while(1){ ret=read(fd,&dasbyte,1); if(data->toquit==true) break; byte=dasbyte&0xff; if(ret>0){ if(byte>=0xf0){ if(byte>0xf7){ sendmidi(byte,0,0); }else{ val1=-1; } }else{ if( (byte&0xf0) >=0x80){ val1=byte; }else{ if(val1!=-1){ if( (val1&0xf0) ==0xc0 || (val1&0xc0) ==0xd0){ sendmidi(val1,byte,0); }else{ if(lastwasval2==true){ sendmidi(val1,val2,byte); lastwasval2=false; }else{ val2=byte; lastwasval2=true; } } } } } } } return NULL; }
int prSendMIDIOut(struct VMGlobals *g, int numArgsPushed) { //port, uid, len, hiStatus, loStatus, a, b, latency //PyrSlot *m = g->sp - 8; PyrSlot *p = g->sp - 7; PyrSlot *u = g->sp - 6; PyrSlot *l = g->sp - 5; PyrSlot *his = g->sp - 4; PyrSlot *los = g->sp - 3; PyrSlot *a = g->sp - 2; PyrSlot *b = g->sp - 1; PyrSlot *plat = g->sp; int err, outputIndex, uid, length, hiStatus, loStatus, aval, bval; float late; err = slotIntVal(p, &outputIndex); if (err) return err; if (outputIndex < 0 || outputIndex >= gNumMIDIInPorts) return errIndexOutOfRange; err = slotIntVal(u, &uid); if (err) return err; err = slotIntVal(l, &length); if (err) return err; err = slotIntVal(his, &hiStatus); if (err) return err; err = slotIntVal(los, &loStatus); if (err) return err; err = slotIntVal(a, &aval); if (err) return err; err = slotIntVal(b, &bval); if (err) return err; err = slotFloatVal(plat, &late); if (err) return err; MIDIEndpointRef dest; MIDIObjectType mtype; MIDIObjectFindByUniqueID(uid, (MIDIObjectRef*)&dest, &mtype); if (mtype != kMIDIObjectType_Destination) return errFailed; if (!dest) return errFailed; sendmidi(outputIndex, dest, length, hiStatus, loStatus, aval, bval, late); return errNone; }
static void *midireceiver(void *arg){ struct Data *data=(struct Data*)arg; AEffect *effect=data->effect; snd_seq_event_t *event; for(;;){ snd_seq_event_input(data->seq, &event); if(data->toquit==true) break; switch(event->type){ case SND_SEQ_EVENT_NOTEON: sendmidi(effect,0x90+event->data.note.channel,event->data.note.note,event->data.note.velocity); //printf("Noteon, channel: %d note: %d vol: %d\n",event->data.note.channel,event->data.note.note,event->data.note.velocity); break; case SND_SEQ_EVENT_NOTEOFF: sendmidi(effect,0x90+event->data.note.channel,event->data.note.note,0); //printf("Noteoff, channel: %d note: %d vol: %d\n",event->data.note.channel,event->data.note.note,event->data.note.velocity); break; case SND_SEQ_EVENT_KEYPRESS: //printf("Keypress, channel: %d note: %d vol: %d\n",event->data.note.channel,event->data.note.note,event->data.note.velocity); sendmidi(effect,0xa0+event->data.note.channel,event->data.note.note,event->data.note.velocity); break; case SND_SEQ_EVENT_CONTROLLER: sendmidi(effect,0xb0+event->data.control.channel,event->data.control.param,event->data.control.value); //printf("Control: %d %d %d\n",event->data.control.channel,event->data.control.param,event->data.control.value); break; case SND_SEQ_EVENT_PITCHBEND: { int val=event->data.control.value + 0x2000; sendmidi(effect,0xe0+event->data.control.channel,val&127,val>>7); } //printf("Pitch: %d %d %d\n",event->data.control.channel,event->data.control.param,event->data.control.value); break; case SND_SEQ_EVENT_CHANPRESS: //printf("chanpress: %d %d %d\n",event->data.control.channel,event->data.control.param,event->data.control.value); sendmidi(effect,0xc0+event->data.control.channel,event->data.control.value,0); break; case SND_SEQ_EVENT_PGMCHANGE: //printf("pgmchange: %d %d %d\n",event->data.control.channel,event->data.control.param,event->data.control.value); sendmidi(effect,0xc0+event->data.control.channel,event->data.control.value,0); break; default: //printf("Unknown type: %d\n",event->type); break; } } return NULL; }