Strudelify
Cherish cover art

1989 · Like a Prayer

Cherish

Madonna

KeyD majorTempo133 bpm
0:00/0:00
// Cherish — Madonna
// 133 bpm, 4/4, key D 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 144 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(133/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 · synth bass 1 · "SYN BASS 1"
const bass = note(`<
  ~@3 A B C D E F G H I J C D K F L M N O P Q R S T@2 U@2 P Q R S T@2 U@2 C V E F W X I J C V E F L M N O P Q Y S T@2
  U@2 P Q R S T@2 Z AA@4 AB@4 AC AD AE@3 C V E F W H I J C V K F L AF AG AH@4 AI@4 AC AJ AK ~@4 P Q R S T@2 U@2 P Q R S
  T@2 U@2 P Q R S T@2 AL@2 P Q Y S T@2 AM@2 AN
>`.pickRestart({
  A: "d1@3 ~@13", B: "d1@3 ~@5 g2 f#2 ~ d2 a1 b1 ~ d2", C: "d2@2 ~ d2 ~@3 d1 d1@2 ~ d1@2 ~@3",
  D: "c2@2 ~ c2 ~ c1 ~ d1 e1@2 ~ e1@2 ~@2 e1", E: "g1@2 ~ g1 ~@3 g1 g2@2 ~ g2 ~@3 g2",
  F: "g1@2 ~ g1@2 ~@2 g1 a1@2 ~ a1@2 a1 ~ g1", G: "f#1@2 ~ f#1@2 ~@2 f#1 f#2@2 ~ f#2@2 ~@2 f#1",
  H: "g1@2 ~ g1@2 ~@2 g1 g2@2 ~ g2@2 ~@2 a1", I: "b1@2 ~ b1 ~@3 b1 b1@2 ~ b1 ~ a2 ~ b2",
  J: "b1@2 ~ b1 ~@3 b1 b1@2 ~ b1 b2 a2 ~ f#2", K: "g1@2 ~ g1@2 ~@2 g1 g2@2 ~ g2 ~@3 g2",
  L: "f#1@2 ~ f#1@2 ~@2 f#1 f#2@2 ~ f#2@2 ~@2 f#2", M: "g2@2 ~ g2 ~ g2 ~ d2 g1@2 ~ g1 ~@4",
  N: "f#1 ~@2 f#1 ~@3 f#1 f#2@2 ~ f#2 ~@3 f#2", O: "e1@2 ~ e1 ~ e2 ~ d2 c#2@2 ~@2 c#2@3 ~",
  P: "d2@4 ~@3 d2 f#1@3 ~ g1@3 ~", Q: "g1@5 ~@2 g1 g1@2 ~ g2 g1 ~@3", R: "e1@4 ~@3 e1 g1@2 ~@2 a1@3 ~",
  S: "a1 ~@2 a2 ~@3 a2 a1@2 ~@2 a2@2 ~ a1", T: "[b1@5 ~@2 b1 f#1@3 ~ g1@6 ~ g2 ~@3 g2 g1@4 g2@2 ~ g1]/2",
  U: "[f#1@3 ~ g1@3 ~ a1@3 ~ a1@6 ~ a2 ~@3 a2 a1 b1 ~ c#2@5]/2", V: "c2@2 ~ c2@2 c1 ~ d1 e1@2 ~ e1@2 ~@2 e1",
  W: "f#1@2 ~ f#1 ~@3 f#1 f#2@2 ~ f#2@2 ~@2 f#1", X: "g1@2 ~ g1 ~@3 g1 g2@2 ~ g2@2 ~@2 a1",
  Y: "e1@4 ~@3 e1 g1@3 ~ a1@3 ~", Z: "f#1@3 ~ g1@2 ~@2 a1@3 ~ a1@4",
  AA: "[~@3 a1 ~@3 a1!2 b1 ~ c#2@4 f#1@4 ~ a1@2 ~@2 c#2@2 ~@2 f#1@2 ~ g1@5 b1@2 ~@2 d2@2 ~@2 g1@2 ~ b1@3 ~ b1 ~@3 b1 b1@2 ~ b1 ~@3 b1]/4",
  AB: "[a1@2 ~ a1 ~@3 a1!2 ~@2 a1 ~@3 f#1@5 a1@2 ~@2 c#2@2 ~@2 f#1@2 ~ g1@5 b1@2 ~@2 d2@2 ~@2 g1@2 ~ b1@4 b1 ~@3 b1 b1@2 ~ b1@2 ~@2 b1]/4",
  AC: "a1@2 ~ a1@2 ~@2 a1 a1@2 ~ a1@2 ~@2 a1", AD: "f#1@2 ~ f#1 ~@3 f#1 f#1@2 ~ f#1@2 d1 ~ f#1",
  AE: "[g1@2 ~ g1 ~@3 g1 g1@40]/3", AF: "g2@2 ~ g2@2 g2 ~ d2 g1@2 ~ g1 ~@4",
  AG: "f#1@2 ~ f#1 ~@3 f#1 f#2@2 ~ f#2 ~@3 f#2",
  AH: "[e1@2 ~ e1 ~ e2 ~ d2 c#2@2 ~@5 f#1@3 ~@2 a1@2 ~@2 c#2@2 ~@2 f#1@2 ~ g1@5 b1@2 ~@2 d2@2 ~@2 g1@2 ~ b1@3 ~ b1 ~@3 b1 b1@2 ~ b1 ~@3 b1]/4",
  AI: "[a1@2 ~ a1 ~@3 a1 a1@2 ~ a1@2 ~@2 f#1@5 a1@2 ~@2 c#2@2 ~@2 f#1@2 ~ g1@5 b1@2 ~@2 d2@2 ~@2 g1@2 ~ b1@4 b1 ~@3 b1 b1@2 ~ b1@2 ~@2 b1]/4",
  AJ: "f#1@2 ~ f#1@2 ~@2 f#1 f#1@2 ~ f#1@2 d1 ~ f#1", AK: "g1@2 ~ g1 ~@3 g1!2 ~@7",
  AL: "[f#1@3 ~ g1@3 ~ a1@3 ~ a1@6 ~ a2 ~@3 a2 a1 b1 ~ c#2@4 ~]/2",
  AM: "[f#1@3 ~ g1@3 ~ a1@3 ~ a1@6 ~ a2 ~@3 a2 [f#1,a1] g1 ~ a1!2 b1 ~ a1]/2", AN: "d1 ~@7",
})).s("gm_synth_bass_1").gain(0.35)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  ~ A@4 B C D E F D G H I J K L B D B M N@2 O@2 P@2 Q@2 N@2 O@2 P@2 Q@2 B C D E F D G H I J K R B D B M S@2 O@2 P@2 Q@2
  N@2 O@2 P@2 T@5 U@4 V W X@3 B C D E F D G H I J K R B D B Y@4 U@4 V W X@3 ~@2 Z@2 O@2 P@2 Q@2 N@2 O@2 P@2 Q@2 N@2 O@2
  P@2 Q@2 AA@2 AB@2 P@2 AC@2 AD
