Tau Bach In Dulci Jubilo

Tau is improving all the time. Tonight coded in some Bach organ music. Works well. Had to split one part as there is a 250 character buffer on typed literal arrays.

You can past the code or use the link to load

--IN DULCI JUBILO coded by Robin Newman for Sonic Tau April 2026
use_bpm 267

--note and duration data
a1 = [:r, :r, :G4, :G4, :G4, :B4, :C5, :D5, :E5, :D5, :G4, :G4, :G4, :B4, :C5, :D5, :E5, :D5, :D5, :E5, :D5, :C5, :B4, :A4, :B4, :G4, :G4, :A4, :A4, :B4, :A4, :G4, :A4, :B4, :D5, :B4, :G4, :D5, :E5, :C5, :D5, :B4, :G4, :D5, :C5, :E4, :B4, :G4, :D4, :B4, :A4, :C4, :G4, :D4, :B3, :Fs4, :G4, :A4, :E4, :C4, :E4, :A4, :Fs4, :B4, :G4, :D4, :B4, :A4, :C4, :G4, :D4, :B3, :G4, :A4, :C4, :B4, :G4, :D4, :G4, :B4, :E4, :E4, :Fs4, :Fs4, :G4, :A4, :B4, :C5, :D5, :B4, :B4, :A4, :A4, :G4, :G4, :Fs4, :G4, :B4, :C5, :D5, :E5, :D5, :Cs5, :A4, :B4, :Cs5, :D5, :A4, :G4, :A4, :Fs4, :G4, :A4, :G4, :Fs4, :D4, :D4, :D4, :Fs4, :G4, :A4, :B4, :A4, :D4, :D4, :D4, :Fs4, :G4, :A4, :B4, :A4, :A4, :B4, :A4, :G4, :Fs4, :E4, :Fs4, :D4, :D4, :E4, :E4, :Fs4, :E4, :D4, :E4, :Fs4, :A4, :Fs4, :D4, :A4, :B4, :G4, :A4, :Fs4, :D4, :A4, :G4, :B3, :Fs4, :D4, :A3, :Fs4, :E4, :G3, :D4, :A3, :Fs3, :Cs4, :D4, :E4, :B3, :G3, :B3, :E4, :Cs4, :Fs4, :D4, :A3, :Fs4, :E4, :G3, :D4, :A3, :Fs3, :D4, :E4, :G3, :Fs4, :D4, :A3, :D4, :Fs4, :E4, :E4, :Fs4, :Fs4, :G4, :A4, :B4, :C5, :D5, :B4, :B4, :A4, :A4, :G4, :Fs4, :G4, :D4, :E4, :Fs4, :G4, :A4, :G4, :Fs4, :G4, :A4, :B4, :C5, :B4, :C5, :D5, :E5, :F5, :E5, :Fs5, :G5]
b1 = [2.0, 2.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 6.0, 4.0, 2.0, 4.0, 2.0, 2.0, 2.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 6.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.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, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 4.0, 2.0, 4.0, 2.0, 3.0, 1.0, 1.0, 1.0, 6.0, 4.0, 2.0, 4.0, 2.0, 6.0, 4.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 6.0, 4.0, 2.0, 4.0, 2.0, 2.0, 2.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 6.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.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, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 4.0, 2.0, 4.0, 2.0, 3.0, 1.0, 1.0, 1.0, 6.0, 4.0, 2.0, 4.0, 2.0, 10.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5, 0.5, 1.0, 1.0, 6.0]
a2 = [:r, :r, :B3, :B3, :A3, :B3, :C4, :D4, :C4, :D4, :E4, :B3, :G3, :A3, :B3, :C4, :B3, :C4, :B3, :A3, :B3, :C4, :B3, :A3, :B3, :C4, :D4, :C4, :D4, :E4, :B3, :G3, :A3, :B3, :C4, :B3, :G4, :F4, :E4, :D4, :C4, :B3, :F4, :E4, :D4, :C4, :B3, :C4, :D4, :E4, :D4, :E4, :C4, :E4, :D4, :C4, :B3, :C4, :D4, :C4, :B3, :C4, :B3, :C4, :A3, :B3, :C4, :D4, :B3, :C4, :D4, :C4, :D4, :B3, :G3, :A3, :B3, :C4, :B3, :C4, :D4, :E4, :Fs4, :D4, :G4, :r, :r, :r, :r, :r, :r, :r, :r, :r, :C4, :B3, :C4, :A3, :r, :D4, :C4, :D4, :B3, :r, :E4, :D4, :C4, :B3, :A3, :A4, :G4, :A4, :Fs4, :E4, :D4, :G4, :E4, :Fs4, :G4, :E4, :Fs4, :G4, :Fs4, :r, :D4, :C4, :D4, :E4, :D4, :r, :C4, :B3, :C4, :D4, :C4, :B3, :G4, :G4, :Fs4, :E4, :D4, :Cs4, :D4, :Fs3, :Fs3, :E3, :Fs3, :G3, :A3, :G3, :A3, :B3, :Fs3, :D3, :E3, :Fs3]
b2 = [2.0, 2.0, 2.0, 2.0, 1.0, 1.0, 2.0, 2.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, 2.0, 1.0, 1.0, 2.0, 2.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, 2.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, 1.0, 1.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, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.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, 3.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, 1.0, 1.0, 4.0, 2.0, 4.0, 2.0, 2.0, 2.0, 2.0, 4.0, 2.0, 2.0, 1.0, 1.0, 2.0, 2.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0]
a2b = [:G3, :Fs3, :G3, :Fs3, :E3, :Fs3, :G3, :Fs3, :E3, :Fs3, :G3, :A3, :G3, :A3, :B3, :Fs3, :D3, :E3, :Fs3, :G3, :Fs3, :D4, :C4, :B3, :A3, :G3, :Fs3, :C4, :B3, :A3, :G3, :Fs3, :G3, :A3, :B3, :A3, :B3, :G3, :B3, :A3, :G3, :Fs3, :G3, :A3, :G3, :Fs3, :G3, :Fs3, :G3, :E3, :Fs3, :G3, :A3, :Fs3, :G3, :A3, :G3, :A3, :Fs3, :D3, :E3, :Fs3, :G3, :Fs3, :G3, :A3, :B3, :Cs4, :A3, :D4, :r, :r, :r, :r, :r, :r, :r, :r, :r, :C4, :B3, :C4, :A3, :r, :D4, :C4, :D4, :B3, :r, :E4, :D4, :C4, :B3, :A3, :A4, :G4, :A4, :Fs4, :E4, :D4, :G4, :E4, :Fs4, :G4, :E4, :Fs4, :G4, :Fs4, :r, :D4, :C4, :D4, :E4, :D4, :r, :C4, :B3, :C4, :D4, :C4, :B3, :A3, :B3, :C4, :B3, :C4, :D4, :E4, :D4, :B3, :C4, :D4]
b2b = [2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 2.0, 2.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, 2.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, 1.0, 1.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, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.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, 3.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, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 6.0]
a3 = [:G1, :r, :r, :E1, :E1, :Fs1, :Fs1, :G1, :A1, :B1, :C2, :D2, :B1, :B1, :A1, :A1, :G1, :r, :r, :D1, :r, :r, :E1, :E1, :Fs1, :Fs1, :G1, :A1, :B1, :C2, :D2, :B1, :B1, :A1, :A1, :G1]
b3 = [150.0, 6.0, 6.0, 4.0, 2.0, 4.0, 2.0, 3.0, 1.0, 1.0, 1.0, 6.0, 4.0, 2.0, 4.0, 2.0, 6.0, 6.0, 6.0, 150.0, 6.0, 6.0, 4.0, 2.0, 4.0, 2.0, 3.0, 1.0, 1.0, 1.0, 6.0, 4.0, 2.0, 4.0, 2.0, 24.0]

with_fx :reverb, room: 0.7, mix: 0.7 do
  use_synth :tri
  in_thread do
    a1.length.times do
      play a1.tick, sustain: b1.look * 0.95, release: b1.look * 0.05, pan: -0.5
      sleep b1.look
    end
  end
  in_thread do
    --this part split into becuase exceeds 250 char buffer limit
    in_thread do
      -- each half ina separate thread with sleep before 2nd thread starts
      a2.length.times do
        play a2.tick, sustain: b2.look * 0.95, release: b2.look * 0.05, pan: 0.5
        sleep b2.look
      end
    end
    sleep 238
    --duration of b2 in beats
    in_thread do
      a2b.length.times do
        play a2b.tick, sustain: b2b.look * 0.95, release: b2b.look * 0.05, pan: 0.5
        sleep b2b.look
      end
    end
  end
  in_thread do
    use_synth :saw
    a3.length.times do
      play a3.tick, sustain: b3.look * 0.95, release: b3.look * 0.05
      sleep b3.look
    end
  end
end




click here to load

3 Likes

This is so joyful - love it! Also it’s fab to be able to click ‘load’ to hear pieces, and not have to paste in code.