I became interested in microtonal tunings after watching a video on a Renaissance “enharmonic organ.”
A bit more looking and I found this piece, Madonna il poco dolce, by Nicola Vincentino, performed on a reconstruction of the enharmonic harpsichord he designed, the archicembalo.
I was curious to see if I could emulate this instrument in Sonic Pi, since I knew it could play fractional midi notes. Using the the tuning in cents found in the diagram on the Wikipedia page (checking them against a couple of other sources), I input offsets for each of the notes in one octave and created a function to move the notes to the octaves I wanted. I wasn’t quite sure how to store these in way that I could easily refer to them by name except by putting each offset in a variable. The song itself was transcribed from the original score, and checked against the above Youtube video. Each part is a nested list. I’m not sure if that’s the best way to store that either.
https://imslp.org/wiki/L'antica_musica_ridotta_alla_moderna_prattica_(Vicentino%2C_Nicola)
The only other thing I’m not sure of is what tuning pitch was used at this period in Italy, so C4 is just at modern pitch.
# "Madonna il poco dolce"
# composed by Nicola Vicentino
# from "L'antica musica ridotta alla moderna prattica" (1555) pages 68-69
# https://imslp.org/wiki/L%27antica_musica_ridotta_alla_moderna_prattica_(Vicentino%2C_Nicola)
# code by Thomas Quanci
# 31 August, 2019
# tuning for the enharmonic harpsichord, "archicembalo," designed by Vicentino
# https://en.wikipedia.org/wiki/Archicembalo
# this performance and sheet music used to check against original score
# https://www.youtube.com/watch?v=bhGwjgZ8zIY
# the score was preferred when the two differed
# Lyrics (from this vocal performance, https://www.youtube.com/watch?v=GoEpUcAHL08):
# Madonna, il poco dolce e il molto amaro
# Il breve riso, il troppo lungo pianto
# M’hanno ridotto a tanto
# Che’l pianger sempr’ e sospirar mi è caro
# My lady, the small sweetness and great bitterness,
# The brief smile, the too-long grief
# Have reduced me so much
# That to weep always and sigh are dear to me.
# defining the tuning
c = 0.00 # offset from C in cents/100 = semitones = midi note
cd = 0.41
cs = 0.76
db = 1.17 # flat
dbd = 1.58 # diesis up flat (dot above note on score)
d = 1.93 # natural
dc = 1.98 # comma up natural (comma above note on score... not in this piece)
dd = 2.34 # diesis up natural (dot above note on score)
ds = 2.69 # sharp
eb = 3.10
ebd = 3.51
e = 3.86
ec = 3.92
ed = 4.27
es = 4.62
f = 5.03
fd = 5.44
fs = 5.79
gb = 6.20
gbd = 6.61
g = 6.96
gc = 7.02
gd = 7.37
gs = 7.72
ab = 8.13
abd = 8.54
a = 8.89
ac = 8.95
ad = 9.30
as = 9.65
bb = 10.06
bbd = 10.47
b = 10.82
bc = 10.88
bd = 11.23
bs = 11.58
r = -1 # rest
# durations for easy input
q = 0.25 # quarter (semiminim)
h = 0.5 # half (minim)
# for puttting notes in the desired octave
define :oct do |pitch, oct|
return (12*(oct+1) + pitch)
end
# define the parts
# [note, duration, octave]
soprano = [[g, 2, 4], #bar 1s (for reference, not in score)
[gb, 1, 4],
[fd, 1, 4],
[g, h, 4], #2s
[a, h, 4],
[g, 1, 4],
[a, 1, 4],
[ad, 1.5, 4],
[ad, h, 4], #3s
[bb, 1, 4],
[bb, 1, 4],
[r, h],
[c, h, 5],
[bd, 1.5, 4], #4s
[bd, h, 4],
[b, h, 4],
[b, h, 4],
[bd, 1, 4],
[c, h, 5], #5s
[c, 1, 5],
[bb, h, 4],
[g, 1, 4],
[a, 2, 4],
[r, h], #6
[g, h, 4],
[f, q, 4],
[d, q, 4],
[a, 1, 4],
[g, h, 4],
[f, q, 4], #7s
[f, q, 4],
[e, 1, 4],
[e, h, 4],
[f, 1, 4],
[fs, 1, 4],
[g, 1, 4], #8s
[gs, 1, 4],
[a, 2, 4],
[bb, 1, 4], #9s
[b, 1, 4],
[b, 1, 4],
[b, 1, 4],
[r, 1.5], #10s
[f, h, 4],
[fs, h, 4],
[f, h, 4],
[ed, 1.5, 4],
[fd, h, 4], #11s
[d, 1.5, 4],
[ds, h, 4],
[ed, h, 4],
[ed, h, 4],
[ed, 1, 4], #12s
[f, 1, 4],
[fs, 1, 4],
[g, 2, 4],
[r, h], #13s
[g, h, 4],
[e, h, 4],
[e, h, 4],
[f, h, 4],
[fs, h, 4],
[gb, 1, 4], #14s
[gd, 1, 4],
[r, h],
[ad, h, 4],
[bbd, h, 4],
[gd, h, 4],
[gbd, h, 4], #15s
[gb, h, 4],
[g, h, 4],
[gs, h, 4],
[a, 1, 4],
[r, h],
[d, 1, 4],
[eb, h, 4], #16s
[e, h, 4],
[c, 0.75, 5],
[bb, q, 4],
[a, 1, 4],
[c, h, 5],
[a, 1, 4], #17s
[bb, h, 4],
[bb, 0.75, 4],
[a, q, 4],
[g, 1, 4],
[fs, h, 4],
[g, 2, 4], #18s
[a, 1, 4],
[r, 3],
[a, 1, 4], #19s
[bb, 1, 4],
[b, 1, 4], #20s
[b, 0.75, 4],
[c, q, 5],
[d, h, 5],
[d, h, 5],
[ad, h, 4],
[bbd, h, 4],
[bb, 1.5, 4], #21s
[a, h, 4],
[a, 2, 4],
[fs, 2, 4], #22s
[gb, 2, 4]] #23s
alto = [[d, 1, 4], #1a
[d, 1, 4],
[dd, 1, 4],
[cd, h, 4],
[cd, h, 4],
[e, h, 4], #2a
[f, h, 4],
[d, 0.75, 4],
[e, q, 4],
[f, h, 4],
[f, h, 4],
[gb, 1, 4],
[gb, 1, 4], #3a
[r, 1],
[g, 2, 4],
[gd, 1.5, 4], #4a
[gd, h, 4],
[gs, h, 4],
[gs, h, 4],
[gd, 1, 4],
[g, h, 4], #5a
[f, 0.75, 4],
[eb, q, 4],
[d, h, 4],
[eb, 1, 4],
[d, 1, 4],
[d, 1, 4], #6a
[r, h],
[d, h, 4],
[d, q, 4],
[f, q, 4],
[f, 1, 4],
[e, h, 4],
[c, q, 4], #7a
[d, q, 4],
[g, h, 3],
[g, h, 3],
[r, h],
[a, 1, 3],
[d, 1, 4],
[b, 1, 3], #8a
[e, 0.75, 4],
[d, q, 4],
[c, h, 4],
[c, h, 4],
[a, 1, 3],
[d, 1, 4], #9a
[r, 1],
[gs, 1, 4],
[g, 1, 4],
[fs, 1, 4], #10a
[f, 0.75, 4],
[e, q, 4],
[d, 1, 4],
[db, 1, 4],
[cd, 1, 4], #11a
[f, 1, 3],
[r, 1],
[cd, 1, 4],
[db, 1, 4], #12a
[d, 1, 4],
[a, h, 3],
[bb, 1, 3],
[c, h, 4],
[b, 1, 3], #13a
[bb, 1, 3],
[a, 1, 3],
[d, 1, 4],
[ad, 1, 3], #14a
[d, h, 4],
[gd, 1, 3],
[gb, h, 3],
[gd, h, 3],
[bbd, h, 3],
[ad, 1, 3], #15a
[c, h, 4],
[b, h, 3],
[c, h, 4],
[cs, h, 4],
[d, h, 4],
[d, h, 4],
[b, h, 3], #16a
[b, h, 3],
[g, 1, 3],
[a, h, 3],
[c, 1, 4],
[c, h, 4],
[r, h], #17a
[d, h, 4],
[d, 1.5, 4],
[d, h, 4],
[d, h, 4],
[d, h, 4],
[b, 1, 3], #18a
[c, 1, 4],
[r, h],
[d, h, 4],
[ad, h, 3],
[bbd, h, 3],
[bb, h, 3], #19a
[c, h, 4],
[c, h, 4],
[b, h, 3],
[a, 1, 3],
[r, h],
[g, h, 4],
[g, 1.5, 4], #20a
[d, h, 4],
[fs, 1, 4],
[gb, 1, 4],
[g, h, 4], #21a
[g, h, 4],
[fs, h, 4],
[f, 1, 4],
[d, 1, 4],
[cs, h, 4],
[d, 2, 4]] #22a
tenor = [[b, 1, 3], #1t
[bb, 1, 3],
[ad, 2, 3],
[c, 1, 4], #2t
[bb, 1, 3],
[c, 1, 4],
[dd, 1, 4],
[dd, 1, 4], #3t
[r, h],
[d, h, 4],
[eb, 1.5, 4],
[eb, h, 4],
[dd, 1, 4], #4t
[dd, 1, 4],
[e, 1, 4],
[dd, 1, 4],
[r, h], #5t
[a, h, 3],
[a, h, 3],
[bb, h, 3],
[bb, 1, 3],
[a, 1, 3],
[r, h], #6t
[f, h, 3],
[g, q, 3],
[a, q, 3],
[bb, h, 3],
[a, 1, 3],
[r, h],
[c, h, 4],
[a, q, 3], #7t
[a, q, 3],
[c, 1, 4],
[c, h, 4],
[r, 1],
[a, 1, 3],
[g, h, 3], #8t
[g, h, 3],
[b, h, 3],
[b, h, 3],
[a, 1, 3],
[cs, 1, 4],
[r, 1], #9t
[d, 1, 4],
[e, 2, 4],
[a, 1, 3], #10t
[a, 1.5, 3],
[a, h, 3],
[ad, 1, 3],
[ad, 1, 3], #11t
[r, h],
[bb, h, 3],
[fs, h, 3],
[g, h, 3],
[gd, 1, 3],
[ad, 1, 3], #12t
[a, 1, 3],
[d, 1, 4],
[g, 1, 3],
[r, h], #13t
[e, h, 4],
[d, h, 4],
[d, h, 4],
[cs, h, 4],
[c, h, 4],
[a, 1, 3],
[dd, h, 4], #14t
[dd, h, 4],
[bd, h, 3],
[bbd, h, 3],
[ad, h, 3],
[dd, h, 3],
[dd, 1, 3],
[dd, 1, 3], #15t
[e, 1, 3],
[e, h, 3],
[f, h, 3],
[f, h, 3],
[g, h, 3],
[fs, h, 3], #16t
[fs, h, 3],
[c, h, 4],
[e, h, 3],
[e, h, 3],
[e, h, 3],
[a, 0.75, 3],
[bb, q, 3],
[c, h, 4], #17t
[f, h, 3],
[f, h, 3],
[f, h, 3],
[g, h, 3],
[bb, h, 3],
[a, 1, 3],
[g, 1, 3], #18t
[r, 1],
[fs, 1, 3],
[gb, h, 3],
[fd, h, 3],
[g, 2, 3], #19t
[c, h, 4],
[d, 1, 4],
[d, h, 4],
[e, h, 4],#20t
[e, h, 4],
[e, h, 4],
[b, h, 3],
[r, h],
[a, h, 3],
[dd, h, 4],
[dd, h, 4],
[bb, 0.75, 3], #21t
[c, q, 4],
[d, h, 4],
[a, 0.75, 3],
[g, q, 3],
[f, h, 3],
[e, 1, 3],
[d, 4, 3]] #22t
bass = [[g, 1, 3], #1b
[g, 1, 3],
[dd, 1, 3],
[fd, 1, 3],
[c, h, 3], #2b
[f, h, 3],
[g, h, 3],
[g, h, 3],
[f, h, 3],
[f, h, 3],
[dd, 2, 3],
[g, 1, 3], #3b
[r, 1],
[c, 1, 3],
[gd, 1.5, 3], #4b
[gd, h, 3],
[e, h, 3],
[e, h, 3],
[gd, 1, 3],
[e, h, 3], #5b
[f, 1, 3],
[g, h, 3],
[g, 1, 3],
[f, 1, 3],
[r, h], #6b
[d, h, 3],
[c, q, 3],
[f, q, 3],
[g, h, 3],
[d, 1, 3],
[r, h],
[c, h, 3],
[f, q, 3], #7b
[d, q, 3],
[c, 1, 3],
[a, h, 2],
[d, 2, 3],
[e, 2, 3], #8b
[f, 1, 3],
[fs, 1, 3],
[g, 2, 3], #9b
[e, 2, 3],
[d, 3, 3], #10b
[r, 1],
[ad, 1, 2], #11b
[bb, 1, 2],
[b, 1, 2],
[cd, 1, 3],
[ad, 1, 2], #12b
[d, 2, 3],
[eb, 1, 3],
[e, 1, 3], #13b
[g, 1, 3],
[r, 1],
[d, 1, 3],
[dd, h, 3], #14b
[dd, h, 3],
[gd, h, 2],
[gd, h, 2],
[dd, 1, 3],
[gd, 1, 2],
[r, 2], #15b
[a, 1, 2],
[bb, 1, 2],
[b, 1, 2], #16b
[c, 1, 3],
[a, 1, 2],
[f, 1.5, 3],
[d, h, 3], #17b
[bb, 0.75, 2],
[a, q, 2],
[g, h, 2],
[g, h, 2],
[d, 1, 3],
[g, 1, 2], #18b
[r, 1],
[d, 1, 3],
[dd, 1, 3],
[eb, 1, 3], #19b
[e, 1, 3],
[f, 1, 3],
[g, 1, 3],
[e, 1, 3], #20b
[r, h],
[g, h, 3],
[d, 1, 3],
[dd, 1, 3],
[eb, 1, 3], #21b
[d, 2, 3],
[a, 1, 2],
[a, 4, 3]] #22b
#play the piece
use_bpm 50
use_synth :fm
div = 1 # divisor
dep = 0.5 # depth
at = 0.00 # attack
am = 1 # amp
with_fx :reverb, mix: 0.7 do
in_thread do
soprano.each do |n| # play soprano part
if n[0] != -1 # check for rests
play oct(n[0], n[2]), release: n[1], pan: 0.67, attack: at, amp: am, divisor: div, depth: dep
sleep n[1]
else
sleep n[1]
end
end
end
in_thread do
alto.each do |n| # play alto part
if n[0] != -1
play oct(n[0], n[2]), release: n[1], pan: -0.33, attack: at, amp: am, divisor: div, depth: dep
sleep n[1]
else
sleep n[1]
end
end
end
in_thread do
tenor.each do |n| # play tenor part
if n[0] != -1
play oct(n[0], n[2]), release: n[1], pan: 0.67, attack: at, amp: am, divisor: div, depth: dep
sleep n[1]
else
sleep n[1]
end
end
end
in_thread do
bass.each do |n| # play bass part
if n[0] != -1
play oct(n[0], n[2]), release: n[1], pan: -0.33, attack: at, amp: am, divisor: div, depth: dep
sleep n[1]
else
sleep n[1]
end
end
end
end