Strudelify
Tennessee Waltz cover art

The Girl With A Laugh In Her Voice

Tennessee Waltz

Alma Cogan

KeyC majorTempo90 bpm
0:00/0:00
// Tennessee Waltz — Alma Cogan
// 90 bpm, 3/4, key C 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: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 76 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(90/3)

// 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: edit a riff to change every repeat.

// chords · piano · "PIANO MELODY"
const piano = note(`<
  ~@4 A B C D E@2 F G H I J K L M N O P Q R S T@2 U V W I J K L M N O X@3 ~@13 Y Q R S T@2 U V W I J K L M N O Z M N
  AA@4 ~
>`.pickRestart({
  A: "~@13 g3@3 ~@5 [d4,g4]@3, ~@2 c4", // G5
  B: "~@2 e4@3 ~@3 c4@11 ~@2 [g2,d4,g4]@3, c2, [d4,g4]@5 c5@19, ~@5 g4@14 c4@5, ~ [g3,e4]@2", // G5 C
  C: "~@16 g5@5 [g2,d5,g5]@3, c2, d4@5 ~@3, g4@5 [g4,c5]@10 ~ c5@8, ~ e4@3 [g3,b3,e4]@8", // G5 C5 Em
  D: "~@2 e5@6 [d2,f3,g5,c6]@8 d5@2 ~@3 d5@3, [c2,e3,d5,g5]@9 ~@7 [e2,g3,g5]@8, ~@3 e5", // Dm7 C Em
  E: "[[c5,f5]@3 ~@2 g4@2 ~@12 c5@2 d5@3 c5@5 ~@3 c4@13 [g2,c4]@3, f2@7 a4@11 ~@6 c2@21 ~@3, a3@5 c5@13 ~ g5@8 ~@5 [g3,e4]@16, ~@8 [a3,c4,f4]@17 ~@4 [g4,c5]@13 ~@6]/2", // F5 C5 C F C5
  F: "g4@2 a4@3 ~@11 d4@2 ~@3 [f#2,a#3]@3, c2@19 [f2,a3]@5, c5@8 ~ e4@3, ~@5 g4@11 g4@8, ~@8 [g3,c4,e4]@11 ~@5", // F# F C
  G: "[g2,b3,d4]@8 ~@5 [e4,g4]@3 a#3 ~ g3 ~ d3 [a3,d4]@2 ~, g4@13 ~@4 a3@2 ~@5, ~@8 [g3,b3]@11 ~@2 d3 ~@2, ~@8 d4@8 d4@3 ~@5", // G Em D5 G
  H: "~@13 g3@3 [b1,c4]@5 [d4,g4]@3, [g1,g3,d4]@7 ~@5, ~ a1 ~", // Cmaj7 G5
  I: "~@2 e4@3 ~@3 c4@11 ~@2 [g2,d4,g4]@3, c2, [d4,g4]@5 [g4,c5]@13 ~ c4@5, ~ [g3,e4]@2", // G5 C5 C
  J: "~@2 e4@3 ~@8 g4@3 g5@5 [g2,d5,g5]@3, c2, [d4,g4]@5 [g4,c5]@8 ~@3 c5@8, ~ [g3,c4,e4]@2", // G5 C5 C
  K: "d5@2 e5@6 d5@2 e5@5 ~ [e2,g3,d5,g5]@7 ~, [c2,e3,g5]@8 [d2,f3]@15 ~, ~ g5 ~", // Em7 C Dm
  L: "[c5,f5]@5 g4@2 ~@12 c5@2 d5@3, f2@19 ~@5, a3@7 a4@12 ~@5, ~@5 c5@13 ~ f5@5, ~ [a3,c4,f4]@2", // F5 F
  M: "[c5,e5]@5 ~@3 [g3,c4,e4]@11 [f2,a3,c4]@2 [f#2,a#3,e4]@3, c2@5 ~, ~@5 [g4,c5]@14 ~@5", // C F F#7 C5
  N: "[g2,b3,f4,a4] ~ [d4,g4], ~ [g3,b3]@2, ~ [d4,g4] ~, ~@5 e4@7", O: "[c2,c4,e4]@8 [g3,c4,e4]@15 ~",
  P: "[g1,b3]@8 ~@8 g5@5 [d5,g5]@3, ~ [a1,c4]@2, ~@13 g4@11, ~@2 [b1,d4,c5]", // G G5 Am Bm
  Q: "~@2 e5@3 ~@16 d#2@3, c2@19 [d2,d5,g5]@5, [d5,g5]@5 [g5,c6]@13 ~@2 e5@4, ~ [g3,c4,e4]@2", // G5 C5 C
  R: "~@16 d5@2 e5@3 d5@3, e2@19 ~@5, [d5,g#5]@16 g5@7 ~, ~ [g#3,b3,e4]@2", // Ddim E
  S: "[c5,f5]@4 ~ g4@2 ~@14 g2@3, f2, ~@5 c5@13 ~ [c5,f5]@5, ~@7 a4@13 ~@4, ~ [a3,c4,f4]@2", // F5 F
  T: "[~@13 g4@3 ~@3 a1@2 g5@3 [c5,g5]@5 ~@3 g3@5 g3@3 c4@5 [b2,e4,g4]@3, c2@21 [b1,d5]@8 ~@3 e4@13 ~@3, [g4,c5]@13 ~@3 [c5,g5]@5 ~@3 c2@16 ~@8, ~@8 [g3,c4,e4]@21 [g4,c5]@11 ~@8, ~@4 c4 ~]/2", // C5 Em Bm C5 C C5
  U: "g4@2 a4@3 ~@3 e4@8 d4@2 e4@6, a2, c5@5 [g4,c5]@8 ~@3 g4@8, ~ [a3,c4]@2", // C5 Am
  V: "d4@8 d4@7 ~ a#3 a3@2 g3 d3 ~ [a3,d4]@2, d2@19 [f2,a3]@3 ~@2, g4@13 ~@2 d4@3 ~@6, ~@8 [a3,f4]@11 ~@2 [f#2,a#3]@3", // D5 F Dm F#
  W: "[g2,b3]@8 ~@5 g3@3 d4@5 [d4,g4]@3, d4@2 ~, g3@13 ~@11, ~ [a2,c4] [b2,c4]", // G G5 Am Cmaj7
  X: "[[g1,b3] ~ [b1,d4]@6 ~, ~ [a1,c4]@6 ~@2]/3", // G Bm Am
  Y: "~@16 g5@5 [d5,g5]@3, [g1,b3], ~ [a1,c4]@2, ~@13 g4@11, ~@2 [b1,d4,c5]", // G5 G Am Bm
  Z: "[g1,b3]@8 ~@11 c5@2 d5@3, ~@8 [a1,c4]@11 f5@5, ~@2 [b1,d4]", // G Am Bm
  AA: "[g4@2 a4@6 ~@10 [b3,d4]@11 ~@2 e4@59 ~@6, [f4,c5]@8 [e4,g4,c5]@18 ~@3 [c4,g4]@63 ~@4, ~@29 d4@4 ~@63]/4", // Bm F5 C C5
})).s("gm_piano").gain(0.52)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@20 A B C D E@2 ~@26 A B C D E@2 ~@18>".pickRestart({
  A: "[g3,b4] [f#3,a#4] ~ [g3,b4] [a3,c5] [b3,d5] ~ [c4,e5] [d4,f5] [c#4,e5] ~ [d4,f5] [e4,g5] [f4,a5] ~ [f#4,b5] [g4,c6] [f#4,b5] ~ [g4,c6] [a4,d6] [b4,e6] ~ [d5,f6]", // G F# G Am Bm C Dm C#m …
  B: "[c5,e6]", C: "[g#4,e6]", D: "[a4,f6]@2 [f4,c6]", E: "c6/2",
})).s("gm_string_ensemble_1").gain(0.25)

