Strudelify

Shake Hands

Drafi Deutscher

KeyA majorTempo100 bpm
0:00/0:00
// Shake Hands — Drafi Deutscher
// 100 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 50 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · piano · "Gesang/P"
const piano = note(`<
  ~@3 A B C D E F G H I J K J L J M N O B C D E F G H I ~@4 J K J L J M N O B C D E F G H I@3
>`.pickRestart({
  A: "~@14 [a5,c#6] ~", B: "[a5,c#6] ~@5 [a5,c#6] ~ [a5,d6]@2 ~@4 [a5,d6] ~",
  C: "[a5,c#6] ~ [a5,c#6] ~ [a5,c#6] ~ [a5,c#6] ~ [a5,c#6]@3 [g#5,b5] ~@2 b5@2, ~@14 g#5 ~", // A G#m
  D: "a5@2 ~@4 [a5,c#6] ~ [a5,d6]@2 ~@4 [a5,d6] ~, c#6 ~@15", E: "c#6@2 a5 ~ a5@2 f#5@2 a5@2 ~@4 [a5,c#6]@2",
  F: "a5 ~@2 [a5,c#6] [a5,d6] ~@2 [a5,d6], c#6 ~@15", // A D5
  G: "[a5,c#6] ~ [a5,c#6] ~ [a5,c#6] ~ [a5,c#6] ~ [a5,c#6]@3 [g#5,b5] ~@2 [g#5,b5] ~", // A G#m
  H: "[a5,c#6]@2 ~@4 c#6@2 [a5,d6]@2 ~@4 [a5,d6] ~, ~@6 a5 ~@9", I: "c#6@2 a5 ~ a5@2 f#5 ~ a5@4 ~@4, ~@8 f#5 ~@7",
  J: "~@2 e4@2 a4@2 c#5@2 e5@2 f#5 e5@3 c#5@2", K: "b4@2 a4@2 f#4@2 a4@2 c#5@3 b4@2 ~@3",
  L: "b4@2 a4 ~ f#4@2 a4@2 b4@3 ~@5", M: "b4@2 a4@2 f#4@2 a4@2 c#5@3 b4@3 ~@2",
  N: "a4 ~ a4 ~ a4 ~ a4 ~ a4 ~ a4 a4@2 ~ a4 ~", O: "a4@2 f#4@2 f#4@2 g#4@2 a4@2 ~@4 [a5,c#6] ~",
})).s("gm_piano").gain(0.8)

// chords · electric guitar clean · "Lead-Gui"
const electric_guitar_clean = note(`<
  ~@3 A B ~ B ~ B ~ B ~ C D E F E F G H B ~ B ~ B ~ B ~@5 C D E F E F G H B ~ B ~ B ~ B ~@3
>`.pickRestart({
  A: "[e5,a5]!16", B: "~@2 [d#5,g#5,c6] [e5,a5,c#6] ~@6 [f5,g#5,c#6] [f#5,a5,d6] ~@4", C: "[e5,a5] ~@3 [e5,g#5] ~@3",
  D: "[d5,f#5]@3 ~@5 [e5,g#5]!8", E: "[e5,a5] ~@7 [e5,g#5]@2 ~@6", F: "[d5,f#5]@2 ~@6 [b4,e5]!8",
  G: "[d5,f#5] ~@3 [d5,f#5] ~@3 [e5,a5] ~@3 [e5,a5] ~@3", H: "[d5,f#5] ~@3 [d5,f#5] ~@3 [e5,a5] [b4,e5]!7",
})).s("gm_electric_guitar_clean").gain(0.43).pan(0.6)

// bass · acoustic bass · "Bass"
const bass = note(`<
  ~ A B A C D E F C G E H I J K J K L M N C D E F C G E H C G E H I J K J K L M N C D E F C G E O@2 H
>`.pickRestart({
  A: "a1@3 c#2@3 e2@2 a1@3 c#2@3 e2@2", B: "a1@3 c#2@3 e2@2 a1@3 c#2@3 e2 ~", C: "a1@3 c#2@3 e2@2 d2@3 f#2@3 a2 ~",
  D: "a1@3 c#2@3 e2 ~ e2@3 g#2@3 b2 ~", E: "a1@3 c#2@3 e2 ~ d2@3 f#2@3 a2 ~", F: "a1@3 d2@2 ~ f#2@2 a1@2 ~@6",
  G: "a1@3 c#2@2 ~ e2 ~ e2@3 g#2@3 b2 ~", H: "a1@3 d2@2 ~ f#2@2 a1@4 ~@4", I: "a1 ~@3 c#2 ~@3", J: "d2@2 ~@6 e2!8",
  K: "a1 ~@7 c#2@2 ~@6", L: "d2 ~@7 e2!8", M: "d2 ~@3 d2 ~@3 a1@2 ~@2 a1@2 ~@2", N: "d2@2 ~@2 d2 ~@3 a1 e2!7",
  O: "a1@3 d2@2 ~ f#2@2 a1@3 c#2@2 ~ e2@2",
})).s("gm_acoustic_bass").gain(0.56).pan(0.4)

