Strudelify

Prospettiva Nevski

Battiato

KeyD majorTempo90 bpm
0:00/0:00
// Prospettiva Nevski — Battiato
// 90 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 100 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(90/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 · "Bass"
const bass = note(`<
  ~@2 A B C D@2 C A B D@2 C E F E D C G D A B C B H@2 I J K L@2 I M N O L B P H J K Q I H R S J T L H B O C M R U V R
  J@2 B C D@2 C A B D@2 C E F E D C G D A B C@2 A B A B A B A B C W X ~@8
>`.pickRestart({
  A: "d2@8 ~@2 d2 ~ d2@7 ~ a1 ~ b1@2", B: "d2@9 ~ d2 ~ d2@9 ~ d2 ~", C: "d2@8 ~@2 d2 ~ d2@9 ~ d2 ~",
  D: "a1@8 ~@2 a1 ~ a1@9 ~ a1 ~", E: "g2@8 ~@2 g2 ~ g2@9 ~ g2 ~", F: "d2@8 ~@2 d2 ~ d2@8 ~@2 d2 ~",
  G: "e2@8 ~@2 e2 ~ e2@9 ~ e2 ~", H: "a1@8 ~@2 a1 ~ a1@8 e1@2 f#1 ~", I: "d2@8 ~@2 d2 ~ d2@8 a1@2 b1 ~",
  J: "d2@8 ~@2 d2 ~ d2@8 a1@2 b1@2", K: "d2@9 ~ d2 ~ d2@7 ~ d2 ~ d2 ~", L: "a1@9 ~ a1 ~ a1@9 ~ a1 ~",
  M: "g2@8 ~@2 g2 ~ g2@8 d2@2 e2 ~", N: "d2@9 ~ d2 ~ d2@8 ~@2 d2 ~", O: "g2@9 ~ g2 ~ g2@9 ~ g2 ~",
  P: "e2@9 ~ e2 ~ e2@9 ~ e2 ~", Q: "d2@9 ~ d2 ~ d2@7 ~@3 e2 ~", R: "a1@9 ~ a1 ~ a1@7 ~@3 a1 ~",
  S: "d2@9 ~ d2 ~ d2@7 ~@3 c#2 ~", T: "d2@9 ~ d2 ~ d2@7 ~ c#2 ~ f#1 ~", U: "d2@9 ~ d2 ~ d2@7 ~@3 f#2 ~",
  V: "e2@8 ~@2 e2 ~ e2@8 b1@2 c#2 ~", W: "~@12 d2@7 ~@3 b1@2", X: "d2@9 ~ d2 ~ d2@9 ~@3",
})).s("gm_electric_bass_finger").gain(0.13)

// bass · electric bass finger · "Bass" · soft notes
const bass_soft = note("<~@41 A ~@2 B C ~@8 B D ~ B ~@32 E F G H G H I@2 J K>".pickRestart({
  A: "~@20 f#2 ~@3", B: "~@20 a1 ~@3", C: "~@20 b1 ~@3", D: "~@20 g2 ~@3", E: "d2@8 ~@2 d2 ~@9 a1 ~@3", F: "~@22 d2 ~",
  G: "d2@8 ~@2 d2 ~ d2@7 ~ a1 ~ b1@2", H: "d2@9 ~ d2 ~ d2@9 ~ d2 ~", I: "d2@8 ~@2 d2 ~ d2@9 ~ d2 ~",
  J: "d2@8 ~@2 d2 ~ d2@8 a1@2 b1@2", K: "d2@9 ~ d2 ~ d2@7 ~ d2 ~ d2 ~",
})).s("gm_electric_bass_finger").gain(0.07)

