Strudelify
KeyA majorTempo120 bpm
0:00/0:00
// Citadel — The Rolling Stones
// 120 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 77 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 · overdriven guitar
const overdriven_guitar = note(`<
  A B A B A B A B C D E F C D E F G A B A B A B A B C D E F C D E F H@2 I B A B A B A B C D E F C D E F G A B A B A B A
  B C D E F C D E F G A B A B A B A J
>`.pickRestart({
  A: "[e2,b2,e3]@2 [e3,b3,e4]@2 [a2,e3,a3]!2 [a3,e4,a4]@2", // E5 A5
  B: "[d3,a3,d4]!2 [d#3,a#3,d#4] [e3,b3,e4]@2 [e3,b3,e4] [e3,b3,e4]@2", C: "[e3,b3,e4]@3 [e3,b3,e4]", D: "[d3,a3,d4]!2",
  E: "[c3,g3,c4]@3 [d3,a3,d4]@3 [e3,b3,e4]@2 [d3,a3,d4]@3 [e3,b3,e4]@3 [g3,d4,g4]@2", F: "[d3,a3,d4]", G: "[a2,e3,a3]",
  H: "[a2,e3,a3]/2", I: "e3@2 [e3,b3,e4]@2 [a2,e3,a3]!2 [a3,e4,a4]@2",
  J: "[d3,a3,d4]@2 [d3,a3,d4]@2 [d#3,a#3,d#4]@2 [e3,b3,e4]@4 [e3,b3,e4]@2 [d4,e4] ~ b3@2, ~@3 e3, ~@6 b3 ~, ~@13 e4@3", // D5 D#5 E5 Dsus2
})).s("gm_overdriven_guitar").gain(0.64)

// bass · electric bass finger
const bass = note(`<
  ~ A B C B C B C D E F G D E F G H ~ A B C B C B C D E F G D E F G I@4 B C B C B C D E F G D E F G H ~ A B C B C B C D
  E F G D E F G H ~ A B C B C B J
>`.pickRestart({
  A: "~@5 e2 e2@2", B: "e1@2 e2@2 a1!2 a2@2", C: "d2!2 d#2 e2@2 e2 e2@2", D: "e2@3 e2", E: "d2!2",
  F: "c2@3 d2@3 e2@2 d2@3 e2@3 g2@2", G: "d2", H: "a1", I: "[~@29 e2 e2@2, a1]/4",
  J: "d2@2 d2@2 d#2@2 e2@4 [e2,e4]@2 d4 e4 b3@2, ~@3 e2", // E
})).s("gm_electric_bass_finger").gain(0.64)

// other · overdriven guitar
const overdriven_guitar_2 = note("<~@69 A B C D C D C D>".pickRestart({
  A: "e4@2 b4@2 a4 b4@2 e4", B: "b4 a4 g4 e4@5", C: "e4 ~@7", D: "~@10 e4@2 d4 e4 b3@2",
})).s("gm_overdriven_guitar").gain(0.64)

// other · guitar harmonics
const guitar_harmonics = note("<A ~@11 B@2 ~@11 B@2 ~@2 B@2 ~@4 A ~@7 B@2 ~@2 B@2 ~@11 B@2 ~@2 B@2 ~@11>".pickRestart({
  A: "~ [e3,e4,e5]@3", B: "~ [e3,e4,e5]",
})).s("gm_guitar_harmonics").gain(0.64)

// drums · kick
const kick = s("bd").struct(`<
  ~@2 A B A C A C D@2 ~ D@3 ~ D E ~@2 A B A C A C D@2 ~ D@3 ~ D E ~@3 A B A C A C D@2 ~ D@3 ~ D E ~@2 A B A C A C D@2 ~
  D@3 ~ D E ~@2 A C A C A C
>`.pickRestart({
  A: "x!2", B: "~ x ~@6", C: "x ~@2 x ~@4", D: "x ~@3 x!2 ~@2", E: "x",
})).gain(0.64)

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

// drums · low tom
const low_tom = s("lt").struct("<~ A ~@16 A ~@17 A ~@16 A ~@16 A ~@6>".pickRestart({
  A: "~@5 x!3",
})).gain(0.64)

// drums · mid tom
const mid_tom = s("mt").struct("<~ A ~@16 A ~@17 A ~@33 A ~@6>".pickRestart({
  A: "~@5 x!3",
})).gain(0.64)

// drums · crash
const crash = s("cr").struct(`<
  ~@2 A@3 B A B ~@2 C ~@3 C ~ D ~@2 A@3 B A B ~@2 C ~@3 C ~ D ~@3 A@3 B A B ~@2 C ~@3 C ~ D ~@2 A@3 B A B ~@2 C ~@3 C ~
  D ~@2 A B A B A B
>`.pickRestart({
  A: "~@2 x ~@2 x!2 ~", B: "~ x!2 ~@2 x!2 ~", C: "x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~", D: "x",
})).gain(0.64)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@8 A@2 ~ A@3 ~ A ~@9 A@2 ~ A@3 ~ A ~@10 A@2 ~ A@3 ~ A ~@9 A@2 ~ A@3 ~ A ~@9
>`.pickRestart({
  A: "x!16",
})).gain(3.24)

stack(overdriven_guitar, bass, overdriven_guitar_2, guitar_harmonics, kick, snare, low_tom, mid_tom, crash, cabasa)

More by The Rolling Stones