Strudelify
I Can See Clearly Now cover art

1972 · I Can See Clearly Now

I Can See Clearly Now

Johnny Nash

KeyD majorTempo125 bpm
0:00/0:00
// I Can See Clearly Now — Johnny Nash
// 125 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 119 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(125/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 · pad poly · "POLYSYNTH"
const pad_poly = note(`<
  ~@23 A B C@2 D B E F G B H I J K L M N@2 O@2 P@2 Q@2 R@2 S T J U Q@2 V B C@3 B W X C B Y C Z AA AB AC AD AE AF C N@2
  O@2 P@2 Q@2 R@2 S T J U AG@2 V B C@3 B W X C B Y C Z AA AB AC AD K AF C AD K AF C AD ~@3
>`.pickRestart({
  A: "[a4,d5,f#5]@5 ~ [a4,d5,f#5] ~@8 [a4,d5,f#5]@2 ~ [a4,d5]@2 ~@4, ~@18 f#5 ~@5", // D D5
  B: "[b4,d5,g5]@5 ~ [b4,d5,g5]@2 ~@7 [b4,d5,g5]@2 ~ [b4,d5,g5]@2 ~@4", // G
  C: "[a4,d5,f#5]@5 ~ [a4,d5,f#5]@2 ~@7 [a4,d5,f#5]@2 ~ [a4,d5,f#5]@2 ~@4", // D
  D: "[a4,d5,f#5]@5 ~ [a4,f#5]@2 ~@7 [a4,d5,f#5]@2 ~ [d5,f#5]@2 ~@4, ~@6 d5 ~@11 a4 ~@5", // D
  E: "[a4,c#5,e5]@6 [a4,e5] ~@8 [c#5,e5]@2 ~ [a4,c#5,e5] ~@5, ~@6 c#5@2 ~@7 a4 ~@8", // A A5 C#m A
  F: "[a4,c#5,e5]@5 ~ [a4,e5] ~@8 [a4,c#5,e5]@2 ~ [a4,c#5,e5]@2 ~@4, ~@3 c#5 ~@8", // A A5 A
  G: "[a4,d5,f#5]@5 ~ [a4,d5,f#5]@2 ~@7 [a4,d5] ~@2 [a4,d5] ~@5, ~@15 f#5@2 ~ f#5@2 ~@4", // D D5
  H: "[a4,d5,f#5]@5 ~ [a4,d5,f#5]@2 ~@7 [a4,d5,f#5] ~@2 [a4,d5] ~@5, ~@9 f#5 ~@2", // D D5
  I: "[a4,d5,f#5]@5 ~ [a4,d5,f#5]@2 ~@7 [a4,d5,f#5] ~@2 [a4,d5]@2 ~@4, ~@18 f#5 ~@5", J: "[g4,c5,e5]",
  K: "[g4,b4,d5]@11 ~", L: "[a4,d5,f#5]@5 ~ [a4,d5,f#5]@2 ~@7 [a4,d5] ~@2 [a4,f#5]@2 ~@4, ~@15 f#5@2 ~ d5 ~@5",
  M: "[a4,d5,f#5]@5 ~ [a4,d5,f#5]@2 ~@7 [a4,d5] ~@2 [a4,d5,f#5]@2 ~@4, ~@15 f#5@2 ~@7", N: "[a4,c5,f5]/2",
  O: "[g4,c5,e5]/2", P: "[[a4,c5,f5]@9 f4 g4 g#4]/2", Q: "[a4,c#5,e5]/2", R: "[g#4 g4, [c#5,e5]]/2", S: "[g#4,c#5,e5]",
  T: "[g4,c#5,e5]", U: "[a4,d5,f#5]",
  V: "[a4,d5,f#5]@5 ~ [a4,f#5]@2 ~@7 [a4,d5,f#5]@2 ~ [a4,d5,f#5]@2 ~@4, ~@6 d5 ~@17", // D
  W: "[a4,c#5,e5]@5 ~ [a4,c#5,e5]@2 ~@7 [c#5,e5]@2 ~ [c#5,e5]@2 ~@4, ~@15 a4 ~@2 a4 ~@5", // A C#m
  X: "[a4,c#5,e5]@5 ~ [a4,c#5,e5]@2 ~@7 [a4,c#5,e5]@2 ~ [a4,c#5,e5]@2 ~@4", // A
  Y: "[a4,d5,f#5]@5 ~ [a4,d5,f#5]@3 ~@6 [a4,d5,f#5]@2 ~ [a4,d5,f#5]@2 ~@4", Z: "[g4,c5,e5]@23 ~", AA: "[g4,b4,d5]@23 ~",
  AB: "[a4,d5,f#5]@6 [a4,f#5]@2 ~@7 [a4,d5,f#5]@2 ~ [a4,d5,f#5]@2 ~@4, ~@6 d5 ~@17", // D
  AC: "[a4,d5,f#5]@6 [a4,d5,f#5]@2 ~@7 [a4,d5,f#5]@2 ~ [a4,d5,f#5]@2 ~@4", AD: "[g4,c5,e5]@11 ~",
  AE: "[g4,b4,d5]@7 ~@17", AF: "[a4,d5,f#5]@6 [a4,d5,f#5] ~@8 [a4,d5,f#5]@2 ~ [a4,d5,f#5]@2 ~@4",
  AG: "[[a4,c#5,e5]@7 ~]/2", // A
})).s("gm_pad_poly").gain(0.71).pan(0.7)

