Strudelify

Vento nel vento

Battisti

KeyE♭ majorTempo61 bpm
0:00/0:00
// Vento nel vento — Battisti
// 61 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: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 52 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(61/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 · drawbar organ
const drawbar_organ = note("<~@9 A@8 B@3 C@2 D ~@22 E F@2 ~@4>".pickRestart({
  A: "[[g4,c5,eb5]@16 [g4,bb4,eb5]@15 [f4,bb4,d5]@16 [g4,c5,eb5]@16 [ab4,c5,eb5]@24 [f4,bb4,d5]@7 [g4,bb4,eb5]@16 [g4,c5,eb5]@16 [g4,bb4,eb5]@16 [g4,c5,eb5]@15 [ab4,db5,f5]@16 [f4,bb4,d5]@14 ~@2 [g4,bb4,eb5]@31 [a4,c5,f5]@15 [f4,b4,d5]@15 ~ [g4,c5,eb5]@5]/8", // Cm Eb Bb Cm Ab Bb Eb Cm …
  B: "[~@10 [f4,bb4,d5]@15 ~ [g4,c5,eb5]@15 [f4,bb4,d5]@15 ~ [g4,bb4,eb5]@15 [a4,c5,f5]@8 [f4,b4,d5]@8 [g4,c5,eb5]@8]/3", // Bb Cm Bb Eb F Bdim Cm
  C: "[[g4,bb4,eb5]@8 [g4,c5,eb5]@8 [g4,c5,eb5]@8 [g4,bb4,eb5]@15 [f4,bb4,d5]@14 ~@2 [g4,c5,eb5]@2 ~ [f4,bb4,d5]@4 ~@2]/2", // Eb Cm Eb Bb Cm Bb
  D: "~ [g4,c5,eb5]@13 ~@2", E: "~@12 c5 ~@3", F: "[~@25 [c5,eb5,g5]@21 ~@18]/2",
})).s("gm_drawbar_organ").gain(0.07)

