Strudelify

Strani giorni

Battiato

KeyD majorTempo175 bpm
0:00/0:00
// Strani giorni — Battiato
// 175 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 177 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(175/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 · electric bass finger · "STRANIGI"
const bass = note(`<
  A B@2 C D C E F G@6 H@2 I@2 G@6 H J I@2 G@8 K L G@8 H@2 I@2 M@2 N G@4 H J I@2 G@6 H@2 I@2 G@9 O@2 P H J I@2 G@6 H J
  I@2 G@19 Q N R G S T U I V W S T U I X G@5 S H Y I X G@7 S H Y I X G@5 Z AA AB AA R Z AA AB G@5 AC I AD@4
>`.pickRestart({
  A: "~@4 d2 ~ d2@4 d2 ~ d2 ~ d2 ~", B: "[d2@4 d2 ~ d2@4 d2 ~ d2 ~ c2@6 d2@3 ~ d2 ~ d2@3 ~ d2 ~]/2",
  C: "d2@3 ~ d2 ~ d2@3 ~ d2 ~ d2 ~ d2 ~", D: "d2@3 ~ d2@3 ~ d2 ~ d2@3 ~ d2 ~", E: "d2 ~ d2@3 ~ d2 ~ d2@3 ~ d2 ~ d2@2",
  F: "~@2 d2 ~ d2 ~ d2 ~ d2@8", G: "d2!8", H: "e2!8", I: "g1!8", J: "d2 e2@2 d2 e2!2 d2 e2", K: "d2!6 d2@2",
  L: "d3@2 d3!2 d3@2 d3!3 d3@2 d3 d3@4", M: "d1!2", N: "d1!8", O: "c2@2 d2!6", P: "d3!8", Q: "d2!2 d2@2 d1!4",
  R: "d1!4 d2!4", S: "d2!4 e2!4", T: "e2!4 d2 e2@2 d2", U: "e2!2 d2 e2 g1!4", V: "g1!2 g1@2 d2@2 d2@2",
  W: "d2@2 d2@2 d2!4", X: "g1!4 d2!4", Y: "e2!4 g1!4", Z: "d2!4 c2@2 d2!2", AA: "d2!4 d1!4", AB: "d1!2 d2!2 c2@2 d2!2",
  AC: "d2!4 g1!4", AD: "[g1@2 g1@2 g1@3 ~ a1@54 ~@2]/4",
})).s("gm_electric_bass_finger").gain(0.38)

