Strudelify
Slow Hand cover art
KeyD♭ majorTempo105 bpm
0:00/0:00
// Slow Hand — The Pointer Sisters
// 105 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 113 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(105/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A@2 B C A@2 B D E F B D G F B C A H I J E G K@3 B C L F B C A@2 I M B C A@2 B C A@2 B D E F B D G F B C A H I J E G
  K@3 B C L F B C A@2 I M B C A@2 N@2 O@2 N@2 P K@2 B C L F B C L F B C L F B C A@2 I M A@2 B C A@2 B Q@2
>`.pickRestart({
  A: "bb1@5 ~ bb1 ~ bb1@7 ~", B: "db2@5 ~ db2 ~ db2@7 ~", C: "db2@5 ~ db2 ~ db2@4 c2@4", D: "db2@5 ~ db2 ~ db2@8",
  E: "eb2@5 ~ eb2 ~ eb2@7 ~", F: "gb1@5 ~ gb1 ~ gb1@8", G: "eb2@5 ~ eb2 ~ eb2@8", H: "bb1@5 ~ bb1 ~ bb1@4 ab1@4",
  I: "gb1@5 ~ gb1 ~ gb1@7 ~", J: "gb1@5 ~ gb1 ~ gb1@4 f2@4", K: "ab1@5 ~ ab1 ~ ab1@7 ~", L: "bb1@5 ~ bb1 ~ bb1@8",
  M: "ab1 ~@7", N: "eb2 ~ eb2@2 ~@4 eb2 ~ eb2@2 ~@4", O: "bb1 ~ bb1@2 ~@4 bb1 ~ bb1@2 ~@4",
  P: "ab1@5 ~ ab1 ~ ab1@5 ~ ab1 ~", Q: "[ab2 f2 c2 db2@13]/2",
})).s("gm_acoustic_bass").gain(0.62)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~ A@2 B@2 C@3 D ~@8 E@2 F G H I J K@2 L@4 M@4 N O P Q A@2 R@6 ~@8 E@2 F G H S J K@2 T@3 U V@2 W@2 N O P Q X Y Z@2 AA@2
  Z AB AC AD AE AF@2 AG U AH@2 AG U AI@2 AG U AJ@2 W@2 N O A@2 AK@7
>`.pickRestart({
  A: "[~@2 [db5,f5] [c5,eb5]@2 [bb4,db5]@2 ~@2 [db5,f5]@2 [c5,eb5]@2 [bb4,db5]@3, bb2@7 [c5,eb5]@2 ~@7, ~ bb2]/2", // Db Cm Bbm Db Cm Bbm Cm
  B: "[~@2 [f5,ab5]@2 [eb5,gb5]@2 [db5,f5]@7 ~@3 c5@2 f4@2 [c4,eb4]@2 ~@6 c3@4, db3@7 ~, ~@8 ab4@2 ~ [db4,f4]@5]/2", // Fm Ebm Db Cm Db
  C: "[~@2 [db5,f5,f6] [c5,eb5,eb6]@2 [bb4,db5,db6]@2 ~@2 [db5,f5,f6]@2 [c5,eb5,eb6]@2 ~@4 [f5,ab5,ab6] [eb5,gb5,gb6] [db5,f5,f6]@5, bb2@7 [c5,eb5,eb6]@2 ~@4 [bb4,db5,db6]@4 ~@7, ~@16 bb2@15 ~ db3@15 ~]/3", // Db Cm Bbm Db Cm Fm Ebm Db …
  D: "[c5,c6] [f4,ab5] [c4,eb4,eb5] [db4,f4,f5]@5, db3@7 ~, ab4 ~@3", // C Fm Cm Db
  E: "[[db5,f5,bb5]@9 ~ db6@2 f5@12 ~@4 bb4@3 ~, ~@10 bb5@14 ~@2 [db5,f5]@5 ~]/2", F: "[db4,gb4,bb4]@13 ~@3",
  G: "[gb5,bb5] [f5,ab5] [eb5,gb5] [db5,f5]", H: "[bb3,eb4,gb4]@9 ~ [bb3,eb4,gb4]@2 ~@4",
  I: "[bb3,eb4,gb4]@5 [bb3,eb4,gb4] ~ f4", J: "[ab3,c4,eb4]", K: "[ab3,c4,eb4]@15 ~",
  L: "[[ab3,db4,f4]@12 [ab3,f4]@2 [bb3,gb4]@2 [ab3,f4]@7 ~ db4@4 ~@4 [bb3,db4,f4]@10 ~@2 [f4,bb4,db5]@2 c5@2 [gb4,bb4,db5]@13 ~@3, ~@12 db4@11 ~ [ab3,f4]@7 ~@33, ~@14 eb5@9 eb5@9]/4", // Db Ebm Db Bbm Gb Db
  M: "[[ab3,db4,f4]@11 ~ [db4,f4]@2 [eb4,gb4]@2 [db4,f4]@8 ~@4 c4@2 ~@2 [bb4,db5,f5]@8 ~@2 [bb4,f5,bb5]@16 ~@6, ~@3 ab3@3 ab3@3 ~@7, ~@3 db4 ~@4, ~@12 f4@3 ~@17]/4", // Db Ebm Db Bbm Bb5
  N: "[gb4,bb4,db5]@9 ~ db4@2 gb4@2 ab4 ~", O: "ab4 ~@7", P: "[db5,f5]@6 [eb5,gb5]@6 [db5,f5]@3 ~, ab4@15 ~",
  Q: "[ab4,db5]@5 ~ [ab4,db5,f5]@4 eb5@2 db5@2 c5@2", // Db5 Db
  R: "[~@2 [f5,ab5]@2 [eb5,gb5]@2 [db5,f5]@7 ~@3 c5@2 f4@2 [c4,eb4]@2 f4@6 ~@8 [db5,f5,f6]@2 [c5,eb5,eb6]@4 [bb4,db5,db6]@4 [c5,eb5,eb6]@4 [db5,f5,f6]@4 [c5,eb5,eb6]@4 ~@8 [f5,ab5,ab6]@2 [eb5,gb5,gb6]@2 ~@10 [c5,c6]@2 [f4,ab5]@2 [c4,eb4,eb5]@2 [db4,f4,f5]@10, db3@14 f4@2 ~@13 [bb4,db5,db6]@4 ~@2 [db5,f5,f6]@5 ab4@2 ~@6, ~@8 ab4@2 ~ db4@5 ~@32, ~@30 bb2@14 ~@2 bb2@15 ~ db3@15 ~ db3@14 ~@4]/6", // Fm Ebm Db Cm Db Cm Bbm Cm …
  S: "[bb3,eb4,gb4]@5 [bb3,gb4] ~ f4, ~@5 eb4@3", // Ebm
  T: "[[ab3,db4,f4]@12 [ab3,f4]@2 [bb3,gb4]@2 [ab3,f4]@7 ~ db4@4 ~@4 [bb3,db4,f4]@10 ~@2 [f4,bb4,db5]@2 [c5,eb5]@2, ~@12 db4@11 ~ [ab3,f4]@7 ~@17, ~@14 eb5@9 ~]/3", // Db Ebm Db Bbm Cm Db
  U: "[gb4,bb4,db5]@13 ~@3", // Gb
  V: "[[ab3,db4,f4]@11 ~ [db4,f4]@2 [eb4,gb4]@2 [db4,f4]@8 ~@4 c4@2 ~@2, ~@3 ab3@3 db4@2, ~@12 [ab3,f4]@3 ~]/2", // Db Ebm Db
  W: "[[bb4,db5,f5]@4 ~ [bb4,f5,bb5]@8 ~@3]/2", X: "[f5,bb5] [ab5,c6] [f5,bb5] [ab5,c6] [f5,bb5]@3 ~",
  Y: "[db5,f5] [f5,ab5] [db5,f5] [f5,ab5] [db5,f5]@2 [c5,eb5] [bb4,db5]", Z: "[bb4,eb5,gb5]!2 ~@2 [bb4,eb5,gb5]!2 ~@2",
  AA: "[bb4,db5,f5]!2 ~@2 [bb4,db5,f5]!2 ~@2", AB: "[bb4,eb5,gb5]!2 ~@2 f4 gb4 ab4 bb4, ~ eb4",
  AC: "[c4,ab4]@7 ~, eb4 ~", AD: "[eb4,ab4,c5]@15 ~", AE: "[ab4,c5,eb5]@15 ~",
  AF: "[[ab3,db4,f4]@12 ab3@2 [bb3,gb4]@2 [ab3,f4]@8 [ab3,f4]@7 ~, ~@12 db4@11 ~ db4@4 ~@4, ~@3 f4 ~@4]/2", // Db Ebm Db
  AG: "[bb3,db4,f4]@5 ~ [f4,bb4,db5] [c5,eb5]", // Bbm Cm
  AH: "[[ab3,db4,f4]@12 [ab3,f4]@2 [bb3,gb4]@2 [ab3,f4]@7 ~ [ab3,f4]@7 ~, ~@12 db4@11 ~ db4@4 ~@4]/2", // Db Ebm Db
  AI: "[[ab3,db4,f4]@12 [ab3,f4]@2 [bb3,gb4]@2 [ab3,f4]@7 ~ [ab3,f4]@7 ~, ~@3 db4@3 db4 ~]/2", // Db Ebm Db
  AJ: "[[ab3,db4,f4]@11 ~ [db4,f4]@2 [eb4,gb4]@2 [db4,f4]@8 db4@3 ~ c4@2 ~@2, ~@6 ab3@6 [ab3,f4]@3 ~]/2", // Db Ebm Db
  AK: "[~@2 [f5,ab5]@2 [eb5,gb5]@2 [db5,f5]@7 ~@3 c5@2 f4@2 [c4,eb4]@2 f4@6 ~@8 [db5,f5,f6]@2 [c5,eb5,eb6]@4 [bb4,db5,db6]@4 [c5,eb5,eb6]@4 [db5,f5,f6]@4 [c5,eb5,eb6]@4 ~@8 [f5,ab5,ab6]@2 [eb5,gb5,gb6]@2 ~@10 [c5,c6]@2 [f4,ab5]@2 [c4,eb4,eb5]@2 [db4,f4,f5]@26, db3@14 f4@2 ~@13 [bb4,db5,db6]@4 ~@2 [db5,f5,f6]@5 ab4@2 ~@14, ~@8 ab4@2 ~ db4@5 ~@40, ~@30 bb2@14 ~@2 bb2@15 ~ db3@15 ~ db3@14 ~@20]/7", // Fm Ebm Db Cm Db Cm Bbm Cm …
})).s("gm_piano").gain(0.64)

// chords · drawbar organ · "ORGAN 3"
const drawbar_organ = note(`<
  ~ A@8 B@4 C D@7 E@5 F@8 G H I@2 A@8 B@4 C D@7 E@5 F@8 G H I@2 ~@2 J@2 K L J@2 M@3 N@8 O@8 G H P@8 ~
>`.pickRestart({
  A: "[bb4 ab4 bb4 ab4, [db4,f4]]/8", B: "[eb4 ~ [f3,ab3]@2, [gb3,bb3] ~, ~ db4@3]/4", C: "~ eb4@15, [gb3,bb3]",
  D: "[~ ab3@2 ~@2 gb3@2, db4, ~ f4@4 ~@2, ~@3 bb3@4]/7", E: "[~@2 [ab3,c4]@3, eb4]/5",
  F: "[ab4@2 ~ gb4 ab4@2 bb3@2, db4, f4@3 ~ f4@4, ~ bb3 ~@2]/8", G: "[gb4,bb4]", H: "[c4,eb4,ab4] ~@3",
  I: "[db4,f4,ab4]/2", J: "[eb4,gb4,bb4]!2 ~@6", K: "[db4,f4,bb4] [db4,f4] ~@6, ~@2 bb4 ~@13", L: "[db4,f4,bb4]!2 ~@6",
  M: "[~@40 [eb4,c5]@7 ~, ab4@47 ~]/3", N: "[f4@3 gb4, db4, ab4 ~]/4", O: "[f4@3 gb4 f4@4, db4, ab4 ~ ab4 ~]/8",
  P: "[bb4@16 ab4@16 bb4@16 ab4@11 ~@5, [db4,f4]@59 ~@5]/8", // Db
})).s("gm_drawbar_organ").gain(0.32)

