| version 1.1, 2003/10/21 14:57:41 | version 1.2, 2003/10/25 09:08:24 | 
| Line 46  enum { | Line 46  enum { | 
 | }; | }; | 
 |  |  | 
 | typedef struct { | typedef struct { | 
 |  | BYTE    prog; | 
 |  | BYTE    press; | 
 |  | UINT16  bend; | 
 |  | BYTE    ctrl[28]; | 
 |  | } _MIDICH, *MIDICH; | 
 |  |  | 
 |  | typedef struct { | 
 | MIDIHDL         vermouth; | MIDIHDL         vermouth; | 
 | UINT            midictrl; | UINT            midictrl; | 
 | UINT            midisyscnt; | UINT            midisyscnt; | 
 | UINT            mpos; | UINT            mpos; | 
 | BYTE            midilast; | BYTE            midilast; | 
 |  | _MIDICH         mch[16]; | 
 | BYTE            buffer[MIDI_BUFFER]; | BYTE            buffer[MIDI_BUFFER]; | 
 | } _CMMIDI, *CMMIDI; | } _CMMIDI, *CMMIDI; | 
 |  |  | 
 |  | static const BYTE midictrltbl[] = {     0, 1, 5, 7, 10, 11, 64, | 
 |  | 65, 66, 67, 84, 91, 93, | 
 |  | 94,                                             // for SC-88 | 
 |  | 71, 72, 73, 74};                // for XG | 
 |  |  | 
 |  | static  BYTE    midictrlindex[128]; | 
 |  |  | 
 |  |  | 
 |  | // ---- | 
 |  |  | 
 | static void SOUNDCALL vermouth_getpcm(MIDIHDL hdl, SINT32 *pcm, UINT count) { | static void SOUNDCALL vermouth_getpcm(MIDIHDL hdl, SINT32 *pcm, UINT count) { | 
 |  |  | 
| Line 91  static void midireset(CMMIDI midi) { | Line 108  static void midireset(CMMIDI midi) { | 
 | } | } | 
 | } | } | 
 |  |  | 
 |  | static void midisetparam(CMMIDI midi) { | 
 |  |  | 
 |  | BYTE    i; | 
 |  | UINT    j; | 
 |  | MIDICH  mch; | 
 |  |  | 
 |  | mch = midi->mch; | 
 |  | sound_sync(); | 
 |  | for (i=0; i<16; i++, mch++) { | 
 |  | if (mch->press != 0xff) { | 
 |  | midiout_shortmsg(midi->vermouth, MIDIOUTS(0xa0+i, mch->press, 0)); | 
 |  | } | 
 |  | if (mch->bend != 0xffff) { | 
 |  | midiout_shortmsg(midi->vermouth, (mch->bend << 8) + 0xe0+i); | 
 |  | } | 
 |  | for (j=0; j<sizeof(midictrltbl)/sizeof(BYTE); j++) { | 
 |  | if (mch->ctrl[j+1] != 0xff) { | 
 |  | midiout_shortmsg(midi->vermouth, | 
 |  | MIDIOUTS(0xb0+i, midictrltbl[j], mch->ctrl[j+1])); | 
 |  | } | 
 |  | } | 
 |  | if (mch->prog != 0xff) { | 
 |  | midiout_shortmsg(midi->vermouth, MIDIOUTS(0xc0+i, mch->prog, 0)); | 
 |  | } | 
 |  | } | 
 |  | } | 
 |  |  | 
 |  |  | 
 | // ---- | // ---- | 
 |  |  | 
| static UINT     midiread(COMMNG self, BYTE *data) { | static UINT midiread(COMMNG self, BYTE *data) { | 
 |  |  | 
 | (void)self; | (void)self; | 
 | (void)data; | (void)data; | 
 | return(0); | return(0); | 
 | } | } | 
 |  |  | 
