Strudelify

When the Saints Go Marching In

Fats Domino

KeyC minorTempo215 bpm
0:00/0:00
// When the Saints Go Marching In — Fats Domino
// 215 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 6 "Strings (BB)" named as a string part, played on string ensemble 1 (its clarinet patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 100 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(215/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.

// bass · fretless bass · "Bass    (BB)"
const bass = note(`<
  ~@2 A@2 B@4 C D E F G H I J B@2 A@2 B@4 C K F E H@2 I J B@2 A@6 L D B E G@2 I J A@2 B@6 M D E@2 N@2 I J A@2 B@6 M D B
  O N G I J B@6 A@2 C P B E N H I J F B Q R
>`.pickRestart({
  A: "eb2@5 ~@3 bb2@5 ~@3", B: "eb2@5 ~@3 bb1@5 ~@3", C: "f2@5 ~@3 f2@4 ~@4", D: "bb1@6 ~@2 f2@5 ~@3",
  E: "eb2@6 ~@2 bb2@5 ~@3", F: "eb2@5 ~@3 eb2@4 ~@4", G: "ab2@6 ~@2 eb3@5 ~@3", H: "ab2@5 ~@3 eb2@5 ~@3",
  I: "bb1@5 ~@3 c2@5 ~@3", J: "f2@5 ~@3 bb1@5 ~@3", K: "bb1@5 ~@2 bb1 d2@4 ~@4", L: "f2@5 ~@3 c2@5 ~@3",
  M: "f2@6 ~@2 c3@5 ~@3", N: "ab2@5 ~@3 ab2@4 ~@4", O: "eb2@5 ~@2 eb2 g2@4 ~@4", P: "bb1@5 ~@3 bb1@4 ~@4",
  Q: "eb2@5 ~@3 bb2@4 ~@3 bb2", R: "eb3 ~@2 eb3 bb2@2 ~ eb2@5 ~@4",
})).s("gm_fretless_bass").gain(0.28)

// chords · piano · "Piano   (BB)"
const piano = note(`<
  ~@2 A B A B A B C D A E F G H I A B A B A B A B C D A E F G H I A B A B A B A B C D A E F G H I A B A B A B A B C D A
  E F G H I A B A B A B A B C D A E F G H I A B A B A B A B C D A E F G H I A@2 J K
>`.pickRestart({
  A: "eb2@4 [g3,bb3,c4,eb4] ~@3 bb2@4 [g3,bb3,c4,eb4] ~@3", // Cm7
  B: "eb2@4 [g3,bb3,c4,eb4] ~@7 [g3,bb3,c4,eb4]@2 ~@2, ~@4 bb2@3 ~", // Cm7
  C: "f2@4 [eb3,f3,ab3,c4] ~@3 c2@4 [eb3,f3,ab3,c4] ~@3", D: "bb1@4 [d3,f3,ab3,c4] ~@3 f2@4 [d3,f3,ab3,c4] ~@3",
  E: "eb2@4 [g3,bb3,db4,f4] ~@3 bb2@4 [g3,bb3,db4,f4] ~@3", F: "ab2@4 [f3,ab3,c4,eb4] ~@3 eb2@4 [f3,ab3,c4,eb4] ~@3",
  G: "ab2@4 [f3,ab3,b3,eb4] ~@3 eb2@4 [f3,ab3,b3,eb4] ~@3", H: "bb1@4 [g3,bb3,c4,eb4] ~@3 c2@4 [eb3,g3,bb3,c4] ~@3",
  I: "f2@4 [eb3,f3,ab3,c4] ~@3 bb1@4 [d3,f3,ab3,c4] ~@3", // Fm7 Dm7b5
  J: "eb2@4 [g3,bb3,c4,eb4] ~@7 [g3,bb3,c4,eb4] ~@3, ~@8 bb2@7 ~", // Cm7
  K: "[eb2,g4,bb4,eb5] ~@3 bb2@2 ~ [eb2,g5,bb5,eb6]@5 ~@4, ~@3 a2@2 ~@11", // Eb
})).s("gm_piano").gain(0.28)