>`.pickRestart({
  A: "[[b3,d4,e4,g4]@3 ~ [f#4,g4,g#4] ~@3 [g3,b3]@4 [f#3,a3]@2 ~ e3@5 f#3@2 ~ [g3,b3]@5 a3@2 ~ e3@5 [f#3,a3]@2 ~ [g3,b3]@5 a3@2 ~ [e3,g3]@15 ~@2, ~@2 [a3,d4] ~ d4@28, ~@15 g3@4 ~ a3 ~@7 f#3 ~@2 g3@4 ~@9 f#3 ~@19]/4", // Em7 G F#m G F#m G Em D5
  B: "[a3,d4,f#4]", C: "[c4,e4,g4], f4 ~@15", D: "[b3,d4,g4]", E: "[a3,d4,f#4] [a3,c#4,e4]", F: "~@3 a4, [a3,d4,f#4]",
  G: "[f#4,a4,d5] [e4,a4,c#5]", H: "[c#4,e4,a4] [d4,f#4,b4]", I: "[d4,f#4,a4]", J: "e4@3 e4, [g4,c5]", K: "[d4,g4,b4]",
  L: "[a3,d4,f#4]@8 [a3,c#4,e4]@7 ~", M: "[b3,e4,g4]@8 [c#4,e4,a4]@7 ~, ~@8 g#4 ~@7",
  N: "[[b3,d4,g4]@4 [a3,d4,f#4]@4 [f#3,a3,d4]@4 [g3,b3,d4]@9 ~@3 b3@7 ~, ~@23 [g3,d4]@8 ~, ~@23 c4@2 ~@7]/2", // G D G G5
  O: "[[g3,b3,d4]@8 [g3,b3,d4]@4 [a3,c#4,e4]@19 ~]/2", P: "[[b3,d4,g4] [a3,d4,f#4] [f#3,a3,d4] [g3,b3,d4]@5]/2",
  Q: "[[a3,d4,f#4]@4 [b3,d4,g4]@4 [a3,d4,f#4]@4 [a3,c#4,e4]@12 [a3,c#4,f#4] [b3,d4] ~ [c#4,e4]@5]/2", // D G D A F#m Bm C#m
  R: "[a3,d4,f#4]@4 [a3,c#4,e4]@3 ~", // D A
  S: "[[b3,d4,g4]@3 ~ [a3,d4,f#4]@4 [f#3,a3,d4]@4 [g3,b3,d4]@9 ~@3 b3@7 ~, ~@23 [g3,d4]@8 ~, ~@23 c4@2 ~@7]/2", // G D G G5
  T: "[[a3,d4,f#4]@4 [b3,d4,g4]@4 [a3,d4,f#4]@4 [a3,c#4,e4]@12 [a3,c#4,f#4] [b3,d4] ~ [c#4,e4]@4 [a3,d4,f#4]@5 [a3,c#4,e4]@2 ~@9 [g3,c4,e4]@5 [g3,b3,d4] ~@10 [a3,b3,d4,g4]@16 ~]/5", // D G D A F#m Bm C#m D …
  U: "[[d4,f#4]@7 ~ [c#4,e4]@5 ~@2 [a3,d4,f#4]@5 [a3,c#4,e4] ~@10 [g3,c4,e4]@5 [g3,b3,d4] ~@10 [a3,b3,d4,g4]@17, a3@13 ~@51]/4", // D C#m D A C G
  V: "[d4,f#4]@7 ~ [c#4,e4]@6 ~@2, a3@7 ~", W: "[f#3,a3,d4]@15 ~", X: "[g3,a3,d4]/3",
  Y: "[[b3,e4,g4]@8 [c#4,e4,a4]@7 [a3,d4,f#4]@4 ~ [a3,c#4,e4]@2 ~@9 [g3,c4,e4]@5 [g3,b3,d4] ~@10 [a3,b3,d4,g4]@16 ~, ~@8 g#4 ~@55]/4", // Em A D A C G
  Z: "[[b3,d4,g4]@4 [a3,d4,f#4]@4 [f#3,a3,d4]@4 [g3,b3,d4]@9 ~@3 b3@7 ~, ~@23 [g3,d4]@9, ~@23 c4@2 ~@7]/2", // G D G G5
  AA: "[[b3,d4,g4]@4 [a3,d4,f#4]@4 [f#3,a3,d4]@4 [g3,b3,d4]@11 ~ b3@8, ~@23 [g3,d4]@9, ~@23 c4@2 ~@7]/2", // G D G G5
  AB: "[[a3,d4,f#4]@4 b3@3 ~ [g3,a3,f#4]@4 [a3,c#4,e4]@20, ~ [d4,g4]@2 ~@5]/2", // D A G5
  AC: "[[a3,d4,f#4]@3 ~ [b3,d4,g4]@3 ~ [a3,d4,f#4]@4 [a3,c#4,e4]@17 ~@3]/2", AD: "[d4,f#4,a4,d5]@3 ~@13, c#5 ~@15",
})).s("gm_epiano2").gain(0.35)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~ A@4 B C D E F@3 G H@4 I@3 J K@2 L@2 M@2 N@2 K@2 O@2 M@2 P@2 B C D E F@3 G Q@4 I@3 J K@2 O@2 M@2 N@2 K@2 R@2 M@2 P@2
  ~@2 S@2 ~ T@3 U@4 B C D E F@3 G H@4 I@3 V ~@2 W@2 ~ T@3 U@4 ~@2 K@2 O@2 M@2 P@2 K@2 L@2 M@2 P@2 K@2 X@2 M@2 P@2 K@2
  R@2 M@2 P@2 ~
>`.pickRestart({
  A: "[~@47 a3@17, d3]/4", B: "f#3", C: "g3", D: "b3", E: "a3", F: "[f#4@15 ~ g4@17 ~@7 [c#4,c#5]@8, [d4,d5]@5 ~]/3",
  G: "[a3,a4] [b3,b4]", H: "[[f#4,a4]@16 g4@32 f#4@8 [c#4,e4]@7 ~, d4@7 ~, ~@16 e4@15 ~@33]/4",
  I: "[[f#4,a4]@16 b4@16 ~@8 f#5@7 ~, d5@23 ~, ~@8 g4@7 ~ [f#4,a4]@7 ~]/3", J: "[e4,g4,b4,g5] [c#4,e4,a4,a5]",
  K: "[[b4,g5]@3 ~ [a4,f#5]@7 ~ [b4,d5,g5]@10 ~@10, d5@11 ~@21]/2", // Em D G
  L: "[[a4,f#5]@3 ~ [b4,g5]@4 ~@5 e5@11 ~@8, d5@11 ~ c#5@11 ~@9, ~@8 f#5@3 ~@21, ~@9 a4@15 ~@8]/2", // D Em
  M: "[[b4,g5]@3 ~ [a4,f#5]@7 ~ [b4,d5,g5]@9 ~@11, d5@11 ~@21]/2", // Em D G
  N: "[[a4,f#5]@3 ~ [b4,g5]@3 ~ [a4,f#5]@3 ~@2 e5@8 ~@11, d5@11 ~ [a4,c#5]@8 ~@12]/2", // D Em D A
  O: "[[a4,f#5]@3 ~ [b4,g5]@4 ~@5 [c#5,e5]@11 ~@8, d5@11 ~@21, ~@8 f#5@3 ~@21, ~@9 a4@15 ~@8]/2", // D Em C#m
  P: "[[a4,f#5]@3 ~ [b4,g5]@3 ~ [a4,f#5]@3 ~ [a4,c#5,e5]@8 ~@12, d5@11 ~@21]/2", // D Em D A
  Q: "[[f#4,a4]@16 g4@32 f#4@8 [c#4,e4]@7 ~, d4@7 ~, ~ e4 ~@2]/4", // F#m C#m
  R: "[[a4,f#5]@3 ~ [b4,g5]@4 f#5@3 ~ [c#5,e5]@11 ~@9, d5@11 ~@21, ~@8 a4@15 ~@9]/2", // D Em C#m
  S: "[g3@15 ~ f#3@7 ~ [e3,c#4]@7 ~, a3@15 ~, d4@23 ~@9]/2", // C#m
  T: "[~@15 g3@16 ~ f#3@7 ~ [e3,c#4]@8, ~@5 a3@11, ~@15 d4@25 ~@8]/3", U: "[f#3@15 ~ g3@48, [a3,d4]]/4",
  V: "[e4,g4,b4,g5] [c#4,a4,a5]", W: "[g3@14 ~@2 f#3@7 ~ [e3,c#4]@7 ~, a3@15 ~, d4@23 ~@9]/2",
  X: "[[a4,f#5]@3 ~ [b4,g5]@4 ~@4 [c#5,e5]@11 ~@9, d5@11 ~@21, ~@8 f#5@3 ~@21, ~@9 a4@15 ~@8]/2", // D Em C#m
})).s("gm_string_ensemble_2").gain(0.16).pan(0.3)

