Strudelify

Threatin' Zeppelin

Kristofer Maddiganarr. Tom Zong

KeyB♭ majorTempo248 bpm
0:00/0:00
// Threatin' Zeppelin — Kristofer Maddiganarr. Tom Zong
// 248 bpm, 2/2, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 8 "Trombone" trombone (copy of ch 7 "Trombone" trombone)
// note: Transcription provider: pdmx. https://musescore.com/score/5984841; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 148 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(248/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 · alto sax · "Alto Saxophone"
const alto_sax = note(`<
  ~@12 A B C D ~@4 E F E F E G H I E G H I A B C D ~@8 J K J K J K J K J K J K J K J K L M N O J K J K ~@24 P@7 ~ A B C
  D ~@28 Q R@3 S@2 R@2 T U@2 V ~@3 W
>`.pickRestart({
  A: "bb3 b3 ~ bb3 c4 ~ bb3 db4", B: "~ bb3 d4 ~ bb3 eb4 ~ bb3", C: "e4 ~ bb3 f4 ~ bb3 gb4 ~",
  D: "f4 f4@3 eb4@2 db4@2 c4@2 bb3@2 ab3@2 f3@2, ~ g4 ~@14", E: "f4 ~ f4@4 f4!2", F: "~ f4@2 f4@3 ~@2", G: "~ f4 ~@6",
  H: "f4@3 f4 ~ f4 ~@2", I: "f4!2 ~ f4@3 ~@2", J: "~ ab3 g3 gb3 f3 ~@3", K: "~ ab3 g3 gb3 f3 eb3 ~@2",
  L: "~ bb3 a3 ab3 g3 ~@3", M: "~ bb3 a3 ab3 g3 f3 ~@2", N: "~ c4 b3 bb3 a3 ~@3", O: "~ c4 b3 bb3 a3 g3 ~@2",
  P: "ab3 g3 gb3 f3 ~@4", Q: "~@4 c5 b4 ~ bb4 ab4@2 g4@4 ~@2", R: "f4@4 c5 b4 ~ bb4 ab4@2 g4@4 ~@2",
  S: "f4@4 db5 c5 ~ bb4 ab4@2 g4@4 ~@2", T: "~@4 db5 c5 ~ bb4 a4@2 ab4@4 g4@2", U: "~@4 e5 d5 ~ db5 c5@2 b4@4 bb4@2",
  V: "~ f5@3", W: "~@8 eb5 e5 f5@6",
})).s("gm_alto_sax").gain(0.3)

