Strudelify
On The Road Again cover art

1968 · On The Road Again

On The Road Again

Canned Heat

KeyE majorTempo222 bpm
0:00/0:00
// On The Road Again — Canned Heat
// 222 bpm, 4/4, key E major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 130 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(222/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.

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  A B A B A B A B A@3 C D@3 E F G H I B J A@3 C D@3 E F G H I K L M N M O B P M N M O A B Q R A@3 C D@3 E F G H I B J
  A@3 C D@3 E F G H I B J A@3 C D@3 E F G H I K L M N M O B P M N M O A B Q R A@3 C D@3 E F G H S B T U S B T U S V W@2
  ~
>`.pickRestart({
  A: "e2@7 ~ b1@8", B: "e2@8 b1@7 ~", C: "e2@7 ~ f#2@4 g2@4", D: "g#2 d#2", E: "g#2@7 ~ d#2@4 g#2@4",
  F: "f#2@7 ~ c#2@7 ~", G: "a2@8 f#2@3 ~ g#2@4", H: "a2@2 e2 a2", I: "b2@8 f#2@4 d#2@3 ~", J: "e2@4 b1@4 c#2@3 ~ d#2@4",
  K: "e2@7 ~ b1@7 ~", L: "e2@3 ~ e2@3 ~ f#2@3 ~ g#2@4", M: "a2@7 ~ e2@8", N: "a2 e2", O: "a2@2 e2 c#2",
  P: "e2@3 ~ e2@4 f#2@3 ~ g#2@3 ~", Q: "b2@7 ~ d#2@4 f#2@4", R: "b2@3 ~@13", S: "b2@8 f#2@4 e2@3 ~",
  T: "e2@4 e2@4 f#2@3 ~ g#2@4", U: "a2@7 ~ e2@4 a2@4", V: "e2@5 ~ e2@2 b1@4 c#2@3 ~", W: "[e2@7 ~]/2",
})).s("gm_acoustic_bass").gain(0.45).pan(0.4)

// chords · piano · "A.PIANO 2"
const piano = note(`<
  ~@22 A@4 B@4 C@2 D E F@2 G@2 H@2 I@2 J@2 K@2 L@2 M@2 A@4 B@4 C@2 D E F@2 A@4 B@4 C@2 D E F@2 A@4 B@4 C@2 D E F@2 G@2
  H@2 I@2 J@2 K@2 L@2 N@2 A@4 B@4 C@2 D O F@2 D O F@2 D O P Q@2 ~
