Strudelify

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: edit a riff to change every repeat.

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

// bass · slap bass 2 · "BASS"
const bass = note(`<
  ~@3 A B C D E B F G H B@3 I B@2 J K L M N O P O P Q J R S T U C V W J B@2 X Y B@2 I B@3 Z B@3 AA AB AC P AD AE AF AG
  AH AI AJ AK AL B AM AN AO U AP AQ AR B AS B AT O AU M AV O@2 AW AX AY AM AZ BA B BB BC AL B BD BE BF B BG BH BI BJ BF
  J BD BK BL B BD BM BL B BD BM X AN BN ~
>`.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 ~@2 d1@2 ~@2 d1 ~@3", G: "d1@2 ~@2 d1 ~@3 d1@2 ~@2 d1@2 ~@2", H: "d1@2 ~@2 d1@2 ~ d1 ~@4 c1@3 ~",
  I: "d1 ~ d1 ~ d1 ~ d1 a1", J: "d1@2 ~@2 d1@2 ~@2 d1@3 ~ d1@2 ~@2", K: "d1 ~ d1 ~ d1 ~ d1 e1",
  L: "f1@2 f1 ~ f1@2 ~@2 f1@2 ~@2 f1@3 ~", M: "g1@2 ~@2 g1@2 ~@2 g1@2 ~@2 g1@3 ~",
  N: "f1 ~ f1 ~ f1@3 ~ f1@2 ~@2 f1@2 ~@2", O: "g1 ~ g1 ~ g1 ~ g1 ~", P: "f1 ~ f1 ~ f1 ~ f1 ~",
  Q: "g1@2 ~@2 a1@2 ~@2 g1@2 ~@2 f1@3 ~", R: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d2@2 a1 d1",
  S: "~ d2 d1 ~ d2 ~ d1 ~ d1@2 ~@2 d1@2 ~@2", T: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 c1@3 ~",
  U: "d1@3 ~ d1@2 ~@2 d1@2 ~@2 d1@2 ~@2", V: "~ a1 d1@2 d2 ~ d1@2 d1@2 ~@2 d1@2 ~@2", W: "d1 ~ d1 ~ d1 ~ c1 db1",
  X: "d1 ~ d1 ~ d1 ~ d2 d1", Y: "~ a1 d1 ~ d2@2 d1 ~ d1 ~@3 d1@2 ~@2", Z: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d2@2 d1 ~",
  AA: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d1@2 e1 ~", AB: "f1 ~ f1 ~ f1@3 ~ f1@3 ~ f1@3 ~",
  AC: "g1@3 ~ g1@3 ~ g1@2 ~@2 g1@2 ~@2", AD: "g1@2 ~@2 g1@2 ~@2 g1 ~@3 g1@2 ~@2", AE: "f1 ~@3 f1 ~@3 f1 ~@3 f1 ~@3",
  AF: "g1 ~@3 g1 ~@3 g1@2 ~@2 g1@2 ~@2", AG: "f1 ~@3 f1 ~@3 f1@2 ~@2 f1@2 ~@2", AH: "g1@3 ~ a1@3 ~ g1@3 ~ f1@4",
  AI: "~@2 d1 ~ d1 d2 d1 ~", AJ: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d1@2 d2 d1", AK: "~ d1 a1@2 d1 ~@3 d1 ~@3 d1@2 ~@2",
  AL: "d1 ~ d1 ~ d1 ~ c1@2", AM: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 a1@2 d1 a1", AN: "~ a1 d1@2 a1@2 d1 ~ d1@2 ~@2 d1@2 ~@2",
  AO: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 c1@2 db1 ~", AP: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d1 ~ g1@2",
  AQ: "g1@2 d1@2 a1@2 d1 ~ d1@2 ~@2 d1@2 ~@2", AR: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d1@2 ~ c2",
  AS: "d1@2 ~@2 d1 ~@3 d1@2 ~@2 a1 ~ a1 ~", AT: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 d1 ~ f1 ~", AU: "g1 ~ g1 ~ g1 ~ e2 g2",
  AV: "g1@2 ~@2 e2@2 g2 ~ d3@4 a2@4", AW: "g1@2 ~@2 g1@2 ~@2 g1 ~@3 e2@2 g2 ~",
  AX: "a2 ~ a2 ~ g2 ~ g2 ~ e2 ~ e2 ~ d2 ~ d2 ~", AY: "d1 d2 d1 ~ d1 ~ d1 ~",
  AZ: "~ a1 d1@2 d2@2 d1 ~ d1@2 ~@2 d1@2 ~@2", BA: "d1 ~ d1 ~ d1 ~ c2 d2", BB: "d1@2 ~@2 d1 ~@3 d1 ~@3 d2@2 d1 a1",
  BC: "~ a1 d1 ~ d2@2 d1 ~ d1@2 ~@2 d1@2 ~@2", BD: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 a1@2 d1 d2",
  BE: "~ d2 d1 ~ a1@2 d1 ~ d1@2 ~@2 d1@2 ~@2", BF: "d1 ~ d1 ~ d1 ~ g1@2", BG: "d1@2 ~@2 d1@2 ~@2 d1 ~@3 d2@2 d1@2",
  BH: "~ a1 d1 ~ a1 ~ d1 ~ d1@2 ~@2 d1@2 ~@2", BI: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 a1@2 g1 f1",
  BJ: "~ f1 d1 ~ f1@2 d1 ~ d1@2 ~@2 d1@2 ~@2", BK: "~ d2 d1 ~ d2 ~ d1 ~ d1 ~@3 d1@2 ~@2",
  BL: "d1@2 ~@2 d1@2 ~@2 d1@2 ~@2 a1@2 d1 ~", BM: "~ d2 d1@2 a1@2 d1 ~ d1@2 ~@2 d1@2 ~@2",
  BN: "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 E F E G A B C D E B E D H I J I H I J K A B C D E F E G A B C D E F E G A B C D E F E G H I J I H I J K A
  B C D E B E D A B E D E F E D L M N O L M P Q 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]@8",
  D: "[d3,a3,c4,e4,g4] ~@3 [d3,a3,d4,f4,a4]@3 [d3,a3,c4,e4,g4] ~@8", E: "~@4 [d3,a3,c4,e4,g4] ~@3 [d3,a3,d4,f4,a4]@7 ~",
  F: "[d3,a3,c4,e4,g4] ~@3 [d3,a3,c4,e4,g4]@2 ~ [d3,a3,d4,f4,a4] ~@8", // Am7 Dm
  G: "[d3,a3,c4,e4,g4] ~@3 [d3,a3,d4,f4,a4]@2 ~ [d3,a3,c4,e4,g4] ~@8", H: "[f2,f3,a3,c4,f4]", I: "[g2,g3,b3,d4,g4]",
  J: "[f2,a3,c4,e4,a4]", // Fmaj7
  K: "[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
  L: "~ g3, [g2,d4,g4,b4]", M: "~ g3, [g2,e4,a4,c5]", N: "~ g3, [g2,gb4,b4,d5]", O: "~ g3, [g2,e4,g4,c5]",
  P: "~@8 g3@7 ~, [g2,gb4,b4,d5]@15 ~", Q: "[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