Strudelify
KeyB♭ majorTempo110 bpm
0:00/0:00
// Oceano — Roberto Cacciapaglia
// 110 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Transcription provider: pdmx. https://musescore.com/score/5002098; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 113 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(110/4)

// 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 · piano
const piano = note(`<
  A@5 B@4 C D E F G H I J C K L M N O P Q R S T M N O U V W X Y Z AA AB AC V AD AE AF AG AH AI AJ AK@2 AL AM AN AO AP AQ
  AR AS AT AU AV AW AX AY AZ BA R S T M N O U V AD AE AF AG AH AI AJ BB ~@4 AH AI AJ BB AD AE AF AG AH AI AJ AK@2 BC BD
  BC BD BC BD BE BF BG@6
>`.pickRestart({
  A: "[~@34 d5@6 ~@19 a4@6 ~@19 eb5@6 ~@19 f5@6 [f3,c5]@5, ~@15 [g3,d4]@25 ~@13 [d3,d5]@13 ~@5 [bb2,a4]@19 [bb2,d5]@25 ~@5, ~@21 [d3,g4]@19 ~@6 [a2,e5]@19 [eb3,g4]@25 ~@7 f3@18 ~@5, ~@27 [g2,bb4]@13 [d2,f5]@25 ~@13 [eb2,bb4]@13 ~@12 bb3@13 ~@4]/5", // F5 G5 D Bbmaj7 Bb G5 A5 Eb …
  B: "[~@14 c5@6 ~@19 f4@6 ~@20 a4@6 ~@12 g3@13, ~@2 [c3,bb4]@19 ~@6 [d3,a4]@19 [eb3,g4]@25 ~@6 d3@19, ~@8 [f2,a4]@13 [g2,bb4]@25 ~@6 bb2@19 [g2,g4]@25, ~@33 [g3,g4]@13 ~@12 [eb2,bb4]@13 ~@25]/4", // C7 D5 Eb F Gm G Eb5
  C: "~@11 d3, d4@5 g3, g2@4 g3 d3 [g2,bb4]@6, ~ d3@2 bb3@4 d3 g3 [bb3,d5]@3, ~@2 g3 g4@9", // Gm Bb
  D: "~@11 a2, f5@5 d3, d2@4 d3 a2 [d2,d5]@6, ~ a2@2 f3@4 a2 d3 [f3,a4]@3, ~@2 d3 e5@9", // D F
  E: "~@11 bb2, g4@5 eb3, eb2@4 eb3 bb2 [eb2,bb4]@6, ~ bb2@2 g3@4 bb2 eb3 [g3,eb5]@3, ~@2 eb3 a4@9", // Eb5 Cm
  F: "~@11 f3, d5, bb2@5 f3 bb2@6, ~ f3@3 bb3@3 f3@3 bb3@2, ~@2 bb3 d4@5 bb3 [d4,f5]@3", // Dm
  G: "~@11 c3, c5@7 c3@3 f3@2, f2@4 f3 c3 [f2,a4]@6, ~ c3@2 a3@5 f3 [a3,c5]@3, ~@2 f3 bb4@9", // F Am
  H: "~@11 d3, bb4@5 g3, g2@4 g3 d3 [g2,g4]@6, ~ d3@2 bb3@4 d3 g3 [bb3,f4]@3, ~@2 g3 a4@9", // G Bb5
  I: "~@11 bb2, g4, eb2@5 bb2 [eb2,bb4]@6, ~ bb2@3 eb3@3 bb2@3 eb3@2, ~@2 eb3 g3@5 eb3 [g3,a4]@3", // Eb5 Gsus2
  J: "~@11 d3, g4, g2@5 d3 g2@6, ~ d3@3 g3@3 d3@3 g3@2, ~@2 g3 bb3@5 g3 bb3@3",
  K: "~@11 a3, f5@5 d4, d3@4 d4 a3 [d3,d5]@6, ~ a3@2 f4@4 a3 d4 [f4,a4]@3, ~@2 d4 e5@9", // D F
  L: "~@11 bb2, g4@7 bb2@3 eb3@2, eb2@4 eb3 bb2 [eb2,bb4]@6, ~ bb2@2 g3@5 eb3 [g3,g4,eb5]@3, ~@2 eb3 a4@9", // Eb5 Cm
  M: "~@11 f3, [f4,d5], bb2@5 f3 bb2@6, ~ f3@3 bb3@3 f3@3 bb3@2, ~@2 bb3 d4@5 bb3 [d4,f5]@3", // Dm
  N: "~@11 c3, f4@5 f3, c5@4 f3 c3 [f2,a4]@6, f2@3 a3@4 c3 f3 [a3,c5]@3, ~ c3 f3 bb4@9", // F Am
  O: "~@11 d3, [d4,bb4]@5 g3, g2@4 g3 d3 [g2,g4]@6, ~ d3@2 bb3@4 d3 g3 [bb3,f4]@3, ~@2 g3 a4@9", // Gm G Bb5
  P: "~@11 bb2, g4@5 eb3, eb2@4 eb3 bb2 [eb2,eb5]@6, ~ bb2@2 g3@4 bb2 eb3 [g3,f5]@3, ~@2 eb3 bb4@9", // Eb G7
  Q: "~@11 d3, [bb4,g5], g2@5 d3 g2@6, ~ d3@3 g3@3 d3@3 g3@2, ~@2 g3 bb3@5 g3 bb3@3", // Eb
  R: "~@11 d3, [g2,bb4,g5]!2, ~ d3@4 d3@2 d3@4 ~, ~ g3 g3@2 g3!2, ~ [bb3,g4,d5]@2 [bb3,g4,d5]", // Gm
  S: "~@11 a2, f5@5 d3, a4@4 d3 a2 [d2,d5]@6, d2@3 f3@4 a2 d3 [f3,f4,a4]@3, ~ a2 d3 e5@9", // D F
  T: "~@11 bb2, g4@7 bb2@3 eb3@2, [eb2,bb4]@4 eb3 bb2 [eb2,bb4,d5]@6, ~ bb2@2 g3@5 eb3 [g3,g4,eb5]@3, ~@2 eb3 [a4,c5]@9", // Eb5 Ebmaj7 Cm Am
  U: "~@11 bb2, [eb4,g4], eb2@5 bb2 [eb2,bb4]@6, ~ bb2@3 eb3@3 bb2@3 eb3@2, ~@2 eb3 g3@5 eb3 [g3,a4]@3", // Eb Eb5 Gsus2
  V: "~@11 d3, [d4,g4], g2@5 d3 g2@6, ~ d3@3 g3@3 d3@3 g3@2, ~@2 g3 bb3@5 g3 bb3@3", // G5
  W: "~@11 [d3,bb4], [g2,g5]!2, ~ [d3,bb4]@4 [d3,bb4]@2 [d3,bb4]@4 ~, ~ [g3,d5] [g3,d5]@2 [g3,d5]!2, ~ [bb3,g4]@2 [bb3,g4]", // Gm G Gm G5 Eb
  X: "~@11 [a2,a4], [d2,f5]!2, ~ [a2,a4]@2 [a2,a4]@2 [a2,a4]@2 [a2,a4]@2 [a2,a4]@2 ~, ~ [d3,e5]@3 [d3,e5]@2, ~@2 [f3,d5]@3 [f3,d5]", // A Dm A Dsus2 Dm
  Y: "~@11 [bb2,g4], [eb2,eb5]!2, ~ [bb2,g4]@4 [bb2,g4]@2 [bb2,g4]@4 ~, ~ [eb3,bb4] [eb3,bb4]@2 [eb3,bb4]!2, ~ [g3,eb4]@2 [g3,eb4]", // Eb Eb5 Cm
  Z: "~@11 [f3,f4], [bb2,d5]!2, ~ [f3,f4]@2 [f3,f4]@2 [f3,f4]@2 [f3,f4]@2 [f3,f4]@2 ~, ~ [bb3,c5]@3 [bb3,c5]@2, ~@2 [d4,bb4]@3 [d4,bb4]", // F Bb F Bbsus2 Gm
  AA: "~@11 [c3,f4], [f2,c5]!2, ~ [c3,f4]@4 [c3,f4]@2 [c3,f4]@4 ~, ~ [f3,a4] [f3,a4]@2 [f3,a4]!2, ~ [a3,c4]@2 [a3,c4]", // F5 F Am
  AB: "~@11 [d3,d4], [g2,bb4]!2, ~ [d3,d4]@2 [d3,d4]@2 [d3,d4]@2 [d3,d4]@2 [d3,d4]@2 ~, ~ [g3,a4]@3 [g3,a4]@2, ~@2 [bb3,g4]@3 [bb3,g4]", // D Gm D Gsus2 Eb
  AC: "~@11 [bb2,eb4], [eb2,bb4]!2, ~ [bb2,eb4]@4 [bb2,eb4]@2 [bb2,eb4]@4 ~, ~ [eb3,g4] [eb3,g4]@2 [eb3,g4]!2, ~ [g3,bb3]@2 [g3,bb3]", // Eb5 Eb Gm
  AD: "~@11 [d3,bb5], [g2,g6]!2, ~ [d3,bb5]@4 [d3,bb5]@2 [d3,bb5]@4 ~, ~ [g3,d6] [g3,d6]@2 [g3,d6]!2, ~ [bb3,g5]@2 [bb3,g5]", // Gm G Gm G5 Eb
  AE: "~@11 [a3,a5], [d3,f6]!2, ~ [a3,a5]@2 [a3,a5]@2 [a3,a5]@2 [a3,a5]@2 [a3,a5]@2 ~, ~ [d4,e6]@3 [d4,e6]@2, ~@2 [f4,d6]@3 [f4,d6]", // A Dm A Dsus2 Dm
  AF: "~@11 [bb3,g5], [eb3,eb6]!2, ~ [bb3,g5]@4 [bb3,g5]@2 [bb3,g5]@4 ~, ~ [eb4,bb5] [eb4,bb5]@2 [eb4,bb5]!2, ~ [g4,eb5]@2 [g4,eb5]", // Eb Eb5 Cm
  AG: "~@11 [f3,f5], [bb2,d6]!2, ~ [f3,f5]@2 [f3,f5]@2 [f3,f5]@2 [f3,f5]@2 [f3,f5]@2 ~, ~ [bb3,c6]@3 [bb3,c6]@2, ~@2 [d4,bb5]@3 [d4,bb5]", // F Bb F Bbsus2 Gm
  AH: "~@11 [c3,f5], [f2,c6]!2, ~ [c3,f5]@4 [c3,f5]@2 [c3,f5]@4 ~, ~ [f3,a5] [f3,a5]@2 [f3,a5]!2, ~ [a3,c5]@2 [a3,c5]", // F5 F Am
  AI: "~@11 [d3,d5], [g2,bb5]!2, ~ [d3,d5]@2 [d3,d5]@2 [d3,d5]@2 [d3,d5]@2 [d3,d5]@2 ~, ~ [g3,a5]@3 [g3,a5]@2, ~@2 [bb3,g5]@3 [bb3,g5]", // D Gm D Gsus2 Eb
  AJ: "~@11 [bb2,eb5], [eb2,bb5]!2, ~ [bb2,eb5]@4 [bb2,eb5]@2 [bb2,eb5]@4 ~, ~ [eb3,g5] [eb3,g5]@2 [eb3,g5]!2, ~ [g3,bb4]@2 [g3,bb4]", // Eb5 Eb Gm
  AK: "[~@11 d3 g2@12, [d5,g5], g2@5 d3 g2@6 ~@12, ~ d3@3 g3@3 d3@3 g3@2 ~@12, ~@2 g3 bb3@5 g3 bb3@3 ~@12]/2", // G5
  AL: "~@3 d5, [g3,d4], ~ [d3,g4]@3, ~ [g2,bb4]", AM: "~@3 a4, [d2,f5], ~ [a2,e5]@3, ~ [d3,d5]",
  AN: "~@3 eb5, [eb3,g4], ~ [bb2,a4]@3, ~ [eb2,bb4]", AO: "~@3 f5, [bb2,d5], ~ f3@3, ~ bb3",
  AP: "~@3 c5, f3, c5@3 ~, ~ [c3,bb4]@3, ~ [f2,a4]", AQ: "~@3 f4, [g2,bb4], ~ [d3,a4]@3, ~ [g3,g4]",
  AR: "~@3 a4, [eb3,g4], ~ bb2@3, ~ [eb2,bb4]", AS: "~ g3, [g2,g4], ~ d3@3",
  AT: "~@3 g4, [g1,g2,g3], d4 [d4,bb4], ~ g4@2 ~", AU: "~@3 d4, [d2,d3,a4,f5], ~ e4@3, ~ [f4,d5]",
  AV: "eb4 ~@2 eb4, [eb2,eb3], g4 [g4,eb5], ~ eb4@2 ~", AW: "f4 ~ bb4@2, [bb1,bb2,d5], bb4 ~, ~ f4@3",
  AX: "~@3 c5, [f2,f3,f4], c5@3 ~, ~ bb4@3, ~ [c4,a4]", AY: "~@3 f4, [g2,g3,d4,bb4], ~ a4@3, ~ [bb3,g4]",
  AZ: "eb4!4, [eb2,eb3,g4], ~ bb4", BA: "~ g4, [g1,g2,g3], ~ d4@3",
  BB: "~@11 d3, [d5,g5], g2@5 d3 g2@6, ~ d3@3 g3@3 d3@3 g3@2, ~@2 g3 bb3@5 g3 bb3@3", // G5
  BC: "~@3 a5, [g3,g4], ~ [d3,d5]@3, ~ [g2,g5]", BD: "~@3 a4, [eb2,bb5], ~ [bb2,eb5]@3, ~ [eb3,bb4]",
  BE: "~@3 ab5, [gb3,bb4], ~ [db3,db5]@3, ~ [gb2,gb5]", BF: "[bb1,bb5]",
  BG: "[~@23 bb3@2 ~@23 bb3@2 ~@24 bb3@9 [bb1,bb5]@50 ~@11, bb2@19 d4@2 f4@4 ~@2 f3@17 d4@2 f4@4 ~@2 f3@18 d4@2 f4@11 ~@61, ~@2 f3@23 bb2@25 bb2@33 ~@61, ~@4 bb3@11 f4@2 bb4@8 ~@4 bb3@11 f4@2 bb4@8 ~@5 bb3@11 f4@2 bb4@15 ~@61, ~@6 d4@2 f4@2 bb4@3 d5@13 ~@5 d4@3 f4@2 bb4@2 d5@13 ~@6 d4@2 f4@2 bb4@2 d5@20 ~@61]/6", // Bb
})).s("gm_piano").gain(0.3)

stack(piano)