// chords · synth strings 2 · "STRANIGI"
const synth_strings_2 = note(`<
  A B@6 C@8 D@3 E@5 F@2 G@3 H@2 ~@8 I@8 A J@3 K L M N@2 M O@5 P@7 J@3 H@2 Q@8 ~ R@2 G@3 K L M S@2 F@2 G@3 T L U@7 V@6
  W@8 X@6 Y@4 Z@8 AA@2 AB@8 AC@8 AD@8 AE@4 AF@5 AG@4
>`.pickRestart({
  A: "[e4,e5]", B: "[[g4,g5]@16 [f#4,f#5]@16 [e4,e5]@15 [g4,g5]@16 ~ [f#4,f#5]@15 ~ [e4,e5]@16, d4@79 b3@17]/6",
  C: "[g5@16 [e4,e5]@16 [g4,g5]@16 [f#4,f#5]@16 [e4,e5]@15 [g4,g5]@16 ~ [f#4,f#5]@15 ~ [e4,e5]@16, g4@32 ~@79 b3@17, ~ d4@6 ~]/8", // E G F# E G F# E
  D: "[[g4,g5]@15 ~ [f#4,f#5]@16 [d4,d5]@16, ~@15 g3@19 ~@14]/3", // G F# D
  E: "[[e4,e5]@16 [g4,g5]@16 [f#4,f#5]@16 [e4,e5]@15 g5@16 ~, d4@49 ~@14 g4@2 ~@15]/5", // E G F# E
  F: "[[f#4,f#5]@15 ~ [e4,e5]@16, ~@15 b3@17]/2", G: "[~ g3@2, [g4,g5]]/3", H: "[[e4,e5] [g4,g5], d4]/2",
  I: "[[e4,e5]@16 [g4,g5]@16 [f#4,f#5]@16 [e4,e5]@15 [g4,g5]@16 ~ [f#4,f#5]@16 [e4,e5]@15 [g4,g5]@16 b3, d4@127 ~]/8", // E G F# E G F# E G
  J: "[[g4,g5]@15 ~ [f#4,f#5]@16 [d4,d5]@16, ~@5 g3@11]/3", K: "[e4,e5], d4@5 ~@11", L: "[g4,g5]", M: "[f#4,f#5]",
  N: "[[e4,e5]@15 [g4,g5]@17]/2", O: "[[e4,e5]@15 ~ e4@16 ~@16 g3@17 ~@15, ~@15 b3@17 [g4,g5]@48, ~ e5@4]/5",
  P: "[[e4,e5]@16 [g4,g5]@16 [f#4,f#5]@16 [e4,e5]@15 [g4,g5]@16 ~ [f#4,f#5]@15 ~ [e4,e5]@16, d4@95 b3@17]/7", // E G F# E G F# E
  Q: "[e4@40 a3@73 ~@15, ~@5 f#4@7 ~@4]/8", R: "[~ [e4,e5], ~@15 b3@17]/2", S: "[[e4,e5]@15 [g4,g5]@16 ~]/2",
  T: "[e4,e5], d4 ~@3", U: "[e4@5 a3@9, ~@5 f#4@7 ~@2]/7", V: "[~@5 f#4@7, e4 ~, ~@40 a3@11 ~@45]/6",
  W: "[~@8 f#3@32 ~@32 f#4@15 e4@16 g4@16 f#4@9, ~ a3@15, ~@5 d3@11]/8",
  X: "[~@2 [e4,e5]@4 ~@4 g3@8 d4@3 ~@3, ~@7 b3@17 [g4,g5]@48 ~@24]/6", // E G
  Y: "[~ [e4,e5]@2 ~@2 g3@3, ~@7 b3@17 [g4,g5]@40]/4", // E G
  Z: "[~@8 [e4,e5]@16 [g4,g5]@16 [f#4,f#5]@16 [e4,e5]@15 [g4,g5]@16 ~ [f#4,f#5]@15 ~ [e4,e5]@16 [g4,g5]@8, ~@8 d4@95 b3@17 ~@8]/8", // E G F# E G F# E G
  AA: "[~ [f#4,f#5]@2 [d4,d5], ~@7 g3@25]/2", // F# D
  AB: "[~@8 [e4,e5]@16 [g4,g5]@16 [f#4,f#5]@16 [e4,e5]@15 [g4,g5]@16 ~ [f#4,f#5]@16 [e4,e5]@15 [g4,g5]@9, ~ d4@15]/8", // E G F# E G F# E G
  AC: "[~@8 [e4,e5]@16 [g4,g5]@15 ~ f#4@16 [d4,d5]@16 [e4,e5]@16 [g4,g5]@16 [f#4,f#5]@16 [d4,d5]@8, ~@7 b3@17 ~@15 g3@33 d4@48 ~@8, ~@20 f#5@5 ~@39]/8", // E G D E G F# D
  AD: "[~@8 e5@16 [g4,g5]@16 [d4,f#4,f#5]@16 [d4,d5]@15 ~ e5@16 [g4,g5]@16 [d4,f#4,f#5]@16 [d4,d5]@8, ~@7 c4@49 ~@15 c4@48 ~@9, ~@7 e4@17 ~@47 e4@17 ~@40]/8", // G D G D
  AE: "[~ e5@2 [g4,g5]@2 [d4,f#4]@2 [d4,d5], ~@7 c4@49 ~@8, ~@7 e4@17 ~@16 f#5@12 ~@12]/4", // G D
  AF: "[~ e5@2 g4@2 [d4,f#4]@2 d5@3, ~@7 c4@48 ~ d4@16 ~@8, ~@7 e4@17 g5@8 ~@8 f#5@11 ~@29]/5", // D
  AG: "[~@8 [a3,c#4,f#4]@53 ~@3]/4", // F#m
})).s("gm_synth_strings_2").gain(0.16).pan(0)