// other · vibraphone
const vibraphone = note(`<
  ~@5 A B C ~ D E ~@2 A F G H I J G H I J ~@2 A B C ~ D E ~@2 A F G H I J ~@18 A B C ~ D E ~@2 A F G H I J G H I J ~@18
  A B C ~ D E ~@2 A F G H I J G H I J G H I J G ~@3
>`.pickRestart({
  A: "~@15 a4@3 d5@2 ~ e5 ~@2",
  B: "[d5,f#5]@2 ~@2 [a4,d5]@2 ~@4 f#4 a4 [f#4,a4] f#4 a4 [f#4,a4] f#4 a4 [f#4,a4] f#4 a4 [f#4,a4] f#4 a4", // D D5 F#m
  C: "[f#4,a4] ~@23", D: "~@21 a4@2 ~",
  E: "[c#5,e5]@2 ~ [d5,f#5]@2 ~@4 e5 g5 [e5,g5] e5 g5 [e5,g5] e5 g5 [e5,g5] e5 g5 [e5,g5] e5 g5 e5", // C#m D Em
  F: "[f#5,a5]@2 ~@2 [d5,f#5]@2 ~@3 a4 d5 [a4,d5] a4 d5 [a4,d5] a4 d5 [a4,d5] a4 d5 [a4,d5] a4 d5 a4", // F#m D D5
  G: "~@6 c5 e5 [c5,e5] c5 e5 [c5,e5] c5 e5 [c5,e5] c5 e5 [c5,e5] c5 e5 [c5,e5] c5 e5 c5", // C
  H: "~@6 b4 d5 [b4,d5] b4 d5 [b4,d5] b4 d5 [b4,d5] b4 d5 [b4,d5] b4 d5 [b4,d5] b4 d5 b4", // Bm
  I: "~@12 b4@3 d5@3 e5@2 ~ a4 d5 [a4,d5]", J: "a4 d5 [a4,d5] a4 d5 [a4,d5] a4 d5 [a4,d5] a4 d5 a4 ~@12",
})).s("gm_vibraphone").gain(0.6).pan(0.8)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@2 A B C B@2 D E F G H E B@2 I J B@2 I J B@2 H E B@2 H E F@2 H E H@2 I J B K L@2 M N O P Q R S T U T V W X@2 B C B@2
  D E F G H E B@2 I J B@2 I J B@2 L@2 M N O P Q R S T U T V W X@2 B C B@2 D E F G H E B@2 I J B@2 I J B@2 I J B@2 I ~@3
