Strudelify

'O Sole Mio

Eduardo di Capua

KeyF majorTempo60 bpm
0:00/0:00
// 'O Sole Mio — Eduardo di Capua
// 60 bpm, 2/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Transcription provider: pdmx. https://musescore.com/score/5940206; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 88 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/2)

// 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.

// other · flute · "Flute II"
const flute = note(`<
  ~@19 A B@2 C@2 D E F@2 G@2 H@2 I@2 J@2 K@2 L M@2 N@2 O ~@16 P Q@2 R@2 S T U@3 V W@2 X Y Z@2 AA@2 AB@2 AC@2 AD@3 ~@2
>`.pickRestart({
  A: "~@2 c5 bb4", B: "[a4 g4@2 f4@3 g4 a4]/2", C: "[f4@4 f4 e4@7 d4@12 bb4@4 a4@4]/2", D: "g4 c5 a4 g4", E: "f4 g4@3",
  F: "[a4@4 g4 a4 ~ g4 f4@16 ~@4 c6@4]/2", G: "[~ c6@6 c6@6 c6@8 c6@11]/2", H: "[~ e6@4 e6@4 d6@4 bb5@19]/2",
  I: "[~ e6@4 e6@4 d6@4 bb5@8 bb5@11]/2", J: "[~ g5@4 a5@4 bb5@4 c6@19]/2", K: "[~@9 c6@4 db6@19]/2",
  L: "~ bb5@4 f6@5 ~@4 bb5@2", M: "[a5@8 a5@11 ~ a4@4 g4@4 f4@4]/2", N: "[g5@8 g5@11 ~ a4@4 g4@6 f4@2]/2", O: "f4@15 ~",
  P: "~ c5 bb4 a4", Q: "[g4@2 f4@3 g4 a4 f4]/2", R: "[f4 e4@7 d4@12 bb4@4 a4@4 g4@4]/2", S: "c5 a4 g4 f4", T: "g4@3 a4",
  U: "[g4 a4 ~ g4 f4@16 ~@4 c6@5 c6@6 c6@6 c6@7]/3", V: "~ c6@11 ~ e6@3", W: "[~ e6@4 d6@4 bb5@19 ~ e6@3]/2",
  X: "~ e6@4 d6@4 bb5@7", Y: "~ bb5@11 ~ g5@3", Z: "[~ a5@4 bb5@4 c6@19 ~@4]/2", AA: "[~@5 c6@4 db6@19 ~ bb5@3]/2",
  AB: "[~ f6@5 ~@4 bb5@2 a5@8 a5@11 ~]/2", AC: "[a4 g4 f4 g5@2 ~@2 c5, ~@20 g5@11 ~]/2", AD: "[c5@19 ~@9 a4@17 ~@3]/3",
})).s("gm_flute").gain(0.25)

// other · flute · "Flute II" · soft notes
const flute_soft = note("<A@4 B@2 C@3 D@3 E@8 ~@24 F G@2 H@2 I J K@2 L@2 M@4 N@2 ~@25 O@2>".pickRestart({
  A: "[~@4 a4@49 ~@3 a4@4 a4@4]/4", B: "[a4 a4@5 a4!2]/2", C: "[a4@4 g4@31 ~ e5@8 e5@4]/3",
  D: "[d5 c5@2 bb4@2 a4@5 ~@2]/3", E: "[~@4 a4@30 ~@2 bb4@61 ~@3 a4@19 ~@9]/8", F: "~ a4!3", G: "[a4@5 a4!3]/2",
  H: "[g4@31 ~]/2", I: "e5@2 e5 d5", J: "c5 bb4", K: "[a4@5 ~@3]/2", L: "[a4@15 ~]/2", M: "[bb4@61 ~@3]/4",
  N: "[a4@19 ~@13]/2", O: "[~@4 g4@23 ~@5]/2",
})).s("gm_flute").gain(0.15)

// other · flute · "Flute III"
const flute_2 = note(`<
  ~@27 A B@2 C@2 D@2 E@2 F@2 G H I J K L ~@24 M@2 N O@2 P Q R@2 S@2 T U V@2 W@2 U ~@2
>`.pickRestart({
  A: "~@3 a5", B: "[~ a5@6 a5@6 a5@8 a5@11]/2", C: "[~ c6@4 c6@4 bb5@4 g5@19]/2",
  D: "[~ bb5@4 bb5@4 bb5@4 e5@8 e5@11]/2", E: "[~ e5@4 f5@4 g5@4 a5@19]/2", F: "[~@9 a5@4 bb5@19]/2",
  G: "~ bb5@4 db6@5 ~@6", H: "~@4 f4 [g4,a4] [bb4,c5] [d5,e5] f5@2 ~@2 f5 [g5,a5] [bb5,c6] [d6,e6]", I: "f6 ~@7",
  J: "e5", K: "c5", L: "a4@15 ~", M: "[~@8 a5@5 a5@6 a5@6 a5@7]/2", N: "~ a5@11 ~ c6@3",
  O: "[~ c6@4 bb5@4 g5@19 ~ bb5@3]/2", P: "~ bb5@4 bb5@4 e5@7", Q: "~ e5@11 ~ e5@3", R: "[~ f5@4 g5@4 a5@19 ~@4]/2",
  S: "[~@5 a5@4 bb5@19 ~ bb5@3]/2", T: "~ db6@5 ~@10",
  U: "f4 [g4,a4] [bb4,c5] [d5,e5] f5@2 ~@2 f5 [g5,a5] [bb5,c6] [d6,e6] f6@2 ~@2", V: "[~@3 e5@4 e5]/2",
  W: "[e5@19 ~@13]/2",
})).s("gm_flute").gain(0.4)

