Strudelify
Vogue cover art

1990 · I'm Breathless

Vogue

Madonna

KeyA♭ majorTempo120 bpm
0:00/0:00
// Vogue — Madonna
// 120 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 178 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
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.

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  A@4 B@28 C@6 D E F ~@7 G@4 H@4 I ~ J@2 K ~ L@2 M ~@7 G@4 H@4 I ~ J@2 K N L@2 O@4 P@3 Q R Q S T N J@2 K N L@2 F ~@7 U@2
  V@2 B@4 W@4 X@4 ~@8 Y N Z@2 Y N AA AB F ~@3 F ~@2 E F ~@6 AC F ~@3 F ~ AD@2 F ~ AE@2 F ~ AF
>`.pickRestart({
  A: "[[ab3,bb3,db4,eb4]@8 ~@7 gb5, ab5@15 ~, ~ [ab3,bb3,c4,eb4]]/4", // Absus4 Ab
  B: "[[ab3,bb3,db4,eb4]@8 ~@7 gb5, ab5@59 ~@5, ~ [ab3,bb3,c4,eb4]]/4", C: "[[eb5,ab5]@27 ~ f5@4]/2",
  D: "[eb5,ab5]@15 ~", E: "~ [gb5,gb6] ~ [gb5,gb6] ~ [gb5,gb6] ~ [gb5,gb6]", F: "[ab5,ab6] ~@7",
  G: "[[ab3,bb3,db4,eb4]@32 ~@28 gb5@3 ~, ab5@15 ~, ~ [ab3,bb3,c4,eb4]]/4", // Absus4 Ab
  H: "[[ab3,bb3,db4,eb4]@16 [ab3,bb3,c4,eb4]@12 ~ [gb5,gb6] ~ [gb5,gb6], ab5@27 ~@5]/4", // Absus4 Ab Gb
  I: "[ab5,ab6] ~@4 [ab5,ab6] ~@2", // Ab
  J: "[~@14 [b4,eb5]@4 [bb4,db5]@2 [bb4,db5]@2 [ab4,b4]@2 [b4,d5]@2 [bb4,db5]@2 [bb4,db5]@3 ~]/2", // B Bbm Abm Bm Bbm
  K: "~@5 [ab5,ab6] ~@2", // Ab
  L: "[~@7 [b4,eb5]@2 [bb4,db5]!2 [ab4,b4] [b4,d5] [bb4,db5]@2 [gb5,gb6], ~@13 [eb5,eb6] ~@2]/2", // B Bbm Abm Bm Bbm Gb Eb
  M: "[c4,eb4,ab4,ab5,ab6] ~@7", N: "~@4 [eb4,bb4,db5]@3 ~@9", O: "[[ab3,db4,eb4,ab4]@61 ~@3, [ab5,ab6] ~@31]/4",
  P: "[ab4@24 gb4@8 ab4@13 ~@3, [ab3,db4,eb4]@15 ~]/3", Q: "[db4,eb4,ab4,bb4]@13 ~@3", R: "[db4,eb4,g4,bb4]@13 ~@3",
  S: "~ gb5 ~ gb5 ~ gb5 ~ gb5, [db4,g4,bb4,eb5]@13 ~@3", T: "[ab3,ab4]@5 [ab5,ab6] ~@2", U: "[ab3,bb3,db4,eb4]/2",
  V: "[ab3,bb3,c4,eb4]/2", W: "[[ab3,bb3,db4,eb4]@32 ~@28 gb5@3 ~, ab5@59 ~@5, ~ [ab3,bb3,c4,eb4]]/4",
  X: "[[ab3,bb3,db4,eb4] [ab3,bb3,c4,eb4], ab5@59 ~@5]/4", // Absus4 Ab
  Y: "[ab5,ab6]@2 [ab3,eb4]@2 [ab3,eb4]@3 ~ [ab3,eb4]@2 ~ [ab3,eb4]@3 [bb3,eb4]@2", // Ab Ab5 Eb5
  Z: "[~@2 [ab3,eb4]@2 [ab3,eb4]@3 ~ [ab3,eb4]@2 ~ [ab3,eb4]@3 [b4,eb5]@4 [bb4,db5]@2 [bb4,db5]@2 [ab4,b4]@2 [b4,d5]@2 [bb4,db5]@2 [bb4,db5]@3 ~, ~@7 [bb3,eb4] ~@8]/2", // Ab5 B Bbm Abm Bm Bbm Eb5
  AA: "~@2 [ab3,eb4]@2 [ab3,eb4]@3 ~ [ab3,eb4]@2 ~ [ab3,eb4]@3 [bb3,eb4,b4,eb5]@2", // Ab5 Bmaj7
  AB: "[b4,eb5] [bb4,db5,eb5,eb6] [bb4,db5,gb5,gb6] [ab4,b4,eb5,eb6] [b4,d5] [eb5,eb6] [gb5,gb6] [eb5,eb6], ~@10 [bb4,db5]@5 ~", // B Eb7 Gb Abm Bm Eb Gb Eb …
  AC: "~@2 [eb5,eb6] ~ [gb5,gb6] ~ [eb5,eb6] ~@3 [eb5,eb6] ~ [gb5,gb6] ~ [eb5,eb6] ~", // Eb Gb Eb Gb Eb
  AD: "[[ab5,ab6]@2 ~@12 [b4,eb5]@4 [bb4,db5]@2 [bb4,db5]@2 [ab4,b4]@2 [b4,d5]@2 [bb4,db5]@2 [bb4,db5]@3 ~]/2", // Ab B Bbm Abm Bm Bbm
  AE: "[~@7 [b4,eb5]@2 [bb4,db5]!2 [ab4,b4] [ab4,b4,d5] [gb4,bb4,db5]@2 [gb5,gb6], ~@13 [eb5,eb6] ~@2]/2", // B Bbm Abm Abdim Gb Eb
  AF: "ab5 ~ ab5 ~ ab5 ~ ab5 ~",
})).s("gm_synth_strings_1").gain(0.42)

// chords · piano · "A.PIANO 3"
const piano = note(`<
  ~@24 A@2 B@2 A@2 B@2 ~@2 C ~@2 D ~@2 E ~@7 A@2 B@2 A@2 B@2 F G F H F G F H I ~@7 A@2 B@2 A@2 B@2 F G F H F G F H ~@11
  F G F H F G F H ~@18 C ~@2 D ~@2 F G F H F G F H J ~ J ~ J ~ J ~@9 F G F H F G F H F G K G F G F H F G F H F G L
