Strudelify

Yakety Yak

Coasters

KeyA minorTempo195 bpm
0:00/0:00
// Yakety Yak — Coasters
// 195 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 71 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(195/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.

// other · tenor sax · "Sax"
const tenor_sax = note(`<
  ~@4 A B C ~ A D E ~ A D F ~ G D H I J B C ~ A D E ~ A D F ~ G D H I J B C ~ A D E ~ A D F ~ G D H I J B C ~ A D E ~ A
  D F ~ G D H I K H L
>`.pickRestart({
  A: "~@4 c4@3 ~ c4@3 ~ c4@3 ~", B: "c4@3 ~ c4@3 ~ c4@3 ~ g3@3 ~", C: "c4 ~", D: "c4@3 ~ c4@3 ~ c4@3 ~ c4@3 ~",
  E: "a3 ~", F: "b3 ~", G: "~@4 c4@3 ~ c4@3 ~ c4@2 c4@2", H: "c4@4 ~@4 c4@2 c4@2 c4@3 ~", I: "c4@4 ~@4 b3@3 ~ b3@3 ~",
  J: "b3@3 ~ c4@3 ~ c4@3 ~ c4@3 ~", K: "b3@4 ~@4 c4@2 c4@2 c4@3 ~", L: "c4 ~@3",
})).s("gm_tenor_sax").gain(0.44).pan(0.4)

// chords · baritone sax · "Sax"
const baritone_sax = note(`<
  ~@2 A B C D A B E F G H I J K L M N O P C Q A B E F G H I J K L M N O P C Q A B E F G H I J K L M N O P C Q A B E F G
  H I J K L M N O P R S T
>`.pickRestart({
  A: "~@2 [c4,e4,g4]!2 ~@2 [c4,e4,g4]!2", B: "~@2 [c4,e4,g4]!2 ~@2 [c4,e4,g4]@2", C: "~@4 c5@3 ~ c5@3 ~ c5@3 ~",
  D: "c5@3 ~ c5@3 ~ c5@3 ~ c5@3 ~", E: "~@4 [e4,g4,c5]@3 ~ [e4,g4,c5]@3 ~ [e4,g4,c5]@3 ~",
  F: "[e4,g4,c5]@3 ~ [e4,g4,c5]@3 ~ [e4,g4,c5]@3 ~ [e4,g4,c5]@4", G: "~@2 [a3,c4,f4]!2 ~@2 [a3,c4,f4]!2",
  H: "~@2 [a3,c4,f4]!2 ~@2 [a3,c4,f4]@2", I: "~@4 [f4,a4,c5]@3 ~ [f4,a4,c5]@3 ~ [f4,a4,c5]@3 ~",
  J: "[f4,a4,c5]@3 ~ [f4,a4,c5]@3 ~ [f4,a4,c5]@3 ~ [f4,a4,c5]@4", K: "~@2 [d4,f4]!2 ~@2 [d4,f4]!2",
  L: "~@2 [d4,f4]!2 ~@2 [d4,f4]@2", M: "~@4 [g4,c5]@3 ~ [g4,c5]@3 ~ [g4,c5]@3 ~",
  N: "[g4,c5]@3 ~ [g4,c5]@3 ~ [f4,c5]@3 ~ [e4,c5]@3 ~", // C5 F5 C
  O: "c4@3 ~ [e4,g4]@3 ~ [e4,g4,c5]@2 [e4,g4,c5]@2 [e4,g4,c5]@3 ~", P: "[e4,g4,c5] ~@3",
  Q: "c5@3 ~ c5@3 ~ c5@3 ~ g4@3 ~", R: "~@8 [e4,g4,c5]@2 [e4,g4,c5]@2 [e4,g4,c5]@3 ~",
  S: "[e4,g4,c5]@4 ~@4 [e4,g4,c5]@2 [e4,g4,c5]@2 [e4,g4,c5]@3 ~", T: "[e4,g4,c5] ~ [c5,e5,g5,c6] ~",
})).s("gm_baritone_sax").gain(0.72).pan(0.3)

