Strudelify

history maker

SakuraSky

KeyE majorTempo201 bpm
0:00/0:00
// history maker — SakuraSky
// 201 bpm, 3/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/3187261; license: https://creativecommons.org/publicdomain/zero/1.0/
// 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(201/3)

// 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.

// other · clarinet · "B♭ Clarinet"
const clarinet = note(`<
  A B C D E F G F H I J K L M ~@4 J N O P Q R S T U V W X Y Z S T U V W X Y Z AA AB AC@2 AD@4 AA AB AC@2 AE@2 AF ~ AG AH
  AG@2 AF@3 ~ AG AH AI@2 AF@2 AJ@2 AK AL AM AN AO AP AQ@2 AR AL AS AT AO AP AQ@2 AU AV AW@2 AX AQ@4 AY@2 AZ
>`.pickRestart({
  A: "a5@3 f#5@2 b4@3 a4@3 f#4@2 e4@3", B: "b5@3 a5@2 e5@3 b4@3 a4@2 f#4@3", C: "e6@3 b5@2 f#5@3 e5@3 b4@2 a4@3",
  D: "f#5@3 e5@2 b4@3 a4@3 e5@2 b5@3", E: "e5 [f#5,g#5] a5 [b5,c#6] d#6 f#5@5 ~ f#5@2 f#5@3, ~@5 e6 ~@10",
  F: "g#5@5 g#5@5 ~ g#5@5", G: "f#5@5 f#5@5 ~ f#5@2 f#5@3", H: "f#5@5 f#5@5 ~ g#5@5", I: "g#5", J: "~@5 b5@5 ~ g#5@5",
  K: "g#5@11 ~@5", L: "f#5@11 b5@5", M: "b5", N: "g#5@11 b5@5", O: "f#5@11 f#5@5", P: "f#5@11 a5@2 g#5@3", Q: "e5",
  R: "~@5 g#4@5 ~ a4@5", S: "g#3@5 d#4@5 ~ g#4@5", T: "g#4@5 d#4@5 ~ g#3@5", U: "a3 e4", V: "a4 e4",
  W: "b3@5 f#4@5 ~ b4@5", X: "b4@5 f#4@5 ~ b3@5", Y: "c#4 g#4", Z: "c#5 g#4", AA: "a3", AB: "a3 b3", AC: "c#4",
  AD: "b3", AE: "b3@5 b3@5 ~ b3@5", AF: "[b3,d#4,f#4]", AG: "[a3,c#4,e4]", AH: "[a3,c#4,e4] [b3,d#4,f#4]",
  AI: "[c#4,e4,g#4]", AJ: "[b3,d#4,f#4]@5 [b3,d#4,f#4]@5 ~ [b3,d#4,f#4]@5", AK: "a3@5 e4@5 ~ a4@5",
  AL: "e4@5 a3@5 ~ b3@5", AM: "a3@5 g#4@5 ~ c#5@5", AN: "g#4@5 c#4@5 ~ d#4@5", AO: "b3@5 d#4@5 ~ f#4@5",
  AP: "b4@5 f#4@5 ~ d#4@5", AQ: "[b3,f#4,b4]@5 [b3,f#4,b4]@5 ~ [b3,f#4,b4]@5", AR: "a3@5 e4@5 ~ g#4@5",
  AS: "c#4@5 g#4@5 ~ c#5@5", AT: "g#4@5 c#4@5 ~ c4@5", AU: "a4@3 f#4@2 b4@3 a4@3 f#4@2 e4@3", AV: "a4@3 f#4@3 ~@10",
  AW: "[b3,f#4,b4]", AX: "e5 [f#5,g#5] a5 [b5,c#6] d#6 [b3,f#4,b4]@5 ~ [b3,g#4,b4]@5, ~@5 e6 ~@10",
  AY: "e5 [f#5,g#5] a5 [b5,c#6] d#6 b3@3 [f#4,b4]@3 b3@2 [f#4,b4]@3, ~@5 e6 ~@10", AZ: "[e3,b3,e4]",
})).s("gm_clarinet").gain(0.3)

