Strudelify

Take Me Home Tonight

Ronnie Spector

KeyA minorTempo132 bpm
0:00/0:00
// Take Me Home Tonight — Ronnie Spector
// 132 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 6 "** OK **" marimba (copy of ch 8 "** OK **" epiano1); ch 12 "** OK **" electric bass pick (copy of ch 9 "** OK **" acoustic bass)
// note: Full arrangement: all 117 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(132/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: edit a riff to change every repeat.

// other · tubular bells · "** OK **"
const tubular_bells = note(`<
  ~ A B C B A B C B D E F E D E F G H I D I H I D J A B C K L M A N D E F E D E F G H I D I H I D J A B C K L M A N A B
  C K L M A N H I D I H I D J D E F E D E F G H I D I H I D J A B C K L M A N A B C K L M A N L M A N A B C ~@5
>`.pickRestart({
  A: "c5", B: "b4", C: "a#4", D: "c5 ~", E: "b4 ~", F: "a#4 ~", G: "a4 c#5", H: "d5 ~", I: "c#5 ~", J: "b4 g4",
  K: "a4!2", L: "d5", M: "c#5", N: "g4!2",
})).s("gm_tubular_bells").gain(0.26).pan(0.3)

// other · tubular bells · "** OK **" · soft notes
const tubular_bells_soft = note("<~@112 [a4!2] d5 c#5 c5 [g4!2]>").s("gm_tubular_bells").gain(0.1).pan(0.3)

// chords · distortion guitar · "** OK **"
const distortion_guitar = note(`<
  ~@2 A B A ~ A B A C A B A C A B ~ D E F E D E F ~ G H I J K L M ~ C A B A C A B ~ D E F E D E F ~ G H I J K L M ~ G H
  I J K L M ~ D E F E D E F ~ C A B A C A B ~ D E F E D E F ~ G H I J K L M ~ G H I J K L M ~ K L M ~ G H I ~@5
>`.pickRestart({
  A: "~@2 [e4,g4,b4] ~@5", B: "~@2 [e4,g4,a#4] ~@5", C: "~@2 [e4,g4,c5] ~@5", D: "~@2 [d4,f4,a4] ~@5",
  E: "~@2 [c#4,f4,a4] ~@5", F: "~@2 [c4,f4,a4] ~@5", G: "~@2 [e4,g4,c5] ~@3 [e4,g4,c5] ~",
  H: "~@2 [e4,g4,b4] ~@3 [e4,g4,b4] ~", I: "~@2 [e4,g4,a#4] ~@3 [e4,g4,a#4] ~", J: "~@2 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~",
  K: "~@2 [f4,a4,d5] ~@3 [f4,a4,d5] ~", L: "~@2 [f4,a4,c#5] ~@3 [f4,a4,c#5] ~", M: "~@2 [f4,a4,c5] ~@3 [f4,a4,c5] ~",
})).s("gm_distortion_guitar").gain(0.31).pan(0.3)

// chords · distortion guitar · "** OK **" · soft notes · A Dm Faug F
const distortion_guitar_soft = note(`<
  ~@112
  [~@2 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~]
  [~@2 [f4,a4,d5] ~@3 [f4,a4,d5] ~]
  [~@2 [f4,a4,c#5] ~@3 [f4,a4,c#5] ~]
  [~@2 [f4,a4,c5] ~@3 [f4,a4,c5] ~]
  ~
>`).s("gm_distortion_guitar").gain(0.1).pan(0.3)

