Esempio n. 1
0
int libpd_noteon(int channel, int pitch, int velocity) {
  CHECK_CHANNEL
  CHECK_RANGE_7BIT(pitch)
  CHECK_RANGE_7BIT(velocity)
  sys_lock();
  inmidi_noteon(PORT, CHANNEL, pitch, velocity);
  sys_unlock();
  return 0;
}
Esempio n. 2
0
static void sys_dispatchnextmidiin( void)
{
    static t_midiparser parser[MAXMIDIINDEV], *parserp;
    int portno = midi_inqueue[midi_intail].q_portno,
    	byte = midi_inqueue[midi_intail].q_byte1;
    if (!midi_inqueue[midi_intail].q_onebyte)
    	bug("sys_dispatchnextmidiin");
    if (portno < 0 || portno >= MAXMIDIINDEV)
    	bug("sys_dispatchnextmidiin 2");
    parserp = parser + portno;
    outlet_setstacklim();
    
    if (byte >= 0xf8)
    	inmidi_realtimein(portno, byte);
    else
    {
    	inmidi_byte(portno, byte);
	if (byte & 0x80)
	{
	    if (byte == MIDITUNEREQUEST || byte == MIDIRESERVED1 ||
	    	byte == MIDIRESERVED2)
	    	    parserp->mp_status = 0;
	    else if (byte == MIDISTARTSYSEX)
	    {
	    	inmidi_sysex(portno, byte);
	    	parserp->mp_status = byte;
	    }
	    else if (byte == MIDIENDSYSEX)
	    {
	    	inmidi_sysex(portno, byte);
	    	parserp->mp_status = 0;
	    }
	    else
	    {
	    	parserp->mp_status = byte;
	    }
	    parserp->mp_gotbyte1 = 0;
	}
	else
	{
	    int cmd = (parserp->mp_status >= 0xf0 ? parserp->mp_status :
	    	(parserp->mp_status & 0xf0));
	    int chan = (parserp->mp_status & 0xf);
	    int byte1 = parserp->mp_byte1, gotbyte1 = parserp->mp_gotbyte1;
	    switch (cmd)
	    {
	    case MIDINOTEOFF:
		if (gotbyte1)
		    inmidi_noteon(portno, chan, byte1, 0),
			parserp->mp_gotbyte1 = 0;
		else parserp->mp_byte1 = byte, parserp->mp_gotbyte1 = 1;
		break;
	    case MIDINOTEON:
		if (gotbyte1)
		    inmidi_noteon(portno, chan, byte1, byte),
			parserp->mp_gotbyte1 = 0;
		else parserp->mp_byte1 = byte, parserp->mp_gotbyte1 = 1;
		break;
	    case MIDIPOLYTOUCH:
		if (gotbyte1)
		    inmidi_polyaftertouch(portno, chan, byte1, byte),
			parserp->mp_gotbyte1 = 0;
		else parserp->mp_byte1 = byte, parserp->mp_gotbyte1 = 1;
		break;
	    case MIDICONTROLCHANGE:
		if (gotbyte1)
		    inmidi_controlchange(portno, chan, byte1, byte),
			parserp->mp_gotbyte1 = 0;
		else parserp->mp_byte1 = byte, parserp->mp_gotbyte1 = 1;
		break;
	    case MIDIPROGRAMCHANGE:
		inmidi_programchange(portno, chan, byte);
		break;
	    case MIDICHANNELTOUCH:
		inmidi_aftertouch(portno, chan, byte);
		break;
	    case MIDIPITCHBEND:
		if (gotbyte1)
		    inmidi_pitchbend(portno, chan, ((byte << 7) + byte1)),
			parserp->mp_gotbyte1 = 0;
		else parserp->mp_byte1 = byte, parserp->mp_gotbyte1 = 1;
		break;
    	    case MIDISTARTSYSEX:
	    	inmidi_sysex(portno, byte);
		break;
		
		/* other kinds of messages are just dropped here.  We'll
		need another status byte before we start letting MIDI in
		again (no running status across "system" messages). */
	    case MIDITIMECODE:     /* 1 data byte*/
	    	break;
	    case MIDISONGPOS:       /* 2 */
	    	break;
	    case MIDISONGSELECT:    /* 1 */
	    	break;
	    }
	}
    }  
    midi_intail  = (midi_intail + 1 == MIDIQSIZE ? 0 : midi_intail + 1);
}
Esempio n. 3
0
 void Instance::sendNoteOff(int channel, int pitch, int velocity) {
     CHECK_CHANNEL
     CHECK_RANGE_7BIT(pitch)
     CHECK_RANGE_7BIT(velocity)
     inmidi_noteon(MIDI_PORT, MIDI_CHANNEL, pitch, 0);
 }