# Copyright 2013 Eric Messick (FixedImagePhoto.com/Contact) # Copyright 2018 Albert Graef # # Lines in this file starting with # are comments. # This program works pretty much like Eric Messick's shuttlepro program, # but it translates MIDI input rather than input events from the Contour # Design Shuttle devices. The program creates a Jack MIDI client named # "midizap" with a single input port, which you'll have to connect to # the MIDI controller that you want to use (e.g., using a patchbay # program like qjackctl; non-Jack ALSA MIDI inputs can be accommodated # using a2jmidid). # Other than the input being MIDI instead of the Shuttle's key and wheel # events, the program works exactly the same. Each section in the file # (starting with a name in brackets and a regex to be matched against # the window class and name) specifies the bindings for one application. # A section at the end without regex provides default bindings if none # of the other sections are matched. Within each section, bindings are # introduced with the name of the MIDI message being assigned, followed # by a sequence of X KeySyms and/or MIDI messages to be output when the # MIDI message is received. # Here is a brief rundown of the supported notation for MIDI messages # (please check the documentation for more details). # CC<0..127>: control change message for the given controller # PC<0..127>: program change message # PB: pitch bend message # <#b><0..10> (MIDI notes): MIDI note (on or off); note names use # the customary MIDI notation, with # and b denoting accidentals; the # number at the end denotes the MIDI octave in the range 0..10 (C5 is # middle C) # The program distinguishes between messages on different MIDI # channels. By default, messages are assumed to be on MIDI channel 1, # but the MIDI channel can be specified explicitly following a dash at # the end of the message token. E.g., a message on MIDI channel 10 would # be denoted, e.g., CC7-10 or C#3-10. # Each of these messages can be either "on" or "off", and so they can # have different "press" and "release" keystrokes associated with them. # E.g., a "note on" message with non-zero velocity emulates a button # press, while the corresponding "note off" emulates a button release, # just as if the MIDI keys were just ordinary keys on a computer # keyboard. The same holds true for control change messages (here any # non-zero controller value means "on", zero "off"), and pitch bends # (here the center value of the pitch wheel means "off", any other value # means "on"). The program change messages play a somewhat special role # in that they don't actually have any "off" messages associated with # them, so to keep in line with the other kinds of MIDI messages we # consider them as being "pressed" and then "released" immediately # afterwards. # In addition, control change and pitch bend messages can also be # interpreted as incremental changes, and have associated key bindings # which are executed each time the controller or pitch bend value # increases or decreases, respectively. Such bindings are indicated with # the suffixes "+" and "-". Thus, e.g., a key sequence bound to CC7+ # will be executed each time the value of controller 7 increases, and # CC7- will be executed each time it decreases. PB+ and PB- do they same # for pitch bends. (There are also some other special modes for the # incremental bindings, please check the documentation for details. In # particular, the suffixes "<" and ">" can be used in lieu of "+" and # "-" to properly interpret the control values of endless rotary # encoders, such as the jog wheels on Mackie-like devices.) # As already mentioned, translations can also contain other MIDI # messages, in order to translate MIDI input to be passed on to to other # MIDI devices and applications. In fact, X KeySyms and MIDI messages # can be mixed freely in the output. To enable this, invoke the program # with the '-t' option. This creates a MIDI output port, which can then # be hooked up to other Jack MIDI applications. (Otherwise, MIDI # messages in the translations will just be ignored.) # Debugging options: You want to run the program in a terminal window to # see its output when using these. The following line, when uncommented, # prints the section recognized for the window in focus: #DEBUG_REGEX # This option prints the contents of the entire configuration file, as # parsed by the program, in a human-readable format: #DEBUG_STROKES # You can also use the following option to have the recognized # translations printed out as the program executes them, in the same # format as DEBUG_STROKES: #DEBUG_KEYS # NOTE: The debugging options can also be specified on the command line # using -d in conjunction with any of the letters r, s and k (or the # letter j if you also want debugging output from Jack). Just -d # without any option letter turns on all debugging options. # Sample bindings for video editing and mouse emulation. # These mostly assume a Mackie MCU-like DAW controller device. We use # this as an example throughout, since devices of this kind are standard # gear in many studios, and they offer an abundance of useful controls. # If you don't have one of these lying around, there are inexpensive MCU # emulations in software (such as the TouchDAW app on Android). # On most MCU-style devices there are some playback controls and cursor # keys which generate various note events, and a jog wheel which # generates CC60 messages. We put all of these to good use here. Note # that the CC60 control requires use of the aforementioned special # incremental mode for endless rotary encoders. # Shotcut (WM_CLASS is "shotcut") # see https://www.shotcut.org/howtos/keyboard-shortcuts/ [Shotcut] ^shotcut$ # Shotcut uses the customary J-K-L shortcuts, each successive J or L key # decrements or increments the playback speed. We assign these to the # MCU Rewind and Forward controls. # playback controls A#7 XK_space # Play/Pause A7 "K" # Stop G7 "J" # Rewind G#7 "L" # Forward # punch in/out (sets in and out points) # Note that your device may not have these, or they may be labeled # differently, so we provide an alternative binding below. D#7 "I" # Set In E7 "O" # Set Out # up/down cursor movement (alternate binding for set in/out) C8 "I" # Set In C#8 "O" # Set Out # left/right cursor movement D8 XK_Home # Beginning D#8 XK_End # End # the jog wheel moves single frames to the left or the right CC60< XK_Left # Frame reverse CC60> XK_Right # Frame forward # Kdenlive (same bindings as above) [Kdenlive] ^kdenlive$ # playback controls A#7 XK_space # Play/Pause A7 "K" # Stop G7 "J" # Rewind G#7 "L" # Forward # punch in/out (sets in and out points) D#7 "I" # Set In E7 "O" # Set Out # alternate binding for set in/out (cursor up/down) C8 "I" # Set In C#8 "O" # Set Out # cursor left/right D8 XK_Home # Beginning D#8 XK_End # End # jog wheel CC60< XK_Left # Frame reverse CC60> XK_Right # Frame forward [MIDI] # The special "MIDI" default section is only active when MIDI output is # enabled (midizap -t). This allows you to translate midizap's MIDI # input for use with other MIDI devices and applications. Here's a # simple example for illustration purposes, which shows how to map the # MCU jog wheel to CC7, so that it can be used as a volume control. CC60< CC7 CC60> CC7 # The following translations should work on any MIDI keyboard. The first # four white keys (C, D, E and F) in the middle octave are mapped to a # little drumkit on MIDI channel 10, and the modulation wheel (CC1) is # bound to the volume controller on that channel. Hook this up to a # GM-compatible software synthesizer such as Fluidsynth/Qsynth to get # sound. C5 C3-10 D5 C#3-10 E5 D3-10 F5 D#3-10 CC1+ CC7-10 CC1- CC7-10 # Default section (cursor and mouse emulation) [Default] # cursor movement D8 XK_Left D#8 XK_Right C8 XK_Up C#8 XK_Down # stop/play/rec are assigned to the left/middle/right mouse buttons A7 XK_Button_1 A#7 XK_Button_2 B7 XK_Button_3 # the jog wheel emulates the scroll wheel of the mouse CC60< XK_Scroll_Up CC60> XK_Scroll_Down # The following bindings should work on any MIDI keyboard. The C, D and # E keys in the middle octave are bound to the three mouse buttons, and # the modulation wheel (CC1) emulates the mouse wheel. The F, G, A and B # keys in the middle octave are mapped to the cursor keys (Left, Up, # Down, Right). Please note that most of these bindings, as well as the # CC60 bindings above, will only be active when the [MIDI] default # section above isn't used (invoke midizap without the -t option). C5 XK_Button_1 D5 XK_Button_2 E5 XK_Button_3 F5 XK_Left G5 XK_Up A5 XK_Down B5 XK_Right CC1+ XK_Scroll_Up CC1- XK_Scroll_Down