Strudelify

Bluer Than Blue

Michael Johnson

KeyA♭ majorTempo123 bpm
0:00/0:00
// Bluer Than Blue — Michael Johnson
// 123 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 91 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(123/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · "Unnamed-00032"
const acoustic_guitar_nylon = note(`<
  A B C D E F G H I J K@2 ~ L M N O P Q R S T U@2 V@2 W X@3 Y@2 T Z AA AB AC AD G H I J AE@2 ~ AF M N O AG AH R S T U@2
  V@2 W X@3 Y@2 T AI AJ@2 AK@2 AL AM AN AO U@2 V@2 W X@3 Y@2 T AP AQ AR AS ~@2
>`.pickRestart({
  A: "~ ab4 bb4 ab4", B: "~ bb4 c5 g4", C: "~@6 [c4,ab4] [db4,bb4]", D: "[eb4,c5] [db4,bb4] [c4,ab4] [bb3,g4]",
  E: "~@2 ab4@2 bb4@3 ab4", F: "~@2 eb4@2 e4@3 e4", G: "[a3,c4,f4]", H: "~@4 f4@2 f4 d4", I: "[bb3,d4]",
  J: "ab4 g4@2 f4", K: "[[bb3,g4] [c4,a4]@3 [c4,f4]@3 [eb4,a4]@5 a4 d4 g4 d4]/2", L: "[g3,bb3,db4]!2 [db4,g4]@2",
  M: "[db4,bb4] [eb4,c5]@7", N: "[eb4,gb4,ab4]@2 [eb4,gb4,ab4]!2", O: "[db4,f4,ab4] [c4,f4]",
  P: "[c4,f4]@2 [db4,f4,bb4] [c4,f4,ab4]", Q: "[bb3,c4,eb4,g4]", R: "[g3,c4]", S: "[db4,f4,ab4] [c4,eb4]",
  T: "[db4,f4,ab4]!2", U: "[[eb4,ab4]@2 [eb4,ab4] [eb4,ab4]@3 [eb4,ab4]@4 ~@6]/2",
  V: "[[eb4,ab4]@2 [eb4,ab4] [eb4,ab4]@3 [eb4,ab4]@4 ~@4 ab4 g4]/2", W: "[ab3,c4,eb4,gb4] [eb4,gb4]",
  X: "[[eb4,gb4,c5]@3 [eb4,gb4]@3 [eb4,gb4] [db4,f4,ab4]@4 [db4,f4]@3 [c4,f4]@10]/3", // Cdim Ebm Db F5
  Y: "[[eb4,ab4]@2 [eb4,ab4] [eb4,ab4]@3 [eb4,ab4]@6 [f4,ab4]@4]/2", Z: "[c4,eb4]!3 [ab4,c5]", AA: "[bb3,db4,f4]!2",
  AB: "[eb4,g4,bb4]!2", AC: "[db4,f4,ab4] [d4,f4,ab4]", AD: "[bb3,eb4,g4] [bb3,e4,g4]",
  AE: "[[bb3,g4] [c4,a4]@3 [c4,f4]@3 [eb4,a4]@5 ~@4]/2", AF: "db4 [db4,f4] [db4,g4]@2",
  AG: "[c4,f4]@2 [db4,f4,bb4] [c4,ab4]", AH: "[bb3,c4,eb4]", AI: "[c4,eb4]!4",
  AJ: "[[db4,f4,ab4]@3 [db4,f4]@2 [db4,f4]@2 [eb4,ab4]@2 [c4,eb4]@2 [c4,eb4]@3 [c4,eb4]@2]/2", // Db Ab5 Cm
  AK: "[[db4,f4,ab4]@3 [db4,f4]@2 [db4,f4]@2 [eb4,ab4]@2 [c4,eb4]@3 [c4,eb4]@2 [c4,eb4]@2]/2", // Db Ab5 Cm
  AL: "[db4,f4,ab4]@3 [db4,f4]@2 [db4,f4]@3", AM: "[ab4,c5] [eb4,ab4]@2 [c4,eb4]@3 c4@2",
  AN: "[db4,f4,ab4] [db4,f4] [d4,f4]!2", AO: "[db4,f4,ab4]!2 [db4,f4]!2", AP: "[eb4,ab4] [c4,eb4] [c4,e4]@2",
  AQ: "~@5 c5 f5 bb5", AR: "g5 c5@2 c6 ab5@3 c5", AS: "[f4,bb4]",
})).s("gm_acoustic_guitar_nylon").gain(0.61).pan(0.4)

