Strudelify

Beautiful In My Eyes

Joshua Kadison

KeyE♭ majorTempo66 bpm
0:00/0:00
// Beautiful In My Eyes — Joshua Kadison
// 66 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 40, 4/4 at bar 41, 2/4 at bar 69, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 91 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(66/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 · "Unnamed Track"
const piano = note(`<
  A B C D E F G H I@2 J@4 K L M C D E F G H I@2 J@4 K L N O P Q R@2 S T U V W@2 X Y Z@2 AA@3 AB@5 AC AD@2 AE@2 AF AG@2
  AH AF AG@2 AI AJ AK AL ~@20
>`.pickRestart({
  A: "[ab3,c4,eb4]@3 bb3 c4 eb4@2 ab4 [bb3,eb4,g4]@2 f4 eb4@2 c4 bb3@2", // Ab Eb
  B: "[eb3,bb3]@4 ~ eb3 ab3 bb3 c4 ~@2 d4@4 ~, ~ [f3,bb3]", // Eb5 Bb5
  C: "f4 f4@2 f4@2 eb4 [bb3,eb4,g4]@6 [bb3,eb4,g4]@4, [bb3,d4]@3 ~@5", // Eb Bb
  D: "[bb3,d4,f4]@4 [bb3,d4,f4]@4 [c4,eb4,g4]@4 [c4,eb4,g4]@2 f4 eb4", // Bb Cm
  E: "[bb3,d4,f4]@2 bb3 bb3@4 ~ [f3,bb3,d4]@4 [f3,bb3,d4]@4", // Bb
  F: "[g3,bb3,f4]@2 [g3,bb3,eb4] bb3 [d4,bb4] [c4,ab4] [bb3,g4] [ab3,f4]", // Gm7 Eb Gm Fm Eb Db
  G: "[ab3,c4,f4]@3 [bb3,g4]@3 [g3,c4,eb4]@6 [g3,c4,eb4]@4", // Fm Eb Cm
  H: "[ab3,b3,eb4]@4 [ab3,b3,eb4]@4 eb4 eb4@5 f4 eb4, ~ [ab3,b3]", // Abm
  I: "[[bb3,eb4]@2 [bb3,eb4]@2 [bb3,eb4]@2 [bb3,eb4]@2 [bb3,d4]@2 [bb3,d4]@2 [bb3,d4]@2 g4 ab4, g4@3 ~, ~@4 f4@3 [bb3,d4]]/2", // Eb5 Bb
  J: "[[c4,eb4,g4,bb4]@2 eb4 eb4@2 eb4@3 [c4,eb4,g4]@6 g4 ~@3 bb4@3 bb4@2 g4@2 f4@5 g4 ~@3 bb4@3 bb4@2 g4@2 ~@4 bb3 c4 eb4@3 g4@3 f4@2 g3@4 ~ [bb3,g4]@4, ~@15 ab4@3 ~@13 ab4@4 ~@6 f4@6 ~@8 eb4@9, ~@16 [d4,f4]@6 ~ [bb3,d4]@6 ~@3 [d4,f4]@6 ~ [bb3,d4]@6 ~@2 bb3@12 ~@5]/4", // Cm7 Cm Eb Dm Bb Dm Bb
  K: "[ab3,c4,eb4]@3 bb3 c4 eb4@2 [bb3,eb4,ab4]@2 g4 f4 [g3,bb3,eb4]@4 ~", L: "[bb3,c4,eb4]@2 [bb3,eb4,f4] d4",
  M: "[g3,bb3,eb4] g3 [g3,bb3,eb4] [f3,bb3,d4]", N: "[g3,bb3,eb4]@8 [bb3,eb4,g4]@2 f4 f4@2 eb4@3",
  O: "[bb3,d4,f4]@12 [bb3,d4,f4] [bb3,eb4,g4]@3", P: "[bb3,d4,f4]@8 [bb3,d4,g4] f4 eb4@2 eb4 f4@2 c4",
  Q: "[g3,bb3]@4 [g3,bb3,eb4]@8 [g3,bb3,eb4] [ab3,c4,eb4]@3", // Gm Eb Ab
  R: "[[g3,bb3,eb4]@6 bb3!2 [bb3,eb4,g4]@2 f4 f4@2 eb4@2 [bb3,d4,f4]@4 ~@4 bb3 [bb3,d4,g4]@3 f4 f4@2 eb4@2]/2", // Eb Bb Gm
  S: "eb4 c4@3 c4 eb4@2 [bb3,eb4,ab4]@2 g4 f4 [g3,bb3,eb4]@2 c4 bb3@2, ab3 ~@3", T: "[ab3,c4,eb4]@2 [bb3,d4,f4] d4",
  U: "[g3,bb3,eb4]@4 ~ eb3 g3 eb4 [ab3,c4,eb4]@3 bb3 c4 eb4@2 ab4", // Eb Ab
  V: "~ f4 eb4@2 ~ c4 bb3@2 [eb3,ab3,c4]@4 ~ eb3 ab3 bb3, [bb3,eb4,g4] ~@7", // Ab Eb
  W: "[[bb3,c4]@3 d4@2 bb3!3 f4 f4@2 f4@2 eb4 [bb3,eb4,g4]@6 [bb3,eb4,g4]@4 [bb3,d4,f4]@4 [bb3,d4,f4]@4, f3@4 [bb3,d4]@3 ~@9]/2", // Bbsus2 Eb Bb
  X: "[c4,eb4,g4]@4 [c4,eb4,g4]@2 f4 eb4 [bb3,d4,f4]@2 bb3 bb3@4 ~", // Cm Bb
  Y: "[f3,bb3,d4]@2 [f3,bb3,d4]@2 [g3,bb3,f4]@2 [g3,bb3,eb4] bb3", // Bb Gm7 Eb
  Z: "[[d4,bb4]@2 [c4,ab4]@2 [bb3,g4]@2 [ab3,f4]@2 [ab3,c4,f4]@3 [bb3,g4]@3 [g3,c4,eb4]@6 [g3,c4,eb4]@4 [ab3,b3,eb4]@4 [ab3,b3,eb4]@4]/2", // Gm Fm Eb Db Fm Eb Cm Abm
  AA: "[eb4 eb4@5 f4 eb4 [bb3,eb4]@4 [bb3,eb4]@4 [bb3,eb4]@4 [bb3,eb4]@4 [bb3,d4]@4 [bb3,d4]@4 [bb3,d4]@4 g4@2 ab4@2 [c4,eb4,g4,bb4]@2 eb4 eb4@2 eb4@3, [ab3,b3] g4@3 ~@2, ~@6 f4@3 [bb3,d4] ~@2]/3", // Eb5 Bb Cm7 Abm Bb
  AB: "[[c4,eb4,g4]@6 g4 ~@3 bb4@3 bb4@2 g4@2 f4@5 g4 ~@3 bb4@3 bb4@2 g4@2 ~@4 bb3 c4 eb4@3 g4@3 f4@2 g3@4 ~ [bb3,g4]@4 [ab3,c4,eb4]@3 bb3 c4 eb4@2 [bb3,eb4,ab4]@2 g4 f4 [g3,bb3,eb4]@4 ~ [bb3,c4,eb4]@8, ~@7 ab4@3 ~@13 ab4@4 ~@6 f4@6 ~@8 eb4@9 ~@24, ~@8 [d4,f4]@6 ~ [bb3,d4]@6 ~@3 [d4,f4]@6 ~ [bb3,d4]@6 ~@2 bb3@12 ~@29]/5", // Cm Eb Ab Ebsus4 Eb Cm7 Dm Bb …
  AC: "[bb3,eb4,f4] d4 [g3,bb3,eb4]@2", // Bbsus4 Eb
  AD: "[[bb3,eb4,g4]@2 f4 f4@2 eb4@3 [bb3,d4,f4]@12 [bb3,d4,f4] [bb3,eb4,g4]@3 [bb3,d4,f4]@8]/2", // Eb Bb Eb Bb
  AE: "[[bb3,d4,g4] f4 eb4@2 eb4 f4@2 c4 [g3,bb3]@4 [g3,bb3,eb4]@8 [g3,bb3,eb4] [ab3,c4,eb4]@3 [g3,bb3,eb4]@6 bb3!2]/2", // Gm Eb Ab Eb
  AF: "[bb3,eb4,g4]@2 f4 f4@2 eb4@2 [bb3,d4,f4]@4 ~@4 bb3", // Eb Bb
  AG: "[[bb3,d4,g4]@3 f4 f4@2 eb4@2 eb4 c4@3 c4 eb4@2 [bb3,eb4,ab4]@2 g4 f4 [g3,bb3,eb4]@2 c4 bb3@2 [ab3,c4,eb4]@8, ~@2 ab3 ~@5]/2", // Gm Ebsus4 Eb Ab
  AH: "[bb3,d4,f4]@4 d4@4 [g3,bb3,eb4]@6 bb3!2", AI: "[bb3,d4,f4]@4 d4@4 [g3,bb3,eb4]@4 ~ eb3 g3 eb4",
  AJ: "[ab3,c4,eb4]@3 bb3 c4 eb4@2 ab4 ~ f4 eb4@2 ~ c4 bb3@2, ~@4 [bb3,eb4,g4] ~@3", // Ab Eb
  AK: "[eb3,ab3,c4]@4 ~ eb3 ab3 bb3 [c4,f4]@4 d4@4, ~ bb3", AL: "[g3,bb3,eb4]",
})).s("gm_piano").gain(0.51)