// chords · piano
const piano = note("<~ A B A C D E F G H@8 I@3 J@2 K L@2 M@5 N O@2 P@5 Q@6 R S@3 T@4>".pickRestart({
  A: "c3 g2", B: "ab2 eb2", C: "f2@7 ~@7 bb4@2, ~@15 ab4@17, ~@2 c5!2, ~@9 d5@2 d5@5, ~@5 eb5@3",
  D: "[g4,c5,eb5]@8 [g4,c5,eb5]@7 ~ [bb4,d5]@8 d5@7 ~, [c3,c4]@7 ~@9", // Cm Bb C
  E: "[c5,eb5]@4 [g4,c5,eb5]@4 bb4@2 ~@3 eb5@3, ~ eb4, ~@8 eb5@5 ~@3, ~@16 g4 ~@3 g4@11 ~, ~@11 bb4@5", // Cm
  F: "[g4,c5,eb5]@8 g4@4 g4@3 ~ [f4,bb4,d5]@8 [f4,bb4,d5]@8, [c3,c4]@15 ~ g3@16, ~ [c5,eb5] ~@2", // Cm Bb C Cm
  G: "[eb4,ab4,c5]@8 c5@8 [g2,b4,d5]@8 ~@4 f4@3 ~, [f2,f3]@16 g3@15 ~, ~@24 [b4,d5]@7 ~, ~@6 f4 ~, ~@26 g2@5 ~", // Ab G F Bm
  H: "[[c5,eb5]@8 g4@4 g4@3 ~ [bb4,eb5]@8 [bb4,eb5]@7 [bb4,d5]@8 f4@4 f4@4 [g4,c5]@4 ~@2 c5@4 ~@4 c5@2 ab4@4 ab4@4 [c5,eb5]@8 ab4@4 ab4@3 ~@5 f4@3 g4@4 g4@4 g4@4 g4@3 ~ g4@4 g4@4 g4@4 g4@2 ~@2 g4@4 g4@4 g4@4 g4@3 ~ g4@4 g4@4 g4@3 g4@4 ab4@4 ab4@4 [ab4,db5,f5]@4 ab4@2 ~@2 [f4,bb4]@6 ~@2 f4@2 ~@2 bb4@2 f4 ~ g4@4 g4@4 g4@4 g4@3 [g4,bb4,eb5]@2 [g4,bb4,eb5]@2 [g4,bb4,eb5]@2 [g4,bb4,eb5]@2 ~@4 [eb4,g4,bb4,eb5]@4 [a4,c5,f5]@4 [a4,c5,f5]@4 [a4,c5,f5]@4 ~@3 [f4,b4,d5]@4 [f4,b4,d5]@4 [f4,b4,d5]@4 [f4,b4,d5]@3 ~ [c3,c4,g4,c5,eb5]@4 g4, g4@4 ~@4 [c5,eb5]@7 ~ eb4@15 f4@4 ~@4 [bb4,d5]@8 eb5@10 eb5@6 [c5,eb5]@8 ~@8 [c5,eb5]@7 ~@3 bb4@5 [bb4,eb5]@8 [bb4,eb5]@7 ~ [c5,eb5]@8 [c5,eb5]@7 ~ [bb4,eb5]@8 [bb4,eb5]@7 ~ [c5,eb5]@8 [c5,eb5]@8 ~@21 bb4@6 ~@4 [bb4,eb5]@8 [bb4,eb5]@7 ~@28 [a4,c5,f5]@3 ~@21, ~@16 g4@4 ~@4 g4@4 ~@3 [d3,d4]@15 ~ [c3,c4]@15 ~ [f2,f3]@23 ~ [bb2,bb3,d5]@8 ~@15 [c3,c4]@15 ~ bb3@15 ~@16 [db5,f5]@8 ~@8 d5@10 [f4,d5]@5 ~@24 [g4,bb4,eb5]@4 ~@17 g2@17 ~@6, ~@51 g4@4 ~@4 g4@4 ~@8 ab4@4 ~@19 [eb3,eb4]@15 ~@15 bb2@17 ~ [c3,c4]@15 [db3,db4]@15 ~ [bb2,bb3]@15 ~ [eb3,eb4]@15 ~@10 eb3@6 [d3,d4]@15 g3@15 ~@6]/8", // Cm Eb5 Bb C5 Cm Db Bb5 Eb …
  I: "[~@3 g4@3 g4@4 f4@4 f4@4 [f4,bb4,d5]@4 [f4,bb4,d5]@2 ~@6 g4@4 g4@3 g4@2 ~@2 f4@4 f4@4 f4@2 [f4,d5]@2 [f4,bb4,d5]@3 ~ [bb4,eb5]@8 g4@3 g4@3 ~ a4@4 a4@4 f4@4 f4@4 g4@4 g4@4, ~@3 [c5,eb5]@7 [g2,g3]@15 ~ ab3@15 bb3@15 ~ [eb3,eb4]@15 [d3,d4,c5,f5]@7 ~ [g2,g3,b4,d5]@8 [c3,c4,c5,eb5]@8, ~@10 [bb4,d5]@8 ~@6 g4@6 ~@9 bb2@8 ~@2 bb4@4 ~@4 g4@4 ~@35, ~@26 [c5,eb5]@8 [c5,eb5]@7 [bb4,d5]@10 ~@14 [bb4,eb5]@7 ~@24]/3", // Bb Dm Bb Eb5 Cm G Eb Dm7 …
  J: "[g4@4 g4@4 g4@4 g4@2 g4@2 g4 ~@3 eb4@4 g4@3 g4@4 g4@4 ~@4 [bb4,d5]@8 f4@4 f4@3 ~ [c3,c4,c5,eb5]@3 [bb2,bb3,f4,bb4,d5]@4 ~@2, [bb2,bb3,bb4,eb5]@8 [a2,a3,c5,eb5]@8 [ab2,ab3,c5,eb5]@8 [eb3,eb4]@13 bb2@17 ~@10, ~@18 bb4@6 [bb4,eb5]@7 [bb4,eb5]@8 f4@4 ~@4 [bb4,d5]@7 ~ g4 ~@8, ~@35 g4@4 bb3@15 ~@10]/2", // Bb Cm Bb Eb5 Adim Ab Eb Eb5 …
  K: "~ [ab2,ab3,g4,c5,eb5]@8 ~@7", // Abmaj7
  L: "[~@21 [g4,bb4,eb5]@8 ~@3 g4@3 ~ [f4,bb4,d5]@8 f4@3 f4@3 ~ [g4,c5,eb5]@8 [c5,eb5]@5, ~@21 eb4@14 ~@16 c4@13, ~@29 [bb4,eb5]@7 ~@8 [bb4,d5]@7 ~@13, ~@29 g4@3 ~@27 g4@3 ~@2, ~@30 eb3@6 g3@13 ~@15]/2", // Eb Bb Cm Eb5 Bb
  M: "[c4@2 [f4,bb4,d5]@8 f4@3 f4@3 ~ [ab3,c5,eb5]@61 [ab4,b4]@7 b4@4 [ab4,b4]@3 [ab4,b4,e5]@4 [ab4,b4,e5]@3 [ab4,b4,e5]@4 [ab4,b4,e5]@2 ~@2 [f4,bb4,d5]@3 [f4,bb4,d5] ~@3 [f4,bb4,d5] ~@2 [f4,bb4,d5] ~@3 [f4,bb4,d5] ~@3 [f4,bb4,d5] ~@2 [f4,d5] ~@3 [f4,bb4,d5] ~@2 [bb4,db5,gb5]@2 ~@2 [bb4,db5,gb5] ~@2 [bb4,db5] ~@3 [bb4,db5,gb5] ~@3 [bb4,db5,gb5] ~@2 [bb4,db5,gb5] ~@3 [bb4,db5] ~@2, ~@2 g3@64 ~@12 e5@11 ~@39 bb4@2 ~@12 gb5@2 ~@13 gb5@2 ~, ~@10 [bb4,d5]@7 g4 ~@60 e4@27 ~@2 g3@26 ~@2 gb3@25]/5", // Bb Ab Abm E Bb Dm Bb Gb …
  N: "[bb4,db5,gb5]@2 gb3@2 [c5,e5]@3 ~ [g4,c5,e5] ~@2 [g4,c5,e5] ~@3 [g4,c5,e5]@2 ~ [g4,c5,e5]@2 ~@2 [g4,c5,e5] ~@3 [g4,c5,e5] ~@2 [g4,c5,e5] ~@2, ~@2 a3@7 a3@6 ~, ~@4 g4 ~@27", // Gb C
  O: "[~ [ab4,c5,f5]@3 [ab4,c5,f5]@3 ~ [c5,f5]@2 ~ [ab4,c5] ~@3 [ab4,c5] ~@3 [ab4,c5] ~@3 [ab4,c5] ~@3 [ab4,c5,f5]@4 [e4,ab4,b4,e5]@27 ~@6, ~ db4@26 ~@37, ~@8 ab4 ~@2 f5@2 ~@2 f5@2 ~@2 f5@2 ~@2 f5@2 ~@39]/2", // Fm F5 Ab Fm E
  P: "[~@29 [a4,d5]@8 ~ [c5,eb5]@7 g4@4 g4@3 ~ [bb4,eb5]@8 [bb4,eb5]@7 [bb4,d5]@8 f4@4 f4@3 ~ g4@3 ~@2 c5@4 ~@2 g4@2 c5@2 ab4@4 ab4@3 [c5,eb5]@8 ab4@4 ab4@3 ~@5 f4@3 g4@4 g4@4 g4@4 g4@3 ~ g4@3 g4@4 [g4,c5,eb5]@4 g4@3 ~, ~ g2@36 ~@50 g4@4 ~@15 ab4@4 ~@14 bb4@5 [bb4,eb5]@8 [bb4,eb5]@7 ~@16, ~@2 [g3,b4]@36 ~@46 c5@5 ~@10 [c5,eb5]@7 ~@8 [c5,eb5]@7 ~@24 [c5,eb5]@7 ~@8, ~@2 a4@27 ~@16 [c5,eb5]@7 ~ g4@4 ~@4 g4@4 ~@3 f4@4 ~@4 [bb4,d5]@7 ~ eb5@9 eb5@5 ~@62, ~@9 g4@28 ~ g4@4 ~@11 eb4@15 d4@15 ~ c4@15 f3@22 ~ [bb3,d5]@7 eb4@15 ~ c4@14 ~]/5", // D5 Cm Eb5 Bb Cm Eb5 G Cm …
  Q: "[g4@4 g4@3 g4@4 g4@3 ~ g4@4 g4@4 g4@4 g4@3 ab4@4 ab4@4 [ab4,db5,f5]@4 ab4@2 ~@2 bb4@5 ~@2 f4@2 ~@2 bb4@2 f4 ~ g4@4 g4@3 g4@4 g4@4 [g4,bb4,eb5] [g4,bb4,eb5]@2 [g4,bb4,eb5]@2 [g4,bb4,eb5]@2 [g4,bb4,eb5]@4 [eb4,g4,bb4,eb5]@3 [a4,c5,f5]@4 [a4,c5,f5]@4 [a4,c5,f5]@4 [a4,c5,f5]@3 [f4,b4,d5]@4 [f4,b4,d5]@4 [f4,b4,d5]@3 [f4,b4,d5]@3 ~ g4@4 g4@3 g4@4 g4@3 ~ f4@3 f4@4 [f4,bb4,d5]@4 [f4,bb4,d5]@2 ~@5 g4@4 g4@4 g4@3 f4@4 f4@4 [f4,bb4]@2 [f4,d5] [f4,bb4,d5]@3 ~ [bb4,eb5]@7 ~ g4@3 g4@2, bb3@14 ~ c4@15 db4@13 ~@3 bb3@14 ~@45 g3@14 ~@16 g3@14 ~ ab3@14 bb3@14 ~@14, [bb4,eb5]@7 [bb4,eb5]@7 ~ [c5,eb5]@8 [c5,eb5]@7 [db5,f5]@8 ~@8 d5@9 [f4,d5]@5 ~ eb4@15 ~@14 d4@14 ~@16 c4@15 ~@15 [c5,eb5]@7 [c5,eb5]@7 [bb4,d5]@9 ~@6 g4@4 ~@4 [bb4,eb5]@5, ~@46 f4@3 ~@2 bb4@6 ~@4 [bb4,eb5]@7 [bb4,eb5]@7 ~@45 [c5,eb5]@7 [c5,eb5]@7 ~ [bb4,d5]@7 ~@6 g4@5 ~@26 eb4@13]/6", // Db Eb F Bdim Bb Bb5 Dm Bb …
  R: "~@2 a4@4 a4@3 f4@4 f4@4 g4@3 g4@4 g4@4 g4@3 ~, ~@2 [d4,c5,f5]@7 [g3,b4,d5]@7 ~ [c4,c5,eb5]@7 [bb2,bb3,bb4,eb5]@7 ~", // Dm7 G Cm Eb5
  S: "[g4@3 g4@2 g4@2 g4 ~@4 eb4@4 g4@4 g4@4 g4@3 g4@4 [bb4,d5]@7 f4@4 f4@3 ~ [c4,c5,eb5]@3 [bb3,f4,bb4,d5]@3 ~@5 [g4,c5,eb5]@16 ~@23, [a3,c5]@8 ~ bb4@7 eb4@15 bb3@14 ~@12 ab3@13 ~@26, eb5@5 ~@2 [ab3,c5,eb5]@9 [bb4,eb5]@7 ~ [bb4,eb5]@7 f4@4 ~@3 [bb4,d5]@7 ~ g4 ~@49]/3", // Bb Cm Bb Cm Am Ab Eb5 Bb
  T: "[~@13 eb5@34 eb5@58 ~@23, ~@12 bb4@35 ~@81]/4",
})).s("gm_piano").gain(0.27)

