Strudelify
KeyB♭ majorTempo60 bpm
0:00/0:00
// brown eyes — Stefani Germanotta and Rob Fusari
// 60 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 12, 4/4 at bar 12, 2/4 at bar 31, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: sustain pedal (CC 64) lengthens the held notes
// note: Transcription provider: pdmx. https://musescore.com/score/6169111; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 60 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(60/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 B A C D E F G D H F I@2 J@2 K@2 L@2 M N@2 O@3 P@7 Q R Q S T@4 U V W X Y Z AA AB AC@5 AD AE@4 AF AG
>`.pickRestart({
  A: "~@15 ab3, [bb1,bb2,bb3]@13 d4 f3@2, f4@3 f3@3 c4@2, [f3,d4]@5 d4@3 f4@8, ~@4 c4@3 a3@9", // Bb Dm
  B: "[ab1,ab2,c4,eb4]@2 [f2,f3]@2 ~@2 [eb3,g3,bb3]@6 ~@3 bb3, ~@6 eb2@7 f3@2 ~, ~@6 eb3 eb2", // Ab F Eb
  C: "[c4,eb4]@2 f3@2 ~@2 [g3,bb3]@8 c4 bb3", // Cm Gm
  D: "[f3,bb3,c4]@2 ~@5 f2 bb1@2 bb1@5 bb3, [bb1,bb2]@7 ~@9, ~ [f3,bb3,d4]@6 ~", // Fsus4 Bb
  E: "[a3,d4,f4]@2 g4 ~@4 f2 a1@2 ~@4 bb3!2, [a1,a2]@7 ~@3 a1@6, ~@3 [a3,d4]@10 ~@3", // Dm A D5
  F: "[ab3,c4,f4]@2 eb4@5 eb2 ab1@2 ab1@5 bb3, [ab1,ab2]@7 ~ eb4@7 ~, ~ [ab3,c4]@6 ~", // Fm Ab
  G: "[g3,bb3,f4] eb4@2 ~ eb2@3 bb2 eb2@2 ~@4 c4 bb3, eb2@3 [g3,bb3,eb4]@10 ~@3, ~@5 eb2@3", // Gm7 Eb
  H: "[a3,d4,f4] g4@2 ~@4 f2 a1@2 a1@5 bb3, [a1,a2]@7 ~@9, ~@3 [a3,d4]@11 ~@2", // Dm A D5
  I: "[[g3,bb3,f4] eb4@2 [g3,bb3,eb4] d4@2 eb2 f2 gb2@2 ~@2 eb4 d4@2 ~ gb2@2 gb2@2 gb2@3 d4 [d4,f4,c5] bb4@2 bb4 bb2@2 ~ d4, eb2@6 eb4@6 ~@3 f4@8 ~@4 [d4,f4]@4 ~, ~@2 [gb3,bb3] ~@5, ~@5 gb2@3 ~@4 [bb1,bb2]@2 ~ bb1]/2", // Gm7 Eb Dm7 Dm Gb Bb
  J: "[[a3,d4,a4] g4@2 ~ d3@2 ~ bb3 [g3,bb3,f4] eb4@2 ~@11 f2@2 [d4,f4,c5] bb4@2 bb4 bb2@2 ~ d4, g2@3 [a3,d4]@3 g2@2 eb2@3 [g3,bb3,eb4]@2 d4@2 [f3,a3,d4]@2 c4@7 ~@3 [d4,f4]@4 ~, ~@6 bb2 eb2 f2@3 ~ [bb1,bb2]@2 ~ bb1, ~@5 eb3 ~@2]/2", // D5 Gm7 Dm7 D5 Eb Dm Bb
  K: "[[a3,d4,a4] g4@2 ~ d3@2 ~ bb3 [g3,bb3,f4] eb4@2 ~@11 a2@2 [d4,f4,c5] bb4@2 ~ bb2@2 ~ d4, g2@3 [a3,d4]@3 g2@2 eb2@3 [g3,bb3,eb4]@2 d4@2 [f3,a3,d4]@2 c4@7 ~@3 [d4,f4]@4 ~, ~@6 bb2 eb2 a2@3 ~ [bb1,bb2]@2 ~ bb1, ~@5 eb3 ~@2]/2", // D5 Gm7 Dm7 D5 Eb Dm Bb
  L: "[[a3,d4,a4] g4@2 ~ d3@2 bb3 ~@8 bb2 eb2@2 ~ bb3 a4 g4@2 ~@3 [gb3,bb3,c4]@6, g2@3 [a3,d4]@3 g2@2 eb2@7 ~@3 eb2@6 gb2@8, ~@7 [g3,d4]@2 [g3,bb3,c4]@9 ~@5 [gb3,bb3,d4]@3 ~@6]/2", // D5 Cm7b5 D5 G5 C7 Gbaug
  M: "gb2@2 bb3!2 c4@2 ~@2 [bb1,bb2,f3]@4 ~@2 f3 g3, ~ gb2@3 ~@2 bb2@2, ~@3 d4@3 ~@2", // Bb5
  N: "[[f3,bb3]@2 [f3,c4]@2 [f3,d4] c4 bb3@2 [ab1,ab2,ab3,c4]@2 [f2,g3]@2 ~@2 eb2@6 eb3@4 [bb1,bb2]@4 ~@2 c4 bb3, [a1,a2]@4 a2@4 ~@6 [g3,bb3]@9 ~@5 bb2@4]/2", // Bb5 F5 Dm Ab Fsus2 Bb A Gm
  O: "[[a3,d4]@2 f4@2 db4 c4 bb3@2 [ab1,ab2,ab3,c4]@2 [f2,g3]@2 ~@2 eb2@4 eb3@4 c4 bb3 [f3,bb3,c4]@2 ~@5 f2 bb1@2 bb1@5 bb3 [a3,d4,f4]@2 g4 [a3,d4]@4 f2, ~@14 [g3,bb3]@8 ~@2 [bb1,bb2]@7 ~@9 [a1,a2]@7 ~, ~@13 [f3,bb3,d4]@6 ~@5]/3", // D5 Ab Fsus2 Fsus4 Dm D5 Gm Bb …
  P: "[a1@2 ~@4 bb3!2 [ab3,c4,f4]@2 eb4@5 eb2 ab1@2 ab1@5 bb3 [g3,bb3,f4] eb4@2 ~ eb2@3 bb2 eb2@2 ~@4 c4 bb3 [f3,bb3,c4]@2 ~@5 f2 bb1@2 bb1@5 bb3 [a3,d4,f4] g4@2 ~@4 f2 a1@2 a1@5 bb3 [ab3,c4,f4]@2 eb4@5 eb2 ab1@2 ab1@5 bb3 [g3,bb3,f4] eb4@2 [g3,bb3,eb4] d4@2 eb2 f2 gb2@2 ~@2 eb4 d4@2 ~ gb2@2 gb2@2 gb2@3 d4, ~@2 a1@6 [ab1,ab2]@7 ~ eb4@7 ~@4 [g3,bb3,eb4]@10 ~@5 [f3,bb3,d4]@12 ~@5 [a3,d4]@11 ~@4 [ab3,c4]@12 ~@2 eb2@6 ~@2 [gb3,bb3]@4 ~@12, ~@10 [ab3,c4]@12 ~@2 eb2@4 ~@6 eb2@6 [bb1,bb2]@7 ~@9 [a1,a2]@7 ~@9 [ab1,ab2]@7 ~ eb4@7 ~@7 eb4@6 ~@3 f4@8 ~, ~@49 gb2@3 ~@4]/7", // Fm Gm7 Fsus4 Dm Fm Gm7 Eb Ab …
  Q: "[d4,f4,c5] bb4@2 bb4 bb2@2 ~ d4 [a3,d4,a4] g4@2 ~ d3@2 ~ bb3, [bb1,bb2]@3 [d4,f4]@3 bb1@2 g2@3 [a3,d4]@3 g2@2", // Dm7 D5 Bb Dm D5
  R: "[g3,bb3,f4] eb4@2 ~@11 f2@2, eb2@3 [g3,bb3,eb4]@2 d4@2 [f3,a3,d4]@2 c4@7, ~@2 bb2 eb2 f2@3 ~, ~@3 eb3", // Gm7 Eb Dm
  S: "[g3,bb3,f4] eb4@2 ~@11 a2@2, eb2@3 [g3,bb3,eb4]@2 d4@2 [f3,a3,d4]@2 c4@7, ~@2 bb2 eb2 a2@3 ~, ~@3 eb3", // Gm7 Eb Dm
  T: "[[d4,f4,c5] bb4@2 ~ bb2@2 ~ d4 [a3,d4,a4] g4@2 ~ d3@2 bb3 ~@8 bb2 eb2@2 ~ bb3 a4 g4@2 ~@3 [gb3,bb3,c4]@6 gb2@2 bb3!2 c4@2 ~@2 [bb1,bb2,f3]@4 ~@2 f3 g3 [f3,bb3]@2 [f3,c4]@2 [f3,d4] c4 bb3@2, [bb1,bb2]@3 [d4,f4]@3 bb1@2 g2@3 [a3,d4]@3 g2@2 eb2@7 ~@3 eb2@6 gb2@8 ~@2 gb2@6 ~@4 bb2@4 [a1,a2]@4 a2@4, ~@15 [g3,d4]@2 [g3,bb3,c4]@9 ~@5 [gb3,bb3,d4]@3 ~@12 d4@6 ~@12]/4", // Dm7 D5 Cm7b5 Bb5 F5 Dm Bb Dm …
  U: "[ab1,ab2,ab3,c4] [f2,g3] ~ eb2@3 eb3@2, ~@6 [g3,bb3]@9 ~", // Ab Fsus2 Gm
  V: "[bb1,bb2]@4 ~@2 c4 bb3 [a3,d4]@2 f4@2 db4 c4 bb3@2, ~ bb2 ~@2", // Bb D5
  W: "[ab1,ab2,ab3,c4] [f2,g3] ~ eb2@3 eb2@2, ~@6 [g3,bb3]@9 ~", // Ab Fsus2 Gm
  X: "[d4,f4,c5] bb4@2 ~ bb2@2 ~ d4 [a3,d4,a4] g4@2 ~ d3@2 ~ bb3, [bb1,bb2]@3 [d4,f4]@3 bb1@2 g2@3 [a3,d4]@3 g2@2", // Dm7 D5 Bb Dm D5
  Y: "[g3,bb3,f4]@2 eb4 ~ bb2@2 [eb2,d4] f2 ~@6 gb2@2, eb2@3 [g3,bb3,eb4]@3 ~ [eb3,a3,d4]@2 c4@7, ~@4 gb2@3 ~, ~@3 [eb3,a3]", // Gm7 Ebmaj7 Eb D Ebdim
  Z: "[d4,f4,c5] bb4@2 ~ bb2@2 d4!2 [a3,d4,a4] g4@2 ~ d3@2 bb3!2, [bb1,bb2]@3 [d4,f4]@3 bb1@2 g2@3 [a3,d4]@3 g2@2", // Dm7 D5 Bb Dm D5
  AA: "[g3,bb3,f4]@2 eb4 ~ bb2@2 d4 ~@7 d4!2, eb2@3 [g3,bb3,eb4]@3 eb2@2 f2@4 a2@4, ~@7 [f3,a3,d4]@3 [eb3,a3,c4]@4 ~@2", // Gm7 Eb Dm Adim
  AB: "[d4,f4,c5]@2 ~@2 bb2@2 d4!2 [a3,d4,c5]@2 ~@2 d3@2 d4!2, [bb1,bb2]@2 ~ bb1 g2@2 ~ g2, ~ [d4,f4,bb4]@2 ~@2 [a3,d4,bb4]@2 ~", // Dm7 D7 Bb Bbmaj7
  AC: "[[eb4,g4,c5]@2 [eb4,g4,bb4]@2 [eb4,g4,bb4] ~@4 [eb3,a3,c4]@3 d4 eb4@2 ~ bb1@3 c4 [d3,gb3,a3,d4]@2 c4 a2 f2@2 ~ bb3 [gb3,a3,d4] eb4@2 ~ eb2@4 ~@2 eb2 f2 ~@2 bb3!2 db4@2 ~@2 [bb1,bb2]@2 bb1@2 [bb2,eb3,eb4]@3 d4 [g2,g3,bb3]@2 bb3!2 [g3,db4]@3 ~ eb2@2 eb2@2 [eb3,eb4]@3 d4 gb2@2 gb2@2 [eb3,eb4]@3 d4, eb2@4 bb2@2 eb2@2 f2@4 f2@4 ~@10 f2@2 ~@3 [g3,a3]@9 ~@6 ab3@6 ~@11 ab3@5 ~@4 [gb3,bb3,c4]@4 ~@4, ~@5 a4@2 [f3,a3,d4]@2 ~@6 [gb3,a3,c4]@4 ~@4 [gb3,a3,c4]@4 ~ d3@3 eb3@5 eb3@4 gb2@4 ~@14 g2@2 ~@20]/5", // Cm Eb Adim D Bb Eb5 Gm Gdim …
  AD: "bb1@2 bb1@2 [f3,bb3,c4] d4 [f3,bb3,c4] d4 [g2,g3,bb3,f4]@2 [g2,d4]@2 [g3,bb3,c4] d4 [g3,bb3,c4] d4, [f3,bb3] bb2 ~ d3", // Fsus4 Gm7 G5 C7 Bb5
  AE: "[[eb2,g3,bb3,eb4]@2 eb2@2 ~@2 [gb3,bb3]@2 ~@3 bb3 [gb3,c4]@2 ~@2 bb1@2 bb1@2 [f3,bb3,c4] d4 [f3,bb3,c4] d4 [g2,g3,bb3,f4]@2 [g2,d4]@2 [g3,bb3,c4] d4 [g3,bb3,c4] d4, ~@2 d4@4 ~@3 [gb3,c4]@2 ~ eb3@4 [f3,bb3]@4 bb2@4 ~@4 d3@4, ~@2 eb3@2 gb2!2 ~ d4@3 ~@6]/2", // Eb Gb Gbdim Fsus4 Gm7 G5 C7 Gbdim …
  AF: "[eb2,g3,bb3,eb4]@2 eb2@2 ~@2 [gb3,bb3]@2 ~@3 bb3 [gb3,c4]@2 d4@2, ~@2 d4@4 ~@3 [gb3,c4]@2 ~ eb3@4, ~@2 eb3@2 gb2!2 ~@2", // Eb Gb Gbdim
  AG: "[bb1,bb2,d3,f3,bb3]@15 ~", // Bb
})).s("gm_piano").gain(0.3)

stack(piano)