Strudelify
KeyD majorTempo85 bpm
0:00/0:00
// Buyo — Arnav Hiremath
// 85 bpm, 4/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: Transcription provider: pdmx. https://musescore.com/score/3775886; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 21 bars on a 48-step grid, each part at one level. Source detail keeps the original performance.
setcpm(85/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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.

// other · trumpet · "B♭ Trumpet"
const trumpet = note("<A B C D E F@2 G@2 H I J@2 K L M L M N M O>".pickRestart({
  A: "~@25 f4@8 f4@3 ~@12", B: "~@4 g#4@3 g#4@3 ~@2 g#4@3 a4@3 ~@2 a#4@8 a#4@3 ~@11 c5@3 ~@3",
  C: "~@2 g4@2 c5@3 ~@3 g4@5 f4@8 f4@3 ~@16 g#4@3 g#4@3",
  D: "~@2 g#4@3 a#4@2 a#4@3 ~@3 g#4@2 a#4@5 ~ a#4@5 a#4@5 ~ c5@5 c5@5 c5@5 ~",
  E: "f4@5 f4@8 f4@3 ~@16 g#4@3 g#4@3 ~@2 g#4@3 a4@3 ~@2",
  F: "[a#4@8 a#4@3 ~@10 c5@3 ~@5 g4@3 c5@3 ~@3 g4@5 f4@8 f4@3 ~@16 g#4@2 g#4@3 ~@3 g#4@2 a#4@3 a#4@3 ~@3 g#4@2 a#4@5]/2",
  G: "[~ a#4@5 a#4@5 c5@5 ~ c5@5 c5@5 f4@5 ~@4 f4@3 ~ c5@3 c5@3 c5@7 c5@3 ~@4 c5@7 c5@3 ~@4 g#4@3 a#4@3 c5@3 ~ c5@3 ~@4 f4@3 c5@2]/2",
  H: "~ c5@3 ~ c5@7 c5@3 ~@3 a#4@3 ~ g#4@3 c5@7 f4@7 ~@9",
  I: "~ f4@3 c5@3 ~ c5@3 c5@7 c5@3 ~@4 c5@7 c5@3 ~@3 g#4@3 ~ a#4@3 c5@3",
  J: "[~ c5@3 ~@3 f4@3 ~ c5@3 c5@3 ~ c5@6 c5@3 ~@4 a#4@3 ~ g#4@3 c5@7 g#4@7 ~@44]/2", K: "~ f4", L: "g4@3 a4@3 ~@2",
  M: "a4 g4 f4@2", N: "g4@3 a4 a4@2 ~@2", O: "f4@3 e4@5",
})).s("gm_trumpet").gain(0.45)

// drums · kick
const kick = s("bd").struct("<~@3 A B C D E F G H I ~@9>".pickRestart({
  A: "~@10 x ~@4 x ~@5 x ~@4 x ~@5 x ~@4 x ~@4 x ~@5", B: "x ~@4 x ~@20 x ~@10 x ~@5 x ~@4",
  C: "x ~@20 x ~@16 x ~@4 x ~@4", D: "~@8 x ~@7 x ~@2 x ~@4", E: "~@11 x ~@15 x ~@5 x ~@9 x ~@2 x ~",
  F: "~@12 x ~@9 x ~@3 x ~@12 x ~@8", G: "~ x ~@3 x ~@12 x ~@10 x ~@2 x ~@13 x ~",
  H: "~@8 x ~@2 x ~@13 x ~@9 x ~@2 x ~@9", I: "~@4 x ~@9 x ~@3 x ~@12 x ~@9 x ~@3 x ~@2",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct("<~@3 A B C D E F G H I J ~@8>".pickRestart({
  A: "~@15 x ~@5 x ~@4 x ~@5 x ~@4 x ~@4 x ~@5", B: "~@16 x ~@20 x ~@10", C: "~@11 x ~@20 x ~@15", D: "~@2 x ~@6 x ~@6",
  E: "~ x ~@20 x ~@17 x ~@7", F: "~@5 x ~@13 x ~@12 x ~@13 x ~", G: "~@12 x ~@12 x ~@13 x ~@8",
  H: "~@4 x ~@13 x ~@13 x ~@12 x ~@2", I: "~@11 x ~@12 x ~@13 x ~@9", J: "~ x ~@10",
})).gain(0.45)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@4
  [~@10 x ~@5 x ~@4 x ~@4 x ~@5 x ~@4 x ~@5 x ~@4]
  [x ~@4 x ~@5 x ~@4 x ~@4 x ~@5 x ~@4 x ~@5 x ~@4 x ~@4]
  [x ~@5 x ~@4 x ~@4 x ~@5 x ~@4 x ~@4 x ~@5 x ~@4 x ~@4]
  [~ x ~@4 x ~@4 x ~@5 x ~@4 x ~@4 x ~@20]
  ~@13
>`).gain(0.45)

// drums · open hat
const open_hat = s("oh").struct("<~@3 [~@15 x ~@5 x ~@4 x ~@5 x ~@4 x ~@10] ~@17>").gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 x ~@16>").gain(0.5)

// drums · high tom
const high_tom = s("ht").struct("<~@3 [~@15 x] ~@17>").gain(0.5)

// drums · crash
const crash = s("cr").struct("<~@4 [~@5 x ~@42] ~@16>").gain(0.45)

stack(trumpet, kick, snare, hihat, open_hat, mid_tom, high_tom, crash)