// chords · string ensemble 1 · "STRANIGI"
const string_ensemble_1 = note(`<
  A@8 B@5 C@5 D@4 ~ E@5 F@2 ~@8 G@7 E@5 H@6 I@5 J@5 E@5 K@2 L@6 M@4 N@4 O@5 E@5 P@2 L@6 Q@4 R@7 S@8 T@6 U@6 V@4 W@8 V@4
  X@8 Y@8 Z@5 AA@4
>`.pickRestart({
  A: "[[a3,d4]@95 g3@33, ~@95 b3@18 ~@15]/8", B: "[d4, a3 ~@79]/5", C: "[~@15 g3@51 ~@14, ~@15 b3@17 ~@48]/5",
  D: "[d4@49 ~@15, a3@11 ~@21]/4", E: "[~@3 g3@13, ~@15 b3@17 ~@48]/5", F: "[a3,d4]/2", G: "[d4, a3@17 ~@39]/7",
  H: "[a3, d4@5 ~@91]/6", I: "[~@3 g3@10 ~@3, ~@15 b3@17 ~@48]/5", J: "[a3,d4]/5", K: "[d4, a3@17 ~@15]/2",
  L: "[c4 ~@47 [f#4,f#5]@48, c5@35 ~@61, ~@32 d4@63 ~]/6", M: "[~ f#5@46 e5@16 ~, [d4,f#4]@63 ~]/4",
  N: "[g3, b3 ~@3]/4", O: "[a3@69 ~@11, d4 ~@15]/5", P: "[a3, d4 ~@7]/2",
  Q: "[~ [c4,c5], [d4,f#4]@63 ~, ~ f#5@47 ~@16]/4", R: "[~@2 [f#4,f#5]@5 [a4,c#5]@7, d4 ~]/7",
  S: "[~@8 f#4@16 e4@15 g4@17 f#4@15 g3@57, ~@8 [a3,d4]@65 ~@55, ~@71 b3@17 ~@40]/8", // D5
  T: "[~@8 a4@31 g3@57, ~@39 b3@17 ~@40]/6", U: "[~ d4@11, ~@8 a3@9 ~@79]/6", V: "[~@7 g3@57, ~@7 b3@17 ~@40]/4",
  W: "[~ [a3,d4]@15]/8", X: "[~ [a3,d4]@8 ~@4 [a3,d4]@3, ~@9 c4@6 ~]/8",
  Y: "[~@5 [a3,d4]@4 ~@4 [a3,d4]@3, ~ c4@6 ~@2 c4@6 ~]/8", Z: "[~@5 [a3,d4]@4 ~, ~ c4@6 ~@3]/5",
  AA: "[~@8 [c#4,f#4,c#5,f#5]@53 ~@3]/4", // F#5
})).s("gm_string_ensemble_1").gain(0.17).pan(0)

// chords · overdriven guitar · "STRANIGI"
const overdriven_guitar = note(`<
  A B@2 A C D A E A B@2 A C D F B@2 G A B@2 A C D F B@2 H A E ~@8 A B@2 A C D A C F B@2 G A B@2 A C D@2 F B@2 H A B@2 A
  C D F B@2 G A E ~@10 F B@2 H A B@2 A C D F B@2 H A E ~@17 I@8 ~@2 J@8 K@2 L@8 M@4 N@8 O@16 P@5
>`.pickRestart({
  A: "[e4,g4]", B: "[f4 e4, c4]/2", C: "f4", D: "e4", E: "[c4,f4]", F: "[b3,e4]", G: "[c4,e4]", H: "[d4,g4]",
  I: "[~ f#4@2 e4@2 g4@2 f#4@2 [b3,e4]@2 f4@2 e4@2 [d4,g4], ~ d4@8 ~@2 c4@4 ~]/8", // E5 G5
  J: "[~ [b3,e4]@2 f4@2 e4@2 [d4,g4]@2 [e4,g4]@2 f4@2 e4@2 [e4,g4], ~@3 c4@4 ~@4 c4@4 ~]/8", K: "[~ f4@2 e4]/2",
  L: "[~ [b3,e4]@2 f4@2 e4@2 [c4,e4]@2 [e4,g4]@2 f4@2 e4@2 [e4,g4], ~@3 c4@4 ~@4 c4@4 ~]/8", // E5 C Em
  M: "[~ f4@2 e4@2 [e4,g4]@2 f4]/4", // Em
  N: "[~ [b3,e4]@2 f4@2 e4@2 [c4,e4]@2 [e4,g4]@2 f4@2 e4@2 [a3,d4], ~@3 c4@4 ~@4 c4@4 ~]/8", // E5 C Em D5
  O: "[~ [e4,g4]@2 f4@2 e4@2 [a3,d4]@2 [e4,g4]@2 f4@2 e4@2 [a3,d4], ~@3 c4@4 ~@4 c4@4 ~]/8", // Em D5 Em D5
  P: "[~@8 [e4,g4]@16 [c#4,f#4]@53 ~@3]/5", // Em F#5
})).s("gm_overdriven_guitar").gain(0.21).pan(1)

