Strudelify

It Aint Over Till Its Over

Lenny Kravitz

KeyC majorTempo86 bpm
0:00/0:00
// It Aint Over Till Its Over — Lenny Kravitz
// 86 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 76 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(86/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.

// bass · electric bass finger · "Track 2"
const bass = note(`<
  ~ A B C D E F G H I J K L I M K L A B C D E F G H I J K L I J K L A B C D E F G H N O P Q R S T U ~@9 A B C D E F G H
  A B C D E F G H V@2
>`.pickRestart({
  A: "c3 ~@5 c3!2 ~@5 c3@2 ~", B: "c3 ~@5 c3!2 ~@5 g2 a2 g2", C: "c3 ~@5 c3!2 ~@5 c3 a2 c3",
  D: "f2@4 ~@2 f2 g#2 ~ g#2 ~ g#2 ~ g#2 g#3 g#2", E: "c3 ~ c3 ~ c3@4 ~ c3 ~ c3 ~ c3 g2@2",
  F: "c3 ~@3 c3@4 ~ c3 ~ c3@2 g2 c3 a2", G: "c3 ~ c3 ~ c3@2 ~ c3 ~ c3 ~ c3 ~ c3 a2 c3",
  H: "f2 ~ f2@3 ~ f3 g#2 ~ g#2 ~ g#2@2 g#3 g#2 ~", I: "c3 ~ c3@3 ~ c3!2 ~ c3 ~ c3@2 g2 c3 g2",
  J: "b2 ~ b2@2 ~@2 b2!2 ~ b2 ~ b2@3 b2 ~", K: "a#2 ~ a#2 ~@3 a#2!2 ~ a#2 ~ a#2@2 a2 a#2 a2",
  L: "f2 ~ f2@4 f3 f2 ~ f2 ~ f2@3 ~@2", M: "b2 ~ b2@3 ~ b2!2 ~ b2 ~ b2@3 b2 ~",
  N: "g#2 ~ g#2@4 g#3 g#2 ~ g#2 ~ g#2 ~ g#2 g#3 g#2", O: "a#2 ~ a#2@2 a#3@3 a#2 ~ a#2 ~ a#2 ~ a#2 a#3@2",
  P: "f2 ~ f2@2 f3@3 f2 ~ f2 ~ f2@2 f3 c3 f3", Q: "g2 ~ g2@2 g3@3 g2 ~ g2 ~ g2@2 g2 g3 g2",
  R: "g#2 ~ g#2@2 g#3 g#2 ~ g#2@4 g#3@2 d#3 g#3 d#3", S: "a#2 ~ a#2@2 a#3@2 ~ a#3 ~ a#3 ~ a#3@2 f3 a#2 ~",
  T: "f#2 ~ f#2@2 f#3@4 ~ f#2 ~ f#2@2 f#2 f#3 f#2", U: "g#2 ~ g#2@2 g#3@3 g#2 ~ a#2 ~ a#2 ~ a#2 a#3 ~",
  V: "[c3@29 ~@3]/2",
})).s("gm_electric_bass_finger").gain(0.52).pan(1)

// chords · epiano1 · "Track 3"
const epiano1 = note(`<
  ~ A B C D A B C D E F G H E F G H A B C D A B C D E F G H E F G H A B C D A B C D I J K L ~@2 M N ~ A B C D A B C D A
  B C D A B C D A B C D A B C D O@2
>`.pickRestart({
  A: "[c4,g4,e5,g5,c6]@7 ~", B: "[c4,g4,b4,e5,g5,b5]@15 ~", C: "[g4,e5,g5,a#5]@15 ~",
  D: "[a4,c5,d5,f5]@7 [g#4,c5,d5,f5]@7 ~@2", E: "[c3,g3,c4,e4]", F: "[g3,b3,d4]", G: "[f3,a#3,d4]@15 ~",
  H: "[a3,d4,f4]@7 [g#3,c4,f4]@7 ~@2", I: "[g#2,g#3,c4,d#4]@11 ~@3 [c4,d#4]@2, ~@11 g#2@5, ~@13 g#3@3",
  J: "~@4 [a#3,d4]@5 [a#3,d4,f4]@2 [a#3,d4,f4]@5, a#2, ~ f3@3", K: "~ f3 [f3,g#3,c4]@5 [f3,g#3,c4], f2",
  L: "[g3,a#3,d4]@6 g3 ~@4 g4@3 ~@2, g2@15 ~, ~@7 [g3,a#3,d4]@7 ~@2", // Gm
  M: "[b3,d#4,f#4] ~ [b3,d#4,f#4]@3 [b3,d#4,f#4] ~ [b3,d#4,f#4] ~ [b3,d#4,f#4]@5 [b3,d#4,f#4] ~", // B
  N: "[c#4,f4,g#4] ~ [c#4,f4,g#4]@3 [c#4,f4,g#4] ~ [d#4,g4,a#4] ~ [d#4,g4,a#4] ~ [d#4,g4,a#4]@3 ~@2", // C# D#
  O: "[[c3,c4,e4,g4]@29 ~@3]/2", // C
})).s("gm_epiano1").gain(0.35).pan(1)

