Strudelify

Belli capelli

Francesco De Gregori

KeyC majorTempo126 bpm
0:00/0:00
// Belli capelli — Francesco De Gregori
// 126 bpm, 4/4, key C 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 107 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(126/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@33 A B C D E F G H I J K L M ~ N@3 ~ O P Q R S P Q T M U V W M X Y@4 A B C D E F G H I J K L M ~ N@3 ~ O P Q R S P Q
  T M U V W Z AA Y@4 AB ~
>`.pickRestart({
  A: "c2@13 ~ c2 ~", B: "g2@12 d2 ~ b1 ~", C: "g1@13 ~ d2@2", D: "g1 ~@3 g1@11 ~", E: "a1 g1", F: "f1 g1",
  G: "c2@13 ~ g1@2", H: "c2@11 ~ a1@2 g1@2", I: "f1", J: "g1@15 ~", K: "c2@7 g2", L: "c3 ~@3 c2@7 ~ c2@2 c#2@2",
  M: "d2@3 ~", N: "g1/3", O: "g1@10 ~@2 d2@2 c#2 ~", P: "c2 g1", Q: "f1@7 c2", R: "f2 ~@3 f2@7 ~ f1@2 f#1@2",
  S: "g1@6 d2 c#2", T: "f2 e2", U: "~@3 a2", V: "g2@10 ~@2 g2 ~@3", W: "g1 ~@3 g1@8 c2@2 c#2@2", X: "~@12 a2@3 ~",
  Y: "[g2@7 ~]/4", Z: "d2@6 c3 c#3", AA: "d3@12 a2@3 ~", AB: "c2",
})).s("gm_acoustic_bass").gain(0.42)

// bass · acoustic bass · "ACOU BASS" · soft notes
const bass_soft = note("<~@45 A B ~@3 C ~@8 A D ~@2 A D ~@16 A B ~@3 C ~@8 A D ~@10>".pickRestart({
  A: "~@6 c3 c#3", B: "d3", C: "g3@15 ~", D: "d3@3 ~",
})).s("gm_acoustic_bass").gain(0.23)

// chords · acoustic guitar nylon · "A.GUITAR"
const acoustic_guitar_nylon = note(`<
  A@2 B C@2 D E F G H I J@2 K L M@2 N@2 O P Q R S T U V W@2 X@2 Y Z AA AB AC AD AE AF AG AH AI AJ AK@2 AL@5 AM AN AO
  AP@2 AQ AR AS AT AU@2 AV AW AX@2 AY@5 AB AC AD AE AZ AG AH AI AJ BA@2 BB@2 BC@3 AM AN AO AP@2 AQ AR AS AT BD@2 AV AW
  AX@2 BE@5 ~