// chords · piano · "** OK **"
const piano = note(`<
  ~ A B A C A B A B ~@8 D E F G H@3 I J K L M N@4 ~@8 D E F G H@3 I J K L M N@4 J K L M N@4 ~@4 O ~@2 P ~@8 D E F G H@3
  I J K L M N@4 J K L M N@8 J K L ~@5
>`.pickRestart({
  A: "c4 ~ g3 ~ c4 ~@5 g3 ~ c4 ~ c4 ~", B: "~@2 g3 ~ c4 ~@5 g3 ~ c4 ~ g3 ~", C: "~@2 g3 ~ c4 ~@11",
  D: "[d4,d5]@3 [a3,a4]@3 [d4,d5]@2", E: "[c#4,c#5]@3 [a3,a4]@3 [c#4,c#5]@2", F: "[c4,c5]@3 [a3,a4]@3 [c4,c5]@2",
  G: "[c#4,c#5]@6 [a3,a4]@6 [a4,a5] [g4,g5] [f4,f5] [e4,e5]", // C# A G F E
  H: "[[d4,d5]@3 [a3,a4]@3 [d4,d5]@2 [c#4,c#5]@3 [a3,a4]@3 [c#4,c#5]@2 [c4,c5]@3 [a3,a4]@3 [c4,c5]@2, f5]/3", // D A D C# A C# C A …
  I: "[e4,g4,e5]@3 [d4,f4,d5]@3 ~@2", J: "[c4,c5] ~ [g3,g4] ~ [c4,c5] ~@5 [g3,g4] ~ [c4,c5] ~ [c4,c5] ~",
  K: "~@2 [g3,g4] ~ [c4,c5] ~@5 [g3,g4] ~ [c4,c5] ~ [g3,g4] ~", // G C G C G
  L: "[c4,c5] ~ [g3,g4] ~ [c4,c5] ~@5 [g3,g4] ~ [c4,c5] ~ [a3,a4] ~, ~@7 a5", // C G C G C A
  M: "~@2 [a3,a4] ~ [g4,g5] ~ [a3,g4,g5] ~ [f4,f5] ~ [a3,f4,a4,f5] ~ [e4,e5]@2 [a3,g4,g5]@2, ~ a5 ~@6", // A G A7 F Dm E A7
  N: "[[d4,d5] ~ [a3,a4] ~ [d4,d5]@2 [e4,e5]@2 [f4,f5]@2 [g#4,g#5]@2 [a4,a5]@2 [d4,d5] ~@3 [a3,a4] ~ [d4,d5] ~@5 [f4,f5]@2 [a4,a5]@2 [a3,a4] ~ [d4,d5] ~ [a3,a4] ~ [d4,d5] ~@5 [a3,a4] ~ [d4,d5] ~ [b3,b4] ~@3 [b3,b4]@4 [c4,c5]@4 [d4,d5]@4 ~@2, ~@10 [a3,a4] ~ [d4,d5] ~ [e4,e5]@12 [a3,a4] ~ [d4,d5] ~ [e4,e5]@16 [d4,d5]@12 ~@6, ~@23 g4@3 ~@6]/4", // D A D E F G# A D …
  O: "[d5,f5,a5,d6] ~@7", P: "c6 a5 ~@2 c6@2 ~@2, [e5,g5]@2 ~ [f5,a5]@3 ~@2",
})).s("gm_piano").gain(0.31)

// chords · piano · "** OK **" · soft notes
const piano_soft = note("<~@112 A B@4>".pickRestart({
  A: "~@2 [a3,a4] ~ [g4,g5] ~ [a3,g4,g5] ~ [f4,f5] ~ [a3,f4,a4,f5] ~ [e4,e5]@2 [a3,g4,g5]@2, ~ a5 ~@6", // A G A7 F Dm E A7
  B: "[[d4,d5] ~ [a3,a4] ~ [d4,d5]@2 [e4,e5]@2 [f4,f5]@2 [g#4,g#5]@2 [a4,a5]@2 [d4,d5] ~@3 [a3,a4] ~ [d4,d5] ~@5 [f4,f5]@2 [a4,a5]@2 [a3,a4] ~ [d4,d5] ~ [a3,a4] ~ [d4,d5] ~@5 [a3,a4] ~ [d4,d5] ~ [b3,b4] ~@3 [b3,b4]@4 [c4,c5]@4 [d4,d5]@4 ~@2, ~@10 [a3,a4] ~ [d4,d5] ~ [e4,e5]@12 [a3,a4] ~ [d4,d5] ~ [e4,e5]@16 [d4,d5]@12 ~@6, ~@23 g4@3 ~@6]/4", // D A D E F G# A D …
})).s("gm_piano").gain(0.15)

