Strudelify

Quatre Nadales

Toni Codina

KeyC majorTempo80 bpm
0:00/0:00
// Quatre Nadales — Toni Codina
// 80 bpm, 3/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: metre changes (3/4 at bar 1, 4/4 at bar 23, 3/4 at bar 28, 4/4 at bar 29, ...) are rendered on a constant 3/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/6361956; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 62 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/3)

// 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 · "Flauta"
const flute = note(`<
  ~@3 A B C A B D E F A B G A H I H J K L M N O P Q ~@2 N O ~@3 R ~@4 S T U V W X Y Z AA ~@7 AB@2 AC@6
>`.pickRestart({
  A: "~@5 e4", B: "a4@8 c5@11 ~ b4@4", C: "c5@23 ~", D: "c5@8 d5@11 ~ c5@4", E: "b4@8 a4@11 ~ b4@4", F: "a4@8 g#4@15 ~",
  G: "g#4@8 a4@15 ~", H: "a4@8 e5@11 ~ d5@4", I: "e5@15 ~@5 e4@4", J: "d5@8 f5@11 ~ e5@4", K: "d5@8 c5@11 ~ d5@4",
  L: "c5@2 b4@2 ~ e4", M: "a4@4 e5@3 ~@3 d5@2", N: "~@21 a5 ~@2", O: "b5 c6 ~ d6 e6 f6 ~ g#6 a6@5 ~@11",
  P: "~@16 a5 ~@2 b5 c6 d6 ~ e6", Q: "f6 g#6 ~ a6@5 ~@16", R: "~@3 a5 ~ b5 ~ c6 d6 e6 ~ f6 g#6 a6@5 ~@6",
  S: "~@8 e5 f5 ~ g5@2 g5@3 c6@3 a5@2 g5 a5 [g5,a5]", T: "g5 [g5,a5] a5 [g5,a5] g5 [g5,a5] a5 [g5,a5] a5@10 ~ g5@5",
  U: "~@3 e5 f5 g5@3 g5@3 c6@2 a5@3 g5 [g5,a5] a5 [g5,a5] g5 [g5,a5] a5 [g5,a5]", // Gsus2
  V: "g5 [g5,a5] a5 f5@10 e5@5 ~@3 e5 ~ f5", W: "g5@3 g5@2 g5@3 ~@16",
  X: "~@5 e5 ~ f5 g5@3 g5@2 g5@3 e5 f5 ~ g5@2 g5@3", Y: "g5@3 e5 f5 g5@5 ~@14", Z: "~@16 a5 b5 ~ c6@2 a5@3",
  AA: "g5 ~@7", AB: "[~@5 d#5@12 ~ c5@3 d5@2 e5@3 ~ c5@3 g#4@8 ~ c5@3 ~ d5@3 c5@2]/2",
  AC: "[a#4@3 ~ d5@3 d#5@8 ~ d5@2 c5@2 g#4@3 g4@2 g#4@3 g4@3 ~ c5@3 ~@2 g#4@3 ~ b4@3 c5@11 ~ g4@4 e4@8 g4@11 ~ f4@4 d4@8 c4@46 ~@6, ~@18 b4 ~@53]/6",
})).s("gm_flute").gain(0.25)

// other · oboe · "Tible"
const oboe = note("<~@14 A B C B D E F G H@2 I@2 J@2 K@2 L M N O ~@12 P@2 Q R S@2 T U@3 V@2 ~@4>".pickRestart({
  A: "~@5 e4", B: "a4@2 c5@3 b4", C: "c5@4 ~ e4", D: "c5@2 d5@3 c5", E: "b4@2 a4@3 b4", F: "a4@2 g#4@2 ~ e4",
  G: "a4@4 c5@3 ~@3 b4@2", H: "[~@21 a4@5 ~ g#4@5 a4@5 ~@11]/2",
  I: "[~@16 a4@5 g#4@5 ~ a4@5 ~@3 g4 f4 e4@3 e4@3 g4@2 f4@3]/2",
  J: "[e4@3 e4@2 g4@3 f4@3 e4@2 e4@3 g4@3 f4@2 e4@5 ~@3 d4 ~ e4 f4@5 d4@5 ~ e4@5]/2",
  K: "[~@21 a4@5 ~ g#4@5 a4@5 ~@3 g4 f4 ~ e4@2 e4@3]/2", L: "g4@3 f4@2 e4@3 e4@3 g4@2 f4@3 e4@3 e4@2 g4@3",
  M: "f4@3 e4@5 ~@3 d4 e4 f4@5 ~ d4@5", N: "e4@5 ~@19", O: "~@3 a4@5 g#4@5 a4@5 ~@6",
  P: "[~@8 g4@3 c5@3 d5@2 d#5@4 f5@3 g5@9 c6@4 b5@3 g5@2 g#5@3 a#5@4]/2", Q: "g5@9 g#5@3 a#5@4 g#5@2 c6@3 c6@3",
  R: "~ b5@3 g#5@2 g5@18", S: "[~@2 g5@12 e5@4 f5@2 g5@3 g#5@4 f5@9 f5@3 a#5@4 ~ g5@4, ~@43 g#5@2 ~@3]/2",
  T: "f5@4 g5@8 f5@2 d#5@2 d5@4 ~ f5@3, ~@10 d#5 ~",
  U: "[~ d#5@3 g5@12 ~ c5@12 g5@12 ~ e5@3 f5@2 g5@4 g#5@3 f5@9 f5@4 a#5@3 g#5@2]/3",
  V: "[g5@4 f5@3 g5@9 f5@2 d#5@2 d5@3 d#5@2 f5@3 d#5@4 g5@12 ~@4]/2",
})).s("gm_oboe").gain(0.3)

