Strudelify

E ti vengo a cercare

Battiato

KeyF majorTempo106 bpm
0:00/0:00
// E ti vengo a cercare — Battiato
// 106 bpm, 6/8, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (6/8 at bar 1, 4/8 at bar 121, 6/8 at bar 123) are rendered on a constant 6/8 grid of one bar per cycle
// note: Full arrangement: all 129 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(106/3)

// 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
const bass = note(`<
  ~@8 A B C D A B C D E F G E H I J K J L ~@2 M N O@2 P N M P N M P Q@3 R S T U V W X Y Z AA AB AC AD AE A B C D A B C D
  E F G E H I J K J L ~@2 M N O@2 P N M P N M P Q@3 R S AF AG AH AI AJ Y AK AL AB AC AD AE P Q AM Q AN AM P N P AN AO@2
  ~@13
>`.pickRestart({
  A: "f2@13 ~@11", B: "c2@13 ~@11", C: "d2@2 ~", D: "c2@5 ~@3", E: "bb1@7 ~@5", F: "d2@5 ~@3", G: "f2@5 ~@3",
  H: "eb2@11 ~@11 eb2 ~", I: "eb2@13 ~@11", J: "db2@12 ~@10 db2 ~", K: "db2@11 ~@13", L: "db2 ~",
  M: "db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~",
  N: "eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~",
  O: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~",
  P: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~",
  Q: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~", R: "db1@3 ~ db1@3 ~ db2@4 db1@4 db2@4 db1@4",
  S: "eb1@3 ~ eb1@4 eb2@4 eb1@4 eb2@3 ~ eb1@4", T: "ab1@7 ~ ab1@7 ~ ab1@2 f1 ~ eb1@4",
  U: "ab1@6 ~@2 ab1@7 ~ ab1 ~ f1 ~ eb1@4", V: "f1@6 ~@2 f1@2 ~@2 f1@6 ~@2 f1@3 ~",
  W: "eb1@6 ~@2 eb1@3 ~ eb1@2 ~@2 eb1@3 ~ eb1@3 ~", X: "db1@11 ~ db1 ~@3 db1@2 ~@2 db1@4",
  Y: "f1@2 ~@2 f1 ~ f2@2 c2@2 ab1@2 f1@3 ~ f1@8", Z: "eb1@6 eb2 ~ eb1@2 ~@2 eb1@6 eb2 ~ eb1@2 ~@2",
  AA: "db1@4 db2 ~@3 db2@3 ~ db1@4 db2 ~ db1 ~ db2@4", AB: "f1@6 f2@2 ~@2 f1 ~ f1@4 f2 ~ f1@2 f2@3 ~",
  AC: "eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~", AD: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~", AE: "c2",
  AF: "ab1@5 ~ eb1@3 ~ eb1 ~ ab1 ~ eb1 ~ ab1@7 ~", AG: "ab1@6 eb1 ~ ab1@7 ~ ab1@3 ~ g1@4",
  AH: "f1@5 ~ f1@4 ~@2 f1@4 ~@2 f1@4 ~@2", AI: "eb1@5 ~ eb2 ~ eb1@3 ~ eb1@4 eb2@4 eb1@4",
  AJ: "db1@7 ~ db2@2 ~@2 db2@2 ~@2 db2@2 ~@2 db2@3 ~", AK: "eb1@3 ~ eb1@2 eb2 ~ eb1@2 ~@2 eb1@3 ~ eb2@4 eb1@4",
  AL: "db1@4 db2@2 ~@2 db2@2 ~@2 db2@3 ~ db1@2 db2@2 db1@4",
  AM: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~",
  AN: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~",
  AO: "eb1 ~ eb1 ~ eb1 ~ eb1 ~ eb1 ~ eb1 ~ eb1 ~ eb1 ~ eb1 ~ eb1 ~ eb1 ~ eb1 ~",
})).s("gm_electric_bass_finger").gain(0.49)

