Strudelify
Oh Father cover art

1990 · Like a Prayer

Oh Father

Madonna

KeyF majorTempo117 bpm
0:00/0:00
// Oh Father — Madonna
// 117 bpm, 12/8, key F major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 94 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(117/6)

// 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 · "Piano (R.H.)"
const piano = note(`<
  A B C D A E C F G H I J K L M N O P Q N O P Q R H I J S L M N O P Q N O P Q T U V W X U V W T U V W X U V W Y H I J K
  L M N O P Q N O P Q N O P Q N O P Q N O P Q N O P Q N O P ~@6
>`.pickRestart({
  A: "[f3,f4] [g3,g4] [bb3,bb4] [a3,a4]", B: "e3@2 e3 e3@2 g3 e3@6, e4", C: "[f4,d5]@3 [g4,e5]@2 [e4,c5]@4 ~ [d4,b4]@2",
  D: "a4 g4", E: "[e3,e4]", F: "[g3,g4]", G: "[a4,c5]@4 f4 a4 g4@4 [g3,c4,e4] c4",
  H: "[f3,bb3,d4]@8 [f3,bb3,d4]@3 ~ [f3,a3,c4]@12", I: "[f3,a3,c4] [g3,c4,e4]",
  J: "[g3,bb3,eb4]@6 [f3,bb3,d4]@3 ~ bb3 f3", K: "~@3 c4 f4@2 [e4,g4]@6", L: "~ a3 d4@2 a3 d4 bb3 d4 [f4,a4]@2 g4 f4",
  M: "[g3,c4,e4] [a3,c4,f4]@5", N: "f4 g4 bb4 a4, [bb3,eb4] [c4,f4]", O: "[g3,c4,e4]",
  P: "[f4,d5]@3 [g4,e5]@2 ~@5 [d4,b4]@2, [f3,bb3] [f3,a3], ~@5 [e4,c5]@4 ~@3", Q: "[g3,b3,g4]",
  R: "f3@2 a3@2 f3 a3 [e3,g3]@6, c4", S: "~@2 f4 [e4,g4]@3, ~ c4 ~@2", T: "c4", U: "[g3,d4] [c3,g3]",
  V: "[g3,d4] [e3,b3]", W: "[f3,c4] [c3,g3]", X: "[a3,c4]", Y: "[c4,f4,a4] [c4,e4,g4]",
})).s("gm_piano").gain(0.35)

// chords · piano · "Piano (R.H.)" · soft notes · G Eb5 F5 C Dm C G Bb5 …
const piano_soft = note(`<
  ~@88
  [[g3,b3,g4]]
  [f4 g4 bb4 a4, [bb3,eb4] [c4,f4]]
  [[g3,c4,e4]]
  [[f4,d5]@3 [g4,e5]@2 ~@5 [d4,b4]@2, [f3,bb3] [f3,a3], ~@5 [e4,c5]@4 ~@3]
  [[g3,b3,g4]]
  ~
>`).s("gm_piano").gain(0.07)

// chords · piano · "Piano (L.H.)"
const piano_2 = note(`<
  A B C D A B C E F G H I J K L M N C O P N Q O R G H I J S L M N C O P N Q O T ~@3 U V W X U V W X U V W X R G H I Y S
  L M N C O P N Q O M N C O P N Q O M N C O P N Q O M N C ~@6
>`.pickRestart({
  A: "[eb2,bb2,eb3] [f2,c3,f3]", B: "[c2,g2,c3]", C: "~ f3 bb3@4 ~ f3 a3@4, bb2 a2", D: "~@2 d3 a3@2 d3 g3@6, g2",
  E: "~@2 f3 a3@3 b3@6, g2", F: "~@2 f3 a3@3 ~@2 c3@4, [f2,c3] [c2,g2]", G: "[bb2,f3] [d2,d3]", H: "[f2,c3] [c2,g2,c3]",
  I: "[eb2,bb2]@2 ~ bb2, ~ bb1", J: "~ c3 f3@4 c2@6, f2 ~", K: "d2", L: "[c2,c3]@2 [c2,c3]@4 ~ c3!5",
  M: "[eb2,bb2] [f2,c3]", N: "[c2,g2]@5 c2 [c2,g2]@6", O: "g2@5 g2 g2@6", P: "eb2 f2",
  Q: "~ f3 bb3@3 c3 ~ f3 a3@4, bb2@5 ~ a2@6", R: "[f2,c3] [c2,g2]", S: "[d2,d3]", T: "a3", U: "[a2,e3]",
  V: "[g2,d3] [c3,g3]", W: "[g2,d3] [e2,e3]", X: "[f2,f3] [c3,g3]", Y: "~ c3 f3@4 [c2,c3]@6, f2 ~",
})).s("gm_piano").gain(0.35)