// chords · piano · soft notes
const piano_soft = note(`<
  ~@4 A B C D E F G H ~@2 I J K@2 L ~ M N ~@2 O ~@2 P ~ Q ~ R ~ S T U@2 ~@2 I V ~ W X ~ Y Z ~ AA@4
>`.pickRestart({
  A: "~@14 [f2,f3,f4]@17 ~", B: "~@15 f4@9 [f4,bb4]@7 ~, ~@15 [g2,g3]@16 ~, ~@15 d5 ~@16",
  C: "[ab2,ab3]@15 ~ eb3@16, g4 ~@15", D: "~@15 g2@17", E: "~ [eb4,ab4] f4 ~", F: "~ g4 ~@3 g4 ~ g4, [c3,c4]@7 eb3@9",
  G: "~@3 f4@4 ~@16 g4@4 c5@2 ~@3", H: "~@11 ab4@4 ~@17", I: "~@17 f4@4 ~@11", J: "~@3 eb4@3 ~@2, ~@5 eb3@6 ~@5",
  K: "[~@31 c3@11 ~@14 eb5 ~@7]/2", L: "~@15 bb2@9 ~@5 g4@3", M: "~@7 eb5 ~@8", N: "~@11 f4@4 ~@17",
  O: "~@2 bb4 ~@14 g3@2 ~@11 g4@2", P: "~@21 ab4@4 e5@3 ~@4", Q: "~@5 g3@3 ~@24", R: "~@29 db4@2 ~",
  S: "~@2 d5@2 d5@25 ~@3, ~@2 g4@7 ~@23", T: "~@10 g4@3 ~@12 g4@4 ~@3, ~@3 c4@7 ~@6",
  U: "[~ g4@4 ~@3 f4@4 ~@15 g4@4 c5@2 ~@13 ab4@4 ~@14]/2", V: "~@12 eb4@11 ~@9", W: "~@20 eb5 ~@11", X: "~@23 g4@4 ~@5",
  Y: "~@5 eb5@2 ~@25", Z: "~@3 f4@3 ~@26",
  AA: "[~@12 eb3@17 ~@18 g4@20 g4@38 ~@23, ~@12 g4@34 ~ bb4@58 ~@23, ~@15 [eb2,eb3]@32 ~@17]/4", // Eb
})).s("gm_piano").gain(0.13)

