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

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

I am working now with SooperLooper on Zynthian 5.1 using a Behringer FCB1010 MIDI foot controller to be able to create “verse/chorus” patterns. This is essential to be able to accompany myself “one man band” style while playing jazz standards.

Current Workflow

So far I’ve been using a simple schema:

CC Actions Intended Result
20 Record (latch) Start or end record of the current track.
21 Next Track Cycle from one track to the next.
22 Mute (latch) Mute (or end record and mute) the current track.
23 Multiply (latch) Multiply the current track.

I first play a rhythm into Track 1 (e.g., conga drums) that serves as the controlling loop for the song. This is surprisingly effective; with practice, I’ve found I can reliably get a solid rhythm backing track.

I then multiply this rhythm track (usually just a measure) to be a longer length (usually 4 measures) to give me enough time to “pedal dance” my way through navigating the rest of the tracks.

I then compile the rest of the tracks using the following sequence:

  1. Next Track (21)
  2. Record (20)
  3. Mute (and end record) current track (22)
  4. Next Track (21)

I then repeat steps 2-4 to continue layering tracks. For example, after I have recorded Track 2, I need to send 22 (mute) → 21 (next track) → 20 (record) in order to immediately start recording Track 3.

When I’m done layering my tracks, it requires 4 foot presses: 22 (mute) → 21 (next track) → 21 again (skip over Track 1, the backing rhythm track) → 22 (unmute Track 2).

This works, but it is a lot of foot presses to be doing live when trying to also remember how to play the bass and chords of the jazz backing track! I am fairly coordinated, but not that coordinated.

Ideal Workflow

I would like instead to be able to setup the following workflow:

CC Actions Intended Result
20 Mute / End Record current track; Go to next track; Start Record on next track (now “current”) Allows easy “one button” layering of verse/chorus tracks.
21 Mute Tracks 3, 4, 5; Unmute Track 2 Play only Track 2.
22 Mute Tracks 2, 4, 5; Unmute Track 3 Play only Track 3.
23 Mute Tracks 2, 3, 5; Unmute Track 4 Play only Track 4.
24 Mute Tracks 2, 3, 4; Unmute Track 5 Play only Track 5.
25 Record (latch) Starts and stops record for the current track. Used only to setup Track 1 for the rhythm (controlling loop) and start recording for Track 2.
26 Multiply (latch) Multiplies current track. Used only to setup Track 1 for the rhythm (controlling loop).
27 Next Track (latch) Moves from Track 1 to Track 2. Used only for preparing to record Track 2.
28 Mute (latch) Mutes/unmutes the current track. Used for ending the song.

In this proposed ideal workflow, I would build jazz backing tracks live as follows:

  1. Record Track 1 (CC 25)
  2. End record Track 1 (CC 25)
  3. Next Track (CC 27)
  4. Start record Track 2 (CC 25)
  5. Mute current / move to next track / Record current (20)
  6. Mute current / move to next track / Record current (20)
  7. Mute current / move to next track / Record current (20)
  8. Unmute Track 2, mute all others (21)
  9. Unmute Track 3, mute all others (22)
  10. Unmute Track 4, mute all others (23)
  11. Unmute Track 5, mute all others (24)
  12. When ready to finish, Next Track (27) and Mute Track 1 (28)

Other Approaches

I have read about other approaches to solving this “verse/chorus” scenario, but I don’t think they will work as well as what I’d like to map above.

  1. I keep reading about a “solo” mode in SooperLooper that would be close to what I want. However, in this setup the percussion track (Track 1) needs to remain on all the time, so if “solo” cannot ignore Track 1 then it is not helpful in this setup. If there was a way to ignore the first track, then this would be a great method.
  2. I also read about using “Undo/Redo” for this scenario, i.e., record verse, record chorus, undo to go back to verse, redo to go back to chorus. First, I cannot seem to get that mapped to a CC message. Second, “Undo/Redo” only works if you have verse and chorus. Many jazz standards have A, B, and C sections, along with an intro (that’s why I want to have tracks 2-5 configured).

Questions

  1. Is it possible to chain multiple actions to a single CC message? I imagine this can be done in the webConf but I haven’t come across any references yet on how to do this.
  2. Can I mix setting actions on specific tracks with actions on “the current track”? For example, having one CC map to “Record” acting on the current track (e.g., “Record the current track”) while mute/unmute are applied to specific tracks?

Thanks in advance for any help/advice you can provide!

  • TK
4 Likes

This may be of interest to you: I created a PureData patch that, once you set the FCB1010 up with the right NoteOn notes, will give you a Bang for the press and the release of each footswitch. If you don’t know PD, it’s well worth getting into, as you can do absolutely anything you like with each footswitch, either in PD or passing out whatever midi or audio you want.

FCB1010.pd (14.0 KB)

I created this because one of the 1010’s major design failures is that you can only send CC values when you stomp, and there is no inherent method to send another value when you release. This means that a Piano/Keyboard player cannot use this out of the box as a Sustain pedal. Incredibly stupid.

There are also fairly expensive alternate ROMs you can get which fix this issue, but I can’t afford em, so I did this. If you know PD or are a curious sort, I think you’ll find it useful.

3 Likes

Thanks @jtode, much appreciated! What I am looking to do is have the Zynthian map one CC message to many actions, e.g., turning one foot press into “mute tracks 3, 4, 5, unmute track 2” to isolate which track should be playing at any time. It sounds like PureData would be a way to do this, and if so then yes I am a very curious sort!

I’m assuming that as long as I have a backup of my Zynthian setup I can restore from, I can always “undo” whatever I add with PureData if I end up making a mess out of things.

Before I go fully down this route, I just wanted to confirm: Is there no other way within Zynthian to map an incoming message to fire a number of actions?

