Strudelify
Hang In Long Enough cover art

1989 · ...But Seriously

Hang In Long Enough

Phil Collins

KeyD minorTempo128 bpm
0:00/0:00
// Hang In Long Enough — Collins Phil
// 128 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 3 "BRASS1" brass section (copy of ch 8 "BRASS3" brass section)
// note: Full arrangement: all 117 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(128/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order, A@4 for four bars: edit a riff to change every repeat.

// other · brass section · "BRASS2"
const brass_section = note(`<
  ~@5 A B C ~ A B C ~@17 A B C ~ A B C ~@25 D B C ~ A B C ~ A B C ~ A B C ~@9 A B C ~ E B C ~@7 F G C ~ A B C ~ A B C ~
  A B H B H ~
>`.pickRestart({
  A: "~@12 [a4,a5] [c5,c6] [d5,d6] [f5,f6]", B: "~ [f5,f6] [d5,d6] ~@13", C: "~@6 [c5,c6] [d5,d6]",
  D: "~@12 [a5,a6] ~ [g5,g6] [f5,f6]", E: "~@12 [a4,a5] ~ [d5,d6] [f5,f6]", F: "~@12 [a4,a5]!2 [g4,g5] [f4,f5]",
  G: "~ [f4,f5] [d4,d5] ~@13", H: "~@12 [a4,a5] [g4,g5] [f4,f5] [d4,d5]",
})).s("gm_brass_section").gain(0.6)

// chords · music box · "BELL"
const music_box = note("<~@76 A B C D A B C D ~@33>".pickRestart({
  A: "[d5,g5,b5,d6]", B: "[e5,g5,c6,d6]@15 ~", C: "[gb5,g5,b5,d6]@15 ~", D: "[e5,g5,c6,d6]",
})).s("gm_music_box").gain(0.19)

