On Mon, May 17, 2010 at 11:48:15PM +0100, wdev@foltman.com wrote:
The decoding routine is based on own reverse-engineering. It seems to recognize all the messages that MPD16 sends during normal operation (that is, via standard MIDI messages).
Configuration (changing pad sensitivity, slider controller and MIDI notes) is not supported in this version.
Signed-off-by: Krzysztof Foltman wdev@foltman.com
diff --git a/sound/usb/midi.c b/sound/usb/midi.c index 2c1558c..57d642a 100644 --- a/sound/usb/midi.c +++ b/sound/usb/midi.c @@ -645,6 +645,34 @@ static struct usb_protocol_ops snd_usbmidi_cme_ops = { };
/*
- AKAI MPD16 protocol: one or more chunks consisting of first byte of
- (0x20 | msg_len) and then a MIDI message (msg_len bytes long)
- Messages sent:
- 21 FE (active sense)
- 23 90 xx xx (note on)
- 23 Ax xx xx (polyphonic pressure)
- 23 Bx xx xx (control change)
- */
+static void snd_usbmidi_akai_input(struct snd_usb_midi_in_endpoint *ep,
uint8_t *buffer, int buffer_length)
+{
- unsigned int pos = 0;
- while (pos < (unsigned)buffer_length && (buffer[pos] & 0xF8) == 0x20)
- {
int msg_len = buffer[pos] & 0x0f;
snd_usbmidi_input_data(ep, 0, &buffer[pos + 1], msg_len);
pos += 1 + msg_len;
- }
+}
Just a minor coding style flaw here for the curly brackets. See Documentation/CodingStyle or let scripts/checkpatch.pl annoy you :)
FWIW, I think the block above could also be a for-loop, but that's certainly a matter of taste.
Thanks, Daniel