Strudelify

29 Settembre

Battisti

KeyE♭ majorTempo85 bpm
0:00/0:00
// 29 Settembre — Battisti
// 85 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 63 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(85/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.

// chords · piano
const piano = note("<A@4 B C@2 D@4 E F G H@5 ~@19 I J K@2 ~@21>".pickRestart({
  A: "[~@16 eb4@11 ~ f4 ~ d4 c4 bb3@10 ~@3 [ab4,c5]@3 [g4,bb4]@12 ~@4, ~@13 eb2@46 ~@5, ~@14 bb2@45 ~@5, ~@15 eb3@45 ~@4, ~@29 eb4@2 ~@33]/4", // Ab Gm
  B: "~@8 c5@2 ~@3 f3 ~ f4, bb2@7 ~, ~ f3@3 f4@8 bb3@3 ~, ~@2 bb3@3 bb4 f3 bb3@3 f3 bb4@5, ~@3 d4@11 d4@2",
  C: "[~@6 ab4 ~ bb4 ab3 ab4 ~@2 eb3 f4@2 [eb2,g4]@14 ~@2, ab2@6 g4 ~@9, ~ c4@29 ~@2, ~@2 eb3@3 eb4@10 ~@17, ~@3 ab3@4 eb3@4 ab3@3 ~@18]/2", // Eb
  D: "[~@15 bb3 bb3@2 ~@2 c5 bb3 ~ d4 ~@3 ab3 eb4 ~ c4 ~@6 bb2 ~@2 bb2 [d3,eb3] f3 g3 eb3 f3 g3 ab3 bb2@2 eb3@2 ~ bb2 ~@2 bb2 ~ bb4@2 g4 f4 eb4@2, ~@8 bb2@14 ~@2 ab2@4 ~@3 eb2@10 ~@3 eb2@18 ~@2, ~@9 f3@3 f4@2 f3@2 ~@3 f3@3 ~@4 eb3@2 ~@5 bb2@2 eb4@2 ~@15 eb4@3 g4@2 ~@7, ~@10 bb3@3 bb4@6 ~@3 bb4@2 ~@5 ab4@3 g4@4 bb3@2 ~ g3@3 ~@6 bb3@11 ~@5, ~@11 d4@7 d4@4 ~@3 c4@5 ~@4 eb3@3 ~ eb3@2 ~@14 eb3@2 ~ eb3@6 ~]/4", // Ebmaj7
  E: "~@5 bb4 ~@2 [bb4,d5]@6 ~@2, bb2@13 ~@3, ~ f3@3 f4@2 ~@10, ~ bb3@2 f3@3 ~@2, ~@3 d4@3 ~ bb3@6 ~@3", // Bb
  F: "~@5 eb4 ab4 c4 c5 ~ bb4 ~@3 ab3 c4, ~ ab2@14 ~, ~@2 eb3@13 ~, ~@3 ab3@9 ab4@4, ~@4 c4@3 ~@2 c4@2 c4@3 ~@2",
  G: "~@5 bb3 ~@2 [bb4,d5] ~ [ab4,c5] ~ [g4,bb4] f3 ~ f3, bb2@15 ~, ~ d4@2 bb4@2 ~@2 bb3@2 ~@2 bb3@4 ~, ~@2 f4@2 f3@2 f3@2 ~ f3@2 ~@3 [f4,ab4]@2", // Bb Ab Gm Fm
  H: "[~@5 ab4 ~@2 c5@6 ~@10 [ab5,c6]@4 g5@4 [f5,ab5]@4 eb5@4 [d5,f5]@4 eb5@3 ~ bb4@12 ~@5 eb3@8 ~@7, ab2@36 ~@27 eb2@9 ~@8, ~@2 [c4,eb4]@12 ~@14 bb5@2 ~@6 g5 ~@7 c5@16 ~@20, ~@2 eb3 ab3@15 ~@14 g3@4 ~@4, ~@7 eb3@29 ~@28 [bb3,eb4]@6 ~@10]/5", // Ab Fm Dm Cm Eb5
  I: "~@5 bb3 eb4 ~ g4@2 ~@5 eb3, ~ eb2@14 ~, ~@2 bb2@8 bb2@2 ~ bb2@2 ~, ~@3 eb3@8 ~ eb3@2 ~@2, ~@4 g3@2 ~@5 f4@2 ~ eb4@2",
  J: "~@3 f4 ~ ab3 ab4 ab3 bb4@3 ab4@2 g4 f4 eb4, db3, ~ ab3 db4@2 ~@4",
  K: "[d4@7 ~ [f4,bb4]@7 ~, ~@15 [bb2,f3,bb3,d4]@15 ~@2]/2", // Bb5 Bb
})).s("gm_piano").gain(0.24)

