Strudelify

Hanky Panky

James

KeyB♭ majorTempo132 bpm
0:00/0:00
// Hanky Panky — James
// 132 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 97 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(132/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 B C@2 D@2 E@2 F@2 G ~ A B C@2 D@2 E@2 F@2 G ~ A B C@2 D@2 E@2 F@2 G ~ A B C@2 D@2 E@2 F@2 G@2 H@2 I J K L M N O P Q
  R A B C@2 D@2 E@2 F@2 G ~ A B C@2 D@2 E@2 F@2 G ~ H@2 I J K L M N O P G ~ A
>`.pickRestart({
  A: "bb1 ~@7", B: "~@5 f1 ab1 f1", C: "[bb1@3 ~ bb1@3 ~ ab1@3 ~ ab1 ~ bb1@5 ~ bb1@3 ~ ab1@3 ~ bb1@3 ~]/2",
  D: "[eb2@3 ~ eb2@3 ~ db2@3 ~ db2 ~ eb2@5 ~ eb2@3 ~ db2@3 ~ eb2@3 ~]/2",
  E: "[bb1@3 ~ bb1@3 ~ ab1@3 ~ ab1 ~ bb1@4 ~@2 bb1@3 ~ ab1@3 ~ bb1@2 ~@2]/2",
  F: "[f2@3 ~ f2@3 ~ f2@3 ~ f2 ~ eb2@5 ~ eb2@3 ~ eb2@3 ~ eb2@2 ~@2]/2", G: "bb1",
  H: "[bb1@3 ~ bb1@3 ~ ab1@3 ~ ab1 ~ bb1@5 ~ bb1@2 ab1@3 ~ ab1@2 bb1@2 ab1@2]/2",
  I: "bb1@3 ~ bb1@3 ~ ab1@3 ~ ab1 ~ bb1@2", J: "~@2 bb1@3 ~ bb1 ~ ab1@3 ~ bb1@3 ~",
  K: "eb2@3 ~ eb2@3 ~ db2@3 ~ db2 ~ eb2@2", L: "~@2 eb2@3 ~ eb2@2 db2@3 ~ eb2@3 ~",
  M: "bb1@3 ~ bb1@3 ~ ab1@3 ~ ab1@2 bb1@2", N: "~@2 bb1@3 ~ bb1@2 ab1@3 ~ bb1@2 ab1 ~",
  O: "f2@4 a2@3 ~ c3@4 a2 ~ eb2@2", P: "~ eb2 g2@2 bb2@2 g2 ~", Q: "bb1@4 d2@3 ~ f2@4 d2@2 f2@2",
  R: "~@2 f1@3 ~ f1@3 ~ f1 ~ f1 ~ f1 ~",
})).s("gm_acoustic_bass").gain(0.64)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  A B C D E F G H I@2 J ~ A B C D E F G H I@2 J ~ A B C D E F G H I@2 J ~ A B C D E F G H I@2 J K C L C D E F M H I@2 N
  O A B C D E F G H I@2 J ~ A B C D E F G H I@2 J ~ C L C D E F G H I@2 J ~ A
>`.pickRestart({
  A: "[bb2,bb3] ~@15", B: "~@10 [f2,f3] ~ [ab2,ab3] ~ f3 ~",
  C: "[f3,bb3,d4]@2 bb2 ~ [f3,bb3,d4] ~@5 ab2@3 ~ [f3,bb3,d4]@2, ~@8 [eb3,ab3,c4]@5 ~@3", // Bb Ab
  D: "~@2 [f3,bb3,d4]@2 bb2 d4 [f3,bb3] ~ [eb3,ab3,c4]@2 ab2 ~ [f3,bb3,d4] ~@3", // Bb Bb5 Ab Bb
  E: "[bb3,g4]@3 ~ [bb3,eb4,g4]@3 ~ [ab3,db4,f4]@2 db3 ~ [ab3,db4,f4] ~ [eb4,g4]@2, [eb3,g3]@7 ~@9, eb4 ~@13 bb3 ~", // Eb Db Eb
  F: "eb3 ~@3 eb3@2 [bb3,eb4,g4] ~ [ab3,db4,f4]@2 db3 ~ [bb3,eb4,g4]@3 ~, ~ [bb3,eb4,g4]@2 ~@5", // Eb Db Eb
  G: "[f3,bb3,d4]@2 bb2@2 [f3,bb3,d4]@3 ~ [eb3,ab3,c4]@2 ab2 ~ [eb3,ab3,c4]@2 [f3,bb3,d4]@2", // Bb Ab Bb
  H: "bb2 ~ [f3,bb3,d4]@2 bb2 ~ [f3,bb3,d4] ~ [eb3,ab3,c4]@2 ab2 ~ [f3,bb3,d4]@2 [ab3,c4] ~", // Bb Ab Bb Ab
  I: "[[f3,a3,c4]@3 ~ [eb3,a3,c4]@2 f2 ~ [eb3,a3,c4]@2 f2 ~ [eb3,a3,c4]@2 [eb3,g3]@4 [bb3,eb4] ~ [eb3,g3]@2 [bb3,eb4] ~ [bb3,eb4]@2 g3@2 [bb3,eb4]@3 ~, f2@6 ~@8 bb3 ~@11 eb3@5 ~]/2", // F Adim Eb Eb5 Eb Eb5
  J: "[bb2,f3,bb3]@7 ~", // Bb5
  K: "~@2 [a3,c4,eb4,f4]@4 ~@4 [a3,c4,eb4,f4]@2 [a3,c4,eb4,f4]@2 f3 ~, ~ f3@3 f3@3 ~, ~@3 [a3,c4,eb4,f4]@2 ~@3", // F7
  L: "[f3,bb3,d4]@2 [f3,bb3,d4]@2 bb2 d4 [f3,bb3] ~ [eb3,ab3,c4]@2 ab2 ~ [f3,bb3,d4] ~@3", // Bb Bb5 Ab Bb
  M: "[f3,bb3,d4]@2 bb2@2 [f3,bb3,d4]@3 ~ [ab3,c4]@2 ab2 ~ [eb3,ab3,c4]@2 [f3,bb3,d4]@2, ~@8 eb3 ~@7", // Bb Ab Bb
  N: "[bb2,f3,bb3,d4]@4 [f3,bb3,d4] ~ bb2 ~ [f3,bb3,d4] ~ [f3,bb3,d4]@2 bb2 ~ [f3,bb3,d4] ~", // Bb
  O: "[f3,a3,c4] ~ [f2,eb3,a3,c4] ~ [f2,eb3,a3,c4] ~ [f2,eb3,a3,c4] ~ [f2,eb3,a3,c4] ~ [f2,eb3,a3,c4] ~ [f2,eb3,a3,c4] ~@3", // F F7
})).s("gm_piano").gain(0.4)

