More 16th century: Jouyssance played by Sonic Pi

Unlike many of my pieces this code fits nicely in a buffer and can be played from there.
Piece makes use of at function to alter dynamics and switch octaves in and out. Notes play with linear feeds, but a live_loop is added to give a percussion part, which is stopped after the required number of bars has passed.

#jouyssance.rb
#Jouyssance Vous Donneray music by Thoinot Arbeau c 1520 - c 1595
#arranged for Sonic Pi by Robin Newman, November 2017


with_fx :reverb,room: 0.8,mix: 0.6 do
  with_fx :level do |v|
    use_bpm 160
    flag=0;bass=0
    #change vol after 0,48,96,120,192,216 beats
    at [0,48,96,120,144,192,216], [1, 0.5, 0.7,0.9,0.5,0.8,1.2] do |n|
      control v,amp: n
    end
    at [0,48,96,120,144,192,216], [0,1,0,1,1,0,1] do |f|
      flag=f
    end
    at [0,216],[0,1] do |b|
      bass = b
    end
    
    use_synth :tri
    #first part data
    a1=[]
    b1=[]
    a1=[:D4,:D4,:D4,:F4,:E4,:D4,:C4,:F4,:G4,:E4,:F4,:G4,:A4,:A4,:A4,:G4,:F4,:G4,:A4,:Bf4,:C5,:C5,:Bf4,:A4,:Bf4,:A4,:G4,:F4,:G4,:E4,:F4,:F4,:A4,:G4,:A4,:D4,:D4,:E4,:F4,:G4,:F4,:E4,:D4,:C4,:C4,:C5,:Bf4,:A4,:G4,:F4,:E4,:F4,:Bf4,:A4,:G4,:F4,:E4,:D4,:C4,:D4,:D4,:C4,:D4,:D4,:D4,:D4,:D4,:F4,:E4,:D4,:C4,:F4,:G4,:E4,:F4,:G4,:A4,:A4,:A4,:G4,:F4,:G4,:A4,:Bf4,:C5,:C5,:Bf4,:A4,:Bf4,:A4,:G4,:F4,:G4,:E4,:F4,:F4,:A4,:G4,:A4,:D4,:D4,:E4,:F4,:G4,:F4,:E4,:D4,:C4,:C4,:C5,:Bf4,:A4,:G4,:F4,:E4,:F4,:Bf4,:A4,:G4,:F4,:E4,:D4,:C4,:D4,:D4,:C4,:D4,:D4,:D5,:D5,:D5,:C5,:B4,:C5,:D5,:E5,:D5,:C5,:B4,:A4,:B4,:G4,:A4,:A4,:A4,:G4,:A4,:B4,:C5,:D5,:E5,:D5,:C5,:B4,:A4,:B4,:A4,:G4,:A4,:B4,:G4,:A4,:A4,:D5,:D5,:D5,:C5,:B4,:C5,:D5,:E5,:D5,:C5,:B4,:A4,:B4,:G4,:A4,:A4,:A4,:G4,:A4,:B4,:C5,:D5,:E5,:D5,:C5,:B4,:A4,:B4,:A4,:G4,:A4,:B4,:G4,:A4,:A4,:D4,:C4,:D4,:E4,:D4,:E4,:F4,:E4,:D4,:C4,:F4,:E4,:D4,:E4,:F4,:G4,:A4,:A4,:A4,:G4,:F4,:G4,:A4,:Bf4,:C5,:Bf4,:C5,:D5,:C5,:A4,:Bf4,:A4,:G4,:F4,:G4,:E4,:F4,:F4,:A4,:G4,:A4,:D4,:D4,:E4,:F4,:G4,:F4,:E4,:D4,:C4,:C4,:C5,:Bf4,:A4,:G4,:F4,:E4,:F4,:Bf4,:A4,:G4,:F4,:E4,:D4,:C4,:D4,:D4,:C4,:D4,:D4,:D4,:C4,:D4,:E4,:D4,:E4,:F4,:E4,:D4,:C4,:F4,:E4,:D4,:E4,:F4,:G4,:A4,:A4,:A4,:G4,:F4,:G4,:A4,:Bf4,:C5,:Bf4,:C5,:D5,:C5,:A4,:Bf4,:A4,:G4,:F4,:G4,:E4,:F4,:F4,:A4,:G4,:A4,:D4,:D4,:E4,:F4,:G4,:F4,:E4,:D4,:C4,:C4,:C5,:Bf4,:A4,:G4,:F4,:E4,:F4,:Bf4,:A4,:G4,:F4,:E4,:D4,:C4,:D4,:D4,:C4,:D4,:D4]
    b1=[1.0,1.0,1.0,1.0,0.5,0.5,1.0,1.0,0.5,0.5,0.5,0.5,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,1.0,0.5,0.5,1.0,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,1.0,1.0,1.0,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,1.0,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,1.0,1.0,1.0,1.0,0.5,0.5,1.0,1.0,0.5,0.5,0.5,0.5,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,1.0,0.5,0.5,1.0,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,1.0,1.0,1.0,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,1.0,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,1.0,1.0,1.0,0.5,0.5,0.5,0.5,1.0,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,1.0,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,1.0,1.0,1.0,0.5,0.5,0.5,0.5,1.0,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,1.0,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,1.0,0.5,0.5,1.0,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,1.0,1.0,1.0,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,1.0,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,1.0,0.5,0.5,1.0,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,1.0,1.0,1.0,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0,0.5,0.5,0.5,0.5,0.5,0.5,1.0,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,2.0,1.0]
    in_thread do
      for j in 0..a1.length-1
        play a1[j]+12,sustain: b1[j]*0.9,release: b1[j]*0.1,pan: -0.5 if flag==1 #add octave note
        play a1[j],sustain: b1[j]*0.9,release: b1[j]*0.1,pan: -0.5
        sleep b1[j]
      end
    end #thread
    #second part data
    a2=[]
    b2=[]
    a2=[:A4,:A4,:A4,:A4,:G4,:F4,:G4,:A4,:E4,:E4,:F4,:F4,:F4,:A4,:C5,:G4,:G4,:E4,:G4,:D4,:C4,:A4,:A4,:F4,:E4,:E4,:F4,:F4,:G4,:G4,:G4,:G4,:G4,:A4,:F4,:A4,:A4,:F4,:F4,:G4,:E4,:A4,:F4,:A4,:A4,:A4,:A4,:A4,:G4,:F4,:G4,:A4,:E4,:E4,:F4,:F4,:F4,:A4,:C5,:G4,:G4,:E4,:G4,:D4,:C4,:A4,:A4,:F4,:E4,:E4,:F4,:F4,:G4,:G4,:G4,:G4,:G4,:A4,:F4,:A4,:A4,:F4,:F4,:G4,:E4,:A4,:F4,:A4,:A4,:F4,:A4,:A4,:E4,:G4,:B4,:G4,:E4,:E4,:E4,:C5,:C5,:G4,:C5,:B4,:G4,:E4,:E4,:G4,:E4,:E4,:A4,:F4,:A4,:A4,:E4,:G4,:B4,:G4,:E4,:E4,:E4,:C5,:C5,:G4,:C5,:B4,:G4,:E4,:E4,:G4,:E4,:E4,:A4,:A4,:A4,:A4,:G4,:F4,:G4,:A4,:A4,:D4,:F4,:F4,:F4,:A4,:C5,:G4,:G4,:E4,:G4,:D4,:C4,:A4,:A4,:F4,:E4,:E4,:F4,:F4,:C5,:G4,:G4,:G4,:G4,:A4,:F4,:A4,:A4,:F4,:F4,:G4,:E4,:A4,:F4,:F4,:A4,:A4,:A4,:A4,:G4,:F4,:G4,:A4,:A4,:D4,:F4,:F4,:F4,:A4,:C5,:G4,:G4,:E4,:G4,:D4,:C4,:A4,:A4,:F4,:E4,:E4,:F4,:F4,:C5,:G4,:G4,:G4,:G4,:A4,:F4,:A4,:A4,:F4,:F4,:G4,:E4,:A4,:F4,:F4]
    b2=[1.0,1.0,1.0,1.0,0.5,0.5,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,0.5,0.5,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,0.5,0.5,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,0.5,0.5,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,1.0]
    in_thread do
      for j in 0..a2.length-1
        play a2[j],sustain: b2[j]*0.9,release: b2[j]*0.1,pan: 0.5
        sleep b2[j]
      end
    end #thread
    #third aprt: use differnt synth and volume to blend
    use_synth :pulse
    use_synth_defaults amp: 0.4
    a3=[]
    b3=[]
    a3=[:D3,:F3,:C3,:F3,:G3,:F3,:A3,:F3,:A3,:G3,:A3,:G3,:Bf3,:C4,:F3,:F3,:G3,:A3,:D3,:C3,:C3,:F3,:D3,:F3,:D3,:C3,:A3,[:D3,:A3],:D3,:F3,:C3,:F3,:G3,:F3,:A3,:F3,:A3,:G3,:A3,:G3,:Bf3,:C4,:F3,:F3,:G3,:A3,:D3,:C3,:C3,:F3,:D3,:F3,:D3,:C3,:A3,[:D3,:A3],:D3,:A3,:A3,:C4,:G3,:E3,:A3,:F3,:G3,:A3,:G3,:E3,:A3,:D3,:A3,:A3,:C4,:G3,:E3,:A3,:F3,:G3,:A3,:G3,:E3,:A3,:D3,:C3,:D3,:F3,:F3,:A3,:G3,:F3,:F3,:G3,:A3,:D3,:C3,:C3,:F3,:D3,:C3,:A3,[:D3,:A3],:D3,:C3,:D3,:F3,:F3,:A3,:G3,:F3,:F3,:G3,:A3,:D3,:C3,:C3,:F3,:D3,:C3,:A3,[:D3,:A3]]
    b3=[3.0,1.0,2.0,1.0,2.0,3.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,3.0,1.0,1.0,1.0,3.0,3.0,3.0,3.0,1.0,1.0,1.0,2.0,1.0,3.0,3.0,1.0,2.0,1.0,2.0,3.0,1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0,3.0,1.0,1.0,1.0,3.0,3.0,3.0,3.0,1.0,1.0,1.0,2.0,1.0,3.0,3.0,1.0,1.0,1.0,2.0,1.0,3.0,2.0,1.0,1.0,2.0,3.0,3.0,3.0,1.0,1.0,1.0,2.0,1.0,3.0,2.0,1.0,1.0,2.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,1.0,1.0,1.0,3.0,3.0,3.0,3.0,3.0,2.0,1.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,1.0,1.0,1.0,3.0,3.0,3.0,3.0,3.0,2.0,1.0,3.0]
    in_thread do
      for j in 0..a3.length-1
        play a3[j],sustain: b3[j]*0.9,release: b3[j]*0.1
        if bass==1
          with_transpose -12 do#use this method as one chord in list: can't just subtract 12
            play a3[j],sustain: b3[j]*0.9,release: b3[j]*0.1
          end
        end
        sleep b3[j]
      end
    end #thread
    #add rhythm live loop. Stop after 80 bars (look == 79)
    live_loop :rhythm do
      tick
      use_bpm 160
      sample :drum_snare_hard
      sleep 1
      sample :drum_snare_soft
      sleep 0.5
      sample :drum_snare_soft
      sleep 0.5
      sample :drum_snare_hard
      sleep 1
      stop if look == 79
    end# live_loop
  end #level
end #reverb

You can listen to it here

4 Likes