// chords · overdriven guitar · "STRANIGI" · soft notes
const overdriven_guitar_soft = note(`<
  ~@4 A@2 ~@6 A@2 ~@8 A@2 ~@18 A@2 ~ B ~@8 A@2 C ~@8 A@2 ~@24 A@2 ~@41 D@3 ~@7 D@3 E@2 ~@28
>`.pickRestart({
  A: "c4/2", B: "c4", C: "g4", D: "[~ c4@4 ~]/3", E: "[~ c4@2 ~]/2",
})).s("gm_overdriven_guitar").gain(0.14).pan(1)

// chords · church organ · "STRANIGI"
const church_organ = note(`<
  ~@8 A@2 B ~@27 C@3 ~@38 D@4 ~@22 E@8 ~@13 F@4 G@6 H@4 I@8 J@8 K@5 ~@7 L@6 ~@3
>`.pickRestart({
  A: "[[f#4,a4]@7 ~ f#4@23 ~, ~@8 a4@19 ~@5]/2", B: "[f#4,a4]!2", C: "[f#4, a4@17 ~@7]/3",
  D: "[~@32 e5@31 ~, [a4,a5], ~@5 f#4@58 ~]/4", E: "[~@4 e5@11 ~, a4@15 ~, a5 ~, ~@5 f#4@58 ~@65]/8",
  F: "[~ [g4,b4]@7]/4", G: "[~ d5@11, ~@8 a4@9 ~@79]/6", H: "[~ b4@7, ~ g4@4 ~@3]/4", I: "[~ [a4,d5]@15]/8",
  J: "[~ b4@8 a4@7, ~@8 g4@32 ~@32 d5@29 ~@27]/8", K: "[~@8 d5@63 ~ [a4,d5] ~@7, ~@8 a4@11 ~@61]/5",
  L: "[~ [a4,d5]@10 ~]/6", // D5
})).s("gm_church_organ").gain(0.12).pan(0.1)