Thanks again!

TK

The standard MIDI learn mechanism should be capable of addressing this. You can learn the same CC number to several parameters, not matter they are from the same engine or chain.
The problem is that sooperlooper integration use the same “engine controllers” to manage the “selected loop”. I mean, if you learn the “mute controller”, it will always mute the “selected loop”. Currently you can’t learn something like “mute loop 2”.

We could “unroll” engine controllers, so we have “per-loop” engine controllers, but this would affect other workflows. I mean, some users are comfortable with the “engine controllers manage the selected loop” approach. We could discuss how we can improve current sooperlooper engine to allow more optimized workflows and per-loop engine-controllers that can be learned using the standard mechanism.

Another way would creating optimized ctrldev drivers. For instance, a customized ctrldev driver for the “FCB1010 + Sooperlooper” would allow the higher degree of integration. Indeed, we could have a base ctrldev driver that can be easily tweaked, via config file (or config panel!) to adapt it to the user preferences.

Regards,

1 Like

Thanks @jofemodo. The only problem with mapping multiple actions to the same CC is that the ordering is critical. I need to mute the current track (e.g., CC 22), move to the next track (CC 21), then unmute the current track (CC 22). If I could send a different CC from the FCB1010 (e.g., CC 30) that would send “22 (mute), 21 (next track), 22 (unmute)” to the Zynthian in that order, that would get very close to the ideal scenario. Is that sort of thing possible?

If by “ctrldev driver for FCB1010 and SooperLooper” you mean a way to set a specific mapping of FCB1010 CC messages to specific actions in SL, that would be amazing. What would be the next steps in requesting this?

Thanks!

TK

1 Like

I did some more research on this topic. It looks like one way I could do this “send one message / map to multiple messages in sequence” would be to get a dedicated device like the Blokas Midihub. I could create a script that would perform these steps:

IF CC30 received:
  send CC22
  wait 10ms
  send CC21
  wait 10ms
  send CC22

However, this is fairly pricey for just this one feature.

I’m also reading about the possibility of writing a “Mididings” script. Is that an option to perform this same sequence of events?

Has anyone implemented anything similar to this before to help take one action (e.g., “send CC30”) and have it perform multiple CC’s?

1 Like

Hi

As Said, you should go on ctrldev driver.

For a midi note or CC or Pc you can do all actions you need : select a Loop, mute it, select an other Loop, trigger it,… what you want

For instance, i needed to set the volume of my Loops so : when midi CC from 40 to 46 are manipulated, for each one i select Loop from 1 to 6 and sets the volume of the Loop with value of the midi CC…

Yes, but not in Zynthian.
I made a small device to quickly change the Midi channel for my Korg microKEY (it has a fixed channel that takes a PC to change).

It looks like this:

and inside is only this:

It’s an Arduino pro micro, with a mini USB host shield.

It also transforms CC98 to Program Change messages.

To make it send multiple CC messages with some delay between is easy.

But, it takes some soldering and some Arduino programming (working example available :wink: )

Kind regards,
Hans.

2 Likes

You can do all this in a ctrldev driver too, and it would work inside zynthian with zero cost (apart from time).

You don’t need mididings for this. You could use it, but it would overcomplicate things.

If you want to implement a highly customized workflow for sooperlooper, perfectly integrated with your controller (FCB1010), a “standard” ctrldev driver is the best bet, IMHO.

The best,

1 Like

@jofemodo, I would love to hear how that can be done. I tried but I never succeeded in sending MIDI commands from the ctrldev driver to the chain.

As you once explained to me:

Sending MIDI commands to a chain/engine is not a CUIA and not an API call or is it?

Confused…

Hi

I think best is midi input → CUIA or API function call (which take a bit of searching functions in python files).

But for SooperLooper, which is a processor, tit is easy to set values of parameters as other processors…

1 Like

Hi @HansR !

There are a bunch of working examples in the “ctrldev/examples” directory:

You have examples using mididings and also the python jackClient module. There are very simple ones and some more elaborated.

But as @shieman has recommended, midiproc is not needed for this. Using the engine controllers is much easier.

Regards,

2 Likes

More to study :slight_smile:
Thanks!

Hi

I got a show tomorrow so I am a bit busy. After that, I will send you my ctrlldev driver where you will show a function to get the sooperlooper processor and the midi input function where you will see the actions associated with the note or CC input

3 Likes

Hi @shieman,

Thanks, that would be great !

That would be amazing, thank you!

I asked ChatGPT to review one of the examples of a ctrldev driver from the location @jofemodo mentioned and define a FCB1010 driver that would do the following:

  1. Receive input of CC 30 from FCB1010
  2. Send CCs to Zynthian in this order:
    1. CC 22 (mute)
    2. CC 21 (next track)
    3. CC 22 (unmute)

It created the following tutorial. I have no way of knowing how accurate this is, but I’m attaching it in case this proves useful:

(Note: I removed the file because I don’t want misleading examples on the discussion board)

What do you mean with “sending CC to zynthian”? You probably mean “send CCs to sooperlooper”. Anyway … you should use the sooperlooper engine controllers and stop thinking of sending MIDI CC to the sooperlooper.

Regards,

1 Like

A couple of obvious issues:

The dev_ids should be [*].
There should not be delays in the MIDI thread. You should use some form of threading callback.

1 Like

Hi

I am there

this is my Akai Mpk Mini 1 Ctrldev Driver :

zynthian_ctrldev_akai_mpk_mini.py (8.7 KB)

It 's a personal use but you’ll see how it works with sooperlooper processor dict parameters for actions.

I think trying to send CCs not a good solution.

In my python driver, all is not ok (concerning led of my controller) but is working ok for me like that, for the moment for my tomorrow show.

2 Likes