Strudelify
Long As I Can See The Light cover art

Cosmo's Factory

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, A@4 for four bars: edit a riff to change every repeat.

// chords · epiano2
const epiano2 = note(`<
  A B@2 C D E F G H I J K L M F G N O P Q G R F S H T G U G V@2 G W X G Y Z AA AB AC G AD F AE AF AG G AH G AI G AJ G AK
  AL AM AN
>`.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 ~", C: "[bb2,f3,bb3,d4]",
  D: "[f3,bb3,d4]@23 ~ [f3,a3,c4]@23 a3", // Bb F
  E: "[f3,bb3,d4]@15 bb2@2 [g3,bb3,eb4]@3 ~ [g3,bb3,eb4]@3, ~@30 ab2@2 ~@8 bb2@7 ~", // Bb Eb
  F: "[f3,bb3,d4]@24 [g3,bb3,d4]@23 ~", G: "[f3,bb3,d4]@23 ~ [f3,a3,c4]@23 ~", H: "[f3,bb3,d4]@23 ~ [f3,a3,c4]@22 ~@2",
  I: "[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
  J: "[f3,bb3,d4]@11 ~ [f3,a3,c4]@11 ~", // Bb F
  K: "[f3,bb3,d4]@21 bb2@2 [f3,bb3,d4]@4 [f3,bb3,d4]@2 ~@4 [g3,bb3,eb4]@6 bb2@2 ~ [a3,c4,f4]@2 ~@4", // Bb Eb F
  L: "[f3,bb3,d4]@23 ~ [f3,a3,c4]@23 ~, b3 ~@47", M: "[f3,bb3,d4]@30 bb2@3 [g3,bb3,eb4]@6 bb2@2 [g3,bb3,eb4]@5 ~@2",
  N: "[f3,bb3,d4]@24 ~ [a3,c4]@22 ~, ~@12 f3@11 ~", // Bb Am
  O: "[eb3,g3,bb3,db4]@11 [eb3,ab3] c4 ~@5 [eb3,g3,bb3,db4]@11 ~ [ab3,c4]@2 ~@4 [eb3,g3,bb3,db4]@10 ~@2, [e3,eb4] ~@28 eb3@3 ~@16", // Eb7 Ab5 Eb7 Ab Eb7 Emaj7
  P: "d4@2 db4 d4@2 ~@2 d4@4 ~ d4@11 ~ [f3,a3,c4]@23 ~, [f3,bb3]@23 ~@25", // F 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]@30 bb2@3 ~ [bb3,eb4]@6 bb2@2 [g3,bb3,eb4]@3 ~@3, ~@11 g3@2 ~@3", // Bb Eb5 Eb
  S: "~ [f3,bb3,d4]@23 ~ [f3,a3,c4]@22 ~", // Bb F
  T: "[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
  U: "[f3,bb3,d4]@21 bb2@2 ~ [f3,bb3,d4]@3 [f3,d4] ~@5 [g3,bb3,eb4]@7 bb2 ~ [a3,c4,f4]@2 ~@4, ~@27 bb3@2 ~@19", // Bb Dm Eb F
  V: "[[f3,bb3,d4]@30 bb2@3 [g3,bb3,eb4]@7 ~@2 [bb3,eb4]@2 ~@4 [f3,d4]@24 [g3,bb3,d4]@24, ~@20 bb2 ~@27, ~@41 g3@2 ~@4 bb3@24 ~@25]/2", // Bb Eb Eb5 Dm Gm
  W: "[f3,bb3,d4]@24 ~ [a3,c4]@11 ~ c4@11, ~@24 f3@12 [f3,a3]@11 ~", // Bb Am F
  X: "[eb3,g3,bb3,db4]@10 bb2 eb3 c4@2 ~@4 [eb3,g3,bb3,db4]@10 bb2 ~ [ab3,c4]@2 ~@4 [eb3,g3,bb3,db4]@11 ~, ~@11 ab3@2 ~@16 eb3@2 ~@17", // Eb7 Ab Eb7
  Y: "[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
  Z: "[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
  AA: "~ 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
  AB: "[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
  AC: "[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
  AD: "[f3,bb3,d4]@30 eb2@3 [g3,bb3,eb4]@5 ~@2 eb3@2 [g3,bb3,eb4]@6", // Bb Eb
  AE: "[f3,bb3]@12 [f3,bb3]@11 ~ [f3,a3,c4]@16 ~ c4@7, d4@23 ~@17 [f3,a3]@7 ~", // Bb5 F
  AF: "[f3,bb3,d4]@23 ~ [a3,c4]@23 bb2, ~@23 f3@23 ~@2", // Bb Am
  AG: "~ [eb3,g3,bb3,db4]@9 bb2 ~ [ab3,c4]@2 ~@4 [eb3,g3,bb3,db4]@10 bb2 ~ [ab3,c4]@2 ~@4 [eb3,g3,bb3]@11 ~, ~@12 eb3 ~@5 e3@2 ~@10 eb3 ~@17", // Eb7 Ab Eb7 Ab Eb
  AH: "[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
  AI: "[f3,bb3,d4]@22 bb2@2 [f3,bb3,d4]@3 ~ [f3,d4] ~@5 [g3,bb3,eb4]@5 bb2 ~@2 [c4,f4]@2 ~@4, ~@28 bb3@2 ~@11 a3@2 ~@5", // Bb Dm Eb F5
  AJ: "[f3,bb3,d4]@22 bb2@2 [f3,bb3,d4]@3 ~ [bb3,d4]@2 ~@3 [g3,bb3,eb4]@6 bb2 ~ [c4,f4]@2 ~@5, ~@28 f3 ~@12 a3 ~@6", // Bb Eb F5
  AK: "[f3,bb3,d4]@23 ~ [f3,bb3,d4]@4 [f3,d4] ~@4 [g3,bb3,eb4]@7 ~@2 [a3,c4,f4]@2 ~@4, ~@14 bb3 ~@9", // Bb Dm Eb F
  AL: "~ [f3,bb3,d4]@22 ~@13 d4@2 ~@10, ~@24 [f3,a3,c4]@23 ~", // Bb F
  AM: "[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
  AN: "[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 D J K@2 L H M N O@2 M P Q@2 M R@2 S T U V W X Y@2 Z AA@3 AB AC AD AE H M N M AF H AG AH AI AH S AJ
  AG AK
>`.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@18 ~@4 bb1 ~ bb1@10 eb2@8 f2@6",
  K: "[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",
  L: "bb1@21 ~ bb1@2 g1@20 ~@2 g1@2", M: "bb1@20 ~@4 f1@21 ~ f1@2, ~@11 bb1@2 ~@11",
  N: "eb1@5 ~ eb1@4 ~@2 eb1@4 ~@2 eb1@5 ~ eb1@6 g1@6 ab1@6 a1@6",
  O: "[bb1@20 ~@2 bb1@2 f1@19 ~@5 bb1@20 ~@2 bb1 ~ bb1@9 ~ eb1@6 ~@2 f1@6, ~@23 f1@2 ~@19 eb1@2 ~@2]/2",
  P: "bb1@11 bb1 bb1@10 ~ bb1",
  Q: "[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",
  R: "[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",
  S: "bb1@10 ~@2 bb1@5 eb1@3 eb1 f1@3", T: "bb1@24 f1@4 ~@2 f1@3 ~@3 f1@3 ~@3 f1@5 ~", U: "bb1@33 ~ bb2@6 bb1@2 f1@6",
  V: "bb1@7 ~ g1@8", W: "bb1@24 f1@4 ~@2 f1@4 ~@2 f1@5 ~ f1@6", X: "bb1@11 bb1 f1@10 ~ f1",
  Y: "[eb1@5 ~ eb1@5 ~ eb1@5 ~ eb1@5 ~ eb1@5 ~ eb1@4 ~@2 eb1@4 g1@6 ~@2 bb1@24 f1@20 ~@2 f1@2, ~@23 ab1@2 ~@23]/2",
  Z: "bb1@23 ~ bb1@3 bb1@6 eb1@6 eb1@2 ~ eb1@6", AA: "bb1@23 ~ bb1@4 bb1@6 eb1@5 ~ eb1@2 eb1@6",
  AB: "bb1@23 ~ bb1@3 ~ bb1@6 eb1@5 ~@3 f1@6, ~@10 eb1 ~", AC: "bb1@19 ~@3 bb1@2 f1@20 ~@2 f1@2",
  AD: "bb1@19 ~@3 bb1@2 bb2@16 f2@2 g2@4 bb2@2", AE: "bb1@10 ~ bb1 g1@10 ~ g1",
  AF: "bb1@20 ~@2 bb1 ~ bb1@9 ~ eb1@6 ~@2 f1@6, ~@10 eb1 ~", AG: "bb1@23 ~ bb1@10 eb1@5 ~@3 f1@6, ~@10 eb1 ~",
  AH: "bb1@20 ~@2 bb1@2 f1@5 ~ f1@5 ~ f1@5 ~ f1@6", AI: "bb1@15 ~ bb1@6 bb1@2 bb1@9 ~ eb1@5 ~ eb1@2 f1@6",
  AJ: "bb1@12 f1@10 ~ f1", AK: "bb1@17 ~@7",
})).s("gm_fretless_bass").gain(0.46)

// chords · tenor sax
const tenor_sax = note(`<
  ~@12 A B C@2 A D E F ~@9 G H I@2 ~@2 J K L M N O P Q R S T U V W X Y Z A Z A X 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: "db4@41 ~@7, g3@5 ~@7", E: "[bb3,d4]@23 ~ [a3,c4]@22 ~@2", F: "[bb3,d4]@5 ~@3",
  G: "~@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", H: "bb3@17 ab3 ~@30",
  I: "[~@28 f4@5 ~ c5@3 f4@36 ~@23]/2", J: "~@24 [a3,bb3] ~@2 bb3 ~@5 bb3 ~@5 bb3 ~@2 bb3@3 ~@3",
  K: "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",
  L: "[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
  M: "[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
  N: "[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
  O: "[bb3,d4]@5 ~ [a3,c4]@6", P: "~ [bb3,d4]@47", Q: "~ d4@47, bb3", R: "[bb3,d4]@23 ~@2 [a3,c4]@22 ~",
  S: "~ [bb3,d4]@22 ~ [a3,c4]@18 ~@6", T: "[g3,db4]@43 ~@5", U: "~ bb3@21 ~@2 [a3,c4]@24, ~ d4 ~@46",
  V: "[bb3,d4]@7 ~@9", W: "[bb3,d4]@11 ~ [a3,c4]@11 ~, ab3 ~@47", X: "[bb3,d4]@25 ~@23",
  Y: "[bb3,d4]@21 ~@3 [a3,c4]@23 ~", Z: "~ [bb3,d4]@25 ~@22",
})).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