>`.pickRestart({
  A: "[~@14 d3 ~ d3@2 ~@10 g3@4, ~@5 g2@7 e4@4, ~@3 c3@5, ~@4 g3 c4@3, ~@9 e3@7]/2",
  B: "g3 ~@2 g3, [g2,d3], ~ g3@2 ~, ~ e4", // G5
  C: "[[d3,g3,a3]@4 [d3,g3,c4]@5 ~@3 [b3,g4]@8 ~@2 b3@2 [e3,g3,c4]@2 ~@4 b3@2, ~@10 g3@2 ~ d4@3, ~@7 g3]/2", // Dsus4 Csus2 Em C
  D: "~@3 c4 a3@2 ~ c4, a2 g2, ~@2 a3@2 c4@3 ~, ~@3 a3", E: "~@3 c4 ~@2 b3@2, f2 g2, ~@2 a3@2 ~ g3@3",
  F: "g3@2 ~ c4 ~@3 c4, c3@4 c4@3 ~, ~ g3 e3@2, ~@5 f3@3, ~@3 g3", G: "c4 ~ g3@2 ~@3 c4, e3 c3, ~@4 c4@3 ~, ~@3 g3",
  H: "~@7 c4, f3, ~ a3@2 a3, ~@4 c4@3 ~", I: "[f3,a3] b3 d4@2 d4@2 b3!2, ~ g3@7, ~ b3@2 d4, ~ f4",
  J: "[~ g3 ~ g3 ~ g3 [b3,d4] [c4,e4], c3, ~@8 [b3,d4]@8 [c4,e4]@7 ~@9]/2", K: "f4 e4 c4@2 ~@2 c4@2, [d3,a3] [a3,f4]",
  L: "~ c4 ~ c4, [a3,c5] [a3,f4]", M: "[~@3 g3@5, g2, ~ g3@2 ~@5, ~ b3@3]/2",
  N: "[~@3 c4 ~@3 g3, c3, ~ e3@7, ~ g3 b3@2, ~@3 e4]/2", O: "~@3 f4, g2, ~ a3@3, ~ c4", P: "~ b3, [g2,g4], ~ g3@2 ~",
  Q: "~@3 c4 ~@3 c4, a2 g2, ~@2 a3@2 c4@3 ~, ~@3 a3", R: "~@2 a3 c4 ~@3 e4, f2 g2, c4@3 ~ b3@2 b3@2, ~ f3@2 ~@2 g3@3",
  S: "~@3 c4 e3 ~@2 c4, c3@2 ~ g3, ~@2 g3@2 ~ f3@3", T: "~@3 g3, e3, ~ g3@2 ~, ~ c4",
  U: "~@12 a3@2 c4 ~, f3@15 ~, ~ a3@2 ~, ~@4 c4@3 ~", V: "f3 ~@5 b3!2, ~ g3@7, ~ b3@2 ~, ~ d4",
  W: "[~@3 g3 e4@2 ~ g3, c3, ~ g3@2 ~@5, ~@8 d4@9 ~@7 c4@8]/2",
  X: "[[d3,f4] e4 ~@10 f4@4, a3, ~ c4@2 ~ c5@4, ~ f4@2 ~, ~@5 c4@2 ~]/2", // Dm
  Y: "~@4 d3 ~ g3 b3, g2@5 ~@3, d3@4 ~ e3@2 ~, b3@3 b3@2 ~@3, ~@2 g3@3 ~@3", Z: "[g2,d3,f4]@15 ~",
  AA: "~@3 g3, c3, ~ g3@2 ~, ~ c4", AB: "~@2 e4 ~, g2, ~ g3@3", AC: "~@3 e3, g2, ~ a3@3, ~ c4",
  AD: "~@3 b3, g2, ~ d3@3, ~ g3", AE: "~@3 c4 ~@3 c4, a2 [g2,b3], ~ a3 ~ a3",
  AF: "~@2 a3 c4 ~@2 d3@2, f2 [g2,b3], c4@3 ~@5, ~@2 f3@5 ~@9", // G
  AG: "~@3 c4 e3 ~@2 c4, c3@9 ~@7, ~ e3@3 ~ f3@3, ~@4 g3@5 ~@3 g3@4",
  AH: "f3@2 ~@10 c4@3 ~, ~@2 e3@13 ~, ~@4 g3@11 ~, ~@8 c3@7 ~", AI: "~@6 f3!2, f3@3 ~, ~ a3@3, ~ c4",
  AJ: "~@3 g2, g3, ~ b3@3, ~ d4", AK: "[~@3 f4 ~@3 e3, c3, ~ g3@3 ~ g3@3, ~@8 d4@7 ~ e4@16, ~@3 c4]/2",
  AL: "[[d3,f4] ~ c4@4 ~@12 g3@2 g3@2 [d3,g3]@2 g3@2 g3@2 g3@2 [d3,g3]@2 ~@2 g3@2 g3@2 [d3,g3]@2, a3@32 g2@45 ~@3, ~@5 c4@2 ~@2 d3@2 ~@2 d3@2 ~@2 d3@2 ~, ~@3 f4@3 f4@2 e4@2, ~@5 b3 ~ b3 ~ b3]/5", // Dm G5
  AM: "[g2,d3,g3,d4]", AN: "~ d4, g2, ~ d3@3", AO: "~@3 e3, c3, ~ g3@3, ~ c4",
  AP: "[~@3 f3 ~ f3 ~ f3, f3@3 ~@5, ~ a3@7, ~ c4 c4 c#4]/2", AQ: "~@3 g3, g2, ~ d3@3, ~ d4",
  AR: "~@3 c4, c3, ~ e3@3, ~ g3", AS: "~@3 f3, f2, ~ f3@2 ~, ~ c4", AT: "~ f3 ~ g3, [f2,c4] [e2,c4]",
  AU: "[~@3 f#3 ~@3 d3, d3@4 d3@3 ~, ~@4 a3@13 ~@3 a3@12, ~@8 d4@16 d4@7 ~]/2",
  AV: "~@3 g3, g2@15 ~, ~@4 d3@11 ~, ~ d4", AW: "~@2 g3@2 g3!2 ~ g2, g2@7 ~, ~ c4, ~@5 b3@3, ~@3 g3",
  AX: "[~@7 d3 ~@6 f#3@2, d3@7 ~ d3@8, ~@4 a3@13 ~@3 a3@12, ~ d4@2 d4, ~@3 f#3 ~@4]/2",
  AY: "[~@20 g3@4 g3@4 ~@8 g3@4 ~@4 g3@3 ~@2 f4@14 ~@13 g3@4, [g2,d3]@16 g2@16 g2@15 [g2,d3]@18 ~@15, ~ g3@2 g3@2 ~@2 g3@2 ~@3 [a3,d4]@4 c3@4, ~@2 b3@6 ~@2 b3@2 ~@5 g3@2 ~, ~ d4 ~ c4 ~@5 c4]/5", // G5 D5
  AZ: "~@2 a3 c4 ~@2 d3@2, f2 [g2,b3], c4@3 ~@5, ~ f3@3 ~@4", // G
  BA: "[~@3 f4 ~@3 e3, c3, ~@4 g3@11 ~@5 g3@12, ~@8 d4@7 ~ e4@16, ~@3 c4]/2",
  BB: "[[d3,f4] ~ c4@4 ~@6 f4@4, a3, ~@5 c4@2 ~]/2", // Dm
  BC: "[~ g3!2 [d3,g3] g3!3 [d3,g3] ~ g3!2 [d3,g3], g2@15 ~, ~ d3@2 ~@2 d3@2 ~@2 d3@2 ~, ~ b3 f4@2 e4@2, ~@3 b3 ~ b3]/3", // G5
  BD: "[~@12 f#3@4 ~@12 d3@3 ~, d3@4 d3@3 ~, ~@4 a3@13 ~@3 a3@11 ~, ~@8 d4@16 d4@7 ~]/2",
  BE: "[~@20 g3@4 g3@4 ~@8 g3@4 ~@4 g3@3 ~@2 f4@14 ~@2 g4@15, [g2,d3]@16 g2@16 g2@15 [g2,d3]@18 ~@15, ~ g3@2 g3@2 ~@2 g3@2 ~@3 [a3,d4]@4 ~@4, ~ b3@3 ~ b3 ~@4, ~ d4 ~ c4 ~@4 c4@2]/5", // G5 D5
})).s("gm_acoustic_guitar_nylon").gain(0.15)

// chords · acoustic guitar nylon · "A.GUITAR" · soft notes
const acoustic_guitar_nylon_2 = note(`<
  ~@3 A@2 ~ B ~ C ~@7 D ~ E ~ F ~@7 G H@2 ~ I ~ J ~@10 K@3 ~ L ~ F ~@15 M ~@2 J ~@10 N@2 ~@2 L ~ F ~@15 M ~ O ~
