# FibonacciMomentum

Havoing seen various ideas from @TonnyStampert utilising Fibonnaci numbers I thought I’d have a play with these myself…
The result is the following piece. (sounds best in stereo headphones)

``````#Fibonacci Momentum by Robin Newman May 2018
#This piece generates number in the Fibonacci Sequence where each new number
#is the sum of the previous two. The numbers are converted to binary
#using a recursive function and then these are then used to control the playing of two notes.
#The binary digits are read progressively from each end of the binary number.
#If the digits are the same the first note plays, if they are different the second note plays.
#The pitch of the first note is controlled by its position from the start of the number.
#The pitch of the 2nd note is controlled by its position from the end of the number.
#In each case the pitches are taken from a ring based on notes from either
#the :e2 :minor_pentatonic or :harmonic_minor scales.
#Further differences are introduced for the pan position and cutoff of each note,
#and one note has a random +/- 1 octave shift applied.
#The piece cycles through the first 50 Fibonacci numbers twice before stopping.
#A regular rhythmic drum and cymbles reinforce the relentless momentum.

use_bpm 90
use_debug false
use_cue_logging false
define :to_binary do |d| #recursive decimal to binary converter
binary = (d % 2).to_s
if d == 0
return binary
elsif d == 1
return 1.to_s
else
return binary = to_binary(d/2).to_s + binary
end
return binary.to_i
end

use_synth :tb303

set :nminus2,0 #first two fibonnaci numbers
set :nminus1,1
set :kill,false # used for stopping the piece
set :cyclesleft,2 # sets the number of cycles

with_fx :level, amp: 0 do |v| # used to fade in and fade out the volume

control v,amp: vol,amp_slide: 7
end

with_fx :gverb,room: 20,mix: 0.4 do #apply gverb

live_loop :fibBinPlay do #generate fibonnaci numbers, then convert to binary
#choose 2,3,6,8 notes from the scale
scname=[:minor_pentatonic,:harmonic_minor].choose
sc=(scale :e2,scname,num_octaves: 3).pick [2,4,8,16].choose
if tick==0 #0 dealt with as a special case
set :cyclesleft,get(:cyclesleft)-1
set :nminus2,0  # set intial values for last two numbers
set :nminus1,1
puts  "Fibonacci number #{look} is #{look}"
play sc[0],release:0.2,amp: 0.4
puts"Binary 0"
sleep 0.2
else
n=get(:nminus2)+get(:nminus1) #gnerate next fibonnaci number
puts "Fibonacci number #{look} is  #{n}"
b=to_binary(n) #convert to binary
puts "binary #{b}"
puts "binary length is #{b.length}"
puts "pick #{sc.length} notes from #{scname} scale" #number of notes available for this pass
b.length.times do |i| #travrse binary number
#read from both ends and play pitch if digits are equal
play sc[i]+[12,-12].choose,release: 0.2,amp: 0.2,cutoff: rrand(60,100),pan: -1 if b[i]==b[b.length-i]
#play second pitch if digits are different
play sc[b.length-i],release: 0.2,amp: 0.2,cutoff: rrand(60,100),pan: 1 if b[i]!=b[b.length-i]
sleep 0.2
end
set :nminus2,get(:nminus1) # update minus1, minus2 for next pass
set :nminus1,n
end
if look==50 and get(:cyclesleft)==0 #finish after 2 complete cycles
set :kill,true
puts "stopping"
stop
end
tick_reset   if look==50 #after 50 passes reset to first number for nect cycle
end #live_loop fibBinPlay

live_loop :tb,auto_cue: false do #accompanying percussion rhtym