Strudelify

The End of the Innocence

Don Henley

KeyA majorTempo120 bpm
0:00/0:00
// The End of the Innocence — Don Henley
// 120 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 148 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 · pan flute
const pan_flute = note("<~@93 A B C D A E C F G H ~@45>".pickRestart({
  A: "~@6 [b4,d5,f#5] ~ [b4,d5,f#5]@5 ~ [a4,c#5,e5] ~", B: "[a4,c#5,e5]@5 ~ [a4,b4,e5] ~ [a4,b4,e5]@7 ~",
  C: "~@6 [a4,c#5,e5] ~ [a4,c#5,e5]@5 ~ [g#4,b4,e5] ~", D: "[g#4,b4,e5]@5 ~ [f#4,a4,e5] ~ [f#4,a4,e5]@8",
  E: "[a4,c#5,e5]@5 ~ [a4,b4,e5] ~ [a4,b4,e5]@8", F: "[g#4,b4,e5]@5 ~ [f#4,a4,d5] ~ [f#4,a4,d5]@5 ~ [e4,g#4,c#5] ~",
  G: "[e4,g#4,c#5]@5 ~ [f#4,a4,d5] ~ [f#4,a4,d5]@5 ~ [f#4,a4,e5] ~", H: "[f#4,a4,e5]@3 ~",
})).s("gm_pan_flute").gain(0.31)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A B C D E@2 A B C D F@2 G H I J G H K L G H I M G N O P Q R S T U V W X Y Z U AA AB AC U AD AE AF A B C D F@2 G H I
  J G H K L G H I M G N O P Q R S T U V W X Y Z U V AB AC U AD AE AF A B C D F@2 AG@2 AH AI AJ@2 AK AL AM AN G H I J G H
  K L G H I M G N O P Y Z U V AB AC U AD AE AF A B C D F@2 A B C D F@2 A AO A AO A AP AQ
>`.pickRestart({
  A: "a1@5 ~ a1 ~ a1@5 ~ a1 ~", B: "a1@5 ~ a1 ~ a1@6 b1 ~", C: "b1@5 ~ b1 ~ b1@6 f#2 ~", D: "f#2@6 e2 ~ e2@6 d2 ~",
  E: "[d2@5 ~ d2 ~ d2@19 e2 f#2@2 a2@2]/2", F: "[d2@5 ~ d2 ~ d2@15 e2 f#2@2 a2@2 f#2@2 a2@2]/2",
  G: "a1@5 ~ a1 ~ a1@7 ~", H: "a1@5 ~ a1 ~ a1@6 d2 ~", I: "d2@5 ~ d2 ~ d2@7 ~", J: "d2@5 ~ d2 ~ d2@6 a1 ~",
  K: "d2@6 d3 ~ d3@6 c#3@2", L: "e2@5 ~ e2@2 f#2@2 a2@2 f#2@2 a2@2", M: "d2@5 ~ d2 ~ d2@5 ~ a1 ~",
  N: "a1@4 ~@2 a1 ~ a1@8", O: "f#2@6 d2 ~ d2@6 e2 ~", P: "e2@4 f#2 e2 c#2 b1", Q: "f#2 c#2", R: "b1 d2", S: "f#2 d2",
  T: "e2@5 c#2 e2 a2", U: "f#2@5 ~ f#2@2 c#2@5 ~ c#2@2", V: "b1@5 ~ b1@2 d2@5 ~ d2@2", W: "f#2@4 ~@2 f#2@2 d2@5 ~ d2@2",
  X: "e2@3 e3 f#3 e3 c#3 b2", Y: "a1@5 ~ a2@2 e2@5 ~ e2@2", Z: "d2@5 ~ d2 ~ d2@8", AA: "b1@5 ~ b1@2 d2@4 ~@2 d2@2",
  AB: "a1@6 a2@2 e2@5 ~ e2@2", AC: "d2@5 ~ d2 ~ d2@5 ~ d2@2", AD: "b1@11 ~ b1@2 c#2@2", AE: "d2@5 ~ d2@2 d1@4 d2@4",
  AF: "e2@5 ~ e2 ~ e1@4 e2@3 ~", AG: "[b2@22 ~ d3 d3@2 b2@2 c#3@2 a2@2]/2", AH: "f#2@14 e2 ~",
  AI: "e2@6 d2 ~ d2@6 b1 ~", AJ: "[b1@23 d2 e2@2 d2@2 b1@2 a1@2]/2", AK: "f#1@14 e1 ~", AL: "e1@6 d1 ~ d1@6 c#1 ~",
  AM: "c#1@6 d1 ~ d1@6 e1 ~", AN: "e1@6 f#2 a2", AO: "a1@5 ~ a1 ~ a1@6 e2 ~", AP: "a1@5 ~ a1 ~ a1@6 e1 ~", AQ: "a1",
})).s("gm_acoustic_bass").gain(0.41)

// chords · piano · "A.PIANO 2"
const piano = note(`<
  A B C D E F@2 G C H E I@2 J K L@3 M N O J P Q@3 R S T U V W X Y V Z X AA AB AC AD AC AE AF AG AH AI G C AJ E AK@2 J K
  L@3 M N O J P Q@3 R S T U V W X Y V Z X AL AB AC AD AC AE AF AG AH AI G C AJ E AK@2 ~@10 J K L@3 M N O J P Q@3 R S T
  AM AB AC AD AC AE AF AG AH AI G C AJ E AK@2 G C AJ E AK@2 AN AO@2 AP AQ@2 AR
