Strudelify
Keep on Smiling cover art

1983 · Keep On Smiling

Keep on Smiling

Lloyd James

KeyG minorTempo182 bpm
0:00/0:00
// Keep on Smiling — Lloyd James
// 182 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 155 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(182/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 · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@4 A@6 B@4 A@4 B@5 A@2 C D A@2 E B@5 A@4 E B@5 A@6 B@4 A@4 B@5 D A@2 E B@5 A@3 B@4 A@4 B@5 F G H@2 I J@5 H@4 I J@5
  H@6 J@4 H@4 J@5 H@6 J@4 H@4 J@5 H@6 K L
>`.pickRestart({
  A: "g1@4 ~@2 g1 ~ d2@5 ~@3", B: "d2@4 ~@2 d2 ~ a1@5 ~@3", C: "g1@2 ~@2 g1@2 ~@2 d2 ~ d2@2 ~@2 d2 ~", D: "g1 ~@7",
  E: "g1@4 ~@2 b1 ~ c2@2 ~@2 db2@2 ~@2", F: "g1@5 ~@3 g1 ~ g1@2 ~@2 g1 ~", G: "ab1@15 ~",
  H: "ab1@4 ~@2 ab1 ~ eb2@5 ~@3", I: "ab1@4 ~@2 c2 ~ db2@2 ~@2 d2@2 ~@2", J: "eb2@4 ~@2 eb2 ~ bb1@5 ~@3",
  K: "ab1@2 ~@2 ab1 ~@3 eb2 ~ eb2@2 ~@2 eb2 ~", L: "ab1@3 ~@13",
})).s("gm_electric_bass_finger").gain(0.36)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  A@8 B@2 C@4 B@4 C@5 B@2 D E B@3 C@5 B@5 C@5 B@6 C@4 B@4 C@5 F B@3 C@5 B@3 C@4 B@4 C@5 G H I@3 J@5 I@5 J@5 I@6 J@4 I@4
  J@5 I@6 J@4 I@4 J@5 I@6 K L
>`.pickRestart({
  A: "[g4,b4,d5]@2 [g4,b4,d5]@2 ~@2 [g4,b4,d5] ~ [g4,b4,d5]@2 ~@6", B: "[g4,b4,d5]@2 ~@4 [g4,b4,d5] ~ [g4,b4,d5]@2 ~@6",
  C: "[gb4,a4,d5]@2 ~@4 [gb4,a4,d5] ~ [gb4,a4,d5]@2 ~@6", // D
  D: "[g4,b4,d5] ~@3 [g4,b4,d5] ~@3 [gb4,a4,d5] ~ [gb4,a4,d5]@2 ~@2 [gb4,a4,d5] ~", E: "[g4,b4,d5] ~@15",
  F: "[g4,b4,d5] ~@7", G: "[g4,b4,d5]@2 ~@6 [g4,b4,d5] ~ [g4,b4,d5] ~@3 [g4,b4,d5] ~", H: "[ab4,c5,eb5]@3 ~",
  I: "[ab4,c5,eb5]@2 ~@4 [ab4,c5,eb5] ~ [ab4,c5,eb5]@2 ~@6", J: "[g4,bb4,eb5]@2 ~@4 [g4,bb4,eb5] ~ [g4,bb4,eb5]@2 ~@6",
  K: "[ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~@3 [eb4,g4,bb4] ~ [eb4,g4,bb4]@3 ~ [eb4,g4,bb4] ~", L: "[c4,eb4,ab4] ~@7",
})).s("gm_overdriven_guitar").gain(0.19)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  A B A B A B A B A B C D C D A B A B C D C D@2 A B E F A B A C D C D@2 A B A B@2 C D C D@2 A B A B A B C D C D A B A B
  C D C D@2 G A B A C D C D C A@2 B H D C D A B A B C D C D@2 I J K L K M N M N@2 K L K L@2 M N M N@2 K L K L K L M N M
  N K L K L M N M N@2 K L K L K L M N M N K L K L M N M N@2 K L K L K L O P
