Strudelify

Middletown Dreams

Rush

KeyA minorTempo140 bpm
0:00/0:00
// Middletown Dreams — Rush
// 140 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 46, 4/4 at bar 46) are rendered on a constant 4/4 grid of one bar per cycle
// note: duplicate parts dropped: ch 3 "Synth" pad poly (copy of ch 2 "Guitar" distortion guitar)
// note: Full arrangement: all 146 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(140/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 · distortion guitar · "Guitar"
const distortion_guitar = note(`<
  ~@8 A B C D E@2 F G H@2 I ~ J@2 K@2 L@4 M@7 N@2 O@4 P@8 Q@4 R@4 S@5 T U V U T U V U T U V U T U V U T U V W@2 X@3 Y@8
  Z AA@8 AB@7 AC@8 AD@4 Y@8 AE@2 AF AG@3 AF AH AI@2 AF AH AI@2 AJ@2
>`.pickRestart({
  A: "~@5 a4!3", B: "a4 a4@2 g4@2 a4@3", C: "b2 d3 g3 c3@2 a4!3", D: "a4 g4 a4 [c4,d4,g4]@3 ~@2",
  E: "[~@3 a4@2 a4!2 a4@2 g4@2 g4 g4@2 a4@2, ~@3 [c4,d4,g4]@6 ~@7]/2", F: "b2 d3 g3 c3@2 e5!3", G: "g5@2 a5@2 ~ a4!3",
  H: "[a4@2 ~ [g4,c5,d5,e5]@13]/2", I: "b2 d3 g3 c3@5", J: "[~@5 e5!2 [g4,c5,d5,e5]@2 d5 c5 [d4,g4,c5]@2 ~@3]/2",
  K: "[b2 d3 g3 c3@2 e5 d5 d5@2 e5@2 a4!2 g4 ~@2, ~@7 g4@5 ~@4]/2",
  L: "[~@3 e5@2 e5!3 g5@2 e5 e5@2 f#5 g5 g5@3 d5 c6@2 b5 a5 a5@2 g5!2 e5@5, ~@3 [g4,c5,d5]@15 ~ [d5,g5]@6 ~@7]/4", // Gsus4 G5
  M: "[~@8 c6@2 a5@2 a5@4 g5@4 a4@2 b4 c5 g5@4 g5 d5@7 [f4,g4,a4,c5]@15 e5@3 e5!2, ~@3 [f4,g4,a4,c5]@17 [c4,g4]@8 [g4,a4]@8 ~@15 [a4,c5]@5]/7", // F C5 Gsus2 Am
  N: "[f5@2 e5 e5@2 d5@7 ~@2 c5!2, ~@3 [g4,a4]@9 [c4,e4,a4]@4]/2", // Gsus2 Am
  O: "[e5 e5@2 [e4,a4,c5]@7 ~ e5@3 e5@2 e5@2 e5 [g4,a4,d5,g5]@8 [c5,e5,a5]@3 c5@2, ~@11 [a4,c5]@8 ~@13]/4", // Am Gsus2 Am
  P: "[c5 d5@2 [a4,c5]@2 a4@5 ~ e5@3 e5@2 e5@2 e5 g5@3 g5 ~@2 g5!2 [c5,e5,a5]@2 c5 [e4,a4,c5]@6 ~ a5 c5 [c4,d4,g4,a4]@2 a4 a5@2 g5!3 a5@2 e5@3 ~@6 g5 g5@2 e5 e5@2, ~@3 e4@7 ~ [a4,c5]@8 [g4,a4,d5]@5 [g4,a4,d5]@3 ~@28 [g3,d4]@9, ~@23 g5@2 ~@39]/8", // Am Csus2 Am Gsus2 G5
  Q: "[~@9 e5!3 e5@2 e5 g5@2 e5@3 ~@3 g5@4 g5@2 e5 ~ c5, ~@7 [g3,c4,d4]@17 ~@8, ~@23 g4@9, ~@23 d5@7 d5@2]/4", // Gsus4
  R: "[~@9 a5!4 g5@2 g5@2 a5@2 e5@3 ~ a5@3 g5 g5@2 e5 e5@2, ~@7 [g3,c4,d4]@15 ~ [c5,d5]@9]/4", // Gsus4 Csus2
  S: "[~@9 e5!3 e5@2 e5 g5@2 e5@3 ~@3 g5 g5@2 g5 g5@2 a5!2 g5@9, ~@7 [g3,c4,d4]@13 ~@3 [g4,d5]@17]/5", // Gsus4 G5
  T: "a4 e4 c5 e4 a4 e4 a4 e4", U: "g4 e4 b4 e4 g4 e4 a4 e4", V: "f4 e4 a4 e4 f4 e4 a4 e4",
  W: "[g4 e4 b4 e4 g4 e4 a4 c5@6 f5@2 c5, ~@7 [f4,a4]@9]/2", // F
  X: "[g4@3 a4@2 [g4,b4,d5]@2 e5@3 e5!2 f5@2 e5 e5@2 d5@7, ~@7 [a4,c5]@8 [g4,a4]@9]/3", // G Am Gsus2
  Y: "[~@2 c5!2 e5 e5@2 [e4,a4,c5]@7 ~ e5@3 e5@2 e5@2 e5 [g4,a4,d5,g5]@8 [c5,e5,a5]@3 c5@2 c5 d5@2 [a4,c5]@2 a4@5 ~ e5@3 e5@2 e5@2 e5 g5@3 g5 ~@2 g5!2 [c5,e5,a5], [c4,e4,a4]@4 ~@11 [a4,c5]@8 ~@16 e4@7 ~ [a4,c5]@8 [g4,a4,d5]@5 [g4,a4,d5]@3 ~, ~@59 g5@2 ~@3]/8", // Am Gsus2 Am Gsus2
  Z: "~ c5 [e4,a4,c5]@6", // Am
  AA: "[~ c6 a5 [c5,e5,a5]@3 ~ [f3,a3,d4]@13 [e3,g3,c4]@3 [f3,a3,c4]@16 [d3,f3,a#3]@8 [e3,g3,c4]@8 [f3,a3,d4]@9]/8", // Am Dm C F A# C Dm
  AB: "[~@4 [e3,a3,c4]@2 ~ [f3,a3,c4]@2 c5@2 [a4,c5,f5]@2 g5@2 [a4,c5,f5]@5 [a3,c4,e4]@2 ~ [f3,a#3,d4]@3 a#4 f5!2 g5 f5 [g4,c5,e5]@2 d5@2 c5@2 d5@2 [f4,a4,d5]@2 d5@2 [f4,a4,d5]@2 c5@2 [d4,f4,a4]@5 [e3,g3,c4]@2 ~ [f3,a3,c4]]/7", // Am F Am A# C Dm C F
  AC: "[~ a5@2 [c5,f5,a5]@2 g5@2 [a4,c5,f5]@5 [a3,c4,e4]@2 ~ [f3,a#3,d4]@2 a5@2 [a#4,d5,f5,a5]@2 g5 f5 [c5,e5,a5]@2 c5 ~@3 g5 f5 [d5,f5,a5]@2 a5@2 [d5,f5,a5]@2 a5 [d5,f5,a5]@6 [g3,c4,e4]!2 ~ [c4,f4]@2 c4 f4 [c4,f4,g4]@2 f4 c4 [c4,f4,g4]@2 c4 g4 ~ a2 e3 a3 a#2]/8", // F Am A# A#maj7 Am Dm C F5 …
  AD: "[~ a#3 f4@2 a#3 f4 ~ [g3,c4,d4]@3 [g3,c4,d4,g4]@2 ~ [g3,c4,d4,g4] ~ e5@3 e5!2 f5@2 e5 e5@2 d5@7, ~@15 [a4,c5]@8 [g4,a4]@9]/4", // Gsus4 Am Gsus2
  AE: "[~ c5 [e4,a4,c5]@8 c6@2 a5@2 c6@2]/2", AF: "[g3,a3,d4,e4]@5 [g3,c4,e4]@3",
  AG: "[[g3,b3,d4]@5 [g3,c4,e4]@4 [f3,a3,c4]@15]/3", AH: "[g3,b3,d4]@5 [g3,c4,e4]@3", AI: "[f3,a3,c4]/2",
  AJ: "[g3,a3,d4,e4]/2", // Gsus2
})).s("gm_distortion_guitar").gain(0.17).pan(0.3)