// other · alto sax · "Alto Saxophone"
const alto_sax = note(`<
  ~@4 A B C B D E F G H I ~@4 F J K L M N O P Q R S T R U O P Q V W X Y Z AA AB AC AD AE AF AG AH AI AB AJ AD AE AK AG
  AH AL@2 AM@2 AN AO AP AQ AR AS AM AT AN AU AP AQ AV AB AW ~@25
>`.pickRestart({
  A: "~@5 f#5@5 ~ f#5@2 f#5@3", B: "g#5@5 g#5@5 ~ g#5@5", C: "f#5@5 f#5@5 ~ f#5@2 f#5@3", D: "f#5@5 f#5@5 ~ g#5@5",
  E: "g#5", F: "~@5 g#4@5 ~ b4@5", G: "b4@11 ~@5", H: "b4@11 f#4@5", I: "f#4", J: "b4@11 c#5@5", K: "f#4@11 f#4@5",
  L: "f#4@11 g#4@5", M: "e4", N: "~@5 g#4@5 ~ a4@5", O: "[g#4,b4]@11 [g#4,b4]@5", P: "[g#4,b4]@5 a4@5 ~ g#4@5",
  Q: "f#4 e4", R: "f#4 g#4", S: "[e4,b4]@11 [e4,b4]@5", T: "[e4,b4]@5 a4@5 ~ g#4@5", U: "f#4@11 ~@5",
  V: "~@5 a4@5 ~ a4@5", W: "[f#4,b4]@11 [f#4,b4]@5", X: "[f#4,b4]@5 c#5@5 ~ d#5@5", Y: "[g#4,e5] d#5",
  Z: "[g#4,e5] [d#5,f#5]", AA: "e5@11 a4@5", AB: "e5@5 f#5@5 ~ e5@5", AC: "e5@11 b4@5", AD: "f#5@5 e5@5 ~ [g#4,f#5]@5",
  AE: "[f#4,f#5]@11 ~@5", AF: "f#5@5 e5@11", AG: "f#5@5 e5@5 ~ f#5@5", AH: "a5@5 g#5@5 ~ e5@5", AI: "[c#5,e5]@11 b4@5",
  AJ: "[e4,e5]@5 ~@6 b4@5", AK: "f#5@5 f#5@5 ~ e5@5", AL: "[a4,a5]@5 g#5@5 ~ e5@5", AM: "g#4", AN: "b4",
  AO: "e4@11 g#4@5", AP: "[f#4,f#5]@5 e5@5 ~ f#5@5", AQ: "[e5,a5]@5 g#5@5 ~ e5@5", AR: "[c#5,a5]@5 g#5@5 ~ e5@5",
  AS: "[b4,a5]@5 g#5@5 ~ e5@5", AT: "e4 g#4", AU: "e4@5 f#5@5 ~ [g#4,f#5]@5", AV: "~@11 b4@5", AW: "e5@5 ~@11",
})).s("gm_alto_sax").gain(0.35)

// other · alto sax · "Alto Saxophone" · soft notes
const alto_sax_soft = note("<~@3 A B ~@69 C D E F G H I J K L M N G H O P ~@9 Q>".pickRestart({
  A: "f#4@3 e4@2 b3@3 a3@3 e4@2 b4@3", B: "e4 [f#4,g#4] a4 [b4,c#5] d#5 e5 ~@10", C: "~@11 b4@5",
  D: "f#5@5 [c#5,e5]@5 ~ [c5,f#5]@5", E: "[b4,f#5]@11 ~@5", F: "[d#5,f#5]@5 e5@5 ~@6",
  G: "[d#5,f#5]@5 e5@5 ~ [d#5,f#5]@5", H: "[d#5,a5]@5 [d#5,g#5]@5 ~ e5@5", I: "c#5", J: "[b4,e5]@5 f#5@5 ~ e5@5",
  K: "[g#4,e5]@11 b4@5", L: "f#5@5 e5@5 ~ f#5@5", M: "[g#4,e5]@11 f#5@5", N: "f#5 e5",
  O: "a5@3 f#5@2 b5@3 a5@3 f#5@2 e5@3", P: "a5@3 f#5@3 ~@10", Q: "e5",
})).s("gm_alto_sax").gain(0.2)

