Strudelify
I Saw the Light cover art

With a Twist...

I Saw the Light

Todd Rundgren

KeyA♭ majorTempo117 bpm
0:00/0:00
// I Saw the Light — Todd Rundgren
// 117 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 4 piano (copy of ch 3 piano)
// note: Full arrangement: all 90 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(117/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, A@4 for four bars: edit a riff to change every repeat.

// bass · fretless bass · "bass"
const bass = note(`<
  A@2 B@8 C D E@2 B@4 C F G H I J K L C D M D N@2 B@4 C D E@2 B@4 C F D H I J K L C D M D N@2 B@4 C D E@2 B@4 O F D H I
  J K L C D M D M D M D M D M ~
>`.pickRestart({
  A: "[~@10 gb2@2 f2@2 eb2@6 ~@2 eb2 ~ eb2@4 ~@2 eb2@2]/2",
  B: "[ab1 ~ ab1@3 ~ ab1 ~ ab1@2 gb2@2 f2@2 eb2@6 ~@2 eb2 ~ eb2@4 ~@2 eb2@2]/2",
  C: "ab1 ~ ab1@3 ~ ab1 ~ ab1@4 ~@2 ab1@2", D: "db2@4 ~@2 db2 ~ db2@4 ~@2 db2@2",
  E: "[f2@4 ~@2 f2@3 ~ bb2@2 f2@2 eb2@6 ~@2 eb2 ~ eb2@4 ~@2 eb2@2]/2", F: "db2@5 ~ db2 ~ db2@5 ~ db2 ~",
  G: "db2 ~ db2@3 ~ db2 ~ db2@4 ~@2 db2@2", H: "gb2@5 ~ gb2@2 db2@2 gb2@4 db2@2", I: "ab1@2 ~ ab1 eb2 ab1 eb2 ab1",
  J: "bb2@2 ~ bb2 f2 bb1 bb2 bb1", K: "eb2@2 ~ eb2 bb2 bb1 gb2 f2", L: "eb2@4 ~@2 eb2 ~ eb2@4 ~@2 eb2@2",
  M: "eb2@2 ~ eb2 ab2@2 ab1@2", N: "[eb2@4 ~@2 eb2@2 ab2 ~ gb2@2 f2@2 eb2@6 ~@2 eb2 ~ eb2@4 ~@2 eb2@2]/2",
  O: "ab1 ~ ab1@2 ~@2 ab1 ~ ab1@4 ~@2 ab1@2",
})).s("gm_fretless_bass").gain(0.8)

