Generating a CC command to stop multiple ableton loopers

Hi, Ive been hard at work using a footpedal and bome to make Ableton Live behave like a hardware loop station.

I have mostly achieved this but have hit a snag.

The way the loopers behave is they all trigger play, on any press of the footswitches, as well as mute and unmute.. keeping them in sync.

so each pedal (8 in total) has its own looper (8 total loopers)

first press of any pedal unmutes that spacific looper and triggers every loop to start playing ( but they are muted )

triggering any other pedal just unmutes it. ( another play message is carried but is ignored by loopers as they are already playing)

my issue is getting them to “all stop” when all tracks become muted

these are the CCs I send as mutes (32,33,34,35,36,37,38,39) velocity 0 or 1 mutes ( my footpedal has a limitation where it wont send a velocity of 0 at first press on preset load so some are set to 1... firmware bug)

CC#19 is what stops every looper

is it possible for Bome, whenever ALL of these CCs (32,33,34,35,36,37,38,39) become an OFF state (0 or 1 velocity), to send a CC#19?

thanks so much

 

 

Hi,

Thanks for asking. I reviewed your previous mail and have the following questions/clarifications before I answer your questions.

In general, however, yes this is achievable. The strategy would be to monitor the incoming values of each incoming message and store them in local variables. After you store them, you set a timer to loop through the variables you are interested and put rules in that timer translator to determine if to send cc19 or not to stop the looper. In my opinion this would be done best with fewer translators (less to change later) and more rules within the translator (to handle different CCs). Also, to reduce the required number of global variables I suggest a bit map approach. You could, for instance use 8 bits of a 32 bit global variable to handle which loopers are muted or not, and another 8 bits to handle whether it is playing or not. That way one global variable could handle all of the states instead of using 16 global variables. It is a bit more complex to set up that way but iteration through the bits of a single variable is a lot easier than iterating through 32 different CC values.

Anyway, here are the questions I have and once you answer them, I will probably start with a new project with a different strategy than your original project (mostly for maintainability).

If you would rather continue with your project, let me know and I can give you some ideas with the way you have it written as well. It really depends on your comfort level. My strategy would probably involve about less than 20 instead the the 84 or so you have to implement this so far.

Here are my questions/clarifications:

1) What incoming CC and value do you use to start each looper? What is the outgoing CC and value?
It looks like you are using CC30 and CC40 to stop and start two different “Loop chains”
CC 30 sends 127 to 32-39 to start chain 1
CC 40 sends 217 to 42-49 to stop chain 2

2) What incoming CC and value do you use to mute each looper? What is the outgoing CC and value?

Right now it looks like CC 1 with a value of 127 mutes all loopers except the one pressed? How does it know the one pressed needs to be unmuted? Shouldn’t it send a value of 0.
It looks like looper mute output is CC 1,3,5,7,11,9,13,15 with a value of 127

3) What incoming CC and value do you use to unmute each looper? What is the outgoing CC and value?
It looks like looper mute output is CC 1,3,5,7,11,9,13,15 with a value of 0
Right now it looks like CC 1 with a value of 0 unmutes a given looper

4) What incoming CC and value do you use to stop each looper? What is the outgoing CC and value?

It looks like you are using CC30 and CC40 to stop and start two different “Loop chains”
CC 30 sends 0 to 32-39 to stop chain 1
CC 40 sends 0 to 42-49 to stop chain 2

5) When you stop a given looper, do the other loopers also start?
6) When you stop a given looper, do the other loopers also stop?
7) When you start a given looper is it in sync with the other loopers or do you have to start them all at once to keep them in sync?

8) Does muting all loopers stop a loop?
I assume not and you want to send CC19 to do this if they are all muted. What would be the incoming trigger? I assume looking to see if all loopers are muted.

Hi I didn’t see any answers yet so decided to give it a shot based on my limited knowledge and not to completely redesign your project.

I created one global variable ga which I will use to determine which tracks are not muted. If the value of ga=0 then all tracks are muted.

I created 1 preset called CC Evaluation with 2 translatrs

The first translator monitors for CC 1,3,5,7,9,11,13, and 15 and sets bits 0,1,2,3,4,5,6,7,8 of ga depending on which pedal you push. Actually the rules make it so it sets all other pedals except the pedal that you pushed.