// bass · fretless bass · "Unnamed Track"
const bass = note(`<
  A B C D E F G H I J K@2 L M N B O C D E F G H I J K@2 L M N B P Q I C@2 Q R S T U V P W X Y Z AA AB@2 K AC AD AE AF AG
  AH AI AJ P AK AL AM AN AO AL AM AG A B AP ~@20
>`.pickRestart({
  A: "f2 g2", B: "ab2 bb2", C: "eb2@3 eb2 eb2@4", D: "eb2@3 eb2 ab2@4", E: "g2@3 g2 g2@3 d3", F: "c3@3 c3 c3@4",
  G: "ab2@6 ab2@2 ab2@6 ab2 bb2", H: "b2@3 b2 b2@4", I: "bb2@3 bb2 bb2@3 bb2", J: "bb2@6 bb2!2",
  K: "ab2@3 ab2 ab2@3 ab2", L: "g2@3 g2 g2@3 g2", M: "c3@3 c3 c3@3 eb2", N: "f2@3 f2 g2@3 g2", O: "eb2@2 bb2!2",
  P: "eb2@4 eb2@3 eb2", Q: "bb2@3 bb2 bb2@4", R: "ab2 g2", S: "f2 bb2", T: "eb2 f2", U: "g2 ab2", V: "bb2@4 eb2@3 eb2",
  W: "ab2@4 g2@3 g2", X: "g2@3 d3 c3@3 c3", Y: "c3@4 ab2@3 ab2", Z: "ab2@6 ab2 bb2 b2@6 b2@2", AA: "b2@4 bb2@3 bb2",
  AB: "[bb2@3 bb2 bb2@6 bb2!2 ab2@3 ab2]/2", AC: "ab2@3 ab2 g2@3 g2", AD: "g2@3 g2 c3@3 c3", AE: "c3@3 eb2 f2@3 f2",
  AF: "g2@3 g2 ab2@4", AG: "bb2 eb2", AH: "eb2@3 eb2 bb2@3 bb2", AI: "bb2@4 bb2@3 bb2", AJ: "bb2@3 bb2 eb2@3 eb2",
  AK: "eb2@4 bb2@3 bb2", AL: "bb2 ab2", AM: "g2 f2", AN: "bb2@2 eb2!2", AO: "eb2@2 eb2@2 bb2@3 bb2", AP: "eb2",
})).s("gm_fretless_bass").gain(0.41)

