Strudelify
KeyD majorTempo75 bpm
0:00/0:00
// Æ lam — Traditional Danish Folk Melody
// 75 bpm, 6/8, key D 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 (1/8 at bar 1, 6/8 at bar 2, 5/8 at bar 9, 1/8 at bar 9, ...) are rendered on a constant 6/8 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/2734151; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 61 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(75/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.

// chords · orchestral harp · "Harp"
const orchestral_harp = note(`<
  ~ A B C D A B E F A B C D A B E F A B G H A B E I A B C D A B E F A B G H A B E I ~@20
>`.pickRestart({
  A: "~ [a3,d4] [a3,d4,f#4] ~ [a3,d4] [a3,d4,f#4], d3 c#3", B: "~ [b3,d4] [b3,d4,f#4] ~ [a3,d4] [a3,c#4,f#4], b2 a2",
  C: "~ [b3,d4] [b3,d4,g4] ~ [a3,c#4] [a3,c#4,e4], g2 a2", D: "~ [b3,d4] [b3,d4,g4] ~ [a3,c#4] [a3,c#4,e4], a2!2",
  E: "~ [b3,d4] [b3,d4,f#4] ~ [a3,d4] [a3,c#4,e4], g2 a2", F: "~ [b3,e4] [c#4,e4,g4] [f#2,a3,d4,f#4]@3, a2 ~",
  G: "~ [b3,d4] [b3,d4,g4] ~ [g3,b3] [g3,b3,e4], g2 e2", H: "~ [b3,d4] [b3,d4,g4] ~ [a3,d4] [a3,d4,f#4], a2!2",
  I: "~ [b3,e4] [c#4,e4,g4] [f#2,a3,d4,f#4]@2 ~, a2 ~", // E5 C#dim D
})).s("gm_orchestral_harp").gain(0.3)

// other · violin
const violin = note("<~@40 A B@2 C@2 D E@2 F@2 G H@2 I@2 D E@2 F@2 J>".pickRestart({
  A: "~@20 f#4 ~ d4@2",
  B: "[~ d4 ~@2 e4@2 f#4@2 d4@2 ~ d4 ~ d4 c#4@2 d4@2 e4@2 ~ e4 ~@2 a3@2 c#4@2 e4@2 ~ e4 ~ e4@2 ~ f#4 ~ d4@2 ~ d4 ~ d4 e4@2 f#4@2, ~@3 d4@2 ~@18 c#4@2 ~@23]/2",
  C: "[d4@2 ~ d4 ~ d4@2 ~ a3 ~ b3@2 ~ b3 ~@2 b3@2 c#4@2 ~ d4@2 c#4@2 d4@2 ~ f#4 ~ d4@2 ~ d4 ~@2 e4@2 f#4@2 d4@2 ~ d4 ~ d4 c#4@2, ~@15 a3@2 ~@3 e4@2 ~@13 d4@2 ~@11]/2",
  D: "d4@2 e4@2 ~ e4 ~@2 a3@2 c#4@2 e4@2 ~ e4 ~ e4@2 ~ f#4 ~ d4@2, ~@7 c#4@2 ~@15",
  E: "[~ d4 ~ d4 e4@2 f#4@2 d4@2 ~ d4 ~ d4@2 ~ a3 ~ b3@2 ~ b3 ~@2 b3@2 c#4@2 ~ d4@2 c#4@2 d4@2 ~ f#4@2 a4@2 ~ f#4@2 a4@2 ~ f#4@2, ~@23 a3@2 ~@3 e4@2 ~@18]/2",
  F: "[~ f#4@2 e4@2 ~ e4@2 f#4@2 g4@2 ~ g4@2 ~ g4@2 e4@2 c#4@2 ~ c#4@2 c#4@2 ~ f#4@2 a4@2 ~ f#4@2 a4@2 ~ f#4@2 ~ f#4@2 e4@2 ~ e4@2, a4@2 ~@3 d4@2 ~@8 b4@2 ~@23 a4@2 ~@3 d4@2 ~]/2",
  G: "f#4@2 b3@2 ~ b3@2 ~ b3@2 c#4@2 ~ d4@2 c#4@2 d4@2 ~ f#4@2 a4@2, ~@7 a3@2 ~@3 e4@2 ~@10",
  H: "[~ f#4@2 a4@2 ~ f#4@2 ~ f#4@2 e4@2 ~ e4@2 f#4@2 g4@2 ~ g4@2 ~ g4@2 e4@2 c#4@2 ~ c#4@2 c#4@2 ~ f#4@2 a4@2 ~ f#4@2 a4@2 ~ f#4@2, ~@8 a4@2 ~@3 d4@2 ~@8 b4@2 ~@23]/2",
  I: "[~ f#4@2 e4@2 ~ e4@2 f#4@2 b3@2 ~ b3@2 ~ b3@2 c#4@2 ~ d4@2 c#4@2 d4@2 ~ f#4 ~ d4@2 ~ d4 ~@2 e4@2 f#4@2 d4@2 ~ d4 ~ d4 c#4@2, a4@2 ~@3 d4@2 ~@8 a3@2 ~@3 e4@2 ~@13 d4@2 ~@11]/2",
  J: "f#4@2 b3@2 ~ b3@2 ~ b3@2 c#4@2 ~ d4@2 c#4@2 d4@2 ~@5, ~@7 a3@2 ~@3 e4@2 ~@10",
})).s("gm_violin").gain(0.3)

