From 766e9dc7a135e8a8d3f8bcd7388d2b08932d821b Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 3 Jun 2023 18:10:40 +0200 Subject: [PATCH] Improve MidiTracer, format MMC messages --- gtk2_ardour/midi_tracer.cc | 65 ++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 10 deletions(-) diff --git a/gtk2_ardour/midi_tracer.cc b/gtk2_ardour/midi_tracer.cc index 28541302e3..c2fb0a7473 100644 --- a/gtk2_ardour/midi_tracer.cc +++ b/gtk2_ardour/midi_tracer.cc @@ -415,18 +415,63 @@ MidiTracer::tracer (Parser&, MIDI::byte* msg, size_t len, samplecnt_t now) &buf[s], bufsize, " MMC locate to %02d:%02d:%02d:%02d.%02d\n", msg[7], msg[8], msg[9], msg[10], msg[11] ); + } else if (cmd == 0x47 && msg[5] == 0x03) { + uint8_t sh = msg[6]; + uint8_t sm = msg[7]; + uint8_t sl = msg[8]; + + bool forward = sh & (1<<6) ? false : true; + size_t left_shift = sh & 0x38; + size_t integral = ((sh & 0x7) << left_shift) | (sm >> (7 - left_shift)); + size_t fractional = ((sm << left_shift) << 7) | sl; + + float shuttle_speed = integral + ((float)fractional / (1 << (14 - left_shift))); + + s += snprintf (&buf[s], bufsize, " MMC Shuttle %s%f\n", forward ? "+" : "-", shuttle_speed); } else { std::string name; - if (cmd == 0x1) { - name = "STOP"; - } else if (cmd == 0x3) { - name = "DEFERRED PLAY"; - } else if (cmd == 0x6) { - name = "RECORD STROBE"; - } else if (cmd == 0x7) { - name = "RECORD EXIT"; - } else if (cmd == 0x8) { - name = "RECORD PAUSE"; + switch (cmd) { + case 0x01: + name = "Stop"; + break; + case 0x02: + name = "Play"; + break; + case 0x03: + name = "Deferred Play"; + break; + case 0x04: + name = "Fast Forward"; + break; + case 0x05: + name = "Rewind"; + break; + case 0x06: + name = "Record Strobe"; + break; + case 0x07: + name = "Record Exit"; + break; + case 0x08: + name = "Record Pause"; + break; + case 0x09: + name = "Pause"; + break; + case 0x0a: + name = "Eject"; + break; + case 0x0b: + name = "Chase"; + break; + case 0x40: + name = "Write (ARM Tracks)"; + break; + case 0x0d: + name = "MMC Reset"; + break; + default: + break; } if (!name.empty()) { s += snprintf (&buf[s], bufsize, " MMC command %s\n", name.c_str());