Voice track of an Angels We have Heard on High arrangement with microtones in final verse

# https://sevish.com/scaleworkshop/?n=31%20equal%20divisions%20of%202%2F1%2C%20root%20C&l=1Bv_2Bv_3Bv_4Bv_5Bv_6Bv_7Bv_8Bv_9Bv_aBv_bBv_cBv_dBv_eBv_fBv_gBv_hBv_iBv_jBv_kBv_lBv_mBv_nBv_oBv_pBv_qBv_rBv_sBv_tBv_uBv_vBv&c=cyan_red_red_yellow_red_cyan_red_red_yellow_red_cyan_red_red_yellow_red_%23ccc_yellow_red_cyan_red_red_yellow_red_cyan_red_red_yellow_red_yellow_red_red_%0A%0Acyan_red_red~red_cyan_red_red~red_cyan_red_red_cyan_red_%23ccc_%23ccc_red_cyan_red_red~red_cyan_red_red_cyan_red~red_red_%0A%0Awhite_red_red~red~red_red~red~red_red~red_%23ccc_%23ccc_red~red_red~red~red_red~red~red_red&f=79.mjanm6c3e&m=1o&version=2.0.0
# Map note from 12-tet to 31-tet
define :t31 do |n, root: 60|
  if n.is_a?(Symbol)
    n = n.to_i
  end
  d = n - root
  m = (d % 12).round
  if m == 0
    m = 1.0/31 * 12 # 1 ###
  elsif m == 1
    m = 3.0/31 * 12 # 3
  elsif m == 2
    m = 6.0/31 * 12 # 6 ###
  elsif m == 3
    m = 8.0/31 * 12 # 8
  elsif m == 4
    m = 11.0/31 * 12 # 11 ###
  elsif m == 5
    m = 13.0/31 * 12 # 13 ###
  elsif m == 6
    m = 16.0/31 * 12 # 16
  elsif m == 7
    m = (19.0)/31 * 12 # 18/19 ###
  elsif m == 8
    m = 21.0/31 * 12 # 21
  elsif m == 9
    m = 24.0/31 * 12 # 24 ###
  elsif m == 10
    m = 26.0/31 * 12 # 26 ###
  elsif m == 11
    m = 29.0/31 * 12 # 29
  end
  root + 12 * d.div(12) + m
end

# Convert list/chord to 31 TET
define :t31l do |list|
  list.map { |n| t31 n }
end
# Do nothing with list
define :dn do |list|
  list
end


## Angels We Have Heard On High

use_synth :blade
use_bpm 109
volume = 0.25
sop = true
alt = true
ten = true
bas = true
f = method(:dn)
f2 = method(:t31l)

# Probably add piano/organ accompaniment for first two verses
#### VERSE 1 Vocals
# Few singers
in_thread do
  play_pattern_timed f.call([:e4,:e4,:e4,:g4]), [1], amp: volume * 0.618 # B1
  play_pattern_timed f.call([:g4,:f4,:e4]), [1.5, 0.5, 2], amp: volume * 0.618 # B2
  play_pattern_timed f.call([:e4,:d4,:e4,:g4]), [1], amp: volume * 0.618 # B3
  play_pattern_timed f.call([:e4,:d4,:c4]), [1.5, 0.5, 2], amp: volume * 0.618 # B4
  play_pattern_timed f.call([:e4,:e4,:e4,:g4]), [1], amp: volume * 0.618 # B5
  play_pattern_timed f.call([:g4,:f4,:e4]), [1.5, 0.5, 2], amp: volume * 0.618 # B6
  play_pattern_timed f.call([:e4,:d4,:e4,:g4]), [1], amp: volume * 0.618 # B7
  play_pattern_timed f.call([:e4,:d4,:c4]), [1.5, 0.5, 2], amp: volume * 0.618 # B8
end
in_thread do
  play_pattern_timed f.call([:e3,:e3,:e3,:g3]), [1], amp: volume * 0.618 # B1
  play_pattern_timed f.call([:g3,:f3,:e3]), [1.5, 0.5, 2], amp: volume * 0.618 # B2
  play_pattern_timed f.call([:e3,:d3,:e3,:g3]), [1], amp: volume * 0.618 # B3
  play_pattern_timed f.call([:e3,:d3,:c3]), [1.5, 0.5, 2], amp: volume * 0.618 # B4
  play_pattern_timed f.call([:e3,:e3,:e3,:g3]), [1], amp: volume * 0.618 # B5
  play_pattern_timed f.call([:g3,:f3,:e3]), [1.5, 0.5, 2], amp: volume * 0.618 # B6
  play_pattern_timed f.call([:e3,:d3,:e3,:g3]), [1], amp: volume * 0.618 # B7
  play_pattern_timed f.call([:e3,:d3,:c3]), [1.5, 0.5, 2], amp: volume * 0.618 # B8
