Strudelify

When the Saints Go Marching In

Al Hirt

KeyC majorTempo138 bpm
0:00/0:00
// When the Saints Go Marching In — Al Hirt
// 138 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 3 piano (copy of ch 2 "WhenTheSa" acoustic bass)
// note: Full arrangement: all 35 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(138/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.

// bass · acoustic bass · "WhenTheSa"
const bass = note("<~ A@6 B@2 A@2 C@2 A B A@8 B@2 A@2 C@2 A B A C D E>".pickRestart({
  A: "c2@2 c3 e2@2 f2 f#2@2 g2 g1@2 g2", B: "g2@2 g3 b2@2 c3 c#3@2 d3 d2@2 d3", C: "f2@2 f3 a2@2 a#2 b2@2 c3 c2@2 c3",
  D: "c2 ~@11", E: "g1@4 a1@2 b1@4 c2@2 ~@6 c1@3 ~@3",
})).s("gm_acoustic_bass").gain(0.16)

// chords · piano
const piano = note("<A B C D E F G H I J K L M N O P Q R Q S Q T@2 U V W X Y Z AA AB AC ~ AD AE>".pickRestart({
  A: "~@3 c4@3 e4@2 c4 f4@2 c4", B: "g4 ~, f#4 ~@23", C: "~@6 c4@3 ~ c4@2 e4@6 f4@6", D: "[e4,g4]@2 ~, d#4 ~@23",
  E: "~ c4 e4 f4", F: "[e4,g4]@12 [c4,e4]@11 ~", G: "c4@11 ~ [c4,e4]@11 ~", H: "[b3,d4]@3 ~@8 [g4,b4], a#3 ~@21 f#4 ~",
  I: "~@6 e5@5 ~ [g4,e5]@6 [f4,d5]@6", // C Dm
  J: "e4 [e4,c5] c5 e4 [e4,c5] c5 [e4,c5] e4 [e4,c5] c5 [e4,c5] e4 [e4,c5] ~@5 c5@5 ~", K: "[c5,e5]@6 [a#4,g5]@5 ~",
  L: "g5@2 f5@9 ~, a4@11 ~", M: "[f4,d5]@2 ~@16 e5@4 ~ d#5, g#4 ~@21 f5@2", N: "g5 [c5,e5], e5@11 ~@13",
  O: "c5@6 f#4@2 d#5 f4@2 d5, a4@5 ~@7", P: "e4 c5@5, d#4 ~@23", Q: "~@5 c4 e4@2 c4 f4@2 c4", R: "g4@13 ~@11, f#4 ~@23",
  S: "g4@6 ~@5 [g4,c5], f#4 ~@21 f#4 ~", // C5
  T: "[[g4,c5]@6 [a4,d5]@4 g4@2 [e4,g4]@4 c4@2 [d4,f4]@4 [c4,e4]@12 ~@7 c4 a3@4 a#3@2, ~@12 d#4 ~@27 d4@2 ~@6]/2", // C5 D5 Em Dm C
  U: "b3@4 [e4,g4]@2 [d4,f4]@9 ~@7 [g4,g5]@2", V: "~@12 d#5@4 a4 g4 f4@4 d#4@2", W: "e4@5 ~@7",
  X: "e4@2 [c5,e5] [a#4,d5]@2 e4 [a4,c5]@2 e4 [g4,a#4]@3", Y: "[g4,g#4] ~@3 c5@2 c5@12 ~@6, a4 ~@5",
  Z: "~@2 g#4 c5 [g#4,c5] g#4 [g#4,c5] c5 g#4 c5 [g#4,c5]!2 g#4 c5 g#4 [g#4,c5] c5 [g#4,c5] g#4 c5 [g#4,c5] g#4 c5 g#4, g#4 ~@11, ~ c5@2 ~@21", // G#
  AA: "e4@2 [g4,c5] ~@9", AB: "~@6 f#4@2 d#5 f4@2 d5", AC: "e4@2 [g4,c5] ~@8 [d#4,g4,a4,c5]",
  AD: "[e4,g4,a4,c5] ~@7 [d#5,f#5] [e5,g5]@2 g4", // Am7 D#m Em
  AE: "[e5,g5]@3 ~@3 [d5,f5]@4 [c5,e5] ~@7 [e5,c6]@2 ~@4, d#5 ~@17 d#5 ~@5", // Em Dm C
})).s("gm_piano").gain(0.56).pan(0.6)

