Strudelify

Amazing

Madonna

KeyG majorTempo135 bpm
0:00/0:00
// Amazing — Madonna
// 135 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 2/4 at bar 3, 4/4 at bar 19, 2/4 at bar 108) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 115 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(135/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.

// other · vibraphone
const vibraphone = note("<A B@8 C@2 D@2 E@2 F@2 ~@65 G@2 H@2 ~@20 I@2 J@2 K@2 L@2 M>".pickRestart({
  A: "~@19 d5@4 ~", B: "[f5@3 c6@40 d5@4 c6@3 b5@40 ~ d5@4 d6@3 f5@40 d4@4 ~ e5@3 d5@40 d5@4 f5@2]/8",
  C: "[~ c6@40 ~ d5@4 c6@2]/2", D: "[~ b5@40 d5@4 ~ e6@2]/2", E: "[~ f5@40 d4@4 e5@3]/2", F: "[d5@15 ~]/2",
  G: "[c6@40 d5@4 ~ c6@3]/2", H: "[b5@5 ~]/2", I: "[~@5 c6@40 d5@3]/2", J: "[~@2 c6@3 b5@40 d5@3]/2",
  K: "[~@2 d6@3 f5@40 d4@3]/2", L: "[~ e5@3 d5@40 d5@4]/2", M: "~ f5@3 ~@20",
})).s("gm_vibraphone").gain(0.72)

// other · whistle
const whistle = note("<~ A B@7 ~@97 C@2 D@2 E F G H I>".pickRestart({
  A: "~@3 c7@4 f6@4 ~ e6@3 d6@4 e6@4 ~",
  B: "[f6@3 c7@4 f6@4 ~ e6@3 d6@4 e6@4 f6@3 b6@4 ~ f6@4 e6@3 d6@4 ~ e6@4 f6@3 b6@4 ~ f6@4 e6@3 d6@4 ~ e6@4 f6@3 c7@4 ~ f6@4 e6@3 d6@4 e6@4 ~ f6@3 c7@4 f6@4 ~ e6@3 d6@4 e6@4 ~ f6@3 b6@4 f6@4 ~ e6@3 d6@4 e6@4 ~ f6@3 b6@4 f6@4 ~ e6@3 d6@4 e6@4 f6@2]/7",
  C: "[~@5 c7@4 ~ f6@4 e6@3 d6@4 ~ e6@4 f6@3 c7@4 ~ f6@4 e6@3 d6@4 e6@3]/2", D: "~@2 f6@3 b6@4 f6@4 ~ e6@3 d6@4 e6@3",
  E: "~@2 f6@3 c7@4 f6@4 ~ e6@3 d6@4 e6@3", F: "~ f6@3 c7@4 ~ f6@4 e6@3 d6@4 ~ e6@3",
  G: "~ f6@3 b6@4 ~ f6@4 e6@3 d6@4 ~ e6@3", H: "~ f6@3 b6@4 ~ f6@4 e6@3 d6@4 e6@4", I: "~ f6@3 ~@20",
})).s("gm_whistle").gain(0.72)