end
sleep 32
# Women
in_thread do
  play_pattern_timed f.call([:g4]), [2], amp: volume
  play_pattern_timed f.call([:a4,:g4,:f4,:e4]), [0.5,0.5,0.5,0.5], amp: volume
  play_pattern_timed f.call([:f4,:g4,:f4,:e4,:d4]), [2,0.5,0.5,0.5,0.5], amp: volume
  play_pattern_timed f.call([:e4,:f4,:e4,:d4,:c4]), [2,0.5,0.5,0.5,0.5], amp: volume
  play_pattern_timed f.call([:d4,:g3,:g3]), [1.5, 0.5, 2], amp: volume
  play_pattern_timed f.call([:c4,:d4,:e4,:f4]), [1], amp: volume
  play_pattern_timed f.call([:e4,:d4,:r]), [2, 1, 1], amp: volume
  
  play_pattern_timed f.call([:g4]), [2], amp: volume
  play_pattern_timed f.call([:a4,:g4,:f4,:e4]), [0.5,0.5,0.5,0.5], amp: volume
  play_pattern_timed f.call([:f4,:g4,:f4,:e4,:d4]), [2,0.5,0.5,0.5,0.5], amp: volume
  play_pattern_timed f.call([:e4,:f4,:e4,:d4,:c4]), [2,0.5,0.5,0.5,0.5], amp: volume
  play_pattern_timed f.call([:d4,:g3,:g3]), [1.5, 0.5, 2], amp: volume
  play_pattern_timed f.call([:c4,:d4,:e4,:f4]), [1], amp: volume
  play_pattern_timed f.call([:e4,:d4]), [2, 2], amp: volume
  play_pattern_timed f.call([:c4]), [4], amp: volume
end
sleep 52

# VERSE 2 Vocals
# Men
play_pattern_timed f.call([:e3,:e3,:e3,:g3]), [1], amp: volume # B1
play_pattern_timed f.call([:g3,:f3,:e3]), [1.5, 0.5, 2], amp: volume # B2
play_pattern_timed f.call([:e3,:d3,:e3,:g3]), [1], amp: volume # B3
play_pattern_timed f.call([:e3,:d3,:c3]), [1.5, 0.5, 2], amp: volume # B4
play_pattern_timed f.call([:e3,:e3,:e3,:g3]), [1], amp: volume # B5
play_pattern_timed f.call([:g3,:f3,:e3]), [1.5, 0.5, 2], amp: volume # B6
play_pattern_timed f.call([:e3,:d3,:e3,:g3]), [1], amp: volume # B7
play_pattern_timed f.call([:e3,:d3,:c3]), [1.5, 0.5, 2], amp: volume # B8
# Women
play_pattern_timed f.call([:g4]), [2], amp: volume
play_pattern_timed f.call([:a4,:g4,:f4,:e4]), [0.5,0.5,0.5,0.5], amp: volume
play_pattern_timed f.call([:f4,:g4,:f4,:e4,:d4]), [2,0.5,0.5,0.5,0.5], amp: volume
play_pattern_timed f.call([:e4,:f4,:e4,:d4,:c4]), [2,0.5,0.5,0.5,0.5], amp: volume
play_pattern_timed f.call([:d4,:g4,:g4]), [1.5, 0.5, 2], amp: volume
play_pattern_timed f.call([:c4,:d4,:e4,:f4]), [1], amp: volume
play_pattern_timed f.call([:e4,:d4,:r]), [2, 1, 1], amp: volume
# Women and men
in_thread do
  play_pattern_timed f.call([:g4]), [2], amp: volume
  play_pattern_timed f.call([:a4,:g4,:f4,:e4]), [0.5,0.5,0.5,0.5], amp: volume
  play_pattern_timed f.call([:f4,:g4,:f4,:e4,:d4]), [2,0.5,0.5,0.5,0.5], amp: volume
  play_pattern_timed f.call([:e4,:f4,:e4,:d4,:c4]), [2,0.5,0.5,0.5,0.5], amp: volume
  play_pattern_timed f.call([:d4,:g4,:g4]), [1.5, 0.5, 2], amp: volume
  play_pattern_timed f.call([:c4,:d4,:e4,:f4]), [1], amp: volume
  play_pattern_timed f.call([:e4,:d4]), [2, 2], amp: volume
  play_pattern_timed f.call([:c4]), [4], amp: volume
