Strudelify

Maneater

Hall & Oates

KeyC minorTempo180 bpm
0:00/0:00
// Maneater — Hall & Oates
// 180 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 161 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(180/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · drawbar organ · "ORGAN 1"
const drawbar_organ = note(`<
  ~@16 A@2 B@2 C@2 D@2 E@2 F G H@2 I@2 A@2 B@2 C@2 D@2 E@2 F G H@2 J@2 ~@20 A@2 B@2 C@2 D@2 E@2 F G H@2 J@2 ~@77
>`.pickRestart({
  A: "[[bb4,eb5,g5]@7 ~]/2", B: "[[bb4,d5,f5]@7 ~]/2", C: "[[ab4,db5,f5]@7 ~]/2", D: "[[g4,c5,e5]@7 ~]/2",
  E: "[[f4,ab4,c5,eb5]@7 ~]/2", F: "[bb4,d5,f5]@3 ~", G: "[b4,d5,f5]@3 ~", H: "[[c5,eb5,g5]@5 ~ [bb4,d5,f5] ~]/2",
  I: "[[c5,eb5,g5]@7 ~]/2", J: "[[c5,e5,g5]@7 ~]/2",
})).s("gm_drawbar_organ").gain(0.31)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  A@2 B C D E F G H I J@2 K@2 L@2 M@2 N O P Q H R S T U V W@2 X@2 Y Z N O AA@2 AB@2 AC@2 U AD AE AF AE AG H AH F AI AJ
  AK AL AM H AN AO@2 AP AQ AR AS AT AU H AV AW AX N O P AY AZ BA AP BB U BC AE BD BE AH H AH F AI AJ BF AL AM H AN AO@2
  AP AQ AR AS H AG H BG H BH B BI BJ BK BL@2 H BM F BN BJ BO BP@2 H BQ BR@2 AP BS BT BU H BM B BV BJ E BW@2 H BX B BY BZ
  AQ CA CB H BH F AI AJ AK AL AM H AN AO@2 AP AQ AR AS CC
