Strudelify
Small Town Boy cover art

Absolute High-Energy

Small Town Boy

Bronski Beat

KeyE♭ majorTempo134 bpm
0:00/0:00
// Small Town Boy — Bronski Beat
// 134 bpm, 8/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: duplicate parts dropped: ch 12 "Bass 2" acoustic bass (copy of ch 1 "Bass" fretless bass)
// note: Full arrangement: all 86 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: The whole transcription plays 51 ms behind the beat; the grid follows it, so its parts stay together.
setcpm(134/8)

// 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 · fretless bass · "Bass"
const bass = note(`<
  A B C D E F G H I J I J I J I J I J I J I J I J I J I J I J I J I J I J I J I J I J I J I J I J I J I K L K L K L K L
  J I J I J I J I J I J I J I J I J I J I J I J I J I ~
>`.pickRestart({
  A: "~@5 c2 c3 c2 c3 c2 c3 c2 ~ c3 bb1 bb2", B: "bb1 bb2 bb1 bb2 bb1 bb2 f2 f3 ~ f2 f3 f2 f3 f2 f3 eb2",
  C: "eb3 eb2 ~ eb3 eb2 eb3 d2 d3 c2 c3 c2 c3 c2 c3 ~ c2", D: "c3 bb1 bb2 bb1 bb2 bb1 bb2 bb1 bb2 ~ f2 f3 f2 f3 f2 f3",
  E: "f2 f3 eb2 eb3 ~ eb2 eb3 eb2 eb3 d2 d3 c2 c3 c2 c3 ~", F: "c2 c3 c2 c3 bb1 bb2 bb1 bb2 bb1 bb2 ~ bb1 bb2 f2 f3 f2",
  G: "f3 f2 f3 f2 f3 ~ eb2 eb3 eb2 eb3 eb2 eb3 d2 d3 c2 c3", H: "c2 ~ c3 c2 c3 c2 c3 bb1 bb2 bb1 bb2 bb1 bb2 ~ bb1 bb2",
  I: "f2 f3 f2 f3 f2 f3 f2 f3 eb2 eb3 eb2 eb3 eb2 eb3 d2 d3",
  J: "c2 c3 c2 c3 c2 c3 c2 c3 bb1 bb2 bb1 bb2 bb1 bb2 bb1 bb2",
  K: "c2 c3 c2 c3 c2 c3 c2 c3 eb2 eb3 eb2 eb3 eb2 eb3 eb2 eb3",
  L: "f2 f3 f2 f3 f2 f3 f2 f3 ab1 ab2 ab1 ab2 ab1 ab2 bb1 bb2",
})).s("gm_fretless_bass").gain(0.3).pan(0)

// other · orchestral harp · "Hi Harp"
const orchestral_harp = note(`<
  ~@2 A B C D E F G ~@4 H I H I ~@4 H I ~@6 H I H I ~@30 H I H I ~@4 H I H I H I H I H I H I H I ~
>`.pickRestart({
  A: "~@9 c5 eb5 ~ c5 ~ eb5 ~", B: "eb5 ~ c5 d5 ~ c5 d5 ~ d5 ~@2 c5 bb4 ~ c5 ~",
  C: "~ c5 ~ bb4 ~ c5 ~@2 c5 ~@3 c5 eb5 ~@2", D: "c5 eb5 ~ eb5 ~ c5 d5 ~ c5 d5 ~@2 d5 ~ c5 f5",
  E: "~ c5 f5 ~ f5 ~@2 c5 eb5 ~ c5 eb5 ~ d5 ~ c5", F: "eb5 ~@2 c5 eb5 ~ eb5 ~ c5 d5 ~ c5 d5 ~@2 d5",
  G: "~ c5 bb4 ~ c5 ~ c5 bb4 ~ bb4 c5 ~@2 bb4 c5!2", H: "~ c5 eb5 ~ c5 eb5 ~ eb5 ~ c5 d5 ~ c5 d5 ~ d5",
  I: "~ c5 f5 ~ c5 f5 ~ f5 ~ c5 eb5 ~ c5 eb5 ~ d5",
})).s("gm_orchestral_harp").gain(0.25).pan(0.3)

