Strudelify
KeyF majorTempo102 bpm
0:00/0:00
// La Golondrina — Narciso Serradellarr. Rosamond Johnson
// 102 bpm, 4/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/5857921; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 82 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(102/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · trumpet · "B♭ Trumpet 2"
const trumpet = note(`<
  A B@4 C D@2 E F G H I J K L M N O P Q R S T@2 F G H I J K L M N O P Q R S U V W X Y Z@5 AA AB AC@3 AD@3 AE@4 AF@4 AG@5
  AH@2 AI AJ@5 AK@4
>`.pickRestart({
  A: "~@5 bb3@16 bb3@11", B: "[~ bb3@4 bb3@16 bb3@16 c4@16 c4@8 c4@8 c4@16 c4@16 g3@8 ~@8 g3@8 ~@3]/4",
  C: "~@5 ab3@8 ~@8 ab3@8 ~@3", D: "[~@5 bb3@12 bb3@4 bb3@8 bb3@8 bb3@8 ~@19]/2", E: "~@3 bb3 eb4@3 f4", F: "g4@7 f4",
  G: "g4 ab4 bb4 c5", H: "c5@5 bb4 ab4 g4", I: "f4 bb3 eb4 f4", J: "g4@3 bb4", K: "a4@2 bb4@2 c5@3 bb4",
  L: "f4@6 ab4 g4", M: "f4@2 ~ bb3 eb4@3 f4", N: "g4@3 f4", O: "eb4 eb5!2 d5", P: "eb5", Q: "c5!2 ab4 f4",
  R: "g4@7 bb4", S: "a4 bb4 ab4 f4", T: "[eb4@9 ~@2 bb3 eb4@3 f4]/2", U: "eb4", V: "eb4 ~@7", W: "d4 bb3", X: "bb3",
  Y: "eb4 eb4@2 eb4", Z: "[eb4@4 ~@12 g4@15 g4@4 ab4@16 ab4@24 ~@8 eb4@16 eb4@32 ~@29]/5", AA: "~@3 eb4@24 f4@5",
  AB: "~@11 g4@16 g4@5", AC: "[~@3 ab4@32 eb4@8 eb4@8 c4@8 d4@8 eb4@24 ~@5]/3",
  AD: "[~@19 c4@8 ab3@8 bb3@16 eb4@4 f4@4 g4@4 c5@4 bb4@8 ~@21]/3",
  AE: "[~@3 d4@16 bb3@16 bb3@32 eb4@8 eb4@16 eb4@8 eb4@4 ~@12 g4@13]/4",
  AF: "[~@3 g4@4 ab4@16 ab4@24 ~@8 eb4@16 eb4@32 ~@25]/4",
  AG: "[~@7 eb4@24 f4@5 ~@11 g4@16 g4@5 ~@3 ab4@32 eb4@8 eb4@8 c4@8 d4@8 eb4@24 ~]/5",
  AH: "[~@23 c4@8 ab3@8 ~@16 d4@5 ~@4]/2", AI: "~@7 g4@8 ~@8 c5@3 bb4@3 a4@3",
  AJ: "[~ bb4@3 d5@32 c5@4 bb4@5 ab4@5 g4@4 f4@5 c5@34 g4@6 f4@7 eb4@7 d4@7 eb4@7 f4@6 g4@7 ab4@7 bb4@7 c5@6]/5",
  AK: "[~ d5@6 eb5@7 ~@7 c5@10 c5@3 ~ eb5@5 ~@8 bb3@3 ~ c5@6 c5@3 ~ bb4@5 c5@5 d5@5 eb5@27 ~@24]/4",
})).s("gm_trumpet").gain(0.3).pan(1)

