Strudelify
KeyB♭ majorTempo50 bpm
0:00/0:00
// jurassic park theme — John Williams and Micheal Giacchino
// 50 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 (6/4 at bar 1, 3/4 at bar 3, 6/4 at bar 4, 4/4 at bar 5, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: ch 5 "Bass" named as a bass, played on electric bass finger (its string ensemble 1 patch is not one)
// note: Transcription provider: pdmx. https://musescore.com/score/1066251; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 62 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(50/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 · string ensemble 1 · "Violin II"
const string_ensemble_1 = note(`<
  ~@3 A B@2 ~@2 C D E F@7 G@2 H@2 I J@4 K@3 ~@2 L M N O P O N Q R S T U V W X Y@2 Z AA AB AC@4 AD@3 AE@3
>`.pickRestart({
  A: "~ bb4@13 f5@4 ~ a5@6 bb5 ~ a5 f5@4",
  B: "[bb5@7 f5 c6 gb5@4 ab5@4 ~ bb5@2 bb5 a5 f5@7 f5@2 eb5@2 bb4@2 ~ c5@4 ~@24]/2", C: "~@13 bb3@3",
  D: "bb3 bb3@3 a3 a3@8 bb3@3", E: "~ a3@4 f4@4 f4@2 f4@2 g4@3",
  F: "[~ g4@2 g4@2 f4@3 a4 a4@3 bb4 bb4@6 f4!2 a4@3 f4 c4@2 f4 bb4 a4@6 bb4 f4 bb4@3 bb4 bb4@3 a4 a4@6 bb4 a4 f5@2 bb4@2 bb4@2 bb4 a4 f5@2 bb4@2 bb4@2 bb4 a4 f5 bb4@3 f4@2 f4@2 eb5@6 bb4 a4 f5@2 bb4@2 ab4@2 bb4 a4 f5@2 bb4@2 ab4@2 bb4 a4 f5@2 ~@8 c5]/7",
  G: "[b4@2 c5@4 bb4@2 a4@2 ~@2 bb4@2 ~ bb4@5 c5@2 c5@5 g4 ~ a4 d5@5 c5@5 bb4@10 bb4@5 c5@5 a4@4]/2",
  H: "[~ bb4@5 g4@7 g4@2 ~ a4@5 a4@5 ~@2 bb4@2 ~ bb4@5 c5@2 c5@7 ~ d5@5 c5@5 bb4@8]/2",
  I: "~@2 bb4@5 c5@5 a4@5 g4@5 ~@2 a4@2 ~@3 a4@2 ~",
  J: "[d5@10 ~@2 f4@2 ~ g4@2 f4 e4 f4@2 ~ e4@2 d4@5 ~@2 f4@2 ~ g4@2 f4 e4 f4@2 ~ c4@2 d4@5 ~@3 bb4@2 bb4@5 c5@2 ~ c5@5 g4 a4 d5@5 c5@5 bb4@10 bb4@5 c5@5 a4@5 bb4@5 g4@7 ~ g4@2 a4@5 a4@5]/4",
  K: "[~@3 bb4@2 bb4@5 c5@2 ~ c5@5 g4 a4 d5@5 c5@5 bb4@10 bb4@5 c5@5 a4@5 g4@5 ~@3 a4@2 ~@3 a4@2 f5@10 ~@16]/3",
  L: "~@8 bb3@3 bb3 bb3@3 a3", M: "a3@2 bb3 a3", N: "f4", O: "eb4", P: "f4 bb4", Q: "bb4 f4@3", R: "bb4",
  S: "bb4!2 bb4@2", T: "a4@2 bb4@2 a4@2 g4@2 a4@4 g4@3 d4", U: "d4 c4 bb3@2 f4@4",
  V: "a4@2 bb4@2 a4@2 g4@2 a4@4 g4@3 eb4", W: "d4@4 f4 eb4 d4 bb3", X: "g4@2 f4 eb4 f4@4",
  Y: "[~@2 f4@2 ~ g4@2 f4 e4 ~ f4@2 e4@2 d4@5 ~@2 f4@2 ~ g4@2 f4 e4 ~ f4@2 c4@2 d4@2 ~ f4!2 f4@3 bb4@2 a4@2 bb4@3 f4@3 g4@3 ~@2 a4@2 bb4@3 g4@3, ~@55 bb4@2 ~@7]/2",
  Z: "~ f4@3 d4@3 bb4@3 ~@2 bb4@2 c5@3 bb4@2 a4@2 bb4@3 f4@3 g4@5, ~@11 c5@2 ~@19",
  AA: "f4@2 f4@3 f4@3 ~ ab4@10 f4@3 g4@5 f4@2 eb4@3",
  AB: "g4@3 c5@10 f4@3 ~ f5@3 bb4@3 bb4@3 ~@2 a4@2 f5@2, ~@27 bb4@2 ~@3",
  AC: "[~ bb4@3 ~ bb4@3 bb4@2 ~ f5@2 bb4@5 f4@3 f4@3 ~ eb5@10 ~ a4@2 f5@3 bb4@3 ~ ab4@3 bb4@2 ~ f5@3 ~ bb4@3 ab4@3 bb4@2 a4@2 f5@3 ~@13 c5@2 b4@2 c5@3 bb4@2 ~ eb5@27 a4@3 bb4@3 ~ a4@3, ~@10 a4@2 ~@23 bb4@2 ~@13 a4@2 ~@38 a4@2 ~@36]/4",
  AD: "[g4@3 a4@7 g4@5 d4@2 d4@3 c4@3 bb3@7 f4@13 a4@3 ~ bb4@3 a4@3 g4@3 ~ a4@6 g4@5 eb4@2 d4@13 f4@3 ~ eb4@3 d4@3 bb3@3]/3",
  AE: "[~ g4@6 f4@3 ~ eb4@3 f4@13 eb4@27 d4@27 d4@3 ~@12]/3",
})).s("gm_string_ensemble_1").gain(0.4)