>`.pickRestart({
  A: "[ab3,db4,eb4] [ab3,db4,eb4]@2 [ab3,db4,eb4] ~@12", B: "[ab3,c4,eb4] [ab3,c4,eb4]@2 [ab3,c4,eb4] ~@12",
  C: "~@5 [b4,eb5,ab5] ~@2", D: "~@5 [b4,eb5,ab5]!2 ~", E: "[ab4,c5,eb5,ab5] ~@7",
  F: "[b3,eb4,gb4]@3 ~ [bb3,db4,f4]@3 ~ [ab3,b3,e4]@2 ~ [ab3,b3,e4]@3 [gb3,bb3,eb4]@2", // B Bbm E Ebm
  G: "~@2 [ab3,b3,gb4]@2 [bb3,db4,f4]@3 ~ [b3,e4,ab4]@2 ~ [b3,e4,ab4]@3 [bb3,eb4,gb4]@2", // Abm7 Bbm E Ebm
  H: "~@2 [b3,eb4,gb4]@2 [bb3,db4,f4]@3 ~ [ab3,b3,e4]@2 ~ [ab3,b3,e4]@3 [gb3,bb3,eb4]@2", I: "[ab4,c5,eb5] ~@7",
  J: "~@2 [ab3,eb4]@2 [ab3,eb4]@3 ~ [ab3,eb4]@2 ~ [ab3,eb4]@3 [bb3,eb4]@2", // Ab5 Eb5
  K: "[b3,eb4,gb4]@3 ~ [bb3,db4,f4]@3 ~ [ab3,b3,e4,ab4]@2 ~ [ab3,b3,e4,ab4]@3 [gb3,bb3,eb4,gb4]@2", // B Bbm E Ebm
  L: "[ab3,eb4,gb4,ab4] ~ [ab3,eb4,gb4,ab4] ~ [ab3,b3,eb4,gb4,ab4] ~ [ab3,b3,eb4,gb4,ab4] ~", // Ab7 Abm7
})).s("gm_piano").gain(0.39).pan(1)

// chords · brass section · "BRASS 1"
const brass_section = note(`<
  ~@34 A ~@2 B ~@2 C ~@23 C ~@60 A ~@2 B ~@17 D ~@4 E ~@10 B ~@4 F ~ F ~ F ~@3 F ~ G
