Strudelify

forget you

Grae

KeyD majorTempo120 bpm
0:00/0:00
// forget you — Grae
// 120 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (2/4 at bar 1, 4/4 at bar 2) are rendered on a constant 4/4 grid of one bar per cycle
// note: duplicate parts dropped: ch 5 "Horn" french horn (copy of ch 6 "Horn" french horn); ch 8 "Trombone" trombone (copy of ch 7 "Trombone" trombone)
// note: Transcription provider: pdmx. https://musescore.com/score/5183627; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 118 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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.

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

// other · french horn · "Horn"
const french_horn = note(`<
  A@8 B@3 C@2 D E F G H I J@2 K L M N K L M O@2 P ~@2 Q P R S@4 B@3 C@2 D E F G H I J@2 K L M N K L M O@2 P ~@2 Q P R
  T@2 U@2 B@3 V@2 D E F G H W X Y Z AA AB ~@4 AC AD AE AF AG AH AI AJ AK AL@3 AM@3 AN@2 D E F G H W X AO AP
>`.pickRestart({
  A: "[~@7 e4@7 ~ d4@7 ~ d4@7 ~ c4@7 ~ e4@7 ~ d4@7 ~ d4@3 ~@5 c4]/8", B: "[~ g4 a4 c5@9 c5 g4 a4 d4@5 ~ d4 e4 f4]/3",
  C: "[f4@2 g4 ~ e4@2 d4 c4@8 c4]/2", D: "c4 d4 e4 d4@2 c4@2 c4", E: "d4@2 e4 d4@2 c4@3",
  F: "~@2 c4@4 c4 d4 d4@2 a3@2 c4@4", G: "~@5 c4 e4 g4", H: "a4@2 g4 a4 e4@2 d4 c4", I: "g4!3 d4@2 c4 a3 c4",
  J: "[~@2 g4 ~ g4@2 g4 g4@5 ~@4]/2", K: "~@4 g4@2 ~ g4@2 ~ g4@4 ~@2", L: "~@4 a4@2 ~ a4@2 ~ a4@4 ~@2",
  M: "~@4 f4@2 ~ f4@2 ~ f4@4 ~@2", N: "~@4 e4@2 ~ e4@2 ~ e4@4 ~@2", O: "[~@3 c4 e4 g4 a4 d5@4 c5@2 a4@2 c4]/2",
  P: "e4 g4 e4 d4 c4 a3 c4!2", Q: "d4@3 e4@2 e4@2 d4", R: "~ g4!3", S: "[e4@2 c4@2 c3 ~@2 c4@7 ~ d4@7 ~ d4@3 ~@5 c4]/4",
  T: "[e4@2 c4@2 c3 ~@2 c4@7 ~ a3]/2", U: "[a3@2 ~@5 a3@3 ~@5 g3]/2", V: "[f4@2 f4 ~ e4@2 d4 c4@8 c4]/2",
  W: "c4 d4 e4 d4@2 c4 a3 c4", X: "~@2 g4@2 e4@2 d4 c4", Y: "c4@4 ~@3 f#4", Z: "g4!8", AA: "e4!3 d4 c4 d4 e4 d4",
  AB: "~ c4 a3@2 ~@12", AC: "~@6 d4!2", AD: "d4 ~@3", AE: "f4 ~@3", AF: "g4 ~@3", AG: "a3 b3 c4 c#4", AH: "d3 ~",
  AI: "f3 ~", AJ: "~@12 d4 c4 b3 a3", AK: "g3 f3 e3 d3 c4 b3 a3 g3 f3 e3 d3 c3 b3 a3 g3 f3",
  AL: "[c4@6 ~ a3@7 ~ a3@3 ~@5 g3]/3", AM: "[~ g4 a4 c5@10 g4 a4 d4@5 ~ d4 e4 f4]/3",
  AN: "[f4@2 g4@2 e4@2 d4 c4@8 c4]/2",
  AO: "~@2 c4 [d4,e4] [f4,g4] [a4,b4] [c4,c5] [d4,e4] [f4,g4] [a4,b4] [c4,c5] [d4,e4] [f4,g4] [a4,b4] [c4,c5] [d4,e4]", // Dsus2 Fsus2 Asus2 C Dsus2 Fsus2 Asus2 C …
  AP: "[f4,g4] [a4,b4] g4@2 a4@2 c5@4 ~@6, ~@2 c5 ~@13", // Fsus2 Asus2
})).s("gm_french_horn").gain(0.18)

