Strudelify

Un amore non torna

Mango

KeyB♭ majorTempo96 bpm
0:00/0:00
// Un amore non torna — Mango
// 96 bpm, 4/4, key Bb 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: Full arrangement: all 102 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(96/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 · synth bass 1
const bass = note(`<
  ~@3 A@2 B C D@2 B E F G H@2 F G H I J K L M N O@2 P Q R S P Q R T@2 U V W X W X Y Z AA Y AB Z AA AC AD AE AA Y Z AA Y
  AB Z AF AC AG AH ~@2 P Q R S P Q R T@2 U V W X W X Y Z AA Y AB Z AA AC AD AE AA Y Z AA Y AB Z AF AC AG AI ~@2
>`.pickRestart({
  A: "bb1@2 ab1 bb1 ~@4", B: "ab1", C: "~@5 eb1 ab1 g1", D: "bb1@2 ab1 bb1 ~ bb1 ~@2", E: "ab1@3 ab1@2 eb1 ab1@2",
  F: "bb1@7 ~@2 bb1@5 ~ bb1@7 ~@2", G: "g1@8 ~ g1@5 ~ g1@6 ~@3", H: "ab1@8 ~ ab1@5 ~ ab1@6 ~@3",
  I: "eb1@8 ~ eb1@5 ~ eb1@6 ~@3", J: "eb1@5 eb1@4 eb1@5 ~ eb1@6 ~@3", K: "g1@7 ~@2 g1@5 ~ g1@7 ~@2",
  L: "bb1@8 ~ bb1@5 ~ bb1@6 ~@3", M: "c2@8 ~ c2@3 ab1@3 ab1@9", N: "g1@8 ~ g1@3 bb1@3 bb1@9",
  O: "[c2@8 ~ c2@3 ab1@3 ab1@33]/2", P: "bb1@2 ~ bb1@3 ~@3 bb1@3 ~@3 bb1@3 ~@3 f1@2 gb1",
  Q: "g1@2 ~ g1@3 ~@3 g1@3 ~@2 g1 f1@3 g1@3 ~@3", R: "ab1@2 ~ ab1@3 ~@3 ab1@3 ~@3 ab1@3 ~@6",
  S: "ab1@2 ~ ab1@3 ~@3 ab1@3 ~@3 ab1@3 eb1@6", T: "eb1@2 ~ eb1@3 ~@3 eb1@3 ~@3 eb1@3 ~@6",
  U: "g1@2 ~ g1@3 ~@3 g1@3 ~@3 g1@3 ~@6", V: "bb1@2 ~ bb1@3 ~@3 bb1@3 ~@3 bb1@3 ~@6",
  W: "c2@2 c2 c2@3 ~@2 c2 c2@3 ab1@2 ab1 ab1@3 ~@2 ab1 ab1@3",
  X: "g1@2 g1 g1@3 ~@2 g1 g1@3 bb1@2 bb1 bb1@3 ~@2 bb1 bb1@3",
  Y: "bb1@2 bb1 bb1@3 ~@2 bb1 bb1@3 bb1@2 bb1 bb1@3 ~@2 bb1 bb1@3",
  Z: "f1@2 f1 f1@3 ~@2 f1 f1@3 f1@2 f1 f1@3 ~@2 f1 f1@3", AA: "c2@2 c2 c2@3 ~@2 c2 c2@3 c2@2 c2 c2@3 ~@2 c2 c2@3",
  AB: "a1@2 a1 a1@3 ~@2 g1 g1@6 g1@5 g1 g1@3", AC: "ab1@2 ab1 ab1@3 ~@2 ab1 ab1@3 ab1@2 ab1 ab1@3 ~@2 ab1 ab1@3",
  AD: "eb1@2 eb1 eb1@3 ~@2 eb1 eb1@3 eb1@2 eb1 eb1@3 ~@2 eb1 eb1@3",
  AE: "g1@2 g1 g1@3 ~@2 g1 g1@3 g1@2 g1 g1@3 ~@2 g1 g1@3", AF: "c2@2 c2 c2@3 ~@2 c2 c2@3 c2@2 c2 c2@3 f1@3 g1@3",
  AG: "eb2@2 eb2 eb2@3 ~@2 eb2 eb2@3 eb2@2 eb2 eb2@3 ~@2 eb2 eb2@3", AH: "eb1@2 ~", AI: "f1@5 ~",
})).s("gm_synth_bass_1").gain(0.8)

