Creating the Ideal Jazz “one-man-band” setup using SooperLooper

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.

Regards,

3 Likes

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:

  1. 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.
  2. 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”.
  3. Is there a general reference of commands available in zyngine.zynthian_engine_sooperlooper?
    1. (update) It looks like this may be the best reference: SooperLooper - Documentation :: OSC Interface. Thoughts?
  4. Where do I save the Ctrldev file so it is available as a user configuration?
  5. If I completely bork my Zynthian with adding a bad Ctrldev file, how can I undo the installation? Just delete the file and restart the Zynthian?

I think I can take it from there. Thanks again in advance!

TK

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.

4 Likes

hi

Oh you made so progress that i need not to answer your questions !

Just i can give you the keys parameters of SooperLooper, i wrote a function that i call once to see them :

Processor : SooperLooper
Parameter Key : record:0 Value : 0
Parameter Key : record:1 Value : 0
Parameter Key : record:2 Value : 0
Parameter Key : record:3 Value : 0
Parameter Key : record:4 Value : 0
Parameter Key : record:5 Value : 0
Parameter Key : record Value : 0
Parameter Key : overdub:0 Value : 0
Parameter Key : overdub:1 Value : 0
Parameter Key : overdub:2 Value : 0
Parameter Key : overdub:3 Value : 0
Parameter Key : overdub:4 Value : 0
Parameter Key : overdub:5 Value : 0
Parameter Key : overdub Value : 0
Parameter Key : multiply:0 Value : 0
Parameter Key : multiply:1 Value : 0
Parameter Key : multiply:2 Value : 0
Parameter Key : multiply:3 Value : 0
Parameter Key : multiply:4 Value : 0
Parameter Key : multiply:5 Value : 0
Parameter Key : multiply Value : 0
Parameter Key : replace:0 Value : 0
Parameter Key : replace:1 Value : 0
Parameter Key : replace:2 Value : 0
Parameter Key : replace:3 Value : 0
Parameter Key : replace:4 Value : 0
Parameter Key : replace:5 Value : 0
Parameter Key : replace Value : 0
Parameter Key : substitute:0 Value : 0
Parameter Key : substitute:1 Value : 0
Parameter Key : substitute:2 Value : 0
Parameter Key : substitute:3 Value : 0
Parameter Key : substitute:4 Value : 0
Parameter Key : substitute:5 Value : 0
Parameter Key : substitute Value : 0
Parameter Key : insert:0 Value : 0
Parameter Key : insert:1 Value : 0
Parameter Key : insert:2 Value : 0
Parameter Key : insert:3 Value : 0
Parameter Key : insert:4 Value : 0
Parameter Key : insert:5 Value : 0
Parameter Key : insert Value : 0
Parameter Key : undo/redo Value : 1
Parameter Key : next_loop Value : 0
Parameter Key : trigger:0 Value : 0
Parameter Key : trigger:1 Value : 0
Parameter Key : trigger:2 Value : 0
Parameter Key : trigger:3 Value : 0
Parameter Key : trigger:4 Value : 0
Parameter Key : trigger:5 Value : 0
Parameter Key : trigger Value : 0
Parameter Key : mute:0 Value : 1
Parameter Key : mute:1 Value : 1
Parameter Key : mute:2 Value : 1
Parameter Key : mute:3 Value : 1
Parameter Key : mute:4 Value : 0
Parameter Key : mute:5 Value : 0
Parameter Key : mute Value : 1
Parameter Key : oneshot:0 Value : 0
Parameter Key : oneshot:1 Value : 0
Parameter Key : oneshot:2 Value : 0
Parameter Key : oneshot:3 Value : 0
Parameter Key : oneshot:4 Value : 0
Parameter Key : oneshot:5 Value : 0
Parameter Key : oneshot Value : 0
Parameter Key : pause:0 Value : 0
Parameter Key : pause:1 Value : 0
Parameter Key : pause:2 Value : 0
Parameter Key : pause:3 Value : 0
Parameter Key : pause:4 Value : 0
Parameter Key : pause:5 Value : 0
Parameter Key : pause Value : 0
Parameter Key : reverse:0 Value : 0
Parameter Key : reverse:1 Value : 0
Parameter Key : reverse:2 Value : 0
Parameter Key : reverse:3 Value : 0
Parameter Key : reverse:4 Value : 0
Parameter Key : reverse:5 Value : 0
Parameter Key : reverse Value : 0
Parameter Key : rate Value : 1.0
Parameter Key : stretch_ratio Value : 1.0
Parameter Key : pitch_shift Value : 0.0
Parameter Key : sync_source Value : 1
Parameter Key : sync Value : 1
Parameter Key : eighth_per_cycle Value : 16
Parameter Key : quantize Value : 3
Parameter Key : mute_quantized Value : 0
Parameter Key : overdub_quantized Value : 0
Parameter Key : replace_quantized Value : 1
Parameter Key : round Value : 1
Parameter Key : relative_sync Value : 0
Parameter Key : smart_eighths Value : 1
Parameter Key : playback_sync Value : 1
Parameter Key : use_feedback_play Value : 0
Parameter Key : rec_thresh Value : 0.022473827004432678
Parameter Key : feedback Value : 0.0
Parameter Key : dry Value : 0.0
Parameter Key : wet Value : 1.0
Parameter Key : input_gain Value : 1.0
Parameter Key : loop_count Value : 4
Parameter Key : selected_loop_num Value : 4
Parameter Key : single_pedal:0 Value : 0
Parameter Key : single_pedal:1 Value : 0
Parameter Key : single_pedal:2 Value : 0
Parameter Key : single_pedal:3 Value : 0
Parameter Key : single_pedal:4 Value : 0
Parameter Key : single_pedal:5 Value : 0
Parameter Key : single_pedal Value : 0
Parameter Key : selected_loop_cc Value : 0
Parameter Key : load_file Value :

