Strudelify

Long As I Can See The Light

Creedence Clearwater Revival

KeyB♭ majorTempo64 bpm
0:00/0:00
// Long As I Can See The Light — Creedence Clearwater Revival
// 64 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 6 alto sax (copy of ch 3 alto sax, 0.078 beats late)
// note: Full arrangement: all 57 bars on a 48-step grid, each part at one level. Source detail keeps the original performance.
setcpm(64/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 · epiano2
const epiano2 = note(`<
  A B C D E@2 F@2 G H I@2 J K L M N O P Q R S T U G V W X Y Z@2 AA AB AC W AD AE AF AG AH W AI AJ AK AL AM AN AO AP AQ R
  AR@2 AS AT AU AV
>`.pickRestart({
  A: "~@33 [g3,bb3,eb4]@6 ~@3 [g3,bb3,eb4]@5 ~, ~@30 bb2@6 ~@3 bb2@7 ~@2", // Eb
  B: "[f3,bb3,d4]@15 ~@2 [g3,bb3,eb4]@3 ~ [g3,bb3,eb4]@3, bb2@28 ~@2 bb2@7 ~@3 bb2@7 ~", // Bb Eb
  C: "[f3,bb3,d4]@30 ~@4 [g3,bb3,eb4]@6 ~@2 [g3,bb3,eb4]@5 ~, bb2@28 ~@2 bb2@7 ~@3 bb2@7 ~", D: "[bb2,f3,bb3,d4]",
  E: "[[f3,bb3,d4]@23 ~ [f3,a3,c4]@23 a3 [bb3,d4]@30 bb2@4 [g3,bb3,eb4]@6 ~@2 [g3,bb3,eb4]@6, ~@47 f3@31 ab2@2 ~@8 bb2@7 ~]/2", // Bb F Bb Eb
  F: "[[f3,bb3,d4]@24 [g3,bb3,d4]@23 ~ [bb3,d4]@24 [f3,a3,c4]@23 ~, ~@47 f3@24 ~@25]/2", // Bb Gm Bb F
  G: "[f3,bb3,d4]@23 ~ [f3,a3,c4]@22 ~@2", // Bb F
  H: "[eb3,g3,bb3,db4]@10 ~ [eb3,ab3,c4]@2 ~@5 [eb3,g3,bb3,db4]@11 ~ [eb3,ab3] ~@5 [eb3,g3,bb3,db4]@8 ~@4, ~@15 c4 ~@8", // Eb7 Ab Eb7 Ab5 Eb7
  I: "[[f3,bb3,d4]@22 ~@2 [f3,a3,c4]@22 ~@2 d4@21 bb2@2 [f3,bb3,d4]@4 [f3,bb3,d4]@2 ~@4 [g3,bb3,eb4]@6 bb2@2 ~ [a3,c4,f4]@2 ~@4, ~@47 [f3,bb3]@23 ~@26]/2", // Bb F Bb Eb F Bb5
  J: "[f3,bb3,d4]@23 ~ [f3,a3,c4]@23 ~, b3 ~@47", K: "[f3,bb3,d4]@30 bb2@3 [g3,bb3,eb4]@6 bb2@2 [g3,bb3,eb4]@5 ~@2",
  L: "[f3,bb3,d4]@23 ~ [g3,bb3,d4]@24", M: "[f3,bb3,d4]@23 ~@2 c4@23, ~@24 [f3,a3]@23 ~",
  N: "[f3,bb3,d4]@24 ~ [a3,c4]@22 ~, ~@12 f3@11 ~", // Bb Am
  O: "[eb3,g3,bb3,db4]@11 [eb3,ab3,c4] ~@6 [eb3,g3,bb3,db4]@11 ~ [ab3,c4]@2 ~@4 [eb3,g3,bb3,db4]@10 ~@2, [e3,eb4] ~@28 eb3@3 ~@16", // Eb7 Ab Eb7 Ab Eb7 Emaj7
  P: "d4@2 db4 d4@2 ~@2 d4@4 ~ d4@11 ~ [a3,c4]@23 ~, [f3,bb3]@23 f3@23 ~@2", // Am Bb5
  Q: "[f3,bb3,d4]@21 ~ b2 [f3,bb3,d4]@3 ~ [f3,d4] bb3 ~@4 [g3,bb3,eb4]@6 bb2 ~@2 db4@2 ~@4, ~@21 bb2@2 ~@18 [a3,c4,f4]@4 ~@3", // Bb Dm Eb F
  R: "[f3,bb3,d4]@24 [f3,a3,c4]@23 ~", S: "[f3,bb3,d4]@30 bb2@3 ~ [bb3,eb4]@6 bb2@2 [g3,bb3,eb4]@3 ~@3, ~@11 g3@2 ~@3",
  T: "[f3,bb3,d4] [g3,bb3,d4]", U: "~ [f3,bb3,d4]@23 ~ [f3,a3,c4]@22 ~",
  V: "[eb3,g3,bb3,db4]@11 eb3 c4@2 ~@4 [eb3,g3,bb3,db4]@10 ~ c4@2 ~@5 [eb3,g3,bb3,db4]@9 ~@3, ~@12 ab3 ~@15 eb3@2 ~@18, ~@29 ab3 ~@18", // Eb7
  W: "[f3,bb3,d4]@23 ~ [f3,a3,c4]@23 ~", // Bb F
  X: "[f3,bb3,d4]@21 bb2@2 ~ d4@3 [f3,d4] ~@5 [g3,bb3,eb4]@7 bb2 ~ [a3,c4,f4]@2 ~@4, ~@23 [f3,bb3]@3 ~ bb3@2 ~@19", // Bb Dm Eb F Bb5
  Y: "[f3,bb3,d4]@23 ~ [f3,a3,c4]@24", // Bb F
  Z: "[[f3,bb3,d4]@30 bb2@3 [g3,bb3,eb4]@7 ~@2 bb3@2 ~@3 [f3,bb3,d4]@24 ~ [g3,bb3,d4]@24, ~@20 bb2 ~@27, ~@41 [g3,eb4]@2 ~@53]/2", // Bb Eb Bb Gm Cm
  AA: "~ [f3,bb3,d4]@23 [f3,a3,c4]@23 ~", AB: "[f3,bb3,d4]@24 ~ [a3,c4]@11 ~ c4@11, ~@24 f3@12 [f3,a3]@11 ~",
  AC: "[eb3,g3,bb3,db4]@10 bb2 [ab3,c4]@2 ~@5 [eb3,g3,bb3,db4]@10 bb2 [eb3,ab3,c4]@2 ~@5 [eb3,g3,bb3,db4]@11 ~, ~@11 eb3 ~@36", // Eb7 Ab Eb7 Ab Eb7
  AD: "[f3,bb3,d4]@22 bb2 ~ [f3,bb3,d4]@3 ~ bb3@2 ~@3 [g3,bb3,eb4]@6 bb2 ~ [g3,bb3,eb4]@3 ~@4, ~@27 [f3,d4]@2 ~@19", // Bb Eb Dm
  AE: "[f3,bb3,d4]@22 bb2 ~@2 [f3,bb3,d4]@3 [f3,bb3,d4] ~@5 [g3,bb3,eb4]@6 bb2 ~ [g3,bb3,eb4]@3 ~@3, ~@8 a3 ~@7", // Bb Eb
  AF: "~ b3 ~@20 bb2 ~ [f3,bb3,d4]@3 ~ [f3,d4] ~@5 [g3,bb3,eb4]@6 bb2 ~ [g3,bb3,eb4]@2 ~@4, [f3,bb3,d4]@23 ~@5 bb3@2 ~@18", // Bb Dm Eb Bb
  AG: "[f3,bb3,d4]@22 bb2 ~ [f3,bb3,d4]@3 ~ [f3,d4] ~@5 [g3,bb3,eb4]@6 bb2@2 [g3,bb3,eb4]@2 ~@4, ~@14 bb3 ~@9", // Bb Dm Eb
  AH: "[f3,bb3,d4]@23 bb2 ~ [f3,bb3,d4]@3 ~ bb3@2 ~@3 [g3,a3,bb3,eb4]@6 bb2 ~ [c4,f4]@2 ~@4, ~@28 [f3,d4]@2 ~@12 a3 ~@5", // Bb Eb F5 Dm
  AI: "[f3,bb3,d4]@30 eb2@3 [g3,bb3,eb4]@5 ~@4 [bb3,eb4]@6, ~@20 eb3 ~@3, ~@41 g3@6 ~", // Bb Eb Eb5
  AJ: "[f3,bb3,d4]@23 ~ [g3,bb3,d4]@23 ~", AK: "[f3,bb3]@12 [f3,bb3]@11 ~ [f3,a3,c4]@16 ~ c4@7, d4@23 ~@17 [f3,a3]@7 ~",
  AL: "[f3,bb3,d4]@23 [f3,a3,c4]@24 bb2", // Bb F
  AM: "~ [eb3,g3,bb3,db4]@9 bb2 ~ [ab3,c4]@2 ~@4 [eb3,g3,bb3,db4]@10 bb2 [ab3,c4]@2 ~@5 [eb3,g3,bb3]@11 ~, ~@12 eb3 ~@5 e3@2 ~@9 eb3 ~@18", // Eb7 Ab Eb7 Ab Eb
  AN: "~ [f3,bb3,d4]@22 ~ [f3,a3,c4]@23 ~", // Bb F
  AO: "[f3,bb3,d4]@23 bb2 ~ bb3@3 [bb3,d4]@2 ~@4 [g3,bb3,eb4]@6 bb2 ~ [a3,c4,f4]@2 ~@4, ~@24 [f3,d4]@3 ~ f3 ~@19", // Bb Eb F Dm
  AP: "~ d4@23 [f3,a3,c4]@23 ~, [f3,bb3] ~", // F Bb5
  AQ: "[f3,bb3,d4]@22 bb2@2 [f3,bb3,d4]@3 ~ [f3,d4] ~@5 [g3,bb3,eb4]@5 bb2 ~ [a3,c4,f4]@2 ~@5, ~@14 bb3 ~@9", // Bb Dm Eb F
  AR: "[[f3,bb3,d4]@22 bb2@2 [f3,bb3,d4]@3 ~ [bb3,d4]@2 ~@3 [g3,bb3,eb4]@6 bb2 ~ [c4,f4]@2 ~@5 f3@23 ~ [f3,a3,c4]@23 ~, ~@28 f3 ~@12 a3 ~@5 [bb3,d4]@24 ~@25]/2", // Bb Eb F5 F Bb
  AS: "[f3,bb3,d4]@23 ~ [bb3,d4]@4 [f3,d4] ~@4 [g3,bb3,eb4]@7 ~@2 [a3,c4,f4]@2 ~@4, ~@23 f3@3 ~@2 bb3@2 ~@18", // Bb Dm Eb F
  AT: "~ [f3,bb3,d4]@22 ~@12 d4@2 ~@11, ~@24 [f3,a3,c4]@23 ~", // Bb F
  AU: "[f3,bb3,d4]@22 bb2 ~ [f3,bb3,d4]@4 [f3,d4] ~@5 [g3,bb3,eb4]@6 bb2 ~ [a3,c4,f4]@2 ~@4, a3@3 ~@25 bb3@2 ~@18", // Bb Dm Eb F
  AV: "[f3,bb3,d4]@37 ~@11", // Bb
})).s("gm_epiano2").gain(0.45)

// bass · fretless bass
const bass = note(`<
  A B@2 C D E F G H I J K L@2 M N O P J Q R@2 S@2 O T@2 U V W X Y Z AA AB AC AD AE AF AG AH AI AJ N AK AL AM@2 AN AO AP
  AQ AR AS AT@2 AU
>`.pickRestart({
  A: "~@23 bb1", B: "bb1@11 bb1@11 ~ bb1", C: "bb1", D: "bb1@10 ~ bb1 f1@10 ~ f1", E: "bb1@20 ~@2 bb1 ~ bb1@21 ~ bb1 ~",
  F: "bb1@19 ~@3 bb1@2 g1@19 ~@3 g1@2", G: "bb1@20 ~@2 bb1@2 f1@5 ~ f1@4 ~@2 f1@4 ~@2 f1@4 bb1 ~",
  H: "bb1@19 ~@3 bb1@2 f1@5 ~ f1@5 ~ f1@4 ~@2 f1@6",
  I: "eb1@4 ~@2 eb1@4 ~@2 eb1@4 ~@2 eb1@4 ~@2 eb1@4 ~@2 eb1@4 ~@2 eb1@4 ~@2 eb1@3 ~ eb1@2",
  J: "bb1@19 ~@3 bb1@2 f1@20 ~@2 f1@2", K: "bb1@18 ~@4 bb1 ~ bb1@10 eb2@8 f2@6",
  L: "[bb1@20 ~@2 bb1@2 f1@19 ~@5 bb1@19 ~@3 bb1@2 bb2@16 f2@2 g2@4 bb2@2, ~@23 f1@2 ~@23]/2",
  M: "bb1@21 ~ bb1@2 g1@20 ~@2 g1@2", N: "bb1@20 ~@2 bb1@2 f1@5 ~ f1@5 ~ f1@5 ~ f1@6",
  O: "bb1@20 ~@4 f1@21 ~ f1@2, ~@11 bb1@2 ~@11", P: "eb1@5 ~ eb1@4 ~@2 eb1@4 ~@2 eb1@5 ~ eb1@6 g1@6 ab1@6 a1@6",
  Q: "bb1@20 ~@2 bb1 ~ bb1@9 ~ eb1@6 ~@2 f1@6, ~@10 eb1 ~",
  R: "[bb1@21 ~@3 f1@20 ~@4 bb1@22 bb1@2 bb1@20 ~@2 bb1@2, ~@11 bb1@2 ~@10 f1@2 ~@23]/2",
  S: "[bb1@19 ~@3 bb1@2 g1@21 ~@3 bb1@15 ~ bb1@5 ~ bb1@2 f1@11 ~ f1@6 f1@6, ~@23 g1@2 ~@23]/2",
  T: "[eb1@5 ~ eb1@5 ~ eb1@5 ~ eb1@5 ~ eb1@5 ~ eb1@4 ~@2 eb1@4 g1@6 ~@2 bb1@18 ~@6 f1@18 ~@4 f1@2, ~@23 ab1@2 ~@10 bb1@2 ~@11]/2",
  U: "bb1@10 ~@2 bb1@5 eb1@3 eb1 f1@3", V: "bb1@24 f1@4 ~@2 f1@3 ~@3 f1@3 ~@3 f1@5 ~", W: "bb1@33 ~ bb2@6 bb1@2 f1@6",
  X: "bb1@7 ~ g1@8", Y: "bb1@24 f1@4 ~@2 f1@4 ~@2 f1@5 ~ f1@6", Z: "bb1@11 bb1 f1@10 ~ f1",
  AA: "eb1@5 ~ eb1@4 ~@2 eb1@4 ~@2 eb1@5 ~ eb1@4 ~@2 eb1@5 ~ eb1@4 g1@6 ab1@2", AB: "bb1@12 f1@10 ~ f1",
  AC: "bb1@23 ~ bb1@3 bb1@6 eb1@6 eb1@2 ~ eb1@6", AD: "bb1@23 ~ bb1@4 bb1@6 eb1@5 ~ eb1@2 eb1@6",
  AE: "bb1@24 bb1@4 bb1@6 eb1@5 ~ eb1@2 eb1@6", AF: "bb1@23 ~ bb1@3 ~ bb1@6 eb1@5 ~ eb1@2 eb1@6",
  AG: "bb1@23 ~ bb1@3 ~ bb1@6 eb1@5 ~@3 f1@6, ~@10 eb1 ~", AH: "bb1@19 ~@3 bb1@2 f1@19 ~@3 f1@2",
  AI: "bb1@19 ~@3 bb1@2 bb2@16 f2@2 g2@4 bb2@2", AJ: "bb1@10 ~ bb1 g1@10 ~ g1",
  AK: "bb1@10 ~@2 f1@11 f1, ~@11 bb1@2 ~@11", AL: "eb1@6 eb1@4 ~@2 eb1@4 ~@2 eb1@5 ~ eb1@6 g1@6 ab1@6 a1@6",
  AM: "[bb1@19 ~@3 bb1@2 f1@20 ~@4 bb1@21 ~ bb1@2 bb1@10 eb1@6 ~@2 f1@6, ~@23 f1@2 ~@19 eb1@2 ~@2]/2",
  AN: "bb1@20 ~@4 f1@5 ~ f1@4 ~@2 f1@4 ~@2 f1@6, ~@11 bb1@2 ~@11", AO: "bb1@23 ~ bb1@10 eb1@5 ~@3 f1@6, ~@10 eb1 ~",
  AP: "bb1@20 ~@2 bb1@2 f1@6 f1@5 ~ f1@6 f1@6", AQ: "bb1@15 ~ bb1@6 bb1@2 bb1@9 ~ eb1@5 ~ eb1@2 f1@6",
  AR: "bb1@21 ~ bb1@2 f1@5 ~ f1@5 ~ f1@5 ~ f1@6", AS: "bb1@19 ~@5 bb1@10 eb1@5 ~ eb1@2 f1@6",
  AT: "[bb1@24 f1@20 ~@4 bb1@24 bb1@10 eb1@5 ~ eb1@2 f1@6, ~@23 f1@2 ~@23]/2", AU: "bb1@17 ~@7",
})).s("gm_fretless_bass").gain(0.46)

// chords · tenor sax
const tenor_sax = note(`<
  ~@12 A B C@2 D E F G ~@9 H I J@2 ~@2 K L M N O P Q R S T U V W X Y Z AA A AB S AC B
>`.pickRestart({
  A: "[bb3,d4]@23 ~ [a3,c4]@23 ~", B: "[bb3,d4]@15 ~", C: "[[bb3,d4]@69 ~@4 c4@16 ~@7, ~@36 a3@11 ~]/2",
  D: "[bb3,d4]@23 ~ [a3,c4]@22 ~@2", E: "db4@41 ~@7, g3@5 ~@7", F: "[bb3,d4]@21 ~@3 [a3,c4]@23 ~", G: "[bb3,d4]@5 ~@3",
  H: "~@17 db4 d4@2 ~@2 d4@2 ~@2 d4@3 ~@2 d4@3 d4@2 ~@2 [d3,db4] d4@2 ~ c4@2 bb3@2 ~ g3", I: "bb3@17 ab3 ~@30",
  J: "[~@28 f4@5 ~ c5@3 f4@36 ~@23]/2", K: "~@24 [a3,bb3] ~@2 bb3 ~@5 bb3 ~@5 bb3 ~@2 bb3@3 ~@3",
  L: "bb3@24 ~ d4@2 ~ d4@2 ~@3 eb4@5 ~@2 eb4@2 eb4@5 ~, d4@20 ~@4 bb3@2 ~ bb3@3 ~@3 bb3@2 ~@4 bb3@2 ~ bb3@3 ~@3",
  M: "[bb3,d4]@20 ~@4 [bb3,d4]@3 ~ d4@3 ~@3 eb4@5 ~ eb4@2 eb4@5 ~, ~@27 bb3@2 ~@4 bb3@5 ~ bb3@2 ~ bb3@2 ~@4", // Bb
  N: "[bb3,d4]@23 ~@2 d4@2 ~ d4@3 ~@3 eb4@4 ~ bb3 eb4@2 eb4@5 ~, ~@24 bb3@3 bb3@3 ~@3 bb3@5 ~@4 bb3@2 ~@4", // Bb
  O: "[bb3,d4]@20 ~@4 [bb3,d4]@3 ~ d4@4 ~@3 bb3@2 ~@3 bb3@2 f4@5 ~, ~@28 bb3@2 ~@4 eb4@5 ~ eb4 ~ bb3@2 ~@4", // Bb
  P: "[bb3,d4]@5 ~ [a3,c4]@6", Q: "~ [bb3,d4]@47", R: "~ d4@47, bb3", S: "[bb3,d4]@23 ~@2 [a3,c4]@22 ~",
  T: "~ [bb3,d4]@22 ~ [a3,c4]@18 ~@6", U: "[g3,db4]@43 ~@5", V: "~ bb3@21 ~@2 [a3,c4]@24, ~ d4 ~@46",
  W: "[bb3,d4]@7 ~@9", X: "[bb3,d4]@11 ~ [a3,c4]@11 ~, ab3 ~@47", Y: "[bb3,d4]@25 ~@23",
  Z: "[bb3,d4]@22 ~@2 [a3,c4]@23 ~", AA: "~ [bb3,d4]@25 ~@22", AB: "~ [bb3,d4]@24 ~@23", AC: "[bb3,d4] ~",
})).s("gm_tenor_sax").gain(0.31)

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

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@11 A ~@7 B ~@15 C ~@11 D ~@9>".pickRestart({
  A: "~@20 x!2 ~@2", B: "~@17 x ~@2 x!2 ~@2", C: "~@13 x!2 ~", D: "~@6 x!2",
})).gain(0.55)

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 [~@20 x!2 ~@2] ~@7 [~@20 x!2 ~@2] ~@7 [~@12 x ~ x!2 ~@4 x!2 ~@2] ~@37>").gain(0.55)

// drums · open hat
const open_hat = s("oh").struct("<~@36 [~@2 x!4 ~@2]!4 [~ x!7] [x!8]!15 ~>").gain(0.55)

// drums · crash
const crash = s("cr").struct("<~@4 A ~@7 A ~@7 A ~@3 A ~@11 A@5 ~@15 A>".pickRestart({
  A: "x",
})).gain(0.55)

stack(epiano2, bass, tenor_sax, kick, snare, hihat, low_tom, mid_tom, open_hat, crash)

More by Creedence Clearwater Revival