// chords · vibraphone · "Unnamed-001"
const vibraphone = note(`<
  A B C ~ A D E@2 ~ F ~@2 G H ~@8 I ~@15 E@2 ~ F ~@2 G H ~@8 I ~@10 J K@2 L@2 M N O P ~@12 C ~ Q R S
>`.pickRestart({
  A: "[ab3,db4,f4] [d4,f4]", B: "[bb3,eb4,g4] [c4,e4,g4]", C: "[c4,f4,ab4]", D: "[bb3,eb4,g4] [g3,bb3]",
  E: "[~@4 [c4,f4,a4]@3 [c4,eb4,a4]@5 ~@4]/2", F: "[bb3,db4,f4] [bb3,db4]", G: "[bb3,d4]", H: "~@2 c5 db5",
  I: "[eb4,ab4,c5]", J: "~@5 ab4 bb4@2", K: "[c5@2 bb4 ab4@2 bb4@2 c5@2 bb4@2 ab4@2 ab4 bb4@2]/2",
  L: "[c5@2 bb4 ab4@2 bb4@2 c5@2 ab4@3 ~@2 ab4 bb4]/2", M: "c5@2 bb4 ab4@2 bb4@3", N: "eb5 c5@2 ab4@3 eb4!2",
  O: "c5@2 ~ bb4 ab4@2 bb4@2", P: "db5 c5 ab4 bb4", Q: "~ bb3 d4@2", R: "[db4,f4]", S: "[ab3,c4,eb4]",
})).s("gm_vibraphone").gain(0.61).pan(0.3)

// other · piano · "Unnamed-002"
const piano = note(`<
  A B C@2 D E F G H I J G H ~ K L M@2 N O P Q R S T S U V W X Y Z AA AB AC AD D AE F G H I J G H ~ K L M@2 N O P Q R S T
  S U V W X Y Z AA AB AF AG AH AI AH AJ AK AL R S T S U V W X Y Z AA AE AM AN AO AP K
>`.pickRestart({
  A: "db3@4 d3@2 ab3 bb3", B: "g3 c3", C: "[f2@12 ~ ab2 f2 eb2]/2", D: "db2 d2", E: "eb2@2 e2 c2", F: "f2",
  G: "f2@3 a2", H: "bb2", I: "eb3@7 e3", J: "f3", K: "ab2", L: "ab2@3 c3", M: "db3", N: "c3@3 c3", O: "f2@3 f2",
  P: "bb2 c3", Q: "db3@4 eb3 bb2 eb3@2", R: "ab2@3 eb2", S: "f3 eb3", T: "ab2@6 f2 eb2", U: "ab2@3 ab2", V: "ab2@3 c2",
  W: "db2@3 db2", X: "db2@6 db2 d2", Y: "eb2@3 eb2", Z: "e2 f2", AA: "bb2@6 bb2 a2", AB: "ab2@3 f2",
  AC: "bb1@2 bb1@5 bb1", AD: "c2!2 c2@4 c2!2", AE: "eb2 e2", AF: "bb1@2 bb1@4 bb1!2", AG: "c2 c2@2 c2",
  AH: "db2@2 db2@5 db2", AI: "c2@2 c2@3 eb2 ab2@2", AJ: "c2@2 c2@4 c2!2", AK: "db2!2 d2!2", AL: "eb2!4", AM: "f2 f3",
  AN: "[e3,c4] [eb3,c4]", AO: "d3", AP: "eb3",
})).s("gm_piano").gain(0.72).pan(0.6)