// bass · slap bass 2 · "BASS"
const bass = note(`<
  ~@3 A B C D E B@3 F B@3 G B@3 H I J K L M L M N B O P Q B C R S B@3 T R B@2 G B@3 U B@3 H V L M L W L M X Y Z AA Q B
  AB AC AD B AE AF AG B AH B AI L AJ L AK L@2 AL AM AN AB AO AP B AQ AO Q B AR AS AT B AU AV AW AX AT AY AR P AZ B AR AS
  AZ B AR AS T AC BA ~
>`.pickRestart({
  A: "~@3 a1", B: "d1 ~ d1 ~ d1 ~ d1 ~", C: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d1 ~ d1 a1",
  D: "~ a1 d1 ~ d1 ~@3 d1@2 ~@2 d1@2 ~@2", E: "d1@2 ~@2 d1@2 ~ d1@2 ~@3 d1@2 d1@2", F: "d1@2 ~@2 d1@2 ~ d1 ~@4 c1@3 ~",
  G: "d1 ~ d1 ~ d1 ~ d1 a1", H: "d1 ~ d1 ~ d1 ~ d1 e1", I: "f1@2 f1 ~ f1@2 ~@2 f1@2 ~@2 f1@3 ~",
  J: "g1@2 ~@2 g1@2 ~@2 g1@2 ~@2 g1@3 ~", K: "f1 ~ f1 ~ f1@3 ~ f1@2 ~@2 f1@2 ~@2", L: "g1 ~ g1 ~ g1 ~ g1 ~",
  M: "f1 ~ f1 ~ f1 ~ f1 ~", N: "g1@2 ~@2 a1@2 ~@2 g1@2 ~@2 f1@3 ~", O: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d2@2 a1 d1",
  P: "~ d2 d1 ~ d2 ~ d1 ~ d1@2 ~@2 d1@2 ~@2", Q: "d1 ~ d1 ~ d1 ~ c1@2", R: "~ a1 d1@2 d2 ~ d1@2 d1@2 ~@2 d1@2 ~@2",
  S: "d1 ~ d1 ~ d1 ~ c1 db1", T: "d1 ~ d1 ~ d1 ~ d2 d1", U: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d2@2 d1 ~",
  V: "f1 ~ f1 ~ f1@3 ~ f1@3 ~ f1@3 ~", W: "f1 ~@3 f1 ~@3 f1 ~@3 f1 ~@3", X: "g1@3 ~ a1@3 ~ g1@3 ~ f1@4",
  Y: "~@2 d1 ~ d1 d2 d1 ~", Z: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d1@2 d2 d1", AA: "~ d1 a1@2 d1 ~@3 d1 ~@3 d1@2 ~@2",
  AB: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 a1@2 d1 a1", AC: "~ a1 d1@2 a1@2 d1 ~ d1@2 ~@2 d1@2 ~@2",
  AD: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 c1@2 db1 ~", AE: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d1 ~ g1@2",
  AF: "g1@2 d1@2 a1@2 d1 ~ d1@2 ~@2 d1@2 ~@2", AG: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d1@2 ~ c2",
  AH: "d1@2 ~@2 d1 ~@3 d1@2 ~@2 a1 ~ a1 ~", AI: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d1 ~ f1 ~", AJ: "g1 ~ g1 ~ g1 ~ e2 g2",
  AK: "g1@2 ~@2 e2@2 g2 ~ d3@4 a2@4", AL: "g1@2 ~@2 g1@2 ~@2 g1 ~@3 e2@2 g2 ~",
  AM: "a2 ~ a2 ~ g2 ~ g2 ~ e2 ~ e2 ~ d2 ~ d2 ~", AN: "d1 d2 d1 ~ d1 ~ d1 ~", AO: "~ a1 d1 ~ d2@2 d1 ~ d1 ~@3 d1@2 ~@2",
  AP: "d1 ~ d1 ~ d1 ~ c2 d2", AQ: "d1@2 ~@2 d1 ~@3 d1 ~@3 d2@2 d1 a1", AR: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 a1@2 d1 d2",
  AS: "~ d2 d1@2 a1@2 d1 ~ d1@2 ~@2 d1@2 ~@2", AT: "d1 ~ d1 ~ d1 ~ g1@2", AU: "d1@2 ~@2 d1@2 ~@2 d1 ~@3 d2@2 d1@2",
  AV: "~ a1 d1 ~ a1 ~ d1 ~ d1@2 ~@2 d1@2 ~@2", AW: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 a1@2 g1 f1",
  AX: "~ f1 d1 ~ f1@2 d1 ~ d1@2 ~@2 d1@2 ~@2", AY: "d1@2 ~@2 d1@2 ~@2 d1@3 ~ d1@2 ~@2",
  AZ: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 a1@2 d1 ~", BA: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d1 d2 a1 d1",
})).s("gm_slap_bass_2").gain(0.36)

// chords · harpsichord · "PIANO"
const harpsichord = note(`<
  ~@4 A B C D C B C D A B C D C B C D E F G F E F G H A B C D C B C I A B C D C B C D A B C D C B C I E F G F E F G H A
  B C D C B C D A B C D C B C D J K L M J K L N A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D ~
>`.pickRestart({
  A: "d3 ~@3 [d3,a3,c4,e4,g4] ~@3 [d3,a3,d4,f4,a4]@7 ~", // Am7 Dm
  B: "[d3,a3,c4,e4,g4] ~@3 [d3,a3,c4,e4,g4]@3 [d3,a3,d4,f4,a4] ~@8", C: "~@4 [d3,a3,c4,e4,g4] ~@3 [d3,a3,d4,f4,a4]@7 ~",
  D: "[d3,a3,c4,e4,g4] ~@3 [d3,a3,d4,f4,a4]@3 [d3,a3,c4,e4,g4] ~@8", E: "[f2,f3,a3,c4,f4]", F: "[g2,g3,b3,d4,g4]",
  G: "[f2,a3,c4,e4,a4]", // Fmaj7
  H: "[g2,g3,b3,d4,g4]@4 [a2,a3,c4,e4,a4]@4 [g3,b3,g4]@2 ~@2 [f2,a3,c4,e4,a4]@3 ~, ~@2 [g2,d4] ~", // G Am G Fmaj7 G5
  I: "[d3,a3,c4,e4,g4] ~@3 [d3,a3,d4,f4,a4]@2 ~ [d3,a3,c4,e4,g4] ~@8", J: "~ g3, [g2,d4,g4,b4]",
  K: "~ g3, [g2,e4,a4,c5]", L: "~ g3, [g2,gb4,b4,d5]", M: "~ g3, [g2,e4,g4,c5]", N: "[g2,g3,e4,g4,c5]@15 ~",
})).s("gm_harpsichord").gain(0.17)