// bass · fretless bass
const bass = note(`<
  ~@11 A B C D@4 E F@4 G H I J I D@3 K H ~ D@2 L D H M I N O P O@2 Q R@4 S O C T U D@5 V ~
>`.pickRestart({
  A: "bb1@15 ~", B: "ab1", C: "bb1", D: "ab2 g2 f2 eb2", E: "bb2 ~",
  F: "[ab1@8 eb2@14 ~ bb1 eb2@14 ~ eb2 bb1@13 ~@2 bb1 ab1@8]/4", G: "eb2@14 ~ bb1", H: "eb2", I: "bb1@13 ~ bb1@2",
  J: "ab1@7 ~", K: "ab2 g2 f2 bb1", L: "ab2@4 g2@4 f2@4 eb2@3 ~", M: "db2@13 ~ d2 c2", N: "bb2@15 ~", O: "eb2@14 ~ eb2",
  P: "eb2@15 eb2", Q: "bb1@14 ~ bb1", R: "[ab1@6 ~ ab1 eb2@14 ~ eb2 eb2@14 ~ eb2 bb1@14 ~ bb1 ab1@7 ab1]/4",
  S: "eb2@15 bb1", T: "ab1@14 ~ ab1", U: "bb1@15 bb1", V: "ab2@3 ~ g2@4 f2@4 eb2@3 ~",
})).s("gm_fretless_bass").gain(0.3)

// chords · pad warm
const pad_warm = note(`<
  A@4 B C@4 D@2 E F E G@4 E H@4 I@2 E F E G@4 I@2 G@4 J K L@2 A@4 M N@4 I@2 E F E O@2 ~@5
>`.pickRestart({
  A: "[eb4,g4]/4", B: "[f4,bb4]", C: "[[eb4,ab4] [eb4,g4]@4 [f4,bb4]@2 [eb4,ab4]]/4", D: "[eb4,g4]/2", E: "[bb3,d4]",
  F: "[ab3,c4]", G: "[ab3,c4]/4", H: "[[ab3,c4] [bb3,eb4]@4 [bb3,d4]@2 [ab3,c4]]/4", I: "[bb3,eb4]/2", J: "[bb3,eb4]",
  K: "[db4,f4]", L: "[bb3,d4]/2", M: "[d4,f4]", N: "[[c4,eb4] [bb3,eb4]@4 [d4,f4]@2 [c4,eb4]]/4", O: "[ab3,c4]/2",
})).s("gm_pad_warm").gain(0.26)