// chords · piano
const piano = note(`<
  A@8 B@3 C D@7 E F G H I J@3 K L M N@7 O P@7 Q@2 G H I R@3 K S T U@7 O V@7 W X G H I J@3 K Y T Z AA AB T AC T AD AE
>`.pickRestart({
  A: "[~@10 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ [eb4,ab4,c5]@2 ~@2 [eb4,ab4,c5]@2 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ [eb4,ab4,c5]@2 ~@2 [eb4,ab4,c5]@2 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ [eb4,ab4,c5]@2 ~@4 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ [eb4,ab4,c5]@2, ~@7 eb3@5 ~ eb3@2 ~ ab2@2 ~ ab2@2 ~@2 eb3@5 ~ eb3@2 ~ ab2@2 ~ ab2@2 ~@2 eb3@5 ~ eb3@2 ~ ab2@2 ~ ab2@2 ~@2 eb3@5 ~ eb3@2 ~, ~@14 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@12 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@12 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@6 [eb4,ab4,c5]@4 ~@2 db4@2 ~@8 gb4 ~@7]/8", // Gb Ab Gb Ab Gb Ab Gb Ab
  B: "[~@2 eb4 ~ [eb4,ab4,c5]@2 ~@4 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ eb4@2 ~@2 eb4@2 [ab4,c5]@2 eb4 ~ ab2@2, ab2@2 ~ ab2@2 ~@2 eb3@5 ~ eb3@2 ~ ab2@2 ~ ab2@3 ~@2, ~@8 [eb4,ab4,c5]@4 ~@2 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@2 [ab4,c5]@4 ~@8]/3", // Ab Gb Ab
  C: "[ab4,c5,eb5,f5] ~@3 ab4@2 ~@2 ab4@2 [c5,eb5,f5]@2 ab4 ~ db3@2, db3 [c5,eb5,f5] ~@2, ~@6 db3@5 ~@5", // Fm7 F7
  D: "[[f4,ab4,c5,eb5] ~@5 f3@2 bb3@2 f3@4 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ [eb4,ab4,c5]@2 ~@4 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ [eb4,ab4,c5]@2 ~@4 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ eb4@2 ~@2 eb4@2 [ab4,c5]@2 eb4 ~ ab2@2, f3@2 [f4,ab4,c5,eb5]@3 ~@2 eb3@5 ~ eb3@2 ~ ab2@2 ~ ab2@2 ~@2 eb3@5 ~ eb3@2 ~ ab2@2 ~ ab2@2 ~@2 eb3@5 ~ eb3@2 ~ ab2@2 ~ ab2@3 ~@2, ~@14 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@6 [eb4,ab4,c5]@4 ~@2 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@6 [eb4,ab4,c5]@4 ~@2 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@2 [ab4,c5]@4 ~@8]/7", // Fm7 Gb Ab Gb Ab Gb Ab Fm7 …
  E: "[db4,f4,ab4] ~@3 db4@2 ~@2 db4 ~ db4 ~ db3@2 db4 ~, db3@2 [f4,ab4]@2 ~ [f4,ab4]@2 ~, ~@6 db3@5 ~@5", // Db Fm
  F: "[b3,c4,f4,ab4] ~@3 b3@2 ~@2 b3 ~ b3@2 ~@2 b3 ~, db3@2 [f4,ab4]@2 ~ [f4,ab4]@2 ~, ~@3 db3@2 ~ db3@2", // Fm
  G: "[db4,gb4,bb4] ~@3 db4@2 ~@2 db4@2 [gb4,bb4]@2 db4@2 gb2@2, gb2 [gb4,bb4] ~@2, ~@3 gb2@3 ~@2", // Gb
  H: "[eb4,ab4,c5] ~@3 eb4 ~@3 eb4@2 [ab4,c5]@2 eb4 ~ ab2@2, ab2 [ab4,c5] ~@2, ~@3 ab2@3 ~@2", // Ab
  I: "[f4,bb4,db5] ~@3 f4@2 ~@2 f4@2 [bb4,db5]@2 f4@2 bb2@2, bb2 [bb4,db5] ~@2, ~@3 bb2@3 ~@2", // Bbm
  J: "[[g4,bb4,eb5] ~@3 g4@2 ~@2 g4 ~ gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ eb4@2 ~@2 eb4@2 [ab4,c5]@2 eb4 ~ ab2@2, eb3@4 [bb4,eb5]@5 ~@5 db4 ~@9 gb4 ~@5 [ab4,c5]@4 ~@2 [ab4,c5]@4 ~@8, ~@3 eb3@2 ~@2 eb3@5 ~ eb3@2 ~ ab2@2 ~ ab2@3 ~@2]/3", // Eb Gb Ab Eb5 Ab
  K: "[db4,f4,ab4] ~@3 db4@2 ~@2 db4@2 f4@2 db3@4, db3 [f4,ab4] ~@2, ~@3 db3@2 ~@3", // Db Fm
  L: "[db4,gb4,bb4] ~@3 [db4,gb4,bb4]@4 ~@2 db4@2 ~@2 db4 ~, eb3@2 ab3 ab2, ~@5 [gb4,bb4]@2 ~", // Gb
  M: "db3@2 db4 ~ db4 [f4,ab4] db4 db3, ~ [f4,ab4] ~@2, ~@6 db3@5 ~@5", // Fm
  N: "[[db4,gb4,bb4] ~@3 db4@2 eb3@2 ab3@2 gb3@2 [f3,ab3]@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 [gb4,bb4] ~@3 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ [eb4,ab4,c5]@2 ~@4 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ [eb4,ab4,c5]@2 ~@4 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ eb4 ~@3 eb4@2 [ab4,c5]@2 eb4 ~ ab2@2, eb3@2 [gb4,bb4]@2 ~ [db4,gb4,bb4]@2 eb3@5 ~ eb3@2 ~ ab2@2 ~ ab2@2 ~@2 eb3@5 ~ eb3@2 ~ ab2@2 ~ ab2@2 ~@2 eb3@5 ~ eb3@2 ~ ab2@2 ~ ab2@3 ~@2, ~@14 db4@2 ~@14 [ab4,c5]@4 ~@6 [eb4,ab4,c5]@4 ~@2 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@6 [eb4,ab4,c5]@4 ~@2 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@2 [ab4,c5]@4 ~@8]/7", // Gb Fm Gb Ab Gb Ab Gb Ab …
  O: "[ab4,c5,eb5,f5] ~@3 ab4@2 ~@2 ab4@2 [c5,eb5,f5]@2 ab4 ~ db3@2, db3 [c5,eb5,f5] ~@2, ~@3 db3@3 ~@2", // Fm7 F7
  P: "[[f4,ab4,c5,eb5] ~@5 f3@2 bb3@2 f3@4 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ [eb4,ab4,c5]@2 ~@4 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ [eb4,ab4,c5]@2 ~@4 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ eb4@2 ~@2 eb4@2 [ab4,c5]@2 eb4 ~ ab2@2, f3@4 [f4,ab4,c5,eb5]@6 ~@4 eb3@10 ~@2 eb3@4 ~@2 ab2@4 ~@2 ab2@4 ~@4 eb3@10 ~@2 eb3@4 ~@2 ab2@4 ~@2 ab2@4 ~@4 eb3@11 ~ eb3@4 ~@2 ab2@4 ~@2 ab2@6 ~@4, ~@14 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@6 [eb4,ab4,c5]@4 ~@2 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@6 [eb4,ab4,c5]@4 ~@2 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@2 [ab4,c5]@4 ~@8]/7", // Fm7 Gb Ab Gb Ab Gb Ab Fm7 …
  Q: "[[db4,f4,ab4] ~@3 db4@2 ~@2 db4@2 [f4,ab4]@2 db4@2 ~@2 [b3,f4,ab4] ~@3 b3@2 ~@2 b3@2 [f4,ab4]@2 b3@2 ~@2, db3 [f4,ab4] ~@3 [f4,ab4] ~@2, ~@6 db3@7 ~ db3@6 ~@2 db3@8 ~@2]/2", // Db Fm Fdim Fm
  R: "[[g4,bb4,eb5] ~@3 g4@2 ~@2 g4@2 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 [gb4,bb4] ~@3 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ eb4@2 ~@2 eb4@2 [ab4,c5]@2 eb4 ~ ab2@2, eb3@4 [bb4,eb5]@5 ~@5 db4 ~@15 [ab4,c5]@4 ~@2 [ab4,c5]@4 ~@8, ~@3 eb3@2 ~@2 eb3@5 ~ eb3@2 ~ ab2@2 ~ ab2@3 ~@2]/3", // Eb Gb Ab Eb5 Ab
  S: "[db4,gb4,bb4] ~@3 [db4,gb4,bb4]@4 ~@2 db4@2 ~@2 db4@2, eb3@2 ab3 ab2, ~@10 [gb4,bb4]@5 ~", // Gb
  T: "db3@2 db4 ~ db4 [f4,ab4] db4 db3, ~ [f4,ab4] ~@2, ~@3 db3@3 ~@2", // Fm
  U: "[[db4,gb4,bb4] ~@3 db4@2 ~@2 db4 ~ [gb3,db4,gb4,bb4]@2 [f3,ab3]@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ [eb4,ab4,c5]@2 ~@4 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ [eb4,ab4,c5]@2 ~@4 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ eb4 ~@3 eb4@2 [ab4,c5]@2 eb4 ~ ab2@2, eb3@6 ab3@5 ~@3 eb3@10 ~@2 eb3@4 ~@2 ab2@4 ~@2 ab2@4 ~@4 eb3@10 ~@2 eb3@4 ~@2 ab2@4 ~@2 ab2@4 ~@4 eb3@10 ~@2 eb3@4 ~@2 ab2@4 ~@2 ab2@6 ~@4, ~@4 [gb4,bb4]@4 ~@6 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@6 [eb4,ab4,c5]@4 ~@2 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@6 [eb4,ab4,c5]@4 ~@2 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@2 [ab4,c5]@4 ~@8]/7", // Gb Fm Gb Ab Gb Ab Gb Ab …
  V: "[[f4,ab4,c5,eb5] ~@5 f3@2 bb3@2 f3@4 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ [eb4,ab4,c5]@2 ~@4 gb3@2 f3@2 [gb4,bb4]@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ [eb4,ab4,c5]@2 ~@4 gb3@2 f3@2 gb4@4 db4@2 [gb4,bb4]@2 db4@2 bb4@2 ~@2 [gb4,bb4,db5] ~ eb4@2 ~@2 eb4 ~ eb4@2 ~@2 eb4@2 [ab4,c5]@2 eb4 ~ ab2@2, f3@4 [f4,ab4,c5,eb5]@6 ~@4 eb3@10 ~@2 eb3@4 ~@2 ab2@4 ~@2 ab2@4 ~@2 e3 ~ eb3@10 ~@2 eb3@4 ~@2 ab2@4 ~@2 ab2@4 ~@4 eb3@10 ~@2 eb3@4 ~@2 ab2@4 ~@2 ab2@6 ~@4, ~@14 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@6 [eb4,ab4,c5]@4 ~@2 db4@2 ~@8 gb4 ~@5 [ab4,c5]@4 ~@6 [eb4,ab4,c5]@4 ~@2 db4@2 ~@32, ~@78 bb4 ~@9 gb4 ~@5 [ab4,c5]@4 ~@2 [ab4,c5]@4 ~@8]/7", // Fm7 Gb Ab Gb Ab Gb Ab Fm7 …
  W: "[db4,f4,ab4] ~@3 db4@2 ~@2 db4@2 [f4,ab4]@2 db4@2 db3 ~, db3 [f4,ab4] ~@2, ~@3 db3@3 ~@2", // Db Fm
  X: "[b3,f4,ab4] ~@3 b3@2 ~@2 b3@2 [f4,ab4]@2 b3@3 ~, db3 [f4,ab4] ~@2, ~@6 db3@9 ~", // Fdim Fm
  Y: "[db4,gb4,bb4] ~@3 [gb4,bb4]@4 ~@2 db4@2 ~@2 db4 ~, eb3@2 ab3 ab2, ~@4 db4 ~@5 [gb4,bb4]@4 ~@2", // Gb
  Z: "[db4,gb4,bb4] ~@3 [gb4,bb4]@4 ab3@2 [db4,gb4,bb4]@4 ab3@2, eb3 ~, ~@4 db4 ~@11", // Gb
  AA: "db3@4 db4@2 ~@2 db4 ~ [f4,ab4]@2 db4@2 db3@2, ~ [f4,ab4] ~@2, ~@3 db3@3 ~@2", // Fm
  AB: "[db4,gb4,bb4] ~@3 [db4,gb4,bb4]@4 ab3@2 db4@2 ab3@2 db4@2, eb3@4 ~@6 [gb4,bb4]@5 ~", // Gb
  AC: "[db4,gb4,bb4] ~@3 [db4,gb4,bb4]@4 ~@2 [gb4,bb4]@4 db4@2, eb3@2 ~@2 ab3@3 ~, ~@5 db4 ~@2", // Gb
  AD: "[db4,gb4,bb4] ~@3 db4 ~ eb3@2 ab3@2 db4@2 ab3@2 db4@2, eb3@4 [gb4,bb4]@4 ~@2 [gb4,bb4]@5 ~", // Gb
  AE: "~@4 [db4,f4,ab4]@5 ~@7, db3@9 ~@7", // Db
})).s("gm_piano").gain(0.35)