// chords · epiano1 · "Track 3" · soft notes
const epiano1_soft = note(`<
  ~@3 A ~@3 A ~@11 A ~@3 A ~@11 A ~@3 A ~@12 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
>`.pickRestart({
  A: "[c4,a#4]@15 ~", // C7
})).s("gm_epiano1").gain(0.25).pan(1)

// other · overdriven guitar · "Track 4"
const overdriven_guitar = note(`<
  ~@17 A B C D E F G H ~@8 A B C D E F G H I J@2 K L M N O ~ P Q R S P Q R S A B C D E F G H A B C D E F G H T@2
>`.pickRestart({
  A: "c3!3 ~@2 c3 ~@5 c3 ~ c3 d3 e3", B: "c3 ~@2 c3 ~@3 c3 ~@5 c3!3", C: "c3 ~@2 c3!2 ~@8 c3 e3 c3", D: "f3@7 ~@9",
  E: "c3!3 ~@6 c3 ~ c3@3 ~@2", F: "c3!4 d3 e3 ~@7 e3 d3 c3", G: "c3 ~@2 c3!2 ~@11", H: "f3@3 ~, c3@9 ~@7", I: "~@3 f5",
  J: "[f5 ~ f5!4 ~ f5@6 a#4 c5 d#5@3 c5@3 ~@5 c5@6]/2", K: "a#4 ~ a#4 ~ a#4 c5 ~ a#4@6 ~@3",
  L: "g4 ~ g4 ~ g4 f4 ~ a#4@3 g4@4 ~@2", M: "f4 ~ f4 ~ f4 g4 ~ f4@7 ~@2", N: "~@2 b4 ~@2 a#4 ~@2 g#4@2 ~ f#4@3 g#4 f#4",
  O: "~@5 c#5@3 d#5@6 ~@2", P: "c4@13 ~ d4 c4", Q: "b3@9 g3 ~ g3 ~ g3 b3 g3", R: "a#3@7 ~", S: "a3@4 g#3@3 ~",
  T: "[[c3,g3,c4]@7 ~]/2", // C5
})).s("gm_overdriven_guitar").gain(0.3).pan(1)