// bass · whistle · "Unnamed Track"
const bass_2 = note(`<
  A B C D E F G H I J K@2 L M N B O C D E F G H I J P K L M N B Q R I C@2 R S T U V W Q X Y Z AA AB AC@2 K AD AE AF AG
  AH AI AJ AK Q AL AM AN AO AP AM AN AH A B AQ ~@20
>`.pickRestart({
  A: "f1 g1", B: "ab1 bb1", C: "eb1@3 eb1 eb1@4", D: "eb1@3 eb1 ab1@4", E: "g1@3 g1 g1@3 d2", F: "c2@3 c2 c2@4",
  G: "ab1@6 ab1@2 ab1@6 ab1 bb1", H: "b1@3 b1 b1@4", I: "bb1@3 bb1 bb1@3 bb1", J: "bb1@6 bb1!2",
  K: "ab1@3 ab1 ab1@3 ab1", L: "g1@3 g1 g1@3 g1", M: "c2@3 c2 c2@3 eb1", N: "f1@3 f1 g1@3 g1", O: "eb1@2 bb1!2",
  P: "~@3 ab1 ab1@3 ab1", Q: "eb1@4 eb1@3 eb1", R: "bb1@3 bb1 bb1@4", S: "ab1 g1", T: "f1 bb1", U: "eb1 f1",
  V: "g1 ab1", W: "bb1@4 eb1@3 eb1", X: "ab1@4 g1@3 g1", Y: "g1@3 d2 c2@3 c2", Z: "c2@4 ab1@3 ab1",
  AA: "ab1@6 ab1 bb1 b1@6 b1@2", AB: "b1@4 bb1@3 bb1", AC: "[bb1@3 bb1 bb1@6 bb1!2 ab1@3 ab1]/2",
  AD: "ab1@3 ab1 g1@3 g1", AE: "g1@3 g1 c2@3 c2", AF: "c2@3 eb1 f1@3 f1", AG: "g1@3 g1 ab1@4", AH: "bb1 eb1",
  AI: "eb1@3 eb1 bb1@3 bb1", AJ: "bb1@4 bb1@3 bb1", AK: "bb1@3 bb1 eb1@3 eb1", AL: "eb1@4 bb1@3 bb1", AM: "bb1 ab1",
  AN: "g1 f1", AO: "bb1@2 eb1!2", AP: "eb1@2 eb1@2 bb1@3 bb1", AQ: "eb1",
})).s("gm_electric_bass_finger").gain(0.51)

