Strudelify
Luci-ah cover art

1999 · Il mio canto libero

Luci-ah

Battisti

KeyC majorTempo71 bpm
0:00/0:00
// Luci-ah — Battisti
// 70.8 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 75 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(70.8/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 A@2 B C A@2 B C A@2 B C A D E F G D E F G A@3 B H I A J B C A@2 B C A D E F G D E F G A@3 B H I K L M N@2 O@2
  N@2 O@2 N@2 O@2 N@2 P@2
>`.pickRestart({
  A: "[c4,e4,g4]!8", B: "[c4,f4,a4]!8", C: "[d4,g4,b4]!8",
  D: "[c4,f4,a4]@2 [c4,e4,g4]@2 ~@3 [c4,f4,a4]@2 [c4,e4,g4] ~@6", E: "[c4,e4,g4]!8 [b3,d4,g4]!8",
  F: "[b3,d4,g4]@2 [b3,d4,g4]@2 ~@3 [b3,d4,g4]@2 [b3,d4,g4] ~@6", // G
  G: "[c4,e4,g4]!4 [b3,e4,g4]!4 [a3,c4,e4]!4 [g3,b3,d4]!4", H: "[c4,f4,a4]!4 [d4,g4,b4]!4",
  I: "[d4,g4,b4]!4 [c4,e4,g4]!4", J: "[c4,e4,g4]!4 [c4,f4,a4]!4", K: "[c4,e4,g4]!4 [f4,a4]@2 [e4,g4]@2",
  L: "c4@2 [f4,a4] [e4,g4]", M: "c4@8 [c4,e4,g4]!8",
  N: "[[b3,d4,g4]!8 [b3,d4,g4]@2 [b3,d4,g4]@2 ~@3 [b3,d4,g4]@2 [b3,d4,g4] ~@6 [c4,e4,g4]!4 [b3,e4,g4]!4]/2", // G C Em
  O: "[[a3,c4,e4]!4 [g3,b3,d4]!4 [c4,f4,a4]@2 [c4,e4,g4]@2 ~@3 [c4,f4,a4]@2 [c4,e4,g4] ~@6 [c4,e4,g4]!8]/2", // Am G F C F C
  P: "[[a3,c4,e4]!4 [g3,b3,d4]!4 [c4,f4]@2 [c4,e4]@14 ~@8]/2", // Am G F5 C
})).s("gm_piano").gain(0.12)

// bass · electric bass finger · "Basso"
const bass = note(`<
  A@2 B@2 C D A B C D E B C D B@2 C D B F G H I F G H I A B@2 J K@2 L@2 M N E B C D B F G H I F G H I ~@6 O P Q R@2 S@2
  R@2 S@2 R@2 S@2 R@2 T@2
>`.pickRestart({
  A: "c3@15 g2", B: "c3", C: "f3", D: "g3", E: "c3@8 g3 e3@3 g3 c3@3", F: "f3@2 c3@2 ~@3 f3@2 c3 ~@6", G: "c3 b2",
  H: "g2@2 g2@2 ~@3 g2@2 g2 ~@6", I: "c3 b2 a2 g2", J: "f3@8 f3 e3@2 c3@2 d3@2 c3",
  K: "[f3 e3@2 d3@2 c3@2 a2 g2@16 c3@8]/2", L: "[c4 a3@2 g3@2 e3 d3 c3 c3@16 f3@8]/2",
  M: "f3 e3@2 c3@2 d3@2 c3 f3 e3@2 d3@2 c3@2 a2", N: "g2", O: "~@2 f3 e3", P: "c3@2 f3 e3", Q: "c3!2",
  R: "[b2@8 g2@2 g2@2 ~@3 g2@2 g2 ~@6 c3@4 b2@4]/2", S: "[a2@4 g2@4 f3@2 c3@2 ~@3 f3@2 c3 ~@6 c3@8]/2",
  T: "[a2@2 g2@2 f3 c3@7 ~@4]/2",
})).s("gm_electric_bass_finger").gain(0.34)

// chords · synth strings 2 · "Orch." · F C F C
const synth_strings_2 = note("<~@56 [~@2 [f4,a4,c5] [e4,g4,c5]] [c4@2 [f4,a4,c5] [e4,g4,c5]] [c4 ~] ~@16>")
  .s("gm_synth_strings_2").gain(0.64)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@10 A B@8 C B D B C B D B ~@10 A B@4 C B D B C B D B ~@8 E F G F H F G F H F G F H F G I ~
>`.pickRestart({
  A: "~@9 x ~@3 x ~@2", B: "~ x ~ x ~ x ~ x", C: "x ~ x ~@4 x ~ x ~@6", D: "x ~ x ~@4 x ~ x ~@5 x", E: "~@5 x ~ x",
  F: "~@2 x ~@3 x ~ x ~ x ~@4 x", G: "~ x ~@5 x ~@2 x ~@3 x ~", H: "~ x ~@8 x ~@3 x ~", I: "~ x ~ x ~ x ~@2",
})).gain(0.64)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@10 A B@8 C B D B C B D B ~@10 A B@4 C B D B C B D B ~@8 E F G F H F G F H F G F H F G F ~
>`.pickRestart({
  A: "~@9 x ~@3 x ~@2", B: "x!8", C: "~@2 x ~@6 x ~@6", D: "~@2 x ~@6 x ~ x ~ x ~ x", E: "~@4 x!4", F: "x!4 ~ x ~@2",
  G: "~ x ~ x ~ x ~ x!2 ~ x ~ x ~ x ~", H: "~ x ~@6 x ~ x ~ x ~ x ~",
})).gain(0.64)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@11 A@8 ~ A ~ A ~ A ~ A ~@11 A@4 ~ A ~ A ~ A ~ A ~@8 B C B C B C B C B C B C B C B C ~
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", B: "~@9 x ~ x ~ x ~ x", C: "~ x ~ x ~ x ~ x ~@8",
})).gain(0.64)

// drums · china
const china = s("cr").struct(`<
  ~@11 A ~@3 A ~@3 B A B A B A B A@2 ~@10 A ~@3 B A B A B A B A@2 ~@7 C D E D E D E D E D E D E D E F ~
>`.pickRestart({
  A: "x", B: "x ~ x ~@4 x ~ x ~@6", C: "~ x", D: "~@8 x ~ x ~@4 x", E: "~ x ~@6 x ~@7", F: "~@5 x ~@2",
})).gain(0.64)

stack(piano, bass, synth_strings_2, kick, snare, low_tom, mid_tom, high_tom, china)

More by Battisti