Strudelify

Ain't No Stopping Us Now

McFadden & Whitehead

KeyA majorTempo112 bpm
0:00/0:00
// Ain't No Stopping Us Now — McFadden & Whitehead
// 112 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 154 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(112/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 · epiano2
const epiano2 = note(`<
  ~@2 A B C B A B D@2 E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F A B C B A B D@2 E F E F E F E F E
  F E F E F E F E F E F E F E F E F E F E F E F A B C B A B D@2 E F E F E F E F E F E F E F E F E F E F E F E F E F E F
  E F E F E F E F E F E F E F E F E F E F E F E F E F E G H@8
>`.pickRestart({
  A: "[g3,b3,d4]@5 ~ [g3,b3,d4]@9 ~", B: "[g3,b3,d4]@15 ~", C: "[g3,b3,d4]@4 ~@2 [g3,b3,d4]@9 ~",
  D: "[[f#3,b3,c#4]@13 ~ [f#3,b3,c#4]@16 ~@2]/2", E: "[a3,d4]!2 ~ [a3,d4] ~@2 [a3,d4]!2 ~ [a3,d4] ~@2 [a3,d4]!2 ~@2",
  F: "[g#3,b3,e4]!2 ~ [g#3,b3,e4] ~@2 [g#3,b3,e4] ~ [a3,c#4,e4]@3 ~ [a3,c#4,e4]@2 ~@2", // E A
  G: "[g#3,b3,e4]!2 ~ [g#3,b3,e4] ~@2 [g#3,b3,e4] ~ [a3,c#4,e4]@3 ~ [a3,c#4,e4]@4", H: "[[b3,e4], [f#4,b4] ~@127]/8",
})).s("gm_epiano2").gain(0.25)

// bass · electric bass finger
const bass = note(`<
  ~@2 A B A B C D E F G H G H G H G H G H G H G H G I G H G H G H G H G H G H G H G H J K L M L M N F O P O P O P O P O
  P O P O P O P G H G H G H G H G H G H G H G H J K L M L M N F G H G H G H G H G H G H G H G H G H G H G H G H ~@14 Q@2
  G H G H G H G H G H G H G H G H R ~@7
>`.pickRestart({
  A: "a2 ~ a2 ~ g2@2 ~ g2 f#2 ~ f#2 ~ e2@2 b1@2", B: "a1@3 ~ a1@2 ~ a2 a1@6 e2 f#2",
  C: "a2 ~ a2 ~ g2@2 ~ g2 f#2 ~ f#2 ~ e2@2 b1!2", D: "a1@3 ~ a1@2 ~ a2 a1@6 g#1 g1",
  E: "f#1@3 ~ f#1@2 c#2 ~ f#1@3 ~ f#1@2 e1 ~", F: "f#1@2 f#2 ~ f#1@2 f#2 ~ f#1@2 g#1@2 a1@2 c#2 ~",
  G: "b1@2 ~ e2 f#2 a2 f#2 a2 c#3@2 ~ a2@2 ~ b1 c2", H: "c#2@2 c2 c#2@2 ~ e1!2 f#1@2 ~ e1 f#1 a1 f#1 a1",
  I: "c#2@2 c2 c#2@2 ~ e1!2 f#1@2 ~ e1 f#1 ~@2 f#1", J: "a1@3 ~ a1@2 ~ a1 a1@3 ~ a1 ~ f#1 a1",
  K: "a2@4 g2@4 f#2 ~ f#2@2 e2 ~ f#1 ~", L: "a1@3 ~ a1@2 ~ g1 a1@5 ~ g1 a1", M: "a2 ~ a2 ~ g2@4 f#2 ~ f#2 ~ e2@2 f#2 ~",
  N: "f#1@3 ~ f#1@3 ~ f#1@3 ~ f#1@2 e1 ~", O: "b1@2 ~ e2 f#2 a2 f#2 a2 c#3@2 ~ a2 ~@2 b1 c2",
  P: "c#2@2 ~ c#2@2 ~ e1@2 f#1@2 ~ e1 f#1 a1 f#1 a1", Q: "[~@15 c#1@3 d1 ~ e1@2 f1 ~ f#1!2 g#1 ~ a1@2 a#1 ~]/2",
  R: "b1 ~@15",
})).s("gm_electric_bass_finger").gain(0.45)