// chords · piano
const piano = note(`<
  ~@2 A B C D E F G@2 H E C I J I E C K L A B F M N O M P Q D E M R S T O F U L A B C@2 N O M P Q N O M R V T E C K E A
  B C@2 H L F A B H E C T W T E F K E A B F C A B A B A B A B C A X Y Z ~@6
>`.pickRestart({
  A: "~@2 a4 d5 ~ f#4 ~@2 a4 d5 ~ f#4, d4@11 ~ d4@9 ~@3, ~@3 f#4@4 ~ a4@4 ~@2 f#4@4 ~@2 a4@4",
  B: "~@2 f#4@4 d5@2 ~@2 f#4@2 ~@4 a4@2 d5@2 a4@2 f#4 ~, d4@2 a4 d4@2 ~, ~@14 f#4@5 ~@5",
  C: "~@10 f#4@2 ~@10 f#4 ~, d4@11 ~ [d3,d4]@12, ~ f#4@4 ~@2 f#4@4 ~, ~@6 d5@5 ~@7 d5@6, ~@2 a4 ~ a4!2", // D
  D: "~@20 a4@2 g4 ~, [a2,d4]@11 a2@12 ~, ~ g4@4 g4@2 g4@4 ~, ~@4 a4@4 a4@8 a4@2 d5@5 ~, ~@6 d5@5 ~ d4@11 ~", // D5
  E: "~@10 g4@2 ~@10 g4 ~, e4@11 ~ [a2,e4]@12, ~ g4@4 ~@2 g4@4 ~, ~@6 c#5@5 ~@7 c#5@6, ~@2 a4 ~ a4!2", // A5
  F: "~@20 a4@2 f#4 ~, [d3,d4]@11 d3@12 ~, ~ f#4@4 f#4@2 f#4@4 ~, ~@4 a4@4 a4@8 a4@2 d5@5 ~, ~@6 d5@5 ~ [d2,d4]@11 ~", // D
  G: "[~@10 f#4@2 ~@20 a4@2 ~ a2 ~@8 a4@2 f#4 ~, d4@11 ~ d4@11 d3@13 [d3,d4]@11 ~, ~@2 f#4@8 ~@4 f#4@8 f#4@2 d4@11 ~@7 d5@4 ~@2, ~@2 a4@2 a4@2 ~@2 a4@2 a4@2 ~ f#4@4 f#4 ~ f#4@4 ~, ~@6 d5@5 ~@7 d5@6 ~@4 a4@2 d5@6 ~@4 a4@4 ~@4]/2", // D
  H: "~@10 g4@2 ~@10 g4 ~, d4@11 ~ [a2,d4]@12, ~ g4@4 ~@2 g4@4 ~, ~@6 d5@5 ~@7 d5@6, ~@2 a4 ~ a4!2", // D5
  I: "~@20 b4@2 g4 ~, [g2,d4]@11 g2@12 ~, ~ g4@4 g4@2 g4@4 ~, ~@4 b4@4 b4@8 b4@2 d5@5 ~, ~@6 d5@5 ~ d4@11 ~", // G5
  J: "~@10 d4 ~@9 a4@2 f#4 ~, [d2,d4]@9 d3@2 ~ d3@12, d3@8 a4@3 ~@3 f#4@8 ~@2, ~@2 f#4@9 ~ d4@10 ~@2, ~@4 a4@2 d5@5 ~@5 a4@2 c5@4 ~@2", // D
  K: "~@10 g4@2 ~@10 g4 ~, e4@11 ~ [e3,e4]@12, ~ g4@4 ~@2 g4@4 ~, ~@6 d5@5 ~@7 d5@6, ~@2 b4 ~ b4!2", // E
  L: "~@20 a4@2 g4 ~, [a2,e4]@11 a2@12 ~, ~ g4@4 g4@2 g4@4 ~, ~@4 a4@4 a4@8 a4@2 c#5@5 ~, ~@6 c#5@5 ~ e4@11 ~", // A5
  M: "~@6 d4@2 ~@3 f#4, d2@5 a4, d3@5 f#4@4 d5@3, f#4@2 f#4 d5@5 d3@4, ~@2 d4@6 a4@9 d4@7",
  N: "~@6 d4@2 ~@3 g4, a2@2 a2, g4@2 g4@2 a4@5 d5@3, ~ d4@4 g4@5 a4@2, ~@6 d5@11 d4@7",
  O: "~@6 e4@2 ~@3 g4, a2@2 a2, g4@2 g4@2 a4@5 c#5@3, ~ e4@4 g4@5 a4@2, ~@6 c#5@11 e4@7",
  P: "~@21 a4@2 f#4, d3@14 ~ d3@9, d4 d4@3, ~@2 f#4@14 f#4@7 ~, ~@5 d5",
  Q: "~@6 [a3,f#4,a4] ~, d4@7 ~, d3@10 a3@6 d3@5 ~@3, ~@2 d2@19 ~@3, ~@2 a3 [f#4,a4]@6 ~@3", // D F#m
  R: "~@6 d4@2 ~@3 g4, g2@2 g2, g4@2 g4@2 b4@5 d5@3, ~ d4@4 g4@5 b4@2, ~@6 d5@11 d4@7",
  S: "d4@6 ~@4 [f#4,a4] ~ d4@6 ~@4 [f#4,a4] ~, [d2,a4,d5]@11 ~ [d2,a4,c5]@11 ~, f#4@4 f#4 ~ f#4@4 f#4 ~, ~@6 d4@5 ~@7 d4@5 ~, ~@9 d3@2 ~@10 d3@2 ~", // F#m D5 D7
  T: "~@10 g4@2 ~@10 g4 ~, d4@11 ~ [g2,d4]@12, ~ g4@4 ~@2 g4@4 ~, ~@6 d5@5 ~@7 d5@6, ~@2 b4 ~ b4!2", // G5
  U: "~@20 b4@2 g4 ~, [e3,e4]@11 e3@12 ~, ~ g4@4 g4@2 g4@4 ~, ~@4 b4@4 b4@8 b4@2 d5@5 ~, ~@6 d5@5 ~ [e2,e4]@11 ~", // E
  V: "~@8 a4@2 f#4 ~@9 a4@2 f#4 ~, [d3,d4]@11 ~ [d3,d4]@11 ~, ~ f#4@4 ~@2 f#4@4 ~, ~ a4 ~@2 a4 ~, ~@6 d5@5 ~@7 c5@5 ~", // D
  W: "~@8 a4@2 f#4 ~@11 d4 ~, d3@12 [d2,d4]@9 d3@2 ~, d4@10 ~@2 d3@8 a4@3 ~, ~@2 f#4@8 ~@4 f#4@9 ~, ~@4 a4@2 d5@4 ~@6 a4@2 c5@5 ~", // D
  X: "~@2 f#4@4 d5@2 ~@2 f#4@2 ~@6 d5@2 a4@2 f#4 ~, ~@2 a4 ~@3", Y: "~@6 d5@2 ~@8 a4@3 ~@5, d4@11 ~ d4@9 ~@3",
  Z: "~@9 d5 ~@2",
})).s("gm_piano").gain(0.26)