| static UINT     midiwrite(COMMNG self, BYTE data) { | static UINT midiwrite(COMMNG self, BYTE data) { | 
 |  |  | 
 | CMMIDI  midi; | CMMIDI  midi; | 
 |  | MIDICH  mch; | 
 |  |  | 
 | midi = (CMMIDI)(self + 1); | midi = (CMMIDI)(self + 1); | 
 | switch(data) { | switch(data) { | 
| Line 179  static UINT midiwrite(COMMNG self, BYTE | Line 224  static UINT midiwrite(COMMNG self, BYTE | 
 | case MIDICTRL_2BYTES: | case MIDICTRL_2BYTES: | 
 | if (midi->mpos >= 2) { | if (midi->mpos >= 2) { | 
 | midi->buffer[1] &= 0x7f; | 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); | keydisp_midi(midi->buffer); | 
 | sound_sync(); | sound_sync(); | 
 | midiout_shortmsg(midi->vermouth, MIDIOUTS2(midi->buffer)); | midiout_shortmsg(midi->vermouth, MIDIOUTS2(midi->buffer)); | 
| Line 191  static UINT midiwrite(COMMNG self, BYTE | Line 246  static UINT midiwrite(COMMNG self, BYTE | 
 | if (midi->mpos >= 3) { | if (midi->mpos >= 3) { | 
 | midi->buffer[1] &= 0x7f; | midi->buffer[1] &= 0x7f; | 
 | midi->buffer[2] &= 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] = 0;                       // Modulation | 
 |  | mch->ctrl[5] = 127;                     // Explession | 
 |  | mch->ctrl[6] = 0;                       // Hold | 
 |  | mch->ctrl[7] = 0;                       // Portament | 
 |  | mch->ctrl[8] = 0;                       // Sostenute | 
 |  | mch->ctrl[9] = 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); | keydisp_midi(midi->buffer); | 
 | sound_sync(); | sound_sync(); | 
 | midiout_shortmsg(midi->vermouth, MIDIOUTS3(midi->buffer)); | midiout_shortmsg(midi->vermouth, MIDIOUTS3(midi->buffer)); | 
| Line 233  static UINT midiwrite(COMMNG self, BYTE | Line 311  static UINT midiwrite(COMMNG self, BYTE | 
 | return(0); | return(0); | 
 | } | } | 
 |  |  | 
| static BYTE     midigetstat(COMMNG self) { | static BYTE midigetstat(COMMNG self) { | 
 |  |  | 
 | return(0x00); | return(0x00); | 
 | } | } | 
 |  |  | 
| static UINT     midimsg(COMMNG self, UINT msg, long param) { | static long midimsg(COMMNG self, UINT msg, long param) { | 
 |  |  | 
 | CMMIDI  midi; | CMMIDI  midi; | 
 |  | COMFLAG flag; | 
 |  |  | 
 | midi = (CMMIDI)(self + 1); | midi = (CMMIDI)(self + 1); | 
 | switch(msg) { | switch(msg) { | 
 | case COMMSG_MIDIRESET: | case COMMSG_MIDIRESET: | 
 | midireset(midi); | midireset(midi); | 
 | return(1); | return(1); | 
 |  |  | 
 |  | case COMMSG_SETFLAG: | 
 |  | flag = (COMFLAG)param; | 
 |  | if ((flag) && | 
 |  | (flag->size == sizeof(_COMFLAG) + sizeof(midi->mch)) && | 
 |  | (flag->sig == COMSIG_MIDI)) { | 
 |  | CopyMemory(midi->mch, flag + 1, sizeof(midi->mch)); | 
 |  | midisetparam(midi); | 
 |  | return(1); | 
 |  | } | 
 |  | break; | 
 |  |  | 
 |  | case COMMSG_GETFLAG: | 
 |  | flag = (COMFLAG)_MALLOC(sizeof(_COMFLAG) + sizeof(midi->mch), | 
 |  | "MIDI FLAG"); | 
 |  | if (flag) { | 
 |  | flag->size = sizeof(_COMFLAG) + sizeof(midi->mch); | 
 |  | flag->sig = COMSIG_MIDI; | 
 |  | flag->ver = 0; | 
 |  | flag->param = 0; | 
 |  | CopyMemory(flag + 1, midi->mch, sizeof(midi->mch)); | 
 |  | return((long)flag); | 
 |  | } | 
 |  | break; | 
 | } | } | 
 | return(0); | return(0); | 
 | } | } | 
| Line 263  static void midirelease(COMMNG self) { | Line 366  static void midirelease(COMMNG self) { | 
 |  |  | 
 | // ---- | // ---- | 
 |  |  | 
 |  | void cmmidi_initailize(void) { | 
 |  |  | 
 |  | UINT    i; | 
 |  |  | 
 |  | ZeroMemory(midictrlindex, sizeof(midictrlindex)); | 
 |  | for (i=0; i<sizeof(midictrltbl)/sizeof(BYTE); i++) { | 
 |  | midictrlindex[midictrltbl[i]] = (BYTE)(i + 1); | 
 |  | } | 
 |  | midictrlindex[32] = 1; | 
 |  | } | 
 |  |  | 
 | COMMNG cmmidi_create(void) { | COMMNG cmmidi_create(void) { | 
 |  |  | 
 | MIDIHDL         vermouth; | MIDIHDL         vermouth; | 
| Line 292  COMMNG cmmidi_create(void) { | Line 406  COMMNG cmmidi_create(void) { | 
 | //      midi->midisyscnt = 0; | //      midi->midisyscnt = 0; | 
 | //      midi->mpos = 0; | //      midi->mpos = 0; | 
 | midi->midilast = 0x80; | midi->midilast = 0x80; | 
 |  | FillMemory(midi->mch, sizeof(midi->mch), 0xff); | 
 | return(ret); | return(ret); | 
 |  |  | 
 | cmcre_err2: | cmcre_err2: | 
| Line 303  cmcre_err1: | Line 418  cmcre_err1: | 
 |  |  | 
 | #else | #else | 
 |  |  | 
 |  | void cmmidi_initailize(void) { | 
 |  | } | 
 |  |  | 
 | COMMNG cmmidi_create(void) { | COMMNG cmmidi_create(void) { | 
 |  |  | 
 | return(NULL); | return(NULL); |