Strudelify
Who's That Girl cover art

1987 · Who's That Girl Soundtrack

Who's That Girl

Madonna

KeyG majorTempo102 bpm
0:00/0:00
// Who's That Girl — Madonna
// 102 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// 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.
setcpm(102/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 · synth strings 1 · "Strings"
const synth_strings_1 = note(`<
  ~ A B A C A B A C D E D E D E D E A B A C A B A C D E D E D E D E A B A C A B A C F@2 G H F@2 G H ~@4 D E D E A B A C
  A B A C F@2 G H F@2 G H ~@8 A B A C A B A C A B A C A B A C
>`.pickRestart({
  A: "[g3,b3,c4,e4,e5]@15 ~", B: "[g3,b3,d4] [g3,c4,d4], d5", C: "[g3,b3,d4,d5]@2 [c4,d4,g4]!2, ~ g5",
  D: "[a3,d4,f4,a5]@15 ~", E: "[g3,c4,e4] [g3,b3,d4], g5",
  F: "[[a3,c4,f4]@6 ~@2 g4@2 g4 a4 g4@2 ~ [a#3,d4,f4]@7 f4 g4 [a#3,d4,f4]@6 ~@2, ~@4 [c4,e4]@3 ~@9]/2", // F A# C
  G: "[a#3,d4,f4]@3 ~ [a3,c4,g4]@3 ~", H: "[c4,e4,g4]@13 ~@3",
})).s("gm_synth_strings_1").gain(0.29)

// other · brass section · "Brass"
const brass_section = note("<~@26 A@2 B ~ A@2 B ~@8 C ~@2 D C ~@8 A@2 B ~@8 C ~@2 D C ~@8 E@2 ~@17>".pickRestart({
  A: "[~@6 [c4,c5] [d4,d5] [e4,e5]@2 [d4,d5] [c4,c5] ~ [b3,b4] ~ [a3,d4,a4]@7 ~@10]/2", B: "g4 e5 ~ e5 ~ e5 ~ d5 ~@8",
  C: "~@3 [f4,f5] ~@12", D: "~@12 [c4,c5]!2 [d4,d5] [f4,f5]",
  E: "[~@6 c5 d5 e5@2 [c5,e5] [d5,f5] ~ [e5,g5]@2 [f5,a5]@2 [d5,f5] [a3,d4]@5 ~@9]/2", // C Dm Em F Dm D5
})).s("gm_brass_section").gain(0.42)

// chords · acoustic guitar steel · "Guitar"
const acoustic_guitar_steel = note(`<
  ~@5 A B C B ~@8 A B C B A B C B ~@8 A B C B A B C B D@2 E F D@2 E F G@4 ~@4 A B C B A B C B D@2 E F D@2 E F G@8 A B C
  B A B C B A B C B A B C B
>`.pickRestart({
  A: "[c4,e4,a4]@2 [e4,a4,c5] ~@2 [e4,a4,c5]@2 ~ [e4,a4,c5]@2 ~ [e4,a4,c5] ~ [e4,a4,c5]!2 ~", // Am
  B: "[d4,g4,b4]@2 [d4,g4,b4] ~@3 [d4,g4,b4]!2 [d4,g4,c5]@2 [d4,g4,c5] ~ [d4,g4,b4]@3 ~", // G Csus2 G
  C: "[c4,e4,a4]@2 [c4,e4,a4] ~@2 [c4,e4,a4]@2 ~ [c4,e4,a4]@2 ~ [e4,a4,c5] ~ [e4,a4,c5]!2 ~", // Am
  D: "[[a3,c4,f4]@6 ~@2 g4@2 g4 a4 g4@2 ~ [a#3,d4,f4]@7 f4 g4 [a#3,d4,f4]@6 ~@2, ~@4 [c4,e4]@3 ~@9]/2", // F A# C
  E: "[a#3,d4,f4]@3 ~ [a3,c4,g4]@3 ~", F: "[c4,e4,g4]@13 ~@3",
  G: "[~@10 [f4,a4] [e4,g4] ~ [d4,f4]@2 [e4,g4]@2 [c4,e4] ~@8 [c4,e4] [d4,f4] ~ [e4,g4]@2 [f4,a4]@2 [d4,f4] ~@8 [f4,a4] [e4,g4] ~ [d4,f4]@2 [e4,g4]@2 [c4,e4] ~@7 [e4,g4] [d4,f4] ~ [c4,e4] ~ [b3,d4] ~]/4", // F Em Dm Em C Dm Em F …
})).s("gm_acoustic_guitar_steel").gain(0.29)

// bass · synth bass 1 · "Bass"
const bass = note(`<
  ~ A B C B A B C B D E D E D E D F A B C B A B C B D E D E D E D F A B C B A B C B G H I J K H I L M N M O D E D E A B
  C B A B C B G H I J K H I L M N M O M N M O A B C B A B C B A B C B A B C B
>`.pickRestart({
  A: "a2 ~ a1 ~@2 a1 ~ a1@2 b1 c2 b1@2 a1 ~ g1", B: "g2 ~ g1 ~@2 g1 a1 b1 c2 ~ c3 c2 b1 b2 g2 b1",
  C: "a2 ~ a1 ~@2 a1 ~ a1@2 b1 c2 b1@2 a1 g1 ~", D: "d2@2 ~ d2@2 ~ a2 ~ d2@2 ~ d2@2 ~ a1 ~",
  E: "c2@2 ~ c2@2 ~ g2 ~ g1@2 ~ g1@2 ~ g2 ~", F: "c2 ~@2 c2@2 ~ g2 ~ g1@2 ~ g1@2 ~ g2 ~",
  G: "f1 f1@2 f2@2 f1 f2 a1 c2@2 c2@2 ~ c2 g2 c2", H: "a#1 a#1@2 a#1@2 a#1 f2 a#1 g1@2 g1@2 ~@2 g1 a1",
  I: "a#1 a#1@2 a#1@2 a#1 f2 a#1 d2@2 d2@2 ~ d2 a2 d2", J: "c2 c2@2 c2@2 c2 g2 c2 c2@2 c2@2 ~ c2 g2 c2",
  K: "f1 f1@2 f2@2 f1 f2 a1 c2@2 c2@2 ~ c2 g1 c2", L: "c2 c2@2 c2@2 c2 g2 c2 c2@2 c2@2 ~ c2 g2 c3",
  M: "d2@2 ~ d2@2 ~ a1 ~ d2 ~ e2 f2@2 ~@3", N: "c2@2 ~ c2@2 ~ g1 ~ c2 ~ d2 e2@2 ~@3",
  O: "c2@2 ~ c2@2 ~ g1 ~ e2!2 d2 ~ c2 ~ b1 ~",
})).s("gm_synth_bass_1").gain(0.49)

// drums · kick
const kick = s("bd").struct("<~ [x!2]!96>").gain(0.42)

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

// drums · clap
const clap = s("cp").struct("<~@49 [x ~@5 x!3 ~@7]!4 ~@20 [x ~@5 x!3 ~@7]!8 ~@16>").gain(0.42)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A@3 B A@3 B A@11 B A@3 B A@11 B A@3 B A@3 B A@3 B A@3 B A@7 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 ~ x!3 ~ x!3 ~ x!3 ~ x!2", B: "x ~ x!3 ~ x!3 ~ x!3 ~@3",
})).gain(0.42)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A ~@3 A ~@11 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 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 · cowbell
const cowbell = s("cb").struct("<A@9 ~@8 A@8 ~@8 A@16 ~@8 A@16 ~@8 A@16>".pickRestart({
  A: "x!4",
})).gain(0.42)

