Difference between revisions of "Supported plug & play MIDI controllers"

From ZynthianWiki
Jump to navigation Jump to search
 
(197 intermediate revisions by 7 users not shown)
Line 1: Line 1:
Zynthian can be connected to almost any existing MIDI device and you can use the MIDI learning mechanism, as described in the [[Zynthian_UI_User_Guide_-_V1/V4|UI user's guide]], to assign parameters to faders and knobs in your MIDI controller, for instance. You could also assign pad trigger to notes, etc. But MIDI learning process takes time, it's limiting and you can't get feedback easily. Sometimes it's a lot better to plug a well-known (supported) MIDI controller and get everything mapped automatically. For having this, zynthian implements a controller driver API that allows developers to create specific drivers for specific devices.  
+
==Introduction==
 +
Zynthian can be connected to almost any existing MIDI device and you can use the MIDI learning mechanism, as described in the [[Zynthian_UI_User_Guide_-_V1/V4|UI user's guide]], to assign parameters to faders and knobs in your MIDI controller, for instance. You could also assign pad trigger to notes, etc. But MIDI learning process takes time, it's limiting and you can't get feedback easily. Sometimes it's a lot better to plug a well-known (supported) MIDI controller and get everything mapped automatically. For having this, Zynthian implements a controller driver API that allows developers to create specific drivers for specific devices.
  
This section contain documentation for some of this controller drivers.
+
===Supported Drivers and Guides===
 +
* After expanding greatly, the driver page has been split into multiple pages according to similar devices. See [[#Driver Pages|Driver Pages]] for a categorised list of device driver pages.
 +
* There is also a [[#Table of Device Features|sortable table of devices]] to get a glance of what devices have drivers and what functions are available for them. Click the title link to go to the device driver page.
 +
* As with the rest of the wiki, some information here may be slightly out of date, there may be devices available that aren't shown here. For more up to date info on driver development, see the forum. For a list of drivers currently integrated into Zynthian you can check [https://github.com/zynthian/zynthian-ui/tree/vangelis/zyngine/ctrldev the (Vangelis version) list on github].
  
{{NoteBox|This documentation is valid for the "chain_manager" development branch. It's only partially valid for the current testing branch so you could find some differences.}}
+
===Accessing Drivers in Zynthian===
 +
As the title hints, if you connect your device (via USB), Zynthian will automatically load the driver if a compatible one exists. Where there are multiple drivers for a given device (or to use a generic driver such as Mackie Control, the active driver mode can be selected from within the '''Midi Input Devices''' menu from the Chain Manager screen or the individual chain options screen (also the admin menu). '''Bold press''' the driver entry for further options.
  
 +
===Driver Functions===
 +
This section contains documentation for some of these controller drivers. There are two core driver functions which control the primary screens in the Zynthian UI:
 +
* '''Launcher mode (Zynpad)''': Launch patterns in the launcher grid interface (as with DAWs like Ableton or Logic)
 +
* '''Mixer mode (ZynMixer)''': Control chain levels, mutes and solo. Different devices may have some additional controls and functions.
 +
There are also additional driver modes/functions depending on the device and driver:
 +
* '''UI Navigation''': Adds some degree of UI navigation control via arrow buttons or by emulating encoders & buttons on the device
 +
* '''SuperLooper Mode''': Provides an interface to the native SuperLooper UI within Zynthian for looping live performance.
 +
* '''Sequencer Mode (ZynSeq)''': (Sequencer functionality for the device depends on the Zynthian version installed) Provides some degree of control over the sequencer or pattern editor.
 +
* '''Moder Mode''': Adjusts device note inputs to stay in scale or provides some chord functionality
 
<br clear=all>
 
<br clear=all>
 +
==Driver Pages==
 +
* [[Akai APC Series]]
 +
* [[Akai MIDI MIX]]
 +
* [[Akai MPK Series]]
 +
* [[Arturia Keylab Series]]
 +
* [[Novation Launchpad Series]]
 +
* [[Novation Launchkey Series]]
 +
* [[Behringer MOTÖR 61 / 49]]
 +
* [[Korg nanoKONTROL Series]]
 +
* [[Fostex Mixtab]]
 +
* [[Mackie Control]]
 +
* [[Teenage Engineering OP-1]]
 +
* [[SooperLooper CCx10, for Behringer FCB1010 & others]]
 +
* [[Worlde Mini Moder Driver]]
 +
* [[Sinco smk25]]
  
==Akai APC Key25 MK2==
+
==Table of Device Features==
 +
{| class="wikitable sortable" style="text-align:center;"
 +
|- style="font-weight:bold;"
 +
! style="vertical-align:middle;" | Device
 +
! style="vertical-align:middle;" | Launcher mode (ZynPad)
 +
! style="vertical-align:middle;" | Mixer mode (ZynMixer)
 +
! UI Navigation
 +
! style="vertical-align:middle;" | SuperLooper mode
 +
! style="vertical-align:middle;" | Sequencer mode (ZynSeq)
 +
! style="text-align:left;" | Moder (chords/scales)
 +
! style="vertical-align:middle;" | Extra features / notes
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Akai APC Series|Akai APC Key25 MK2]][[File:Akai_apc_key25_mk2.png|150px|left]]
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | Mixpad (default) controls Mixer + ZynPad; also Step Sequencer / pattern editor; Device mode controls the Zynthian UI.
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Akai APC Series|Akai APC Key25 MK2 + SL]]
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | Adds SooperLooper looper controls + Levels/Pan/Sync&Quantize/Session save+load; base modes otherwise match the non-SL driver.
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Akai MIDI MIX]][[File:Akai-midi-mix.jpg|150px|left]]
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | Maps mixer functionality (chains 1–16 via banks, master slider, balance, mute/solo, rec-arm).
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Akai MPK Series|Akai MPK mini MK3]][[File:Akai-mpk-mini-top.jpg|150px|left]]
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | Modes: Mixer (default), Device UI, Pattern (ZynPad + Pattern Editor), NotePad; plus User and Config modes.
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Akai MPK Series|Akai MPK mini MK3 Moder]]
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="vertical-align:middle; text-align:left;" | This is a very simple "Mode Enforcer" driver for the Akai MPK mini MK3.
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Novation Launchpad Series|Novation LAUNCHPAD MINI MK1]][[File:Novation_launchpad_mini_mk1_zynpad.png|150px|left]]
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | ZynPad driver.
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Novation Launchpad Series| Novation LAUNCHPAD MINI MK3]][[File:Novation_launchpad_mini_mk3_zynpad.png|150px|left]]
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | ZynPad driver.
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Novation Launchpad Series| Novation LAUNCHPAD PRO MK2]][[File:Novation_launchpad_pro_mk2_zynpad.jpg|150px|left]]
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | Three modes using the top row buttons:
 +
* Launcher - similar function to Ableton Live
 +
* Mixer - volume, pan and (needs testing) sends
 +
* Device Control - emulates the 20 button array of the V5 and encoder buttons
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Novation Launchpad Series| Novation LAUNCHPAD PRO MK3]][[File:Novation_launchpad_pro_mk3_zynpad.jpg|150px|left]]
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | ZynPad driver.
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Novation Launchpad Series| Novation LAUNCHPAD X]][[File:Akai-mpk-mini-top.jpg|150px|left]]
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | ZynPad driver.
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Novation Launchkey Series| Novation LAUNCHKEY MINI MK3]][[File:Launchkey_mini_mk3.jpg|150px|left]]
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | Mixer + ZynPad.
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Novation Launchkey Series| Novation LAUNCHKEY 88 MK3]][[File:Launchkey_88_mk3.jpg|150px|left]]
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | Mixer + ZynPad.
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Behringer MOTÖR 61 / 49]][[File:Behringer_motor.jpg|150px|left]]
 +
| style="vertical-align:middle; background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | This driver is focused in stage control of setBfree and Pianoteq engines. It also includes the mode enforcer that can be controlled from the pads (notes).
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Korg nanoKONTROL Series|Korg nanoKONTROL]][[File:NanoKONTROL1.png|150px|left]]
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | Not currently available.
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Korg nanoKONTROL Series|Korg nanoKONTROL-2]][[File:NanoKONTROL2.png|150px|left]]
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | ZynMixer driver with UI navigation.
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Mackie Control]][[File:Mackie_control.jpg|150px|left]]
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | This driver can be loaded for devices that support MCU protocol and variants.
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Fostex Mixtab]][[File:Mixtab.png|150px|left]]
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | This driver maps the hardware controls to relevant parameters in zynthian (mostly zynmixer).
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[Teenage Engineering OP-1]][[File:Te-op1.jpg|150px|left]]
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | Encoder control of parameters and UI navigation via encoders and buttons.
 +
|-
 +
| style="vertical-align:middle; text-align:left;" | [[SooperLooper CCx10, for Behringer FCB1010 & others]][[File:Fcb1010.jpeg|150px|left]]
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="vertical-align:middle; background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="vertical-align:middle; text-align:left;" | SooperLooper CCx10 controller support.
 +
