Thanks for the comments.
I have made some progress. I programmed an Arduino to be a class-compliant MIDI device and I am decoding the MMC commands to control output pins. For the recording in progress lights (RIP), it seems I need a little state machine, which turns on the RIP lights whenever command 6 is received (record/punch in) and which turns off whenever any other transport command is received apart from play (and I suppose a repeated 6). This is slightly counter intuitive. Ardour often sends the play command a few seconds after the record message, appearing a little like a phantom punchout, but it does not denote that tracking has stopped. If you do really punchout then Ardour behaves properly and sends 7 (the real punchout code) and stops recording.
If I enable select the MIDI-sequencer alsa options in the start up dialogue, then the Arduino shows up as a device for routing MMC to. I am still unclear how this is different from just selecting the Alsa Midi option (without sequencer) in terms of the directory of midi ports that Ardour choose to show as available. But the Arduino does not show up inside Ardour without the sequencer option selected.
(The reason I quoted qjackctl above, is not that I am using jack. It’s because I use the Alsa part of its midi patchbay to connect up various devices. I note that the qjackctl patchpay becomes frozen when Ardour is running. I don’t know why. But it is a bit of a nuisance to have to exit Ardour to repatch and then start again.)
Chris: Regarding whether jackd running was the source of my problem, I don’t think it was. I have not had it running for any of these experiments.
On a related topic, I saw the stream about the jog/shuttle support. My O2R96 sends command 46 when in jog and shuttle modes, which is described in various places as ‘search’. I will likely edit the mmc parser in Ardour to respond to the 46 code since it is currently seemingly ignored. When I have done that I’ll post in that thread to let you know.