// bass · fretless bass
const bass = note("<~@9 A@8 B@3 C@2 D E@2 F ~ G@4 H@2 ~ I@3 J K@2 L M@2 N O P@3 ~@4>".pickRestart({
  A: "[c2@16 eb2@15 d2@16 c2@16 f1@23 ~ bb1@7 eb1@16 c2@16 bb1@16 c2@15 db2@16 bb1@15 ~ eb2@15 eb1@16 d2@15 g1@11 ~ g1@4 c2@5]/8",
  B: "[~@10 g1@15 ~ ab1@11 ab1@4 bb1@11 ~ bb1@4 ~@8 eb1 ~@6 d2@8 g1@8 c2@8, ~@19 eb2@5 ~@8]/3",
  C: "[bb1@8 a1@8 ab1@8 ~@7 eb1 ~@7 bb1@15 ~ c2@3 bb1@5 ~, ~@24 eb2@15 ~@25]/2",
  D: "~@2 ab1@15 ~@6 f2@2 g2@3 ~@4, ~@11 eb2 ~@4",
  E: "[~ eb2@2 f2@2 g2@3 ~@13 eb1@3 ~ eb1@4 eb2@5 eb1@2 g1@12 ~ g1@2 c2 ~@3 c2@7 c2@2]/2",
  F: "f1@2 g1@3 ~ g1@9 g1@2 ab1@9 ~@6", G: "[~@14 e1@25 ~@4 g1@28 gb1@29 a1@28]/4", H: "[~ db1@30 e1@33]/2",
  I: "[~@6 c2@3 ~ c2@9 c2@2 eb1@3 ~ eb1@4 ~@5 eb1 ~@9 d1 ~@5 d1@2 c2@7 eb2@2 c2@2 bb1@2 g1@2 f1@3 ~ f1@9 [f1,g2] ~ f1@8 bb1@6, ~@29 eb2@7 d2@12 d2@4 ~@44]/3", // Fsus2
  J: "~ eb2@4 eb1@4 eb2@6 eb1 ~ c2@7 c2@6 g1@2",
  K: "[bb1@4 bb1@7 bb1@2 ~@2 c2@7 ~ c2@7 db2@4 db2@7 ~ db2@3 ~ bb1@5 bb1@2 f2@2 d2@2 bb1@2 f1@2 eb2@3]/2",
  L: "~ eb1@3 eb2@5 ~ eb1 ~ eb1@7 eb2@6 eb1 d2@6",
  M: "[~@7 d1 ~@9 d2 ~@6 c2@7 c2@5 ~ c2@2 g1@7 g1@7 ~ ab1@10, ~@2 d2@7 g1@15 ~@40]/2",
  N: "~ ab1@3 bb1@6 bb1@2 f2@2 ~ bb1@2 f1@2 ~@8 eb1 ~@4, ~@14 d2@2 ~@3 eb2@13", O: "eb2@2 d1@7 g1@7 ~ c2@7 bb1@7 ~",
  P: "[a1@7 ab1@9 eb1@7 ~ eb2@5 ab1@2 bb1@3 ~ bb1@9 bb1@2 c2@3 bb1@3 ~@5 ab1@15 ~@24]/3",
})).s("gm_fretless_bass").gain(0.28)

