Strudelify

Le notti di maggio

Fiorella Mannoia

KeyD♭ majorTempo64 bpm
0:00/0:00
// Le notti di maggio — Fiorella Mannoia
// 64 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 62 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 27.
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 · fretless bass
const bass = note(`<
  ~@2 A B C D ~@12 E F G H E F G I A D J C E K E L M N O P M N O P Q R S T U V R W X Y Z AA X AB@2 ~@2 AC@3
>`.pickRestart({
  A: "b1", B: "e1", C: "ab1", D: "bb1", E: "db2", F: "gb1@23 ~ ab1@24", G: "bb1@47 ~", H: "c2", I: "eb1@47 ~", J: "a1",
  K: "gb1 ab1", L: "gb1@6 ab1@5 ~", M: "b1@15 ~@3 b1@2 ~@4 b1@21 ~@3", N: "b1@17 ~ b1@2 ~@4 b1@23 ~",
  O: "ab1@15 ~@3 ab1@2 ~@4 ab1@24", P: "bb1@8 ~ bb1 ~@2 bb1@11 ~", Q: "b1@16 ~@2 b1@2 ~@4 b1@23 ~",
  R: "bb1@15 ~@3 bb1@2 ~@4 bb1@24", S: "a1@15 ~@3 a1@2 ~@4 a1@24", T: "ab1@15 ~@3 ab1@2 ~@4 ab1@12 bb1@6 c2@6",
  U: "db2@15 ~@3 db2@2 ~@4 db2@23 ~", V: "gb1@16 ~@2 gb1@5 ~ ab1@17 ~ ab1@6", W: "c2@16 ~@2 c2@2 ~@4 c2@16 ~@2 c2@5 ~",
  X: "db2@15 ~@3 db2@2 ~@4 db2@17 ~ db2@5 ~", Y: "gb1@8 ~ gb1@2 ~ ab1@11 ~", Z: "bb1@15 ~@3 bb1@2 ~@4 bb1@12 ab1@12",
  AA: "gb1@17 ~ ab1@5 ~ ab1@17 ~ ab1@5 ~", AB: "[gb1@16 ~@2 ab1@5 ~ ab1@61 ~@11]/2", AC: "[~@9 db2@98 ~@37]/3",
})).s("gm_fretless_bass").gain(0.33)

// chords · synth strings 2
const synth_strings_2 = note("<~@4 A@2 ~@7 B@2 ~@18 C D@7 E@6 F@3 G@7 ~@2 H@3>".pickRestart({
  A: "[~@5 ab5@9 ~@2]/2", B: "[~@11 db5@21, ~@11 b4@19 ~@2]/2", C: "~@47 [b3,eb4]",
  D: "[gb3@47 [db4,e4]@48 [b3,eb4]@48 [gb3,bb3,db4]@48 [b3,eb4,gb4]@48 [ab3,db4,e4]@48 [ab3,b3,eb4]@48 [gb3,bb3,db4], ~@47 ab3@96 ~@193]/7", // Dbm B Gb B Dbm Abm Gb
  E: "[~@47 [b3,eb4]@47 ~ db4@47 ~ [a3,db4,gb4]@48 db4@23 c4@25 [db4,f4]@23 [c4,eb4]@24 ~ db4, ~@47 gb4@95 ~@49 gb4@49 ~@46 [gb3,bb3]@2, ~@94 bb3@48 ~@49 ab3@96 ~]/6", // B Gbm Db Cm Gb
  F: "[~@23 c4@23 gb4@6 f4@43 [ab3,c4,eb4]@48 [ab3,db4,f4], ~@22 [ab3,eb4]@24 [bb3,db4]@49 ~@49]/3", // Ab Db Ab5 Bbm
  G: "[~@23 c4@24 [gb3,bb3,db4]@24 [ab3,c4,eb4]@23 ~ gb4@6 f4@29 eb4@12 ~ [gb3,db4]@23 [ab3,c4,eb4]@24 ~ [db4,f4]@23 [c4,eb4]@25 [gb3,bb3,db4]@24 [ab3,c4]@57 ~@16, ~@22 eb4@25 ~@47 bb3@72 ~@24 ab3@47 ~@99, ~@94 db4@47 ~@122 eb4@73]/7", // Gb Ab Gb5 Ab Db Cm Gb Ab
  H: "[~@7 [db4,eb4,f4,ab4]@107 ~@30]/3", // Db
})).s("gm_synth_strings_2").gain(0.32).pan(0.4)