So if ga==0 then all tracks are muted. Unmuted tracks have 1 in their bit position.

The second translator takes incoming CC30. If it is 0, it sets ga to 0 and then sends CC19 value of 127 to stop the looper. If not zero it does nothing.

So if you want other actions output when ga=0 then you just need to add a translator that triggers on whatever action (can be a periodic timer if you wish), and look at the value of ga to determine which tracks are unmuted.

I could just as easily used CC30 to set a “mute timer” and then had other translator monitor for the incoming “mute timer” and evaluate the value of ga to take other actions.

You can also add other translators to manipulate the bits of ga in rules and then output “mute timer” to have other translators take action on incoming “mute timer”.

I hope this helps!

Steve Caldwell
Bome Q and A Moderator and
Independent Bome Consultant/Specialist
bome@sniz.biz


Attachments:
1550595559869_Loopy-Monster-2019-02-19.bmtp

I am absolutely willing to start over to get it right! I have to be honest though much of what you described in your strategy is over my head. However I am so open to learning and prefer to implement the strategy you think is best if you are willing to help me through it a bit 🙂

I will answer your questions here… after doing so I will map out in very specific detail everything going on in my project with screenshots as there are a few other things at play to make the looper work. I want to be as clear as possible.

Lastly i can upload my ableton project file if it helps

to quote:
1) What incoming CC and value do you use to start each looper?

CC 1,3,5,7,9,11,13,15 ( each value comes from a different pedal and are sent to a different looper… 8 total… 8 pedals, 8ccs, 8 loopers) are sent from my pedal with a value of either 127, 0 or 1 and are tied to the play button on looper. (play triggers at any value)

There was an original strategy here tying the same ccs to mutes but that later was abandoned as the mutes on the loop chains got added.

all values trigger play and they are being sent from my pedal ( nektar pacer ) in a toggle state.. this keeps the LEDs on pacer in sync with the state of the loopers.

What is the outgoing CC and value?

The outgoing CCs where translated in bome so that If any of the incoming CCs came in Bome would send all other plays button CCs out. so that all loopers started on the first press of any loop.

It looks like you are using CC30 and CC40 to stop and start two different “Loop chains”
CC 30 sends 127 to 32-39 to start chain 1
CC 40 sends 127 to 42-49 to stop chain 2

Yes the reason for this is to fix a problem that arose with my original plan.

the original plan was

-send a CC from pacer in a toggle state
-translate it in bome to send all the other CCs that would play all loopers.
-Tie that same cc to the mute of the track that looper was in.
this would tie the mutes to the value of that CC so that they stayed in sync with the LED on the pedal.
However I later realized that my audio inputs would mute as well so I came up with the loop chains idea.

How it works now is

CC#32-39 are tied to loop chain 1 mute button in each track
CC#42-49 are tied to loop chain 2 mute button in each track
the values are reverse in my pedal so that when say CC32 value 0or1 is sent so is CC42 value 127.
they are tied to the mutes on the loop chains so that when one is muted the other is unmutes.
-looper is in loop chain 1
-no looper in loop chain 2
this allows for the looper to mute but allows for the audio input to always be coming through so when i mute looper the audio input is unaffected and maintains.
-the translators CC30 and CC40 in bome are CCs that are sent on preset load.
-there are 2 presets in my pacer ive made. all play and all stop.
-CC30 at 127 and CC40 at 0 will send on “all play” preset load will translate through bome to fire all loopers on. and on “all stop” preset load will do the opposite to shut all loopers off.

2) What incoming CC and value do you use to mute each looper?

3) What incoming CC and value do you use to unmute each looper?

CC 32-39 value 0or1 Mutes loop chain 1
CC32-39 value 127 unmutes loop chain 1
CC42-49 value 0or 1 Mutes loop chain 2
CC42-49 value 127 unmutes loop chain 2

What is the outgoing CC and value?

outgoing CCs are the same the only thing Bome does is send those values when receiving CC 30 or 40. values remain the same so if Bome receives CC30 value 0 it sends CC32-39 value 0 effectively muting all loop chain 1s