// other · pad poly · "** OK **"
const pad_poly = note(`<
  ~ A B A C A B A B ~@8 D E F G H@3 I J K L M N O P@2 ~@8 D E F G H@3 I J K L M N O P@2 J K L M N O P@2 ~@16 D E F G H@3
  I J K L M N O P@2 J K L M N O P@2 N O P@2 J K L ~@5
>`.pickRestart({
  A: "c4 ~ g3 ~ c4 ~@5 g3 ~ c4 ~ c4 ~", B: "~@2 g3 ~ c4 ~@5 g3 ~ c4 ~ g3 ~", C: "~@2 g3 ~ c4 ~@11",
  D: "[d4,d5]@3 [a3,a4]@3 [d4,d5]@2", E: "[c#4,c#5]@3 [a3,a4]@3 [c#4,c#5]@2", F: "[c4,c5]@3 [a3,a4]@3 [c4,c5]@2",
  G: "[c#4,c#5]@6 [a3,a4]@6 [a4,a5] [g4,g5] [f4,f5] [e4,e5]", // C# A G F E
  H: "[[d4,d5]@3 [a3,a4]@3 [d4,d5]@2 [c#4,c#5]@3 [a3,a4]@3 [c#4,c#5]@2 [c4,c5]@3 [a3,a4]@3 [c4,c5]@2, f5]/3", // D A D C# A C# C A …
  I: "[e4,g4,e5]@3 [d4,f4,d5]@3 ~@2", J: "[c4,c5] ~ [g3,g4] ~ [c4,c5] ~@5 [g3,g4] ~ [c4,c5] ~ [c4,c5] ~",
  K: "~@2 [g3,g4] ~ [c4,c5] ~@5 [g3,g4] ~ [c4,c5] ~ [g3,g4] ~", // G C G C G
  L: "[c4,c5] ~ [g3,g4] ~ [c4,c5] ~@5 [g3,g4] ~ [c4,c5] ~ [a3,a4] ~, ~@7 a5", // C G C G C A
  M: "~@2 [a3,a4] ~ [g4,g5] ~ [a3,g4,g5] ~ [f4,f5] ~ [a3,f4,a4,f5] ~ [e4,e5]@2 [a3,g4,g5]@2, ~ a5 ~@6", // A G A7 F Dm E A7
  N: "[d4,d5] ~ [a3,a4] ~ [d4,d5] ~@5 [a3,a4] ~ [d4,d5] ~ [d4,d5] ~", // D A D A D
  O: "~@2 [a3,a4] ~ [d4,d5] ~@5 [a3,a4] ~ [d4,d5] ~ [a3,a4] ~", // A D A D A
  P: "[[d4,d5] ~ [a3,a4] ~ [d4,d5] ~@5 [a3,a4] ~ [d4,d5] ~ [b3,b4] ~@3 [b3,b4]@4 [c4,c5]@4 [d4,d5]@4 ~@2, ~@7 g4@3 ~@6]/2", // D A D A D B C D
})).s("gm_pad_poly").gain(0.31).pan(0.4)

// other · pad poly · "** OK **" · soft notes
const pad_poly_soft = note("<~@112 A B C D@2>".pickRestart({
  A: "~@2 [a3,a4] ~ [g4,g5] ~ [a3,g4,g5] ~ [f4,f5] ~ [a3,f4,a4,f5] ~ [e4,e5]@2 [a3,g4,g5]@2, ~ a5 ~@6", // A G A7 F Dm E A7
  B: "[d4,d5] ~ [a3,a4] ~ [d4,d5] ~@5 [a3,a4] ~ [d4,d5] ~ [d4,d5] ~", // D A D A D
  C: "~@2 [a3,a4] ~ [d4,d5] ~@5 [a3,a4] ~ [d4,d5] ~ [a3,a4] ~", // A D A D A
  D: "[[d4,d5] ~ [a3,a4] ~ [d4,d5] ~@5 [a3,a4] ~ [d4,d5] ~ [b3,b4] ~@3 [b3,b4]@4 [c4,c5]@4 [d4,d5]@4 ~@2, ~@7 g4@3 ~@6]/2", // D A D A D B C D
})).s("gm_pad_poly").gain(0.15).pan(0.4)

