This piece was inspired by the page
from Google’s Chrome Music Lab on that page you can play arpeggios from the circle of fifths, and you can alter the patter with which the arpeggios are played. One of them uses a 2 part harmony. I took the note pattern for this and wrote a function to play it, and then put together a live loop to play selections from the circle of fifths.
I added various bits to this, including the facility to alter the minor arpeggios by flattening the second note even further (2 semitones instead of one) which sounded nice. I also transposed the whole pattern after each 4 pair of arpeggios had been lplayed suing a sequence
The end result is shown below.
#Circle of Fifths and Arpeggios by Robin newman, June 2018 define :arp do |n,m=0,r=false| #n is base note,m is minor offset,r is reverse arpeggio (when true) c1=[0,4-m,7,12,7,4-m]*2 #part 1 note offsets c2=[7,12,16-m,19,16-m,19,24,19,24,28-m,24,19]*2 #part 2 note offsets if r==true #can reverse play direction using r c1=c1.reverse c2=c2.reverse end 12.times do |i| play note(n)+c1[i],release: 1.0/3 ,cutoff: rrand(70,120)#3 notes per beat play note(n)+c2[i],release: 1.0/3,cutoff: rrand(70,120) sleep 1.0/3 end end with_fx :reverb,room: 0.8,mix: 0.6 do live_loop :pl do use_bpm 120 use_transpose (ring 0,-5,7,12,7,-5)[look(:tr) / 4] #change every 4th pass of the loop use_synth :tb303 tick(:b) #ticks next base note for arpeggio bmaj=(ring :c3,:g3,:d3,:a3,:e3,:b3,:fs3,:cs3,:gs3,:ds3,:as3,:f3).look(:b) in_thread do play note(bmaj)-12 ,sustain: 3.5,release: 0.5,cutoff: rrand(60,100),amp: 0.7 end dir=rand_i arp(bmaj,0,dir) #play major arpeggios #tick(:b) if dice(4)==1 #sometimes advance another note in sequence (optional) bmin=(ring :a3,:e3,:b3,:fs3,:cs3,:gs3,:ds3,:as3,:f3,:c3,:g3,:d3).look(:b) in_thread do play note(bmin)-12 ,sustain: 3.5,release: 0.5,cutoff: rrand(60,100),amp: 0.7 end arp(bmin,dice(2),dir) #play minor arpeggio, with random factor for "3rd" ##| tick(:b) if dice(2)==1 #sometimes advance anoterh note in sequence (optional) if rt(vt) >=192 #start coda puts "start coda.." use_transpose 0 7.times do |j| base=[:c3,:a3,:e3,:d3,:f3,:g3,:c3] min=[0,1,1,1,0,0,0] in_thread do play note(base[j])-12 ,sustain: 3.5,release: 0.5,cutoff: rrand(60,100),amp: 0.7 end arp(base[j],min[j]) end play [:c2,:c3,:e3,:g3,:c4],sustain: 2,release: 10,cutoff: 80,amp: 1 stop end end end
You can hear the piece on soundcloud