Strudelify

A Passage to Bangkok

Rush

KeyC majorTempo115 bpm
0:00/0:00
// A Passage to Bangkok — Rush
// 115 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 7/8 at bar 50, 4/4 at bar 51, 7/8 at bar 54, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 78 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(115/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(`<
  A B C B C B C B C D E D E F G F G H@2 I@2 J@2 K L@2 B C B C D E D E F G F G H@2 I@2 J@2 K M@2 N O P Q R S T U V W X Y
  Z AA AB AC AD AE AF AG@2 AH@2 AI@2 AJ AK AL@2 AM@2
>`.pickRestart({
  A: "~@7 a3", B: "a4@4 g4@3 g4 a4 g4 e4@4 a3@2", C: "f4@4 e4@3 e4 f4 e4 c4@4 a3@2", D: "c5@4 b4@3 b4 c5 b4 g#4@6",
  E: "a4@4 g#4@3 g#4 a4 g#4 e4@6", F: "a4@4 g4@2 a4 e4@3 e4@6", G: "f4@10 g4 c4@3 a3@2",
  H: "[[g4,c5,e5]@2 [g4,c5,e5]@4 [g4,c5,f5]@4 [c5,f5,a5]@4 [c5,e5,g5]@4 [g4,c5,e5]@11 [c5,e5,g5]@3]/2", // C Csus4 F C
  I: "[[a4,c5,f5]@4 e5@2 [a4,c5,f5]@4 e5@2 c5@2 [g4,b4,d5]@15 ~ g5@2]/2", // F G
  J: "[[g4,c5,e5]@2 [g4,c5,e5]@4 [g4,c5,f5]@4 [c5,f5,a5]@4 [c5,f5,a#5]@4 [c5,f5,a5]@4 [g4,c5,e5]@7 [c5,e5,g5]@3]/2", // C Csus4 F Fsus4 F C
  K: "[a4,c5,f5]@2 e5 [a4,c5,f5]@2 e5 [a4,c5,f5]@2", L: "[a4,c5,g5]/2", M: "[[a4,c5,g5]@5 ~@3]/2",
  N: "[c4,e4,a4]!2 ~ [c4,e4,a4] ~ [c4,e4,a4]!3", O: "[b3,e4,g#4]!2 ~ [b3,e4,g#4] ~ [b3,e4,g#4]!3",
  P: "[c4,f4,a4]!2 ~ [c4,f4,a4] ~ [c4,f4,a4]!3", Q: "[d4,g4,b4]!2 ~ [d4,g4,b4] ~ [d4,g4,c5] a4 [c4,e4,a4]",
  R: "[c4,e4,a4] ~ [c4,e4,a4] ~ [c4,e4,a4]!3 [b3,e4,g#4]", S: "[b3,e4,g#4] ~ [b3,e4,g#4] ~ [b3,e4,g#4]!3 [c4,f4,a4]",
  T: "[c4,f4,a4] ~ [c4,f4,a4] ~ [c4,f4,a4]!3 [d4,g4,b4]", U: "[d4,g4,b4] ~ [d4,g4,b4] ~ [d4,g4,c5] a4 [c4,e4,a4]!2",
  V: "~ [c4,e4,a4] ~ [c4,e4,a4]!3 [b3,e4,g#4]!2", W: "~ [b3,e4,g#4] ~ [b3,e4,g#4]!3 [c4,f4,a4]!2",
  X: "~ [c4,f4,a4] ~ [c4,f4,a4]!3 [d4,g4,b4]!2", Y: "~ [d4,g4,b4] ~ [d4,g4,c5] a4 [c4,e4,a4]!2 ~",
  Z: "[c4,e4,a4] ~ [c4,e4,a4]!3 [b3,e4,g#4]!2 ~", AA: "[b3,e4,g#4] ~ [b3,e4,g#4]!3 [c4,f4,a4]!2 ~",
  AB: "[c4,f4,a4] ~ [c4,f4,a4]!3 [d4,g4,b4]!2 ~", AC: "[d4,g4,b4] ~ [d4,g4,c5] a4 [c4,e4,a4]!2 ~ [c4,e4,a4]",
  AD: "~ [c4,e4,a4]!3 [b3,e4,g#4]!2 ~ [b3,e4,g#4]", AE: "~ [b3,e4,g#4]!3 [c4,f4,a4]!2 ~ [c4,f4,a4]",
  AF: "~ [c4,f4,a4]!3 [d4,g4,b4]!2 ~ [d4,g4,b4]", AG: "[~ [c4,g4,c5]@11 g5 [g4,c5,e5] [g4,c5,e5]@2]/2",
  AH: "[[g4,c5,f5]@4 [c5,f5,a5]@4 [c5,e5,g5]@4 [g4,c5,e5]@11 [c5,e5,g5]@3 [a4,c5,f5]@4 e5@2]/2", // Csus4 F C F
  AI: "[[a4,c5,f5]@4 e5@2 c5@2 [g4,b4,d5]@15 ~ g5@2 [g4,c5,e5]@2 [g4,c5,e5]@4]/2", // F G C
  AJ: "[g4,c5,f5] [c5,f5,a5] [c5,f5,a#5] [c5,f5,a5]", AK: "[g4,c5,e5]@7 [c5,e5,g5]@3 [a4,c5,f5]@4 e5@2",
  AL: "[[a4,c5,f5]@2 e5 [a4,c5,f5]@2 [b4,d5,g5]@8 [a4,c5,f5]@2 e5]/2", // F G F
  AM: "[[a4,c5,f5]@4 e5@2 c5 [b4,d5,g5]@3 [e4,g4,c5]@16 ~@6]/2", // F G C
})).s("gm_distortion_guitar").gain(0.28).pan(0.2)

// bass · electric bass finger · "Bass #"
const bass = note(`<
  A B C B C B C B C D C D C B C B C E@2 F G H@2 F I@2 B C B C D C D C B C B C E@2 F G H@2 F J@2 K L M N@8 O@8 P@2 Q R
  S@2 T U V W X@2
