Strudelify

rainbow factory

WoodenToaster/Glaze

KeyA majorTempo120 bpm
0:00/0:00
// rainbow factory — WoodenToaster/Glaze
// 120 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/661481; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 128 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. 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.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · piano
const piano = note(`<
  ~@7 A B C D E F G H I J K L M J K L M J K L M J K L N O P Q R S T U V W X Y Z AA AB AC AD J K L AE AF AG AH AI AF AG
  AH AI AF AG AH AJ AK@2 AL AM AK@2 AL AM AK@2 AL AM AK@2 AL AM AN AO AP AQ AN AO AP AQ AN AO AP AQ AN AO AP N AK@2 AL
  AM AK@2 AL AM AK@2 AL AM AK@2 AL AR AS AT AU AV AS AT AU AV ~@8
>`.pickRestart({
  A: "~@6 [c3,e4] [d3,f4]", B: "[f#3,f#4]@2 [a3,a4]@2 [f#3,f#4]@2 [f#3,f#4]!2", C: "[c#3,c#4]!2 ~ f#3@3 [c#3,c#4]!2",
  D: "[c3,c4]!2 [c3,c4]@2 [c3,c4]@2 [c3,c4]!2", E: "[a2,a3]!2 [a2,a3]@2 [d3,d4]@2 [e3,e4] [f3,f4]",
  F: "[f#3,f#4]@2 [a3,a4]@2 [f#3,f#4]!2 [c#3,c#4]!2", G: "[c#3,c#4]@2 [c#3,c#4]!2 f#3@2 f#3!2",
  H: "[c3,c4]@2 [c3,c4]!6", I: "[a2,a3]!4 d3@2 ~@2", J: "[f#4,c#5,f#5]@2 [a5,c#6,f#6]!2 [f#4,c#5,f#5]@2 [a5,c#6,f#6]@2",
  K: "[f#4,c#5,f#5]@2 [a5,c#6,f#6]!2 [f#4,c#5,f#5]@2 [g#5,d#6,g#6]@2", // F#5 F#m F#5 G#5
  L: "[f4,c5,f5]@2 [f5,c6,f6]!2 [f4,c5,f5]@2 [f5,c6,f6]@2", M: "[d4,a4,d5]@2 [d5,a5,d6]!2 [d4,a4,d5]@2 [e5,e6]@2",
  N: "[d5,a5] [d#5,a#5] [e5,b5] [f5,c6]", O: "[f#4,f#5]@2 [a4,a5]@2 [c#4,c#5]!4", P: "[c#4,c#5]!5 [c#4,g#4] ~@2",
  Q: "[f#4,b4]!4 [d4,d5]!2 [d4,d5]@2", R: "[e4,e5]@2 [e4,e5]!2 [f#4,f#5]!2 ~@2",
  S: "[f#4,f#5]!4 [c#4,c#5]@2 [c#4,c#5]@2", T: "[c#4,c#5]!2 ~ [c#4,c#5] [c#4,f#4]@2 g#4 a4",
  U: "[f#4,b4]!3 [d4,d5] ~@3 [d4,d5]", V: "[e4,e5]!4 [f#4,f#5]!4", W: "[f#4,f#5]@2 [a4,a5]@2 [c#4,c#5]@2 [c#4,c#5]!2",
  X: "[c#4,c#5]!4 [c#4,f#4]!2 [c#4,f#4]@2", Y: "[f#4,b4]!2 [d4,d5]!2", Z: "[e4,e5]!4 [f#4,f#5]!2 ~@2",
  AA: "[f#4,f#5]@2 [c#4,c#5]!2 ~@2 [c#4,c#5]!2", AB: "[c#4,c#5]!3 [c#4,f#4] ~@3 f#4",
  AC: "[f#4,b4]@2 [f#4,b4] [d4,d5]@2 [d4,d5]!3", AD: "[e4,e5]!4 [f#4,f#5] [f#3,f#4] ~@2",
  AE: "[d4,a4,d5]@2 [d5,a5,d6]!2 [d4,a4,d5]@2 e4 f4, ~@3 c6", // D5
  AF: "[f#4,f#5]@2 [a5,c#6,f#6]!2 [c#5,c#6]@2 c#5!2, ~ [f#4,f#5] ~ f#6", // F# F#m C# F#
  AG: "~@2 [a5,c#6,f#6]!2 ~@2 [g#4,g#5] [a4,a5], ~@3 [d#6,g#6]", // F#m G# A G#5
  AH: "[g#4,g#5]@2 [c6,f6]!2 [g#4,g#5] [f4,f5] [f4,f5,c6,f6]@2, ~ [g#4,g#5] ~@2", // G# F5 G# F F5 G#
  AI: "[f4,f5]@2 [d5,a5,d6]!2 ~@2 [e4,e5] [f4,f5], ~@3 e6", AJ: "[f4,d5,f5,a5] [d#5,a#5] [e5,b5] [f5,c6]",
  AK: "[f#4,c#5,f#5] ~@2 [c#5,f#5] f#4 ~@3", AL: "[d4,a4,d5] ~@2 [a4,d5] d4 ~@3", AM: "[e4,b4,e5] ~@2 [b4,e5] e4 ~@3",
  AN: "~@2 [a4,c#5,f#5]!2 ~@2 [a4,c#5,f#5]@2", AO: "~@2 [a4,c#5,f#5]!2 ~@2 [g#4,d#5,g#5]@2",
  AP: "~@2 [f4,c5,f5]!2 ~@2 [f4,c5,f5]@2", AQ: "~@2 [d4,a4,d5]!2 ~@2 [e4,e5]@2",
  AR: "[e4,b4,e5] ~@2 [b4,e5] e4 ~ [e4,e5] [f4,f5]", // E5 E F
  AS: "[f#4,c#5,f#5]@2 [f#4,c#5,f#5]@2 [g#4,c#5,g#5]@2 [g#4,c#5,g#5] [a4,c#5,f#5,a5]", AT: "~@3 [a4,a5]",
  AU: "[g#4,g#5]@2 [g#4,g#5]@2 [g#4,g#5] [f4,f5] [f4,f5]@2", AV: "[f4,f5]@6 [e4,e5] [f4,f5]",
})).s("gm_piano").gain(0.3)