>`.pickRestart({
  A: "~@3 [a4,b4,e5]", B: "[a4,c#5,e5]@5 ~ [a4,b4,e5] ~ [a4,b4,e5]@6 [a4,c#5,e5] ~",
  C: "[a4,c#5,e5]@5 ~ [a4,b4,e5] ~ [a4,b4,e5]@5 ~ [a4,d5,e5] ~", // A Asus2 Asus4
  D: "[a4,d5]@5 ~ [a4,c#5] ~ [a4,c#5,e5]@6 [g#4,b4,e5] ~, e5@3 ~@5", // D5 A E
  E: "[g#4,b4,e5]@5 ~ [f#4,a4,e5] ~ [f#4,a4,e5]@5 ~ [e4,a4,e5] ~", // E F#m7 A5
  F: "[[e4,a4,e5]@5 ~ [f#4,a4,e5] ~ [f#4,a4,e5]@21 ~@3]/2", // A5 F#m7
  G: "[a4,c#5,e5]@5 ~ [a4,b4,e5] ~ [a4,b4,e5]@5 ~ [a4,c#5,e5] ~", // A Asus2 A
  H: "[a4,d5,e5]@5 ~ [a4,c#5,e5] ~ [a4,c#5]@5 ~ [g#4,b4] ~, ~@4 e5@3 ~", // Asus4 A G#m
  I: "[[e4,a4,e5]@5 ~ [f#4,a4,e5] ~ [f#4,a4,e5]@10 [f#4,a4,e5]@11 ~@3]/2", J: "[a4,c#5,e5]@7 ~ [a4,b4,e5]@8",
  K: "[a4,c#5,e5]@7 ~ [a4,b4,e5]@7 ~", // A Asus2
  L: "[[a4,d5,e5]@21 ~@2 e5 f#5@2 a5 ~ b4@2 ~@2 a4@7 ~ [a4,b4,e5]@8, ~@28 e5@11 ~@9, ~@10 c#5@3 ~@3]/3", // Asus4 Asus2
  M: "[a4,c#5,e5]@6 [a4,b4,e5]@5 ~ [a4,c#5,e5]@3 ~", N: "[a4,d5,e5]@11 ~ [a4,d5,e5]@3 ~",
  O: "[b4,e5]@7 ~ [g#4,b4,e5]@7 ~, g#4 ~@15", P: "[a4,c#5,e5]@7 ~ b4@4 c#5@3 ~, ~@8 [a4,e5]@7 ~",
  Q: "[[a4,d5,e5]@22 ~@2 e5 ~ e5 ~ b4 ~ b4@2 a4@7 ~ [a4,b4,e5]@8, ~@24 a5@3 ~@2 c#5@2 ~@17, ~@25 f#5@2 ~ e5@12 ~@8]/3", // Asus4 Asus2
  R: "[a4,c#5,e5]@7 ~ [a4,b4,e5]@3 ~ [a4,c#5,e5]@3 ~", S: "[a4,c#5,e5]@7 ~ [f#4,a4,e5]@7 ~", T: "[g#4,b4,e5]",
  U: "[a4,c#5,e5]@4 [a4,c#5,e5]@3 ~ [g#4,b4,e5]@3 ~ [g#4,b4,e5]@3 ~", // A E
  V: "[f#4,a4,d5]@3 ~ [f#4,a4,d5]@3 ~ [f#4,a4,d5]@3 ~ [f#4,a4,d5]@3 ~", // D
  W: "[a4,c#5,e5]@3 ~ [a4,c#5,e5]@3 ~ [f#4,a4,d5]@3 ~ [f#4,a4,d5]@3 ~", // A D
  X: "[g#4,b4,e5]@3 ~ [g#4,b4,e5]@3 ~ [g#4,b4,e5]@3 ~ [g#4,b4,e5]@3 ~", // E
  Y: "[a4,c#5,e5]@3 ~ [a4,c#5,e5]@3 ~ [g#4,b4,e5]@3 ~ [g#4,b4,e5]@3 ~", // A E
  Z: "[a4,c#5,e5]@3 ~ [a4,c#5,e5]@3 ~ [f#4,a4,e5]@3 ~ [f#4,a4,e5]@3 ~", AA: "[a4,c#5,e5]@7 ~ [g#4,b4,e5]@8",
  AB: "[f#4,a4,e5]@11 ~ [a4,e5]@2 ~@2, ~@12 f#4 ~@3", AC: "[a4,c#5,e5]@5 ~ [a4,c#5,e5] ~ [g#4,b4,e5]@5 ~ [g#4,b4,e5] ~",
  AD: "[f#4,a4,e5]@11 ~ [f#4,a4,e5]@3 ~", AE: "[f#4,a4,e5]@11 ~ [a4,e5]@3 ~, ~@12 f#4 ~@3",
  AF: "[a4,c#5,e5]@5 ~ [a4,c#5,e5] ~ [g#4,b4,e5]@6 [g#4,b4,e5] ~", AG: "[f#4,a4,e5]@15 ~",
  AH: "[f#4,a4,d5]@11 ~ [f#4,a4,d5]@2 ~@2", AI: "[g#4,b4,e5]@7 ~",
  AJ: "[a4,d5,e5]@5 ~ [a4,c#5,e5] ~ [a4,c#5,e5]@5 ~ [g#4,b4,e5] ~", // Asus4 A E
  AK: "[[e4,a4,e5]@5 ~ [f#4,a4,e5] ~ [f#4,a4,e5]@10 [f#4,a4,e5]@10 ~@4]/2", AL: "[a4,c#5,e5]@7 ~ [g#4,b4,e5]@7 ~",
  AM: "[a4,c#5]@7 ~ [g#4,b4,e5]@8, e5 ~@15", AN: "[a5,a6]",
  AO: "[~@6 a5@2 ~@4 b4@3 ~ [a4,c#5,a5]@16, ~@2 a4@5 ~@3 e5@21 ~, ~ c#5 g#5@2 ~@4]/2", // A
  AP: "~@2 b4 ~ b4@2 a4 ~@5 e5@4, ~ e5@3 ~@4, ~@3 c#5@2 ~@3 [g#4,b4]@8", // G#m
  AQ: "[~@12 a6@8 ~@4 [e5,g#5,b5]@3 ~ [e5,g#5,b5]@2 ~@2, [a4,c#5]@11 ~@5, ~@10 a5@11 ~@11]/2", AR: "[a4,e5,a5,c#6]",
})).s("gm_piano").gain(0.31)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~ A@2 B@4 C@6 A@6 D E A@6 F G H I J K H L M N O ~@9 A@2 B@4 A@6 D E A@6 F G P I J K H L M N O ~@9 A@2 B@4 Q R S T Q R
  S T U V A@6 D E A@6 F G W ~@9 A@2 B@4 A@2 B@4 X@2 Y@2 Z@3
>`.pickRestart({
  A: "[[a3,e4]@31 ~]/2", B: "[a3@17 b3@7 a3@15 ~ [a3,e4]@21 ~@3, e4@5 ~@3]/4",
  C: "[a3@47 ~ b3@8 [a3,e4]@39 ~, e4@55 ~@41]/6", D: "[a3,e4]@15 ~", E: "[b3,e4]@15 ~", F: "[a3,e4]@8 [a3,d4]@7 ~",
  G: "[b3,e4]@7 ~", H: "[a3,c#4,e4]@7 ~ [g#3,b3,e4]@7 ~", I: "[f#3,a3,d4]@15 ~",
  J: "[a3,c#4,e4]@7 ~ [f#3,a3,d4]@7 ~, d4 ~@15", K: "[g#3,b3,e4]@15 ~", L: "[f#3,a3,d4]@7 ~ [f#3,a3,d4]@7 ~",
  M: "[a3,c#4,e4]@7 ~ [f#3,a3,d4]@7 ~", N: "[b3,c4] b3@14 ~, [g#3,e4]@15 ~", O: "[a3,c#4,e4]@7 ~@9",
  P: "[a3,c#4]@7 ~ [g#3,b3,e4]@7 ~, e4 ~@15", Q: "[b3,d4]@15 ~", R: "[a3,c#4]@7 ~ [b3,d4]@7 ~", S: "[a3,c#4]@15 ~",
  T: "[b3,e4]@7 ~ [a3,e4]@7 ~", U: "[g#3,e4]@7 ~ [a3,e4]@8", V: "~ b3@14 ~, e4@7 ~", W: "e4 ~@15",
  X: "[[a3,e4,a5]@31 ~]/2", Y: "[[a3,a5]@31 ~, e4 ~@31]/2", Z: "[[a3,e4] ~@31 [a3,e4] ~@15, a5, ~@2 a4]/3",
})).s("gm_string_ensemble_1").gain(0.31)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1_2 = note(`<
  ~@37 A B A C D E A F G H ~@30 A B A C D E A F I J ~@32 A B A C D E A F I J ~@19
>`.pickRestart({
  A: "[a3,a4,c#5,e5] [g#3,g#4,b4,e5]", B: "[a3,a4,d5,e5]", C: "[a4,b4]@8 [a4,d5]@7 ~, [a3,e5]",
  D: "[a3,a4,c#5,e5] [b3,g#4,b4,e5]", E: "[a3,a4,d5,e5]@15 ~", F: "[a3,f#4,a4,d5]", G: "[a3,f#4,a4]",
  H: "[g#4,b4]@3 ~, b3@7 ~", I: "[f#4,a4]@15 ~", J: "[g#4,b4]@3 ~",
})).s("gm_string_ensemble_1").gain(0.31)

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

// drums · rim
const rim = s("rim").struct("<[~@3 x] [~ x ~ x]!146 ~>").gain(0.51)

// drums · hihat
const hihat = s("hh").struct(`<
  A B@11 C B@15 C B@17 C B@5 C B@15 C B@17 C B@5 C B@9 C B@15 C B@9 C B@5 C B@5 C B@5 D ~
>`.pickRestart({
  A: "x ~@2 x!2 ~@3 x ~@3 x ~@3", B: "x!8", C: "x!7 ~", D: "x!3 ~@2 x!3",
})).gain(0.46)

// drums · open hat
const open_hat = s("oh").struct(`<
  A ~@11 B ~@15 B ~@17 B ~@5 B ~@15 B ~@17 B ~@5 B ~@9 B ~@15 B ~@9 B ~@5 B ~@5 B ~@5 C ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@3 x", C: "~ x ~@2",
})).gain(0.51)

// drums · crash
const crash = s("cr").struct("<~@29 A ~@39 A ~@49 A ~@26 B A>".pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.51)

stack(pan_flute, bass, piano, string_ensemble_1, string_ensemble_1_2, kick, rim, hihat, open_hat, crash)

More by Don Henley