// other · music box · "BELL"
const music_box_2 = note("<~@20 A B C B A B C ~@25 A B C B A B C ~@58>".pickRestart({
  A: "[f5,f6] ~@15", B: "[g5,g6] ~@15", C: "[a5,a6] ~@15",
})).s("gm_music_box").gain(0.8)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 A@18 B A@4 C D A@4 E F G A@18 B A B A@2 C D E F A@2 E H G A@3 E H A@10 B D E F A@3 F G A@7 E H A@2 E H A@2 E F A@2
  E F A@2 E ~
>`.pickRestart({
  A: "x!2", B: "x ~@3 x ~@2 x", C: "x!3 ~", D: "~ x!2 ~", E: "x ~@7 x ~@6 x", F: "~ x ~ x!2 ~@3", G: "x ~ x!2",
  H: "~ x ~@2 x ~@3",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct(`<
  ~@3 A B@7 C B@7 D B@7 E F B@6 G B@15 H B@7 E F B@6 G B@7 I B@7 D F B@4 I B@9 G B@3 G B@7 J B@3 K ~
>`.pickRestart({
  A: "~@8 x!6 ~@2", B: "~ x ~ x", C: "~@4 x ~@4 x!2 ~ x ~@3", D: "~@2 x ~@2 x!2 ~", E: "~@4 x ~@6 x!2 ~ x ~",
  F: "x!2 ~ x", G: "~@4 x ~@4 x!2 ~ x ~ x ~", H: "~@4 x ~@7 x ~@2 x", I: "~@4 x ~@7 x ~ x!2", J: "~@2 x ~ x!3 ~",
  K: "~@4 x ~@3 x!3 ~ x ~ x!2",
})).gain(0.5)

// drums · hihat
const hihat = s("hh").struct(`<
  A@3 ~ B C@6 D B C@6 E B C@6 F G C@5 B F B C@7 B C@7 B C@6 F G C B C@3 B F B C@3 B C@2 F A@8 G C B F B C H C B C@6 F I
  F C F I C@3 B C@2 F J C@2 K ~
>`.pickRestart({
  A: "x!4", B: "~ x!7", C: "x!8", D: "x!5 ~ x ~", E: "x!5 ~ x!2", F: "x!7 ~", G: "x!2 ~ x ~ x!3",
  H: "~ x!2 ~ x ~ x ~ x ~ x ~ x ~ x ~", I: "x ~@2 x ~ x!3", J: "~@3 x!5", K: "x ~ x ~ x ~ x ~ x ~@3 x ~@2 x",
})).gain(0.25)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@5 A ~@5 B ~@21 A ~@27 A ~@3 A ~@5 A ~@13 A ~@13 A ~ C ~ A ~@3 A ~@3 D ~@5
>`.pickRestart({
  A: "~@15 x", B: "~@7 x", C: "~@7 x ~@6 x ~", D: "~@7 x ~@8",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@7 A ~@7 A ~@7 B ~@7 A ~@7 A ~@7 A ~@7 B ~@7 A ~@7 A ~@7 B ~@2 C A ~@2 D A ~@7 E ~@3 E ~@6 F G ~@4
>`.pickRestart({
  A: "x", B: "~ x!2 ~", C: "~@7 x", D: "~@3 x", E: "~ x", F: "~@15 x", G: "~ x ~@6",
})).gain(0.45)

// drums · ride bell
const ride_bell = s("rd").struct("<~@76 [~ x!3] [x!4]!6 [x!3 ~] ~@33>").gain(0.35)

stack(brass_section, music_box, bass, harpsichord, music_box_2, kick, snare, hihat, open_hat, crash, ride_bell)

More by Phil Collins