// chords · synth brass 1
const synth_brass_1 = note("<~@16 A B ~@24 C D E@2 F G H I J K L M N M O P@3 Q R ~>".pickRestart({
  A: "eb5@2 c5@2 eb5@2 f5@2 g5@2 f5 eb5 f5 eb5 c5@2", B: "eb5@2 c5@2 eb5@2 f5@2 g5@2 f5 eb5 f5 eb5 ~@2",
  C: "~@2 [eb4,g4] ~ [eb4,g4] ~@2 [f4,ab4] ~ [f4,ab4] ~ [f4,ab4] [eb4,g4] ~@3", // Eb Fm Eb
  D: "~@3 [eb4,g4]!2 ~@2 f4 ~ [f4,ab4] ~ [f4,ab4] [eb4,g4] ~@3", // Eb Fm Eb
  E: "~@3 [eb4,g4]!2 ~@2 [f4,ab4] ~ [f4,ab4] ~ [f4,ab4] [eb4,g4] ~@3", // Eb Fm Eb
  F: "~@3 [d4,f4]!2 ~@2 [eb4,g4] ~ [eb4,g4] ~ [eb4,g4] [d4,f4] ~@3", // Dm Eb Dm
  G: "~@3 [c4,eb4]!2 ~@4 [eb4,g4] ~ [eb4,g4]!2 ~@2 [f4,ab4]", // Cm Eb Fm
  H: "~ [f4,ab4] ~ [f4,ab4] [eb4,g4] ~@6 [eb4,g4]!2 ~@2 [f4,ab4]", // Fm Eb Fm
  I: "~ [f4,ab4] ~ [f4,ab4] [eb4,g4] ~@6 [d4,f4]!2 ~@2 [eb4,g4]", J: "~ [eb4,g4] ~ [eb4,g4] [d4,f4] ~@6 [c4,eb4]!2 ~@3",
  K: "~ [eb4,g4] ~ [eb4,g4]!2 ~@2 [eb4,g4] ~ [f4,ab4] ~ [f4,ab4] [eb4,g4] ~@2 [eb4,g4]", // Eb Fm Eb
  L: "[eb4,g4] ~@2 [eb4,g4]!2 ~@2 [f4,ab4] ~ [f4,ab4] ~ [f4,ab4] [eb4,g4] ~@3", // Eb Fm Eb
  M: "[bb3,d4] ~@2 [bb3,d4]!2 ~@2 [c4,eb4] ~ [c4,eb4] ~ [c4,eb4] [bb3,d4] ~@3", // Bb Cm Bb
  N: "[ab3,c4] ~@2 [ab3,c4]!2 ~@4 [bb3,d4] ~ [bb3,d4] ~ [bb3,d4] [ab3,c4] ~", // Ab Bb Ab
  O: "[ab3,c4] ~@2 [ab3,c4]!2 ~@4 [ab3,c4] ~ [ab3,c4] [bb3,d4]!2 [ab3,c4] ~", // Ab Bb Ab
  P: "[ab3,c4] ~@2 [ab3,c4]!2 ~@4 [bb3,d4] ~ [ab3,c4] [bb3,d4]!2 [ab3,c4] ~", // Ab Bb Ab Bb Ab
  Q: "[ab3,c4] ~@2 [ab3,c4]!2 ~@4 [bb3,d4]@2 [ab3,c4] [bb3,d4]!2 [ab3,c4] ~", R: "[ab3,c4] ~@3 [ab3,c4] ~@11",
})).s("gm_synth_brass_1").gain(0.21)

// other · pizzicato strings
const pizzicato_strings = note("<~@4 A B ~ C D E ~@8 F G ~ C H E ~@32 I@3 J K L ~>".pickRestart({
  A: "bb3 ~@3 d4 ~@3 f4 ~@7", B: "ab4 ~@3 ab4 ~@3 g4 ~@7", C: "~@8 bb4 ~@3 d5 ~@3", D: "f5 ~@7 ab5 ~@5 ab5 ~",
  E: "g5 ~@15", F: "bb4@2 ~@2 d5 ~@3 f5 ~@7", G: "eb5 ~@3 ab5 ~@3 g5 ~@7", H: "f5 ~@7 eb5 ~@3 ab5 ~@3",
  I: "ab4 g4 f4 eb4", J: "ab5 g5 f5 eb5", K: "[ab4,ab5] [g4,g5] [f4,f5] [eb4,eb5]", L: "[ab4,ab5] [g4,g5] ~@2",
})).s("gm_pizzicato_strings").gain(0.21)

// other · pizzicato strings · soft notes · F Eb Ab G
const pizzicato_strings_soft = note("<~@61 [~@2 [f4,f5] [eb4,eb5]] [[ab4,ab5]@4 [g4,g5]@3 ~@9]>")
  .s("gm_pizzicato_strings").gain(0.12)

