Strudelify

Mystic Rhythms

Rush

KeyE♭ minorTempo120 bpm
0:00/0:00
// Mystic Rhythms — Rush
// 120 bpm, 4/4, key D# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 44 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 · electric guitar clean · "Rhythm Elec Guitar Clean"
const electric_guitar_clean = note("<~@20 A B C D A B C D A B C D A B C D A B C D A B C D>".pickRestart({
  A: "~@2 [ab3,db4,f4,bb4]@2 [ab3,db4,f4,bb4]!4 [ab3,db4,f4,bb4]@2 ~@2 [ab3,db4,f4,bb4]@2 ~@2", // Bbm7
  B: "~@2 [ab3,db4,f4,bb4]@2 [ab3,db4,f4,bb4]!4 [ab3,db4,f4,bb4]@2 ~@2 [ab3,db4,eb4,bb4]@2 ~@2", // Bbm7 Absus4
  C: "~@2 [bb3,eb4,ab4,db5]@2 [bb3,eb4,ab4,db5]!4 [bb3,eb4,ab4,db5]@2 ~@2 [bb3,f4,ab4,db5]@2 ~@2", // Bbm7
  D: "~@2 [bb3,f4,bb4,db5]@2 [bb3,f4,bb4,db5]!4 [bb3,f4,bb4,db5]@2 ~@2 [bb3,f4,bb4,db5]@2 ~@2", // Bbm
})).s("gm_electric_guitar_clean").gain(0.29)

// bass · slap bass 1 · "Elec Bass"
const bass = note("<~@4 A B ~@2 A ~@3 A ~@2 C D ~@3 E F G H E F G H E F G H E F G H E F G H E F G H>".pickRestart({
  A: "~@12 gb2 ab2 gb2 ~", B: "~@6 eb4 ~@3 db4 ~@5", C: "~@7 eb1", D: "eb1 ~@7",
  E: "eb1@3 ~ eb1@3 ~ eb1@3 ~ eb2@2 bb1@2", F: "eb1@3 ~ eb1@3 ~ eb1@3 ~ eb2@2 eb1@2",
  G: "gb1@3 ~ gb1@3 ~ gb1@3 ~ gb2@2 db2@2", H: "gb1@3 ~ gb1@3 ~ gb1@3 ~ gb2@2 gb1@2",
})).s("gm_slap_bass_1").gain(0.64)

// other · string ensemble 1 · "Strings Ominous"
const string_ensemble_1 = note("<~@5 A@8 B C@2 B@2 C@2 B@2 C@2 B@2 C@2 B@2 C@2 B@2 C@2 B@2 C@2 B@2 C@2>".pickRestart({
  A: "[~@3 eb1 eb1 gb1 gb1 eb1, ~@7 [db5,ab5,bb5,db6,eb6]@57]/8", B: "eb1", C: "gb1",
})).s("gm_string_ensemble_1").gain(0.8)

// chords · pad sweep · "Aahs Sweeping"
const pad_sweep = note("<~@9 A@3 B@3 C@8 D@3 E@2 F@4 G@4 H@4 I@4>".pickRestart({
  A: "[~@35 g5@12 ~, bb4@23 ~, ~@14 eb5@31 ~@3]/3", B: "[~@23 g5, bb4, ~@7 eb5@5]/3",
  C: "[~@32 bb5@16 eb5 ~@44 b4 ~@18 eb5@16, ~@15 bb4@69 ~@2 bb4@12 ~@2 bb4@28, ~@51 eb5@32 ~@45, ~@35 g5@29]/8",
  D: "[~@16 bb4@20 ~ bb4@11, ~ g5@8 ~@7]/3", E: "[eb5@19 g5@13]/2", F: "[~@15 bb6@15 ~@2 eb5@18 g5@14, bb4@63 ~]/4",
  G: "[~@15 eb5@9 f5@8, bb4@61 ~@3]/4", H: "[bb4@29 ~@17 g5@16 ~@2, ~@29 c5@33 ~@2]/4",
  I: "[~@23 g5@9, bb4, ~@15 eb5@17]/4",
})).s("gm_pad_sweep").gain(0.08)

// drums · kick
const kick = s("bd").struct("x!4").gain(0.57)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@10 [~@12 x!2 ~@2] ~@8 [~@5 x!2 ~] ~@24>").gain(0.57)

// drums · high tom
const high_tom = s("ht").struct("<~@19 [~ x] ~@24>").gain(0.45)

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

// drums · cabasa
const cabasa = s("cabasa:4").struct("<[~@4 x!2 ~@2]!19 [~@4 x!3 ~] [~@4 x!2 ~@2]!24>").gain(2.88)

stack(electric_guitar_clean, bass, string_ensemble_1, pad_sweep, kick, low_tom, mid_tom, high_tom, china, cabasa)

More by Rush