Strudelify

I Can See for Miles

The Who

KeyE majorTempo125 bpm
0:00/0:00
// I Can See for Miles — The Who
// 125 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 140 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(125/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · "Bass"
const bass = note(`<
  A@30 B C B D E F G F G A@16 B C B D E F G F G A@9 H A H A H A@20 I@8 J K J L A M N M N I@11 O P O P O P O P O P O P O
  P
>`.pickRestart({
  A: "e2!8", B: "a2", C: "b2", D: "b2@2 b2!6", E: "b2!8", F: "a2@2 c#3 e3 b2@2 d#3 f#3", G: "e2@3 d3!2 c3 b2 g#2",
  H: "g2 e2!2 a2 e2!4", I: "a2!8", J: "d3", K: "e3", L: "e3@2 e2!6", M: "d2@2 f#2 a2 e2 g#2 b2@2",
  N: "a2!2 c3 e3 a3 e3 a3 e3", O: "d2@2 f#2 a2 e2@2 f#2 b2", P: "a2 c#3 e3 a2 c#3 e3 c#3 a2",
})).s("gm_electric_bass_finger").gain(0.24)

// chords · overdriven guitar · "Guitar 1"
const overdriven_guitar = note(`<
  A@2 B C B C B C D C E C D C F@4 G@4 B H I J B H K L M N O P Q G@12 L R S H T@3 B U V U P Q W@8 X ~@2 Y Z@4 AA AB AC AD
  AE@4 AF AG ~@2 AF AG ~@4 W@3 AH AI AJ AK AL AI AJ AM AN AO AP AO AQ@2 AR@14 AS AT@14
>`.pickRestart({
  A: "[e3,b3,e4]/2", B: "[e3,b3,e4]", C: "[g3,d4,g4]@3 [a3,e4,a4]@5", D: "[e3,b3,e4,g4,b4]", E: "[e3,b3,e4,b4]",
  F: "e4!16", G: "e4!4", H: "[g3,d4,g4] [a3,e4,a4]", I: "[e3,b3,e4]@7 [e3,b3,e4]",
  J: "[e3,b3,e4]@3 [a3,e4,a4] [a3,e4,a4]@4", K: "[e3,b3,e4]@12 d4 e4 d4 e4", L: "e3", M: "[a2,e3,a3,c#4,e4] ~@7",
  N: "[b2,f#3,b3,d#4,f#4] ~@7", O: "[g2,d3,a3,c#4,e4] ~@7", P: "[b2,f#3,b3,d#4,f#4]@2 [b2,f#3,b3,d#4,f#4]!6",
  Q: "[b2,f#3,b3,d#4,f#4]!8", R: "[g3,d4,g4] [a2,e3,a3,c#4,e4]", S: "[e2,b2,e3,g#3,b3,e4]", T: "[e3,b3,e4]/3",
  U: "[a2,e3,a3,c#4,e4] ~@3", V: "[b2,f#3,b3,d#4,f#4] ~@3", W: "e5!4", X: "e5@3 e5", Y: "~@7 d3", Z: "e3!16",
  AA: "e3 [d3,e3] e3 [d3,e3] e3 [d3,e3] e3 [d3,e3] e3 [d3,e3] e3 [d3,e3] e3 [d3,e3] e3 [d3,e3]", // Dsus2
  AB: "[g3,d4,g4] e3!5 [a3,e4,a4] e3!9", AC: "e3@13 [d3,e3] d3 [d3,e3]",
  AD: "e3 [d3,e3] d3 [d3,e3] e3@2 d3 [d3,e3] e3@6 d3 [d3,e3]", AE: "[e3@9 d3 e3 d3 e3 d3 e3@11 d3 e3 d3 e3 d3 e3@34]/4",
  AF: "[g4,b4]", AG: "[a4,c#5]", AH: "e5!3 ~", AI: "[a2,e3,a3,c#4,e4]", AJ: "[a2,g3,c4,e4] [a2,a3,d4,e4,f#4]",
  AK: "[a2,e3,a3,c#4,e4]@7 [a2,g3,c4,e4]", AL: "[a2,g3,c4,e4]@3 [a2,a3,d4,e4,f#4] [a2,a3,d4,e4,f#4]@4",
  AM: "[a2,e3,a3,c#4,e4]@12 d3 e3 d3 e3", AN: "a2", AO: "[d3,a3,d4,f#4] ~@3", AP: "[e2,b2,e3,g#3,b3,e4] ~@3",
  AQ: "[e2,b2,e3,g#3,b3,e4]/2", AR: "a4!4", AS: "a4 b4 ~@2", AT: "a5!4",
})).s("gm_overdriven_guitar").gain(0.24).pan(0.6)