// bass · synth bass 1 · soft notes
const bass_soft = note("<~@26 A B C D A B C E@2 F G ~@27 A B C D A B C E@2 F G ~@27>".pickRestart({
  A: "~@2 bb1 ~@5 bb1 ~@5 bb1 ~@9", B: "~@2 g1 ~@20 g1", C: "~@2 ab1 ~@5 ab1 ~@5 ab1 ~@8 ab1",
  D: "~@2 ab1 ~@5 ab1 ~@5 ab1 ~@9", E: "~@2 eb1 ~@5 eb1 ~@5 eb1 ~@8 eb1", F: "~@2 g1 ~@5 g1 ~@5 g1 ~@8 g1",
  G: "~@2 bb1 ~@5 bb1 ~@5 bb1 ~@8 bb1",
})).s("gm_synth_bass_1").gain(0.48)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  A@3 B ~@3 B ~@7 C ~@9 D@2 ~@2 D@2 E@2 ~@9 F G H I F J K L M N H F G H I F J K O@2 P@3 ~@2 D@2 E@2 ~@9 F G H I F J K L
  M N H F G H I F J K Q R@3
>`.pickRestart({
  A: "[bb2,f3,bb3]/3", B: "[bb2,f3,bb3] ~@2 [bb2,f3,bb3] ~@4", C: "bb2@2 ~ bb2@2 ~ bb2@2 ~ bb2@2 ~ bb2@2 ~@10",
  D: "[~@15 [bb1,bb2,eb3,eb4] ~@2 [eb3,eb4]@3 [f3,f4]@7 ~@20, ~@9 [bb1,bb2]@5 ~@10]/2", E: "[~@3 c4@13]/2",
  F: "[f2,c3]@23 ~", G: "[c3,g3]@11 ~", H: "[bb2,f3]@23 ~", I: "a2@9 g2@14 ~, f3@23 ~", J: "[c3,g3]@23 ~",
  K: "[ab2,eb3]@23 ~", L: "[eb3,bb3]@23 ~", M: "~ [g2,d3]@23", N: "[c3,g3]", O: "[[eb2,bb2]@47 ~]/2",
  P: "[bb4@36 ~@3 [bb1,bb2,eb3,eb4] ~@2 [eb3,eb4]@3 [f3,f4]@7 ~@20, ~@21 [bb1,bb2]@5 ~@10]/3", Q: "[eb2,bb2]",
  R: "[[f2,c3]@61 ~@11]/3", // F5
})).s("gm_overdriven_guitar").gain(0.55).pan(0.6)

// chords · overdriven guitar · soft notes
const overdriven_guitar_soft = note("<~@3 A ~@3 A ~ B C ~@3 D E F ~@85>".pickRestart({
  A: "~ [bb2,f3,bb3]!2 ~ [bb2,f3,bb3]!4", B: "f4 ~ f4 ~ f4 ~ f4 ~", C: "f4 ~ f4 ~@5", D: "~@21 bb2 ~@2",
  E: "~@15 bb2@2 ~ bb2@2 ~ bb2@2 ~", F: "bb2@2 ~ bb2@2 ~@19",
})).s("gm_overdriven_guitar").gain(0.24).pan(0.6)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@20 A B C D E@2 ~@9 A F C D C G@2 H@2 I J K@2 L M@2 N O H@2 I J K@2 L P@2 ~@11 A F C D C G@2 H@2 I J K@2 L M@2 N O
  H@2 I J K@2 L Q R@3
>`.pickRestart({
  A: "g3 ~@11 bb3@6 c4@6, d4", B: "~ g4 f4@2, [bb3,d4]", C: "g3 ab3, [c4,eb4]", D: "g3 f3, [bb3,d4]",
  E: "[g3@6 ab3@17 ~, [c4,eb4]@23 ~]/2", F: "~ g4 f4 ab4, [bb3,d4]", G: "[g3 f3@3, [d4,f4]]/2",
  H: "[~@12 a3@11 ~ g3@23 ~, c4@23 ~, f3@21 ~@2 e4@25]/2", I: "[f3,bb3,d4]", J: "a3@3 g3@5, f4",
  K: "[[f3,a3] [g3,e4], c4@23 ~]/2", L: "[ab3,c4,eb4]", M: "[[bb3,eb4]@23 ~ [bb3,f4]@24, g3]/2", N: "[g3,c4,eb4]",
  O: "[f3,bb3]", P: "[[g3,bb3,eb4]@11 ~]/2", Q: "[g3,bb3,eb4]", R: "[[a3,c4,f4]@61 ~@11]/3",
})).s("gm_string_ensemble_1").gain(0.56)

