Strudelify

Per amore

Andrea Bocelli

KeyG minorTempo60 bpm
0:00/0:00
// Per amore — Andrea Bocelli
// 60 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 70 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(60/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
const bass = note(`<
  ~@19 A B C B D E F G H I J I J K L M N O P Q R S T ~ A B C B U V W X Y Z AA AB AA AB K L M AC O P Q AD Q ~@4
>`.pickRestart({
  A: "~ g1", B: "b1 c2", C: "d2 g1", D: "d2 c2", E: "g1 a1", F: "e2 e1", G: "a1 g1 gb1@2", H: "b1", I: "bb1 d2",
  J: "eb2@2 f2 f1", K: "gb1 db2", L: "b1 bb1", M: "c2 f1", N: "bb1 eb2", O: "a1@8 d2 d1@7", P: "bb1@8 eb1@6 ~ eb1",
  Q: "a1 d1", R: "g1@6 ~ g1 c2@3 g2 c3 g2 c3 g2", S: "a1@7 a1 d1@8", T: "eb1", U: "d2 eb2", V: "bb1 c2", W: "g1!2",
  X: "c2 bb1", Y: "eb2 c2", Z: "f2@8 f1@4 f2 eb2 d2 c2", AA: "db2@8 f1@7 ~", AB: "gb1 ab1", AC: "bb1 eb1", AD: "g1 c2",
})).s("gm_electric_bass_finger").gain(0.64)

// other · electric guitar clean
const electric_guitar_clean = note("<~@28 A@4 ~@21 B@4 ~@13>".pickRestart({
  A: "[~ f4 c4 d4@2 f4 c4 d4@2 f4 c4 d4@2 f4 c4 d4@2 g4 c4 d4@2 g4 c4 d4@2 g4 c4 d4@2 g4 d4 c4@2 f4 c4 d4@2 f4 c4 d4@2 f4 c4 d4@2 f4 c4 d4@2 g4 c4 d4@2 g4 c4 d4@2 g4 c4 d4@2 f4 d4 c4]/4",
  B: "[~ ab4 eb4 f4@2 ab4 eb4 f4@2 ab4 eb4 f4@2 ab4 eb4 f4@2 bb4 eb4 f4@2 bb4 eb4 f4@2 bb4 eb4 f4@2 ab4 f4 db4@2 ab4 eb4 f4@2 ab4 eb4 f4@2 ab4 eb4 f4@2 ab4 eb4 f4@2 bb4 eb4 f4@2 bb4 eb4 f4@2 bb4 eb4 f4@2 ab4 f4 eb4]/4",
})).s("gm_electric_guitar_clean").gain(0.14)

// other · marimba
const marimba = note("<~@35 A ~ B C D E F G ~@17 H ~ B C D I F ~@3>".pickRestart({
  A: "~@2 f3!2 bb3 ~ bb3 ~@2 bb3 eb3!2 bb3 ~ bb3 ~, ~ bb3@3 ~@12",
  B: "f3 d4 c4 ~@2 f3 c4 g3 ~ eb3 bb3 bb2 g3 bb2 bb3 bb2", C: "~ a2 e3 a2 e3 ~ e3 a2 ~ d3 a3 a2 f3 a2 a3 a2",
  D: "~@9 g2 c3 g2 c3 g2 c3 g2", E: "~ a3 eb4 a3 eb4 a3 eb4 a3 ~@3 a2 d3 a2 d3 a2", F: "~@7 g4 bb4 g4 bb4 ~ g4 ~ bb4 ~",
  G: "~@4 eb3 ~@11", H: "~ bb3 f3!2 bb3 ~ bb3 ~@2 bb3 eb3!2 bb3 ~ bb3 ~",
  I: "~ a3 eb4 a3 eb4 a3 eb4 a3 ~@3 a2 d3 ~ d3 a2",
})).s("gm_marimba").gain(0.13)

// other · marimba · soft notes
const marimba_soft = note("<~@42 [c3!2 eb3 g2 ~@12] ~@22 [~@13 a2 ~@2] ~ [c3!2 eb3 g2 eb3 ~@11] ~@2>")
  .s("gm_marimba").gain(0.1)