|-
 +
| style="text-align:left;" | [[Worlde Mini Moder Driver]]
 +
[[File:Worlde mini.png|150px|left|Worlde mini midi keyboard]]
 +
| style="background-color:#ffce93;" | tbc
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="text-align:left;" |
 +
|-
 +
| style="text-align:left;" | [[Akai MPK Series|Akai MPK249]][[File:Akai mpk249.webp|Akai mpk249|150px|left]]
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="text-align:left;" |
 +
|-
 +
| style="text-align:left;" | [[Novation Launchkey Series|Launchkey Mini Mk4 37]][[File:LaunchKeyM37-MKIV.jpg|150px|left|Launchkey Mini Mk4]]
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="text-align:left;" |
 +
|-
 +
| style="text-align:left;" | [[Launchkey Mini Mk3]][[File:LaunchkeyMiniMk3.jpg|150px|left|Launchkey Mini Mk3]]
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="text-align:left;" |
 +
|-
 +
| style="text-align:left;" | [[Novation Launchkey Series|Launchkey Mk3 88]][[File:Launchkey88.jpg|150px|left|Launchkey88]]
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#C8E6C9;" | yes
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="text-align:left;" |
 +
|-
 +
| style="text-align:left;" | [[Novation Launchkey Series|Launchkey Mk4 37]][[File:Launchkey37-MKIV.jpg|150px|left|Launchkey37-MKIV]]
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="text-align:left;" |
 +
|-
 +
| style="text-align:left;" | [[Sinco smk25]][[File:Te-op1.jpg|150px|left]]
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="text-align:left;" |
 +
|-
 +
| style="text-align:left;" | [[Arturia Keylab Series|Arturia Keylab Mk2 61]][[File:Te-op1.jpg|150px|left]]
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#FFCE93;" | tbc
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="background-color:#F8D7DA;" | no
 +
| style="text-align:left;" |
 +
|}
  
[[File:akai_apc_key25_mk2.png|800px|right]]
+
<br clear=all>
  
This device supports two operation modes:
+
==Akai MIDI MIX==
 +
====ZynMixer driver====
  
# The default mode (called '''"Mixpad"''' in this section), which controls the ZynMixer and the ZynPad.
+
[[File:Akai-midi-mix.jpg|800px|right]]
# The '''"Device"''' mode, which handles the Zynthian UI.
 
  
====The Mixpad mode====
+
This Akai MIDIMix driver maps the basic mixer's functionality.
 +
Chains are numbered from left to right as shown in the zynmixer screen. Note that these numbers are not MIDI channels! 
  
This is the default mode, selected automatically on start. You can also change to it pressing <code>SHIFT</code> + <code>VOLUME</code> or <code>SHIFT</code> + <code>PAN</code>. In this mode you can perform the following actions:
+
* '''Bank Left:''' Strips assigned to chains 1-8
 +
* '''Bank Right:''' Strips assigned to chains 9-16
 +
* '''Master Slider:''' Main volume
 +
* '''Strip 1-8:''' Chain's mixer control, depending on bank selection
 +
** '''Upper Knobs:''' The 2 upper knobs are available for MIDI learning.
 +
** '''Lower Knob:''' Chain's balance
 +
** '''Mute:''' Chain's mute switch
 +
** '''Solo''': Push <code>SOLO</code> to see solo status. Push <code>SOLO</code> + <code>MUTE</code> for toggling solo.   
 +
** '''Rec Arm''': Red light indicates active chain. Push to set active chain.
 +
** '''Slider:''' Chain's volume
  
* Change controller's bank. There are '''two banks''' (1 and 2), which are used to handle up to 16 chains (with the eight track buttons/knobs). Bank 1 is for chains 1 to 8 and bank 2 manage chains 9 to 16. To show current selected bank, press and hold <code>SHIFT</code>. One of the track buttons <code>LEFT arrow</code> or <code>RIGHT arrow</code> will light up in red, <code>LEFT arrow</code> is bank 1 and <code>RIGHT arrow</code> is bank 2. You can press one of these buttons while holding <code>SHIFT</code> to change the bank.
+
<br clear=all>
  
* Use track buttons to '''perform a function''' on chains. The function is chosen by pressing <code>SHIFT</code> + one of <code>SELECT</code>, <code>MUTE</code> or <code>SOLO</code> soft key buttons. Press and hold <code>SHIFT</code> to see current selected function on soft key buttons (in green). Functions are:
 
** <code>SELECT</code>, used to change the selected chain. The key bed (black and white keys) will play on that chain.
 
** <code>MUTE</code>, used to mute the corresponding chain.
 
** <code>SOLO</code>, used to enable solo in the corresponding chain.
 
  
* '''Change current scene''' using the track buttons. You need first to select that function by pressing <code>SHIFT</code> + <code>REC ARM</code> button. This function is affected by bank selection, so you can change up to 16 scenes. When selecting a new scene, the ZynPad will be shown.
+
==Behringer MOTÖR 61 / 49 ==
  
* Start/stop '''sequences of a row''', pressing the corresponding SOFT KEY (without modifiers). If there are any sequence playing, they will stop. If there are no sequences playing, it will start those not empty. The action to be run is shown by the LED status (lit will stop, off will start).
+
[[File:behringer_motor.jpg|800px|right]]
  
* Use knobs to modify '''chains' volume or balance'''. The value modified is given by current KNOB CTRL selected: <code>VOLUME</code> or <code>PAN</code> (for balance). To change the function, press <code>SHIFT</code> + <code>VOLUME</code> or <code>SHIFT</code> + <code>PAN</code>. The knobs are also affected by current controller's bank.
+
This driver is focused in stage control of '''setBfree''' and '''Pianoteq''' engines. It also includes the '''mode enforcer''' that can be controlled from the pads (notes). This driver must be loaded in the device's MIDI port 1. Please, note that you can also load, simultaneously if needed, the generic Mackie driver in the MIDI port 2.  
  
* Use <code>SHIFT</code> + <code>KNOB k1</code> to change volume or balance for main chain (will change the current KNOB CTRL function).
+
This is a summary of how keyboard controllers are used:
  
* Press <code>SHIFT</code> + <code>STOP ALL CLIPS</code> to perform the selected track's function (MUTE or SOLO) on main chain.  
+
{| class="wikitable sortable"
 +
|- style="font-weight:bold; background-color:#DDD;"
 +
! Control
 +
! Engine
 +
! Parameter
 +
|-
 +
| Master Fader
 +
| setBfree
 +
| Global Volume
 +
|-
 +
| Faders 1-8
 +
| setBfree
 +
| Upper Drawbars (except the highest pitched)
 +
|-
 +
| Faders 9-16
 +
| setBfree
 +
| Lower Drawbars (except the highest pitched)
 +
|-
 +
| Faders 17-24
 +
| setBfree
 +
| Pedal Drawbars (except the highest pitched)
 +
|-
 +
| Encoders 1-4
 +
| setBfree
 +
| 1:highest pitched DB, 2:percussion, 3:vibrato, 4.reverb
 +
|-
 +
| Encoders 5-8
 +
| Pianoteq
 +
| 1:volume, 2:dynamics, 3:reverb mix, 4:reverb duration
 +
|-
 +
| Pads 1-32 (as notes -> ''Prg Change'' OFF)
 +
| Mode Enforcer
 +
| '''Pad 1 always returns to Chromatic mode'''
 +
|}
  