// other · french horn · "Horn in F"
const french_horn = note(`<
  A B@7 ~ C@2 D E F G H@2 I J K L M N O P C@2 D E F G H@2 I J K L M N O Q R S T U V@3 W X Y Z AA@3 AB@2 AC@4 AD@4 AE@6
  AF@2 AG@3 ~@2 AH@4
>`.pickRestart({
  A: "~@5 bb3@16 bb3@11",
  B: "[~ bb3@4 bb3@8 c4@8 d4@8 eb4@8 c4@16 ab4@16 ab4@5 g4@5 f4@5 ~ eb4@5 d4@5 c4@5 ~ bb3@5 g4@5 ab4@5 ~ g4@5 f4@5 eb4@5 ~ d4@5 g4@5 bb4@5 ~ ab4@5 g4@5 f4@5 ~ eb4@12 eb4@4 eb4@8 eb4@8 eb4@8 ~@19]/7",
  C: "~ bb3@2 ~", D: "d4", E: "ab3 ~", F: "bb3 eb4@2 d4", G: "c4 bb3 c4 bb3", H: "[ab3@5 ~@3]/2", I: "g3 bb3@2 eb3",
  J: "eb3 g3", K: "c4!2", L: "eb4!2 c4 b3", M: "~ bb3@2 bb3", N: "~ d4 ~ bb3", O: "g3@8 g3@4 ab3@4 ab3@5 ~@3 bb3@5 ~@3",
  P: "c4@4 d4@4 g3@3 ~@21", Q: "c4 d4 g4 ~@5", R: "ab3", S: "f3 ab3", T: "g3 g3@2 g3", U: "g3@2 ~@6 bb3@5 ~@3",
  V: "[~@3 bb3@16 f3@8 f3@8 f3@8 ~@8 bb3@16 eb4@12 bb3@4 eb4@5 ~@3 bb3@5]/3", W: "~@3 bb3@8 ~@21",
  X: "~@3 bb3@5 ~@3 bb3@16 bb3@5", Y: "~@11 bb3@16 bb3@5", Z: "~@11 c4@16 c4@5",
  AA: "[~@3 f3@16 ab3@16 bb3@16 bb3@16 ~@29]/3", AB: "[~@3 g3@16 bb3@16 g3@8 ~@21]/2",
  AC: "[~@3 ab3@32 f3@16 ab3@16 g3@8 g3@16 g3@8 g3@4 ~@12 bb3@10 ~@3]/4",
  AD: "[~@7 bb3@16 f3@8 f3@8 f3@8 ~@8 bb3@16 eb4@12 bb3@4 eb4@5 ~@3 bb3@5 ~@3 bb3@8 ~@17]/4",
  AE: "[~@7 bb3@5 ~@3 bb3@16 bb3@5 ~@11 bb3@16 bb3@5 ~@11 c4@16 c4@5 ~@3 f3@16 ab3@16 bb3@16 bb3@16 ~@25]/6",
  AF: "[~@7 g3@5 ~@3 g3@4 ab3@4 bb3@5 ~@3 c4@4 d4@4 eb4@8 ~@17]/2", AG: "[~@18 d4@10 d4@3 d4@14 ~@14 g4@34 ~@3]/3",
  AH: "[~@21 ab4@10 ab4@3 ~ g4@5 ~@8 g3@3 ~ g4@6 g4@3 ~ g4@5 ab4@5 a4@5 bb4@27 ~@24]/4",
})).s("gm_french_horn").gain(0.3).pan(0.2)

// other · trombone
const trombone = note(`<
  A B@4 C D@2 ~ E F G H I J K L M N O P Q R S T E F G H I J K L M N O P Q R S U V W X Y@8 Z@8 AA AB@6 AC@6 AD@5 AE@4
>`.pickRestart({
  A: "~@5 g3@16 g3@11", B: "[~ g3@4 g3@16 g3@16 ab3@16 ab3@8 ab3@8 ab3@16 ab3@16 eb3@8 ~@8 eb3@8 ~@3]/4",
  C: "~@5 d3@8 ~@8 d3@8 ~@3", D: "[~@5 g3@12 g3@4 g3@8 g3@8 g3@8 ~@19]/2", E: "eb3@8 ~@4 bb3@4 g3@5 ~@11",
  F: "eb3@8 ~@4 bb3@4 g3@5 ~@3 eb3@5 ~@3", G: "bb3@8 ~@4 f3@4 bb3@5 ~@11", H: "bb3 ~",
  I: "eb3@8 ~@4 bb3@4 eb4@5 ~@3 bb3@5 ~@3", J: "eb3!2", K: "f3@5 ~@19 bb3@5 ~@3", L: "f3@5 ~@27",
  M: "eb3@8 ~@4 bb3@4 g3@5 ~@3 bb3@5 ~@3", N: "db3@8 ~@4 bb3@4 g3@5 ~@3 bb3@5 ~@3",
  O: "ab3@8 ~@4 eb3@4 ab3@5 ~@3 eb3@5 ~@3", P: "f3 ab3", Q: "bb3@2 ~ g3 bb3@2 ~ bb3", R: "bb3@3 bb3 d4@4",
  S: "eb4@12 c4@4 d4@5 ~@11", T: "g3 ~@7", U: "g3@4 ~@8 g3@4 bb3 ab3@11 g3@4", V: "g3@21 f3@5 ~ d3@5",
  W: "bb2@2 d3 eb3 f3@2 g3 ab3", X: "bb3@3 ab3",
  Y: "[bb3@4 ~@8 eb4@4 d4@15 c4@4 c4 d4 c4@14 bb3@21 ~ ab3@5 bb3@5 c4@5 ~ [bb3,c4] bb3@4 ab3@5 g3@24 f3@8 eb3@12 g3@4 g3@12 gb3@4 g3@24 f3@8 eb3@5 ~ eb3@5 f3@5 g3@5 ~ ab3@5 bb3@5 c4@29]/8", // Bbsus2
  Z: "[~@3 ab3@8 ab3@8 f3@8 b2@8 eb3@24 g3@8 gb3@12 g3@4 d3@12 d3@4 g3@40 ~@4 g3@4 bb3 ab3@11 g3@4 g3@21 ~ f3@5 d3@5 bb2@8 d3@4 eb3@4 f3@8 g3@4 ab3@4 bb3@24 ab3@5]/8",
  AA: "~@3 bb3@4 ~@8 eb4@4 d4@13",
  AB: "[~@3 c4@4 [c4,d4] c4@14 ~ bb3@21 ab3@5 bb3@5 ~ c4@5 bb3 c4 bb3@3 ab3@5 ~ g3@24 f3@8 eb3@12 g3@4 g3@12 gb3@4 g3@24 f3@8 eb3@5 eb3@5 f3@5 ~ g3@5 ab3@4]/6", // Csus2
  AC: "[~ bb3@5 ~ c4@32 ab3@8 ab3@8 f3@8 b2@8 eb3@24 g3@8 gb3@12 g3@4 d3@12 d3@4 g3@16 ab3@16 g3@8 ~@17]/6",
  AD: "[~@4 f3@14 bb3@10 bb3@3 bb3@14 bb3@14 eb3@13 bb3@10 bb3@3 ~ bb3@7 eb4@6 d4@7 c4@7 bb3@7 a3@7 ab3@6 g3@7 f3@7 eb3@7 d3@6]/5",
  AE: "[~ bb2@6 eb3@7 ~@7 ab3@10 ab3@3 ~ bb3@5 ~@22 eb3@5 f3@5 gb3@5 g3@27 ~@24]/4",
})).s("gm_trombone").gain(0.22).pan(0.8)