// chords · muted trumpet · "MT TRUMPET"
const muted_trumpet = note("<~@68 A@3 ~ B@3 ~@21 C@3 ~ B@3 ~@39 D E>".pickRestart({
  A: "[~@8 [c#5,f#5] [d5,g5] ~ [e5,a5] [f#5,a5] [g5,b5] ~ [f#5,a5,d6]@5 [e5,a5,c#6] ~@10 [e5,g5,c6]@5 [d5,g5,b5] ~@11]/3", // F#5 G5 A5 F#m G D A C …
  B: "[~@15 [f#5,a5,d6]@5 [e5,a5,c#6] ~@10 [e5,g5,c6]@5 [d5,g5,b5] ~@11]/3", // D A C G
  C: "[~@8 f#5 g5 ~ a5!2 b5 ~ [f#5,a5,d6]@4 ~ [e5,a5,c#6] ~@10 [e5,g5,c6]@5 [d5,g5,b5] ~@11]/3", // D A C G
  D: "~@8 f#5 g5 ~ a5!2 b5 ~ a5", E: "[f#5,a5,d6] ~@7",
})).s("gm_muted_trumpet").gain(0.4).pan(0.3)

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

// drums · snare
const snare = s("sd").struct("<~@5 A@15 B A@31 B A@26 ~@2 A@15 C A@10 ~@3 D A@31 E F>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@6 x!2 ~@2 x", C: "~@4 x ~@6 x!2 ~@3", D: "~@11 x!2 ~@3", E: "~@4 x ~@3 x ~@3 x!2 ~ x",
  F: "x",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct(`<
  A B@4 C@16 D E D E D E D E D E D E D E D E C@16 D E D E D E D E D E D E D E D E C@11 F C@26 G H I J D E D E D E D E D
  E D E D E D E D E D E D E D E D E D E D E D E ~
>`.pickRestart({
  A: "~@12 x!2 ~@2", B: "x ~@3 x ~@3 x ~@2 x!2 ~@3", C: "x ~@2 x ~@3 x!2 ~@2 x ~@3 x", D: "x ~@3 x!2 ~ x!3 ~@2 x!2 ~ x",
  E: "x ~@2 x!3 ~ x!3 ~ x!3 ~ x", F: "x ~@2 x ~@3 x!2 ~@2 x ~@4", G: "x ~@3 x ~@2 x!3 ~@2 x ~@3",
  H: "x ~@3 x ~@3 x ~@3 x ~@2 x", I: "x ~@3 x ~@2 x!2 ~@3 x ~@2 x", J: "x!2 ~@2 x ~@3 x ~@3 x!2 ~ x",
})).gain(0.25)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@21 A B A B A B A B A B A B A B A B ~@16 A B A B A B A B A B A B A B A B ~@38 C D E F A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "~ x ~ x ~@7 x ~@4", B: "~ x ~@14", C: "~ x ~ x ~ x ~@5 x ~ x ~ x", D: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2",
  E: "~ x ~ x ~ x ~@3 x ~ x ~ x ~@2", F: "~@3 x ~ x ~ x ~ x ~ x ~@4",
})).gain(0.15)