// other · tenor sax · "Tenor Saxophone"
const tenor_sax = note(`<
  ~@12 A B C D ~@4 E F E F E G H I E G H I A B C D ~@8 J K J K J K J K J K J K J K J K L M N O J K J K P Q R S P Q R T U
  V W X P Q R S U Y Z AA P Q R AB AC@7 ~ A B C D ~@28 AD AE@3 AF@2 AE@2 AG AH@2 AI ~@3 AJ
>`.pickRestart({
  A: "bb3 b3 ~ bb3 c4 ~ bb3 db4", B: "~ bb3 d4 ~ bb3 eb4 ~ bb3", C: "e4 ~ bb3 f4 ~ bb3 gb4 ~",
  D: "f4 f4@3 eb4@2 db4@2 c4@2 bb3@2 ab3@2 f3@2, ~ g4 ~@14", E: "f4 ~ f4@4 f4!2", F: "~ f4@2 f4@3 ~@2", G: "~ f4 ~@6",
  H: "f4@3 f4 ~ f4 ~@2", I: "f4!2 ~ f4@3 ~@2", J: "~ ab3 g3 gb3 f3 ~@3", K: "~ ab3 g3 gb3 f3 eb3 ~@2",
  L: "~ bb3 a3 ab3 g3 ~@3", M: "~ bb3 a3 ab3 g3 f3 ~@2", N: "~ c4 b3 bb3 a3 ~@3", O: "~ c4 b3 bb3 a3 g3 ~@2",
  P: "~ ab3@3 f3 ~@3", Q: "g3 ab3@2 f3 ~@4", R: "~ ab3@3 f3@2 f3@2", S: "g3 ab3@2 f3 ~ c3 ~@2",
  T: "g3@2 f3@2 g3 ab3@2 bb3", U: "~@2 bb3@2 g3 ~@3", V: "a3 bb3@2 g3 ~@4", W: "~ bb3@3 g3@2 g3@2",
  X: "a3 bb3@2 g3 ~ f3 ~@2", Y: "bb3 e3@2 g3 ~@4", Z: "~@2 c4@2 bb3 ~@3", AA: "b3 c4@2 bb3 ~ e3 ~@2",
  AB: "g3 ab3@2 f3 ~ eb3 ~@2", AC: "ab3 g3 gb3 f3 ~@4", AD: "~@4 c5 b4 ~ bb4 ab4@2 g4@4 ~@2",
  AE: "f4@4 c5 b4 ~ bb4 ab4@2 g4@4 ~@2", AF: "f4@4 db5 c5 ~ bb4 ab4@2 g4@4 ~@2", AG: "~@4 db5 c5 ~ bb4 a4@2 ab4@4 g4@2",
  AH: "~@4 e4 d4 ~ db4 c4@2 b3@4 bb3@2", AI: "~ f4@3", AJ: "~ d4",
})).s("gm_tenor_sax").gain(0.25)

// other · baritone sax · "Baritone Saxophone"
const baritone_sax = note(`<
  ~@12 A B C D ~@13 E F G A B C D ~@8 H I H I H I H I H I H I H I H I J K L M H I H I N O P Q N O P R S T U V N O P Q S
  W X Y N O P Z AA@7 ~ A B C D ~@28 AB ~ AC ~ AD ~ AC ~@8 AE
>`.pickRestart({
  A: "bb2 b2 ~ bb2 c3 ~ bb2 db3", B: "~ bb2 d3 ~ bb2 eb3 ~ bb2", C: "e3 ~ bb2 f3 ~ bb2 gb3 ~",
  D: "f3 f3@3 eb3@2 db3@2 c3@2 bb2@2 ab2@2 f2@2, ~ g3 ~@14", E: "~@7 f2", F: "gb2 g2 ab2 a2 bb2 b2 c3 db3",
  G: "d3 eb3 e3 f3 gb3 g3 ab3 a3", H: "~ ab3 g3 gb3 f3 ~@3", I: "~ ab3 g3 gb3 f3 eb3 ~@2", J: "~ bb3 a3 ab3 g3 ~@3",
  K: "~ bb3 a3 ab3 g3 f3 ~@2", L: "~ c4 b3 bb3 a3 ~@3", M: "~ c4 b3 bb3 a3 g3 ~@2", N: "~ ab3@3 f3 ~@3",
  O: "g3 ab3@2 f3 ~@4", P: "~ ab3@3 f3@2 f3@2", Q: "g3 ab3@2 f3 ~ c3 ~@2", R: "g3@2 f3@2 g3 ab3@2 bb3",
  S: "~@2 bb3@2 g3 ~@3", T: "a3 bb3@2 g3 ~@4", U: "~ bb3@3 g3@2 g3@2", V: "a3 bb3@2 g3 ~ f3 ~@2", W: "bb3 e3@2 g3 ~@4",
  X: "~@2 c4@2 bb3 ~@3", Y: "b3 c4@2 bb3 ~ e3 ~@2", Z: "g3 ab3@2 f3 ~ eb3 ~@2", AA: "ab3 g3 gb3 f3 ~@4", AB: "c3@3 ~",
  AC: "f2@3 ~", AD: "bb2@3 ~", AE: "~ d4",
})).s("gm_baritone_sax").gain(0.25)

