Strudelify
Shanti   Ashtangi cover art

1998 · Ray of Light

Shanti Ashtangi

Madonna

KeyB majorTempo140 bpm
0:00/0:00
// Shanti   Ashtangi — Madonna
// 140 bpm, 4/4, key B 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(140/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · fretless bass · "Bass"
const bass = note(`<
  A@19 B A C A@2 D E D E D E D E D E D F D E D E D E D E D E D F D E D F D E D F D E D E D E D E A@11 B A C A@2 D E D E
  D E D E D E D F D E D E D E D E D E D F D E D F D E D F D E D ~ G@2 H@6 D E D F D E D E D E D E D E D E D E D E D E D
  E D E D E
>`.pickRestart({
  A: "b0@3 ~ b0@2 b1@5 ~@3 d#1@2", B: "b0@3 ~ b0@2 b1@5 ~ d#1@2 b0@2", C: "b0@3 ~@11 d#1@2",
  D: "b0@3 ~ b0@2 b0@5 ~ b1@3 ~", E: "b0@3 ~ b0@2 b0@5 ~ b1@2 d#1@2", F: "~@12 b1@3 ~", G: "[b1@29 ~@3]/2",
  H: "[b1@31 ~]/2",
})).s("gm_fretless_bass").gain(0.39)

// bass · synth bass 2 · "Bass 2"
const bass_2 = note(`<
  A@19 B A C A@2 D E D E D E D E D E D F D E D E D E D E D E D F D E D F D E D F D E D E D E D E A@11 B A C A@2 D E D E
  D E D E D E D F D E D E D E D E D E D F D E D F D E D F D E D ~ G@2 H@6 D E D F D E D E D E D E D E D E D E D E D E D
  E D E D E
>`.pickRestart({
  A: "b1@3 ~@3 b1@5 ~@3 d#1@2", B: "b1@3 ~@3 b1@4 d#1@2 f#1@2 b0@2", C: "b1@3 ~@11 d#1@2", D: "b1@3 ~@3 b1@5 ~ b1@3 ~",
  E: "b1@3 ~@3 b1@5 ~ b1@2 d#1@2", F: "~@12 b1@3 ~", G: "[b1@29 ~@3]/2", H: "[b1@31 ~]/2",
})).s("gm_synth_bass_2").gain(0.39)

// other · shakuhachi · "Shaku"
const shakuhachi = note(`<
  ~@32 A@8 B ~@4 C ~@3 C ~@3 C ~@3 C ~@30 A@8 B ~@4 C ~@3 C ~@3 C ~@3 C ~@2 D@8 ~ C ~@3 C ~@22
>`.pickRestart({
  A: "[b3@61 ~@3]/4", B: "a3!2 b3!6", C: "~ [a3,a4] [e4,e5] [d#4,d#5]", D: "[b3@63 ~]/4",
})).s("gm_shakuhachi").gain(0.29)

// other · shakuhachi · "Shaku" · soft notes · A E D#
const shakuhachi_soft = note("<~@41 [b3!8] ~@55 [b3!8] ~@52 [~ [a3,a4] [e4,e5] [d#4,d#5]] ~>")
  .s("gm_shakuhachi").gain(0.1)

// other · overdriven guitar · "Guitar"
const overdriven_guitar = note(`<
  ~@6 A B ~@14 C D ~@18 A B ~ E ~@3 E ~@3 E ~@3 E ~@20 C D ~@21 E ~@3 E ~@3 E ~@3 E ~@3 E ~ F@2 E G H ~ E ~@3 E ~@5 F@2
  I@3 ~@12
>`.pickRestart({
  A: "~@6 f#3 e4", B: "d#4 e4 d#4@3 ~@3", C: "~@7 e4", D: "d#4 e4 d#4@5 ~", E: "~ [a3,a4] [e4,e5] [d#4,d#5]",
  F: "[~@14 d#5@5 ~@5 c#5@2 c#5 ~@5]/2", G: "d#5@3 ~@5 c#5@2 c#5 ~@3 e5@2", H: "d#5@2 e5@2 d#5@2 e5@2 ~@2 d#4@5 ~",
  I: "[~@14 d#5@5 ~@5 c#5@2 c#5 ~@3 b4@4 b4@3 ~ a4@8 ~@2]/3",
})).s("gm_overdriven_guitar").gain(0.19)