// other · trombone
const trombone = note(`<
  ~ A B C D@4 E@4 F G@2 H I G H J K L M N O P M Q ~@3 R S ~@3 T@4 E@4 F G@2 H I G H J K L M N O P M Q ~@3 R S ~@3 U@3
  V@5 ~ W X@2 Y W X Z AA AB AC AD@2 AB AC AE@2 AF AG AH AI AJ AK ~@2 AL@3 AM@6 G H Y G@2 AN AO@2
>`.pickRestart({
  A: "~@4 c4@2 ~ c4@2 ~ c4@4 ~@2", B: "~@4 d4@2 ~ d4@2 ~ d4@4 ~@2", C: "~@4 f3@2 ~ f3@2 ~ f3@4 ~@2",
  D: "[~@4 c4@2 ~ c4@2 ~ c4@4 e4@14 ~@2 d4@14 ~@2 c4@6 ~@10 c4@2]/4",
  E: "[~ e4!2 e4@11 ~ d4@7 ~ c4@3 g4 ~ e4@2 d4 c4]/4", F: "c4@2 c4@2 ~ c4@3 c4@4 c4@2 c4@2", G: "c4", H: "a3",
  I: "~ e4!3 e4@2 ~@2", J: "a3 g#3", K: "~ e4!2 e4@3 g4!2", L: "g4!2 ~@3 g4!3", M: "f#3!2 ~@5 f3", N: "f3!7 g3",
  O: "~@5 g3!3", P: "g3!2 ~@3 g3!3", Q: "f3@2 f3@2 f3@2 f3@2 f3@2 f3 ~ f3@2 g3@2",
  R: "~@2 c4@2 c4@2 c4 e4 c4@4 c4 c4@3", S: "~@2 c4@2 c4 ~ c4 e4 c4@4 c4 c4@3", T: "[~@7 e4@7 ~ d4@7 ~ c4@3 ~@5 c4]/4",
  U: "[~@7 e4@7 ~ c4@3 ~@5 c4]/3",
  V: "[~@2 e4@2 e4@2 e4@6 e4@16 ~@2 d4@14 ~@2 c4@6 g4@2 ~@2 e4@4 d4@2 c4@4 c4@2 ~ c4@3 c4@4 d4@2 c4@2]/5",
  W: "c4@4 c4@3 c4 ~@2 c4@4 c4@2", X: "a3@4 a3@3 a3 ~@2 a3@4 a3@2", Y: "~ d4!3 d4@2 ~@2",
  Z: "a3@4 a3@3 g#3 ~@2 g#3@4 g#3@2", AA: "~ e4!2 e4@5", AB: "b3!8", AC: "c4!3 a3!5",
  AD: "[~@2 b3 a3@3 b3 a3@3 b3 a3@2 g3@2 ~]/2", AE: "[~@2 g3 f3@3 g3 f3@3 g3 f3@2 ~ d4!2]/2", AF: "d4 ~@3",
  AG: "f4 ~@3", AH: "g4 ~@3", AI: "~@3 b3 b3@2 b3@2", AJ: "~@3 f4 f4@2 f4@2", AK: "g4@3 f4@3 ~@2",
  AL: "[e4@6 ~ d4@7 ~ c4@3 ~@5 c4]/3",
  AM: "[~@2 e4@2 e4@2 e4@6 e4@14 ~@4 d4@14 ~@2 c4@6 g4@4 e4@4 d4@2 c4@4 c4@2 ~ c4@3 c4@4 d4@2 c4@18]/6", AN: "a4 g#4",
  AO: "[~ e4!2 e4@10 ~@3]/2",
})).s("gm_trombone").gain(0.64)

