Strudelify

The Good, the Bad & The Ugly

Ennio Morricone

KeyE♭ majorTempo122 bpm
0:00/0:00
// The Good, the Bad & The Ugly — Morricone Ennio
// 122 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 2 "BASS" named as a bass, played on electric bass finger (its electric guitar jazz patch is not one)
// note: Full arrangement: all 85 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(122/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 · electric bass finger · "BASS"
const bass = note(`<
  A B A B C D E F G H I C J E K E F I H L C B M@2 N@2 O P Q R S T U V W X C B Y Z Y AA AB AC AD AE AF Y AG@2 AH@2 AI AJ
  AK AL AM AN AO AP AQ AK AB AR AB AS AT AU AV AW AD AX AY AB AZ AB BA BB BC BD BE AT BF BG@2
>`.pickRestart({
  A: "d2@4 ~@2 d2 ~ d2@3 ~@5", B: "d2 ~ d2@2 ~@2 d2 ~ d2@4 ~@4", C: "d2@4 ~@2 d2 ~ d2@4 ~@4",
  D: "g1 ~ g1@2 ~@2 g1 ~ g1@4 ~@4", E: "d2@4 ~@2 d2 ~ d2@5 ~@3", F: "c2 ~ c2@2 ~@2 c2 ~ c2@5 ~@3",
  G: "bb1@4 ~@2 bb1 ~ bb1@5 ~@3", H: "a1 ~ a1@2 ~@2 a1 ~ a1@5 ~@3", I: "bb1@4 ~@2 bb1 ~ bb1@4 ~@4",
  J: "d2 ~ d2@2 ~@2 d2 ~ d2@5 ~@3", K: "g1 ~ g1@2 ~@2 g1 ~ g1@5 ~@3", L: "bb1@4 ~@2 bb1 ~ bb1@3 ~@5",
  M: "[d2@5 ~ a1@24 ~@2]/2", N: "[bb1@5 ~ f1@23 ~@3]/2", O: "d2@2 ~ a1@5", P: "c2", Q: "a1@7 ~",
  R: "d2@5 ~ d2@2 g1@5 ~ g1 ~", S: "d2@5 ~ d2 ~ g1@5 ~@3", T: "d2@3 ~ g1@3 ~ d2@3 ~ g1@3 ~",
  U: "d2@4 c2@3 ~ b1@3 ~ a1@3 ~", V: "g1@3 ~ f1@3 ~ c2@3 ~ bb1@3 ~", W: "f1", X: "a1@15 ~",
  Y: "eb2@4 ~@2 eb2 ~ eb2@4 ~@4", Z: "eb2 ~ eb2@2 ~@2 eb2 ~ eb2@4 ~@4", AA: "ab1 ~ ab1@2 ~@2 ab1 ~ ab1@4 ~@4",
  AB: "eb2@4 ~@2 eb2 ~ eb2@5 ~@3", AC: "db2@4 ~@2 db2 ~ db2@5 ~@3", AD: "b1@4 ~@2 b1 ~ b1@5 ~@3",
  AE: "bb1 ~ bb1@2 ~@2 bb1 ~ bb1@6 ~@2", AF: "b1@4 ~@2 b1 ~ b1@4 ~@4", AG: "[eb1@4 ~@2 bb1@23 ~@3]/2",
  AH: "[b1@5 ~ gb1@23 ~@3]/2", AI: "eb2@6 bb1@9 ~", AJ: "db2@15 ~", AK: "bb1@13 ~@3",
  AL: "eb2@4 ~@2 eb2 ~ ab1@4 ~@2 ab1@2", AM: "eb2@4 ~@2 eb2@2 ab1@4 ~@2 ab1 ~", AN: "eb2@3 ~ ab1@3 ~ eb2@4 ab1@3 ~",
  AO: "eb2@3 ~ db2@3 ~ c2@4 bb1@3 ~", AP: "ab1@4 gb1@3 ~ db2@3 ~ b1@4", AQ: "gb1@7 ~",
  AR: "eb2 ~ eb2@2 ~@2 eb2 ~ eb2@7 ~", AS: "ab1 ~ ab1@2 ~@2 ab1 ~ ab1@6 ~@2", AT: "eb2@4 ~@2 eb2 ~ eb2@6 ~@2",
  AU: "db2 ~ db2@2 ~@2 db2 ~ db2@6 ~@2", AV: "b1@4 ~@2 b1 ~ b1@8", AW: "bb1 ~ bb1@2 ~@2 bb1 ~ bb1@5 ~@3",
  AX: "eb2@4 ~@2 eb2 ~ eb2@7 ~", AY: "b1@5 ~@3 ab1@6 ~@2", AZ: "b1@2 ~ b1 ab1@2 ~ ab1",
  BA: "b1@4 ~@2 b1 ~ ab1@4 ~@2 ab1@2", BB: "eb2@4 ~@2 eb2 ~ eb2 ~ eb2@3 ~ eb2 ~", BC: "b1@5 ~ b1@2 ab1@5 ~ ab1@2",
  BD: "eb1@5 ~ eb2 ~ eb2 ~ eb2@3 ~ eb2 ~", BE: "b1@5 ~ b1@2 ab1@4 ~@2 ab1@2", BF: "b1@5 ~ b1@2 ab1@8",
  BG: "[eb1@31 ~]/2",
})).s("gm_electric_bass_finger").gain(0.6)

