Strudelify

Burning Heart

Ash Twomey

KeyD♭ majorTempo120 bpm
0:00/0:00
// Burning Heart — Ash Twomey
// 120 bpm, 4/4, key Db major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/2272301; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 65 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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.

// other · flute
const flute = note("<~@13 A B A C A B A D A B A D E@2 ~@9 F G@2 H I@2 J ~@12 K L M N O P Q@2 ~ R>".pickRestart({
  A: "~ db5 c5 bb4", B: "~ eb5 db5 bb4", C: "eb5@3 db5 c5@2 ~@2", D: "eb5@3 db5 c5@2 db5 eb5", E: "[f5@15 ~]/2",
  F: "bb5@4 c6@4 eb6@4 db6@2 c6 b5", G: "bb5 ~@3", H: "~ bb5@2 ~", I: "[~@3 bb5@2 ~ bb5@2]/2", J: "~@4 bb5@11 ~",
  K: "~@2 bb5!2 db6 bb5 ab5 bb5", L: "~@2 gb5!2 ab5 gb5 bb5@2", M: "~@2 db5!2 gb5@3 db5",
  N: "db5 b4@3 bb4@2 b4@2 db5@8", O: "~@2 db5!2 f5@3 db5", P: "db5 b4@3 bb4@2 b4@2 db5@2 eb5@2 db5@2 eb5@2",
  Q: "[~@4 db5@2 eb5@2 db5@2 eb5@2 bb4 ab4 gb4@17 ~]/2", R: "ab5@15 ~, c6 ~",
})).s("gm_flute").gain(0.25)

// other · clarinet · "B♭ Clarinet"
const clarinet = note("<~@17 A B C D E F C G H@2 ~@7 I J ~ K@2 L M@2 N ~@20 O@2>".pickRestart({
  A: "f5 f5@3 f5@4 f5@4 f5@2 f5@2", B: "f5 f5@3 eb5@4 db5@4 f5@4", C: "eb5 eb5@3 eb5@2 eb5@2 eb5@4 eb5@2 eb5@2",
  D: "eb5 f5@3 f5@2 f5@2 f5@8", E: "eb5 f5@3 f5@2 f5@2 f5@2 f5@2 f5@2 f5@2", F: "f5 f5@3 eb5@4 db5@4 eb5@2 f5@2",
  G: "eb5 f5@3 f5@2 f5@2 f5@2 gb5@2 f5@2 gb5@2", H: "d4/2", I: "ab3 bb3 c4 db4", J: "eb4 f4 gb4 ab4", K: "db4 ~@3",
  L: "~ db4@2 ~", M: "[~@3 db4@2 ~ db4@2]/2", N: "~ db4@3", O: "[~ f5@3]/2",
})).s("gm_clarinet").gain(0.25)

// bass · clarinet · "Bass Clarinet"
const bass = note("<~@24 A B@2 ~@6 C ~@3 D@2 E F@2 G ~@20 H@2>".pickRestart({
  A: "~@4 f3 gb3 f3 gb3", B: "bb2/2", C: "db3 eb3 f3 gb3", D: "gb3 ~@3", E: "~ gb3@2 ~", F: "[~@3 gb3@2 ~ gb3@2]/2",
  G: "~ gb3@3", H: "db3/2",
})).s("gm_electric_bass_finger").gain(0.25)

// other · alto sax · "Alto Saxophone"
const alto_sax = note("<~@37 A@2 B C@2 D ~@8 E F G H E F G H E F G H ~ I>".pickRestart({
  A: "bb4 ~@3", B: "~ bb4@2 ~", C: "[~@3 bb4@2 ~ bb4@2]/2", D: "~ bb4@3", E: "~@8 f4@3 db4@2 ab3@3",
  F: "~@8 db5@3 f4@2 ab3@3", G: "~@8 gb4@3 f4@2 bb3@3", H: "~@8 ab4@3 f4@2 db4@3", I: "ab4, c5 ~",
})).s("gm_alto_sax").gain(0.25)