// chords · electric guitar muted · "Rhythm-G"
const electric_guitar_muted = note(`<
  A B C B D E D F G E D H I J K J K L M N D E D F G E D H G E D H I J K J K L M N D E D F G E D O@2 P
>`.pickRestart({
  A: "~@15 c#3, ~@13 a3@2 ~, ~@7 e3", B: "~@3 c#3@3 ~ g#2 a2@3 e3@3 ~ g#2, a2@3 a3 ~@3 a3",
  C: "a2@3 e3@3 ~ g#2 a2@3 e3@2 ~@2 c#3, ~@6 a3@2 ~@5 a3@2 ~, ~@7 e3",
  D: "[a2,e3,a3] ~ [a2,e3,a3]!6 [d3,a3,d4] ~ [d3,a3,d4]!6", E: "[a2,e3,a3] ~ [a2,e3,a3]!6 [e2,b2,e3] ~ [e2,b2,e3]!6",
  F: "[a2,e3,a3] ~ [a2,e3,a3]!2 [e2,b2,e3]!4 [a2,e3,a3] ~ [e2,b2,e3]!6", // A5 E5 A5 E5
  G: "[a2,e3,a3]@2 [a2,e3,a3]!6 [d3,a3,d4] ~ [d3,a3,d4]!6", // A5 D5
  H: "[a2,e3,a3] ~ [a2,e3,a3]!2 [e2,b2,e3]!4 [a2,e3,a3] [e2,b2,e3]!7", I: "[a2,e3] ~@3 [c#3,g#3] ~@3",
  J: "[d3,a3]@2 ~@6 [e3,b3]!8", K: "[a2,e3] ~@7 [c#3,g#3]@2 ~@6", L: "[d3,a3] ~@7 [e3,b3]!8",
  M: "[d3,a3] ~@3 [d3,a3]@2 ~@2 [a2,e3] ~@3 [a2,e3]@2 ~@2", N: "[d3,a3]@2 ~@2 [d3,a3]@2 ~@2 [a2,e3] [e3,b3]!7",
  O: "[a2,e3,a3] ~ [a2,e3,a3]!2 [e2,b2,e3]!4 [a2,e3,a3] ~ [a2,e3,a3]!6", // A5 E5 A5
  P: "[a2,e3,a3] ~ [a2,e3,a3]!2 [e2,b2,e3]!4 [a2,e3,a3] ~@7", // A5 E5 A5
})).s("gm_electric_guitar_muted").gain(0.27)

// chords · drawbar organ · "Orgel"
const drawbar_organ = note("<~@12 A B C B C B D E ~@8 F G F H A B C B C B D E ~@10>".pickRestart({
  A: "[c#5,e5,a5]@7 ~ [c#5,e5,g#5]@7 ~", B: "[a4,d5,f#5]@8 [b4,e5,g#5]@7 ~", C: "[c#5,e5,a5]@8 [c#5,e5,g#5]@7 ~",
  D: "[a4,d5] ~@3 [a4,d5,f#5]@2 ~@2 [c#5,e5,a5]@2 ~@2 [c#5,e5] ~@3, f#5 ~@5 a5 ~", // D5 D A C#m
  E: "[d5,f#5,a5] ~@3 [d5,f#5,a5] ~@3 [c#5,a5]@2 ~@6, ~@8 e5 ~@7", F: "e5@5 e5!2 f#5 a5@2 a5@2 g#5 a5@2 ~",
  G: "a5@2 a5@2 a5 a5@2 ~ g#5 ~ g#5 a5 g#5 e5@2 ~", H: "[c#5,e5] ~ [c#5,e5]!2 [d5,f#5] [d5,f#5]@2 ~ [e5,a5]@2 ~@6",
})).s("gm_drawbar_organ").gain(0.27)

// drums · kick
const kick = s("bd").struct("<~ [x!2]!17 [x!4]!2 [x!2]!18 [x!4]!2 [x!2]!10>").gain(0.45)

// drums · clap
const clap = s("cp").struct("<~ [~ x ~ x ~ x ~ x]!11 ~@8 [~ x ~ x ~ x ~ x]!12 ~@8 [~ x ~ x ~ x ~ x]!9 [~ x ~ x!2 ~@3]>")
  .gain(0.39)

// drums · snare
const snare = s("sd").struct("<~ A@10 B C D C D C D E F A@7 B A@3 B C D C D C D E F A@9 G>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@4 x!7", C: "x!2", D: "x ~@7 x!8", E: "x!4", F: "x ~@3 x ~@3 x!8", G: "~ x!2 ~",
})).gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<~ [x!16]!11 ~@8 [x!16]!12 ~@8 [x!16]!9 [x!9 ~@7]>").gain(0.39)

stack(piano, electric_guitar_clean, bass, electric_guitar_muted, drawbar_organ, kick, clap, snare, hihat)

More by Drafi Deutscher