>`.pickRestart({
  A: "~@3 a2 a3 a2 a3 a2", B: "d3 [a3,d4,f#4] a2 [a3,d4,f#4]", C: "g3 [b3,d4,g4] g3 [b3,d4,g4]",
  D: "d3 [a3,d4,f#4] ~ [a3,d4,f#4], ~ d3", E: "g2 [b3,d4,g4] g2 [b3,d4,g4]", F: "a2 [a3,c#4,e4] e3 [a3,c#4,e4]",
  G: "a2 [a3,c#4,e4] a2 [a3,c#4,e4]", H: "d3 [a3,d4,f#4] d3 [a3,d4,f#4]", I: "c3 [g3,c4,e4] c3 [g3,c4,e4]",
  J: "g2 [g3,b3,d4] g2 [g3,b3,d4]", K: "d3 [a3,d4,f#4] d3 e3",
  L: "[f3,a3,c4,f4]@7 ~@2 [f3,a3,c4,f4] ~@2 [f3,a3,c4,f4]@9 ~@3", // F
  M: "[e3,g3,c4,e4]@7 ~@2 [e3,g3,c4,e4] ~@2 [e3,g3,c4,e4]@10 ~@2", // C
  N: "[e3,g3,c4,e4]@8 ~ [e3,g3,c4,e4] ~@2 [e3,g3,c4,e4]@9 ~@3", // C
  O: "[f3,a3,c4,f4]@7 ~@2 [f3,a3,c4,f4] ~@2 [f3,a3,c4,f4]@10 ~@2", P: "[f3,c4,a4]@3 [f3,c4,a4] [g3,d4,b4] [g#3,d#4,c5]",
  Q: "[a3,c#4,e4]@7 ~@2 [a3,c#4,e4]@2 ~ [a3,c#4,e4]@10 ~@2", R: "[a3,c#4,e4]@8 ~ [a3,c#4,e4]@2 ~ [a3,c#4,e4]@10 ~@2",
  S: "[g#3,c#4,e4]@8 ~ [g#3,c#4,e4]@2 ~ [g#3,c#4,e4]@9 ~@3", T: "[g3,c#4,e4]@7 ~@2 [g3,c#4,e4]@2 ~ [g3,c#4,e4]@9 ~@3",
  U: "[g#3,c#4,e4]@7 ~@2 [g#3,c#4,e4]@2 ~ [g#3,c#4,e4]@9 ~@3", V: "[g3,c4,e4]@7 ~@2 [g3,c4,e4]@2 ~ [g3,c4,e4]@9 ~@3",
  W: "[a3,d4,f#4]@7 ~@2 [a3,d4,f#4]@2 ~ [a3,d4,f#4]@9 ~@3", X: "[a3,c#4,e4]@7 ~@2 [a3,c#4,e4] ~@2 [a3,c#4,e4]@10 ~@2",
})).s("gm_acoustic_guitar_steel").gain(0.32).pan(0.3)

// bass · electric bass pick · "PICK BASS"
const bass = note(`<
  A@3 B C D@2 E F G H B C D@2 I J A@2 I J A@2 B C D@2 E F G H B C D@2 I J A@2 K L M N K O P Q R S R T U V W@2 B C D@2 E
  F G H B C D@2 I J A@2 I J A@2 K L M N K O P Q R S R T U V W@2 B C D@2 E F G H B C D@2 I J A@2 I J A@2 I J A@2 I ~@3
>`.pickRestart({
  A: "d2@5 ~ d2@2 ~@7 a1@2 ~ a1@2 ~@4", B: "d2@5 ~ d2@3 ~@3 d2@2 ~ f#2@2 ~ a2@3 d2@2 ~",
  C: "g2@5 ~ g2@2 ~@7 f#2@3 g2@3 a2@3", D: "d2@5 ~ d2@2 ~@7 a1@3 a1@2 ~@4",
  E: "d2@5 ~ d2@3 ~@3 d2@3 f#2@2 ~ a2@3 f#2@2 ~", F: "g1@5 ~ g1@2 ~@4 g1@2 ~ b1@2 ~ d2@3 b1@2 ~", G: "a1@5 ~ a1@2 ~@16",
  H: "a1@3 e2@2 ~@4 a1@3 e2@2 ~ a1@2 ~ a1@2 ~@4", I: "c2", J: "g1", K: "f1@20 ~ f1@2 ~", L: "f1@23 ~",
  M: "c2@19 ~@2 c2@2 ~", N: "c2@23 ~", O: "f1@3 f1 g1 g#1", P: "a1@21 a1@2 ~", Q: "a1@23 ~", R: "g#1@20 ~ g#1@3",
  S: "g1@20 ~ g1@3", T: "g1@20 ~ g1@2 ~", U: "c2@7 c2", V: "d2@20 ~ d2@3", W: "a1@20 ~ a1@2 ~",
})).s("gm_electric_bass_pick").gain(0.71).pan(0.2)

// drums · kick
const kick = s("bd").struct(`<
  A@15 B@2 A@2 B@2 A@14 B@9 C B@9 A@13 B@2 A@2 B@2 A@2 B@5 C B@9 A@13 B@2 A@2 B@2 A@2 B@2 A@2 B ~@3