// other · oboe · "Tible" · soft notes
const oboe_soft = note("<~@42 A B C D E ~@10 F@5>".pickRestart({
  A: "~@8 e4 f4 ~ g4@2 g4@3 g4@3 ~@5", B: "~@16 e4 f4 ~ g4@2 g4@3", C: "g4@3 e4 f4 g4@5 ~@14",
  D: "~@16 a4 b4 ~ c5@2 a4@3", E: "g4 ~@7", F: "[~@5 c5@3 g4 e4@2 g4@3 f4 d4@2 e4@12 ~]/5",
})).s("gm_oboe").gain(0.2)

// other · trumpet · "Trompeta"
const trumpet = note("<~@22 A B C D E@2 A F G H I J K L K M K L K N ~@20>".pickRestart({
  A: "a4@4 g#4 a4@3 c5@3 b4@2 a4@3 g#4@3 e4@3 ~@2", B: "~@19 a4@4 g#4", C: "a4@3 c5@2 b4@3 a4@3 g#4@2 e4@3 ~@8",
  D: "~@11 g4!2 c5@3 c5@3 b4@2 b4@3",
  E: "[c5@3 c5@2 b4@3 b4@3 c5@2 c5@3 b4@3 b4@2 c5@5 ~@3 b4 ~ c5 d5@4 c5 b4@3 a4@3 g#4@2 e4@3]/2",
  F: "~@16 g4!2 ~ c5@2 c5@3", G: "b4@3 b4@2 c5@3 c5@3 b4@2 b4@3 c5@3 c5@2 b4@3",
  H: "b4@3 c5@5 ~@3 b4 c5 d5@4 c5 ~ b4@2 a4@3", I: "g#4@3 e4@2 a4@4 g#4 ~ a4@2 c5@3 b4@3 a4@2 g#4@3",
  J: "e4@3 a4@5 g#4@5 a4@5 ~@6", K: "~@3 g3@3 ~@2 g3@3 ~@2 g3@3 ~@3 g3@3 ~@2",
  L: "g3@3 ~@2 g3@3 ~@3 g3@3 ~@2 g3@3 ~@2 g3@3", M: "g3@3 ~@2 g3@3 ~@3 g3@3 ~@2 a3@3 ~@2 g3@3",
  N: "g3@3 ~@2 a3@3 ~@3 g3@3 ~@2 g3@3 ~@5",
})).s("gm_trumpet").gain(0.3)

// other · trumpet · "Trompeta" · soft notes
const trumpet_soft = note("<A B C ~@39 D E F G H ~@10 I@5>".pickRestart({
  A: "c5@3 g4 e4@2", B: "g4@3 f4 d4@2", C: "c4", D: "~@19 e4 f4 g4@3", E: "g4!2 ~@6", F: "~@3 e4 f4 g4@5 ~@14",
  G: "~@16 a4 b4 ~ c5@2 a4@3", H: "g4 ~@7", I: "[~@5 c5@3 g4 e4@2 g4@3 f4 d4@2 c4@12 ~]/5",
})).s("gm_trumpet").gain(0.2)