end
in_thread do
  play_pattern_timed f.call([:g3]), [2], amp: volume
  play_pattern_timed f.call([:a3,:g3,:f3,:e3]), [0.5,0.5,0.5,0.5], amp: volume
  play_pattern_timed f.call([:f3,:g3,:f3,:e3,:d3]), [2,0.5,0.5,0.5,0.5], amp: volume
  play_pattern_timed f.call([:e3,:f3,:e3,:d3,:c3]), [2,0.5,0.5,0.5,0.5], amp: volume
  play_pattern_timed f.call([:d3,:g3,:g3]), [1.5, 0.5, 2], amp: volume
  play_pattern_timed f.call([:c3,:d3,:e3,:f3]), [1], amp: volume
  play_pattern_timed f.call([:e3,:d3]), [2, 2], amp: volume
  play_pattern_timed f.call([:c3]), [4], amp: volume
end
sleep 28 + 1

# Make this a cappella
# VERSE 3 Vocals
# Sopprano
if sop
  in_thread do
    play_pattern_timed f.call([:a4,:a4,:a4,:c5]), [1], amp: volume # B1
    play_pattern_timed f.call([:c5,:bb4,:a4]), [1.5, 0.5, 2], amp: volume # B2
    play_pattern_timed f.call([:a4,:g4,:a4,:c5]), [1], amp: volume # B3
    play_pattern_timed f.call([:a4,:g4,:f4]), [1.5, 0.5, 2], amp: volume # B4
    play_pattern_timed f.call([:a4,:a4,:a4,:c5]), [1], amp: volume # B5
    play_pattern_timed f.call([:c5,:bb4,:a4]), [1.5, 0.5, 2], amp: volume # B6
    play_pattern_timed f.call([:a4,:g4,:a4,:c5]), [1], amp: volume # B7
    play_pattern_timed f.call([:a4,:g4,:f4]), [1.5, 0.5, 2], amp: volume # B8
    
    play_pattern_timed f.call([:c5]), [2], amp: volume
    play_pattern_timed f2.call([:d5,:c5,:bb4,:a4]), [0.5,0.5,0.5,0.5], amp: volume
    play_pattern_timed f2.call([:bb4,:c5,:bb4,:a4,:g4]), [2,0.5,0.5,0.5,0.5], amp: volume
    play_pattern_timed f2.call([:a4,:bb4,:a4,:g4,:f4]), [2,0.5,0.5,0.5,0.5], amp: volume
    play_pattern_timed f2.call([:g4,:c4,:c4]), [1.5, 0.5, 2], amp: volume
    play_pattern_timed f2.call([:f4,:g4,:a4,:bb4]), [1], amp: volume
    play_pattern_timed f2.call([:a4,:g4,:r]), [2, 1, 1], amp: volume
    
    play_pattern_timed f2.call([:c5]), [2], amp: volume
    play_pattern_timed f2.call([:d5,:c5,:bb4,:a4]), [0.5,0.5,0.5,0.5], amp: volume
    play_pattern_timed f2.call([:bb4,:c5,:bb4,:a4,:g4]), [2,0.5,0.5,0.5,0.5], amp: volume
    play_pattern_timed f2.call([:a4,:bb4,:a4,:g4,:f4]), [2,0.5,0.5,0.5,0.5], amp: volume
    play_pattern_timed f2.call([:g4,:c4,:c4]), [1.5, 0.5, 2], amp: volume
    play_pattern_timed f2.call([:f4,:g4,:a4,:bb4]), [1], amp: volume
    play_pattern_timed f2.call([:a4,:g4]), [2, 2], amp: volume
    play_pattern_timed f.call([:f4]), [4], amp: volume
    
    # Have accompaniment return here
    play_pattern_timed f.call([:c5]), [2], amp: volume
    play_pattern_timed f.call([:d5,:c5,:bb4,:a4]), [0.5,0.5,0.5,0.5], amp: volume
    play_pattern_timed f.call([:bb4,:c5,:bb4,:a4,:g4]), [2,0.5,0.5,0.5,0.5], amp: volume
    play_pattern_timed f.call([:a4,:bb4,:a4,:g4,:f4]), [2,0.5,0.5,0.5,0.5], amp: volume
    play_pattern_timed f.call([:g4,:c4,:c4]), [1.5, 0.5, 2], amp: volume
    play_pattern_timed f.call([:f4,:g4,:a4,:bb4]), [1], amp: volume
    play_pattern_timed f.call([:a4,:g4,:f4]), [4, 4, 8], amp: volume
  end
