Strudelify

Knock on Wood

Ike & Tina Turner

KeyA majorTempo145 bpm
0:00/0:00
// Knock on Wood — Ike & Tina Turner
// 145 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: duplicate parts dropped: ch 14 electric guitar jazz (copy of ch 13 epiano1)
// note: Full arrangement: all 131 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(145/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 · piano
const bass = note("<~@79 A B@3 ~@48>".pickRestart({
  A: "a1@5 ~ g2@5 ~ d2@5 ~ c2@5 ~", B: "[a1@11 ~]/3",
})).s("gm_piano").gain(0.62).pan(0.4)

// chords · synth brass 1
const synth_brass_1 = note("<~@74 A@2 B@2 C D E@3 F G H I J@2 ~@42>".pickRestart({
  A: "[[a3,c#4,e4]@12 ~@4 [d4,g4,b4]@5 ~ [d4,f#4,a4]@6 ~@20]/2", // A G D
  B: "[[a3,c#4,e4]@11 ~@5 [c4,e4,g4]@5 ~ [d4,f#4,a4]@4 ~@8 [d4,g4,b4]@5 ~ [d4,f#4,a4] ~ [d4,g4,b4]@3 ~ [f#4,a4]@2, ~@46 d4 ~]/2", // A C D G D G F#m
  C: "[a3,c#4,e4] ~", D: "[e2,a2]@6 [d3,g3]@6 [a2,d3]@5 ~ [g2,c3]@5 ~", E: "[e2,a2]/3",
  F: "f#4@3 ~ g#4 ~ a4@2 g#4 ~ f#4@14", G: "g#4@3 ~ a4 ~ b4 ~ a4 ~ g#4@13 ~", H: "a4@3 ~ b4 ~ c5 ~ b4 ~ a4@13 ~",
  I: "c5@3 ~ a4@20", J: "[b4@2 g#4@11 ~@11]/2",
})).s("gm_synth_brass_1").gain(0.31).pan(0.7)

// chords · brass section
const brass_section = note(`<
  ~@4 A B C D E@2 C D F@3 ~@12 G H I J K ~ B C D E@2 C D F@3 ~@12 G H I J K ~ B C D E@2 C D L ~@14 M N O P Q ~@12 G H I
  J K ~ B C D E@2 C D R@2 ~@3 S T U V@2 ~ W@2 X Y ~ Z@2
>`.pickRestart({
  A: "[a3,e4,a4]", B: "[a3,e4,a4]@19 ~@3 [c4,g4,c5]@2", C: "~@2 [d4,a4,d5]@9 ~", D: "[e4,b4,e5]@19 ~@3 [g4,d5,g5]@2",
  E: "[~@4 [e4,b4,e5]@2 ~@4 [d4,a4,d5]@3 ~@3 [c4,g4,c5]@2 ~@4 [a3,e4,a4]@21 ~@3 [c4,g4,c5]@2]/2", // E5 D5 C5 A5 C5
  F: "[~@4 [e4,b4,e5]@3 ~@3 [d4,a4,d5]@3 ~@3 [c4,g4,c5]@2 ~@4 [a3,e4,a4]@27 ~@23]/3", G: "~@5 [a4,c#5,e5,a5]@5 ~@2",
  H: "~@10 [a4,d5,f#5,a5]@6 a4@2 f#4@3 ~@3", I: "[a4,c#5,e5,a5] ~@5", J: "~@10 [d5,f#5,a5]@5 ~ a4@2 f#4@3 ~@3",
  K: "[c#5,e5,a5] ~@7", L: "~@4 [e4,b4,e5]@3 ~@3 [d4,a4,d5]@3 ~@3 [c4,g4,c5]@2 ~@4 [a3,e4,a4]@2",
  M: "f#3@3 ~ g#3 ~ a3 ~ g#3 ~ f#3@13 ~", N: "g#3@3 ~ a3 ~ b3 ~ a3 ~ g#3@13 ~", O: "a3@3 ~ b3 ~ c4 ~ b3 ~ a3@11 ~@3",
  P: "c4@3 ~ a3@3 ~@17", Q: "b3@3 ~ g#3@3 ~@17",
  R: "[~@4 [e4,b4,e5]@3 ~@3 [d4,a4,d5]@3 ~@3 [c4,g4,c5]@2 ~@4 [a3,e4,a4]@9 ~@17]/2", // E5 D5 C5 A5
  S: "~@4 a4 ~ c5@2 b4 ~ a4@11 ~ a4@2", T: "~@5 a4@2 ~@5", U: "~@4 a4 ~ c5@2 b4@2 a4@12 ~@2",
  V: "[a4 ~ g4@2 ~@2 e4@2 d4 ~@3 c4@2 a3 ~@3 g3@3 ~ a3@23 ~ [a3,a4]@2]/2", // A
  W: "[~@4 a4 ~ c5@2 b4 ~ a4@17 ~ a4 ~ c5@2 b4 ~ a4@14]/2", X: "~@4 a4@2 c5@2 b4 ~ a4@13 ~", Y: "[a4,a5]@23 ~",
  Z: "[~@18 [g4,g5]@3 ~ [a4,a5]@4 [f5,f#5,g5] [c#5,d5,d#5,e5] [a#4,b4,c5] [g4,g#4,a4] ~@18]/2", // G A
})).s("gm_brass_section").gain(0.54).pan(0.6)

