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: 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 C B A B D B E F E F A B C B G F H F@2 A B I J A B A E F K F@2 A B L B@2 H F G F@2 A B D B L B G F G F A B A B
  E F E F@2 M C B A G F K F G A@2 B E F G F C B A B G F G F@2 N O P Q P R S R S@2 P Q P Q@2 T S U S@2 P Q V Q V Q R S T
  S W Q V Q U S T S@2 P Q X Q W Q R S R S P Q W Q R S R S@2 P Q W Q W Q Y Z
>`.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: "[g4,b4,d5] ~@3 [g4,b4] ~@3 [g4,b4,e5]@3 ~@5, ~@2 d5 ~@5", D: "[g4,b4,d5] ~@3 [g4,b4,d5] ~@3 [g4,b4,e5]@2 ~@6",
  E: "[gb4,a4,d5] ~@3 [gb4,a4,d5] ~@3 [gb4,a4,e5]@2 ~@6", // D Gbm7
  F: "[gb4,a4,d5] ~@3 [gb4,a4,d5] ~ [gb4,a4,e5]@2 ~@2 [gb4,a4,d5] ~ [gb4,a4,e5] ~@3", // D Gbm7 D Gbm7
  G: "[gb4,a4,d5] ~@3 [gb4,a4] ~@3 [gb4,a4,e5]@2 ~@6, ~@2 d5 ~@5", // D Gbm Gbm7
  H: "[gb4,a4,d5] ~@3 [gb4,a4] ~@3 [gb4,a4,e5]@3 ~@5, ~@2 d5 ~@5", // D Gbm Gbm7
  I: "[g4,b4,d5] ~@3 [g4,b4,d5] ~@3 [gb4,a4,d5] ~ [gb4,a4,d5] ~@3 [gb4,a4,d5] ~", J: "[g4,b4,d5] ~@7",
  K: "[gb4,a4,d5] ~@3 [gb4,a4,d5] ~@3 [gb4,a4,e5]@3 ~@5", L: "[g4,b4,d5] ~@3 [g4,b4,d5] ~@3 [g4,b4,e5]@3 ~@5",
  M: "[g4,b4,d5] ~@15", N: "[g4,d5]@2 ~@6 [g4,b4,d5] ~ [g4,b4,d5] ~@3 [g4,b4,d5] ~, b4 ~@15", O: "[ab4,c5,eb5]@3 ~",
  P: "[ab4,c5,eb5] ~@3 [ab4,c5] ~@3 [ab4,c5,f5]@2 ~@6, ~@2 eb5 ~@5", // Ab Fm
  Q: "[ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~ [ab4,c5,f5]@2 ~@2 [ab4,c5,eb5] ~ [ab4,c5,f5] ~@3", // Ab Fm Ab Fm
  R: "[g4,bb4,eb5] ~@3 [g4,bb4] ~@3 [g4,bb4,f5]@2 ~@6, ~@2 eb5 ~@5", // Eb Gm Gm7
  S: "[g4,bb4,eb5] ~@3 [g4,bb4,eb5] ~ [g4,bb4,f5]@2 ~@2 [g4,bb4,eb5] ~ [g4,bb4,f5] ~@3", // Eb Gm7 Eb Gm7
  T: "[g4,bb4,eb5] ~@3 [g4,bb4,eb5] ~@3 [g4,bb4,f5]@3 ~@5", U: "[g4,bb4,eb5] ~@3 [g4,bb4,eb5] ~@3 [g4,bb4,f5]@2 ~@6",
  V: "[ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~@3 [ab4,c5,f5]@2 ~@6", // Ab Fm
  W: "[ab4,c5,eb5] ~@3 [ab4,c5] ~@3 [ab4,c5,f5]@3 ~@5, ~@2 eb5 ~@5", // Ab Fm
  X: "[ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~@3 [ab4,c5,f5]@3 ~@5", // Ab Fm
  Y: "[ab4,c5,eb5] ~@3 [ab4,c5,eb5] ~@3 [eb4,g4,bb4] ~ [eb4,g4,bb4]@3 ~ [eb4,g4,bb4] ~", Z: "[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 P Q R ~@4 S T@2 U@3 V@2 W@2 K L
  M D K N O B P Q R ~@4 X Y ~@8 Z@2 ~@3 AA AB@2 ~@2 AC AD AC AD AE AF AG AH AE AI AJ AD AK AL AM ~@4 AC AD AC AD AE AF
  AG AH AE AI AJ AD AK AL AM ~@4 AC AD AC AD AC AD AN AO
>`.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: "~@6 d4 ~ e4 ~ gb4 ~@3 g4 ~", Q: "~ a4@4 ~ b4 ~", R: "c5",
  S: "~@6 [g4,b4] ~ [g4,b4] ~@3 [g4,b4] ~@3", // G
  T: "[[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
  U: "[[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
  V: "[[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
  W: "[[d4,gb4]@2 ~@2 [c5,e5]@2 ~@2 [b4,d5] ~ [a4,c5]@2 ~@2 [g4,b4]@16 ~@2]/2", // D C Bm Am G
  X: "~@8 [g4,b4,d5] ~ [g4,b4,d5]@2 ~@2 [g4,b4,d5] ~", Y: "[ab4,c5,eb5]@7 ~", Z: "[~@6 ab4 ~ bb4 ~ c5@3 ~ eb4@18]/2",
  AA: "~@6 [ab4,c5] ~ [bb4,db5] ~ [c5,eb5] ~@3 [bb4,db5]@2", // Ab Bbm Cm Bbm
  AB: "[~@2 [ab4,c5] ~@3 [g4,bb4] ~@3 [f4,ab4]@2 ~@2 [eb4,g4]@9 ~@9]/2", // Ab Gm Fm Eb
  AC: "[ab4,c5,eb5] ~@3 [ab4,c5] ~@3 [ab4,c5,f5]@2 ~@6, ~@2 eb5 ~@5", AD: "[ab4,c5,eb5]@2 ~ [ab4,c5,f5] ~@4",
  AE: "~@6 eb4@2 f4 ~ g4 ~@3 ab4 ~", AF: "~@2 bb4@8 ~@2 c5 ~@3",
  AG: "db5@2 [db5,eb5] ~ [g4,bb4,db5,f5] ~@3, ~@4 [g4,bb4] ~@11", AH: "[g4,bb4,db5,eb5]@2 ~ [g4,bb4,db5,f5] ~@4",
  AI: "~@2 bb4@8 ~@2 b4 ~@3", AJ: "c5@2 [ab4,c5,eb5] ~ [ab4,c5,f5] ~@3", AK: "~@6 eb4 ~ f4 ~ g4 ~@3 ab4 ~",
  AL: "~ bb4@4 ~ c5 ~", AM: "db5", AN: "~@8 [ab4,c5,eb5] ~ [ab4,c5,eb5]@2 ~@2 [ab4,c5,eb5] ~", AO: "[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 H B ~@2 C D ~@2 A B ~@2 E@3 ~@10 H B ~@2 C D ~@2 A B ~@2 E@3 ~@24 I J ~@2
  K L ~@2 M J ~@2 N@3 ~@4 I J ~@2 K L ~@2 M J ~@2 N@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: "[g3,b3] ~@3 [g3,b3] ~@3 [g3,b3,e4]@2 ~@6, d4 ~ d4 ~@5",
  I: "[ab3,c4] ~@3 [ab3,c4] ~@3 [ab3,c4,f4]@2 ~@6, eb4 ~ eb4 ~@5", J: "[ab3,c4,eb4]@2 ~ [ab3,c4,f4] ~@4",
  K: "[g3,bb3,db4,eb4] ~@3 [g3,bb3,db4] ~@3 [g3,bb3,db4,f4]@2 ~@6, ~@2 eb4 ~@5", // Eb7 Gdim Gm7b5
  L: "[g3,bb3,db4,eb4]@2 ~ [g3,bb3,db4,f4] ~@4", M: "[ab3,c4,eb4] ~@3 [ab3,c4] ~@3 [ab3,c4,f4]@2 ~@6, ~@2 eb4 ~@5",
  N: "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)