// other · electric guitar clean
const electric_guitar_clean = note("<~@19 A@3 B C B C ~@41 A@3 B C B C ~@55>".pickRestart({
  A: "[~@24 g4@22 ~@2 ab4@23 ~, ~@22 g3@23 ~ g3@26, ~@23 [bb3,eb4]@22 ~@2 [bb3,eb4]@25]/3", B: "~ ab3 db3 bb3 ab3 db3",
  C: "c4 ab3 db3 db4 ab3 db3",
})).s("gm_electric_guitar_clean").gain(0.31)

// chords · marimba
const marimba = note("<~@46 A B C ~@45 A B C ~@32>".pickRestart({
  A: "[f3,c4] ~@5 [f3,c4] ~@5 [f3,c4] ~@5 [f3,c4] ~@5", B: "[bb3,eb4] ~@7 [bb3,eb4] ~@11 [bb3,eb4] ~@3",
  C: "[ab3,db4] ~@5 [ab3,db4] ~@5 [ab3,db4] ~@5 [ab3,db4] ~@5", // Db5
})).s("gm_marimba").gain(0.34).pan(0.9)

// other · string ensemble 2
const string_ensemble_2 = note("<A@2 B C D E F@2 ~@14 G H I J ~@44 G H I J ~@42 K L M N O@2 K L P Q@4>".pickRestart({
  A: "[[g2,g3]@47 ~]/2", B: "[bb2,bb3]@23 ~", C: "[c3,c4]@23 ~", D: "[d3,d4]@12 [e3,e4]@11 ~", E: "[f3,f4] [g3,g4]",
  F: "[[bb3,bb4]@47 ~]/2", G: "[ab3,ab4] [bb3,bb4]", H: "[c4,c5]@11 ~ [db4,db5]@12", I: "[ab3,ab4]@12 [bb3,bb4]@11 ~",
  J: "[c4,c5] [db4,db5]", K: "[db3,db4]@23 ~", L: "c4@12 bb3@11 ~, ab2@23 ~",
  M: "[f2,ab3]@12 gb3@6 f3@5 ~, ~@12 ab2@11 ~", N: "[gb2,bb3]@23 ~", O: "[[db3,ab3]@15 ~]/2",
  P: "[f2,ab3]@12 gb3@6 ~ f3@5, ~ ab2", Q: "[~ [gb2,bb3]@26 ~ db3@47 ~@21, ~@27 ab3@46 ~@23]/4",
})).s("gm_string_ensemble_2").gain(0.37).pan(0.7)

// other · electric guitar muted
const electric_guitar_muted = note("<~@8 A B C D A B C E F G H I ~@36 A B C D A B C E F G H I ~@61>".pickRestart({
  A: "~@2 a3!2 [a3,c4] c4 ~@2 a3!2 ~@2", B: "~@4 g3@2 g3 ~ [g3,c4]@2 c4@2 ~@4 g3@2 g3@2 ~@4",
  C: "~@2 a3!2 d4!2 ~@2 a3!2 ~@2", D: "~@2 g3!2 c4!2 ~@2 g3!2 ~@2", E: "~@2 bb3!2 c4!2 ~@2 bb3!2 ~@2",
  F: "~@2 bb3!2 [bb3,d4] d4 ~@2 bb3!2 ~@2", G: "~@4 a3@2 a3 ~ [a3,d4]@2 d4@2 ~@4 a3@2 a3@2 ~@4",
  H: "~@2 ab3!2 c4!2 ~@2 ab3!2 ~@2", I: "~@2 bb3!2 d4!2 ~@2 bb3!2 ~@2",
})).s("gm_electric_guitar_muted").gain(0.33).pan(0.3)

// other · electric guitar muted · soft notes
const electric_guitar_muted_2 = note("<~@8 A B C D A B C E F G H I ~@36 A B C D A B C E F G H I ~@61>".pickRestart({
  A: "~@6 c4 ~@3 a3 ~", B: "~@6 c4 ~@3 g3 ~", C: "~@4 a3 ~ d4 ~@3 a3 ~", D: "~@4 g3 ~ c4 ~@3 g3 ~",
  E: "~@4 bb3 ~ c4 ~@3 bb3 ~", F: "~@6 d4 ~@3 bb3 ~", G: "~@6 d4 ~@3 a3 ~", H: "~@4 ab3 ~ c4 ~@3 ab3 ~",
  I: "~@4 bb3 ~ d4 ~@3 bb3 ~",
})).s("gm_electric_guitar_muted").gain(0.19).pan(0.3)

