Strudelify
Like a Prayer cover art

1989 · Like a Prayer

Like a Prayer

Madonna

KeyF majorTempo112 bpm
0:00/0:00
// Like a Prayer — Madonna
// 112 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 198 bars on a 16-step grid, each part at one level. 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 · drawbar organ · "ORGAN 1"
const drawbar_organ = note(`<
  ~@25 A B A B A C D E@2 F@4 ~@20 G H I J G H K@2 G H L M G H K@2 ~@8 G H I J G H K@2 G H L M G H K@2 ~@16 A N A N A N A
  N A C D O A N A N A C D O P Q R S P Q R S P Q R S P Q R T ~@8 U@4 V W X Y A N A N A Z D O A N A N A Z D O A N A N A Z
  D O A N A N A Z D O
>`.pickRestart({
  A: "[a3,d4,f4]", B: "[g3,c4,e4] [bb3,d4,g4]", C: "[c4,e4,g4] [e4,g4,bb4]", D: "[c4,f4,a4] [d4,f4,bb4]",
  E: "[[f4,a4,c5] [e4,g4,c5]@3]/2", F: "[d4,f4,a4]/4", G: "[bb2,bb3,d4,f4]", H: "[f2,a3,c4,f4]", I: "[c3,c4,e4,g4]",
  J: "[d3,d4,f4,a4]", K: "[c2,c4,e4,g4]/2", L: "[c3,g3,c4,e4]", M: "[d3,a3,d4,f4]", N: "[g3,c4,e4] [c4,e4,g4]",
  O: "[f4,a4,c5] [e4,g4,c5]", P: "[a4,c5,f5]@3 ~@13", Q: "[g4,c5,e5]@3 ~@13", R: "[f4,bb4,d5]@3 ~@13",
  S: "[f4,a4,c5]@3 ~@5 [f4,a4,d5]@3 ~ [f4,a4,c5]@3 ~", T: "[f4,a4,c5]@3 ~@13",
  U: "[a5,d6]!2 ~@2 [a5,d6]!2 ~ [a5,d6] ~ [a5,d6] ~ [g5,c6] [a5,d6] ~ [a5,d6] [c6,f6]", // D5 C5 D5 F5
  V: "[a5,d6]!2 ~@2 [a5,d6]!2 ~ [a5,d6] ~ [a5,d6] ~ [g5,c6] [a5,d6] ~ [a5,d6]!2", // D5 C5 D5
  W: "[b5,e6]!2 ~@2 [b5,e6]!2 ~ [b5,e6] ~ [b5,e6] ~ [b5,d6] [b5,e6] ~ [b5,e6]!2", // E5 Bm E5
  X: "[c6,f6]!2 ~@2 [c6,f6]!2 ~ [c6,f6] ~ [c6,f6] ~ [c6,e6] [c6,f6] ~ [c6,f6] [c6,e6], a3 bb3", // F5 C F5 C
  Y: "[c6,f6]!2 ~@2 [c6,f6]!2 ~ [c6,e6] ~ [c6,e6] ~ [c6,e6]!2 ~ [c6,e6]!2, c4!2", Z: "[c4,e4,g4] [d4,g4,bb4]",
})).s("gm_drawbar_organ").gain(0.24)