// other · distortion guitar
const distortion_guitar = note(`<
  ~@18 A@2 B ~ A@2 C ~@29 A@2 C ~ A@2 B ~ A@2 C ~@25 A@2 B ~ A@2 C ~ A@2 B ~ A@2 C ~ A@2 B ~ A@2 C ~ A@2 B ~ A@2 C ~ A@2
  B ~ A@2 C ~ A@2 B ~ A@2 C ~ A@2 B ~ A@2 C ~@9
>`.pickRestart({
  A: "[c#5@3 ~ c#5@3 ~ a4 ~ f#4@3 ~ e4@10 ~@2 d4 ~ e4 d4 b3 ~]/2", B: "d4 ~ b3@6 ~@8", C: "d4 ~ b3@10 ~@4",
})).s("gm_distortion_guitar").gain(0.22)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@2 A B C D A E F G H I J K H I J L ~@7 M ~@8 N O N P N O N Q R S@2 T A E F G U I J K H I J L U I J K H I J L ~@8 N O
  N P N O N Q R S@2 T A E F G H I J K U I J L H I J K U I J L H I J K U I J L ~@8 H I J K H I J L V@2 W X V@2 W Y V@2 W
  X V@2 W Y Z ~@7
>`.pickRestart({
  A: "~@9 [g4,g5] [f#4,f#5] [e4,e5] [d4,d5] [e4,e5] [d4,d5] [e4,e5]", B: "[b3,b4] [a3,a4]@3",
  C: "~@6 [b3,b4]@2 [g4,g5]@3 [f#4,f#5]@3 [e4,e5]@2", D: "[b4,b5] [a4,a5]@3",
  E: "[b3,b4]@4 [a3,a4]@7 ~ [a3,a4] [b3,b4] ~@2", // B A B
  F: "[f#3,f#4] [g#3,g#4] [f#3,f#4] [g#3,g#4] [f#3,f#4] [g#3,g#4] [f#3,f#4] [g#3,g#4] [f#3,f#4] [g#3,g#4] [f#3,f#4] [g#3,g#4] [f#3,f#4] [g#3,g#4] [f#3,f#4] [g#3,g#4]", // F# G# F# G# F# G# F# G# …
  G: "[f#3,f#4] [g#3,g#4] [f#3,f#4] [g#3,g#4] [f#3,f#4] [g#3,g#4] [a3,a4] [b3,b4] [c#4,c#5] [d4,d5] [e4,e5] [f4,f5] [f#4,f#5] [g#4,g#5] [a4,a5] [b4,b5]", // F# G# F# G# F# G# A B …
  H: "[c#5,c#6]@5 ~ [a4,a5] [f#4,f#5] [a4,a5]@6 [f#4,f#5] [d4,d5]", I: "[e4,e5]@5 [f#4,f#5] [a4,a5] [e5,e6]",
  J: "[c#5,c#6]@11 ~ [c#5,c#6] [d5,d6] [c#5,c#6] ~", K: "[b4,b5]@7 ~ [f#4,f#5]@2 [g#4,g#5] ~ [a4,a5]@2 [b4,b5]@2",
  L: "[b4,b5]@3 ~", M: "~@6 [a5,a6] ~", N: "[b2,a3,d4,f#4]", O: "[c#3,b3,e4,g#4] [f#2,c#4,e4,a4]",
  P: "[c#3,b3,g#4] [f#2,c#4,a4], e4", Q: "[c#3,b3,g#4]@8 [f#2,c#4,a4]@7 ~, e4@15 ~",
  R: "~@8 [c#4,c#5]@3 [e4,e5]@3 [f#4,f#5]@2", // C# E F#
  S: "[[b4,b5]@4 [a4,a5]@4 [f#4,f#5]@4 [e4,e5]@8 ~@4 [b3,b4]@3 [d4,d5]@3 [f#4,f#5]@2]/2", T: "[e4,e5]@7 ~",
  U: "[c#5,c#6]@6 [a4,a5] [f#4,f#5] [a4,a5]@6 [f#4,f#5] [d4,d5]", // C# A F# A F# D
  V: "[[c#5,c#6]@5 ~ [a4,a5] [f#4,f#5] [a4,a5]@6 [f#4,f#5] [d4,d5] [c#3,b3]@8 ~@2 [f#4,f#5]@2 [a4,a5]@2 [e5,e6]@2, [b2,a3,d4]@16 e4@15 ~, f#4@6 ~@9 g#4@8 ~ [f#3,c#4]@8, ~@8 e5@5 ~@3, ~@6 a4 ~]/2", // C# A F# A F# D C#7 F# …
  W: "[c#5,c#6]@11 ~ [c#5,c#6] [d5,d6] [c#5,c#6] ~, [b2,a3,d4,f#4], f4 ~@15", // C# D C# Bm7
  X: "[c#3,b3,e4,g#4,b4,b5]@8 [f#4,f#5]@2 [g#4,g#5] ~ [f#3,a4,a5]@2 [b4,b5]@2, ~ [a3,c#4,e4]", // C#m7 F# G# F#m B A
  Y: "[c#3,b3,e4,g#4]@8 ~@4 f#3@3 ~, [b4,b5]@3 ~, ~ [a3,c#4,e4]", Z: "[b5,b6] ~@15",
})).s("gm_string_ensemble_1").gain(0.35)

// chords · brass section
const brass_section = note(`<
  ~@2 A@2 B@2 C@2 D@2 ~@32 E@2 F@2 G@2 H@2 ~@32 E@2 F@2 G@2 H@2 ~@32 I ~@3 I ~@3 I ~@3 I ~@3 I ~@3 I ~@3 J ~@7