// other · overdriven guitar · "Guitar" · soft notes · A E D#
const overdriven_guitar_soft = note("<~@123 [~@4 d#5 ~@3] ~@26 [~ [a2,a3] [e3,e4] [d#3,d#4]] ~>")
  .s("gm_overdriven_guitar").gain(0.06)

// drums · kick
const kick = s("bd").struct(`<
  [x ~ x!2 ~@3 x]!60
  [x!4]!4
  [x ~ x!2 ~@3 x]!4
  [x!4]!28
  [x ~ x!2 ~@3 x]!4
  [x!4]!16
  ~@8
  [x!4]!28
>`).gain(0.39)

// drums · snare
const snare = s("sd").struct("<[~ x]!116 ~@8 [~ x]!28>").gain(0.29)

// drums · low tom
const low_tom = s("lt").struct(`<
  [x ~ x ~@4 x]!60
  [x ~ x ~@2 x!2 ~]!4
  [x ~ x ~@4 x]!4
  [x ~ x ~@2 x!2 ~]!28
  [x ~ x ~@4 x]!4
  [x ~ x ~@2 x!2 ~]!16
  ~@8
  [x ~ x ~@2 x!2 ~]!28
>`).gain(0.29)

// drums · hihat
const hihat = s("hh").struct(`<
  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 A@7 B A@31 B A@16 ~@8 A@11 B
  A@3 B A@12
>`.pickRestart({
  A: "x!8", B: "x!7 ~",
})).gain(0.29)

// drums · mid tom
const mid_tom = s("mt").struct("<[~@3 x ~@4]!116 ~@8 [~@3 x ~@4]!28>").gain(0.29)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@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 ~@7 A ~@31 A ~@35 A ~@3 A
  ~@12
>`.pickRestart({
  A: "~@7 x",
})).gain(0.29)

// drums · tambourine
const tambourine = s("tb").struct("<[~@2 x ~@2 x!2 ~]!63 ~ [~@2 x ~@2 x!2 ~]!52 ~@8 [~@2 x ~@2 x!2 ~]!28>").gain(0.24)

// drums · congas
const congas = s("conga:18").struct("<~@32 A@3 ~ A@27 ~@25 A@3 ~ A@4 ~@4 A@16 ~@8 A@22 B ~@5>".pickRestart({
  A: "x!3 ~ x ~ x!3 ~ x ~ x!3 ~", B: "x!3 ~ x ~ x!3 ~ x ~ x!2 ~@2",
})).gain(0.78)

// drums · congas · soft notes
const congas_soft = s("conga:18").struct("<~@146 [~@7 x] [x!3 ~ x ~ x!3 ~ x ~ x!3 ~]!5>").gain(0.31)

// drums · ht
const ht = s("ht").struct("<A@21 B A@13 B A@27 ~ A@13 B A@13 B A@4 ~@4 A@16 ~@8 A@23 ~@5>".pickRestart({
  A: "~ x", B: "~@5 x!11",
})).gain(0.24)

// drums · ht · soft notes
const ht_soft = s("ht").struct("<~@21 A ~@13 A ~@41 A ~@13 A ~@55 B@5>".pickRestart({
  A: "~ x ~@2", B: "~ x",
})).gain(0.15)

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

// drums · claves
const claves = s("clave:2").struct(`<
  ~@44 A B A B A B A B A B A B A B A B ~@40 A B A B A B A B A B A B A B A B ~@8 A B A B A B A B A B A B A B A B A B A B
  A B A ~@5
>`.pickRestart({
  A: "x ~ x!2 ~ x ~@2", B: "~@3 x",
})).gain(1.19)

// drums · claves · soft notes
const claves_soft = s("clave:2").struct("<~@147 [~@3 x] [x ~ x!2 ~ x ~@2] [~@3 x] [x ~ x!2 ~ x ~@2] [~@3 x]>")
  .gain(0.24)

stack(
  bass, bass_2, shakuhachi, shakuhachi_soft, overdriven_guitar, overdriven_guitar_soft, kick, snare, low_tom, hihat,
  mid_tom, open_hat, tambourine, congas, congas_soft, ht, ht_soft, shaker, claves, claves_soft
)

More by Madonna