Strudelify

Blueming

Ben Truong

KeyC majorTempo210 bpm
0:00/0:00
// Blueming — Ben Truong
// 210 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 75, 4/4 at bar 76) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/5914251; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 190 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(210/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 · acoustic guitar nylon · "Guitar [Tablature]"
const acoustic_guitar_nylon = note(`<
  A B C D A B E F G H I J K L M N G H I J K L O P Q R S T U R S V W X Y Z AA AB@2 AC AD AE AF@2 AG AH AI@2 AJ AE AF@2 AG
  AK@2 AL AM AN AO@2 AP AN AO@2 AP AN AQ@2 AR AS AT AU A AV ~ AW@2 AX AY AZ BA BB BC AW@2 AX AY BD BE BB BF BG BH BI BJ
  BK BL BI BM BN BO BP BQ BR@2 BS BT BU@2 BV BW BX BY BZ CA CB@2 BV BW BX CC CD CE CF CG CH CI CJ CG CH CI CJ CG CK CL
  CM@2 CN CO CP CQ CR CS CT CU CV CW CX CY CZ DA DB DC DD BT DE@4 DF BY DG@2 DH@2 BV BW BX CC CD CE CF CG CH CI CJ CG CH
  CI CJ CG DI CL CM@2 CN DJ DK DL DM
>`.pickRestart({
  A: "f3@2 g3 c4 ~@2 e3@2", B: "g3 c4 ~@6", C: "g2@2 d3 b3 ~@2 a2@2", D: "e3 c4 ~@6", E: "g2@2 d3 b3 ~@4",
  F: "~@2 g4 c4", G: "[f3,d4]@2 g3 d4@2 c4 d4@2", H: "[e3,e4]@2 g3 c4 ~@2 d3@2",
  I: "[g2,d4]@2 g3 d4 ~ [g3,d4] ~ [g3,d4]", J: "a2@2 e4@4 g3@2 d#4 d4@3 c4@4", K: "f3@2 g3!2 [c4,e4]@2 g4@2",
  L: "e3@2 e3 g3 e4 d4 e4 d4", M: "g2@2 d3 [g3,b3] ~@2 a2@2", N: "e3 [g3,c4] ~@2 g4@2 c4@2", O: "g2@2 d3 [g3,b3] ~@4",
  P: "~@2 g3 a3 c4@2 e2@2", Q: "[f2,a3,c4]@2 f2 f3 [f3,a3,c4]@2 f2@2", R: "[e2,g3,c4] [c3,e3] c3 e3 [e3,g3,c4]@2 c4@2",
  S: "g2 [d3,g3,c4]!2 c4", T: "d3 e3 c4 d4 [d4,e4]@2 d4 c4, a2 ~@3", U: "[f2,g3,c4]@2 f2 f3 [f3,g3,c4]@2 f2@2",
  V: "d3 e3 a2 e3 [a2,e3,a3]@2 c4@2, a2 ~@3", W: "f2@4 ~ g#4 a4@2 g4@6 a4@2, ~@2 [a3,c4,g4] ~@5",
  X: "[e2,g3,c4]@4 c4@4 ~@2 g3@2 g4 g#4 a4@2", Y: "[g2,b3,d4,g4]@6 a4@2 d4 c#4 c4@2 c4@4, ~@2 [g3,e4] ~",
  Z: "a2@2 a2 e3 [e3,g3,c4]@2 a2@2", AA: "[f2,a3,c4]@3 d4@3 [d4,e4]@2",
  AB: "[f2 [b3,g4]@3 [d3,g3,d4,e4]@2 [g2,b2,d3,g3]@4 [g2,b2,d3,g3,d4]@2 [g2,b2,d3,g3,d4]@2 [g2,b2,d3,g3,d4]@2]/2", // Em Em7 G
  AC: "[g2,b2,d3,g3,d4]@4 ~@5 [f3,f4] ~ [f#3,f#4] [g3,g4]@4, ~@2 [e3,e4] ~", // G F F# G E
  AD: "f3@2 [c4,g4,a4]@3 g3 f3 g3, ~@5 [e4,c5]@3", AE: "d5 d#5 e5@4 c5@2 [c4,e4,g4,c5]@4 d5@4, c3@3 ~@5",
  AF: "[g3@4 ~ d#5 e5 d#5 ~ d5 c#5 ~ [a3,c4,e4,c5]@8 b4@2 c5@2 [a3,c4,e4]@4 c5@4, ~@2 [g3,b3,d5] ~@13]/2", // Am G
  AG: "~@3 c5 [e4,c5]@4 [c4,e4,c5]@4 c5@4, f3 ~@3, ~ c4@3 ~@12, ~ e4 ~@6", AH: "[c3,c5] [e4,a4] [c4,e4,g4] d5",
  AI: "[g3@4 ~ d#5 e5 d#5 ~ d5 c#5 ~ [a3,c4,e4,c5]@8 a2@4 [a3,c4,e4,a4]@4 g4@4, ~@2 [g3,b3,d5] ~@13]/2", // Am G
  AJ: "e3 f3@3 [c4,g4,a4]@6 g3@2 f3@2 g3@2, ~@5 [g4,c5]@3", // Am7 C5
  AK: "[g#4 [c3,a4]@3 [c4,e4,g4]@4 c5 [c4,e4,g4,d5]@3 [g3,b3]@4 [g3,b3]@4 [g3,b3,d5]@4 [g3,b3,d5]@4 [g3,b3,d5]@4, ~@3 d5@2 ~@3]/2", // F C G
  AL: "[g3,b3,d5]@4 ~@5 [f3,f4] ~ [f#3,f#4] [g3,g4]@4, ~@2 [e3,e4] ~", AM: "f3@2 f3 g3 [c4,e4,c5]@2 d5@2",
  AN: "[c3,d5]@2 d#5 d5 [c4,e4,g4,c5]@2 d5@2", // Csus2 C
  AO: "[[g3,d5]@2 d#5 d5 [g3,b3,c5]@2 ~ c5@3 a2@2 [a3,c4,e4,a4]@2 g4@2, ~@3 [a2,a3]@2 ~@3, ~@13 [b3,c4]@7 ~@12]/2", // G5 Cmaj7 Am A Cmaj7
  AP: "e3 f3@3 f3@2 g3@2 [c4,e4,c5]@4 d5@4", // C
  AQ: "[d5 d#5 e5@2 g3@2 g3@2 [b3,c4,c5]@4 [a3,b3,c4,c5]@8 a2@4 [c4,e4,a4]@4 g4@4, [g3,b3] ~@7]/2", // Cmaj7 Am G
  AR: "e3 f3@3 [c4,g4,a4]@6 g3@2 f3@2 g3@2, ~@5 [e4,c5]@3", // Am7 C
  AS: "d5 d#5 e5@2 [g4,c5]@4 c5 ~@2 d5@5, c3 ~ c4@2, ~@9 e4@7, ~@5 g4@3", AT: "[g3,b3,d5]!4",
  AU: "[g3,b3,d5]@4 ~@2 [c4,e4] c5", AV: "g3 c4 ~@2 g2@2 d3 g3",
  AW: "[g4@2 c4@2 [f3,d4]@2 g3 d4@2 c4 d4@2 [e3,e4]@2 g3 c4]/2", AX: "~@2 d3@2 [g2,d4]@2 g3 d4",
  AY: "~ [g3,d4] ~ [g3,d4] a2 e4@2 g3", AZ: "d#4 d4@3 c4@4 f3@4 g3@2 g3@2", BA: "[c4,e4]@2 g4@2 e3@2 e3 g3",
  BB: "e4 d4 e4 d4 g2@2 d3 [g3,b3]", BC: "~@2 a2@2 e3 [g3,c4] ~@2", BD: "d#4 d4@3 c4@4 f3@4 f3@2 c4@2",
  BE: "[c4,e4,c5]@2 b4 a4 [c3,g4]@2 c3 c4", BF: "~@6 g3 a3", BG: "c4@2 e2@2 [f2,a3,c4]@2 f2 f3",
  BH: "[f3,a3,c4]@2 f2@2 [e2,g3,c4] [c3,e3] c3 e3", BI: "[e3,g3,c4] c4 g2 [d3,g3,c4]",
  BJ: "[d3,g3,c4]@2 c4@2 d3 e3 c4 d4, ~@2 a2 ~", BK: "[d4,e4]@2 d4 c4 [f2,g3,c4]@2 f2 f3",
  BL: "[f3,g3,c4]@2 f2@2 [e2,g3,c4] [c3,e3] c3 e3", BM: "[d3,g3,c4]@2 c4@2 d3 e3 a2 e3, ~@2 a2 ~",
  BN: "[a2,e3,a3]@4 c4@4 f2@4 ~ g#4 a4@2, ~@6 [a3,c4,g4] ~", BO: "g4@3 a4 [e2,g3,c4]@2 c4@2",
  BP: "~@2 g3@2 g4 g#4 a4@2 [g2,b3,d4,g4]@6 a4@2", BQ: "d4 c#4 c4@2 c4@4 a2@4 a2@2 e3@2, [g3,e4] ~@3",
  BR: "[[e3,g3,c4]@2 a2@2 [f2,a3,c4]@3 d4@3 [d4,e4]@2 f2 [b3,g4]@3]/2", // C F Dsus2 Em
  BS: "[d3,g3,d4,e4] [g2,b2,d3,g3]@2 [g2,b2,d3,g3,d4]", BT: "[g2,b2,d3,g3,d4]!3 ~",
  BU: "[~ [f3,f4] ~ [f#3,f#4] [g3,g4]@4 f3@4 [c4,g4,a4]@6 g3@2 f3@2 g3@2 d5 d#5 e5@4 c5@2, [e3,e4]@2 ~@7 [e4,c5]@3 c3@3 ~]/2", // F F# G Am7 E C
  BV: "[c4,e4,g4,c5]@4 d5@4 g3@4 ~ d#5 e5 d#5, ~@6 [g3,b3,d5] ~", BW: "~ d5 c#5 ~ [a3,c4,e4,c5]@8 b4@2 c5@2",
  BX: "[a3,c4,e4]@4 c5@4 ~@3 c5 [e4,c5]@4, ~@2 f3 ~, ~@9 c4@3 ~@4, ~@5 e4 ~@2", BY: "[c4,e4,c5] c5 [c3,c5] [e4,a4]",
  BZ: "[c4,e4,g4]@4 d5@4 g3@4 ~ d#5 e5 d#5, ~@6 [g3,b3,d5] ~", CA: "~ d5 c#5 ~ [a3,c4,e4,c5]@8 a2@4",
  CB: "[[a3,c4,e4,a4]@4 g4@4 e3 f3@3 [c4,g4,a4]@6 g3@2 f3@2 g3@2 d5 d#5 e5@4 c5@2, ~@9 [g4,c5]@3 c3@3 ~]/2", // Am Am7 C5
  CC: "[c4,e4,c5]@4 c5@4 g#4 [c3,a4]@3 [c4,e4,g4]@4", // C F C
  CD: "c5 [c4,e4,g4,d5]@3 [g3,b3]@4 [g3,b3]@4 [g3,b3,d5]@4, ~ d5@2 ~", CE: "[g3,b3,d5]!3 ~",
  CF: "~ [f3,f4] ~ [f#3,f#4] [g3,g4]@4 f3@4 f3@2 g3@2, [e3,e4] ~@3", CG: "[c4,e4,c5]@2 d5@2 [c3,d5]@2 d#5 d5",
  CH: "[c4,e4,g4,c5]@2 d5@2 [g3,d5]@2 d#5 d5", CI: "[g3,b3,c5]@2 ~ c5@3 a2@2, ~ [a2,a3]@2 ~, ~@5 [b3,c4]@7 ~@4",
  CJ: "[a3,c4,e4,a4]@4 g4@4 e3 f3@3 f3@2 g3@2", CK: "[c4,e4,g4,c5]@4 d5@4 d5 d#5 e5@2 g3@2 g3@2, ~@2 [g3,b3] ~",
  CL: "[b3,c4,c5] [a3,b3,c4,c5]@2 a2", // Cmaj7 Am
  CM: "[[c4,e4,a4]@4 g4@4 e3 f3@3 [c4,g4,a4]@6 g3@2 f3@2 g3@2 d5 d#5 e5@2 [g4,c5]@4, ~@9 [e4,c5]@3 c3@2 ~@2]/2", // Am Am7 C5 C
  CN: "c5 ~@2 d5@5 [g3,b3,d5]@4 [g3,b3,d5]@4, c4 ~, ~ e4@7 ~@8, ~ g4@3 ~@4", // G
  CO: "[g3,b3,d5]@2 [g3,b3,d5]@2 [g3,b3,d5]@2 g3 a3", CP: "c4 a3 [f2,c4] a3", CQ: "[f3,a3,c4] a3 [e2,c4] g3",
  CR: "[e3,g3,c4] g3 [g2,c4] a3", CS: "[d3,g3,c4]@2 d3 e3@3 g3 a3, ~ [g3,c4]@2 ~", CT: "[e3,a3,c4] a2 [f2,c4] a3",
  CU: "[f3,g3,c4]@2 c4@2 d3 e3@3, ~ g3", CV: "[e3,g3,c4] e2 [g2,c4] a3",
  CW: "[d3,g3,c4]@4 d3@2 e3@6 [d4,d#4] [e4,f4] [f#4,g4]@2, ~ [g3,c4]@2 ~", CX: "a4@4 c5 c#5 d5@2 f3@2 e5@4 [f4,e5]@2",
  CY: "c5@2 c5 a4 c3 a4 g4@2", CZ: "e4@2 g4@2 [g3,d4]@2 b3 g4", DA: "~ e4 a2 [a3,c4]",
  DB: "[a3,c4,e4]@2 a2@2 g3 a3 c4@2, ~@2 f3 ~", DC: "[a3,c4]@2 a2 ~ e4@2 g4@2, ~ c3",
  DD: "[g2,d3,g3,d4]@3 [g2,b2,d3,g3,d4]", // G5 G
  DE: "[e4@4 g4@4 f3@4 [g4,a4]@6 c5@6 d5 d#5 e5@4 [g4,c5]@6 d5@4 g3@4 d5 d#5 e5@6 ~ e4@7 b4 c5@3, ~@12 c3@3 ~@11 [a3,c4]@4 ~@2]/4", // Gsus2 C5 Am
  DF: "[c4,c5]@4 c5@4 ~@3 c5 [e4,c5]@4, ~@2 f3 ~, ~@9 c4@3 ~@4, ~@5 e4 ~@2", // C
  DG: "[[c4,e4,g4]@4 d5@4 g3@4 ~ d#5 e5@6 [a2,c4,e4,c5]@8 a2@4, ~@6 [g3,b3,d5] ~@9]/2", // C Am G
  DH: "[[c4,e4,a4]@4 g4@4 f3@4 [c4,g4,a4]@6 g3@2 f3@2 g3@2 d5 d#5 e5@4 c5@2, ~@9 [e4,c5]@3 c3@3 ~]/2", // Am Am7 C
  DI: "[c4,e4,g4,c5]@4 d5@4 d5 d#5 [g3,e5]@2 g3@2 g3@2, ~@2 b3 ~, ~@4 g3 ~@3", DJ: "[g3,b3,d5]!2 [g3,b3,d5]@2",
  DK: "[g3,b3]@2 [c4,c5]!2 f3@2 g3 c4", DL: "~@2 e3@2 g3 c4 ~@2", DM: "g2@2 g3 b3 ~@4",
})).s("gm_acoustic_guitar_nylon").gain(0.3)