// chords · piano · soft notes
const piano_soft = note(`<
  ~@3 A B ~ B ~@2 C B@3 ~@3 B@2 D ~@2 A ~@5 E ~@2 B ~@2 F D ~@5 A B@2 ~@3 E ~@6 D B@2 D B ~ A B@3 ~@3 A B@3 D ~ D B ~ D
  B ~ A ~ B ~ A ~ A ~ A ~ A B ~ G H I J K L M N O
>`.pickRestart({
  A: "~@2 a4 ~@9", B: "~ a4 ~@4", C: "~@5 a4@3 ~@4, d2@23 ~", D: "~ b4 ~@4", E: "~@5 a4@16 ~@3", F: "d3@3 ~ d3@3 ~",
  G: "~@2 a4 ~@5 a4 ~@3, d4@9 ~@3 d4@8 ~@4, ~@14 f#4@5 ~@5",
  H: "~@2 a4 ~@2 f#4 ~ f#4@2 d5 ~ f#4, ~@3 f#4@4 ~ a4@4 ~@8 a4@4",
  I: "~@4 a4@2 d5@2 ~@2 f#4@2 ~@4 a4@2 ~@2 a4@2 f#4 ~, d4@9 ~@3 d4@8 ~@4, ~@2 f#4@5 ~ a4@4 ~@2 f#4@5 ~@5",
  J: "~@2 a4 d5 ~ f#4 ~@2 a4 d5 ~ f#4, d4@11 ~ d4@9 ~@3, ~@3 f#4@4 ~ a4@4 ~@2 f#4@4 ~@2 a4@4",
  K: "~@4 a4@2 d5@2 ~@2 f#4@2 ~@4 a4@2 d5@2 a4@2 f#4 ~, d4@9 ~@3 d4@8 ~@4, ~@2 f#4@5 ~ a4@4 ~@2 f#4@5 ~@5",
  L: "~@10 f#4@2 ~@10 f#4 ~, d4@11 ~ [d3,d4]@12, ~ f#4@4 ~@2 f#4@4 ~, ~ a4!2 ~ a4!2, ~@6 d5@5 ~@7 d5@6", // D
  M: "~@20 a4@2 f#4 ~, [d3,d4]@11 d3@12 ~, ~ f#4@4 f#4@2 f#4@4 ~, ~@4 a4@4 a4@8 a4@2 d5@5 ~, ~@6 d5@5 ~ [d2,d4]@11 ~", // D
  N: "~@21 a4@2 f#4, d3@14 ~ d3@9, d4@5 a4@15 d5@4, ~@2 f#4@14 f#4@7 ~, ~ d4@3",
  O: "~@6 [a3,f#4,a4] ~, d4@7 ~, d3@10 a3@6 d3@5 ~@3, ~@2 d2@19 ~@3, ~@2 a3 [f#4,a4]@6 ~@3", // D F#m
})).s("gm_piano").gain(0.1)