// other · french horn
const french_horn = note("<~@44 A B ~@3 C D E ~@40 F G ~@3 C H E ~@4 I J K L M@3 N O@2 P Q ~@13>".pickRestart({
  A: "~@2 eb4", B: "ab2 eb3 ab3 c4 eb4 ab4 eb5@2 ~ ab4@3", C: "f4@4 c5@6 ~@2 f4@3 ~ c5@6 ~@2",
  D: "eb3@2 g3@2 bb3 ~ g4@2 bb4@2 eb5 ~ g5@6 eb5@4 ~@2", E: "f3@4 ab3@4 db4@3 ~ f4@4 ab4@4 db5@4", F: "~@3 ab3 eb4@2",
  G: "ab2@2 eb3@2 ab3@2 c4@2 eb4@2 ab4@2 eb5@5 ~ ab4@6", H: "eb3@2 g3@2 bb3 ~ g4@2 bb4@2 eb5 ~ g5@5 ~ eb5@4 ~@2",
  I: "f4", J: "g4", K: "a4", L: "bb4", M: "[d5@48 c5@23 ~]/3", N: "eb5", O: "f5/2", P: "g5", Q: "ab5",
})).s("gm_french_horn").gain(0.72).pan(0.2)

// other · lead 2 sawtooth
const lead_2_sawtooth = note(`<
  ~@26 A B C D E F G H I J K L M N O ~ P Q R ~@29 A B C D E F S H I J K L M N O ~ P Q R ~@36
>`.pickRestart({
  A: "ab5 bb5@15 ab5@4 g5@4", B: "f5 eb5 db5 c5 bb4 ab4", C: "db4 eb4", D: "f4@3 g4 ab4 g4", E: "ab4@3 db5@2 c5",
  F: "ab4@5 g4", G: "~ f4@15 g4@4 ab4@4", H: "bb4@3 ab4 bb4 c5", I: "db5", J: "c5", K: "eb5", L: "f5@11 g5",
  M: "ab5@23 ~", N: "g5 f5 eb5 db5 c5 bb4", O: "ab4 g4@5", P: "db5 eb5 f5 g5 ab5 bb5", Q: "c6 bb5 ab5 g5 f5 g5",
  R: "ab5 ~", S: "f4@15 ~ g4@4 ab4@4",
})).s("gm_lead_2_sawtooth").gain(0.42).pan(0.4)

// other · string ensemble 1
const string_ensemble_1 = note("<~@42 A B C D E@2 F G H I J K L@2 ~@34 A B C M E@2 F G H I J K L@2 ~@25>".pickRestart({
  A: "[db3,db5] [eb3,eb5] [f3,f5] [g3,g5] [ab3,ab5] [bb3,bb5]", // Db Eb F G Ab Bb
  B: "[c4,c6] [bb3,bb5] [ab3,ab5] [g3,g5] [f3,f5] [g3,g5]", C: "[ab3,ab5]@3 [db4,db6]@2 [c4,c6]",
  D: "[ab3,ab5]@11 [g3,g5]", E: "[[f3,f5]@3 [g3,g5] [ab3,ab5] [bb3,bb5]@4 [ab3,ab5] [bb3,bb5] [c4,c6]]/2",
  F: "[db4,db6]", G: "[c4,c6]", H: "[eb4,eb6]", I: "[f4,f6]@5 [g4,g6]", J: "[ab4,ab6]@23 ~",
  K: "[g4,g6] [f4,f6] [eb4,eb6] [db4,db6] [c4,c6] [bb3,bb5]", L: "[[ab3,ab5] [g3,g5]@9 ~@2]/2",
  M: "[ab3,ab5]@5 [g3,g5]", // Ab G
})).s("gm_string_ensemble_1").gain(0.44).pan(0.8)