// other · synth drum
const synth_drum = note("<A ~@30 A B ~@26 A B ~@21 A ~@21 A B ~@22 A B ~>".pickRestart({
  A: "f6 ~ f6 ~ f6 ~ c6 ~ c6 ~ c6 ~ g5 ~ g5 ~ g5 ~ c5 ~ c5 ~ c5 ~", B: "f4 ~@11",
})).s("gm_synth_drum").gain(0.21).pan(0.2)

// other · lead 8 bass lead
const lead_8_bass_lead = note("<~@6 A ~@3 A ~@23 A ~@3 A ~@23 A ~@3 A ~@40 A ~@3 A ~@19>".pickRestart({
  A: "~@12 d6!2 ~ d6!2 ~ d6!2 ~ d6!2 ~",
})).s("gm_lead_8_bass_lead").gain(0.22).pan(0.6)

// other · clavinet
const clavinet = note(`<
  ~@13 A@2 B@4 A@4 B@4 A B A B C D E F G H@2 F I J@3 B@4 A@4 B@4 A B A B C D E F G H@2 F I K ~@14 L M B N O B@4 A@4 B@4
  A B A B C D E F G H@2 F I K P B A B P B A B P B A B P B C Q ~
>`.pickRestart({
  A: "a1 ~@3 a1 ~ a2 ~ a2 ~ a2 ~ a1 ~@3 a1 ~ a2 ~ a2 ~ a2 ~",
  B: "d2 ~@3 d2 ~ d3 ~ d3 ~ d3 ~ d2 ~@3 d2 ~ d3 ~ d3 ~ d3 ~",
  C: "a2 ~ a2 ~ a2 ~ g2 ~ g2 ~ g2 ~ e2 ~ e2 ~ e2 ~ d2 ~ d2 ~ d2 ~", D: "a1 ~@11", E: "a4@21 ~ c5@2", F: "~@4 d5@19 ~",
  G: "e5@21 ~ g5@2", H: "[~@4 e5@2 ~@4 d5@3 ~@3 c5@3 ~@3 a4@23 ~ c5@2]/2", I: "e5@10 ~ g5",
  J: "[~@4 e5@2 ~@4 d5@3 ~@3 c5@3 ~@5 a1 ~@3 a1 ~ a2 ~ a2 ~ a2 ~ a1 ~@3 a1 ~ a2 ~ a2 ~ a2 ~ a1 ~@3 a1 ~ a2 ~ a2 ~ a2 ~ a1 ~@3 a1 ~ a2 ~ a2 ~ a2 ~, ~@22 a4@27 ~@23]/3",
  K: "~@4 e5@2 ~@4 d5@3 ~@3 c5@3 ~@3 a4@2", L: "b1 ~@3 b1 ~ b2 ~ b2 ~ b2 ~ b1 ~@3 b1 ~ b2 ~ b2 ~ b2 ~",
  M: "c#2 ~@3 c#2 ~ c#3 ~ c#3 ~ c#3 ~ c#2 ~@3 c#2 ~ c#3 ~ c#3 ~ c#3 ~",
  N: "f1@2 ~@2 f1 ~ f2 ~ f2 ~ f2 ~ f1 ~@3 f1 ~ f2 ~ f2 ~ f2 ~",
  O: "e1 ~@3 e1 ~ e2 ~ e2 ~ e2 ~ e1 ~@3 e1 ~ e2 ~ e2 ~ e2 ~",
  P: "a1@2 ~@2 a1 ~ a2 ~ a2 ~ a2 ~ a1 ~@3 a1 ~ a2 ~ a2 ~ a2 ~", Q: "a1 ~@17 g1@2 ~@2 a1@2",
})).s("gm_clavinet").gain(0.5)

