Strudelify

maple leaf rag

Joplin

KeyB♭ majorTempo120 bpm
0:00/0:00
// maple leaf rag — Joplin
// 120 bpm, 2/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/1567781; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 145 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/2)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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.

// other · trumpet · "Bb Trumpet"
const trumpet = note(`<
  ~ A B A B C D ~ E F@3 G@4 H A B A B C D ~ E F@3 G@4 I J K L M N O L M P K L Q R S T U J K L M N O L M P K L Q R S T V
  A B A W C D ~ E F@3 G@4 I X Y Z AA X Y Z AB AC@2 AD@2 AE AF AG@2 X Y Z AA X Y Z AB AC@2 AD@2 AE AF AH@2 AI AJ AK AL AM
  AN@3 AI AJ AO@5 AP AI AJ AK AL AM AN@3 AI AJ AO@5 AQ
>`.pickRestart({
  A: "~ bb4 f5 bb4 d5 f5@2 a4", B: "f5 a4 c5 f5@5", C: "~ bb4 db5 gb5 ~ f5 ~ f5", D: "~ bb4 db5 gb5 ~ f5 ~@2",
  E: "~@5 bb4 db5 bb5", F: "[bb5@2 bb5@2 bb5@2 bb5 bb5@2 f5 g5 d5 f5 g5@2 bb4@2 c5 db5 bb4 c5 d5@2 bb4]/3",
  G: "[d5 bb4 c5@2 bb4@2 ~ bb4@3 bb4@2 bb4@2 bb4 bb4@2 f4 g4 d4 f4 g4@2 bb4@2 c5 db5 bb4 c5 d5@2 bb4]/4",
  H: "d5 bb4 c5@2 bb4 ~@3", I: "d5 bb4 c5@2 bb4@2 ~@2", J: "~ a4 f5 a4 c5 e5@2 c5", K: "eb5 a4 c5 d5@2 f4 c5 f4",
  L: "~ d4 bb4 d4 f4 g4@2 d4", M: "bb4 d4 f4 g4@2 d4 g4@2", N: "~ f4 a4 c4 eb4 g4@2 f4", O: "a4 c4 eb4 g4@2 eb4 g4@2",
  P: "~ a4 f5 a4 c5 e5@2 a4", Q: "bb4!2 a4 ab4", R: "~ g4 b4 d5 g5 d5 b4 g4", S: "~ g4 c5 eb5 g5@2 eb5@2",
  T: "d5@2 ~ d5 ~ c5@2 f4", U: "bb4@2 f5!3 ~ f5 ~", V: "~ bb4 d5 f5 bb5@2 ~@2", W: "f5 a4 c5 f5@3 ~ f5",
  X: "~ ab4 ~ ab4", Y: "~ ab4 ~@2", Z: "bb4 eb5 c5 eb5 g5 bb4 eb5 g5", AA: "c5 eb5 g5 bb4@2 g5 c5 g5",
  AB: "c5 eb5 g5 bb4@2 g5 b4 g5", AC: "~ e5 ~ e5", AD: "~ c5 ~ c5", AE: "eb5!2 d5 c5", AF: "g5 eb5 f5 ab5@2 c5 g5@2",
  AG: "[g5 eb5 f5 g5@2 d5 f5 eb5@2 ~ bb4@2 bb4@2 ~@2]/2", AH: "[g5 eb5 f5 g5@2 d5 f5 eb5@2 eb4 g4 bb4 eb5@2 ~@2]/2",
  AI: "bb4 g4 bb4 g4", AJ: "bb4@2 c5 d5@2 c5 bb4 g4", AK: "f4 g4@2 d4@5", AL: "~ f5 g5 d5 f5 g5@2 d5",
  AM: "f5@2 g5 c5@5", AN: "[~ eb5 g5 c5 eb5 g5@2 d5@2 f5 g5 d5 f5 g5@2 d5@2 f5 g5 d5 f5 g5@2 f5]/3",
  AO: "[bb4@2 g4@2 f4 bb4@2 d5@2 f5 g5 d5 f5 g5@2 d5@2 c5 bb4@2 bb4@2 c5 bb4@2 c5 d5 bb4 c5 d5@2 bb4@2 c5 d5 bb4 ~ c5@2 f4]/5",
  AP: "bb4@2 f5!2 f5@2 f5@2", AQ: "bb4 f5 bb5 ~",
})).s("gm_trumpet").gain(0.1)