// chords · string ensemble 2
const string_ensemble_2 = note(`<
  ~@6 A@2 B C A@2 B D E F@3 G H I J K H L M N@4 O P G P ~@8 Q@3 R S T U V W X Y@5 Z@5
>`.pickRestart({
  A: "b1/2", B: "ab1", C: "bb1", D: "bb1@23 ~", E: "eb4", F: "[db4@47 ~ db4@12 c4@11 ~, gb4@47 ~]/3", G: "f4 eb4, ab3",
  H: "[bb3,db4] [ab3,c4,eb4]", I: "gb4@6 f4@6 f3@35 ~, [bb3,db4]", J: "[ab3,c4,eb4]", K: "f4 eb4, ab3 ~@23",
  L: "gb4@6 f4@6 f3@35 ~, [bb3,db4]@47 ~", M: "[g3,bb3,eb4]@47 ~",
  N: "[eb4@2 ~@2 a3@2 ~ c4, gb3@95 ~@49 ab3@48, ~@48 db4@121 ~@23]/4", O: "f4 eb4, ab3 ~@47", P: "[bb3,db4] [c4,eb4]",
  Q: "[~ [gb4,gb5]@143]/3", R: "[gb4,gb5]", S: "[ab4,ab5]", T: "[bb4,bb5] [c5,c6]", U: "[db5,db6]", V: "[eb5,eb6]",
  W: "[f4,f6] [eb4,eb6]", X: "[db4,db6]@2 [eb4,eb6] [gb4,gb6]", Y: "[[c4,c6] [bb3,bb5]@11 [ab3,ab5]@28]/5",
  Z: "[[ab5,ab7]@71 ~@9]/5", // Ab
})).s("gm_string_ensemble_2").gain(0.21).pan(0.6)

// chords · piano
const piano = note("<~@2 A B C D E F G H I J G K L M N O P ~@43>".pickRestart({
  A: "gb3@3 ~@9 eb4@11 ~, [b2,b3]@23 ~, ~@3 gb3@20 ~, ~@6 gb4@17 ~, ~@9 db4@14 ~", // B
  B: "~@6 e4@7 ~@2 db5, [e2,b3]@13 e4@3, gb4@12 gb3@30 gb4@5 ~, ~@6 b2@41 ~, ~@6 e4@6 gb4@6 ab3@29 ~", // E5
  C: "~@6 ab3@6 ~@18 b3@17 ~, ab2@47 ~, [b3,gb4]@12 ab3@35 ~, ~ eb3@2 ~ b3@6 ~@6, ~@24 db4@23 ~", // B5
  D: "~@18 gb4@4 ~@3 gb4@23, bb2@23 ~ [bb2,db4]@24, gb4@9 ~@2 ab3@13, db4@12 db4@11 bb3@25, ~@6 gb3@17 ~@25", // Bbm
  E: "b3@3 b3, [b2,gb3,eb4]", F: "db4@36 [b3,db4,gb4]@11 ~, [b2,ab3,e4]@47 ~", G: "[ab2,bb3,b3,eb4]@47 ~",
  H: "gb3@42 gb3@5 ~, [bb2,ab3,db4]@47 ~", I: "[b2,gb3,b3,eb4]@47 ~",
  J: "ab3@39 ~@6 gb4@2 ~, [b2,db4,e4]@47 ~, ~@39 ab3@8 ~, ~@42 b3@5 ~", K: "[bb2,gb3,ab3,db4]",
  L: "[b3,eb4]@12 [b3,eb4]@12 [b3,eb4]@11 ~@7 gb3@6, b1, ~@3 [b3,eb4]", M: "[db4,gb4]!4, bb1",
  N: "[db4,gb4]@12 [db4,gb4]@12 [db4,gb4]@12 ~@6 gb3@5 ~, a1@47 ~, ~@36 [db4,gb4]@11 ~", // Gb5
  O: "[db4,gb4]@2 ~ gb3 [c4,gb4]@4, ab1, ~ [db4,gb4] ~@2", P: "[ab3,db4,f4] ~",
})).s("gm_piano").gain(0.2)