// chords · accordion
const accordion = note("<~@40 A B@2 C@2 D E@2 F@2 G H@2 I@2 D E@2 F@2 J>".pickRestart({
  A: "~@10 f#5 [d3,d5]", // D
  B: "[~ [f#4,a4,d5]@2 ~ e5@2 [f#4,a4,f#5]@2 [d3,d5]@3 [f#4,a4,d5]@2 ~ c#5@2 [f#4,a4,d5]@2 [c#3,e5]@3 [e4,g4,a4,e5]@2 ~ a4@2 [e4,g4,a4,c#5]@2 [c#3,e5]@3 [e4,g4,a4,e5]@2 [a2,e5]@3 [e4,g4,a4,f#5]@2 [d3,d5]@3 [f#4,a4,d5]@2 ~ e5@2 [f#4,a4,f#5]@2, ~@3 [a2,d5]@2 ~@8 [a2,d5]@2 ~@8 [a2,c#5]@2 ~@18 [a2,d5]@2 ~@3]/2", // D F#m D C#m A7 C#m A7 A5 …
  C: "[[d3,d5]@3 [f#4,a4,d5]@2 [a2,d5]@3 [f#4,a4]@2 [g2,b4]@3 [b3,d4,b4]@2 ~ b4@2 [e4,g4,a4,c#5]@2 ~ d5@2 [e4,g4,c#5]@2 [d3,f#4,a4,d5]@3 f#5@2 [d3,d5]@3 [f#4,a4,d5]@2 ~ e5@2 [f#4,a4,f#5]@2 [d3,d5]@3 [f#4,a4,d5]@2 ~ c#5@2, ~@15 [a2,a4]@2 ~@3 [a2,e5]@2 ~@13 [a2,d5]@2 ~@8 [a2,d5]@2 ~]/2", // D D5 F#m G Bm A7 C#dim D …
  D: "[f#4,a4,d5]@2 [c#3,e5]@3 [e4,g4,a4,e5]@2 ~ a4@2 [e4,g4,a4,c#5]@2 [c#3,e5]@3 [e4,g4,a4,e5]@2 [a2,e5]@3 [e4,g4,a4,f#5]@2 [d3,d5]@2, ~@7 [a2,c#5]@2 ~@15", // D C#m A7 C#m A7 A5 F#m7 D …
  E: "[~ [f#4,a4,d5]@2 ~ e5@2 [f#4,a4,f#5]@2 [d3,d5]@3 [f#4,a4,d5]@2 [a2,d5]@3 [f#4,a4]@2 [g2,b4]@3 [b3,d4,b4]@2 ~ b4@2 [e4,g4,a4,c#5]@2 ~ d5@2 [e4,g4,c#5]@2 [d3,f#4,a4,d5]@3 [c#3,c#4,e4,g4,f#5]@2 [d3,a5]@3 [f#4,a4,f#5]@2 [a2,a5]@3 [f#4,a4,f#5]@2, ~@3 [a2,d5]@2 ~@18 [a2,a4]@2 ~@3 [a2,e5]@2 ~@18]/2", // D F#m D D5 F#m G Bm A7 …
  F: "[~ f#5@2 [f#4,a4,e5]@2 ~ e5@2 [f#4,a4,f#5]@2 [c#3,g5]@3 [e4,g4,a4,g5]@2 ~ g5@2 [e4,g4,a4,e5]@2 [c#3,c#5]@3 [e4,g4,a4,c#5]@2 [c#3,c#5]@3 [e4,g4,a4,f#5]@2 [d3,a5]@3 [f#4,a4,f#5]@2 [a2,a5]@3 [f#4,a4,f#5]@2 ~ f#5@2 [f#4,a4,e5]@2 ~ e5@2, [d3,a5]@2 ~@3 [a2,d5]@2 ~@8 [a2,b5]@2 ~@23 [d3,a5]@2 ~@3 [a2,d5]@2 ~]/2", // F#m7 F#m C#dim A7 C# A7 C# F#m7 …
  G: "[f#4,a4,f#5]@2 [g2,b4]@3 [b3,d4,b4]@2 ~ b4@2 [e4,g4,a4,c#5]@2 ~ d5@2 [e4,g4,c#5]@2 [d3,f#4,a4,d5]@3 [c#3,c#4,e4,g4,f#5]@2 [d3,a5]@2, ~@7 [a2,a4]@2 ~@3 [a2,e5]@2 ~@10", // F#m G Bm A7 C#dim D C#dim D5 …
  H: "[~ [f#4,a4,f#5]@2 [a2,a5]@3 [f#4,a4,f#5]@2 ~ f#5@2 [f#4,a4,e5]@2 ~ e5@2 [f#4,a4,f#5]@2 [c#3,g5]@3 [e4,g4,a4,g5]@2 ~ g5@2 [e4,g4,a4,e5]@2 [c#3,c#5]@3 [e4,g4,a4,c#5]@2 [c#3,c#5]@3 [e4,g4,a4,f#5]@2 [d3,a5]@3 [f#4,a4,f#5]@2 [a2,a5]@3 [f#4,a4,f#5]@2, ~@8 [d3,a5]@2 ~@3 [a2,d5]@2 ~@8 [a2,b5]@2 ~@23]/2", // F#m A F#m F#m7 F#m C#dim A7 C# …
  I: "[~ f#5@2 [f#4,a4,e5]@2 ~ e5@2 [f#4,a4,f#5]@2 [g2,b4]@3 [b3,d4,b4]@2 ~ b4@2 [e4,g4,a4,c#5]@2 ~ d5@2 [e4,g4,c#5]@2 [d3,f#4,a4,d5]@3 f#5@2 [d3,d5]@3 [f#4,a4,d5]@2 ~ e5@2 [f#4,a4,f#5]@2 [d3,d5]@3 [f#4,a4,d5]@2 ~ c#5@2, [d3,a5]@2 ~@3 [a2,d5]@2 ~@8 [a2,a4]@2 ~@3 [a2,e5]@2 ~@13 [a2,d5]@2 ~@8 [a2,d5]@2 ~]/2", // F#m7 F#m G Bm A7 C#dim D F#m …
  J: "[f#4,a4,f#5]@2 [g2,b4]@3 [b3,d4,b4]@2 ~ b4@2 [e4,g4,a4,c#5]@2 ~ d5@2 [e4,g4,c#5]@2 [d3,f#4,a4,d5]@3 ~@4, ~@7 [a2,a4]@2 ~@3 [a2,e5]@2 ~@10", // F#m G Bm A7 C#dim D A A5
})).s("gm_accordion").gain(0.35)