// other · string ensemble 1
const string_ensemble_1 = note("<~@19 A B@4 ~@4 C D@2 E F G@2 ~@8 A H@4 ~@5 I J K L M@2 N ~@10>".pickRestart({
  A: "~ b3", B: "[b4@4 a5@4 g5@12 e5@4 d5@12 [e5,e6]@4 [d5,d6]@15 ~@9]/4", C: "d4@2 f4 [c5,c6]",
  D: "[[bb4,bb5]@7 [g5,g6]]/2", E: "[f5,f6]", F: "[db5,db6]@3 [c5,c6]", G: "[[b4,b5]@2 [bb4,bb5]@5 ~]/2",
  H: "[d5@4 a5@4 g5@12 e5@4 d5@12 [e5,e6]@4 [d5,d6]@15 ~@9]/4", I: "[ab3,ab4,ab5]@3 [eb4,eb5,eb6]",
  J: "[db4,db5,db6]@3 [bb3,bb4,bb5]", K: "[ab3,ab4,ab5]@3 [bb4,bb5,bb6]", L: "[ab4,ab5,ab6]",
  M: "[[db5,db6]@2 [gb5,gb6] [f5,f6] [ab5,ab6]@5 [gb5,gb6] [f5,f6] [eb5,eb6] [f5,f6]@4]/2", N: "eb4@2 b4 c5, eb5",
})).s("gm_string_ensemble_1").gain(0.19).pan(0.3)

// chords · string ensemble 2
const string_ensemble_2 = note(`<
  A B A B A B A B C D E A B A B C D E F@8 G H I J K L M N@2 A B A B C D E O@8 P@3 Q@4 R S@2 A B A B ~@6
>`.pickRestart({
  A: "~@2 [a3,bb3,d4,f4] ~@3 [eb3,bb3,d4,g4] ~", B: "~@4 [g3,a3,c4,e4]@2 ~@6 [f3,a3,c4,d4]@3 ~",
  C: "~@2 [g3,bb3,d4,f4] ~@3 [g3,bb3,c4,e4] ~", D: "~@2 [g3,a3,c4,eb4] ~@3 [gb3,a3,c4,d4] ~",
  E: "~@2 [g3,bb3,d4] ~@3 [g3,bb3,d4] ~", // Gm
  F: "[~@2 [eb3,g3,bb3,eb4] ~@3 [d3,gb3,a3,c4]@4 ~@2 [g3,b3]@4 [gb3,a3]@4 e4@4 ~@2 gb3@2 [g3,b3]@4 [gb3,a3]@4 e4@4 ~@2 gb3@2 [c4,e4]@4 [b3,d4]@4 [a3,c4]@4 g3@4 ab3@4, ~@3 d4@2 c4@2 ~@2 c4@2 ~@3 b3@2, ~@10 g3@3 ~@5 g3@3 ~ g3@4 ~@6, ~@6 d4@3 ~ d4 ~@2 e4@3]/8", // Eb D7 G Gbm G Gbm C Bm …
  G: "[a3,c4] [bb3,db4,gb4]", H: "e4 eb4, [gb3,b3]", I: "c4 bb3 [a3,c4]@2, f3, d4 ~", J: "d4 eb4, [g3,bb3]",
  K: "c4 bb3 ~ f4, f3@3 ~, d4 [a3,c4]", L: "eb4 d4@2 eb4, [g3,bb3]", M: "[gb3,bb3] [f3,ab3], db4",
  N: "[[eb3,gb3,b3]@2 [f3,c4]@2 gb3@2 b3 c4, ~ bb3@2 f3, ~ eb3]/2", // B F5
  O: "[~@4 [eb3,g3,bb3,eb4]@2 ~@6 [d3,gb3,a3,c4]@9 ~@3 [g3,b3]@8 [gb3,a3]@8 e4@8 ~@4 gb3@4 [g3,b3]@8 [gb3,a3]@8 e4@8 ~@4 gb3@4 [eb3,eb4,g4]@8 [bb2,c4,d4,f4]@8 [c3,g3,eb4]@8 f3@8 [g3,b3]@8, ~@3 d4@2 c4@2 ~@2 c4@2 bb3@2 bb3@2 ~, ~@10 g3@3 ~@5 g3@3 ~@7 [g2,d4]@4, ~@6 d4@3 ~ d4 ~@5]/8", // Eb D7 G Gbm G Gbm Eb Bb …
  P: "[[c3,c4,eb4] [bb2,d4,f4] [eb3,eb4,g4] [c3,g3,e4] bb3 a3, ~ bb3@2 c4@3, ~@2 [f2,f4]]/3", // Cm Bb Eb C F
  Q: "[[db2,db4,f4]@2 [f2,c4,eb4]@2 gb2@2 ~ gb3 [db2,f4]@2 [f2,c4,eb4]@2 gb2@2 bb3 [ab3,c4,eb4], ab3@3 [ab2,bb3] ~@3 ab2, ~@4 db4@6 ~@2 [db4,f4]@3 ~, ~@4 f4@3 ~ ab3@6 ~@2]/4", // Db F7 Db F7 Ab Absus2 Db
  R: "[gb2,gb3,bb3,db4]@2 [eb3,c4] [f3,eb4], ab3, ~ db2", // Gb Cm F7
  S: "[[eb3,gb3,b3,db4]@2 [f3,c4]@2 gb3@2 b3 c4, ~ bb3@2 f3, ~ eb3]/2", // B F5
})).s("gm_string_ensemble_2").gain(0.12).pan(0.7)