>`.pickRestart({
  A: "[[a2,g3,b3,d4]@28 ~@2 d4 ~]/2", B: "[[a2,g3,b3,d4]@7 ~]/2", C: "[[g3,b3,d4]@31 ~, a2@7 ~]/2",
  D: "[[e3,g#3,b3]@12 ~@2 [e3,g#3,b3]@17 ~, f#2@7 ~]/2", E: "[[g3,b3,d4]@29 ~ d4 ~]/2", F: "[[g3,b3,d4]@29 ~@3]/2",
  G: "[[g3,b3,d4]@31 ~]/2", H: "[[e3,g#3,b3]@12 ~@2 [e3,g#3,b3]@17 ~]/2", I: "~@2 [f#4,a5,c#6,e6] ~@13",
  J: "[b3,b4,b5] ~@7", // B
})).s("gm_brass_section").gain(0.32)

// chords · brass section · soft notes
const brass_section_soft = note("<~@3 A ~ B ~@37 A ~ B ~@37 A ~ B ~@68>".pickRestart({
  A: "~@14 [g3,b3] ~", B: "~@14 g3 ~",
})).s("gm_brass_section").gain(0.16)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@2 A B A B A B C D E F E F E G E H E F E F E G E H E F E F E G E H E F E F E G E H A B@5 C D E F E F E G E H E F E F
  E G E H E F E F E G E H E F E F E G E H A B@5 C D E F E F E G E H E F E F E G E H E F E F E G E H E F E F E G E H E F
  E F E G E H E F E F E G E I@8 ~@9
>`.pickRestart({
  A: "~@4 [b3,d4,a4] ~ a4 [b3,d4,a4] ~@2 [b3,d4,a4] ~@3 d4 ~", // Bm7
  B: "[b3,d4,a4]!2 ~ [b3,d4,a4] ~@2 [b3,d4,a4]!2 ~@2 [b3,d4,a4] ~ [b3,d4,a4]!2 ~@2", // Bm7
  C: "[b3,d4,e4,f#4] [b3,e4,f#4] ~ [b3,e4,f#4] ~@2 [b3,e4,f#4]!2 ~@2 [b3,e4,f#4] ~ [b3,e4,f#4]!2 ~@2", // Bm Bsus4
  D: "[b3,e4,f#4]!2 ~ [b3,e4,f#4] ~@2 [b3,e4,f#4]!2 ~@2 [b3,e4,f#4] ~ [b3,e4,f#4] ~ [b3,e4,f#4] ~", // Bsus4
  E: "[a3,d4] ~@2 [a3,d4] ~@2 [a3,d4] ~@3 [a3,d4] ~@2 [a3,d4] ~@2", // D5
  F: "[b3,e4] ~@2 [b3,e4] ~@2 [b3,e4] ~@3 [a3,e4] ~@2 [a3,e4] ~@2", // E5 A5
  G: "[b3,e4] ~@2 [b3,e4] ~@2 [a3,e4] ~@3 [a3,e4] ~@2 [a3,e4] ~@2", // E5 A5
  H: "[b3,e4] ~@2 [b3,e4] ~@2 [b3,e4] ~ [a3,e4] ~@3 [a3,e4] ~@3", // E5 A5
  I: "[[b3,e4] ~@2 [b3,e4] ~@2 [b3,e4] ~@2 d3 ~@2 a3 ~@115, ~@7 c#-1@121]/8", // E5
})).s("gm_electric_guitar_clean").gain(0.19)