>`.pickRestart({
  A: "[g4,b4,d5] ~@3 [g4,b4] ~@3 [g4,b4,e5]@2 ~@6, ~@2 d5 ~@5", // G Em
  B: "[g4,b4,d5] ~@3 [g4,b4,d5] ~ [g4,b4,e5]@2 ~@2 [g4,b4,d5] ~ [g4,b4,e5] ~@3", // G Em G Em
  C: "[gb4,a4,d5] ~@3 [gb4,a4] ~@3 [gb4,a4,e5]@2 ~@6, ~@2 d5 ~@5", // D Gbm Gbm7
  D: "[gb4,a4,d5] ~@3 [gb4,a4,d5] ~ [gb4,a4,e5]@2 ~@2 [gb4,a4,d5] ~ [gb4,a4,e5] ~@3", // D Gbm7 D Gbm7
  E: "[g4,b4,d5] ~@3 [g4,b4,d5] ~@3 [gb4,a4,d5] ~ [gb4,a4,d5] ~@3 [gb4,a4,d5] ~", F: "[g4,b4,d5] ~@7",
  G: "[g4,b4,d5] ~@15", H: "[gb4,a4,d5] ~@3 [gb4,a4,d5] ~@3 [gb4,a4,e5]@2 ~@6",
  I: "[g4,d5]@2 ~@6 [g4,b4,d5] ~ [g4,b4,d5] ~@3 [g4,b4,d5] ~, b4 ~@15", J: "[ab4,c5,eb5]@3 ~",
  K: "[ab4,c5,eb5] ~@3 [ab4,c5] ~@3 [ab4,c5,f5]@2 ~@6, ~@2 eb5 ~@5", // Ab Fm
  L: "[ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~ [ab4,c5,f5]@2 ~@2 [ab4,c5,eb5] ~ [ab4,c5,f5] ~@3", // Ab Fm Ab Fm
  M: "[g4,bb4,eb5] ~@3 [g4,bb4] ~@3 [g4,bb4,f5]@2 ~@6, ~@2 eb5 ~@5", // Eb Gm Gm7
  N: "[g4,bb4,eb5] ~@3 [g4,bb4,eb5] ~ [g4,bb4,f5]@2 ~@2 [g4,bb4,eb5] ~ [g4,bb4,f5] ~@3", // Eb Gm7 Eb Gm7
  O: "[ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~@3 [eb4,g4,bb4] ~ [eb4,g4,bb4]@3 ~ [eb4,g4,bb4] ~", P: "[c4,eb4,ab4] ~@7",
})).s("gm_piano").gain(0.01)

// chords · brass section · "BRASS 1"
const brass_section = note(`<
  ~@4 A B A B ~@2 C D ~@2 E B ~@7 E B F G ~@8 H@2 ~@3 I J@2 ~@2 A B A B K L M D K N O B K P Q ~@4 R S@2 T@3 U@2 V@2 K L
  M D K N O B K P Q ~@4 W X ~@8 Y@2 ~@3 Z AA@2 ~@2 AB AC AB AC AD AE AF AG AD AH AI AC AD AJ AK ~@4 AB AC AB AC AD AE AF
  AG AD AH AI AC AD AJ AK ~@4 AB AC AB AC AB AC AL AM