// chords · string ensemble 1 · soft notes
const string_ensemble_1_soft = note("<~@11 A@4 B@5 ~@6 A@4 B@5 ~@29 A@4 B@5 ~@29>".pickRestart({
  A: "[f3 g3 ab3@2, bb3]/4", B: "[f3@24 g3@24 ab3@23 ~ g3@48, bb3]/5",
})).s("gm_string_ensemble_1").gain(0.32)

// other · string ensemble 1
const string_ensemble_1_2 = note(`<
  ~@37 A B C D@2 E@7 F G H I J@5 K H L@2 ~@13 A B C D@2 E@7 F G H I J@5 K M@5
>`.pickRestart({
  A: "g3@12 ab3@11 ~", B: "g3@2 c4 eb4 d4 c4 bb3 ab3", C: "g3 ab3", D: "[g3 bb3@3]/2",
  E: "[~ c6@149 bb5@6 c6@6 d6@6]/7", F: "eb6@3 g5", G: "d6@3 g5", H: "c6", I: "bb5", J: "[~ c6@113 d6@6]/5",
  K: "c6@3 d6", L: "[bb5@23 ~]/2", M: "[c6@11 ~]/5",
})).s("gm_string_ensemble_1").gain(0.48)

// chords · electric guitar jazz
const electric_guitar_jazz = note("<~@4 A B ~ C@3 D ~ E F@2 ~@5 G H I J K@2 ~@8 L@2 ~@37 G ~@28>".pickRestart({
  A: "~@5 g4@3", B: "f4@3 ~@3 g4 ~ f4@14 ~@2", C: "[~@12 c5@2 bb4@21 ~ g4@2 f4@4 c5@2 bb4@28]/3",
  D: "bb4 ~@2 eb5@5, ~@3 bb4@20 ~", E: "~@3 f5", F: "[db5@19 ~@5]/2", G: "bb5@5 ~",
  H: "[bb3,f4,bb4] ~@2 [bb3,f4,bb4]!5", I: "~@2 g4!2 ~@2 ab4!2, c6@5 ~, g3 ab3, ~ c4@3 ~ c4@3, ~ eb4 ~ eb4",
  J: "~@3 eb5 d5 c5 bb4 ab4, g3@4 ~ f3@3, ~ bb3@3 [bb3,d4]@4, ~ [d4,g4] ~ f4", // Bb G5
  K: "[g4 ~@2 g4 ~@2 ab4 ab4@9, g3@4 ab3@9 ~@3, ~ c4@3 ~ c4@9 ~@2, ~@2 eb4@2 ~@2 eb4@9 ~]/2", L: "[~@21 bb5@20 ~@7]/2",
})).s("gm_electric_guitar_jazz").gain(0.3)

// chords · electric guitar jazz · soft notes · Bb5
const electric_guitar_jazz_2 = note("<~@21 [~ [bb3,f4,bb4]!2 ~@5] ~@80>").s("gm_electric_guitar_jazz").gain(0.2)

