Strudelify

Questa primavera

Daniele

KeyC minorTempo92 bpm
0:00/0:00
// Questa primavera — Daniele
// 92 bpm, 8/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 8/4 at bar 2) are rendered on a constant 8/4 grid of one bar per cycle
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 58 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(92/8)

// 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 · acoustic bass
const bass = note(`<
  ~ A B C D E F G H I J K L M N O P Q R G S T U G V W X Y Z AA F G AB AC AD AE AF AG AH G H AI AJ AK AL AM AN AO AP AQ
  AR AS AT AU AV AW AX AY
>`.pickRestart({
  A: "f2@5 ~@2 f2 c2@4 f2@4 bb1@5 ~@2 bb1 bb2@4 f2@4", B: "eb2@4 ~@3 eb2 bb1@5 ~@2 bb1 c2@5 ~@2 c2 e2@4 g2@4",
  C: "f2@5 ~@2 f2 c2@4 f2@4 ~ g2@4 ~@2 g2 d2@4 ~ d2@3", D: "c2@4 ~@3 c2 g1@4 bb1@4 c2@5 ~@2 c2 e2@4 ~@3 e2",
  E: "f2@4 ~@3 f2 c2@4 f2@4 ~ bb2@4 ~@2 bb2 f2@4 ~@3 f2", F: "eb2@5 ~@2 eb2 bb1@4 eb2@4 c2@5 ~@2 c2 e2@4 ~@3 e2",
  G: "f2@4 ~@3 f2 c2@4 f2@4 g2@4 ~@3 g2 d2@4 ~@3 d2", H: "c2@5 ~@2 c2 g1@4 bb1@4 c2@5 ~@3 c2@4 e2@4",
  I: "f2@4 ~@3 f2 c2@4 f2@4 bb1@5 ~ bb1 ~ bb2@4 f2@4", J: "eb2@5 ~@2 eb2 bb1@4 ~ eb2@3 c2@8 e2@5 ~@2 e2",
  K: "f2@4 ~@3 f2 c2@4 f2@4 ~ g2@4 ~@2 g2 d2@4 g2@4", L: "c2@5 ~@2 c2 g2@4 eb2@4 c2@12 e2@4",
  M: "ab2@5 ~@2 ab2 eb2@4 ab2@4 a2@4 ~@3 a2 d2@4 gb2@4", N: "g2@5 ~@2 g2 d2@4 g2@4 c2@5 ~@2 c2 e2@4 ~@3 e2",
  O: "f2@4 ~@3 f2 c2@3 ~ f2@4 g2@4 ~@3 g2 d2@5 ~@3", P: "c2@5 ~@2 c2 g1@4 bb1@4 c2@5 ~@3 e2@8, bb1 ~@31",
  Q: "ab2@5 ~@2 ab2 eb2@4 ab2@4 a2@5 ~@2 a2 d2@3 ~ gb2@4", R: "g2@4 ~@3 g2 d2@3 ~ g2@3 ~ c2@5 ~@2 c2 e2@4 ~@3 e2",
  S: "c2@4 ~@3 c2 g1@4 bb1@4 c2@12 e2@4", T: "f2@4 ~@3 f2 c2@4 f2@3 ~ bb1@5 ~ f2@2 bb2@4 f2@4",
  U: "eb2@5 ~@2 eb2 ~ bb1@3 eb2@4 c2@7 ~ e2@7 ~", V: "~ c2@5 ~ c2 g2@4 c3@4 c2@8 e2@7 ~",
  W: "f2@4 ~@3 f2 c2@4 f2@3 ~ bb1@8 bb2@4 f2@4", X: "eb2@5 ~@2 eb2 bb1@4 eb2@4 c2@8 e2@7 ~",
  Y: "f2@5 ~@2 f2 c2@4 f2@4 g2@8 d2@8", Z: "c2@5 ~@2 c2 g1@4 bb1@4 c2@7 ~ c2@4 ~ e2@3",
  AA: "~ g2 ~@5 f2 c2@3 ~ f2@4 bb2@5 ~@2 bb2 f2@5 ~@2 f2, f2@5 ~@27", AB: "c2@4 ~@3 c2 g1@4 bb1@4 c2@11 ~ e2@4",
  AC: "ab2@4 ~@3 ab2 eb2@4 ab2@3 ~ a2@4 ~@3 a2 d2@3 ~ gb2@4", AD: "g2@4 ~@3 g2 d2@3 ~ g2@4 c2@5 ~@2 c2 e2@4 ~@2 e2 ~",
  AE: "f2@4 ~@3 f2 c2@3 ~ f2@4 g2@4 ~@3 g2 d2@4 ~@3 d2", AF: "c2@5 ~@2 c2 g1@4 bb1@4 c2@5 ~@2 c2 e2@8",
  AG: "ab2@5 ~@2 ab2 eb2@3 ~ ab2@4 a2@4 ~@3 a2 d2@3 ~ gb2@4", AH: "g2@4 ~@3 g2 d2@3 ~ g2@4 c2@5 ~@2 c2 e2@5 ~@2 e2",
  AI: "f2@5 ~@2 f2 c2@3 ~ f2@4 bb2@5 ~@2 bb2 f2@4 bb1@3 d2", AJ: "eb2@4 ~@3 eb2 bb1@3 ~ eb2@4 c2@5 ~@2 c2 e2@4 g2@4",
  AK: "f2@5 ~@2 f2 c2@4 f2@4 g2@4 ~@3 g2 d2@4 g2@4", AL: "c2@5 ~@2 c2 g2@4 c3@4 c2@5 ~ c2 ~ e2@4 ~@2 c2 ~",
  AM: "f2@5 ~@2 f2 c2@3 ~ f2@3 ~ bb1@4 ~@2 bb1 ~ bb2@4 f2@4", AN: "eb2@5 ~@2 eb2 bb1@4 eb2@4 c2@5 ~@2 c2 e2@4 ~@2 e2 ~",
  AO: "f2@4 ~@2 f2@2 c2@3 ~ f2@4 g2@4 ~@3 g2 d2@4 g2@4", AP: "c2@5 ~@2 g2 c3@4 g2@4 c2@5 ~ c2 ~ e2@5 ~ e2 ~",
  AQ: "f2@4 ~@3 f2 c2@3 ~ f2@4 bb2@4 ~@3 bb2 f2@4 bb1@3 d2",
  AR: "eb2@4 ~@3 eb2 bb1@3 ~ eb2@4 c2@4 ~@3 c2 e2@4 ~@2 e2 ~", AS: "f2@4 ~@3 f2 c2@3 ~ f2@4 g2@4 ~@3 g2 d2@4 ~@2 d2@2",
  AT: "c2@4 ~@3 g2 c3@4 g2@4 c2@5 ~@2 c2 e2@4 ~@3 e2", AU: "f2@4 ~@3 f2 c2@4 f2@3 ~ bb2@4 ~@2 bb2@2 f2@4 bb1@4",
  AV: "eb2@4 ~@3 eb2 bb1@4 eb2@4 c2@4 ~@3 c2 e2@4 ~@3 e2", AW: "f2@4 ~@3 f2 c2@4 f2@4 g2@4 ~@2 g2 ~ d2@4 ~@3 d2",
  AX: "c2@5 ~@2 c2 g1@3 ~ bb1@4 c2@5 ~@2 c2 e2@5 ~ c2 ~", AY: "f2@5 ~@2 f2 c2@3 ~ f2@4 bb2@4 ~@2 bb2 ~ bb1@3 ~ f2@3 ~",
})).s("gm_acoustic_bass").gain(0.3)

