Strudelify

You Keep Me Hanging On

The Supremes

KeyE♭ minorTempo127 bpm
0:00/0:00
// You Keep Me Hanging On — The Supremes
// 127 bpm, 4/4, key D# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 12 electric guitar muted (copy of ch 2 electric guitar muted)
// note: Full arrangement: all 91 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 28.
setcpm(127/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.

// bass · electric bass pick
const bass = note(`<
  ~@3 A B C D E B C D E B C D F G H I G@2 H I J K L M N B C D E B C D E B C D F G H I G@2 H O P ~@2 B C D E B C D F G H
  I G@2 H I J K L M N B C D E B C D E B C D E B C D E B C D E ~
>`.pickRestart({
  A: "~@6 eb2 g2", B: "ab2@4 ab2@3 ab2 eb2@2 ab2@2 eb2@2 ab2!2", C: "gb2@4 gb2@3 gb2 db2@2 gb2@2 db2@2 gb2!2",
  D: "db2@4 db2@3 db2 ab1@2 c2@2 db2@2 gb2@2", E: "e2@4 e2@3 e2 eb2@2 eb2@2 gb2 ~ g2 ~",
  F: "e2@4 e2@2 eb2 ~ eb2@4 eb2 ~ bb1 ~", G: "b1@4 b1@3 b1 gb1@2 gb1@2 a1@2 bb1@2",
  H: "b1@4 b1@3 b1 gb1@2 b1@2 gb1@2 b1@2", I: "e1@4 e1@3 e1 e2@2 gb1@2 ab1@2 a1@2", J: "b1@2 b2 a2 bb2@2 bb2 gb2",
  K: "gb2@4 gb2@3 gb2 db2@2 db2@2 e2@2 gb2@2", L: "gb1@2 gb1 db2 gb2 db2 gb2 f2", M: "eb2@2 eb2@2 bb2!2 bb1 db2",
  N: "eb2 eb2@2 ~ f2@2 gb2 g2", O: "e1@4 e1@3 e1 e2@2 b1@2 e2@2 a1@2", P: "ab1",
})).s("gm_electric_bass_pick").gain(0.54)

// other · electric guitar muted
const electric_guitar_muted = note("<A B@15 ~@11 B@13 ~@8 B@10 ~@11 B@17 C ~@4>".pickRestart({
  A: "[eb4,eb5] eb5 ~ eb5 ~ eb5!2 ~ eb5!2 ~ eb5!2 ~ eb5 ~", B: "eb5!2 ~ eb5 ~ eb5!2 ~ eb5!2 ~ eb5!2 ~ eb5 ~",
  C: "eb5!2 ~ eb5 ~ eb5!2 ~ eb5!2 ~ eb5 ~@4",
})).s("gm_electric_guitar_muted").gain(0.45).pan(0)

// other · electric guitar muted · soft notes
const electric_guitar_muted_2 = note("<~@86 [~@12 eb5 ~ eb5 ~] [eb5!2 ~ eb5 ~ eb5!2 ~ eb5!2 ~ eb5!2 ~ eb5 ~]!3 ~>")
  .s("gm_electric_guitar_muted").gain(0.15).pan(0)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@4 A B C D A B C D A B C D E@2 F G E@2 F H I@2 J@2 A B C D A B C D A B C D E@2 F G E@2 F K ~@2 A B C D A B C D E@2 F
  G E@2 F H L@2 J@2 A B C D A B C D A B C D A B C D A B C D ~
>`.pickRestart({
  A: "[eb3,ab3,c4]", B: "[gb3,bb3,eb4]", C: "[bb3,db4,gb4]", D: "[b3,e4,ab4] [b3,eb4,b4]",
  E: "[[e3,a3,db4,e4]@12 [a3,db4,e4]!2 ~@2]/2", F: "[e3,ab3,b3]", G: "[gb3,b3,eb4]@4 [gb3,b3,eb4] [gb3,b3,eb4]@3",
  H: "[gb3,b3,eb4] [gb3,bb3,eb4]", I: "[gb3,bb3,db4,gb4]/2", J: "[eb3,g3,bb3,eb4]/2", K: "[ab3,c4,eb4]",
  L: "[gb4@13 ~ f4 e4, [gb3,bb3,db4], ~@13 gb4@3]/2", // Gb
})).s("gm_electric_guitar_clean").gain(0.29).pan(0)

// chords · electric guitar clean
const electric_guitar_clean_2 = note(`<
  ~@16 A@2 B C A@2 B D E@2 F@2 ~@12 A@2 B C A@2 B ~@11 A@2 B C A@2 B D E@2 F@2 ~@21
>`.pickRestart({
  A: "~@2 [db4,e4,a4] ~@3 [db4,e4,a4] ~", B: "~@2 [ab3,b3,e4] ~@3 [ab3,b3,e4] ~",
  C: "~@2 [eb4,gb4,b4] ~@3 [eb4,gb4,b4] ~", D: "~@2 [eb4,gb4,b4] ~@3 [eb4,gb4,bb4] ~",
  E: "~@2 [bb3,db4,gb4] ~@3 [bb3,db4,gb4] ~", F: "~@2 [g3,bb3,eb4] ~@3 [g3,bb3,eb4] ~",
})).s("gm_electric_guitar_clean").gain(0.29).pan(1)

// chords · drawbar organ
const drawbar_organ = note(`<
  A B C D E F G H E F G H E F G H I@2 J K L@2 J M N@2 O@2 E F G H E F G H E F G H I@2 J K L@2 J E ~@2 E F G H E F G H
  I@2 J K L@2 J M N@2 O@2 E F G H E F G H E F G H E F G H E F G H ~
>`.pickRestart({
  A: "[eb5,ab6]", B: "[eb5,gb6]", C: "[bb4,db5,gb5]", D: "[e5,ab5,b5] [eb5,gb5,b5]", E: "[c5,eb5,ab5]",
  F: "[eb5,gb5,bb5]", G: "[db5,gb5,bb5]", H: "[e5,ab5,b5] [b4,eb5,b5]", I: "[[db5,e5,a5]@12 [a4,db5,e5]!2 ~@2]/2",
  J: "[ab4,b4,e5]", K: "[gb4,b4,eb5]@4 [gb4,b4,eb5] [gb4,b4,eb5]@3", L: "[[db5,e5,a5]@12 [db5,e5,a5]!2 ~@2]/2",
  M: "[gb4,b4,eb5] [gb4,bb4,eb5]", N: "[bb4,db5,gb5]/2", O: "[bb4,eb5,g5]/2",
})).s("gm_drawbar_organ").gain(0.1)

// other · woodblock
const woodblock = note("<~@16 A@11 B@2 ~@11 A@7 B@2 ~@9 A@11 B@2 ~@20>".pickRestart({
  A: "c4@2 c4!2 c4@2 c4!2 c4@2 c4@2 c4@2 c4@2", B: "[c4@2 c4!2 c4@2 c4!2 c4@2 c4@2 c4@2 c4@4 ~@14]/2",
})).s("gm_woodblock").gain(0.48)

// drums · kick
const kick = s("bd").struct("<~@4 [x!4]!44 ~@2 [x!4]!40 ~>").gain(0.54)

// drums · snare
const snare = s("sd").struct("<~@3 [~@8 x!5 ~@3] [x!4]!44 x [~@12 x!3 ~] [x!4]!40 ~>").gain(0.7)

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 [~@6 x!2] ~@87>").gain(0.62)

// drums · high tom
const high_tom = s("ht").struct("<~@49 [~@7 x] ~@41>").gain(0.54)

// drums · tambourine
const tambourine = s("tb").struct("<~@4 [~ x ~ x]!44 x ~ [~ x ~ x]!40 ~>").gain(0.7)

stack(
  bass, electric_guitar_muted, electric_guitar_muted_2, electric_guitar_clean, electric_guitar_clean_2, drawbar_organ,
  woodblock, kick, snare, mid_tom, high_tom, tambourine
)

More by The Supremes