// chords · acoustic guitar steel · "Guitar 2"
const acoustic_guitar_steel = note(`<
  ~@2 A B A B ~@2 C D ~ E F@2 G H I H J K@3 L M N O A P Q A R S R T@2 U A U J G H I H K V ~@3 D N W A B A@2 R S R X Y Z
  AA Z AA G H I AB J ~@3 A B A B A B A B A@2 ~@2 G H A ~ G H G H I AB AA AC AA@2 R AD AE AF AA AD AG@2 AH A AH F@2 AI AJ
  AI AJ AK AL AM AN@4 AG@2 R@2 AI AJ AI AJ AI AJ AI AJ AI AJ AI AJ AI AJ
>`.pickRestart({
  A: "[e2,b2,e3,g#3,b3,e4]", B: "[e2,d3,g3,b3,e4]@3 [e2,e3,a3,b3,c#4,e4]@5", C: "[e2,b2,e3,g#3,b3,e4]@6 [e3,b3,e4]!2",
  D: "[e2,d3,g3,b3,e4] [e2,e3,a3,b3,c#4,e4]", E: "~@7 [e2,b2,e3,g#3,b3,e4]", F: "[e2,b2,e3,g#3,b3,e4]/2",
  G: "[e2,d3,g3,b3,e4]", H: "[e2,e3,a3,b3,c#4,e4]", I: "[e2,g3,c4,e4]",
  J: "[e2,b2,e3,g#3,b3,e4]@2 [e2,b2,e3,g#3,b3,e4]!2", // E
  K: "[e2,b2,e3,g#3,b3,e4]@2 [e2,b2,e3,g#3,b3,e4]@2 [e2,b2,e3,g#3,b3,e4] [e2,b2,e3,g#3,b3,e4]@2 [e2,b2,e3,g#3,b3,e4]", // E
  L: "[e2,b2,e3,g#3,b3,e4]@14 [e2,b2,e3,g#3,b3,e4]!2", M: "[g2,b2,d3,g3,b3,g4] [a2,e3,a3,c#4,e4]",
  N: "[e2,b2,e3,g#3,b3,e4]@7 [e2,d3,g3,b3,e4]", // E Em7
  O: "[e2,d3,g3,b3,e4]@6 [e2,e3,a3,b3,c#4,e4]@2 [e2,e3,a3,b3,c#4,e4]@4 [e2,e3,a3,b3,c#4,e4]@2 [e2,e3,a3,b3,c#4,e4]!2", // Em7 A
  P: "[e2,d3,g3,b3,d4] [e2,e3,a3,b3,c#4,e4]", Q: "[e2,b2,e3,g#3,b3,e4]@7 [e2,b2,e3,g#3,b3,e4]", R: "[a2,e3,a3,c#4,e4]",
  S: "[b2,f#3,b3,d#4,f#4]", T: "[b2,f#3,b3,d#4,f#4]!4", U: "[g2,a2,e3,a3,c#4,e4] [b2,f#3,a3,d#4,f#4]",
  V: "[e2,b2,e3,g#3,b3,e4]@2 [e2,b2,e3,g#3,b3,e4]@2 [e2,b2,e3,g#3,b3,e4]!2 [e2,b2,e3,g#3,b3,e4]@2", // E
  W: "[e2,d3,g3,b3,e4]@3 [e2,e3,a3,b3,c#4,e4]@2 [e2,e3,a3,b3,c#4,e4]!3", // Em7 A
  X: "[b2,f#3,b3,d#4,f#4]@2 [b2,f#3,b3,d#4,f#4]@2 [b2,f#3,b3,d#4,f#4]@2 [b2,f#3,b3,d#4,f#4]!2", // B
  Y: "[b2,f#3,b3,d#4,f#4]!8", Z: "[a2,e3,a3,c#4,e4]!2 [b2,f#3,a3,d#4,f#4]!2", AA: "[e2,b2,e3,g#3,b3,e4]!4",
  AB: "[e2,a3,d4,f#4]", // D
  AC: "[e2,b2,e3,g#3,b3,e4]@4 [e2,b2,e3,g#3,b3,e4]@4 [e2,b2,e3,g#3,b3,e4]@2 [e2,b2,e3,g#3,b3,e4]@2 [e2,b2,e3,g#3,b3,e4]@2 [e2,b2,e3,g#3,b3,e4]!2", // E
  AD: "[a2,g3,c4,e4] [a2,a3,d4,e4,f#4]", AE: "[a2,e3,a3,c#4,e4]@7 [a2,g3,c4,e4]",
  AF: "[a2,g3,c4,e4]@6 [a2,f#3,a3,d4,f#4]!2 [a2,f#3,a3,d4,f#4]@4 [a2,f#3,a3,d4,f#4]@2 [a2,f#3,a3,d4,f#4]!2", // Am7 D
  AG: "[a2,e3,a3,c#4,e4]/2", AH: "[d3,a3,d4,f#4]", AI: "[d3,a3,d4,f#4]!2 [e2,b2,e3,g#3,b3,e4] [e2,e3,g#3,b3,e4]",
  AJ: "[a2,e3,a3,c#4,e4]!4", AK: "[a2,g3,c4,e4]", AL: "[a2,f#3,a3,d4,e4]", AM: "[a2,a3,c4,f4]", AN: "[a2,b3,d4,g4]",
})).s("gm_acoustic_guitar_steel").gain(0.36).pan(0.3)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@16 A B ~@2 B ~@7 A ~@9 B ~ B ~ B@2 ~ B@2 ~@12 B ~@9 B ~@9 B ~@19 B ~@9 B ~ B ~@3 B@2 ~ B ~@4 B ~@4 B ~@2 B@2 ~@2 B@2
  ~@2 B
