Strudelify
Kingston Town cover art

UB45

Kingston Town

UB40

KeyA♭ majorTempo102 bpm
0:00/0:00
// Kingston Town — UB40
// 102 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 95 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(102/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 · fretless bass · "FRETLESS"
const bass = note(`<
  ~@4 A B C D A B C D E D F G A B C D E D F@2 H I J K L@2 M N G O A B C D E D F G A B C D E D F@2 A B C D A B C D H I J
  K L@2 M N G O A B C D E D F G A B C D E D F P E D F P E D F P E D ~
>`.pickRestart({
  A: "ab1@3 ~ ab1@4 eb2!5 ~ ab1@2", B: "c2@4 c2@3 ~ ab1!5 ~ c2@2", C: "db2@4 db2@3 ~ ab2!5 ~ db2@2",
  D: "eb2@4 eb2@3 ~ bb1!5 ~ eb2@2", E: "db2@3 ~ db2@4 ab1!5 ~ db2@2", F: "ab1@4 ab1@3 ~ eb2!5 ~ ab1@2",
  G: "eb2@4 eb2@3 ~ bb2!5 ~ eb2@2", H: "c2@3 ~ c2@4 g2!5 ~ c2@2", I: "f1@4 f1@3 ~ c2!5 ~ f1@2",
  J: "g1@3 ~ g1@4 d2!5 ~ g1@2", K: "c2@4 c2@3 ~ g2!5 ~ c2@2", L: "f1 c2 f1 c2", M: "bb1@3 ~ bb1@4 f2!5 ~ bb1@2",
  N: "bb1@4 bb1@3 ~ f2!5 ~ bb1@2", O: "bb2@3 ab2 bb2 ~ ab2@2 f2 eb2 f2 eb2 f2 ~ bb1@2", P: "f1@4 f1@3 ~ f2!5 ~ f1@2",
})).s("gm_fretless_bass").gain(0.61)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@4 A B C D A B C D C E A D A B C D C E A@2 B F G B F H C I D@2 A B C D C E A D A B C D C E A@3 B C D A B C D B F G B
  F H C I D@2 A B C D C E A D A B C D C E A F C E A F C E A F C E ~
>`.pickRestart({
  A: "~@2 [ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~", // Ab
  B: "~@2 [g3,c4,eb4] ~@3 [g3,c4,eb4] ~@3 [g3,c4,eb4] ~@3 [g3,c4,eb4] ~", // Cm
  C: "~@2 [ab3,db4,f4] ~@3 [ab3,db4,f4] ~@3 [ab3,db4,f4] ~@3 [ab3,db4,f4] ~", // Db
  D: "~@2 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~", // Eb
  E: "~@2 [g3,bb3,eb4] ~@3 [g3,bb3,eb4] ~@3 [g3,bb3,eb4] ~@3 [g3,bb3,eb4] ~", // Eb
  F: "~@2 [ab3,c4,f4] ~@3 [ab3,c4,f4] ~@3 [ab3,c4,f4] ~@3 [ab3,c4,f4] ~", // Fm
  G: "~@2 [bb3,d4,g4] ~@3 [bb3,d4,g4] ~@3 [bb3,d4,g4] ~@3 [bb3,d4,g4] ~", // Gm
  H: "~@2 [ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~@3 [ab3,c4,d4] ~@3 [ab3,c4,d4] ~", // Ab Dm7b5
  I: "~@2 [c4,d4,ab4] ~@3 [c4,d4,ab4] ~@3 [c4,d4,ab4] ~@3 [c4,d4,ab4] ~", // Dm7b5
})).s("gm_acoustic_guitar_steel").gain(0.52).pan(0.3)

// chords · rock organ · "ORGAN 3"
const rock_organ = note(`<
  ~@8 A B C D E F A D A B C D E F G@2 H I J K L@2 M N O P A B C D E F A D A B C D E F G@2 Q@2 R F Q@2 R F S I J K L@2 M
  N O P A B C D E F A D A B C D E F A T E F A T E F A T E F ~
>`.pickRestart({
  A: "[eb5,ab5,c6]", B: "[eb5,g5]@7 ~, c6", C: "[f5,ab5], db5@7 ~", D: "[eb5,g5,bb5]@15 ~", E: "[db5,f5,ab5]@15 ~",
  F: "[eb5,g5,bb5]", G: "[eb5,ab5,c6]/2", H: "[c5,eb5,g5]@15 ~", I: "[c5,f5,ab5]@15 ~", J: "[d5,g5,bb5]@15 ~",
  K: "[eb5,g5,c6]@15 ~", L: "[f5,ab5,c6]/2", M: "[f5,bb5]@15 ~, db5@13 ~@3", N: "[d5,f5,ab5,c6]",
  O: "[eb5,g5,bb5], d5 ~@15", P: "[eb5,g5,db6,f6]@15 ~", Q: "[ab5 g5, [c5,eb5]]/2", R: "[db5,f5,ab5]",
  S: "[eb5,g5] ~@15, c5@15 ~", T: "[f5,ab5,c6]",
})).s("gm_rock_organ").gain(0.37).pan(0.8)

// other · lead 8 bass lead · "BASS&LEAD"
const lead_8_bass_lead = note(`<
  A B C D E F G D ~@6 H@2 I ~@15 H@2 I ~@5 H@2 I ~@7 E F G D E F G D ~@8 H@2 I ~@5 H@2 I ~@18
>`.pickRestart({
  A: "ab4@8 ab4@3 bb4@2 c5@2 ~", B: "g4@7 ~ g4@3 ab4@2 bb4@2 ~", C: "f4@7 ~ f4@3 g4@2 ab4@2 ~", D: "c5@8 bb4@7 ~",
  E: "ab4@4 ab4 bb4@2 c5", F: "g4@7 ~ g4@2 ab4@3 ~ bb4@2", G: "f4@7 ~ f4@2 g4@3 ~ ab4@2",
  H: "[~@15 c5@7 bb4@6 g4@2 f4@2]/2", I: "eb4@5 ~@3",
})).s("gm_lead_8_bass_lead").gain(0.44).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~@3 [~@3 x] [~ x ~ x]!90 ~>").gain(0.61)

// drums · rim
const rim = s("rim").struct("<~@3 A B@3 C B@7 C B@7 C B@9 C B@7 C B@7 C B@7 C B@9 C B@7 C B@18 ~>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@2 x ~ x ~@3 x ~@2 x ~@4",
})).gain(0.54)

// drums · hihat
const hihat = s("hh").struct("<~@4 [x!8]!90 ~>").gain(0.27)

// drums · splash
const splash = s("cr").struct("<~@7 A ~@7 A ~@7 A ~@9 A ~@7 A ~@7 A ~@7 A ~@9 A ~@7 A ~@19>".pickRestart({
  A: "~@3 x",
})).gain(0.34)

// drums · ht
const ht = s("ht").struct("<~@3 A ~@3 B ~@7 B ~@7 B ~@9 B ~@7 B ~@7 B ~@7 B ~@9 B ~@7 B ~@19>".pickRestart({
  A: "~@10 x!3 ~@3", B: "~@7 x",
})).gain(0.48)

// drums · mt
const mt = s("mt").struct("<~@7 A ~@7 A ~@7 A ~@9 A ~@7 A ~@7 A ~@7 A ~@9 A ~@7 A ~@19>".pickRestart({
  A: "~@15 x",
})).gain(0.41)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@4 [x!16]!90 ~>").gain(1.03)

stack(bass, acoustic_guitar_steel, rock_organ, lead_8_bass_lead, kick, rim, hihat, splash, ht, mt, cabasa)

More by UB40