Created
September 15, 2017 15:42
-
-
Save mbutz/cc590eb3d3d0003b09bdfb5d4d92174d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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