>`.pickRestart({
  A: "~@7 g1", B: "a2@2 g2@2 a2 e2@2 a1", C: "f2@2 e2@2 f2 c2@2 a1", D: "a2@4 g2@4 a2@2 e2@4 a1 e2",
  E: "[c3@2 c3@4 f3@4 a3@4 g3@4 c3@2 c4@3 c3 c4 a#3@2 a3@2 a3 g3@2]/2", F: "f3@2 e3 f3@2 e3 f3@2",
  G: "g2@2 b2@2 c3 c#3 d3 g2", H: "[c3@6 f3@4 a3@4 a#3@4 a3@4 c3@4 c4 a#3@2 a3 g3@2]/2", I: "[g2@15 c2]/2", J: "g2/2",
  K: "a2", L: "e2", M: "f2", N: "[g2@7 a2@8 e2@8 f2@8 g2@7 a2@8 e2@8 f2@8 g2@2]/8",
  O: "[~@5 a2@8 e2@8 f2@8 g2@7 a2@8 e2@8 f2@8 g2@4]/8", P: "[~ c3@12 c3 c3@2]/2", Q: "f3@2 a3@2 g3@2 c3 c4",
  R: "~ c3 c4 a#3@2 a3@2 a3 g3@2 f3@4 e3@2", S: "[f3@2 e3 f3@2 g2@2 b2@2 c3 c#3 d3 g2 c3@3]/2", T: "f3 a3 a#3 a3",
  U: "c3@4 c4 a#3@2 a3 g3@2 f3@4 e3@2", V: "f3@2 e3 f3@2 g2@3", W: "g2!6 g2@2 g2@2 f3@4 e3@2",
  X: "[f3@4 e3@2 c3 g3@3 c3@16 ~@6]/2",
})).s("gm_electric_bass_finger").gain(0.5).pan(0.6)

// other · xylophone · "Bells #" · E D Gsus2 Cmaj7
const xylophone = note("<~@4 [[e5,e6]!4 [d5,d6]@2 [d5,d6]@2 [g4,a5]@2 [g4,a5]@2 [b4,c6]@4] ~@73>")
  .s("gm_xylophone").gain(0.71).pan(0.9)

// other · overdriven guitar · "Solo"
const overdriven_guitar = note("<~@47 A B C D E@4 F G H I@3 J K L@2 M N@2 ~@10>".pickRestart({
  A: "a5 g5 a5 e5", B: "~@2 d5 e5 f5 ~ g5 f5 e5 c5 d5 f5 e5 d5 e5 b4, a5 ~@3", C: "~ g5@2 ~ f5@2 c5@2, a5",
  D: "b5@2 c6@2 ~@2 b5@2 ~@2 a5@2 g5@2 c5 d5",
  E: "[e5 f5 ~@2 g5@4 ~@4 a4@4 ~@15 g6@15 c5@2 ~@2 f5@2 [c5,f5,a5]@4 [d5,g5,b5]@2 a5@2 c6 b5 a5 g5, ~ a5@8 ~ f5@5 a6@8 ~@9, ~@4 e5@2 ~@3 e5@5 a5@8 ~@2 [e4,a4,c5]@2 ~@6, ~@10 c5@4 ~@2 c5@9 b5@16 ~@23, ~@11 g5@8 ~@4 [g4,e5]@2 [b4,d5]@2 ~@5]/4", // F G Am C Bm
  F: "f5 e5 d5 c5 c6 b5 a5 g5 f5 e5 d5 c5!2 e5 d5 f5", G: "e5 g5 f5 a5 g5 b5 a5 c6 b5 d6 c6 f6 d6@4",
  H: "b5@4 c6@4 g5@3 d6@3 f6@2",
  I: "[e6@2 b5@2 d6@2 e6@2 c6@2 ~@16 c6@2 e6@2 c6@2 a5@2 f5@2 c5@2 ~@2 b4@2 c6!4 b5!2, ~@5 e3@4 f4@8 ~@7, ~@12 g3@7 a4@16 ~@13, ~@7 b3@3 c5@8 ~@6, ~@2 d4 g#5@2 ~]/3",
  J: "b5!2 g5!4 e5!4 c5!4 b4 a4", K: "g4 f4 e4 d4 c4 b3 a3 g3 g4 a4 g4 f4 b4 d5 c5 e5",
  L: "[g5 f5 d5 a5 b5 c6 b5 g5 ~@10 e5@3 ~@3 c6 ~ b5 c6!2 ~ b5 a5, ~@9 g5@7 g5@9 ~@7, ~@11 b5@4 b5@4 ~@2 c5@4 ~@7, ~@13 c6@4 ~@5 f5@4 ~@6]/2",
  M: "g5 f5 g5 e5 d5 c5 d5 ~ b5@2 b5@2 ~@2 b5@2", N: "[~ c6@8 ~@7]/2",
})).s("gm_overdriven_guitar").gain(0.45).pan(0.1)

// drums · kick
const kick = s("bd").struct("<~@9 A@4 B@3 C ~@13 A@4 B@3 C ~@9 B@3 D E@3 F G@3 H I@2 J K B@3 L ~@11>".pickRestart({
  A: "x!2 ~ x!3 ~@2", B: "x!2 ~@2 x!2 ~@2", C: "x!2 ~@6", D: "x!2 ~@2 x ~@2 x", E: "x ~@2 x!2 ~@2 x",
  F: "x ~@2 x ~@2 x!2", G: "~@2 x!2 ~@2 x!2", H: "~@2 x!2 ~ x!2 ~", I: "~ x!2 ~@2 x!2 ~", J: "~ x!2 ~@5",
  K: "~@4 x!2 ~@2", L: "x",
})).gain(0.8)

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

// drums · low tom
const low_tom = s("lt").struct("<~@16 A ~@3 B ~@16 A ~@3 B ~@4 C ~@19 D ~@3 E F ~@3 G H ~>".pickRestart({
  A: "~@15 x", B: "x!6 ~@9 x", C: "~@5 x!4 ~@2 x!4 ~", D: "~@2 x ~@7 x!6", E: "~@10 x!6", F: "~@9 x ~@6",
  G: "~@4 x!2 ~@4 x ~@3 x ~", H: "x ~ x!2 ~@4",
})).gain(0.8)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@16 A ~@3 B ~@2 C ~@13 D ~@3 B ~@2 C E F ~@15 G ~@3 H G ~@3 I ~@2 J K L ~
>`.pickRestart({
  A: "~@11 x!4 ~", B: "~@6 x!6 ~ x!2 ~", C: "~@12 x!4", D: "~@7 x!9", E: "~@13 x!3", F: "x!5 ~@4 x!6 ~", G: "x!6 ~@10",
  H: "~ x ~@6", I: "x!6 ~ x!2 ~@7", J: "~@6 x!4 ~@6", K: "~@2 x!2 ~@2 x ~@3 x ~@3 x ~", L: "x ~@3 x ~@2 x ~@8",
})).gain(0.8)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@13 A@3 B ~ A ~@15 A@3 B ~ A ~@7 A@3 C D@3 E A@3 F D@3 G A@3 ~@2 H I ~@8
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~@4", C: "~ x ~ x ~ x ~@2", D: "x!4", E: "x ~ x ~ x ~@2 x", F: "~ x ~ x ~@2 x ~",
  G: "x ~ x ~@2 x ~ x", H: "~@3 x", I: "x!3 ~",
})).gain(0.8)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@16 A ~@3 B ~@2 C ~@13 D ~@3 B ~@2 C E F ~@14 G ~@4 H I ~@3 J ~@2 K L M ~
>`.pickRestart({
  A: "~@7 x!4 ~@5", B: "~@3 x", C: "~@8 x!4 ~@4", D: "~@7 x!8 ~", E: "~@5 x!8 ~@3", F: "~@9 x!2 ~@5", G: "~@10 x!6",
  H: "~ x ~@6", I: "~@6 x!4 ~@6", J: "~@3 x ~@4", K: "~@2 x!4 ~@10", L: "x!2 ~@6 x ~@7", M: "~@7 x ~@8",
})).gain(0.8)

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

// drums · ride bell
const ride_bell = s("rd").struct("<~@8 A ~@3 A ~@11 B ~@4 A ~@15 B ~@20 C ~@7 D ~ D ~>".pickRestart({
  A: "~@7 x", B: "x", C: "~ x ~@2", D: "~@5 x ~@2",
})).gain(0.8)

stack(
  distortion_guitar, bass, xylophone, overdriven_guitar, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom,
  china, ride_bell
)

More by Rush