Wondering what the best way would be to toggle between 2 different live_loops?
In general, I know that live_loops tend to ‘layer on top of each other’. I’ve been using the approach to CMD + s, then CMD + r, to stop then play when I decide to comment out a loop.
Curious:
a) What is the best way to stop a single running loop
b) What is the best way to programmatically turn ON and OFF loops between 2 loops when the program is running.
Note: I’ve seen the use of creating a ring to cycle between beats on the amp: opts for a sound, but not sure if this is the best way to do such.
Here’s an example controlling three live loops which can independently be stopped and started.
This is done by embedding each loop in a function, and using that to control a stop command inside each loop
use_synth :tri
define :lone do |action|
if action==1
set :k1,false
live_loop :one do
play scale(:c5,:minor_pentatonic).choose,release: 0.1
sleep 0.1
stop if get(:k1)
end
else
set :k1,true
end
end
define :ltwo do |action|
if action==1
set :k2,false
live_loop :two do
play scale(:g5,:minor_pentatonic).choose,release: 0.1
sleep 0.1
stop if get(:k2)
end
else
set :k2,true
end
end
define :lthree do |action|
if action==1
set :k3,false
live_loop :three do
play scale(:c6,:minor_pentatonic).tick,release: 0.1
sleep 0.1
stop if get(:k3)
end
else
set :k3,true
end
end
live_loop :control do
puts "start live_loop :lone"
lone 1
sleep 4
puts "stop live_loop :lone"
puts "start live_loop :ltwo"
lone 0
ltwo 1
sleep 4
puts "stop live_loop :ltwo"
puts "start live_loop :lthree"
ltwo 0
lthree 1
sleep 4
puts "ADD live_loop :lone"
lone 1
sleep 2
puts "ADD live_loop :ltwo"
ltwo 1
sleep 4
puts "stop live_loop :one"
puts "stop live_loop :ltwo"
puts "stop live_loop :lthree"
lone 0
ltwo 0
lthree 0
sleep 2
end
What about for an already running live_loop? If I want to remove a progression that has been added?
Or is the best to do so to have a variable assigned to the amp on the sound?
Ultimately, I want to be able to fade between 2 sounds, and currently experimenting with this as a type of fade on volume, but getting errors on updating the numeric value.
live_loop :fade do
vol = get[:volume]
vol = vol * 0.5 # <-- error on this.
set :volume, vol
sleep 2
end
It should work but you have to make sure that you have set an initial value BEFORE starting the loop as otherwise the value will be nil and you cant multiply nil by 0.5!
Try this:
set :volume,1 #make sure you have stored a value for :volume BEFORE the first get
live_loop :fade do
vol = get[:volume]
vol = vol * 0.5
set :volume, vol
puts vol
sleep 2
end
Not sure exactly what you mena by adding or removing a “progression” from a live loop.
You can certainly switch on and off bits of a live loop.
eg try altering the two values for :bh and :dc in this loop. from true to false or vice versa
set :bh,true
set :dc,true
live_loop :test do
sample :bd_haus if get(:bh)
sleep 0.5
sample :drum_cymbal_hard if get(:dc)
sleep 0.5
end
if you want to change the timings too, you could put the control inside an if…end construct eg
set :bh,true
set :dc,true
live_loop :test do
if get(:bh)
sample :bd_haus
sleep 0.5
end
sample :drum_cymbal_hard if get(:dc)
sleep 0.5
end
but make sure there is still some sleep time in the loop if you switch off all the sections
EDIT
if you are controlling from outside the loop as here, best to use set and get.