// other · trumpet
const trumpet = note(`<
  ~@6 A@2 ~@2 B@3 ~@5 A@2 ~@12 C D E F ~@2 A@2 ~@52 G ~ G H G ~ G I@2 D E F ~@2 J@2 K L K M N O ~@18 P Q P Q R S P Q T
  U@2 V ~@3 W
>`.pickRestart({
  A: "[~@5 ab5@2 f5@3 ~@3 ab5@2 ~]/2", B: "[~@5 ab5@2 f5@3 ~@3 ab5@2 f5@5 ~@4]/3", C: "~@6 bb4 db5",
  D: "~ bb4 d5 ~ bb4 eb5 ~ bb4", E: "e5 ~ bb4 f5 ~ bb4 gb5 ~", F: "~@4 c5 bb4 ab4 f4", G: "~@8 b4@3 ~ b4@3 ~",
  H: "~@8 [eb5,f5]!8", I: "[~@4 a5@2 bb5@4 ~@4 bb4 db5]/2", J: "[~@5 ab5@2 f5@3 ~@3 ab5@3]/2", K: "f5@3 ~@13",
  L: "~@5 ab5@3", M: "~@5 bb5@3", N: "f5 ~ f5 ~@13", O: "~@10 [ab5,bb5] ab5 [ab5,bb5]!2 ab5 [ab5,bb5]", P: "~@6 e5 ~",
  Q: "f5 ~", R: "~@6 a5 ~", S: "bb5 ~", T: "~@8 f5@3 ~@5", U: "[~@8 e5@3 ~ e5@8 ~@12]/2", V: "e5@3 ~ f5@12",
  W: "~@8 eb5 e5 f5@6",
})).s("gm_trumpet").gain(0.45)

// other · muted trumpet
const muted_trumpet = note("<~@68 A B C D A B C E F G H I A B C D F J K L A B C M ~@56>".pickRestart({
  A: "~ ab4@3 f4 ~@3", B: "g4 ab4@2 f4 ~@4", C: "~ ab4@3 f4@2 f4@2", D: "g4 ab4@2 f4 ~ c4 ~@2",
  E: "g4@2 f4@2 g4 ab4@2 bb4", F: "~@2 bb4@2 g4 ~@3", G: "a4 bb4@2 g4 ~@4", H: "~ bb4@3 g4@2 g4@2",
  I: "a4 bb4@2 g4 ~ f4 ~@2", J: "bb4 e4@2 g4 ~@4", K: "~@2 c5@2 bb4 ~@3", L: "b4 c5@2 bb4 ~ e4 ~@2",
  M: "g4 ab4@2 f4 ~ eb4 ~@2",
})).s("gm_muted_trumpet").gain(0.45)

// other · trombone
const trombone = note(`<
  ~@6 A@2 ~@2 B@3 ~@5 A@2 C@2 D ~ E F G H E F G H ~@3 I ~@2 A@2 ~@28 J K L M J K L N O P Q R J K L M S T U V J K L M W ~
  W X W ~ W ~@4 I ~@2 Y@2 Z AA Z AB AC AA ~@18 AD ~ AE ~ AF ~ AE ~ AG AH ~ AI ~@4
>`.pickRestart({
  A: "[~@5 c4@2 ab3@3 ~@3 c4@2 ~]/2", B: "[~@5 c4@2 ab3@3 ~@3 c4@2 ab3@3 ~@6]/3",
  C: "[~@8 eb4@4 b3 c4 ab3@4 ab3@4 g3@2 ab3@8]/2", D: "ab3@3 g3@2 gb3@3 f3@8", E: "c4 ~ c4@4 c4!2", F: "~ c4 ~@6",
  G: "c4@3 c4 ~ c4 ~@2", H: "c4!2 ~ c4@3 ~@2", I: "~@4 c4 bb3 ab3 f3", J: "~ c4@3 ab3 ~@3", K: "bb3 c4@2 ab3 ~@4",
  L: "~ c4@3 ab3@2 ab3@2", M: "bb3 c4@2 ab3 ~ f3 ~@2", N: "bb3@2 ab3@2 bb3 c4@2 bb3", O: "~@2 bb3@2 g3 ~@3",
  P: "a3 bb3@2 db4 ~@4", Q: "~ bb3@3 g3@2 g3@2", R: "a3 bb3@2 g3 ~ f3 ~@2", S: "~@2 db4@2 bb3 ~@3",
  T: "c4 db4@2 bb3 ~@4", U: "~@2 ab3@2 g3 ~@3", V: "g3 ab3@2 g3 ~ e3 ~@2", W: "~@8 ab3@3 ~ ab3@3 ~", X: "~ ab3",
  Y: "[~@5 c4@2 ab3@3 ~@3 c4@3]/2", Z: "ab3@3 ~@13", AA: "~@5 c4@3", AB: "~@5 bb3@3", AC: "f3 ~ f3 ~@13", AD: "c3@3 ~",
  AE: "f2@3 ~", AF: "bb2@3 ~", AG: "~@8 c4@3 ~@5", AH: "~@8 c4@3 ~ c4@3 ~", AI: "c4@3 ~ c4@3 ~@9",
})).s("gm_trombone").gain(0.2)