// other · overdriven guitar · "STRANIGI"
const overdriven_guitar_2 = note(`<
  ~@30 A@2 B C D E ~@37 A@2 B C D E ~@20 A@2 B C D E F@2 G H@2 B C I ~@29 J@8 K@2 L M@5 ~ N@4 O P Q@3 R@2 S T@2 U@4
>`.pickRestart({
  A: "[g3@4 g3@3 ~ a3@2 ~@2 g3@2 a3@5 ~ a3@2 ~@2 g3@2 ~@2 a3@2 ~@2]/2", B: "b3@3 ~ g3@2 a3@5 ~ a3@2 ~@2",
  C: "g3@2 a3@5 ~ a3@3 ~ b3@3 ~", D: "c4@2 ~@2 d4@3 ~ g3@2 a3@5 ~", E: "a3@2 ~@2 g3@2 a3@5 ~ a3@2 ~@2",
  F: "[g3@2 ~@2 a3@2 ~@2 b3@3 ~ g3@2 a3@5 ~ a3@2 ~@2 g3@2 a3@5 ~]/2", G: "a3@3 ~ b3@3 ~ c4@2 ~@2 d4@3 ~",
  H: "[g3@2 a3@5 ~ a3@2 ~@2 g3@2 a3@5 ~ a3@2 ~@2 g3@2 ~@2 a3@2 ~@2]/2", I: "c4@2 ~@2 d4@3 ~@9",
  J: "[~@8 d4@32 d4@6 d4@6 d4@8 ~@2 c4@10 ~@19 a4 a#4 b4 c5 c#5 d5@24 e5@6 f#5@2, ~@15 d4@11 ~@6]/8",
  K: "[~@4 g5@7 f#5@7 e5@2 e5@4 ~@8]/2", L: "~@7 a4",
  M: "[a4@3 d5@7 a4@3 d5@8 a4@2 d5@17 a4@27 b4@2 ~ b4@2 b4@2 ~ a4@2 ~@3]/5",
  N: "[~@4 c4 c#4 d4 d#4 e4 f4 f#4@30 g4@6 e5@6 d5@5 a#4@4 c5@2 ~]/4", O: "c5 ~", P: "~@11 a4 a#4 b4 c5 c#5",
  Q: "[d5@24 e5@6 f#5@6 g5@4 a5!8]/3", R: "[a5!8 a5@6 a5@6 a5@7 g5@5]/2", S: "f#5@3 g5@5 f#5@3 g5@5",
  T: "[f#5@3 g5@5 a5@14 b5@6 ~ b5@3]/2", U: "[~@2 b4@13 ~]/4",
})).s("gm_overdriven_guitar").gain(0.4)

// drums · kick
const kick = s("bd").struct("<~@8 A@104 B C@7 D A@3 B C D A@47 ~@3>".pickRestart({
  A: "x!2", B: "x ~ x!2", C: "x!4", D: "x!3 ~",
})).gain(0.46)

// drums · snare
const snare = s("sd").struct("<~@8 A@104 B ~@7 C A@3 B ~ C A@46 B ~@3>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@3 x",
})).gain(0.52)

// drums · hihat
const hihat = s("hh").struct("<~@112 A B C D E F G H ~@4 I H ~@51>".pickRestart({
  A: "~@5 x!3", B: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2", C: "x!2 ~@4 x!2", D: "x ~ x ~ x ~ x ~ x ~ x!3 ~ x ~",
  E: "x ~ x!2 ~@8 x ~@3", F: "x ~ x ~ x ~@7 x ~ x!2", G: "~ x!2 ~@3 x!2", H: "x!2 ~@2 x!2 ~@2", I: "~@6 x!2",
})).gain(0.29)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@8 A@15 B A@13 B A@18 B A@23 B A@25 B A@5 C ~ D ~ E F G H A@4 I H A@33 J A@13 C ~@3
>`.pickRestart({
  A: "x!8", B: "x!7 ~", C: "x!3 ~@5", D: "~@2 x!3 ~@3", E: "~ x!2 ~", F: "~@3 x!2 ~@3", G: "x ~@2 x!2 ~@3",
  H: "~@2 x ~@3 x!2", I: "x!5 ~@3", J: "x!3 ~ x!4",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@15 A ~@5 A ~@7 A ~@18 A ~@15 A ~@3 A ~ A ~ A ~ A ~@9 A ~@5 A ~@7 A ~@3 A B ~@7 B ~@5 B ~@3 B ~@9 B ~@18 B ~@13
  B ~@3
>`.pickRestart({
  A: "x", B: "~ x",
})).gain(0.46)

// drums · tambourine
const tambourine = s("tb").struct("<~@8 A@104 B ~@7 C A@3 D ~ C A@46 E ~@3>".pickRestart({
  A: "x!8", B: "x!5 ~@3", C: "~@4 x!4", D: "x!4 ~@4", E: "x!3 ~@5",
})).gain(0.35)

stack(
  bass, synth_strings_2, string_ensemble_1, overdriven_guitar, overdriven_guitar_soft, church_organ,
  overdriven_guitar_2, kick, snare, hihat, open_hat, crash, tambourine
)

More by Battiato