>`.pickRestart({
  A: "[g2@4 g2@5 ~@3 [g2,d3]@8 ~@6 d3@6]/2", B: "~@7 e4", C: "~ c4@3 ~@4", D: "f4", E: "~ g3 ~@2", F: "~@3 g3",
  G: "~ g3@2 ~", H: "[~@3 c4@2 ~@2 c4]/2", I: "g3@15 ~", J: "~@3 d4",
  K: "[~ e4 ~@12 c4@10, ~ f4@2 ~@3, ~@3 c4@2 ~@7, ~ c5@2]/3", L: "g3 ~@3", M: "~@2 g3 ~",
  N: "[~ e4 ~@12 c4@2, ~ f4@2 ~, ~@3 c4@2 ~@3, ~ c5]/2", O: "g3",
})).s("gm_acoustic_guitar_nylon").gain(0.1)

// chords · drawbar organ · "ORG/STRING"
const drawbar_organ = note(`<
  ~@5 A B C D E F G H I@2 J ~@17 K@2 L M N@2 O@2 P Q R@2 S@2 T U V W ~@8 X@2 Y@2 Z@2 AA AB AC AD K@2 L M N@2 O@2 P Q R@2
  S@2 T U V W ~@16 AE AF AG ~
>`.pickRestart({
  A: "a4 g4, [c5,e5]", B: "[f4,a4,c5] [g4,b4,d5,e5]", C: "[g4,c5,e5]@15 ~", D: "~@15 g#5", E: "[f4,a5]",
  F: "b5@4 a5@4 f5@4 d5 ~ b4@2, d5@3 ~", G: "c5 d5", H: "e5@2 d5 e5", I: "[f5 e5 c5@6, f3]/2", J: "d5@15 ~",
  K: "[[c5,e5] [b4,d5], g5]/2", L: "[a4,c5,f5]", M: "[b4,d5,f5,g5]", N: "[a4 g4 [f4,a4] [g4,b4,d5,e5], c5@3 ~, e5 ~]/2",
  O: "[[g4,c5,e5]@31 ~]/2", P: "c5@11 ~ c5@4, [f4,a4]@15 ~", Q: "b4 c5 d5 f5, g4@15 ~",
  R: "[e5@3 f5 [e5,g5]@3 e5, [g4,c5]]/2", S: "[f5@2 e5 f5, [a4,d5]]/2", T: "[g4,b4]", U: "[f5,a5]", V: "[e5,g5]",
  W: "[d5,f5]@15 ~", X: "[a4,c5,d5,f#5]/2", Y: "[~@3 c6, [b4,d5,g5]]/2", Z: "[[f#5,a5] f#5, [a4,c5,d5]]/2",
  AA: "[b4,d5,g5,b5]", AB: "[c5,f5,g5,a5]", AC: "[b4,e5,g5]", AD: "[a4,d5]@3 ~", AE: "[b4,e5], g5 ~@15", AF: "[a4,d5]",
  AG: "[g4,c5]@15 ~", // C5
})).s("gm_drawbar_organ").gain(0.06)

// chords · drawbar organ · "ORG/STRING" · soft notes
const drawbar_organ_soft = note("<~@9 A B C@2 ~@2 D ~@26 E ~@25 F ~@9 E ~@25 G H ~>".pickRestart({
  A: "c5", B: "g4 ~@3", C: "[e4@8 ~@8 c4@15 ~, g4]/2", D: "g3@15 ~", E: "~@8 b4@7 ~", F: "f5@3 ~", G: "f5",
  H: "e5@15 ~",
})).s("gm_drawbar_organ").gain(0.02)

// drums · kick
const kick = s("bd").struct(`<
  ~@33 A@3 B A B A B A B A B A B A ~@3 A B A B A B A B A B A B A B A ~@3 A@3 B A B A B A B A B A B A ~@3 A B A B A B A B
  A B A B A B A ~@5