// chords · electric guitar clean · "Track 5"
const electric_guitar_clean = note(`<
  ~ A B C D A B C D E F G H E F G H A B C D A B C D E F G H E F G H A B C D A B C D I J K L M N O P ~@9 A B C D A B C D
  A B C D A B C D Q@2
>`.pickRestart({
  A: "[c4,e4,g4] ~@3 [c4,e4,g4] [e4,g4] [c4,e4,g4]!2 ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4] [c4,e4,g4]@2", // C Em C
  B: "[b3,e4,g4] ~@3 [e4,g4]!2 [b3,e4,g4]!2 ~ [b3,e4,g4] ~ [b3,e4,g4]@2 [b3,e4,g4] [b3,e4,g4]@2", // Em
  C: "[a#3,e4,g4] ~ a#3 ~ [a#3,e4,g4] e4 [e4,g4] [a#3,e4,g4] ~ [a#3,e4,g4] ~ [a#3,e4,g4] ~ [a#3,e4,g4]!2 ~", // Edim Em Edim
  D: "[a3,c4,f4]@3 ~ [a3,c4,f4]!2 ~ [g#3,c4,f4] ~ [g#3,c4,f4] ~ [g#3,c4,f4]@3 [g#3,c4,f4] ~", // F Fm
  E: "[c4,e4,g4]@2 [c4,e4,g4] ~ [c4,e4,g4]!2 ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4]!5", // C
  F: "[b3,e4,g4] ~ [b3,e4,g4] ~ [b3,e4,g4]!2 ~ [b3,e4,g4] ~ [b3,e4,g4] ~ [b3,e4,g4]!5", // Em
  G: "[a#3,d4,g4]@2 [d4,g4]!2 [a#3,d4,g4] ~ [a#3,d4,g4]!2 ~ [a#3,d4,g4] ~ [a#3,d4,g4] ~ [a#3,d4,g4]!3", // Gm G5 Gm
  H: "[a3,d4,f4]@2 d4 [a3,d4,f4]!2 ~ [a3,d4,f4] [g#3,c4,f4] ~ [g#3,c4,f4] ~ [g#3,c4,f4]@2 [g#3,c4,f4]!2 ~", // Dm Fm
  I: "[g#2,g#3,c4,d#4]@9 ~@5 [g#3,c4,d#4]@2, ~@9 g#2@2 g#2@5, ~@5 [g#3,c4,d#4]@2 ~", // G#
  J: "~ f3 [f3,a#3,d4]@5 [f3,a#3,d4], a#2", K: "[f2,f3,g#3,c4]@9 ~ [f3,g#3,c4] [f3,g#3,c4]@2 [f3,g#3,c4]@3, ~@9 f2@7",
  L: "~ g3 [g3,a#3,d4]@5 ~, g2@7 ~", // Gm
  M: "[g#3,c4]@5 [g#3,c4]@2 ~@2 g#2@2 g#2@2 ~ [g#3,c4]@2, g#2@9 ~@4 g#2@3, ~@7 [g#3,c4]@7 ~@2", // G#
  N: "~@2 [f3,a#3,d4]@2 [f3,a#3,d4]!2 ~ [f3,a#3,d4] ~ [f3,a#3,d4]@2 ~@2 a#2 [f3,a#3,d4] ~, a#2@6 ~@5 a#2@2 ~@3, ~@6 [f3,a#3,d4] ~", // A#
  O: "[d#3,f#3,b3]@8 ~ [d#3,f#3,b3] ~@2 [d#3,f#3,b3]@2 ~@2", // B
  P: "[f3,g#3,c#4]@4 ~ [f3,g#3,c#4] ~ [g3,a#3] ~ [g3,a#3] ~ [g3,a#3]@3 ~@2", Q: "[[c3,e3,g3,c4,e4]@15 ~]/2",
})).s("gm_electric_guitar_clean").gain(0.27).pan(1)

// chords · electric guitar clean · "Track 5" · soft notes
const electric_guitar_clean_2 = note(`<
  ~ A B C ~ A B C ~@3 D E ~@2 D E A B C ~ A B C ~@3 D E ~@2 D E A B C ~ A B C ~@18 A B C ~ A B C ~ A B C ~ A B C ~@3
>`.pickRestart({
  A: "~@5 c4 ~@10", B: "~@4 b3!2 ~@10", C: "~@2 [e4,g4] ~@2 [a#3,g4] a#3 ~@9", D: "~@2 a#3!2 ~@12",
  E: "~@2 [a3,f4] ~@13", // Dm
})).s("gm_electric_guitar_clean").gain(0.15).pan(1)

// drums · kick
const kick = s("bd").struct("<~ [x ~ x ~@3 x!2 ~ x ~ x ~@2 x ~]!73 x ~>").gain(0.45).pan(0)

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

// drums · hihat
const hihat = s("hh").struct("<~ [x!16]!73 ~@2>").gain(0.28).pan(0)

// drums · open hat
const open_hat = s("oh").struct("<~@74 x ~>").gain(0.51).pan(0)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@3 A ~@3 A ~@15 A ~@7 A ~@3 A ~@3 A ~@7 A ~@4 A ~@3 A ~@3 A ~@3 A ~@3 A ~@5
>`.pickRestart({
  A: "x",
})).gain(0.45).pan(0)

// drums · ride
const ride = s("rd").struct("<~@41 [x!8]!7 [x!5 ~@3] ~@17 [x!8]!7 [x!5 ~@3] x ~>").gain(0.4).pan(0)

stack(
  bass, epiano1, epiano1_soft, overdriven_guitar, electric_guitar_clean, electric_guitar_clean_2, kick, snare, hihat,
  open_hat, crash, ride
)

More by Lenny Kravitz