// chords · string ensemble 2
const string_ensemble_2 = note("<~ A B C D ~@18 E@5 F@2 G@3 H I@4 J@6 K@4 L@4>".pickRestart({
  A: "c3 g2", B: "ab2 eb2", C: "c3@15 ~ g2@16", D: "f2@31 ~",
  E: "[~@21 [eb3,g3]@8 g3@7 f4@4 g4@4 bb4@3 c5@2 ~@2 g3@8 [eb3,c4]@7 d5@2 eb5@2 d5@2 ~@3 bb4@2 ~@4 g3@8 ~@11 d4@3 ~ f4@3 eb4@4 c4@4 d4@4 f4@3 eb4@4 f4@4 g4@4 bb4@4 ab4@4 b4@3 a4@4 ab4@4 b4@3 e5@4, ~@21 eb4@15 [f3,bb3]@8 [f3,bb3]@8 ~@14 [f3,bb3]@8 [g3,c4]@7 c4@30 ~@49, ~@49 eb5@16 ~@7 c5@4 ~ c5@34 ~@49, ~@89 g3@11 ~@60, ~@96 eb3@8 c3@7 ~@49]/5", // Eb Cm Bb5 C5
  F: "[gb5@3 e5@4 b4@3 d5@2 e5@4 f5@3 g5@4 a5@4 bb5@3 c6@4 d6@2 ~ f6@2 gb6@4 f6@3 eb6@4 db6@4 bb5@3 ab5@4 gb5@3, ~@18 e6 ~@13]/2",
  G: "[db5@4 e5@2 gb5@3 g5@4 a5@3 b5@4 c6@4 d6@3 e6@2 gb6@2 g6@2 ab6@3 f6@4 eb6@3 db6@4 c6@4 bb5@4 ab5@4 f5@4 e5@4 b4@4 a4@4 ab4@4 gb4@4 ~ e4@4 ~ b3@4 ab3@3]/3",
  H: "~ g3@9 ~@6",
  I: "[~@15 c4@2 d4@2 eb4@2 f4@2 g4@2 eb4@4 ~@9 g4@2 ~@8 f4@4 ~ g4@2 eb4@5 ~ eb5@6 [ab3,c5]@23 d4@7 ~@10 bb4 ~ c5@2 d5@2 eb5@3 f5@2 ~@2 [c4,g4]@8, ~@6 c3@15 eb3@13 f4@4 ~@2 eb4@7 ~@43 bb4@17 ~@11 eb5@10, ~@29 eb4@7 [f3,d4]@8 bb3@8 c4@38 bb3@23 [g3,c4]@8 ~@7, ~@97 eb4@15 ~@16]/4", // Ab C5 Dm C5
  J: "[~@7 g4@8 ~@4 f5@2 ~@5 g5@4 [ab3,db4]@15 ~@8 g5@4 ab5@4 [eb4,bb5]@22 [f4,bb5]@7 [c4,d4,c6]@15 ab3@7 ~ g3@7 d4@7 eb4@7 ~ d6@2 ~ d6@2 ~@4 bb5@2 ~@3 eb4@15 [bb3,d4,d6]@15 f4@7 eb4@6, bb3@15 [g3,c4]@8 ~@112 f4@15 ~@42, eb4@8 ~@15 [c4,g4]@8 ~@15 [bb3,d4]@14 ~ bb3@30 ~@14 [f4,d6]@15 [g4,eb6]@16 ~@56, ~@4 f5@2 ~@24 f5@23 ~@84 eb6@2 ~ c6@4 ~@2 c6@18 ~@28, ~@5 eb5@14 ~@2 eb5@6 ~@108 c4@7 d4@8 ~@29 [bb3,eb6]@13]/6", // Db5 Eb5 Bb5 Csus2 Bb C5 Bb Dm …
  K: "[~@2 a3@7 b3@8 c4@7 g3@15 bb3@9 [bb3,eb4]@14 ~ f4@2 ~ bb4@2 g4@2 bb4@2 c5@2 eb5@2 ~@2 g3@2 ~ [f3,bb3,f5]@4 ~@4 [eb3,c4,eb5]@13 ~@5 eb4@4 d4@4 f4@4 eb4@4 eb4@4 ~, ~@2 [g4,d6]@15 [eb4,c6]@24 ~@7 eb3@7 ~@8 d4@15 c4 ~@49, ~@63 f3@7 g3@7 g5@3 ~@48, ~@65 g4@2 ~@9 f5@2 ~@50]/4", // Eb5 Bb5 Cm G5 Cm
  L: "[d4@4 f4@4 eb4@3 ~ bb4@4 c5@4 ~ d5@4 eb5@4 g5@3 ~@3 d5@3 ~@4 ab5@4 g5 ~@2 bb5@2 ~@5 eb6@4 ~ [d6,f6]@5 g6@5 c7@5 bb6@25 ~@27, ~@6 eb4@45 ~@13, ~@29 bb4@2 ~ c5@4 ~@4 eb5@7 ~@7 c6@6 ~@6 eb6@36 ~@26, ~@33 c6@4 ~ bb5@4 ~@5 g5@4 bb5@5 ~@72]/4", // Dm
})).s("gm_string_ensemble_2").gain(0.26).pan(0.3)

