Strudelify

Rapsodia

Andrea Bocelli

KeyD minorTempo65 bpm
0:00/0:00
// Rapsodia — Andrea Bocelli
// 65 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 87 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(65/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(`<
  ~@3 A B C@2 D ~@34 E F G H F I J H K F H L M F N G O P Q R S T U V W T R X Y Z AA G AB AC H AD AE AF AG@2 ~@5
>`.pickRestart({
  A: "~@13 a3@2 f3, ~@13 g3 ~@2", B: "g3 ~ f3@7 ~ f2 ~@5", C: "[~@9 f3 ~ f2 c3 g3 c3 f3@5 ~@12]/2",
  D: "~@4 [c3,g3] c3 f3@3 d3 ~ [g3,a3] g3@4", E: "bb1@3 bb1", F: "d2", G: "f1", H: "c2", I: "d1", J: "f1@14 ~ f1",
  K: "bb1", L: "bb1@3 f1", M: "bb1@3 c2", N: "c3 c2", O: "bb1@5 ~ bb1 ~ bb1@7 ~", P: "d1@5 ~ d1 ~ d1@4 f1@3 ~",
  Q: "f1@5 ~ f1 ~ f1@2 g1@2 a1@2 d2@2", R: "c2@5 ~ c2 ~ c2@8", S: "d2@5 ~ d2 ~ d2@8", T: "d1@5 ~ d1 ~ d1@8",
  U: "f1@5 ~ f1 ~ f1@8", V: "c2@5 ~ c2 ~ c2@6 d2 c2", W: "bb1@5 ~ bb1 ~ bb1@8", X: "bb1@5 ~ bb1 ~ bb1@6 f1@2",
  Y: "bb1@5 ~ bb1 ~ bb1@4 c2@4", Z: "d2@6 d1 ~ d1@8", AA: "f1 c2", AB: "bb1@12 c2@3 c2", AC: "c2@2 d1 g1@2 f1 d1@10",
  AD: "bb1@6 bb1 ~ bb1@8", AE: "a1@5 ~ a1 ~ a1@8", AF: "g1 c2", AG: "[f1@3 ~]/2",
})).s("gm_electric_bass_finger").gain(0.64)

// chords · overdriven guitar
const overdriven_guitar = note("<~@58 A@2 B C D E F@2 ~@2 G H I J K L ~@13>".pickRestart({
  A: "[~@20 d4@11 d4, bb3 a3, ~ f3 ~@2, ~@3 d4@2 ~@3]/2", B: "d4", C: "d4 c4", D: "d4@3 f3 bb3@4", E: "d4@3 a3 d4@4",
  F: "[~@5 f3 ~ c4, c4@15 ~ c4@11 ~@5, ~@5 f3@5 ~@2 e3@4]/2", G: "a3", H: "f3@15 ~",
  I: "~ f3 ~@2 bb3@2 e4@2, ~ d4@2 ~, ~@3 f3@3 ~@2", J: "~ a3 ~@2 d4@4, ~ f4 ~@2, ~@3 a3@5",
  K: "~ f4 ~ e4, a3 g3, ~ c4@3 ~ c4@3", L: "f3",
})).s("gm_overdriven_guitar").gain(0.19).pan(0.9)

// chords · pad choir
const pad_choir = note("<A@8 B@2 ~@77>".pickRestart({
  A: "[~@65 g5@17 ~@19 g5@19 ~@8, [f4,f5,f6]]/8", B: "[~ g5@3]/2",
})).s("gm_pad_choir").gain(0.26).pan(0.3)

// chords · string ensemble 2
const string_ensemble_2 = note("<~@10 A@4 B@4 C@5 D@3 ~@16 A@4 B@4 C@5 D@3 A@4 B@4 C@5 D@3 ~@13>".pickRestart({
  A: "[[bb1,bb3]@2 d2@2 f2@2 ~ c4, d4@7 ~, f3@3 [c2,e3,g3], ~ a3@2 ~]/4", // Bb C
  B: "[bb3@2 ~@2 f2@2 ~ e4, f4@7 ~, [d2,f3] c4, ~ a3@2 [c2,g3]]/4", // Dm C5
  C: "[[bb1,g3,g4]@4 [d2,f4]@4 [c2,a4]@4 ~ d4@2 c4 d4@3 [c2,g3,c4,e4], d4@8 e4@5 ~@7, ~@4 a3@8 [bb1,bb3,f4]@7 ~]/5", // Eb Dm F C Bb5
  D: "[[d2,d4]@2 ~ [g3,e4] [f1,a3,f4]@2, [a3,f4] ~, ~ c4@2, ~ c2 ~]/3", // D C F Dm
})).s("gm_string_ensemble_2").gain(0.1).pan(0.7)

// other · string ensemble 1
const string_ensemble_1 = note("<~@59 A B C D E F G H@3 I J I K L ~@13>".pickRestart({
  A: "~@12 d6@3 d6", B: "d6@9 ~@5 d6!2", C: "d6 c6", D: "f6@12 f6@3 f6", E: "f6@14 f6!2", F: "f6@7 f6", G: "f6 g6",
  H: "[d6@7 a5@5]/3", I: "f5", J: "d5@3 e5", K: "a5 g5", L: "f5@7 ~",
})).s("gm_string_ensemble_1").gain(0.19).pan(0.3)

// chords · melodic tom · Adim
const melodic_tom = note("<~@69 [~@11 [a2,eb3] ~@2 a2 ~] ~@17>").s("gm_melodic_tom").gain(0.72)

// other · piano
const piano = note("<~@26 A@3 B C D@2 E F G H I J K L M ~@17 N A O P Q R S ~@11 T U V W ~@6>".pickRestart({
  A: "[d4,d5,d6]@14 [d4,d5,d6]!2", B: "[d4,d5,d6] [c4,c5,c6]", C: "~@15 [e4,e5,e6], [f4,f5,f6], ~@7 [g4,g5,g6]",
  D: "[f4,f5,f6]@14 [f4,f5,f6]!2", E: "[f4,f5,f6]@8 [g4,g5,g6]@7 ~", F: "[g4,g5,g6]@5 [f4,f5,f6] [g4,g5,g6] [a4,a5,a6]",
  G: "[f4,f5,f6]@5 [d4,d5,d6] [e4,e5,e6] [f4,f5,f6]", H: "[e4,e5,e6]@5 [c4,c5,c6] [e4,e5,e6] [f4,f5,f6]",
  I: "[e4,e5,e6]@8 [d4,d5,d6]@7 ~", J: "[d4,d5,d6]@3 [e4,e5,e6]", K: "[f4,f5,f6]@14 ~ [g4,g5,g6], ~@7 [f4,f5,f6]",
  L: "[a4,a5,a6] [g4,g5,g6]", M: "[f4,f5,f6]@7 ~", N: "~@12 [d4,d5,d6]@3 d4",
  O: "[d4,d5,d6]@7 [c4,c5,c6] [c4,c5,c6]@7 ~", P: "[f4,f5,f6]@12 [f4,f5,f6]@3 [f4,f5,f6]",
  Q: "[f4,f5,f6]@11 ~@3 [f4,f5,f6]!2", R: "[f4,f5,f6]@10 ~@2 [f4,f5,f6]@3 [f4,f5,f6]",
  S: "[f4,f5,f6]@7 [g4,g5,g6] ~@3 c6 [c4,c5,c6]@4, ~@2 [g4,g5,g6] ~, ~@5 [e4,e5,e6] ~@2", // F G C G E
  T: "~@4 d4@4 f4@5 [c4,c5]@2 [bb3,bb4]", U: "[c4,c5]@6 [c4,f4]@5 ~@3 bb3 a3, [bb3,bb4] ~@15",
  V: "a3 ~@5 f3@2 bb3@7 ~, bb3 ~", W: "~@4 g3 a3 f4@10, [f1,f2]",
})).s("gm_piano").gain(0.45).pan(0.4)

// other · acoustic guitar nylon
const acoustic_guitar_nylon = note("<~@39 A B C ~@5 D ~@5 E F G ~@21 H ~@2 I ~@6>".pickRestart({
  A: "~@3 [d4,f4] a4 g4 ~ [d4,f4,g4] [d4,f4]@5 ~@3", B: "[f4,a4]@7 ~ [e4,g4]@7 ~", C: "f4@7 ~@9",
  D: "~@4 g3 a3 g4 a3 f4@6 ~@2", E: "~@12 [c4,d4] c4 d4 f4", F: "d4@7 ~@9",
  G: "~@3 [a3,d4] [f4,a4] ~ g4 [d4,f4,g4] [d4,f4]@3 ~@5", H: "~@4 d4@4 f4@5 ~@3", I: "~@4 g3 a3 f4@4 ~@6",
})).s("gm_acoustic_guitar_nylon").gain(0.38).pan(0.7)

// chords · synth strings 1
const synth_strings_1 = note(`<
  A@8 ~@2 B@4 C@4 D@5 E@3 B@4 C@4 D@5 E@3 B@4 C@4 D@5 E@3 B@4 C@4 D@5 E@3 F G@2 H I@8 ~