// chords · string ensemble 2
const string_ensemble_2 = note("<~@13 A@3 B C@3 D ~@12 E@3 B F@3 D ~@17>".pickRestart({
  A: "[[g5,bb5]@14 ~ [gb5,g5] ~@40 e5@7 ~ [f5,ab5]@16 g5@7 ~ [f5,b5]@8, c6@25 ~@23 db6@15 ~@33, eb6@23 ~ d6@24 ~@48, ~@15 a5@16 ~ f5@24 ~@7 eb5@16 ~ d5@15 ~, ~@17 gb5@14 [g5,bb5]@31 ~@34]/3", // Gm Gmaj7 Fm Fdim Gm
  B: "d6@4 c6@3 ~, [eb5,g5,bb5]@7 ~", // Eb
  C: "[[g5,bb5]@7 ~ [f5,ab5]@7 ~@41 e5@6 ~@2 ab5@15 ~ d5@14 ~@2, [c6,eb6]@8 d6@8 db6@5 ~@11, ~@16 [gb5,a5]@15 ~ bb5@31 ~ f5@30 ~@2, ~@32 f5@23 ~@8 eb5@17 ~@16]/3", // Gm Fm Cm Gbm
  D: "eb5@17 ~@15",
  E: "[[g5,bb5]@14 ~ [gb5,g5] ~@40 e5@7 ~ [f5,ab5]@16 g5@7 ~ [f5,b5]@8, c6@25 ~@23 db6@15 ~@33, eb6@23 ~ d6@24 ~@48, ~@15 a5@16 f5@24 ~@8 eb5@16 ~ d5@15 ~, ~@17 gb5@14 [g5,bb5]@31 ~@34]/3", // Gm Gmaj7 Fm Fdim Gm
  F: "[[g5,bb5]@7 ~ [f5,ab5]@7 ~@41 e5@6 ~@2 ab5@15 ~ d5@14 ~@2, [c6,eb6]@8 d6@8 db6@5 ~@11, ~@16 [gb5,a5]@15 bb5@31 ~@2 f5@30 ~@2, ~@32 f5@23 ~@8 eb5@17 ~@16]/3", // Gm Fm Cm Gbm
})).s("gm_string_ensemble_2").gain(0.13)