>`.pickRestart({
  A: "[c2@3 ~@3 c2@3 ~@3 c2@6 ~@4 c2@4 ~@2 c2@3 ~@3 c2 ~ c2@3 ~@3 c2@6]/2", B: "bb1@3 ~@3 bb1@3 ~@3 bb1@6 ~@4 bb1@2",
  C: "~@2 bb1@2 ~ bb1 bb1@2 ~ bb1@3", D: "ab1@3 ~@3 ab1@3 ~@3 ab1@7 ~@3 ab1@2",
  E: "~@4 ab1@3 ~@3 ab1 ~ ab1@4 ~@2 ab1@6", F: "bb1@3 ~@3 bb1@3 ~@3 bb1@7 ~@3 bb1@2",
  G: "~@4 bb1@3 ~@3 bb1@2 c2@6 d2@6", H: "c2@3 ~@3 c2@3 ~@3 c2@6 ~@4 c2@2", I: "~@4 c2@3 ~@3 c2 ~ c2@5 ~ c2@6",
  J: "[bb1@3 ~@3 bb1@3 ~@3 bb1@6 ~@4 bb1@4 ~@2 bb1@4 ~@2 bb1 ~ bb1@4 ~@2 bb1@6]/2",
  K: "[ab1@3 ~@3 ab1@3 ~@3 ab1@7 ~@3 ab1@4 ~@2 ab1@4 ~@2 ab1@2 ab1@4 ~@2 ab1@6]/2",
  L: "[bb1@3 ~@3 bb1@3 ~@3 bb1@6 ~@4 bb1@4 ~@2 bb1@3 ~@3 bb1 ~ bb1@9 ~@3]/2",
  M: "[eb2@3 ~@3 eb2 ~@5 eb2@6 ~@4 eb2@4 ~@2 eb2@3 ~@3 eb2@2 eb2@10 ~@2]/2", N: "d2@3 ~@3 d2@3 ~@3 d2@6 ~@4 d2@2",
  O: "~@4 d2@3 ~@3 d2 ~ d2@12", P: "db2@3 ~@3 db2@3 ~@3 db2@6 ~@4 db2@2", Q: "~@4 db2@3 ~@3 db2 ~ db2@4 ~@2 db2@6",
  R: "~@4 bb1@3 ~@3 bb1@2 ab1@6 g1@4 ~@2", S: "f1@3 ~@3 f1 ~@5 f1@7 ~@3 f1@2", T: "~@4 f1@3 ~@3 f1@2 g1@6 c2@6",
  U: "bb1@3 ~@3 bb1@3 ~@3 bb1@9 ~ b1@2", V: "~@4 b1@3 ~@3 b1 ~ b1@4 ~@2 b1@6",
  W: "[c2@3 ~@3 c2@3 ~@3 c2@7 ~@3 c2@4 ~@2 c2@4 ~@2 c2@2 g1@3 ~@3 g1@6]/2",
  X: "[c2@3 ~@3 c2@3 ~@3 c2@7 ~@3 c2@4 ~@2 c2@4 ~@2 c2 ~ c2@6 d2@4 ~@2]/2", Y: "eb2@3 ~@3 eb2@3 ~@3 eb2@7 ~@3 eb2@2",
  Z: "~@4 eb2@3 ~@3 eb2 ~ eb2@12",
  AA: "[db2@3 ~@3 db2@3 ~@3 db2@7 ~@3 ab1@4 ~@2 db2@3 ~@3 db2 ~ bb1@3 ~ bb1@2 db2@6]/2",
  AB: "[c2@3 ~@3 c2@3 ~@3 c2@6 ~@4 c2@4 ~@2 bb1@3 ~@3 bb1@2 ab1@6 g1@6]/2",
  AC: "[f1@3 ~@3 f1@3 ~@3 f1@7 ~@3 f1@4 ~@2 f1@3 ~@3 f1@2 g1@6 c2@6]/2", AD: "~@4 b1@3 ~@3 b1 ~ b1@4 ~@2 b1@4 ~@2",
  AE: "c2@3 ~@3 c2@3 ~@3 c2@7 ~@3 c2@2", AF: "~@4 c2@3 ~@3 c2 ~ c2@9 ~@3", AG: "~@4 c2@3 ~@3 c2 ~ c2@7 ~@5",
  AH: "~@4 c2@3 ~@3 c2 ~ c2@12", AI: "~@4 bb1@3 ~@3 bb1 ~ bb1@10 ~@2", AJ: "ab1 ~@5 ab1@3 ~@3 ab1@6 ~@4 ab1@2",
  AK: "~@4 ab1@3 ~@3 ab1@2 ab1@12", AL: "g1@3 ~@3 g1@3 ~@3 g1@9 ~ b1@2", AM: "~@4 b1@3 ~@3 b1@2 d2@3 ~@3 d2@6",
  AN: "~@4 c2@4 ~@2 c2 ~ c2@10 ~@2", AO: "[bb1@3 ~@3 bb1@3 ~@3 bb1@6 ~@4 bb1@4 ~@2 bb1@3 ~@3 bb1@2 ab1@6 g1@6]/2",
  AP: "f1@3 ~@3 f1@3 ~@3 f1@6 ~@4 f1@2", AQ: "~@4 f1@3 ~@3 f1 ~ f1@6 g1@6", AR: "ab1@3 ~@3 ab1@3 ~@3 ab1@9 ~ bb1@2",
  AS: "~@4 bb1@3 ~@3 bb1 ~ bb1@9 ~@3", AT: "c2 ~@5 c2@3 ~@3 c2@6 ~@4 c2@2", AU: "~@4 c2@3 ~@3 c2@2 c2@7 ~@5",
  AV: "~@4 c2@3 ~@3 c2 ~ c2@6 d2@6", AW: "eb2@3 ~@3 eb2@3 ~@3 eb2@6 ~@4 eb2@2", AX: "~@4 eb2@3 ~@3 eb2@2 eb2@10 ~@2",
  AY: "~@4 db2@3 ~@3 db2 ~ db2@3 ~@3 db2@4 ~@2", AZ: "c2@3 ~@3 c2@3 ~@3 c2@7 ~@3 c3@2",
  BA: "~@4 bb2@3 ~@3 bb2 ~ ab2@3 ~ ab2@2 g2@4 ~@2", BB: "~@4 f1@3 ~@3 f1@2 g1@3 ~@3 g1@6",
  BC: "~@4 b1@3 ~@3 b1 ~ b1@6 d2@6", BD: "~@4 c2@3 ~@3 c2@2 g1@4 ~@2 g1@4 ~@2", BE: "c2@4 ~@2 c2@3 ~@3 c2@7 ~@3 c2@2",
  BF: "~@4 ab1@3 ~@3 ab1 ~ ab1@12", BG: "~@4 c2@3 ~@3 c2 ~ c2@4 ~@2 g1@6", BH: "~@4 c2@3 ~@3 c2@2 c2@12",
  BI: "~@4 bb1@3 ~@3 bb1 ~ bb1@12", BJ: "ab1@3 ~@3 ab1@3 ~@3 ab1@6 ~@4 ab1@2",
  BK: "~@4 ab1@3 ~@3 ab1@2 ab1@4 ~@2 ab1@6",
  BL: "[bb1@4 ~@2 bb1@3 ~@3 bb1@7 ~@3 bb1@4 ~@2 bb1@3 ~@3 bb1@2 c2@6 d2@4 ~@2]/2",
  BM: "~@4 c2@3 ~@3 c2 ~ c2@4 ~@2 c2@6", BN: "~@4 bb1@4 ~@2 bb1 ~ bb1@4 ~@2 bb1@6",
  BO: "~@4 ab1@3 ~@3 ab1 ~ ab1@3 ~@3 ab1@6",
  BP: "[bb1@3 ~@3 bb1@3 ~@3 bb1@6 ~@4 bb1@4 ~@2 bb1@4 ~@2 bb1 ~ bb1@3 ~ b1@8]/2", BQ: "~@2 c2@2 ~ c2 c2@2 ~ c2@3",
  BR: "[bb1@3 ~@3 bb1@3 ~@3 bb1@6 ~@4 bb1@4 ~@2 bb1@4 ~@2 bb1@2 ab1@6 g1@6]/2", BS: "~@4 f1@3 ~@3 f1 ~ f1@6 gb1@6",
  BT: "g1@3 ~@3 g1@3 ~@3 g1@6 ~@4 g1@2", BU: "~@4 g1@3 ~@3 b1@4 ~@2 d2@4 ~@4",
  BV: "~@4 bb1@3 ~@3 bb1 ~ bb1@3 ~@3 bb1@4 ~@2",
  BW: "[g1@3 ~@3 g1@3 ~@3 g1@9 ~ b1@6 b2@2 b1@4 b2 ~ d2@3 ~ d3@2 d2@6]/2", BX: "~@4 c2@3 ~@3 c2 ~ c2@4 ~@2 c2@4 ~@2",
  BY: "~@4 bb1@3 ~@3 bb1@2 ab2@4 ~@2 g2@4 ~@2", BZ: "f2@2 c2 f1@2 ~ f1@3 ~@2 f1",
  CA: "ab1@3 ~@3 ab1@3 ~@3 ab1@10 bb1@2", CB: "~@4 bb1@3 ~@3 bb1 ~ bb1@6 b1@4 ~@2", CC: "c2@2 bb1 g1@2 c1@4 ~@3",
})).s("gm_acoustic_bass").gain(0.4)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@8 A@2 B@2 A@2 B@2 ~@16 C@2 D@2 E@2 F@2 G@2 B H A I F@2 A@2 B@2 A@2 H@2 A@2 B@2 A@3 B ~@3 J C@2 D@2 E@2 F@2 A@2 B H A
  I F@2 A@2 B@2 A@2 H@2 A@2 B@2 A@3 B ~@4 K ~ L ~ K ~ L ~ K ~ L ~ K ~ L ~ A@2 B@2 A@2 H ~ A@2 B@2 A@2 H@2 A@2 B@2 A@3 B
  A@2 B@2 A@2 H@2 A@2 B@2 A@3 B ~
>`.pickRestart({
  A: "~@2 [eb5,g5,c6] ~@3 [eb5,g5,c6] ~", B: "~@2 [d5,f5,bb5] ~@3 [d5,f5,bb5] ~",
  C: "~@2 [g5,bb5,eb6] ~@3 [g5,bb5,eb6] ~", D: "~@2 [f5,bb5,d6] ~@3 [f5,bb5,d6] ~",
  E: "~@2 [f5,ab5,db6] ~@3 [f5,ab5,db6] ~", F: "~@2 [e5,g5,c6] ~@3 [e5,g5,c6] ~",
  G: "~@2 [c5,eb5,ab5] ~@3 [c5,eb5,ab5] ~", H: "~@2 [d5,g5,b5] ~@3 [d5,g5,b5] ~",
  I: "~@2 [eb5,g5,c6] ~@3 [d5,f5,bb5] ~", J: "~@6 [f5,bb5,d6] ~", K: "~@2 [eb5,g5,c6] ~@5", L: "~@2 [d5,f5,bb5] ~@5",
})).s("gm_acoustic_guitar_steel").gain(0.22)