// other · tenor sax · "Tenor Saxophone"
const tenor_sax = note("<~@3 A ~@26 B C D ~@3 E F@2 G H@2 I ~@20 J@2>".pickRestart({
  A: "[c4,db4,f4,gb4]@7 ~", B: "db4 gb3 a3 c4 db4 ab3 b3 d4!2 a3 c4 eb4 db4 ab3 b3 d4",
  C: "db5 gb4 a4 c5 db5 gb4 a4 db5!2 gb4 bb4 d5 db5 gb4 a4 db5",
  D: "db5 gb4 a4 c5 db5 ab4 b4 d5!2 a4 c5 eb5 db5 ab4 b4 d5", E: "~@8 f3 gb3 f3 gb3 f3 gb3 f3 gb3", F: "db3 ~@3",
  G: "~ db3@2 ~", H: "[~@3 db3@2 ~ db3@2]/2", I: "~ db3@3", J: "[~ f3@3]/2",
})).s("gm_tenor_sax").gain(0.3)

// other · baritone sax · "Baritone Saxophone"
const baritone_sax = note("<~@28 A B ~@3 C D E F G@2 H I@2 J ~@20 K@2>".pickRestart({
  A: "gb3 f3 e3 d3", B: "c3 b2 a2 gb2", C: "gb2 g2 ab2 a2 ab2 a2 bb2 b2 bb2 b2 c3 db3 c3 db3 d3 eb3",
  D: "eb3 e3 f3 gb3 f3 gb3 g3 ab3 g3 gb3 f3 e3 gb3 f3 e3 eb3",
  E: "f3 e3 eb3 d3 eb3 d3 db3 c3 db3 c3 b2 bb2 c3 b2 bb2 a2", F: "bb2 a2 ab2 g2 a2 ab2 g2 gb2 f2@4 gb2@4", G: "gb2 ~@3",
  H: "~ gb2@2 ~", I: "[~@3 gb2@2 ~ gb2@2]/2", J: "~ gb2@3", K: "db2/2",
})).s("gm_baritone_sax").gain(0.4)

// other · french horn · "Horn in F"
const french_horn = note(`<
  ~@13 A B C D A B C D A B C D ~@5 E F E ~@4 G@2 H I@2 J K L M B C L M B C L M B C L M B ~@4 N@2
>`.pickRestart({
  A: "~ d4", B: "~ db4", C: "~ f4", D: "~ bb3", E: "db4 c4 db4 d4 db4 eb4 db4 d4", F: "c4 db4 d4 db4", G: "db4 ~@3",
  H: "~ db4@2 ~", I: "[~@3 db4@2 ~ db4@2]/2", J: "~ db4@3", K: "~@2 bb3 c4 db4@4", L: "~ ab4", M: "~ gb4",
  N: "[~ f4@3]/2",
})).s("gm_french_horn").gain(0.3)

// other · trombone
const trombone = note("<~@9 A B C D A B C D A B C D A B C D E F G H I J K J ~@4 L@2 M N@2 O ~@20 P@2>".pickRestart({
  A: "~ f3 d3 bb2", B: "~ gb3 db3 gb2", C: "~ ab3 f3 db3", D: "~ c4 bb3 ab3",
  E: "db4 c4 b3 bb3 [ab3,a3] g3 gb3 f3 e3 eb3 d3 [c3,db3] b2 bb2 a2 ab2", F: "g2", G: "~ a3@3",
  H: "gb3 f3 e3 eb3 f3 e3 eb3 d3 e3 eb3 d3 db3 d3 db3 c3 b2", I: "c3 b2 bb2 a2 b2 bb2 a2 ab2 a2 ab2 g2 gb2 gb2@4",
  J: "[gb2,db3] [ab2,db3] [a2,db3] [ab2,db3]", K: "[gb2,db3]!4", L: "bb2 ~@3", M: "~ bb2@2 ~",
  N: "[~@3 bb2@2 ~ bb2@2]/2", O: "~ bb2@3", P: "[~ f3@3]/2",
})).s("gm_trombone").gain(0.25)

