Skip to content

Instantly share code, notes, and snippets.

@mbutz
Created September 15, 2017 15:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mbutz/cc590eb3d3d0003b09bdfb5d4d92174d to your computer and use it in GitHub Desktop.
Save mbutz/cc590eb3d3d0003b09bdfb5d4d92174d to your computer and use it in GitHub Desktop.
# Basic live looper with Midi Control
# filename: lib-live-looper.rb
# Jack-Connections:
# Midi-Controller => Midi Through
# Soft Synth => Supercollider
# Setup for Arturia Minilab mkII
# Arm track for recording
# Pad 1 -> Track 1
# Pad 2 -> Track 2
# Pad 3 -> Track 3
# Pad 4 -> Track 4
# Pad 8 -> disable all tracks for recording
# Note:
# Recording will start after synchronisation with
# :metro (i. e. after 8 bars have been completed).
# Note also:
# Switch Arturia Minilab to channel 2 (Shift, Pad 2) to load
# your Yoshimi or other softsynth setting (channel 1 is reserved for
# Arturia software).
use_bpm get(:my_bpm)
t1 = buffer[:track1, get(:track1_len)]
t2 = buffer[:track2, get(:track2_len)]
t3 = buffer[:track3, get(:track3_len)]
t4 = buffer[:track4, get(:track4_len)]
live_loop :switch_track do
use_real_time
b = sync "/midi/arturia_minilab_mkii_midi_1/*/10/note_off"
if (b[1] == 0 and b[0] == 43)
set :track, 0
elsif b[0] == 36 and b[1] == 0
set :track, 1
elsif b[0] == 37 and b[1] == 0
set :track, 2
elsif b[0] == 38 and b[1] == 0
set :track, 3
elsif b[0] == 39 and b[1] == 0
set :track, 4
end
end
live_loop :get_volume do
# Mapped to knobs: 13, 14, 15, 16
ctr, vel = sync "/midi/arturia_minilab_mkii_midi_1/*/*/control_change"
if ctr == 73
set :track1_vol, vel.to_f/127 * get(:playback_master)
puts "-----------------> Track 1, Volume: #{get(:track1_vol)}"
elsif ctr == 75
set :track2_vol, vel.to_f/127 * get(:playback_master)
puts "-----------------> Track 2, Volume: #{get(:track2_vol)}"
elsif ctr == 79
set :track3_vol, vel.to_f/127 * get(:playback_master)
puts "-----------------> Track 3, Volume: #{get(:track3_vol)}"
elsif ctr == 72
set :track4_vol, vel.to_f/127 * get(:playback_master)
puts "-----------------> Track 4, Volume: #{get(:track4_vol)}"
end
end
# get(:track[1..4]_len)-beat loop to synchronize live_loops and
# to know, when recording will start which is:
# after every completed get(:track[1..4]_len)-beats.
live_loop :beat do
sleep 1
end
# Set :metro according to set track recording length
live_loop :metro, sync: :beat do
sample :elec_blip, amp: get(:metro_vol), rate: 0.895
if get(:track) == 1
sleep get(:track1_len)
elsif get(:track) == 2
sleep get(:track2_len)
elsif get(:track) == 3
sleep get(:track3_len)
elsif get(:track) == 4
sleep get(:track4_len)
else
sleep 8
end
end
# Record track 1
if get(:track) == 1
in_thread sync: :metro do
with_fx :record, buffer: t1, pre_amp: get(:rec_level) do #buffer[:track1, 8]
live_audio :mk2, stereo: true
end
end
end
# Record track 2
if get(:track) == 2
in_thread sync: :metro do
with_fx :record, buffer: t2, pre_amp: get(:rec_level) do
live_audio :mk2, stereo: true
end
end
end
# Record track 3
if get(:track) == 3
in_thread sync: :metro do
with_fx :record, buffer: t3, pre_amp: get(:rec_level) do
live_audio :mk2, stereo: true
end
end
end
# Record track 4
if get(:track) == 4
in_thread sync: :metro do
with_fx :record, buffer: t4, pre_amp: get(:rec_level) do
live_audio :mk2, stereo: true
end
end
end
# Replay Tracs
live_loop :play_track1, sync: :metro do
sample t1, amp: get(:track1_vol)
sleep get(:track1_len)
end
live_loop :play_track2, sync: :metro do
sample t2, amp: get(:track2_vol)
sleep get(:track2_len)
end
live_loop :play_track3, sync: :metro do
sample t3, amp: get(:track3_vol)
sleep get(:track3_len)
end
live_loop :play_track4, sync: :metro do
sample t4, amp: get(:track4_vol)
sleep get(:track4_len)
end
# replay tracks
live_loop :play_track, sync: :metro do
stop
sample buffer[:track1], amp: get(:vol_track1)
sample buffer[:track2], amp: get(:vol_track2)
sample buffer[:track3], amp: get(:vol_track3)
sample buffer[:track4], amp: get(:vol_track4)
sleep get(:rec_len)
end
comment do
live_loop :debug_track_switch do
stop
if get(:track) == 0
puts "########## All Tracks unarmed"
elsif get(:track) == 1
puts "----------> Track #{get(:track)} armed ..."
elsif get(:track) == 2
puts "----------> Track #{get(:track)} armed ..."
elsif get(:track) == 3
puts "----------> Track #{get(:track)} armed ..."
elsif get(:track) == 4
puts "----------> Track #{get(:track)} armed ..."
end
sleep 0.25
end
live_loop :debug_volume do
puts "------------------------------|"
puts " |"
puts " |"
puts " |"
puts " Track 1, Volume: #{get(:track1_vol)}"
puts " Track 2, Volume: #{get(:track2_vol)}"
puts " Track 3, Volume: #{get(:track3_vol)}"
puts " Track 4, Volume: #{get(:track4_vol)}"
puts " |"
puts " |"
puts " |"
puts "------------------------------|"
sleep 1
end
end #comment
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment