Strudelify

L'arcobaleno

Celentano

KeyD minorTempo64 bpm
0:00/0:00
// L'arcobaleno — Celentano
// 64 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 54 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(64/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(`<
  ~@2 A B C D A E F G A B C H I J K L C M A E F G A B C D A E F G A B C D I J K L C M N E C O F P F G F Q@3
>`.pickRestart({
  A: "d1@7 d1 e1@8", B: "a1@7 a1 d2@7 d2", C: "c2@7 c2 b1@7 b1", D: "a1 d1", E: "a1@7 a1 d2@8", F: "c2@7 c2 b1@8",
  G: "a1@7 a1 d1@6 a1 d2", H: "a1@7 a1 d1@3 a1@5", I: "gb1@7 d1 eb1@4 eb1@4", J: "d1@7 d1 g1@5 d1 g1@2",
  K: "gb1@7 gb1 f1@7 f1", L: "e1@4 a1@4 d1@6 a1 d2", M: "a1@7 a1 d1@5 a1@3", N: "d1@7 d1 e1@7 e1",
  O: "a1@7 a1 d1@5 a1 d2 e2", P: "a1@3 f1@4 d1 d1@7 d2", Q: "[~ a1@10 ~ d1@31 ~@5]/3",
})).s("gm_electric_bass_finger").gain(0.64)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@2 A B@2 C ~@4 D@3 E F@3 G@2 H@2 I@2 J K L@2 M N@2 O@2 K P@2 M F@3 G@2 Q@3 R@2 S@2 T U V@4
>`.pickRestart({
  A: "[f3,bb4] [g3,a4]", B: "[bb3@2 ~ f4@3 [ab3,e4]@2, g4@3 ~@5, ~ a3@2 ~]/2", C: "a3 g3 e4 d4, f4 f3",
  D: "[a4 g4@2 f4@2 e4]/3", E: "d4 db4 d4@2",
  F: "[a4@4 c5@4 bb4@4 c5@4 a4@4 d5@4 bb4@6 bb4 c5 d5@5 a5@3 ~@5 d5@3, c4@3 [g3,g4] [gb3,gb4] [f3,bb3,d4,bb5], [a3,gb4]@2 [bb3,eb4,g4]@2 [a3,d4,gb4]@2 [bb3,d4]@4 ~ g4]/3", // G Gb Bb D Eb D Bb
  G: "[db5@5 g5@3 [f4,f5]@6 [d4,f5] [e4,g5] [c4,f4,a5]@8 [f3,ab3,d4,ab5]@8, [e3,g3,db4,e4] [d3,f3]@2 ~, ~ a3 ~@2]/2", // F Dm Em F Ddim Dbdim Dm
  H: "[[e3,a3,db4,g5]@4 f5@2 e5 d5 a4@4 ~@2 d4@2, ~ [f3,a3,d4]@2 ~]/2", I: "[db4 e4 ~@2 a4@2 [ab4,b4]@2, ~ d4@3]/2",
  J: "[g4,db5]@4 [f4,a4]@4 e4@4 ~ d4 f4 a4, ~ a3", K: "~ bb5 [g3,a4,a5]@2, [f3,f4,bb4] ~",
  L: "[~@12 f5@6 ~@3 f5@3 [ab3,e4,e5]@8, g4@3 f4@3 ~@2, bb3 a3@2 ~, ~ g5@2 ~@5]/2", // Dbm
  M: "a3@4 ~ f5@3 [e4,e5]@4 [d4,d5]@4, f4 ~, ~ g3 f3@2", N: "[~@13 e3 g3 bb3@5 a3@4 e4@4 d4@4, ~@3 a3]/2",
  O: "[a3@8 ab3@5 ab3 b3 d4@5 db4@4 d4@5 e4 f4 a4]/2",
  P: "[db5@4 ~@4 e4@4 f5@6 ~@3 f5@3 [ab3,e4,e5]@8, g4@3 [d4,f4]@3 ~@2, bb3 a3@2 ~, ~ g5@2 ~@5]/2", // Dbm Dm
  Q: "[[e3,a3,db4,g5]@8 f5@4 e5@2 d5@2 a4@8 ~@5 e3 g3 bb3@5 a3@4 e4@4 d4@3 ~, ~ [f3,a3,d4]@2 ~@3]/3", // A7 Dm
  R: "[~@13 ab3 b3 d4@5 db4@4 e4@4 d4@4]/2",
  S: "[~@3 f5!2 ~@8 ab3 b3 d4@4 f5 db4@4 [e4,e5]@3 ~ d4@4, ~@20 f5 ~@6 d5@3 ~@2]/2", T: "~ a4 ab4@2, d4",
  U: "[db4,g4] [a3,a4]", V: "[~@4 a4@4 ab4@9 [db4,g4]@10 ~ [a3,a4]@31 ~@5, d4@17 ~@47]/4",
})).s("gm_string_ensemble_1").gain(0.47)