// other · trumpet · "Bb Trumpet"
const trumpet_2 = note(`<
  ~ A B A C D E ~ F G@3 H@4 I A B A C D E ~ F G@3 H@4 J K L M N O P Q R S T U V W X Y Z K L M N O P Q R S T U V W X Y AA
  A B A C D E ~ F G@3 H@4 J AB AC AD AE AB AC AD AE AF AG AH AI AJ AK AL@2 AB AC AD AE AB AC AD AE AF AG AH AI AJ AK
  AM@2 AN AO AP AQ AR AS@3 AT AE AU U AV AW AX AY AN AO AP AQ AR AS@3 AT AE AU U AV AW AX AZ
>`.pickRestart({
  A: "~ bb4 f4 bb4 d5 f4@2 a4", B: "f4 a4 c5 f4@5", C: "f4 a4 c5 f4@3 ~ f4", D: "~ bb4 db5 gb4 ~ f4 ~ f4",
  E: "~ bb4 db5 gb4 ~ f4 ~@2", F: "~ bb3 db4 bb4 ~ bb4 db5 bb4",
  G: "[bb4@2 bb4@2 bb4@2 bb4 bb4@2 f4 g4 d4 f4 g4@2 gb4@2 c5 gb4 bb4 c5 f4@2 bb4]/3",
  H: "[f4 bb4 f4@2 f4@2 ~ bb4@3 bb4@2 bb4@2 bb4 bb4@2 f4 g4 d4 f4 g4@2 gb4@2 c5 gb4 bb4 c5 f4@2 bb4]/4",
  I: "f4 bb4 f4@2 f4 ~@3", J: "f4 bb4 f4@2 f4@2 ~@2", K: "~ a4 f4 a4 c5 e4@2 c5", L: "eb4 a4 c5 d5@2 f4 c5 f4",
  M: "~ d4 bb3 d4 f4 g4@2 d4", N: "bb3 d4 f4 g3@2 d4 g4@2", O: "~ f3 a3 c4 eb4 g3@2 f3", P: "a3 c4 eb4 g3@2 eb4 g4@2",
  Q: "~ d4 bb3 d4 f3 g3@2 d4", R: "bb3 d4 f3 g3@2 d4 g4@2", S: "~ a4 ~ a4", T: "~ a4 ~@2", U: "~ f4 ~ f4",
  V: "bb4!2 a4 ab4", W: "g4!2 b4!2", X: "~ g4 c5 eb5 g4@2 c5@2", Y: "bb4@2 ~ bb4 ~ eb4@2 f4", Z: "d4@2 f4!3 ~ f4 ~",
  AA: "~ bb4 f4 bb4 f5@2 ~@2", AB: "d4@3 d4@2 d4 c4@2", AC: "d4@3 d4@2 d4 c4 d4", AD: "bb3 ~ g4@2 ~@2 g4@2",
  AE: "~ g4 ~@2", AF: "e4@3 e4@2 e4 d4@2", AG: "e4@3 e4@2 e4 d4 e4", AH: "~ f4 c5 f4 ab4 d5@2 f4",
  AI: "c5 f4 ab4 d5@2 f4 c5@2", AJ: "gb4!2 f4 eb4", AK: "bb4 eb5 f5 c5@2 c5 g5@2",
  AL: "[a4 eb5 f5 ab4@2 d5 ab4 g4@2 bb4@2 g4 bb4 g4 bb4 g4]/2",
  AM: "[a4 eb5 f5 ab4@2 d5 ab4 g4@2 c4 eb4 g4 c5@2 ~@2]/2", AN: "bb4 g4 bb4 g4", AO: "g4@2 g4 g4@2 c5 bb4 g4",
  AP: "f4 g4@2 bb3@5", AQ: "~ f4 g4 d4 f4 g4@2 d4", AR: "a4@2 g4 a4@5",
  AS: "[~ eb5 a4 c5 eb5 a4@2 bb4@2 f5 bb4 d5 f5 bb4@2 bb4@2 f5 bb4 d5 f5 bb4@2 f4]/3", AT: "~ g4!2 ~", AU: "~ f4!2 ~",
  AV: "eb4!2 c4 e4", AW: "f4!3 gb4", AX: "g4!2 a4!2", AY: "bb4@2 f4!2 f4@2 f4@2", AZ: "bb4 eb5 f5 ~",
})).s("gm_trumpet").gain(0.18)