// chords · acoustic guitar steel · "GUIT STRUM"
const acoustic_guitar_steel = note(`<
  ~ A B C@5 D C E B F G@2 H D A B C@3 I D C@2 J K F G@2 H D A B C@5 D C E B F G@2 H D A B C@3 I D C@2 J K F G@2 H D A B
  C@2 A B L@5
>`.pickRestart({
  A: "~@8 [g3,c4,e4]@8 ~@3 [f2,a3]@2 [f#2,a#3]@3, c3@2 [g3,c4,e4]", B: "b3 [g3,b3,d4]!2, g2@2 ~",
  C: "~ [g3,c4,e4]!2, c3@2 ~", D: "~ [a3,c4,f4]!2, f2@2 ~",
  E: "~@8 [g3,c4,e4]@8 ~@3 [f2,a3]@2 [f#2,a#3]@3, c3@16 [g3,c4,e4]@5 ~@3", F: "~ [b3,d4,g4]!2, g2@2 ~",
  G: "~ [g3,c4,e4]!2, c3@7 ~", H: "~ [g3,c4,e4]!2, c3", I: "~ [g#3,b3,e4]!2, e2@2 ~", J: "~ [a3,c4,e4]!2, a2@2 ~",
  K: "~ [a3,d4,f4]!2, d3@2 ~", L: "[[f2,a3]@8 [e2,g3]@10 [d3,f3]@11 [c3,g3,c4,e4]@71 ~@20]/5",
})).s("gm_acoustic_guitar_steel").gain(0.15)