// chords · piano
const piano = note(`<
  ~@2 A B A B C D E F G H I J K L M N O ~@3 E F A B P@2 I J Q R M N O ~@3 B@2 S T U V U V M N W X O ~@3 Y Z A B P@2 AA P
  W X M N O ~ AB AC O
>`.pickRestart({
  A: "~@4 [g3,c4,e4] ~@7 [g3,c4,e4] ~@3", B: "~@4 [g3,c4,e4] ~@6 c3 [g3,c4,e4] ~@3",
  C: "[g3,c4,e4] ~@3 [g3,c4,e4] ~@6 c3 [g3,c4,e4]@2 ~@2", D: "~@3 c3 [g3,c4,e4]@2 ~@5 c3 [g3,c4,e4] ~@3",
  E: "~@4 [g3,c4,e4] ~@7 c4 e4 ~ g4", F: "~@4 [g3,c4,e4] ~@3 [g3,c4,e4]@2 ~@2 [g3,c4,e4] ~@3",
  G: "[a3,c4,f4] ~@3 [a3,c4,f4] ~@6 f3 [a3,c4,f4]@2 ~@2", H: "~@3 f3 [a3,c4,f4]@2 ~@5 f3 [a3,c4,f4] ~@3",
  I: "f4@11 ~ a4 c5 ~ f5, [a3,c4]@13 ~@3, ~@11 f4@2 ~@3", J: "~@4 [a3,c4,f4] ~@3 [a3,c4,f4]@2 ~ [f3,g3] [a3,c4,f4] ~@3",
  K: "~@4 [b3,d4,f4,g4] ~@7 [b3,d4,f4,g4] ~@3", L: "~@4 [b3,d4,f4,g4] ~@6 g2 [b3,d4,f4,g4] ~@3",
  M: "[b3,d4,f4,g4] ~@3 [b3,d4,f4,g4] ~@6 g2 [b3,d4,f4,g4]@2 ~@2", N: "~@3 g2 [b3,d4,f4,g4]@2 ~@5 g2 [b3,d4,f4,g4] ~@3",
  O: "[g3,c4,e4]@3 ~@13", P: "~@4 [a3,c4,f4] ~@6 f3 [a3,c4,f4] ~@3", Q: "~@2 [b3,d4,f4,g4] ~@3 [b3,d4,f4,g4] ~",
  R: "[b3,d4,f4,g4]@2 ~@2 [b3,d4,f4,g4]@2 ~@5 g2 [b3,d4,f4,g4] ~@3", // G7
  S: "c4@11 ~ e4 g4 ~ c5, [g3,e4]@13 ~@3, ~@11 c4@2 ~@3", T: "~@4 [g3,c4,e4] ~@3 [g3,c4,e4]@2 ~ [c3,d3] [g3,c4,e4] ~@3",
  U: "~@4 [a3,c4,f4] ~@7 f4 a4 ~ c5", V: "~@4 [a3,c4,f4] ~@3 [a3,c4,f4]@2 ~@2 [a3,c4,f4] ~@3",
  W: "~@11 f3 b3 d4 ~ g4, [b3,d4,f4,g4]@13 ~@3", X: "~@4 [b3,d4,f4,g4] ~@3 [b3,d4,f4,g4]@2 ~ [g2,a2] [b3,d4,f4,g4] ~@3",
  Y: "~@2 [g3,c4,e4] ~@3 [g3,c4,e4] ~", Z: "[g3,c4,e4]@2 ~@2 [g3,c4,e4]@2 ~@5 c3 [g3,c4,e4] ~@3",
  AA: "~@4 [a3,c4,f4] ~@7 [a3,c4,f4] ~@3", AB: "~@6 [g3,c4,e4] ~",
  AC: "[g3,c4,e4]@2 ~ [g3,c4,e4] ~@3 [g3,c4,e4] ~@3 c3 [g3,c4,e4] ~@3", // C
})).s("gm_piano").gain(0.41).pan(0.9)

// bass · fretless bass · "Bass"
const bass = note(`<
  ~@2 A B C D C D C D E F G H I J K L M ~@3 A N A B G O E F I P I P M ~@3 A B Q R G S T U K L I J M ~@3 A B A V G H G W
  I P I J M ~ X V Y
>`.pickRestart({
  A: "c2@5 ~@2 c2 g2@5 ~@2 g2", B: "c2@5 ~@2 c2 g2@3 ~ g1 ~@3", C: "c2@6 ~ c2 g2@5 ~@2 g2",
  D: "c2@6 ~ c2 g2@2 ~ c1 g1 ~@3", E: "f2@6 ~ f2 c3@5 ~@2 c3", F: "f2@6 ~ f2 c3@2 ~ f1 c2 ~@3",
  G: "f2@5 ~@2 f2 c3@5 ~@2 c3", H: "f2@5 ~@2 f2 c3@3 ~ c2 ~@3", I: "g2@5 ~@2 g2 d3@5 ~@2 d3",
  J: "g2@5 ~@2 g2 d3@3 ~ d2 ~@3", K: "g2@6 ~ g2 d3@5 ~@2 d3", L: "g2@6 ~ g2 d3@2 ~ g1 d2 ~@3", M: "c2 ~@3",
  N: "c2@4 ~@3 c2 g1@4 a1@2 ~@2", O: "f2@5 ~@2 f2 c3@3 ~ c3 ~@3", P: "g2@4 ~@3 g2 d2@4 e2@2 ~@2", Q: "c2 g2",
  R: "c2@5 ~@2 c2 g2@4 c2 ~@3", S: "f2@5 ~@2 f2 c3@4 c2@2 ~@2", T: "f2 c2", U: "f2@5 ~@2 f2 c2@4 f2 ~@3",
  V: "c2@5 ~@2 c2 g2@4 g1@2 ~@2", W: "f2@4 ~@3 f2 c2@4 d2@2 ~@2", X: "~@8 c2@7 c1", Y: "c2 ~ [c2,c3] ~",
})).s("gm_fretless_bass").gain(0.36).pan(0)