// other · trombone
const trombone = note(`<
  ~@3 A@2 B C D E@2 F D G@3 ~@12 H I J K L ~ B C D E@2 F D G@3 ~@12 M N O P Q R B C D E@2 F D S ~@14 T U V W X ~@12 H I
  J K Y R B C D E@2 F D Z@2 ~@3 AA AB AC AD@2 ~ AE AF@2 AG Y AH ~
>`.pickRestart({
  A: "[~@24 a1@23 ~, a2@23 ~]/2", B: "a2@10 ~ c3", C: "~@2 d3@9 ~", D: "e3@19 ~@3 g3@2",
  E: "[~@4 e3@3 ~@3 d3@2 ~@4 c3@3 ~@3 a2@22 ~@2 c3@2]/2", F: "~@4 d3@19 ~",
  G: "[~@4 e3@3 ~@3 d3@2 ~@4 c3@3 ~@3 a2@28 ~@22]/3", H: "~@5 a3@4 ~@3", I: "~@10 a3@7 ~ f#3@3 ~@3", J: "a3 ~@5",
  K: "~@10 a3@5 ~@3 f#3@3 ~@3", L: "a3 ~@7", M: "~@5 a2@4 ~@3", N: "~@10 a2@7 ~ f#2@3 ~@3", O: "a2 ~@5",
  P: "~@10 a2@5 ~@3 f#2@3 ~@3", Q: "[a2,a3]@4 ~@2 g3@3 ~@3 e3@3 ~@3 d3@3 ~@3", R: "a2 ~@11",
  S: "~@4 e3@3 ~@3 d3@2 ~@4 c3@3 ~@3 a2@2", T: "f#3@3 ~ g#3 ~ a3 ~ g#3 ~ f#3@13 ~",
  U: "g#3@3 ~ a3 ~ b3 ~ a3 ~ g#3@13 ~", V: "a3@3 ~ b3 ~ c4 ~ b3 ~ a3@13 ~", W: "c4@2 a3 ~@9", X: "b3@2 g#3 ~@9",
  Y: "a3 ~ g3 ~ e3 ~ d3 ~", Z: "[~@4 e3@3 ~@3 d3@2 ~@4 c3@3 ~@3 a2@9 ~@17]/2", AA: "~@4 a3@2 c4@2 b3 ~ a3@11 ~ a3@2",
  AB: "~@10 a3@3 ~@11", AC: "~@4 a3@2 c4@2 b3 ~ a3@13 ~",
  AD: "[a3 ~ g3@2 ~@2 e3 ~ d3 ~@3 c3@2 a2 ~@3 g2@3 ~ a2@23 ~ a2@2]/2", AE: "~@4 a3@2 c4 ~ b3 ~ a3@14",
  AF: "~@4 a3@2 c4@2 b3 ~ a3@14", AG: "a3@11 ~", AH: "a2@2 ~@16 g2@3 ~ a2@2",
})).s("gm_trombone").gain(0.5)