>`.pickRestart({
  A: "[~@24 e5@8 [b4,g#5]@7 ~ [b4,g#5]@23 ~, [e2,b2]]/4", // E E5
  B: "[~@24 [c5,g#5]@8 [d#5,c6]@6 ~@2 [d#5,c6]@14 ~@2 [c5,g#5]@4 d#5@3 ~, [g#2,d#3]]/4", // Fm Cm Fm G#5
  C: "[[f#2,f#4,a4,e5]@11 ~ [f#2,f#4,a4,e5]@2 g#2@2]/2", D: "[a2,c#5,a5]@15 ~",
  E: "[b4,g#5]@4 ~@2 [b4,g#5]@6 [a4,f#5]@3 ~, b2@15 ~, ~ d#5 ~@2", // E D
  F: "[[e3,e4,b4,e5]@4 ~@12 [e4,b4,e5]@4 ~@4 [e4,b4,e5]@7 ~, ~@4 e2@6 ~@2 e2@7 ~ e2@12, ~@6 e3@25 ~, ~@3 [e4,b4,e5]@4 ~@9]/2", // E5
  G: "[~@4 [e4,a4,e5]@8 ~@4 [a4,e5,a5]@3 ~@9 e3@4, a2@3 e3@2 a3@2 ~, ~@22 [a4,e5,a5]@9 ~]/2", // A5
  H: "[~ [e4,a4,e5]@2 ~ [a4,e5,a5] ~@2 e3, a2@12 e3@8 a3@9 ~@3, ~@11 [a4,e5,a5]@4 ~]/2", // A5
  I: "[~@4 [e4,b4,e5]@8 ~@4 [b4,e5,g#5]@3 ~@5 f#2@4 g#2@4, e2@12 b2@8 e3@5 ~@7, ~@11 [b4,e5,g#5]@3 ~@2]/2", // E5 E
  J: "[~ [e4,a4,e5]@2 ~ [a4,e5,a5] ~@2 e3, a2@12 e3@8 a3@7 ~@5, ~@11 [a4,e5,a5]@4 ~]/2", // A5
  K: "[~ [e4,a4,e5]@2 ~ [a4,e5,a5] ~@2 e3, a2@3 e3@2 a3@2 ~, ~@22 [a4,e5,a5]@9 ~]/2", // A5
  L: "[~@2 [e4,b4,e5]@4 ~@2 [b4,e5,g#5]@2 ~ [b4,e5,g#5]@4 ~, e2@12 b2@8 e3@11 ~]/2", // E5 E
  M: "[~@16 [f#4,b4,f#5,b5]@3 ~@13, b2@12 b1@7 ~@13, ~@3 [f#4,d#5,b5]@5 ~@8]/2", // B5 B
  N: "[~@16 [f#4,b4,f#5,b5]@3 ~@13, b2@13 ~@19, b1@10 ~@2 b1@7 ~@13, ~@3 [f#4,d#5,b5]@5 ~@8]/2", // B5 B
  O: "[b4,g#5]@4 ~@2 g#5@6 [a4,f#5]@3 ~, b2@15 ~, ~@3 b4@2 ~@3", P: "[g#4,e5]@2 ~ [g#4,e5]@3 [e4,b4]@2, e2@7 ~, ~ e3@3",
  Q: "[[e2,e3,b4,g#5]@7 ~]/2", // E
})).s("gm_piano").gain(0.48).pan(0.6)

// chords · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~@8 A@6 B@7 C@2 D E@2 F@2 G@2 H I J K L@2 M@2 N@2 O P M@2 N@2 O P Q R S T U@2 V W X@8 A@6 Y@8 ~ D E@2 F@2 G@2 H I J K
  Z@2 M@2 N@2 O P M@2 N@2 O P Q R A@6 B@7 AA@5 AB AC AD AE@2 ~
>`.pickRestart({
  A: "[g#4 b3 b4 ~ e4 f#4@2 ~@2 b3 ~@2 e4 f#4@2 ~@2 b3 b4 ~ e4 f#4@2 g#4@2 b3 b4 ~ e4 f#4@2 ~@2 c4 d#4 c4 g#4 c4 d#4 g#4@2 c4 d#4 c4 g#4 c4 d#4 c4, ~@6 b3@11 ~@5 b3@11 ~@5 b3@9 ~@7 b3@9 ~@33, ~@7 g#4@3 b4@2 ~@3 g#4@3 ~@13 g#4@3 ~@14]/6",
  B: "[[g#4,c5]@30 ~@2 f#4@13 ~@3 a4@13 ~@3 a4@14 ~@2 b4@12 ~@2 d#4 ~ g#4@6 ~@3 f#4@4 ~@2 e4, ~@30 a3@15 ~@2 f#4@14 ~@2 e4@14 ~@2 [d#4,f#4]@14 ~@2 e4@7 ~@2 e4@5 ~@3, ~@31 c#4@13 ~@2 c#4@15 ~ c#4@17 ~@15 b3@8 ~ b3@5 ~@2 b3@2]/7", // G# D#m
  C: "[g#4@3 ~ [b3,e4,f#4] ~@3 [e4,g#4]@16 ~@8, ~ b3 ~@2]/2", D: "[e4,b4,e5]@7 ~ [e4,b4]@7 ~", E: "[[e4,g#4]@15 ~]/2",
  F: "[[d#4,g#4]@22 ~@2 [d#4,g#4]@7 ~]/2", G: "[[g#4,c5]@31 ~]/2", H: "[a3,c#4]@3 ~ [a3,c#4]@4",
  I: "c#3@2 [a3,c#4] ~@3 c#3@2 [a3,c#4]@8", J: "[c#4,e4,a4]@15 ~", K: "[d#4,f#4,b4]@7 ~ [d#4,f#4,b4]@7 ~",
  L: "[~@8 e4@5 ~@3 e4@14 ~@2, ~@7 [e3,b3]@6 ~ e3@18, ~@15 b3@16 ~]/2", M: "~@2 [e4,a4]@2 ~ [e4,a4]@3",
  N: "[~@4 [e4,a4]@4 ~@2 [e4,a4]@8 ~@2 [b4,e5]@11 ~]/2", O: "[b4,e5]@3 [b4,e5] b4 a4 g#4@2", P: "[g#4,b4]@15 ~",
  Q: "[f#4,b4]@7 ~ [f#4,b4]@4 g#4@4", R: "[f#4,b4] ~@7", S: "~@6 [b4,e5] ~",
  T: "~@2 [b4,e5]@2 ~@4 g#4@4 g#4 ~@3, ~@8 b4@7 ~", U: "[[e4,g#4]@7 ~ [e4,g#4]@15 ~ [e4,g#4]@7 ~]/2",
  V: "~@10 [d#4,f#4,c5] ~@5", W: "[d#4,f#4,c5]@4 [d#4,f#4,c5] ~@3 [d#4,f#4,c5]@4 [d#4,f#4,c5] ~@3",
  X: "[[d#4,f#4,c5]@7 ~@27 f#3@2 ~@4 f#3@5 ~@5 f#3 ~@5 f#3@5 ~@3 a4@14 ~@2 b4@12 ~@2 d#4 ~ g#4@6 ~@3 f#4@4 ~@3 g#4@3 ~ [b3,e4,f#4] ~@3 [b3,e4,g#4]@8, ~@8 [d#4,f#4,c5]@23 c#4@13 ~@2 c#4@15 ~ c#4@17 ~@15 b3@8 ~ b3@5 ~@2 b3@5 ~@13, ~@30 a3@15 ~@3 a4@13 ~@67, ~@32 f#4@13 ~@2 f#4@14 ~@2 e4@14 ~@2 [d#4,f#4]@14 ~@2 e4@7 ~@2 e4@5 ~@2 e4@4 ~@13]/8", // Cdim Bsus4 E Cdim D#m
  Y: "[[g#4,c5]@30 ~@2 f#4@13 ~@3 a4@13 ~@3 a4@14 ~@2 b4@12 ~@2 d#4 ~ g#4@6 ~@3 f#4@4 ~@3 g#4@3 ~ [b3,e4,f#4] ~@3 [b3,e4,g#4]@8, ~@30 a3@15 ~@2 f#4@14 ~@2 e4@14 ~@2 [d#4,f#4]@14 ~@2 e4@7 ~@2 e4@5 ~@2 e4@4 ~@13, ~@31 c#4@13 ~@2 c#4@15 ~ c#4@17 ~@15 b3@8 ~ b3@5 ~@2 b3@5 ~@13]/8", // G# Bsus4 E D#m
  Z: "[~@8 e4@5 ~@3 e4@14 ~@2, ~@7 [e3,b3]@6 ~ e3@17 ~, ~@15 b3@16 ~]/2", // E5
  AA: "[g#4@3 ~ [b3,e4,f#4] ~@3 [b3,e4,g#4]@6 ~@2 a4@14 ~@2 b4@12 ~@2 d#4 ~ g#4@6 ~@3 f#4@4 ~@3 g#4@3 ~ [b3,e4,f#4] ~@3 [b3,e4,g#4]@6 c#4@2, ~@14 c#4@17 ~@15 b3@8 ~ b3@5 ~@2 b3@5 ~@13, ~@15 e4@14 ~@2 [d#4,f#4]@14 ~@2 e4@7 ~@2 e4@5 ~@2 e4@4 ~@13]/5", // Bsus4 E Bsus4 E D#m
  AB: "[a4,c#5]@2 [a4,c#5]!2 [a4,c#5]@2 [g#4,b4]!2", AC: "[g#4,b4]@2 [f#4,a4]!2 [g#4,b4] [f#4,a4] [d#4,f#4] ~",
  AD: "[e4,g#4]@3 [e4,g#4] [g#4,b4]@2 [b4,e5] ~", AE: "[[e5,g#5]@7 ~]/2",
})).s("gm_electric_guitar_muted").gain(0.46).pan(0.2)

