Strudelify

Expressway (To Your Heart)

The Soul Survivors

KeyE minorTempo100 bpm
0:00/0:00
// Expressway (To Your Heart) — The Soul Survivors
// 100 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 62 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/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 · piano · "A.PIANO 2"
const piano = note(`<
  A B C B@3 D@2 B@2 ~@6 B E B@2 F G@4 H G F A B C B@3 D@2 B@2 ~@6 B E B@2 F G@4 H G F@2 G@4 I
>`.pickRestart({
  A: "[g1,g2]@3 ~ [b1,b2]@4 [c2,c3]!2 ~ [c2,c3] ~ [c2,c3] [d2,d3] ~", // G B C D
  B: "[g1,g2]@4 [b1,b2]@4 [c2,c3]!2 ~ [c2,c3] ~ [c2,c3] [d2,d3] ~", // G B C D
  C: "[g1,g2]@4 [b1,b2]@3 ~ [c2,c3]!2 ~ [c2,c3] ~ [c2,c3] [d2,d3] ~", // G B C D
  D: "[c2,c3]@4 [e2,e3]@4 [f2,f3]!2 ~ [f2,f3] ~ [f2,f3] [g2,g3] ~", // C E F G
  E: "[g1,g2]@4 [b1,b2]@4 [c2,c3]!2 ~ [c2,c3] ~ [c2,c3] d2@2, ~@14 d3 ~", // G B C
  F: "[g4,b4,g5] ~@3 [e4,e5]@2 ~@2 [g4,b4,g5]!2 ~ [e4,g4,e5]!2 ~@3, ~@4 g4 ~@11", // G E G Em
  G: "[g4,b4,g5] ~@3 [e4,g4,e5] ~@3 [g4,b4,g5]!2 ~ [e4,g4,e5]!2 ~@3", // G Em G Em
  H: "[g4,b4,g5] ~@3 [e4,g4] ~@3 [g4,b4,g5]!2 ~ [e4,g4,e5]!2 ~@3, ~@2 e5 ~@5", // G Em G Em
  I: "[g4,b4,e5] ~@3 [e4,g4] ~@11, ~@2 e5 ~@5", // Em
})).s("gm_piano").gain(0.44).pan(0.6)

// bass · electric bass finger · "FINGERDBAS"
const bass = note("<A@6 B@2 A@2 ~@6 A@4 C D E F G H I J A@6 B@2 A@2 ~@6 A@4 C D E F G H I J K H I J K L>".pickRestart({
  A: "g1@3 ~ b1@3 ~ c2!2 ~ c2 ~ c2 d2 ~", B: "c2@3 ~ e2@3 ~ f2!2 ~ f2 ~ f2 g2 ~", C: "e2", D: "d2", E: "c2",
  F: "b1@6 ~ d2", G: "e2@3 ~ e2@3 ~ e2@2 ~@2 e2@2 c2@2", H: "d2@3 ~ d2@2 ~@2 d2@3 ~ d2@2 b1@2",
  I: "c2@3 ~ c2@2 ~@2 c2@2 ~@2 c2@2 a1@2", J: "b1@2 ~@2 b1@2 ~@2 b1!2 ~ b1 ~ b1 a1@2",
  K: "e2@2 ~@2 e2@3 ~ e2@2 ~@2 e2@2 c2@2", L: "e2@3 ~ e1@2 ~@10",
})).s("gm_electric_bass_finger").gain(0.44)

// chords · rock organ · "ORGAN 3"
const rock_organ = note(`<
  ~@10 A B@2 C@3 ~@4 D E F G D E F H I J@2 I J@2 K@2 J I A B@2 C@3 J@4 D E F G D E F G D E F G D L
>`.pickRestart({
  A: "[b4,d5,f#5]", B: "[[a4,c5,e5]@3 [b4,d5,f#5]]/2", C: "[a4,c5,e5] [b4,d5,f#5]", D: "e4", E: "d4", F: "c4", G: "b3",
  H: "b3@15 ~", I: "~@4 [g5,b5,d6]@3 ~@9", J: "~@2 [g5,b5,d6] ~@5", K: "~@2 [e5,g5,c6] ~@5", L: "e4@5 ~@11",
})).s("gm_rock_organ").gain(0.35).pan(0.6)