// chords · string ensemble 2 · "Unnamed Track"
const string_ensemble_2 = note(`<
  ~@10 A B C D E F G ~@8 A B C D E F H ~@17 I@5 J K ~@7 L@3 M N O P Q ~@20
>`.pickRestart({
  A: "[ab4,c5,eb5,g5]", B: "[bb4,d5,f5]", C: "[d5,f5,g5,bb5]", D: "[g4,bb4,c5,eb5]", E: "[c5,eb5,f5,ab5] [eb4,g4,bb4]",
  F: "[ab4,c5,eb5] [bb4,d5,f5]", G: "[eb4,g4,bb4]@2 [eb4,g4,bb4] [bb4,d5,f5]", H: "[eb4,g4,bb4] ~",
  I: "[~ [ab4,c5,eb5,g5]@2 [bb4,d5,f5]@2 [d5,f5,g5,bb5]@2 [g4,bb4,c5,eb5]@2 [c5,eb5,f5,ab5]]/5", // Abmaj7 Bb Gm7 Cm7 Fm7
  J: "[eb4,g4,bb4] [ab4,c5,eb5]", K: "[bb4,d5,f5] [eb4,g4,bb4]", L: "[~ [g4,bb4,eb5]@2 [d5,f5,bb5]@2 [c5,eb5,ab5]]/3",
  M: "[g4,bb4,eb5] [f4,ab4,c5,eb5]", N: "[d5,f5,bb5] [g4,bb4,eb5]", O: "[f4,ab4,c5,eb5] [g4,bb4,eb5]",
  P: "[c5,eb5,ab5] [d5,f5,bb5]", Q: "[g4,bb4,eb5]",
})).s("gm_string_ensemble_2").gain(0.1).pan(0.8)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@2
  [x ~ x!2 ~@2 x ~]!38
  [x ~@3 x ~ x!2]
  [~@2 x ~ x ~ x!2]!27
  [~ x!2 ~]
  [x ~ x!2 ~@2 x ~]
  ~@21
>`).gain(0.41)

// drums · crash
const crash = s("cr").struct("<~ [~ x] ~@86 x ~ [~ x ~@14]>").gain(0.15)

stack(piano, bass, bass_2, string_ensemble_2, hihat, crash)

More by Joshua Kadison