// other · lead 7 fifths
const lead_7_fifths = note("<~@28 A B ~@26 A B ~@43 A B ~@28>".pickRestart({
  A: "~@10 [f#6,g6] [d#6,e6,f6] [c#6,d6] [b5,c6] [g#5,a5,a#5] [f#5,g5] [e5,f5] [d5,d#5] [c5,c#5] [a4,a#4,b4] [g4,g#4] [f4,f#4] [d#4,e4] [c#4,d4]", // Gmaj7 Dmaj7 Cmaj7 Gmaj7 Fmaj7 D#maj7 C#maj7 G#maj7 …
  B: "[a#3,b3,c4] a3 ~@22",
})).s("gm_lead_7_fifths").gain(0.12).pan(0.4)

// chords · epiano1
const epiano1 = note(`<
  ~@5 A B C D@2 E F G@3 ~@18 A B C D@2 E F G@3 ~@18 A B C D@2 E F H ~@37 A B C D@2 E F I@2 ~@16
>`.pickRestart({
  A: "[c#4,e4,a4]@19 ~@3 [e4,g4,c5]@2", B: "~ [f#4,a4,d5]@4 ~", C: "[g#4,b4,e5]@9 ~@2 [b4,d5,g5]",
  D: "[~@4 [g#4,b4,e5]@2 ~@4 [f#4,a4,d5]@3 ~@3 [e4,g4,c5]@5 ~ [c#4,e4,a4]@20 ~@4 [e4,g4,c5]@2]/2", // E D C A C
  E: "~@4 [f#4,a4,d5]@15 ~@5", F: "[g#4,b4,e5]@10 ~ [b4,d5,g5]",
  G: "[~@2 [g#4,b4,e5] ~@2 [f#4,a4,d5] ~@2 [e4,g4,c5]@3 [c#4,e4,a4]@14 ~@11]/3", // E D C A
  H: "~@2 [g#4,b4,e5] ~@2 [f#4,a4,d5] ~@2 [e4,g4,c5]@3 [c#4,e4,a4]", // E D C A
  I: "[~@4 [g#4,b4,e5]@2 ~@4 [f#4,a4,d5]@2 ~@4 [e4,g4,c5]@6 [c#4,e4,a4]@9 ~@17]/2", // E D C A
})).s("gm_epiano1").gain(0.17).pan(0.8)