// other · tuba · "Euphonium"
const tuba = note(`<
  ~@5 A B C D E B C D E B C D E B C D E B C D F@2 G H@9 I@2 J K@2 G ~ L M N@2 O M N@2 O M N@2 O M N@2 O M N P@2
>`.pickRestart({
  A: "f3 f3@3 f3@12", B: "f3 gb3@3 gb3@12", C: "db3 bb2@3 ab2@12", D: "f3 db3@3 c3@12", E: "db3 eb3@3 f3@12",
  F: "bb2/2", G: "~ db3@3", H: "db3 db3@3 db3 db3@3 db3 db3@3 db3 db3@3", I: "db3 ~@3", J: "~ db3@2 ~",
  K: "[~@3 db3@2 ~ db3@2]/2", L: "~@2 ab2 db3 f3@4", M: "~ bb2", N: "~ ab2", O: "~ db3", P: "db3/2",
})).s("gm_tuba").gain(0.4)

// bass · tuba
const bass_2 = note(`<
  ~@5 A B C D A B C D A B C D A B C D A B C D E@2 F G H G H G H G H G I@2 J K@2 F ~@2 L M N O P M N O P M N O P M N O P
  M Q@2
>`.pickRestart({
  A: "bb2 bb2@3 bb2@12", B: "gb2 gb2@3 gb2@12", C: "db2 db2@3 db2@12", D: "ab2 ab2@3 ab2@12", E: "bb2/2", F: "~ gb2@3",
  G: "gb2 gb2@3 ab2 ab2@3 a2 a2@3 ab2 ab2@3", H: "gb2 gb2@3 gb2 gb2@3 gb2 gb2@3 gb2 gb2@3", I: "gb2 ~@3",
  J: "~ gb2@2 ~", K: "[~@3 gb2@2 ~ gb2@2]/2", L: "~@2 gb2 db3 f3@4", M: "eb3 db3@3 ab2@2 db3@2 f3@8",
  N: "f3 db3@3 bb2@2 c3@2 db3@8", O: "c3 bb2@3 ab2@2 db3@2 f3@8", P: "gb3 gb2@3 gb2@2 db3@2 f3@8", Q: "db2/2",
})).s("gm_tuba").gain(0.4)

// other · timpani · Gbmaj7 Ebmaj7
const timpani = note("<~@24 [bb2!16]!2 [bb2!5 ~@3 g3 [f3,gb3] e3 [d3,eb3] db3@4] ~@35 [db3!16]!3>")
  .s("gm_timpani").gain(0.3)

// drums · kick
const kick = s("bd").struct("<A@5 B@20 C D E F@9 G H C D H A@23>".pickRestart({
  A: "x!2 ~@14", B: "x!2 ~@2 x ~@3 x ~@3 x ~@3", C: "x!2 ~@10 x!2 ~@2", D: "~@8 x!2 ~@6", E: "x!2 ~@6 x!2 ~@2 x!2 ~@2",
  F: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2", G: "~@4 x!2 ~@6 x!2 ~@2", H: "~@4 x!2 ~@10",
})).gain(0.4)

// drums · snare
const snare = s("sd").struct("<~@5 [~@3 x ~ x ~ x]!16 [~@2 x!2 ~ x ~ x] [~@2 x!4 ~ x] [~@2 x!6] [~ x!7] ~@40>")
  .gain(0.3)

// drums · low tom
const low_tom = s("lt").struct("<~@2 [x!16] x ~@61>").gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<[~@4 x!12] [x ~@3 x!12] x ~@62>").gain(0.3)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<[x!4 ~@12]!2 ~@63>").gain(0.2)

// drums · crash
const crash = s("cr").struct("<~@3 A ~@22 A B C D ~@3 C@3 D A ~@27>".pickRestart({
  A: "x", B: "~ x ~@2", C: "x!4", D: "x!3 ~",
})).gain(0.25)

stack(
  flute, clarinet, bass, alto_sax, tenor_sax, baritone_sax, french_horn, trombone, tuba, bass_2, timpani, kick, snare,
  low_tom, mid_tom, mid_tom_soft, crash
)