// drums · bongos
const bongos = s("bongo:18").struct("~@4 x ~@4 x ~@2 x ~@3").gain(1.11)

// drums · congas
const congas = s("conga:18").struct("<A B@15 A B@35 A B@23 A B@3 A B@16>".pickRestart({
  A: "x ~@2 x ~@2 x!3 ~@7", B: "x ~@2 x ~@2 x!3 ~@5 x!2",
})).gain(1.35)

// drums · ht
const ht = s("ht").struct("<~@16 A ~@35 A ~@23 A ~@3 A ~@16>".pickRestart({
  A: "~@11 x ~@2 x!2",
})).gain(0.42)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<A@49 B@3 C A@20 B@3 C B@3 C A@16>".pickRestart({
  A: "~@4 x ~@9 x!2", B: "x ~@3 x ~ x!3 ~@7", C: "x ~@3 x ~ x!3 ~@5 x!2",
})).gain(2.14)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct(`<
  ~@4 A ~@3 A ~@11 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@11 A ~@3 A ~@3 A ~@4
>`.pickRestart({
  A: "~@9 x ~@4 x!2",
})).gain(0.61)

// drums · woodblocks · soft notes
const woodblocks_soft = s("woodblock:5").struct("<~@96 [~@9 x ~@4 x!2]>").gain(0.1)

// drums · woodblocks
const woodblocks_2 = s("woodblock:4").struct(`<
  ~@4 A ~@3 A ~@11 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@11 A ~@3 A ~@3 A ~@4
>`.pickRestart({
  A: "~@3 x",
})).gain(0.61)

// drums · woodblocks · soft notes
const woodblocks_soft_2 = s("woodblock:4").struct("<~@96 [~@3 x]>").gain(0.1)

stack(
  synth_strings_1, brass_section, acoustic_guitar_steel, bass, kick, snare, clap, hihat, open_hat, cowbell, bongos,
  congas, ht, cabasa, woodblocks, woodblocks_soft, woodblocks_2, woodblocks_soft_2
)

More by Madonna