0:00/0:00
// White Christmas — Grant & Forsyth
// 84 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 78 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: The whole transcription plays 12 ms ahead of the beat; the grid follows it, so its parts stay together.
setcpm(84/4)
// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once · [...]/2 spreads a riff over 2 bars.
// A part's distinct bars are riffs (A, B, C...) played in order, A@4 for four bars: edit a riff to change every repeat.
// chords · piano · "A.PIANO 1"
const piano = note(`<
~@7 A@2 B@2 C D E F G H I J K L M N O P Q@2 R S T U V W X Y K Z M AA AB AC A@2 B@2 C D E F G H I J K L M N O P Q@2 R S
T F V AD X Y K Z M AA AB AC AE AF@2
>`.pickRestart({
A: "[[a1,a2,a3,c#4,e4]@13 ~ a1@5 ~ a1@11 ~, ~@14 [a2,a3,d4,f#4]@17 ~]/2", // A D
B: "[[a1,a2,a3,c#4,e4]@13 ~ a1@5 ~ a1@11 ~, ~@7 [a2,a3,d4,f#4]@9]/2", // A D
C: "a2@5 ~ a2@2 e3@2 a3@2 [e3,a3,c#4]@4, [a1,e3,a3,c#4]@8 [a1,a2]@7 ~", // A
D: "[a2,f#3,a3]@2 ~ a2 [d#3,a3,c4]@2 ~ a2, a1!2, d4@3 ~ [e3,a3,c#4]@4 a2@6 ~@2, ~@3 [e3,a3,c#4]", // D Adim A
E: "[b1,b2]@3 b2 ~ a3 [f#3,a3,d4] b2, d4@5 ~@3, [f#3,a3]@8 b1@7 ~, ~@8 [b2,f#3]@5 ~@3", // B D F#m B5
F: "[d#2,d#3,g3,a#3,d#4]@4 [e2,e3,g#3,b3,e4]@4 [e2,e3,b3,e4]@3 ~ [d#2,d#3,a#3,d#4]@4", // D# E E5 D#5
G: "[a3,d4] f#3 [a3,d4] f#3 [a3,d4] f#3 [a3,d4] [d3,f#3], d2@8 d2@7 ~, d3@5 ~ d3 ~ d3@5 ~@3", // D5 D
H: "[b3,e4] g#3 [b3,e4] [e3,g#3] [b3,e4] g#3 [b3,e4] [e3,g#3], e2!2, e3@6 ~@2 e3@5 ~@3", // E5 E E5 E
I: "[e3,a3,c#4]@2 e3 ~ [a3,c#4]@2 a2@2 ~@2 f#3@2 ~@2 e2 f#2, a1@3 f#3@2 ~ f#3@2, a2@4 e3 ~ [a3,d4]@6 ~ a3@3, ~@4 [a1,a2]@3 d4", // A D5 A
J: "[a2,e3,a3,c#4]@4 ~@2 a2 ~ [e2,e3,a3]@4 [e2,e3,g#3,b3]@4, a1@7 ~@9, ~ [e3,a3,c#4] ~@2", // A A5 E A
K: "a2@2 c#4 a2 [g#3,c#4] e3 [g#3,c#4] [a2,e3], [a1,e3,a3]@8 a1@7 ~, c#4@3 ~@5 a2@5 ~@3, ~@8 e3 ~@7", // C#5 A5
L: "[g3,c#4]@2 e3@2 [g3,c#4]@2 b1 c2 [g3,c#4]@2 e3@2 [g3,c#4]@2 e3@2, [a1,a2]@5 ~ e3@2 c#2@5 ~@3", // Gdim A
M: "[d4,f#4] a3 [d4,f#4] [d3,a3] [d4,f#4] a3 [d4,f#4] d3, d2@7 ~ d2@8, d3@5 ~@3 d3@5 ~ a3 ~", // D D5 D
N: "[d2,a3,e4,f4]@3 d3 [d3,a3,d4]@2 ~ d4, d3@5 ~@3 [d2,f4]@8, ~@3 d3, ~@13 a3@3", // Dm D5 Dm
O: "[a3,c#4]@2 e3@2 [a3,c#4]@2 e3@2 [a3,c#4]@2 e3@2 c#4@2 [a2,e3] ~, a1@7 ~ a1@7 ~, a2@5 ~ a2 ~ a2@4 a3@4", // A A5
P: "[b2,f#3,a3,d4]@3 ~ [a2,e3,a3,c#4]@3 ~ [g#2,g#3,b3]@4 [f#2,f#3,a3]@4", // Bm7 A G#m F#m
Q: "[[g#3,b3]@2 e3@2 [g#3,b3]@2 [e2,e3]@2 [g#3,b3]@2 e3@2 [a3,c#4] ~ f#2 g2 ~@2 e3 ~ e3@2 g#2@2 [g#3,b3,d4]@4 [e3,g#3,b3,d4]@4, e2@5 ~@3 e2@4 e3@2 [g#3,b3,d4]@9 ~@9, ~@8 g#2@3 ~ g#2@4]/2", // G#m E G#m A G#dim E7 G#dim
R: "[e3,a3,c#4] e3 [a3,c#4] e3 [a3,c#4] e3 [a3,c#4] e3, a1@7 ~ [a1,a2]@7 ~, a2@5 ~ a2 ~@9", // A
S: "[a2,f#3,a3]@2 ~ a2 [d#3,a3,c4]@2 [e3,a3,c#4]@2, a1@7 ~ [a1,a2]@7 ~, d4@3 ~ [e3,a3,c#4]@4 ~@8", // D Adim A
T: "[b2,f#3,a3,d4]@4 ~@2 b2@2 ~@2 a3@2 [f#3,a3,d4]@3 ~, b1@8 [b1,b2]@7 ~, ~@2 d4@3 ~@3, ~ [f#3,a3] f#3 ~", // Bm7 D B F#m
U: "[d#2,d#3,g3,a#3,d#4]@4 [e2,e3,g#3,b3,e4]@4 [e2,e3,b3,e4]@4 [d#2,d#3,a#3,d#4]@3 ~", // D# E E5 D#5
V: "[a3,d4] f#3 [a3,d4] [d3,f#3] [a3,d4] f#3 [a3,d4] f#3, d2@7 ~ [d2,d3]@8, d3@5 ~@11", // D5 D D5 D
W: "[b3,e4] g#3 [b3,e4] [d3,g#3] [b3,e4] g#3 [b3,e4] [d3,g#3], d2@7 ~ d2@8, d3@5 ~@3 d3@6 ~@2", // E5 Ddim E5 Ddim
X: "[a2,e3,a3,c#4]@5 ~ [a3,c#4]@2 [a3,d4]@2 f#3@2 ~@2 e2@2, a1@6 [a2,e3] ~ [a1,a2]@6 ~@2, ~@8 f#3 ~@3 [f#3,a3,d4]@4", // A D5 A5 A D
Y: "a2@5 ~ a2@2 [e2,f#3,a3,d4]@4 [e2,g#3,b3,d4]@4, [a1,e3,a3,c#4] ~", // D E7 A
Z: "[g3,c#4]@2 e3@2 [g3,c#4]@2 b1 c2 [c#4,f#4]@2 g3@2 [c#4,e4]@2 [c#2,g3]@2, [a1,a2]@6 e3@2 c#2@5 ~@3", // Gdim F#5 C#m C#dim A
AA: "[c4,d4] a3 [c4,d4] [d3,a3] [c4,d4] a3 ~ a3, d2@2 [d2,d3,f4] [d2,d3,c4,d4,f4], [d3,f4]@3 ~@5", // Csus2 D5 Csus2 Dm Dm7 Dm
AB: "[a3,c#4] e3 [a3,c#4] [a2,e3] [f#3,a3,c#4] e3 ~ [f#2,e3], [a1,a2]@3 ~ f#2@2 [f#3,a3,c#4]@2", // A A5 F#m F#7 A F#m
AC: "b2@2 f#3 b2 e2@2 [e2,e3]@2, [a3,b3,d4]@7 ~ [g#3,b3,d4]@8, f#3@3 ~@13", // E Bm7 G#dim
AD: "[b3,e4] g#3 [b3,e4] [d3,g#3] [b3,e4] g#3 [b3,e4] [d3,g#3], d2@7 ~ d2@8, d3@5 ~@3 d3@6 ~@2, ~@2 d4 ~", // E5 Ddim E5 Ddim
AE: "[d2,d3,f#3,a3,d4]@7 ~ [c#2,c#3,e3,g#3,c#4]@4 ~ [b1,b2,d3,f#3,b3]@3", AF: "[~ [a1,a2,c#3,e3,a3]@17 ~@14]/2",
})).s("gm_piano").gain(0.36)
// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
~@7 A@2 B@2 C D E F G H I J D K L@2 C M N O C D E F L P C J D Q R S T U A@2 B@2 C D E F G H I J D K L@2 C M N O C D E
F L P C J D Q R S T U V W@2
>`.pickRestart({
A: "[a2@13 ~ a1@18]/2", B: "[a2@13 ~ a1@13 ~ e3@4]/2", C: "a2@4 ~@2 a2 ~ a2@6 ~@2", D: "a2@4 ~@2 a2 ~ a2@4 ~@2 a2@2",
E: "b2@4 ~@2 b2 ~ b2@6 ~@2", F: "d#2@3 ~ e2@3 ~ e2@3 ~ d#2@3 ~", G: "d2@4 ~@2 d2 ~ d2@5 ~ d2 d#2",
H: "e2@4 ~@2 e2 ~ e2@5 ~ e2@2", I: "a2@4 ~@2 a2 ~ a2@5 ~ e2 f#2", J: "a2@4 ~@2 a2 ~ e2@3 ~ e2@3 ~",
K: "a2@2 a1 b1 c#2@3 ~", L: "d2@4 ~@2 d2 ~ d2@4 ~@2 d2@2", M: "a2@4 ~@2 a2@2 g#2@3 ~ f#2@3 ~",
N: "e2@4 ~@2 e2 ~ e2@4 ~@2 f#2 g2", O: "g#2@4 ~@2 g#2 ~ g#2@3 ~ e2@3 ~", P: "d2@4 ~@2 d2 ~ d2@5 ~ d2@2",
Q: "a2@4 ~@2 a1 b1 c#2@4 ~@2 c#2@2", R: "d2@4 ~@2 d2 ~ d2@4 ~@2 d3@2", S: "d2@4 ~@2 d2 ~ d2@6 ~@2",
T: "a2@2 ~ a2 f#2@3 ~", U: "b2@7 ~ e2@3 ~ e2@3 ~", V: "d2@7 ~ c#2@4 ~ b1@3", W: "[~ a1@17 ~@14]/2",
})).s("gm_electric_bass_finger").gain(0.3)
// chords · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz = note(`<
~@2 A B C D E F G@3 ~@3 H I ~ J K@2 ~ L M N O P ~ N Q R S T U V W X Y Z AA N AB AC@4 ~@3 H I ~ J K@2 ~ L M N O P ~ N Q
R S T U V W X Y Z AA N AB AD AE@2
>`.pickRestart({
A: "e5@7 ~ e5@8", B: "a4@15 ~", C: "b4@2 b4 ~ a4 b4 ~ a4@9", D: "~@8 [b4,c#5]@2 e5@5 ~", E: "f#5 e5@3 ~ b5@3",
F: "a5@13 ~@3", G: "[~@4 [e5,f#5]@2 e5@2 b4@2 a4 f#4 b4@2 a4@10 ~@4 b4 ~ a4@4 b3@2 a3@8 e3@4]/3",
H: "~@4 g#4 e5 g4 d#5", I: "f#4@3 ~", J: "[e4,c#5]@5 ~ [f#4,d5]@10", K: "[~@2 c#5 b4 a4 e4 d4 c#4@5 ~@4]/2",
L: "~@4 f#5 e5 d5@7 ~@3", M: "~@2 a4 g4 f4 e4 d4@2", N: "[c#4,a4]@7 ~", O: "[d4,b4] [c#4,a4] [b3,g#4] [a3,f#4]",
P: "[b3,g#4]@3 ~", Q: "[d4,b4]@3 ~ [c#4,a4]@4 [c4,g#4]@4 [c#4,a4]@4", R: "[d4,b4]@15 ~", S: "~@4 g#4 e5 d#5 g4",
T: "f#4 ~", U: "~ g5 f#5 e5@4 ~", V: "~ a4", W: "~@5 e4@3, ~@4 b4 ~@3, ~@9 a4@7", X: "[c#4,a4]@7 ~ [c#4,g#4]@8",
Y: "[c#4,g4]@13 ~@3", Z: "[a3,f#4]@7 ~", AA: "~ d4 a4 g4 f4@4", AB: "[d4,b4]@7 ~ [b3,g#4]@7 ~",
AC: "[~@4 c#5 b4 a4@4 ~@6, ~@3 e5@7 ~@6]/2", AD: "[d4,f#4]@7 ~ [c#4,e4]@4 ~ [b3,d4]@3", AE: "[~ [a3,c#4]@17 ~@14]/2",
})).s("gm_electric_guitar_jazz").gain(0.48)
// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
A B@2 C@2 D E F@4 ~@16 G@3 H I J K@2 L M N@2 I O P@4 ~@16 G@3 H I J Q@2 L M N@2 I O R@3
>`.pickRestart({
A: "~@2 a4 b4", B: "[c#5@5 f#5@2 e5]/2", C: "[a4@7 b4]/2", D: "c#5", E: "f#5 g#4@3", F: "[a4@9 e5 a5@6]/2", G: "a5/3",
H: "a#5 b5@2 a#5", I: "a5", J: "b5@3 a5 g#5@2 f#5@2", K: "[a5@9 e6 d6 c#6 d6 c#6 b5@2]/2", L: "a5 g#5", M: "g5",
N: "[a5@5 b5 c6 b5]/2", O: "b5 e6", P: "a5/4", Q: "[a5@9 e6 d6 c#6 d6 c#6 b5 c#6]/2", R: "[a5@35 ~@13]/3",
})).s("gm_string_ensemble_2").gain(0.48).pan(0.3)
// other · orchestral harp · "HARP"
const orchestral_harp = note("<~@10 A ~@15 B ~@13 C ~@19 D ~@13 E ~@3>".pickRestart({
A: "[a2,b2] [c#3,d3] [e3,f#3] [g#3,a3,b3] [c#4,d4] [e4,f#4,g#4] [a4,b4,c#5] [d5,e5,f#5,g#5] [a5,b5,c#6,d6] [g#6,a6]@3 ~@4, ~@9 [e6,f#6] ~@6", // Asus2 Dmaj7 Esus2 G#m Dmaj7 E A E7 …
B: "~@4 g#3 [a3,b3,c#4] [d4,e4] [f#4,g#4,a4] [b4,c#5,d5,e5,f#5] [g#5,a5,b5,c#6] [d6,e6,f#6,g#6]@2 ~@4", // A Dsus2 F#m Bm C#7 E7
C: "~@10 [g#4,a4,b4] [c#5,d5,e5,f#5] [g#5,a5,b5,c#6,d6] [e6,f#6] ~@2, ~@13 g#6@2 ~", // G#m Dmaj7 G#dim Esus2
D: "~@4 [a2,b2,c#3] [d3,e3] [f#3,g#3,a3] [b3,c#4,d4] [e4,f#4,g#4,a4,b4] [c#5,d5,e5,f#5] [g#5,a5,b5,c#6] d6 e6 ~@3", // A Dsus2 F#m Bm E Dmaj7 C#7
E: "~@4 d3 [e3,f#3,g#3] [a3,b3,c#4] [d4,e4,f#4,g#4] [a4,b4,c#5,d5,e5] [f#5,g#5,a5,b5] d6@2 ~@4, ~@10 c#6 ~@5", // E A E7 A G#m7
})).s("gm_orchestral_harp").gain(0.32).pan(0.3)
// chords · celesta
const celesta = note("<~ A B C@2 D E F G@2 H ~@31 G@2 H ~@30 I@3>".pickRestart({
A: "[a6,a7]@3 ~ [g#6,g#7]@3 ~", B: "[g6,g7]@3 ~", C: "[[f#6,f#7]@13 ~@3 f7@14 ~@2, ~@15 f6@14 ~@3]/2",
D: "[e6,e7]@3 ~ [f#6,f#7]@3 ~", E: "[d6,d7]@6 ~@2 [e6,e7]@7 ~", F: "[a6,a7]@13 ~@3",
G: "[~@14 a5@9 ~@9, ~@5 a7@6 ~@5, ~@11 e7@11 ~@10, ~@12 a6@11 ~@9, ~@13 e6@9 ~@10]/2",
H: "~@7 a5, ~@5 a7@3, ~@11 e7@5, ~@3 a6, ~@13 e6@3",
I: "[~@17 a6@16 ~@2 [c#7,e7,a7]@10 ~@3, ~@8 c#7@5 b6@4 ~@17 a6@10 ~@4, ~@11 a7@4 a7@20 ~@13]/3", // A
})).s("gm_celesta").gain(0.4).pan(0.3)
// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2_2 = note(`<
~ A@6 B@4 ~@8 C D E F G H I J K L M N M O P Q R@2 S@2 K T U@4 ~@8 C D E F G H I J K L M V M W P Q R@2 S@2 K X Y@3
>`.pickRestart({
A: "[a3@8 g#3@8 [c#2,g3]@16 d2@6 a2@2 ~@16 e4@4 [d3,d4]@4 a2@8 f#2@7 ~ [b2,d3]@7 ~ e3@8, e4@40 d3@20 ~@27 e2@9, c#4@2 f#3 f3 [e3,c#4] ~, a2 ~ a3@3 ~, ~@40 d4@17 ~@22 [b3,d4]@17]/6", // C#dim D Bm C#m Bm
B: "[c#4@14 [f#3,d4]@18 [e3,c#4]@13 ~ f#3@18, a3, e3@8 ~@37 d4@19]/4", C: "a3 g#3", D: "g3", E: "f#3", F: "f3",
G: "e3 a3 c#4@2", H: "d4 c#4 b3 a3", I: "b3@7 ~", J: "e4@2 b3@2 d4 c#4 b3@2", K: "[e3,c#4]",
L: "[f#3,d4] [e3,c#4] [d#3,c4] [e3,c#4]", M: "[f#3,d4]", N: "g3 [g#3,e4]@2 [g3,d#4]", O: "[g#3,e4] [f#3,d4]",
P: "[e3,c#4] [f#3,d4]", Q: "[e3,c#4]@2 [f#3,d4] [g#3,e4]", R: "[e3,c#4]/2", S: "[f#3 f3, d4]/2", T: "f#3 e3, d4",
U: "[[e3,c#4,e4]@7 [f#3,d4,f#4]@9]/2", V: "[g3,d#4] [g#3,e4]@2 [g3,d#4]", W: "[g#3,e4] f#3", X: "[f#3,d4] [e3,b3]",
Y: "[[d3,d4,f#4]@8 [c#3,c#4,e4]@5 [b2,b3,d4]@4 [a2,a3,c#4,e4]@18 ~@13]/3", // D C#m Bm A
})).s("gm_string_ensemble_2").gain(0.4).pan(0.6)
// other · whistle
const whistle = note("<~@45 A B C D ~@3 E F G H I ~@21>".pickRestart({
A: "~@4 c#6@5 ~@7", B: "d6 e6 ~ d6 c#6 ~ c6@2 c#6@4 ~@4", C: "d6 ~@7", D: "d#6@2 e6@3 ~@11", E: "~@4 a5 ~ b5 ~",
F: "c#6@3 ~@5 c#6@3 ~@5", G: "c#6@2 f#6@2 ~@8 e6 ~ f#6 e6", H: "~ a5@2 a5@3 ~@10", I: "a5 ~ e6@2 ~@12",
})).s("gm_whistle").gain(0.48)
// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<~@41 A@6 B C D E F@3 G@2 H I J K L ~@17>".pickRestart({
A: "[~@12 b4@2 a4@24 ~@2 c#5@2 b4 ~ a4 b4 a4@14 e4 f#4 a4@14 [e4,f#4] ~ e4@6 [a#3,b3]@2 a3@2 c#4@2 e4@2 e4@2 c#4@2]/6", // Esus2 Bmaj7
B: "[c#4,e4]@2 f#4@2 b3@7 ~@5", C: "~@4 [b3,c#4]@2 e4 ~ e4@2 c#4 b3 f#4@2 a4@2",
D: "a4@3 a4 a4@2 a4@2 a4@2 a4 f#4 ~@4", E: "~@4 [b4,c#5]@2 e5@2 [b4,c#5] ~@5 a4@2",
F: "[a4@4 f#4 e4 f#4 e4 b3 a3@3 ~ f#3 a3@6 ~@4 e4 f#4 a4 b4 c#5 d5 e5@10 d5 ~ [c#5,d5] c#5 b4@2 c#5@2]/3", // Dmaj7
G: "[b4@4 a4@2 a4@6 [b4,c#5]@2 e5@6 ~@2 f#5@4 e5 ~@5]/2", H: "~@4 d5 e5 f5 a5 b5 a5 c#6 ~ b5 a5 f#5 ~",
I: "a5@2 f#5 ~@13", J: "~@5 a3 [b3,c#4] e4", K: "~@2 e4@2 [f#4,g4] g#4 e5@4 e5@2 c#5 b4 g4 f#4", L: "e4 ~@3",
})).s("gm_overdriven_guitar").gain(0.3).pan(0.2)
// other · overdriven guitar · "OVERDRIVE" · soft notes
const overdriven_guitar_soft = note(`<
~@46
[~@4 b3 ~@3]
[~@11 [g#3,a3,a#3] g3 ~@3]
~@3
[~@12 e3 ~@3]
[~@4 [f#3,g3,g#3] f3 ~@10]
~@25
>`).s("gm_overdriven_guitar").gain(0.15).pan(0.2)
// drums · kick
const kick = s("bd").struct("<~@7 A ~ A ~ B@30 A ~ A ~ B@30 C D ~>".pickRestart({
A: "x ~@6 x", B: "x ~@2 x!2 ~@3", C: "x ~@7 x ~@4 x ~@2", D: "~ x ~@14",
})).gain(0.48)
// drums · snare
const snare = s("sd").struct("<~@7 [~@3 x]!38 [~ x ~ x]!30 ~@3>").gain(0.48)
// drums · crash
const crash = s("cr").struct("<~@11 A ~@15 A ~@13 A ~@3 A ~@15 A ~@13 B C ~>".pickRestart({
A: "x", B: "x ~@7 x ~@4 x ~@2", C: "~ x ~@14",
})).gain(0.4)
// drums · congas
const congas = s("conga:13").struct("<~@7 A ~ A ~ A@31 ~ A ~@34>".pickRestart({
A: "~ x ~@2",
})).gain(1.54)
// drums · jingle bells
const jingle_bells = s("sleighbells:4").struct("<~@7 [x!8]!68 [x ~@7 x ~@4 x ~@2] [~ x ~@14] ~>").gain(1.38)
stack(
piano, bass, electric_guitar_jazz, string_ensemble_2, orchestral_harp, celesta, string_ensemble_2_2, whistle,
overdriven_guitar, overdriven_guitar_soft, kick, snare, crash, congas, jingle_bells
)
More by Grant & Forsyth
Not in the database
That song isn't here.
Nothing in the database matches this link. It may have been renamed, or the address was mistyped. The closest songs to :
Real transcriptions · Editable patterns · Instrumental
Type a song.
Get Strudel code.
Chords, structure, melody, bass and drums compiled from open transcriptions into Strudel live-coding patterns. Play it here, scrub through the bars, then open it in strudel.cc and start hacking.
Smells Like Teen SpiritNirvana
The JokerSteve Miller Band · 1973
Love Me DoThe Beatles · 1964
I Don't MindJames Brown · 1961
- Real transcriptionsMcGill chord charts, Lakh MIDI and quality-filtered PDMX scores. The library includes alternate transcriptions of some songs.
- One bar, one cycleEvery layer follows the same bar timeline, keeping the code, playback and song structure aligned.
- Instrumental by designDetected vocal parts are removed. Guitar riffs, harmonica and other instrumental leads stay.