// other · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A B C@2 D E@4 B@2 F G H ~@4 I J K@3 L M N O P O Q@3 R ~ S@3 T@3 U ~@15 V W X Y Z@3
>`.pickRestart({
  A: "ab5@3 g5 ~@2 ab5@4 g5 ~ ab5 g5 f5 ~", B: "ab5@3 g5 ~@2 ab5@4 g5 ~ ab5 g5 f5 eb5",
  C: "ab5@3 g5 ~@2 ab5@4 g5@2 ab5 g5 f5 eb5", D: "d5",
  E: "[~@8 ab5@3 g5 ~@2 ab5@4 g5 ~ ab5 g5 f5 eb5 ab5@3 g5 ~@2 ab5@4 g5 ~ ab5 g5 f5 eb5 d5@12 ~@12]/4",
  F: "d5@12 ~@2 eb5 d5", G: "c5@3 ~", H: "[eb5,eb6] [d5,d6]", I: "bb5", J: "ab5@8 [g5,ab6]@3 g6 ~@2 ab6@2",
  K: "[~ g6 ~@2 ab6 g6 f6 eb6 ab6@3 g6 ~@2 ab6@4 g6 ~ ab6 g6 f6 eb6 d6@15 ~@9]/3",
  L: "ab6@3 g6 ~@2 ab6@4 g6 ~ ab6 g6 f6 eb6", M: "ab6@3 g6 ~@2 ab6@3 ~ g6 ~ ab6 g6 ab6 c7", N: "bb6@13 ~ c7 bb6",
  O: "ab6", P: "bb6@12 ~@2 c7 bb6", Q: "eb7 d7 c7 bb6", R: "g6", S: "eb6 d6 c6 bb5",
  T: "[eb6@4 d6@4 c6@4 bb5@23 ~@13]/3", U: "bb4",
  V: "eb4@7 f4 g4 [eb3,ab4,bb4] [f3,ab4,bb4] [g3,g4] [ab3,f4,ab4] [bb3,eb4] [c4,d4,g4] [c4,f4]", // Ebsus4 Bb7 G Db Eb5 Csus2 F5
  W: "~ eb3 f3 g3 ab3 bb3 ~ f4 [eb3,g4] [f3,ab4,g5] [g3,bb4,f5] [ab3,eb5] [c5,d5] [bb3,c5] bb4 [c4,c5], eb4@7 ~@9, bb3@5 ~@11", // Eb Fm Gm7 Ab5 Csus2 Bbsus2 C
  X: "~ c4 eb5 [c4,eb5] ~ [c4,f5] ~ c4 [c4,eb5] d5 bb3 [bb3,eb5]!2 ab3 f5 ab3, g4@5 ~@11, d5 ~@2 d5 ~@4", // Cm F5 Cm Eb5
  Y: "[ab3,d5] [bb3,eb5] ~ bb3 ~ c4 ~ bb3 ~ g5@2 f5 eb5 [bb3,d5] eb5 ab3, ~@2 f5@3 ~@2 c4@5 ~@4", // Abdim Eb5 Bb
  Z: "[g3 [g3,ab3] f3 [g3,eb5] ~ d5 ~ eb5 ~ bb3 ~ ab3 g3 [f3,g3,ab3,bb4] [g3,ab4] ~ g4@7 ~@2 f4 [bb3,eb4,f4,g4] ab3 f4 g4 ~ g4 g4@5 ~@11, f5@3 ~ ab3@4 c5@4 ~@3 ab3@10 ~@3 g3@7 ~@13]/3", // Abmaj7 Cm Gm7 Abmaj7 Eb
})).s("gm_acoustic_guitar_steel").gain(0.08)

// other · french horn
const french_horn = note("<A B C@2 D E@4 B@2 F G H@3 ~@2 I J K@3 L M N O P O Q@3 R ~ S@3 T@3 U ~@22>".pickRestart({
  A: "ab3@3 g3 ~@2 ab3@4 g3 ~ ab3 g3 f3 ~", B: "ab3@3 g3 ~@2 ab3@4 g3 ~ ab3 g3 f3 eb3",
  C: "ab3@3 g3 ~@2 ab3@4 g3@2 ab3 g3 f3 eb3", D: "d3",
  E: "[~@8 ab3@3 g3 ~@2 ab3@4 g3 ~ ab3 g3 f3 eb3 ab3@3 g3 ~@2 ab3@4 g3 ~ ab3 g3 f3 eb3 d3@12 ~@12]/4",
  F: "d3@12 ~@2 eb3 d3", G: "c3@3 ~", H: "[[eb3,eb4]@8 [d3,d4]@7 ~ c4@16 ~@16, ~@15 c3@19 ~@14]/3", I: "bb3",
  J: "ab3@8 [g3,ab4]@3 g4 ~@2 ab4@2", K: "[~ g4 ~@2 ab4 g4 f4 eb4 ab4@3 g4 ~@2 ab4@4 g4 ~ ab4 g4 f4 eb4 d4@15 ~@9]/3",
  L: "ab4@3 g4 ~@2 ab4@4 g4 ~ ab4 g4 f4 eb4", M: "ab4@3 g4 ~@2 ab4@3 ~ g4 ~ ab4 g4 ab4 c5", N: "bb4@13 ~ c5 bb4",
  O: "ab4", P: "bb4@12 ~@2 c5 bb4", Q: "eb5 d5 c5 bb4", R: "g4", S: "eb4 d4 c4 bb3",
  T: "[eb4@4 d4@4 c4@4 bb3@23 ~@13]/3", U: "bb2",
})).s("gm_french_horn").gain(0.26).pan(0.9)

// other · kalimba
const kalimba = note("<~@5 A B C D E F ~@7 B G H I J E K L ~@6 E F ~@3 M@2 N O P Q@2 R S T ~@5 U ~ V ~@8>".pickRestart({
  A: "~@8 eb3@2 ~ eb3 eb3@2 ~ eb3", B: "eb3@2 ~ eb3 eb3@3 eb3 eb3@3 eb3 eb3@2 ~ eb3",
  C: "eb3@2 ~ eb3 eb3@3 eb3 eb3@3 eb3 eb3@3 eb3", D: "eb3@3 ~@2 eb3 ~@2 eb3@2 ~ eb3 eb3@3 eb3",
  E: "eb3@2 ~ eb3 eb3@2 ~ eb3 eb3@2 ~ eb3 eb3@3 eb3", F: "eb3@2 ~ eb3 eb3@3 eb3 eb3@2 ~ eb3 eb3@3 eb3",
  G: "eb3@2 ~ eb3 eb3@2 ~ eb3 eb3@2 ~ eb3 eb3@2 ~ eb3", H: "eb3@3 eb3 eb3@3 eb3 eb3@2 ~ eb3 eb3@2 ~ eb3",
  I: "eb3@3 eb3 eb3@3 eb3 eb3@3 eb3 eb3@2 ~ eb3", J: "eb3@2 ~ eb3 eb3@3 ~@9",
  K: "eb3@2 ~ eb3 eb3@2 ~ eb3 eb3@3 eb3 eb3@3 eb3", L: "eb3@3 ~ eb3@3 ~ eb3@2 ~@6",
  M: "[~@15 eb3@3 ~ eb3 eb3@3 eb3 eb3@2 ~ eb3 eb3@3 eb3]/2", N: "eb3@3 eb3 eb3@2 ~ eb3 eb3@2 ~ eb3 eb3@2 ~ eb3",
  O: "eb3@2 ~ eb3 eb3@3 eb3 eb3@2 ~ eb3 eb3@3 ~", P: "eb3@3 ~ eb3 eb3@2 ~@9",
  Q: "eb3@2 ~ eb3 eb3@2 ~ eb3 eb3@2 ~ eb3!4 ~", R: "eb3@2 ~ eb3 eb3@3 eb3 eb3@3 eb3 eb3@2 eb3@2",
  S: "eb3@2 ~ eb3 eb3@2 ~ eb3 eb3@3 eb3 eb3@4", T: "eb3@5 ~@11", U: "eb3@3 eb3 eb3@2 ~ eb3 eb3@2 ~ eb3 eb3@3 eb3",
  V: "~@3 eb3 eb3@2 ~ eb3 eb3@2 ~ eb3 eb3@2 ~@2",
})).s("gm_kalimba").gain(0.09)

// other · agogo
const agogo = note("<~@5 A B C D E F ~@7 B G H I J E K L ~@6 E F ~@3 M@2 ~@3 N@2 O P Q ~@5 R ~ S ~@8>".pickRestart({
  A: "~@8 eb4@2 ~ eb4 eb4@2 ~ eb4", B: "eb4@2 ~ eb4 eb4@3 eb4 eb4@3 eb4 eb4@2 ~ eb4",
  C: "eb4@2 ~ eb4 eb4@3 eb4 eb4@3 eb4 eb4@3 eb4", D: "eb4@3 ~@2 eb4@2 ~ eb4@2 ~ eb4 eb4@3 eb4, ~@5 f4 ~@10",
  E: "eb4@2 ~ eb4 eb4@2 ~ eb4 eb4@2 ~ eb4 eb4@3 eb4", F: "eb4@2 ~ eb4 eb4@3 eb4 eb4@2 ~ eb4 eb4@3 eb4",
  G: "eb4@2 ~ eb4 eb4@2 ~ eb4 eb4@2 ~ eb4 eb4@2 ~ eb4", H: "eb4@3 eb4 eb4@3 eb4 eb4@2 ~ eb4 eb4@2 ~ eb4",
  I: "eb4@3 eb4 eb4@3 eb4 eb4@3 eb4 eb4@2 ~ eb4", J: "eb4@2 ~ eb4 eb4@3 ~@9",
  K: "eb4@2 ~ eb4 eb4@2 ~ eb4 eb4@3 eb4 eb4@3 eb4", L: "eb4@3 ~ eb4@3 ~ eb4@2 ~@6",
  M: "[~@15 eb4@3 ~ eb4 eb4@3 eb4 eb4@2 ~ eb4 eb4@3 eb4]/2", N: "eb4@2 ~ eb4 eb4@2 ~ eb4 eb4@2 ~ eb4!3 bb3@2",
  O: "eb4@2 ~ eb4 eb4@3 eb4 eb4@3 eb4 eb4@2 bb3@2", P: "eb4@2 ~ eb4 eb4@2 ~ eb4 eb4@3 eb4 eb4@4", Q: "eb4@5 ~@11",
  R: "eb4@3 eb4 eb4@2 ~ eb4 eb4@2 ~ eb4 eb4@3 eb4", S: "~@3 eb4 eb4@2 ~ eb4 eb4@2 ~ eb4 eb4@2 ~@2",
})).s("gm_agogo").gain(0.06)

// other · flute
const flute = note("<~@11 A B C D ~@18 E F ~@28>".pickRestart({
  A: "f5", B: "eb5", C: "f5@8 ab5@3 g5@3 bb5@2", D: "ab5@13 ~@3", E: "~@4 c6 bb5 ab5 g5", F: "c5@15 ~",
})).s("gm_flute").gain(0.26)

// drums · kick
const kick = s("bd").struct(`<
  ~@11 A@3 B@4 A C D@3 E A F A F B@4 A ~ B@4 A G F A E@5 H D@2 I E@2 A E@2 F@4 J K ~