// other · string ensemble 1
const string_ensemble_1 = note("<~ [c3 g2] [ab2 eb2] [c3@15 ~ g2@16] [f2@31 ~] ~@47>")
  .s("gm_string_ensemble_1").gain(0.03).pan(0.7)

// chords · pad warm · Gm7 Ab Eb Cm Gm7 Fm G
const pad_warm = note(`<
  ~@5
  [~ [f3,g3,bb3,d4]]
  [[ab3,c4] bb3, [eb3,g3]]
  [[g3,c4,eb4] [f3,g3,bb3,d4]]
  [[f3,ab3,c4] [g3,b3,d4]]
  ~@43
>`).s("gm_pad_warm").gain(0.08)

// drums · kick
const kick = s("bd").struct("<~@23 A B C ~@8 D E F G H I J K L M N O P ~@5>".pickRestart({
  A: "~@21 x ~@3 x ~@6", B: "~@2 x ~ x ~@5 x ~@6 x ~ x ~@3 x ~@8", C: "~@2 x ~@3 x ~@10 x ~@14",
  D: "~@6 x ~@3 x ~@10 x ~@3 x ~@6", E: "~@4 x ~@3 x ~@11 x ~@4 x ~@6", F: "~@3 x ~@3 x ~@8 x ~ x ~@5 x ~@5 x!2",
  G: "~ x ~@3 x ~@11 x ~@2 x ~@11", H: "x ~@3 x ~@10 x ~@3 x ~@10 x ~", I: "~@2 x ~@11 x ~@4 x ~@9 x ~@2",
  J: "~ x ~@8 x ~ x ~@4 x ~@7 x!2 ~@3 x ~", K: "~@9 x ~@12 x ~ x ~@3 x ~@3", L: "~@5 x ~ x ~@2 x ~@11 x ~@2 x ~@6",
  M: "~@4 x ~@5 x ~@8 x ~@3 x ~@8", N: "x ~ x ~@4 x ~@9 x ~@2 x ~@7 x ~@3", O: "x ~@4 x ~@10 x ~@3 x ~@8 x ~ x",
  P: "~@3 x ~@4",
})).gain(0.48)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@34 A B ~ C ~ D ~ E ~ F G ~ H ~@5>".pickRestart({
  A: "~@12 x ~@6 x ~@12", B: "~@9 x ~@6", C: "~@15 x ~@16", D: "~@3 x ~@4", E: "~@7 x ~@7 x ~@16", F: "~@3 x ~@28",
  G: "~@15 x", H: "~@4 x ~@18 x ~@8",
})).gain(0.27)

