Strudelify
I Can See Clearly Now cover art

I Can See Clearly Now

Jimmy Cliff

KeyD majorTempo123 bpm
0:00/0:00
// I Can See Clearly Now — Jimmy Cliff
// 123 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 94 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(123/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 · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  ~ A@2 B C D E F G H I J C D E K L M N@2 L M N@2 O P Q R O S T U O P Q R V M N@2 W X Y Z AA AB AC AD P AD P AE AF AG AH
  O P Q R O S T AI O P Q R V M N@2 V M N@2 V M N@2 V M N@2 V M N@2 V M N@2 V AJ@2
>`.pickRestart({
  A: "[f#1@2 g1 ~ a1@24 ~@2 a1@2]/2", B: "d2@7 a1", C: "d2@13 ~ d2 ~", D: "g2@13 ~ g1 ~", E: "d2@9 ~ a1 ~@3 a1 ~",
  F: "d1@13 ~ a1@2", G: "d2@13 ~ d2@2", H: "g2@15 ~", I: "a2@7 e2", J: "a1@2 a2@2 ~@2 g2@2 ~@2 f#2@2 ~@2 e2 ~",
  K: "d1@13 ~ a1 ~", L: "c2@6 c2@4 g2 ~@3 g1 ~", M: "g1@6 ~ g1!2 ~ g1@2 ~@2 g1 ~", N: "d2@6 ~ d2 a1 ~ a1@2 ~@2 a1 ~",
  O: "d2@8 d2 ~ d2@2 ~@2 d2 ~", P: "g1@7 g1!2 ~ g1@2 ~@2 g1 ~", Q: "d2@8 d2 ~ d2@2 ~@2 a1 ~",
  R: "d2@7 d2!2 ~ d2@2 ~@2 a1 ~", S: "g1@7 a1 g1 ~ g1@2 ~@2 g1 ~", T: "a1@7 b1 a1 ~ a1@2 ~@2 a1 ~",
  U: "a1 a2 ~ g2 ~ f#2 ~ e2", V: "c2@7 c2 c2@2 c2 ~ b1@2 a1@2", W: "f2@15 f2", X: "f2@14 f2 ~",
  Y: "c2@8 c2 ~ c2@2 ~@2 g1 ~", Z: "c2@7 g1 c2 ~ c2@2 ~@2 c2 ~", AA: "f2@15 e2", AB: "f2@7 f2!2 ~ f2@6",
  AC: "a1@7 a1!2 ~ a1@2 ~@2 a1 ~", AD: "g#1@7 g#1!2 ~ g#1@2 ~@2 g#1 ~", AE: "c2@7 c2!2 ~ c2@2 ~@2 c2 ~",
  AF: "b1@7 b1 b1@2 b1@2 ~@2 b1@2", AG: "a1@6 ~ a1!2 ~ a1@2 ~@2 a1 ~", AH: "a1@6 ~ a1!2 ~ a1@2 ~@2 a1@2",
  AI: "a1@7 e2 a1 ~ a1@2 ~@2 a1 ~", AJ: "[g1@6 ~ g1!2 ~ a1@2 ~@2 d2@5 ~@13]/2",
})).s("gm_synth_bass_2").gain(0.4)

// chords · piano · "A.PIANO 2"
const piano = note(`<
  ~@4 A B C@2 D E F@2 D E C@2 G H I@2 G H I@2 A B J@2 K L F@2 D E C@2 G M N@2 O@2 P@2 Q@2 R S M S M G T U@2 A B V@3 L
  F@2 D E C@2 G M N@2 G M N@2 G M N@2 G M W@2 G M X@2 G M N@2 G Y@2
