Strudelify
Rock And Roll, Hoochie Koo cover art

1974 · All American Boy

Rock And Roll, Hoochie Koo

Rick Derringer

KeyA majorTempo100 bpm
0:00/0:00
// Rock And Roll, Hoochie Koo — Rick Derringer
// 100 bpm, 4/4, key A major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 90 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.

// bass · electric bass finger · "Track 2"
const bass = note(`<
  ~ A B C D E F G H G H G H I J K L M N O L P Q E R G H G H G H G S K L P L T L M Q E U V W X@4 W Y Z AA AB@2 AC AD AE
  AD G AF G H G H G AG T L P AH T L P AI AJ L AK N AL L AK N AJ L AK L AM AN@2
>`.pickRestart({
  A: "f1 ~ f1 ~ g1@2 f1@2 g1 ~ g1 ~ a1@2 g1@2", B: "a1 ~ a1@3 ~ a1 ~ c2 ~ a1 ~ g1 a1@2 ~",
  C: "f1 ~ f1 ~ g1@2 f1 ~ c2 ~ c2 ~ g1 ~ g1 ~", D: "a1 ~@12 a1 g1@2", E: "e1", F: "e2@3 ~, d2 ~@15",
  G: "a1 ~ a1 e1 a1 e1 a1 e1 c2 ~ c2 d2 ~ d2 c2 ~", H: "a1@2 a2 ~ a2 g2 e2 d2 c2 e1 a1 e1 a1 e1 g1 g#1",
  I: "a1 ~ a1 e1 a1 e1 a1 e1 c2 ~ c2 d2 ~ c2 f#2 g2", J: "a2 ~ a2 ~ a2 g2 e2 d2 c2 e1 a1 e1 a1 e1 a1 e1",
  K: "f1 ~ f1 ~@5 g1 ~ g1@2 ~@4", L: "a1 ~ a1@2 ~@2 a1@2 c2@2 a1@2 g1 a1@3",
  M: "f1 ~ f1@2 ~@2 f1@2 c2 ~ c2@2 g1 ~ g1@2", N: "a1 ~ a1@3 ~ a1@2 c2@2 a1@2 g1 a1@3",
  O: "f1 ~ f1@2 ~@4 g1 ~ g1@2 ~@4", P: "f1 ~ f1@3 ~ f1@2 c2 ~ c2@2 g1 ~ g1@2", Q: "a1@2 ~@11 a1 g1@2", R: "e2@15 ~",
  S: "a1@2 a2 ~ a2 g2 e2 d2 c2 e1 a1 e1 a1 e1 a1 ~", T: "f1 ~ f1 ~@5 g1 ~ g1 ~@5", U: "e2@5 ~@3",
  V: "a1 ~ a1 e1 a1 e1 a1 e1 c2 ~ c2 d2 ~ e1 g1 g#1", W: "a1 ~ a1 ~ a1 e1 a1 e1 c2 ~ c2 d2 ~ e1 g1 g#1",
  X: "a1@2 a1 ~ a1 e1 a1 e1 c2 ~ c2 d2 ~ e1 g1 g#1", Y: "a1 ~ a1 ~ a1 e1 a1 e1 c2 ~ c2 d2 ~@4",
  Z: "a1 ~ a1 ~ a1 ~@3 d2@2 g2 e2@2 a2 ~@2", AA: "a1 ~ a1 ~ a1@3 ~ d2@2 g2 e2@2 a2 ~@2",
  AB: "a1 ~ a1 ~ a1@2 ~@2 d2@2 g2 e2@2 a2 ~@2", AC: "a1 ~ f#1 ~ a1 f#1 ~@2 d2@2 g2 e2@2 a2 ~@2",
  AD: "a1 ~ f#1 ~ a1 f#1 ~@2 d2@2 ~ e2@2 a2 ~@2, ~@5 g2 ~@2", AE: "a1@2 f#1 ~ a1 f#1 ~@2 d2@2 g2 e2@2 a2 ~@2",
  AF: "a1@2 a2 ~ a2 ~ e2 d2 c2 e1 a1 e1 a1 e1 g1 g#1, ~@5 g2@2 ~@9",
  AG: "a1@2 a2 ~ a2 g2 e2 d2 c2 e1 a1 e1 a1 e1 a1 e1", AH: "a1 ~ a1@3 ~ a1@2 c2@2 a1@2 g1 a1@2 ~", AI: "a1 ~@15",
  AJ: "f1 ~ f1@2 ~@2 f1 ~ g1 ~ g1@2 ~@2 g1 ~", AK: "f1 ~ f1@2 ~@2 f1@2 c2 ~ c2@2 g1 ~ g1 ~",
  AL: "f1 ~ f1@2 ~@2 f1 ~ g1 ~ g1@2 ~@2 g1@2", AM: "f1 ~@7 g1@2 ~@6", AN: "[~ a1@2 ~]/2",
})).s("gm_electric_bass_finger").gain(0.72)

