Strudelify

rockin around the christmas tree

Matt Marino

KeyF majorTempo130 bpm
0:00/0:00
// rockin around the christmas tree — Matt Marino
// 130 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 1 "Alto Saxophone" named as a reed, played on alto sax (its electric bass pick patch is not one); ch 2 "Piano" named as a piano, played on piano (its slap bass 1 patch is not one); ch 3 "Electric Guitar" named as a guitar, played on electric guitar clean (its slap bass 2 patch is not one)
// note: Transcription provider: pdmx. https://musescore.com/score/5857120; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 88 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(130/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 · alto sax · "Alto Saxophone"
const alto_sax = note(`<
  A B C D E F G@2 H I J@2 K L G@2 H M N@2 O P@3 Q R S T E F G@2 H M U@2 V W X Y Z AA AB AC V W X Y Z AA AB AC V W X Y Z
  AA AB AC V W X Y Z AA AB AD O P@3 Q R S T E F G@2 H AE AF AG AH AI AJ AK
>`.pickRestart({
  A: "ab1 ~ eb2 ~", B: "f2 ~ c2 ~", C: "db2 ~ ab1 ~", D: "eb2 db2 c2 bb1",
  E: "eb4 c4 eb4 ~ eb2@2 ~ c4, ab1@2 ~ f4@3 ~@2", F: "[ab1,eb4]@2 eb4 ~ eb2@2 eb4 f4, ~@3 f4@3 ~@2",
  G: "[[eb2,g4]@2 eb4@2 [bb1,db4]@2 bb3 ~ eb2@2 ~@2 bb1@2 ~@2, ~@7 g3@5 ~@4]/2", // Eb Bbm
  H: "f4 eb4 f4 ~ eb2@2 eb4@2, bb1@2 ~ g4@3 ~@2", I: "f4 f4@2 ~ eb2@2 c4 eb4, ab1@2 ~ g4@3 ~@2",
  J: "[[ab1,eb4]@2 eb4 ~ eb2@2 bb3 ~ eb2@2 ~@2 bb1@2 ~@2, ~@3 f4@3 ~ c4@5 ~@4]/2", // Ab5
  K: "eb4 c4 eb4 ~ bb1@2 ~ c4, eb2@2 ~ f4@3 ~@2", L: "[bb1,eb4]@2 eb4 ~ eb2@2 eb4 f4, ~@3 f4@3 ~@2",
  M: "f4 f4@2 ~ eb2@2 eb4!2, bb1@2 ~ g4@3 ~@2",
  N: "[[bb1,c4]@2 eb4@2 [eb2,f4]@2 g3 ~ ab1@2 ~@2 eb2@2 d2@2, ~@7 ab3@9]/2", O: "[db2,f4] [f2,e4] [ab2,f4] [bb2,e4]",
  P: "[[ab2,f4]@2 [g2,bb3]@2 d4 ~@5 db2@2 ~ c4 f4 ~ c3@2 g2@2 eb2@2 c2@2, ~@2 f2 db2 c2 ~ eb2 g2 ~@4, ~@5 f4@2 g4@2 eb4@4 ~@2 g4@9]/3", // Db Gm
  Q: "[f2,ab4] [g2,g4] [ab2,ab4] [bb2,g4]", R: "[ab2,ab4]@2 f4 ~@3 f2@2, ~ g2 f2 ~, ~@3 g4@2 ab4@3",
  S: "bb4@3 ab4 g4@2 f4@2, bb2 ~@3", T: "[eb2,eb4]@2 f4 ~@2 f4 [bb1,eb4]@2, ~ db2 c2 ~, ~@3 g4@2 ~@3",
  U: "[[bb1,c4]@2 eb4@2 [eb2,f4]@2 g3 ~ ab1@2 eb2@2 f2@2 g2@2, ~@7 ab3@9]/2", V: "ab2 eb2 c2 eb2", W: "ab2 bb2 c3 db3",
  X: "eb3 bb2 g2 bb2", Y: "g2 bb2 eb3 bb2", Z: "eb3 eb2 g2 bb2", AA: "eb3 eb2 eb3 db3", AB: "eb3 db3 c3 bb2",
  AC: "ab2 eb2 f2 g2", AD: "ab2 eb2 db2 d2", AE: "f4 f4@2 ~ eb2@2 f4!2, bb1@2 ~ g4@3 ~@2", AF: "eb4 ab1 f4 f2",
  AG: "~ bb1 ~ eb2, f4 g4", AH: "bb4 ~ c2@2 eb2@2 c2@2, ab1 ~@3, ~ ab4@7", AI: "db2@2 f2@2 ab2@2 f4!2, ~@3 f2",
  AJ: "[eb2,eb4]@2 f4@2 g4@2 bb4 ab4", AK: "~ ab1",
})).s("gm_alto_sax").gain(0.3)