// chords · synth strings 1
const synth_strings_1 = note(`<
  A@8 B@2 C D B@2 C E F@4 G@2 H@4 I ~ J K L@2 M N O@2 P Q@5 R S@3 T P U@2 N U@2 V@3 B@2 C D B@2 C E F@4 W@2 X@4 I ~ J K
  L@2 M N O@2 P Q@5 R S@3 T P U@2 N U@2 V@3 Y@2 Z AA AB@3 AC AD@4 ~@13
>`.pickRestart({
  A: "[~@48 bb3@143 ~, [e3,g3,c4]@191 ~]/8", B: "[[f3,a3]@24 [e3,g3]@23 ~, c3@47 ~]/2", C: "[d3,f3,a3]@23 ~",
  D: "[c3,e3,g3]@23 ~", E: "[c3,e3,g3,bb3]@23 ~", F: "[bb3@24 a3@22 ~@2 [c3,ab3]@24 [d3,bb3]@23 ~, f3, d3@23 ~@25]/4",
  G: "[g3@23 ~ ab3@23 ~, [eb3,bb3]]/2", // Eb5
  H: "[ab3@10 ~@2 bb3@11 ~ c4@11 ~ db4@11 ~ ab3@12 bb3@11 ~ c4@12 db4@11 ~, [db3,f3]@47 ~]/4", I: "[bb3,eb4]",
  J: "db4@12 eb4@11 ~, [f3,ab3]@23 ~", K: "f4@12 g4@11 ~, [g3,bb3]", L: "[[c4,eb4,ab4]@47 ~]/2", M: "[ab3,c4,f4]@23 ~",
  N: "[g3,bb3,eb4]", O: "[[f3,db4]@22 ~@2 [c4,f4]@23 ~, ab3@47 ~]/2", P: "[g3,bb3,eb4]@23 ~",
  Q: "[db4@24 ~@24 eb4@23 ~ e4@47 ~, [f3,ab3]@47 ~ g3@72, ~@24 c4@95 ~]/5", R: "[f3,ab3,db4]@23 ~",
  S: "[[g3,bb3]@23 ~ [ab3,c4]@47 ~, eb4]/3", T: "[f3,ab3,c4]@23 ~", U: "[db4@23 ~ c4@23 ~, [f3,ab3]@47 ~]/2",
  V: "[eb4@23 ~ e4@47 ~, [g3,bb3]@71 ~]/3", W: "[g3@24 ab3@23 ~, [eb3,bb3]]/2",
  X: "[ab3@11 ~ bb3@11 ~ c4@11 ~ db4@11 ~ ab3@12 bb3@11 ~ c4@12 db4@11 ~, [db3,f3]@47 ~]/4", // Db
  Y: "[[f4,a4]@23 ~ [e4,g4]@23 ~, c4@47 ~]/2", Z: "[d4,f4,a4]@23 ~", AA: "[e4,g4,bb4]@23 ~",
  AB: "[bb4@24 a4@23 ~ [ab4,c5]@23 ~, f4@71 ~, d5@2 ~]/3", AC: "[eb4,g4,bb4]@23 ~",
  AD: "[[ab4,c5]@23 ~ d5@23 ~ [g4,eb5]@47 ~, f4@23 ~@25, ~ bb4@3]/4", // Ab Cm
})).s("gm_synth_strings_1").gain(0.23).pan(0.3)

// drums · kick
const kick = s("bd").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A ~ A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B@2 A@2 B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A C A B A C A B A B A B
  ~@11