// drums · kick
const kick = s("bd").struct(`<
  ~@2 A@17 B A B A B A B A@27 B A@3 B A@3 B A B A C A B A B A B A B A B A B A B A@11 B A B A B A B A B A B A B A@3 B A B
  A B A@2 D@3 E D B E A D@3 E D B F A@2 B A B A B A B A B A B A B A C G ~@7
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x!3 ~", C: "x!8", D: "x ~@2 x!2 ~ x ~ x ~@3 x ~@3", E: "x ~@2 x!2 ~ x ~ x ~ x ~ x ~@3",
  F: "x ~@2 x!2 ~ x ~ x ~ x ~ x ~@2 x", G: "x",
})).gain(0.6)

// drums · snare
const snare = s("sd").struct(`<
  ~ A B@7 C B@7 C B@7 D B@7 E B@4 F B@2 C B@7 C B@7 C B@7 G B@7 D B@7 C B@7 C B@7 C B@7 C B@6 H I B@7 C B@7 C B@7 C B@6
  H J K ~@7
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@4 x ~@3 x!8", D: "~@4 x ~@7 x ~@2 x", E: "~@2 x ~@2 x!2 ~", F: "~ x ~@2",
  G: "x ~ x ~ x ~ x ~ x ~ x ~ x!3 ~", H: "~ x ~@2 x ~@7 x ~@3", I: "~@4 x ~@3 x!6 ~@2", J: "~ x!7", K: "x",
})).gain(0.54)

// drums · clap
const clap = s("cp").struct("<~@10 A@31 B ~@8 A@15 ~ A@15 B ~@8 A@27 C A D E A@4 C A D E A@16 ~@9>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@4 x ~@2 x ~@2 x ~ x ~@3", D: "~@4 x ~@2 x ~ x!2 ~ x ~@3", E: "~@4 x ~@7 x!2 ~@2",
})).gain(0.6)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A
  ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@19 A ~ A ~ A ~@3 A ~ A ~ A ~@10
>`.pickRestart({
  A: "~@7 x",
})).gain(0.42)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@5 A ~@2 B C ~@3 A ~@2 B C ~@3 A ~@2 B ~@4 A ~@3 A ~@3 A ~@7 A ~@2 B C ~@3 A ~@2 B C ~@3 A ~@2 B D ~@3 A ~@2 B ~@4 A
  ~@7 A ~@2 B C ~@3 A ~@2 B C ~@3 A ~@2 B C ~@3 A ~@2 B C@2 E@6 ~ C E@5 F ~@4 A ~@2 B C ~@3 A ~@2 B ~@9
>`.pickRestart({
  A: "~@5 x ~@2", B: "x ~@6 x", C: "~ x ~ x ~@4", D: "~@3 x!3 ~@2", E: "~ x ~@6", F: "~@2 x ~@12 x",
})).gain(0.54)

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

// drums · congas
const congas = s("conga:13").struct(`<
  ~@114 A B C A B C@2 D A B C A B C@2 D A B C A B C@2 D A B C A B C@2 D ~@8
>`.pickRestart({
  A: "~@2 x ~@2 x ~@4 x ~@5", B: "~ x ~@3 x ~@2", C: "~@2 x ~@2 x ~@3 x!2 ~@5", D: "~@2 x ~@2 x ~@3 x!2 ~@2 x ~@2",
})).gain(1.73)

// drums · congas
const congas_2 = s("conga:18").struct("<~@114 A@4 B A@2 B A@4 B A@2 B A@4 B A@2 B A@4 B A@2 B ~@8>".pickRestart({
  A: "x ~@2 x ~@7 x!2 ~@3", B: "x ~@2 x!2 ~@6 x!2 ~@3",
})).gain(1.73)

// drums · congas
const congas_3 = s("conga:33").struct("<~@114 [~@6 x!2 ~@6 x!2]!32 ~@8>").gain(1.73)

stack(
  epiano2, bass, distortion_guitar, string_ensemble_1, brass_section, brass_section_soft, electric_guitar_clean, kick,
  snare, clap, low_tom, hihat, open_hat, crash, congas, congas_2, congas_3
)