// other · flute · "Flute III" · soft notes
const flute_soft_2 = note("<A@4 B@8 C@8 D@8 ~@17 E@2 F@4 G@2 E@2 H@2 I@2 E@4 H@2 J K L@2 ~@17 M@2>".pickRestart({
  A: "[~ c4@15]/4", B: "[~@4 f4@30 ~@2 e4@61 ~@3 c4@19 ~@9]/8", C: "[~@2 f4@15 ~ g4@15 ~ c4@15 ~ f4@14]/8",
  D: "[~@4 f4@30 ~@2 g4@30 ~@2 f4@15 ~ e4@15 ~ f4@19 ~@9]/8", E: "[f4@15 ~]/2", F: "[e4@61 ~@3]/4", G: "[c4@19 ~@13]/2",
  H: "[g4@15 ~]/2", I: "[c4@15 ~]/2", J: "f4@15 ~", K: "e4@15 ~", L: "[f4@19 ~@13]/2", M: "[~@4 f4@23 ~@5]/2",
})).s("gm_flute").gain(0.15)

// other · flute · "Flute IV"
const flute_3 = note(`<
  A B@5 C@4 B D A B E F G C B@4 E F H C B I J K L M N O P K Q R S T@2 U V T@4 U@4 T W T@2 X Y U@2 T@4 X Y Z U T AA@8
  AB@4 AC AD AE AF AG AH AI@2
>`.pickRestart({
  A: "~@4 f4@3 ~@3 c5@2 f5@2 ~@2", B: "c5@2 ~@2 f4@3 ~@3 c5@2 f5@2 ~@2", C: "c5@2 ~@2 c4@3 ~@3 c5@2 e5@2 ~@2",
  D: "c5 ~ f4@2 ~@4", E: "c5@2 ~@2 bb4@3 ~@3 d5@2 g5@2 ~@2", F: "d5@2 ~@2 g4@3 ~@3 d5@2 g5@2 ~@2",
  G: "d5@2 ~@2 c4@3 ~@3 c5@2 e5@2 ~@2", H: "d5@2 ~@2 c4@3 ~@3 c5@2 f5@2 ~@2", I: "c5 ~ f4@2 ~@2 a4@2",
  J: "~ a4@6 a4@6 f4@3", K: "~@3 c5@2 f5@2 ~@2 c5@2 ~@2 f4@3", L: "~@3 c5@2 f5@2 ~@2 c5@2 ~@2 g4@3",
  M: "~@3 d5@2 g5@2 ~@2 d5@2 ~@2 g4@3", N: "~@3 d5@2 g5@2 ~@2 d5@2 ~@2 c4@3", O: "~@3 c5@2 e5@2 ~@2 c5@2 ~@2 c4@3",
  P: "~@3 c5@2 e5@2 ~@2 c5@2 ~@2 f4@3", Q: "~@3 c5@2 f5@2 ~@2 c5@2 ~@2 db4@3", R: "~@3 f4@2 bb4@2 ~@2 f4@2 ~@2 db4@3",
  S: "~@3 f4@2 bb4@5 ~@6", T: "f4@3 ~@3 c5@2 f5@2 ~@2 c5@2 ~@2", U: "c4@3 ~@3 c5@2 e5@2 ~@2 c5@2 ~@2",
  V: "c4@3 ~@3 c5@2 e5@2 ~@6", W: "f4 ~@3", X: "bb4@3 ~@3 d5@2 g5@2 ~@2 d5@2 ~@2", Y: "g4@3 ~@3 d5@2 g5@2 ~@2 d5@2 ~@2",
  Z: "c4@3 ~@3 c5@2 f5@2 ~@2 c5@2 ~@2",
  AA: "[f4@4 ~@4 a4@5 a4@6 a4@6 f4@3 ~@3 c5@2 f5@2 ~@2 c5@2 ~@2 f4@3 ~@3 c5@2 f5@2 ~@2 c5@2 ~@2 g4@3 ~@3 d5@2 g5@2 ~@2 d5@2 ~@2 g4@3 ~@3 d5@2 g5@2 ~@2 d5@2 ~@2 c4@3 ~@3 c5@2 e5@2 ~@2 c5@2 ~@2 c4@3 ~@3 c5@2 e5@2 ~@2 c5@2 ~@2 f4@3 ~@3 c5]/8",
  AB: "[~ f5@2 ~@2 c5@2 ~@2 f4@3 ~@3 c5@2 f5@2 ~@2 c5@2 ~@2 db4@3 ~@3 f4@2 bb4@2 ~@2 f4@2 ~@2 db4@3 ~@3 f4@2 bb4@5 ~@6 f4@3 ~]/4",
  AC: "~@2 c5@2 f5@2 ~@2 c5@2 ~@2 f4@3 ~", AD: "~@2 c5@2 f5@2 ~@2 c5@2 ~@2 c4@3 ~",
  AE: "~@2 c5@2 e5@2 ~@2 c5@2 ~@2 c4@3 ~", AF: "~ c5 e5 ~@5", AG: "~@12 f4@3 ~", AH: "~ c5 f5 ~ c5 ~ f4 ~",
  AI: "[~@4 c4@23 ~@5]/2",
})).s("gm_flute").gain(0.2)

stack(flute, flute_soft, flute_2, flute_soft_2, flute_3)