static void midisetparam(CMMIDI midi) { UINT8 i; UINT j; MIDICH mch; mch = midi->mch; sound_sync(); for (i=0; i<16; i++, mch++) { if (mch->press != 0xff) { midiout_shortmsg(midi->midihdl, MIDIOUTS(0xa0+i, mch->press, 0)); } if (mch->bend != 0xffff) { midiout_shortmsg(midi->midihdl, (mch->bend << 8) + 0xe0+i); } for (j=0; j<NELEMENTS(midictrltbl); j++) { if (mch->ctrl[j+1] != 0xff) { midiout_shortmsg(midi->midihdl, MIDIOUTS(0xb0+i, midictrltbl[j], mch->ctrl[j+1])); } } if (mch->prog != 0xff) { midiout_shortmsg(midi->midihdl, MIDIOUTS(0xc0+i, mch->prog, 0)); } } }
static void midiout_vermouth(CMMIDI midi, UINT32 msg, UINT cnt) { sound_sync(); midiout_shortmsg(midi->vermouth, msg); }
static void midireset(CMMIDI midi) { UINT8 work[4]; midiout_longmsg(midi->midihdl, EXCV_GMRESET, sizeof(EXCV_GMRESET)); work[1] = 0x7b; work[2] = 0x00; for (work[0]=0xb0; work[0]<0xc0; work[0]++) { keydisp_midi(work); sound_sync(); midiout_shortmsg(midi->midihdl, MIDIOUTS3(work)); } }
static UINT midiwrite(COMMNG self, UINT8 data) { CMMIDI midi; MIDICH mch; midi = (CMMIDI)(self + 1); switch(data) { case MIDI_TIMING: case MIDI_START: case MIDI_CONTINUE: case MIDI_STOP: case MIDI_ACTIVESENSE: case MIDI_SYSTEMRESET: return(1); } if (midi->midictrl == MIDICTRL_READY) { if (data & 0x80) { midi->mpos = 0; switch(data & 0xf0) { case 0xc0: case 0xd0: midi->midictrl = MIDICTRL_2BYTES; break; case 0x80: case 0x90: case 0xa0: case 0xb0: case 0xe0: midi->midictrl = MIDICTRL_3BYTES; midi->midilast = data; break; default: switch(data) { case MIDI_EXCLUSIVE: midi->midictrl = MIDICTRL_EXCLUSIVE; break; case MIDI_TIMECODE: midi->midictrl = MIDICTRL_TIMECODE; break; case MIDI_SONGPOS: midi->midictrl = MIDICTRL_SYSTEM; midi->midisyscnt = 3; break; case MIDI_SONGSELECT: midi->midictrl = MIDICTRL_SYSTEM; midi->midisyscnt = 2; break; case MIDI_TUNEREQUEST: midi->midictrl = MIDICTRL_SYSTEM; midi->midisyscnt = 1; break; // case MIDI_EOX: default: return(1); } break; } } else { // Key-onのみな気がしたんだけど忘れた… // running status midi->buffer[0] = midi->midilast; midi->mpos = 1; midi->midictrl = MIDICTRL_3BYTES; } } midi->buffer[midi->mpos] = data; midi->mpos++; switch(midi->midictrl) { case MIDICTRL_2BYTES: if (midi->mpos >= 2) { midi->buffer[1] &= 0x7f; mch = midi->mch + (midi->buffer[0] & 0xf); switch(midi->buffer[0] & 0xf0) { case 0xa0: mch->press = midi->buffer[1]; break; case 0xc0: mch->prog = midi->buffer[1]; break; } keydisp_midi(midi->buffer); sound_sync(); midiout_shortmsg(midi->midihdl, MIDIOUTS2(midi->buffer)); midi->midictrl = MIDICTRL_READY; return(2); } break; case MIDICTRL_3BYTES: if (midi->mpos >= 3) { midi->buffer[1] &= 0x7f; midi->buffer[2] &= 0x7f; mch = midi->mch + (midi->buffer[0] & 0xf); switch(midi->buffer[0] & 0xf0) { case 0xb0: if (midi->buffer[1] == 123) { mch->press = 0; mch->bend = 0x4000; mch->ctrl[1+1] = 0; // Modulation mch->ctrl[5+1] = 127; // Explession mch->ctrl[6+1] = 0; // Hold mch->ctrl[7+1] = 0; // Portament mch->ctrl[8+1] = 0; // Sostenute mch->ctrl[9+1] = 0; // Soft } else { mch->ctrl[midictrlindex[midi->buffer[1]]] = midi->buffer[2]; } break; case 0xe0: mch->bend = LOADINTELWORD(midi->buffer + 1); break; } keydisp_midi(midi->buffer); sound_sync(); midiout_shortmsg(midi->midihdl, MIDIOUTS3(midi->buffer)); midi->midictrl = MIDICTRL_READY; return(3); } break; case MIDICTRL_EXCLUSIVE: if (data == MIDI_EOX) { midiout_longmsg(midi->midihdl, midi->buffer, midi->mpos); midi->midictrl = MIDICTRL_READY; return(midi->mpos); } else if (midi->mpos >= MIDI_BUFFER) { // おーばーふろー midi->midictrl = MIDICTRL_READY; } break; case MIDICTRL_TIMECODE: if (midi->mpos >= 2) { if ((data == 0x7e) || (data == 0x7f)) { // exclusiveと同じでいい筈… midi->midictrl = MIDICTRL_EXCLUSIVE; } else { midi->midictrl = MIDICTRL_READY; return(2); } } break; case MIDICTRL_SYSTEM: if (midi->mpos >= midi->midisyscnt) { midi->midictrl = MIDICTRL_READY; return(midi->midisyscnt); } break; } return(0); }
static void midi_vermouthshort(CMMIDI midi, UINT32 msg) { sound_sync(); midiout_shortmsg(midi->out.vermouth, msg); }