Strudelify

Knock on Wood

Eddie Floyd

KeyF♯ majorTempo118 bpm
0:00/0:00
// Knock on Wood — Eddie Floyd
// 118 bpm, 4/4, key F# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 89 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(118/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 · electric bass finger · "P1-Chase"
const bass = note(`<
  A B C D E@3 F G@3 H E@4 H E H E I A B C D E@3 F G@3 H E@4 H E H E I A B J K L M N O E@3 F G@3 H E@4 H E H E I A B J P
  H E H E H E H E H E H E H E H E H ~
>`.pickRestart({
  A: "f1 ~ f1 ~ f1@2 f1 ~ f1@2 f1 ~ f1@2 g#1@2", B: "~@2 a#1@4 a#1 ~ a#1 ~ a#1 ~ a#1 ~ a#1 ~",
  C: "c2@2 c2 ~ c2 ~ c2 ~ c2@2 c2 ~ c2 ~ d#2@2", D: "~@2 c2@11 ~ f1@2", E: "a#1@3 g2 ~ f2 ~ d2, ~@6 f#2 ~@9",
  F: "a#1@6 g2@2 ~@2 f2@3 ~ d2@2, ~@6 f#2 ~@9", G: "f1@3 d2 ~ c2 ~ a1, ~@6 c#2 ~@9",
  H: "f1@3 d2 ~ c2 ~ f1, ~@6 c#2 ~@9", I: "f1 ~@7", J: "c2@2 c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ d#2@2",
  K: "~ c2 ~ a#1 ~ g#1 ~@2", L: "g1!8", M: "a1!8", N: "a#1!8", O: "c#2 ~@3 c2 ~@3", P: "~ c2 ~ a#1 ~ g#1 ~ d#1",
})).s("gm_electric_bass_finger").gain(0.12)

// chords · electric guitar clean · "P5-Clean Guitar"
const electric_guitar_clean = note(`<
  A B C D E@3 F G@4 E@4 ~@5 H I J K E@3 L G@4 E@4 ~@5 M N J O ~ P Q R E@3 L G@4 E@4 ~@5 M S T O U V U V U V U V U V U V
  U V U V U ~
>`.pickRestart({
  A: "[f3,a3,c4]@12 ~@2 [g#3,c4,d#4] ~", B: "~ [a#3,d4,f4]@5 ~@2", C: "[c4,e4,g4]@12 ~@2 [a#3,d#4,g4] ~",
  D: "~@2 [c4,e4,g4]@11 ~@3", E: "~@2 [d4,g4,a#4]@2 [f4,g4,a#4] ~@3, ~@4 f#4 ~@11",
  F: "~@4 [c4,c#4,d4,d#4,e4,f4] ~ [d4,f4] ~ [c4,d#4] ~ [c4,d#4]@2 [a#3,d4]@4, ~@12 b3 ~@3", // Dm Cm A#
  G: "~@2 [a3,d4,f4]@2 [c4,d4,f4] ~@3, ~@4 c#4 ~@11", H: "[f3,a3,c4]@12 ~@2 [d#3,g#3,c4,e4] ~, f4@9 ~@7",
  I: "~@2 [f3,a#3,d4]@11 ~@3", J: "[g3,c4,e4]@11 ~@3 [a#3,d#4,g4] ~", K: "~ [g3,c4,e4]@5 ~@2",
  L: "~@4 [c4,c#4,d4,d#4,e4,f4] ~ [d4,f4] ~ [c4,d#4] ~ [c4,d#4]@2 [a#3,d4]@3 ~", M: "[f3,a3,c4]@12 ~@2 [d#3,g#3,c4] ~",
  N: "~ [f3,a#3,d4]@5 ~@2, ~@2 g4 ~@13", O: "~@2 [g3,c4,e4] ~@3 [f3,a#3,d4] ~@3 [d#3,g#3,c4] ~@5",
  P: "[a2,e3,g3,a3,c#4,e4] ~@7", Q: "[a#2,f3,g#3,a#3,d4,f4] ~@4 [a#2,f3,g#3,a#3,d4,f4]!3",
  R: "[c#3,g#3,b3,c#4,f4,g#4] ~@3 [c3,g3,a#3,c4,e4,g4] ~@3", S: "~ [f3,a#3,d4]@5 ~@2",
  T: "[g3,c4,e4]@12 ~@2 [a#3,d#4,g4] ~", U: "~@4 c#4 d4@3 [c4,d4,f4]@2 ~@6, ~ [a3,f4] ~@2",
  V: "~@4 f#4 g4@3 [f4,g4,a#4]@2 ~@6, ~ [d4,a#4] ~@2", // Gm7 Gm
})).s("gm_electric_guitar_clean").gain(0.22).pan(0.4)

