Backstory
I recently programmed my Midi Fighter Twister to integrate it into my setup. I’d ordered it and got it a while ago but wasn’t able to make time to set it up. I also take this opportunity to really get this blog running: My whole setup is very complex and I have so many things to write about, regarding various concepts, their realisation and adaptations. But I have to start somewhere and I’m sure I will cover as much as I can over time. That being said, let’s get a move on!
Goal
I want my live-looping-setup to be as accessible and as low-threshold as possible. Some sort of rotary control knobs are essential. I had a Behringer X-Touch mini before, but it only had 8 knobs and I did not like the feel of them. After some research, I found the Midi Fighter Twister (https://store.djtechtools.com/products/midi-fighter-twister). It is a 16 knob controller with lots of features and it has got a great build quality, feel and coloured lights for each knob.
Purpose
- Control the sends of the recorded loops in ableton
- Control of the stereo placement of each loop track (PAN)
- An always assigned volume control for the click track
- A touchable control for my eventide H9
- Some “special usage” knobs
- Be flexible and future-proof for further assignments and purposes
I will get into the general structure and programming of ClyphX Pro in a future post. If you are new to ClyphX Pro, here is the shortest explanation I can give: Think of ClyphX Pro as a hardware controller such as Ableton Push or a launchpad, but as a software version and more than a 100% customisable. You can literally connect, assign and program EVERYTHING. Therefore it is of course capable of really complex customisation.
Configuration of the Controller
Each knob of the MF-T(Midi Fighter Twister) has various layers of control:
1 - MIDI CC out for turning 2 - MIDI NOTE or MIDI CC for pushing 3 - more than one MIDI sent for different regions. This is called Super Knob and you can think of it as a Key Split point on a MIDI keyboard. I don't use this functionality (yet)
Bank 1 are assigned to Midi Channel 1, CC 0-15, Bank 2 Channel 1, CC 16-31 Bank 3 Channel 1, CC 32-47
For pushing down a knob the outgoing MIDI messages are mostly set as momentary MIDI Notes (called NOTE Hold in the MF-T configuration software).
Bank 1, Knob 1 is Chanel 2 Note 0 (C-2) Bank 1, Knob 2 is Chanel 2 Note 1 (C#-2) and so on.
Controlling sends of the looptracks
In CXP (ClyphX Pro) I assigned the knobs as X-Controls for Encoder Bindings. I used this scheme for naming the assignments: MF stands for Midi Fighter, B1 for Bank 1, R1 for Rotary Encoder Data Knob 1.
The syntax for the assignment is:
NAME = CHANNEL, CC, MAPPING_MODE, NEEDS_TAKEOVER, BINDING
So in the file “Encoder Bindings.txt” in the XT-A scripts folder I wrote:
MF-B1-R1 = 1, 0, ABSOLUTE, TRUE, NONE MF-B1-R2 = 1, 1, ABSOLUTE, TRUE, NONE MF-B1-R3 = 1, 2, ABSOLUTE, TRUE, NONE
and so on for all 16 knobs on banks 1–3.
I typed in NONE for each binding because they are bound flexibly. You can re-bind the X-Control to any parameter at any moment. This step is only needed to define what MIDI data is corresponding to a knob in CXP. In other words, it tells the software:
If you receive MIDI in the input for CXP XT-A (that is defined in remote surface Preferences) on Channel 1, CC Number 0, that is Knob 1 on Bank 1 on the MF-T.
I copied the layout I use for my mixing matrix on the launchpad mini onto the MF-T. I am sure at some point I will not have to think about which knob to turn. I hope for some muscle memory to establish. To point out once again: I am confident that when it comes to making music it is key to not have to think about technical things at all.
The “Destination” section layout of the launchpad looks like this:
I tried to replicate the same order on the MF-T. unfortunately, I do not have the same colour palette on the MF-T as on the launchpad mini.
The sends in Ableton Live are routed like this:
SEND A: Red Panda Lab Tensor SEND B: montreal assembly ZELLERSASN 856 SEND C: chase bliss blooper SEND D: MERIS ottobit jr. SEND E: hologram microcosm SEND F: chase bliss CMX 1978 SEND G: eventide H9 SEND H: strymon Volante SEND I: Distiortion & Filter SEND J: chase bliss MOOD SEND K: Pedalboard
To map those knobs to the sends, which is called BINDING in CXP, I use a macro and a variable to have one macro for any track instead of having to program one macro for each individual track.
The macro looks like this:
$BIND-MF-B1-VAR-SENDS$ = BIND MF-B1-R1 %BIND-TR% / SEND C; BIND MF-B1-R2 %BIND-TR% / SEND J; BIND MF-B1-R3 %BIND-TR% / SEND A; BIND MF-B1-R4 %BIND-TR% / SEND B; BIND MF-B1-R5 NONE; (I have no send yet for this slot) BIND MF-B1-R6 %BIND-TR% / SEND E; BIND MF-B1-R7 %BIND-TR% / SEND K; BIND MF-B1-R8 %BIND-TR% / SEND D; BIND MF-B1-R9 %BIND-TR% / SEND H; BIND MF-B1-R10 %BIND-TR% / SEND G; BIND MF-B1-R11 %BIND-TR% / SEND F; BIND MF-B1-R12 %BIND-TR% / SEND I;
I have 8 looptracks and they are assigned via a variable and their track names. so looptrack 1 is named “1” and therefore the variable assigned to that track:
%looptr1%="1"
This allows me to change the name of a looptrack in future projects or to assign it to any other track during a set.
For knobs 1-8 I want to use the push down of knob 1 to bind the send levels of looptrack 1 to knob 1-12.
Now I just have to bring everything together and tell CXP when to take which action. This is where it got a little bit delicate. My first attempt worked more or less but was not reliable and inconsistent. After some trying and testing I came up with a solution. I used the G-Control in CXP to realise my assignment.
in G-Controls.txt:
MF-B1-B1 = NOTE, 2, 0, 0, 127, FALSE MF-B1-B1 PRESSED = %BIND-TR%=%looptr1%;msg %BIND-TR%; MF-B1-B1 RELEASED = $BIND-MF-B1-VAR-SENDS$;
First, I assign the push of the Controller ID: MF-B1-B1. (this is the first knob in the upper left corner)
Second is the action on the press DOWN where I set the variable %BIND-TR% to the corresponding looptrack(1) and display the message on the status bar of ableton to have a visual feedback.
Last but not least, I use the release event of the button to trigger the macro to do the actual binding.
To program all other 7 knobs I simply had to duplicate those lines and change the Controller ID name, the note number and the %var% to %looptr2% etc…. actually very simple and the great thing is, that if it works for one track it will work for ANY other track, that is the beauty of CXP or programming in general.
2) mapping/bind knobs of Bank 2 to the PAN
This was rather easy to program, I defined the knobs to MF-B2-R1 up to….-R16:
MF-B2-R1 = 1, 16, ABSOLUTE, TRUE, NONE MF-B2-R2 = 1, 17, ABSOLUTE, TRUE, NONE MF-B2-R3 = ... MF-B2-R16 = 1, 31, ABSOLUTE, TRUE, NONE
and then wrote a macro to assign these bindings:
$BIND-MF-B2-LOOPPAN$ = BIND MF-B2-R1 %looptr1% / PAN; BIND MF-B2-R2 %looptr2% / PAN; BIND MF-B2-R3 %looptr3% / PAN; BIND MF-B2-R4 %looptr4% / PAN; BIND MF-B2-R5 %looptr5% / PAN; BIND MF-B2-R6 %looptr6% / PAN; BIND MF-B2-R7 %looptr7% / PAN; BIND MF-B2-R8 %looptr8% / PAN;
aaaaaand done.
Click Track Volume Control (Knob 16)
for the volume it is this line in Encoder Bindings.txt:
MF-B1-R16 = 1, 15, ABSOLUTE, TRUE, "CLICK" / VOL
and the push function is on Note Toggle in this case.
so in G-Controls.txt it’s
MF-B1-B16 = NOTE, 2, 15, 0, 127, FALSE MF-B1-B16 PRESSED = "CLICK"/MUTE ON; MF-B1-B16 RELEASED = "CLICK"/MUTE OFF;
Bindings for H9 on Bank 3
I have a midi track setup in Ableton, with the output routed to my H9. I use the simple M4L device to send out MIDI CC (CC Control from Robert Henke https://www.roberthenke.com/technology/m4l.html)
For the bindings, I use the track and device names. To make it bullet-proof, I really had to be precise, because it is case-sensitive.
I wrote in Encoder Bindings.txt:
MF-B3-R2 = 1, 33, ABSOLUTE, TRUE, "M-H9" / DEV("CC-H9-p1") p3 b1 MF-B3-R1 = 1, 32, ABSOLUTE, TRUE, "M-H9" / DEV("CC-H9-p1") p2 b1 MF-B3-R3 = 1, 34, ABSOLUTE, TRUE, "M-H9" / DEV("CC-H9-p1") p4 b1 etc.
p3 b1 stands for the third parameter on bank 1(the M4L device)
Special Functions
To switch between the banks on the MFT I wanted to use the push first three knobs of the lowest row. (Knobs 13-15).
There is no built-in function for this, but there are buttons on the side dedicated to this. However, with a double bass in one hand and a bow in the other, there are not as easy to reach as one might need in the heat of a show. Luckily, I found a solution or a workaround let’s say: When you send a MIDI CC on CH 4 (MFT system channel) you can switch the banks remotely.
CC 0 with a value of 127 is Bank 1 CC 1 with a value of 127 is Bank 2 CC 2 with a value of 127 is Bank 3 CC 3 with a value of 127 is Bank 4
Unfortunately, it is not so easy to send a CC 0 message. In Ableton, not all 127 CCs are implemented so I could not use clip envelopes. The CC Control M4L device also starts with MIDI CC 1. After some digging, I found another M4L MIDI CC device, called CC Mapper. This one goes down to MIDI CC 0.
I created four midi clips with automation envelopes for each Bank and can now trigger them with the push of Knobs 13,14 and 15.
in G-Controls.txt:
MF-B1-B13 = NOTE, 2, 12, 0, 127, FALSE MF-B1-B13 RELEASED = "MIDIFIGHTER" / PLAY "BANK 1" MF-B1-B14 = NOTE, 2, 13, 0, 127, FLASE MF-B1-B14 RELEASED = "MIDIFIGHTER" / PLAY "BANK 2" MF-B1-B15 = NOTE, 2, 14, 0, 127, FALSE MF-B1-B15 RELEASED = "MIDIFIGHTER" / PLAY "BANK 3"
The only downside is, that if I press one of them down, Ableton will start to play. As I will mainly use it when Ableton is running anyway, it is no big deal to me.
Another special knob is Knob 12 on Bank 1, which clears all sends on the bound channel (%BIND-TR%)
MF-B1-B12 PRESSED = $CLEAR-MF-B1-VAR-SENDS$;
and wrote a macro which sets all sends of the track %BIND-TR% to -inf (off)
$CLEAR-MF-B1-VAR-SENDS$ = %BIND-TR% / SEND A 0; %BIND-TR% / SEND B 0; %BIND-TR% / SEND C 0; %BIND-TR% / SEND D 0; %BIND-TR% / SEND E 0; %BIND-TR% / SEND F 0; %BIND-TR% / SEND G 0; %BIND-TR% / SEND H 0; %BIND-TR% / SEND I 0; %BIND-TR% / SEND J 0; %BIND-TR% / SEND K 0; %BIND-TR% / SEND L 0;
Future Plans / Proof
I want to program a copy/paste for the sends of the looptracks, but this is something in the user_action territory and that’s for another time. I also want to do more assignments/mappings to control the H9 or something on my pedalboard which is harder to reach.
I will take it from here and make some music with it. I going to get new ideas and probably find some drawbacks as well. I’m going to gather them and then refine and reprogram my setup. I’ve been doing this now since December 2020 and I am at Version 5.9. This is a number that is absolutely not meaningful because I do not have a proper version history recording: I could probably switch to “Version alpha”?