Right now it looks like CC 1 with a value of 127 mutes all loopers except the one pressed?

nope CC1 triggers all play. as does CC3-15 (odd numbers) at this point it would be ok for CC1 to be mapped to all the plays in the 8 loopers as my original strategy as mentioned earlier went out the window.

How does it know the one pressed needs to be unmuted? value Shouldn’t it send a value of 0.
It looks like looper mute output is CC 1,3,5,7,11,9,13,15 with a value of 127

my pedal allows for 6 different CCs to be sent at once per pedal. so for example what sends is …

pedal 1 sends
CC#1 value 127… this goes to bome and is translated to CC1,3,5,7,9,11,13,15 starting ALL PLAY

CC#32 value 127 which Unmutes LOOP CHAIN 1 ( chain with looper )

CC#42 value 0 which Mutes loop chain 2 (chain with no looper that allows for just input audio to run through)

CC#22 ( in a trigger state so both values ) which simply selects the track to put in in view.. however, I have one pedal that send CC#17 to bome. this changes the midi channel from channel 1 to channel 2 (CC17 value 127 ch2, CC17 value 0 ch 1) On channel 2 this CC is tied to the Big Multifunction Button in Bome essentially creating an over-dub mode.

pedal 2-8 do the same but move up in CCs so
pedal 2 sends CC#3, CC#33, 43, 23
pedal 3 send CC#5, 34,44,24
pedal 4 sends CC7, 35,45,25
pedal 5 sendsCC9, 36,46,26
pedal 6 sends CC11, 37,47,27
pedal 7 sends CC13, 38,48,28
pedal 8 sends CC15, 39,49,29

4) What incoming CC and value do you use to stop each looper?

CC#19 value 127 , stop buttons on all 8 loopers are tied to this CC

What is the outgoing CC and value?
this is passed straight into ableton. no change.

It looks like you are using CC30 and CC40 to stop and start two different “Loop chains”
CC 30 sends 0 to 32-39 to stop chain 1
CC 40 sends 0 to 42-49 to stop chain 2

answered this above

5) When you stop a given looper, do the other loopers also start?

no. any time one looper stops all loopers need to stop.
similarly any time one looper plays all loopers need to play.
the only thing that makes it sound like they are stopping and playing is the mutes and unmutes.

the rule I came up with in my head for making this behave like a hardware looper is..

if any looper is triggered to play, all loopers must play.
when the last looper is muted, all loopers must stop.

6) When you stop a given looper, do the other loopers also stop?

yes! always. the only time a looper is stopped is when the last looper is muted or an ALL STOP ( CC19 ) is pressed

there is never a point when some loopers are playing and some are stopped.

7) When you start a given looper is it in sync with the other loopers or do you have to start them all at once to keep them in sync?

they must all start at once

8) Does muting all loopers stop a loop?

right now no, but I need it to yes.

I assume not and you want to send CC19 to do this if they are all muted. What would be the incoming trigger? I assume looking to see if all loopers are muted.

YES YES exactly! so upon muting the last loop ( which could be any of the cc32-39 value 0 or 1 )

Ok im going to take a moment here to really map out every detail of my setup.

picture with mappings attached


Attachments:
![](upload://NJOpOkL1IyZI9pNAz08VTzs7F7.jpeg)

Did you try the file I posted.

What I did is set up a global variable to monitor mute state of each looper. Right pressing CC1,3,5,7,9,11,13, or 15 will not only start the looper (your translators). It will set all but the CC set to “Unmute”. The value of ga indicates which loopers are playing.
Bit 0 on is looper 1
Bit 1 on is looper 2
..
Bit 7 on li looper 8

If you push CC30 with value of 0 (loop chain off), in addition to your translator it will set ga to 0 and then send CC19 with a value of 127. I think this is what you were looking for.

Right now I don’t have any other way to turn the looper on other than the original CC1-CC15 (odd numbers) which send values as you originally had but also change the value of ga.

If you want anything else to send a stop (CC19 value 127) then all you have to do is either set up a periodic time to monitor the value of ga and if it becomes 0, send CC19 value 127). You can also do this by monitoring any incoming CC on CH1 and use rules to send a stop when ga=0. This would have to be after translator 2.1 (preset 2, translator 1).