>`.pickRestart({
  A: "~@2 x!4 ~@2 x!2 ~@6", B: "~@3 x ~@4",
})).gain(0.22)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@3 A ~@3 A ~@9 B ~@2 B ~@12 A ~ C A ~ B ~ B ~ B@2 ~ B@2 ~@5 C ~@6 B A ~@2 A ~@3 A ~ B ~ A ~@7 B ~@5 A ~ A ~@4 A ~@6 B
  ~ A ~@7 B ~ B ~@2 A B@2 ~ B ~@3 A B ~@2 A ~ B A@2 B@2 A@2 B@2 A@2 B
>`.pickRestart({
  A: "~@7 x", B: "~@3 x!5", C: "~@3 x",
})).gain(0.39)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct(`<
  ~@17 A ~@2 A ~@17 A ~ A ~ A@2 ~ A@2 ~@12 A ~@9 A ~@9 A ~@19 A ~@9 A ~ A ~@3 A@2 ~ A ~@4 A ~@4 A ~@2 A@2 ~@2 A@2 ~@2 A
>`.pickRestart({
  A: "~ x ~@2",
})).gain(0.22)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@3 A ~@3 A ~@6 B ~@8 B ~@5 B ~@3 A B C A ~@2 B ~@4 B ~@3 B ~@3 C ~@7 A ~@2 A ~@3 A ~@3 A ~@8 B ~@4 A ~ A B ~@3 A ~@8
  A ~@8 B ~@3 A ~@2 B ~@4 A ~@3 A ~@2 A@2 ~@2 A@2 ~@2 A@2 ~