// bass · lead 8 bass lead · "Synth Bass"
const bass = note("<A@2 B@2 C@2 D@2 ~@87 E@8 F@8 G@8 H ~@26>".pickRestart({
  A: "[~ a1@3]/2", B: "[b1 g1 b1 c2@9 d2@2 e2@2]/2", C: "[g2 e2 g2 a2 ~@2 a1@10]/2", D: "[b1 g1 b1 c2@9 ~@4]/2",
  E: "[~@7 d2@8 d2@8 f2@8 f2@8 a#1@8 c2@8 d2@8 d2]/8", F: "[~@7 f2@8 f2@8 a#1@8 c2@8 d2@8 d2@8 f2@8 f2]/8",
  G: "[~@7 a#1@8 c2@8 d2@8 d2@8 f2@8 f2@8 a#1@8 c2]/8", H: "~@7 a1",
})).s("gm_lead_8_bass_lead").gain(0.4).pan(0.7)

// bass · electric bass finger · "Bass"
const bass_2 = note(`<
  A@2 B@2 C@2 B@2 D E F G D E F G D H F I D E F G D E F G J K L M N K O M N K O M N K O M N K E P@2 Q@2 P@2 Q@2 P@2 Q@2
  P@2 R S T U V S T U V S T U V S T U V S T U W@2 X@2 Y K Z@2 Y K Z@2 Y K AA@2 AB@2 AC@6 AD@4 AE@2 AF@4 AG@2 AH@4 Y K
  Z@2 Y K Z@2 Y K@2 AI AJ AK AL AM AN AO AP AM AN AO AQ AR@2
>`.pickRestart({
  A: "[~ a1@3]/2", B: "[b1 g1 b1 c2@9 d2@2 e2@2]/2", C: "[g2 e2 g2 a2 ~@2 a1@10]/2", D: "g2 e2 a2 a1@3 a1@2", E: "a1!4",
  F: "b1 g1 b1 c2@3 c2@2", G: "c2!2 d2 e2", H: "a1 a2 a1 g2 ~ a2@3", I: "c2 c3 ~@2 d2@2 e2@2", J: "g2 e2 c2 f1@3 f1@2",
  K: "f1!4", L: "f1!2 a1!2", M: "a1!2 g1!2", N: "g1!2 f1!2", O: "f1@2 f1 a1@3 a1@2",
  P: "[a1@2 a1@2 b1 g1 b1 c2@3 c2@2 c2@2 c2@2]/2", Q: "[d2@2 e2@2 g2 e2 a2 a1@3 a1@2 a1@2 a1@2]/2",
  R: "d2@2 e2@2 g2 e2 a2@2", S: "a1!2 ~ a1 ~ a1!3", T: "e2!2 ~ e2 ~ e2!3", U: "f1!2 ~ f1 ~ f1!3", V: "g1!2 ~ g1 ~ g1!3",
  W: "[~ g1!6 f1@3 f1@2 f1@2 f1@2]/2", X: "[f1@2 f1@2 f1 g1!2 a1@3 a1@2 a1@2 a1@2]/2", Y: "g1!4",
  Z: "[f1@2 f1@2 f1@2 f1 a1@3 a1@2 a1@2 a1@2]/2", AA: "[f1@2 f1@2 f1 a1 c2 d2@3 d2@2 d2@2 d2@2]/2",
  AB: "[d2@2 d2@2 e2 c2 e2 f2@3 f2@2 f2@2 f2@2]/2",
  AC: "[f2@2 f2@2 f2 a1 c2 a#1@3 a#1@2 a#1 a1 a#1 c2@3 c2@2 c2 b1 c2 d2@3 d2@2 d2 c2 a1 d2@2 c2 a1 d2 e2!2 ~ f2@3 f2@2 f2@2 f2@2]/6",
  AD: "[f1 c2 f2 f1 a1!2 ~ a#1@3 a#1@2 a#1@2 a#1 c2@3 c2@2 c2@2 c2 d2@3 d2@2 d2@2 d2@2]/4",
  AE: "[d2@2 e2@2 e2!2 ~ f2@3 f2@2 f2@2 f2@2]/2",
  AF: "[f1 c2 f2 f1 a1!2 ~ a#1@3 a#1@2 a#1@2 a#1 c2@3 c2@2 c2@2 c2 d2@2 d2!6 ~]/4",
  AG: "[d2!4 e2!2 ~ f2@3 f2@2 f2@2 f2@2]/2",
  AH: "[f2@2 f2@2 a1!2 ~ a#1@3 a#1@2 a#1 a1 a#1 c2@2 c2 c2@2 c2 b1 c2 a1@3 a1@2 a1@2 a1@2]/4",
  AI: "a1@2 g1 a1 g1 a1 d2 e2", AJ: "g2@2 e2 g2 e2 g2 a2 g2", AK: "e2 f2 e2 c2 d2@2 c2 b1",
  AL: "c2 d2 c2 b1 c2 b1 a1 g1", AM: "a1@2 a1@2 g1 a1 c2 d2", AN: "e2@2 d2 e2 d2 e2 c2 a1", AO: "f1@2 f1 f1@2 f1!3",
  AP: "f1!4 c2 b1 c2 d2", AQ: "f1!6 a1 c2", AR: "a1/2",
})).s("gm_electric_bass_finger").gain(0.64).pan(0.7)