>`.pickRestart({
  A: "x ~@10 x", B: "x", C: "x ~@2 x",
})).gain(0.76)

// drums · rim
const rim = s("rim").struct("<[~ x]!27 ~@29 [~ x]!18 ~@55>").gain(0.69)

// drums · snare
const snare = s("sd").struct("<~@27 A B@13 C B@13 D ~@18 B@15 C B@13 D B@3 E B@3 E B@3 F B@2 ~@11>".pickRestart({
  A: "x!2", B: "~ x", C: "~@6 x ~@2 x!3", D: "~@6 x!2 ~@4", E: "~@3 x ~ x", F: "~@6 x ~@3 x!2",
})).gain(0.76)

// drums · low tom
const low_tom = s("lt").struct("<~@41 A ~@12 B C ~@33 A ~@12 B C ~@25>".pickRestart({
  A: "~@5 x ~@6", B: "~@7 x!5", C: "x",
})).gain(0.53)

// drums · hihat
const hihat = s("hh").struct(`<
  A@3 B A@3 C D A@14 B A B ~@2 D A@3 D A@8 E D A@12 E D A@14 B A B E ~ D A@3 D A@8 E D A@12 E D A@11 B ~@12
>`.pickRestart({
  A: "x!6", B: "x!5 ~", C: "x ~ x ~ x ~ x ~ x!4", D: "~ x!5", E: "x",
})).gain(0.61)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<A B A@3 B A C B@14 A@4 ~@30 B@14 A@4 ~@42 D E ~@11>".pickRestart({
  A: "~ x ~ x ~ x ~ x ~ x ~@2", B: "~ x ~ x ~ x ~ x ~ x ~ x", C: "~ x ~ x ~ x ~ x ~@4", D: "~@5 x", E: "x!6",
})).gain(0.23)

// drums · mid tom
const mid_tom = s("mt").struct("<~@41 A ~@12 B ~@34 A ~@12 B ~@26>".pickRestart({
  A: "~ x ~", B: "~@3 x!4 ~@5",
})).gain(0.53)

// drums · open hat
const open_hat = s("oh").struct("<A ~ A B A ~ A ~@15 A B A B ~@44 A B A B ~@55>".pickRestart({
  A: "~@11 x", B: "~@5 x",
})).gain(0.31)

// drums · crash
const crash = s("cr").struct("<~@8 A ~@19 A ~@3 A ~@8 B A ~@13 A ~@19 A ~@3 A ~@8 B A ~@13 A ~@24>".pickRestart({
  A: "x", B: "~ x ~@10",
})).gain(0.61)

// drums · tambourine
const tambourine = s("tb").struct("<[~ x]!24 ~@2 [~ x] ~@29 [~ x]!18 ~@55>").gain(0.76)

// drums · bongos
const bongos = s("bongo:4").struct("<~@29 A ~ A ~ A ~@2 A ~@2 A@3 ~@35 A ~ A ~ A ~@2 A ~@2 A@3 ~@39>".pickRestart({
  A: "x!9 ~@3",
})).gain(1)

// drums · bongos · soft notes
const bongos_soft = s("bongo:4").struct("<~@29 A ~ A ~ A ~@2 A ~@2 A@3 ~@35 A ~ A ~ A ~@2 A ~@2 A@3 ~@39>".pickRestart({
  A: "~@9 x!3",
})).gain(0.6)

// drums · congas
const congas = s("conga:13").struct("<~@32 A ~@2 A ~@2 A ~@41 A ~@2 A ~@2 A ~@42>".pickRestart({
  A: "x!9 ~@3",
})).gain(1.22)

// drums · congas · soft notes
const congas_soft = s("conga:13").struct("<~@32 A ~@2 A ~@2 A ~@41 A ~@2 A ~@2 A ~@42>".pickRestart({
  A: "~@9 x!3",
})).gain(0.73)

// drums · shaker
const shaker = s("sh").struct("<~@46 [x!12]!3 ~@45 [x!12]!3 ~@32>").gain(0.53)

stack(
  bass, electric_guitar_clean, marimba, string_ensemble_2, electric_guitar_muted, electric_guitar_muted_2, french_horn,
  lead_2_sawtooth, string_ensemble_1, synth_strings_1, kick, rim, snare, low_tom, hihat, hihat_soft, mid_tom, open_hat,
// … 2 more lines

More by Battiato