// other · vibraphone
const vibraphone = note(`<
  A B C D E F G H I F G ~@4 J I F G@2 ~@4 K L M N K L M O ~@3 J I F G@2 ~@52 K L M N K L M O ~@3 J I F G P Q ~ R S ~ T
  U@2 V W X Y Z AA@2 AB AC AD AE AF AG AH AI AJ@2 ~@10 J I F AK ~
>`.pickRestart({
  A: "f5 gb5 ~ e5 eb5@2 d5@2 ab5@2 g5@2 gb5@2 f5@2", B: "e5 eb5 d5 db5 c5 db5 c5 b4", C: "bb4 b4 bb4 a4 ab4 a4 ab4 g4",
  D: "gb4 g4 gb4 f4 e4 eb4 d4 db4", E: "c4 ~@2 f5 b5!2 ~ f5", F: "bb5@2 c6@2 ~@2 ab5@2 ~@2 f5 ~@5",
  G: "f5 gb5 ~ f5 eb5@2 e5@2 f5@2 ab5@4 ~@2", H: "f5 gb5 ~ f5 eb5@2 e5@2 f5@2 ab5@4 f5@2", I: "c6!2 ~ f5 b5!2 ~ f5",
  J: "~@7 f5", K: "ab5 bb5 b5 bb5", L: "ab5 f5 eb5 f5", M: "ab5 bb5 b5 eb6", N: "b5 bb5 ab5 f5", O: "b5 bb5 ab5 bb5",
  P: "f5 gb5 ~ f5 eb5@2 e5@2 f5@2 ab5@6", Q: "f5 ~@3", R: "f5@2 b4@2 ab4 b4 ~ eb5 gb5@2 b4@2 ab4 b4 ~ eb5",
  S: "g5@2 b4@2 ab4 b4 ~ eb5 ab5@8", T: "~@5 eb5@3", U: "[f5@3 gb5@3 g5@3 ab5@3 a5@2 b5@2]/2", V: "bb5@2 bb5!6",
  W: "bb5!8", X: "~ f6@2 f6 db6!2 c6!2", Y: "bb5!2 ab5!2 f5!2 eb5!2", Z: "c5!2 bb4!2 b4!2 bb4!2",
  AA: "[ab4!2 f4!2 ~ eb4 f4 c4@2 c4 eb4 c4 f4 c4 g4 c4]/2", AB: "eb4@2 c4@2 f4@2 c4@2 g4@2 ab4@4 bb4 c5",
  AC: "bb4 ab4 bb4@2 db5 c5 bb4 g4", AD: "bb4 g4 f4 e4 eb4@2 eb4 e4", AE: "g4 e4 c4 db4 c4 bb3 ab3 g3",
  AF: "d4 a3 b3 g3 c4 g3@2 eb4", AG: "c4 f4 c4 g4 c4 ab4 f4 bb4", AH: "f4 b4 f4 c5 f4 eb5 f4 f5",
  AI: "f4 ab5 f5 bb5 f5 b5 f5 c6", AJ: "[f5 eb6 f5 e6 f5 f6 f5 f6@5 ~@4]/2",
  AK: "f5 gb5 ~ e5 eb5@2 d5@2 ab5@2 g5@2 e5@2 f5@2",
})).s("gm_vibraphone").gain(0.4)

