Пример #1
0
// 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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}