Strudelify
Knock on Wood cover art

Knock On Wood

Knock on Wood

Amii Stewart

KeyA majorTempo144 bpm
0:00/0:00
// Knock on Wood — Amii Stewart
// 144 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 146 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(144/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 · "A.PIANO 2"
const bass = note("<~@95 [a1@5 ~ c2@6 d2@5 ~ c2@5 ~] [a1 ~@3] ~@49>").s("gm_piano").gain(0.8)

// bass · electric bass finger · "FINGERDBAS"
const bass_2 = note(`<
  ~@17 A@4 B C D E B C D E A@2 F@4 A@4 F@4 A F A F G H B C D E B C D E A@2 F@4 A@4 F@4 A F A F G H B C D E B C D E ~@14
  I J F K L F@4 A@4 F@4 A F A F G H B C D E B C D E A F A F A F A F A F A F A F A M
>`.pickRestart({
  A: "a1@2 ~@2 a1 ~ a1@2 ~@2 a1 ~ a1@2 ~@2 a1 ~ a1@2 ~@2 a1 ~",
  B: "a1@2 ~@2 a1 ~ a1@2 ~@2 a1 ~ a1@2 ~@2 a1 ~ a1@2 ~@2 c2 ~",
  C: "c2@2 ~@2 d2 ~ d2@2 ~@2 d2 ~ d2@2 ~@2 d2 ~ d2@2 ~@2 e1 ~",
  D: "e1@2 ~@2 e1 ~ e1@2 ~@2 e1 ~ e1@2 ~@2 e1 ~ e1@2 ~@2 g2 ~",
  E: "g2@2 ~@2 e2 ~ e2@2 ~@2 d2 ~ d2@2 ~@2 c2 ~ c2@2 ~@2 a1 ~",
  F: "d2@2 ~@2 d2 ~ d2@2 ~@2 d2 ~ d2@2 ~@2 d2 ~ d2@2 ~@2 d2 ~",
  G: "a2 ~ a2 ~ a2 ~ g2 ~ g2 ~ g2 ~ e2 ~ e2 ~ e2 ~ d2 ~ d2 ~ d2 ~", H: "a1 ~@11",
  I: "b1@2 ~@2 b1 ~ b1@2 ~@2 b1 ~ b1@2 ~@2 b1 ~ b1@2 ~@2 b1 ~",
  J: "c#2@2 ~@2 c#2 ~ c#2@2 ~@2 c#2 ~ c#2@2 ~@2 c#2 ~ c#2@2 ~@2 c#2 ~", K: "f1@3 ~ f1 ~@19", L: "e1@2 ~@2 e1 ~@19",
  M: "d2@2 ~@2 d2 ~ d2@2 ~@2 d2 ~ d2@2 ~@2 d2 ~ d2@2 ~@4",
})).s("gm_electric_bass_finger").gain(0.35)

// chords · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note("<~@14 A@3 ~@78 B@4 ~@47>".pickRestart({
  A: "[~ [b1,f#2,b2]@5]/3", B: "[a1@6 c2@5 d2@6 c2@6 a1@72 ~]/4",
})).s("gm_lead_2_sawtooth").gain(0.4)