// chords · piano · "Piano (L.H.)" · soft notes · C5
const piano_soft_2 = note(`<
  ~@88
  [g2@5 g2 g2@6]
  [eb2 f2]
  [[c2,g2]@5 c2 [c2,g2]@6]
  [~ f3 bb3@3 c3 ~ f3 a3@4, bb2@5 ~ a2@6]
  [g2@5 g2 g2@6]
  ~
>`).s("gm_piano").gain(0.14)

// other · acoustic guitar nylon · "Guitar"
const acoustic_guitar_nylon = note(`<
  ~@13 A B ~@23 C D C E C F G E C D C E C F G E H I ~@20 J K L ~ J K L ~ J K L ~ J ~ L ~@3
>`.pickRestart({
  A: "d3 a3 d4 f3 a3 d4 bb3 d4 f4@2 g4 f4", B: "[g3,c4,e4] ~ [a3,c4,f4]@10",
  C: "[b4,b5]@3 [g4,g5]@3 [e4,e5]@3 ~ [g4,g5] [a4,a5]", D: "[b4,b5] [g4,g5] [e4,e5] ~",
  E: "[a4,a5] [f4,f5] [e4,e5] [c4,c5]", F: "[b4,b5]@3 ~@2 d4 [e4,e5]@3 ~@3, ~ [g4,g5] ~@2",
  G: "[b4,b5]@3 ~@2 d4 [e4,e5]@3 ~ [g4,g5] [a4,a5], ~ [g4,g5] ~@2", H: "f4@3 e4 f4 e4", I: "d4 ~", J: "~@6 g4 a4",
  K: "bb4 bb5 g5 ~ c6 a5 ~ bb5 g5 ~ g5 f5", L: "g5",
})).s("gm_acoustic_guitar_nylon").gain(0.2)

// bass · acoustic bass · "Ac. Bass"
const bass = note(`<
  ~@4 A B C D E ~@6 A F C G A F H G E I J K L M N A F C G A F H G ~@8 O P Q E R S T U E I E K L V N A F C G A F H G A F
  C G A F H G A F C G A F H G A F C ~@6
>`.pickRestart({
  A: "eb2 f2", B: "c2", C: "bb2 a2", D: "g2", E: "f2 c2", F: "c2@5 c2 c2@6", G: "g2@5 g2 g2@6", H: "bb2@5 c3 a2@6",
  I: "bb1@5 c2 d2@6", J: "f2@12 c2@9 ~ d2@2", K: "eb2 bb1", L: "f2@5 f2 c3@6", M: "d2@5 a1 d2@6", N: "c2 c2@5",
  O: "a2@5 e2 a2@6", P: "g2 c2", Q: "g2 e2", R: "a2@5 e2 a2@5 e2", S: "g2@5 d2 c2@6", T: "g2@5 g2 e2@5 e2",
  U: "f2@5 g2 c2@6", V: "d3@5 a2 d3@6",
})).s("gm_acoustic_bass").gain(0.42)

// bass · acoustic bass · "Ac. Bass" · soft notes
const bass_soft = note("<~@88 [g2@5 g2 g2@6] [eb2 f2] [c2@5 c2 c2@6] [bb2@5 c3 a2@6] [g2@5 g2 g2@6] ~>")
  .s("gm_acoustic_bass").gain(0.14)