* '''Toggle audio playback''' with <code>PLAY/PAUSE</code> button. If Zynthian's ALT mode is active, it will '''toggle MIDI playback'''.
+
And here the detailed assignment:
  
* '''Toggle audio record''' with <code>SHIFT</code> + <code>RECORD</code> button. If Zynthian's ALT mode is active, it will '''toggle MIDI recording'''.
+
<div class="noresize">
 +
{|
 +
|- style="vertical-align:top;"
 +
|
  
* Tap a pad to '''start/stop a sequence'''. The pad LED will show its status as follows (pad color will always match the sequence color):
+
{| class="wikitable sortable"
** Dim solid: Stopped sequence without content (no notes in patterns).
+
|- style="font-weight:bold; background-color:#DDD;"
** Bright solid: Stopped sequence with content.
+
! Control
** Blinking slow: Playing sequence.
+
! Engine
** Blinking fast: Recording sequence.
+
! Parameter
** Pulsing: Syncing to play/stop.
+
|-
 +
| Master Fader
 +
| setBfree
 +
| Global Volume
 +
|- style="font-weight:bold; background-color:#DDD;"
 +
| Faders Bank 1-8
 +
| setBfree
 +
| Upper Drawbars
 +
|-
 +
| Fader 1
 +
| setBfree
 +
| Upper DB 16
 +
|-
 +
| Fader 2
 +
| setBfree
 +
| Upper DB 5 1/3
 +
|-
 +
| Fader 3
 +
| setBfree
 +
| Upper DB 8
 +
|-
 +
| Fader 4
 +
| setBfree
 +
| Upper DB 4
 +
|-
 +
| Fader 5
 +
| setBfree
 +
| Upper DB 2 2/3
 +
|-
 +
| Fader 6
 +
| setBfree
 +
| Upper DB 2
 +
|-
 +
| Fader 7
 +
| setBfree
 +
| Upper DB 1 3/5
 +
|-
 +
| Fader 8
 +
| setBfree
 +
| Upper DB 1 1/3
 +
|- style="font-weight:bold; background-color:#DDD;"
 +
| Faders Bank 9-16
 +
| setBfree
 +
| Lower Drawbars
 +
|-
 +
| Fader 1
 +
| setBfree
 +
| Lower DB 16
 +
|-
 +
| Fader 2
 +
| setBfree
 +
| Lower DB 5 1/3
 +
|-
 +
| Fader 3
 +
| setBfree
 +
| Lower DB 8
 +
|-
 +
| Fader 4
 +
| setBfree
 +
| Lower DB 4
 +
|-
 +
| Fader 5
 +
| setBfree
 +
| Lower DB 2 2/3
 +
|-
 +
| Fader 6
 +
| setBfree
 +
| Lower DB 2
 +
|-
 +
| Fader 7
 +
| setBfree
 +
| Lower DB 1 3/5
 +
|-
 +
| Fader 8
 +
| setBfree
 +
| Lower DB 1 1/3
 +
|- style="font-weight:bold; background-color:#DDD;"
 +
| Faders Bank 17-24
 +
| setBfree
 +
| Pedal Drawbars
 +
|-
 +
| Fader 1
 +
| setBfree
 +
| Pedal DB 16
 +
|-
 +
| Fader 2
 +
| setBfree
 +
| Pedal DB 5 1/3
 +
|-
 +
| Fader 3
 +
| setBfree
 +
| Pedal DB 8
 +
|-
 +
| Fader 4
 +
| setBfree
 +
| Pedal DB 4
 +
|-
 +
| Fader 5
 +
| setBfree
 +
| Pedal DB 2 2/3
 +
|-
 +
| Fader 6
 +
| setBfree
 +
| Pedal DB 2
 +
|-
 +
| Fader 7
 +
| setBfree
 +
| Pedal DB 1 3/5
 +
|-
 +
| Fader 8
 +
| setBfree
 +
| Pedal DB 1 1/3
 +
|- style="font-weight:bold; background-color:#DDD;"
 +
| Encoders Bank 1-8
 +
| setBfree & Pianoteq
 +
|
 +
|-
 +
| Encoder 1
 +
| setBfree
 +
| Upper Drawbar 1 (highest pitch)
 +
|-
 +
| Encoder 2
 +
| setBfree
 +
| Percussion on/off
 +
|-
 +
| Encoder 3
 +
| setBfree
 +
| Vibrato routing
 +
|-
 +
| Encoder 4
 +
| setBfree
 +
| Reverb
 +
|-
 +
| Encoder 5
 +
| Pianoteq
 +
| Volume
 +
|-
 +
| Encoder 6
 +
| Pianoteq
 +
| Dynamics
 +
|-
 +
| Encoder 7
 +
| Pianoteq
 +
| Reverb Mix
 +
|-
 +
| Encoder 8
 +
| Pianoteq
 +
| Reverb Duration
 +
|- style="font-weight:bold; background-color:#DDD;"
 +
| Encoders Bank 9-16
 +
| setBfree
 +
|
 +
|-
 +
| Encoder 1
 +
| setBfree
 +
| Lower Drawbar 1 (highest pitch)
 +
|- style="font-weight:bold; background-color:#DDD;"
 +
| Encoders Bank 17-24
 +
| setBfree
 +
|
 +
|-
 +
| Encoder 1
 +
| setBfree
 +
| Pedal Drawbar 1 (highest pitch)
 +
|}
  
* '''Stop all sequences''' of current scene (but not audio/midi playback or recording), doing short press on <code>STOP ALL CLIPS</code> button; bold press to stop all sequences of all scenes. If you want a 'panic' stop (which stops all sequences and also audio and midi playback), perform a long press.
+
|
  
* Open the '''pattern editor''' for a given sequence, pressing <code>SHIFT</code> + a pad button.
+
{| class="wikitable sortable"
 +
|- style="font-weight:bold; background-color:#DDD;"
 +
! Control
 +
! Engine
 +
! Parameter
 +
|-
 +
| Pads Bank 1-8
 +
| Mode Enforcer
 +
| 7-note modes (white keys)
 +
|-
 +
| Pad 1
 +
| Mode Enforcer
 +
| Chromatic
 +
|-
 +
| Pad 2
 +
| Mode Enforcer
 +
| Major
 +
|-
 +
| Pad 3
 +
| Mode Enforcer
 +
| Minor
 +
|-
 +
| Pad 4
 +
| Mode Enforcer
 +
| Harmonic Minor
 +
|-
 +
| Pad 5
 +
| Mode Enforcer
 +
| Melodic Minor
 +
|-
 +
| Pad 6
 +
| Mode Enforcer
 +
| Dorian
 +
|-
 +
| Pad 7
 +
| Mode Enforcer
 +
| Mixolydian
 +
|-
 +
| Pad 8
 +
| Mode Enforcer
 +
| Lydian
 +
|- style="font-weight:bold; background-color:#DDD;"
 +
| Pads Bank 9-16
 +
| Mode Enforcer
 +
| 7-note modes (white keys)
 +
|-
 +
| Pad 1
 +
| Mode Enforcer
 +
| Chromatic
 +
|-
 +
| Pad 2
 +
| Mode Enforcer
 +
| Phrygian
 +
|-
 +
| Pad 3
 +
| Mode Enforcer
 +
| Locrian
 +
|-
 +
| Pad 4
 +
| Mode Enforcer
 +
| Super Locrian
 +
|-
 +
| Pad 5
 +
| Mode Enforcer
 +
| Bhairav
 +
|-
 +
| Pad 6
 +
| Mode Enforcer
 +
| Hungarian Minor
 +
|-
 +
| Pad 7
 +
| Mode Enforcer
 +
| Minor Gypsy
 +
|-
 +
| Pad 8
 +
| Mode Enforcer
 +
| Spanish (8 notes!)
 +
|- style="font-weight:bold; background-color:#DDD;"
 +
| Pads Bank 17-24
 +
| Mode Enforcer
 +
| 5-note modes (black keys)
 +
|-
 +
| Pad 1
 +
| Mode Enforcer
 +
| Chromatic
 +
|-
 +
| Pad 2
 +
| Mode Enforcer
 +
| Minor Pentatonic
 +
|-
 +
| Pad 3
 +
| Mode Enforcer
 +
| Major Pentatonic
 +
|-
 +
| Pad 4
 +
| Mode Enforcer
 +
| Hirojoshi
 +
|-
 +
| Pad 5
 +
| Mode Enforcer
 +
| In-Sen
 +
|-
 +
| Pad 6
 +
| Mode Enforcer
 +
| Iwato
 +
|-
 +
| Pad 7
 +
| Mode Enforcer
 +
| Kumoi
 +
|-
 +
| Pad 8
 +
| Mode Enforcer
 +
| NONE
 +
|- style="font-weight:bold; background-color:#DDD;"
 +
| Pads Bank 25-32
 +
| Mode Enforcer
 +
| Other modes (custom keys)
 +
|-
 +
| Pad 1
 +
| Mode Enforcer
 +
| Chromatic
 +
|-
 +
| Pad 2
 +
| Mode Enforcer
 +
| Diminished
 +
|-
 +
| Pad 3
 +
| Mode Enforcer
 +
| Whole-Half
 +
|-
 +
| Pad 4
 +
| Mode Enforcer
 +
| Spanish
 +
|-
 +
| Pad 5
 +
| Mode Enforcer
 +
| Whole Tone
 +
|-
 +
| Pad 6
 +
| Mode Enforcer
 +
| Minor Blues
 +
|-
 +
| Pad 7
 +
| Mode Enforcer
 +
| Pelog
 +
|-
 +
| Pad 8
 +
| Mode Enforcer
 +
| NONE
 +
|}
  
* Start '''recording a pattern'''. For this, press <code>RECORD</code> + a pad button, which will 1) select the chain associated with the group of the sequence, 2) open the pattern editor for that sequence, 3) start playing the sequence and 4) start recording that sequence. If you press the pad again (without holding any other button), the recording will stop. Press again to stop playback too. You can also control the playback/recording with <code>PLAY/PAUSE</code> and <code>RECORD</code> buttons.
+
|}
 +
</div>
  
* If the pattern editor is open, press <code>SHIFT</code> + <code>UP arrow</code> to '''go back to ZynPad'''. Press it again to go to mixer screen.
+
<br clear=all>
  
====The Device mode====
+
==Mackie Control==
 +
 
 +
[[File:mackie_control.jpg|800px|right]]
 +
 
 +
This driver can be loaded for devices that support MCU protocol and variants. For instance:
 +
 
 +
* Original MCU hardware
 +
* Behringer X-Touch
 +
* Behringer BCF2000
 +
* Behringer MÓTOR 49/61 (MC mode)
 +
* Zoom R8
 +
* Etc.
 +
 
 +
You can configure the device configuration via the Web config > Interface menu > MIDI Mackiecontrol.
 +
 
 +
Internally, a device corresponds to a YAML config file.
  
 
<br clear=all>
 
<br clear=all>
  
==Akai MIDI MIX==
+
==Fostex Mixtab==
====ZynMixer driver====
+
 
 +
[[File:Mixtab.png|800px|right]]
 +
 
 +
This driver uses MIDI input and output to communicate with a Fostex Mixtab control surface. The Mixtab was released in 1992 as a hardware controller for the Fostex DCM100 1U rack mounted 8-channel stereo mixer. It provides controls for each of that mixer's parameters, the ability to switch between up to 3 mixer units and offers absolute and pick-up modes of operation. This driver maps the hardware controls to relevant parameters in zynthian (mostly zynmixer).
 +
 
 +
Each fader strip controls the corresponding audio channel (audio, synth, etc.) in the same order as displayed in zynthian. The DCM SELECT switch moves the control between the first, second and third groups of 8 chains, allowing control of up to 24 chains. The last fader controls the main mixbus.
 +
 
 +
Each channel strip has the following controls:
 +
 
 +
* AUX
 +
* EQ HI
 +
* EQ LO
 +
* PAN
 +
* MUTE
 +
* FADER
 +
 
 +
Fader and pan control the level and pan/balance of each chain. The Mute button sends volume 0, not seperate mute signal.
 +
 
 +
ZS3 is saved by double pressing the STORE button within 1.5s, but the display must stop flashing before the second press.
 +
 
 +
The SMOOTH control adjusts tempo.
 +
 
 +
The AUX EQ act as encoders 1..4.
 +
 
 +
Other controls act as learnable controllers. (Note AUX1 & AUX2 send the same CC, each over the range 0..63 and 63..127 respectively.)
  
[[File:akai_midimix_zynmixer.png|800px|right]]
 
  
 
<br clear=all>
 
<br clear=all>
  
==Novation LAUNCHPAD MINI MK1==
+
==Teenage Engineering OP-1==
====ZynPad driver====
+
 
 +
[[File:te-op1.jpg|800px|right]]
  
[[File:novation_launchpad_mini_mk1_zynpad.png|800px|right]]
+
The OP-1 is detected and the driver is enabled automatically.
  
 +
Available in vangelis. Designed for OP-1 Original (OG). Tested with latest firmware version 246.
 +
Designed to work with OP-1 in MIDI Mode.
 +
 +
===Configuring the OP-1===
 +
 +
To enable the driver integration, on the OP-1:
 +
* Press Shift + COM Button
 +
* Select CTRL Mode (Press Button T2)
 +
* Additional steps for the first time:
 +
** Press Shift button to verify knobs are sending relative CC, change with blue encoder if needed.
 +
** Press Shift button to verify <> buttons are sending MIDI CC, change with white encoder if desired. Set to Octave ± if this behavior is preferred.
 +
** Optionally configure MIDI channel as described [https://teenage.engineering/guides/op-1/original/song-rendering-and-connectivity#13.4 here].
 +
 +
To switch to regular OP-1 mode
 +
* Press Shift + COM Button
 +
* Select OP-1 Mode (Press Button T1)
 +
 +
===Usage===
 +
[[File:OP-1 annotated.png|thumb]]
 +
* Encoder rotation (left to right is 1 to 4)
 +
* Encoder button push (and release, so short/bold/long works as expected)
 +
* Tempo
 +
* Play/record toggle
 +
* Arrows up-down, left-right
 
<br clear=all>
 
<br clear=all>
  
==Novation LAUNCHPAD MINI MK3==
+
==SooperLooper CCx10, for Behringer FCB1010 & others==
====ZynPad driver====
 
  
[[File:novation_launchpad_mini_mk3_zynpad.png|800px|right]]
+
[[File:fcb1010.jpeg|800px|right]]
 +
 
 +
{| class="wikitable sortable" style="float:right; clear:right;"
 +
|- style="font-weight:bold; background-color:#DDD;"
 +
! Pedal
 +
! CC
 +
! style="width:650px" | What it does
 +
|-
 +
| 1
 +
| 15
 +
| Mute current loop (stop recording if needed) → advance to next loop → arm it for recording
 +
|-
 +
| 2
 +
| 16
 +
| Solo-trigger loop 2: mute loops 3–5, trigger loop 2
 +
|-
 +
| 3
 +
| 17
 +
| Solo-trigger loop 3: mute loops 2, 4, 5, trigger loop 3
 +
|-
 +
| 4
 +
| 18
 +
| Solo-trigger loop 4: mute loops 2, 3, 5, trigger loop 4
 +
|-
 +
| 5
 +
| 19
 +
| Solo-trigger loop 5: mute loops 2, 3, 4, trigger loop 5
 +
|-
 +
| 6
 +
| 20
 +
| Advance to the next loop (selection only — nothing is muted or triggered)
 +
|-
 +
| 7
 +
| 21
 +
| Mute the currently selected loop
 +
|-
 +
| 8
 +
| 22
 +
| Start/stop recording on the currently selected loop
 +
|-
 +
| 9
 +
| 23
 +
| Soft reset: stop all recording, mute everything, reselect loop 1, re-sync. Recorded audio is kept.
 +
|-
 +
| 10
 +
| 24
 +
| Start/stop recording — mapped directly in Zynthian to Record Loop 1 (not managed through the ctrldev driver)
 +
|}
 +
 
 +
This drivers has been originally designed for the Behringer FCB1010, but it can be used with any MIDI controller sending the right MIDI CC as described in the table below.
 +
 
 +
Each pedal of the FCB1010 is mapped to CC and SooperLooper as described in the next table. Note that you MUST configure your FCB1010 to send triggers with the specified CC numbers. It won't work with FCB's factory assignments, as they are "frankly daft". Of course, you could configure any other MIDI controller to send the same CC numbers and use it instead, so to some extend, this driver is not exclusive for the FCB1010, although it's been designed with it in mind.
 +
 
 +
This driver implements a specific, but quite common yet, workflow specially tailored to play Jazz Standards, although it probably suits other genres too. It works like this:
 +
 
 +
* Loop 1 is always treated as the timing reference — everything else quantizes to it. I tap in a rhythm, usually with conga drums on my keyboard’s drum pads. I then let that rhythm play out while setting the quantize loop for all remaining loops.
 +
 
 +
* I then use Pedal 1 to record verse and chorus sections as separate loops. Each loop is quantized, so I just need to remember to hit “Pedal 1” near the end of the verse to tell SooperLooper to begin recording the next loop. For example, when I’m ready to record the verse, I hit pedal 1 and SooperLooper begins recording Loop 2 on the next beat. When I’m ready to do the chorus, I hit pedal 1 again. SooperLooper finishes recording Loop 2, mutes Loop 2, then begins recording Loop 3 on the next beat, and so on.
 +
 
 +
* Sometimes, I will record a verse and then end the recording by hitting Pedal 8, causing that loop to continue playing from the beginning. This allows me to repeat the verse and then only start recording the next loop when I need to play the second ending that goes to the chorus (this is a very common jazz pattern).
 +
 
 +
* Once I have recorded my loops, I then click one of the “solo” pedals to begin soloing over the chord changes. In most jazz standards, I go back to the first verse which is on Loop 2, so I click “Pedal 2”. I then click the remaining pedals to go through the rest of the song structure. By triggering each loop, I can have sections of different lengths (again, another thing you’ll commonly find in jazz standards). Everything is quantized to the rhythm track, so moving from loop to loop is all seamless.
 +
 
 +
The upshot is that this driver allows me to lay down my backing bass and chord track at the beginning of the song, then play this throughout while doing the melody and solos. I think it will work for just about any jazz standard without having to adjust the default 43 second loop length, since four loops (loops 2-5) covers a lot. I can do all of this in real time because each action is done by just one pedal. It’s intuitive because I just hit the pedal assigned to the verse or chorus I want to play and it triggers from the start exactly on the quantized beat.
 +
 
 +
===Configure the Behringer FCB1010===
 +
 
 +
Here’s how to configure the FCB1010, assuming starting from FCB1010’s factory default:
 +
 
 +
* Select the pedal you want to program (e.g., 1).
 +
* Long press the Down button (2-3 seconds) to put the pedal in programming mode.
 +
* Short press the Up button.
 +
* By default, “1” is lit, indicating that the pedal is sending a program change. We need it to send a control change (“6”).
 +
* Long press “1” (program change) until it is unlit.
 +
* Long press “6” (control change) until it is lit.
 +
* Short press “6” to program the control change. “6” will start blinking.
 +
* Press Up.
 +
* Enter the CC number you want to set for the pedal. For example, in this ctrldev, I map Pedal 1 to CC 15. Numbers are entered by clicking the pedal numbers in order (e.g., “1” and “5”). The numbers will appear in the LED screen.
 +
* Press Up.
 +
* Enter the value you want to send for the CC. I enter “127” for every control (e.g., “1”, “2”, “7”).
 +
* Press Up. “6” stops blinking and is solidly lit. The pedal is now programmed.
 +
* Long press Down to exit programming mode.
 +
* Repeat 1-13 for each pedal (e.g., Pedal 2 = CC 16, etc.).
 +
 
 +
I’ve uploaded a demo song (“Night and Day”) that I recorded using my Zynthian setup with this ctrldev driver:<br>
 +
<br>
 +
<html5media>https://discourse.zynthian.org/uploads/default/original/3X/8/a/8a3429b86ce07e8b0d214a10cec62442cedad887.ogg</html5media><br>
 +
<br>
 +
It was recorded live. I hit the record button on the Zynthian to start and stop the recording. Nothing in there was layered on tracks.
 +
 
 +
Here’s how I progressed through the song structure with the pedals on the FCB1010:
 +
 
 +
    10: start recording bongos
 +
    10: stop recording bongos
 +
    1: start verse 1
 +
    8: repeat verse 1 (first ending)
 +
    1: stop verse 1, start second ending of verse 1 into chorus
 +
    2: start verse 1
 +
    3: start 2nd ending and chorus
 +
    2-3: continue going back and forth between these for the whole song structure.
 +
    1: record a coda as a new track at the end
 +
    8: repeat coda so I can solo over it.
 +
    9: end song
 +
 
 +
This will be a real game changer for me to be able to do solo gigs as well as playing with just one other instrument or vocalist. Hopefully this is helpful to others.
  
 
<br clear=all>
 
<br clear=all>
  
==Novation LAUNCHPAD PRO MK2==
+
==Technical Info For Driver Developers==
====ZynPad driver====
+
 
 +
Drivers are python modules implementing a class. This class can call internal zynthian-ui API, so it has full access to zynthian functionality. It’s not limited by CUIA. No limits, so you can break the UI too 😉
  
[[File:novation_launchpad_pro_mk2_zynpad.png|800px|right]]
+
NOTE: the name of the class should be identical to that of the file name. This is a common pitfall when developing new drivers.
  
<br clear=all>
+
dev_ids is a list of identifiers that the driver will match. You can find this by looking at the name of the device in the MIDI Input view in zynthian. If you bold press tge corresponding input to see its options menu, the "Rename port" otpion shows its USB port / MIDI input name. Use the MIDI input name for your dev_ids list, e.g. Rename port 'USB:2.2/Launchkey Mini MK3 In 2' would provide the device id: "Launchkey Mini MK3 In 2".
 +
 
 +
You can check the full code here:
 +
 
 +
[https://github.com/zynthian/zynthian-ui/blob/oram/zyngine/zynthian_ctrldev_manager.py zynthian-ui/zyngui/zynthian_ctrldev_manager.py zynthian/zyngine · GitHub]
 +
 
 +
and some example drivers here:
 +
 
 +
[https://github.com/zynthian/zynthian-ui/tree/oram/zyngine/ctrldev zynthian-ui/zyngine/ctrldev/ · GitHub]
 +
 
 +
All drivers must inherit from ''zynthian_ctrldev_base'', implementing the needed functionality as commented in the base code:
 +
 
 +
<pre>
 +
 
 +
#------------------------------------------------------------------------------------------------------------------
 +
# Control device base class
 +
#------------------------------------------------------------------------------------------------------------------
 +
 
 +
class zynthian_ctrldev_base():
 +
 
 +
dev_id = None  # String that identifies the device (class variable!)
 +
dev_zynpad = False # Can act as a zynpad trigger device
 +
dev_zynmixer = False # Can act as an audio mixer controller device
 +
dev_pated = False # Can act as a pattern editor device
 +
 
 +
 
 +
# Function to initialise class
 +
def __init__(self):
 +
self.idev = 0 # Slot index where the device is connected, starting from 1 (0 = None)
 +
self.zyngui = zynthian_gui_config.zyngui
 +
 
 +
 
 +
# Setup the device connected in slot #idev
 +
# Before calling this, the caller (ctrldev-manager) should check that driver's ID string matches device's ID string
 +
def setup(self, idev=None):
 +
if idev != self.idev:
 +
# Release currently selected device, if any ...
 +
self.release()
 +
# Init new selected device
 +
if idev > 0:
 +
self.idev = idev
 +
logging.info("Setting-up {} in slot {}".format(self.dev_id, self.idev))
 +
# Setup routing
 +
lib_zyncore.zmip_set_route_extdev(self.idev - 1, 0)
 +
zynautoconnect.midi_autoconnect(True)
 +
# Initialize new selected device
 +
self.init()
 +
self.refresh(force=True)
 +
 
 +
 
 +
def release(self):
 +
if self.idev > 0:
 +
logging.info("Releasing {} in slot {}".format(self.dev_id, self.idev))
 +
# If device is still connected, call end
 +
dev_id = zynautoconnect.get_midi_device_name(self.idev)
 +
if dev_id and dev_id == self.dev_id:
 +
self.end()
 +
# Restore routing
 +
lib_zyncore.zmip_set_route_extdev(self.idev - 1, 1)
 +
zynautoconnect.midi_autoconnect(True)
 +
self.idev = 0
 +
 
 +
 
 +
# Refresh device status (LED feedback, etc)
 +
# It *SHOULD* be implemented by child class
 +
def refresh(self, force=False):
 +
logging.debug("Refresh LEDs for {}: NOT IMPLEMENTED!".format(self.dev_id))
 +
 
 +
 
 +
# Device MIDI event handler
 +
# It *SHOULD* be implemented by child class
 +
def midi_event(self, ev):
 +
logging.debug("MIDI EVENT FROM '{}'".format(self.dev_id))
 +
 
 +
 
 +
# Light-Off LEDs
 +
# It *SHOULD* be implemented by child class
 +
def light_off(self):
 +
logging.debug("Lighting Off LEDs for {}: NOT IMPLEMENTED!".format(self.dev_id))
 +
 
 +
 
 +
# Sleep On
 +
# It *COULD* be improved by child class
 +
def sleep_on(self):
 +
self.light_off()
 +
 
 +
 
 +
# Sleep On
 +
# It *COULD* be improved by child class
 +
def sleep_off(self):
 +
self.refresh(True)
 +
</pre>
 +
 
 +
Quite simple, right? This is for basic “generic” drivers.
 +
Zynpad enabled drivers inherit from this base class:
 +
 
 +
 
 +
<pre>
 +
# ------------------------------------------------------------------------------------------------------------------
 +
# Zynpad control device base class
 +
# ------------------------------------------------------------------------------------------------------------------
 +
 
 +
class zynthian_ctrldev_zynpad(zynthian_ctrldev_base):
  
==Novation LAUNCHPAD PRO MK3==
+
dev_zynpad = True # Can act as a zynpad trigger device
====ZynPad driver====
 
  
[[File:novation_launchpad_pro_mk3_zynpad.png|800px|right]]
 
  
<br clear=all>
+
def __init__(self):
 +
super().__init__()
 +
self.zynpad = self.zyngui.screens["zynpad"]
  
==Novation LAUNCHPAD X==
 
====ZynPad driver====
 
  
[[File:novation_launchpad_x_zynpad.png|800px|right]]
+
def refresh(self, force=False):
 +
# When zynpad is shown, this is done by refresh_status, so no need to refresh twice
 +
if force or not self.zynpad.shown:
 +
self.refresh_pads(force)
 +
self.refresh_zynpad_bank()
 +
if force:
 +
self.refresh_zynpad_bank()
  
<br clear=all>
 
  
==Novation LAUNCHKEY MINI MK3==
+
# It *SHOULD* be implemented by child class
====ZynPad driver====
+
def refresh_zynpad_bank(self):
 +
pass
  
[[File:novation_launchkey_mini_mk3_zynpad.png|800px|right]]
 
  
<br clear=all>
+
def refresh_pads(self, force=False):
 +
if force:
 +
self.light_off()
 +
for pad in range(self.zyngui.zynseq.col_in_bank ** 2):
 +
# It MUST be called for cleaning the dirty bit
 +
changed_state = self.zyngui.zynseq.libseq.hasSequenceChanged(self.zynpad.bank, pad)
 +
if changed_state or force:
 +
mode = self.zyngui.zynseq.libseq.getPlayMode(self.zynpad.bank, pad)
 +
state = self.zynpad.get_pad_state(pad)
 +
self.update_pad(pad, state, mode)
  
==Behringer MOTÖR 61 / 49 ==
 
  
[[File:behringer_motor.png|800px|right]]
+
def refresh_pad(self, pad, force=False):
 +
# It MUST be called for cleaning the dirty bit!!
 +
changed_state = self.zyngui.zynseq.libseq.hasSequenceChanged(self.zynpad.bank, pad)
 +
if changed_state or force:
 +
mode = self.zyngui.zynseq.libseq.getPlayMode(self.zynpad.bank, pad)
 +
state = self.zynpad.get_pad_state(pad)
 +
self.update_pad(pad, state, mode)
  
<br clear=all>
 
  
==Mackie Control==
+
# It *SHOULD* be implemented by child class
 +
def update_pad(self, pad, state, mode):
 +
pass
 +
#------------------------------------------------------------------------------
 +
</pre>
  
[[File:mackie_control.png|800px|right]]
 
  
<br clear=all>
+
If you kind-of-understand this, you shouldn’t have problem to understand the driver examples and program your own drivers. Simply copy your driver file in the the zyngui/ctrldev folder and restart zynthian-ui. Refer to this thread for more information [https://discourse.zynthian.org/t/new-control-device-manager-controller-device-drivers/8593/1 NEW: Control-device manager + controller device “drivers”]

Latest revision as of 13:34, 31 July 2026

1 Introduction

Zynthian can be connected to almost any existing MIDI device and you can use the MIDI learning mechanism, as described in the UI user's guide, to assign parameters to faders and knobs in your MIDI controller, for instance. You could also assign pad trigger to notes, etc. But MIDI learning process takes time, it's limiting and you can't get feedback easily. Sometimes it's a lot better to plug a well-known (supported) MIDI controller and get everything mapped automatically. For having this, Zynthian implements a controller driver API that allows developers to create specific drivers for specific devices.

1.1 Supported Drivers and Guides

  • After expanding greatly, the driver page has been split into multiple pages according to similar devices. See Driver Pages for a categorised list of device driver pages.
  • There is also a sortable table of devices to get a glance of what devices have drivers and what functions are available for them. Click the title link to go to the device driver page.
  • As with the rest of the wiki, some information here may be slightly out of date, there may be devices available that aren't shown here. For more up to date info on driver development, see the forum. For a list of drivers currently integrated into Zynthian you can check the (Vangelis version) list on github.

1.2 Accessing Drivers in Zynthian

As the title hints, if you connect your device (via USB), Zynthian will automatically load the driver if a compatible one exists. Where there are multiple drivers for a given device (or to use a generic driver such as Mackie Control, the active driver mode can be selected from within the Midi Input Devices menu from the Chain Manager screen or the individual chain options screen (also the admin menu). Bold press the driver entry for further options.

1.3 Driver Functions

This section contains documentation for some of these controller drivers. There are two core driver functions which control the primary screens in the Zynthian UI:

  • Launcher mode (Zynpad): Launch patterns in the launcher grid interface (as with DAWs like Ableton or Logic)
  • Mixer mode (ZynMixer): Control chain levels, mutes and solo. Different devices may have some additional controls and functions.

There are also additional driver modes/functions depending on the device and driver:

  • UI Navigation: Adds some degree of UI navigation control via arrow buttons or by emulating encoders & buttons on the device
  • SuperLooper Mode: Provides an interface to the native SuperLooper UI within Zynthian for looping live performance.
  • Sequencer Mode (ZynSeq): (Sequencer functionality for the device depends on the Zynthian version installed) Provides some degree of control over the sequencer or pattern editor.
  • Moder Mode: Adjusts device note inputs to stay in scale or provides some chord functionality


2 Driver Pages

3 Table of Device Features

Device Launcher mode (ZynPad) Mixer mode (ZynMixer) UI Navigation SuperLooper mode Sequencer mode (ZynSeq) Moder (chords/scales) Extra features / notes
Akai APC Key25 MK2
Akai apc key25 mk2.png
yes yes no no yes no Mixpad (default) controls Mixer + ZynPad; also Step Sequencer / pattern editor; Device mode controls the Zynthian UI.
Akai APC Key25 MK2 + SL yes yes yes yes yes no Adds SooperLooper looper controls + Levels/Pan/Sync&Quantize/Session save+load; base modes otherwise match the non-SL driver.
Akai MIDI MIX
Akai-midi-mix.jpg
no yes no no no no Maps mixer functionality (chains 1–16 via banks, master slider, balance, mute/solo, rec-arm).
Akai MPK mini MK3
Akai-mpk-mini-top.jpg
yes yes no no yes no Modes: Mixer (default), Device UI, Pattern (ZynPad + Pattern Editor), NotePad; plus User and Config modes.
Akai MPK mini MK3 Moder no no no no no yes This is a very simple "Mode Enforcer" driver for the Akai MPK mini MK3.
Novation LAUNCHPAD MINI MK1
Novation launchpad mini mk1 zynpad.png
yes no no no no no ZynPad driver.
Novation LAUNCHPAD MINI MK3
Novation launchpad mini mk3 zynpad.png
yes no no no no no ZynPad driver.
Novation LAUNCHPAD PRO MK2
Novation launchpad pro mk2 zynpad.jpg
yes yes yes no no no Three modes using the top row buttons:
  • Launcher - similar function to Ableton Live
  • Mixer - volume, pan and (needs testing) sends
  • Device Control - emulates the 20 button array of the V5 and encoder buttons
Novation LAUNCHPAD PRO MK3
Novation launchpad pro mk3 zynpad.jpg
yes no no no no no ZynPad driver.
Novation LAUNCHPAD X
Akai-mpk-mini-top.jpg
yes no no no no no ZynPad driver.
Novation LAUNCHKEY MINI MK3
Launchkey mini mk3.jpg
yes yes no no no no Mixer + ZynPad.
Novation LAUNCHKEY 88 MK3
Launchkey 88 mk3.jpg
yes yes no no no no Mixer + ZynPad.
Behringer MOTÖR 61 / 49
Behringer motor.jpg
yes no no no no no This driver is focused in stage control of setBfree and Pianoteq engines. It also includes the mode enforcer that can be controlled from the pads (notes).
Korg nanoKONTROL
NanoKONTROL1.png
no no no no no no Not currently available.
Korg nanoKONTROL-2
NanoKONTROL2.png
no yes no no no no ZynMixer driver with UI navigation.
Mackie Control
Mackie control.jpg
no yes no no no no This driver can be loaded for devices that support MCU protocol and variants.
Fostex Mixtab
Mixtab.png
no yes no no no no This driver maps the hardware controls to relevant parameters in zynthian (mostly zynmixer).
Teenage Engineering OP-1
Te-op1.jpg
no no no no no no Encoder control of parameters and UI navigation via encoders and buttons.
SooperLooper CCx10, for Behringer FCB1010 & others
Fcb1010.jpeg
no no yes yes no no SooperLooper CCx10 controller support.
Worlde Mini Moder Driver
Worlde mini midi keyboard
tbc tbc tbc no no yes
Akai MPK249
Akai mpk249
tbc tbc tbc no no no
Launchkey Mini Mk4 37
Launchkey Mini Mk4
tbc tbc tbc no no no
Launchkey Mini Mk3
Launchkey Mini Mk3
yes yes tbc no no no
Launchkey Mk3 88
Launchkey88
yes yes tbc no no no
Launchkey Mk4 37
Launchkey37-MKIV
tbc tbc tbc no no no
Sinco smk25
Te-op1.jpg
tbc tbc tbc no no no
Arturia Keylab Mk2 61
Te-op1.jpg
tbc tbc tbc no no no


4 Akai MIDI MIX

4.1 ZynMixer driver

Akai-midi-mix.jpg

This Akai MIDIMix driver maps the basic mixer's functionality. Chains are numbered from left to right as shown in the zynmixer screen. Note that these numbers are not MIDI channels!

  • Bank Left: Strips assigned to chains 1-8
  • Bank Right: Strips assigned to chains 9-16
  • Master Slider: Main volume
  • Strip 1-8: Chain's mixer control, depending on bank selection
    • Upper Knobs: The 2 upper knobs are available for MIDI learning.
    • Lower Knob: Chain's balance
    • Mute: Chain's mute switch
    • Solo: Push SOLO to see solo status. Push SOLO + MUTE for toggling solo.
    • Rec Arm: Red light indicates active chain. Push to set active chain.
    • Slider: Chain's volume



5 Behringer MOTÖR 61 / 49

Behringer motor.jpg

This driver is focused in stage control of setBfree and Pianoteq engines. It also includes the mode enforcer that can be controlled from the pads (notes). This driver must be loaded in the device's MIDI port 1. Please, note that you can also load, simultaneously if needed, the generic Mackie driver in the MIDI port 2.

This is a summary of how keyboard controllers are used:

Control Engine Parameter
Master Fader setBfree Global Volume
Faders 1-8 setBfree Upper Drawbars (except the highest pitched)
Faders 9-16 setBfree Lower Drawbars (except the highest pitched)
Faders 17-24 setBfree Pedal Drawbars (except the highest pitched)
Encoders 1-4 setBfree 1:highest pitched DB, 2:percussion, 3:vibrato, 4.reverb
Encoders 5-8 Pianoteq 1:volume, 2:dynamics, 3:reverb mix, 4:reverb duration
Pads 1-32 (as notes -> Prg Change OFF) Mode Enforcer Pad 1 always returns to Chromatic mode

And here the detailed assignment:

Control Engine Parameter
Master Fader setBfree Global Volume
Faders Bank 1-8 setBfree Upper Drawbars
Fader 1 setBfree Upper DB 16
Fader 2 setBfree Upper DB 5 1/3
Fader 3 setBfree Upper DB 8
Fader 4 setBfree Upper DB 4
Fader 5 setBfree Upper DB 2 2/3
Fader 6 setBfree Upper DB 2
Fader 7 setBfree Upper DB 1 3/5
Fader 8 setBfree Upper DB 1 1/3
Faders Bank 9-16 setBfree Lower Drawbars
Fader 1 setBfree Lower DB 16
Fader 2 setBfree Lower DB 5 1/3
Fader 3 setBfree Lower DB 8
Fader 4 setBfree Lower DB 4
Fader 5 setBfree Lower DB 2 2/3
Fader 6 setBfree Lower DB 2
Fader 7 setBfree Lower DB 1 3/5
Fader 8 setBfree Lower DB 1 1/3
Faders Bank 17-24 setBfree Pedal Drawbars
Fader 1 setBfree Pedal DB 16
Fader 2 setBfree Pedal DB 5 1/3
Fader 3 setBfree Pedal DB 8
Fader 4 setBfree Pedal DB 4
Fader 5 setBfree Pedal DB 2 2/3
Fader 6 setBfree Pedal DB 2
Fader 7 setBfree Pedal DB 1 3/5
Fader 8 setBfree Pedal DB 1 1/3
Encoders Bank 1-8 setBfree & Pianoteq
Encoder 1 setBfree Upper Drawbar 1 (highest pitch)
Encoder 2 setBfree Percussion on/off
Encoder 3 setBfree Vibrato routing
Encoder 4 setBfree Reverb
Encoder 5 Pianoteq Volume
Encoder 6 Pianoteq Dynamics
Encoder 7 Pianoteq Reverb Mix
Encoder 8 Pianoteq Reverb Duration
Encoders Bank 9-16 setBfree
Encoder 1 setBfree Lower Drawbar 1 (highest pitch)
Encoders Bank 17-24 setBfree
Encoder 1 setBfree Pedal Drawbar 1 (highest pitch)
Control Engine Parameter
Pads Bank 1-8 Mode Enforcer 7-note modes (white keys)
Pad 1 Mode Enforcer Chromatic
Pad 2 Mode Enforcer Major
Pad 3 Mode Enforcer Minor
Pad 4 Mode Enforcer Harmonic Minor
Pad 5 Mode Enforcer Melodic Minor
Pad 6 Mode Enforcer Dorian
Pad 7 Mode Enforcer Mixolydian
Pad 8 Mode Enforcer Lydian
Pads Bank 9-16 Mode Enforcer 7-note modes (white keys)
Pad 1 Mode Enforcer Chromatic
Pad 2 Mode Enforcer Phrygian
Pad 3 Mode Enforcer Locrian
Pad 4 Mode Enforcer Super Locrian
Pad 5 Mode Enforcer Bhairav
Pad 6 Mode Enforcer Hungarian Minor
Pad 7 Mode Enforcer Minor Gypsy
Pad 8 Mode Enforcer Spanish (8 notes!)
Pads Bank 17-24 Mode Enforcer 5-note modes (black keys)
Pad 1 Mode Enforcer Chromatic
Pad 2 Mode Enforcer Minor Pentatonic
Pad 3 Mode Enforcer Major Pentatonic
Pad 4 Mode Enforcer Hirojoshi
Pad 5 Mode Enforcer In-Sen
Pad 6 Mode Enforcer Iwato
Pad 7 Mode Enforcer Kumoi
Pad 8 Mode Enforcer NONE
Pads Bank 25-32 Mode Enforcer Other modes (custom keys)
Pad 1 Mode Enforcer Chromatic
Pad 2 Mode Enforcer Diminished
Pad 3 Mode Enforcer Whole-Half
Pad 4 Mode Enforcer Spanish
Pad 5 Mode Enforcer Whole Tone
Pad 6 Mode Enforcer Minor Blues
Pad 7 Mode Enforcer Pelog
Pad 8 Mode Enforcer NONE


6 Mackie Control

Mackie control.jpg

This driver can be loaded for devices that support MCU protocol and variants. For instance:

  • Original MCU hardware
  • Behringer X-Touch
  • Behringer BCF2000
  • Behringer MÓTOR 49/61 (MC mode)
  • Zoom R8
  • Etc.

You can configure the device configuration via the Web config > Interface menu > MIDI Mackiecontrol.

Internally, a device corresponds to a YAML config file.


7 Fostex Mixtab

Mixtab.png

This driver uses MIDI input and output to communicate with a Fostex Mixtab control surface. The Mixtab was released in 1992 as a hardware controller for the Fostex DCM100 1U rack mounted 8-channel stereo mixer. It provides controls for each of that mixer's parameters, the ability to switch between up to 3 mixer units and offers absolute and pick-up modes of operation. This driver maps the hardware controls to relevant parameters in zynthian (mostly zynmixer).

Each fader strip controls the corresponding audio channel (audio, synth, etc.) in the same order as displayed in zynthian. The DCM SELECT switch moves the control between the first, second and third groups of 8 chains, allowing control of up to 24 chains. The last fader controls the main mixbus.

Each channel strip has the following controls:

  • AUX
  • EQ HI
  • EQ LO
  • PAN
  • MUTE
  • FADER

Fader and pan control the level and pan/balance of each chain. The Mute button sends volume 0, not seperate mute signal.

ZS3 is saved by double pressing the STORE button within 1.5s, but the display must stop flashing before the second press.

The SMOOTH control adjusts tempo.

The AUX EQ act as encoders 1..4.

Other controls act as learnable controllers. (Note AUX1 & AUX2 send the same CC, each over the range 0..63 and 63..127 respectively.)



8 Teenage Engineering OP-1

Te-op1.jpg

The OP-1 is detected and the driver is enabled automatically.

Available in vangelis. Designed for OP-1 Original (OG). Tested with latest firmware version 246. Designed to work with OP-1 in MIDI Mode.

8.1 Configuring the OP-1

To enable the driver integration, on the OP-1:

  • Press Shift + COM Button
  • Select CTRL Mode (Press Button T2)
  • Additional steps for the first time:
    • Press Shift button to verify knobs are sending relative CC, change with blue encoder if needed.
    • Press Shift button to verify <> buttons are sending MIDI CC, change with white encoder if desired. Set to Octave ± if this behavior is preferred.
    • Optionally configure MIDI channel as described here.

To switch to regular OP-1 mode

  • Press Shift + COM Button
  • Select OP-1 Mode (Press Button T1)

8.2 Usage

OP-1 annotated.png
  • Encoder rotation (left to right is 1 to 4)
  • Encoder button push (and release, so short/bold/long works as expected)
  • Tempo
  • Play/record toggle
  • Arrows up-down, left-right


9 SooperLooper CCx10, for Behringer FCB1010 & others

Fcb1010.jpeg
Pedal CC What it does
1 15 Mute current loop (stop recording if needed) → advance to next loop → arm it for recording
2 16 Solo-trigger loop 2: mute loops 3–5, trigger loop 2
3 17 Solo-trigger loop 3: mute loops 2, 4, 5, trigger loop 3
4 18 Solo-trigger loop 4: mute loops 2, 3, 5, trigger loop 4
5 19 Solo-trigger loop 5: mute loops 2, 3, 4, trigger loop 5
6 20 Advance to the next loop (selection only — nothing is muted or triggered)
7 21 Mute the currently selected loop
8 22 Start/stop recording on the currently selected loop
9 23 Soft reset: stop all recording, mute everything, reselect loop 1, re-sync. Recorded audio is kept.
10 24 Start/stop recording — mapped directly in Zynthian to Record Loop 1 (not managed through the ctrldev driver)

This drivers has been originally designed for the Behringer FCB1010, but it can be used with any MIDI controller sending the right MIDI CC as described in the table below.

Each pedal of the FCB1010 is mapped to CC and SooperLooper as described in the next table. Note that you MUST configure your FCB1010 to send triggers with the specified CC numbers. It won't work with FCB's factory assignments, as they are "frankly daft". Of course, you could configure any other MIDI controller to send the same CC numbers and use it instead, so to some extend, this driver is not exclusive for the FCB1010, although it's been designed with it in mind.

This driver implements a specific, but quite common yet, workflow specially tailored to play Jazz Standards, although it probably suits other genres too. It works like this:

  • Loop 1 is always treated as the timing reference — everything else quantizes to it. I tap in a rhythm, usually with conga drums on my keyboard’s drum pads. I then let that rhythm play out while setting the quantize loop for all remaining loops.
  • I then use Pedal 1 to record verse and chorus sections as separate loops. Each loop is quantized, so I just need to remember to hit “Pedal 1” near the end of the verse to tell SooperLooper to begin recording the next loop. For example, when I’m ready to record the verse, I hit pedal 1 and SooperLooper begins recording Loop 2 on the next beat. When I’m ready to do the chorus, I hit pedal 1 again. SooperLooper finishes recording Loop 2, mutes Loop 2, then begins recording Loop 3 on the next beat, and so on.
  • Sometimes, I will record a verse and then end the recording by hitting Pedal 8, causing that loop to continue playing from the beginning. This allows me to repeat the verse and then only start recording the next loop when I need to play the second ending that goes to the chorus (this is a very common jazz pattern).
  • Once I have recorded my loops, I then click one of the “solo” pedals to begin soloing over the chord changes. In most jazz standards, I go back to the first verse which is on Loop 2, so I click “Pedal 2”. I then click the remaining pedals to go through the rest of the song structure. By triggering each loop, I can have sections of different lengths (again, another thing you’ll commonly find in jazz standards). Everything is quantized to the rhythm track, so moving from loop to loop is all seamless.

The upshot is that this driver allows me to lay down my backing bass and chord track at the beginning of the song, then play this throughout while doing the melody and solos. I think it will work for just about any jazz standard without having to adjust the default 43 second loop length, since four loops (loops 2-5) covers a lot. I can do all of this in real time because each action is done by just one pedal. It’s intuitive because I just hit the pedal assigned to the verse or chorus I want to play and it triggers from the start exactly on the quantized beat.

9.1 Configure the Behringer FCB1010

Here’s how to configure the FCB1010, assuming starting from FCB1010’s factory default:

* Select the pedal you want to program (e.g., 1).
* Long press the Down button (2-3 seconds) to put the pedal in programming mode.
* Short press the Up button.
* By default, “1” is lit, indicating that the pedal is sending a program change. We need it to send a control change (“6”).
* Long press “1” (program change) until it is unlit.
* Long press “6” (control change) until it is lit.
* Short press “6” to program the control change. “6” will start blinking.
* Press Up.
* Enter the CC number you want to set for the pedal. For example, in this ctrldev, I map Pedal 1 to CC 15. Numbers are entered by clicking the pedal numbers in order (e.g., “1” and “5”). The numbers will appear in the LED screen.
* Press Up.
* Enter the value you want to send for the CC. I enter “127” for every control (e.g., “1”, “2”, “7”).
* Press Up. “6” stops blinking and is solidly lit. The pedal is now programmed.
* Long press Down to exit programming mode.
* Repeat 1-13 for each pedal (e.g., Pedal 2 = CC 16, etc.).

I’ve uploaded a demo song (“Night and Day”) that I recorded using my Zynthian setup with this ctrldev driver:



It was recorded live. I hit the record button on the Zynthian to start and stop the recording. Nothing in there was layered on tracks.

Here’s how I progressed through the song structure with the pedals on the FCB1010:

   10: start recording bongos
   10: stop recording bongos
   1: start verse 1
   8: repeat verse 1 (first ending)
   1: stop verse 1, start second ending of verse 1 into chorus
   2: start verse 1
   3: start 2nd ending and chorus
   2-3: continue going back and forth between these for the whole song structure.
   1: record a coda as a new track at the end
   8: repeat coda so I can solo over it.
   9: end song

This will be a real game changer for me to be able to do solo gigs as well as playing with just one other instrument or vocalist. Hopefully this is helpful to others.


10 Technical Info For Driver Developers

Drivers are python modules implementing a class. This class can call internal zynthian-ui API, so it has full access to zynthian functionality. It’s not limited by CUIA. No limits, so you can break the UI too 😉

NOTE: the name of the class should be identical to that of the file name. This is a common pitfall when developing new drivers.

dev_ids is a list of identifiers that the driver will match. You can find this by looking at the name of the device in the MIDI Input view in zynthian. If you bold press tge corresponding input to see its options menu, the "Rename port" otpion shows its USB port / MIDI input name. Use the MIDI input name for your dev_ids list, e.g. Rename port 'USB:2.2/Launchkey Mini MK3 In 2' would provide the device id: "Launchkey Mini MK3 In 2".

You can check the full code here:

zynthian-ui/zyngui/zynthian_ctrldev_manager.py zynthian/zyngine · GitHub

and some example drivers here:

zynthian-ui/zyngine/ctrldev/ · GitHub

All drivers must inherit from zynthian_ctrldev_base, implementing the needed functionality as commented in the base code:


#------------------------------------------------------------------------------------------------------------------
# Control device base class
#------------------------------------------------------------------------------------------------------------------

class zynthian_ctrldev_base():

	dev_id = None  		# String that identifies the device (class variable!)
	dev_zynpad = False		# Can act as a zynpad trigger device
	dev_zynmixer = False	# Can act as an audio mixer controller device
	dev_pated = False	# Can act as a pattern editor device


	# Function to initialise class
	def __init__(self):
		self.idev = 0		# Slot index where the device is connected, starting from 1 (0 = None)
		self.zyngui = zynthian_gui_config.zyngui


	# Setup the device connected in slot #idev
	# Before calling this, the caller (ctrldev-manager) should check that driver's ID string matches device's ID string
	def setup(self, idev=None):
		if idev != self.idev:
			# Release currently selected device, if any ...
			self.release()
			# Init new selected device
			if idev > 0:
				self.idev = idev
				logging.info("Setting-up {} in slot {}".format(self.dev_id, self.idev))
				# Setup routing
				lib_zyncore.zmip_set_route_extdev(self.idev - 1, 0)
				zynautoconnect.midi_autoconnect(True)
				# Initialize new selected device
				self.init()
				self.refresh(force=True)


	def release(self):
		if self.idev > 0:
			logging.info("Releasing {} in slot {}".format(self.dev_id, self.idev))
			# If device is still connected, call end
			dev_id = zynautoconnect.get_midi_device_name(self.idev)
			if dev_id and dev_id == self.dev_id:
				self.end()
			# Restore routing
			lib_zyncore.zmip_set_route_extdev(self.idev - 1, 1)
			zynautoconnect.midi_autoconnect(True)
		self.idev = 0


	# Refresh device status (LED feedback, etc)
	# It *SHOULD* be implemented by child class
	def refresh(self, force=False):
		logging.debug("Refresh LEDs for {}: NOT IMPLEMENTED!".format(self.dev_id))


	# Device MIDI event handler
	# It *SHOULD* be implemented by child class
	def midi_event(self, ev):
		logging.debug("MIDI EVENT FROM '{}'".format(self.dev_id))


	# Light-Off LEDs
	# It *SHOULD* be implemented by child class
	def light_off(self):
		logging.debug("Lighting Off LEDs for {}: NOT IMPLEMENTED!".format(self.dev_id))


	# Sleep On
	# It *COULD* be improved by child class
	def sleep_on(self):
		self.light_off()


	# Sleep On
	# It *COULD* be improved by child class
	def sleep_off(self):
		self.refresh(True)

Quite simple, right? This is for basic “generic” drivers. Zynpad enabled drivers inherit from this base class:


# ------------------------------------------------------------------------------------------------------------------
# Zynpad control device base class
# ------------------------------------------------------------------------------------------------------------------

class zynthian_ctrldev_zynpad(zynthian_ctrldev_base):

	dev_zynpad = True		# Can act as a zynpad trigger device


	def __init__(self):
		super().__init__()
		self.zynpad = self.zyngui.screens["zynpad"]


	def refresh(self, force=False):
		# When zynpad is shown, this is done by refresh_status, so no need to refresh twice
		if force or not self.zynpad.shown:
			self.refresh_pads(force)
			self.refresh_zynpad_bank()
		if force:
			self.refresh_zynpad_bank()


	# It *SHOULD* be implemented by child class
	def refresh_zynpad_bank(self):
		pass


	def refresh_pads(self, force=False):
		if force:
			self.light_off()
		for pad in range(self.zyngui.zynseq.col_in_bank ** 2):
			# It MUST be called for cleaning the dirty bit
			changed_state = self.zyngui.zynseq.libseq.hasSequenceChanged(self.zynpad.bank, pad)
			if changed_state or force:
				mode = self.zyngui.zynseq.libseq.getPlayMode(self.zynpad.bank, pad)
				state = self.zynpad.get_pad_state(pad)
				self.update_pad(pad, state, mode)


	def refresh_pad(self, pad, force=False):
		# It MUST be called for cleaning the dirty bit!!
		changed_state = self.zyngui.zynseq.libseq.hasSequenceChanged(self.zynpad.bank, pad)
		if changed_state or force:
			mode = self.zyngui.zynseq.libseq.getPlayMode(self.zynpad.bank, pad)
			state = self.zynpad.get_pad_state(pad)
			self.update_pad(pad, state, mode)


	# It *SHOULD* be implemented by child class
	def update_pad(self, pad, state, mode):
		pass
#------------------------------------------------------------------------------


If you kind-of-understand this, you shouldn’t have problem to understand the driver examples and program your own drivers. Simply copy your driver file in the the zyngui/ctrldev folder and restart zynthian-ui. Refer to this thread for more information NEW: Control-device manager + controller device “drivers”