Strudelify

Bisogno d'amore

Danilo Amerio

KeyD majorTempo70 bpm
0:00/0:00
// Bisogno d'amore — Danilo Amerio
// 70 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 70 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(70/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 · french horn
const french_horn = note(`<
  A B@2 C@4 D@3 E F G@3 H@5 I@3 ~@2 J@2 ~@20 K L M N ~ O P@4 Q R@2 S T@2 U V W X@3 ~
>`.pickRestart({
  A: "[g2,d3,b3] [a2,f#3,c4]", B: "[b2@4 ~@3 c4 [d3,b3]@4 ~@2 f#3@2, g3@7 ~, d4@7 ~@9, ~ c3 ~ [d2,a3]]/2",
  C: "[a3@2 g3@2 e3@2 g3 ~@4 d3 ~@2 g3 [f#2,d3,a3,b3], d4, g2@15 ~, b3@2 c4@2 a3@3 ~, ~@7 f#3@4 ~ b3@3 ~]/4", // Bm7
  D: "[d4@4 c4@2 ~@10 [f#2,d3,d4]@4 [d#2,c4,f#4]@3 ~, [e2,e3,g4] [c2,c3,e4] ~, ~@6 b3@6 a3@11 ~]/3", // D Cdim Em C
  E: "[e2,g3,b3,e4] [d#3,a3,b3,d#4,f#4] [d3,b3,d4,f#4,g4] [c3,d4,f#4,a4]", F: "[b2,g3,d4,d5]",
  G: "[[a3,c4,g4]@2 [a3,f#4] g3 ~ d4 [d#3,b3]@2 [e3,g4]@2 g4 f#4, [e3,c5]@4 [f#2,f#3,a3,a4]@2 f#4@3 ~ d3@2, ~@3 e4@2 ~ b4@6, ~@2 b3]/3", // Am7 D G#m Em C F#m
  H: "[~@3 e4 [b2,a3]@4 g3@2 [a3,f#4] e4 d3@4 b3@2 [f#3,e4]@2, g4@10 ~ g3@5 ~@4, d4@2 c4@2 ~, [c3,g3] ~ a2 a3@2, ~@6 d4@3 ~]/5", // B7 D F#7 C5
  I: "[[e3,g3]@2 [f#3,b3]@2 c4@2 a3@2 c4@2 ~ f#3, d4, ~@4 g3@7 ~, ~@5 a3]/3", J: "[~@2 d4@9 ~@5]/2", K: "e4@2 f#4 e4",
  L: "a4@2 g#4 c#5", M: "f#4 e4", N: "a4@8 b4@7 ~", O: "~ a3 e4 f#4",
  P: "[d4@27 [f4,f#4,g4,g#4] a4@12 b4@16 f#4@4 e4@4]/4", Q: "d4", R: "[c#4@2 f#4@4 g#4 f#4]/2", S: "b4@2 a#4 d#4",
  T: "[g#4@2 f#4 b3@3 c#4@2]/2", U: "d#4@2 g#4 f#4", V: "b4@2 a#4 d#5", W: "g#4@2 f#4 b4", X: "[e4@8 f#4@29 ~@11]/3",
})).s("gm_french_horn").gain(0.22).pan(0.3)

// other · french horn
const french_horn_2 = note("<[a3 g3 f#3 a3] [g3 g4 f#4 e4] d4 ~@8 a4 ~@4 [~@4 f#4@2 e4 d4] ~@53>")
  .s("gm_french_horn").gain(0.46)

// other · trombone
const trombone = note("<A B C ~@3 D@4 ~ E@3 ~@56>".pickRestart({
  A: "a3 g3 f#3 a3", B: "g3@4 d4@3 c4", C: "b3 c4", D: "[~@6 b3@2 ~@4 c4@2 ~@6 a3@11 ~, d4@6 ~ b3@3 ~@6, ~@2 e3 ~]/4",
  E: "[a4@6 g#4 f#4@2 e4 g#4@2]/3",
})).s("gm_trombone").gain(0.3)

// bass · tuba
const bass = note("<[g1 a1] [b1 c2] d2 ~@67>").s("gm_tuba").gain(0.24).pan(0.2)