// other · whistle · "Tin Whistle"
const whistle = note("<~@40 A B@2 C@2 D E@2 F@2 G H@2 I@2 D E@2 F@2 J>".pickRestart({
  A: "~@20 f#6 ~ d6@2",
  B: "[~ d6 ~@2 e6@2 f#6@2 d6@2 ~ d6 ~ d6 c#6@2 d6@2 e6@2 ~ e6 ~@2 a5@2 c#6@2 e6@2 ~ e6 ~ e6@2 ~ f#6 ~ d6@2 ~ d6 ~ d6 e6@2 f#6@2, ~@3 d6@2 ~@18 c#6@2 ~@23]/2",
  C: "[d6@2 ~ d6 ~ d6@2 ~ a5 ~ [b5,c#6] b5 ~ b5 ~@2 b5@2 c#6@2 [e6,f#6] d6@2 c#6@2 d6@2 ~ f#6 ~ d6@2 ~ d6 ~@2 e6@2 f#6@2 d6@2 ~ d6 ~ d6 c#6@2, ~@15 a5@2 ~@18 d6@2 ~@11]/2", // Bsus2 Esus2
  D: "d6@2 e6@2 ~ e6 ~@2 a5@2 c#6@2 e6@2 ~ e6 ~ e6@2 ~ f#6 ~ d6@2, ~@7 c#6@2 ~@15",
  E: "[~ d6 ~ d6 e6@2 f#6@2 d6@2 ~ d6 ~ d6@2 ~ a5 ~ [b5,c#6] b5 ~ b5 ~@2 b5@2 c#6@2 [e6,f#6] d6@2 c#6@2 d6@2 ~ f#6@2 a6@2 ~ f#6@2 a6@2 ~ f#6@2, ~@23 a5@2 ~@23]/2", // Bsus2 Esus2
  F: "[[a6,b6] f#6@2 e6@2 ~ e6@2 f#6@2 g6@2 ~ g6@2 ~ g6@2 e6@2 c#6@2 ~ c#6@2 c#6@2 ~ [d6,e6] f#6 a6@2 ~ f#6@2 a6@2 ~ f#6@2 [a6,b6] f#6@2 e6@2 ~ e6@2, ~@5 d6@2 ~@8 b6@2 ~@28 d6@2 ~]/2", // Asus2 Dsus2 Asus2
  G: "f#6@2 b5@2 ~ b5@2 ~ b5@2 c#6@2 ~ d6@2 c#6@2 d6@2 ~ f#6@2 a6@2, ~@7 a5@2 ~@3 e6@2 ~@10",
  H: "[~ f#6@2 a6@2 ~ f#6@2 [a6,b6] f#6@2 e6@2 ~ e6@2 f#6@2 g6@2 ~ g6@2 ~ g6@2 e6@2 c#6@2 ~ c#6@2 c#6@2 ~ [d6,e6] f#6 a6@2 ~ f#6@2 a6@2 ~ f#6@2, ~@13 d6@2 ~@8 b6@2 ~@23]/2", // Asus2 Dsus2
  I: "[[a6,b6] f#6@2 e6@2 ~ e6@2 f#6@2 b5@2 ~ b5@2 ~ b5@2 c#6@2 ~ d6@2 c#6@2 d6@2 ~ f#6 ~ d6@2 ~ d6 ~@2 e6@2 f#6@2 d6@2 ~ d6 ~ d6 c#6@2, ~@5 d6@2 ~@8 a5@2 ~@3 e6@2 ~@13 d6@2 ~@11]/2", // Asus2
  J: "f#6@2 b5@2 ~ b5@2 ~ b5@2 c#6@2 ~ d6@2 c#6@2 d6@2 ~@5, ~@7 a5@2 ~@3 e6@2 ~@10",
})).s("gm_whistle").gain(0.3)