// other · french horn · "Horn"
const french_horn = note(`<
  ~ A B A B C D E F G H I J G H I J A B A B C D E F G H I J G H I J K L M N K L M O K L M P Q R S T K L M N K L M O K L
  M P Q R S T A B A B C U E F G H I J G H I V@2 W X Y Z W X Y AA@2 AB AC AD K AE AF AG W X Y Z W X Y AA@2 AB AC AD K AE
  AH AI AJ AK O AL K M@2 B L A M AM AN AO AP AI AJ AK O AL K M@2 B L A M AM AN AO AQ
>`.pickRestart({
  A: "~ d4!2 ~", B: "~ eb4!2 ~", C: "gb4@2 f4!2", D: "gb4@2 f4 ~", E: "~@5 bb3 db4 bb4", F: "bb4 ~@3 bb4 ~@3",
  G: "db4 ~ db4 ~ db4 ~ db4 ~", H: "d4 ~ d4 ~ d4 ~ d4 ~", I: "db4 ~ db4 ~ d4 ~ d4 ~", J: "d4 ~ eb4 ~ d4 ~@3",
  K: "~ eb4 ~ eb4", L: "~ eb4 ~@2", M: "~ d4 ~ d4", N: "~ f4 ~@2", O: "~ d4 ~@2", P: "bb4!2 a4 ab4",
  Q: "~ g3 b3 d4 g4 d4 b3 g3", R: "eb3 c4 eb4!2", S: "eb4@2 ~ g4 ~ eb4@2 f4", T: "d4!3 ~", U: "gb4@4 f4 ~@3",
  V: "[d4 ~ eb4 ~ d4 ~ bb4@5 bb4@2 f4 c4@2]/2", W: "bb4@3 bb4@2 f4 c4 f4", X: "bb3 ~ bb3@2 ~@2 bb3@2", Y: "~ bb3 ~@2",
  Z: "bb4@3 bb4@2 f4 c4@2", AA: "~ c5 ~ c5", AB: "~ f4 c4 f4 ab4 d4@2 f4", AC: "c4 f4 ab4 d4@2 f4 c4@2",
  AD: "a3 c4@2 eb4 gb4 eb4 c4 a3", AE: "eb4!2 d4!2", AF: "eb4 bb4@2 g4 bb4 g4 bb4 g4", AG: "~@3 bb4@2 f4 c4@2",
  AH: "g4 bb3 eb4 ~", AI: "~ g4!2 ~", AJ: "~ g4 ~@2", AK: "~ f4!2 ~", AL: "~ eb4 ~ c4", AM: "eb4!2 c4 e4",
  AN: "f4!3 gb4", AO: "g4!2 a4!2", AP: "bb4 ~@3", AQ: "d4 a4 bb4 ~",
})).s("gm_french_horn").gain(0.27)

// bass · tuba · "C Tuba"
const bass = note(`<
  A B C B C D E F G H I J K L M N O B C B C D E F G H I J K L M N P Q R S T U V W T U R S X Y Z AA AB Q R S T U V W T U
  R S X Y Z AA AC B C B C D AD AE G H I J K L M N AF AG AH AI AJ AK AL AI AM AN AO AK@2 AP AQ AR AS AG AH AI AJ AK AL AI
  AM AN AO AK@2 AP AQ AR AT AU AV AW AX Q@2 AX AQ AU AV AW S AY AZ BA BB AU AV AW AX Q@2 AX AQ AU AV AW S AY AZ BA BC
>`.pickRestart({
  A: "~@3 f2", B: "bb2 ~@2 b2", C: "c3 ~@2 f2", D: "gb2@2 f2!2", E: "gb2@2 f2 ~", F: "bb1!2 db2 bb2!2 ~@3",
  G: "bb2 ~@3 bb3 ~@3", H: "e3 ~ e3 ~ e3 ~ e3 ~", I: "f3 ~ f3 ~ f3 ~ f3 ~", J: "gb3 ~ gb3 ~ f3 ~ f3 ~",
  K: "f3 ~ f3 ~ bb3 ~@3", L: "e2 ~ e2 ~ e2 ~ e2 ~", M: "f2 ~ f2 ~ f2 ~ f2 ~", N: "gb2 ~ gb2 ~ f2 ~ f2 ~",
  O: "f2 ~ f2 ~ bb2 ~ f2@2", P: "f2 ~ f2 ~ bb2 ~ b1@2", Q: "c2 ~ f2 ~", R: "c3 ~ f2 a2", S: "bb2 ~ f2 ~",
  T: "bb2 ~ bb2 b2", U: "c3 ~ f2 ~", V: "c2 ~ c2 db2", W: "d2 ~ f2 ~", X: "bb1!2 a1 ab1", Y: "g1 g2 b2!2", Z: "c3 g2!3",
  AA: "c2!2 f2 a2", AB: "bb2 ~@2 bb1", AC: "bb2 ~@2 f2", AD: "gb2@4 f2 ~@3", AE: "bb1 ~ bb1@2 db2@2 bb2@2 bb2@2 ~@6",
  AF: "f2 ~ f2 ~ bb2 ~@3", AG: "f2 ~ g2 ~", AH: "f2 ~ f2 d2", AI: "eb2 ~ bb2 ~", AJ: "g2 ~ eb2 e2", AK: "f2 ~ ab2 ~",
  AL: "g2 ~ f2 d2", AM: "g2 ~ eb2 d2", AN: "c2 ~ e2 ~", AO: "g2 ~ c3 ~", AP: "a2 c3@2 eb3 gb3 eb3 c3 a2",
  AQ: "bb1 ~ c2 ~", AR: "f2!2 bb1!2", AS: "eb2 ~@2 e2", AT: "eb2 bb2 eb2 d2", AU: "eb2 ~@2 d2", AV: "eb2 ~ c2 db2",
  AW: "d2 ~@2 f2", AX: "bb1 ~ f2 ~", AY: "eb2!2 c2 e2", AZ: "f2!3 gb2", BA: "g2!2 a2!2", BB: "bb2 ~ c2 d2",
  BC: "bb2 f2 bb1 ~",
})).s("gm_tuba").gain(0.64)

stack(trumpet, trumpet_2, french_horn, bass)