// bass · electric bass finger
const bass_2 = note(`<
  A B C@2 D E@2 F@4 G@3 H I@3 J K L M L I@4 M N O P A Q R@2 F@4 G@3 H I@3 J K L M L I@4 M N O P A Q R@2 F@4 S@3 ~@9 T
  U@3 V W X Y Z I@3 J K L M L I@4 M N O P A Q R@2 F@4 AA@2 M P O I M AB M P M P O AC M I A AD ~
>`.pickRestart({
  A: "a2 ~ a2 ~ a2 ~ g2 ~ g2 ~ g2 ~ e2 ~ e2 ~ e2 ~ d2 ~ d2 ~ d2 ~",
  B: "a1@2 ~@4 e2@4 a1 ~ a1@3 ~@3 e2@4 a1 ~, ~ a1 ~@2 a1 ~", C: "a1@3 ~@3 e2@4 a1 ~ a1@3 ~@3 e2@4 a1 ~, ~ a1 ~@2 a1 ~",
  D: "a1@3 ~@3 e2@4 a1 ~ a1@3 ~@3 e2@4 a1@2, ~ a1 ~@2 a1 ~",
  E: "[a1@3 ~ a1 ~ a1@3 ~ a1 ~ a1@3 ~ a1 ~ a1@3 ~ c2@4 ~@2 d2@13 ~@7]/2",
  F: "[e1@6 e1 ~@3 e1@3 ~@3 e1@4 ~@2 g1@4 ~@2 e1@4 ~@2 d2@4 ~@2 c2@5 ~ a1@7 ~ a1@2 ~@2 a1@3 ~@3 a1@5 ~ c2@4 ~@2 d2@18 ~@2]/4",
  G: "[e1@3 ~ e1 ~ e1@2 ~@2 e1@4 ~@2 e1@4 ~@2 g1@4 ~@2 e1@5 ~ d2@4 ~@2 c2@5 ~ a1@5 ~@3 e2@4 a1@4 ~@4 e2@4 a1 ~, ~@52 a1@5 ~@7 a1@5 ~@3]/3",
  H: "a1@3 ~@3 e2@4 a1@5 ~@3 e2@4 a1@2, ~@4 a1@4 ~@8 a1@5 ~@3", I: "d2@3 ~ d2@4 ~@2 d2 ~ d2@3 ~ d2@4 ~@2 d2 ~",
  J: "d2@3 ~ d2@4 ~@2 d2 ~ d2@3 ~ d2@5 ~ d2@2", K: "a1@3 ~ a1@4 ~@2 a1 ~ a1@3 ~ a1@3 ~@3 a1 ~",
  L: "a1@3 ~ a1@3 ~@3 a1 ~ a1@3 ~ a1@4 ~@2 a1 ~", M: "a1@3 ~ a1@4 ~@2 a1 ~ a1@3 ~ a1@4 ~@2 a1 ~",
  N: "d2@3 ~ d2@4 ~@2 d2 ~ d2@3 ~ d2@5 ~ d2 ~", O: "a1@3 ~ a1@4 ~@2 a1 ~ a1@3 ~ a1@4 ~@2 a1@2",
  P: "d2@3 ~ d2@4 ~@2 d2 ~ d2@3 ~ d2@4 ~@2 d2@2", Q: "a1 ~@23",
  R: "[a1@2 ~@2 a1 ~ a1@3 ~ a1 ~ a1@3 ~ a1 ~ a1@3 ~ c2@4 ~@2 d2@13 ~@7]/2",
  S: "[e1@3 ~ e1 ~ e1@2 ~@2 e1@4 ~@2 e1@4 ~@2 g1@4 ~@2 e1@5 ~ d2@4 ~@2 c2@5 ~ a1@5 ~@21]/3", T: "a1@6 g2@6 d2@6 c2@5 ~",
  U: "[a1@35 ~]/3", V: "b1@3 ~ b1@3 ~@3 b1 ~ b1@3 ~ b1@3 ~@3 b1 ~",
  W: "c#2@3 ~ c#2@2 ~@4 c#2@2 c#2@3 ~ c#2@3 ~@3 c#2@2",
  X: "d2@3 ~ d2@2 ~@4 d2@2 d2@3 ~ d2@2 ~ [c2,c#2] [a#1,b1] ~ [f#1,g1] f1, ~@18 d2@2 ~ [g#1,a1]@2 ~", // C#maj7 Bmaj7 Gmaj7 Amaj7
  Y: "f1@3 ~ f1@3 ~@3 f1 ~ f1@3 ~ f1@3 ~@3 f1@2", Z: "e1@3 ~ e1@3 ~@3 e1 ~ e1@3 ~ e1@3 ~@3 e1@2",
  AA: "[e1@3 ~ e1 ~ e1@2 ~@2 e1@4 ~@2 e1@4 ~@2 g1@4 ~@2 e1@5 ~ d2@4 ~@2 c2@5 ~ a1@2]/2",
  AB: "d2@3 ~ d2@4 ~@2 d2@2 d2@3 ~ d2@4 ~@2 d2 ~", AC: "d2@3 ~ d2@3 ~@3 d2 ~ d2@3 ~ d2@3 ~@3 d2@2",
  AD: "a1@3 ~@15 g1@3 ~ a1@2",
})).s("gm_electric_bass_finger").gain(0.42)

// drums · kick
const kick = s("bd").struct("<~ [x!4]!31 x [x!4]!27 x [x!4]!68 [x ~@8 x ~ x] ~>").gain(0.54)

