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; }
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); }
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); }