// other · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note("<~@24 A B C D ~@24 A B C D A B C D A E>".pickRestart({
  A: "~ e5 ~ e5 [e4,e5] ~ [e4,e5]!2 ~ [e4,e5] ~ [e4,e5]!5, [e4,e5]!2 ~@6", // E
  B: "[e4,e5]!5 ~ e5 [e4,e5] ~ [e4,e5] ~ [e4,e5] ~ e5 [e4,e5]!2, ~@6 [e4,e5] ~", // E
  C: "[e4,e5]!5 ~@2 [e4,e5] ~ [e4,e5] ~ [e4,e5]!2 e5!3, ~@13 e4@3", // E
  D: "[e4,e5] e5!2 [e4,e5]!2 e5 e4 ~ e5 [e4,e5]@2 [e4,e5]!2 e5!3, ~@7 [e4,e5]@2 ~@4 e4@3", E: "[e4,e5]!5 ~@11",
})).s("gm_electric_guitar_clean").gain(0.38).pan(0.2)

// other · tenor sax
const tenor_sax = note("<~@28 A@6 B@2 A@2 ~@6 A C A@2 ~@14>".pickRestart({
  A: "g3@4 b3@4 c4!2 ~ c4 ~ c4 d4 ~", B: "c4@4 e4@4 f4!2 ~ f4 ~ f4 g4 ~", C: "g3@4 b3@3 ~ c4!2 ~ c4 ~ c4 d4 ~",
})).s("gm_tenor_sax").gain(0.33).pan(0.8)

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

// drums · snare
const snare = s("sd").struct("<A@10 ~@5 B A@4 ~@3 C D@3 E F A@9 ~@5 G A@4 ~@3 C D@9 H>".pickRestart({
  A: "~@4 x ~@3 x!2 ~ x ~ x!2 ~", B: "x!2 ~ x ~@2 x!2 ~ x ~@6", C: "x!2", D: "x!4", E: "x ~@3 x ~@3 x!2 ~ x!3 ~@2",
  F: "x ~@3 x ~@3 x!2 ~ x ~ x!2 ~", G: "x!2 ~ x ~@2 x!2 ~ x ~@4 x ~", H: "x",
})).gain(0.38)

// drums · hihat
const hihat = s("hh").struct("<A@10 ~@6 B A@3 C ~@7 B A@9 ~@6 B A@3 C ~@13>".pickRestart({
  A: "x ~ x ~ x ~ x ~ x!2 ~ x ~ x!2 ~", B: "~@2 x ~ x ~ x ~ x!2 ~ x ~ x!2 ~", C: "x",
})).gain(0.27)

// drums · low tom
const low_tom = s("lt").struct("<~@27 [~@7 x] ~@15 [~@7 x] ~@18>").gain(0.49)

// drums · mid tom
const mid_tom = s("mt").struct("<~@15 [~@6 x!2] ~@11 [~@13 x ~@2] ~@15 [~@4 x ~@5 x ~@2 x ~@2] ~@18>").gain(0.49)

// drums · high tom
const high_tom = s("ht").struct("<~@15 [~@2 x ~@2 x ~@2] ~@46>").gain(0.49)

// drums · crash
const crash = s("cr").struct("<~@16 x ~@11 x ~@15 x ~@16 [~ x!2 ~@5]>").gain(0.49)

// drums · tambourine
const tambourine = s("tb").struct("<A@2 ~@8 B@5 C ~@4 B@2 D@5 E ~@10 B@6 ~@4 B@3 D@10 F>".pickRestart({
  A: "~ x ~ x", B: "x!4", C: "x ~@2 x ~@4 x ~@3 x ~@3", D: "x ~ x ~ x ~ x!2", E: "x ~ x ~ x!4", F: "x!2 ~@2",
})).gain(0.33)

stack(
  piano, bass, rock_organ, electric_guitar_clean, tenor_sax, kick, snare, hihat, low_tom, mid_tom, high_tom, crash,
  tambourine
)