// other · string ensemble 1 · "Viola"
const string_ensemble_1_2 = note(`<
  ~@3 A B@3 C D E F G@6 H@3 I@2 J K@4 L@3 M N O P Q R Q R S@2 T S U V U W X Y@2 Z AA AB AC@7 AD AE@2
>`.pickRestart({
  A: "~ f4@4 eb4@9 f4@4 ~ g4@6 g4@2 ~ c5@4",
  B: "[bb4@7 a4@2 bb4@4 c5@7 ~@2 d5@7 f5@2 eb5@2 bb4@2 ~ c5@4 ~@18 f3@12 bb3@2 a3@2 g3@12 bb3@2 a3@2 f3@6]/3",
  C: "~ c4@4 bb3@6 bb3!2 c4@3", D: "a3 f3@2 d4 bb3 c4@6 f4 bb3 g3@3", E: "~@13 g3@3", F: "~ f3@4 d4@4 d4@2 d4@2 eb4@3",
  G: "[~ eb4@2 eb4@2 d4@3 f4 f4@3 g4 g4@6 d4!2 f4@3 c4 a3@2 d4 bb3 f4@6 f4 bb3 eb4@3 d4 d4@3 c4 c4@6 bb3 a3 d5@2 f4@2 eb4@2 bb3 a3 d5@2 f4@2 eb4@2 bb3 a3 d5 d5@3 f4@2 bb3@2 bb4@6 bb4 a4 d5@2 f4@2 bb4@2 bb3 a3 d5@2 f4]/6",
  H: "[~@2 bb4@4 bb3@2 a3@2 d5@4 f4@2 e4@2 f4@24 ~@2 bb3@2 ~ d4@5 c4@2 e4@5 g4 ~ a4 g4@5 f4@5 eb4@10 d4@5 f4@5 d4@4]/3",
  I: "[~ d4@5 eb4@7 eb4@2 ~ g4@5 e4@5 ~@2 bb3@2 ~ d4@5 c4@2 e4@7 ~ g4@5 f4@5 eb4@8]/2",
  J: "~@2 d4@5 f4@5 d4@5 eb4@5 ~@2 g4@2 ~@3 g4@2 ~",
  K: "[gb4@10 [a4,c5]@17 [a4,c5] ~ [f4,bb4,c5]@7 [f4,bb4,c5]@2 [f4,bb4,c5]@10 ~@3 bb3@2 d4@5 c4@2 ~ e4@5 g4 a4 g4@5 f4@5 eb4@10 d4@5 f4@5 d4@5 d4@5 eb4@7 ~ eb4@2 g4@5 e4@5]/4", // Am Fsus4
  L: "[~@3 bb3@2 d4@5 c4@2 ~ e4@5 g4 a4 g4@5 f4@5 eb4@10 d4@5 f4@5 d4@5 eb4@5 ~@3 g4@2 ~@3 g4@2 c4@10 f3@12 bb3@2 a3@2]/3",
  M: "g3@6 bb3 a3 f3@4 c4@4", N: "bb3@6 bb3!2 c4@3 a3 f3@2 d4 bb3", O: "c4@6 f4 bb3 g3@3 ~@5", P: "~@2 g3 f3",
  Q: "bb3@4 f3@3 f3 f3@4 bb3@4", R: "bb3@4 g3@3 g3 g3@4 g3@4", S: "bb3@4 bb3@3 bb3 bb3@4 bb3@4",
  T: "bb3@4 bb3@3 bb3 c4@4 c4@4", U: "f3@4 a3@3 a3 a3@4 g3@4", V: "bb3@3 bb3 bb3@2 bb3@2 bb3@4 bb3@4", W: "eb3 f3",
  X: "g3 a3", Y: "[[a4,c5]@17 [a4,c5] ~ [f4,c5]@7 [f4,c5]@2 ~ [f4,c5]@9 d4@10 d4@3 eb4@10 eb4@3]/2",
  Z: "~ d4@3 bb3@3 d4@3 ~ f4@3 f4@10 d4@3 bb3@5",
  AA: "bb3@2 a3@3 a3@3 ~ c4@3 f4@2 ~ eb4@3 ~ a3@3 bb3@5 bb3@2 bb3@3, ~@7 c4 ~@8",
  AB: "c4@2 ~ f4@10 c4@3 ~ d5@3 f4@3 eb4@3 ~@2 a3@2 d5@2, ~@2 eb4@2 ~@23 bb3@2 ~@3",
  AC: "[~ f4@3 ~ eb4@3 bb3@2 ~ d5@2 d5@5 f4@3 bb3@3 ~ bb4@10 ~ a4@2 d5@3 f4@3 ~ bb4@3 bb3@2 ~ d5@3 ~ f4@3 bb4@3 bb3@2 a3@2 d5@3 f4@2 ~ f4@20 f4@27 f3@7 a3@5 a3 a3@7 g3@7 bb3@5 bb3 bb3@3 ~ bb3@3 bb3@7 bb3@6 f3@7 a3@5 a3@2 a3@6 g3@7 eb3@13 f3@13, ~@10 a3@2 ~@23 bb4@2 ~@13 a3@2 ~@18 e4@2 ~@152]/7",
  AD: "~ g3@13 a3@13 ~@5", AE: "[~@2 bb3@3 f4@7 c4@3 g4@7 f4@27 f4@3 ~@12]/2",
})).s("gm_string_ensemble_1").gain(0.25)