// chords · pad new age · "Synth"
const pad_new_age = note("<A B@3 C B@2 D E ~@53 F G H G F G H G F G H G F G H G F G H I@2 ~@63>".pickRestart({
  A: "~@4 [d4,g4,a4,c5]!4", B: "[d4,g4,a4,c5]!8", C: "[d4,g4,a4,c5]!4 ~@2 [d4,g4,a4,c5]!2", D: "[d4,g4,a4,c5]!7 b3",
  E: "e4 c5 a4 [c4,d4,g4]@5, ~@3 a4@2 ~@3", F: "a4 e4 c5 e4 a4 e4 a4 e4", G: "g4 e4 b4 e4 g4 e4 a4 e4",
  H: "f4 e4 a4 e4 f4 e4 a4 e4", I: "[g4 e4 b4 e4 g4 e4 a4 [f4,a4]@9, ~@7 c5@6 ~@3]/2",
})).s("gm_pad_new_age").gain(0.14).pan(0)

// drums · kick
const kick = s("bd").struct(`<
  A B@3 C B@5 D B D B D B@2 D@2 E A B@7 C F@16 E F@16 G@33 H G ~ G ~ G@9 I G@5 ~ G@3 ~ F@3 J F@8 G@12 ~@2
>`.pickRestart({
  A: "~@2 x!2", B: "x!4", C: "x!2 ~ x", D: "~ x!3", E: "~ x ~@2", F: "~ x ~ x", G: "~ x", H: "~@3 x", I: "~@8 x!4 ~@4",
  J: "~@2 x ~@2 x!2 ~",
})).gain(0.64)