>`.pickRestart({
  A: "[~ g3@3, [f2,d3,bb3,c4,f4]]/8", B: "[[bb1,bb3]@2 d2@2 f2@2 ~ c4, d4@7 ~, f3@3 [c2,e3,g3], ~ a3@2 ~]/4",
  C: "[bb3@2 ~@2 f2@2 ~ e4, f4@7 ~, [d2,f3] c4, ~ a3@2 [c2,g3]]/4", // Dm C5
  D: "[[bb1,g3,g4]@4 [d2,f4]@4 [c2,a4]@4 ~ d4@2 c4 d4@3 [c2,g3,c4,e4], d4@8 e4@5 ~@7, ~@4 a3@8 [bb1,bb3,f4]@7 ~]/5", // Eb Dm F C Bb5
  E: "[[d2,d4]@2 ~ [g3,e4] [f1,a3,f4]@2, [a3,f4] ~, ~ c4@2, ~ c2 ~]/3", F: "[bb2,f3,bb3,d4]@3 [c3,g3,c4,e4]",
  G: "[[d3,d4]@2 ~ [g3,e4], [a3,f4]@3 ~, ~ [c3,c4]]/2", H: "[bb2,bb3,d4,f4]",
  I: "[[a2,c4]@16 g2@8 [c3,d4]@8 a3@16 bb3@2 g3@14 ~@8 c3@11 ~@17 f4@28, f3, ~ bb3 c4@6, ~ f2 [d2,bb3]@2, ~@3 d3@5]/8", // Am Csus2 Gm
})).s("gm_synth_strings_1").gain(0.4).pan(0.4)

// chords · distortion guitar
const distortion_guitar = note("<~@58 A B C D E F G H I J K L M N O@2 ~@3 P Q R S@4 ~@3>".pickRestart({
  A: "~ bb3@3, bb2@13 ~@3, ~ f3@7", B: "~ a3@3, d2@13 ~@3, ~ f3@7", C: "~ a3, f2@15 ~, ~@2 c3@13 ~, ~ d4@3",
  D: "~ d4 c4@2, c3, ~ g3@7", E: "~@2 f4 f3 bb3@4, bb2 ~, ~ f3@2 ~@5", F: "~ f3 ~@2 d4@4, d3, ~ f4 ~@2, ~@3 a3@5",
  G: "~ a3, ~ f3@2 f3@4 ~, ~ c4 ~@2", H: "~ f3 ~ f3 e3@4, ~ c4 ~@2", I: "~ bb2 ~@2 bb3@4, g2, ~ d3 ~@2, ~@6 g3@7 ~@3",
  J: "~ a3 ~@2 d4@4, d3, ~ d4 ~@2, ~@3 a3@5", K: "~ c4, ~@2 a3@4 a3@7 ~@3, ~ e4@2 ~",
  L: "~@3 f3 bb3@4, ~ f3@2 ~@5, ~ d4 ~@2", M: "bb2@3 c3", N: "d3", O: "[~@16 f2@15 ~, c3@31 ~]/2", P: "bb2", Q: "a2",
  R: "g2 c3", S: "f2/4",
})).s("gm_distortion_guitar").gain(0.22).pan(0.1)

// drums · kick
const kick = s("bd").struct(`<
  ~@26
  [x ~@2 x!2 ~@3]!43
  [x ~@5 x ~@3 x ~@2 x ~ x]
  [x ~@2 x!2 ~@3]!3
  x
  [x ~@2 x!2 ~@3]!6
  x
  ~@6