// chords · overdriven guitar · "Track 3"
const overdriven_guitar = note(`<
  ~ A B C D ~@2 E ~ F ~ G ~ G ~ H I J B H I K D ~@2 L ~ F ~ L ~ L ~ H I K B H I K D ~@2 M@8 N@4 O@4 M ~ P ~ M ~ M ~ H I
  Q B H I K D A B K B A B K B A R C B S T@2
>`.pickRestart({
  A: "[c3,f3] ~ [c3,f3] ~ [c3,g3]@2 f3 ~ [d3,g3] ~ [d3,g3] ~ [d3,a3]@2 g3 ~", // F5 C5 G5 D5
  B: "[e3,a3] ~ [e3,a3]@3 ~ [e3,a3] ~ [e3,c4] ~ [e3,a3] ~ [e3,g3] [e3,a3]@2 ~", // A5 C A5 Em A5
  C: "[c3,f3] ~ [c3,f3] ~ [c3,g3]@2 f3 ~ [g3,c4]@3 ~ [d3,g3]@3 ~", D: "[e3,a3] ~@15",
  E: "~@2 [e3,a3] ~@2 [e3,a3]@2 ~ [g3,c4] ~@2 [a3,d4]@2 ~ [g3,c4] ~", // A5 C5 D5 C5
  F: "~@2 [e3,a3] ~@2 [e3,a3] ~@2 [g3,c4] ~@2 [a3,d4]@2 ~ [g3,c4] ~", // A5 C5 D5 C5
  G: "~@2 [e3,a3] ~@2 [e3,a3] ~@2 [g3,c4] ~@2 [a3,d4] ~@2 [g3,c4] ~", H: "[c3,f3] ~ [c3,f3] ~@5 [d3,g3] ~ [d3,g3] ~@5",
  I: "[e3,a3] ~ [e3,a3]@2 ~@2 [e3,a3] ~ [e3,c4] ~ [e3,a3] ~ [e3,g3] [e3,a3]@2 ~", // A5 C A5 Em A5
  J: "[b2,c3,f3] ~ [c3,f3]@3 ~ [c3,f3] ~ [g3,c4]@3 ~ [d3,g3]@3 ~", // F F5 C5 G5
  K: "[c3,f3] ~ [c3,f3]@3 ~ [c3,f3] ~ [g3,c4]@3 ~ [d3,g3]@3 ~", // F5 C5 G5
  L: "~@2 [e3,a3]@2 ~ [e3,a3] ~@2 [g3,c4]@2 ~ [a3,d4]@2 ~ [g3,c4] ~", // A5 C5 D5 C5
  M: "~@2 [e3,a3]@2 ~ [e3,a3]@2 ~ [g3,c4]@2 ~ [a3,d4]@2 ~ [g3,c4]@2", // A5 C5 D5 C5
  N: "~@2 [e3,a3]@2 ~ [e3,a3]@2 ~@3 [g3,c4]@2 ~ [a3,d4]@2 ~", O: "a3 ~ f#3 ~ a3 f#3 ~@2 d3@2 g3 e3@2 a3 ~@2",
  P: "~@2 [e3,a3]@2 ~ [e3,a3] ~@2 [g3,c4]@2 ~ [a3,d4]@2 ~ [g3,c4]@2", // A5 C5 D5 C5
  Q: "[c3,f3] ~ [c3,f3]@2 ~@2 [c3,f3] ~ [g3,c4]@3 ~ [d3,g3]@3 ~", // F5 C5 G5
  R: "[e3,a3] ~ [e3,a3]@3 ~ [e3,a3] ~ e3 ~ [e3,a3] ~ [e3,g3] [e3,a3]@2 ~", S: "[c3,f3] ~@7 [d3,g3] ~@7",
  T: "[~@8 [e3,a3]@15 ~@9]/2", // A5
})).s("gm_overdriven_guitar").gain(0.72)