// chords · trumpet
const trumpet = note("<A@3 ~@3 B C D E F@3 ~ G ~@55>".pickRestart({
  A: "[d3@3 c3 d3@2, d4]/3", B: "~@3 f#2", C: "e2", D: "c2", E: "d3@4 d#3@3 ~, f#3@7 ~",
  F: "[b3 a3 b3 ~ a3@2 ~@4 a3 g3, ~@3 d4@5 c4@4, ~@3 g3@2 ~]/3", G: "f#4 e4 g4 f#4",
})).s("gm_trumpet").gain(0.21).pan(0.7)

// other · overdriven guitar
const overdriven_guitar = note("<~@18 A@2 ~@3 B@2 ~@45>".pickRestart({
  A: "[d5@23 ~@9]/2", B: "[~@11 d5@11 ~@10]/2",
})).s("gm_overdriven_guitar").gain(0.08)

// bass · fretless bass
const bass_2 = note(`<
  ~@19 A B C D E F C G H I J K L M N O I P Q R S T U V W X Y Z W AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AM AQ
  AR AS@2 ~
>`.pickRestart({
  A: "g2 f#2", B: "e2 d2", C: "c2 b1", D: "a1@8 d2@4 ~ d2 d1@2", E: "g1 f#1", F: "e1@2 d1 d2", G: "a1 d2",
  H: "a1@4 ~@3 e1 a1@6 ~ a1", I: "a1@6 ~ a1 a1@7 ~", J: "g#1@6 ~ g#1 g#1@6 f#1 e1", K: "a1@6 ~ a1 a1@5 e1 g#1 g1",
  L: "f#1@5 ~@2 f#1 e1@4 e2@4", M: "d2@6 ~ d2 d2@6 ~ d2", N: "e2@6 ~ e2 f2@4 c#2@3 ~", O: "f#1@6 ~ f#1 f#1@2 ~@2 g#1@4",
  P: "a1@6 ~ a1 a1@2 a1@2 a1@2 a2@2", Q: "g#2@8 f1@7 ~", R: "f#1@7 f#1 e1@6 e2 d#2", S: "d2@5 ~ d1 ~ d1@8",
  T: "c#2@6 c#1 ~ c#1@6 c#2 a1", U: "b1@6 b1 ~ b1@6 c#2 d2", V: "e2@5 b1 e2 e1 e2@5 d2 b1 a#1",
  W: "a1@5 ~ a1 ~ g#1@7 ~", X: "f#1@5 ~ f#1 ~ e1@4 e2@4", Y: "d2@5 ~ d2 ~ c#2@4 a2 a1 c#2 a1",
  Z: "b1@5 ~ b1@2 e1@3 b1 e2@3 e1", AA: "f#1@5 ~ f#1 ~ e1@8", AB: "d2@5 ~ d2 ~ c#2@6 a1 f#1",
  AC: "b1@6 ~ b0 e1@4 e2 b1 e1@2", AD: "g1@5 ~ g1 ~ g1@7 ~", AE: "f#1@5 ~ f#1 ~ f#1@7 ~", AF: "e1@5 ~ e2@2 a1@7 ~",
  AG: "d2@7 a1 d2 e2 a2 d2@2 b1 e1 d#1", AH: "d1@6 c2 ~ b1@8", AI: "e1@6 e2 ~ e2@7 ~", AJ: "f2@6 f1 ~ f1@7 ~",
  AK: "f#1@5 ~ f#1@7 f#2 c#2 c2", AL: "b1@5 ~ b1 ~ a#1@8", AM: "g#1@5 ~ g#1 ~ f#1@8", AN: "e1@6 e2 ~ d#2@7 ~",
  AO: "c#2@5 ~ c#2@2 f#1@3 c#2 f#2 c#2 f#1@2", AP: "b1@5 ~ b1@2 a#1@7 ~", AQ: "e1@5 ~ e1 ~ d#1@7 ~",
  AR: "c#1@5 g#1 c#2@2 f#1@7 a#1", AS: "b1/2",
})).s("gm_fretless_bass").gain(0.72)

