Strudelify

Deuce

Kiss

KeyA minorTempo123 bpm
0:00/0:00
// Deuce — Kiss
// 123 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 2 distortion guitar (copy of ch 1 distortion guitar)
// note: Full arrangement: all 107 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 30.
setcpm(123/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.

// chords · distortion guitar
const distortion_guitar = note(`<
  A@2 B C D E@8 F G E@2 F G E@2 F H I J K J K L M E@8 N G E@2 N G E@2 N H I J K J K L M E@16 J K J K L O C P C D E@24 Q
  ~
>`.pickRestart({
  A: "[~@7 [e4,a4]@2 [e4,a4] [f#4,a4] [e4,a4] [f#4,a4] [e4,a4]@2 [g3,c4]]/2", // A5 F#m A5 F#m A5 C5
  B: "[a3,c4]@2 [c4,f4]@4 [a3,d4]@2 [b3,d4]@2 [d4,g4]@2 ~ d4 [b3,g4]@2, ~@6 [e4,g4] ~", // Am F5 D5 Bm G5 Em
  C: "[e4,a4]!2 [f#4,a4] [e4,a4] [f#4,a4] [e4,a4]@2 [g3,c4]", D: "[a3,c4] [f3,c4,f4]@6 [d3,g3]",
  E: "[[a2,e3,a3]@2 [a2,e3,a3]@2 [a2,e3,a3]@2 [g3,c4]!2 [g3,c4]@2 [a3,d4]@2 [g3,c4]!2 [g3,c4]@6 [g3,c4]@4 [a3,d4]@2 [g3,c4]@2 [e3,a3]@2 [d3,g3]@2]/2", // A5 C5 D5 C5 D5 C5 A5 G5
  F: "[a2,e3,a3] [a2,e3,a3]@7", G: "[c3,g3,c4]@3 [d3,a3,d4]@3 [c3,g3,c4] [g2,d3,g3]",
  H: "[c3,g3,c4]@3 [d3,a3,d4]@3 [c3,g3,c4]@2", I: "[a2,e3,a3] ~@3", J: "[c3,g3,c4]@6 c3 c#3", K: "d3 g2 g#2 a2@3 e2@2",
  L: "[f2,c3,f3]", M: "[g2,d3,g3]!3 ~@4 [g2,d3,g3]", N: "[a2,e3,a3] ~ [e4,a4]@6, ~ [a2,e3,a3]@7",
  O: "[g2,d3,g3]!2 [g2,d3,g3]@6", P: "[a3,c4]@2 [c4,f4]@4 [d4,g4]@2 [e4,g4]@2 [d4,g4]@2 ~ b3 [d4,g4]@2, ~@6 [a3,g4] ~",
  Q: "[a2,e3,a3]!3 ~@2 [a3,e4,a4]!3", // A5
})).s("gm_distortion_guitar").gain(0.4).pan(0)

// bass · electric bass pick
const bass = note(`<
  ~@4 A B@8 C D B@2 C D B@2 C D E F G F G H I B@8 C D B@2 C D B@2 C D E F G F G H I B@16 F G F G H J ~@3 K B@10 L@2 M@2
  L@2 B@8 N ~
>`.pickRestart({
  A: "f1 f2@6 g1", B: "[a1!3 c2!2 d2 c2 c3@3 c2@2 d2 c2 a1 g1]/2", C: "a1 [a1,a2]@7", D: "c2@3 d2@3 c2 g1", E: "a1 ~@7",
  F: "c2@12 ~@2 c2 c#2", G: "d2 g1 g#1 a1@3 e1@2", H: "~ f2@3, f1", I: "g1!3 ~@4 g1", J: "g1!3 ~@5",
  K: "~ f2@6 g1, f1@7 ~", L: "[a1!3 c2!2 d2 c2 c3@3 c2@2 a2 g2 e2 d2]/2", M: "[a1!3 c2!2 d2 c2 c3@3 c2@2 a2@2 g2@2]/2",
  N: "a1!3 ~@2 a1!3",
})).s("gm_electric_bass_pick").gain(0.72)

// chords · lead 2 sawtooth
const lead_2_sawtooth = note(`<
  ~@13 A B@2 ~ A B@2 C D E ~ F G F C H I ~@8 A J@2 C K L@3 D E ~ F G F C H I ~@16 F G F C H ~@7 M@2 ~@22
>`.pickRestart({
  A: "a4 a4@3 ~ e4 g4 e4", B: "[g4@4 e4@2 g4@4 e4@2 d4 c4 a3@4 ~@14]/2", C: "~@7 e4", D: "a4 a4@3 ~@2 g4 e4",
  E: "g4@2 e4 g4@2 e4 a4 ~", F: "[d4,g4] [c4,e4] [d4,g4] [c4,e4] [d4,g4] [c4,e4] [e4,a4] ~", G: "~@6 e4 ~",
  H: "f4 e4 f4 e4 f4 e4 g4 ~", I: "~@3 [e4,a4] [d4,g4] [c4,e4] [a3,a4] ~", J: "[g4@4 e4@2 g4@4 e4@2 d4 c4 a3@5 ~@13]/2",
  K: "a4 a4@3 ~@2 g4 ~", L: "[e4@2 g4 e4@2 d4 c4 [a4,c5]@11 ~@6]/3", M: "a5/2",
})).s("gm_lead_2_sawtooth").gain(0.51)

// drums · kick
const kick = s("bd").struct(`<
  ~@5 A B A B A B A B C D A@2 C D A@2 C D E A ~ A F G H I A@7 C D ~@2 C D C ~ C D E A E A J G H I A I A I A I A@3 I A I
  A I A@2 K E F G H ~@2 C@2 I A ~@2 I A I A I A I A I A I A I A I A I A ~@2 L ~
>`.pickRestart({
  A: "x!4", B: "x!2 ~@2", C: "x", D: "x!8", E: "x ~ x ~ x!3 ~", F: "x!2", G: "x ~ x ~ x!4", H: "x!3 ~@5",
  I: "x!3 ~ x ~ x ~", J: "~@3 x ~@3 x ~@3 x ~@4", K: "~@2 x!2", L: "x!3 ~@2 x!3",
})).gain(0.66)

// drums · snare
const snare = s("sd").struct(`<
  ~@5 A B A B A B A C ~ A@3 ~ A@3 ~ A D E F A ~ G H I A@7 J A K@2 L A K@2 J A D A ~ A ~ M H I A I A I A I A@3 I A I A I
  A@2 ~ D ~ M N ~@4 I A O@2 I A I A I A I A I A I A I A I A I A O@2 P ~
>`.pickRestart({
  A: "x!4", B: "x!3 ~", C: "x!2 ~@2", D: "x ~ x ~ x!3 ~", E: "x ~@3 x ~@3 x ~@3 x ~@2 x", F: "x",
  G: "x ~@3 x ~@3 x ~@3 x!3 ~", H: "x!3 ~@5", I: "x!3 ~ x ~ x ~", J: "~@8 x!4 ~@4",
  K: "x ~ x ~ x!2 ~ x ~ x ~ x!2 ~ x ~", L: "~@4 x!2 ~ x ~@8", M: "x ~@3 x ~@3 x ~@3 x ~ x!2", N: "x!3 ~ x ~@3",
  O: "x!16", P: "x!3 ~@2 x!3",
})).gain(0.66)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@4 A ~ B ~ B ~ B ~ C ~@12 A ~ D E F ~@8 G ~@3 H ~@3 G ~@3 I ~ J E K ~@17 I ~ I E ~ L ~@2 M ~@26
>`.pickRestart({
  A: "~@4 x!4", B: "~@14 x!2", C: "~@11 x ~@2 x!2", D: "~@9 x!2 ~ x!2 ~ x", E: "~@5 x ~@2", F: "~@7 x ~@4 x!4",
  G: "~@3 x", H: "~@9 x ~ x!2 ~@3", I: "~@12 x!2 ~ x", J: "~@8 x!3 ~ x!3 ~", K: "~@12 x!4", L: "x",
  M: "~@8 x ~@2 x ~ x ~@2",
})).gain(0.66)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@4 A ~ B ~ B ~ B ~ C ~@12 D ~ E ~ F ~@12 G ~@7 E ~ H ~ I ~@17 E ~ E ~@5 J ~@26
>`.pickRestart({
  A: "~@2 x!2 ~ x!2 ~ x ~ x ~@5", B: "~@8 x!6 ~@2", C: "~@8 x!3 ~ x!2 ~@2", D: "x!6 ~@2", E: "~@4 x ~ x!2 ~ x!2 ~@5",
  F: "~@7 x!7 ~@2", G: "~@8 x!2 ~@6", H: "x!3 ~ x!3 ~ x!3 ~@5", I: "~@6 x!6 ~@4", J: "~@3 x ~ x ~@2 x ~@2 x ~@4",
})).gain(0.66)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@5 A B C B C B A B ~ C@3 ~ C@3 ~ C@2 A ~ C ~ A ~ D C@3 A C@2 E ~ C ~@3 C ~@3 C@3 ~ A ~ F ~ A C@15 A ~ A ~ A G ~@4 A C
  ~@2 A C@17 ~@4