// other · distortion guitar · "Track 4"
const distortion_guitar = note(`<
  ~@2 A ~ B C@2 ~ D ~ E ~ F ~ G ~ A ~ A ~ H ~ B I@2 ~ J ~ E ~ F ~ E ~ A ~ A ~ A ~ B K@2 ~@17 J ~ E ~ J ~ E ~ A ~ A ~ A
  ~@3 A ~ H ~ H ~ H ~ A ~ H ~@3
>`.pickRestart({
  A: "~@4 e3 g3 a3 g3 c4 ~ a3 ~ g3 a3@2 ~", B: "~@13 a2@3",
  C: "[~@2 c#4 d4@2 c#4 d4@2 [c#4,d4]@2 c#4 d4@2 c#4 d4 ~@3 [c#4,b4,c#5] [d4,d5]@2 [c#4,c#5] [d4,d5]@2 [c#4,d4,c#5] ~ [c#4,c#5] [d4,d5]@2 [c#4,c#5] [d4,d5] ~, e2@15 ~, ~@25 d5@2 ~@5]/2", // Dmaj7 C#7 D C# D Dmaj7 C# D …
  D: "[a2,a3]@2 [a3,a4] ~ [a3,a4] [g3,g4] [e3,e4] [d3,d4] [c3,c4] [g2,f#3,g3] [a3,g4,a4] ~@5", // A G E D C Gmaj7 A7
  E: "[a2,a3]@2 [a3,a4] ~ [a3,a4] [g3,g4] [e3,e4] [d3,d4] [c3,c4] [g2,g3] [a2,a3] ~@5", // A G E D C G A
  F: "[a2,a3]@2 [a3,a4] ~ [a3,a4] [g3,g4] [e3,e4] [d3,d4] [c3,c4] [g2,g3] [a3,a4]@2 ~@4", // A G E D C G A
  G: "[a2,a3]@2 [a3,a4] ~ [a3,a4] [g3,g4] [e3,d4,e4] [d3,d4] [c3,c4] [g2,g3] [a2,a3] ~@5", // A G E7 D C G A
  H: "~@4 e3 g3 a3 g3 c4 ~ a3 ~ g3 a3 ~@2",
  I: "[~@2 c#4 d4@2 c#4 d4@2 c#4 d4@2 c#4 ~ c#4 d4 ~@3 [c#4,c#5] [d4,d5]@2 [c#4,c#5] [d4,d5]@2 [c#4,d4,c#5] ~ [c#4,c#5] [d4,d5]@2 [c#4,c#5] [d4,d5] ~, e2@13 ~@3, ~@12 d4@2 ~@11 d5@2 ~@5]/2", // C# D C# D Dmaj7 C# D C# …
  J: "[a2,a3]@2 [a3,a4] ~ [a3,a4] [g3,g4] [e3,e4] [d3,d4] [c3,c4] [g2,g3] [a3,a4] ~@5", // A G E D C G A
  K: "[~@2 c#4 d4@2 c#4 ~ c#4 d4@2 c#4 d4@2 [c#4,d4] ~@4 [c#4,c#5] [d4,d5]@2 [c#4,c#5] [d4,d5]@2 [c#4,d4,c#5] ~ c#4 [d4,c#5] ~ [c#4,d4,c#5] d5 ~, e2@3 ~, ~@6 d4@2 ~@17 d5@2 ~ d5@2 ~@2]/2", // Dmaj7 C# D C# D Dmaj7
})).s("gm_distortion_guitar").gain(0.72)

// other · overdriven guitar · "Track 5"
const overdriven_guitar_2 = note("<~@43 A B C D E@2 F G H I J K L M N O P ~@30>".pickRestart({
  A: "[a4,d5] ~ [a4,d5] ~ [a4,d5]@2 ~@4 d5 g5 g5@2 g5 [d5,e5]", B: "e5 ~ d5 c5 d5 c5 a4 g4 a4 ~ a#4@3 ~@3",
  C: "[a4,d5] ~ [a4,d5] ~ [a4,d5]@2 ~@4 d5 g5!2 ~ [e5,g5] d5", D: "e5 ~ [d5,e5] c5 d5 ~ d5 c5 d5 c5 a4 g4 a4 c5 a4 c5",
  E: "[c6 ~ c6 ~ c6@3 ~@3 d6 c6 g5@2 c6 g5@2 c6 g5@2 c6 g5@2 c6 g5@2 c6 g5@2 c6 ~@2]/2",
  F: "g5 e5 d5 c5 g5 e5 d5 c5 g5 e5 d5 c5 g5 e5 d5 c5",
  G: "[e5,g5] [c5,d5] g5 [d5,e5] [c5,g5] [d5,e5] [c5,g5] [d5,e5] [c5,g5] [c5,d5,e5] [e5,g5] [c5,d5] g5 g5@2 ~", // Em Csus2 Dsus2 C5 Dsus2 C5 Dsus2 C5 …
  H: "c4 a3 c4 d4 c4 a3 [c4,d4] a3 c4 a3 c4 d4 c4 a3@2 ~", I: "c4 ~ d4 ~ e4 ~ f4 ~ g4 ~ g#4 ~ g4@3 ~",
  J: "c5 a4 c5 d5 ~ c5 a4 c5 ~ a4 c5 d5@2 ~ d5 ~", K: "c5 a4@3 ~@2 g4 a4 f4 a4 e4 a4 d4 a4 [d4,e4] c4",
  L: "c4 a3@2 ~@5 c6@2 ~ c6@3 c6 ~", M: "g5@6 g5 e5 [e5,g5] d5 e5 d5 c5 d5 c5 a4",
  N: "c5 a4@2 ~@3 [g5,a5] c6 d6@2 ~ c6@2 ~ c6 ~", O: "g5@4 ~@2 g5 e5 [e5,g5] d5 e5 d5 c5 d5 c5 a4", P: "c5 a4@2 ~@13",
})).s("gm_overdriven_guitar").gain(0.64)