// bass · synth bass 1 · "SYN BASS"
const bass = note(`<
  ~@9 A B A B A B A B A B A B A B A B ~@9 C@9 D E F C@4 G H I J G K L M ~@16 G H I J G K L M N O P Q N O R ~ N O P Q N O
  R ~ G H I J G K L M G H I J G K L M S T U V W X W Y Z AA AB AC W X W Y Z AA AB AC G H I J G K L M G H I J G K L M ~@8
  C@5 D E F W X W Y Z AA AB AC W X W Y Z AA AB AC W AD W AE AF AA AB AC W AG W Y AF AA AB AC
>`.pickRestart({
  A: "d1@2 ~ d1 d1@2 ~@2", B: "d1@3 d1@3 d1@2 d1@4 ~@4", C: "d2 ~@3 c2 ~@2 d2@3 d2 ~@3 c2 ~",
  D: "e2 ~@3 e2 ~@2 bb2@3 bb2 ~@3 bb2 ~", E: "a2 ~@3 a2 ~@2 bb2@3 bb2 ~@3 bb2 ~", F: "c3 ~@3 c3 ~@2 c2@3 c2 ~@3 c2 ~",
  G: "f2@3 ~@3 f2@4 ~ f2@2 f3@2 c3", H: "c3@2 c3@2 ~@7 bb2 c3@2 g2 a2", I: "bb2@3 ~@3 bb2@4 ~ bb2@2 f3@2 a2",
  J: "a2@2 a2@2 ~@2 c3@2 d3!2 d2@2 d2@2 e2@2", K: "c3@2 c3@2 ~@7 bb2 c3@2 a2@2", L: "bb2@3 ~@3 bb2@4 ~ bb2@2 f2@2 a2",
  M: "a2@2 a2@2 ~@2 c3@2 d3!2 d2@2 d2@3 ~", N: "bb2@15 ~", O: "f2@15 ~", P: "c3@15 ~", Q: "d3@15 ~", R: "c2@15 ~",
  S: "d2@3 d3@3 d2!2 d3@2 d2 d3@2 d3 d2@2", T: "d3@3 d3@4 ~ d3 f3 d3 f3 d3@2 c3 d3",
  U: "d2@3 d2@3 c2!2 d2@2 c2!2 d2@2 c2!2", V: "d2@3 d2@3 a2!4 c3 a2 f2@2 f2 e2",
  W: "d2@3 d2@3 c2!2 d2!2 c2!2 d2@2 c2@2", X: "d2@3 d2@3 c3!2 d3@2 c3@2 a2@2 c3!2",
  Y: "d2@3 d2@3 d3!2 c3 a2 c3!2 d3@2 c3 d3", Z: "d2@3 d2@3 c2!2 d2!2 c2!2 d2 c2 c2@2",
  AA: "e2@3 e2@3 c2 e2 bb1@3 bb1@3 f2 bb1", AB: "a1@3 a1@2 a1 f2 c2 bb1@3 bb1@2 bb1 f2 bb1",
  AC: "c2@3 c2@3 c3 g2 c2@4 c2@4", AD: "d2@3 d2@2 f3 e3 d3 e3!2 d3 c3 a2@2 c3 d3",
  AE: "d2@3 d2@3 d3!2 f3 d3 f3 g3 f3@2 d3 c3", AF: "d2@3 d2@3 c2!2 d2!2 c2!2 d2@2 eb2@2",
  AG: "d2@3 d2@3 c3!2 d3@2 ~ d3 c3 a2 d3@2",
})).s("gm_synth_bass_1").gain(0.49)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~@37 A B C B C B D E F B C B G H I J K H I J K ~@16 H I J K H I J K ~@16 H I J K H I J K H I J K H I J K L M N O P Q P
  R S T U V P Q P R S T U V H I J K H I J K H I J K H I J K ~@16 P Q P R S T U V P Q P R S T U V P W P X S T U V P Y P R
  S T U V