// chords · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  A B C D E F G@2 H@2 I J A B C D E F G@2 H@2 I J A B C D E F G@2 H@2 I J A B C D E F G@2 H@2 I K L@2 M@2 N@2 O@2 P Q R
  S A B C D E F G@2 H@2 I J A B C D E F G@2 H@2 I J T@2 U V W X Y ~ H@2 I J A
>`.pickRestart({
  A: "[d4,f4,bb4] ~@15", B: "~@10 f2 ~ ab2 ~ f2@2", C: "~@4 [d4,f4,bb4] ~ [d4,f4,bb4] ~@5 [c4,eb4,ab4] ~@3",
  D: "~@2 [d4,f4,bb4] ~@5 [c4,eb4,ab4]@3 ~ [d4,f4,bb4] ~@3", // Bb Ab Bb
  E: "eb3@4 [bb3,eb4,g4] ~@3 [ab3,db4,f4]@4 eb3 ~ [bb3,eb4,g4] ~", // Eb Db Eb
  F: "~@2 [bb3,eb4,g4] ~@3 [ab3,db4,f4]@4 eb3 ~ [bb3,eb4,g4] ~ eb3 ~", // Eb Db Eb
  G: "[~@4 [d4,f4,bb4] ~@5 [c4,eb4,ab4] ~@3 [d4,f4,bb4]@4 ~@2 [d4,f4,bb4] ~@5 [c4,eb4,ab4] ~ [d4,f4,bb4] ~@3]/2", // Bb Ab Bb Ab Bb
  H: "[[a3,c4,eb4,f4]@4 ~@6 [f2,f3]@2 [a3,c4,eb4,f4] ~ [bb3,db4,f4]@3 ~@5 [bb3,db4,f4]@2 ~@4 [bb3,db4,f4]@2 [eb3,g3] ~, [f2,f3]@3 [f2,f3]@2 ~@4 [bb3,db4,f4]@2 ~ [bb3,db4,f4]@2 ~@2, ~@2 [a3,c4,eb4,f4]@2 [a3,c4,eb4,f4]@2 ~ [eb3,g3]@3 [eb3,g3]@3 [eb3,g3]@2 ~]/2", // F7 F F7 Bbm Eb F Bbm F7 …
  I: "[d4,f4,bb4]@15 ~", J: "~@2 f2@2 ~@2 f2 ~ f2 ~ f2 ~ f2 ~ f2 ~",
  K: "~@2 f2@2 ~@2 f2 ~ f2 ~ [f2,f4,bb4] ~ [f2,f4,bb4] ~ [f2,f4,bb4] ~", // Bb5
  L: "[[f4,bb4]@3 ~ [f4,bb4]@2 [eb4,ab4] eb4 ~@2 [eb4,ab4]@4 [f4,bb4]@4 [f4,bb4]@4 [ab4,db5]@4 [ab4,db5] ~ [ab4,db5] ~ [ab4,db5] ~]/2", // Bb5 Ab5 Bb5 Db5
  M: "[[ab4,db5] ~ [ab4,db5]@2 [ab4,db5] ~ [ab4,db5] ~ [ab4,db5]@2 [f4,bb4]@2 ~@2 [f4,bb4]@4 [eb4,ab4]@2 ~@2 [f4,bb4]@5 ~ [bb4,eb5] ~ [bb4,eb5]@2]/2", // Db5 Bb5 Ab5 Bb5 Eb5
  N: "[[bb4,eb5]@3 ~ [bb4,eb5]@4 [db5,gb5]@2 [bb4,eb5]@2 ~@2 [bb4,eb5]@4 [bb4,eb5]@4 [ab4,db5]@4 [bb4,eb5] ~ [ab4,db5]@2 ~@2]/2", // Eb5 Gb5 Eb5 Db5 Eb5 Db5
  O: "[[f4,bb4]@3 ~ [f4,bb4]@3 ~ [eb4,ab4] ~ [f4,bb4]@4 [f4,bb4]@4 [f4,bb4] ~ [f4,bb4]@2 [f4,bb4] ~ [ab4,db5] ~ [f4,bb4]@2 f4 ~ f4 ~]/2", // Bb5 Ab5 Bb5 Db5 Bb5
  P: "f4!2 ~ f4!2 ~ f4!2 ~ f4!2 ~ f4 ~ f4@2", Q: "~@2 ab4 ~ bb4@2 ab4 ~ bb4@2 ab4 bb4@2 ab4 bb4 ~",
  R: "bb4 ~ bb4 ~ ab4 ~ ab4 ~ f4 ~ f4 ~ eb4@4", S: "~ f4@2 ab4 f4@2 ab4 ~",
  T: "[[d4,f4,bb4]@3 ~ [d4,f4,bb4] ~@5 [c4,eb4,ab4] ~@3 [d4,f4,bb4]@5 ~ [d4,f4,bb4] ~@5 [c4,eb4,ab4] ~ [d4,f4,bb4] ~@3]/2", // Bb Ab Bb Ab Bb
  U: "~@2 [d4,f4,bb4] ~ [d4,f4,bb4] ~@3 [c4,eb4,ab4]@3 ~ [c4,eb4,ab4] ~ [d4,f4,bb4]@2", // Bb Ab Bb
  V: "~@2 [d4,f4,bb4] ~@3 [d4,f4,bb4] ~ [c4,eb4,ab4]@2 ~@2 [d4,f4,bb4] ~@3", // Bb Ab Bb
  W: "~@2 [bb3,eb4,g4] ~@5 [ab3,db4,f4]@3 ~ [ab3,db4,f4] ~ [bb3,eb4,g4]@2", // Eb Db Eb
  X: "~@2 [bb3,eb4,g4] ~@3 [ab3,db4,f4]@3 ~ [ab3,db4,f4] ~ [bb3,g4] ~@3", // Eb Db Eb
  Y: "~@4 [d4,f4,bb4] ~@3 [c4,eb4,ab4]@3 ~@3 [d4,f4,bb4] ~", // Bb Ab Bb
})).s("gm_electric_guitar_muted").gain(0.64)

// chords · electric guitar muted · "MUTED GTR"
const electric_guitar_muted_2 = note(`<
  A B C@2 D E F@2 G@2 H ~ A B C@2 D E F@2 G@2 H ~ A B C@2 D E F@2 G@2 H ~ A B C@2 D E F@2 G@2 H I J K C@2 D E F@2 G@2 L
  M A B C@2 D E F@2 G@2 H ~ A B C@2 D E F@2 G@2 H ~ J K C@2 D E F@2 G@2 H ~ A