// chords · piano · soft notes
const piano_soft = note(`<
  ~@4
  [~@12 gb4@35 ~, ~@6 eb4@41 ~, ~@9 eb3@38 ~]
  ~@9
  [~@6 gb3@12 gb3@12 gb3@5 ~@13]
  [~ gb3@2 gb3@2 gb3 ~ gb3]
  [~ gb3@2 gb3@2 gb3@2 ~]
  [~ gb3@2 ~@5]
  ~@44
>`).s("gm_piano").gain(0.12)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note("<~@18 A B@2 C A D@2 E F G H I A J A K@2 L@2 M N L@2 O@7 P Q@8 R@4 ~>".pickRestart({
  A: "~@3 ab3 ~@3 ab3, [db3,f4]@23 ~ [db3,eb4]@23 ~, db4 [db4,ab4] c4 [c4,ab4], ~ ab3@2 ~@2 ab3@2 ~", // Db Dbsus2 Db5 Fm
  B: "[~@6 gb3@6 ~@6 db4@6 ~@18 ab3@5 ~@43 ab3@5 ~, gb2@23 ~ [ab2,eb4]@23 bb2@13 db4@6 ab3@6 bb2@23 ~, db4@15 gb3@8 ~@7 ab3@12 ~@5 bb3@31 ab3@6 db4@11 ~, bb3@12 [bb3,ab4]@13 ~@11 c4@11 ~ gb4@47 ~, ~@48 db4@6 f4@41 ~]/2", // Ab5 Bb7
  C: "~@24 [c3,ab3,eb4]@23 ~, [c3,eb4] ~, c4@12 c4@35 ~, ~ ab3@3 ~@4, ~@18 ab4@29 ~", // Ab Cm
  D: "[~@6 gb3@6 ~@6 db4@6 ~@18 ab3@5 ~@19 eb4@6 ~@18 ab3@5 ~, gb2@23 ~ [ab2,eb4]@23 [bb2,bb3]@19 ab3@6 [bb2,bb3,eb4]@23 ~, db4@15 gb3@8 ~@7 ab3@12 ~@6 db4@12 db4@18 ab3@6 db4@11 ~, bb3@12 [bb3,ab4]@13 ~@11 c4@11 ~ gb4@47 ~, ~@54 f4@41 ~]/2", // Ab5 Bb Eb5 Bb7
  E: "~@6 bb3@5 ~@24 eb4@12 ~, eb2@24 eb4@5 bb3@18 ~, g3@11 bb3 eb4@6 f4@29 ~, ~@6 bb2@41 ~, ~@12 g3@35 ~",
  F: "~@3 gb3 ~@3 gb3, [b2,b3,eb4]@23 ~ b2@24, ~ gb3@2 ~@2 gb3@2 ~, ~ db4 [b3,eb4]!2", // B
  G: "~@3 gb3 ~@3 db4, [bb2,db4]@12 bb2@11 ~, ~@3 gb3@6 ~@6 gb3@8 ~, ~@6 bb3@17 ~, ~@6 eb4@6 db4@6 eb4@5 ~", // Bbm
  H: "~@3 gb3 ~@3 gb3, [a2,a3,db4]@23 ~ [a2,db4]@24, ~ gb3@2 ~@2 gb3@2 ~, ~ eb4 ~ [a3,eb4]", // A Adim
  I: "~@18 gb3@6 ~@12 eb4@11 ~, [ab2,db4]@23 ~ [ab2,c4]@23 ~, ~@6 ab3@41 ~, ~@12 eb4@11 ~@7 gb3@17 ~", // Db5 Ab
  J: "~ gb3 ~ db4 ~@3 ab3, gb2@23 ~ [ab2,eb4]@23 ~, db4@15 gb3@8 ~@7 ab3@12 ~@6, bb3@12 [bb3,ab4]@13 ~@11 c4@11 ~", // Ab5 Bb7
  K: "[~@6 gb3@6 ~@6 db4@6 ~@12 c4@10 ~@2 gb4@21 ~@27, gb2@23 ~ [ab2,eb4]@23 ~@49, db4@15 gb3@8 ~@7 ab3@17 [gb3,b3,eb4]@22 ~@27, bb3@12 [bb3,ab4]@13 ~@21 b2@23 ~@27]/2", // Ab5 B Bb7
  L: "[~@24 bb3@13 ~@11, ~@7 bb3 ~@8, ~@45 b3@16 ~@35]/2", M: "~@45 b2 gb3 [b3,eb4]", N: "[b2,gb3,b3,eb4,gb4]@3 ~",
  O: "[~@48 gb4@21 ~@27 [db4,gb4]@31 ~@17 gb4@25 ~@23 db4@24 c4@13 ~@17 ab3@6 db4 ~@5 f4@5 ~@7 ab3@6 ~@8 db3@3 ~@19 db4@6 ~@6 ab3@6 ~@6 ab3@4 ~@2, ~@46 b2@23 ~@26 [bb2,gb3]@33 ~@15 db4@26 ~@22 ab3@37 ~@11 db4@13 ~@12 eb4@12 c4@10 ~ bb3@6 ~ ab3@11 ~@31, ~@47 [gb3,b3,eb4]@22 ~@73 a3@26 ~@23 [ab2,eb3]@48 ~ [db3,f4]@17 ~@6 db3@17 ~@8 gb2@20 ~@4 [ab2,eb4]@22 ~@2, ~@192 gb4@36 ~@11 ab3@7 ~@36 ab3@6 db4@11 ~ bb3@12 ~@12 c4@10 ~@2]/7", // Gb5 Ebm B Ab5 Db Ab5
  P: "~@6 f4@19 ~@23, [bb3,db4] ~, gb4@17 ~@31", // Bbm
  Q: "[~@6 ab3@6 ~@5 ab3@6 ~@18 ab3@5 ~@20 ab3@5 ~@21 db3@2 ~@19 db4@6 ~@19 ab3@4 ~@20 bb3@6 ~@42 db4@6 ~@6 ab3@6 ~@6 ab3@4 ~@20 f4@6 ~@21 db3@3 ~@18 bb3@5 ~ [c4,eb4]@53 ~@19, ab2@46 db4@13 ~ db4@12 ~@12 c4@10 ~ bb3@7 gb3@17 ~@31 f4@18 ~@18 bb3@18 bb3@11 ~@23 ab3@8 ab3@18 ~@6 ab3@12 ab3@29 [ab2,ab3]@54 ~@19, eb4@12 c4@35 db3@23 ~@2 [db3,eb4]@22 ~@2 gb2@23 ~ [ab2,eb4]@23 ~ [bb2,gb4]@23 ~ bb2@11 ~ ab2@12 gb2@23 ~ [ab2,eb4]@22 ~@2 db3@24 [db3,c4,eb4]@23 ~ [gb2,db4]@24 ~@72, ~@24 eb4@23 ~ f4@23 ~@25 db4@11 bb3@12 ~@13 c4@11 db4@12 ~ db4@13 ~@11 db4@30 ~@18 c4@10 ~ db4@13 db4@12 ~@30 bb3@12 ~@78, ~@30 ab3@6 ab4@11 ~@7 ab3@12 ~@12 ab3@12 ab3@4 ab3@25 ~@7 ab3@12 ~@4 bb3@20 ~@12 f3@17 ~@7 gb3@17 ~@25 f4@18 ~@18 ab4@11 ~@13 ab4@12 ~@72]/8", // Cm Ab Dbsus2 Ab5 Ebm Ab5 Cm Gb5
  R: "[~@36 ab3@11 ~ ab3 ~@40 ab3@14 ~@3 ab4@73 ~@13, db3@23 ~ db3@20 ~@3 db3@8 ~@19 c4@7 c4@16 ~@7 [db4,eb4]@75 ~@13, [db4,f4]@12 db4@11 ~ eb4@24 gb2@23 ~@2 ab2@25 ~@5 db3@73 ~@16, ~@6 ab3@11 ~ f4@12 c4@18 bb3@6 bb3@12 ~ bb3@14 ~@111, ~@49 db4@11 ab4@15 eb4@26 ~@4 f4@73 ~@14]/4", // Dbsus2 Db
})).s("gm_acoustic_guitar_steel").gain(0.15).pan(0.7)