// chords · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note(`<
  ~@16 A B ~@2 C D C E@3 F@2 G H I@2 J@2 K L M N ~@15 A B ~@2 C D C E@3 F@2 G H I@2 J@2 K L M N ~@11 F@2 G H F@2 G H F@2
  G H I@2 J@2 K L ~@9
>`.pickRestart({
  A: "~@5 ab4 bb4 eb5", B: "db5@15 ~", C: "~@5 ab4 bb4 f5", D: "eb5@3 ~",
  E: "[eb5@19 ~@3 c4@2 ab4@2 db4@2 bb4@2 ~@2 c5@8 ab4@8, ~@15 eb4@5 ~@4]/3",
  F: "[[f4,ab4,db5]@12 db5@2 eb5@2 db5@15 ~, ~@12 [f4,ab4]@19 ~]/2", G: "[f4,bb4,db5]@7 ~@5 ab5@2 f5@2", H: "gb5@3 ~",
  I: "[[f4,ab4,db5]@6 db5 eb5 db5@7 ~, ~@6 [f4,ab4]@9 ~]/2", J: "[[f4,bb4,db5]@7 ~ bb5@2 f5@2 ab5@18 ~@2]/2",
  K: "gb4@15 ~", L: "ab4 ~@7", M: "~@6 f5 gb5", N: "f5 gb5 f5 gb5 f5@2 ~@2",
})).s("gm_acoustic_guitar_nylon").gain(0.71)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  ~@4 A B@2 C@2 ~@3 D E ~@27 A B@2 C@2 ~@3 D E ~@24 F G ~@7 H I ~@21 A J@4 ~
>`.pickRestart({
  A: "~@3 db5 c5 db5 c5 ab4", B: "[bb4@7 bb4]/2", C: "[ab4@11 ~@5]/2", D: "f4 gb4 f4 gb4 f4 gb4 f4 gb4", E: "eb4 ~",
  F: "~@5 f4 c5 db5", G: "bb4@15 ~", H: "~@3 c5 ab5 db5 bb5 eb5", I: "c6",
  J: "[bb4@14 ~@2 ab4@11 ~@5, ~@7 bb4@7 ~@2]/4",
})).s("gm_lead_2_sawtooth").gain(0.4)