>`.pickRestart({
  A: "~@10 [ab4,b4,eb5,gb5] ~@5", B: "~@10 [ab4,b4,eb5,gb5] ~ [ab4,b4,eb5,gb5] ~@3", C: "[ab4,c5,eb5,ab5] ~@15",
  D: "~@10 [ab4,c5,eb5,gb5] ~ [ab4,c5,eb5,gb5] ~@3", E: "ab5 ~@15", F: "[ab4,b4,eb5,gb5] ~@15",
  G: "[ab4,b4,eb5,gb5] ~@3 [ab4,b4,eb5,gb5] ~@3 [ab4,b4,eb5,gb5] ~@3 [ab4,b4,eb5,gb5] ~@3", // Abm7
})).s("gm_brass_section").gain(0.39).pan(1)

// bass · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  ~@16 A B A C A B A D A B A C A B A D A B A C A B A D E F E G E F E G H I H I H I H G H I H I H I H I E F E G E F E G H
  I H I H I H G H I H I H I H I J K J K J K J L@3 M H I H I H I H N O P O Q O P O G A B A C A B A D A B A C A B A C A B
  A C A B A C H I H R S N H G H I H N H I H N H I H N H I H N ~@2 H I H I H N H I H N H I T
>`.pickRestart({
  A: "ab1@2 ~ bb1@3 ab1@3 bb1@2 ~ ab1@2 bb1@2", B: "db2@2 ~ bb1@3 db2@3 bb1@2 ~ db2@2 bb1@2",
  C: "db2@2 ~ bb1@3 db2@3 bb1@2 ~ db2@2 eb2@2", D: "eb2@2 ~ eb2@3 eb2@3 eb2@2 ~ gb2@2 ab2@2",
  E: "ab2@3 ~ ab2@3 ~ db2@2 ~ db2 db2@2 eb2@2", F: "~@2 ab2@2 ab2@3 ~ db2@2 ~ db2 db2@2 eb2@2",
  G: "~@2 ab2@2 gb2@3 ~ e2 e2@2 e2 e2@2 eb2@2", H: "ab2@3 ~ gb2@3 ~ e2@2 ~ e2@3 eb2@2",
  I: "~@2 ab2@2 gb2@3 ~ e2@2 ~ e2@3 eb2@2", J: "ab2@3 ~ db2@3 ~ eb2@2 ~ eb2@3 gb2@2",
  K: "~@2 ab2@2 db2@3 ~ eb2@2 ~ eb2@3 gb2@2", L: "~@2 eb2@2 eb2@3 ~ eb2@2 ~ eb2@3 eb2@2", M: "eb2!2 f2!2 gb2!2 g2!2",
  N: "~@2 ab2@2 gb2@3 ~ e2@2 ~ e2 e2@2 eb2@2", O: "ab2@3 ~ ab2@3 ~ db2@2 ~ db2@3 eb2@2",
  P: "~@2 ab2@2 ab2@3 ~ db2@2 ~ db2@3 eb2@2", Q: "~@2 ab2@2 ab2@3 ~ db2 db2@2 db2@3 eb2@2",
  R: "~@2 ab2@2 gb2@3 ~ e2 e2@2 e2!3 eb2@2", S: "ab2@3 ~ gb2@3 ~ e2@2 ~ e2 e2@2 eb2@2", T: "ab1 ~ ab1 ~ ab1 ~ ab1 ~",
})).s("gm_synth_bass_2").gain(0.42).pan(0)