>`.pickRestart({
  A: "[bb2,f3] ~@15", B: "~@10 [f2,f3] ~ [ab2,ab3] ~ [f2,ab2,f3]@2",
  C: "[[f3,bb3]@2 [f3,bb3]@2 [bb2,f3,bb3]@4 [eb3,ab3] ~ [eb3,ab3]@2 [ab2,eb3,ab3] ~ bb2@2 bb2@2 [bb2,f3,bb3]@2 [bb2,f3,bb3]@2 [bb2,f3,bb3]@2 [ab2,eb3,ab3]@4 [bb2,f3,bb3]@2 ~@2, bb2@2 ~@2 ab2@2 ~ [f3,bb3]@2 ~@7]/2", // Bb5 Ab5 Bb5 Ab5 Bb5
  D: "[eb2,bb2,eb3]@3 ~ [eb2,bb2,eb3]@3 ~ [db2,ab2,db3]@2 ~@2 [db2,ab2,db3] ~ [eb2,bb2,eb3]@2", // Eb5 Db5 Eb5
  E: "~@2 [bb2,eb3] ~ [bb2,eb3] ~ [bb2,eb3] ~ [db2,ab2,db3]@3 ~ [eb2,bb2,eb3]@2 ~@2, ~@2 eb2@5 ~@9", // Eb5 Db5 Eb5
  F: "[[bb2,f3,bb3]!2 [bb2,f3,bb3]@2 [ab2,eb3,ab3]@2 [ab2,eb3,ab3] [f3,bb3]@2 [bb2,f3,bb3]!3 [ab2,eb3,ab3]@2 [bb2,f3,bb3] ~, ~@7 bb2 ~@8]/2", // Bb5 Ab5 Bb5 Ab5 Bb5
  G: "[[a3,c4,eb4,f4]@4 ~@6 [f2,f3]@2 [a3,c4,eb4,f4] ~ [bb3,db4,f4]@3 ~@5 [bb3,db4,f4]@2 ~@4 [bb3,db4,f4]@2 [eb3,g3] ~, [f2,f3]@3 [f2,f3]@2 ~@4 [bb3,db4,f4]@2 ~ [bb3,db4,f4]@2 ~@2, ~@2 [a3,c4,eb4,f4]@2 [a3,c4,eb4,f4]@2 ~ [eb3,g3]@3 [eb3,g3]@3 [eb3,g3]@2 ~]/2", // F7 F F7 Bbm Eb F Bbm F7 …
  H: "[bb2,f3,bb3,d4,f4,bb4]", // Bb
  I: "f3 [a3,c4,eb4,f4]@2 ~@2 [a3,c4,eb4,f4]!2 f3, [bb2,bb3], ~ f3@3 f3@3 ~, ~@3 [a3,c4,eb4,f4]@2 ~@3", // F7 Bb F7
  J: "[f3,bb3]@2 [f3,bb3]@2 [bb2,f3,bb3]@4 [eb3,ab3] ~ [eb3,ab3]@2 [ab2,eb3,ab3] ~ [bb2,f3,bb3]@2, bb2 ~ ab2 ~", // Bb5 Ab5 Bb5
  K: "[bb2,f3,bb3]!4 [ab2,eb3,ab3]@2 [bb2,f3,bb3] ~", // Bb5 Ab5 Bb5
  L: "[bb2,f3,bb3,d4]@4 [f3,bb3] ~ bb2 ~ [f3,bb3] ~@5 [f3,bb3]@2, ~@5 [f3,bb3]@2 ~, ~@3 bb2", // Bb Bb5
  M: "~@2 [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~", // F5
})).s("gm_electric_guitar_muted").gain(0.38)

// drums · kick
const kick = s("bd").struct("<A B C@10 A B C@10 A B C@10 A B C@22 A B C@10 A B C@22 A>".pickRestart({
  A: "x", B: "~@5 x!3", C: "x!4",
})).gain(0.64)

// drums · snare
const snare = s("sd").struct(`<
  A B C@8 ~@2 A B C@8 ~@2 A B C@8 ~@2 A B C@8 ~@2 C@12 A B C@8 ~@2 A B C@8 ~@2 C@10 ~ D A
