Strudelify
Over and Over cover art

1984 · Like a Virgin

Over and Over

Madonna

KeyC majorTempo137 bpm
0:00/0:00
// Over and Over — Madonna
// 137 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 152 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(137/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · synth bass 1 · "Bass"
const bass = note(`<
  A B C D E F G H I J K D L M N O P Q R S T U N V W X R Y Z H AA AB C D E F G H P J K D T M N O P Q R S T U N AB W X R F
  Z H AC AD C AE AF AG AH AI P J K D T M N AJ ~@12 Z H AA AB C D E F G H I J K D T M N AJ P Q R S T U N V W X AK AL Z AI
  AM AD AN AE AO AG G AI AP AQ AR AE L M N O P Q R AS T U N AB W X R F Z H AA AB
>`.pickRestart({
  A: "c2 ~ c2@2 c2 ~ c2@2 c2@2 c2@2 c2@2 c2@2", B: "a#1 ~ a#1@2 a#1@2 f1 ~ f1@2 f1@2 f1@2 f1 ~", C: "c2!8",
  D: "a#1 ~ a#1@2 a#1@2 f1@2 f1 ~ f1@2 f1@2 f1@2", E: "c2 ~ c2@2 c2@2 c2@2 c2@2 c2@2 c2@2 c2@2",
  F: "a#1@2 a#1 ~ a#1@2 f1@2 f1@2 f1 ~ f1@2 f1@2", G: "c2@2 c2@2 c2@2 c2@2 c2@2 c2@2 c2 ~ c2@2",
  H: "a#1@2 a#1@2 a#1 ~ f1@2 f1@2 f1@2 f1 ~ f1@2", I: "c2@2 c2@2 c2@2 c2@2 c2@2 c2@2 c2@2 c2 ~",
  J: "a#1@2 a#1@2 a#1@2 f1 ~ f1@2 f1@2 f1@2 f1@2", K: "c2@2 c2@2 c2@2 c2@2 c2 ~ c2@2 c2@2 c2@2",
  L: "c2@2 c2@2 c2@2 c2@2 c2@2 c2 ~ c2@2 c2@2", M: "a#1@2 a#1 ~ a#1@2 f1@2 f1@2 f1@2 f1@2 f1@2",
  N: "c2@2 c2@2 c2 ~ c2@2 c2@2 c2@2 c2 ~ c2@2", O: "a#1@2 a#1@2 a#1 ~ f1@2 f1@2 f1@2 f1@2 f1 ~",
  P: "c2@2 c2@2 c2@2 c2 ~ c2@2 c2@2 c2@2 c2 ~", Q: "a#1!3 f1!5", R: "c2 ~ c2@2 c2@2 c2@2 c2 ~ c2@2 c2@2 c2@2",
  S: "a#1 ~ a#1@2 a#1@2 f1@2 f1@2 f1@2 f1@2 f1@2", T: "c2@2 c2 ~ c2@2 c2@2 c2@2 c2 ~ c2@2 c2@2",
  U: "a#1@2 a#1@2 a#1@2 f1@2 f1@2 f1@2 f1 ~ f1@2", V: "a#1@2 a#1@2 a#1@2 f1@2 f1@2 f1@2 f1@2 f1 ~",
  W: "c2@2 c2@2 c2@2 c2 ~ c2@2 c2@2 c2@2 c2@2", X: "a#1@2 a#1@2 a#1@2 f1@2 f1 ~ f1@2 f1@2 f1@2",
  Y: "a#1@2 a#1@2 a#1@2 f1@2 f1@2 f1 ~ f1@2 f1@2", Z: "c2@2 c2 ~ c2@2 c2@2 c2@2 c2@2 c2@2 c2@2",
  AA: "c2@2 c2@2 c2 ~ c2@2 c2@2 c2@2 c2@2 c2 ~", AB: "a#1@2 a#1@2 a#1@2 f1 ~ f1@2 f1@2 f1@2 f1 ~",
  AC: "a#1@2 a#1@2 a#1 ~ a#1@2 a#1@2 a#1@2 a#1@2 a#1@2", AD: "f1@2 f1@2 f1@2 f1 ~ f1@2 f1@2 f1@2 f1 ~",
  AE: "g1 ~ g1@2 g1@2 g1@2 g1 ~ g1@2 g1@2 g1@2", AF: "a#1 ~ a#1@2 a#1@2 a#1@2 a#1@2 a#1 ~ a#1@2 a#1@2",
  AG: "f1@2 f1 ~ f1@2 f1@2 f1@2 f1 ~ f1@2 f1@2", AH: "g1@2 g1@2 g1@2 g1@2 g1@2 g1@2 g1 ~ g1@2",
  AI: "g1@2 g1@2 g1 ~ g1@2 g1@2 g1@2 g1 ~ g1@2", AJ: "a#1@2 a#1@2 a#1 ~ f1@2 f1@2 f1@2 f1@2 f1@2",
  AK: "a#1 ~ a#1@2 a#1@2 a#1@2 a#1 ~ a#1@2 a#1@2 a#1@2", AL: "f1@2 f1@2 f1@2 f1@2 f1@2 f1 ~ f1@2 f1@2",
  AM: "a#1@2 a#1@2 a#1 ~ a#1@2 a#1@2 a#1@2 a#1@2 a#1 ~", AN: "g1!8",
  AO: "a#1 ~ a#1@2 a#1@2 a#1@2 a#1@2 a#1@2 a#1@2 a#1@2", AP: "a#1@2 a#1@2 a#1@2 a#1 ~ a#1@2 a#1@2 a#1@2 a#1 ~",
  AQ: "f1@2 f1@2 f1@2 f1 ~ f1@2 f1@2 f1@2 f1@2", AR: "g1@2 g1@2 g1@2 g1@2 g1 ~ g1@2 g1@2 g1@2",
  AS: "a#1 ~ a#1@2 a#1@2 f1@2 f1@2 f1 ~ f1@2 f1@2",
})).s("gm_synth_bass_1").gain(0.49)