// bass · slap bass 1 · "SLAPBASS 1"
const bass_2 = note(`<
  ~@24 A B A C A B A D A B A C A B A D ~@8 E F E F E F E F E F E F E F E F ~@8 E F E F E F E F E F E F E F E F G H G H G
  H G I@4 E F E F E F E F ~@8 A B A C A B A D A B A C A B A C A B A C J K J L E F E F E F E F E F E F E F E F E F E F E
  F E F ~@2 E F E F E F E F E F E F M
>`.pickRestart({
  A: "ab1@2 ~ bb1@3 ab1@3 bb1@2 ~ ab1@2 bb1@2", B: "db2@2 ~ bb1@3 db2@3 bb1@2 ~ db2@2 bb1@2",
  C: "db2@2 ~ bb1@3 db2@3 bb1@2 ~ db2@2 eb2@2", D: "eb2@2 ~ eb2@3 eb2@3 eb2@2 ~ gb2@2 ab2@2",
  E: "ab1@3 ~ gb1@3 ~ e1@2 ~ e1@3 eb1@2", F: "~@2 ab1@2 gb1@3 ~ e1@2 ~ e1@3 eb1@2",
  G: "ab1@3 ~ db1@3 ~ eb1@2 ~ eb1@3 gb1@2", H: "~@2 ab1@2 db1@3 ~ eb1@2 ~ eb1@3 gb1@2",
  I: "~@2 eb1@2 eb1@3 ~ eb1@2 ~ eb1@3 eb1@2", J: "ab1@2 ~ bb1@3 ab1@2 ab1 bb1@2 ~ ab1@2 bb1@2",
  K: "db2@2 ~ bb1@3 db2@2 db2 bb1@2 ~ db2@2 bb1@2", L: "db2@2 ~ bb1@3 db2@2 db2 bb1@2 ~ db2@2 eb2@2",
  M: "ab1 ~ ab1 ~ ab1 ~ ab1 ~",
})).s("gm_slap_bass_1").gain(0.35).pan(1)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@24 A B C D A B C D ~@8 E F G H G F G H ~@8 I J I J I J I J G F G H G F G H ~@8 I J I J I J I J ~@7 K L K L I J I J I
  J I J ~@60 I J M J I J I J I J N
>`.pickRestart({
  A: "~@8 [ab3,db4,eb4] [ab3,db4,eb4]@2 [ab3,db4,eb4] ~@4", // Absus4
  B: "~@7 [ab3,db4,eb4] [ab3,db4,eb4]@2 [ab3,db4,eb4]@2 [ab3,db4,eb4]@2 ~@2", // Absus4
  C: "~@8 [ab3,c4,eb4] [ab3,c4,eb4]@2 [ab3,c4,eb4] ~@4", D: "~@7 ab3 [bb3,eb4]@2 ab3 [ab3,eb4] bb3 c4@2 ~",
  E: "ab3@2 ~@2 ab3@3 ~ db3@2 ~ db3 db3@2 eb3@2", F: "~@2 ab3@2 ab3@3 ~ db3@2 ~ db3 db3@2 eb3@2",
  G: "ab3@3 ~ ab3@3 ~ db3@2 ~ db3 db3@2 eb3@2", H: "~@2 ab3@2 gb3@3 ~ e3 e3@2 e3 e3@2 eb3@2",
  I: "[gb3,ab3,b3]@3 ~ [f3,bb3,db4]@3 ~ [ab3,b3,e4]@2 ~ [ab3,b3,e4] [ab3,b3,e4]@2 [bb3,eb4,gb4]@2", // Abm7 Bbm E Ebm
  J: "~@2 [gb3,ab3,b3]@2 [f3,bb3,db4]@3 ~ [ab3,b3,e4] [ab3,b3,e4]@2 [ab3,b3,e4] [ab3,b3,e4]@2 [bb3,eb4,gb4]@2", // Abm7 Bbm E Ebm
  K: "~@2 [ab3,bb3,eb4]@2 [ab3,bb3,eb4]@3 ~ [ab3,bb3,eb4]@2 ~ [ab3,bb3,eb4]@3 [ab3,bb3,eb4]@2", // Absus2
  L: "~@2 [g3,bb3,eb4]@2 [g3,bb3,eb4]@3 ~ [g3,bb3,eb4]@2 ~ [g3,bb3,eb4]@3 [g3,bb3,eb4]@2", // Eb
  M: "[gb3,ab3,b3,ab4]@3 ~ [f3,bb3,db4]@3 ~ [ab3,b3,e4]@2 ~ [ab3,b3,e4] [ab3,b3,e4]@2 [bb3,eb4,gb4]@2", // Abm7 Bbm E Ebm
  N: "[ab3,eb4,gb4,ab4] ~ [ab3,eb4,gb4,ab4] ~ [ab3,eb4,gb4,ab4] ~ [ab3,eb4,gb4,ab4] ~", // Ab7
})).s("gm_acoustic_guitar_steel").gain(0.29).pan(0)

// chords · pad sweep · "SWEEP PAD"
const pad_sweep = note("<~@8 A@8 ~@162>".pickRestart({
  A: "[~@5 gb5 ~@2, [ab4,db5,eb5,ab5]]/8", // Absus4
})).s("gm_pad_sweep").gain(0.3)

// drums · kick
const kick = s("bd").struct("<~@24 [x!4]!11 [x!3 ~ x ~ x ~] [x!4]!71 ~@4 [x!4]!52 ~@3 [x!4]!12>").gain(0.56)

// drums · snare
const snare = s("sd").struct(`<
  ~@24 A@3 B A@3 C A@3 D A E F C A@3 B A@3 B A@3 B A@2 F C A@3 B A@3 C A@3 B A@3 B A@3 B A@3 C A@3 B A@3 C A@3 B A@3 C@4
  A@3 B A@3 C ~@7 C A@3 B A@3 C A@2 G B A E A C A@3 B A@3 C A@3 B A@3 C A@3 B A@3 B A@3 B A@3 C ~@3 C H A H B H A@2 B H
  A I