// chords · banjo · "Guitar  (BB)"
const banjo = note(`<
  ~@2 A B A B A B C D E F G H I J E K E K L K L K C M N O P Q R S L K T U T U V W X M Y F Z AA AB AC T U A B A B AD AE X
  AF T AG AH AI AJ AK T U L K A B A B C AL E F P H AM AN N AO A B N AO E K AP AQ V AR AS AT AM S L@2 AU AV
>`.pickRestart({
  A: "[eb2,eb3,c4,g4]@4 [eb2,eb3,c4,g4] ~@3 [eb2,eb3,c4,g4]@4 [eb2,eb3,c4,g4]@2 ~ eb4", // Cm
  B: "[c4,g4]@4 [eb2,eb3,c4,g4]@2 ~@2 [eb2,eb3,c4,g4]@3 eb4 [eb2,eb3,c4,g4] ~@2 eb4", // C5 Cm
  C: "[f2,f3,eb4,ab4]@4 [f2,f3,eb4,ab4] ~@4 ab4@3 [f3,eb4,ab4] ~@3, ~@2 [f2,f3,eb4] ~", // Fm7 F7
  D: "[bb2,f3,d4,ab4]@4 [bb2,f3,d4,ab4] ~@4 ab4@3 [f3,d4,ab4] ~@3, ~@2 [bb2,f3,d4] ~", // Bb7 Ddim Bb
  E: "[eb2,eb3,c4,g4]@4 [eb3,c4,g4] ~@3 [eb3,c4,g4]@4 [eb2,eb3,c4,g4] ~@3", // Cm
  F: "[eb2,eb3,db4,g4]@4 [eb2,eb3,db4,g4] ~@3 [eb2,eb3,db4,g4]@4 [eb2,eb3,db4,g4]@2 ~ f4", // Eb7
  G: "[ab2,ab3,f4,c5]@4 [ab2,ab3,f4,c5] ~@4 c5@3 [ab3,f4,c5] ~@3, ~@2 [ab2,ab3,f4] ~", // Fm Db
  H: "[ab2,ab3,f4,b4]@4 [ab2,ab3,f4,b4] ~@4 b4@3 [ab3,f4,b4] ~@3, ~@2 [ab2,ab3,f4] ~", // Fdim Db
  I: "[bb1,eb3,c4,g4]@4 [bb1,eb3,c4,g4] ~@3 [c3,g3,eb4,bb4]@4 [g3,eb4,bb4] ~@2 [g3,eb4]", // Cm7 Eb Cm
  J: "[f2,f3,eb4,ab4]@4 [f2,f3,eb4,ab4] ~@2 [eb4,ab4] [bb2,f3,d4,ab4]@4 [f3,d4,ab4] ~@2 [f3,d4]", // Fm7 Ab5 Bb7 Ddim Dm
  K: "[eb2,eb3,c4,g4]@4 [eb2,eb3,c4,g4] ~@3 [eb2,eb3,c4,g4]@4 [eb2,eb3,c4,g4] ~@3", // Cm
  L: "[eb2,eb3,c4,g4]@4 [eb2,eb3,c4,g4] ~@4 g4@3 [eb3,c4,g4] ~@3, ~@2 [eb2,eb3,c4] ~", // Cm
  M: "[bb2,f3,d4,ab4]@4 [bb2,f3,d4,ab4] ~@2 [d4,ab4] [bb2,f3,d4,ab4]@4 [f3,d4,ab4] ~@2 ab4", // Bb7 Ddim Bb7 Ddim
  N: "[eb2,eb3,c4,g4]@4 [eb3,c4,g4] ~@2 [eb3,c4] [eb2,eb3,c4,g4]@4 [eb3,c4,g4] ~@2 [eb3,g4]", // Cm Eb
  O: "[eb2,eb3,db4,g4]@4 [eb2,eb3,db4,g4] ~@2 [db4,g4] [eb2,eb3,db4,g4]@4 [eb3,db4,g4] ~@2 g4", // Eb7 Dbdim Eb7
  P: "[ab2,ab3,f4,c5]@4 [ab2,ab3,f4,c5] ~@2 [f4,c5] [ab2,ab3,f4,c5]@4 [ab3,f4,c5] ~@2 c5", // Fm F5 Fm
  Q: "[ab2,ab3,f4,b4]@4 [ab3,f4,b4] ~@3 [ab3,f4,b4]@4 [ab2,ab3,f4,b4] ~@3", // Fdim
  R: "[bb1,eb3,c4,g4]@4 [eb3,c4,g4] ~@3 [c3,g3,eb4,bb4]@4 [c3,g3,eb4,bb4] ~@3", // Cm7 Cm Cm7
  S: "[f2,f3,eb4,ab4]@4 [f2,f3,eb4,ab4] ~@3 [bb2,f3,d4,ab4]@4 [bb2,f3,d4,ab4] ~@3", // Fm7 Bb7
  T: "[eb2,eb3,c4,g4]@4 [eb3,c4,g4] ~@2 [eb3,c4,g4] [eb2,eb3,c4,g4]@4 [eb3,c4,g4] ~@2 [eb3,c4,g4]", // Cm
  U: "[c4,g4]!2 ~ [eb3,c4,g4]!2 ~@2 [eb3,c4,g4] [eb2,eb3,c4,g4]@2 c4 g4 [eb3,c4,g4] ~@2 g4, [eb2,eb3] ~@7", // C5 Cm Eb
  V: "[eb2,eb3,c4,g4]@4 [eb2,eb3,c4,g4] ~@2 [c4,g4] [eb2,eb3,c4,g4]@4 [eb3,c4,g4] ~@2 g4", // Cm C5 Cm
  W: "[eb3,c4,g4]@4 [eb3,c4,g4] ~@2 [eb3,c4,g4] [eb2,eb3,c4,g4]@4 [eb2,eb3,c4,g4] ~@2 [c4,g4]", // Cm C5
  X: "[f2,f3,eb4,ab4]@2 ~ [eb4,ab4] [f2,f3,eb4,ab4]@2 eb4 ab4 [f3,eb4,ab4]@2 ~ [eb4,ab4] [f2,f3,eb4,ab4]@3 [f3,ab4]", // Fm7 Ab5 Fm7 Ab5 Fm7 Fm
  Y: "~ g4@2 [eb3,c4,g4] [eb3,g4] c4 eb3@2 [eb3,c4,g4]@2 [eb3,c4,g4] ~ [c4,g4] ~ [eb3,c4,g4] ~, [eb2,eb3,c4]@3 ~@3 g4 ~@5 eb3@2 ~@2", // Cm Eb Cm C5 Cm
  Z: "[ab2,ab3,f4,c5]@2 ~ [f4,c5] [ab2,ab3,f4,c5]@2 f4 c5 [ab3,f4,c5]@2 ~ [f4,c5] [ab2,ab3,f4,c5]@3 [ab3,c5]", // Fm F5 Fm F5 Fm Ab
  AA: "[ab3,f4,b4]@3 [ab3,f4,b4] [ab3,b4] f4 [ab3,f4,b4]@2 [ab3,f4,b4] ~ [ab3,b4] ~ [ab3,f4,b4]@2 [ab3,f4,b4] ~", // Fdim Abm Fdim Abm Fdim
  AB: "[bb1,eb3,c4,g4]@4 [bb1,eb3,c4,g4] ~@3 [c3,g3,eb4,bb4]@4 [g3,eb4,bb4] ~@2 [g3,eb4,bb4]", // Cm7 Eb
  AC: "[f2,f3,eb4,ab4]@4 [f3,eb4,ab4] ~@2 [f3,eb4,ab4] [bb2,f3,d4,ab4]@2 ~ [d4,ab4] [bb2,f3,d4,ab4]@2 d4 ab4", // Fm7 Bb7 Ddim Bb7
  AD: "[eb2,eb3,c4,g4]@2 ~ [c4,g4] [eb2,eb3,c4,g4]@2 c4 g4 [eb3,c4,g4]@2 ~ [c4,g4] [eb2,eb3,c4,g4]@3 [eb3,g4]", // Cm C5 Cm C5 Cm Eb
  AE: "[eb2,eb3,c4,g4]@3 g4 [eb2,eb3,c4,g4]@2 ~ [c4,g4] [eb2,eb3,c4,g4]@3 [c4,g4] [eb2,eb3,c4,g4]@3 [eb3,c4,g4]", // Cm C5 Cm C5 Cm
  AF: "[bb2,f3,d4,ab4]@4 [bb2,f3,d4,ab4] ~@3 [bb2,f3,d4,ab4]@4 [bb2,f3,d4,ab4]@2 ~ f4", // Bb7
  AG: "[eb2,eb3,db4,g4]@4 [eb3,db4,g4] ~@2 [eb3,db4,g4] [eb2,eb3,db4,g4]@4 [eb3,db4,g4] ~@2 [eb3,db4,g4]", // Eb7
  AH: "[ab2,ab3,f4,c5]@4 [ab3,f4,c5] ~@2 [ab3,f4,c5] [ab2,ab3,f4,c5]@4 [ab3,f4,c5] ~@2 [ab3,f4,c5]", // Fm
  AI: "~ b4@2 [ab3,f4,b4] [ab3,b4] f4 ab3@2 [ab3,f4,b4]@2 [ab3,f4,b4] ~ [f4,b4] ~ [ab3,f4,b4] ~, [ab2,ab3,f4]@3 ~@3 b4 ~@5 ab3@2 ~@2", // Fdim Abm Fdim Db
  AJ: "[bb1,eb3,c4,g4]@2 ~ [c4,g4] [bb1,eb3,c4,g4]@2 c4 g4 [c3,g3,eb4,bb4]@2 ~ [eb4,bb4] [c3,g3,eb4,bb4]@2 eb4 bb4", // Cm7 C5 Cm7 Eb5 Cm7
  AK: "[f2,f3,eb4,ab4]@4 [f3,eb4,ab4] ~@2 [f3,eb4,ab4] [bb2,f3,d4,ab4]@4 [bb2,f3,d4,ab4] ~@2 [d4,ab4]", // Fm7 Bb7 Ddim
  AL: "[bb2,f3,d4,ab4]@4 [f3,d4,ab4] ~@2 [f3,d4] [bb2,f3,d4,ab4]@4 [f3,d4,ab4] ~@2 [f3,ab4]", // Bb7 Ddim Dm Bb7 Ddim Fm
  AM: "[bb1,eb3,c4,g4]@4 [bb1,eb3,c4,g4] ~@3 [c3,g3,eb4,bb4]@4 [c3,g3,eb4,bb4] ~@3", // Cm7
  AN: "[f2,f3,eb4,ab4]@4 [f2,f3,eb4,ab4] ~@3 [bb2,f3,d4,ab4]@4 [bb2,f3,d4,ab4] ~@2 [d4,ab4]", // Fm7 Bb7 Ddim
  AO: "[c4,g4]!2 ~ [eb3,g4] [eb3,c4,g4] ~@2 [eb3,c4,g4] [eb2,eb3,c4,g4]@2 c4 g4 [eb3,c4,g4] ~@2 g4, [eb2,eb3] ~@7", // C5 Eb Cm Eb
  AP: "[f2,f3,eb4,ab4]@4 [f3,eb4,ab4] ~@3 [f3,eb4,ab4]@4 [f2,f3,eb4,ab4] ~@3", // Fm7
  AQ: "[bb2,f3,d4,ab4]@4 [f3,d4,ab4] ~@3 [f3,d4,ab4]@4 [bb2,f3,d4,ab4] ~@3", // Bb7 Ddim Bb7
  AR: "[eb2,eb3,db4,g4]@4 [eb2,eb3,db4,g4] ~@4 g4@3 [eb3,db4,g4] ~@3, ~@2 [eb2,eb3,db4] ~", // Eb7
  AS: "[ab2,ab3,f4,c5]@4 [ab2,ab3,f4,c5] ~@3 [ab2,ab3,f4,c5]@4 [ab2,ab3,f4,c5]@2 ~ ab4", // Fm
  AT: "[ab2,ab3,f4,b4]@4 [ab2,ab3,f4,b4] ~@3 [ab2,ab3,f4,b4]@4 [ab2,ab3,f4,b4]@2 ~ ab4", // Fdim
  AU: "[eb3,g4,c5]@4 [eb3,bb3,g4,c5] ~@4 c5@3 [eb3,bb3,g4,c5] ~@3, ~@2 [bb3,g4] ~", // Cm Cm7 Eb
  AV: "[eb3,bb3,g4,c5]@2 ~ a4 bb4@2 ~ eb5@6 ~@3", // Cm7
})).s("gm_banjo").gain(0.2)

