Strudelify

Why Must We Wait Until Tonight

Tina Turner

KeyE♭ majorTempo91 bpm
0:00/0:00
// Why Must We Wait Until Tonight — Tina Turner
// 91 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 114 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(91/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.

// chords · piano
const piano = note(`<
  ~@3 A@8 ~@18 B@2 C@2 B@2 C@2 ~@2 B@2 D ~@19 B@2 C@2 B@2 C@2 ~@2 B@2 D ~@12 E@3 C@2 B@2 C@2 B@2 C@2 B@2 C@2 ~@11
>`.pickRestart({
  A: "[~@6 [eb4,bb4]@15 [c4,bb4]@2 [bb3,g4]@2 [c4,g4]@7]/4", B: "[~@6 [eb4,bb4]@7 ~@3]/2",
  C: "[~ [eb4,bb4]@4 [c4,bb4]@2 [bb3,g4]@2 [c4,g4]@7]/2", D: "~ [eb4,bb4]@5 ~@2",
  E: "[~@6 [eb4,bb4]@7 ~ [eb4,bb4]@7 ~@3]/3", // Eb5
})).s("gm_piano").gain(0.05)

// other · piano
const piano_2 = note(`<
  ~@18 A B@2 C D E F G ~ H I ~@21 J K@2 C L E F G ~ H I ~@15 K@2 C D E F G ~ H I ~@28
>`.pickRestart({
  A: "eb4 bb3 c4@2 eb4 c4 ~ c4 eb4 c4 ~@2 eb4 c4 ~ c4",
  B: "[eb4 bb3 c4@2 c4@4 eb4@4 f4@2 d4@5 ~ d4 bb3 ~@2 d4 ~@3 d4 ~@3]/2", C: "d4 ~@3 d4 ~@2 bb3 d4 ~@2 bb3 d4 ~@3",
  D: "eb4 c4 ~ c4 eb4 c4 ~ c4 eb4 c4 ~ c4 eb4 c4 ~ c4", E: "eb4 c4 ~ c4 eb4 ~@3 eb4@4 f4@2 d4@2",
  F: "~@4 d4 ~@3 d4 ~@3 d4 ~@3", G: "d4 bb3 c4 ~ eb4 ~@3 eb4 ~@3 eb4 ~@3", H: "d4 bb3 c4 ~@13",
  I: "eb4 ~@3 eb4 ~@3 eb4 ~@3 eb4 ~@3", J: "eb4 bb3 c4@2 eb4 c4 ~@2 eb4 c4 ~@2 eb4 c4 ~ c4",
  K: "[eb4 bb3 c4@2 c4@4 eb4@4 f4@2 d4@5 ~ d4 ~@3 d4 ~@3 d4 ~@3]/2",
  L: "eb4 c4 ~ c4 eb4 c4 ~@2 eb4 c4 ~ c4 eb4 c4 ~ c4",
})).s("gm_piano").gain(0.18)

// other · piano · soft notes
const piano_soft = note("<~@18 A ~ B C ~ D E ~@25 F ~ G C H D E ~@20 G C ~ D E ~@32>".pickRestart({
  A: "~@11 c4 ~@4", B: "~@6 c4 ~@2 bb3 ~ bb3 ~ bb3 ~ bb3", C: "~ bb3 ~ bb3 ~ bb3 ~@3 bb3 ~@3 bb3 ~ bb3",
  D: "~@5 c4 ~@10", E: "~ bb3 ~ bb3 ~@2 bb3!2 ~ bb3 ~@3 bb3 ~@2", F: "~@7 c4 ~@3 c4 ~@4",
  G: "~@5 bb3 c4 ~@2 bb3 ~ bb3 ~ bb3 ~ bb3", H: "~@7 c4 ~@8",
})).s("gm_piano").gain(0.09)

