====== M-Audio Code 61 Reverse Engineering Project ====== ===== Preface ===== It's a MIDI keyboard controller with a ton of programmable knobs, it comes with some editor software to edit these knobs with up to 12 presets on it, downloadable on M-Audio's website, only available on Windows and MacOS. Here we try to reverse engineer that preset editor software... ===== MIDI ports ===== There's 4 ports available: Dir Device Name IO hw:x,0,0 Code 61 USB MIDI IO hw:x,0,1 Code 61 MIDI DIN IO hw:x,0,2 Code 61 Mackie/HUI IO hw:x,0,3 Code 61 Editor The last one in particular is used by the preset editor. ===== SysEx messages ===== SysEx messages generally have the following format: |Start|''f0''| |Manufacturer ID|''7e'' (non real-time) or ''00 01 05'' (M-Audio)| |Device ID|''7f'' (all devices)| |...|| |End|''f7''| => sent to keyboard <= reply from keyboard On Linux, try ''amidi -p hw:x,0,3 -S '' -d'' The LCD says ''SYS'' for a second for most of these commands. ==== Mode ==== => ''f0 00 01 05 7f 31 06 6d 00 01 01 f7'' Other messages seem to not work until this one is issued. Last byte set to ''00'' seems to lock it and ''01'' (or anything else up to ''7f'') unlocks it. ==== Device enquiry ==== => ''f0 7e 7f 06 01 f7'' <= ''f0 7e 7f 06 02 00 01 05 31 06 31 30 34 34 f7'' Manufacturer ID (''00 01 05'') and model ID (''31 06'') ==== Receive preset ==== => ''f0 00 01 05 7f 31 06 62 nn f7'' <= ''f0 00 01 05 7f 31 06 63 0a 3b nn [xx xx xx xx xx xx] ... f7'' ''nn'' is a preset number between ''01'' and ''0c'', or ''00'' for RAM \\ ''xx'' is a 6-byte ASCII preset name ==== Send preset ==== => ''f0 00 01 05 7f 31 06 61 0a 3b nn [xx xx xx xx xx xx] ... f7'' ==== Get settings ==== => ''f0 00 01 05 7f 31 06 6b 00 02 nn nn f7'' <= ''f0 00 01 05 7f 31 06 6c 00 04 nn nn xx xx f7'' ''nn'': setting address (''00 00'', ''00 04''-''00 10'')\\ ''xx'': value ==== Set settings ==== => ''f0 00 01 05 7f 31 06 6a 00 04 nn nn xx xx f7'' ===== See also ===== * [[https://github.com/ahlstromcj/midicvt/blob/master/contrib/sysex-format.txt]]