>`.pickRestart({
  A: "x", B: "x!4", C: "x!2", D: "~@7 x!2 ~@7", E: "x ~@14 x", F: "x ~@6 x", G: "x ~@13 x!2", H: "x ~@6 x!2 ~@7",
  I: "~@7 x!2 ~@6 x", J: "x ~@12 x ~ x", K: "~@13 x ~ x",
})).gain(0.36)

// drums · snare
const snare = s("sd").struct(`<
  ~@25
  [~ x ~@2]!3
  [~@2 x ~@3 x!2]!4
  ~@2
  [~@2 x ~@3 x!2]!4
  ~@18
  [~@2 x ~@3 x!2]!6
  [~ x ~@2]
>`).gain(0.36)

// drums · hihat
const hihat = s("hh").struct("<~@25 [x!8]!7 [x!6 ~ x]!2 [~ x!7] [x!8]!4 ~@24>").gain(0.27)

// drums · open hat
const open_hat = s("oh").struct("<~@32 [~@3 x]!2 ~@29>").gain(0.27)

// drums · ride
const ride = s("rd").struct("<~@39 [~@15 x] ~@23>").gain(0.32)

// drums · tambourine
const tambourine = s("tb").struct("<~@42 [~ x ~ x ~ x ~ x]!19 ~@2>").gain(0.41)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@61 [~ x ~ x ~ x ~ x] ~>").gain(0.23)

// drums · splash
const splash = s("cr").struct("<~@11 A@6 B A ~@15 A C A@3 D A ~@22>".pickRestart({
  A: "x", B: "x ~@2 x", C: "~ x ~@6", D: "~@7 x",
})).gain(0.32)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ A B@2 ~ C B D ~ B@3 E B@4 F ~@24 B@2 E B@16 G ~>".pickRestart({
  A: "~@7 x", B: "~ x ~ x ~ x ~ x", C: "~@5 x ~ x", D: "~ x ~ x ~@4", E: "~ x ~ x ~ x!3", F: "~ x ~@6", G: "~@5 x ~@2",
})).gain(1.14)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  [~ x ~ x ~ x ~ x]
  [~ x ~ x ~ x ~@2]
  ~@15
  [~@3 x ~ x ~ x]
  ~@43
  [~ x ~ x ~@4]
  ~
>`).gain(0.68)

// drums · shaker
const shaker = s("sh").struct("<A B C D ~ E D F ~ G D H C D I D@2 J ~@24 D@2 C D K D@11 L M N O ~>".pickRestart({
  A: "~@4 x ~@3 x ~@3 x!2 ~@2", B: "x ~@2 x!2 ~@3 x ~@3 x!2 ~ x", C: "x!2 ~ x!2 ~@2 x!3 ~ x!3 ~ x",
  D: "x!2 ~ x!3 ~ x!3 ~ x!3 ~ x", E: "~@8 x!2 ~ x!3 ~ x", F: "x!2 ~ x!3 ~ x ~@8", G: "x!2 ~ x!3 ~ x!3 ~ x!3 ~@2",
  H: "~ x ~ x!3 ~ x!3 ~ x!3 ~ x", I: "~ x ~ x!3 ~@2 x!2 ~ x!3 ~ x", J: "x ~@3 x ~@2 x!3 ~ x!2 ~@2 x",
// … 16 more lines

More by Battisti