>`).gain(0.56)

// drums · snare
const snare = s("sd").struct("<~@26 [~ x ~ x]!43 [~ x!2 ~] [~ x ~ x]!3 ~@4 [~ x ~ x]!3 ~@7>").gain(0.48)

// drums · open hat
const open_hat = s("oh").struct("<~@61 A ~@3 A ~@2 A ~@8 A ~@9>".pickRestart({
  A: "~@7 x",
})).gain(0.24)

// drums · crash
const crash = s("cr").struct(`<
  ~@26 A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A B A B A C A B A ~ A B A ~ A B A ~ A B D A E ~ A ~ A@2 ~ A@2 ~@6
>`.pickRestart({
  A: "x", B: "~@3 x", C: "~ x", D: "x!2 ~ x", E: "x!2",
})).gain(0.32)

// drums · ride bell
const ride_bell = s("rd").struct("<~ A ~@4 A ~ B ~@61 C@3 D ~@13>".pickRestart({
  A: "~ x", B: "~ x ~@14", C: "x!8", D: "x",
})).gain(0.4)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@26 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~ B ~ A ~ C@15 ~ A ~ A C@3 ~@7
>`.pickRestart({
  A: "~ x", B: "~ x!2 ~", C: "~ x!3",
})).gain(0.4)