// other · harmonica · "Track 7"
const harmonica = note(`<
  ~@16 A@2 B ~ A@2 ~@12 A@2 B ~ A@2 ~@28 C@2 D ~ C@2 ~@2 A@2 D ~ A@2 B ~ C@2 B E@2 ~
>`.pickRestart({
  A: "[e5@3 ~ d5@3 ~ c5@3 ~ a4 ~ a4 [a4,c5]@5 ~@12]/2", B: "~@4 a4 ~ a4 ~ [a4,c5]@5 ~@3",
  C: "[e5@3 ~ d5@3 ~ c5@3 ~ a4 ~ a4 [a4,c5]@4 ~@13]/2", D: "~@4 a4 ~ a4 ~ [a4,c5]@4 ~@4", E: "[~@15 [a4,c5]@11 ~@6]/2",
})).s("gm_harmonica").gain(0.72)

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

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

// drums · low tom
const low_tom = s("lt").struct("<A ~@5 A ~@17 A ~@17 A ~@31 A ~@15>".pickRestart({
  A: "~@14 x!2",
})).gain(0.8)

// drums · hihat
const hihat = s("hh").struct("<~ A B C D E F B@8 ~@8 E F B@8 ~@8 E F ~@16 B@8 ~@23>".pickRestart({
  A: "~ x!7", B: "x!8", C: "x!4 ~ x ~ x", D: "~@7 x", E: "x ~ x!3 ~ x!3 ~ x!2 ~ x ~@2", F: "x ~ x!3 ~@2 x ~@8",
})).gain(0.56)

// drums · mid tom
const mid_tom = s("mt").struct("<A ~@5 A ~@17 A ~@17 A ~@28 B ~@2 A ~@15>".pickRestart({
  A: "~@12 x!2 ~@2", B: "~@15 x",
})).gain(0.8)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@5 A B ~@9 C@3 ~ C@2 ~ A B ~@9 C@3 ~ C@2 ~ A B ~@25 C@3 ~ C@2 ~ C@12 ~@3
>`.pickRestart({
  A: "x ~ x!3 ~ x!3 ~ x!2 ~ x ~@2", B: "x ~ x!3 ~@2 x ~@8", C: "x!8",
})).gain(0.56)

// drums · high tom
const high_tom = s("ht").struct("<A ~@5 A ~@17 A ~@17 A ~@28 B ~@2 A ~@15>".pickRestart({
  A: "~@10 x!2 ~@4", B: "~@7 x",
})).gain(0.8)

// drums · crash
const crash = s("cr").struct("<~ x ~ [~@2 x!2] x ~@85>").gain(0.8)

// drums · ride
const ride = s("rd").struct("<~@43 [x!8]!7 [x!6 ~@2] [x!8]!7 [x!6 ~@2] ~@31>").gain(0.8)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@6 A B@8 ~ B@3 ~ B@2 C ~ A B@8 ~ B@3 ~ B@2 C ~ A C ~@15 B@8 ~ B@3 ~ B@2 C B@12 ~@3
>`.pickRestart({
  A: "~@7 x!9", B: "x!16", C: "x",
})).gain(0.56)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@15 A ~@3 A ~@13 A ~@3 A ~@29 A ~@3 A ~@18>".pickRestart({
  A: "~@4 x!4 ~@4 x!4",
})).gain(4.06)

stack(
  bass, overdriven_guitar, distortion_guitar, overdriven_guitar_2, harmonica, kick, snare, low_tom, hihat, mid_tom,
  open_hat, high_tom, crash, ride, tambourine, cabasa
)