19 #ifndef __jack_midi_unpack_h__
20 #define __jack_midi_unpack_h__
23 MIDI_UNPACK_MAX_MSG = 1024
29 unsigned char data[MIDI_UNPACK_MAX_MSG];
37 u->size =
sizeof(u->data);
48 static const unsigned char midi_voice_len[] =
60 static const unsigned char midi_system_len[] =
73 int midi_unpack_buf(
midi_unpack_t *buf,
const unsigned char *data,
int len,
void *jack_port_buf, jack_nframes_t time)
76 for (i = 0; i < len; ++i) {
77 const unsigned char byte = data[i];
83 }
else if (byte < 0x80)
85 assert (buf->pos < buf->size);
86 buf->data[buf->pos++] = byte;
87 }
else if (byte < 0xF0)
89 assert (byte >= 0x80 && byte < 0xF0);
91 buf->need = midi_voice_len[(byte-0x80)>>4];
94 }
else if (byte == 0xF7)
96 assert (buf->pos < buf->size);
97 buf->data[buf->pos++] = byte;
100 assert (byte >= 0xF0 && byte < 0xF8);
103 buf->need = midi_system_len[byte - 0xF0];
105 buf->need = buf->size;
107 if (buf->pos == buf->need) {
109 if (buf->data[0] >= 0x80 || (buf->data[0] == 0xF0 && buf->data[buf->pos-1] == 0xF7)) {
111 if ((buf->data[0] & 0xF0) == 0x90 && buf->data[2] == 0) {
113 jack_midi_data_t temp[3] = { 0x80, 0, 0x40 };
114 temp[0] |= buf->data[0] & 0x0F;
115 temp[1] = buf->data[1];
123 if (buf->data[0] >= 0x80 && buf->data[0] < 0xF0)
127 buf->need = buf->size;
LIB_EXPORT int jack_midi_event_write(void *port_buffer, jack_nframes_t time, const jack_midi_data_t *data, size_t data_size)