FibonacciMomentum


#1

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
  
  at [0,rt(232.4)],[2,0] do |vol| # controls fade in and fade out
    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
      sample :bd_sone,amp: 1.5 if spread(3,4).tick
      sample :drum_cymbal_closed,amp: 2 if !spread(3,4).look
      sleep 0.4
      sample :drum_cymbal_closed,amp: 1.5 if !spread(3,4).look
      sleep 0.4
      stop if get(:kill)
    end #live_loop tb
  end #fx gverb
end #fx level