// chords · piano
const piano = note(`<
  ~@19 A B C D E F G H I J K L M N O P ~@8 A B C D Q R S T U V W X Y Z AA AB AC AD ~@9
>`.pickRestart({
  A: "~@8 [g2,g3,b3,d4]@7 ~", B: "[a3,d4]@3 ~ [g3,c4,e4]@3 ~, gb3 ~", C: "[e3,g3,c4]@6 ~@2 [g3,b3,d4]@7 ~",
  D: "[gb3,a3,d4]@8 [g3,c4,e4]@7 ~", E: "[g3,c4,d4]@3 ~@3 g5@2, ~@8 [e3,g3,c4]@7 ~",
  F: "[d3,g3,b3]@4 ~ d5 ~ b4 c5@2 b4@2 a4@3 ~, ~@2 g4 ~@5", G: "~@9 b3 e4 b3 ab4 e4 ~ b4, ~ e2",
  H: "[a2,a4]@4 ~@5 db4 bb4!2 gb4 bb4 ~ gb4, ~ gb2", I: "[e4,gb4,b4]@3 ~ [e4,gb4,b4]@4 [eb4,gb4,b4]@4 [eb4,gb4,b4]@4",
  J: "[bb3,d4,f4]@4 [bb3,d4,f4]@3 ~ [a3,c4,f4]@3 ~ [a3,c4,f4]@4", // Bb F
  K: "[bb3,eb4,f4]@3 ~ [bb3,eb4,f4]@3 ~ [g3,bb3,eb4]@4 [bb3,eb4,g4]@3 ~", // Bbsus4 Eb
  L: "[bb3,d4,f4]@7 ~ [a3,c4,f4]@3 ~ [a3,c4,f4]@4", M: "[bb3,eb4,g4]@7 ~ [bb3,c4,f4]@4 [a3,c4,f4]@2 ~@2",
  N: "[bb3,db4,gb4]@6 ~@2 [ab3,db4,f4]@7 eb5", O: "gb5@5 f5 ~ eb5 f5@4 ~@4", P: "eb5@2 bb4 eb5@3 bb4 eb5@3 a4 eb5@4 ~",
  Q: "[g3,c4,d4]@6 ~@2 [g4,bb4,eb5]@3 ~ [g4,bb4,eb5]@3 ~", R: "[f4,bb4,d5]@7 ~ [eb4,g4,c5]@4 [eb4,g4,c5]@3 ~",
  S: "[bb3,d4,g4]@4 [bb3,d4,g4]@3 ~ [b3,d4,g4]@3 ~ [d4,g4,b4]@4", // Gm G
  T: "[eb4,g4,c5]@6 ~@2 [d4,f4,bb4]@3 ~ [bb3,d4,f4]@3 ~", U: "[bb3,eb4,g4]@6 ~@2 [c4,e4,g4]@3 ~ [c4,e4,g4]@3 ~",
  V: "[c4,f4,bb4]@3 ~ [c4,f4,bb4]@3 ~ [c4,f4,a4]@3 ~ [c4,f4,a4]@4", // Fsus4 F
  W: "[ab3,db4,f4]@3 ~ [ab3,db4,f4]@2 ~@2 [c4,eb4,ab4]@3 ~ [c4,eb4,ab4]@3 ~", // Db Ab
  X: "[db4,gb4,bb4]@3 ~ [db4,gb4,bb4]@4 [db4,gb4,ab4]@3 ~ [db4,gb4,bb4]@3 ~", // Gb Dbsus4 Gb
  Y: "[db4,f4,ab4]@3 ~ [db4,f4,ab4]@2 ~@2 [c4,eb4,ab4]@3 ~ [c4,eb4,ab4]@3 ~", // Db Ab
  Z: "[db4,gb4,bb4]@3 ~ [db4,gb4,bb4]@4 [db4,gb4,ab4]@3 ~@5", AA: "[bb3,db4,gb4]@3 ~ [ab3,db4,f4]@4",
  AB: "[eb4,gb4,b4]@3 ~ [eb4,gb4]@2 ~@2 [d4,f4,bb4]@3 ~ [d4,f4,bb4]@3 ~, ~ b4 ~@2", // B Ebm Bb
  AC: "[eb4,gb4,bb4]@3 ~ [eb4,gb4,bb4]@4 ~@6 f5@2", AD: "[a4,d5] ~@3",
})).s("gm_piano").gain(0.32)