// bass · synth bass 2 · "Music"
const bass = note(`<
  ~ A@2 B@2 C@2 B@2 D@2 E@2 F@2 G@2 H I J K L M J K H I@2 K H I@2 K H I J K L M J K H I J K L M J K H I@2 K H I@2 K H I
  J K L M J K H I@2 K H I@2 K H I J K L M J K ~ N@2 G@2 O@8 P@8 Q@8 R@5
>`.pickRestart({
  A: "[~ d1@15]/2", B: "[~@2 g1@45 ~]/2", C: "[~@2 f1@45 ~]/2", D: "[~ d1@45 ~@2]/2", E: "[~ g1@45 ~@2]/2",
  F: "[~ f1@45 ~@2]/2", G: "[g1@15 ~]/2", H: "d1@8 ~ d1@3 d1@3 d1@6 d1@3", I: "d1 d1@2 d1!2 d1@2 d1",
  J: "g1@8 ~ g1@3 g1@3 g1@6 g1@3", K: "g1 g1@2 g1!2 g1@2 g1", L: "f1@8 ~ f1@3 f1@3 f1@6 f1@3",
  M: "f1 f1@2 f1!2 f1@2 f1", N: "[d1@15 ~]/2",
  O: "[~@5 f1@8 ~ f1@3 f1@3 f1@6 f1@3 f1@3 f1@6 f1@3 f1@3 f1@6 f1@3 g1@8 ~ g1@3 g1@3 g1@6 g1@3 g1@3 g1@6 g1@3 g1@3 g1@6 g1@3 d1@8 ~ d1@3 d1@3 d1@6 d1@3 d1@3 d1@6 d1@3 d1@3 d1@6 d1@3 d1@3 d1@6 d1@3 d1@3 d1@6 d1@3 g1@3 g1@6 g1@3 g1@3 g1@4]/8",
  P: "[~@2 g1@3 d1@8 ~ d1@3 d1@3 d1@6 d1@3 d1@3 d1@6 d1@3 d1@3 d1@6 d1@3 d1@3 d1@6 d1@3 d1@3 d1@6 d1@3 g1@3 g1@6 g1@3 g1@3 g1@6 g1@3 d1@8 ~ d1@3 d1@3 d1@6 d1@3 d1@3 d1@6 d1@3 d1@3 d1@6 d1@3 g1@8 ~ g1@3 g1@3 g1@6 g1@3 g1@3 g1@6 g1@3 g1@3 g1@4]/8",
  Q: "[~@2 g1@3 f1@8 ~ f1@3 f1@3 f1@6 f1@3 f1@3 f1@6 f1@3 f1@3 f1@6 f1@3 g1@8 ~ g1@3 g1@3 g1@6 g1@3 g1@3 g1@6 g1@3 g1@3 g1@6 g1@3 d1@45 ~@3 g1@43]/8",
  R: "[~@5 f1@45 ~@2 g1@45 ~@23]/5",
})).s("gm_synth_bass_2").gain(0.72)

// chords · string ensemble 2
const string_ensemble_2 = note("<~@9 A B C@2 D@2 E@2 ~@65 F G H@2 ~@29>".pickRestart({
  A: "~ a4 ~ [d5,f5]@20 ~", B: "~ d4@21 ~@2", C: "[~ [g4,b4,g5]@45 ~@2]/2", D: "[~ [a4,c5,f5]@45 ~@2]/2",
  E: "[[g4,b4,d5]@15 ~]/2", F: "a4 [d5,f5]@20 ~@3", G: "d4@7 ~", H: "[[g4,b4,g5]@15 ~]/2",
})).s("gm_string_ensemble_2").gain(0.72)

// chords · string ensemble 2
const string_ensemble_2_2 = note(`<
  ~@9 A@2 B@2 C@2 D@2 E@2 F@2 G@2 H@2 E@2 F@2 E@2 F@2 E@2 F@2 G@2 H@2 E@2 F@2 G@2 H@2 E@2 F@2 E@2 F@2 E@2 F@2 G@2 H@2
  E@2 F@2 E@2 F@2 E@2 F@2 G@2 H@2 ~ I@2 D@2 J@8 K@8 L@5 ~@8
>`.pickRestart({
  A: "[~ [d3,a3] ~ [d4,f4]@32 ~@2 c4@10 ~]/2", B: "[~ [g3,b3,d4,g4]@45 ~@2]/2", C: "[~ [f3,a4] c4@43 ~@3]/2",
  D: "[[g3,b3,d4,g4]@15 ~]/2", E: "[[d3,f3,a3]@23 ~]/2", F: "[[g3,b3]@23 ~]/2", G: "[[f3,a3,c4]@23 ~]/2",
  H: "[[d3,g3,b3]@23 ~]/2", I: "[[d3,a3] [d4,f4]@31 ~@4 c4@10 ~@2]/2",
  J: "[~@5 [f3,a3,c4]@46 ~@2 [d3,g3,b3]@46 ~@2 [d3,f3,a3]@46 ~@2 [g3,b3]@43]/8", // F G Dm G
  K: "[~@5 [d3,f3,a3]@46 ~@2 [g3,b3]@46 ~@2 [d3,f3,a3]@46 ~@2 [g3,b3]@43]/8", // Dm G Dm G
  L: "[~@5 [f3,a3,c4]@46 ~@2 [d3,g3,b3]@46 ~@21]/5", // F G
})).s("gm_string_ensemble_2").gain(0.72)