// drums · snare
const snare = s("sd").struct(`<
  ~ A B A B A@7 B A@14 C@2 A@3 ~ A@3 B A@3 B A@14 C@2 A@3 ~ A@9 D A D A@2 E A@2 F G H I A@4 J@2 A@12 C@2 A@11 B A D A D
  A D A D A D A D A D A K ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@3 x ~@5 x ~ x", C: "~@3 x ~ x ~@3 x ~@2", D: "~@2 x!3 ~ x ~@2 x ~@2", E: "~@3 x ~@4 x!2 ~@2",
  F: "x!2 ~ x", G: "~@2 x!2 ~@5 x ~ x", H: "~@3 x ~@4 x!4", I: "x!4", J: "x ~ x!2 ~@5 x ~@2", K: "~ x!3 ~@2",
})).gain(0.48)

// drums · clap
const clap = s("cp").struct("<~ A@14 ~@16 A ~ A@10 ~@16 A ~ A@22 ~@21 A ~ A@23 ~@2>".pickRestart({
  A: "~ x ~ x",
})).gain(0.42)

// drums · low tom
const low_tom = s("lt").struct(`<
  A ~ B ~ B ~ C ~ C ~ C ~ B C@18 A ~@2 C ~ C ~ C ~ B C@18 A ~ D@3 E D@3 F ~ G ~ G ~ G ~ G ~ G ~ G ~ G D@3 H@2 C@16 A ~
  D@3 E D@3 B ~ G ~ G ~ G ~ G ~ G ~ G ~ G A G ~
>`.pickRestart({
  A: "~@6 x!6", B: "~@9 x ~ x", C: "~@3 x", D: "~ x ~ x", E: "~@3 x ~@5 x ~ x", F: "~@3 x ~@4 x ~@2 x", G: "~ x!3 ~@2",
  H: "x!2 ~@4",
})).gain(0.36)

// drums · hihat
const hihat = s("hh").struct(`<
  ~
  [x ~ x ~@2 x!2 ~ x ~@2 x]!31
  x
  [x ~ x ~@2 x!2 ~ x ~@2 x]!27
  x
  [x ~ x ~@2 x!2 ~ x ~@2 x]!68
  x
  ~
>`).gain(0.3)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~ A@31 ~ A@27 ~ A@8 ~@14 A@31 ~@17>".pickRestart({
  A: "~ x ~@2 x ~@2 x ~@2 x ~",
})).gain(0.12)

// drums · open hat
const open_hat = s("oh").struct("<~ [~ x ~ x]!31 ~ [~ x ~ x]!27 ~ [~ x ~ x]!68 ~@2>").gain(0.36)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  A ~ B ~ B ~ C ~ C ~ C ~ B ~@2 C@16 A ~@2 C ~ C ~ C ~ B ~@2 C@16 A ~ D@3 E D@3 F ~ G ~ G ~ G ~ G ~ G ~ G ~ G D@3 H@2
  C@16 A ~ D@3 E D@3 B ~ G ~ G ~ G ~ G ~ G ~ G ~ G A G ~
>`.pickRestart({
  A: "~@3 x!3 ~@6", B: "~@9 x ~ x", C: "~@3 x", D: "~ x ~ x", E: "~@3 x ~@5 x ~ x", F: "~@3 x ~@4 x ~@2 x",
  G: "~ x!3 ~@2", H: "x!2 ~@4",
})).gain(0.36)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~ A ~ A ~ A ~@3 A ~@15 B@2 A ~@3 A ~@21 B@2 A ~@3 A ~@21 A ~@16 B@2 A ~@3 A ~@22 C ~
>`.pickRestart({
  A: "x", B: "~@5 x ~@6", C: "x ~@10 x",
})).gain(0.36)

// drums · high tom
const high_tom = s("ht").struct("<A ~@27 B ~@2 A ~@24 B ~@2 A ~@41 B ~@2 A ~@23 A ~@2>".pickRestart({
  A: "x!3 ~@9", B: "~@5 x ~@6",
// … 35 more lines

More by Ike & Tina Turner