// chords · electric guitar clean · "P5-Clean Guitar" · soft notes · G7 A7 A#7
const electric_guitar_clean_2 = note(`<
  ~@46
  [[g2,d3,f3,g3,b3,d4]!8]
  [~ [a2,e3,g3,a3,c#4,e4]!7]
  [~ [a#2,f3,g#3,a#3,d4,f4]!4 ~@3]
  ~@40
>`).s("gm_electric_guitar_clean").gain(0.13).pan(0.4)

// other · percussive organ · "P6-Jazz Organ"
const percussive_organ = note(`<
  ~@3 A B@2 C D@2 E F@4 G@4 H@2 I@2 ~@2 J K@2 L@2 M@2 N@2 O@2 P@4 Q@2 R@2 ~@6 S@3 T@2 U V W@2 X@2 Y@3 Z AA@2 AB AC ~@3
  AD AE AF AG AH AG AI AJ AK@2 AL AM AN AO AP AQ AR@2
>`.pickRestart({
  A: "~@8 d5@2 f5 ~ f5@2 d5@2", B: "[g5@4 ~@8 d5 ~ f5@4 d5 ~@13, f#5 ~@31]/2",
  C: "~@8 d5@2 f5 ~ d5 ~ g5 ~, ~@8 c#5 ~@7",
  D: "[~@8 [c#5,d5] ~ f5@2 ~@2 f5@3 e5 [b4,c5,d5] [f4,g4,a4] [b3,c4,d4,e4] [f3,g3,a3] ~@6 d5@2 f5 ~, ~@28 c#5 ~@3]/2", // Dmaj7 Bm F Cmaj7 F
  E: "f5@4 d5 ~@11",
  F: "[~@4 d5@2 f5 ~ f5 ~ f5@2 g5@2 d5@11 ~ d5@2 f5@2 g5@6 ~@8 d5 ~ f5@4 d5 ~@13, ~@4 c#5 ~@25 f#5 ~@33]/4",
  G: "[~@2 d5 ~ a#5 ~ a#5 ~ g#5 ~ g5@4 f5@11 ~ d5 ~ f5 ~ f5@4 d5 ~@11 g5@4 d5 ~@13, ~@46 f#5 ~@17]/4",
  H: "[~@2 c5@2 g#5@2 c5@2 g5 ~ f5@2 d5@2 f5@4 g5 ~@5 d5@2 f5 ~ f5@2 d5 ~, ~@14 e5 ~@17]/2",
  I: "[[f5,g#5]@2 ~@10 [e5,f5] ~ f5@4 [c5,d5,e5] [g4,a4,b4] [c4,d4,e4,f4] ~@11]/2", J: "~@8 d5@2 f5 ~ f5 ~ d5 ~",
  K: "[g5@4 d5 ~@7 d5 ~ f5@4 g5 ~@13, f#5 ~@31]/2", L: "[~@4 d5@2 f5 ~ f5 ~ f5 ~ g5@2 d5@15 ~@3]/2",
  M: "[~@6 d5 ~ f5 ~ f5@2 ~@2 f5@4 d5 ~@3 f5@4 d5 ~@5]/2",
  N: "[~@4 d5@2 f5 ~ f5 ~ f5@2 g5@2 d5@8 ~@2 d5@2 f5@3 ~ f5@2]/2", O: "[g5@3 ~@9 d5 ~ f5@4 g5 ~@13]/2",
  P: "[~@2 [d5,f5]@2 [g5,a#5] ~ [g5,a#5] ~ [f5,g#5]@2 [d#5,g5]@3 ~ [d5,f5]@12 d5 ~ f5 ~ f5@4 c5 ~@11 g5@4 d5 ~@13, ~@46 f#5 ~@17]/4", // Dm Gm Fm D# Dm
  Q: "[~@2 f5 ~ g#5 ~ f5 ~ g5 ~ f5 ~ d5 ~ [d5,g5]@4 [d5,f5] ~@5 d5@2 f5 ~ f5@2 d5@2, ~@14 [c#5,f#5] ~@17]/2", // G5 Dm F#5
  R: "[[f5,g#5]@2 ~@10 [e5,f5] ~ f5@4 [c5,d5,e5] [f4,g4,a4,b4] [d4,e4] [f3,g3] ~@10]/2", // Fm Fmaj7 C G7 Dsus2 Fsus2
  S: "[~@10 c5@2 d5 ~ f5@4 g5 ~@9 d5 ~ f5@4 d5 ~@13]/3", T: "[~@4 d5@2 f5 ~ f5 ~ f5 ~ g5@2 d5@13 ~@5]/2",
  U: "~@6 d5 ~ f5 ~ f5 ~@3 f5@2", V: "~@2 d5 ~@3 f5@4 c5 ~@5",
  W: "[~@4 d5@2 f5 ~ f5 ~ f5@2 g5@2 d5@10 ~@2 d5@2 f5 ~ f5@2]/2", X: "[g5 ~@11 d5 ~ f5@4 d5 ~@13]/2",
  Y: "[~@2 d5@2 a#5 ~ a#5 ~ g#5 ~ g5@4 f5@10 d5@2 f5 ~ f5 ~ f5@4 c5 ~@11 g5@2, ~@46 f#5 ~]/3", Z: "~ d5@6 ~",
  AA: "[~@2 c5 ~ g#5 ~ f5 ~ g5 ~ f5 ~ d5 ~ g5@4 f5@6 d5@2 f5 ~ f5@2 d5@2, ~@14 f#5 ~@17]/2",
  AB: "[f5,g#5]@2 ~@10 f5 ~ f5@2", AC: "~ [d5,e5] [a4,b4,c5] [e4,f4,g4] [g3,a3,d4] f3 ~@10",
  AD: "~@4 [f5,g#5,c6,d#6,f6]@2 e5 [b4,c5,d5] [f4,g4,a4] ~@3 g5@2 d5@2, ~@12 f5 ~@3", AE: "~@8 d5@2 f5 ~ f5@2 d5 ~",
  AF: "[g#5,c6]@2 ~@10 g5@2 d5 ~, ~@12 f5 ~@3", AG: "~@8 a#5 ~ a#5 ~ a#5 ~ a#5@2",
  AH: "g#5@2 ~@10 g5@2 d5 ~, ~@12 f5 ~@3", AI: "g#5@2 ~@2 g#5@2 ~@2 g5@2 ~@2 f5@2 d5 ~",
  AJ: "~@12 [g5,a#5] ~ [g5,a#5] ~", AK: "[[g5,a#5] ~ [g5,a#5] ~ [g5,a#5]@4 [f5,g#5]@4 [d#5,g5]@2 [d5,f5]@15 ~@3]/2",
  AL: "~@4 d#5 ~ c5 ~ d#5 ~ c5 ~ g#5@2 f5@2, ~@14 e5 ~", AM: "~@12 [a5,a#5] ~ a#5@2, ~@14 a5 ~",
  AN: "g#5@2 ~@10 [g5,g#5] ~ g#5@2, ~@14 g5 ~", AO: "f5 ~@11 [a5,a#5] ~ a#5@2, ~@14 a5 ~",
  AP: "g#5 ~@11 [g5,g#5] ~ g#5@2, ~@14 g5 ~", AQ: "f5 ~@9 g#5 ~ g#5 ~ g#5@2", AR: "[f5@2 ~@8 f5 ~ g5@2 d5@10 ~@8]/2",
})).s("gm_percussive_organ").gain(0.66).pan(0.4)