>`.pickRestart({
  A: "~@13 x ~@2", B: "~@4 x!2 ~@2", C: "~@3 x ~@2 x ~",
})).gain(0.45)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A ~@3 A ~@3 A ~ B A@2 ~ A ~@2 A@2 ~ A ~@5 A ~@9 A ~@3 A ~@5 A ~@2 A ~@2 A@2 ~@3 A ~@2 A@2 ~ A@3 ~ A ~ A ~@2 A ~ A ~
  A ~@4 B ~@6 A@3 ~ A ~ B ~ A ~@5 A ~ A ~@6 A@2 ~@6 A@2 ~@3 A ~ A ~@12
>`.pickRestart({
  A: "~ x ~@2", B: "~@7 x",
})).gain(0.45)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@14 A ~@8 A ~@5 A ~@4 A B ~@3 A ~@4 A ~@3 A ~@3 B ~@27 A ~@7 A ~@21 A ~@6 A ~@22
>`.pickRestart({
  A: "~ x ~@2", B: "x",
})).gain(0.39)

// drums · crash
const crash = s("cr").struct(`<
  A ~ A ~ A ~ A ~ A ~ A ~@11 A ~ A ~ A ~@3 A ~@18 A ~ A ~@3 A ~@16 A ~ A ~ A ~ A ~@2 A ~@4 A ~@7 A ~@3 A ~ A ~ A ~ A ~ A
  ~@17 A ~@15
>`.pickRestart({
  A: "x",
})).gain(0.39)

// drums · ride
const ride = s("rd").struct(`<
  ~@3 A ~ A ~ A ~ A ~ B ~@12 C A ~@23 C A ~ A ~@20 A ~ A ~ A ~ A ~@20 C A ~@38
>`.pickRestart({
  A: "~@3 x ~@4", B: "~@3 x ~@3 x", C: "~@7 x",
})).gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@17 A ~@2 A ~@17 A ~ A ~ A@2 ~ A@2 ~@12 A ~@9 A ~@9 A ~@18 A@3 ~ A ~ A ~@4 A ~ A ~@3 A@2 ~ A ~@4 A@2 ~@3 A ~@2 A@2
  ~@2 A@2 ~@2 A
>`.pickRestart({
  A: "x!8",
})).gain(0.45)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@17 A ~@2 A ~@17 A ~ A ~ A@2 ~ A@2 ~@12 A ~@9 A ~@9 A ~@18 A@3 ~ A ~ A ~@4 A ~ A ~@3 A@2 ~ A ~@4 A@2 ~@3 A ~@2 A@2
  ~@2 A@2 ~@2 A
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(1.7)

// drums · shaker
const shaker = s("sh").struct(`<
  ~@17 A ~@2 A ~@17 A ~ A ~ A@2 ~ A@2 ~@12 A ~@9 A ~@9 A ~@18 A@3 ~ A ~ A ~@4 A ~ A ~@3 A@2 ~ A ~@4 A@2 ~@3 A ~@2 A@2
  ~@2 A@2 ~@2 A
>`.pickRestart({
  A: "x!4",
})).gain(0.45)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@98 A ~ A ~ A ~ A ~@19 A ~@15>".pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(0.28)

stack(
  bass, overdriven_guitar, acoustic_guitar_steel, kick, snare, snare_soft, low_tom, low_tom_soft, hihat, mid_tom,
  open_hat, high_tom, crash, ride, tambourine, cabasa, shaker, shaker_soft
)

More by The Who