// drums · congas
const congas = s("conga:13").struct("<~@42 A B C B C B C B C B C B C B C B D@15 ~ E@3 D@3 ~@7>".pickRestart({
  A: "~@2 x ~@6 x ~@6", B: "~@3 x ~@4", C: "~@9 x ~@6", D: "~ x ~@6", E: "~ x ~@5 x",
})).gain(1.02)

// drums · congas
const congas_2 = s("conga:18").struct("<~@43 A B A B A B A B A B A B A B A C@15 ~ A@3 C@3 ~@7>".pickRestart({
  A: "~@15 x", B: "~ x ~@6", C: "~@3 x ~@4",
})).gain(1.02)

// drums · congas · soft notes
const congas_soft = s("conga:18").struct("<~@74 [~@3 x ~@4]!3 ~@10>").gain(0.51)

// drums · congas
const congas_3 = s("conga:33").struct("<~@58 [~@11 x ~@4]!14 ~@5 [~@11 x ~@4]!3 ~@7>").gain(1.02)

// drums · congas · soft notes
const congas_soft_2 = s("conga:33").struct("<~@74 [~@11 x ~@4]!3 ~@10>").gain(0.51)

// drums · shaker
const shaker = s("sh").struct("<~@26 A@25 B C@3 D A@17 E F@3 E@3 ~@7>".pickRestart({
  A: "x ~ x!3 ~ x ~ x ~ x!3 ~ x ~", B: "x ~ x!3 ~ x ~ x ~ x!3 ~ x!2", C: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2",
  D: "x ~ x!3 ~ x!3 ~ x!3 ~ x ~", E: "x!8", F: "x!2 ~ x",
})).gain(0.24)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@74 [~@2 x!2 ~@2 x ~ x ~ x!2 ~@2 x ~]!3 [x ~ x!2 ~@2 x ~ x ~ x!3 ~ x ~]!3 ~@7>")
  .gain(0.08)

// drums · claves
const claves = s("clave:2").struct(`<
  ~@27 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~ B ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2 A ~@8
>`.pickRestart({
  A: "~@12 x!3 ~", B: "~@8 x!3 ~ x!3 ~",
})).gain(1.57)

// drums · triangle
const triangle = s("triangles:35").struct(`<
  ~@26 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~ B ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A@2 ~ A ~@7
>`.pickRestart({
  A: "~ x", B: "~ x!2 ~",
})).gain(2.09)

stack(
  bass, overdriven_guitar, pad_choir, string_ensemble_2, string_ensemble_1, melodic_tom, piano, acoustic_guitar_nylon,
  synth_strings_1, distortion_guitar, kick, snare, open_hat, crash, ride_bell, tambourine, congas, congas_2,
  congas_soft, congas_3, congas_soft_2, shaker, shaker_soft, claves, triangle
)

More by Andrea Bocelli