// other · whistle
const whistle = note(`<
  ~@4 A B A C A D E F@2 A G H I A J E K ~@19 L M N O N P Q R ~@16 L M L O N S Q T Q U Q T V T Q T W R X Y@2
>`.pickRestart({
  A: "~@3 f5", B: "g5@4 d5@11 ~", C: "g5 c6@3", D: "e5@2 d5@2 c5@9 ~@3", E: "~@3 g5", F: "[d5@11 ~@5]/2",
  G: "g5@4 d5@9 ~@3", H: "~@12 f5@3 ~", I: "g5@4 c6@11 ~", J: "e5@2 d5@2 c5@11 ~", K: "d5", L: "~@3 gb5",
  M: "ab5@4 eb5@11 ~", N: "~@12 gb5@3 ~", O: "ab5 db6@3", P: "f5@2 eb5@2 db5@11 ~", Q: "~@3 ab5", R: "eb5@15 ~",
  S: "f5@2 eb5 ~ db5@10 ~@2", T: "eb5@13 ~@3", U: "eb5@5 ~@3", V: "~@12 bb5@3 ~", W: "~@3 bb5", X: "~@12 ab5@3 ~",
  Y: "[eb5@19 ~@13]/2",
})).s("gm_whistle").gain(0.4).pan(0.6)

// chords · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  A@5 B A C D E F A@3 G A C D E H A@2 I E J K I C E L M N O P Q R A@2 S@3 T S U V D W S X D Y Z AA U D AB AC AD AE AF AG
  AH S@2 AI T S U V D W S AJ S AJ S AK S AL S AL S AK AM@2
