Strudelify

Sandstorm

Darude

KeyB minorTempo141 bpm
0:00/0:00
// Sandstorm — Darude
// 141 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 6 "chord synth" synth brass 1 (copy of ch 5 "chord synth" string ensemble 1)
// note: Full arrangement: all 161 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(141/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 · electric bass finger · "bass"
const bass = note(`<
  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 ~@32 A C A B A C A B A C A B A D A B A D A B A C A B A
  C 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 C A B A C A B A C A B A C A B A C A B A C A B A B A B
  A B A B A B A B A B A B ~
>`.pickRestart({
  A: "~ b1 ~ b1 ~ b1 ~ b1", B: "~@2 b1@2 ~@2 b1@2 ~@2 b1@2 a1 ~ b1@2", C: "~@2 e2@2 ~@2 e2@2 ~@2 d2@2 a1 ~ d2@2",
  D: "~ e2@2 ~@2 e2@2 ~@3 d2@2 a1 ~ d2@2",
})).s("gm_electric_bass_finger").gain(0.22)

// chords · string ensemble 1 · "chord synth"
const string_ensemble_1 = note(`<
  ~@43 A B 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@2 ~@20 D C B@3 C B@3 C B@3 C B@3
  C B@3 C B@3 C B@2 ~@17
>`.pickRestart({
  A: "~@11 [e4,g4,b4] ~@2 [d4,f#4,a4]@2", // Em D
  B: "[e4,g4,b4] ~@2 [e4,g4,b4] ~@2 [e4,g4,b4]@2 [e4,g4,b4] ~@2 [e4,g4,b4] ~@2 [d4,f#4,a4]@2", // Em D
  C: "[g4,c5,e5] ~@2 [g4,c5,e5] ~@2 [g4,b4,d5]@2 [g4,b4,d5] ~@2 [g4,b4,d5] ~@2 [d4,f#4,a4]@2", // C G D
  D: "~@3 [e4,g4,b4] ~@2 [e4,g4,b4]@2 [e4,g4,b4] ~@2 [e4,g4,b4] ~@2 [d4,f#4,a4]@2", // Em D
})).s("gm_string_ensemble_1").gain(0.22).pan(0.6)

// chords · string ensemble 1 · "chord synth" · soft notes
const string_ensemble_1_soft = note("<~@32 A B A@3 B A@3 B A C ~@68 A B A@2 D ~@44>".pickRestart({
  A: "[e4,g4,b4] ~@2 [e4,g4,b4] ~@2 [e4,g4,b4]@2 [e4,g4,b4] ~@2 [e4,g4,b4] ~@2 [d4,f#4,a4]@2", // Em D
  B: "[g4,c5,e5] ~@2 [g4,c5,e5] ~@2 [g4,b4,d5]@2 [g4,b4,d5] ~@2 [g4,b4,d5] ~@2 [d4,f#4,a4]@2", // C G D
  C: "[e4,g4,b4] ~@2 [e4,g4,b4] ~@2 [e4,g4,b4]@2 [e4,g4,b4] ~@7", D: "[e4,g4,b4] ~@15",
})).s("gm_string_ensemble_1").gain(0.08).pan(0.6)

// other · string ensemble 2 · "high string"
const string_ensemble_2 = note("<~@32 A@16 ~@32 A@16 ~@24 A@16 ~@25>".pickRestart({
  A: "e6/4",
})).s("gm_string_ensemble_2").gain(0.12)

// other · lead 8 bass lead · "arpeggio"
const lead_8_bass_lead = note(`<
  ~@40 A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A C D E A C D E A C D E A C D E A C D E A C D E A C D E A C D E A C D E A C D
  E A C D E A C D E A C D E A C D E A C D E A C D E A C D E A C D E A C D E A C D E ~@17
>`.pickRestart({
  A: "b1 b2 ~ b1 b2 ~ b1 b2 b1 b2 ~ b1 b2 ~ b1 b2", B: "b1 b2 ~ b1 b2 ~ b1 b2 b1 b2 ~ b1 b2 ~ b2 b1",
  C: "e2 e3 ~ e2 e3 ~ e2 e3 d2 d3 ~ d2 d3 ~ d2 d3", D: "b1 b2 ~ b1 b2 ~ b1 b2 b1 b2 ~ d2 d3 ~ d2 d3",
  E: "b1 b2 ~ b1 b2 ~ b1 b2 b1 b2 ~ b1 b2 ~ a2 b1",
})).s("gm_lead_8_bass_lead").gain(0.12)