// chords · piano · "A.PIANO 3"
const piano = note(`<
  ~@16 A ~@13 B C@2 D@3 E F@4 G@4 H@2 I J K@2 L M@3 N O@2 B C@2 D@3 E F@4 G@4 H@2 I J K@2 L M@3 N P Q@4 R ~ S@2 T U ~ V
  W ~@5 B C@2 D@3 E F@4 G@4 H@2 I J K@2 L M@3 N P Q@14 X@2
>`.pickRestart({
  A: "g#4 ~ g#4 ~ g#4 ~ f#4 ~ f#4 ~ f#4 ~ d#4 ~ d#4 ~ d#4 ~ c#4 ~ c#4 ~ c#4 ~", B: "~@10 f#4@5 ~ a4 ~ a4@4 f#4 ~",
  C: "[b4@5 ~ f#4@6 ~@6 a4@3 ~ b4@5 ~ f#4@9 ~@11]/2",
  D: "[~@12 f#4@3 ~ a4@5 ~ b4@7 ~@5 f#4 ~ a4@3 ~ a4@5 ~ f#4@8 ~@10 e4 ~ f#4@4 a4 ~]/3", E: "a4@5 ~ f#4@6 ~@12",
  F: "[~@4 e4 ~ f#4@3 ~ a4 ~ a4@4 b4@5 ~ f#4@7 ~@11 f#4 ~ a4@3 ~ b4@7 ~@13 f#4@3 ~ a4@5 ~ f#4@7 ~@13]/4",
  G: "[~@4 f#4 ~ c#5@3 ~ c#5 ~ c#5@4 b4@2 a4@3 ~ a4@7 ~@11 a4 ~ a4@3 ~ a4@5 ~ f#4@6 ~@12 b4@6 f#4@8 ~@12]/4",
  H: "[~@4 f#4 ~ c#5@3 ~ c#5 ~ c#5@3 ~ b4 ~ a4@3 ~ b4@5 ~ f#4@7 ~@5 f#4 ~ a4@3 ~ a4 ~]/2", I: "a4@3 ~@15 a4@4 ~@2",
  J: "~@18 a4@3 ~ a4@2", K: "[f#4@3 ~@8 c5@2 ~ d5@10]/2", L: "~@3 e5@6 ~@2 g5",
  M: "[~@4 e5@3 ~@3 d5@3 ~@3 c5@3 d5 c5@2 a4@9 ~@15 a4@4 ~@2 f#4@17 ~@3]/3", N: "~@3 e5@7 ~ g5",
  O: "[~@4 e5@3 ~@2 d5@3 ~@3 c5@3 ~ d5 c5@2 a4@14 ~@12]/2",
  P: "~@4 e5@3 ~@2 d5@3 ~@4 [d3,d4,f#4,a4,d5] ~ [d3,d4,f#4,a4,d5]@3 ~ [d3,d4,f#4,a4,d5] ~", // D
  Q: "[[a2,c4,e4,a4,c5]@4 ~@2 [a2,c4,e4,a4,c5]@4 ~@2 [a2,c4,e4,a4,c5]@3 ~ [g4,a4,c5,e5]@3 ~@3 [d3,f#4,a4,d5,f#5]@9 ~@3 [d3,d4,f#4,a4,d5]@5 ~ [d3,d4,f#4,a4,d5] ~ [d3,d4,a4,d5]@4 [d3,d4,f#4,a4,d5] ~, ~@16 [e3,e4]@5 ~@21 f#4@2 ~@4]/2", // Am Am7 D D5 D E
  R: "[a2,c4,e4,a4,c5]@2 ~ [a2,c4,e4,a4,c5]@2 ~ [a2,c4,e4,a4,c5]@2 ~ [a2,c4,e4,a4,c5]@2 ~", // Am
  S: "[~@8 [a2,c4,e4,a4,c5]@2 ~ [a2,c4,e4,a4,c5]@2 ~@11]/2", T: "~@9 [d3,d4,f#4,a4,d5]@2 ~",
  U: "[a2,c4,e4,a4,c5]@5 ~@19", V: "~@16 [a2,c4,e4,a4,c5] ~ [a2,c4,e4,a4,c5] ~ [a2,c4,e4,a4,c5] ~ [a2,c4,e4,a4,c5] ~",
  W: "[a2,c4,e4,a4,c5]@2 ~ [a2,c4,e4,a4,c5]@2 ~@7", // Am
  X: "[[a2,c4,e4,a4,c5]@4 ~@2 [a2,c4,e4,a4,c5]@4 ~@2 [a2,c4,e4,a4,c5]@3 ~ [g4,a4,c5,e5]@3 ~@3 [d3,f#4,a4,d5,f#5]@9 ~@17, ~@16 [e3,e4]@5 ~@27]/2", // Am Am7 D E
})).s("gm_piano").gain(0.56)

