Strudelify
KeyB♭ majorTempo80 bpm
0:00/0:00
// Aloha oe — Queen Liliuokalani
// 80 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (1/4 at bar 1, 4/4 at bar 2) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/1217896; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 25 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(80/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// other · tremolo strings · "Violin"
const tremolo_strings = note("<~@4 A B C D E B F G H I J K L I J K L I J M N>".pickRestart({
  A: "~@6 f4 bb4", B: "d5@6 c5@2 bb4@3 a4 bb4@2 g4@2", C: "f4@3 d5", D: "c5 c5@2 b4 c5!2 eb5 d5", E: "c5@6 f4 bb4",
  F: "f4@6 bb4 a4", G: "g4@2 c5 bb4 a4!2 d5 c5", H: "bb4@6 ~ f4", I: "g4@2 bb4@2 eb5@3 g4", J: "f4@2 bb4@2 d5@3 bb4",
  K: "a4@3 g4 a4@2 bb4@2 c5@2 c5@2 eb5@2 eb5@2", L: "d5@4 bb4@3 f4", M: "a4@3 bb4 d5 c5@2 a4", N: "bb4@3 ~",
})).s("gm_tremolo_strings").gain(0.3)

// chords · piano
const piano = note("<A B C D E F G H I F G J G K L M N K L M N K L M O>".pickRestart({
  A: "~@6 f4 bb4",
  B: "bb2@2 f3@2 ~@2 c5@2 [eb2,bb4]@2 ~ a4 bb4@2 g4@2, [f4,bb4]@4 g4@3 ~, d5@3 ~@2 bb2 g3@2, ~ d4 eb4@2", // Eb5 Bb5
  C: "bb2 f3 ~@2 bb2 f3 bb4 a4, f4@11 ~@5, d4@4 d4@7 ~ d4@4",
  D: "eb2@2 bb2@2 c5@2 bb4@2 [f2,a4]@2 [c3,a4]@2 [a3,d5]@3 c5, [bb3,eb4] [c4,eb4], g4 g3 ~@2", // F D5 Eb5 Cm
  E: "bb2 f3 ~@2 bb2 f3 d4@2, [f4,bb4]@11 ~@5, d4@4 d4@7 ~@5", F: "bb2 f3 [d4,f4,bb4]@2 eb2 eb3 [eb4,g4,bb4]@2",
  G: "bb2 f3 [d4,f4,bb4]@2 bb2 f3 [d4,f4,bb4]@2", H: "f2 f3 [c4,f4,a4]@2 f2 f3 [c4,f4,a4]@2",
  I: "f2 f3 [c4,f4,a4]@2 f2 f3 [c4,eb4,f4]@2", J: "eb2 eb3 [eb4,g4,bb4]@2 f2 f3 [eb4,f4,a4]@2",
  K: "[eb2,g4] [bb2,eb4] [g3,bb3] [bb2,eb4] [eb2,g4] [bb2,eb4] [g3,bb3] [bb2,eb4]", // Eb Eb5 Gm Eb5 Eb Eb5 Gm Eb5
  L: "[bb1,f4] [f2,bb3] [d3,f3] [f2,bb3] [bb1,f4] [f2,bb3] [d3,f3] [f2,bb3]", // Bb5 Dm Bb5 Dm Bb5
  M: "[f2,a4] [c3,eb4] [f3,a3] [c3,eb4] [f2,a4] [c3,eb4] [f3,a3] [c3,eb4]", // F Cm F Cm F Cm F Cm
  N: "[bb1,bb4] [f2,f4] [d3,bb3] [f2,f4] [bb1,bb4] [f2,f4] [d3,bb3] [f2,f4]", // Bb F Gm F Bb F Gm F
  O: "[bb1,bb4] [f2,f4] [d3,bb3] [f2,f4] [bb1,f2,d4,bb4]@2 ~@2", // Bb F Gm F Bb
})).s("gm_piano").gain(0.3)

// other · viola
const viola = note("<A B C D E F G H I F G J G K L M N K L M N K L M O>".pickRestart({
  A: "~@6 f4 bb4", B: "d5@6 c5@2 bb4@3 a4 bb4@2 g4@2", C: "f4@6 bb4 a4", D: "g4@4 c5@2 bb4@2 a4@2 a4@2 d5@3 c5",
  E: "[d4,bb4]@3 ~", F: "~ [d4,bb4] ~ [g4,bb4]", G: "~ [d4,bb4] ~ [d4,bb4]", H: "~ [c4,a4] ~ [c4,a4]",
  I: "~ [c4,f4,a4] ~ [c4,f4]", J: "~ [eb4,g4,bb4] ~ [f4,a4]", K: "g4 eb4 bb3 eb4 g4 eb4 bb3 eb4",
  L: "f4 bb3 f3 bb3 f4 bb3 f3 bb3", M: "a4 eb4 a3 eb4 a4 eb4 a3 eb4", N: "bb4 f4 bb3 f4 bb4 f4 bb3 f4",
  O: "bb4 f4 bb3 f4 [d4,bb4]@2 ~@2", // Gm
})).s("gm_viola").gain(0.3)

// other · cello · "Violoncello"
const cello = note("<~ A B C B D E F@2 D E G E H I J I H I J I H I J K>".pickRestart({
  A: "bb2 f3 d4@2 eb2 bb2 g3@2", B: "bb2 f3 d4@2 bb2 f3 d4@2", C: "eb2 bb2 g3@2 f2 c3 a3@2",
  D: "bb2 f3 ~@2 eb2 eb3 ~@2", E: "bb2 f3 ~@2 bb2 f3 ~@2", F: "f2 f3 ~@2 f2 f3 ~@2", G: "eb2 eb3 ~@2 f2 f3 ~@2",
  H: "eb2 bb2 g3 bb2 eb2 bb2 g3 bb2", I: "bb2 f2 d3 f2 bb2 f2 d3 f2", J: "f2 c3 f3 c3 f2 c3 f3 c3",
  K: "bb2 f2 d3 f2 [f2,bb2]@2 ~@2", // Bb5
})).s("gm_cello").gain(0.3)

stack(tremolo_strings, piano, viola, cello)