// chords · distortion guitar · "Madonna and"
const distortion_guitar = note(`<
  ~@17 A@2 B@2 C@2 D@2 ~@8 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 ~@8 A@2 B@2 C@2 D@2 ~@8 A@2 B@2 C@2 D@2 ~@5 E@5 ~@7 F@4 E@5
  ~@8
>`.pickRestart({
  A: "[~ g3@2 a3@3 f4@16 ~@5 a3@3 d4@3 f4@3 e4@3 d4@3 ~@3 d3@3, [d2,a2,d3]@15 ~, ~@42 a3@5 ~]/2", // D5
  B: "[~@3 b3@2 d4 b3@17 ~, ~@3 [g2,d3]@20 ~]/2", // G5
  C: "[f3@5 ~ f4@21 f3@3 [a3,c4,f4]@5 ~ [a3,c4,f4]@3 [a3,c4,f4]@3 [a3,c4,f4]@5 ~, f2@23 ~]/2", // F
  D: "[~@3 [g3,b3]@20 ~, [g2,d3]@23 ~]/2", // G G5
  E: "[~@5 f3@5 ~ f4@21 f3@3 [a3,c4,f4]@5 ~ [a3,c4,f4]@3 [a3,c4,f4]@3 [a3,c4,f4]@5 ~@7 [g3,b3]@40 ~@21, ~@5 f2@46 ~@2 [g2,d3]@46 ~@21]/5", // F G G5
  F: "[~@6 g3@2 a3@3 f4@16 ~@5 a3@3 d4@3 f4@3 e4@3 d4@3 ~@3 d3@3 ~@6 b3@4 d4@2 b3@31, ~@5 [d2,a2,d3]@45 ~@9 [g2,d3]@37, ~@47 a3@5 ~@44]/4", // D5 G5
})).s("gm_distortion_guitar").gain(0.72)

// chords · electric guitar muted · "Orbit"
const electric_guitar_muted = note(`<
  ~@17 A B C@2 D E C@2 A B A C A B A C A B C@2 D E C@2 A B C@2 D E C@2 A B A C A B A C A B C@2 D E C@2 A B A C A B A C A
  B C@2 D E C@2 ~@5 F@2 G H I@2 J@2 I@2 J@2 I@2 K H L@2 G H M ~@8
>`.pickRestart({
  A: "[d3,a3]!2 ~ [d3,a3]!2 [d3,a3]@2 [d3,a3]", B: "[d3,a3]!2 ~ [d3,a3]!3 ~ [d3,a3]",
  C: "[g3,d4]!2 ~ [g3,d4]!3 ~ [g3,d4]", D: "[f3,c4]!2 ~ [f3,c4]!2 [f3,c4]@2 [f3,c4]",
  E: "[f3,c4]!2 ~ [f3,c4]!3 ~ [f3,c4]", // F5
  F: "[~@5 [f3,c4]@3 [f3,c4]@3 ~@3 [f3,c4]@3 [f3,c4]@3 [f3,c4]@6 [f3,c4]@3 [f3,c4]@3 [f3,c4]@3 ~@3 [f3,c4]@3 [f3,c4]@3 [f3,c4]@3 ~]/2", // F5
  G: "~@2 [f3,c4]@3 [g3,d4]@3 [g3,d4]@3 ~@3 [g3,d4]@3 [g3,d4]@3 [g3,d4]@3 ~", // F5 G5
  H: "~@2 [g3,d4]@3 [g3,d4]@3 [g3,d4]@3 ~@3 [g3,d4]@3 [g3,d4]@3 [g3,d4]@3 ~", // G5
  I: "[~@2 [g3,d4]@3 [d3,a3]@3 [d3,a3]@3 ~@3 [d3,a3]@3 [d3,a3]@3 [d3,a3]@6 [d3,a3]@3 [d3,a3]@3 [d3,a3]@3 ~@3 [d3,a3]@3 [d3,a3]@3 [d3,a3]@3 ~]/2", // G5 D5
  J: "[~@2 [d3,a3]@3 [d3,a3]@3 [d3,a3]@3 ~@3 [d3,a3]@3 [d3,a3]@3 [d3,a3]@6 [d3,a3]@3 [g3,d4]@3 [g3,d4]@3 ~@3 [g3,d4]@3 [g3,d4]@3 [g3,d4]@3 ~]/2", // D5 G5
  K: "~@2 [d3,a3]@3 [g3,d4]@3 [g3,d4]@3 ~@3 [g3,d4]@3 [g3,d4]@3 [g3,d4]@3 ~", // D5 G5
  L: "[~@2 [g3,d4]@3 [f3,c4]@3 [f3,c4]@3 ~@3 [f3,c4]@3 [f3,c4]@3 [f3,c4]@6 [f3,c4]@3 [f3,c4]@3 [f3,c4]@3 ~@3 [f3,c4]@3 [f3,c4]@3 [f3,c4]@3 ~]/2", // G5 F5
  M: "~@2 [g3,d4]@3 ~@19", // G5
})).s("gm_electric_guitar_muted").gain(0.72)