// chords · pizzicato strings
const pizzicato_strings = note(`<
  ~@2 A B C D A B C E A B C E F G H I J K A B C D A B C D A B C E A B C D F G H I J K A B C D C D C D L ~@3
>`.pickRestart({
  A: "~@2 [f3,a3,d4] ~@2 [f3,a3,d4] ~@4 [e3,ab3,d4] ~@2 [e3,ab3,d4] ~@2", // Dm E7
  B: "~@2 [e3,a3,db4] ~@2 [e3,a3,db4] ~@4 [f3,a3,d4] ~@2 [f3,a3,d4] ~@2", // A Dm
  C: "~@2 [f3,a3,c4] ~@2 [f3,a3,c4] ~@4 [e3,ab3,b3] ~@2 [e3,ab3,b3] ~@2", // F E
  D: "~@2 [a3,db4,f4] ~@2 [g3,db4,f4] ~@4 [f3,a3,d4] ~@5", // Aaug Gm7b5 Dm
  E: "~@2 [a3,db4,f4] ~@2 [g3,db4,f4] ~@4 [f3,a3,d4] ~@2 [f3,a3,d4] ~@2", // Aaug Gm7b5 Dm
  F: "~@2 [a3,c4,gb4] ~@2 [a3,c4,gb4] ~@4 [a3,c4,g4] ~@2 [a3,c4,g4] ~@2", // Gbdim Am7
  G: "~@2 [a3,c4,gb4] ~@2 [a3,c4,gb4] ~@4 [bb3,d4,g4] ~@5", // Gbdim Gm
  H: "~@2 [gb3,bb3,d4] ~@2 [gb3,bb3,d4] ~@4 [f3,bb3,d4] ~@2 [f3,bb3,d4] ~@2", // Gbaug Bb
  I: "~@2 [a3,db4,e4] ~@7 [f3,a3,d4] ~@2 [f3,a3,d4] ~@2", // A Dm
  J: "~@2 [f3,a3,c4] ~@2 [f3,a3,c4] ~@4 [f3,ab3,d4] ~@2 [f3,ab3,d4] ~@2", // F Ddim
  K: "~@2 [a3,db4,e4] ~@2 [a3,db4,e4] ~@4 [f3,a3,d4] ~@2 [f3,a3,d4] ~@2", // A Dm
  L: "~@2 [f3,a3,c4] ~@2 [f3,a3,c4] ~@4 [e3,ab3,b3] ~@3 [e3,ab3,b3] ~", // F E
})).s("gm_pizzicato_strings").gain(0.48)

// other · piano
const piano = note("<~@2 A@2 B C ~ D@2 ~ E@2 F@2 ~@5 G@2 ~@3 A@2 B C ~ D@2 ~ A@2 H@2 ~@6 I@2 J@6 K L@3>".pickRestart({
  A: "[~@13 [e2,e3] [g2,g3] [bb2,bb3]@4 [a2,a3]@13]/2", B: "~@5 a2 d3 e3@9", C: "d3 db3 d3@2",
  D: "[~@16 a4@11 ~@5, ~@12 f4@15 ~@5]/2", E: "[~@13 e3 g3 bb3@4 a3@10 ~@3]/2", F: "[~@13 ab3 b3 d4@5 db4@4 ~@8]/2",
  G: "[~@15 a5@11 ~@6, ~@6 e5@7 ~@3, ~@7 d5@6 ~@3]/2", H: "[~@13 ab3 b3 d4@5 db4@4 d4@8]/2",
  I: "[~@13 e3 g3 bb3@5 a3@4 ~@8]/2", J: "[~@13 ab3 b3 d4@5 db4@4 d4@7 ~]/2", K: "~@14 ab3 b3",
  L: "[d4@6 ~ db4@5 e4@5 ~@8 e5@17 ~@6, ~@12 a3@31 ~@5, ~@17 d4@26 ~@5, ~@3 f4@4 ~]/3",
})).s("gm_piano").gain(0.64)