// other · acoustic guitar steel · "GUIT ARP"
const acoustic_guitar_steel_2 = note(`<
  ~ A B A@5 C A@2 B@2 A@3 D A B A@3 E C A@2 F G H A@3 D A B A@5 C A@2 B@2 A@3 D A B A@3 E C A@2 F G H A@3 D A B A@3 B
  ~@5
>`.pickRestart({
  A: "c3@3 e3@2 g3@3 c4@3 g3@2 e3@3 c4@3 g3@2 e3@3", B: "g3@3 b3@2 d4@3 g4@3 d4@2 b3@3 g4@3 d4@2 b3@3",
  C: "f3@3 a3@2 c4@3 f4@3 c4@2 a3@3 f4@3 c4@2 a3@3", D: "f3@3 a3@2 c4@3 f4@3 c4@2 a3@3 f4@3 c4@2 g3@3",
  E: "e3@3 g#3@2 b3@3 e4@3 b3@2 g#3@3 e4@3 b3@2 g#3@3", F: "a2@3 c3@2 e3@3 a3@3 e3@2 c3@3 a3@3 e3@2 c3@3",
  G: "d3@3 f3@2 a3@3 d4@3 a3@2 f3@3 d4@3 a3@2 f3@3", H: "g2@3 b2@2 d3@3 g3@3 d3@2 b2@3 g3@3 d3@2 b2@3",
})).s("gm_acoustic_guitar_steel").gain(0.09)

// bass · electric bass finger · "BASS"
const bass = note(`<
  ~ A B C D E F G H I A J D I@2 K H A B C D L M N O P Q R S I@2 K H A B C D E F G H I A J D I@2 K H A B C D L M N O P Q
  R S I@2 K H A B C D A B T@5
>`.pickRestart({
  A: "c2@19 f1@2 f#1@3", B: "g1", C: "c2", D: "g1 a1 b1", E: "c2@21 g1@2 ~", F: "c2@7 ~", G: "c2 d2 e2", H: "f2",
  I: "c2@7 g1", J: "g1@7 ~", K: "c2@8 d2@8 e2@5 ~@3", L: "c2@19 d2@2 d#2@3", M: "e2", N: "f2@7 g2",
  O: "c2@19 a1@2 b1@3", P: "c2@7 b1", Q: "a1", R: "d2@19 f1@2 f#1@3", S: "g1@8 a1@8 b1@5 ~@3",
  T: "[f2@8 e2@10 d2@11 c2@71 ~@20]/5",
})).s("gm_electric_bass_finger").gain(0.49)

// other · electric guitar muted · "MUTE GUITAR"
const electric_guitar_muted = note(`<
  ~ A B C D E F G H I A J K L I M H A B C D N O H C@2 P Q K L I M H A B C D E F G H I A J K L I M H A B C D N O H C@2 P
  Q K L I M H A B C D A B R@2 ~@3
>`.pickRestart({
  A: "c3@19 f2@2 f#2@3", B: "g2", C: "c3", D: "b2@5 ~@3 c3@6 ~@2 d3@6 ~@2", E: "c3@21 g2@2 ~", F: "c3@7 ~",
  G: "c3 d3 e3", H: "f3", I: "c3@7 g2", J: "g2@7 ~", K: "b2 c3 d3", L: "c3@7 g2, e3 ~@2", M: "c3@8 d3@8 e3@5 ~@3",
  N: "e3@3 ~", O: "e3", P: "a2", Q: "d3", R: "[a3@8 g3@10 f3@11 e3@12 ~@7]/2",
})).s("gm_electric_guitar_muted").gain(0.24)

// drums · kick
const kick = s("bd").struct("<~ x!71 [~@5 x ~@18] ~@3>").gain(0.34)

// drums · rim
const rim = s("rim").struct("<~ [~ x!2]!70 [~@4 x ~@4 x ~@2] ~@4>").gain(0.49)

// drums · hihat
const hihat = s("hh").struct("<~ [x ~@4 x ~@2 x ~@7 x ~@7]!70 [x ~@3 x ~@4 x ~@2] [~@5 x ~@18] ~@3>").gain(0.29)

// drums · crash
const crash = s("cr").struct("<~@72 [~@5 x ~@18] ~@3>").gain(0.29)

stack(
  piano, string_ensemble_1, acoustic_guitar_steel, acoustic_guitar_steel_2, bass, electric_guitar_muted, kick, rim,
  hihat, crash
)