// drums · kick
const kick = s("bd").struct("<A B@34 C B@36 C B@30 C B@7 C ~>".pickRestart({
  A: "~@7 x", B: "x!2", C: "x",
})).gain(0.64)

// drums · snare
const snare = s("sd").struct("<A B@34 C B@36 C B@12 ~ B@17 C B@7 D ~>".pickRestart({
  A: "x", B: "~ x ~ x", C: "~@3 x", D: "~ x ~@2",
})).gain(0.72)

// drums · low tom
const low_tom = s("lt").struct("<A ~@7 A ~@7 A ~@8 B ~@19 A ~@7 A ~@8 B ~@22 C ~@25 D ~>".pickRestart({
  A: "~@3 x", B: "~@7 x", C: "~@5 x!3", D: "~ x ~@6",
})).gain(0.72)

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

// drums · mid tom
const mid_tom = s("mt").struct("<A ~@24 B ~@36 B ~@13 C ~@8 D ~@25 E ~>".pickRestart({
  A: "~@5 x ~@2", B: "~@3 x", C: "~@12 x!3 ~", D: "~@3 x!2 ~@3", E: "x",
})).gain(0.72)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A ~@3 B ~@7 B ~@17 A ~@2 A ~@3 A ~@3 B ~@7 B ~@17 A ~@2 A ~@27 A ~@4 A ~@5
>`.pickRestart({
  A: "~@7 x", B: "~@3 x",
})).gain(0.56)

// drums · high tom
const high_tom = s("ht").struct("<~@25 A ~@36 A ~@13 B ~@8 C ~@27>".pickRestart({
  A: "~@5 x ~@2", B: "~@4 x!2 ~@2", C: "~ x!2 ~@5",
})).gain(0.72)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@24 A ~@8 A@2 ~ A ~@24 A ~@8 A@2 ~ A ~ A ~@5 A ~@2 A ~@3 A ~@3 A ~@8 A@2 ~@6 B ~
>`.pickRestart({
  A: "x", B: "~@3 x ~@4",
})).gain(0.64)

// drums · ride
const ride = s("rd").struct("<~@77 [~ x!3] [x!4]!5 [~ x!3] [x!4] ~@28>").gain(0.64)

stack(
  bass, piano, drawbar_organ, acoustic_guitar_nylon, lead_2_sawtooth, kick, snare, low_tom, hihat, mid_tom, open_hat,
  high_tom, crash, ride
)

More by The Pointer Sisters