// drums · low tom
const low_tom = s("lt").struct("<~@143 x>").gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<[~@15 x] ~@79 [~@12 x!2 ~ x] ~@63>").gain(0.25)

// drums · crash
const crash = s("cr").struct(`<
  ~@5 A ~@15 A ~@7 A ~@7 A ~@15 A ~@7 A ~@6 B ~@3 B ~@8 A ~@14 B ~@3 B ~@10 A ~@7 A ~@7 A ~@7 A ~@6 C ~
>`.pickRestart({
  A: "x", B: "~@15 x", C: "~ x ~@2",
})).gain(0.4)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~ A B A B C D@5 C D@3 C D C D C D E@16 C D@5 C D@3 C D C D C D E@16 C D@5 C D C D C D C D@5 C D@3 C D C D C D C D@5 C
  D C D F G@3 E@32 ~
>`.pickRestart({
  A: "~@4 x ~@2 x!2 ~@3 x ~@2 x", B: "~@4 x ~@2 x ~@4 x ~@2 x", C: "~ x!3", D: "~ x ~ x", E: "~@7 x ~@7 x", F: "~ x",
  G: "x!2",
})).gain(0.4)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct(`<
  ~@5 A ~ B ~ B ~ A ~ B ~ A ~ A ~ A ~@17 A ~ B ~ B ~ A ~ B ~ A ~ A ~ A ~@17 A ~ B ~ B ~ A ~ A ~ A ~ A ~ B ~ B ~ A ~ B ~
  A ~ A ~ A ~ A ~ B ~ B ~ A ~ A ~@4 C ~@33
>`.pickRestart({
  A: "~@7 x ~@8", B: "~@7 x!2 ~@7", C: "~ x ~@14",
})).gain(0.15)

// drums · shaker
const shaker = s("sh").struct("<~ A@4 ~@64 A B ~@2 A@2 ~@22 A B ~@2 A@2 ~@4 A@4 ~@33>".pickRestart({
  A: "~ x ~ x", B: "~@5 x ~@6 x ~@3",
})).gain(0.4)

// drums · rim
const rim = s("rim").struct("<~ A@4 ~@64 A@2 ~@2 A@2 ~@22 A@2 ~@2 A@2 ~@4 A@4 ~@33>".pickRestart({
  A: "~ x ~ x",
})).gain(0.4)

stack(
  bass, epiano2, string_ensemble_2, muted_trumpet, kick, snare, hihat, hihat_soft, low_tom, open_hat, crash, tambourine,
  tambourine_soft, shaker, rim
)

More by Madonna