// chords · brass section · "BRASS 1"
const brass_section = note(`<
  ~@19 A@2 B C D E@2 C D F@2 ~@13 G H I H I ~ J C K L@2 C K M@2 ~@13 G H I H I ~ J C K N@2 C K O ~@31 G H I H I ~ J C K
  P@2 C K Q ~@6 R@2 S T@2 ~@5
>`.pickRestart({
  A: "[~@24 [a3,a4]@23 ~, a2@47 ~]/2", B: "[e3,c#4,e4,a4]@21 ~ [c3,e4,g4,c5]@2, a2@19 ~@3 g3 ~",
  C: "~@4 [a3,f#4,a4,d5]@19 ~, ~@3 d3@20 ~", D: "[e2,b3,g#4,b4,e5]@10 ~ [g3,d4,d5,g5], ~@22 b4 ~",
  E: "[~@4 [e3,b3,g#4,b4,e5]@2 ~@4 [a3,a4,d5]@3 ~@3 [g3,e4,g4,c5]@3 ~@3 [e3,c#4,e4,a4]@21 ~@3 [c3,e4,g4,c5]@2, ~@9 d3@2 ~@4 c3@3 ~@4 a2@19 ~@5 g3 ~, ~@10 f#4 ~@37]/2", // E D5 C A C
  F: "[~@4 [e3,b3,g#4,b4,e5]@2 ~@4 [a3,a4,d5]@3 ~@3 [g3,e4,g4,c5]@3 ~@3 [a2,e3,c#4,e4,a4]@26, ~@9 d3@2 ~@4 c3@3 ~@30, ~@10 f#4 ~@37]/2", // E D5 C A
  G: "~@5 [e4,a4,a5,a6]@5 ~@2", // A5
  H: "~@9 [f#4,a4] ~@6 [a5,a6] ~ [a3,f#4,a4]@2 ~@4, ~@9 [a5,a6]@6 ~@3 [a5,a6] ~@5, ~@5 a3@4 ~@3, ~@11 [f#4,a4]@7 ~@6", // F#m A D A F#m
  I: "[a3,e4,a4,a5,a6] ~@11", J: "[e3,c#4,e4,a4]@21 ~ [e4,g4,c5]@2, a2@19 ~@2 c3@2 ~, ~@22 g3 ~",
  K: "[e2,b3,g#4,b4,e5]@10 ~ [d5,g5], ~@7 [g3,d4], ~@22 b4 ~", // E G5
  L: "[~@4 [b3,g#4,b4,e5]@2 ~@4 [a3,a4,d5]@3 ~@3 [g3,e4,g4,c5]@3 ~@3 [e3,c#4,e4,a4]@21 ~@3 [e4,g4,c5]@2, ~@3 e3@2 ~@4 d3@2 ~@4 c3@3 ~@4 a2@19 ~@4 c3@2 ~, ~@10 f#4 ~@35 g3 ~]/2", // E D5 C A C
  M: "[~@4 [b3,g#4,b4,e5]@2 ~@4 [a3,a4,d5]@3 ~@3 [g3,e4,g4,c5]@3 ~@3 [a2,e3,c#4,e4,a4]@9 ~@17, ~@3 e3@2 ~@4 d3@2 ~@4 c3@3 ~@30, ~@10 f#4 ~@37]/2", // E D5 C A
  N: "[~@4 [b3,g#4,b4,e5]@2 ~@4 [a3,a4,d5]@3 ~@3 [g3,e4,g4]@2 ~@4 [e3,c#4,e4]@21 ~@3 [e4,g4,c5]@2, ~@3 e3@2 ~@4 d3@2 ~@4 [c3,c5]@3 ~@4 a2@19 ~@4 c3@2 ~, ~@10 f#4 ~@10 a4@21 ~@4 g3 ~]/2", // E D5 C C#m C
  O: "~@4 [b3,g#4,b4,e5]@2 ~@4 [a3,a4,d5]@3 ~@3 [g3,e4,g4]@2 ~@4 [a2,e3,c#4,e4]@2, ~@3 e3@2 ~@4 d3@2 ~@4 [c3,c5]@2 ~@7, ~@10 f#4 ~@10 a4@2 ~", // E D5 C A C
  P: "[~@4 [b3,g#4,b4,e5]@2 ~@4 [a3,a4]@2 ~@4 [g3,e4,g4]@2 ~@4 [e3,c#4,e4]@21 ~@3 [e4,g4,c5]@2, ~@3 e3@2 ~@4 [d3,d5]@3 ~@3 [c3,c5]@3 ~@4 a2@19 ~@4 c3@2 ~, ~@10 f#4 ~@10 a4@21 ~@4 g3 ~]/2", // E A C C#m C D C
  Q: "~@2 [b3,g#4,b4,e5] ~@2 [a3,a4] ~@2 [g3,e4,g4] ~@3, ~@3 e3@2 ~@4 [d3,d5]@3 ~@3 [c3,c5]@2 ~@7, ~@10 f#4 ~@13", // E A C D C
  R: "[~@4 [a4,a5]@2 [c5,c6] ~@2 [a4,a5]@12 ~ [a4,a5] ~ [a4,f#5,a5]@3 ~@7 [a4,d5,f#5,a5]@2 ~@12, ~@8 [b4,b5]@2 ~@13 d5@3 ~@22]/2", // A C A D B
  S: "~@4 [a4,a5]@2 [c5,c6] ~@2 [a4,a5]@12 ~@3, ~@4 [b4,b5] ~@7", // A C A B
  T: "[~ [g4,g5] ~@5 [d4,d5] ~@3 [c4,c5]@2 [a3,a4] ~@3 [g3,g4]@6 [a3,a4]@10 ~ [a3,a4] ~@13, [a4,a5] ~@2 [e4,e5] ~@20]/2", // G D C A G A E
})).s("gm_brass_section").gain(0.56)