// other · trumpet · "B♭ Trumpet"
const trumpet = note(`<
  ~@2 A B C D E D F G ~@4 H I J G ~@5 K L M N O P Q O R L M N S T U V W X@3 Y Z AA Y AB AC X AD Y Z AE AF AG@3 AH@2 AI
  AJ AK AL AM AN AH AO AI AP AK AL AQ AR AS AT AU AV AW AX AY AZ BA BB BC BD AW AX BE BF AW AX BG BH@2 AW BI BG@2 X
>`.pickRestart({
  A: "a3@3 b3@2 e4@3 f#4@8", B: "a3@3 b3@2 e4@3 f#4@3 b4@2 e4@3", C: "~@5 f#5@5 ~ f#5@2 f#5@3",
  D: "g#5@5 g#5@5 ~ g#5@5", E: "f#5@5 f#5@5 ~ f#5@2 f#5@3", F: "f#5@5 f#5@5 ~ g#5@5", G: "g#5",
  H: "~@5 f#5@3 f#5@3 g#5@5", I: "g#5@11 b4@5", J: "b4@5 g#5@5 ~ g#5@5", K: "~@5 g#4@5 ~ a4@5",
  L: "[g#4,b4]@11 [g#4,b4]@5", M: "[g#4,b4]@5 a4@5 ~ g#4@5", N: "f#4 e4", O: "f#4 g#4", P: "[e4,b4]@11 [e4,b4]@5",
  Q: "[e4,b4]@5 a4@5 ~ g#4@5", R: "f#4@11 ~@5", S: "~@5 a4@5 ~ a4@5", T: "[f#4,b4]@11 [f#4,b4]@5",
  U: "[f#4,b4]@5 c#5@5 ~ d#5@5", V: "[g#4,e5] d#5", W: "[g#4,e5] [d#5,f#5]", X: "e5",
  Y: "f#5@3 e5@2 e5@3 f#5@3 f#5@2 g#5@3", Z: "[f#4,f#5]@11 ~@5", AA: "f#5@11 e5@5", AB: "a5@3 f#5@2 g#5@3 e5@3 e5@5",
  AC: "[c#5,e5]", AD: "[e4,e5]", AE: "f#4@3 d#4@2 f#4@3 d#4@3 e4@2 c#4@3", AF: "f#4@3 d#4@2 e4@3 c#4@3 f#4@2 d#4@3",
  AG: "a4@3 f#4@2 g#4@3 e4@3 g#4@2 e4@3", AH: "g#4", AI: "b4", AJ: "e4@11 g#4@5", AK: "[f#4,f#5]@5 e5@5 ~ f#5@5",
  AL: "[e5,a5]@5 g#5@5 ~ e5@5", AM: "[c#5,a5]@5 g#5@5 ~ e5@5", AN: "[b4,a5]@5 g#5@5 ~ e5@5", AO: "e4 g#4",
  AP: "e4@5 f#5@5 ~ [g#4,f#5]@5", AQ: "~@11 b4@5", AR: "e5@5 f#5@5 ~ e5@5", AS: "e5@5 ~@6 b4@5",
  AT: "f#5@5 [c#5,e5]@5 ~ [c5,f#5]@5", AU: "[b4,f#5]@11 ~@5", AV: "[d#5,f#5]@5 e5@5 ~@6",
  AW: "[d#5,f#5]@5 e5@5 ~ [d#5,f#5]@5", AX: "[d#5,a5]@5 [d#5,g#5]@5 ~ e5@5", AY: "c#5", AZ: "[b4,e5]@5 f#5@5 ~ e5@5",
  BA: "[g#4,e5]@11 b4@5", BB: "f#5@5 e5@5 ~ f#5@5", BC: "[g#4,e5]@11 f#5@5", BD: "f#5 e5",
  BE: "e5@3 f#5@2 a5@3 b5@3 f#5@2 a5@3", BF: "f#5@3 a5@2 [d#5,f#5]@5 ~ e5@5",
  BG: "e5 [c#5,d#5] b4 [g#4,a4] f#4 e4 ~@10", BH: "[d#5,f#5]@5 [d#5,f#5]@5 ~ e5@5",
  BI: "[d#5,a5]@5 [d#5,g#5]@5 ~ [g#4,e5]@5", // D#dim G#5 C#m
})).s("gm_trumpet").gain(0.3)