// other · french horn · "Trompa"
const french_horn = note("<~@21 A B@2 C@2 ~@2 B@2 ~@3 D E F G H I@2 J K L M N O P ~@7 Q@2 R@2 ~@4>".pickRestart({
  A: "~@5 b3", B: "[~@21 e4@5 ~ e4@5 e4@5 ~@11]/2", C: "[~@16 e4@5 e4@5 ~ e4@5 ~@16]/2", D: "~@3 e4@5 e4@5 e4@5 ~@6",
  E: "~@19 e4 f4 g4@3", F: "g4@3 c5@2 a4@3 g4@5 ~@3 f4 e4 ~ d4@2 e4@3",
  G: "f4@3 g4@2 e4@5 ~ c4@2 e4 ~ f4 g4@3 g4@2 c5@3", H: "a4@3 g4@5 ~@3 f4 e4 d4@3 e4@3 f4@2 g4@3",
  I: "[c4@5 ~@3 e4 f4 ~ g4@2 g4@3 c5@3 a4@2 g4@5 ~@3 f4 ~ e4 d4@3 e4@2 f4@3 g4@3 e4@5]/2",
  J: "c4@3 e4 f4 g4@3 g4@3 c5@2 a4@3 g4@5 ~@3", K: "f4 e4 ~ d4@2 e4@3 f4@3 g4@2 c4@5 ~@6",
  L: "~@3 g4@3 ~@2 g4@3 ~@2 a4@3 ~@3 g4@3 ~@2", M: "g4@3 ~@2 g4@3 ~@3 g4@3 ~@2 g4@3 ~@2 a4@3", N: "~@3 g4@2 g4@5 ~@14",
  O: "~@16 a4 b4 ~ c5@2 a4@3", P: "g4 ~@7", Q: "[~@5 g4@12 ~ e4@3 f4@2 g4@4 g#4@3 f4@9 f4@4 a#4@3 g#4@2]/2",
  R: "[g4@4 f4@3 g4@9 f4@2 d#4@2 d4@3 d#4@2 f4@3 d#4@4 g4@12 ~@4]/2",
})).s("gm_french_horn").gain(0.3)

// other · french horn · "Trompa" · soft notes
const french_horn_soft = note("<A B C ~@11 D E F E G H I J ~@35 K@5>".pickRestart({
  A: "g4@3 g4 g4@2", B: "f4 g4!2", C: "a4", D: "~@5 d4", E: "c4@2 a3@3 g#3", F: "a3@4 c4 d4", G: "a3@2 a3@3 a3",
  H: "b3@2 c4@3 b3", I: "c4@2 d4@2 e4 d4", J: "c4@4 a3@3 ~@5", K: "[~@5 g4@3 g4 g4@2 f4@2 g4@2 g4@2 g4@12 ~]/5",
})).s("gm_french_horn").gain(0.2)

// other · trombone · "Fiscorn"
const trombone = note("<~@22 A@2 B@2 C@2 D@2 E F G H E I J K E L M N ~ O ~@2 P@2 Q R@3 S T@3 U V ~@4>".pickRestart({
  A: "[~@21 a2@5 ~ g#2@5 a2@5 ~@11]/2", B: "[~@16 c3@5 d3@5 ~ c3@5 f3@5 ~@3 e3@3 ~@2 e3@3]/2",
  C: "[~@3 e3@3 ~@2 e3@3 ~@2 e3@3 ~@3 e3@2 e3@5 ~@9 f3@3 ~@2 a3@3 g#3@5]/2",
  D: "[~@21 c3@5 ~ d3@5 c3@5 f3@5 ~@3 e3@3]/2", E: "~@3 e3@3 ~@2 e3@3 ~@2 e3@3 ~@3 e3@3 ~@2",
  F: "e3@3 e3@5 ~@8 f3@3 ~@2 a3@3", G: "g#3@5 ~@19", H: "~@3 a2@5 g#2@5 a2@5 ~@6",
  I: "e3@3 ~@2 e3@3 ~@3 e3@3 ~@2 e3@3 ~@2 d3@3", J: "~@3 d3@3 ~@2 e3@3 ~@2 e3@3 ~@3 f3@3 ~@2",
  K: "e3@3 ~@2 e3@3 ~@3 e3@3 ~@2 f3@3 ~@2 d3@3", L: "e3@3 ~@2 e3@3 ~@3 d3@3 ~@2 d3@3 ~@2 e3@3",
  M: "~@3 e3@3 ~@2 f3@3 ~@2 e3@3 ~@3 e3@3 ~@2", N: "e3@3 ~@2 f3@3 ~@3 d3@3 ~@2 e3@3 ~@5", O: "~@5 e3 ~@18",
  P: "[~@11 d#3@5 d#3@4 d#3@3 d#3@5 d#3@4 d#3@4 d3@5 d3@3 d3@4]/2", Q: "d#3@5 d#3@4 d#3@3 f3@5 ~ f3@3 f3@3",
  R: "[~ d3@5 d3@4 d3@3 d3@5 ~ d3@3 d3@4 a#2@5 a#2@4 a#2@3 e3@5 ~ e3@3 e3@4 f3@5 f3@4 f3@3 d3@5 d3@4]/3",
  S: "d3@4 d#3@5 d#3@3 d#3@4 f3@5 f3@3",
  T: "[~ f3@3 d3@5 ~ d3@3 d3@4 d#3@5 d#3@4 d#3@3 a#2@5 ~ a#2@3 a#2@4 e3@5 e3@4 e3@3 f3@5 ~ f3@3 f3@4 d3@5]/3",
  U: "d3@4 d3@3 d#3@5 d#3@4 d#3@4 f3@4", V: "~ f3@3 f3@4 d3@5 d3@4 d3@4 ~@3",
})).s("gm_trombone").gain(0.3)