// bass · slap bass 2 · "SLAPBASS 2"
const bass_3 = note(`<
  ~@29 A@2 B@4 C@4 B@4 C B C B D E ~@8 A@2 B@4 C@4 B@4 C B C B D E ~@22 F G B H I J@4 K@4 J@4 K J K J D E ~@8 K J K J K
  J K J K J K J K J K L
>`.pickRestart({
  A: "a1@2 ~@2 a1 ~ e2 ~ e2 ~ e2 ~ a1 ~@3 a1 ~ e2 ~ e2 ~ e2 ~",
  B: "d2@2 ~@2 d2 ~ d3 ~ d3 ~ d3 ~ d2 ~@3 d2 ~ d3 ~ d3 ~ d3 ~",
  C: "a1@2 ~@2 a1 ~ a2 ~ a2 ~ a2 ~ a1 ~@3 a1 ~ a2 ~ a2 ~ a2 ~",
  D: "a2 ~ a2 ~ a2 ~ g2 ~ g2 ~ g2 ~ e2 ~ e2 ~ e2 ~ d2 ~ d2 ~ d2 ~", E: "a1 ~@11",
  F: "b1@2 ~@2 b1 ~ b2 ~ b2 ~ b2 ~ b1 ~@3 b1 ~ b2 ~ b2 ~ b2 ~",
  G: "c#2@2 ~@2 c#2 ~ c#3 ~ c#3 ~ c#3 ~ c#2 ~@3 c#2 ~ c#3 ~ c#3 ~ c#3 ~",
  H: "f1@2 ~@2 f1 ~ f2 ~ f2 ~ f2 ~ f1 ~@3 f1 ~ f2 ~ f2 ~ f2 ~", I: "e1@2 ~@2 e1 ~@19",
  J: "d2 ~ d2 ~ d2 ~ d3 ~ d3 ~ d3 ~ d2 ~ d2 ~ d2 ~ d3 ~ d3 ~ d3 ~",
  K: "a1 ~ a1 ~ a1 ~ a2 ~ a2 ~ a2 ~ a1 ~ a1 ~ a1 ~ a2 ~ a2 ~ a2 ~",
  L: "d2 ~ d2 ~ d2 ~ d3 ~ d3 ~ d3 ~ d2 ~ d2 ~ d2 ~ d3 ~ d3 ~@3",
})).s("gm_slap_bass_2").gain(0.35)