// other · trumpet · "P7-Trumpet"
const trumpet = note(`<
  A B C D ~@12 E@4 ~ F B C D ~@4 G ~ G ~ H ~ I ~ E@4 ~ J B K L M N O P ~@4 Q ~ Q ~ I ~ R ~ E@4 ~ J B C L S T U T U T U T
  U T U T S T U T U ~
>`.pickRestart({
  A: "f4@14 g#4 ~, g4 ~@15", B: "~ a#4@7", C: "c5@14 d#5 ~", D: "~@2 c5@13 ~", E: "~@6 f5@4 f5 ~@5", F: "f4@13 ~ g#4 ~",
  G: "~@2 c5 ~ f5 ~ d#5@9 ~", H: "~@2 f4 ~ a#4 ~ g#4@9 ~", I: "~@2 f4 ~ a#4 ~ g#4@10", J: "f4@14 g#4 ~",
  K: "c5@13 ~ d#5 ~", L: "~@2 c5 ~@3 a#4 ~@3 g#4 ~@5", M: "d4 e4 f4 e4 d4@10 ~@2", N: "e4 f4 g4 f4 e4@10 ~@2",
  O: "f4 g4 g#4 g4 f4@11 ~", P: "g#4@2 f4 ~@5 g4@2 e4 ~@5", Q: "~@2 c5 ~ f5 ~ d#5@10", R: "~@2 f5 ~ a#5 ~ g#5@10",
  S: "~@4 f5@3 e5 f5 [e5,f5] ~@6", T: "~@4 d5@3 c#5 d5 c#5 d5 ~@5", U: "~@4 f5@3 e5 f5 e5 f5 ~@5",
})).s("gm_trumpet").gain(0.35).pan(0.6)

