Strudelify

Specchi opposti

Battisti

KeyE♭ majorTempo89 bpm
0:00/0:00
// Specchi opposti — Battisti
// 89 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 59, 4/4 at bar 60) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 93 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(89/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 · epiano2 · "Piano"
const epiano2 = note(`<
  ~ A B@2 C@4 D@2 E@4 F G H I J K L M N O P G H Q R S T U V W X Y Z AA AB AC AD AE AF AG AH I AI AJ AI AK AL AM AN@2 F
  AO AP@2 ~ AQ@7 AR@8 AS@5 AT@8 AU@5 ~
>`.pickRestart({
  A: "~@12 c4 d4 ~ eb4", B: "[[c4,eb4] [c4,eb4,ab4], g4]/2",
  C: "[[c4,eb4,g4,bb4]@12 c5@2 f4@14 g4@2 ~@10 [g4,b4,d5]@8 [b4,d5,g5]@12 c4 d4 ~ eb4, ~@15 d4@15 ~@2]/4", // Cm7 G
  D: "[[g3,c4]@2 ~ ab4, g4@3 ~, ~ [ab3,c4,f4]]/2", E: "[[bb3,eb4,g4,bb4]@6 c5 f4@7 g4 c4@15 ~@2]/4", F: "[c4,f4,a4]",
  G: "[e4,a4,c5]", H: "[f4,a4,d5]", I: "[c4,e4,g4]", J: "[d4,g4,bb4]", K: "c5@3 [bb4,d5], [e4,g4]",
  L: "~ g4!7, [c5,e5]", M: "~@5 [d4,f4,a4] ~@2, d4@5 ~@3, ~ f4@4 ~@3, ~@2 a4@3 ~@3, ~@3 d5@5",
  N: "~@5 [c4,e4,g4] ~@2, c4@5 ~@3, ~ e4@4 ~@3, ~@2 g4@3 ~@3, ~@3 c5@5", O: "~ e4 g4 c5 ~ [e4,g4,c5] ~@2, c4@3 ~",
  P: "d5@3 c5@3 ~ d5, f4, a4@3 a4", Q: "~ g4!6 ~, [c5,e5]", R: "[c4,eb4,g4]", S: "[c4,eb4,ab4]",
  T: "bb4@3 c5, [bb3,eb4,g4]", U: "[ab3,c4,f4]", V: "[g3,b3,d4]", W: "~@4 d4@4 g4@4 g5 eb5 g5 eb5, g3@3 ~",
  X: "~@12 c4 d4 ~ eb4, c5@3 ~, ~ [eb4,g4]", Y: "~@12 f4 g4 ~ ab4, ab4@3 ~, ~ [c4,eb4]",
  Z: "~@12 bb4 c5 ~ ab4, bb4@3 ~, ~ [bb3,eb4,g4]", AA: "~@3 g4, f4@3 ~, ~ [ab3,c4]@3", AB: "[eb3,g3,c4]@4 ~ g3 c4 d4",
  AC: "eb4 d4 eb4 g4 c5@2 [e4,g4,c5,e5]@2", AD: "d5@2 c5@4 a4 d5, [f4,a4]@3 ~", AE: "c5 a4@2 f4, [c4,e4]@3 ~",
  AF: "g4 f4@3, [a3,d4]", AG: "g4@3 a4, [c4,e4]", AH: "[a4,d5]@3 a4, [d4,f4]", AI: "[db4,e4,a4]", AJ: "[e4,a4,db5]",
  AK: "[db5,e5]@2 [b4,d5]@2 [a4,db5]@2 a4!2, e4@2 ~ [db4,e4]", AL: "a4@3 g4@5, [a3,c4]", AM: "~ g4 g4@2, [a3,c4,e4]",
  AN: "[~@2 a4@2 a4@3 [a4,db5,e5]@3 [b4,d5]@2 [a4,db5]@2 b4 a4, [a3,db4,e4]@7 e4@7 ~@2]/2", AO: "[a4,a5] [c5,c6]",
  AP: "[[a4,a5] [f4,f5]@3]/2", AQ: "[~ [f4,a4]@2 [c4,e4]@2 [a3,d4]@2 [c4,e4]@2 [c4,e4]@2 [d4,g4]@2 [e4,g4]]/7",
  AR: "[~ [f3,a3,d4]@2 [e3,g3,c4]@2 [e3,g3,c4]@2 [f4,a4]@2 [c4,e4]@2 [a3,d4]@2 [c4,e4,g4]@2 [bb3,d4]]/8", // Dm C F C D5 C Bb
  AS: "[~@8 [g3,c4]@12 e4@2 [g4,bb4]@2 [f4,a4,d5]@6 [f4,a4,c5]@6 a4@2 d5@2 [c4,e4]@6 [c4,e4]@6 f4!2 a4@2 [a3,d4]@6 [a3,d4]@6 f4!2 a4@2 g4 e4 c4@6]/5", // C5 Gm Dm F C D5
  AT: "[~@8 [c4,eb4,g4]@16 [c4,eb4,ab4]@16 [bb3,eb4,g4,bb4]@16 [ab3,c4,f4]@16 [bb3,d4,g4]@16 [c4,eb4,g4]@12 c4 d4 ~ eb4 [c4,eb4,ab4]@12 c4 d4 ~ eb4 [g4,bb4]@8]/8", // Cm Ab Eb Fm Gm Cm Ab Gm
  AU: "[~@4 c4 d4 ~ eb4 f4@12 c4 d4 ~ eb4 ~@16 [g4,c5,eb5]@6 [eb4,g4,c5]@10 [c4,eb4,g4]@6 [g3,c4,eb4]@10 ~@8, ~@3 c4@4 ~@3]/5", // Cm
})).s("gm_epiano2").gain(0.57)