// chords · percussive organ · "ORGAN 2"
const percussive_organ = note(`<
  ~@21 A B C D@2 E F G@2 ~@19 A B C D@2 E F H@2 ~@19 A B C D@2 E F I ~@37 A B C D@2 E F J ~@16
>`.pickRestart({
  A: "[a4,c#5,e5]@19 ~@3 [c5,e5,g5]@2", B: "~@2 [d5,f#5,a5]@9 ~", C: "[e5,g#5,b5]@19 ~@3 [g5,b5,d6]@2",
  D: "[~@4 [e5,g#5,b5]@3 ~@3 [d5,f#5,a5]@3 ~@3 [c5,e5,g5]@3 ~@3 [a4,c#5,e5]@21 ~@3 [c5,e5,g5]@2]/2", // E D C A C
  E: "~@4 [d5,f#5,a5]@19 ~", F: "[e5,g#5,b5]@9 ~@2 [g5,b5,d6]",
  G: "[~@4 [e5,g#5,b5]@2 ~@4 [d5,f#5,a5]@3 ~@3 [c5,e5,g5]@3 ~@3 [a4,c#5,e5]@26]/2", // E D C A
  H: "[~@4 [e5,g#5,b5]@2 ~@4 [d5,f#5,a5]@3 ~@3 [c5,e5,g5]@3 ~@3 [a4,c#5,e5]@9 ~@17]/2", // E D C A
  I: "~@4 [e5,g#5,b5]@2 ~@4 [d5,f#5,a5]@3 ~@3 [c5,e5,g5]@3 ~@3 [a4,c#5,e5]@2", // E D C A
  J: "~@4 [e5,g#5,b5]@2 ~@4 [d5,f#5,a5]@3 ~@3 [c5,e5,g5]@3 ~@5", // E D C
})).s("gm_percussive_organ").gain(0.4).pan(0.8)

// other · synth brass 1 · "SYNBRASS 1"
const synth_brass_1 = note("<~@47 A ~@27 A B ~@22 C D E F G ~@16 A H ~@24>".pickRestart({
  A: "[a3,a4] ~ [a3,a4] ~ [a3,a4] ~ [g3,g4] ~ [g3,g4] ~ [g3,g4] ~ [e3,e4] ~ [e3,e4] ~ [e3,e4] ~ [d3,d4] ~ [d3,d4] ~ [d3,d4] ~", // A G E D
  B: "[a2,a3] ~@23", C: "[f#3,f#4]@4 [g#3,g#4]@2 [a3,a4]@2 [g#3,g#4]@2 [f#3,f#4]@11 ~@3",
  D: "[g#3,g#4]@4 [a3,a4] ~@2 [a3,a4]@2 [g#3,g#4]@11 ~@4, ~@3 [b3,b4] ~@8", // G# A G# B
  E: "[a3,a4]@4 [b3,b4] ~@2 [b3,b4]@2 [a3,a4]@13 ~@2, ~@3 [c4,c5] ~@8", F: "[c4,c5]@4 [a3,a4] ~@19",
  G: "[b3,b4]@4 g#4@19 ~, ~@4 g#3 ~@19", H: "[a3,e4,a4] ~@23",
})).s("gm_synth_brass_1").gain(0.56)

