It’s basically bullshit. An almost-non-sense collage of code fragments. For sure, trying to follow this “tutorial” would create more confusion than learning. Better focus on understanding the code by yourself.
Anyway, i still think that we should consider having per-loop controllers in the engine. At least as an option. This would allow to implement the workflow you want with simple MIDI learning. This has been already discussed in the past and have pros & cons.
Thanks everyone, I greatly appreciate your help as I’m learning how to optimize my setup for live performance.
@jofemodo Thanks for reviewing the ChatGPT-generated Ctrldev driver. Based on your feedback I deleted the markdown file I posted earlier; I don’t want misinformation sticking around these discussion boards!
@shieman Thank you so much for sharing your Ctrldev driver! I reviewed this to see how I can map my schema to the Behringer FCB1010. I had a couple of questions:
Since I am looking to setup SooperLooper actions that react to CC messages sent by the FCB1010, I’m assuming that per @riban’s suggestion I can set dev_ids = [*]. I’ll use CC messages that aren’t being sent by anything else in my setup.
I am not looking to manage any LEDs on my FCB1010, so I’m assuming I can omit (or comment out) the section starting with “Refresh — resynchronisation des LEDs”.
Is there a general reference of commands available in zyngine.zynthian_engine_sooperlooper?
I’ve made good progress so far. This is my first foray into python programming of any sort, so it’s very touch-and-go, but I now at least have a working ctrldev in my Zynthian instance and now it’s just a matter of refining it until I get it to do exactly what I need. Thanks again everyone for your help, will post my ctrldev once it is finished and working flawlessly.
Thanks again @jofemodo for suggesting I try using a ctrldev driver and @shieman for sharing your working example for the Behringer FCB1010. From your example and the help of Claude AI, I was able to develop this driver:
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)
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.
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.
Super cool, mate! The driver and the demo track!
The driver is in vangelis and I will add this to the wiki docs. I’ve added “sooperlooper” to the driver name.
The factory defaults for the FCB1010 are frankly, daft! IIRC there are commands per pedal with PC being the most prevelant. You basically have to configure this device to make it usefull and the quantity of configuation options means everyone probably configures theirs differently.
[Edit] We probably should not call this a FCB1010 driver but instead a driver that expects some CC and converts it to a specific SooperLooper workflow.
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.
There is a typo in the source code stopping this working. I will fix that and also rename this. It isn’t specific to FCB1010. It will work with any set of pedals that send CC or indeed any other MIDI controller.
[EDIT] I have pushed the changes to Vangelis. It is now called, “SooperLooper CCx10” (even though it currently only uses 9 CC). It also now has a help description (info).
@riban agreed! The factory defaults on the FCB1010 are pretty useless. By default, every button sends a program change of “26”. Updating each pedal to send the control changes I mapped in the ctrldev is definitely going to be the most time-consuming part of using the FCB1010 to send these messages.
Here’s how to assign each pedal, 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.).
Also, @riban that makes sense to rename this to be a SooperLooper control. As you mentioned, it really has nothing specifically to do with the FCB1010. Any device that sends CC messages can work just as well (and probably easier to program than the FCB1010).
I wrote some code to interface with the FCB1010 some time ago. I can’t remember how well this works. I think I struggled at the time to test due to using some crap USB MIDI interfaces that fell over when you sent a lot of data, e.g. sysex. In theory, you could set up a script to send the config to the device. There is probably a way to dump it out too so you could just grab a sysex dump after setting it up and share it here for others to benefit. I find it extremely tedious programming the unit manually.
Well, i tried to follow your playing with my poor finger tapping … but much fun playing with you!!
I hope you can forgive me for smatching your nice piece
I looked your get*_*loop_state func. you search state:loop_index in controllers_dict but that key does not exist there… There is an other dictionnary : processor.engine.get_monitors_dict()
So i wonder how your functrions work… But it seems to work.