/* send in 4 bytes of sysex data. if one of the bytes is 0xF7 (sysex end) stop and unset nd_sysex_mode */ void nd_sysex_inword(int midiindev, int status, int data1, int data2, int data3) { if (nd_sysex_mode) { sys_midibytein(midiindev, status); if (status == 0xF7) nd_sysex_mode = 0; } if (nd_sysex_mode) { sys_midibytein(midiindev, data1); if (data1 == 0xF7) nd_sysex_mode = 0; } if (nd_sysex_mode) { sys_midibytein(midiindev, data2); if (data2 == 0xF7) nd_sysex_mode = 0; } if (nd_sysex_mode) { sys_midibytein(midiindev, data3); if (data3 == 0xF7) nd_sysex_mode = 0; } }
/* this version uses the asynchronous "read()" ... */ void sys_poll_midi(void) { int i, throttle = 100; struct timeval timout; int did = 1, maxfd = 0; while (did) { fd_set readset, writeset, exceptset; did = 0; if (throttle-- < 0) break; for (i = 0; i < oss_nmidiin; i++) { char c; int ret = read(oss_midiinfd[i], &c, 1); if (ret < 0) { if (errno != EAGAIN) perror("MIDI"); } else if (ret != 0) { sys_midibytein(i, (c & 0xff)); did = 1; } } } }
void sys_poll_midi(void) { int i, nmess, throttle = 100; PmEvent buffer; for (i = 0; i < mac_nmidiindev; i++) { while (1) { if (!throttle--) goto overload; nmess = Pm_Read(mac_midiindevlist[i], &buffer, 1); if (nmess > 0) { int status = Pm_MessageStatus(buffer.message); int data1 = Pm_MessageData1(buffer.message); int data2 = Pm_MessageData2(buffer.message); int data3 = ((buffer.message >> 24) & 0xFF); int msgtype = (status >> 4) - 8; switch (msgtype) { case 0: case 1: case 2: case 3: case 6: sys_midibytein(i, status); sys_midibytein(i, data1); sys_midibytein(i, data2); break; case 4: case 5: sys_midibytein(i, status); sys_midibytein(i, data1); break; case 7: nd_sysex_mode=1; nd_sysex_inword(i, status, data1, data2, data3); break; default: if (nd_sysex_mode) nd_sysex_inword(i, status, data1, data2, data3); } } else break; }
void sys_poll_midi(void) { int i, nmess, throttle = 100; PmEvent buffer; for (i = 0; i < mac_nmidiindev; i++) { while (1) { if (!throttle--) goto overload; nmess = Pm_Read(mac_midiindevlist[i], &buffer, 1); if (nmess > 0) { int status = Pm_MessageStatus(buffer.message); int data1 = Pm_MessageData1(buffer.message); int data2 = Pm_MessageData2(buffer.message); int data3 = ((buffer.message >> 24) & 0xff); int msgtype = ((status & 0xf0) == 0xf0 ? status : (status & 0xf0)); if (nd_sysex_mode) nd_sysex_inword(i, status, data1, data2, data3); else switch (msgtype) { case MIDINOTEOFF: case MIDINOTEON: case MIDIPOLYTOUCH: case MIDICONTROLCHANGE: case MIDIPITCHBEND: case MIDISONGPOS: sys_midibytein(i, status); sys_midibytein(i, data1); sys_midibytein(i, data2); break; case MIDIPROGRAMCHANGE: case MIDICHANNELTOUCH: case MIDITIMECODE: case MIDISONGSELECT: sys_midibytein(i, status); sys_midibytein(i, data1); break; case MIDISTARTSYSEX: nd_sysex_mode=1; nd_sysex_inword(i, status, data1, data2, data3); break; default: sys_midibytein(i, status); break; } } else break; }
void sys_poll_midi(void) { static EVENT msw_nextevent; static int msw_isnextevent; static double msw_nexteventtime; while (1) { if (!msw_isnextevent) { if (!GetEvent(lpInputBuffer, &msw_nextevent)) break; msw_isnextevent = 1; #ifdef MIDI_TIMESTAMP msw_nexteventtime = msw_midigettimefor(&foo.timestamp); #endif } #ifdef MIDI_TIMESTAMP if (0.001 * clock_gettimesince(initsystime) >= msw_nexteventtime) #endif { int msgtype = ((msw_nextevent.data & 0xf0) >> 4) - 8; int commandbyte = msw_nextevent.data & 0xff; int byte1 = (msw_nextevent.data >> 8) & 0xff; int byte2 = (msw_nextevent.data >> 16) & 0xff; int portno = msw_nextevent.dwDevice; switch (msgtype) { case 0: case 1: case 2: case 3: case 6: sys_midibytein(portno, commandbyte); sys_midibytein(portno, byte1); sys_midibytein(portno, byte2); break; case 4: case 5: sys_midibytein(portno, commandbyte); sys_midibytein(portno, byte1); break; case 7: sys_midibytein(portno, commandbyte); break; } msw_isnextevent = 0; } }
driver for emu10k1 (it doesn't implement select.) */ void sys_poll_midi(void) { int i, throttle = 100; struct timeval timout; int did = 1, maxfd = 0; while (did) { fd_set readset, writeset, exceptset; did = 0; if (throttle-- < 0) break; timout.tv_sec = 0; timout.tv_usec = 0; FD_ZERO(&writeset); FD_ZERO(&readset); FD_ZERO(&exceptset); for (i = 0; i < oss_nmidiin; i++) { if (oss_midiinfd[i] > maxfd) maxfd = oss_midiinfd[i]; FD_SET(oss_midiinfd[i], &readset); } select(maxfd+1, &readset, &writeset, &exceptset, &timout); for (i = 0; i < oss_nmidiin; i++) if (FD_ISSET(oss_midiinfd[i], &readset)) { char c; int ret = read(oss_midiinfd[i], &c, 1); if (ret <= 0) fprintf(stderr, "Midi read error\n"); else sys_midibytein(i, (c & 0xff)); did = 1; } } }
/* this version uses the asynchronous "read()" ... */ void sys_alsa_poll_midi(void) { unsigned char buf[ALSA_MAX_EVENT_SIZE]; int count, alsa_source; int i; snd_seq_event_t *midievent = NULL; if (alsa_nmidiout == 0 && alsa_nmidiin == 0) return; snd_midi_event_init(midiev); if (!alsa_nmidiout && !alsa_nmidiin) return; count = snd_seq_event_input_pending(midi_handle,1); if (count != 0) count = snd_seq_event_input(midi_handle,&midievent); if (midievent != NULL) { count = snd_midi_event_decode(midiev,buf,sizeof(buf),midievent); alsa_source = midievent->dest.port; for(i=0;i<count;i++) sys_midibytein(alsa_source, (buf[i] & 0xff)); //post("received %d midi bytes\n",count); } }