// chords · epiano2
const epiano2 = note(`<
  A B C D A B C D A B C E F G F H I J K L@2 M K N@2 O P O Q ~ A B C D A B C E A B C D ~@2 F G F H I J K L@2 M K N@2 O P
  O Q ~ A B C D A B C E A B C D R S L@2 M K N@2 O P O Q ~@2 A B C D A B C E A B C D A B C E A B C D A B C E T U
>`.pickRestart({
  A: "eb4@4 eb4@2 f4 d4, [ab2,c4,g4]", B: "[bb2,bb3,d4,g4]",
  C: "~@4 [bb4,bb5] ~@3 [bb4,bb5] ~@3 [bb4,bb5] ~@3, [ab2,c4,eb4,g4]", // Bb Abmaj7
  D: "[bb4,bb5] ~@3 [bb4,bb5] ~@3 [bb4,bb5] ~@3 [bb4,bb5] ~@3, [bb2,bb3,d4,g4]", // Bb Gm
  E: "[bb4,bb5] ~@3 [bb4,bb5] ~@3 [bb4,bb5] ~@3 [bb4,bb5] ~ g4@2, [bb2,bb3,d4], g4@5 g4@2 ~", // Bb
  F: "[ab2,ab3,c4,eb4,g4]@15 ~", G: "[bb3,d4,f4,g4]@15 ~, bb2@13 ~@3", H: "[bb2,bb3,d4,f4,g4]",
  I: "[ab2,ab3,c4,eb4,g4]", J: "[bb2,d4,f4,bb4]", K: "[c3,eb4,g4,c5]",
  L: "[~@2 c4@2 eb4@2 f4 ~ [f3,f4,bb4,d5]@8, f2@9 ~@7, [ab4,c5] ~, f4@3 ~@5, eb4@4 ~@3 d4@7 ~@2]/2", // Bb Ab
  M: "[g2,f4,g4,bb4,d5]", // Gm7
  N: "[~@2 c4@2 eb4@2 f4 ~ [f3,f4,bb4,d5]@8, f2@9 ~@7, [ab4,c5] ~, f4@11 ~@21, eb4@7 ~@7 d4@14 ~@4]/2", // Bb Ab
  O: "[f2,eb4,f4,ab4,c5]", P: "[f3,f4,ab4,b4,eb5]@7 ~", Q: "[ab2,f4,ab4,b4,eb5]@15 ~", R: "[c3,bb3,d4,f4]@15 ~",
  S: "[c3,c4,eb4,g4]@7 ~", T: "[g4,bb4,eb5,g5] ~ [eb5,g5]@2 ~@9 bb4 ~ bb4, ~@2 [g4,bb4] ~@13",
  U: "[g4,c5,eb5,g5] ~ [eb5,g5]@2 ~@12, ~@2 [g4,c5] ~@13", // Cm Eb C5
})).s("gm_epiano2").gain(0.25).pan(0.7)

// chords · synth strings 1
const synth_strings_1 = note(`<
  A B C@2 A B C@2 A B D@2 A B C@2 E@2 F@2 G H I J@2 K L M N ~ A B C@2 A B D@2 A B C@2 ~@2 A B C@2 E@2 F@2 G H I J@2 K L
  M N ~ A B C@2 A B D@2 A B C@2 O P ~ G H I J@2 K L M N ~@2 A B C@2 A B D@2 A B C@2 A B D@2 A B C@2 A B D@2 ~@2
>`.pickRestart({
  A: "[ab3,c4,eb4,g4]", B: "[bb3,d4,f4,g4]", C: "[[ab3,c4,eb4] [bb3,d4,f4], g4]/2",
  D: "[[ab3,c4,eb4] [bb3,d4,f4], [g4,g5]]/2", E: "[[ab3,c4,eb4]@16 [bb3,d4,f4]@15 ~, g4@31 ~]/2",
  F: "[[c4,g4]@16 [f4,ab4]@15 ~, [c3,eb4]]/2", G: "[f3,d4,f4,bb4]", H: "[g3,d4,g4,bb4]", I: "[c3,eb4,g4,c5]",
  J: "[[f4,ab4,c5]@16 [f4,bb4,d5]@15 ~, f3]/2", K: "[eb4,f4,ab4,c5]@7 ~", L: "[f4,ab4,b4,eb5]", M: "[f3,f4,ab4,c5]",
  N: "[ab3,f4,ab4,b4,eb5]", O: "[c4,d4,f4]@15 ~", P: "[c4,eb4,g4]",
})).s("gm_synth_strings_1").gain(0.03).pan(0.3)

// other · muted trumpet
const muted_trumpet = note("<~@75 A@2 B@2 C D E ~@32>".pickRestart({
  A: "[c4@19 ~@13]/2", B: "[c4@6 bb3@15 ~@11]/2", C: "~@2 eb4 c4 ~ eb4 c4 ~ eb4 c4 ~ eb4 c4 ~ eb4 c4",
  D: "~ eb4 c4 ~@4 bb4 g4 ~@7", E: "~@5 c4 eb4 f4 g4@6 ~@2",
})).s("gm_muted_trumpet").gain(0.32)