// other · synth drum
const synth_drum = note("<~@16 A ~@30 A ~@27 A ~@22 A ~@21 A ~@25>".pickRestart({
  A: "g6 ~ g6 ~ g6@2 c6 ~ c6 ~ c6 ~ f5 ~ f5 ~ f5 ~ a#4 ~ a#4 ~ a#4 ~",
})).s("gm_synth_drum").gain(0.48)

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

// drums · snare
const snare = s("sd").struct("<~@4 [~ x ~ x]!44 ~ [~ x ~ x]!27 ~ [~ x ~ x]!44 ~ [~ x ~ x]!24>").gain(0.64)

// drums · clap
const clap = s("cp").struct("<~@8 [~ x ~ x]!40 ~ [~ x ~ x]!27 ~ [~ x ~ x]!44 ~ [~ x ~ x]!24>").gain(0.56)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@9 A ~ A ~ A ~ A ~@2 B ~ B ~ C ~ B ~ C ~ B ~@21 C ~ B ~ C ~ B ~@21 C ~ B ~ C ~ B ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 D@2
  ~@19 C ~ B ~ C ~ B ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
>`.pickRestart({
  A: "~ x!3 ~@2", B: "~@9 x ~ x", C: "~@3 x", D: "x!2 ~@4",
})).gain(0.64)

// drums · hihat
const hihat = s("hh").struct("<~@4 A@13 B A@30 C B A@26 C A@8 ~@4 A@32 C A@23 D>".pickRestart({
  A: "x ~ x!2 ~ x!2 ~ x!2 ~ x", B: "~@2 x!2 ~ x!2 ~ x!2 ~ x", C: "x", D: "x ~ x!2 ~ x!2 ~ x!2 ~@2",
})).gain(0.48)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@4 A@44 ~ A@27 ~ A@8 ~@4 A@32 ~ A@24>".pickRestart({
  A: "~ x ~@2 x ~@2 x ~@2 x ~",
})).gain(0.16)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@9 A ~ A ~ A ~ A B ~@30 B ~@27 B ~@10 A ~ A ~ A ~ A ~ A ~ A ~ C ~@3 D@2 ~@16 B ~@10 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
>`.pickRestart({
  A: "~ x!3 ~@2", B: "~@7 x!2 ~ x!2", C: "~@2 x ~ x ~ x!3 ~ x!2", D: "x!2 ~@4",
})).gain(0.64)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@16 A ~@30 A ~@27 A ~@22 A ~@21 A ~@25>".pickRestart({
  A: "~@2 x!2",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@16 A ~ B ~ B ~ C ~ B ~ C ~ B ~@18 A ~@2 C ~ B ~ C ~ B ~@18 A ~@2 C ~ B ~ C ~ B ~@13 A ~@21 A ~@2 C ~ B ~ C ~ B ~@16
>`.pickRestart({
  A: "x!3 ~ x!2 ~@6", B: "~@9 x ~ x", C: "~@3 x",
})).gain(0.56)

// drums · high tom · soft notes
const high_tom_soft = s("ht").struct("<~@16 A ~@30 A ~@27 A ~@22 A ~@21 A ~@25>".pickRestart({
  A: "~ x ~@2",
})).gain(0.32)

// drums · crash
const crash = s("cr").struct("<~@17 x ~@31 x ~@96>").gain(0.48)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<[~@3 x ~ x ~@3 x ~ x]!145 [~@3 x ~ x ~@3 x ~@2]>").gain(2.55)

// drums · agogo bells
const agogo_bells_2 = s("agogo:4").struct("x!6").gain(2.55)

stack(
  bass, bass_2, lead_2_sawtooth, piano, brass_section, bass_3, percussive_organ, synth_brass_1, synth_drum, kick, snare,
  clap, low_tom, hihat, hihat_soft, mid_tom, mid_tom_soft, high_tom, high_tom_soft, crash, agogo_bells, agogo_bells_2
)