// drums · kick
const kick = s("bd").struct("<~@2 [x!2]!89 x ~@8>").gain(0.04)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@2 [~@5 x ~@6]!89 [~@5 x!2 ~@5] [x ~@4 x!2 ~@5]!8>").gain(0.03)

// drums · rim
const rim = s("rim").struct("<[x!2] [~ x ~ x]!22 ~@18 [~ x ~ x] ~@18 [~ x ~ x]!31 [~@3 x] ~@8>").gain(0.06)

// drums · rim · soft notes
const rim_soft = s("rim").struct("<~ [x!2] ~@89 [~ x ~@2] [~ x ~ x]!8>").gain(0.02)

// drums · snare
const snare = s("sd").struct("<~@3 A ~@18 A B@18 A B@18 A ~@18 A ~@9 A ~@7 A ~@2>".pickRestart({
  A: "~@8 x!2 ~ x", B: "~ x ~ x",
})).gain(0.05)

// drums · hihat
const hihat = s("hh").struct("<~@2 A@21 ~@18 A ~@18 A@29 B C D E F ~@6>".pickRestart({
  A: "x!12", B: "x!11 ~", C: "x!7 ~ x!3 ~", D: "x!7 ~ x!2 ~@2", E: "~@2 x!2 ~ x!2 ~@2 x ~@2", F: "~ x ~@2",
})).gain(0.04)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@89
  [~@11 x]
  [~@7 x ~@3 x]
  [~@7 x ~@2 x!2]
  [x!2 ~@2 x ~@2 x!2 ~ x!2]
  [x!3 ~ x!8]
  [x!12]!6
>`).gain(0.01)

// drums · ride
const ride = s("rd").struct("<~@3 A ~@18 A B@18 A B@18 A ~@18 A ~@9 A ~@7 A ~@2>".pickRestart({
  A: "x!2 ~@2", B: "x!12",
})).gain(0.05)

stack(bass, bass_soft, piano, piano_soft, kick, kick_soft, rim, rim_soft, snare, hihat, hihat_soft, ride)

More by Battiato