// bass · slap bass 2 · "Bass"
const bass_2 = note("<~@19 A B ~@14 A B ~@14 A B ~@14 A B ~@2>".pickRestart({
  A: "~@8 b2@3 ~ b2@3 ~", B: "b2@3 ~@13",
})).s("gm_slap_bass_2").gain(0.51).pan(0.1)

// drums · kick
const kick = s("bd").struct(`<
  ~@2 A@3 B A@5 C A D A@3 C D ~@3 A C A@3 C A E A@4 D ~@3 A@12 D ~@3 A@7 B A@3 C D ~ F D@2
>`.pickRestart({
  A: "x ~@6 x!2 ~@7", B: "x ~@6 x ~@8", C: "x ~@6 x!2 ~@6 x", D: "x", E: "x ~@14 x", F: "~ x",
})).gain(0.56)

// drums · rim
const rim = s("rim").struct("<A B C@3 ~ C@7 ~ C@4 ~@4 C@7 ~ C@4 ~@4 C@7 ~ C@4 ~@4 C@7 ~ C@4 ~@2 D ~@2>".pickRestart({
  A: "x!2", B: "x!4", C: "~ x ~ x", D: "~@3 x",
})).gain(0.64)

// drums · snare
const snare = s("sd").struct("<~@5 [~@3 x ~@5 x ~ x ~@4] ~@23 [~@3 x ~@12] ~@31 [~@3 x ~@5 x ~ x ~@4] ~@9>").gain(0.32)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@5 [~ x ~@11 x ~ x] ~@55 [~ x ~@11 x ~ x] ~@9>").gain(0.08)

// drums · clap
const clap = s("cp").struct("<~@2 A@11 ~ A@4 ~@4 A@7 ~ A@4 ~@4 A@7 ~ A@4 ~@4 A@12 ~@2 A ~@2>".pickRestart({
  A: "~@3 x",
})).gain(0.4)

// drums · low tom
const low_tom = s("lt").struct("<~@5 A ~@23 A ~@15 B ~@15 A ~@9>".pickRestart({
  A: "~@3 x", B: "~@12 x!2 ~ x",
})).gain(0.64)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@2 A@3 ~ A@3 B A C B D A@2 C E ~@4 A E A@2 B C@2 ~ A@3 C ~@4 A C B A C@2 A ~ A F C A ~@4 A F A C A@3 ~ A@2 C E ~@2 G
  D ~
>`.pickRestart({
  A: "~@7 x ~@7 x", B: "~@7 x ~@3 x ~@4", C: "~@7 x ~@8", D: "~ x ~ x ~@3 x ~ x ~@6", E: "~@3 x ~@3 x ~@8",
  F: "~@7 x ~@3 x ~@3 x", G: "~@15 x",
})).gain(0.32)

// drums · mid tom
const mid_tom = s("mt").struct("<~@5 A ~@23 B ~@15 C ~@15 A ~@9>".pickRestart({
  A: "~ x ~@2", B: "~ x", C: "~@4 x ~@2 x!3 ~ x ~@4",
})).gain(0.56)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@9 A ~@2 A@2 ~@10 B ~ A ~ C D ~@2 B ~@6 C A ~@2 C ~@5 B ~@7 C ~@11 A ~
>`.pickRestart({
  A: "~@15 x", B: "~@11 x ~@4", C: "~@11 x ~@3 x", D: "x",
})).gain(0.48)

// drums · high tom
const high_tom = s("ht").struct("<~@29 [~ x ~@2] ~@15 [x!2 ~ x!3 ~@10] ~@25>").gain(0.48)

// drums · crash
const crash = s("cr").struct("<~@2 A ~@2 B A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@6 B A ~@7 A>".pickRestart({
  A: "x", B: "~@7 x ~@8",
})).gain(0.64)

// drums · tambourine
const tambourine = s("tb").struct("<~@2 A@11 ~ A@4 ~@4 A@7 ~ A@4 ~@4 A@7 ~ A@4 ~@4 A@12 ~@2 B ~@2>".pickRestart({
  A: "~ x ~ x", B: "~@3 x",
})).gain(0.64)

stack(
  tenor_sax, baritone_sax, piano, bass, bass_2, kick, rim, snare, snare_soft, clap, low_tom, hihat, hihat_soft, mid_tom,
  open_hat, high_tom, crash, tambourine
)

More by Coasters