QJackMMC & JackCtlMMC

Download                 Screenshots               Sourceforge Project Page

What is QJackMMC / JackCtlMMC?
QJackMMC is a Qt based program that can connect to a device or program that emits MIDI Machine Control (MMC) and allow it to drive JACK transport, which in turn can control other programs. JackCtlMMC is a slightly simpler command-line version of QJackMMC.

Why would anyone want this?
Many people have hard-disk recorders (HDRs) or other external MIDI devices that are capable of sending out MMC to keep other devices in sync. You might have a multi-track recorder and you want to be able to start, stop, or fast-forward JACK-based programs such as Rosegarden, Hydrogen, and Ardour.

How do I use QJackMMC?
Start by running qjackmmc either from a terminal or from a menu (It's often categorized under Applications - Sound and Video). Once QJackMMC is running you need to decide which device(s) / program(s) you want to control JACK transport. Open up a program capable of making ALSA MIDI connections such as QJackCtl or AConnectGUI and connect the output of your device (or more likely the soundcard port that it's attached to) to the input of QJackMMC. QJackMMC supports both JACK and ALSA MIDI connections, so you have many options. A screenshot of using QJackCtl's "Connect" window to do this is displayed above. Once your device(s) are all connected, QJackMMC will start listening for MMC commands automatically.

How do I use JackCtlMMC?
Start jackctlmmc from a terminal, specifying your desired parameters on the command line. You can see what the parameter format is by starting jackctlmmc with the -? option. For example, to start jackctlmmc with verbose terminal output, a device fps of 20, a device ID of 7f, and a jitter tolerance of 100 milliseconds, type: "jackctlmmc -v -f20 -d7f -t100". Just like QjackMMC, you must connect your program or device to jackctlmmc using either the ALSA or MIDI jackctlmmc ports.

What do all these parameters mean?
Frames / sec: The frame rate of the device / program that you are connecting to QJackMMC. Check your device's manual if you are unsure, but the default value of 30 is quite typical. The jackctlmmc switch for this is "-f X" where X is your desired fps.

Device ID: The particular MMC device that you want to listen to. The default value of 7f is sensible for almost all devices. This is mainly used for people who have multiple MMC capable devices in one MIDI chain connected to their soundcard. By specifying a device ID the user can tell QJackMMC / JackCtlMMC which particular device in the MIDI stream to listen to. The jackctlmmc switch for this is "-d X" where X is your desired device ID in hexadecimal.

Jitter tolerance: This specifies the maximum difference between JACK's time position and the device's position without QJackMMC correcting JACK's position. Basically, many HDRs are overzealous about sending MMC goto messages and will constantly stream seek messages in MMC. If QJackMMC always tried to reposition JACK transport's time marker, it could be very disruptive and detrimental to recording, and may even add pops or time inconsistencies to a recording. However, if you make the jitter tolerance too high, QJackMMC will ignore important seek messages and may seem to not be working at all. The default value of 50 ms is sensible, but your mileage may vary. The jackctlmmc switch for this is "-t X" where X is your desired jitter tolerance in milliseconds.

Use high priority thread: This asks QJackMMC to schedule the thread polling the ALSA MIDI port as high as possible. It will not affect behavior if your device is connected via the JACK MIDI port. We recommend only using this if you are seeing a noticable drift between your device's timing and JACK transport's timing. Using a high priority thread for QJackMMC may degrade your overall system performance. If this box is unchecked, the MMC thread will run at whatever priority QJackMMC was given. There is no equivalent in jackctlmmc, it is single threaded so the MMC listener will run at whatever priority you run jackctlmmc.

Verbose output: When this option is check and QJackMMC is listening for commands, it will send an informational message to the message area for each and every MMC command it responds to, including any timing information. The jackctlmmc equivalent sends output to the current terminal, the switch for this is "-v".

Load saved defaults / Save as default settings: If you're happy with your QJackMMC parameters, you can save them to a defaults file (.qjackmmc in your home directory) for them to be automatically loaded when QJackMMC starts up.

How do I get QJackMMC / JackCtlMMC to remember my connections?
It's not really our job to remember connections; that problem is solved by using other tools like QJackCtl's "Patchbay" window or another tool like  LASH that can set up persistant ALSA connections for programs. These tools will allow you to set up connection relationships so that everytime QJackMMC or JackCtlMMC starts, they will be automagically connected to your ALSA MIDI device(s) /program(s).

How do I download and compile the source?
Apart from the source code included in all of our downloadable releases, we have a public git repository whose details are at
http://repo.or.cz/w/jackctlmmc.git. Like many Linux programs, QjackMMC / jackctlmmc is configured by autoconf and built using the standard commands: "./configure; make; make install". Please read the included README for details about the parameters you can pass to configure. If you'd like to contribute to the project, please post on the forums and we can give you push permissions. You will need the ALSA, JACK, Qt 4, and Lash development libraries in order to build QJackMMC.

Why isn't it working?
These are the typical reasons for QJackMMC to appear broken:

it's not connected in ALSA to a valid MMC device:
Just connecting your device to the midi port on your computer isn't enough. You need to use a program like AConnectGUI or the ALSA tab of QJackCtl's "connect" window to connect the output of that midi port
to the input of QJackMMC or QJackCtl.

The other programs aren't listening to JACK transport: All programs that you want to control with your MMC device need to be configured to respond to JACK transport. For example, Hydrogen has a "Jack Trans" button that needs to be clicked, Ardour has a clock dropdown box that needs to be set to "JACK" and it needs to have it's "Master" button unclicked, and Rosegarden needs to be told to use JACK transport in it's settings menu. Programs like QJackCtl that shows JACK's current time should show you whether JACK is responding to QJackMMC, the rest is program dependent.

Your device isn't sending MMC or it's sending obscure device specific messages: Your device might not be properly configured to send MMC, or it might use custom MMC commands that we don't support just yet. If you run QJackMMC or jackctlmmc from a terminal using the verbose option, it will tell you about every MMC command it receives, even if they're not handled yet. If you have custom messages that you'd like QJackMMC to support in the future, include your verbose output in a post on our help forums.

Why can't I get QJackMMC through apt/yum/whatever?
That's a good question. You should be able to, especially now that the project is configured using the industry standard autoconf. If you can't yet, you should bring it up with your distribution's package maintainers, and maybe even volunteer to make the package yourself. Feel free to drop us a note on our help forums if you would like some help packaging QJackMMC for your distribution.