// other · pad sweep
const pad_sweep = note("<A B C D A B C D ~@3 A B C D ~@20 A B C D ~@21 A E A D ~@2 F@2 ~@2>".pickRestart({
  A: "d5", B: "~@2 c5 a4 c5 a4 c5@2 d5@8", C: "d5 ~@15", D: "~@2 c5 a4 c5@4 d5@8", E: "~@2 c5 a4 c5@4 d5@7 ~",
  F: "[g4@4 d5@4 ~@4 d5@3 g4@7 ~@10]/2",
})).s("gm_pad_sweep").gain(0.45)

// chords · pad warm
const pad_warm = note(`<
  A@8 B@2 C A@4 B@2 D@2 E@6 F@3 G@2 H@2 I@2 J A@4 B@2 D@2 K@8 L@2 M N@2 O I@2 J A@4 B@2 P@2 Q@2
>`.pickRestart({
  A: "[a4 a3 eb2@2 [a2,a3,e4]@2 [d2,f3]@2 ~ a3 eb2@2 [a2,a3,e4]@2 [d2,f3,f4,a4]@2, [bb3,d4] c4 [bb3,d4] c4, [bb2,f4] g4@2 f4@2 g4@2 ~, ~@6 a4@3 ~@7, ~@4 bb2 ~@3]/4", // A5 Dm A5 Dm Bb Bb5
  B: "[[g2,f3,d4,f4]@2 [gb3,gb4] g4 [a2,eb4]@2 d4 c4, bb3 ~, ~ c4@2 ~, ~ c2 ~ [d2,gb3,a3], ~@12 g3@11 ~@9]/2", // G7 Gb Adim D
  C: "[eb2,g3,bb3,d4]", D: "[[eb2,d4]@8 [c2,eb4]@4 a1 d2@3, [g3,bb3]@3 [d3,gb3,c4]]/2",
  E: "[~@2 [g2,g3,b3]@2 [b2,a3,gb4]@2 c3@2 d3@2 [g2,b3]@2 [b2,a3,gb4]@2 c3@2 ~ [gb3,a3,d4] [c2,c4,e4]@2 [g2,b3,d4]@2 [a2,a3,c4,e4]@2, ~@2 d4@4 g3@6 ~@2 [g3,c4,e4]@3 ~ g3@4 ~@2, ~@3 [c4,e4]@2 d4@2 ~ d3 ~@3]/6", // G B7 G B7 D C G Am …
  F: "[[d4,g4]@2 ab3@2 a2 g2 [gb2,bb3,db4]@2 e4@2 eb4@2, [e2,b3]@2 [a3,c4] gb3@3, ~ e4@2 ~ [b2,b3]@2]/3", // G5 Gb E5 Am B
  G: "[[bb2,f3,bb3,d4] [d2,a3] ~ f2, c4 [g3,bb3], ~@2 f4@3 eb4@3, ~@2 eb2 ~]/2", // Bb D5 Gm
  H: "[[bb2,f3,d4]@2 [d2,a3]@2 ~ eb4 [f2,f3,c4]@2, c4 bb3, ~@2 f4@3 ~@3, ~@2 [eb2,g3] ~]/2", // Bb D5 F5 Eb
  I: "[[gb2,gb3,bb3,db4] [db2,f3,ab3] [b2,gb3,b3] [bb2,f3,c4,d4], ~ eb4@2 ~]/2", // Gb Db B5 Bb
  J: "[c3,gb3,bb3]@2 b3 c4, eb4, ~ [f2,a3]", // Cm7b5 F
  K: "[~@8 [g2,g3,b3]@8 [b2,a3,gb4]@8 c3@8 d3@8 [g2,b3]@8 [b2,a3,gb4]@8 c3@8 ~@4 [gb3,a3,d4]@4 [eb2,eb4,g4]@8 [bb2,d4,f4]@8 [c3,eb4,g4]@8 f4@8 b3@7 ~ [c3,c4,eb4]@8 [bb2,bb3,d4,f4]@8, ~@2 d4@4 g3@6 ~@2 [g3,c4,e4]@3 ~ bb3@8 g4@4 ~@2, ~@3 [c4,e4]@2 d4@2 ~ d3 ~@3 [g2,d4]@2 ~@2]/8", // G B7 G B7 D Eb Bb Cm …
  L: "[[eb2,eb4,g4] [c3,g3,e4] bb3 a3, ~ c4@3, ~ [f2,f4]]/2", M: "[db2,db4,f4] [f2,c4,eb4], ab3",
  N: "[gb2@2 f4 [c4,eb4] [db2,db4,f4]@2 [f2,c4,eb4]@2, [gb3,bb3,db4]@3 ab3@5, ~ ab2 ~@2]/2", // Cm Db F7 Gb
  O: "gb2@2 f4 [ab3,c4,eb4], [gb3,bb3,db4]@3 ~, ~ ab2", P: "[eb2,g3,bb3,d4]/2", Q: "[[bb2,a3,c4,d4,f4]@31 ~]/2",
})).s("gm_pad_warm").gain(0.26)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@19 A@8 ~@8 B@6 C ~@18 B@5 C ~@4>".pickRestart({
  A: "~@15 x", B: "~@7 x ~@8", C: "x ~@6 x!2 ~@7",
})).gain(0.32)