// other · piano
const piano = note(`<
  ~@12 A B C D ~@16 A B C D E F ~@2 G@2 H@2 I J I K L M N L O P Q R S T U V W X Y Z AA AB AC AD ~@32 A B C D ~ AE ~@12
  AF AG@2 AH@2 AI@2 ~ AJ AK AL ~@4 AM ~ AN ~ AO ~ AN AP AQ AR AQ ~ AS ~@2
>`.pickRestart({
  A: "bb4 b4 ~ bb4 c5 ~ bb4 db5", B: "~ bb4 d5 ~ bb4 eb5 ~ bb4", C: "e5 ~ bb4 f5 ~ bb4 gb5 ~",
  D: "f5 f5@3 eb5@2 db5@2 c5@2 bb4@2 ab4@2 f4@2, ~ g5 ~@14", E: "~@4 [g4,ab4]!2 ~@2",
  F: "[g4,ab4]@2 ~@4 [g4,ab4]@2 ~@2 [g4,ab4]@5 ~", G: "[[b5,c6]@6 [b5,c6]@8 c6@5 ~ c6@6 c6@5 ~]/2",
  H: "[~@14 f5@5 ~ eb5@4 ~@6 c5@2]/2", I: "f5 eb5 c5@2 f5 eb5 c5@2", J: "f5 eb5 c5 f5@2 f5 eb5 c5",
  K: "f5@2 eb5@2 c5@2 f5@4 c5@5 ~", L: "f5!2 [f4,c5]@2 f5!2 [f4,c5]@2, b4 ~ bb4 ~",
  M: "f5!2 [f4,c5]@2 f5!2 [f4,c5]@2, ab4 ~ bb4 ~", N: "b4@2 c5@5 ~ f5@2 f5@2 [f4,c5]@4, ~@2 c5 ~",
  O: "[ab4,c5] [f4,ab4]@2 f4 f4@2 f4@2", P: "db4 f4@2 ~@3 bb4 ab4, ~@6 f4@9 ~", Q: "g4 ab4 c5 eb5 g5@2 g4 ab4",
  R: "c5 eb5 g5@2 g4 ab4 c5 eb5", S: "g5!2 ~@2", T: "g5@2 ab5 g5@2 ab5@2 g5", U: "e5@2 g5@2 f5 c5 ~@2", V: "c5 ~",
  W: "~@2 bb4@4 f4 ab4, bb3 ~", X: "bb4@2 ~@2 f4 ab4 bb4@2", Y: "~@2 f4 ab4 bb4@2 ~@2", Z: "f4 ab4 bb4@2 ~@2 f4@2",
  AA: "ab4@2 ab4 f4 ~ f4 eb4 ~", AB: "eb4 c4 ~ c4 b3 bb3 f3 ~", AC: "f4!2 f4@2 eb4!2 eb4@2, bb3 ab3",
  AD: "f4!2 f4@2 [b3,f4] [bb3,f4] [f3,f4]@2, bb3 ~", AE: "[f4,ab4]!2", AF: "[f4,bb4]!2",
  AG: "[[f4,bb4]@6 [f4,bb4]@5 ~ [eb4,g4]@15 ~ [c4,f4]@4]/2", // Bb5 Eb F5
  AH: "[[c4,f4]@4 [c4,f4]@2 [c4,f4]@4 [c4,f4]@9 ~ [c4,f4]@4 [c4,f4]@8]/2", AI: "[~@8 [c4,f4]@6 [c4,f4]@5 ~@13]/2",
  AJ: "~@2 [db3,db4]@8 [db3,db4]@5 ~", AK: "[db3,db4]!2", AL: "c3 c4", AM: "[ab4,c5]!2", AN: "[f5,ab5]!2",
  AO: "[f5,bb5]!2", AP: "f5@15 ~", AQ: "c5@15 ~", AR: "f4@15 ~", AS: "db3@15 ~",
})).s("gm_piano").gain(0.3)