// chords · synth strings 1
const synth_strings_1 = note("<~@27 A@2 B C D E@2 F@4 G H I@2 J K@4 L@2 M@2 N@7 O P@4 Q@2 R@2 S@2 ~>".pickRestart({
  A: "[[b3,c#4,e4]@16 [f#3,b3,d4]@15 ~, a2@31 ~]/2", B: "[g#2,b3,e4]", C: "[a2,c#4]@3 g#2, [b3,e4]",
  D: "[f#2,a3,f#4] [e2,g#3,e4], c#4", E: "[[d2,f#3,d4]@2 [e2,e4] [f2,d4], b3, ~ g#3]/2",
  F: "[[f#2,a3,c#4,f#4]@3 g#2 c#4@4 [f#3,d4]@4 [g#2,e4]@2 [f2,c#4,g#4]@2, ~@3 [b3,e4]@5 b3@8, ~ a2@2 ~]/4", // F#m D C#m C# E5
  G: "[f#2,a3,f#4] [e2,g#3,g#4], c#4", H: "[d2,a3,d4,e4,f#4]", I: "[[c#2,b3]@2 ~ b1, [a3,e4], ~ [b2,d4]]/2",
  J: "[e3,a3] g#3, [e2,b3,e4]", // A5 E5
  K: "[[a2,a3,b3,c#4,e4]@2 f#4 ~ [f#2,a3]@2 [e2,g#3]@2 [d2,f#4]@2 [c#2,b3]@2 [b1,d4]@2 [e2,b3]@2, ~ [g#2,b3] c#4@2 a3@4, ~@12 e4@51 ~]/4", // A F#m E D C#7 Bm E5 G#m
  L: "[[a2,a3,b3,c#4,e4]@2 f#4 ~ [f#2,a3]@2 [e2,g#3]@2, ~ [g#2,b3] c#4@2, ~@3 e4@5]/2", // A F#m E G#m
  M: "[e4 d4 [c#2,b3]@2 [b1,d4]@2 ~ g#3, a3@7 ~, [d2,f#4] e4@3, ~@3 [e2,b3]]/2", // C#7 Bm D E5
  N: "[[g2,b3,d4]@2 e4 ~ [e2,b3] a2 d3@2 [c3,e4] [b2,d#4] [e2,g3]@2 [f2,g#3]@2, a3@2 g3 f#3@2 ~@2, ~@8 f#2@8 ~@4 a3@16 b3@19 ~, ~@3 d4@5 ~@2 d4@4]/7", // G E5 C B Em Fm
  O: "b3 a#3, [f#2,f#3,c#4]", // F#5
  P: "[[b2,b3,c#4,d#4,f#4]@2 g#4 ~ [g#2,b3]@2 [f#2,a#3]@2 [e2,g#4]@2 [d#2,c#4]@2 [c#2,e4]@2 [f#2,c#4]@2, ~ [a#2,c#4] d#4@2 b3@4, ~@12 f#4@51 ~]/4", // B G#m F# E D#7 C#m F#5 A#m
  Q: "[[b2,b3,c#4,d#4,f#4]@2 g#4 ~ [g#2,b3]@2 [f#2,a#3]@2, ~ [a#2,c#4] d#4@2, ~@3 f#4@5]/2", // B G#m F# A#m
  R: "[f#4 e4 [d#2,c#4]@2 [c#2,e4]@2 ~ a#3, b3@7 ~, [e2,g#4] f#4@3, ~@3 [f#2,c#4]]/2", S: "[b2,f#3,b3,c#4,d#4]/2",
})).s("gm_synth_strings_1").gain(0.24)

// chords · synth strings 1 · soft notes
const synth_strings_1_soft = note("<~@19 A@2 B@2 C@2 B@2 ~@43>".pickRestart({
  A: "[[g2,g3,b3,d4]@2 e4 ~ [e2,g3]@2 [d2,f#3,b3]@2, ~ [f#2,a3] ~@2, ~@3 d4@5]/2", // G Em Bm F#m
  B: "[[c2,e4]@2 [b1,a3]@2 a1@2 ~ f#3, d4, g3@7 ~, ~ c4, ~@3 d2]/2", // C B7
  C: "[[g2,g3,b3,d4]@2 e4 ~ e2@2 [d2,b3]@2, ~ [f#2,a3] g3@2, ~@3 d4@5]/2", // G F#m
})).s("gm_synth_strings_1").gain(0.16)