>`.pickRestart({
  A: "~@14 d5!2", B: "d6@2 d5@2 ~@2 d5!2 ~@2 d5!2 ~@2 d5!2", C: "~@2 d5!2 ~@2 d5!2 ~@2 d5!2 ~@2 d5!2",
  D: "e6@2 e5@2 ~@2 e5!2 e6@2 e5!2 ~@2 e5!2", E: "f6@2 f5!2 ~ f5!2 ~ f6@2 f5!2 ~@2 f5!2",
  F: "f6@2 f5!2 ~@2 f5!2 e6@2 e5!2 ~@2 e5!2", G: "~@2 d5!2 ~@2 d5!2 ~@2 d5!2 ~@2 d5 ~",
  H: "~@2 [c4,f4,a4]!4 ~@2 [c4,f4,a4] ~@2 [c4,f4,a4] ~@2 [c4,f4,a4] ~", // F
  I: "~@2 [g3,c4,e4]!4 ~@2 [g3,c4,e4] ~@2 [g3,c4,e4] ~@2 [g3,c4,e4] ~", // C
  J: "~@2 [bb3,d4,f4]!4 ~@2 [bb3,d4,f4] ~@2 [bb3,d4,f4] ~@2 [bb3,d4,f4] ~", K: "[a3,c4,f4]!4 ~@4 [a3,c4,f4]!4 ~@4",
  L: "d3@3 d4@3 d3!2 d4@2 d3 d4@2 d4 d3@2", M: "d4@3 d4@4 ~ d4 f4 d4 f4 d4@2 c4 d4",
  N: "d3@3 d3@3 c3!2 d3@2 c3!2 d3@2 c3!2", O: "d3@3 d3@3 a3!4 c4 a3 f3@2 f3 e3",
  P: "d3@3 d3@3 c3!2 d3!2 c3!2 d3@2 c3@2", Q: "d3@3 d3@3 c4!2 d4@2 c4@2 a3@2 c4!2",
  R: "d3@3 d3@3 d4!2 c4 a3 c4!2 d4@2 c4 d4", S: "d3@3 d3@3 c3!2 d3!2 c3!2 d3 c3 c3@2",
  T: "e3@3 e3@3 c3 e3 bb2@3 bb2@3 f3 bb2", U: "a2@3 a2@2 a2 f3 c3 bb2@3 bb2@2 bb2 f3 bb2",
  V: "c3@3 c3@3 c4 g3 c3@4 c3@4", W: "d3@3 d3@2 f4 e4 d4 e4!2 d4 c4 a3@2 c4 d4",
  X: "d3@3 d3@3 d4!2 f4 d4 f4 g4 f4@2 d4 c4", Y: "d3@3 d3@3 c4!2 d4@2 ~ d4 c4 a3 d4@2",
})).s("gm_electric_guitar_clean").gain(0.29)

// chords · celesta
const celesta = note(`<
  ~@38 A ~ A ~ A B C D A ~ A ~ E F G H E F G H ~@16 E F G H E F G H ~@16 I J K L I J K L I J K L I J K L ~@20 I J K L I
  J K L I J K L I J K L ~@48
>`.pickRestart({
  A: "[d5,d6]@13 ~@3", B: "[e5,e6]@13 ~@3", C: "[f5,f6]@13 ~@3", D: "[f5,f6]@3 ~ [e5,e6]@3 ~", E: "[a4,c5,f5]@13 ~@3",
  F: "[g4,c5,e5]@13 ~@3", G: "[f4,bb4,d5]@13 ~@3", H: "[f4,a4,c5]@13 ~@3", I: "[a4,f5]@13 ~@3", J: "[g4,e5]@13 ~@3",
  K: "[f4,d5]@13 ~@3", L: "[f4,c5]@13 ~@3",
})).s("gm_celesta").gain(0.29)

// drums · kick
const kick = s("bd").struct(`<
  ~@9 A B A B A B A B A B A B A B A B ~@9 C@16 A@3 D A@4 ~@16 A@3 D A@4 ~@16 A@3 D A@7 D A@7 D A@3 D A@7 D A@7 D A@7 D
  A@4 C@16 A@3 D A@7 D A@7 D A@7 D A@4
>`.pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x ~@2 x ~@2 x ~ x ~@7", C: "x!4", D: "x ~@2 x!2 ~@2 x",
})).gain(0.42)

// drums · rim
const rim = s("rim").struct("<~@8 [x!4] ~@189>").gain(0.35)

// drums · snare
const snare = s("sd").struct("<~@17 A@8 ~@24 B A@8 ~@16 A@8 ~@15 C A@55 D A@3 E A F A D A F A E A@32>".pickRestart({
  A: "~ x ~ x", B: "~@10 x ~ x ~ x!2", C: "~@12 x!4", D: "~@4 x ~@7 x ~ x!2", E: "~@2 x ~ x!2 ~ x!4 ~ x ~ x!2",
  F: "~@4 x ~@7 x ~@2 x",
})).gain(0.42)

// drums · clap
const clap = s("cp").struct("<~@9 [~ x ~ x]!16 ~@125 [~ x ~ x]!48>").gain(0.42)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@8 A ~@16 A@9 B@24 ~@16 B@8 ~@16 B@16 C D@19 B@16 A@16 D@6 E@2 D@6 E@2 D@6 E@2 D@6 E@2
>`.pickRestart({
  A: "x!4", B: "x!8", C: "x!7 ~", D: "~ x!6 ~", E: "~ x!3 ~ x!3",
})).gain(0.35)

