Maybe This Is Old Hat?

I remember references to it in the old Sonic Pi Google groups forum, so perhaps a little :face_with_hand_over_mouth:
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 :grinning_face_with_smiling_eyes:

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.

4 Likes

Nice work on the update Robin! I’m sure someone here will be able to test it on Windows :slightly_smiling_face:

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. :slight_smile:

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




2 Likes

Sounds good. Thanks for posting.
Nice to hear from you.