// bass · fretless bass
const bass = note(`<
  A B A B A B A C A@5 B A B A@2 D A@3 E A@5 F ~ A B A C A@5 B A C ~@2 A B A B A@2 D A@3 E A@5 F ~ A B A C A@5 B G H A D
  I A@2 D I A@2 J A F ~@2 A B A C A@5 B A C A@5 B A C A@4 K L
>`.pickRestart({
  A: "c2 ~ bb1 ~ c2 ~@6 g1 ~ g1 bb1@2", B: "c2 ~ bb1 ~ c2 ~@11", C: "c2 ~ bb1 ~ c2 ~@8 c2 eb2 ~",
  D: "c2 ~ bb1 ~ c2 ~@8 c2 eb2@2", E: "c2 ~ bb1 ~ c2 ~@6 c2 ~ c2 eb2@2", F: "ab1", G: "c2 ~ bb1 ~ c2 ~@6 g1 ~ g1 c2@2",
  H: "bb1 ~ c2 ~ bb1 ~@6 g1 ~ g1 bb1@2", I: "db2 ~ b1 ~ db2 ~@6 g1 ~ g1 bb1@2", J: "b1 ~ bb1 ~ b1 ~@6 g1 ~ g1 bb1@2",
  K: "c2 ~ c2 ~@10 bb1 ~ bb1", L: "c2 ~ c2 ~@13",
})).s("gm_fretless_bass").gain(0.5)

// chords · rock organ
const rock_organ = note(`<
  ~@6 A ~@18 B C D E ~@3 A F ~@6 A F ~@15 B C D E ~@3 A G ~@6 A F ~@8 B H D E ~@4 A F ~@6 A F ~@4 I J@3 K L M N ~@2
>`.pickRestart({
  A: "~@10 [gb6,g6] ~ eb6 ~@3", B: "[f5,ab5,c6]", C: "[ab5,b5]", D: "[f5,ab5,c6]@15 ~", E: "[f5,ab5,b5,eb6]@15 ~",
  F: "g6 ~@15", G: "g6 ~@5 g6 ~@9", H: "[f5,ab5,b5]",
  I: "~ [g5,bb5,eb6] c6 g5 [bb5,eb6]@2 ~ [g5,bb5,eb6] ~ [g5,bb5,eb6] c6 ~ [g5,eb6] ~ g5 [g5,c6,f6], ~@4 g5 ~@7 bb5@2 ~@2", // Eb Eb5 Eb Cm Csus4
  J: "[~ [g5,c6,f6] ~ g5 [c6,f6]@2 ~ [g5,c6,f6] ~ [g5,c6,f6] ~ g5 [c6,f6]@2 g5 g6@7 ~@4 f6 eb6 ~ d6 c6 bb5@3 c6 ~@7 c6 bb5 [db6,d6] ~ c6 ~, ~@4 g5 ~@7 g5 ~@2 f6 ~@32]/3", // Csus4 F5 Csus4 F5 Dmaj7
  K: "bb5 g5 bb5@4 g5 f5@3 ~@6", L: "~@2 d5 eb5 g5 bb5 ~ d6 bb5 g5 bb5 c6 d6 eb6 f6 [f6,g6]",
  M: "bb6@6 ~ d7@3 [bb6,c7] ~ bb6 f6 g6!2, ~@7 db7 ~@8", // Bbsus2
  N: "~@4 [f6,ab6,bb6] ~@2 [f6,ab6,bb6] ~ [f6,bb6]!2 ~ [f6,bb6] ~ [f6,bb6] ~", // Bb7 Bb5
})).s("gm_rock_organ").gain(0.15).pan(1)

// chords · rock organ · soft notes
const rock_organ_soft = note("<~@26 A ~ B ~@29 A ~ B ~@24 B ~@18 C D ~@4 E ~@3>".pickRestart({
  A: "f5@15 ~", B: "~@14 e5 [a4,b4,c5,d5]", C: "~@6 g5 ~@4 g5 ~@4", D: "~@2 bb5 ~@7 bb5 ~ b5 ~@3", E: "~@6 g6 ~@9",
})).s("gm_rock_organ").gain(0.06).pan(1)

// chords · electric guitar muted · Gm
const electric_guitar_muted = note("<~@3 [~@6 [bb3,d4,g4] bb2 ~@8] ~@110>").s("gm_electric_guitar_muted").gain(0.19)

// drums · kick
const kick = s("bd").struct(`<
  A B A B A B A C A B A B A B A B A C A B A B@2 A B@3 A B D A B A C A B A B A B A@2 D E A B A B A C A B A B@2 A B@3 A B
  D A B A B A B A B A B A B D@2 B A B@2 A B@3 A B D F A B A B A B A B A B A G A B A B A B A G A B A B H I
>`.pickRestart({
  A: "x ~ x ~@8 x ~@2 x ~", B: "x ~ x ~@8 x ~@4", C: "x ~ x ~@8 x ~ x!2 ~", D: "x ~@2 x ~@2 x ~@3 x ~@5",
  E: "x ~@2 x ~@2 x ~@2 x!3 ~@3 x", F: "x ~@2 x ~@2 x ~@3 x!2 ~@2 x!2", G: "x ~ x ~@8 x ~ x ~@2",
  H: "x ~ x!2 ~@2 x ~@2 x!2 ~@4 x", I: "x!2 ~@6",
})).gain(0.36)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2 A ~@3 A ~@2 A ~ A ~ A ~ A ~ A ~ A@2 ~ B A ~ A ~ A ~ A ~ A ~@2 A ~@3 A
  ~@2 A ~ A C A ~ A ~ A ~ A C ~@3 A ~@2 A ~@3 A ~@2 D A ~ A C A ~ A ~ A ~ A B A ~ A ~ A ~ A B A ~ A ~@3