// chords · piano
const piano = note(`<
  ~@30 A B C D ~ E@2 F G F G H I J K L I J M N O P Q I J K L I J M R@2 ~@6 A B C D ~ E@2 F G F G H I J K L I J M N O P Q
  I J K L I J M S T@3
>`.pickRestart({
  A: "[bb3,d4]@19 ~@5", B: "[bb3,d4]@7 ~", C: "[bb3,eb4]@11 ~", D: "[g3,eb4]@23 ~",
  E: "[~@2 d4@3 ~@9 f4@2, g2@2 bb2 g4, ~@3 bb3@11 ~ bb3@6 g3@7 ~@2 d4@16 ~@2, ~@6 d4@3 bb3@6 ~, ~@33 bb4@14 ~]/2",
  F: "~ c4 eb4@2 ~@3 c4, c3@10 ~@5 c4@6 ~@3, ~@2 g3@8 ~@2 ab3@11 ~, ~@3 eb4", G: "~ d4 ~ d4, g3 bb2, ~ bb3@3 ~ bb3@3",
  H: "bb2 ~@11 [f3,bb3]@2 ~ [bb2,f3,bb3]@3 [bb2,f3,bb3]@2 ~ [bb2,f3,bb3]@2 ~, ~@3 f3@6 bb2@5 ~@10, ~@6 bb3@5 ~@13", // Bb5
  I: "~ f3 ~ f3 ~ f3 ~ f3, f2, ~ c4 d4 c4", J: "~ g3 ~ g3 ~ g3 ~ g3, c3, ~ c4 d4 c4",
  K: "~ f3 ~ f3 ~ f3 ~ f3, bb2, d4@11 ~ c4@6 ~@6, ~ bb3 ~ bb3", L: "[a2,c4,f4]@3 [g2,c4,f4]@5",
  M: "~@6 ab3@2 ~ [ab3,bb3,eb4]@9 [ab3,bb3,eb4]@6, [ab2,bb3,eb4]@8 ~ ab2@14 ~", // Absus2
  N: "[eb2,g3,eb4]@9 [g3,eb4]@8 ~ [g3,eb4]@6, ~@9 eb2@14 ~", // Eb Cm
  O: "~@15 g2@7 ~@2, [bb3,f4]@6 d3@17 ~, ~ g2@13 ~@10, ~@3 [bb3,f4]@4 ~", // Bb5
  P: "~@15 eb4@8 ~, [g2,c4]@23 ~, eb4@7 ~@5, ~@6 g3@17 ~, ~@9 g4@14 ~", // C5
  Q: "~@6 bb3@2 ~@13 bb1@3, bb1@5 ~ bb1@3 ~@3, [bb3,f4]@5 ~@19, ~@3 f3@5 ~ [f3,bb3,f4]@5 ~ [f3,bb3,f4]@9", // Bb5
  R: "[[eb2,g3,eb4]@9 [eb2,g3,eb4]@38 ~]/2", S: "[eb2,g3,eb4]@3 [eb2,g3,eb4]@5", T: "[[f1,f2,a3,f4]@61 ~@11]/3",
})).s("gm_piano").gain(0.72)

// chords · taiko drum · Absus2
const taiko_drum = note("<~@25 [ab2 ~@23] ~@37 [[ab3,bb4] ~@23] ~@38>").s("gm_taiko_drum").gain(0.48)

// chords · pad sweep
const pad_sweep = note(`<
  ~@3 A@2 B@2 A@2 B@2 C D E@2 F D G H@2 I J K L M@2 C D E@2 F D G H@2 I J N@2 O ~@22 P@2 C D E@2 F D G H@2 ~ J N@2 O
  ~@24
>`.pickRestart({
  A: "[~ [bb2,bb3,eb4,f4]@13 ~@10]/2", B: "[~ [ab2,ab3,bb3,eb4]@22 ~]/2", C: "[bb1,bb2,f3,bb3]@23 ~",
  D: "[g1,g2,f3,bb3]@23 ~", E: "[[ab1,ab2,f3,ab3,bb3]@47 ~]/2", F: "[bb1,bb2,bb3]@23 ~", G: "[ab1,ab2,f3,bb3]@23 ~",
  H: "[[eb1,eb2,eb3,bb3]@47 ~]/2", I: "[g1,g3,bb3]@23 ~", J: "[bb1,f3,bb3]@23 ~", K: "c2@11 ~ ab1@11 ~",
  L: "g1@11 ~ bb1@11 ~", M: "[c2@11 ~ ab1@34 ~@2]/2",
  N: "[[c5,eb5]@2 ~@4 [c5,eb5]@3 [bb4,d5]@4 ~@5 eb5@2 ~@2 bb4@4 ~@22, ~@18 c5 ~@2 d5@4 ~@23]/2", // Cm Bb
  O: "[c5,eb5]@2 ~@4 [c5,eb5]@3 [bb4,d5]@4 ~@5 [c5,eb5]@3 [bb4,d5]@3", P: "[bb4@7 ~]/2",
})).s("gm_pad_sweep").gain(0.48)