// drums · mid tom
const mid_tom = s("mt").struct("<~@49 A ~@85 B ~ C ~ B ~ C ~ B ~ C ~ B ~ C ~@48>".pickRestart({
  A: "~@12 x!3 ~", B: "~@11 x ~@4", C: "~@12 x ~ x!2",
})).gain(0.35)

// drums · open hat
const open_hat = s("oh").struct("<~@115 A@19 ~@16 B@16 A@7 ~ A@7 ~ A ~@5 A ~ A ~@5 A ~>".pickRestart({
  A: "x", B: "~ x ~ x ~ x ~ x",
})).gain(0.35)

// drums · high tom
const high_tom = s("ht").struct("<~@49 A ~@85 B C D ~ B C D ~ B C D ~ B C D ~@48>".pickRestart({
  A: "~@8 x!3 ~@5", B: "~@12 x ~ x!2", C: "~@15 x", D: "x ~@7 x ~ x!2 ~@4",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct(`<
  ~@13 A ~@3 A ~@3 A ~@3 A ~@4 B@3 ~@81 C@20 ~@32 C@6 ~ A C@6 D B ~@5 C D B ~@5 C D B
>`.pickRestart({
  A: "x", B: "x!2", C: "~@7 x", D: "~ x",
})).gain(0.35)

// drums · ride
const ride = s("rd").struct("<~@34 A ~@3 A ~@3 A ~@3 A ~@151>".pickRestart({
  A: "x",
})).gain(0.35)

// drums · tambourine
const tambourine = s("tb").struct("<~@50 A@8 ~@16 A@8 ~@16 A@16 ~@20 A@16 ~@48>".pickRestart({
  A: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2",
})).gain(0.35)

// drums · cowbell
const cowbell = s("cb").struct(`<
  ~@34 A B A B A B A B A B A B A B A B ~@100 C D C D C D C D C D C D C D C D ~@32
>`.pickRestart({
  A: "~@2 x ~ x ~ x!2 ~ x!4 ~ x ~", B: "~@2 x ~@3 x!2 ~ x!4 ~ x ~", C: "x ~@2 x ~@2 x ~ x!2 ~@4 x ~",
  D: "x ~@2 x ~@2 x ~ x!2 ~ x ~@2 x ~",
})).gain(0.35)

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

// drums · congas
const congas_2 = s("conga:33").struct(`<
  ~@114 A@3 B A@3 B A@3 B A@3 B A@3 B ~@16 A@3 B A@3 B A@3 B A@3 B ~@32
>`.pickRestart({
  A: "x ~@2 x ~@3 x", B: "x ~@5 x ~@5 x!3 ~",
})).gain(1.12)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@13 [x!16]!12 ~@173>").gain(1.78)

// drums · shaker
const shaker = s("sh").struct("<~@58 A@16 ~@8 A@16 ~@16 B@20 ~@16 B@47 C>".pickRestart({
  A: "x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x", B: "x!16", C: "x!15 ~",
})).gain(0.35)

// drums · claves
const claves = s("clave:2").struct("<~@8 [x!4]!17 ~@173>").gain(1.72)

stack(
  drawbar_organ, bass, electric_guitar_clean, celesta, kick, rim, snare, clap, hihat, mid_tom, open_hat, high_tom,
  crash, ride, tambourine, cowbell, congas, congas_2, cabasa, shaker, claves
)

More by Madonna