// bass · electric bass finger · "Basso"
const bass = note(`<
  ~@2 A B C D E@2 B F C D G@2 F H I J@4 K L@2 F H I J A B C F M N B F C F O P F H K Q R Q S T S T S H S T U V W@4 X Y
  Z@3 AA AB@6 AC@8 AD AE AF AG AH AI AJ@7
>`.pickRestart({
  A: "c3", B: "ab2", C: "eb2", D: "[f2,c3,ab3]", E: "[g2,d3,b3]/2", F: "f2", G: "[[c2,c3]@7 ~]/2", H: "a2", I: "d2",
  J: "c2", K: "d2@3 d2", L: "c2@3 c2", M: "g2", N: "g2@2 g3 g2", O: "~ g2 c3@2, c2", P: "c2@6 c3 c2", Q: "c2!2",
  R: "d2!2", S: "~@4 a2!2 ~@2, a1", T: "a1", U: "f2 eb2", V: "db2 bb1",
  W: "[db2@4 ~ eb3@11 ~@12 f2@4, ~@2 [eb1,eb2]@11 ~@3]/4", X: "f3 f2 a1@2", Y: "a2 a1 d2@2",
  Z: "[d3 d2 c2@4 c2@4 c2@2]/3", AA: "c3 c2",
  AB: "[c3@4 d2@6 d2@2 c2@6 c2@2 c2@6 c2@2 f2@3 f2@3 f2@2 a2@3 a2@3 a2@2 d2@3 d2]/6",
  AC: "[~@2 a2@2 f2@2 d2@2 c2@16 c2@16 c2@6 c2@6 c2@2 c3@2 f2@3 f2@3 f2@4 f3@2 f2@4 a1@3 a1@3 a1@4 a2@2 a1@4 d2@3 d2@3 d2@4 d3@2 d2@4 c2@6 c2@10 c3@8]/8",
  AD: "c2 ab2", AE: "ab1 eb2", AF: "eb1 f2", AG: "f1 g2", AH: "g1 ab2", AI: "ab1 f2",
  AJ: "[bb1 eb2@2 [f2,c3,ab3]@2 [c2,g2,c3]@6 [c2,g2,c3,c4]@2 ~]/7", // Fm C5
})).s("gm_electric_bass_finger").gain(0.64)

// drums · snare
const snare = s("sd").struct("<[x!4]!56 [x!3 ~] ~@2 [~@2 x!2] [x!4]!31 [x!3 ~] ~>").gain(0.15)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  [~@2 x ~ x ~ x ~ x ~ x ~ x ~ x!2]!56
  [~ x!4 ~@3]
  ~@2
  [~@5 x!3]
  [x ~ x ~ x ~ x!2 ~@2 x ~ x ~ x ~]!31
  [x ~ x ~ x ~ x!2 ~@8]
  ~
>`).gain(0.15)

stack(epiano2, bass, snare, mid_tom)

More by Battisti