// chords · trombone
const trombone = note(`<
  ~ A B@2 C D E D E D F@2 G@2 H@2 D@2 F I G@2 H@2 J K L M N O P Q J K L M N O P Q R S T@2 U@4 R S T@2 V@2 W ~ X Y X@2
  W@3 ~ X Y Z@2 W@2 AA@2 AB AC AD AE AF AG AH@2 AI AC AJ AE AF AG AH@2 AK@4 AL AH@4 AM@2 AN
>`.pickRestart({
  A: "f#3", B: "a3", C: "e4 c#4 ~ a3 f#3 ~@11", D: "[e3,e4]@5 ~@11", E: "[e2,e3]@5 ~@11", F: "[c#3,c#4]@5 ~@11",
  G: "[g#2,g#3]@5 ~@11", H: "[a2,a3]@5 ~@11", I: "[c#3,c#4]@5 ~@6 [c#3,c#4]@5", J: "g#2@5 d#3@5 ~ g#3@5",
  K: "g#3@5 d#3@5 ~ g#2@5", L: "a2 e3", M: "a3 e3", N: "b2@5 f#3@5 ~ b3@5", O: "b3@5 f#3@5 ~ b2@5", P: "c#3 g#3",
  Q: "c#4 g#3", R: "a2", S: "a2 b2", T: "c#3", U: "b2", V: "b2@5 b2@5 ~ b2@5", W: "[b2,d#3,f#3]", X: "[a2,c#3,e3]",
  Y: "[a2,c#3,e3] [b2,d#3,f#3]", Z: "[c#3,e3,g#3]", AA: "[b2,d#3,f#3]@5 [b2,d#3,f#3]@5 ~ [b2,d#3,f#3]@5",
  AB: "a2@5 e3@5 ~ a3@5", AC: "e3@5 a2@5 ~ b2@5", AD: "a2@5 g#3@5 ~ c#4@5", AE: "g#3@5 c#3@5 ~ c3@5",
  AF: "b2@5 d#3@5 ~ f#3@5", AG: "b3@5 f#3@5 ~ d#3@5", AH: "[b2,f#3,b3]@5 [b2,f#3,b3]@5 ~ [b2,f#3,b3]@5",
  AI: "a2@5 e3@5 ~ g#3@5", AJ: "c#3@5 g#3@5 ~ c#4@5", AK: "[b2,f#3,b3]",
  AL: "[b2,f#3,b3]@5 [b2,f#3,b3]@5 ~ [b2,g#3,b3]@5", AM: "b2@3 [f#3,b3]@2 b2@3 [f#3,b3]@3 b2@2 [f#3,b3]@3",
  AN: "[e2,b2,e3]", // E5
})).s("gm_trombone").gain(0.25)

// other · tinkle bell · "Hand Bells"
const tinkle_bell = note("<A B C D E F G F H I J K L M N O P I J Q R S T ~@77>".pickRestart({
  A: "e4@5 a4@5 ~ f#5@5", B: "f#4@5 b4@5 ~ a5@5", C: "a4@5 e5@5 ~ b5@5", D: "a4@5 e5@5 ~ b4@5",
  E: "e6@3 a5@2 f#5@5 ~ f#5@2 f#5@3", F: "g#5@5 g#5@5 ~ g#5@5", G: "f#5@5 f#5@5 ~ f#5@2 f#5@3",
  H: "f#5@5 f#5@5 ~ g#5@5", I: "g#5", J: "~@5 g#5@5 ~ b5@5", K: "b5@11 ~@5", L: "b5@11 f#5@5", M: "f#5",
  N: "~@5 f#5@3 f#5@3 g#5@5", O: "g#5@11 b4@5", P: "b4@5 g#5@5 ~ g#5@5", Q: "b5@11 c#6@5", R: "f#5@11 f#5@5",
  S: "f#5@11 g#5@5", T: "e5",
})).s("gm_tinkle_bell").gain(0.3)