// other · string ensemble 1 · "Cello"
const string_ensemble_1_3 = note(`<
  ~@3 A B@3 C D E@2 F@2 G H@4 I@2 J K L M N@3 O@3 P Q R S T U T U V W@2 X Y Z Y AA AB AC AD AE AF AG AH@2 AI@5 AJ@3
>`.pickRestart({
  A: "~ d4@4 c4@9 d4@4 ~ eb4@6 eb4@2 ~ f4@4",
  B: "[eb4@7 f4@2 gb4@4 ab4@7 ~@5 f3@2 d4@2 c4@2 f4@4 ~ d4@4 ~@2 f3@2 ~ c4@2 a3@2 g3@2 eb3 d3 c3@2 ~ f3@2 d3@12 d3@4 eb3@12 eb3@4 d3@6]/3",
  C: "~ f3@4 f3@6 f3@2 f3@3", D: "~ f3@2 f3@2 f3@6 d3@2 eb3@3",
  E: "[f3 f3@3 f3 f3@4 f3@6 f3@4 f3@2 f3@4 f3@2 f3@2 eb3@3]/2",
  F: "[~ eb3@2 eb3@2 f3@4 f3@3 g3 g3@6 f3@2 f3@4 f3@2 bb2@2 f3@3]/2", G: "~ f3@2 d3@2 g3@3 f3 f3@3 f3 f3@3",
  H: "[~ f2@4 bb2@2 bb2@2 eb3@2 eb2@2 bb2@2 bb2@2 eb3@2 eb2@2 bb2@2 bb2@2 bb2@2 bb2@2 eb3@6 f3@2 bb2@2 bb2@2 eb3@2 eb2@2 bb2@2 bb2@2 eb3@2 eb2@2 bb2@4 bb2@4 f3@3]/4",
  I: "[~@2 bb3@8 bb2@7 bb2 ~ bb2 bb2@2 bb2 ~ bb2 bb2@2 bb2@2 ~ g3@5 f3@5 eb3@10 g3@5 f3@5 d3@4]/2",
  J: "~ g3@5 eb3@7 eb3@2 ~ a3@5 a2@5 bb2@6", K: "~ bb2 ~ bb2 bb2@2 bb2 ~ bb2 bb2@2 bb2@2 ~ g3@5 f3@5 eb3@8",
  L: "~@2 g3@5 f3@5 d3@5 c3@5 ~@2 d3@2 ~@3 d3@2 ~", M: "~@2 d3@2 ~ d3@2 d3@2 ~@6 f2@14 ~@3",
  N: "[~@2 f2@9 f2@2 ~ f2@2 bb2@7 ~ bb2!2 bb2@2 ~ bb2!2 bb2@2 ~ bb2@2 g3@5 f3@5 eb3@10 g3@5 f3@5 d3@5 g3@5 eb3@7 ~ eb3@2 a3@5 a2@5]/3",
  O: "[bb2@7 ~ bb2!2 bb2@2 ~ bb2!2 bb2@2 ~ bb2@2 g3@5 f3@5 eb3@10 g3@5 f3@5 d3@5 c3@5 ~@3 d3@2 ~@3 d3@2 ~@3 f3@2 f3@2 ~ f3@2 d3@12 d3@4]/3",
  P: "eb3@3 eb3 d3@2 f3@2", Q: "f3@3 f3 f3@2 f3!2", R: "f3@6 d3@2 eb3@3 f3 f3@3 f3", S: "f3@2 f3@3 f3@2 f3",
  T: "bb2@4 d3@3 d3 d3@4 bb2@4", U: "bb2@4 eb3@3 eb3 eb3@4 eb3@4", V: "bb2@4 f3@3 f3 f3@4 bb2@4",
  W: "bb2@4 f3@3 f3 g3@4 g3@4", X: "bb2@4 g3@3 g3 g3@4 g3@4", Y: "f2@4 f3@3 f3 f3@4 c3@4",
  Z: "g2@3 d3 d3@2 d3@2 bb2@4 f3@4", AA: "bb2 c3", AB: "eb3 f3", AC: "~@5 f2@14 ~@5 f2@8",
  AD: "~ f2@2 ~ f2@2 bb3@3 bb3@2 a3@2 bb3@3 bb3@3 eb3@3 ~@2 a3@2 bb3@3 eb3@3, ~@23 bb3@2 ~@7",
  AE: "~ bb3@3 f3@3 bb3@3 ~ bb3@3 bb3@3 bb3@2 bb3@2 bb3@3 bb3@3 bb3@5", AF: "~@2 f3@7 ab3@10 f2@3 g2@5 f2@2 eb2@3",
  AG: "c2@3 f2@10 f2@3 ~ bb2@3 bb2@3 eb3@3 ~ eb2@3 bb2@2",
  AH: "[~ bb2@3 ~ eb3@3 eb2@3 bb2@3 ~ bb2@3 bb2@3 bb2@3 ~ eb3@10 f3@3 bb2@3 bb2@3 ~ eb3@3 eb2@3 bb2@3 ~ bb2@3 eb3@3 eb2@3]/2",
  AI: "[~ bb2@6 bb2@7 f3@7 bb3@6 bb2@27 f2@7 f3@5 f3 f3@7 c3@7 g2@5 d3 d3@3 ~ d3@3 bb2@7 f3@6 f2@7 f3@5 f3@2 f3@6 c3@7 bb2@13 c3@13]/5",
  AJ: "[~ eb3@13 f3@13 f3@53 ~ f3@3 ~@12]/3",
})).s("gm_string_ensemble_1").gain(0.25)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@4 A@3 B C D@2 E F G H@6 I J K L M@3 N@3 O P Q R S@4 T@3 U V W V X Y Z AA AB AC AD AE@2 AF@5 AG@3
>`.pickRestart({
  A: "[~@11 bb2@9 bb2@9 bb2@8 eb2@8 bb2@3]/3", B: "~ bb2@4 bb2@4 bb2@2 bb2@2 f2@3", C: "~ f2@2 bb2@2 f2@6 d2@2 eb2@3",
  D: "[f2 f2@3 f2 f2@4 f2@6 f2@4 f2@2 bb2@4 bb2@2 bb2@2 eb2@3]/2", E: "~ eb2@2 eb2@2 bb2@4 bb2@3 g2 bb2@3",
  F: "~ bb2@2 bb2@2 f2@4 f2@2 f2@2 f2@3", G: "~ f2@2 d3@2 g2@3 f2 f2@3 f2 f2@3",
  H: "[~@2 f2@8 bb1@4 bb2@4 eb2@4 eb2@4 bb1@4 bb2@4 eb2@4 eb2@4 bb1@16 eb2@12 f2@4 bb1@4 bb2@4 eb2@4 eb2@4 bb1@4 bb2@4 eb2@4 eb2@4 bb1@32 bb1@7 bb1 ~ bb1 bb1@2 bb1 ~ bb1 bb1@2 bb1@2 ~ g2@5 f2@5 eb2@10 g2@5 f2@5 d2@4]/6",
  I: "~ g1@5 eb2@7 eb2@2 ~ a2@5 a1@5 bb1@6", J: "~ bb1 ~ bb1 bb1@2 bb1 ~ bb1 bb1@2 bb1@2 ~ g2@5 f2@5 eb2@8",
  K: "~@2 g2@5 f2@5 d2@5 c2@5 ~@2 d2@2 ~@3 d2@2 ~", L: "~@2 d2@2 ~ d2@2 d2@2 ~@6 f1@14 ~@3",
  M: "[~@2 f1@9 f1@2 ~ f1@2 bb1@7 ~ bb1!2 bb1@2 ~ bb1!2 bb1@2 ~ bb1@2 g2@5 f2@5 eb2@10 g2@5 f2@5 d2@5 g1@5 eb2@7 ~ eb2@2 a2@5 a1@5]/3",
  N: "[bb1@7 ~ bb1!2 bb1@2 ~ bb1!2 bb1@2 ~ bb1@2 g2@5 f2@5 eb2@10 g2@5 f2@5 d2@5 c2@5 ~@3 d2@2 ~@3 d2@2 ~@3 f2@2 f2@2 ~ f2@2 bb2@16]/3",
  O: "eb2@2 bb2!2", P: "bb2@2 bb2!2 f2@2 f2 bb2", Q: "f2@6 d2@2 eb2@3 f2 f2@3 f2", R: "f2@2 f2@3 f2@2 f2",
  S: "bb1@4 bb2@3 bb2 bb2@4 bb1@4", T: "bb1@4 d3@3 d3 eb3@4 eb3@4", U: "bb1@4 eb3@3 eb3 eb3@4 eb3@4",
  V: "f1@4 c3@3 c3 c3@4 c2@4", W: "g1@3 g2 g2@2 g2@2 bb1@4 d3@4", X: "eb1 f1", Y: "g1 a1", Z: "~@5 f1@14 ~@5 f1@8",
  AA: "~ f1@2 ~ f1@2 bb1@10 bb1@3 eb2@10 eb2@3", AB: "~ bb1@6 bb1@7 bb1@3 bb1@2 bb1@2 bb1@3 bb1@3 bb1@5",
  AC: "~@2 f1@7 ab1@10 f1@3 g2@5 f2@2 eb2@3", AD: "c2@3 f2@7 f1@7 bb1@3 bb2@3 eb2@3 ~ eb2@3 bb1@2",
  AE: "[~ bb2@3 ~ eb2@3 eb2@3 bb1@13 ~ eb2@10 f2@3 bb1@3 bb2@3 ~ eb2@3 eb2@3 bb1@3 ~ bb2@3 eb2@3 eb2@3]/2",
  AF: "[~ bb1@26 eb2@27 f1@7 c3@5 c3 c3@7 c2@7 g1@5 g2 g2@3 ~ g2@3 bb1@7 d3@6 f1@7 c3@5 c3@2 c3@6 c2@7 eb1@13 f1@13]/5",
  AG: "[~ g1@13 a1@13 bb1@53 ~ bb1@3 ~@12]/3",
})).s("gm_electric_bass_finger").gain(0.25)

stack(string_ensemble_1, string_ensemble_1_2, string_ensemble_1_3, bass)