>`.pickRestart({
  A: "~@4 x ~@2 x ~@4 x ~@3", B: "~@4 x ~@2 x ~@2 x ~ x ~ x!2", C: "x!5 ~ x!2 ~ x!7",
  D: "~@2 x ~ x ~@2 x ~@2 x ~ x ~ x!2", E: "~@4 x ~@2 x ~@2 x ~ x ~@3", F: "~@4 x ~@2 x ~@4 x ~ x ~",
  G: "~@4 x ~@2 x ~@2 x ~@5", H: "x ~@3 x ~@2 x ~@4 x ~@3", I: "x!4",
})).gain(0.56)

// drums · clap
const clap = s("cp").struct("<~@4 A@20 ~@83 A@7 ~ B ~@7 B ~ C ~@2 C ~@2 A@3 ~ A@3 ~@40>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@3 x",
})).gain(0.56)

// drums · low tom
const low_tom = s("lt").struct("<~@167 A ~ A ~ A ~@3 A B C>".pickRestart({
  A: "x", B: "~@3 x", C: "x!4",
})).gain(0.72)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@24 A@7 ~ A@7 ~ A@15 ~ A@7 ~ A@15 ~ A@7 ~ A@7 ~@4 A@7 ~@5 A@3 ~ A@7 ~ A@7 ~ A@7 ~ A@7 ~ A@15 ~@5 A@10 ~
>`.pickRestart({
  A: "~@7 x",
})).gain(0.56)

// drums · crash
const crash = s("cr").struct("<~@40 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@86 A ~ A ~ A ~@3 A B ~>".pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.56)

// drums · tambourine
const tambourine = s("tb").struct("<~@107 A B A B A B A B C@4 ~@4 C@15 D C@7 ~@21 C@10 E>".pickRestart({
  A: "x ~ x ~ x ~ x ~ x!3 ~ x ~ x ~", B: "x!8", C: "~ x ~ x", D: "~ x ~ x ~ x ~ x", E: "x!4",
})).gain(0.56)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@125 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@28>".pickRestart({
  A: "~ x ~@2",
})).gain(6.58)

// drums · bongos
const bongos = s("bongo:18").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 ~@75 A B A B A B A B A B A B A B A B A B A B A B A
  B ~@39
>`.pickRestart({
  A: "x ~@2 x ~@2 x ~@9", B: "x ~@2 x ~@2 x ~@3 x ~@5",
})).gain(1.26)

// drums · congas
const congas = s("conga:18").struct(`<
  ~@9 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~@76 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B
  ~@39
>`.pickRestart({
  A: "~@3 x", B: "~@12 x ~ x!2",
})).gain(1.54)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct(`<
  ~@32 A B A C A B A C ~@99 A B A C A B A C A C A C A C A C A B A C A C A C ~@4 A C A C A C A C A C D
>`.pickRestart({
  A: "x!2 ~@2 x!2 ~@2 x!2 ~@4 x!2", B: "x!2 ~@2 x!2 ~@2 x!2 ~@5 x", C: "x!2 ~@2 x!2 ~@2 x!2 ~@6",
  D: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2",
})).gain(2.55)

// drums · agogo bells
const agogo_bells_2 = s("agogo:4").struct(`<
  ~@32 A B A C A B A C ~@99 A B A C A B A C A C A C A C A C A B A C A C A C ~@4 A C A C A C A C A C D
>`.pickRestart({
  A: "~@2 x!2 ~@2 x!2 ~@2 x!4 ~@2", B: "~@2 x!2 ~@2 x!2 ~@2 x!5 ~", C: "~@2 x!2 ~@2 x!2 ~@2 x!6",
// … 7 more lines

More by Madonna