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 midisetparam(CMMIDI midi) { MIDICH mch; UINT i, j; mch = midi->mch; sound_sync(); for (i = 0; i < 16; i++, mch++) { if (mch->press != 0xff) { (*midi->outfn)(midi, MIDIOUTS(0xa0+i, mch->press, 0),3); } if (mch->bend != 0xffff) { (*midi->outfn)(midi, (mch->bend << 8) + 0xe0+i, 3); } for (j = 0; j < sizeof(midictrltbl) / sizeof(UINT8); j++) { if (mch->ctrl[j+1] != 0xff) { (*midi->outfn)(midi, MIDIOUTS(0xb0+i, midictrltbl[j], mch->ctrl[j+1]), 3); } } if (mch->prog != 0xff) { (*midi->outfn)(midi, MIDIOUTS(0xc0+i, mch->prog, 0), 3); } } }
// ----------------------------------------------------------------------- // メッセージ判別 // ----------------------------------------------------------------------- void MIDI_Message(BYTE mes) { if (!hOut) { return; } switch(mes) { // ここの対応はお好みで case MIDI_TIMING: case MIDI_START: case MIDI_CONTINUE: case MIDI_STOP: case MIDI_ACTIVESENSE: return; case MIDI_SYSTEMRESET: // 一応イリーガル〜 return; } if (MIDI_CTRL == MIDICTRL_READY) { // 初回限定 if (mes & 0x80) { // status MIDI_POS = 0; switch(mes & 0xf0) { case 0xc0: case 0xd0: MIDI_CTRL = MIDICTRL_2BYTES; break; case 0x80: case 0x90: case 0xa0: case 0xb0: case 0xe0: MIDI_LAST = mes; // この方が失敗しないなり… MIDI_CTRL = MIDICTRL_3BYTES; break; default: switch(mes) { case MIDI_EXCLUSIVE: MIDI_CTRL = MIDICTRL_EXCLUSIVE; break; case MIDI_TIMECODE: MIDI_CTRL = MIDICTRL_TIMECODE; break; case MIDI_SONGPOS: MIDI_CTRL = MIDICTRL_SYSTEM; MIDI_SYSCOUNT = 3; break; case MIDI_SONGSELECT: MIDI_CTRL = MIDICTRL_SYSTEM; MIDI_SYSCOUNT = 2; break; case MIDI_TUNEREQUEST: MIDI_CTRL = MIDICTRL_SYSTEM; MIDI_SYSCOUNT = 1; break; default: return; } break; } } else { // Key-onのみな気がしたんだけど忘れた… // running status MIDI_BUF[0] = MIDI_LAST; MIDI_POS = 1; MIDI_CTRL = MIDICTRL_3BYTES; } } else if ( (mes&0x80) && ((MIDI_CTRL!=MIDICTRL_EXCLUSIVE)||(mes!=MIDI_EOX)) ) { // メッセージのデータ部にコントロールバイトが出た時…(GENOCIDE2) // status MIDI_POS = 0; switch(mes & 0xf0) { case 0xc0: case 0xd0: MIDI_CTRL = MIDICTRL_2BYTES; break; case 0x80: case 0x90: case 0xa0: case 0xb0: case 0xe0: MIDI_LAST = mes; // この方が失敗しないなり… MIDI_CTRL = MIDICTRL_3BYTES; break; default: switch(mes) { case MIDI_EXCLUSIVE: MIDI_CTRL = MIDICTRL_EXCLUSIVE; break; case MIDI_TIMECODE: MIDI_CTRL = MIDICTRL_TIMECODE; break; case MIDI_SONGPOS: MIDI_CTRL = MIDICTRL_SYSTEM; MIDI_SYSCOUNT = 3; break; case MIDI_SONGSELECT: MIDI_CTRL = MIDICTRL_SYSTEM; MIDI_SYSCOUNT = 2; break; case MIDI_TUNEREQUEST: MIDI_CTRL = MIDICTRL_SYSTEM; MIDI_SYSCOUNT = 1; break; default: return; } break; } } MIDI_BUF[MIDI_POS++] = mes; switch(MIDI_CTRL) { case MIDICTRL_2BYTES: if (MIDI_POS >= 2) { if (ENABLE_TONEMAP) { if (((MIDI_BUF[0] & 0xf0) == 0xc0) && (TONE_CH[MIDI_BUF[0] & 0x0f] < MIMPI_RHYTHM)) { MIDI_BUF[1] = TONEMAP[ TONE_CH[MIDI_BUF[0] & 0x0f] ][ MIDI_BUF[1] & 0x7f ]; } } MIDI_Waitlastexclusiveout(); midiOutShortMsg(hOut, MIDIOUTS(MIDI_BUF[0], MIDI_BUF[1], 0)); MIDI_CTRL = MIDICTRL_READY; } break; case MIDICTRL_3BYTES: if (MIDI_POS >= 3) { MIDI_Waitlastexclusiveout(); midiOutShortMsg(hOut, MIDIOUTS(MIDI_BUF[0], MIDI_BUF[1], MIDI_BUF[2])); MIDI_CTRL = MIDICTRL_READY; } break; case MIDICTRL_EXCLUSIVE: if (mes == MIDI_EOX) { MIDI_Waitlastexclusiveout(); MIDI_Sendexclusive(MIDI_BUF, MIDI_POS); MIDI_CTRL = MIDICTRL_READY; } else if (MIDI_POS >= MIDIBUFFERS) { // おーばーふろー MIDI_CTRL = MIDICTRL_READY; } break; case MIDICTRL_TIMECODE: if (MIDI_POS >= 2) { if ((mes == 0x7e) || (mes == 0x7f)) { // exclusiveと同じでいい筈… MIDI_CTRL = MIDICTRL_EXCLUSIVE; } else { MIDI_CTRL = MIDICTRL_READY; } } break; case MIDICTRL_SYSTEM: if (MIDI_POS >= MIDI_SYSCOUNT) { MIDI_CTRL = MIDICTRL_READY; } break; } }