// bass · tuba · "C Tuba"
const bass = note(`<
  A@7 B@6 C D E F C D G H I J@6 A@7 K L@7 M@2 C D E F C D G H I J@6 A@7 K L@7 M@2 N O P Q R O S T U D V W X Y Z AA AB AC
  AD AE AF ~ C AG@7 AH@2 C D E AI C D AJ C AK
>`.pickRestart({
  A: "[~@5 g2 a2 c3@5 ~ g2 a2 d2@5 ~ d2 e2 f2@5 ~ f2 g2 c2@5 ~ g2 a2 c3@5 ~ g2 a2 d2@5 ~ d2 e2 f2]/7",
  B: "[~@2 c3 ~ c3@2 g2 c2@5 ~ g2 a2 c3@5 ~ g2 a2 d2@5 ~ d2 e2 f2@3 c3 ~ c3@2 g2 c2@5 ~@4]/6", C: "g2!8", D: "a2!8",
  E: "f2!8", F: "c2!8", G: "a2 g#2", H: "g2@4 ~ g2 a2 c3", I: "~@5 g2 a2 d2",
  J: "[~@5 d2 e2 f2@3 ~@3 f2 g2 c2@3 ~@3 g2 a2 c3@3 ~@3 g2 a2 d2@3 ~@3 d2 e2 f2@3 ~@3 f2 g2 c2]/6", K: "~@5 f2 g2 c2",
  L: "[~@5 g2 a2 c3@5 ~ g2 a2 d2@5 ~ d2 e2 f2@3 c3 ~ c3@2 g2 c2@5 ~ g2 a2 c3@5 ~ g2 a2 d2@5 ~ d2 e2 f2]/7",
  M: "[~@2 c3 ~ c3@2 g2 c2@5 ~@4]/2", N: "g2@4 g2@3 g2 ~@2 g2@4 g2@2", O: "f#2@4 f#2@3 f#2 ~@2 f#2@2 ~@2 f#2@2",
  P: "f2@4 f2@3 f2 ~@2 f2@2 ~@2 f2@2", Q: "e2@4 e2@3 e2 ~@2 e2@2 ~@2 e2@2", R: "g2@4 g2@3 g2 ~@2 g2@2 ~@2 g2@2",
  S: "f2@4 f2@3 f2 ~@2 f2@4 f2@2", T: "e2@4 e2@3 e2 ~@2 e2@2 ~@4", U: "e2@2 e2@2 e2@2 e2 g2", V: "d2!8", W: "g2!7 f2",
  X: "e2@2 e2@2 e2@2 e2 g1", Y: "a1!2 b1!2 c2!2 c#2!2", Z: "d2@2 ~ d2 f2 g2 g#2 a2 c3 a2 e3 f#3 g3@4", AA: "g2@3 ~",
  AB: "~@8 d4@4 [b3,c4] [e3,f3,g3,a3] [a2,b2,c3,d3] [d2,e2,f2,g2]", // Cmaj7 Fmaj7 D7 Em7
  AC: "c2 ~@7 f4@4 [d4,e4] [g3,a3,b3,c#4] [c#3,d3,e3,f#3] [f#2,g2,a2,b2]", // Dsus2 A7 Dmaj7 Gmaj7
  AD: "f2@4 ~@4 f2 g2 a2 c3 b2@2 g2@2, e2 ~@15", AE: "a1 b1 c2 c#2", AF: "d2 ~",
  AG: "[g2!4 ~ g2 a2 c3@5 ~ g2 a2 d2@5 ~ d2 e2 f2@3 c3 ~ c3@2 g2 c2@5 ~ g2 a2 c3@5 ~ g2 a2 d2@5 ~ d2 e2 f2]/7",
  AH: "[~@2 c3@2 c3@2 g2 c2@5 ~@4]/2", AI: "c3!8", AJ: "a2!4 g#2!4", AK: "~ g2 a2 c3@2 ~@3",
})).s("gm_tuba").gain(0.64)

stack(trumpet, french_horn, trombone, bass)