// chords · acoustic guitar nylon · "Ac Guitar"
const acoustic_guitar_nylon = note(`<
  ~@8 A B A C A B A C A B A C A B A C A B A C D E D E D E D E A B A C A B A C A B A C A B A C D E D E D E D E F G H I F
  G H J ~@24 A B A C A B A C A B A C A B A C D E D E D E D E F G H I F G H J F G H I F G H J D E D E D E D E D E D E D E
  D E ~@4
>`.pickRestart({
  A: "[g3,c4,e4] ~@2 [g3,c4,e4]@4 ~", B: "[f3,a3,c4] ~@2 [f3,a#3,d4]@4 ~", C: "[f3,a#3,d4] ~@2 [f3,a3,c4]@4 ~",
  D: "[g3,c4,e4]@5 ~ [g3,c4,e4]@4 [g3,c4,e4]@2 [g3,c4,e4]@2 ~@2", // C
  E: "[f3,a#3,d4]@5 ~ [a3,c4,f4]@4 [a3,c4,f4]@2 [a3,c4,f4]@2 [a3,c4,f4]@2", F: "[f3,a#3,d4]@5 ~ [f3,a#3,d4] ~",
  G: "[a3,c4,f4]@5 ~ [a3,c4,f4] ~", H: "[g3,c4,e4]@5 ~ [g3,c4,e4] ~", I: "[g3,b3,d4]@5 ~ [g3,b3,d4] ~",
  J: "[g3,c4,d4,f4]@5 ~ [g3,c4,d4,f4] ~", // Gsus4
})).s("gm_acoustic_guitar_nylon").gain(0.42)

// chords · synth strings 1 · "Strings"
const synth_strings_1 = note(`<
  ~@29 A ~ A ~ A ~ A ~@17 A ~ A ~ A ~ A ~@49 A ~ A ~ A ~ A ~@17 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@4
>`.pickRestart({
  A: "[d5,f5,a#5]!3 [c5,f5,a5]@2 [c5,f5,a5] ~@2", // A# F
})).s("gm_synth_strings_1").gain(0.29)

// chords · overdriven guitar · "Overdrive" · A# F A# F A# F
const overdriven_guitar = note(`<
  ~@27
  [[f3,a#3,d4]@2 [f3,a#3,d4] ~ [f3,a#3,d4] ~ [a3,c4,f4]@3 ~ [a3,c4,f4] ~@5]
  ~@23
  [[f3,a#3,d4]@2 [f3,a#3,d4] ~ [f3,a#3,d4] ~ [a3,c4,f4]@3 ~ [a3,c4,f4] ~@5]
  ~@55
  [[f3,a#3,d4]@2 [f3,a#3,d4] ~ [f3,a#3,d4] ~ [a3,c4,f4]@3 ~ [a3,c4,f4] ~@5]
  ~@44
>`).s("gm_overdriven_guitar").gain(0.24)

// other · blown bottle · "Bottle"
const blown_bottle = note(`<
  ~@8 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 C D E F C
  D G H ~@24 A B A B A B A B A B A B A B A B A B A B A B A B C D E F C D G H C D E F C D G H A B A B A B A B A B A B A B
  A B A B A B
>`.pickRestart({
  A: "c4!2 c5 c4!2 c5 c4!2", B: "c5 c4 c5 c4!2 [g4,g5] [a4,a5] [c5,c6]", C: "a#3 a#5 f5 a#4 a#3 a#5 f5 a#4",
  D: "c4 c6 f5 c5 c4 c6 f5 c5", E: "c4 c6 g5 c5 c4 c6 g5 c5", F: "c4 d6 g5 b4 d6 d5 g5 d5",
  G: "g4 g5 g4 g5 g4 g5 g4 g5", H: "g4 g5 g4 g5 g4 [g4,g5] [a4,a5] [c5,c6]",
})).s("gm_blown_bottle").gain(0.24)

