static void midi_synth_input(int orig_dev, unsigned char data) { int dev; struct midi_input_info *inc; static unsigned char len_tab[] = /* # of data bytes following a status */ { 2, /* 8x */ 2, /* 9x */ 2, /* Ax */ 2, /* Bx */ 1, /* Cx */ 1, /* Dx */ 2, /* Ex */ 0 /* Fx */ }; if (orig_dev < 0 || orig_dev > num_midis || midi_devs[orig_dev] == NULL) return; if (data == 0xfe) /* Ignore active sensing */ return; dev = midi2synth[orig_dev]; inc = &midi_devs[orig_dev]->in_info; switch (inc->m_state) { case MST_INIT: if (data & 0x80) /* MIDI status byte */ { if ((data & 0xf0) == 0xf0) /* Common message */ { switch (data) { case 0xf0: /* Sysex */ inc->m_state = MST_SYSEX; break; /* Sysex */ case 0xf1: /* MTC quarter frame */ case 0xf3: /* Song select */ inc->m_state = MST_DATA; inc->m_ptr = 1; inc->m_left = 1; inc->m_buf[0] = data; break; case 0xf2: /* Song position pointer */ inc->m_state = MST_DATA; inc->m_ptr = 1; inc->m_left = 2; inc->m_buf[0] = data; break; default: inc->m_buf[0] = data; inc->m_ptr = 1; do_midi_msg(dev, inc->m_buf, inc->m_ptr); inc->m_ptr = 0; inc->m_left = 0; } } else { inc->m_state = MST_DATA; inc->m_ptr = 1; inc->m_left = len_tab[(data >> 4) - 8]; inc->m_buf[0] = inc->m_prev_status = data; } } else if (inc->m_prev_status & 0x80) { /* Data byte (use running status) */ inc->m_ptr = 2; inc->m_buf[1] = data; inc->m_buf[0] = inc->m_prev_status; inc->m_left = len_tab[(inc->m_buf[0] >> 4) - 8] - 1; if (inc->m_left > 0) inc->m_state = MST_DATA; /* Not done yet */ else { inc->m_state = MST_INIT; do_midi_msg(dev, inc->m_buf, inc->m_ptr); inc->m_ptr = 0; } }
static int mpu_input_scanner(struct mpu_config *devc, unsigned char midic) { switch (devc->m_state) { case ST_INIT: switch (midic) { case 0xf8: /* Timer overflow */ break; case 0xfc: printk("<all end>"); break; case 0xfd: if (devc->timer_flag) mpu_timer_interrupt(); break; case 0xfe: return MPU_ACK; case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: printk("<Trk data rq #%d>", midic & 0x0f); break; case 0xf9: printk("<conductor rq>"); break; case 0xff: devc->m_state = ST_SYSMSG; break; default: if (midic <= 0xef) { /* printk( "mpu time: %d ", midic); */ devc->m_state = ST_TIMED; } else printk("<MPU: Unknown event %02x> ", midic); } break; case ST_TIMED: { int msg = ((int) (midic & 0xf0) >> 4); devc->m_state = ST_DATABYTE; if (msg < 8) /* Data byte */ { /* printk( "midi msg (running status) "); */ msg = ((int) (devc->last_status & 0xf0) >> 4); msg -= 8; devc->m_left = len_tab[msg] - 1; devc->m_ptr = 2; devc->m_buf[0] = devc->last_status; devc->m_buf[1] = midic; if (devc->m_left <= 0) { devc->m_state = ST_INIT; do_midi_msg(devc->synthno, devc->m_buf, devc->m_ptr); devc->m_ptr = 0; } } else if (msg == 0xf) /* MPU MARK */ { devc->m_state = ST_INIT; switch (midic) { case 0xf8: /* printk( "NOP "); */ break; case 0xf9: /* printk( "meas end "); */ break; case 0xfc: /* printk( "data end "); */ break; default: printk("Unknown MPU mark %02x\n", midic); } } else { devc->last_status = midic; /* printk( "midi msg "); */ msg -= 8; devc->m_left = len_tab[msg]; devc->m_ptr = 1; devc->m_buf[0] = midic; if (devc->m_left <= 0) { devc->m_state = ST_INIT; do_midi_msg(devc->synthno, devc->m_buf, devc->m_ptr); devc->m_ptr = 0; } } }
static int wf_mpu_input_scanner (int devno, int synthdev, unsigned char midic) { struct midi_input_info *mi = &midi_devs[devno]->in_info; switch (mi->m_state) { case MST_INIT: switch (midic) { case 0xf8: /* Timer overflow */ break; case 0xfc: break; case 0xfd: /* XXX do something useful with this. If there is an external MIDI timer (e.g. a hardware sequencer, a useful timer can be derived ... For now, no timer support. */ break; case 0xfe: return MPU_ACK; break; case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: break; case 0xf9: break; case 0xff: mi->m_state = MST_SYSMSG; break; default: if (midic <= 0xef) { mi->m_state = MST_TIMED; } else printk (KERN_ERR "<MPU: Unknown event %02x> ", midic); } break; case MST_TIMED: { int msg = ((int) (midic & 0xf0) >> 4); mi->m_state = MST_DATA; if (msg < 8) { /* Data byte */ msg = ((int) (mi->m_prev_status & 0xf0) >> 4); msg -= 8; mi->m_left = len_tab[msg] - 1; mi->m_ptr = 2; mi->m_buf[0] = mi->m_prev_status; mi->m_buf[1] = midic; if (mi->m_left <= 0) { mi->m_state = MST_INIT; do_midi_msg (synthdev, mi->m_buf, mi->m_ptr); mi->m_ptr = 0; } } else if (msg == 0xf) { /* MPU MARK */ mi->m_state = MST_INIT; switch (midic) { case 0xf8: break; case 0xf9: break; case 0xfc: break; default: break; } } else { mi->m_prev_status = midic; msg -= 8; mi->m_left = len_tab[msg]; mi->m_ptr = 1; mi->m_buf[0] = midic; if (mi->m_left <= 0) { mi->m_state = MST_INIT; do_midi_msg (synthdev, mi->m_buf, mi->m_ptr); mi->m_ptr = 0; } } }