Strudelify

over the rainbow

Israel Kamakawiwo'ole

KeyB♭ majorTempo70 bpm
0:00/0:00
// over the rainbow — Israel Kamakawiwo'ole
// 70 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 2/4 at bar 5, 4/4 at bar 6) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/5910459; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 63 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(70/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 · soprano sax · "B♭ Trumpet 1"
const soprano_sax = note(`<
  ~@6 A ~@3 B C D E F G H I J K L M N O ~@4 P E Q@2 H I J K R S T U H V J K W ~@2 X Y Z AA AB AC E AD@2 H AE J AF AG AH
  AI
>`.pickRestart({
  A: "~ g4@2 gb4", B: "~ eb4 eb4@2", C: "ab3@2 f4 e4", D: "c4@6 ~@4 bb3 c4 db4 eb4 f4 g4", E: "ab4@6 g4 ab4 ab5@8",
  F: "g5@6 eb5 f5 g5@4 ab5@4", G: "ab4 f5", H: "eb5", I: "f4@8 db5@6 eb5 db5", J: "c5@2 ab4 bb4 c5@2 db5@2",
  K: "bb4@2 g4 ab4 bb4@2 c5@2", L: "ab4@7 ~", M: "~ eb4 ab4 g4", N: "~ ab4 bb4 ab4", O: "g4 ~", P: "bb4@4 g4@3 ~",
  Q: "[g5@4 eb5 f5 ~ g5 g5@2 ~@2 ab5@6 ~@2 ab4@4 f5@8]/2", R: "ab4 ~", S: "ab4@4 bb4 [c5,db5] eb5 [f5,g5] ab5@8",
  T: "g5@4 eb5 f5 ~ g5 g5@2 ~@2 ab5@4", U: "~ ab4 f5@2", V: "f4 db5", W: "ab4@3 ~", X: "~@4 f5@3 ~",
  Y: "~@4 c5 eb4 bb4 db4", Z: "c4 eb4 c4 eb4 c4 eb4 c4 eb4", AA: "db4 eb4 db4 eb4 db4 eb4 f4 g4",
  AB: "ab4@4 ab4 bb4 c5 db5", AC: "ab5@3 ~", AD: "[g5@4 eb5 f5 ~ g5 g5@4 ab5@6 ~@2 ab4@4 f5@8]/2",
  AE: "f4@6 e4 f4 db5@8", AF: "bb4@3 ~ g4@2 ab4@2 bb4@4 c5@4", AG: "ab4", AH: "ab4@6 ab4 ~", AI: "ab5",
})).s("gm_soprano_sax").gain(0.3)

// other · tenor sax · "Tenor Saxophone"
const tenor_sax = note(`<
  A@4 B C D E F G H I J K L E M N O P Q ~ R S T U V W X Y Z@2 M AA AB P AC AD AE AF M AA AB P AG AH AI AJ AK AL AM ~ AN
  Y AO@2 M AA AP AQ AR AS AT
>`.pickRestart({
  A: "[~@10 eb4@4 f4@4 eb4@4 ~@4 eb4@4 gb4@4 eb4@4 ~@4 eb4@2 eb4 e4 f4@4 c4@4 d4@9 ~]/4", B: "eb4 ~ g4@6 ~@8",
  C: "~@2 c4 eb4", D: "eb4@2 c4 d4 eb4@2 c4@2", E: "db4 ab3 eb4 db4 c4@2 b3@2", F: "c4@2 eb4 ab3", G: "f3 db4",
  H: "c4@2 ab3 bb3 c4@2 db4@2", I: "bb3@2 g3 ab3 bb3@2 c4@2", J: "ab3 eb4 db4 ab3 bb3 ~@3",
  K: "ab3 eb4 ab3 g3 f3 c4 g4 f4", L: "g4@3 gb4", M: "eb4 ~", N: "db4 ab3 f4 db4 db4@4", O: "db4 ~ db4@2", P: "d4 eb4",
  Q: "eb4@2 ab4 bb4 c5@2 eb4 ~", R: "bb3", S: "c4@3 ~", T: "~@6 g4 db4",
  U: "c4@2 eb4@2 c4@2 eb4!2 c4@2 db4@2 c4@2 c4 db4", V: "d4@2 f4@2 d4@2 f4!2 d4@2 f4@2 d4@2 eb4 f4", W: "eb4 d4",
  X: "bb3 db4 f4 ab4 db4@3 ~", Y: "c4 c5", Z: "[g4@5 ~ gb4@3 ~ eb4 db4 c4@2 b3@2]/2", AA: "~ e4", AB: "ab4 ~ f4@2",
  AC: "eb4@4 ~ db4 bb3 g3", AD: "eb4 f4", AE: "eb4@4 eb4 f4 ~ g4 g4@2 ~@2 ab4@4", AF: "~@2 eb4 db4 c4@2 b3@2",
  AG: "eb4@3 ~", AH: "~@8 f4@2 g4 f4 ~@4, ~ eb4@2 ~", AI: "~@4 eb4@4 f4@2 g4 f4 eb4@4", AJ: "~@4 g4@3 ~",
  AK: "g4@6 ab4 g4 f4@4 e4@4", AL: "~ db4 f4 db4", AM: "bb3 f4 eb4 ~", AN: "c5@3 ~", AO: "[g4@6 gb4@3 ~@7]/2",
  AP: "~ eb4", AQ: "d4@3 ~@5 db4@8", AR: "eb4@3 db4", AS: "c4@4 ab3@6 g3 ab3 ab4@4", AT: "eb4",
})).s("gm_tenor_sax").gain(0.25)