// chords · electric guitar muted · "MUTED GTR"
const electric_guitar_muted_2 = note(`<
  ~@4 A@2 B C A@2 B C D@3 E F@2 G H A@4 B C D@3 E F@2 G H A@2 I@4 J@2 I@4 J@2 K L A@2 B C D@2 M E F@2 G H A@4 B C D@2 M
  E F@2 G H A@4 B C D@2 M E F@2 G H A@2 I@4 J@2 I@4 J@2 K L A@2 B C D@2 M E F@2 G H A@2 G H A@2 G H A N@2 ~
>`.pickRestart({
  A: "[e3,b3] [e3,b3]@2 [e3,b3] [e3,b3]@2 [e3,b3]!2", // E5
  B: "[e3,b3]@2 [e3,b3]@3 ~ [e3,b3]@2 [e3,b3]@4 [e3,b3]@2 [e3,b3]@2", // E5
  C: "[e3,b3]@2 [e3,b3]@4 [e3,b3]@2 [e3,b3]@3 ~ [e3,b3]@2 [e3,b3]@2", // E5
  D: "[g#3,d#4] [g#3,d#4]@2 [g#3,d#4] [g#3,d#4]@2 [g#3,d#4]!2", // G#5
  E: "[g#3,d#4]@2 [g#3,d#4]@4 [g#3,d#4]@2 [g#3,d#4]@3 ~ [g#3,d#4]@2 [g#3,d#4]@2", // G#5
  F: "[c#3,f#3] [c#3,f#3]@2 [c#3,f#3] [c#3,f#3]@2 [c#3,f#3]!2", // F#5
  G: "[e3,a3]@2 [e3,a3]@3 ~ [e3,a3]@2 [e3,a3]@4 [e3,a3]@2 [e3,a3]@2", // A5
  H: "[f#3,b3]@2 [f#3,b3]@4 [f#3,b3]@2 [f#3,b3]@3 ~ [f#3,b3]@2 [f#3,b3]@2", // B5
  I: "[a2,e3,a3]@2 [a2,e3,a3]!2 [a2,e3,a3]@2 [a2,e3,a3]!2", J: "[e3,b3,e4]@2 [e3,b3,e4]!2 [e3,b3,e4]@2 [e3,b3,e4]!2",
  K: "[b2,f#3,b3]@2 [b2,f#3,b3]!2 [b2,f#3,b3]@2 [b2,f#3,b3]!2", L: "[b2,f#3,b3] ~@7",
  M: "[g#3,d#4]@2 [g#3,d#4]@3 ~ [g#3,d#4]@2 [g#3,d#4]@4 [g#3,d#4]@2 [g#3,d#4]@2", N: "[[e3,b3]@7 ~]/2",
})).s("gm_electric_guitar_muted").gain(0.3).pan(0.8)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<~@63 A B@3 C D@3 E F@2 G H I@2 B@3 C D@3 E F@2 G H I@2 ~@38>".pickRestart({
  A: "~@2 [b3,e4]!2", B: "[[g4,a#4]@4 [g#4,b4]@4 [g#4,b4]@25 ~ [g#4,b4]@6 [g4,a#4]@2 ~@2 [g#4,b4]@2 ~@2]/3",
  C: "[a4,c#5]@2 [g#4,b4] ~ [f#4,a4]@2 [e4,g#4]@2", // A G#m F#m E
  D: "[[g#4,c5]@5 ~ [g#4,c5]@2 [g#4,c5]@25 ~ [g#4,c5]@6 [g4,b4]@2 ~@2 [g#4,c5]@2 ~@2]/3", // G# G G#
  E: "[a4,c#5]@4 [g#4,c5]@3 ~ [f#4,a#4]@4 [e4,g#4]@4", // A G# F# E
  F: "[[g#4,b4]@5 ~ [f#4,a4]@2 [f#4,a4]@3 [f4,g#4]@3 [f#4,a4]@13 ~ [g#4,b4]@4]/2", // G#m F#m Fm F#m G#m
  G: "[a4,c#5]@5 ~ [a4,c#5]@2 [a4,c#5]@3 ~ [a4,c#5]@3 ~", H: "[g#4,b4]@3 [f#4,a4] [f#4,a4]@2 [d#4,f#4]@2",
  I: "[[e4,g#4]@6 [b3,e4]!2]/2", // E E5
})).s("gm_overdriven_guitar").gain(0.52).pan(0.3)