// chords · piano
const piano = note(`<
  A B C D A@2 D@2 E@3 A@3 D@2 E@3 F G@2 H@2 I J K L A@2 D@2 E@3 A M@2 N@5 M@3 N@5 M@3 N@5 M@3 N@5 O G@2 H@2 I J K L A@2
  D@2 E@2 P Q M G R S
>`.pickRestart({
  A: "[ab2,ab3] [c5,eb5,ab5] [eb2,eb3] [c5,eb5,ab5]", B: "[f2,f3] [c5,f5,ab5] [c2,c3] [c5,f5,ab5]",
  C: "[db2,db3] [db5,f5,ab5] [ab2,ab3] [db5,f5,ab5]", D: "[eb2,eb3] [db5,eb5,g5,bb5] [bb2,bb3] [db5,eb5,g5,bb5]",
  E: "[bb2,bb3] [db5,f5,ab5,bb5] [eb2,eb3] [db5,eb5,g5,bb5]", F: "[ab2,ab3] [c5,eb5,ab5] [eb2,eb3] [c5,eb5,gb5,ab5]",
  G: "[db2,db3,db5,f5,ab5]!4", H: "[c2,c3,c5,eb5,g5]!4", I: "[f2,f3,c5,f5,ab5]!2 [e2,e3,c5,e5,ab5]!2",
  J: "[eb2,eb3,c5,eb5,ab5]!4", K: "[bb1,bb2,bb4,d5,f5,ab5] ~@3", L: "eb2 db2 c2 bb1", M: "[ab2,ab3,c5,eb5,ab5]!4",
  N: "[eb2,eb3,db5,eb5,g5,bb5]!4", O: "[ab2,ab3,c5,eb5,ab5]!2 [ab2,ab3,c5,eb5,gb5,ab5]!2",
  P: "~ [ab2,ab3,c5,eb5,ab5] ~ [f2,f3,c5,f5,ab5]", Q: "~ [bb2,bb3,db5,f5,ab5,bb5] ~ [eb2,eb3,db5,eb5,g5,bb5]",
  R: "[eb2,eb3,db5,eb5,g5,bb5] ~@3", S: "~ [ab2,ab3,bb4,c5,eb5,gb5]",
})).s("gm_piano").gain(0.3)

// chords · electric guitar clean · "Electric Guitar"
const electric_guitar_clean = note(`<
  A@2 B C D E F@2 G@3 E@3 F@2 G@3 H I@2 J@2 K L M N E@2 F@2 G@3 E O@2 P@5 O@3 P@5 O@3 P@5 O@3 P@5 Q I@2 J@2 K L M N E@2
  F@2 G@2 R G O I S T
>`.pickRestart({
  A: "~@3 [f5,ab5] [f5,ab5]@4", B: "~@3 [f5,ab5]!5", C: "[eb5,g5]!2 [db5,f5]!2 [c5,eb5]!2 [bb4,db5]!2",
  D: "[ab4,c5]@3 ~@5", E: "~ [ab2,eb3,ab3,c4,eb4,ab4] ~ [ab2,eb3,ab3,c4,eb4,ab4]",
  F: "~ [eb3,bb3,db4,g4,bb4] ~ [eb3,bb3,db4,g4,bb4]", G: "~ [bb2,f3,ab3,db4,f4,bb4] ~ [eb3,bb3,db4,g4,bb4]",
  H: "~ [ab2,eb3,ab3,c4,eb4,ab4] ~ [ab2,eb3,gb3,c4,eb4,ab4]", I: "[db3,ab3,db4,f4]!4", J: "[c3,g3,c4,eb4,g4]!4",
  K: "[f3,ab3,c4,f4] [e3,ab3,c4,f4]", L: "[eb3,ab3,c4,f4]!4", M: "[bb2,f3,ab3,d4,f4] ~@3", N: "eb3 db3 c3 bb2",
  O: "[ab2,eb3,ab3,c4,eb4,ab4]!4", P: "[eb3,bb3,db4,g4,bb4]!4",
  Q: "[ab2,eb3,ab3,c4,eb4,ab4]!2 [ab2,eb3,gb3,c4,eb4,ab4]!2", R: "~ [ab2,eb3,ab3,c4,eb4,ab4] ~ [f3,c4,f4,ab4,c5]",
  S: "[eb3,bb3,db4,g4,bb4] ~@3", T: "~ [c3,gb3,bb3,eb4]",
})).s("gm_electric_guitar_clean").gain(0.3)