// chords · banjo · "Guitar  (BB)" · soft notes
const banjo_soft = note(`<
  ~@3 A ~ A ~ A B C D ~ E@2 F G D ~ D ~ H ~ H ~ B I J K L M N ~ H ~@2 O ~ O P Q R I S ~ T U ~ V ~ O ~ A ~ A W X R ~@4 Y
  Z ~@2 O H ~@2 A ~ A B AA D ~ L E ~@2 J AB ~ A J AB D ~ AC AD P H ~@4 H@2 AE ~
>`.pickRestart({
  A: "[eb2,eb3] ~@3", B: "~@12 f2 ~@3", C: "~@12 bb2 ~@3", D: "~@4 eb2 ~@3 eb2@4 ~@4", E: "~@12 ab2 ~@3", F: "~@15 bb4",
  G: "~@15 ab4", H: "~@12 eb2 ~@3", I: "~@12 bb2 ~@2 d4", J: "~@7 g4 ~@7 c4", K: "~@12 eb2 ~@2 db4",
  L: "~@12 ab2 ~@2 f4", M: "~@4 ab2 ~@3 ab2@4 ~@4", N: "~@4 bb1 ~@11", O: "~@2 eb3 ~@12 [eb3,c4]", P: "~@12 eb2 ~@2 c4",
  Q: "eb2@4 ~@11 eb3", R: "~@3 [f2,f3] ~@2 f3 ~ f2@2 ~ f3 ~@4", S: "~@3 c4 ~@4",
  T: "~@3 [ab2,ab3] ~@2 ab3 ~ ab2@2 ~ ab3 ~@4", U: "ab2@3 ~@8 f4 ~@4", V: "~@11 [bb2,f3] ~@2 f3 ~",
  W: "~@3 [eb2,eb3] ~@2 eb3 ~ eb2@2 ~ eb3 ~@4", X: "~@3 eb3 ~@3 eb3 ~@3 eb3 ~@4", Y: "~@3 f4 ~@4",
  Z: "~@3 [bb1,eb3] ~@2 eb3 ~@4 [c3,g3] ~@2 g3 ~", AA: "~@7 ab4 ~@7 d4", AB: "~@2 eb3 c4 ~@11 [eb3,c4]",
  AC: "~@4 f2 ~@3 f2@4 ~@4", AD: "~@4 bb2 ~@3 bb2@4 ~@4", AE: "bb3 ~ eb3 ~",
})).s("gm_banjo").gain(0.12)