// chords · string ensemble 2 · soft notes
const string_ensemble_2_soft = note("<~@14 A@2 ~ B@2 C@2 ~@13 A@2 ~ D@4 ~@17>".pickRestart({
  A: "[~@31 c6@24 ~@9]/2", B: "[~@31 g5@31 ~@2]/2", C: "[c6@24 b5@7 ~ [c5,c6]@18 ~@14, ~@31 g5@18 ~@15]/2",
  D: "[~@31 g5@31 ~ c6@24 ~ b5@7 ~ [c5,c6]@18 ~@14, ~@95 g5@18 ~@15]/4", // C
})).s("gm_string_ensemble_2").gain(0.06)

// chords · french horn
const french_horn = note("<~ A@4 ~@4 B@2 C@2 D@3 E F@3 ~ G@4 ~@4 H@2 C@2 I@3 E J@3 ~ G@12 K@4 ~>".pickRestart({
  A: "[~ eb4@15 ~@8 b3@7 ~@25 e4@7 ~@9 f3@7 ~@33 c4@6 ~@10, c4@23 ~@9 bb3@31 ~ ab3@15 ~@49, ~ ab3@31 g3@40 ~@8 g3@38 ~@10, ~ g4@23 f4@31 ~@9 eb4@28 d4@19 ~@17, ~@16 d4@31 ~ db4@15 ~ c4@24 b3@6 ~@2 [bb3,f4]@22 ~@10]/4", // Bb5
  B: "[eb4@15 ~@9 b3@7 ~@17 c4@7 ~ [db4,e4]@7 ~, [c4,g4]@23 ~ f4@32 ~@8, ~@16 d4@31 ~@17, ~@32 [g3,bb3]@31 ~]/2", // Dbm C5 Gm
  C: "[[f3,ab3]@14 ~@2 g3@7 ~ f3@7 ~ [eb3,g3,c4]@20 ~@12, eb4@6 d4@7 ~@3, c4 b3 ~@2]/2", // Fm Cm
  D: "[[g3,bb3]@14 ~ [gb3,g3] ~@40 e3@7 ~ [f3,ab3]@16 g3@7 ~ [f3,b3]@8, c4@25 ~@23 db4@15 ~@33, eb4@23 ~ d4@24 ~@48, ~@15 a3@16 bb3@31 ~@34, ~@17 gb3@14 ~ f3@24 ~@7 eb3@16 ~ d3@15 ~]/3", // Gm Gmaj7 Fm Fdim
  E: "[eb3,g3,bb3]@7 ~, d4 ~", // Eb
  F: "[[g3,bb3]@7 ~ [f3,ab3]@7 ~@41 e3@6 ~@2 ab3@15 ~ d3@14 ~@2, [c4,eb4]@24 d4@24 db4@15 ~ f3@30 ~@2, ~@16 [gb3,a3]@15 ~ bb3@31 eb3@17 ~@16]/3", // Gm Fm Cm Gbm
  G: "[eb4@15 ~@9 b3@7 ~@25 e4@7 ~@9 f3@7 ~@33 c4@6 ~@10, ab3@31 ~ g3@40 ~@8 g3@38 ~@10, [c4,g4]@23 ~ f4@31 ~@9 eb4@28 d4@19 ~@17, ~@16 d4@31 ~ db4@15 ~ c4@24 b3@6 ~@2 [bb3,f4]@22 ~@10, ~@32 bb3@31 ~ ab3@15 ~@49]/4", // C5 Bb5
  H: "[c4@15 ~ bb3@8 b3@7 ~@17 c4@7 ~ [db4,e4]@7 ~, [eb4,f4,ab4]@3 f4@4 ~, ~@16 d4@31 ~@17, ~@32 [g3,bb3]@31 ~]/2", // Dbm Fm7 Gm
  I: "[[g3,bb3]@14 ~ [gb3,g3] ~@40 e3@7 ~ [f3,ab3]@16 g3@7 ~ [f3,b3]@8, c4@25 ~@23 db4@15 ~@33, eb4@23 ~ d4@24 ~@48, ~@15 a3@16 bb3@31 ~@34, ~@17 gb3@14 f3@24 ~@8 eb3@16 ~ d3@15 ~]/3", // Gm Gmaj7 Fm Fdim
  J: "[[g3,bb3]@7 ~ [f3,ab3]@7 ~@41 e3@6 ~@2 ab3@15 ~ d3@14 ~@2, [c4,eb4]@24 d4@24 db4@15 ~ f3@30 ~@2, ~@16 [gb3,a3]@15 bb3@31 ~ eb3@17 ~@16]/3", // Gm Fm Cm Gbm
  K: "[eb4@15 ~@9 b3@7 ~@25 e4@7 ~@9 f3@7 ~@8 b3@5 ~@20 c4@6 ~@10, ab3@31 ~ g3@40 ~@8 g3@38 ~@10, [c4,g4]@23 ~ f4@31 ~@9 eb4@28 d4@19 ~@17, ~@16 d4@31 ~ db4@15 ~ c4@24 ~@8 [bb3,f4]@22 ~@10, ~@32 bb3@31 ~ ab3@15 ~@49]/4", // C5 Bb5
})).s("gm_french_horn").gain(0.27)