>`.pickRestart({
  A: "~@13 x ~@2", B: "~@7 x", C: "~@13 x!2 ~", D: "~@9 x ~@6",
})).gain(0.18)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@17 A ~ A@10 ~@13 A@2 ~@6 A@5 ~ A@5 ~@13 A@12 ~ A ~@24 A ~>".pickRestart({
  A: "~@7 x ~@8",
})).gain(0.22)

// drums · hihat
const hihat = s("hh").struct(`<
  A@3 B A C A B A C A B A B A B A B@13 A C A B A C A B A C A B@3 A B A B A B@13 A C A B A C A B A C A B@15 A C A B A C A
  B A C A B A C A B A C A B A C A B D E
>`.pickRestart({
  A: "x!4 ~@2 x!3 ~ x!2 ~ x!2 ~", B: "x!4 ~@2 x!3 ~ x!2 ~@2 x ~", C: "x!4 ~@2 x!3 ~ x!5 ~", D: "x!4 ~@2 x!3 ~ x ~@5",
  E: "~ x ~@6",
})).gain(0.18)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<[~@5 x ~@3 x ~@5 x]!112 [~@5 x ~@3 x ~@6] ~>").gain(0.09)

// drums · open hat
const open_hat = s("oh").struct(`<
  A@5 ~ A@3 ~ A@21 ~ A@3 ~ A@3 ~ A@23 ~ A@3 ~ A@3 ~ A@17 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@2 B C
>`.pickRestart({
  A: "~@3 x", B: "~@11 x ~ x ~@2", C: "x",
})).gain(0.22)

// drums · high tom
const high_tom = s("ht").struct("<~ A ~@3 A ~@3 A ~@25 A ~@31 A ~@25 A ~@7 A ~@7 A ~@4>".pickRestart({
  A: "~@9 x ~@6",
})).gain(0.18)

// drums · tambourine
const tambourine = s("tb").struct("<[x!2]!25 ~@4 [x!2]!28 ~@4 [x!2]!21 ~@4 [x!2]!27 x>").gain(0.22)

// drums · bongos
const bongos = s("bongo:4").struct("<~@6 A ~@25 A ~@7 A ~@23 A ~@7 A ~@17 A ~@7 A ~@7 A ~@7>".pickRestart({
  A: "~ x",
})).gain(0.82)

// drums · bongos
const bongos_2 = s("bongo:18").struct(`<
  ~ A ~ B ~ A ~ A@3 ~ B ~@17 B A@2 ~ A@4 B A@2 ~ A ~@19 B A@2 ~ A@4 B A@2 ~ A ~@12 C ~ A@2 ~ A@4 B A@2 ~ A@4 B A@2 ~ A@4
  B ~@2
>`.pickRestart({
  A: "~ x", B: "~@2 x!2", C: "~@3 x",
})).gain(0.82)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@6 A ~ A ~@23 A ~ A ~@5 A ~ B@2 ~@20 A ~ A ~@5 A ~ B@2 ~@10 A B ~@2 A ~ A ~@5 A ~ A ~@5 A ~ A ~@3 B ~
>`.pickRestart({
  A: "~ x", B: "~@3 x",
})).gain(0.72)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~ A ~ B ~ A@3 C D ~ B ~@17 E ~ F A G H D I J ~ F A G ~@19 E ~ F A G H D I J ~ F A G ~@12 B ~@2 F A G H D I J ~ F A G H
  D I J ~ F A G H D I J ~@2
>`.pickRestart({
  A: "~@7 x ~@8", B: "~@9 x ~@6", C: "~@7 x ~@3 x ~@3 x", D: "x ~ x ~ x ~@2 x ~@8", E: "~@7 x ~ x ~@6",
  F: "~@7 x ~@7 x", G: "~@7 x ~@3 x ~@4", H: "~@3 x ~ x ~ x ~@3 x ~@3 x", I: "~@5 x ~@10", J: "~@5 x ~@3 x ~@6",
})).gain(0.72)

// drums · congas
const congas_3 = s("conga:33").struct(`<
  ~@7 A B ~@20 C ~ D ~ E B F G@2 ~ D ~ E H@2 ~@17 C ~ D ~ E B F G@2 ~ D ~ E H@2 ~@10 I H ~ D ~ E B F G@2 ~ D ~ E B F G@2
  ~ D ~ E B F G@2 H C
>`.pickRestart({
// … 27 more lines

More by Tina Turner