end
# Alto
if alt
  in_thread do
    play_pattern_timed f.call([:f4,:f4,:e4,:e4]), [1], amp: volume
    play_pattern_timed f.call([:g4,:e4,:f4]), [1, 1, 2], amp: volume
    play_pattern_timed f.call([:f4,:e4,:f4,:f4]), [1], amp: volume
    play_pattern_timed f.call([:f4,:e4,:f4]), [1, 1, 2], amp: volume # B4
    play_pattern_timed f.call([:f4,:f4,:e4,:e4]), [1], amp: volume
    play_pattern_timed f.call([:f4,:g4,:f4]), [1, 1, 2], amp: volume
    play_pattern_timed f.call([:f4,:e4,:f4,:f4]), [1], amp: volume
    play_pattern_timed f.call([:f4,:e4,:f4]), [1, 1, 2], amp: volume # B8
    
    play_pattern_timed f.call([:f4]), [1], amp: volume
    play_pattern_timed f2.call([:a4,:g4,:f4,:g4,:f4,:e4,:f4,:e4,:d4]),
      [0.5,0.5,3, 0.5,0.5,3, 0.5,0.5,2], amp: volume # B9-11
    play_pattern_timed f2.call([:c4,:c4,:c4]), [1.5,0.5,2], amp: volume # B12
    play_pattern_timed f2.call([:c4,:e4,:f4,:f4]), [1], amp: volume
    play_pattern_timed f2.call([:f4,:e4,:r]), [2,1,1], amp: volume # B14
    
    play_pattern_timed f2.call([:f4]), [1], amp: volume
    play_pattern_timed f2.call([:a4,:g4,:f4,:g4,:f4,:e4,:f4,:e4,:d4]),
      [0.5,0.5,3, 0.5,0.5,3, 0.5,0.5,2], amp: volume # B15-17
    play_pattern_timed f2.call([:c4,:c4,:c4]), [1.5,0.5,2], amp: volume # B18
    play_pattern_timed f2.call([:c4,:e4,:f4,:f4]), [1], amp: volume
    play_pattern_timed f2.call([:f4,:e4]), [2,2], amp: volume # B20
    play_pattern_timed f.call([:c4]), [4], amp: volume # B21
    
    # Have accompaniment return here
    play_pattern_timed f.call([:f4]), [1], amp: volume
    play_pattern_timed f.call([:a4,:g4,:f4,:g4,:f4,:e4,:f4,:e4,:d4]),
      [0.5,0.5,3, 0.5,0.5,3, 0.5,0.5,2], amp: volume
    play_pattern_timed f.call([:c4,:c4,:c4]), [1.5,0.5,2], amp: volume
    play_pattern_timed f.call([:c4,:e4,:f4,:f4]), [1], amp: volume
    play_pattern_timed f.call([:f4,:e4,:c4]), [4,4,8], amp: volume
  end