>`.pickRestart({
  A: "[d3,d4], [f#4,a4]@7 ~", B: "[g3,d4,g4,b4]@15 ~", C: "[[d3,d4,f#4,a4]@31 ~]/2",
  D: "~@3 a4@4 ~, [d3,f#4], a4@3 ~@5, d4@4 d4@11 ~, ~ a3@6 ~", E: "[g3,g4,b4], d4@7 ~", F: "[a2,c#4,e4,a4]/2",
  G: "[c3,c4], [e4,g4]@7 ~", H: "[g2,d4,g4], b3@7 ~", I: "[d3,d4,f#4,a4]/2",
  J: "[d4@13 ~ f#4 a4, d3@15 ~, [f#4,a4]@7 ~, ~@13 d4@2 ~]/2", K: "[d3,a3,f#4]@15 ~", L: "[g3,g4], d4@7 ~",
  M: "[g2,b3,d4,g4]", N: "[d4@13 ~ a4@2, [d3,f#4], a4@7 ~, ~@13 d4@3]/2", O: "[f3,c4,f4,a4]/2",
  P: "[c4@13 ~ e4 g4, c3@15 ~, [e4,g4]@7 ~, ~@13 c4@2 ~]/2", Q: "[[f3,c4,f4,a4]@31 ~]/2", R: "[a2,c#4,e4,a4]",
  S: "[g#2,c#4,e4,g#4]", T: "[b2,b3], [d4,f#4]@7 ~", U: "[a2,a3,c#4,e4]/2",
  V: "[~@32 [d3,a3,f#4]@15 ~, [d3,d4,f#4,a4]@5 f#5@3, ~@2 d5 ~]/3", // D
  W: "[~@9 g5 ~ f#5 d5@4, [d3,d4,f#4,a4], ~@8 f#5@3 ~@5, ~@5 d5 ~@2]/2", // D
  X: "[[d4,f#4]@6 ~ a4, d3, a4@7 ~, ~@3 d4, ~@13 f#4@3]/2", Y: "[[g2,b3,d4,g4]@13 ~ [d3,d4,f#4,a4]@5 ~@13]/2",
})).s("gm_piano").gain(0.33).pan(0.4)

// chords · distortion guitar · "DISTORTION"
const distortion_guitar = note("<~@40 A B C D A E F G H G H D I J K ~@28 L@3 M N O@2 P D Q@2>".pickRestart({
  A: "[c3,f3]@15 c3", B: "[c3,f3]@15 ~", C: "[g2,c3]@15 c3", D: "[g2,c3]@15 ~", E: "[c3,f3]@5 [c3,f3]@3",
  F: "[e3,a3]@15 e3", G: "[g#2,g#3]@15 ~", H: "[g2,g3]@15 d3", I: "[f#2,b2]@15 b2",
  J: "[e3,a3] ~ [e3,a3] ~ [e3,a3] ~ [e3,a3]@2 [e3,a3] ~ [e3,a3] ~ [e3,a3] ~ [e3,a3] ~, a2@15 ~", // A5
  K: "[e3,a3] ~ [e3,a3] ~ [e3,a3] ~ [e3,a3] ~ [e3,a3]@2 [e3,a3] ~ [e3,a3] ~ [e3,a3] ~", // A5
  L: "[d6@2 ~ d6@2 ~ d6@2 ~ d6@3 d6@3 d6@2 ~ b5@3 a5 g5 ~ a5@5 ~ a5@6 g5 ~ f5 ~ g5 f5 g5 f5 g5 f5 g5 f5]/3",
  M: "g5@2 f5 d5@8 ~@5", N: "~@4 e5@2 d5@6 c5 d5 c5 a4", O: "[d5 c5@3 a4 g4 a4 a4@6 ~@3]/2", P: "[a2,d3]",
  Q: "[[g2,d3]@13 ~ [g2,d3]@5 ~@13]/2", // G5
})).s("gm_distortion_guitar").gain(0.24).pan(0.4)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~@4 A B C@2 A B ~ D A B C@2 E F G@2 H I G J K L M N M L O P Q R Q K S L T@2 U@2 S V W@2 O X R Y R S Z AA AB AC AD AC@3
  AD AE@2 AC AD AC@2 AF AG AH@2 AF AG AH@2 AF AG AH@2 AF AG AH@2 AF AG AH@2 AF AG AH@2 AF AI@2
>`.pickRestart({
  A: "~@4 [a3,d4,f#4] ~@11", B: "~@4 [b3,d4,g4] ~@11", C: "~@4 [f#3,a3,e4] ~@11",
  D: "~@2 [e4,c#5] ~@3 [e4,c#5]@2 [c#4,e4,a4] ~@3 [a3,c#4,a4] ~@3", E: "~@4 [c4,e4,g4] ~ [c4,e4,g4] ~@9",
  F: "~@4 [b3,d4,g4] ~ [b3,d4,g4] ~@9", G: "~@4 [d4,a4,d5] ~@11", H: "~@4 [c4,g4,d5] ~ [c4,g4,d5] ~@9",
  I: "~@4 [b3,g4,d5] ~ [b3,g4,d5] ~@9", J: "~@4 [d4,a4,d5] ~@7 [d4,a4] ~@3",
  K: "~@4 [a3,d4,f#4] ~ [a3,d4,f#4] ~@5 [a3,d4,f#4] ~@3", L: "~@4 [b3,d4,g4] ~ [b3,d4,g4] ~@5 [b3,d4,g4] ~@3",
  M: "~@4 [f#3,a3,f#4] ~ [f#3,a3,e4] ~@5 [f#3,a3,f#4] ~@3", // F#m F#m7 F#m
  N: "~@4 [f#3,a3,f#4] ~ [f#3,a3,e4] ~@5 [f#3,a3,f#4] ~ [f#3,a3,e4] ~", // F#m F#m7 F#m F#m7
  O: "~@4 [a3,c#4,e4] ~ [a3,c#4,e4] ~@5 [a3,c#4,e4] ~ [a3,c#4,e4] ~", // A
  P: "~@4 [a3,c#4,e4] ~ [a3,c#4,e4] ~@5 [a3,c#4,e4] ~ [a3,c#4,f#4] ~", // A F#m
  Q: "~@4 [a3,d4,f#4] ~ [a3,d4,f#4] ~@5 [a3,d4,f#4] ~ [a3,d4,f#4] ~", // D
  R: "~@4 [b3,d4,g4] ~ [b3,d4,g4] ~@5 [b3,d4,g4] ~ [b3,d4,g4] ~", S: "~@4 [c4,e4,g4] ~ [c4,e4,g4] ~@5 [c4,e4,g4] ~@3",
  T: "~@4 [d4,f#4,a4] ~@7 [d4,f#4,a4] ~@3", U: "~@4 [a3,c4,f4] ~ [a3,c4,f4] ~@5 [a3,c4,f4] ~@3",
  V: "~@4 [c4,e4,g4] ~ [c4,e4,g4] ~@5 [c4,e4,g4] ~ [c4,e4,g4] ~", // C
  W: "~@4 [a3,c4,f4] ~ [a3,c4,f4] ~@5 [a3,c4,f4] ~ [a3,c4,f4] ~", // F
  X: "~@4 [g#3,c#4,e4] ~ [g#3,c#4,e4] ~@5 [g#3,c#4,e4] ~ [g#3,c#4,e4] ~", // C#m
  Y: "~@4 [c#4,e4,g#4] ~ [c#4,e4,g#4] ~@5 [c#4,e4,g#4] ~ [c#4,e4,g#4] ~", // C#m
  Z: "~@4 [b3,d4,f#4] ~ [b3,d4,f#4] ~@5 [b3,d4,f#4] ~@3", // Bm
  AA: "~@4 [c#4,e4,a4] ~ [c#4,e4,a4] ~@5 [c#4,e4,a4] ~ [c#4,e4,a4] ~", // A
  AB: "~@4 [c#4,e4,a4] ~ [c#4,e4,a4] ~@5 [c#4,e4,a4] ~@3", AC: "~@4 [a3,d4] ~ [a3,d4,f#4] ~@5 [a3,d4] ~ [a3,d4,f#4] ~",
  AD: "~@4 [b3,d4] ~ [b3,d4,g4] ~@5 [b3,d4] ~ [b3,d4,g4] ~", // Bm G Bm G
  AE: "~@4 [a3,c#4] ~ [a3,c#4,e4] ~@5 [a3,c#4] ~ [a3,c#4,e4] ~", AF: "~@4 [c4,e4] ~ [c4,e4,g4] ~@5 [c4,e4,g4] ~@3",
  AG: "~@4 [b3,d4] ~ [b3,d4,g4] ~@5 [b3,d4,g4] ~@3", AH: "~@4 [a3,d4] ~ [a3,d4,f#4] ~@5 [a3,d4,f#4] ~@3",
  AI: "[~@4 [b3,d4] ~ [b3,d4,g4] ~@5 [b3,d4,g4] ~ [a3,d4,f#4]@5 ~@13]/2", // Bm G D
})).s("gm_electric_guitar_clean").gain(0.19).pan(0.3)