// chords · pad choir
const pad_choir = note("<~@2 A B C D ~@5 E F G ~@25 E F G H@4 ~@16>".pickRestart({
  A: "[gb5,b5,gb6]@37 ~@11", B: "[ab5,b5,e6]@5 ~", C: "[ab5,b5,eb6]@5 ~", D: "[gb5,db6]@15 ~",
  E: "~@10 bb4 b4 bb4 b4 bb4 b4", F: "bb4 ab4 [ab3,b3,eb4]@6", G: "[gb3,bb3,db4]",
  H: "[eb4@48 ~@42 gb5@25 ~@77, gb4, ~@18 gb6@7 ~@23, ~@81 db6@26 ~@85]/4",
})).s("gm_pad_choir").gain(0.22)

// chords · epiano2
const epiano2 = note("<~@7 A@2 B ~@22 C D ~@9 E@2 ~@9 F G@2 H I@4>".pickRestart({
  A: "[~@24 [bb3,b3,eb4]@19 ~@5, ~@6 gb4 b3 ~@8, ~@39 ab3@6 gb4@5 ~@46]/2", B: "[ab3,bb3]@3 ~",
  C: "~@18 f5@5 ~@13 ab5@10 ~@2, ~@6 ab4@17 ~@7 ab4@16 ~@2, ~@12 db5@11 ~ eb5@22 ~@2",
  D: "~@3 ab5@8 ~, db5@11 ~, ~@3 gb4@19 ~@2",
  E: "[~@42 [gb4,gb5]@29 ~@25, ~@24 gb6@47 ~@25, ~@4 gb5@3 ~@9, ~@33 [db5,db6]@38 ~@25]/2", F: "[db4,f4] [c4,eb4]",
  G: "[[bb3,db4]@24 [c4,eb4]@49 ~@23]/2", H: "[db3,ab3,db4,f4] [db3,ab3,c4,eb4]",
  I: "[[db3,gb3,bb3,db4]@26 [db3,ab3,c4,eb4]@30 ~ [db3,ab3,db4,eb4,f4,ab4]@88 ~@47]/4", // Gb Ab Db
})).s("gm_epiano2").gain(0.19).pan(0.3)