// chords · piano · soft notes
const piano_soft = note("<~@120 A B C D A B C E>".pickRestart({
  A: "[f#4,c#5,f#5]@2 [f#4,c#5,f#5]@2 [g#4,c#5,g#5]@2 [g#4,c#5,g#5] [a4,c#5,f#5,a5]", B: "~@3 [a4,a5]",
  C: "[g#4,g#5]@2 [g#4,g#5]@2 [g#4,g#5] [f4,f5] [f4,f5]@2", D: "[f4,f5]@6 [e4,e5] [f4,f5]", E: "[f4,f5] ~",
})).s("gm_piano").gain(0.2)

// other · violin
const violin = note("<~@72 A B C D A E F G H ~ I J K L M J K N O J H ~ I ~@9 A B C D A E F G ~@16>".pickRestart({
  A: "f#4@2 a4@2 a4@2 g#4 f#4", B: "e4@2 f#4@2 ~@2 f#4 g#4", C: "a4@2 f#4@2 b4 a4 g#4@2", D: "a4 g#4",
  E: "b4 c#5 f#4@2 f#5@2 f#4@2", F: "a4 b4 c#5@2 c#5 e5 g#5@2", G: "a5 g#5", H: "f#5", I: "f5",
  J: "a5 g#5 f#5@2 d5@2 e5 f5", K: "a5 f#5 c#5 c#6 a5 f#5 c#5 g#5", L: "a5 f#5 c#5 a5 e6 f#6 c#6 a5", M: "[g#5,c6]",
  N: "a5 f#5 c#5 a5 e6@2 f#6@2", O: "[g#6,c7]",
})).s("gm_violin").gain(0.22)

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

// drums · hihat
const hihat = s("hh").struct("<~@8 A@7 B A@15 C A@31 C A@31 C A@16 ~@16>".pickRestart({
  A: "x ~ x!2 ~ x!2 ~", B: "x!8", C: "x ~@3 x ~@3 x ~ x!3 ~ x ~",
})).gain(0.1)

stack(piano, piano_soft, violin, snare, hihat)