Hey Sonic Pi Gurus!
Thanks in advance for your help!! I’m an experienced coder, but somewhat new to Sonic Pi (been coding with it for the last month or so on some personal projects). So far I’m loving it and have made some fun compositions! I’m working on an experimental project that reads a list of instructions from an external file (my own custom data format) and then plays samples from a folder based on those instructions.
I’m stumped on one part of my program – I would like to load in a VARIABLE amount of samples from the instructions list, each with their own Minimum Wait Time and Maximum Wait Time options. Then I would like to trigger ALL the sounds in this array of items, having each sample fire with it’s own sleep timing.
The goal is to be able to play concurrent samples:
Beat 1 - Folder A - Sample 1 (sleep 1) :::: Folder B - Sample 1 (sleep 3)
Beat 2 - Folder A - Sample 2 (sleep 1)
Beat 3 - Folder A - Sample 3 (sleep 1) :::: Folder B - Sample 2 (sleep 3)
Beat 4 - Folder A - Sample 4 (sleep 1)
Beat 5 - Folder A - Sample 5 (sleep 1) :::: Folder B - Sample 3 (sleep 3)
Beat 6 - Folder A - Sample 6 (sleep 1)
Beat 7 - Folder A - Sample 7 (sleep 1) :::: Folder B - Sample 4 (sleep 3)
Beat 8 - Folder A - Sample 8 (sleep 1)
Beat 9 - Folder A - Sample 9 (sleep 1) :::: Folder B - Sample 5 (sleep 3)
This is easy to do if I know how many folders I need to play, because then I can make a live_loop for each folder, but I need to be able to have a variable amount of folders/samples. My initial thought was to trigger all samples at once, and then give each sample it’s own delay time so that they could play concurrently.
I’ve been able to loop through my arrays to build all the necessary sample information, but I’m stumped on how to play the samples so that each one has it’s own timing and does not hold up the next sample in the queue.
Ideally, I would like to fire all samples at once, but have each sample pause for its designated time before playing. I’ve tried playing around with in_thread to allow each sample to have its own sleep timing, but I haven’t been able to get it to work as I’d hoped. Basically, in_thread seems to break my setup – I’m confused as to why.
Here’s the relevant part of my program:
# Setup freeplaylist =  playthislist =  freeplaytrackcounter =  freeplaywaittimes =  freeplaylistcounter = 0 # Sample Playlist Arrays (Simplified -- To Be Replaced with Data-Loading Functions) playthislist = sample_paths "/Folder A/" freeplaylist.push(playthislist.to_a) freeplaytrackcounter.push(0) # Add a Base Zero Counter For Each Element Added To Playlist Array freeplaywaittimes.push(1) # Add 3 Second Wait Time For Each Playlist In This Array playthislist = sample_paths "/Folder B/" freeplaylist.push(playthislist.to_a) freeplaytrackcounter.push(0) # Add a Base Zero Counter For Each Element Added To Playlist Array freeplaywaittimes.push(3) # Add 3 Second Wait Time For Each Playlist In This Array with_fx :reverb, room: 1, amp: 1, amp_slide: 10 do with_fx :echo, decay: 3, phase: 0.5, mix: 0.125 do live_loop :freeplay do freeplaylist.length.times do # Repeat For Each Playlists freeplaylist[freeplaylistcounter].length.times do # Repeat For Each Track in Playlist # Play Next Track In Playlist with_fx :panslicer, phase: 0.5, wave: 3, pan_min: -0.8, pan_max: 0.8, invert_wave: 1 do print "PLAYLIST: " + freeplaylistcounter.to_s print "TRACK: " + freeplaytrackcounter[freeplaylistcounter].to_s print "WAIT: " + freeplaywaittimes[freeplaylistcounter].to_s #in_thread do # sleep freeplaywaittimes[freeplaylistcounter] sample freeplaylist[freeplaylistcounter][freeplaytrackcounter[freeplaylistcounter]], attack: 0.2, release: 0.2 #end end # Advance To Next Track In Playlist if freeplaytrackcounter[freeplaylistcounter] < freeplaylist[freeplaylistcounter].length-1 freeplaytrackcounter[freeplaylistcounter] += 1 else freeplaytrackcounter[freeplaylistcounter] = 0 end end # Advance To Next Playlist if freeplaylistcounter < freeplaylist.length-1 freeplaylistcounter += 1 else freeplaylistcounter = 0 end end # Minimum Wait Time # play 50, release: 0.1, amp: 0.25 sleep 1 end end end
I’m open to a totally different approach, just want to be able to play a bunch of samples with their own timing. Thanks for taking a look!