// other · baritone sax · "Baritone Saxophone"
const baritone_sax = note(`<
  A@5 B C D E F G H I J K ~ L M N O P Q R Q S T U V W X Y@2 Z AA AB O AC AD AE ~ Z AA AB O AF AG AH AI AJ AK AL AM AN AO
  AP@2 L AQ AR AS T AT Q
>`.pickRestart({
  A: "[~@6 ab2@16 gb2@16 ab2@16 ~@2 bb2@2 bb2@4 ~ eb3@9 ~@8]/5", B: "~ eb4 ab3 g3 f3@2 c4@2", C: "c4@3 ab3", D: "f2 g2",
  E: "bb2 ab2 g2 gb2", F: "~@2 bb3 ab3", G: "eb4!2 f4@2", H: "f4@2 f3 g3", I: "eb4@5 ~@3", J: "ab2 f2", K: "c3@3 ab2",
  L: "c3 ab2", M: "db3 f3", N: "~ g3 f3@2", O: "bb3 db4", P: "ab3@13 ~@3", Q: "ab2",
  R: "db4@2 eb4@4 db4 eb4 db4@2 eb4@2 db4@2 eb4@2", S: "eb4@6 f4 e4 eb4@2 db4@2 c4@2 bb3@2", T: "ab3", U: "b3",
  V: "c4 b3", W: "db4@4 b3@3 ~", X: "ab3 eb4 ab3 g3 f3 c4 g4 f4", Y: "[c4@4 c4 ~ ab3@3 ~@7]/2", Z: "c4 ab3",
  AA: "db4 ab3 eb4 db4 db4@4", AB: "eb4!2 eb4@2", AC: "ab3 eb4 c4@2 eb4@4", AD: "ab2 eb3 ab2 g2 f3 c4 g4 f4",
  AE: "c4@5 ~ ab3@2", AF: "ab3 eb4 ~@6", AG: "ab2@3 f2", AH: "eb2", AI: "ab2@3 ~ eb2@3 ~",
  AJ: "eb2@8 db2@2 db2 ~ db2@2 db2 ~", AK: "ab2 eb2 ab2 eb2 ab2 eb2 ab2 eb2", AL: "bb2 eb2 bb2 eb2 bb2 eb2 eb4@2",
  AM: "ab3 eb4 ab3 bb3 db4@2 eb4@2", AN: "ab4@3 ~", AO: "~@8 f2 ab2 ~ c3 g3@2 f3@2",
  AP: "[c4@6 ab3@3 ~ eb3 db3 c3@2 b2@2]/2", AQ: "~ db3", AR: "eb3!2 db3@2", AS: "bb2@3 ~@5 eb2@8",
  AT: "ab2@6 g2 ab2 ab3@8",
})).s("gm_baritone_sax").gain(0.25)

stack(soprano_sax, tenor_sax, baritone_sax)