// chords · epiano1 · "** OK **"
const epiano1 = note(`<
  ~@9 A@4 B@4 C@4 D@3 E F@3 ~ G@3 H I@4 J@4 K@4 L@3 E F@3 ~ G@3 H F@3 ~ G@3 H M@4 N@3 E O@4 P@4 K@4 L@3 E F@3 ~ G@3 H
  F@3 ~ G@3 H Q@3 H R@3 ~ Q@3 H
>`.pickRestart({
  A: "[[e4,g4,c5]@6 ~ [g4,b4]@6 ~@2 [g4,a#4]@6 ~@2 [e4,g4,b4]@6 ~@3, ~@14 e4@3 ~@13 e4@4 ~@30]/4", // C G Gm Em
  B: "[[e4,g4,c5]@4 ~@3 [g4,b4]@4 ~@4 [g4,a#4]@4 ~@4 [a3,c4,e4]@4 [a3,c#4,e4]@4 ~, ~@14 e4@3 ~@13 e4@4 ~@30]/4", // C G Gm Am A
  C: "[[d4,f4,a4]@4 ~@3 [c#4,f4]@4 ~@4 [c4,f4,a4]@4 ~@4 [c#4,a4]@4 ~@5, ~@14 a4@5 ~@27 f4@4 ~@14]/4", // Dm C# F F#m
  D: "[[d4,f4,a4]@4 ~@3 [c#4,f4]@4 ~@4 [c4,f4,a4]@4 ~@5, ~@14 a4@5 ~@29]/3", E: "[e4,g4,e5] [d4,f4,d5]",
  F: "[[e4,g4,c5]@6 ~ [g4,b4]@6 ~@2 [g4,a#4]@6 ~@3, ~@14 e4@3 ~@13 e4@4 ~@14]/3", // C G Gm
  G: "[[f4,a4,d5]@6 ~ [f4,c#5]@6 ~@2 [f4,c5]@6 ~@3, ~@14 a4@3 ~@13 a4@4 ~@14]/3", H: "[d4,f4,g4]@3 ~",
  I: "[[e4,g4,c5]@6 ~ [g4,b4]@6 ~@2 [g4,a#4]@6 ~@2 [e4,g4,b4]@6 ~@3, ~@14 e4@4 ~@12 e4@5 ~@29]/4", // C G Gm Em
  J: "[[e4,g4,c5]@4 ~@3 [g4,b4]@4 ~@4 [g4,a#4]@4 ~@4 [a3,c4,e4]@4 [a3,c#4,e4]@4 ~, ~@14 e4@3 ~@13 e4@5 ~@29]/4", // C G Gm Am A
  K: "[[d4,f4,a4]@4 ~@3 [c#4,f4]@4 ~@4 [c4,f4,a4]@4 ~@4 [c#4,a4]@4 ~@5, ~@14 a4@3 ~@29 f4@4 ~@14]/4", // Dm C# F F#m
  L: "[[d4,f4,a4]@4 ~@3 [c#4,f4]@4 ~@4 [c4,f4]@4 ~@5, ~@14 a4@3 ~@13 a4@6 ~@12]/3", // Dm C# F5
  M: "[[d4,f4,a4]@4 ~@3 [c#4,f4,a4]@4 ~@4 [c4,f4,a4]@4 ~@4 [c#4,f4,a4]@4 ~@5]/4", // Dm C#aug F C#aug
  N: "[[d4,f4,a4]@4 ~@3 [c#4,f4,a4]@4 ~@4 [c4,f4,a4]@4 ~@5]/3", // Dm C#aug F
  O: "[[e4,g4,c5]@6 ~ [g4,b4]@6 ~@2 [g4,a#4]@6 ~@2 [e4,g4,b4]@6 ~@3, ~@14 e4@3 ~@13 e4@5 ~@29]/4", // C G Gm Em
  P: "[[e4,g4,c5]@4 ~@3 [g4,b4]@4 ~@4 [g4,a#4]@4 ~@4 [a3,c4]@4 [a3,c#4,e4]@4 ~, ~@14 e4@3 ~@13 e4@4 ~@12 e4@3 ~@15]/4", // C G Gm Am A
  Q: "[[f4,a4,d5]@6 ~ [f4,a4,c#5]@6 ~@2 [f4,a4,c5]@6 ~@3]/3", // Dm Faug F
  R: "[[e4,g4,c5]@6 ~ [e4,g4,b4]@6 ~@2 [e4,g4,a#4]@6 ~@3]/3", // C Em Edim
})).s("gm_epiano1").gain(0.26).pan(0.6)