// bass · acoustic bass · "Contrabass"
const bass = note(`<
  ~@4 A B C@2 D A E F G ~@3 H I C@2 H J C A K L M N K L M O ~@4 A B C@2 ~@52 K L M N K L M O ~@4 H I C@2 ~@8 P Q R S
  ~@12 T ~ U ~ V ~ U ~@5 A B ~@2
>`.pickRestart({
  A: "f2 g2 ab2 bb2", B: "c3 bb2 ab2 g2", C: "f2 c2 db2 ab2", D: "f2 c2 db2 eb2", E: "c3 db3 d3 eb3",
  F: "db2 d2 eb2 e2", G: "f2 ~@3", H: "f2 ab2 g2 bb2", I: "ab2 g2 eb2 e2", J: "ab2 f2 g2 e2", K: "ab2 bb2 b2 bb2",
  L: "ab2 f2 eb2 f2", M: "ab2 bb2 b2 eb3", N: "b2 bb2 ab2 f2", O: "b2@4 bb2@4 ab2@4 bb2@3 ~", P: "db2 f2 ab2 bb2",
  Q: "db3 eb3 c3 db3", R: "bb2 c3 ab2 bb2", S: "g2 ab2 f2 g2", T: "c3@3 ~", U: "f2@3 ~", V: "bb2@3 ~",
})).s("gm_acoustic_bass").gain(0.3)

// drums · kick
const kick = s("bd").struct("<~@108 A B ~ B ~@4 A ~@15 A ~ A ~ A ~ A ~@8 C>".pickRestart({
  A: "x", B: "~@5 x ~@2", C: "~ x",
})).gain(0.3)

// drums · snare
const snare = s("sd").struct(`<
  ~@6 A@2 ~@2 A@2 ~@6 A@2 ~@18 A@2 ~@52 B ~ B C B ~ B@2 ~@6 A@2 ~ D E C F G H I ~@16 J E J E J E J E C B ~ K ~@3 C
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@2 x!2", C: "~ x", D: "x!5 ~@3", E: "x", F: "x ~@2 x!5", G: "x!6 ~@2", H: "x ~@2 x ~@2 x ~",
  I: "~ x ~@2 x ~@3", J: "~@3 x", K: "x!2 ~@2",
})).gain(0.3)

// drums · low tom
const low_tom = s("lt").struct("<~@6 A ~@3 A@2 ~@6 A ~@19 A ~@67 A ~ B ~@3 C D E F ~@32>".pickRestart({
  A: "~@7 x", B: "~@3 x ~@4", C: "~ x", D: "~@3 x", E: "~ x ~@2 x ~@2 x", F: "~ x ~@2",
})).gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<~@108 [~@7 x] ~@3 [~@3 x ~@4] ~@2 [~@3 x] ~@32>").gain(0.3)

// drums · open hat
const open_hat = s("oh").struct("<~@4 [x ~ x!3 ~ x!2]!104 ~@8 [x ~ x!3 ~ x!2]!30 ~@2>").gain(0.3)

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

// drums · crash
const crash = s("cr").struct("<~@68 x ~@47 x ~@31>").gain(0.4)

stack(
  alto_sax, tenor_sax, baritone_sax, trumpet, muted_trumpet, trombone, vibraphone, piano, bass, kick, snare, low_tom,
  mid_tom, open_hat, high_tom, crash
)