>`.pickRestart({
  A: "[g4,b4,d5] ~@3 [g4,b4] ~@3 [g4,b4,e5]@2 ~@6, ~@2 d5 ~@5", B: "[g4,b4,d5]@2 ~ [g4,b4,e5] ~@4",
  C: "~@2 [c5,d5] ~ [gb4,a4,c5,e5] ~@3, ~@4 [gb4,a4] ~@11", D: "[gb4,a4,c5,d5]@2 ~ [gb4,a4,c5,e5] ~@4",
  E: "~@2 [g4,b4,d5] ~ [g4,b4,e5] ~@3", F: "~@8 d5 ~ d5@2 ~@2 d5 ~", G: "g4 ~@15", H: "[~@6 g4 ~ a4 ~ b4@3 ~ d4@18]/2",
  I: "~@6 [g4,b4] ~ [a4,c5] ~ [b4,d5] ~@3 [a4,c5]@2", // G Am Bm Am
  J: "[~@2 [g4,b4] ~@3 [gb4,a4] ~@3 [e4,g4]@2 ~@2 [d4,gb4]@9 ~@9]/2", K: "~@6 d4@2 e4 ~ gb4 ~@3 g4 ~",
  L: "~@2 a4@8 ~@2 b4 ~@3", M: "c5@2 [c5,d5] ~ [gb4,a4,c5,e5] ~@3, ~@4 [gb4,a4] ~@11", N: "~@2 a4@8 ~@2 bb4 ~@3",
  O: "b4@2 [g4,b4,d5] ~ [g4,b4,e5] ~@3", P: "~ a4@4 ~ b4 ~", Q: "c5", R: "~@6 [g4,b4] ~ [g4,b4] ~@3 [g4,b4] ~@3",
  S: "[[g4,b4]@5 ~ [gb4,a4] ~ [e4,g4] ~ [c4,e4] ~@3 [b3,d4]@12 ~@2 [g4,b4]@2 ~@2]/2", // G Gbm Em C Bm G
  T: "[[g4,b4]@4 [e4,g4] ~ [e4,g4] ~ [gb4,a4] ~ [g4,b4]@2 ~@2 [a4,c5]@20 ~@4 [a4,c5] ~ [a4,c5]@2 ~@2 [b4,d5]@2 ~@2]/3", // G Em Gbm G Am Bm
  U: "[[c5,e5]@5 ~ [b4,d5] ~ [a4,c5] ~ [g4,b4]@2 ~@2 [gb4,a4]@6 ~@2 [g4,b4] ~ [gb4,a4]@2 ~@2 [e4,g4]@2 ~@2]/2", // C Bm Am G Gbm G Gbm Em
  V: "[[d4,gb4]@2 ~@2 [c5,e5]@2 ~@2 [b4,d5] ~ [a4,c5]@2 ~@2 [g4,b4]@16 ~@2]/2", // D C Bm Am G
  W: "~@8 [g4,b4,d5] ~ [g4,b4,d5]@2 ~@2 [g4,b4,d5] ~", X: "[ab4,c5,eb5]@7 ~", Y: "[~@6 ab4 ~ bb4 ~ c5@3 ~ eb4@18]/2",
  Z: "~@6 [ab4,c5] ~ [bb4,db5] ~ [c5,eb5] ~@3 [bb4,db5]@2", // Ab Bbm Cm Bbm
  AA: "[~@2 [ab4,c5] ~@3 [g4,bb4] ~@3 [f4,ab4]@2 ~@2 [eb4,g4]@9 ~@9]/2", // Ab Gm Fm Eb
  AB: "[ab4,c5,eb5] ~@3 [ab4,c5] ~@3 [ab4,c5,f5]@2 ~@6, ~@2 eb5 ~@5", AC: "[ab4,c5,eb5]@2 ~ [ab4,c5,f5] ~@4",
  AD: "~@6 eb4@2 f4 ~ g4 ~@3 ab4 ~", AE: "~@2 bb4@8 ~@2 c5 ~@3",
  AF: "db5@2 [db5,eb5] ~ [g4,bb4,db5,f5] ~@3, ~@4 [g4,bb4] ~@11", AG: "[g4,bb4,db5,eb5]@2 ~ [g4,bb4,db5,f5] ~@4",
  AH: "~@2 bb4@8 ~@2 b4 ~@3", AI: "c5@2 [ab4,c5,eb5] ~ [ab4,c5,f5] ~@3", AJ: "~ bb4@4 ~ c5 ~", AK: "db5",
  AL: "~@8 [ab4,c5,eb5] ~ [ab4,c5,eb5]@2 ~@2 [ab4,c5,eb5] ~", AM: "[c4,eb4,ab4] ~@7",
})).s("gm_brass_section").gain(0.25)

// chords · brass section · "BRASS 1"
const brass_section_2 = note(`<
  ~@8 A B ~@2 C D ~@2 A B ~@2 E@3 ~@2 F G ~@22 A B ~@2 C D ~@2 A B ~@2 E@3 ~@10 A B ~@2 C D ~@2 A B ~@2 E@3 ~@24 H I ~@2
  J K ~@2 L I ~@2 M@3 ~@4 H I ~@2 J K ~@2 L I ~@2 M@3 ~@8
