Strudelify

The End of the Innocence

Bruce Hornsby

KeyA♭ majorTempo120 bpm
0:00/0:00
// The End of the Innocence — Bruce Hornsby
// 120 bpm, 4/4, key Ab major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 131 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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@2 B C D E@2 F B C D G@2 ~@3 H@2 ~@11 I J K L I J K M N@2 O P N@2 O Q R S F B C D T@2 ~@3 H@2 ~@11 I J K L I J K M
  N@2 O P N@2 O Q R S F B C D T@2 ~@3 H@2 ~@11 N@2 O P N@2 O Q R S F B C D U@2 F B C D V@2
>`.pickRestart({
  A: "[~@5 [ab3,c4,eb4]@2 [ab3,c4,eb4]@4 [ab3,bb3,eb4] [ab3,bb3,eb4]@3 [ab3,c4,eb4]]/2", // Ab Absus2 Ab
  B: "[ab3,c4,eb4]@3 [ab3,bb3,eb4] [ab3,bb3,eb4]@3 [ab3,db4,eb4]", // Ab Absus2 Absus4
  C: "[ab3,db4,eb4]@3 [ab3,c4,eb4] [ab3,c4,eb4]@3 [g3,bb3,eb4]", // Absus4 Ab Eb
  D: "[g3,bb3,eb4]@3 [f3,ab3,eb4] [f3,ab3,eb4]@3 [eb3,g3,bb3,eb4]", // Eb Fm7 Eb
  E: "[[eb3,g3,bb3,eb4]@6 [f3,ab3,db4,eb4]@2 [f3,ab3,db4,eb4]@12 bb3 c4 eb4@2 bb3 c4 [ab3,eb4]@2 [ab3,eb4]@2 [ab3,c4,eb4]@2, ~@12 eb4 ~@3]/2", // Eb Db Ab5 Ab
  F: "[ab3,c4,eb4]@3 [ab3,bb3,eb4] [ab3,bb3,eb4]@3 [ab3,c4,eb4]", // Ab Absus2 Ab
  G: "[[eb3,g3,bb3,eb4]@6 [f3,ab3,db4,eb4]@2 [f3,ab3,db4,eb4]@16 eb4 [bb3,c4] ab3@2 bb3@2 ab3@2]/2", // Eb Db Bbsus2
  H: "[~@8 db4 eb4 ab4@2 db4 c4 ab3@6 ~@12, ~@4 ab3 ~@11]/2", I: "[c4,eb4,ab4] [bb3,eb4,g4]", J: "[ab3,db4,f4]!2",
  K: "[c4,eb4,ab4] [ab3,db4,f4]", L: "[g3,bb3,eb4]@3 [bb3,g4]@2 [ab3,f4] [bb3,g4]!2", M: "[g3,bb3,eb4]",
  N: "[[eb3,ab3,c4]@3 [eb3,g3,c4]@4 [eb3,f3,ab3]@3 ab3 [eb3,f3,bb3]@5]/2", O: "[ab3,c4,eb4]@3 [g3,bb3,eb4]@5",
  P: "[ab3,db4,f4]@2 [f3,ab3] [f3,ab3,eb4]", Q: "[ab3,db4,f4]@3 [ab3,db4,f4]@3 [ab3,db4,f4]@2",
  R: "[ab3,c4,f4]@3 [ab3,c4,f4]@5", S: "[g3,bb3,eb4]@3 [g3,bb3,eb4]@3 [g3,bb3,eb4]@2",
  T: "[[eb3,g3,bb3,eb4]@3 [f3,ab3,db4,eb4] [f3,ab3,db4,eb4]@12]/2", // Eb Db
  U: "[[eb3,g3,bb3,eb4]@3 [f3,ab3,db4,eb4] [f3,ab3,db4,eb4]@11 [ab3,c4,eb4]]/2", // Eb Db Ab
  V: "[[eb3,g3,bb3,eb4]@3 [f3,ab3,db4,eb4] [f3,ab3,db4,eb4]@11 ~]/2", // Eb Db
})).s("gm_piano").gain(0.4)

// chords · synth strings 1 · "Synth"
const synth_strings_1 = note(`<
  A@2 B C D E@2 F B C D G@2 H@2 I@2 H@2 J K H@2 I@2 H@2 L@2 M N O P M N O P Q@2 R S Q@2 R T U P F B C D G@2 H@2 I@2 H@2
  J K H@2 I@2 H@2 L@2 M N O P M N O P Q@2 R S Q@2 R T U P F B C D G@2 H@2 I@2 H@2 J K H@2 I@2 H@2 L@2 Q@2 R S Q@2 R T U
  P F B C D V@2 F B C D G@2