// other · distortion guitar · "guitar"
const distortion_guitar = note(`<
  A@10 ~@2 B@2 A@2 C@2 ~@12 A@2 C@4 ~@2 B@2 C@4 ~@12 C@4 A@2 ~@2 D@2 C@4 ~@20
>`.pickRestart({
  A: "[~@10 gb3@2 f3@2 eb3@15 ~@3]/2", B: "[~@4 bb3 f3@2 eb3@7 ~@2]/2", C: "[~@10 gb3@2 f3@2 eb3@17 ~]/2",
  D: "[~@4 bb3 f3@2 eb3@8 ~]/2",
})).s("gm_distortion_guitar").gain(0.35)

// other · pad warm
const pad_warm = note("<~@27 A B A C ~@22 A B A D ~@22 A B A B A B A B A B ~>".pickRestart({
  A: "~ ab3@2 c4", B: "bb3", C: "bb3@7 ~", D: "bb3@15 ~",
})).s("gm_pad_warm").gain(0.3)

// drums · kick
const kick = s("bd").struct(`<
  [x ~@5 x!2]!20
  [x ~@3 x!2 ~@2]!10
  [x ~@5 x!2]!16
  [x ~@3 x!2 ~@2]!11
  [x ~@5 x!2]!15
  [x ~@3 x!2 ~@2]!17
  ~
>`).gain(0.71)

// drums · snare
const snare = s("sd").struct(`<
  A@20 B C@3 B C@5 A@16 B C@3 B C B C@4 A@15 B C@3 B C@3 B C B C B C B C@2 ~
>`.pickRestart({
  A: "~ x ~@2", B: "~@4 x ~@2 x!2 ~ x!6", C: "~ x ~ x",
})).gain(0.71)

// drums · hihat
const hihat = s("hh").struct("<[x!8]!89 ~>").gain(0.71)

// drums · mid tom
const mid_tom = s("mt").struct("<[~@6 x!2]!20 ~@10 [~@6 x!2]!16 ~@11 [~@6 x!2]!15 ~@18>").gain(0.71)

stack(bass, piano, distortion_guitar, pad_warm, kick, snare, hihat, mid_tom)

More by Todd Rundgren