Strudelify

Tom-Tom Foolery

Alan Abel

KeyF majorTempo140 bpm
0:00/0:00
// Tom-Tom Foolery — Alan Abel
// 140 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5961504; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 87 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(140/4)

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

// other · timpani · "Tímpano"
const timpani = note(`<
  A B C ~@2 D@2 E ~ F G H G H@3 I ~@2 J@2 K L M N ~ O@2 P ~ Q@2 R@2 S@4 ~ T U ~@22 V@2 F R@2 W@2 X@2 Y D@6 Z@3 AA@2 U AB
  B
>`.pickRestart({
  A: "~@13 f2!11", B: "c3 ~@3", C: "~@3 c3!11 ~@10", D: "f2@2 f2@2 c3!2 c3@2",
  E: "f2 ~ f2!2 ~ f2 f2@3 f2@3 c3 ~ c3!2 ~ c3 c3@6", F: "~ [f2,c3] ~ [f2,c3]", G: "[f2,c3] ~ [f2,c3] ~",
  H: "[f2,c3]@2 ~ [f2,c3] ~@2 [f2,c3]@2", I: "~@3 f2", J: "~ f2 ~@6", K: "~ f2 ~ c3", L: "~ f2@2 f2 c3@2 c3@2",
  M: "~@3 f2!3 ~@3 c3!3", N: "~@3 f2!6 f2@3", O: "~@5 c3 f2 c3", P: "~ c3 f2 c3 ~ c3 f2 c3", Q: "~@6 f2!3 c3!3",
  R: "~@2 [f2,c3] ~", S: "~ f2 c3@2 c3 f2 ~@2", T: "~@7 c3 f2 c3 f2 c3", U: "f2 ~@3",
  V: "[f2,c3] ~@2 [f2,c3] ~@2 [f2,c3]@2", W: "f2!4", X: "~@3 f2 c3@2 ~@2", Y: "~@5 c3!3", Z: "f2 ~ c3!2",
  AA: "f2 c3 f2 c3 f2 c3 f2 c3 f2 c3 f2 c3", AB: "~@18 f2!6",
})).s("gm_timpani").gain(0.45)

// other · timpani · "Tímpano" · soft notes
const timpani_soft = note("<A ~ B C@2 ~@3 D ~@16 E ~@12 F G ~ H I J K L M ~@40>".pickRestart({
  A: "f2!13 ~@11", B: "~@14 c3!10", C: "f2@2 f2@2 c3!2 c3@2", D: "f2 ~ f2!2 ~ f2 f2@3 f2@3 c3 ~ c3!2 ~ c3 c3@6",
  E: "~@3 c3!6 d3@3", F: "f2 c3 f2 c3 f2 c3 f2 c3", G: "f2 c3 f2 c3 f2 c3 f2 ~@5", H: "~@3 c3", I: "~@9 c3!3",
  J: "~ [f2,c3] ~ [f2,c3]", K: "~@3 [f2,c3]", L: "f2!3 c3!3", M: "f2@6 ~@6 c3!3 c3@3 ~@6",
})).s("gm_timpani").gain(0.2)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@3 A@2 ~@3 A ~@16 A@6 ~@7 A B ~ C D ~@4 A@14 B ~@25>".pickRestart({
  A: "x!8", B: "x", C: "~ x", D: "~@6 x!3 ~@3",
})).gain(0.2)

// drums · snare
const snare = s("sd").struct(`<
  ~ A B ~ C@3 D ~ E F G F G@3 H I@8 ~ J@2 I@2 K@2 L M N I N I O P B Q R S T U V W X W X W Y Z AA AB AA W AA W AA AC I@2
  AD AE AF@2 AG O AH@2 AI I@3 AJ I@2 AK@3 AL@2 AM B ~
>`.pickRestart({
  A: "~@6 x ~ x!2 ~ x!2 ~@2 x ~@5 x ~@2", B: "x", C: "x ~@5 x ~ x!2 ~ x!2 ~@2 x ~@5 x ~@2",
  D: "x ~ x!2 ~ x!2 ~@2 x ~@2 x ~ x!2 ~ x!2 ~@5", E: "x!3 ~ x!5 ~@3", F: "~@2 x!2 ~@2 x!2", G: "~ x!2 ~ x!2 ~ x",
  H: "x!4 ~@4", I: "x!8", J: "x!4 ~@2 x ~@17", K: "x ~ x!3 ~ x ~ x!3 ~ x ~@2 x ~@2 x ~@2 x ~@2",
  L: "x ~ x!2 ~ x!2 ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2", M: "x ~ x!2 ~ x!2 ~@2 x ~@2 x ~ x!2 ~ x!2 ~@2 x ~@2",
  N: "x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x", O: "~ x ~ x ~ x ~ x", P: "~ x!7", Q: "x!2 ~@2", R: "x!6 ~@6",
  S: "x!3 ~@3 x!3 ~@3", T: "x!9 ~@3", U: "x!6", V: "x ~@11 x!2 ~@10", W: "x ~@5 x ~@2 x ~ x!2 ~@5 x ~@4 x",
  X: "x ~@5 x ~@4 x!2 ~@2 x ~@2 x ~@2 x ~@2", Y: "x ~@2 x ~@2 x ~@4 x!2 ~@2 x ~@2 x ~@2 x ~@2",
  Z: "x ~ x ~@2 x!2 ~@2 x ~ x!2 ~ x!2 ~@2 x ~@2 x ~ x", AA: "x ~@5 x ~@2 x ~ x!2 ~@2 x ~@2 x ~@2 x ~@2",
  AB: "x ~ x ~@2 x!2 ~@2 x ~ x!2 ~@5 x ~@4 x", AC: "x ~ x ~ x!3 ~ x!2 ~@2 x ~ x ~ x!3 ~ x!2 ~@2",
  AD: "x!4 ~@2 x ~@2 x!4 ~@2 x ~@2 x!4 ~@2", AE: "x ~@2 x!2 ~ x ~ x!2 ~@2 x ~@2 x!2 ~ x ~ x!2 ~@2",
  AF: "x ~ x ~@2 x!2 ~@2 x ~@14", AG: "x!2 ~ x ~ x ~ x", AH: "~@5 x!3", AI: "x!3 ~@5",
  AJ: "x ~@2 x ~@2 x ~@2 x ~@2 x ~ x!2 ~ x!2 ~@2 x ~@2", AK: "x ~ x!2 ~ x!2 ~@2 x ~@5 x ~@5 x ~@2",
  AL: "x ~ x!5 ~ x!5 ~ x!5 ~ x!4", AM: "x ~ x ~ x ~ x ~@4 x!2 ~ x ~ x ~ x ~@4 x",
})).gain(0.3)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@3 A ~@4 B ~@16 C D@2 ~@10 E F ~@47>".pickRestart({
  A: "~@6 x ~ x!2 ~ x!2 ~@2 x ~@5 x ~@2", B: "x ~ x!2 ~ x!2 ~@2 x ~@2 x ~ x!2 ~ x!2 ~@5", C: "x!8", D: "~@3 x!5",
  E: "x!4", F: "x",
})).gain(0.15)

stack(timpani, timpani_soft, kick, kick_soft, snare, snare_soft)