// drums · snare
const snare = s("sd").struct("<~@23 A B C ~@8 D B E F G H I J K B L M N ~@5>".pickRestart({
  A: "~@29 x ~@2", B: "~@12 x ~@14 x ~@4", C: "~@5 x ~@10", D: "~@13 x ~@15 x ~@2", E: "~@5 x ~@4 x ~@2 x ~@2",
  F: "~@9 x ~@14 x ~@7", G: "~@7 x ~@15 x ~@8", H: "~@6 x ~@9 x ~@4 x ~@10", I: "~@4 x ~@14 x ~@12",
  J: "~@2 x ~@14 x ~@13 x", K: "~@14 x ~@14 x ~@2", L: "~@9 x ~@5 x ~@8 x ~@7", M: "~@3 x",
  N: "~@6 x ~@7 x ~@2 x ~@7 x ~@6",
})).gain(0.68)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@25 A ~@10 B ~ C ~ D ~@11>".pickRestart({
  A: "~@15 x ~@16", B: "~ x ~@30", C: "~@13 x ~@18", D: "~@5 x ~@10",
})).gain(0.27)

// drums · low tom
const low_tom = s("lt").struct("<~@39 [~@27 x ~@4] ~@3 [~@15 x ~ x ~@14] ~@8>").gain(0.48)