>`.pickRestart({
  A: "[d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~", // D5
  B: "[g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3]@2", // G5
  C: "[c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~", // C5
  D: "[bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~", // Bb5
  E: "[a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [a2,e3] ~", // A5
  F: "[bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~@7", // Bb5
  G: "[g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~", // G5
  H: "[bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~ [bb2,f3]@2 ~@6", // Bb5
  I: "[d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [a2,e3] ~ [a2,e3] ~", // D5 A5
  J: "[bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~", // Bb5 F5
  K: "[f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~ [f2,c3] ~", // F5
  L: "[d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~", // D5 G5
  M: "[d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,g3] ~ [d3,g3] ~ [d3,g3] ~ [d3,g3] ~", // D5 G5
  N: "[d3,gb3,a3] ~ [d3,a3] ~ [g2,d3] ~ [g2,d3] ~ [d3,a3] ~ [d3,a3] ~ [g2,d3] ~ [g2,d3] ~", // D D5 G5 D5 G5
  O: "[bb2,f3]@4 [a2,e3]@4 [g2,d3]@4 [f2,c3]@3 ~", P: "[e2,b2]@3 ~ [f2,c3]@3 ~ [c3,g3]@3 ~ [bb2,f3]@3 ~",
  Q: "c3@9 ~@7, f2@7 ~@9", R: "[a2,e3]@5 ~@3",
  S: "[eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~", // Eb5
  T: "[ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~", // Ab5
  U: "[db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~ [db3,ab3] ~", // Db5
  V: "[b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~", // B5
  W: "[b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~@7", // B5
  X: "[eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [bb2,f3]@5 ~ [bb2,f3] ~ [bb2,f3] ~", // Eb5 Bb5
  Y: "[b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~", // B5 Gb5
  Z: "[gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~ [gb2,db3] ~", // Gb5
  AA: "[eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~ [bb2,f3] ~", // Eb5 Bb5
  AB: "[eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~", // Eb5 Ab5
  AC: "[eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ eb3 ~", // Eb5 Ab5
  AD: "[eb3,bb3] ~ [eb3,bb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [ab2,eb3] ~ [ab2,eb3] ~", // Eb5 Ab5 Eb5 Ab5
  AE: "[b2,gb3]@3 ~ [bb2,f3]@3 ~ [ab2,eb3]@4 [gb2,db3]@3 ~", AF: "[f2,c3]@3 ~ [gb2,db3]@3 ~ [db3,ab3]@3 ~ [b2,gb3]@3 ~",
  AG: "[gb2,db3]@13 ~@3", AH: "[bb2,f3]@3 ~",
  AI: "[eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3] ~ [eb3,bb3]@2 [eb3,bb3] ~ [eb3,bb3] ~", // Eb5
  AJ: "[b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3]@2", // B5 Ab5
  AK: "[b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~", // B5 Ab5
  AL: "[b2,gb3] ~ [b2,gb3] ~ [b2,gb3] ~ [b2,gb3]@2 [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3] ~ [ab2,eb3]@2", // B5 Ab5
  AM: "[[eb3,bb3]@23 ~@9]/2", // Eb5
})).s("gm_electric_guitar_muted").gain(0.4).pan(0.3)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  ~@21 A B@4 C D E F G@2 H I J K L@2 ~@9 M N@2 O@2 P Q R S@2 T U V K W X@2 ~@21
>`.pickRestart({
  A: "~@7 a3", B: "[d4 a3 f3 c4@11 ~ a3]/2", C: "d4 a3 f3 c4 ~ e4 ~ c4", D: "g4", E: "a4@15 ~",
  F: "f4 e4 d4@6 g4@6 d4@2", G: "[f4 e4 d4@6 g4@6 d4@2 f4 e4 d4@2 g4@2 d4@2 f4 e4 d4@2 g4@2 d4@2, ~@7 g4@3 ~@6]/2",
  H: "f4 d4 e4 c4 d4 b3 c4 a3", I: "b3@2 g3@2 a3@2 f3@2 g3 f3 e3@2 f3@2 d3 ~", J: "c3", K: "db3", L: "[d3@3 ~]/2",
  M: "~@7 bb3", N: "[eb4@2 bb3@2 gb3@2 db4@23 ~ bb3@2]/2", O: "[eb4 bb3 gb3 db4@11 ~ bb3]/2",
  P: "eb4 bb3 gb3 db4 ~ f4 ~ db4", Q: "ab4", R: "bb4@15 ~", S: "gb4 f4 eb4@6 ab4@6 eb4@2",
  T: "gb4 f4 eb4@2 ab4@2 eb4@2 gb4 f4 eb4@2 ab4@2 eb4@2", U: "gb4 eb4 f4 db4 eb4 c4 db4 bb3",
  V: "c4@2 ab3@2 bb3@2 gb3 ~ ab3 gb3 f3@2 gb3@2 eb3 ~", W: "d3", X: "eb3/2",
})).s("gm_overdriven_guitar").gain(0.5).pan(0.7)