// 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 C B A B@2 A@16 C A@27 D E F@17 ~>".pickRestart({
  A: "x!2", B: "x ~@3 x!2 ~@2", C: "x", D: "x ~@3 x ~@2 x", E: "~@2 x ~@3 x ~@3 x ~@3 x!2", F: "x!2 ~@2 x ~@3",
})).gain(0.41).pan(0.4)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@26 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A@3 ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@19
>`.pickRestart({
  A: "~@5 x ~@2",
})).gain(0.27).pan(0.4)

// drums · rim
const rim = s("rim").struct("<~@20 [~ x!4 ~@3] ~@20 [~ x!4 ~@3] ~@24 [~@2 x!2 ~ x!2 ~@9] ~@22>").gain(0.37).pan(0.4)

// drums · snare
const snare = s("sd").struct("<A@20 ~ A@15 B A@4 ~ A@4 C@3 D A@16 ~ A@3 E A@17 ~>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~ x!2", C: "x!4", D: "x!2", E: "~ x ~ x ~ x ~@2",
})).gain(0.41).pan(0.4)

// drums · clap
const clap = s("cp").struct("<~@50 [~ x ~ x]!16 ~ [~ x ~ x]!3 ~ [~ x ~ x]!17 ~>").gain(0.37).pan(0.4)

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

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A@3 ~@2 A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~@19
>`.pickRestart({
  A: "~@7 x",
})).gain(0.27).pan(0.4)

// drums · crash
const crash = s("cr").struct("<A ~@3 A ~@16 A ~ A ~ A ~@11 A ~@4 A ~ B ~@5 A ~@16 B C B D E@17 ~>".pickRestart({
  A: "x", B: "x ~@6 x", C: "~ x ~@6", D: "~ x ~ x ~ x ~@2", E: "~ x ~@2",
})).gain(0.37).pan(0.4)

stack(
  bass, electric_guitar_clean, electric_guitar_clean_2, percussive_organ, trumpet, kick, kick_soft, rim, snare, clap,
  hihat, hihat_soft, open_hat, crash
)