// chords · pad sweep · soft notes
const pad_sweep_soft = note("<~@11 A B C@2 A B D C@2 ~@6 A B C@2 A B D C@2 ~@29 A B C@2 A B D C@2 ~@29>".pickRestart({
  A: "f4@23 ~", B: "d4@23 ~", C: "[eb4@47 ~]/2", D: "eb4@23 ~",
})).s("gm_pad_sweep").gain(0.24)

// drums · kick
const kick = s("bd").struct("<~ A@24 B C@35 D B ~ C@34 E B ~@2>".pickRestart({
  A: "x ~@2 x ~ x ~@2", B: "x", C: "x ~@2 x ~@5 x ~@5 x ~@5 x ~ x", D: "x ~@2 x ~@5 x ~@7 x ~@6", E: "x!2 ~ x ~ x ~ x",
})).gain(0.72)

// drums · rim
const rim = s("rim").struct("<~ [~ x ~ x]!24 ~@37 [~ x ~ x] ~@39>").gain(0.64)

// drums · snare
const snare = s("sd").struct("<~@26 [~ x ~ x]!36 ~@2 [~ x ~ x]!35 ~@3>").gain(0.72)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@26 A@15 B A@19 ~@3 A@15 B A@19 ~@3>".pickRestart({
  A: "~ x ~@5 x ~@4", B: "~ x ~@10",
})).gain(0.24)

// drums · low tom
const low_tom = s("lt").struct("<~@36 A ~@4 B ~@5 A ~@4 C ~@5 A ~@15 A ~@4 B ~@5 A ~@4 C ~@5 A ~@5>".pickRestart({
  A: "~@7 x", B: "~@21 x ~ x", C: "~@18 x ~@4 x",
})).gain(0.8)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@11 A@14 ~ B C D E F G H I J K L F G H I M N O D P Q B R D E F S T I J K T U V W X@2 ~ P E B C D E F G H I Y D E F G
  Z AA H U O W P Q B C D Q AB G H I AC K T U ~@3