// bass · acoustic bass · "** OK **"
const bass = note(`<
  ~ A B A B A B A B A B A B A B C D E F E F E F G H A I C J E K G L A B A B A B C D E F E F E F G H A I C J E K G L A I
  C J E K G L E F E F E F G H A B A B A B C D E F E F E F G H A I C J E K G L A I C J E K G L E K G L M N O J P Q R S
>`.pickRestart({
  A: "c2@2 ~@2 c2@2 ~@2 c2@2 g1 ~ c2 ~ c2@2", B: "~@4 c2@2 ~@2 c2@2 g1 ~ c2@2 g1 ~",
  C: "c2@2 ~@2 c2@2 ~@2 c2@2 g1 ~ c2 ~ a1@2", D: "~@2 a1@2 ~@2 a1@2 ~@2 a1 ~ f2@2 e2 ~",
  E: "d2@2 ~@2 d2@2 ~@2 d2@2 a1 ~ d2 ~ d2@2", F: "~@4 d2@2 ~@2 d2@2 a1 ~ d2@2 a1 ~",
  G: "d2@2 ~@2 d2@2 ~@2 d2@2 a1 ~ d2 ~ g1@2", H: "~@2 g1@2 ~@2 g1@2 ~@2 g1 ~ e2@2 d2 ~",
  I: "~@4 c2@2 ~@2 c2@2 g1 ~ c2 ~ g1@2", J: "~@2 a1@2 ~@2 a1@2 ~@2 a1 ~ e2@2 d#2 ~",
  K: "~@4 d2@2 ~@2 d2@2 a1 ~ d2 ~ a1@2", L: "~@2 g1@2 ~@2 g1@2 ~@2 g1 ~ d2@2 b1 ~",
  M: "c2@2 ~@2 c2@2 ~@2 c2@2 g1@2 c2 ~ c2@2", N: "~@4 c2@2 ~@2 c2@2 g1@2 c2 ~ g1@2",
  O: "c2@2 ~@2 c2@2 ~@2 c2@2 g1@2 c2 ~ a1@2", P: "d2@2 ~@2 d2@2 ~@2 d2@2 a1@2 d2 ~ d2@2",
  Q: "~@4 d2@2 ~@2 d2@2 a1@2 d2 ~ a1@2", R: "d2@2 ~@2 d2@2 ~@2 d2@2 a1@2 d2 ~ g1@2",
  S: "~@2 g1@2 ~@2 g1@2 ~@2 g1 ~ d2@2 ~@2",
})).s("gm_acoustic_bass").gain(0.46).pan(0.6)

// drums · snare
const snare = s("sd").struct(`<
  A B@3 C B@3 C B@6 D E B@6 D E B@2 D E B@2 D E B@6 D E B@6 D E B@2 D E B@2 D E B@2 D E B@2 D E B@6 D E B@6 D E B@6 D E
  B@2 D E B@2 D E B@2 D E B@2 D E B@2 D E B@2 D E B@2 D E
>`.pickRestart({
  A: "~@8 x!8", B: "x!4", C: "x ~@3 x ~@3 x ~@3 x!4", D: "x ~ x ~ x ~ x!2", E: "~ x ~ x ~ x!3",
})).gain(0.31).pan(0.3)

// drums · low tom
const low_tom = s("lt").struct(`<
  A B@3 C B@3 C B@6 D E B@6 D E B@2 D E B@2 D E B@6 D E B@6 D E B@2 D E B@2 D E B@2 D E B@2 D E B@6 D E B@6 D E B@6 D E
  B@2 D E B@2 D E B@2 D E B@2 D E B@2 D E B@2 D E B@2 D E
>`.pickRestart({
  A: "~@8 x!8", B: "x!4", C: "x ~@3 x ~@3 x ~@3 x!4", D: "x ~ x ~ x ~ x!2", E: "~ x ~ x ~ x!3",
})).gain(0.31).pan(0.3)

// drums · tambourine
const tambourine = s("tb").struct("<~ [~ x ~ x ~ x ~ x]!116>").gain(0.46).pan(0.3)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@3 A ~@3 A ~@15 A ~@3 A ~@3 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@11 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A
  ~@3 A ~@3
>`.pickRestart({
  A: "x",
})).gain(0.41).pan(0.3)

stack(
  tubular_bells, tubular_bells_soft, distortion_guitar, distortion_guitar_soft, piano, piano_soft, pad_poly,
  pad_poly_soft, epiano1, bass, snare, low_tom, tambourine, crash
)