// other · orchestra hit · "Orch Hit"
const orchestra_hit = note("<~@7 A ~@59 B ~ C D B ~ B D B ~@3 E ~ C ~ C ~@7 C ~@60>".pickRestart({
  A: "[g3,g4] ~ [g3,g4] ~@2 [g3,g4] [a3,a4] [c4,c5]", B: "~@2 [g3,g4] ~@2 [g3,g4] [a3,a4] [c4,c5]",
  C: "~@5 [g3,g4] [a3,a4] [c4,c5]", D: "~@6 [g3,g4] ~", E: "[g3,g4] ~@2 [g3,g4] ~ [g3,g4] [a3,a4] [c4,c5]",
})).s("gm_orchestra_hit").gain(0.29)

// drums · kick
const kick = s("bd").struct(`<
  ~@8 A B A B A B A B A B A B A B A B A B A B C B C B C B C B A B A B A B A B A B A B A B A B C B C B C B C B C B C B C
  B C 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 C B C B C B C B C B C B C B C B
  C B C B C B C B C B C B C B C B C B C B C B C B C B C B
>`.pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x ~@2 x!3 ~@2", C: "x ~@3 x!2 ~@2",
})).gain(0.49)

// drums · snare
const snare = s("sd").struct(`<
  ~@8 A@15 B A@11 C A@11 B A@11 C A@7 C A@3 B A@7 B A@7 D A@3 D A@11 B A@11 C A@7 C A@7 E A@7 C A@12
>`.pickRestart({
  A: "~ x ~ x", B: "~ x!2 ~@2 x!2 ~", C: "~@2 x ~@3 x!2", D: "~ x!2 ~@2 x!3", E: "~@2 x ~@2 x!3",
})).gain(0.49)

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

// drums · hihat
const hihat = s("hh").struct(`<
  ~@8 A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B C A@2 B A@3 B C A@2 B
  A@3 B C A@2 B C A@2 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B
>`.pickRestart({
  A: "x!8", B: "x!7 ~", C: "~ x!7",
})).gain(0.42)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@11 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
  A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A
>`.pickRestart({
  A: "~@7 x",
})).gain(0.42)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@19 A ~@3 B C ~@2 A ~@7 D ~@7 A ~@3 B C ~@2 A ~@7 D ~@7 D ~@3 E ~@7 E F ~@6 E ~@3 E ~@7 A ~@3 B C ~@2 A ~@7 D ~@7 D
  ~@7 D ~@3 E ~@3 E ~@3 E ~@3 E ~@4
>`.pickRestart({
  A: "~@5 x!2 ~", B: "~@14 x!2", C: "x", D: "~ x ~ x ~@4", E: "~@2 x!3 ~ x ~@9", F: "~ x!2 ~@5",
})).gain(0.42)

// drums · high tom · soft notes
const high_tom_soft = s("ht").struct("<~@80 [~@5 x!2 ~] ~@70 [~@2 x!3 ~ x ~@9]>").gain(0.21)

// drums · crash
const crash = s("cr").struct("<~@68 A ~@7 A ~@7 A ~@3 A ~@63>".pickRestart({
  A: "x",
})).gain(0.42)

// drums · cowbell
const cowbell = s("cb").struct(`<
  ~@68 A ~@7 A ~@7 B C B ~ B C D E ~@40 B C B ~ B C B ~ B C B ~ B C B ~ B C ~@2
>`.pickRestart({
  A: "~@2 x!3 ~@11", B: "~@2 x!3 ~@3 x ~@3 x ~@3", C: "x!4", D: "~@2 x!3 ~ x!3 ~ x!3 ~@3", E: "~@2 x ~@2 x!2 ~",
})).gain(0.42)

// drums · cowbell · soft notes
const cowbell_soft = s("cb").struct("<~@68 [~@2 x!2] ~@7 [~@2 x!2] ~@73 [~@2 x!3 ~@3 x ~@3 x ~@3] ~>").gain(0.28)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@82 A ~@3 A ~@47 A ~@3 A ~@3 A ~@3 A ~@3 A ~>".pickRestart({
  A: "x",
})).gain(4.95)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@8 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 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 B A B A B A B A B A B
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x!3",
})).gain(2.14)

// drums · claves
const claves = s("clave:2").struct("<~@11 [~@5 x!2 ~] ~@140>").gain(2.07)

// drums · woodblocks
const woodblocks = s("woodblock:4").struct("<~@68 [x!4]!24 ~@40 [x!4]!20>").gain(0.61)

stack(
  bass, acoustic_guitar_nylon, synth_strings_1, overdriven_guitar, blown_bottle, orchestra_hit, kick, snare, low_tom,
  hihat, mid_tom, open_hat, high_tom, high_tom_soft, crash, cowbell, cowbell_soft, vibraslap, cabasa, claves, woodblocks
)

More by Madonna