// chords · rock organ
const rock_organ = note("<~ A B C B D@2 E@2 F G H@2 I J K L M N O P Q@6 R@2 S T U@2 V W>".pickRestart({
  A: "~@4 [g4,c5,e5] ~@5 g4 ~ [c5,e5]@4 g4 ~ [a4,c5,f5]@4 [g4,c5,e5] ~, ~@6 g4 ~@5", // C F C
  B: "~@4 [g4,c5,e5] ~@5 g4 ~ [c5,e5]@4 g4 ~ [f4,a4,d5]@3 ~ [e4,g4,c5] ~, ~@6 g4 ~@5", // C Dm C
  C: "~@4 [g4,c5,e5] ~@5 g4 ~ [g4,c5,e5]@3 ~ g4 ~ [a4,c5,f5]@4 [g4,c5,e5] ~", // C F C
  D: "[~@4 [g4,c5,e5] ~@5 g4 ~ [g4,c5]@2 ~@2 g4 ~ [a4,c5,f5]@3 ~ [g4,c5,e5]@7 ~ [c5,e5,g5]@6 [a4,d5,f5]@5 ~ [g4,c5,e5]@3 ~ [g4,b4,d5]@2, ~@12 e5@4 ~@14 d#5 ~@17]/2", // C C5 F C Dm C G
  E: "[~@4 [g4,b4,d5]@3 ~@3 g4 ~ [b4,d5]@4 g4 ~ [c5,e5]@3 ~ d5@4 ~@2 [d5,f5]@8 [c5,e5]@6 b4@4 g4@2, ~@12 g4@2 ~@4 g4@7 ~ g4@14 ~@2 g4@2 ~@4, ~@22 b4@6 c#5 ~@13 d5@6]/2", // G Bm C Dm C
  F: "~@4 [g4,c5,e5] ~@5 g4 ~ [g4,c5,e5]@3 ~ g4 ~ [a4,c5,f5]@3 ~ [g4,c5,e5] ~", // C F C
  G: "~@4 g4 ~ [g4,c5,e5]@3 ~ g4 ~ [g4,c5,e5]@2 ~@4 [a#4,c5,e5]@3 ~ a#4 ~", // C C7
  H: "[~@4 [a4,c5,f5]@2 ~@4 a4 ~ [a4,c5,f5]@3 ~@3 [a4,c5,f5]@2 ~@2 [g#4,c5,f5]@7 ~ [g#4,c5]@2 ~@2 g#4 ~ [g#4,c5,e5]@4 [c5,d5]@6 g#4@2, ~@30 f5@4 ~@6 g#4@3 ~@3 c5 ~]/2", // F Fm G# G#aug Csus2
  I: "~@4 [g4,c5] ~@5 g4 ~ [g4,c5,e5]@4 ~@2 [c5,e5]@3 ~ [b4,d5] ~, ~@2 e5 ~@6 g4@2 ~", // C5 C Bm
  J: "~@4 [g4,b4,d5]@2 ~@6 [b4,d5]@4 ~@2 [c5,e5]@3 ~ [g4,b4,d5] ~, ~@5 g4@2 ~ g4@2 ~@2", // G Bm C G
  K: "~@4 [g4,c5,e5]@2 ~@4 g4 ~ [g4,e5]@2 ~@4 [a4,c5,f5]@3 ~ [g4,c5,e5]@2, ~@12 c5 ~@11", // C F C
  L: "~@4 [g4,c5,e5]@2 ~@4 g4 ~ [c5,e5]@4 g4 ~ [g4,b4,d5]@3 ~ [e4,a4,c5] ~, ~@6 g4 ~@5", // C G Am
  M: "~@4 [g5,e6]@2 ~@4 g5 ~ [g5,c6,e6]@3 ~ g5 ~ [a5,c6,f6]@3 ~ [g5,c6,e6]@2, ~@4 c6 ~@19", // C F C
  N: "~@4 [g5,c6,e6] ~@5 g5 ~ [g5,c6,e6]@3 ~ g5 ~ [f5,d6]@4 [e5,g5] ~, ~@9 a5 ~ c6", // C Dm Em
  O: "~@4 [g5,c6] ~@5 g5 ~ [c6,e6]@2 ~@2 g5 ~ [a5,c6,f6]@4 [g5,c6] ~, ~@4 e6@2 ~@6 g5 ~@9 e6@2", // C5 C F C5
  P: "~@4 [g5,c6,e6] ~@5 g5 ~ [c6,e6]@4 g5 ~ [f5,g5,a5,c6,d6]@3 ~ [e5,g5] ~, ~@6 g5 ~@4 c6", // C Dm7 Em
  Q: "[~@4 [g5,c6,e6]@3 ~@3 g5 ~ [c6,e6]@4 g5 ~ [a5,c6,f6]@3 ~ [g5,c6,e6]@5 ~ [c6,e6,g6]@7 ~ [a5,d6,f6]@5 ~ [c6,e6]@3 ~ [b5,d6]@7 ~ [b5,d6]@3 ~@3 [b5,d6]@6 ~@4 [d6,f6]@7 ~ [c6,e6]@4 ~@2 [b5,d6]@4 ~@2 [b5,d6]@4 ~@2 [c6,e6]@5 ~ [g5,c6,e6]@11 ~ [g5,c6,e6]@3 ~ [g5,a#5,e6]@12 ~@2 [a#5,e6]@5 ~ g5@2 ~@2 g5@2, ~@12 g5@3 ~@13 d#6 ~@13 g5@22 ~@2 g5@15 ~ g5@5 ~ g5@5 ~ g5@7 ~@29 g5@7 ~@7, ~@46 a#5 ~@23 c#6 ~@13 a#5 ~@53 [a#5,e6]@6]/6", // C F C Dm C Bm Dm C …
  R: "[[a5,c6,f6]@21 ~ g#5@8 g#5@2 ~@8 g#5@4 g#5@2 d6@2, ~@11 f6@9 e6@3 ~, ~@22 c6@14 c6@9 ~@3, ~@34 g#5@4 ~@2 d#6 ~@7]/2", // F
  S: "[g5,c6,e6]@4 ~@2 [c6,e6]@4 g5 ~ [c6,e6]@4 g5@2 [g5,b5,d6]@4 [e5,a5,c6]@2, ~@4 g5@4 ~@4 g5@2 ~@4 a#5 ~@5", // C G Am
  T: "[d5,g5,b5]@4 ~@2 [b4,d5,g5]@4 b4 ~ [b4,d5,g5]@5 ~ [c5,f5]@4 [g4,c5,e5]@2, f#5 ~@17 a4@2 ~@4", // G F5 C
  U: "[~@4 [g5,c6,e6]@2 ~@4 g5 ~ [g5,c6,e6]@3 ~ g5 ~ [a5,c6,f6]@3 ~ [f5,a5,c6]@4 ~@2 [f5,a5,c6]@3 ~@3 f5 ~ [f5,a5,c6]@4 ~@2 [f5,a5,c6]@3 ~ [e5,g5] ~, ~@23 c6]/2", // C F Em
  V: "~@16 e6@2 d6@2 c6 ~ a#5@2, ~@16 d#6 ~@7", W: "g5 f5 d#5 d5@2 c5 ~@3 c6 ~@2, ~@2 d#5 ~@15 c7 ~@5",
})).s("gm_rock_organ").gain(0.12).pan(0.8)