// chords · harmonica
const harmonica = note(`<
  ~@78 A B@3 C D E@2 F@2 G H I J K L@2 M N@2 O P Q R S T@2 U ~@14 V W X Y Z AA AB ~@3
>`.pickRestart({
  A: "~@6 g#4 ~", B: "[b4@2 c#5 ~ e5 c#5 ~ b4@16 ~]/3", C: "~@4 g#5@7 ~ g#5@2 ~@2",
  D: "g#5@2 f#5@2 ~@2 g#5@4 f#5@2 g#5 ~@3", E: "[g#5@14 f#5 ~]/2", F: "[e5@4 c#5@2 ~@2 b4@2 g#4@2 ~@2 e4@14 f#4 ~@3]/2",
  G: "[e4,a4]@12 [e4,a4] ~@3", H: "[f#4,b4]@12 [f#4,b4] ~@3", I: "[e4,g#4]", J: "~@3 f#4 g4@7 e4@5",
  K: "~@4 [e4,a4]@2 ~@6 [e4,a4] ~@3", L: "~@4 [c#5,e5] ~@7 [c#5,e5] ~@3", M: "~@4 [c#5,e5]@2 ~@6 [c#5,e5] ~@3",
  N: "~@4 [g#4,b4] ~@7 [g#4,b4] ~@3", O: "~@2 [e4,a4] ~@3 [e4,a4] ~", P: "~@2 [a4,c#5] ~@3 [a4,c#5] ~",
  Q: "~@2 [c#5,e5] ~@3 [c#5,e5] ~", R: "~@2 [e5,a5] ~@3 [e5,a5] ~", S: "e4@2 ~ e4@3 g#4 ~", T: "[b4@7 a#4]/2",
  U: "b4@3 ~@13", V: "~@2 e5 ~", W: "c#5 b4@3", X: "~@3 b3@2 ~@3 e4@4 f#4 ~@3", Y: "g#4 b4@3", Z: "[a4,c#5]",
  AA: "g#4@15 ~", AB: "e4@7 ~ g#4@4 b4 ~@3",
})).s("gm_harmonica").gain(0.52).pan(0.6)