// other · harpsichord · "lead delayR"
const harpsichord = note(`<
  ~@8 A B C D E A D F G F H F G F H G@3 H G I@2 J K ~@16 A ~ L M N O P F G Q P F G Q R S ~@40 D E T U M F H F G F H F G
  F V J W X P F G Q P F G Q P F G Q P F G F H F G F H F G F H F G F H F G F H F I@2 J Y Z
>`.pickRestart({
  A: "~@8 [b2,b3]!4 [b2,b3]@2 ~@2", B: "~@14 [b2,b3]!2",
  C: "[b2,b3]!4 [b2,b3]@2 [a2,a3]!2 [b2,b3]!4 [b2,b3]@2 [b2,b3] ~", D: "~@8 [b2,b3]!4 [b2,b3]@2 [b2,b3]!2",
  E: "[b2,b3]!4 [b2,b3]@2 [d3,d4]!2 ~@8", F: "[b2,b3]!4 [b2,b3]@2 [b2,b3]!6 [b2,b3]@2 [b2,b3]!2",
  G: "[b2,b3]!4 [b2,b3]@2 [d3,d4]!2 [b2,b3]!4 [b2,b3]@2 [b2,b3]!2", // B D B
  H: "[b2,b3]!4 [b2,b3]@2 [a2,a3]!2 [b2,b3]!4 [b2,b3]@2 [b2,b3]!2", // B A B
  I: "[b2,b3]!4 [b2,b3]@2 [d3,d4]!2 [b2,b3]!4 [b2,b3]@2 [d3,d4]!2", // B D B D
  J: "[b2,b3]!4 [b2,b3]@2 [d3,d4]!2 [b2,b3]!2 [d3,d4]!2 [b2,b3]@2 [d3,d4]!2", // B D B D B D
  K: "[b2,b3]!2 [d3,d4]!2 [b2,b3]@2 [d3,d4]!2 [b2,b3]!2 [d3,d4]!2 [b2,b3]@2 [d3,d4]!2", // B D B D B D B D
  L: "~@4 [a2,a3]!4 [b2,b3]!4 [b2,b3]@2 ~@2", M: "~@6 [d3,d4]!2 [b2,b3]!4 [b2,b3]@2 [b2,b3]!2",
  N: "[b2,b3]!4 [b2,b3]@2 [d3,d4]!2 [b2,b3]!4 [b2,b3]@2 ~@2", O: "~@4 [d3,d4]!4 [b2,b3]!4 [b2,b3]@2 [d3,d4]!2",
  P: "[d3,d4]!4 [d3,d4]@2 [a2,a3]!2 [b2,b3]!4 [b2,b3]@2 [b2,b3]!2", // D A B
  Q: "[b2,b3]!4 [b2,b3]@2 [b2,b3]!2 [e3,e4]!4 [e3,e4]@2 [d3,d4]!2", R: "[d3,d4]!4 [d3,d4]@2 [a2,a3]!2 [b2,b3]!8",
  S: "[b2,b3]!16", T: "~@6 [a2,a3]!2 [b2,b3]!4 [b2,b3]@2 [b2,b3]!2", U: "[b2,b3]!4 [b2,b3]@2 [b2,b3]!6 [b2,b3]@2 ~@2",
  V: "[b2,b3]!4 [b2,b3]@2 [a2,a3]!2 [b2,b3]!4 [b2,b3]@2 [d3,d4]!2", // B A B D
  W: "[b2,b3]!2 [d3,d4]!2 [b2,b3]@2 [d3,d4]!2 [b2,b3]!8", X: "[b2,b3]!8 [e3,e4]!4 [e3,e4]@2 [d3,d4]!2",
  Y: "[b2,b3]!2 [d3,d4]!2 [b2,b3]@2 [d3,d4]!2 [b2,b3]!2 [d3,d4]!2 [b2,b3]!2 [d3,d4]!2", Z: "[b2,b3]!8 ~@8",
})).s("gm_harpsichord").gain(0.14).pan(0.9)