// other · trombone
const trombone = note("<~@16 A@5 B@4 C@2 D@2 E@3 F@2 G>".pickRestart({
  A: "[~@16 c3@36 ~@2 g2@3 ~@3 g2@4 a2@2 g2@3 ~ c3@31 ~ g2@3 ~@3 g2@4 a2@2 g2@5 ~]/5",
  B: "[c3@27 ~@3 c3@5 ~ d3@4 c3@2 a2@3 ~ g2@21 ~@2 g3@13 ~@2 g3@4 e3@2 d3@5 ~]/4",
  C: "[c3@11 ~ c3@3 a2@2 g2@3 ~ c3@10 ~@3 c3 ~ c3@6 d3@3 c3@2 ~]/2",
  D: "[f3@9 ~@3 f3@4 d3@2 c3@3 ~ f3@8 g3@4 ~@2 g3@3 f3@3 e3@3 d3 ~@2]/2",
  E: "[c3@10 ~@2 c3@4 ~@2 a2@3 g2@5 ~@2 g3@6 ~@2 g3@3 a3@3 g3@3 c3@6 ~@3 c3@16 ~@2]/3",
  F: "[f2@15 g2@3 a2@3 ~@2 c3@4 ~@21]/2", G: "~@9 c2@2 ~",
})).s("gm_trombone").gain(0.26).pan(0.7)

