|
|
| version 1.1, 2003/10/16 17:59:37 | 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; | |
| } | } |
| (void)param; | |
| return(0); | return(0); |
| } | } |
| Line 264 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 293 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 304 cmcre_err1: | Line 418 cmcre_err1: |
| #else | #else |
| void cmmidi_initailize(void) { | |
| } | |
| COMMNG cmmidi_create(void) { | COMMNG cmmidi_create(void) { |
| return(NULL); | return(NULL); |