// other · string ensemble 2
const string_ensemble_2 = note(`<
  ~@19 A@4 B C@3 D E ~ F G H ~@6 I J K L M N O@2 M P Q R S@2 T U V W X Y@2 Z AA@2 AB Z AA@2 AC@2 ~
>`.pickRestart({
  A: "[[a3,d4]@8 e4@4 a3@4 g4@5 f#4@10 ~ e4@8 ~@20 f#3@4, b3@3 d4@9 c4@4, ~@2 f#3@2 b3@4 g3@7 ~, ~@5 a3@3]/4", // D5
  B: "[b3,d4]@2 ~ d5, a3@3 ~, ~ [e4,a4]", // Bm A5
  C: "[[b3,g4]@2 [f#4,b4]@2 [e4,g4]@2 [a3,a4]@2 e4@2 ~ f#3, d4, ~@32 g3@13 ~@3, ~@5 a3]/3", D: "c#5 ~",
  E: "~@8 [d5,e5,a5]@7 ~", F: "~@10 e5 a5 g#5 e5 b4 ~", G: "[a3,f#4] [g#3,e4], c#4", H: "[f#3,b3,d4]@15 ~",
  I: "[d3,d4,f#4]", J: "[c#3,e4,b4]", K: "[b2,d4,a4]", L: "[e3,e4,b4]", M: "e5@2 f#5 e5", N: "a5@2 g#5 c#5",
  O: "[f#5@2 e5 a4@3 b4@2]/2", P: "a5@2 g#5 c#6", Q: "f#5@2 e5 a5", R: "a4 b4", S: "d5/2", T: "d6 e6", U: "f#6",
  V: "a5 f#6", W: "g6", X: "d6", Y: "[c#6@2 ~@2 f#5@2 [g#5,g#6] [f#5,f#6], ~ f#6@2 ~]/2",
  Z: "[b5,b6]@2 [a#5,a#6] [d#5,d#6]", AA: "[[g#5,g#6]@2 [f#5,f#6] [b4,b5]@3 [c#5,c#6]@2]/2",
  AB: "[f#5,f#6]@2 [g#5,g#6] [f#5,f#6]", AC: "b4/2",
})).s("gm_string_ensemble_2").gain(0.24).pan(0.2)

// other · string ensemble 2
const string_ensemble_2_2 = note(`<
  ~@19 A B C D A B C D E ~@2 F ~@8 G H G H I J K@2 I L M N O@2 P Q R S T U V W X@2 V W Y@4 ~
>`.pickRestart({
  A: "g3 f#3", B: "e3 d3", C: "c3 b2", D: "a2 d3", E: "c#4 ~", F: "~@10 e4 a4 g#4 e4 b3 ~", G: "a3", H: "b3",
  I: "[e3,e4]@2 [f#3,f#4] [e3,e4]", J: "[a3,a4]@2 [g#3,g#4] [c#3,c#4]",
  K: "[[f#3,f#4]@2 [e3,e4] [a2,a3]@3 [b2,b3]@2]/2", L: "[a3,a4]@2 [g#3,g#4] [c#4,c#5]",
  M: "[f#3,f#4]@2 [e3,e4] [a3,a4]", N: "[a2,a3] [b2,b3]", O: "d4/2", P: "d5 e5", Q: "f#5", R: "[a3,a4] [f#4,f#5]",
  S: "[g4,g5]", T: "[d4,d5]", U: "[c#4,c#5]@8 [f#4,f#5]@7 ~", V: "f#4@2 g#4 f#4", W: "b4@2 a#4 d#4",
  X: "[g#4@2 f#4 b3@3 c#4@2]/2", Y: "[g#4@2 f#4 b3@13]/4",
})).s("gm_string_ensemble_2").gain(0.39).pan(0.8)