// bass · contrabass
const bass = note("<~@40 A B@2 C D E F@2 G H I J@2 C D E F@2 G H K>".pickRestart({
  A: "~@11 d2", B: "[~@3 a1@2 ~@3 d2@2 ~@3 a1@2 ~@3 c#2@2 ~@3 a1@2 ~@3 c#2@2 ~@3 a1@2 ~@3 d2@2 ~@3 a1@2 ~@3]/2",
  C: "d2@2 ~@3 a1@2 ~@3 g1@2 ~@3 a1@2 ~@3 a1@2 ~@2", D: "~ d2@2 ~@3 d2@2 ~@3 a1@2 ~@3 d2@2 ~@3 a1@2 ~",
  E: "~@2 c#2@2 ~@3 a1@2 ~@3 c#2@2 ~@3 a1@2 ~@3 d2@2",
  F: "[~@3 a1@2 ~@3 d2@2 ~@3 a1@2 ~@3 g1@2 ~@3 a1@2 ~@3 a1@2 ~@3 d2@2 ~ c#2@2 d2@2 ~@3 a1@2 ~@3]/2",
  G: "d2@2 ~@3 a1@2 ~@3 c#2@2 ~@3 a1@2 ~@3 c#2@2 ~@2", H: "~ c#2@2 ~@3 d2@2 ~@3 a1@2 ~@3 d2@2 ~@3 a1@2 ~",
  I: "~@2 g1@2 ~@3 a1@2 ~@3 a1@2 ~@3 d2@2 ~ c#2@2 d2@2",
  J: "[~@3 a1@2 ~@3 d2@2 ~@3 a1@2 ~@3 c#2@2 ~@3 a1@2 ~@3 c#2@2 ~@3 c#2@2 ~@3 d2@2 ~@3 a1@2 ~@3]/2",
  K: "~@2 g1@2 ~@3 a1@2 ~@3 a1@2 ~@3 d2@2 ~@5",
})).s("gm_contrabass").gain(0.3)