end
# Tenor
if ten
  in_thread do
    play_pattern_timed f.call([:c4,:c4,:c4,:c4]), [1], amp: volume
    play_pattern_timed f.call([:d4,:c4,:c4]), [1, 1, 2], amp: volume
    play_pattern_timed f.call([:c4,:c4,:c4,:c4]), [1], amp: volume
    play_pattern_timed f.call([:c4,:bb3,:a3]), [1.5, 0.5, 2], amp: volume
    play_pattern_timed f.call([:c4,:c4,:c4,:c4]), [1], amp: volume
    play_pattern_timed f.call([:d4,:c4,:c4]), [1, 1, 2], amp: volume
    play_pattern_timed f.call([:c4,:c4,:c4,:c4]), [1], amp: volume
    play_pattern_timed f.call([:c4,:bb3,:a3]), [1.5, 0.5, 2], amp: volume
    
    play_pattern_timed f.call([:a3]), [2], amp: volume
    play_pattern_timed f2.call([:d4,:c4,:bb3]), [4, 4, 2], amp: volume # B9-11
    play_pattern_timed f2.call([:g3,:f3,:e3]), [1,1,2], amp: volume
    play_pattern_timed f2.call([:f3,:c4,:c4,:d4]), [1], amp: volume # B13
    play_pattern_timed f2.call([:c4,:c4,:r]), [2,1,1], amp: volume
    
    play_pattern_timed f2.call([:a3]), [2], amp: volume
    play_pattern_timed f2.call([:d4,:c4,:bb3]), [4, 4, 2], amp: volume # B15-17
    play_pattern_timed f2.call([:g3,:f3,:e3]), [1,1,2], amp: volume
    play_pattern_timed f2.call([:f3,:c4,:c4,:d4]), [1], amp: volume # B19
    play_pattern_timed f2.call([:c4,:bb3]), [3,1], amp: volume # B20
    play_pattern_timed f.call([:a3]), [4], amp: volume # B21
    
    # Have accompaniment return here
    play_pattern_timed f.call([:a3]), [2], amp: volume
    play_pattern_timed f.call([:d4,:c4,:bb3]), [4, 4, 2], amp: volume
    play_pattern_timed f.call([:g3,:f3,:e3]), [1,1,2], amp: volume
    play_pattern_timed f.call([:f3,:c4,:c4,:d4]), [1], amp: volume
    play_pattern_timed f.call([:c4,:bb3,:a3]), [6,2,8], amp: volume
  end
end
# Bass
if bas
  in_thread do
    play_pattern_timed f.call([:f3,:f3,:a3,:a3]), [1], amp: volume
    play_pattern_timed f.call([:g3,:c3,:f3]), [1,1,2], amp: volume
    play_pattern_timed f.call([:f3,:c3,:f3,:a3]), [1], amp: volume
    play_pattern_timed f.call([:c4,:c3,:f3]), [1,1,2], amp: volume # B4
    play_pattern_timed f.call([:f3,:f3,:a3,:a3]), [1], amp: volume
    play_pattern_timed f.call([:d3,:e3,:f3]), [1,1,2], amp: volume
    play_pattern_timed f.call([:f3,:c3,:f3,:a2]), [1], amp: volume
    play_pattern_timed f.call([:c3,:c3,:f3]), [1,1,2], amp: volume
    
    play_pattern_timed f.call([:f3]), [2], amp: volume
    play_pattern_timed f2.call([:d3,:f3]), [1,1], amp: volume
    play_pattern_timed f2.call([:g3,:c3,:e3]), [2,1,1], amp: volume
    play_pattern_timed f2.call([:f3,:bb2,:d3]), [2,1,1], amp: volume
    play_pattern_timed f2.call([:e3,:d3,:c3,:bb2]), [1], amp: volume
    play_pattern_timed f2.call([:a2,:c3,:f3,:bb2]), [1], amp: volume
    play_pattern_timed f2.call([:c3,:r,:c3,:r]), [1.9,0.1,1,1], amp: volume # sustain makes it sound like one note otherwise
    
    play_pattern_timed f2.call([:f3]), [2], amp: volume
    play_pattern_timed f2.call([:d3,:f3]), [1,1], amp: volume
    play_pattern_timed f2.call([:g3,:c3,:e3]), [2,1,1], amp: volume
    play_pattern_timed f2.call([:f3,:bb2,:d3]), [2,1,1], amp: volume
    play_pattern_timed f2.call([:e3,:d3,:c3,:bb2]), [1], amp: volume
    play_pattern_timed f2.call([:a2,:c3,:f3,:bb2]), [1], amp: volume
    play_pattern_timed f2.call([:c3]), [4], amp: volume
    play_pattern_timed f.call([:f3]), [4], amp: volume
    
    # Have accompaniment return here
    play_pattern_timed f.call([:f3]), [2], amp: volume
    play_pattern_timed f.call([:d3,:f3]), [1,1], amp: volume
    play_pattern_timed f.call([:g3,:c3,:e3]), [2,1,1], amp: volume
    play_pattern_timed f.call([:f3,:bb2,:d3]), [2,1,1], amp: volume
    play_pattern_timed f.call([:e3,:d3,:c3,:bb2]), [1], amp: volume
    play_pattern_timed f.call([:a2,:c3,:f3,:bb2]), [1], amp: volume
    play_pattern_timed f.call([:c3,:f3]), [8,8], amp: volume
  end
end
1 Like