// chords · french horn · soft notes
const french_horn_soft = note("<~@9 A ~@3 B@3 C D@2 E@2 ~@12 B@3 C F@4 ~@17>".pickRestart({
  A: "ab3@31 ~", B: "[~@31 g3@31 ~ c4@24 ~@9]/3", C: "~@4 c4@3 ~", D: "[~@32 f3@23 ~@9, ~@31 g3@31 ~@2]/2",
  E: "[c4@24 b3@7 ~ [c3,eb3,c4]@18 ~@14, ~@31 g3@18 ~@15]/2", // Cm
  F: "[~@32 f3@23 ~@8 c4@24 ~ b3@7 ~ [c3,eb3,c4]@18 ~@14, ~@31 g3@31 ~@33 g3@18 ~@15]/4", // Cm
})).s("gm_french_horn").gain(0.11)

// drums · kick
const kick = s("bd").struct(`<
  ~
  [x ~@6 x!2 ~@7 x ~@6 x!2 ~@7]!11
  [x ~@6 x!2 ~@7 x ~@10 x ~@4]
  [x ~@6 x!2 ~@7 x ~@6 x!2 ~@7]!7
  [x ~@6 x!2 ~@7 x ~@10 x ~@4]
  [x ~@6 x!2 ~@7 x ~@6 x!2 ~@7]!11
  [x ~@6 x!2 ~@7 x ~@10 x ~@4]
  [x ~@6 x!2 ~@7 x ~@6 x!2 ~@7]!25
>`).gain(0.4)

// drums · snare
const snare = s("sd").struct("<~@12 [~@7 x] [~@3 x ~@3 x]!7 [~@7 x] [~@3 x ~@3 x]!11 [~@7 x] [~@3 x ~@3 x]!25>")
  .gain(0.4)

// drums · hihat
const hihat = s("hh").struct(`<
  ~
  [x ~ x!2 ~@2 x!3 ~ x!2 ~@2 x!3 ~ x!2 ~@2 x!3 ~ x!2 ~@2 x!2]!30
  [x ~ x!2 ~ x ~ x!3 ~ x ~ x ~ x!3 ~ x ~ x ~ x!3 ~ x ~ x ~ x]
  [x!2 ~ x ~ x ~ x!3 ~ x ~ x ~ x!3 ~ x ~ x ~ x!3 ~ x ~ x ~ x]!26
>`).gain(0.24)

// drums · ride
const ride = s("rd").struct("<~ [~@7 x]!11 [~@5 x ~ x] [~@7 x]!7 [~@5 x ~ x] [~@7 x]!11 [~@5 x ~ x] [~@7 x]!25>")
  .gain(0.4)

// drums · tambourine
const tambourine = s("tb").struct("<~ [~ x ~ x ~ x ~ x]!57>").gain(0.4)

// drums · bongos
const bongos = s("bongo:4").struct("<~@21 [~@3 x!2 ~@14 x!2 ~@11]!4 ~@8 [~@3 x!2 ~@14 x!2 ~@11]!25>").gain(1.05)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@21 [~@5 x ~@7 x ~@2]!4 ~@8 [~@9 x ~@15 x ~@6]!25>").gain(1.05)

stack(
  bass, string_ensemble_2, string_ensemble_2_soft, french_horn, french_horn_soft, kick, snare, hihat, ride, tambourine,
  bongos, bongos_2
)

More by Daniele