// chords · pad halo · "Unnamed-004"
const pad_halo = note(`<
  ~@4 A B C@2 ~@8 D@2 E@2 F G H@2 I@2 J@2 K@2 L M N O N P Q R C@2 S T U V S W X Y Z AA AB AC AD N H@2 I@2 J@2 K@2 L M N
  O W AE W AE W AF AG AH H@2 I@2 J@2 K@2 L M N O AI AJ AK AL AM
>`.pickRestart({
  A: "~ d4", B: "eb4 e4", C: "f4/2", D: "db4/2", E: "c4/2", F: "db4 eb4", G: "f4@2 ab4 bb4", H: "[eb4,ab4]/2",
  I: "g4/2", J: "[ab3,c4,gb4]/2", K: "[db4,f4,ab4]/2", L: "[eb4,ab4]", M: "[e4,ab4] [f4,ab4]", N: "[db4,f4,ab4]",
  O: "[c4,eb4]", P: "[eb4,g4,bb4]", Q: "[db4,f4,ab4] [d4,f4,ab4]", R: "[bb3,eb4,g4] [bb3,e4,g4]", S: "bb4",
  T: "eb4@7 e4", U: "f4", V: "d4@3 f4", W: "ab4", X: "[db4,bb4] [eb4,c5]@7", Y: "[eb4,gb4,ab4]",
  Z: "[db4,f4,ab4] [c4,f4]", AA: "[c4,f4]@2 [db4,f4,bb4] [c4,ab4]", AB: "[bb3,c4,eb4]", AC: "[g3,c4]",
  AD: "[db4,f4,ab4] [c4,eb4]", AE: "c5", AF: "[c5,eb5]", AG: "[ab4,c5]@2 [db4,ab4] [db4,bb4]",
  AH: "[db4,f4,ab4] [db4,f4]", AI: "[c4,f4]", AJ: "c4 b3", AK: "bb3 d4", AL: "[db4,f4]", AM: "[ab3,c4,eb4]",
})).s("gm_pad_halo").gain(0.42)

// drums · snare
const snare = s("sd").struct("<~@22 [~ x]!16 ~@16 [~ x]!32 ~@5>").gain(0.72).pan(0.7)

// drums · hihat
const hihat = s("hh").struct("<~@22 [~ x!3]!16 x!15 ~ [~ x!3]!32 ~@5>").gain(0.72).pan(0.7)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@21 A ~@3 B ~@3 B ~@2 C ~@20 A ~@7 A ~@2 D E ~@3 F ~@3 D ~@7 B ~@2 B ~@6
>`.pickRestart({
  A: "~@4 x!3 ~", B: "~@3 x", C: "~@6 x!2", D: "~@4 x!4", E: "~@5 x!2 ~", F: "~@5 x!3",
})).gain(0.72).pan(0.7)

// drums · open hat
const open_hat = s("oh").struct("<~@25 A ~@11 B ~@19 A ~ A ~ B ~@4 B C B ~ D@2 A B ~ A@11 ~@5>".pickRestart({
  A: "~@7 x", B: "~@3 x ~@4", C: "x ~@2 x ~@4", D: "~@3 x ~@3 x",
})).gain(0.72).pan(0.7)

// drums · high tom
const high_tom = s("ht").struct("<~@21 A ~@3 B ~@3 C ~@23 A ~@10 A ~@8 A ~@7 B ~@2 C ~@6>".pickRestart({
  A: "~ x ~@2", B: "~@5 x ~@2", C: "~@2 x ~@2 x ~@2",
})).gain(0.72).pan(0.7)

// drums · crash
const crash = s("cr").struct(`<
  ~@22 A ~ A ~ A ~ A ~ A ~ A@2 ~ A ~ A@2 ~@15 A ~ A ~ A ~ A ~ A ~ A@3 ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A@2 ~@5
>`.pickRestart({
  A: "x",
})).gain(0.72).pan(0.7)

// drums · ride bell
const ride_bell = s("rd").struct("<[~ x]!22 ~@16 [~ x]!16 ~@32 [~ x]!4 ~>").gain(0.72).pan(0.7)

stack(acoustic_guitar_nylon, vibraphone, piano, pad_halo, snare, hihat, mid_tom, open_hat, high_tom, crash, ride_bell)

More by Michael Johnson