// other · harpsichord · "lead delayL"
const harpsichord_2 = note(`<
  ~@9 A B C D ~ A E D E F E D E F D@3 F D@2 G@2 H ~@17 A I J D K L E D E M E D E M N ~@41 D O E J E F E D E F E D E F G
  H N M E D E M E D E M E D E M E D E F E D E F E D E F E D E F E D E F E D G@2 H P
>`.pickRestart({
  A: "[b2,b3]!4 [b2,b3]@2 ~@10", B: "~@6 [b2,b3]!6 [b2,b3]@2 [a2,a3]!2", C: "[b2,b3]!4 [b2,b3]@2 [b2,b3] ~@9",
  D: "[b2,b3]!4 [b2,b3]@2 [b2,b3]!6 [b2,b3]@2 [d3,d4]!2", E: "[b2,b3]!4 [b2,b3]@2 [b2,b3]!6 [b2,b3]@2 [b2,b3]!2",
  F: "[b2,b3]!4 [b2,b3]@2 [b2,b3]!6 [b2,b3]@2 [a2,a3]!2", // B A
  G: "[b2,b3]!4 [b2,b3]@2 [d3,d4]!2 [b2,b3]!4 [b2,b3]@2 [d3,d4]!2", // B D B D
  H: "[b2,b3]!2 [d3,d4]!2 [b2,b3]@2 [d3,d4]!2 [b2,b3]!2 [d3,d4]!2 [b2,b3]@2 [d3,d4]!2", I: "~@12 [a2,a3]!4",
  J: "[b2,b3]!4 [b2,b3]@2 ~@8 [d3,d4]!2", K: "[b2,b3]!4 [b2,b3]@2 ~@6 [d3,d4]!4",
  L: "[b2,b3]!4 [b2,b3]@2 [d3,d4]!6 [d3,d4]@2 [a2,a3]!2", M: "[e3,e4]!4 [e3,e4]@2 [d3,d4]!6 [d3,d4]@2 [a2,a3]!2",
  N: "[b2,b3]!16", O: "~@14 [a2,a3]!2", P: "[b2,b3]!2 [d3,d4]!2 [b2,b3]!2 [d3,d4]!2 [b2,b3]!8",
})).s("gm_harpsichord").gain(0.17).pan(0.1)

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

// drums · rim
const rim = s("rim").struct(`<
  ~@31 A ~@3 A ~@3 A ~@4 A ~@2 A ~@3 A ~@3 A ~@3 A ~@55 A ~@3 A ~@15 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~
>`.pickRestart({
  A: "~@3 x ~@2 x ~ x ~@2 x ~@4",
})).gain(0.22)

// drums · clap
const clap = s("cp").struct("<[~ x ~ x]!32 ~@16 [~ x ~ x]!96 ~@17>").gain(0.22)

// drums · snare
const snare = s("sd").struct("<~@24 A@8 ~@24 A@8 ~@8 A@8 ~@8 A@8 ~@16 A@8 ~@41>".pickRestart({
  A: "x!16",
})).gain(0.12)

// drums · hihat
const hihat = s("hh").struct("<~@4 [x!2 ~@2 x ~@3 x ~@3 x!2 ~@2]!28 ~@24 [x!2 ~@2 x ~@3 x ~@3 x!2 ~@2]!96 ~@9>")
  .gain(0.22)

// drums · open hat
const open_hat = s("oh").struct("<~@4 [~ x ~ x ~ x ~ x]!28 ~@24 [~ x ~ x ~ x ~ x]!96 ~@9>").gain(0.24)

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

// drums · ride
const ride = s("rd").struct("<[x!8]!32 ~@16 [x!8]!96 ~@17>").gain(0.22)

stack(
  bass, string_ensemble_1, string_ensemble_1_soft, string_ensemble_2, lead_8_bass_lead, harpsichord, harpsichord_2,
  kick, rim, clap, snare, hihat, open_hat, crash, ride
)

More by Darude