// chords · rock organ · "ORGAN 3"
const rock_organ = note(`<
  ~@8 A@2 B@2 C@2 D@2 E@2 B@2 F@2 G@2 H@2 I J K@2 A@2 E@2 B@2 F@2 G@2 H@2 I J K@2 L@2 A@2 B@2 C@2 M J A@2 B@2 N@2 O I
  A@2 ~@2 E@2 B@2 F@2 G@2 H@2 I J K@2 L@2 A@2 B@2 C@2 M J A@2 B@2 N@2 O I A@2 ~@2 A@2 B@2 C@2 B@2 A@2 B@2 C@2 B@2 A@2
  B@2 H@2 P@2 A@2 B@2 C@2 M J A@2 B@2 N@2 O I A@2 B@2 C@2 M J A@2 B@2 N@2 O I Q
>`.pickRestart({
  A: "[[c5,eb5,g5]@7 ~]/2", B: "[[bb4,d5,f5]@7 ~]/2", C: "[[ab4,c5,eb5]@7 ~]/2", D: "[[d5,f5,bb5]@7 ~]/2",
  E: "[[bb4,eb5,g5]@7 ~]/2", F: "[[ab4,db5,f5]@7 ~]/2", G: "[[g4,c5,e5]@7 ~]/2", H: "[[f4,ab4,c5,eb5]@7 ~]/2",
  I: "[bb4,d5,f5]@3 ~", J: "[b4,d5,f5]@3 ~", K: "[[c5,eb5,g5]@5 ~ [bb4,d5,f5] ~]/2", L: "[[c5,e5,g5]@7 ~]/2",
  M: "[g4,b4,d5]@3 ~", N: "[[f4,ab4,c5]@7 ~]/2", O: "[ab4,c5,eb5]@3 ~", P: "[[g4,b4,d5]@5 ~@3]/2", Q: "[c5,eb5,g5]@3 ~",
})).s("gm_rock_organ").gain(0.39)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@48 A@8 ~@7 B@5 ~@16 C@7 D@8 E@8 D@8 ~@2 F@2 D@8 ~ G@32 ~>".pickRestart({
  A: "[c7@95 c7]/8", B: "[~@23 c7@94 ~@3]/5", C: "c7/7", D: "[~@23 c7@169]/8", E: "[~@11 c7@85]/8", F: "[~@23 c7@25]/2",
  G: "c7/8",
})).s("gm_string_ensemble_1").gain(0.2)