>`.pickRestart({
  A: "x!2", B: "x", C: "x ~@2 x!3",
})).gain(0.45)

// drums · rim
const rim = s("rim").struct(`<
  ~@2 A@13 B@2 A@2 B@2 A@14 B@2 A@2 ~@16 A@12 B@2 A@2 B@2 A@2 ~@16 A@12 B@2 A@2 B@2 A@2 B@2 A@2 B ~@3
>`.pickRestart({
  A: "~ x ~ x", B: "~ x",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct("<~@39 [~ x]!16 ~@20 [~ x]!16 ~@28>").gain(0.45)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@2 A@13 B@2 A@2 B@2 A@14 B@2 A@2 ~@16 A@12 B@2 A@2 B@2 A@2 ~@16 A@12 B@2 A@2 B@2 A@2 B@2 A@2 B ~@3
>`.pickRestart({
  A: "x!8", B: "x!4",
})).gain(0.45)

// drums · crash
const crash = s("cr").struct(`<
  ~@39 A ~@3 A ~ A ~ A@8 B ~@15 A@3 ~ A ~@3 A ~ A ~ A@8 B ~@15 A@3 ~ A@3 ~ A ~@3
>`.pickRestart({
  A: "x", B: "x!2 ~@2",
})).gain(0.45)

// drums · ride
const ride = s("rd").struct("<~@39 A@5 B A@10 ~@20 A@5 B A@10 ~@28>".pickRestart({
  A: "x!2", B: "x ~@2 x!3",
})).gain(0.45)

// drums · cowbell
const cowbell = s("cb").struct("<~@2 [x!4]!37 [x ~@2 x!2 ~@3]!16 [x!4]!20 [x ~@2 x!2 ~@3]!16 [x!4]!25 ~@3>").gain(0.45)

// drums · bongos
const bongos = s("bongo:4").struct("<[~@6 x!2]!4 [~@5 x!3]!40 [~@3 x!3] [~@5 x!3]!35 [~@3 x!3] [~@5 x!3]!35 ~@3>")
  .gain(1.18)

// drums · congas
const congas = s("conga:13").struct("<~ [~ x ~@2]!43 x [~ x ~@2]!35 x [~ x ~@2]!35 ~@3>").gain(1.43)

// drums · ht
const ht = s("ht").struct("<~@22 A B ~@14 A ~@5 C ~@9 A ~@19 A ~@15 D E ~@27>".pickRestart({
  A: "~@12 x ~@4 x ~@2 x ~@3", B: "x", C: "~@2 x", D: "~@4 x ~@2 x", E: "x!2 ~@2",
})).gain(0.45)

// drums · mt
const mt = s("mt").struct("<~@22 A ~@15 B C ~@4 D ~@9 B C ~@18 B C ~@4 E ~@9 F ~@28>".pickRestart({
  A: "~@15 x ~@5 x!2 ~", B: "~@5 x ~ x", C: "x", D: "~@3 x ~ x", E: "~@3 x!3", F: "~@15 x ~ x ~@2 x ~@3",
})).gain(0.45)

// drums · guiro
const guiro = s("guiro:0").struct(`<
  ~@2 A@13 B@2 A@2 B@2 A@14 B@2 A@2 B@16 A@12 B@2 A@2 B@2 A@2 B@16 A@12 B@2 A@2 B@2 A@2 B@2 A@2 B ~@3
>`.pickRestart({
  A: "x!2", B: "x",
})).gain(9.46)

// drums · guiro
const guiro_2 = s("guiro:4").struct(`<
  ~@2 A@13 B@2 A@2 B@2 A@14 B@2 A@2 B@16 A@12 B@2 A@2 B@2 A@2 B@16 A@12 B@2 A@2 B@2 A@2 B@2 A@2 B ~@3
>`.pickRestart({
  A: "~ x ~ x", B: "~ x",
})).gain(9.46)

stack(
  pad_poly, vibraphone, acoustic_guitar_steel, bass, kick, rim, snare, hihat, crash, ride, cowbell, bongos, congas, ht,
  mt, guiro, guiro_2
)

More by Johnny Nash