// other · acoustic guitar steel · "Mandolin"
const acoustic_guitar_steel = note("<~@40 A B@2 C@2 D E@2 F@2 G H@2 I@2 D E@2 F@2 J>".pickRestart({
  A: "~@20 f#5@2 d5!2",
  B: "[~ d5 ~@2 e5@2 f#5@2 d5!2 ~ d5 ~ d5 c#5@2 d5@2 e5!2 ~ e5 ~@2 a4@2 c#5@2 e5!2 ~ e5 ~ e5!2 ~ f#5 ~ d5!2 ~ d5 ~@2 e5@2 f#5@2, ~@3 d5@2 ~@18 c#5@2 ~@18 d5@2 ~@3]/2",
  C: "[d5!4 ~ d5@2 ~ a4@2 b4!2 ~ b4 ~@2 b4@2 c#5@2 ~ d5@2 c#5@2 d5@2 ~ f#5@2 d5!2 ~ d5 ~@2 e5@2 f#5@2 d5!2 ~ d5 ~ d5 c#5@2, ~@15 a4@2 ~@3 e5@2 ~@13 d5@2 ~@11]/2",
  D: "d5@2 e5!2 ~ e5 ~@2 a4@2 c#5@2 e5!2 ~ e5 ~ e5!2 ~ f#5 ~ d5!2, ~@7 c#5@2 ~@15",
  E: "[~ d5 ~@2 e5@2 f#5@2 d5!4 ~ d5@2 ~ a4@2 b4!2 ~ b4 ~@2 b4@2 c#5@2 ~ d5@2 c#5@2 d5@2 ~ f#5@2 a5!2 ~ f#5@2 a5!2 ~ f#5@2, ~@3 d5@2 ~@18 a4@2 ~@3 e5@2 ~@18]/2",
  F: "[a5 f#5@2 e5@2 ~ e5@2 f#5@2 g5!2 ~ g5@2 ~ g5@2 e5@2 c#5!2 ~ c#5@2 c#5@2 ~ f#5@2 a5!2 ~ f#5@2 a5!2 ~ f#5@2 a5 f#5@2 e5@2 ~ e5@2, ~@5 d5@2 ~@8 b5@2 ~@28 d5@2 ~]/2",
  G: "f#5@2 b4!2 ~ b4@2 ~ b4@2 c#5@2 ~ d5@2 c#5@2 d5@2 ~ f#5@2 a5!2, ~@7 a4@2 ~@3 e5@2 ~@10",
  H: "[~ f#5@2 a5!2 ~ f#5@2 a5 f#5@2 e5@2 ~ e5@2 f#5@2 g5!2 ~ g5@2 ~ g5@2 e5@2 c#5!2 ~ c#5@2 c#5@2 ~ f#5@2 a5!2 ~ f#5@2 a5!2 ~ f#5@2, ~@13 d5@2 ~@8 b5@2 ~@23]/2",
  I: "[a5 f#5@2 e5@2 ~ e5@2 f#5@2 b4!2 ~ b4@2 ~ b4@2 c#5@2 ~ d5@2 c#5@2 d5@2 ~ f#5@2 d5!2 ~ d5 ~@2 e5@2 f#5@2 d5!2 ~ d5 ~ d5 c#5@2, ~@5 d5@2 ~@8 a4@2 ~@3 e5@2 ~@13 d5@2 ~@11]/2",
  J: "f#5@2 b4!2 ~ b4@2 ~ b4@2 c#5@2 ~ d5@2 c#5@2 d5@2 ~@5, ~@7 a4@2 ~@3 e5@2 ~@10",
})).s("gm_acoustic_guitar_steel").gain(0.3)

stack(orchestral_harp, violin, accordion, whistle, bass, acoustic_guitar_steel)