// other · english horn · "ENGL.HORN"
const english_horn = note("<~@10 A ~@55 B ~@39 A ~@7 A ~@6 A ~@39>".pickRestart({
  A: "c6@3 ~", B: "c6@19 ~@5",
})).s("gm_english_horn").gain(0.31)

// drums · kick
const kick = s("bd").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B C D A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B E
>`.pickRestart({
  A: "x ~@5 x ~@4 x", B: "~ x ~ x ~@2", C: "x!2", D: "~@2 x ~@2 x ~@2 x ~@3", E: "x ~@4 x ~@6",
})).gain(0.46)

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

// drums · low tom
const low_tom = s("lt").struct("<~@160 [~ x ~@2]>").gain(0.41)

// drums · hihat
const hihat = s("hh").struct("<~@16 A@11 B A@3 B A@7 B A@3 B A@19 B A@15 B A@3 B A@7 B A@35 C A@32 ~>".pickRestart({
  A: "x!4", B: "x!3 ~", C: "x ~@6 x ~@5 x ~@5 x ~@4",
})).gain(0.36)

// drums · mid tom
const mid_tom = s("mt").struct("<~@160 [~ x ~@4]>").gain(0.41)

// drums · open hat
const open_hat = s("oh").struct("<~@27 A ~@3 A ~@7 A ~@3 A ~@19 A ~@15 A ~@3 A ~@7 A ~@35 B ~@33>".pickRestart({
  A: "~@3 x", B: "~@2 x ~@2 x ~@2 x ~@3",
})).gain(0.31)

// drums · crash
const crash = s("cr").struct("<~@100 x ~@60>").gain(0.41)

stack(
  drawbar_organ, bass, acoustic_guitar_steel, rock_organ, string_ensemble_1, english_horn, kick, snare, low_tom, hihat,
  mid_tom, open_hat, crash
)

More by Hall & Oates