// drums · rim
const rim = s("rim").struct("<~@19 A B@7 C ~@7 B@6 ~@19 B@5 ~@5>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~ x ~@2",
})).gain(0.56)

// drums · rim · soft notes
const rim_soft = s("rim").struct("<~@41 [~ x ~ x] ~@23 [~ x ~ x] ~@4>").gain(0.24)

// drums · snare
const snare = s("sd").struct("<~@28 [~ x ~ x]!7 ~@8 [~ x ~ x]!17 ~@10>").gain(0.72)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@19 A B@7 C ~@7 B@7 ~@18 B@5 D ~@4>".pickRestart({
  A: "~@5 x ~ x", B: "~ x ~ x ~ x ~ x", C: "~ x ~ x ~ x ~@2", D: "~ x ~ x!5",
})).gain(0.24)

// drums · low tom
const low_tom = s("lt").struct("<~@27 [~@3 x] ~@24 [~@12 x ~@2 x] ~@3 [~@15 x] ~@13>").gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@27 [~@14 x!2] ~@24 [~@13 x!2 ~] ~@17>").gain(0.48)

// drums · open hat
const open_hat = s("oh").struct("<~@31 [~@7 x] ~@2 [~@7 x] ~@12 [~@3 x ~@4] ~@22>").gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@27 [~@12 x!2 ~@2] ~@24 [~@3 x] ~@3 [~@7 x] ~@13>").gain(0.48)

// drums · crash
const crash = s("cr").struct("<~@28 A ~@3 A ~@14 B ~@5 A ~@3 A ~@12>".pickRestart({
  A: "x", B: "~ x",
})).gain(0.48)

// drums · shaker
const shaker = s("sh").struct("<~@19 A B@7 C D E@3 D E@2 B@4 F G ~@2 H E@8 I D E@2 I D E@2 B@4 G ~@5>".pickRestart({
  A: "~@4 x!4", B: "x!8", C: "x!7 ~", D: "~ x!15", E: "x!16", F: "~ x!7", G: "~@2 x!2 ~@4", H: "~@8 x!8", I: "x!15 ~",
})).gain(0.24)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@19 A B@7 C ~@7 B@4 D E F ~@18 B@4 E G ~@4>".pickRestart({
  A: "~@9 x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", C: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2",
  D: "x!2 ~ x ~ x ~ x ~ x ~ x ~ x ~ x", E: "x!4 ~ x ~ x!9", F: "x!16", G: "x!13 ~@3",
})).gain(0.08)

stack(
  bass, electric_guitar_clean, marimba, marimba_soft, string_ensemble_1, string_ensemble_2, piano, pad_sweep, pad_warm,
  kick, kick_soft, rim, rim_soft, snare, hihat, hihat_soft, low_tom, mid_tom, open_hat, high_tom, crash, shaker,
  shaker_soft
)

More by Andrea Bocelli