// other · trombone · "Fiscorn" · soft notes
const trombone_soft = note("<A B C ~@40 D E F G ~@10 H@5>".pickRestart({
  A: "e3", B: "f3", C: "c3", D: "~@7 f3 g3@3 g3@2 g3@3 ~@8", E: "~@3 e3 f3 g3@5 ~@14", F: "~@16 a2 b2 ~ c3@2 a2@3",
  G: "g2 ~@7", H: "[~@5 e3@6 f3@6 c3@12 ~]/5",
})).s("gm_trombone").gain(0.2)

// bass · tuba · "Bombardino"
const bass = note(`<
  A B C@5 D E F G@2 H I@2 ~@7 J@2 K@2 L@2 M@2 N@2 O P Q@2 R@2 S@2 T@2 U@2 V W X@2 Y Z AA AB AC AD AE@8
>`.pickRestart({
  A: "c3", B: "g2", C: "a2/5", D: "a2", E: "d3", F: "f3", G: "e3/2", H: "a2@2 g#2", I: "a2/2",
  J: "[~@21 a2@5 ~ e2@5 a2@5 ~@11]/2", K: "[~@16 a2@5 e2@5 ~ a2@5 g2@5 c3@5 ~ g2@5]/2",
  L: "[c3@5 g2@5 ~ c3@5 g2@5 c3@5 ~@6 d3@5 a2@5 ~ e3@5]/2", M: "[~@21 a2@5 ~ e2@5 a2@5 g2@5 ~ c3@5]/2",
  N: "[g2@5 c3@5 ~ g2@5 c3@5 g2@5 ~ c3@5 ~@5 d3@5 ~ a2@5]/2", O: "e3@5 ~@19", P: "~@3 a2@5 e2@5 a2@5 ~@6",
  Q: "[c3@5 g2@5 ~ c3@5 g2@5 c3@5 ~ g2@5 c3@5 g2@5 ~ b2@5]/2",
  R: "[g2@5 c3@5 ~ g2@5 d3@5 g2@5 ~ c3@5 g2@5 f2@5 ~ g2@5]/2",
  S: "[c3@5 g2@5 ~ c3@5 g2@5 c3@5 ~ g2@5 b2@5 g2@5 ~ c3@5]/2",
  T: "[g2@5 d3@5 ~ g2@5 c3@5 g2@5 ~ f2@5 g2@5 c3@5 ~ g2@5]/2",
  U: "[c3@5 g2@5 ~ f2@5 g2@5 c3@5 ~ g2@5 c3@5 g2@5 ~ f2@5]/2", V: "g2@5 c3@5 ~ c3@2 c3@3 a3@3 a3@2 a3@3",
  W: "a3@3 a3@2 a3 ~ b3 c4@3 b3 a3 g3@3 a3 b3 ~ c4@2 a3@3", X: "[g3@3 g3 f3 e3@3 d3@3 c3@12 a#2@12 ~ g2@12]/2",
  Y: "c3 d3", Z: "~ g2@12 g2@11", AA: "~ d#3@6 c3@5", AB: "~ f2@4 a#2@3", AC: "~ c3@3 d3@2", AD: "~@4 g2@12 ~ c3@7",
  AE: "[~@5 d#3@12 ~ c3@12 f2@12 ~ a#2@12 c3@12 ~ d3@12 g2@12 c3@24 g2@24 c3@48 ~@4]/8",
})).s("gm_tuba").gain(0.48)

stack(flute, oboe, oboe_soft, trumpet, trumpet_soft, french_horn, french_horn_soft, trombone, trombone_soft, bass)