// other · oboe
const oboe = note(`<
  ~@4 A B C B D E ~@4 F G H E ~@5 I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AA AI AC AD AJ AF AG AK@2
  AL@2 AM AN AO AP AQ AR AL AS AM AT AO AP AU AA AV AW AX AY AZ BA BB BC BD AF BE L AZ BA BF BG AZ BA BH BI@2 AZ BJ BH@2
  BK
>`.pickRestart({
  A: "~@5 f#5@5 ~ f#5@2 f#5@3", B: "g#5@5 g#5@5 ~ g#5@5", C: "f#5@5 f#5@5 ~ f#5@2 f#5@3", D: "f#5@5 f#5@5 ~ g#5@5",
  E: "g#5", F: "~@5 f#5@3 f#5@3 g#5@5", G: "g#5@11 b4@5", H: "b4@5 g#5@5 ~ g#5@5", I: "~@5 g#5@5 ~ a5@5",
  J: "[g#5,b5]@11 [g#5,b5]@5", K: "[g#5,b5]@5 a5@5 ~ g#5@5", L: "f#5 e5", M: "f#5 g#5", N: "[e4,b4]@11 [e4,b4]@5",
  O: "[e4,b4]@5 a4@5 ~ g#4@5", P: "f#4 g#4", Q: "f#4@11 ~@5", R: "[g#4,b4]@11 [g#4,b4]@5", S: "[g#4,b4]@5 a4@5 ~ g#4@5",
  T: "f#4 e4", U: "~@5 a4@5 ~ a4@5", V: "[f#4,b4]@11 [f#4,b4]@5", W: "[f#4,b4]@5 c#5@5 ~ d#5@5", X: "[g#4,e5] d#5",
  Y: "[g#4,e5] [d#5,f#5]", Z: "e5@11 a4@5", AA: "e5@5 f#5@5 ~ e5@5", AB: "e5@11 b4@5", AC: "f#5@5 e5@5 ~ [g#4,f#5]@5",
  AD: "[f#4,f#5]@11 ~@5", AE: "f#5@5 e5@11", AF: "f#5@5 e5@5 ~ f#5@5", AG: "a5@5 g#5@5 ~ e5@5", AH: "[c#5,e5]@11 b4@5",
  AI: "[e4,e5]@5 ~@6 b4@5", AJ: "f#5@5 f#5@5 ~ e5@5", AK: "[a4,a5]@5 g#5@5 ~ e5@5", AL: "g#4", AM: "b4",
  AN: "e4@11 g#4@5", AO: "[f#4,f#5]@5 e5@5 ~ f#5@5", AP: "[e5,a5]@5 g#5@5 ~ e5@5", AQ: "[c#5,a5]@5 g#5@5 ~ e5@5",
  AR: "[b4,a5]@5 g#5@5 ~ e5@5", AS: "e4 g#4", AT: "e4@5 f#5@5 ~ [g#4,f#5]@5", AU: "~@11 b4@5", AV: "e5@5 ~@6 b4@5",
  AW: "f#5@5 [c#5,e5]@5 ~ [c5,f#5]@5", AX: "[b4,f#5]@11 ~@5", AY: "[d#5,f#5]@5 e5@5 ~@6",
  AZ: "[d#5,f#5]@5 e5@5 ~ [d#5,f#5]@5", BA: "[d#5,a5]@5 [d#5,g#5]@5 ~ e5@5", BB: "c#5", BC: "[b4,e5]@5 f#5@5 ~ e5@5",
  BD: "[g#4,e5]@11 b4@5", BE: "[g#4,e5]@11 f#5@5", BF: "e4@3 f#4@2 a4@3 b4@3 f#4@2 a4@3",
  BG: "f#4@3 a4@2 [d#5,f#5]@5 ~ e5@5", BH: "e6 [c#6,d#6] b5 [g#5,a5] f#5 e5 ~@10", BI: "[d#5,f#5]@5 [d#5,f#5]@5 ~ e5@5",
  BJ: "[d#5,a5]@5 [d#5,g#5]@5 ~ [g#4,e5]@5", BK: "e5",
})).s("gm_oboe").gain(0.45)

// other · timpani
const timpani = note("<A B C D E ~@83 F G ~@2 E ~@4 E@2 ~>".pickRestart({
  A: "e2@3 f#2@2 a2@3 b2@3 f#2@2 a2@3", B: "f#2@3 a2@2 b2@3 e3@3 a2@2 b2@3", C: "a2@3 b2@2 e3@3 f#3@3 b2@2 e3@3",
  D: "a2@3 b2@2 e3@3 f#3@3 b3@2 e3@3", E: "e3 [c#3,d#3] b2 [g#2,a2] f#2 e2 ~@10", F: "e3@3 f#3@2 a3@3 b3@3 f#3@2 a3@3",
  G: "f#3@3 a3@3 ~@10",
})).s("gm_timpani").gain(0.35)

// drums · kick
const kick = s("bd").struct("x").gain(0.3)

// drums · snare
const snare = s("sd").struct(`<
  [x ~@4 x ~@2 x ~@2 x ~@4]!4
  [x ~@4 x ~ x!3 ~ x ~ x ~@2]
  [x ~@4 x ~@2 x ~@2 x ~@4]!35
  [x ~@4 x ~@7 x ~@2]!6
  [x ~@4 x ~@2 x ~@2 x ~@4]
  [x ~@4 x ~@7 x ~@2]!6
  [x ~@4 x ~@2 x ~@2 x ~@4]!47
>`).gain(0.3)

stack(clarinet, alto_sax, alto_sax_soft, trumpet, trombone, tinkle_bell, oboe, timpani, kick, snare)