All you have all keys to change or get values of sooperlooper processor dict.

1 Like

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:

zynthian_ctrldev_behringer_fcb1010.py (18.2 KB)

I mapped each pedal of the FCB1010 to the following CCs that will do the following actions in SooperLooper

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)

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.

Let me know if you have any questions!

TK

6 Likes

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.

Thanks a lot … and enjoy the playing!

2 Likes

I’ve a little question. Is this the default (factory) CC assignment ?
If not, is there a reason to not using the “factory CC assignment”?

Regards,

Regads,

1 Like

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.

4 Likes

OK! Understand! I will add a note in the wiki docs,

1 Like

I wrote this in the docs:

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.

Regards,

2 Likes

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).

3 Likes

Hi

Congratulations !

I will study your driver, cause I want to drive different parts of a « song » with SooperLooper

1 Like

I’ve fixed the wiki to reflect this change.

Regards,

3 Likes

Superfine Day & Night!! Luminous!!
You are a true bossamaaannn! I would like to jam with you, jeje! :star_struck:

2 Likes

@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:

  1. Select the pedal you want to program (e.g., 1).
  2. Long press the Down button (2-3 seconds) to put the pedal in programming mode.
  3. Short press the Up button.
  4. By default, “1” is lit, indicating that the pedal is sending a program change. We need it to send a control change (“6”).
  5. Long press “1” (program change) until it is unlit.
  6. Long press “6” (control change) until it is lit.
  7. Short press “6” to program the control change. “6” will start blinking.
  8. Press Up.
  9. 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.
  10. Press Up.
  11. Enter the value you want to send for the CC. I enter “127” for every control (e.g., “1”, “2”, “7”).
  12. Press Up. “6” stops blinking and is solidly lit. The pedal is now programmed.
  13. 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).

TK

1 Like

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.

1 Like

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 :blush:

Cheers!

1 Like

Hi

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.

Hi Jofemodo

I see that zynthian_ctrldev_akai_apc_key25_mk2_sooperlooper sets and gets values of SL directly in osc. Do you think that’s better ?

Thanks