// other · brass section
const brass_section = note("<~@7 A ~@4 B ~@4 C@2 D@2 E F G@3 H I@2 J K L@2 M ~>".pickRestart({
  A: "~@22 [g4,g5] ~", B: "[f4,f5] ~@23", C: "[~@4 [c4,c5]@3 ~@3 [c4,c5]@2 [e4,e5]@4 c5 ~ [f4,f5]@4 [g4,g5]@10 ~@16]/2",
  D: "[~@4 [c4,c5]@2 ~@4 [c4,c5]@2 [e4,e5]@4 [c4,c5] ~ [f4,f5]@3 ~ [g4,g5]@9 ~@17, ~@22 [f#4,f#5] ~@25]/2", // C E C F G F#
  E: "~@6 [c4,c5]@2 ~@2 [c4,c5]@2 [e4,e5]@5 ~ [f4,f5]@4 ~@2", F: "[g4,g5] [e4,e5]",
  G: "[[d4,d5]@28 ~@2 [e4,e5]@4 ~@2 [e4,e5]@6 [d4,d5]@3 ~ [c4,c5]@23 ~ [c4,c5]@2, ~@30 d#5 ~@41]/3", // D E D C
  H: "[e4,e5]@6 [g4,g5]@5 ~", I: "[[g4,g5]@4 [f4,f5]@29 ~ [f4,f5]@2 [e4,e5]@4 ~@2 [f4,f5]@4 ~@2]/2",
  J: "[g4,g5]@11 ~ [e4,e5]@11 ~", K: "[c4,c5]@11 ~ [d4,d5]@10 ~@2",
  L: "[[c4,c5]@5 ~ [c5,c6]@2 ~@4 [c5,c6]@4 [a4,a5]@2 [g4,g5]@3 ~ [c5,c6]@4 ~@4 [c5,c6]@2 ~@4 [c5,c6]@4 [a4,a5]@2 [g4,g5]@5 ~]/2", // C A G C A G
  M: "[c5,c6] ~@7", // C
})).s("gm_brass_section").gain(0.32).pan(0.9)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@16 [~@8 x!4] ~@3 [~@11 x] ~@3 [~@11 x] ~@9 [~ x ~@2]>").gain(0.33)

// drums · hihat
const hihat = s("hh").struct("<~@34 [~@5 x]>").gain(0.27)

// drums · mid tom
const mid_tom = s("mt").struct("<~@16 [~@5 x ~@6] ~@3 [~@5 x] ~@3 [~@9 x!2 ~] ~@9 [~@5 x ~@6]>").gain(0.33)

// drums · open hat
const open_hat = s("oh").struct("<~@34 [x ~@2 x]>").gain(0.33)

// drums · crash
const crash = s("cr").struct("<~@7 A ~ B ~ B@2 ~@2 B ~ C ~ C ~ D E F ~ B@6 C ~ B ~>".pickRestart({
  A: "~@11 x", B: "x", C: "x ~@10 x", D: "x!2 ~ x", E: "~ x ~ x", F: "~@3 x ~@5 x ~ x",
})).gain(0.33)

// drums · ride
const ride = s("rd").struct("<~ A@6 B C D A D@2 E F D@2 G D G E H I J A D@3 G D@2 G C K ~>".pickRestart({
  A: "x ~@2 x ~ x!2 ~@2 x ~ x", B: "x ~@2 x ~ x!2 ~ x!2 ~@2", C: "x ~ x!2 ~ x!2 ~ x!2 ~ x",
  D: "~@2 x!2 ~ x!2 ~ x!2 ~ x", E: "x ~ x!2 ~ x!2 ~@2 x ~ x", F: "x ~@2 x ~ x!2 ~ x!2 ~ x",
  G: "~@2 x!2 ~ x!2 ~ x!2 ~@2", H: "~@2 x ~@2 x!2 ~ x ~@2 x", I: "x ~ x ~@2 x!2 ~ x ~@2 x", J: "x ~ x ~@2 x!2 ~ x ~@3",
  K: "~ x!3",
})).gain(0.33)

// drums · tambourine
const tambourine = s("tb").struct("<~ [x!12]!32 ~@2>").gain(0.17)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ [~@3 x ~ x ~@3 x ~ x]!32 ~@2>").gain(1.18)

stack(
  bass, piano, rock_organ, trombone, brass_section, kick, snare, low_tom, hihat, mid_tom, open_hat, crash, ride,
  tambourine, cabasa
)

More by Al Hirt