// other · distortion guitar
const distortion_guitar = note("<~@27 A ~@11 B@3 ~ C D E F C G E F H I J K L M N O P Q R S P Q T S U ~@2>".pickRestart({
  A: "a2", B: "[e4@9 ~ b3@8 ~@6]/3", C: "a2 g#2", D: "f#2 e3", E: "d3 c#3", F: "b2 e2", G: "f#2 e2", H: "g2", I: "f#2",
  J: "e3 a2", K: "d3", L: "c3 b2", M: "e3@15 ~", N: "f3", O: "f#3", P: "b2 a#2", Q: "g#2 f#2", R: "e3 d#3",
  S: "c#3 f#2", T: "e2 d#3", U: "b2",
})).s("gm_distortion_guitar").gain(0.45)

// other · flute
const flute = note("<~@31 [~ c#6, f#6@5 ~@3] [b5@15 ~] ~@37>").s("gm_flute").gain(0.11).pan(0.1)

// chords · percussive organ
const percussive_organ = note("<~@35 A@2 B@2 C@4 ~@27>".pickRestart({
  A: "[e5@3 a5 e6@27 c#6]/2", B: "[b5 c#6@3, c6 ~@31]/2", C: "[a4, e5@7 ~, f#5@15 ~@49]/4",
})).s("gm_percussive_organ").gain(0.25).pan(0.7)

// chords · percussive organ · soft notes
const percussive_organ_soft = note("<~@40 b4 d5 [~ e4, b4] ~@27>").s("gm_percussive_organ").gain(0.14).pan(0.7)

// chords · rock organ
const rock_organ = note("<~@51 A B C B D E F G ~@11>".pickRestart({
  A: "[a4,b4,d5]", B: "[a4,d5,e5]", C: "[g4,a4,d5]", D: "[c5,e5,f#5]@8 [a4,d#5,f#5]@7 ~", E: "[b4,d5,g5]",
  F: "[d5,f5,g#5]@15 ~", G: "b4 a#4, [c#5,f#5]",
})).s("gm_rock_organ").gain(0.22).pan(0.7)

// other · overdriven guitar
const overdriven_guitar_2 = note("<~@52 [~ a3 d4 e4] [d4@13 ~@3] ~@16>").s("gm_overdriven_guitar").gain(0.45).pan(0.3)

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

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@2 A ~ B ~@6 C D ~@3 E ~@10 E F E@3 F@2 G F E F ~@4 G ~@3 H ~@3 I ~@7 J ~@11
>`.pickRestart({
  A: "~ x", B: "~@3 x", C: "~ x ~@2", D: "~@3 x!2 ~@3", E: "~@11 x!2 ~@3", F: "~@11 x!2 ~ x ~", G: "~@7 x",
  H: "~@13 x ~@2", I: "~@15 x", J: "~@10 x ~ x!4",
})).gain(0.56)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@29 A B@2 ~ B C ~@2 A D A ~@3 B ~@3 B ~@22>".pickRestart({
  A: "x!2", B: "x", C: "x ~@6 x ~@8", D: "x ~@4 x ~@2",
})).gain(0.32)

// drums · mid tom
const mid_tom = s("mt").struct("<~@27 A B A B A B A B A B A B ~@3 C ~@3 D ~@3 E ~@7 F ~@11>".pickRestart({
  A: "~@11 x!2 ~@3", B: "~@11 x ~@4", C: "~@8 x ~@2 x ~ x ~@2", D: "~@11 x ~@2 x ~", E: "~@13 x!2 ~",
  F: "~@7 x ~@2 x ~ x!4",
})).gain(0.56)

// drums · open hat
const open_hat = s("oh").struct("<~@27 A B A C A D A E A D A D ~ F@2 G ~ F ~ H ~@3 I ~@19>".pickRestart({
  A: "~@5 x ~@2", B: "x", C: "~@10 x!3 ~@3", D: "~ x", E: "~@3 x!2 ~@3", F: "~@11 x ~@4", G: "~ x ~@6",
  H: "~@3 x ~@3 x ~@8", I: "~@3 x ~@4 x ~@2 x ~@4",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@42 [~@3 x ~@12] ~@3 [~@9 x ~@6] ~@11 [~@7 x ~@8] ~@11>").gain(0.64)

// … 23 more lines