>`.pickRestart({
  A: "x", B: "~@3 x", C: "~@3 x ~@2 x ~", D: "~@5 x!3",
})).gain(0.64)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~ A B@8 ~@3 A B@8 ~@3 A B@8 ~@3 A B@8 ~@2 B@12 ~ A B@8 ~@3 A B@8 ~@2 B@10 ~ C ~
>`.pickRestart({
  A: "~@5 x ~ x", B: "~ x ~@2", C: "~ x!4 ~@3",
})).gain(0.21)

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

// drums · hihat
const hihat = s("hh").struct(`<
  A B C@8 ~@2 A B C@8 ~@2 A B C@8 ~@2 A B C@8 ~@2 C@12 A B C@8 ~@2 A B C@8 ~@2 C@10 ~@3
>`.pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "x!4",
})).gain(0.64)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@2 A@8 ~@4 A@8 ~@4 A@8 ~@4 A@8 ~@2 A@12 ~@2 A@8 ~@4 A@8 ~@2 A@10 ~@3
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(0.21)

// drums · mid tom
const mid_tom = s("mt").struct("<~@95 [~@5 x ~@2] ~>").gain(0.64)

// drums · crash
const crash = s("cr").struct("<~@10 A ~@11 A ~@11 A ~@11 A ~@23 A ~@11 A ~@11 A ~@2>".pickRestart({
  A: "x",
})).gain(0.64)

// drums · ride
const ride = s("rd").struct(`<
  ~@2 A B A B A B A B C ~@3 A B A B A B A B C ~@3 A B A B A B A B C ~@3 A B A B A B A B C ~ A B A B A B A B A B A B ~@2
  A B A B A B A B C ~@3 A B A B A B A B C ~ A B A B A B A B A B C ~@2
>`.pickRestart({
  A: "x!8", B: "x ~ x!6", C: "x",
})).gain(0.64)

stack(
  bass, piano, electric_guitar_muted, electric_guitar_muted_2, kick, snare, snare_soft, low_tom, hihat, hihat_soft,
  mid_tom, crash, ride
)

More by James