// bass · tuba
const bass = note(`<
  A B@4 C D@2 ~ E F G H E F I J K L M N O P Q R E F G H E F I J K L M N O P Q R S T U V@5 W X@2 Y Z@4 AA@4 AB@4 AC@4
  AD@4 AE@3 ~@2 AF@4
>`.pickRestart({
  A: "~@5 eb3@16 d3@11", B: "[~ c3@4 bb2@16 bb2@16 f2@16 e3@8 eb3@8 d3@16 d3@16 bb2@8 ~@8 bb2@8 ~@3]/4",
  C: "~@5 bb2@8 ~@8 bb2@8 ~@3", D: "[~@5 eb3@8 ~@4 bb2@4 eb3@5 ~@3 bb2@5 ~@3 eb2@8 ~@19]/2", E: "eb2@5 ~@19 bb1@5 ~@3",
  F: "eb2@5 ~@3 g2@16 bb2@5 ~@3", G: "f2@5 ~@3 ab2@16 bb2@5 ~@3", H: "f2@5 ~@3 bb2@5 ~@19",
  I: "bb1@12 f2@4 bb2@5 ~@3 f2@5 ~@3", J: "bb1@5 ~@27", K: "eb2", L: "db2", M: "c2", N: "f2 ab2", O: "bb2",
  P: "bb2@5 ~@3 ab2@5 ~@3 bb2@5 ~@3 ab2@5 ~@3", Q: "eb2@24 bb1@5 ~@3", R: "eb2 ~@7", S: "bb1@3 d2 f2@2 d2@2",
  T: "bb1@3 d2 f2@2 bb2@2", U: "eb2@12 bb2@4 g2@5 ~@3 bb2@8",
  V: "[eb2@4 ~@12 g2@15 bb2@4 f2@12 c3@4 f3@8 f2@8 f2@12 ab2@4 ab2@8 bb2@8 eb2@8 g2@16 bb2@8 eb2@8 ~@21]/5",
  W: "~@3 eb2@12 bb1@4 eb2@5 ~@3 bb1@5", X: "[~@3 eb2@5 ~@11 db2@16 ab2@12 eb2@4 ab2@5 ~@3 eb2@5]/2",
  Y: "~@3 ab2@5 ~@24", Z: "[~@3 bb2@12 bb1@4 bb2@8 bb1@8 bb1@8 ~@8 bb1@16 eb2@12 bb1@4 g2@16 bb2@8 ~@21]/4",
  AA: "[~@3 bb1@12 d2@4 f2@8 d2@8 bb1@12 d2@4 f2@8 bb2@8 eb2@12 bb2@4 g2@5 ~@3 bb2@8 eb2@4 ~@12 g2@13]/4",
  AB: "[~@3 bb2@4 f2@12 c3@4 f3@8 f2@8 f2@12 ab2@4 ab2@8 bb2@8 eb2@8 g2@16 bb2@8 eb2@8 ~@17]/4",
  AC: "[~@7 eb2@12 bb1@4 eb2@5 ~@3 bb1@5 ~@3 eb2@5 ~@11 db2@16 ab2@12 eb2@4 ab2@5 ~@3 eb2@5 ~@3 ab2@5 ~@20]/4",
  AD: "[~@7 bb2@12 bb1@4 bb2@8 bb1@8 bb1@8 ~@8 bb1@16 eb2@12 bb1@4 ab2@5 ~@3 bb2@5 ~@3 eb2@8 ~@17]/4",
  AE: "[~@4 f2@14 g2@10 g2@3 ab2@14 bb1@14 eb2@13 g2@10 g2@3 ~ g2@7 ~@3]/3",
  AF: "[~@21 ab2@10 ab2@3 ~ eb2@5 ~@8 eb2@10 bb2@3 ~ g2@7 bb2@8 eb2@7 ~@3 bb1@3 ~ eb2@9 ~@28]/4",
})).s("gm_tuba").gain(0.3)

stack(trumpet, french_horn, trombone, bass)