// chords · percussive organ · "ORGAN 2"
const percussive_organ = note(`<
  ~@24 A B A@3 B C@2 A B A@2 D B A@2 ~@15 A B A@3 B C@2 A B A@2 D B A@2 D B A@2 D B A@2 D B A@2 D B A@2 D B A@2 D E@2
>`.pickRestart({
  A: "[a4,d5]@2 [a4,d5]@2 [d5,f#5] ~@5 [a4,d5] ~ [d5,f#5] ~@3", // D5 D D5 D
  B: "[b4,d5]@2 [b4,d5]@2 [d5,g5] ~@5 [b4,d5] ~ [d5,g5] ~@3", // Bm G5 Bm G5
  C: "[a4,c#5]@2 [a4,c#5]@2 [c#5,e5] ~@5 [a4,c#5] ~ [c#5,e5] ~@3", // A C#m A C#m
  D: "[g4,c5]@2 [g4,c5]@2 [c5,e5] ~@5 [g4,c5] ~ [c5,e5] ~@3", // C5 C C5 C
  E: "[[b4,d5]@2 [b4,d5]@2 [d5,g5] ~@5 [b4,d5] ~ [d5,g5] ~ [a4,d5]@5 ~@13]/2", // Bm G5 Bm G5 D5
})).s("gm_percussive_organ").gain(0.22).pan(0.7)