// drums · kick
const kick = s("bd").struct("<~@2 A@15 B A@15 B@4 A B@28 A@15 B A@15 B C D>".pickRestart({
  A: "x!2", B: "x", C: "x!4", D: "x ~@3 x ~@2 x ~@8",
})).gain(0.24)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@2 A ~@6 B ~@3 B ~@15 B ~@4 A ~@2 B ~@11 C ~@15 B A ~@6 B ~@8 A ~@2 B ~@12 C D
>`.pickRestart({
  A: "x", B: "~@11 x!2 ~@3", C: "~@11 x!3 ~ x", D: "x ~@2 x!2 ~@2 x ~@8",
})).gain(0.2)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@17 A ~@15 A ~@47 A ~@15 A ~@2>".pickRestart({
  A: "~@8 x ~@2 x ~@4",
})).gain(0.12)

// drums · hihat
const hihat = s("hh").struct("<~@2 [x ~@3 x ~@2 x!2 ~@3 x ~@2 x]!32 ~@32 [x ~@3 x ~@2 x!2 ~@3 x ~@2 x]!32 ~@2>")
  .gain(0.2)

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

// drums · ride
const ride = s("rd").struct(`<
  ~@34 A B C D@2 C E@3 B@2 C B C B F E@2 C B E D@2 B E C@2 B E B C E ~@32 G H
>`.pickRestart({
  A: "~@4 x ~@3 x ~@3 x ~@2 x", B: "x ~@3 x ~@3 x ~@3 x ~@2 x", C: "x!4", D: "x ~@2 x!2 ~@3 x ~@3 x ~@2 x",
  E: "x ~@3 x ~@2 x!2 ~@3 x ~@2 x", F: "x ~@2 x!2 ~@2 x!2 ~@3 x ~@2 x", G: "~@4 x ~@2 x!2 ~@3 x ~@3", H: "~ x ~@2",
})).gain(0.28)

stack(bass, piano, banjo, banjo_soft, kick, rim, snare, snare_soft, hihat, crash, ride)

More by Fats Domino