// other · harmonica
const harmonica = note(`<
  ~@13 A B C D A E F G@2 ~@18 H I H J H K L M ~@16 H N H O H P L Q ~@2 R M ~@2 L Q ~@2 L S@2
>`.pickRestart({
  A: "~@3 f4", B: "g4@2 d4@5 ~", C: "~@12 f4@3 ~", D: "g4@4 c5@11 ~", E: "e4@2 d4@2 c4@9 ~@3", F: "~@3 g4",
  G: "[d4@23 ~@9]/2", H: "~@3 gb4", I: "ab4 eb4@3", J: "ab4 db5@3", K: "f4 eb4 db4@6", L: "~@3 ab4", M: "eb4@7 ~",
  N: "ab4@4 eb4@11 ~", O: "ab4@4 db5@11 ~", P: "f4@2 eb4@2 db4@9 ~@3, gb4 ~@15", Q: "eb4", R: "~@12 ab4@3 ~",
  S: "[eb4@15 ~]/2",
})).s("gm_harmonica").gain(0.45).pan(0.7)

// other · trumpet
const trumpet = note("<~@33 A B C D E F G ~@45>".pickRestart({
  A: "~@4 [d4,d5] ~@7 [d4,d5] ~@3", B: "[c4,c5]", C: "[db4,db5]@7 ~", D: "~@2 f4!2 d4 ~ f4 ~ f4!3 ~ d4 ~ g4 ~",
  E: "d4!2 f4 ~ f4 ~ d4 ~ g4!3 ~ d4 ~ f4 ~", F: "~@2 eb4!3 ~ gb4 ~ gb4 ~ eb4!3 ~ ab4 ~",
  G: "eb4!2 gb4 ~ gb4 ~ ab4 ~ ab4@3 ~ bb4 ~ bb4@2",
})).s("gm_trumpet").gain(0.6).pan(0.7)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@28 A@2 B C D E F G H ~@3 I J I K I L M N ~@5 O@5 P Q R S@2 ~@9 T@2 U@2 V@2 W@2 X@2 Y@3
>`.pickRestart({
  A: "[[c4,e4]@16 [d4,f4]@8 [b3,d4,g4]@7 ~, a4@23 ~@9]/2", B: "[d4,f4,a4]@8 [b3,d4,g4]@7 ~",
  C: "[d4,f4,a4]@3 ~ [b3,d4,g4]@4 [d4,f4,a4]@3 ~ [b3,d4,g4]@2 ~@2", // Dm G Dm G
  D: "[d4,f4,bb4]@3 ~ [c4,e4,a4]@3 ~ [b3,d4,g4]@3 ~ [a3,c4,f4]@2 ~@2", // Bb Am G F
  E: "[b3,e4,g4]@3 ~ [a3,c4,f4]@3 ~ [c4,e4,g4]@3 ~@2 d4@2 ~, ~@6 [bb3,f4] ~", F: "[c4,f4,a4,c5]@15 ~",
  G: "db5!2 a4 [a4,db5] db5 a4 [a4,db5] db5 a4 db5 a4 [a4,db5] db5 a4 db5 ~, [a3,db4,e4], a4 ~@7", // A
  H: "[d4,f4,d5]@9 ~@7, a4 ~@3", I: "~@3 [gb4,gb5]", J: "[ab4,ab5] [eb4,eb5]@3", K: "[ab4,ab5]@4 [db5,db6]@11 ~",
  L: "[f4,f5]@2 [eb4,eb5]@2 [db4,db5]@11 ~", M: "~@3 [ab4,ab5]", N: "[eb4,eb5]",
  O: "[~@4 db5@4 f5@4 ab5@4 bb5@16 eb6@47 ~, [db4,f4]@30 ~@2 eb4@45 ~@3, ab4@15 ~ bb4@27 ~@37, ~@32 gb4@11 ~@37]/5", // Db
  P: "[eb5,eb6]@4 [ab5,ab6] ~@3 [eb5,eb6]@4 [ab5,ab6] ~@3", Q: "[ab5,ab6]@4 [gb5,gb6]@3 ~ [f5,f6]@4 [eb5,eb6]@3 ~",
  R: "[db5,db6]@15 ~", // Db
  S: "[[d5,d6] [eb5,eb6] [d5,d6,eb6] [eb5,d6] [d5,eb5,d6,eb6] [d5,eb6] [eb5,d6] [d5,d6,eb6] [eb5,eb6] [d5,d6] [eb5,d6,eb6] [d5,d6,eb6] [eb5,eb6] [d5,eb5,d6] [d6,eb6] [eb5,eb6] d6 eb5@3 ~@12, ~@15 d5@2 ~@15, ~@4 eb6 ~@3]/2", // D Eb Ebmaj7 Eb D Ebmaj7 Eb Ebmaj7 …
  T: "[gb5@8 ab5@8 [gb5,bb5]@3 ~@13, eb5@9 ~@7, b4@15 ~@17]/2", // Gb
  U: "[gb5@2 ab5@2 [bb4,gb5] ~@3, eb5@5 ~@3, b4@15 ~@17]/2", // Ebm
  V: "[gb5@8 ab5@8 [bb4,gb5,bb5]@3 ~@13, eb5@9 ~@7, b4@7 ~@9]/2", // Ebm
  W: "[gb5@8 ab5@8 [bb4,gb5]@3 ~@13, eb5@19 ~@13, b4@15 ~@17]/2", // Ebm
  X: "[gb5@2 ab5@2 [bb4,gb5,bb5] ~@3, eb5@19 ~@13, b4@7 ~@9]/2", // Ebm
  Y: "[gb5@7 ~ ab5@7 ~ eb4@26 ~@6, eb5@2 ~, b4@7 ~ gb4@10 ~@6]/3",
})).s("gm_string_ensemble_1").gain(0.3)

// drums · kick
const kick = s("bd").struct("<A@22 B C B D B E C A@2 F G@2 H@2 A@12 B C B I B E C J@2 F G@2 H@2 A@21 ~@2>".pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x ~@2 x ~@4", C: "x ~@3 x!2 ~@2", D: "x ~@3 x!2 ~ x", E: "x!2 ~ x!2 ~@3", F: "x!2", G: "x!4",
  H: "x", I: "x!2 ~@2 x ~@3", J: "x ~@3 x ~@2 x",
})).gain(0.8)

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

// drums · low tom
const low_tom = s("lt").struct("<~@21 [~@15 x] ~@17 [~@7 x] ~@7 [~@14 x!2] ~@37>").gain(0.64)

// drums · hihat
const hihat = s("hh").struct(`<
  A B A C A@4 B A D B E A@5 C D F D A@12 G@2 B C B H A@6 D@2 A@12 G@2 B A@7 D A@12 ~@2
>`.pickRestart({
  A: "x!8", B: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2", C: "x ~ x ~ x ~ x ~ x ~ x!3 ~ x ~", D: "x!5 ~@3",
  E: "x ~ x ~ x ~ x ~ x ~ x ~ x!3 ~", F: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x ~", G: "x", H: "x!3 ~ x ~ x ~ x ~ x ~ x ~ x ~",
})).gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct("<~@21 [~@7 x] ~@17 [~@3 x] ~@7 [~@3 x] ~@37>").gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<~@21 [~@12 x!2 ~@2] ~@17 [~@5 x ~@2] ~@7 [~@5 x ~@2] ~@37>").gain(0.72)

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

stack(
  bass, whistle, electric_guitar_muted, overdriven_guitar, harmonica, trumpet, string_ensemble_1, kick, snare, low_tom,
  hihat, mid_tom, high_tom, crash
)

More by Ennio Morricone