// drums · snare
const snare = s("sd").struct(`<
  ~@8 A ~@8 B@3 ~@8 C B@5 D B@7 E B@2 F G@3 ~ G@7 H G@3 I J@19 K J@13 L J M J N J@5 O J@9 P J@3 Q G R G@10 J@12 ~@2
>`.pickRestart({
  A: "~@2 x!2 ~@4", B: "x", C: "~@4 x!2 ~@10", D: "x ~@3 x!4 ~@8", E: "x!5 ~@11", F: "x ~@4 x!3", G: "~ x",
  H: "~@8 x ~ x ~ x!3 ~", I: "~@8 x ~@3 x!4", J: "~ x ~ x", K: "~@4 x ~@4 x!4 ~@3", L: "~@2 x ~@2 x!2 ~@9",
  M: "~@2 x ~ x!4", N: "~@4 x ~@3 x!7 ~", O: "~@4 x ~@3 x!6 ~@2", P: "x!6 ~@2", Q: "~@4 x ~@3 x!2 ~ x!3 ~@2", R: "x!2",
})).gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<~@103 [~@12 x!2 ~@2] ~@27 [~@15 x] ~@14>").gain(0.64)

// drums · hihat
const hihat = s("hh").struct(`<
  A B@3 C B@3 D ~@11 A B@7 E F@16 G H@36 ~@14 G@3 I G@15 ~ G@3 I G@11 J G@12 ~@2
>`.pickRestart({
  A: "~@8 x!8", B: "x!16", C: "x!8 ~@4 x!4", D: "x!8 ~@8", E: "x!9 ~@3 x ~ x ~", F: "x!5 ~ x!2", G: "x!8",
  H: "x ~ x ~ x ~ x!2", I: "x!4 ~@4", J: "x!7 ~",
})).gain(0.64)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 A ~@40 B ~@45 C ~@7 D ~@23 E ~@3 F ~@14>".pickRestart({
  A: "~@2 x!2 ~@4", B: "~@12 x!2 ~@2", C: "~@13 x!2 ~", D: "~@10 x!2 ~@4", E: "~@11 x!2 ~@3", F: "~@7 x",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@28 [~@5 x ~@2]!17 ~ [~@2 x!2 ~@2 x ~@3 x!2 ~@4]!36 ~@37 [~@15 x] ~@26>").gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<~@19 A B ~@28 C ~@45 D ~@7 E ~@23 C ~@3 F ~@14>".pickRestart({
  A: "~@8 x!2 ~ x!3 ~ x", B: "x!8 ~@8", C: "~@4 x!2 ~@2", D: "~@4 x!3 ~", E: "~@8 x!2 ~@6", F: "~@13 x ~@2",
})).gain(0.64)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@3 B ~@7 C ~@3 B ~@7 C ~@5 B ~@7 C ~@2 D ~@3 E ~@7 E ~@4 F ~@18 E ~ G H ~ E@3 H E@3 I J E ~ E ~ E ~@3 E ~ E ~@3
  E ~@5 K ~ I ~ E ~@7 E ~@3 L M@2 N ~ M@2 F ~ M@2 F ~ F ~
>`.pickRestart({
  A: "~@3 x", B: "~ x", C: "~@3 x ~@4", D: "~@5 x!3", E: "~@7 x", F: "x", G: "~@5 x ~ x", H: "~@6 x!2",
  I: "~@4 x ~@2 x", J: "~ x ~@2", K: "~@4 x!2 ~ x", L: "~ x!3", M: "x ~@4 x ~@2", N: "~ x ~@6",
})).gain(0.64)

// drums · ride bell
const ride_bell = s("rd").struct("<~@82 A B C A C@3 D C@3 E F ~@51>".pickRestart({
  A: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", B: "x ~ x!3 ~ x!3 ~@2 x!2 ~@2 x", C: "x ~ x!3 ~ x!3 ~ x!3 ~@2 x",
  D: "x ~ x!3 ~ x!3 ~ x!2 ~@3 x", E: "x ~ x!3 ~ x!2 ~@2 x!3 ~@2 x", F: "x ~ x!2 ~@2 x!3 ~ x!3 ~ x!2",
})).gain(0.64)

stack(
  distortion_guitar, bass, bass_2, pad_new_age, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash,
  ride_bell
)

More by Rush