I will give it a try today!

Hi Steve not seeing a change actually,

Currently is Bome monitoring for off states for CC1-15 (odd numbers)? these CCs are tied to the play buttons… not the mutes.

The mutes CC32-39 are the mutes.. I would thing bome would monitor these as they pass through and when all of these reach a value of 1 or 0 then send that CC19 which is ties to all loopers…

What do you think? and sorry it took me a bit to reply I spent about half the day mapping out in detail the entire operation of the looper in that picture. lol

OK, right now it is set up for starting play and handled in ga.
You are using CC30 to mute and unmute all looper 1 and cc 40 to mute and unmute all looper 2?
I’m still not finding anything that is muting only one specific channel? I feel a bit dense, am I missing something.

The strategy would still be to set a bit in a global variable when a channel is playing and to
clear a bit when it is not. Then to monitor that global variable and when it is set to 0 (all muted), send out the MIDI CC 19 stop message.

Steve Caldwell
Bome Q and A Moderator and
Independent Bome Consultant/Specialist
bome@sniz.biz

CC32 value 0 or 1 mutes Looper 1
CC33 value 0 or 1 mutes Looper 2
CC34 value 0 or 1 mutes Looper 3
CC35 value 0 or 1 mutes Looper 4
CC36 value 0 or 1 mutes Looper 5
CC37 value 0 or 1 mutes Looper 6
CC38 value 0 or 1 mutes Looper 7
CC39 value 0 or 1 mutes Looper 8

what i am trying to achieve is when Bome sees ALL of these values at 0 or 1 ( lets say value under 2 ) a CC19 value 127 is sent with the final off value it recieves

so lets say 3 loopers are unmuted
Bome knows 5 loopers are muted
I mute the 3 unmuted loopers one at a time,
on the final looper geting muted bome sends Cc19 value 127

thats pretty much it.

The on value is 127 ( loopers unmuted )for these same CCs/loopers.

the Cc30 is all loopers muted or unmuted depending on value ( bome is currently set to translate this message to all of the Ccs above. It might not be relevent as its just tied to an all stop button on my controler which carries a CC19 with it anyway)

CC40 mutes / unmutes audio input also might not be relevent to pay attention to.

hope im not being confusing so sorry im trying my hardest to word things right.

Hi, so if you send CC32-CC39 right now from your controller, I assume all that is happending is that these messages are passing through using the routes. This means that no translator will see these (hence pass through). You would need to have translators for these incoming messages, right rules to set the global variable, and then let the message still pass through (leave Swallow unchecked). For output value you could send CC19 if the global variable is 0?
What I would do is change translator 2.0 to handle CC-32-39 on input instead of odd 1-15
and set the global variable ga accordingly. Then if ga is 0 (at end of rules) I would have it send out CC19. Make sense?

Hi,

Try this one.

What I did:

  1. Disabled 2.1 and 2.2 (from previous exercise)
  2. Added 2.3. This monitors for CC32-39 and updates the global variable ga bit map for each channel. If the CC>1 then the bit is set to a 1. If the CC<=1 then the bit is set to a 0. Bit 0 is for CC32 … Bit 8 is for CC-39. Each bit is either set or cleared depending on the CC state. Once ga=0 then it sends CC19 with a value of 7F

I elected to do this all in one translator with rules to handle which incoming CC, the value of the controller. I used math do figure out which bit to stuff or clear.

Here are the rules with comments:

// ignore all but 32-39
if pp<32 then exit rules, skip Outgoing Action
if pp>39 then exit rules, skip Outgoing Action
// Determine bit to set or clear pp will now be the bit
pp=pp-32
//shift bit into position
rr=ga>>pp

// Set or clear the bit
rr=rr&1
// Do we set it or clear it
if qq>1 then Goto “set”
if qq<=1 then Goto “Clear”

Label “set”
tt=1<<pp
ga=ga|tt

Goto “finish”

Label “clear”
tt=1<<pp
tt=tt^-1
ga=ga&tt

Label “finish”

if ga!=0 then exit rules, skip Outgoing Action

 


Attachments:
1550719753047_Loopy-Monster-2019-02-20.bmtp