I remember references to it in the old Sonic Pi Google groups forum, so perhaps a little
Looking at the YouTube video’s comments, it might need a bit of an update to keep it compatible with the newer versions of Sonic Pi. Still a great project though
I’ll try and dig it out again. I remember I added some enhancements to this.
EDIT done some work on it and updated the OSC bits for latest version. Also done some further work as at present it tries to alter a frozen list. Working now but needs a bit of polishing. Will publish when finished.
FURTHER EDIT
I’ve now published a fork of the mehackit technomachine updated to run with Sonic Pi 3.3.1
Changes required were:-
Changing port from 4559 to 4560
Changing osc cues in the Sonic Pi program to format “/osc*/…”
Reconfiguring the 8 entry note list which plays the selected sequence to use 8 individual note variables, as it was producing frozen list errors when the program tried to update it.
Using my parse_sync_address function to streamline handling the 8 note OSC cues. note1…note8
I’ve tested this on a Mac, but not yet on Windows. I also tried it on a RPi, but the overheads of running Processing at the same time meant that it was giving timing errors. I am still trying to see if it possible to streamline this to work.
The Sonic Pi program is near the limit of the size that will run in a buffer. It just works on my Mac, but if you have problems run it from the file using run_file “/path/to/technomachine_program”
You also need to install processing 3 and two processing libraries for the GUI front end.
Nice work on the update Robin! I’m sure someone here will be able to test it on Windows
So i have tested. It works but there are some “issues”. Just when the script is launched into sonic pi without lauching the pde script.
Cheers
Just tried it on my Windows box and it seems to work fine with no issues.
hi @robin.newman,
Yes it works but i met some messages into sonic pi as you can see on my screenshot.
Cheers
Hi Robin,
Suppose I’m breaking my own rule on not posting or replying… @nlb seems to think I’m back because I
liked his excellent post on VST’s, but thats not the case.
I’d been working towards my own Techno Toolkit (v2.0) for a while, with a lot of extra’s. Now I don’t see it
happening but I spent too much time on some nice little sounds to waste it. Techno Toolkit v1.0 is an old
post out there somewhere… as is a very good, clean, drop example I cant find just now.
There’s at least another dozen loops, and the ‘density’ approach to drops I haven’t included as they
were incomplete and would only confuse people…
EDIT: You can never have too much Cowbell.
So here it is for anyone to take and use:
Be well,
Eli…
default_bpm = 125
use_bpm default_bpm
set_sched_ahead_time! 2
use_synth :supersaw
#Arrays used to hold info about loop states.
loop = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0]
loopvol = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0]
loopspeed = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0]
loopdensity = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1]
drum_sample = [:bd_ada].ring
drum_phase = [0.75, 0.75,0.75,[0.5,1.5].choose].ring
drum_density = [1].ring
kick_cutoff = [90,90,110,100].ring
kick_sample = [:sn_dolf].ring
kick_phase = [ 0.75, 0.75,0.75,[0.5,1.5].choose].ring
hats_amp = [0,0,1,2,0,0,1,2,0,0,2,3,0,0,2,3,0,0,2,3,0,0,2,3]
hats_density = [1].ring
cowbell_ptn = (ring 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0,1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0)
cowbell_ptn2 = (ring 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1,
0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0)
xylo_hi_note = (ring :c5, :eb5, :c5, :c5, :c5, :eb5, :d5, :eb5)
xylo_hi_ptn = (ring 2 * 0.25, 3 * 0.25, 2 * 0.25, 2 * 0.25, 1 * 0.25, 2 * 0.25, 2 * 0.25, 2 * 0.25)
vol=2
drum=0
kick=1
block=2
rim=3
hats=4
shaker1=5
shaker2=6
cowbell=7
synth2=8
synth2_climb=9
xylo_hi=10
tune=11
define :start_loop do |i|
loop[i] = 1
loopvol[i] = 1
end
define :start_group do |group|
group.each do |i|
loop[i] = 1
loopvol[i] = 1
end
end
define :stop_loop do |i|
loop[i] = 0
loopvol[i] = 0
end
define :stop_group do |group|
group.each do |i|
loop[i] = 0
loopvol[i] = 0
end
end
define :stop_all do
(0..11).each do |i|
loop[i] = 0
loopvol[i] = 0
loopspeed[i] = default_bpm
end
end
define :set_loop_density do |name, value|
loopdensity[name] = value
end
define :set_loop_vol do |name, vol|
loopvol[name] = vol
end
define :set_loop_speed do |name, bpm|
loopspeed[name] = bpm
end
define :set_drum_sample do |samples|
drum_sample = samples.ring
end
define :set_kick_sample do |kicks|
kick_sample = kicks.ring
end
define :set_kick_phase do |phases|
kick_sample_phase = phases.ring
end
live_loop :bar do
sleep 1
end
live_loop :beats do
sync :bar
sleep 4
end
# Anything up to here, you could put into init.rb, to make more space
# for sound effects... I was working towards using 'density' to speed
# up and slow down beats for drops, etc... sure there's a post I made
# somewhere about that, just cant find it right now...
live_loop :drum do
if loop[drum] == 1 then
sync :bar
density loopdensity[drum] do
sample drum_sample.look, amp: [2,1.5,2,2].ring.tick
end
else
sleep 1
end
end
with_fx :lpf, cutoff: 110 do |c|
with_fx :echo, mix: 0.5, phase: 0.5, decay: 3 do |p|
with_fx :ixi_techno do
live_loop :kick do
if loop[kick] == 1 then
sync :beats
control p, phase: kick_phase.ring.tick
control c, cutoff: kick_cutoff.ring.look
sleep 1
sample kick_sample.look, sustain: 0, release: 0.08, hpf: 80,amp: loopvol[kick]
sleep 2
sample kick_sample.look, sustain: 0, release: 0.08, hpf: 80,amp: loopvol[kick]
sleep 0.1
else
sleep 1
end
end
end
end
end
with_fx :rhpf, cutoff: 90 do
live_loop :block do
if loop [block] == 1 then
sync :bar
density loopdensity[block] do
sample :elec_wood, amp: loopvol[block]
sleep 1
end
else
sleep 1
end
end
end
with_fx :rhpf, cutoff: 90 do
with_fx :distortion do
live_loop :rim do
if loop[rim] == 1 then
sleep 0.5
use_sample_defaults amp: 0.2
sample :elec_blip, sustain: 0.006, cutoff:110, rate: 0.8,amp: loopvol[rim]
sleep 0.25
sample :elec_blip, sustain: 0.005, cutoff:110, rate: 0.8,amp: loopvol[rim] if one_in(5)
sleep 0.25
else
sleep 1
end
end
end
end
live_loop :hats do
if loop[hats] == 1 then
sync :bar
amp = hats_amp.tick * 0.5
use_sample_defaults hpf: 100, finish: 0.15, amp: amp
sample :drum_cymbal_closed, amp: amp
else
sleep 0.5
end
end
live_loop :shaker1 do
if loop[shaker1] == 1 then
use_synth :cnoise
use_synth_defaults attack: 0, sustain: 4, release: 0, amp: 6
with_fx :slicer, phase: 0.25, pulse_width: 0.35 do
with_fx :hpf, cutoff: 130 do
play 60
end
sleep 4
end
else
sleep 0.5
end
end
live_loop :shaker2 do
if loop[shaker2] == 1 then
use_synth :noise
use_synth_defaults attack: 0.0, decay: 0.02, release: 0.05, pan: 0.75, amp: 9
with_fx :rhpf, cutoff: 123, res: 0.75, reps: 16 do
if (spread 11, 16).tick then
play :c3
end
sleep 0.25
end
else
sleep 0.5
end
end
live_loop :cowbell do
if loop[cowbell] == 1 then
sync :beats
32.times do
with_fx :reverb, room: 0.25, mix: 0.5 do
if cowbell_ptn.tick > 0 then
s = sample :elec_bell, rate: 2.04, pan: 0.75, amp: cowbell_ptn.look
end
if cowbell_ptn2.look > 0 then
s = sample :elec_bell, rate: 2.74, pan: 0.75, amp: (cowbell_ptn2.look * 0.75)
end
kill s if loop[cowbell] == 0
sleep 0.25
end
end
else
sleep 0.5
end
end
with_fx :ixi_techno, phase: 16 do
with_fx :echo do
with_fx :flanger do
live_loop :synth2 do
if loop[synth2] == 1 then
sync :beats
use_synth :subpulse
use_synth_defaults release: 0.25, cutoff: 90
8.times do
sleep 0.25
tuner = play :eb5, amp: 0.4, pan: -0.6
tuner = play :c5, amp: 0.15, pan: -0.3
sleep 0.25
kill tuner if loop[synth2] == 00
tuner = play :g5, amp: 0.4, pan: -0.3
tuner = play :eb5, amp: 0.15, pan: -0.1
sleep 0.25
kill tuner if loop[synth2] == 00
tuner = play :f5, amp: 0.4, pan: -0.1
tuner = play :d5, amp: 0.15, pan: 0
sleep 0.25
kill tuner if loop[synth2] == 00
play :a5, sustain: 0.25, release: 0.5, amp: 0.3, pan: 0.2
play :f5, sustain: 0.25, release: 0.5, amp: 0.15, pan: 0.4
sleep 0.25
kill tuner if loop[synth2] == 00
end
else
sleep 0.5
end
end
end
end
end
with_fx :reverb, room: 0.5, mix: 0.5 do
with_fx :echo do
with_fx :ixi_techno, phase: 16 do
live_loop :synth2_climb do
if loop[synth2_climb] == 1 then
sync :beats
use_synth :subpulse
this_note = [:e3, :a4, :c3].ring
notes = scale(this_note, :minor_pentatonic, num_octaves: 1)
8.times do
with_fx :reverb, phase: 0.5, mix: 0.8 do
sleep 0.25
tuner =play this_note.tick, pulse_width: 0.2, attack: 0, release: 0.1, amp: rrand(1, 2)+3
end
sleep 0.25
tuner = play notes.look, pulse_width: 0.2, attack: 0, release: 0.1, amp: rrand(1, 2)+3
kill tuner if loop[synth2_climb] == 00
end
else
sleep 0.5
end
end
end
end
end
live_loop :xylo_hi do
if loop[xylo_hi] == 1 then
sync :beats
use_synth :fm
use_synth_defaults divisor: 0, depth: 1, attack: 0, sustain: 0, release: 0.25, amp: 3, pan: 0.3
with_fx :reverb, room: 0.5, mix: 0.5 do
32.times do
play xylo_hi_note.tick
sleep xylo_hi_ptn.look
end
end
else
sleep 0.5
end
end
with_fx :rbpf ,cutoff: 110 do
with_fx :distortion, distort: 0.1 do
with_fx :echo do
with_fx :ixi_techno, phase: 32 do
live_loop :tune do
if loop[tune] == 1 then
sync :bar
use_synth :supersaw
chords = [(chord :e, :minor), (chord :e, :minor), (chord :b, '7sus4'), (chord :a, 'sus4'), (chord :b, '7sus4'), (chord :d+12, 'sus4')].shuffle
c =chords.tick
s=play c-24, cutoff: [80,120].ring.look, amp: (ring 0.5, 1).look
sleep 0.25
s=play c.tick-24, cutoff: [80,100].ring.look, amp: (ring 1,0.5).look
kill s if loop[tune] == 0
sleep [0.25,0.5].choose
else
sleep 0.5
end
end
end
end
end
end
# drum kick block rim hats shaker1 shaker2 cowbell synth2 synth2_climb xylo_hi tune
start_loop tune
sleep 16
start_loop drum
sleep 8
start_loop kick
sleep 16
stop_loop tune
sleep 16
start_group [block, rim, hats]
sleep 16
start_loop synth2
stop_loop block
start_loop shaker1
sleep 32
stop_loop synth2
sleep 8
start_loop synth2_climb
sleep 32
stop_loop synth2_climb
start_loop cowbell
start_loop shaker2
sleep 32
stop_loop cowbell
start_loop shaker2
start_loop xylo_hi
sleep 32
stop_all
sleep 16
# Drop code in here....
start_group [drum, kick, tune]
sleep 32
stop
Sounds good. Thanks for posting.
Nice to hear from you.