// bass · electric bass finger · "Electric Bass"
const bass = note(`<
  A B C D A@2 E@2 F@3 A@3 E@2 F@3 G H I J K L M N D A@2 E@2 F@3 O P Q R S T U V W P Q R S T U V W P Q R S T U V W P Q R
  S T U V X H I J K L M N D A@2 E@2 F@2 Y Z AA AB AC AD
>`.pickRestart({
  A: "ab1 ~ eb2 ~", B: "f2 ~ c2 ~", C: "db2 ~ ab1 ~", D: "eb2 db2 c2 bb1", E: "eb2 ~ bb1 ~", F: "bb1 ~ eb2 ~",
  G: "ab1 ~ eb2 d2", H: "db2 f2 ab2 bb2", I: "ab2 g2 f2 db2", J: "c2 db2 eb2 g2", K: "c3 g2 eb2 c2", L: "f2 g2 ab2 bb2",
  M: "ab2 g2 f2!2", N: "bb2 ~@3", O: "ab1 eb2 f2 g2", P: "ab2 eb2 c2 eb2", Q: "ab2 bb2 c3 db3", R: "eb3 bb2 g2 bb2",
  S: "g2 bb2 eb3 bb2", T: "eb3 eb2 g2 bb2", U: "eb3 eb2 eb3 db3", V: "eb3 db3 c3 bb2", W: "ab2 eb2 f2 g2",
  X: "ab2 eb2 db2 d2", Y: "~ ab1 ~ f2", Z: "~ bb1 ~ eb2", AA: "ab1 c2 eb2 c2", AB: "db2 f2 ab2 f2", AC: "eb2 ~@3",
  AD: "~ ab1",
})).s("gm_electric_bass_finger").gain(0.3)

// other · trumpet · "B♭ Trumpet"
const trumpet = note(`<
  A@2 B@2 C@2 D@3 E@2 F C@2 D@3 E@2 F G@2 C@2 H I J K C@2 D@3 E@2 ~@33 G@2 C@2 H I J K C@2 D@3 E L M N@2 O P
>`.pickRestart({
  A: "c5", B: "db5", C: "eb5/2", D: "[db5@13 db5 c5 db5@5 db5@4]/3", E: "db5!2", F: "~ eb5 ~ eb5 ~ eb5 ~@2", G: "f5/2",
  H: "f5 e5", I: "eb5", J: "f5 ~@3", K: "eb5 db5 c5 bb4", L: "~ eb5 ~ f5", M: "~ f5 ~ g5", N: "ab5", O: "g5 ~@3",
  P: "~ gb5",
})).s("gm_trumpet").gain(0.3)

// other · tenor sax · "Tenor Saxophone"
const tenor_sax = note(`<
  A@3 B C@2 D@3 E@2 F C@2 D@3 E@2 F G@2 C@2 H I J K C@2 D@3 E@2 ~@33 G@2 C@2 H I J K C@2 D@3 E L M N O P Q
>`.pickRestart({
  A: "ab3", B: "bb3", C: "c4/2", D: "[bb3@13 bb3 a3 ab3@5 bb3@4]/3", E: "ab3 bb3", F: "~ c4 ~ c4 ~ c4 ~@2", G: "db4/2",
  H: "c4!2", I: "c4", J: "d4 ~@3", K: "eb4 db4 c4 bb3", L: "~ c4 ~ c4", M: "~ db4 ~ db4", N: "eb4", O: "f4",
  P: "eb4 ~@3", Q: "~ eb4",
})).s("gm_tenor_sax").gain(0.3)

// drums · kick
const kick = s("bd").struct("<A@26 B ~ A@46 B ~ A@6 C D A@2 B E>".pickRestart({
  A: "x!2", B: "x", C: "~ x ~ x", D: "~ x ~@2", E: "~ x",
})).gain(0.3)

// drums · snare
const snare = s("sd").struct("<A@26 ~ B A@46 ~ B A@6 ~ B A@2 ~ C>".pickRestart({
  A: "~ x ~ x", B: "~@5 x!2 ~", C: "~@3 x ~@12",
})).gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<A B@3 A B@7 A B@7 ~@8 A B@7 ~@40 A B@5 ~@6>".pickRestart({
  A: "~ x!7", B: "x!8",
})).gain(0.3)

// drums · high tom
const high_tom = s("ht").struct("<~@87 [~@5 x ~@10]>").gain(0.3)

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

// drums · ride
const ride = s("rd").struct("<~@20 A B@5 ~@10 A B@15 A B@15 A B@5 ~@10 A B ~@2>".pickRestart({
  A: "~ x!7", B: "x!8",
})).gain(0.3)

stack(alto_sax, piano, electric_guitar_clean, bass, trumpet, tenor_sax, kick, snare, hihat, high_tom, crash, ride)