>`.pickRestart({
  A: "x", B: "x!2 ~@2",
})).gain(0.31)

// drums · rim
const rim = s("rim").struct("<~@33 [~ x]!14 ~@22 [~ x]!14 ~@24>").gain(0.24)

// drums · snare
const snare = s("sd").struct("<~@51 [~ x]!13 ~@23 [~ x]!13 ~@7>").gain(0.27)

// drums · low tom
const low_tom = s("lt").struct("<~@50 [~@3 x ~@4] ~@13 [~ x] ~@35 [~ x] ~@6>").gain(0.17)

// drums · hihat
const hihat = s("hh").struct("<~@33 A B C B C B C B C B C B C D ~@22 A B C B C B C B C B C B C D ~@24>".pickRestart({
  A: "~ x!3", B: "x!4", C: "x!2 ~ x", D: "x!3 ~",
})).gain(0.24)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@35 A ~ A ~ A ~ A ~ A ~ A ~@25 A ~ A ~ A ~ A ~ A ~ A ~@25>".pickRestart({
  A: "~ x",
})).gain(0.14)

// drums · mid tom
const mid_tom = s("mt").struct("<~@50 [~ x ~@2] ~@13 [~ x ~@2] ~@35 [~ x ~@2] ~@6>").gain(0.17)

// drums · open hat
const open_hat = s("oh").struct("<~@33 A ~@12 B ~@22 A ~@12 B ~@24>".pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.24)

// drums · crash
const crash = s("cr").struct("<~@51 A ~@7 A ~@5 A ~@21 A ~@7 A ~@5 A ~@5>".pickRestart({
  A: "x",
})).gain(0.21)

// drums · ride
const ride = s("rd").struct("<~@47 A ~@3 B C@6 D B C@5 ~@18 A ~@3 B C@6 D B C@5 ~@4 A ~>".pickRestart({
  A: "x", B: "~ x!3", C: "x!4", D: "x ~@3 x ~@3 x ~ x!3 ~ x ~",
})).gain(0.24)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@34 A ~ A ~ A ~ A ~ A ~ A ~ A ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~@5 A ~ A ~ A ~ A ~ A ~ A ~
  A ~@6
>`.pickRestart({
  A: "~ x",
})).gain(0.24)

// drums · claves
const claves = s("clave:2").struct("<~@50 A ~@13 B ~@21 A ~@13 B ~@6>".pickRestart({
  A: "~ x", B: "~@3 x",
})).gain(1)

stack(
  bass, bass_soft, acoustic_guitar_nylon, acoustic_guitar_nylon_2, drawbar_organ, drawbar_organ_soft, kick, rim, snare,
  low_tom, hihat, hihat_soft, mid_tom, open_hat, crash, ride, tambourine, claves
)