>`.pickRestart({
  A: "~ x!7", B: "x!4 ~@4", C: "x!8", D: "~ x ~ x!5", E: "x!7 ~", F: "~ x!6 ~", G: "~@3 x",
})).gain(0.66)

// drums · high tom
const high_tom = s("ht").struct("<~@4 A ~ B ~ B ~ B ~ C ~@12 D ~ E ~ F ~@20 G ~ H ~@19 G ~ G ~@32>".pickRestart({
  A: "~@2 x!2 ~@12", B: "~@8 x!4 ~@4", C: "~@8 x!3 ~@5", D: "x!2 ~@6", E: "x!2 ~ x!2 ~@11", F: "~@8 x!2 ~@6",
  G: "x!2 ~ x!2 ~ x!2 ~@8", H: "x!3 ~@13",
})).gain(0.66)

// drums · crash
const crash = s("cr").struct(`<
  ~@5 A ~@5 A ~ A ~@3 A ~@3 A ~@2 A ~ A ~ A B C ~@3 A ~@3 A ~@3 A ~@3 A ~@2 A ~ A ~ D B A ~@15 A ~ A ~ A B ~@3 A@2 ~@3 A
  ~@19 E ~
>`.pickRestart({
  A: "x", B: "x!3 ~@5", C: "x!2 ~@2", D: "x ~@6 x", E: "x!3 ~@2 x!3",
})).gain(0.66)

// drums · cowbell
const cowbell = s("cb").struct("<~@78 [~@8 x!2 ~ x!3 ~ x] ~@28>").gain(0.59)

// drums · bongos
const bongos = s("bongo:4").struct("<~@40 [x!4]!2 ~@2 [x!4]!2 ~@61>").gain(1.55)

stack(
  distortion_guitar, bass, lead_2_sawtooth, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash, cowbell,
  bongos
)

More by Kiss