>`.pickRestart({
  A: "[g3,b3,d4] ~@3 [g3,b3] ~@3 [g3,b3,e4]@2 ~@6, ~@2 d4 ~@5", B: "[g3,b3,d4]@2 ~ [g3,b3,e4] ~@4",
  C: "[gb3,a3,c4,d4] ~@3 [gb3,a3,c4] ~@3 [gb3,a3,c4,e4]@2 ~@6, ~@2 d4 ~@5", D: "[gb3,a3,c4,d4]@2 ~ [gb3,a3,c4,e4] ~@4",
  E: "d2/3", F: "~@8 d3 ~ d3@2 ~@2 d3 ~", G: "g2 ~@15", H: "[ab3,c4] ~@3 [ab3,c4] ~@3 [ab3,c4,f4]@2 ~@6, eb4 ~ eb4 ~@5",
  I: "[ab3,c4,eb4]@2 ~ [ab3,c4,f4] ~@4", J: "[g3,bb3,db4,eb4] ~@3 [g3,bb3,db4] ~@3 [g3,bb3,db4,f4]@2 ~@6, ~@2 eb4 ~@5",
  K: "[g3,bb3,db4,eb4]@2 ~ [g3,bb3,db4,f4] ~@4", L: "[ab3,c4,eb4] ~@3 [ab3,c4] ~@3 [ab3,c4,f4]@2 ~@6, ~@2 eb4 ~@5",
  M: "eb2/3",
})).s("gm_brass_section").gain(0.3)

// drums · kick
const kick = s("bd").struct("<~@4 A@21 B C A@37 C A@88 B C>".pickRestart({
  A: "x!2", B: "x ~ x ~ x!2 ~ x", C: "x",
})).gain(0.52)

// drums · snare
const snare = s("sd").struct(`<
  ~@4 A@21 B C A@21 D A@15 E A@8 F A@7 G A@7 H I A@19 G A D A@26 G A@8 J A@3 K B E
>`.pickRestart({
  A: "~ x ~ x", B: "x ~ x ~ x!2 ~ x", C: "x ~ x!3 ~@3", D: "~@2 x!2 ~@4", E: "x", F: "x!2 ~@6", G: "~@2 x ~@3 x!2",
  H: "x!4 ~@4", I: "~@3 x!2 ~@3", J: "~@2 x ~@2 x!2 ~", K: "~@2 x ~@2 x!3",
})).gain(0.46)

// drums · hihat
const hihat = s("hh").struct("<A@4 B@21 C D E B@20 F B@15 D E B@6 G ~ B@14 G ~@2 B@62 C D>".pickRestart({
  A: "x!4", B: "x!8", C: "x ~ x ~ x!2 ~ x", D: "x", E: "~ x!7", F: "x!2 ~@6", G: "x!7 ~",
})).gain(0.26)

// drums · low tom
const low_tom = s("lt").struct("<~@26 [~@7 x] ~@46 [~@6 x!2] ~@16 x ~@64>").gain(0.39)

// drums · mid tom
const mid_tom = s("mt").struct("<~@26 A ~@21 B ~@24 C ~@15 B D ~@21 B ~@18 E ~@23>".pickRestart({
  A: "~ x ~@3 x!2 ~", B: "~@4 x!4", C: "~@2 x!4 ~@2", D: "~@3 x", E: "~@3 x!2 ~ x ~",
})).gain(0.39)

// drums · open hat
const open_hat = s("oh").struct("<~@72 [~@7 x] ~@15 [~@7 x] ~@66>").gain(0.26)

stack(bass, overdriven_guitar, piano, brass_section, brass_section_2, kick, snare, hihat, low_tom, mid_tom, open_hat)