// drums · rim
const rim = s("rim").struct(`<
  ~@37 A B C ~@13 D B C ~@2 D ~@3 D ~@3 D ~@2 E F G ~@33 H I G ~@13 J I G ~@2 K ~@3 K ~@3 K ~@2 L I ~@14 D I ~@14 J I G
  ~@2 K ~@3 K ~@3 K ~@2 L I M ~@2
>`.pickRestart({
  A: "~@2 x!2", B: "~ x!3", C: "x!2", D: "~@3 x", E: "~ x", F: "x!4", G: "x", H: "x!2 ~ x", I: "x!3 ~", J: "~ x ~ x",
  K: "~ x ~@2", L: "x ~ x!2", M: "x ~ x!2 ~@4",
})).gain(0.3)

// drums · hihat
const hihat = s("hh").struct(`<
  A B A B A B A@17 C A@13 ~@3 A@14 ~@2 A@13 ~@3 A B ~ D@30 ~@3 D@14 ~@2 D@13 ~@2 D@14 ~@6 D@11 ~@2 D@13 ~@5
>`.pickRestart({
  A: "~ x", B: "~ x ~@2", C: "x!2", D: "x",
})).gain(0.3)

// drums · ride
const ride = s("rd").struct("<~@71 [~@6 x!2] ~@118>").gain(0.3)

// drums · congas
const congas = s("conga:33").struct("<~@39 A ~@15 A ~@15 B ~@34 C ~@15 C ~@31 C ~@15 C ~@19>".pickRestart({
  A: "~@2 x!2 ~@4", B: "~ x", C: "~@6 x!2",
})).gain(0.95)

stack(acoustic_guitar_nylon, rim, hihat, ride, congas)