// drums · hihat
const hihat = s("hh").struct("<~@23 A B C ~@2 D E F G ~@2 H I J K L M N O P Q R S T U ~@4>".pickRestart({
  A: "~@25 x ~@3 x!2 ~", B: "x ~ x ~ x ~@3 x ~ x ~@4 x ~ x ~ x ~@3 x ~@3 x!2 ~@3",
  C: "x ~ x ~ x ~ x ~@3 x!2 ~ x ~ x ~@2 x ~@8 x!5", D: "~ x!5 ~ x!4 ~@21", E: "~@27 x ~ x!3", F: "x!2 ~ x!2 ~@27",
  G: "~@23 x!3 ~ x!4 ~", H: "~@10 x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~@3 x ~ x",
  I: "~@4 x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@2 x ~ x ~@3 x ~ x", J: "~@7 x ~@2 x ~@3 x ~ x ~@5 x ~@5 x ~@3",
  K: "~@5 x ~@3 x ~ x ~ x ~@3 x ~@2 x ~@3 x ~ x ~@5", L: "x ~@3 x ~@2 x ~@3 x ~@3 x ~@3 x ~@3 x ~@4 x ~ x ~",
  M: "~@2 x ~@3 x ~@3 x ~@3 x ~@2 x ~ x ~@11 x", N: "~ x!2 ~ x ~ x ~ x ~ x ~ x!2 ~ x ~ x ~@3 x ~ x ~ x!2 ~@3 x ~",
  O: "~@2 x ~@3 x ~@2 x ~@3 x ~@4 x ~@9 x ~ x!2", P: "~@3 x ~ x ~ x ~@2 x ~ x ~ x ~ x ~@3 x ~ x!2 ~ x ~ x ~ x ~@2",
  Q: "~ x ~ x!2 ~ x ~ x ~ x ~ x ~@6 x ~@3 x ~ x ~ x!2 ~ x ~",
  R: "x ~ x ~ x ~ x!2 ~@3 x ~ x ~@3 x ~ x!2 ~ x ~ x ~@5 x ~", S: "x!2 ~ x ~ x ~@10 x ~@3 x ~@3 x ~@2 x ~ x ~ x",
  T: "~ x ~ x!2 ~@3 x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~@8", U: "~ x ~@14",
})).gain(0.27)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<A ~@23 B C ~ D E F ~ G ~@2 H I J K L E M N O P Q R S ~@5>".pickRestart({
  A: "x ~ x ~ x!4", B: "~@6 x ~@6 x ~@11 x ~@6", C: "~@19 x ~@5 x!2 ~@5", D: "~@29 x ~ x", E: "x", F: "~@11 x!2 ~ x ~",
  G: "~@17 x!3 ~ x!2 ~@9", H: "~@12 x ~@14 x ~@4", I: "~@3 x ~@3 x ~@8", J: "~@9 x ~@2 x ~@19", K: "~@19 x ~@10 x ~",
  L: "~@2 x ~@6 x ~@11 x ~@3 x ~@6", M: "~@7 x", N: "x ~@3 x ~@2 x ~@24", O: "~ x ~@7 x ~@21 x", P: "~@21 x ~@10",
  Q: "~@13 x ~@2", R: "~@22 x ~@2 x ~@6", S: "~ x",
})).gain(0.14)

// drums · mid tom
const mid_tom = s("mt").struct("<~@36 A ~@2 B ~ C ~ D ~ E ~@6>".pickRestart({
  A: "~@30 x!2", B: "~@23 x ~ x ~@6", C: "~@10 x!2 ~@4", D: "~@7 x ~@8", E: "~@6 x!2 ~@24",
})).gain(0.48)

// drums · open hat
const open_hat = s("oh").struct("<~@24 A B C D E F G H ~@3 I J K L ~ M N O ~ P ~ Q ~@5>".pickRestart({
  A: "~@6 x ~@8 x", B: "~@17 x!3 ~@4 x!8", C: "x", D: "~@30 x!2", E: "~ x!10 ~@21", F: "~@22 x!2 ~ x!4 ~ x!2",
  G: "x!5 ~@27", H: "~@15 x!2 ~ x!5 ~ x!6 ~ x", I: "~ x ~@25 x ~@4", J: "~@13 x ~@2", K: "~@7 x", L: "~@27 x ~@4",
  M: "~@19 x ~@12", N: "~@17 x ~@14", O: "~@9 x ~@6", P: "~@9 x ~@18 x ~@3", Q: "~@6 x ~@18 x ~@6",
})).gain(0.27)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@25 [~@21 x!3 ~@8] ~ [~@28 x!2 ~@2] ~ [~@3 x] ~@22>").gain(0.14)

// drums · high tom
const high_tom = s("ht").struct("<~@39 [~@21 x ~@10] ~ [~@5 x ~@2] ~@3 [~@5 x!2 ~@25] ~@6>").gain(0.48)

// drums · crash
const crash = s("cr").struct("<~@23 A ~ B ~@2 C ~ D E ~@2 F ~ G H ~ I ~ J ~ K ~ L M ~@5>".pickRestart({
  A: "~@21 x ~@10", B: "~@17 x ~@14", C: "~@11 x ~@20", D: "~ x ~@6", E: "~@31 x", F: "~@3 x ~@12", G: "~@3 x ~@28",
  H: "~ x ~@7 x ~@22", I: "~@29 x ~@2", J: "~@3 x", K: "~@19 x ~@7 x ~@4", L: "~@7 x ~@8 x ~@15",
  M: "~@14 x ~@2 x ~@7 x ~@6",
})).gain(0.41)

stack(
  drawbar_organ, piano, piano_soft, bass, string_ensemble_2, string_ensemble_1, pad_warm, kick, kick_soft, snare,
  snare_soft, low_tom, hihat, hihat_soft, mid_tom, open_hat, open_hat_soft, high_tom, crash
)

More by Battisti