// other · string ensemble 2 · "Hi Strings"
const string_ensemble_2 = note("<~@2 A B C D@3 E@2 ~@76>".pickRestart({
  A: "~@4 c6@3 ~", B: "bb5@6 ~@3 f5@6 ~", C: "~@2 eb5@6 ~@3 c6@5", D: "[~ bb5@2 ~ f5@2 ~ eb5@2 ~ c6@2 ~ bb5@2 ~]/3",
  E: "[f6@6 ~ eb6@5 ~@3 c6@3 ~@14, ~@14 d6@3 ~@15]/2",
})).s("gm_string_ensemble_2").gain(0.41)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@15 A B ~@4 A B ~@6 A B A B ~@4 A B A B A B A B A B A B A B ~@8 A B A B A B A B ~@4 A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "[eb4,g4]@3 ~ [d4,f4]@3 ~", B: "[f4,ab4]@3 ~ [eb4,g4]@3 ~",
})).s("gm_string_ensemble_1").gain(0.3).pan(0.6)

// other · xylophone · "Block"
const xylophone = note("<~@51 A B@2 A B A B@2 A@2 B@2 ~@23>".pickRestart({
  A: "~ g6 f6 g6 bb6 c7 bb6 ~@2 g6 f6 g6 bb6 c7 bb6 ~", B: "~ g6 f6 g6 bb6 [bb6,c7] ~@3 g6 f6 g6 bb6 [bb6,c7] ~@2",
})).s("gm_xylophone").gain(0.46)

// other · tuba · "Mid Synth"
const tuba = note("<~@47 A B A B ~@26 A B A B A B A B ~>".pickRestart({
  A: "~ c5 bb4 c5 eb5 f5@2 c5 ~ c5 bb4 c5 eb5 f5@2 ~", B: "~ c5 bb4 c5 eb5 f5@2 eb5 ~ gb5 f5 eb5 gb5 f5 eb5@2",
})).s("gm_tuba").gain(0.3).pan(0.8)

// drums · kick
const kick = s("bd").struct("<~@9 A B A B A B A B C@12 A@38 C@6 A@12 ~>".pickRestart({
  A: "x!8", B: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2", C: "x ~ x!3 ~ x ~",
})).gain(0.4)

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

// drums · clap
const clap = s("cp").struct("<~@52 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@19>".pickRestart({
  A: "~@13 x!3",
})).gain(0.25)

// drums · clap · soft notes
const clap_soft = s("cp").struct("<~@53 A ~@7 A ~ A ~ A ~ A ~@18>".pickRestart({
  A: "x",
})).gain(0.15)

// drums · hihat
const hihat = s("hh").struct("<~@9 A B A B A B A B C@4 A@64 ~>".pickRestart({
  A: "x!14 ~ x", B: "x!15 ~", C: "x!16",
})).gain(0.2)

// drums · open hat
const open_hat = s("oh").struct("<~@9 A B A B A B A B ~@4 A@64 ~>".pickRestart({
  A: "~@7 x", B: "~@15 x",
})).gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct("<~@9 A@8 B@4 ~@2 C@5 D A@38 C@4 A@14 ~>".pickRestart({
  A: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", B: "~ x ~ x", C: "~ x ~ x ~ x ~ x", D: "~ x ~ x ~@4",
})).gain(0.35)

// drums · congas
const congas = s("conga:13").struct("<~@51 A@2 B@6 A@2 B@6 ~@4 A@2 B@6 ~@7>".pickRestart({
  A: "~@5 x ~@7 x!2 ~", B: "~@5 x!2 ~@6 x!2 ~",
})).gain(0.95)

// drums · congas
const congas_2 = s("conga:18").struct("<~@51 [~@2 x!2 ~@6 x!2 ~@4]!16 ~@4 [~@2 x!2 ~@6 x!2 ~@4]!8 ~@7>").gain(0.95)

// drums · congas
const congas_3 = s("conga:33").struct("<~@51 A B@7 A B@7 ~@4 A B@7 ~@7>".pickRestart({
  A: "~@7 x!2 ~@6 x", B: "x ~@6 x!2 ~@6 x",
})).gain(0.95)

stack(
  bass, orchestral_harp, string_ensemble_2, string_ensemble_1, xylophone, tuba, kick, snare, clap, clap_soft, hihat,
  open_hat, tambourine, congas, congas_2, congas_3
)