// chords · string ensemble 1 · "Strings H"
const string_ensemble_1 = note(`<
  ~@3 A B C D@2 E ~@6 F G ~@2 F H I J ~@7 K L ~@2 K L ~@25 K L ~@2 K L ~@2 K L ~@2 K M ~ N O P ~ N O Q ~ N O P ~ R O Q
  ~@3
>`.pickRestart({
  A: "a4@6 g4@5 ~", B: "f4@5 ~ g4@5 ~ bb4@5 ~ a4@5 ~", C: "e4@5 ~@2 e4 g4!2 c5@2",
  D: "[d5@3 e5@2 g5@15 ~ [b4,g5]@2 [a4,d5]]/2", E: "a4@6 g4@5 ~, c5@19 ~@5", F: "eb4 d4 c4 bb3 a3 g3 f3@6", G: "g3",
  H: "g3@17 ~ g3@2 bb3@2 c4@2", I: "bb3@5 ~ a3@5 ~", J: "g3@5 ~@7", K: "eb4 d4 c4 bb3 a3 g3 [f3,c5]@6, bb4 ~",
  L: "~@6 e4@5 ~, [g3,g4]", M: "~@6 e4@5 ~, [g3,g5]", N: "~@6 g4 a4", O: "bb4 c5", P: "g4", Q: "g5", R: "~@6 d5 c5",
})).s("gm_string_ensemble_1").gain(0.16)

// other · string ensemble 1 · "Strings L"
const string_ensemble_1_2 = note(`<
  A B ~@2 C D E F G ~@6 A B E F A B E F ~ H@2 I J K ~ A B E F A B E F ~@17 L@3 M K N A B E F A B E F A B E F A B E F A B
  E F A B E F ~@9
>`.pickRestart({
  A: "eb2@5 ~ f2@5 ~", B: "c2@19 ~@5", C: "eb4 d4 c4 bb3 a3 g3 f3@6, eb2@5 ~ f2@5 ~", D: "g3, c2@19 ~@5",
  E: "bb2@5 ~ a2@5 ~", F: "g2@19 ~@5", G: "f2@5 ~ c3@5 ~", H: "[bb2 f3@2 g3]/2", I: "eb3 bb2", J: "f3 g3", K: "d3",
  L: "[bb2@6 f3@12 g3@11 d3 f3@2 bb3@4]/3", M: "c4", N: "e3@3 ~ f3@20",
})).s("gm_string_ensemble_1").gain(0.24)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@88 [x ~@4 x!2 ~@4 x]!4 [x ~@4 x!2 ~@5] ~>").gain(0.14)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@14 A B@7 C ~@6 A B@3 D B@3 C ~@22 A B@3 D B@3 C B@3 D B@3 C B@3 D B@3 C B@3 ~@6
>`.pickRestart({
  A: "~@10 x!2", B: "~@3 x ~@6 x ~", C: "~ x ~@2", D: "~@3 x ~@4 x ~ x ~",
})).gain(0.35)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@88 [~@3 x ~@4 x ~ x ~] [~@3 x ~@6 x ~]!4 ~>").gain(0.14)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@14 A ~@3 A ~@3 B ~@6 A ~@3 A ~@3 B ~@15 C ~@6 A ~@3 A ~@3 B ~@3 A ~@3 D ~@3 A ~@3 B ~@3 A ~@5
>`.pickRestart({
  A: "~@10 x!2", B: "~@5 x", C: "~@3 x", D: "~@6 x ~@7 x ~@5 x ~ x!2",
})).gain(0.35)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@88 [x!12]!5 ~>").gain(0.14)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@14 A ~@3 A ~@3 B ~@6 A ~@3 A ~@3 A ~@15 B ~@6 A ~@3 A ~@3 A ~@3 A ~@3 C ~@3 A ~@3 A ~@3 A ~@5
>`.pickRestart({
  A: "~@3 x", B: "~@2 x", C: "~@2 x ~@2 x!2 ~@2 x ~@2",
})).gain(0.35)

// drums · open hat
const open_hat = s("oh").struct("<~@23 [~@11 x] ~@70>").gain(0.35)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@14 A ~@3 A ~@10 A ~@3 A ~@3 B ~@22 A ~@3 A ~@3 B ~@3 A ~@3 C ~@3 A ~@3 B ~@3 A ~@5
>`.pickRestart({
  A: "~@7 x!2 ~@3", B: "~@2 x", C: "x ~ x!2 ~@12 x ~@7",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct(`<
  ~@15 A ~ A ~ A ~ A ~@6 A ~ A ~ A ~ A ~ A ~@22 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2
>`.pickRestart({
  A: "x",
})).gain(0.35)

stack(
  piano, piano_soft, piano_2, piano_soft_2, acoustic_guitar_nylon, bass, bass_soft, string_ensemble_1,
  string_ensemble_1_2, kick, kick_soft, rim, snare, snare_soft, low_tom, hihat, hihat_soft, mid_tom, open_hat, high_tom,
  crash
)

More by Madonna