Strudelify
Like A Virgin cover art

1984 · Like a Virgin

Like A Virgin

Madonna

KeyE♭ minorTempo120 bpm
0:00/0:00
// Like A Virgin — Madonna
// 120 bpm, 4/4, key D# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 12 "Synth Bras" synth brass 1 (copy of ch 11 "Electric Guitar" electric guitar clean)
// note: Full arrangement: all 97 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Electric Guitar.
setcpm(120/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 · "Bass"
const bass = note(`<
  A@8 B C A D A@4 E F E G H I A@3 J B C A D A@4 B C A@6 E K L M H I A@4 B C A N O C G C G C G P A@4 L K L Q H R A@3 J S
  T A@5 J S T A U ~@7
>`.pickRestart({
  A: "gb2 ~ eb2 ~ db2 ~ gb2 ~ gb2 ~ eb2 ~ db2 ~ eb2 ~", B: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ gb2 ~ ab2 ~",
  C: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ db2 ~", D: "gb2 ~ eb2 ~ db2 ~ eb2 ~ gb2 ~ bb1 ~ db2 ~ eb2 ~",
  E: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ eb2 ~", F: "eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~",
  G: "eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ bb1 ~", H: "db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~",
  I: "db2 ~ ab1 ~ db2 ~ ab1 ~ db2 ~@7", J: "gb2 ~ eb2 ~ db2 ~ gb2 ~ gb2 ~ eb2 ~ db2 ~ gb2 ~",
  K: "eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ bb1 ~ eb2 ~ bb1 ~", L: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ gb2 ~ ab2 ~ eb2 ~",
  M: "~@2 eb2 ~ eb2 ~ eb2 ~ eb2 ~ bb1 ~ eb2 ~ bb1 ~", N: "gb2 ~ eb2 ~ db2 ~ eb2 ~ bb1 ~ db2 ~ eb2 ~ gb2 ~",
  O: "eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ ab1 ~", P: "ab2 ~@3 ab1 ~@3 ab2 ~@7",
  Q: "eb2 ~ eb2 ~ eb2 ~ bb1 ~ eb2 ~ bb1 ~ eb2 ~ bb1 ~", R: "db2 ~@3 db2 ~@3 db2 ~@7",
  S: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ eb2 ~ gb2 ~", T: "ab2 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ ab1 ~ db2 ~",
  U: "gb2 ~ eb2 ~ db2 ~ gb2 ~ gb2 ~ eb2 ~ db2 ~@3",
})).s("gm_synth_bass_1").gain(0.3)

// chords · electric guitar clean · "Electric Guitar"
const electric_guitar_clean = note(`<
  ~@2 A B@5 C@2 B@6 ~@4 D E A B A B C@2 A B@5 C@2 B@6 ~@4 F G A B A B C@2 A B@2 H B H B H B I B@4 C ~@3 J K A B A B C@2
  L B A B A B C@2 L B ~@7
>`.pickRestart({
  A: "~@2 [bb3,db4,gb4] ~@5 [bb3,db4,gb4] ~@7", B: "[bb3,db4,gb4] ~@5 [bb3,db4,gb4] ~@9",
  C: "[b3,eb4,ab4] ~@5 [b3,eb4,ab4] ~@9", D: "[ab3,db4,gb4] ~@3 [ab3,db4,gb4] ~@3 [ab3,db4,gb4] ~@3 [ab3,db4,f4] ~@3",
  E: "[ab3,db4,eb4] ~@3 [ab3,db4,eb4] ~@3 [ab3,db4,f4] ~@7", // Absus4 Db
  F: "[ab3,db4,gb4] ~ [ab3,db4,gb4] ~ [ab3,db4,gb4] ~ [ab3,db4,f4] ~", // Dbsus4 Db
  G: "[ab3,db4,eb4]@2 ~@2 [ab3,db4,eb4]@3 ~ [ab3,db4,f4] ~@7", H: "[ab3,c4,eb4] ~@5 [ab3,c4,eb4] ~@9",
  I: "[c4,ab4] ~@3 [c4,ab4] ~@3 [c4,ab4] ~@7", // Fm
  J: "[ab3,db4,gb4]@2 ~@2 [ab3,db4,gb4]@2 ~@2 [ab3,db4,f4]@2 ~@2 [ab3,db4,f4] ~@3", // Dbsus4 Db
  K: "[ab3,db4,eb4]@2 ~@2 [ab3,db4,eb4] ~@3 [ab3,db4,f4] ~@7", L: "~@2 [bb3,db4,gb4] ~@5 [bb3,db4,f4] ~@7",
})).s("gm_electric_guitar_clean").gain(0.25)

// chords · pad poly · "Polysynth"
const pad_poly = note(`<
  ~@2 A B@5 C@2 B@6 D@2 E@2 F G A B A B C@2 A B@5 C@2 B@6 H@2 I@2 J K A B A B C@2 A B L@2 M@2 N@2 O P B@4 H@2 Q@2 R S A
  B A B C@2 A B A B A B C@2 A B ~@7
>`.pickRestart({
  A: "~@2 [bb3,db4,eb4,gb4] ~@5 [bb3,db4,eb4,gb4] ~@7", B: "[bb3,db4,eb4,gb4] ~@5 [bb3,db4,eb4,gb4] ~@9",
  C: "[b3,eb4,gb4,ab4] ~@5 [b3,eb4,gb4,ab4] ~@9", D: "[[b3,eb4,ab4]@13 ~ [bb3,db4,gb4]@17 ~]/2",
  E: "[[b3,eb4,gb4,ab4]@13 ~ [bb3,db4,eb4,gb4]@16 ~@2]/2", // Abm7 Ebm7
  F: "[ab3,db4,gb4] ~ [ab3,db4,gb4] ~ [ab3,db4,gb4] ~ [ab3,db4,f4] ~", // Dbsus4 Db
  G: "[ab3,db4,eb4]@2 ~@2 [ab3,db4]@2 ~@2 [ab3,db4,f4] ~@7, ~ eb4 ~@2", // Absus4 Db5 Db
  H: "[[b3,eb4,gb4,ab4]@13 ~ [bb3,db4,eb4,gb4]@17 ~]/2", I: "[[eb4,ab4]@7 [bb3,db4,eb4,gb4]@8 ~, [b3,gb4]@3 ~@5]/2",
  J: "[ab3,db4,gb4] ~ [ab3,db4,gb4] ~ [db4,gb4] ~ [ab3,db4,f4] ~, ~@8 ab3 ~@7", // Dbsus4 Gb5 Db
  K: "[ab3,db4,eb4]@2 ~@2 [ab3,eb4]@4 [ab3,db4,f4] ~@7, ~@2 db4 ~@5", // Absus4 Ab5 Db
  L: "[[bb3,db4,eb4,gb4]@13 ~ [c4,eb4,gb4,ab4]@16 ~@2]/2", // Ebm7 Ab7
  M: "[[bb3,db4,eb4,gb4]@13 ~ [c4,eb4,ab4]@17 ~, ~@14 gb4@15 ~@3]/2", // Ebm7 Ab
  N: "[[bb3,db4,gb4]@14 [c4,eb4,gb4,ab4]@17 ~, eb4@3 ~@5]/2", O: "[bb3,db4,eb4,gb4]@15 ~",
  P: "[c4,eb4,gb4,ab4] ~ [c4,eb4,gb4,ab4] ~ [c4,eb4,gb4,ab4] ~@3", // Ab7
  Q: "[[b3,ab4]@14 [bb3,db4,eb4,gb4]@17 ~, [eb4,gb4]@3 ~@5]/2", // E Ebm7 Ebm
  R: "[ab3,db4,gb4] ~ [ab3,db4,gb4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~", // Dbsus4 Db
  S: "[ab3,db4,eb4]@2 ~@2 [ab3,db4,eb4]@3 ~ [ab3,db4,f4] ~@7", // Absus4 Db
})).s("gm_pad_poly").gain(0.25)

// chords · piano · "Electric Piano"
const piano = note("<~@13 A ~ B ~@14 C D C E ~@5 F ~ G ~@23 A ~ B ~@29>".pickRestart({
  A: "~@6 db5 eb5 gb5 ~ eb5 ~@5", B: "~@5 [bb3,db4,eb4,gb4]@2 ~", C: "~@14 db5 eb5",
  D: "[bb4,gb5]@2 eb5 ~ db5@2 gb4 ~@9", E: "[bb4,gb5]@2 eb5@2 gb5@2 [bb4,ab5] ~@9", F: "~@6 db5 eb5 gb5@2 eb5 ~@5",
  G: "~@10 [bb3,db4,eb4,gb4]@5 ~", // Ebm7
})).s("gm_piano").gain(0.25)

// other · music box
const music_box = note("<~@22 A B C D B E B ~@19 A B C D B E B ~@19 A B C D B E B ~ A B C D B E B ~@8>".pickRestart({
  A: "~@8 db7 ~@3 bb6 ~@3", B: "gb6 ~@15", C: "~@12 db7 ~@3", D: "bb6 ~@3 gb6 ~@3 ab6 ~@3 db6 ~@3",
  E: "~@4 db6 ~@3 db7 ~@3 bb6 ~@3",
})).s("gm_music_box").gain(0.25)

// other · electric guitar muted · "Electric Muted Guitar"
const electric_guitar_muted = note(`<
  ~@23 A ~ A ~ B ~ C ~@19 A ~ A ~ B ~ C ~@19 A ~ A ~ B ~ C ~ A ~ A ~ B ~ C ~@7
>`.pickRestart({
  A: "gb3 ~ gb3!3 ~ gb3 ~@9", B: "ab3 ~ ab3!3 ~ ab3 ~@9", C: "gb3 ~@2 gb3!2 ~ gb3 ~@9",
})).s("gm_electric_guitar_muted").gain(0.25)

// other · electric guitar muted · "Electric Muted Guitar" · soft notes
const electric_guitar_muted_2 = note("<~@29 A ~@25 A ~@25 A ~@7 A ~@7>".pickRestart({
  A: "~@2 gb3 ~@13",
})).s("gm_electric_guitar_muted").gain(0.1)

// other · pizzicato strings
const pizzicato_strings = note("<~@56 A B A B A B A C ~@33>".pickRestart({
  A: "[eb5,eb6] ~@3 [bb4,bb5] ~@3 [gb4,gb5] ~@3 [eb4,eb5] ~@3", // Eb Bb Gb Eb
  B: "[c5,c6] ~@3 [ab4,ab5] ~@3 [eb4,eb5] ~@3 [c4,c5] ~@3", C: "[ab4,ab5] ~@3 [ab4,ab5] ~@3 [ab4,ab5] ~@7",
})).s("gm_pizzicato_strings").gain(0.12)

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

// drums · snare
const snare = s("sd").struct("<~@3 A B@5 C B@11 D B@3 E B C B@16 F B@8 D B@9 G B@15 D B@7 D B@2 ~@7>".pickRestart({
  A: "~@8 x!3 ~ x ~@3", B: "~ x ~ x", C: "~@4 x ~@3 x!3 ~ x ~@3", D: "~@4 x ~@4 x!2 ~ x ~@3", E: "~@4 x ~@7 x ~@2 x",
  F: "~@4 x ~@7 x!2 ~@2", G: "~ x!2 ~",
})).gain(0.35)

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

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

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

stack(
  bass, electric_guitar_clean, pad_poly, piano, music_box, electric_guitar_muted, electric_guitar_muted_2,
  pizzicato_strings, kick, snare, hihat, open_hat, crash
)

More by Madonna