// other · piano · soft notes
const piano_soft = note("<~@51 A@3>".pickRestart({
  A: "[~@24 [e5,f5] ~@7 a5@10 ~@6, ~@11 d3@31 ~@6, ~@10 a4@11 ~@3, ~@11 d5@10 ~@3, ~@14 c6@7 ~@3]/3", // Fmaj7
})).s("gm_piano").gain(0.4)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@2 A B@2 C@2 D@2 E@2 F@2 G H I@2 J K L M D@2 N A B@2 C@2 D@2 O@2 B@2 P H I@2 J K L M D@2 N Q N Q N Q R@3
>`.pickRestart({
  A: "d3 e3, d4@15 ~", B: "[[g3,db4]@2 e4 ~ c3@2 [b2,e3]@2, ~ f3@2 ~, ~@3 d4@5]/2",
  C: "[[a2,g3,f4]@2 e4 ~@3 [g3,bb3]@2, ~ [d3,f3]@2 ~, ~@3 d4@5]/2", D: "[[e3,a3,db4] [f3,a3,d4]@2 [e3,ab3,d4]]/2",
  E: "[a3 g3 e4 ~@3 [g3,bb3]@2, [db4,f4] [d3,f3]@2 ~, ~@3 d4@5]/2", // Gm Db Dm
  F: "[[e3,a3,db4]@2 e4 d4@3 [e3,ab3,d4]@2, ~ [f3,a3]@2 ~]/2", G: "a3 g3 e4 d4, [db4,f4] [f3,a3]",
  H: "gb4 [eb4,g4], c4@15 ~", I: "[[d4,gb4]@2 g4@2 gb4@2 ~ g4, ~ d4@2 d4]/2", J: "[db4,e4]@8 f4@6 d4 e4, ~ a3",
  K: "c4 b3, f4", L: "[db4,e4] [a3,d4]", M: "[d3,f3] [g3,bb3], d4", N: "a3 g3 e4 d4, [db4,f4] [d3,f3]",
  O: "[a3 g3 e4 d4 d3@2 e3@2, [db4,f4] f3@2 ~, ~ d3 d4@2]/2", P: "[a2,g3,f4]@2 e4 d4, ~ [d3,f3]",
  Q: "[f3,a3,d4] [e3,ab3,d4]", R: "[~ a3@5 ~ g3@5 e4@5 d4@26 ~@5, ~ [db4,f4]@10 ~ [d3,f3]@31 ~@5]/3",
})).s("gm_synth_strings_1").gain(0.32)

// drums · kick
const kick = s("bd").struct("<~@2 [x!2]!12 [x ~ x!2] [x!2]!36 [x!2 ~@14] ~@2>").gain(0.8)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@2 [~@7 x ~@8]!49 ~@3>").gain(0.4)

// drums · snare
const snare = s("sd").struct("<~@28 [~ x ~ x]!22 [~@4 x ~@6 x!2 ~@3] ~@3>").gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<~@50 [~@14 x!2] ~@3>").gain(0.72)

// drums · hihat
const hihat = s("hh").struct("<~@2 A B@21 A B@3 A B@3 A B@3 A B@13 C ~@3>".pickRestart({
  A: "~@2 x!3 ~ x!3 ~ x!3 ~ x ~", B: "x ~ x!3 ~ x!3 ~ x!3 ~ x ~", C: "x ~ x!3 ~ x!3 ~ x!3 ~@2 x",
})).gain(0.48)

// drums · open hat
const open_hat = s("oh").struct("<~@2 [~@15 x]!48 ~ [x!2 ~@14] ~@2>").gain(0.48)

// drums · crash
const crash = s("cr").struct("<~@2 A ~@11 A ~@5 A ~@3 A ~@3 A ~@3 A ~@3 A ~@5 A ~@11>".pickRestart({
  A: "x",
})).gain(0.56)

// drums · ride
const ride = s("rd").struct("<~@5 A B ~@6 A ~@13 A ~@3 A ~@3 A ~@3 A@3 ~@12>".pickRestart({
  A: "~@15 x", B: "x",
})).gain(0.56)

// drums · tambourine
const tambourine = s("tb").struct("<[x!16]!50 [x!13 ~ x!2] [x!2 ~@14] ~@2>").gain(0.48)

// drums · bongos
const bongos = s("bongo:18").struct("<~@14 [~ x ~ x]!5 [~ x ~@2] [~ x ~ x]!8 ~@26>").gain(1.26)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@2 [~@4 x ~@10 x]!48 [~ x ~@2] x ~@2>").gain(2.84)

// drums · triangle
const triangle = s("triangles:30").struct("<~@2 [~@9 x ~@6]!49 ~@3>").gain(4.18)

// drums · triangle
const triangle_2 = s("triangles:35").struct("<~@2 [~@11 x ~@4]!49 ~@3>").gain(4.18)

// drums · shaker
const shaker = s("sh").struct("<~@2 [~ x ~ x ~ x ~@3 x ~@3 x ~@2]!48 [~ x ~ x ~ x ~@3 x ~@4 x ~] ~@3>").gain(0.56)

// drums · jingle bells
const jingle_bells = s("sleighbells:4").struct("<~@2 [~@11 x ~@4]!49 ~@3>").gain(1.38)

stack(
  bass, string_ensemble_1, pizzicato_strings, piano, piano_soft, synth_strings_1, kick, kick_soft, snare, low_tom,
  hihat, open_hat, crash, ride, tambourine, bongos, cabasa, triangle, triangle_2, shaker, jingle_bells
)

More by Celentano