>`.pickRestart({
  A: "x ~@4 x ~@18", B: "x ~ x!2 ~ x!2 ~ x ~@3 x ~ x!2 ~ x!2 ~ x!2 ~@2",
  C: "x ~@2 x ~ x!2 ~ x ~@3 x ~@2 x ~ x!2 ~ x!2 ~ x", D: "x ~@2 x ~ x!2 ~ x ~@3 x ~@2 x ~ x!2 ~ x!2 ~@2",
  E: "x ~ x!2 ~ x!2 ~@5 x ~ x!2 ~ x!2 ~@2 x ~@2", F: "x ~ x!2 ~ x!2 ~@5 x ~@2 x ~ x!2 ~@2 x ~ x",
  G: "x ~ x!2 ~ x!2 ~ x ~@3 x ~@2 x ~ x!2 ~ x!2 ~ x", H: "x ~@2 x ~ x!2 ~ x ~@3 x ~ x!2 ~ x!2 ~@2 x ~ x",
  I: "x ~@2 x ~ x!2 ~ x ~@3 x ~@2 x ~ x!2 ~@2 x ~@2", J: "x ~ x!2 ~ x!2 ~@5 x ~@2 x ~ x!2 ~ x!2 ~@2",
  K: "x ~@2 x ~ x!2 ~@5 x ~ x!2 ~ x!2 ~@2 x ~ x", L: "x ~@2 x ~ x!2 ~ x ~@3 x ~ x!2 ~ x ~@3 x ~@2",
  M: "x ~ x!2 ~ x!2 ~@5 x ~@2 x ~ x!2 ~@5", N: "~@2 x!2 ~ x!2 ~@5 x ~ x!2 ~ x!2 ~ x!2 ~ x",
  O: "x ~@2 x ~ x!2 ~@5 x ~@2 x ~ x!2 ~ x!2 ~@2", P: "x ~ x!2 ~ x!2 ~@5 x ~ x!2 ~ x!2 ~@2 x ~ x",
  Q: "~@2 x!2 ~ x!2 ~@5 x ~ x!2 ~ x!2 ~@2 x ~@2", R: "~@3 x ~ x!2 ~ x ~@3 x ~@2 x ~ x!2 ~ x!2 ~ x",
  S: "~@2 x!2 ~ x!2 ~ x ~@3 x ~@2 x ~ x!2 ~ x!2 ~ x", T: "~@3 x ~ x!2 ~ x ~@3 x ~ x!2 ~ x!2 ~@2 x ~ x",
  U: "x ~ x!2 ~ x!2 ~@5 x ~ x!2 ~ x!2 ~ x!2 ~ x", V: "~@3 x ~ x!2 ~@5 x ~@2 x ~ x!2 ~ x!2 ~@2",
  W: "~@3 x ~ x!2 ~ x ~@3 x ~@2 x ~ x!2 ~ x!2 ~@2", X: "x!8", Y: "x ~ x!2 ~ x!2 ~@5 x ~@2 x ~ x ~@3 x ~ x",
  Z: "x ~@2 x ~ x!2 ~ x ~@3 x ~ x!2 ~ x!2 ~@5", AA: "~@3 x ~ x!2 ~@5 x ~ x!2 ~ x!2 ~@2 x ~ x",
  AB: "~@2 x!2 ~ x!2 ~@5 x ~@2 x ~ x!2 ~@2 x ~ x", AC: "~@2 x!2 ~ x!2 ~@5 x ~@2 x ~ x!2 ~ x!2 ~@2",
})).gain(0.48)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@26 A B C D E F G H I J K E F G H L M N C O D A B C D E F G H I J G M N C ~@3 O D A B C D E F G H L C D E F P J G M N
  C O D A B C D E F G H I J G M ~@3
>`.pickRestart({
  A: "~@23 x", B: "~ x ~@5 x ~@4", C: "~@2 x ~@11 x ~@8 x", D: "~@8 x ~@11 x ~@2 x", E: "~@4 x ~@2 x ~@2 x ~",
  F: "~@7 x ~@4", G: "~ x ~@8 x ~", H: "~@2 x ~@11 x ~@5 x ~@2 x", I: "~@8 x ~@5 x ~@8 x", J: "~ x ~@2 x ~@5 x ~",
  K: "~@2 x ~@20 x", L: "~@4 x ~@2 x ~@4", M: "~ x ~", N: "~@2 x ~@5 x ~@5 x ~@8 x", O: "~@2 x ~@2 x", P: "~ x ~@10",
})).gain(0.32)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@36 A ~@4 B ~@5 C ~@4 D ~@5 C ~@2 E ~@12 A ~@4 B ~@5 C ~@4 D ~@5 C ~ F ~@3
>`.pickRestart({
  A: "~@5 x", B: "~@7 x ~@2 x ~", C: "~@5 x ~ x", D: "~@9 x ~@4 x ~@9", E: "~@14 x!2 ~@8", F: "~@7 x ~ x ~@2",
})).gain(0.8)

// drums · open hat
const open_hat = s("oh").struct("<~@7 A@18 ~ B@10 C B@24 ~@3 B@10 C B@24 D ~@2>".pickRestart({
  A: "~@3 x", B: "~@3 x ~@4", C: "~@3 x ~@2 x ~", D: "x",
// … 38 more lines

More by Mango