>`.pickRestart({
  A: "[~@5 [ab3,c4,eb4]@2 [ab3,c4,eb4]@4 [ab3,bb3,eb4] [ab3,bb3,eb4]@3 [ab3,c4,eb4]]/2", // Ab Absus2 Ab
  B: "[ab3,c4,eb4]@3 [ab3,bb3,eb4] [ab3,bb3,eb4]@3 [ab3,db4,eb4]", // Ab Absus2 Absus4
  C: "[ab3,db4,eb4]@3 [ab3,c4,eb4] [ab3,c4,eb4]@3 [g3,bb3,eb4]", // Absus4 Ab Eb
  D: "[g3,bb3,eb4]@3 [f3,ab3,eb4] [f3,ab3,eb4]@3 [eb3,g3,bb3,eb4]", // Eb Fm7 Eb
  E: "[[eb3,g3,bb3,eb4]@3 [f3,ab3,db4,eb4] [f3,ab3,db4,eb4]@11 [ab3,c4,eb4]]/2", // Eb Db Ab
  F: "[ab3,c4,eb4]@3 [ab3,bb3,eb4] [ab3,bb3,eb4]@3 [ab3,c4,eb4]", // Ab Absus2 Ab
  G: "[[eb3,g3,bb3,eb4]@3 [f3,ab3,db4,eb4] [f3,ab3,db4,eb4]@12]/2", H: "[bb3,c4,eb4]/2", I: "[eb3,f3,ab3]/2",
  J: "[eb3,f3,ab3]", K: "[f3,g3,bb3]", L: "[[c4,eb4,ab4]@3 [f3,ab3,db4]@4 [bb3,db4,f4]@9]/2",
  M: "[c4,eb4,ab4] [bb3,eb4,g4]", N: "[ab3,db4,f4]!2", O: "[c4,eb4,ab4] [ab3,db4,f4]", P: "[g3,bb3,eb4]",
  Q: "[[eb3,ab3,c4]@3 [eb3,g3,c4]@4 ab3@4 bb3@5, ~@7 [eb3,f3]@9]/2", R: "[ab3,c4,eb4]@3 [g3,bb3,eb4]@5",
  S: "[ab3,db4,f4] [f3,ab3,eb4]", T: "[ab3,db4,f4]", U: "[ab3,c4,eb4]",
  V: "[[eb3,g3,bb3,eb4]@3 [f3,ab3,db4,eb4] [f3,ab3,db4,eb4]@11 [ab3,db4,eb4]]/2", // Eb Db Absus4
})).s("gm_synth_strings_1").gain(0.1)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~ A B C D E@2 A B C D F@2 G@2 H I J K L M J K N O J P Q@2 R S T U R S T V W@2 X S Y@2 R Z AA AB A B C D AC@2 G@2 H I J
  K L M J K N O J P Q@2 R S T U R S T V W@2 X S Y@2 R Z AA AB A B C D AC@2 G@2 H I J K L M J K N O J P AD@2 AE@2 R AF AG
  AH AI AJ AK AL A AM C D AC@2 AN AM C D AC@2
>`.pickRestart({
  A: "ab1@4 ab1@3 ab1", B: "ab1@3 ab1 ab1@3 bb1", C: "bb1@3 bb1 bb1@3 f2", D: "f2@3 eb2 eb2@3 db2",
  E: "[db2@28 f2 g2 ab2@2]/2", F: "[db2@22 db2@2 f2 g2 ab2@2 f2 g2 ab2@2]/2", G: "[ab1@11 ab2@5]/2",
  H: "db2@4 db2@3 db2", I: "db2@7 ab1", J: "ab1@7 ab1", K: "ab1@3 ab1 ab1@3 db2", L: "db2@6 db3@4 c3 db3 c3@2 bb2@2",
  M: "db2@7 ab2", N: "db2@3 db2@4 db2", O: "db2@3 db2 db2@3 ab1", P: "ab1@6 ab1@2 ab1@6 db2 eb2",
  Q: "[f2@3 db2@4 eb2@4 eb2@3 db2 eb2]/2", R: "f2 c2", S: "bb1 db2", T: "f2 db2", U: "eb2@3 eb2@2 db2 eb2 ab2",
  V: "eb2@8 eb3 f3 eb3@4 eb2@2", W: "[ab1@3 eb2@4 db2@7 ~ eb2]/2", X: "f2@3 c2 c2@4", Y: "[ab1@3 eb2@4 db2@9]/2",
  Z: "bb1@7 db2", AA: "db2", AB: "eb2", AC: "db2/2",
  AD: "[f2@6 db2@8 eb2@4 eb2@2 eb3 f3 eb2@2 f3@2 eb3@2 db3@2 c3@2]/2", AE: "[ab2@3 eb2 eb2@3 db2@9]/2",
  AF: "bb1@4 db2@3 ab1", AG: "ab1@3 eb2 eb2@3 db2", AH: "db2@5 db2 eb2 ab2", AI: "f2@4 c2@3 c2",
  AJ: "bb1@3 bb1@2 f2 eb2 c2", AK: "db2@4 f3 eb3 c3 db3", AL: "eb3@3 eb2 eb2@4", AM: "ab1@6 ab1@2 ab1@4 f2 g2 ab2@2",
  AN: "ab1",
})).s("gm_electric_bass_finger").gain(0.4)

// drums · kick
const kick = s("bd").struct("<~ [x ~@2 x!2 ~@2 x]!124 [~@3 x!2 ~@2 x] [x ~@2 x!2 ~@2 x]!5>").gain(0.4)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!130>").gain(0.4)

// drums · clap
const clap = s("cp").struct("<~ [~ x ~ x]!130>").gain(0.25)

// drums · hihat
const hihat = s("hh").struct("<~ [x!8]!124 [~ x!7] [x!8]!5>").gain(0.4)

stack(piano, synth_strings_1, bass, kick, snare, clap, hihat)

More by Bruce Hornsby