// chords · harmonica · soft notes
const harmonica_soft = note("<~@125 A B C@2 ~>".pickRestart({
  A: "b4", B: "g#4@6 f#4@3 ~@7", C: "[~ [b4,e5]@28 ~@3]/2",
})).s("gm_harmonica").gain(0.33).pan(0.6)

// drums · kick
const kick = s("bd").struct(`<
  ~@2 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 A B A B A B A B A B A B 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 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 C A B A B A B A B A B A B
  A B A B A B A B A C D ~
>`.pickRestart({
  A: "x!2", B: "x ~@2 x!2 ~@3", C: "x", D: "~ x",
})).gain(0.54)

// drums · rim
const rim = s("rim").struct("<A@49 B A@41 C A@13 B A@13 C A@3 D A@2 E ~@3>".pickRestart({
  A: "x!2 ~ x!3 ~ x", B: "x", C: "x!2 ~ x ~ x ~ x", D: "x ~ x!4 ~ x", E: "x!2 ~ x!2 ~@3",
})).gain(0.24)

// drums · snare
const snare = s("sd").struct("<A@49 ~ A@41 B A@13 ~ A@13 B A@3 C A@2 D E F ~>".pickRestart({
  A: "~ x ~ x", B: "~ x!3", C: "~ x ~@4 x ~", D: "~@2 x ~@2 x!2 ~", E: "x", F: "~@6 x!3 ~@7",
})).gain(0.54)

// drums · clap
const clap = s("cp").struct("<~@92 [x!2]!14 ~@24>").gain(0.48)

// drums · hihat
const hihat = s("hh").struct("<~@2 A@47 B A@55 B A@21 B C ~>".pickRestart({
  A: "x!4", B: "x", C: "~ x",
})).gain(0.42)

// drums · crash
const crash = s("cr").struct("<~@127 x [~ x] ~>").gain(0.36)

// drums · ride
const ride = s("rd").struct("<~@36 [x ~ x!3 ~ x!2]!13 x ~@14 [x!4]!28 [x ~ x!3 ~ x!2]!13 x ~@24>").gain(0.36)

// drums · shaker
const shaker = s("sh").struct("<[x!8]!49 x [x!8]!55 x [x!8]!21 x ~@2>").gain(0.18)

stack(
  bass, piano, electric_guitar_muted, electric_guitar_muted_2, overdriven_guitar, harmonica, harmonica_soft, kick, rim,
  snare, clap, hihat, crash, ride, shaker
)

More by Canned Heat