// drums · kick
const kick = s("bd").struct(`<
  ~@17 A B A B A B A B A B C B A B C B A B A B A B A B A B A B A B A B A B C B A B C B A B A B A B A B A B C B A B C B A
  B A B A B A B ~@5 D E F E F E F G F E F G F E F E F E F E H ~@8
>`.pickRestart({
  A: "x ~@2 x!3 ~ x", B: "x!2 ~ x!3 ~ x", C: "x ~@2 x!3 ~@2", D: "~@5 x ~@8 x ~@2 x ~@2 x ~@3",
  E: "~@2 x ~@2 x ~@2 x ~@5 x ~@2 x ~@2 x ~@3", F: "~@2 x ~@2 x ~@8 x ~@2 x ~@2 x ~@3",
  G: "~@5 x ~@2 x ~@5 x ~@2 x ~@2 x ~@3", H: "~ x ~@10",
})).gain(0.72)

// drums · clap
const clap = s("cp").struct("<~@17 A@10 B A@3 B A@19 B A@3 B A@11 B A@3 B A@9 ~@5 C@6 D C@3 D C@9 ~@9>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@11 x ~@11 x", D: "~@11 x ~@12",
})).gain(0.72)

// drums · snare
const snare = s("sd").struct("<~@17 A@10 B A@3 B A@19 B A@3 B A@11 B A@3 B A@9 ~@5 C@6 D C@3 D C@9 ~@9>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@11 x ~@11 x", D: "~@11 x ~@12",
})).gain(0.72)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@25 A B C ~ A B C ~@17 A B C ~ A B C ~@9 A B C ~ A B C ~@18 D E F ~ D E F ~@18
>`.pickRestart({
  A: "x ~@2 x!3 ~ x", B: "x!2 ~ x!3 ~ x", C: "x ~@2 x!3 ~@2", D: "~@5 x ~@8 x ~@2 x ~@2 x ~@3",
  E: "~@2 x ~@2 x ~@2 x ~@5 x ~@2 x ~@2 x ~@3", F: "~@2 x ~@2 x ~@8 x ~@2 x ~@2 x ~@3",
})).gain(0.72)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@19 A B C B C B C B C B C B C B ~@2 A B C B C B ~@2 A B C B C B C B C B C B C B ~@2 A B C B C B C B C B C B C B ~@2 A
  B C B C B ~@5 D E D E D E D E D E D E ~@2 F E D E D E ~@9
>`.pickRestart({
  A: "x", B: "x!4", C: "x!2 ~ x", D: "~@5 x ~@5 x ~@11 x", E: "~@5 x ~@5 x ~@5 x ~@5 x", F: "~@5 x ~@18",
})).gain(0.72)

// drums · ride
const ride = s("rd").struct("<~@17 A B@15 A B@7 A B@15 A B@15 A B@7 ~@5 C D@11 E D@7 F ~@8>".pickRestart({
  A: "~ x!7", B: "x!8", C: "~@5 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x",
  D: "~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x", E: "~@2 x ~@5 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x", F: "~ x ~@10",
})).gain(0.72)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@25 A@3 ~ A@3 ~@17 A@3 ~ A@3 ~@9 A@3 ~ A@3 ~@18 B C@2 D B C@2 D ~@17
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~@4 x ~@2 x ~@2 x ~", C: "~ x ~@2 x ~@2 x ~@2 x ~", D: "~ x ~@10",
})).gain(0.72)

// drums · splash
const splash = s("cr").struct(`<
  ~@17 A ~@7 B@3 ~ B@3 ~ A ~@7 A ~@7 B@3 ~ B@3 ~ A ~@7 B@3 ~ B@3 ~ A ~@16 C D@2 E C D@2 E F ~@16
>`.pickRestart({
  A: "x", B: "~ x ~ x ~ x ~ x", C: "~@4 x ~@2 x ~@2 x ~", D: "~ x ~@2 x ~@2 x ~@2 x ~", E: "~ x ~@10", F: "~@5 x ~@18",
})).gain(0.72)

stack(
  vibraphone, whistle, bass, string_ensemble_2, string_ensemble_2_2, distortion_guitar, electric_guitar_muted, kick,
  clap, snare, low_tom, open_hat, ride, tambourine, splash
)

More by Madonna