// other · pad metallic · "METAL PAD"
const pad_metallic = note("<~@26 A B C ~@5 A B D E F@2 ~@17 A B C ~@5 A B D E F@2 ~@23>".pickRestart({
  A: "~ a5", B: "g5 f#5", C: "d5@5 ~@3", D: "e5", E: "d5", F: "[f#4,a4,d5]/2",
})).s("gm_pad_metallic").gain(0.24)

// other · vibraphone
const vibraphone = note("<~ A@2 ~@91>".pickRestart({
  A: "[f#2 g2 a2@12 ~@2]/2",
})).s("gm_vibraphone").gain(0.3)

// drums · kick
const kick = s("bd").struct("<[x ~@4 x ~@2]!4 [x ~@4 x ~ x]!89 ~>").gain(0.45)

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

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

// drums · hihat
const hihat = s("hh").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B C B D B C B D B C B D B C B D A B A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A E ~
>`.pickRestart({
  A: "x!4 ~@2 x!8 ~@2", B: "x!16", C: "x!4 ~@2 x!10", D: "x!5 ~ x!10", E: "x!14 ~@2",
})).gain(0.15)

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

// drums · tambourine
const tambourine = s("tb").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A@2 B A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@3 x!2",
})).gain(0.3)

// drums · congas
const congas = s("conga:13").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A@2 B A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "~@4 x ~@2 x!2 ~@3 x ~ x ~", B: "~@4 x ~@2 x!2 ~ x ~ x ~ x ~",
})).gain(0.79)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A@2 B A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "x ~@4 x ~@2", B: "x",
})).gain(0.79)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  A@24 B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B@2 C B C B C B C B C B C B C B C B C B C B C B C B C
  B C B C B C B C B C B C ~
>`.pickRestart({
  A: "x!8", B: "x!16", C: "x!13 ~ x ~",
})).gain(0.75)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<A B A B A B A B A B A B A B A B A B A B A B A B ~@70>".pickRestart({
  A: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~ x ~ x ~ x ~@4",
})).gain(0.5)

stack(
  bass, piano, distortion_guitar, electric_guitar_clean, percussive_organ, pad_metallic, vibraphone, kick, snare,
  snare_soft, hihat, open_hat, tambourine, congas, congas_2, cabasa, cabasa_soft
)

More by Jimmy Cliff