// chords · electric guitar clean
const electric_guitar_clean = note("<~@29 A@2 ~@31>".pickRestart({
  A: "[~@47 db4@22 ~@27, ~@23 ab3@11 ~@14]/2",
})).s("gm_electric_guitar_clean").gain(0.15).pan(0.4)

// other · tinkle bell
const tinkle_bell = note("<~@2 A B C D ~@19 E F ~@16 G ~@18>".pickRestart({
  A: "eb7 ~@5 gb6 ~@5 gb7 ~@35", B: "gb7 ~@5 e7 ~@5 gb7 ~@5 e7 ~@29", C: "eb7 ~@47",
  D: "db7 ~@5 gb6 ~@5 db7 ~@5 gb7 ~@29", E: "~@41 d7 [e7,f7] g7 [a7,b7] c8 [d8,e8] [f8,g8]", F: "[a8,b8] ~@47",
  G: "~@24 gb7 ~@8 db7 ~@8 gb7 ~@5",
})).s("gm_tinkle_bell").gain(0.05)

// chords · orchestral harp
const orchestral_harp = note("<A@3 ~ B ~@57>".pickRestart({
  A: "[~@77 b7@20 ~@47, ~@44 b3@5 gb4@11 b5 db6@2 d6 e6@2 gb6 a6@2 b6 db7 d7@2 e7 gb7@2 a7@22 ~@46, ~@45 db4@5 a4 b4@2 db5@2 d5@43 ~@46, ~@46 d4@10 e5 gb5@2 a5@39 ~@46, ~@24 e4@25 ~@23]/3",
  B: "~@12 [gb5,gb6] ~@5 [db5,db6] ~@29", // Gb Db
})).s("gm_orchestral_harp").gain(0.16)

// drums · kick
const kick = s("bd").struct("<~@34 A@7 B A C A@3 C A@3 C A@4 ~@6>".pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x", C: "x ~@2 x!2 ~@2 x",
})).gain(0.41)

// drums · snare
const snare = s("sd").struct("<~@33 A B@7 C B@7 C B@5 C ~@6>".pickRestart({
  A: "~ x", B: "~ x ~ x", C: "~ x ~@2",
})).gain(0.46)

// drums · low tom
const low_tom = s("lt").struct("<~@33 [~@7 x] ~@11 [~@7 x] ~@16>").gain(0.46)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@26 A B C B A D E D ~@28>".pickRestart({
  A: "~ x!5 ~ x", B: "x!6 ~ x", C: "x!8", D: "x!2 ~ x!3 ~ x", E: "x!2 ~ x!5",
})).gain(0.05)

// drums · mid tom
const mid_tom = s("mt").struct("<~@33 A ~@7 B ~@3 B ~@3 A ~@12>".pickRestart({
  A: "~@3 x", B: "~@13 x ~@2",
})).gain(0.41)

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

// drums · high tom
const high_tom = s("ht").struct("<~@33 [~@11 x ~@4] ~@7 [~@5 x ~@2] ~@7 [~@11 x ~@4] ~@12>").gain(0.41)

// drums · crash
const crash = s("cr").struct("<~@17 A B ~@15 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B C ~@2 D ~@3>".pickRestart({
  A: "~@43 x!5", B: "x", C: "~ x", D: "~@13 x ~@10",
})).gain(0.15)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@17 [~@37 x!6 ~@5] ~@44>").gain(0.05)

// drums · tambourine
const tambourine = s("tb").struct("<~@27 [~ x ~@2]!3 ~ [~ x ~@2]!3 ~@28>").gain(0.26)

stack(
  bass, synth_strings_2, string_ensemble_2, piano, piano_soft, acoustic_guitar_steel, pad_choir, epiano2,
  electric_guitar_clean, tinkle_bell, orchestral_harp, kick, snare, low_tom, hihat, hihat_soft, mid_tom, open_hat,
  high_tom, crash, crash_soft, tambourine
)

More by Fiorella Mannoia