Strudelify

Lara's Theme From Dr. Zhivago

Roger Williams

KeyG majorTempo98 bpm
0:00/0:00
// Lara's Theme From Dr. Zhivago — Roger Williams
// 98 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 95 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(98/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.

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  A@3 B@5 C@2 D E F G H I J K L E F G H I J K M N@2 O P Q@2 R S E F G H I J K L E F G H I J T U E F G H I J K L E F G H
  I J K M N@2 O P Q@2 R S E F G H I J K L E F G H I J V@2 W@4
>`.pickRestart({
  A: "[~@23 d#5@3 d5@3 c5@5 a#4@3 [g4,a#4]@3 [a4,c5]@3 [g4,a#4]@3 a4@6 g4@3 e4@2 f4@2 ~ g4@3 a#4@9, ~@22 [a3,c4]@9 ~@6 [g3,d4]@9 [a#3,f4]@9 ~@17, ~@22 f4@7 [d3,d#4,f4]@9 ~@17 [a2,g3,c4]@17, ~@22 d5@3 ~@47]/3", // Gm Am Gm Am G5 A#5 Dm Am7
  B: "[a4@3 f5@3 d#5@3 d5@8 d4@3 a#4@3 a4@3 f#4@3 g4@3 d#5@2 d3@3 b3@3 a3@3 g#3@3 a3@3 d4@3 g4@3 d#5@3 d5@2 c5@3 b4@3 d5@3 d#3@3 d#4@3 d4@3 c4@3 g3@2 d#3@3 g4@3 g#4@3 g4@2 f4@6 d#4@2 ~ [c4,d#4]@2 [d4,f4]@3 [c4,d#4]@3 d4@5 ~ c4@3, [d3,c4,f#4]@17 [g2,d3,a#3]@17 ~@18 [c3,g3,d#4]@17 ~@17 [d3,f3,b3]@8 [g2,g#3,b3]@8 ~ [c3,g3]@8 [d#3,g3]@9, ~@6 f#5 ~@27 [f#4,c5,d5]@17 ~@18 [g4,c5]@17 ~@34]/5", // Cm Dm Cm D7 Gm Cm Bdim G …
  C: "[[g3,b3]@3 [b3,d4]@3 [d#3,c#4,e4]@3 [d3,b3,f4]@29 c4@3 ~ d4@3 e4@3, g2@13 ~@3, f3@3 ~@16 [a2,g3]@5]/2", // G Bm C#m Bdim A7
  D: "[d2,a3,c4,f#4]@23 ~", E: "~@7 [f#4,a#4], g2@3 d2, [g3,b3]@4 [b3,d4]@3 ~, ~ d3@3",
  F: "g2 d3 e3 f#3 a3 g3 f#3 e3, [g4,b4]", G: "f#4@4 a4@4 g4@4 b2@6 ~@3 c#4@3, [g2,d3,b3] g3, ~@4 d4@3 ~, ~@3 a#2",
  H: "a2@3 e3 d3@2 d2@2, [f#3,c4]", I: "~@7 e4, g3, a2@3 a2, c4@4 d4@3 ~, ~ e3@3",
  J: "d2 a2 d3 e3 f#3 e3 d3@2, [a3,c4,f#4]", // F#dim
  K: "e4@4 d4@4 c#4@4 d3@6 ~@3 [e4,f#4,c5]@3, [a2,e3,g3]@4 [f#3,c4,d4]@3 ~, ~@3 d2", L: "g2@3 e3 d3@2 d2@2, [d4,g4,b4]",
  M: "g2@3 a3 g3@2 g2@2, [d4,g4,b4]", // G
  N: "[c3@3 g3@3 d4@3 g3@3 c3@3 g3@3 a4@2 ~@2 f#4@2, [c4,e4] [e4,g4]@2 e4, ~@6 c4 g3, ~@10 g4 ~]/2", // C Em
  O: "c3 ~@2 g3, [e4,g4] [c4,e4], ~ g3@2 ~", P: "g2 d3 g3 d3, [b3,d4]",
  Q: "[a#2@6 f3@6 c4@6 f3@6 a#2@6 ~@3 [d4,f#4]@3 g4@4 f#4@4 g4@4, [a#3,d4]@2 [d4,f4]@3 a#3 [a#2,d4]@2]/2", // D A# Dm A#
  R: "f2 c3 f3 c3 a#2 f3 a#3 f3, [c4,f4,a4] [d4,f4,a#4]", S: "a2@3 d#3 d3@2 d2@2, [c4,f#4,c5]",
  T: "e4@4 d4@4 c#4@4 d3@6 ~@3 [c4,d4,f#4]@3, [a2,e3,g3]@4 [f#3,c4]@3 ~, ~@3 d2", // D7 A7 F#dim
  U: "g2@3 e3 d3@2 d2@2, [b3,d4,g4]@3 ~", // G
  V: "[e4@2 d4@2 c#4@2 d3@2 e3@2 d3@2 d2@3 ~@6 d3@3, [a2,e3,g3] [f#3,c4]@2 [c4,d#4,f#4,a4], ~@5 d3@2 ~]/2", // A7 F#dim Cdim
  W: "[g2@3 d3@3 e3@3 f#3@3 ~ a3@3 g3@4 f#3@4 a3@4 ~@4 b4@4 d5@4 ~ [f#5,a#5]@4 ~@8 g2@25 ~@18, [d4,g4]@31 ~@17, b3@13 ~@15 g3@25 ~@43, ~@45 [g5,b5]@34 ~@17]/4", // F# G5 G
})).s("gm_string_ensemble_1").gain(0.24).pan(0.7)

// other · vibraphone
const vibraphone = note("<~@51 A B C D E F G H I B J D K F L H ~@28>".pickRestart({
  A: "b4@4 d5@3 a#5", B: "g5 [g5,b5] b5 g5 [g5,b5] b5 g5 [g5,b5] b5 g5 [g5,b5] b5 ~@12",
  C: "f#5@4 a5@4 g5@4 d5@9 c#5@3", D: "c5 [c5,e5] e5 c5 [c5,e5] e5 c5 [c5,e5] e5 c5 [c5,e5] e5 ~@12", E: "c5@4 d5@3 e5",
  F: "f#5 [f#5,a5] a5 f#5 [f#5,a5] a5 f#5 [f#5,a5] a5 f#5 [f#5,a5] a5 ~@12", G: "e5@4 d5@4 c#5@4 c5@9 c6@3",
  H: "b5 [b5,d6] d6 b5 [b5,d6] d6 b5 [b5,d6] d6 b5 [b5,d6] d6 ~@12", I: "b4@12 d5@8 ~ a#5@3",
  J: "f#5@4 a5@4 g5@3 ~ d5@8 ~ c#5@3", K: "c5@11 ~ d5@8 ~ e5@3", L: "e5@4 d5@4 c#5@3 ~ c5@9 c6@3",
})).s("gm_vibraphone").gain(0.48).pan(0.3)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@11 A@3 B C B D E@3 F G C B H E I@3 E J@2 K B E@2 F B L M N E@3 F O L P Q E A@3 B C B D E@3 F G C B H E I@3 E J@2 K B
  E@2 F B L M N E@3 F O L P Q P R@2 ~@2
>`.pickRestart({
  A: "g2 [g3,b3,d4] g2 [g3,b3,d4]", B: "d3 [a3,d4,f#4] d3 [a3,d4,f#4]", C: "a2 [a3,c4,e4] a2 [a3,c4,e4]",
  D: "a2 [a3,c4,e4] d3 [a3,d4,f#4]", E: "g2 [b3,d4,g4] g2 [b3,d4,g4]", F: "g2 [b3,d4,g4] g2 [a#3,c#4,g4]",
  G: "a2 [a3,d4,f#4] d3 [a3,d4,f#4]", H: "a2 [g3,a3,c4,e4] d3 [c4,d4,f#4,a4]", I: "c3 [g3,c4,e4] c3 [g3,c4,e4]",
  J: "a#2 [a#3,d4,f4] a#2 [a#3,d4,f4]", K: "f2 [a3,c4,f4] a#2 [a#3,d4,f4]", L: "a2 [g3,a3,c4,e4] a2 [g3,a3,c4,e4]",
  M: "d3 [c4,d4,f#4,a4] d3 [c4,d4,f#4,a4]", N: "a2 [g3,a3,c4,e4] d3 [a3,c4,f#4]", O: "d3 [a3,c4,f#4] d3 [a3,c4,f#4]",
  P: "d3 [a3,c4,d4,f#4] d3 [a3,c4,d4,f#4]", Q: "a2 [g3,a3,c4,e4] d3 [a3,c4,d4,f#4]", R: "[[g2,b3,d4,g4]@7 ~@5]/2",
})).s("gm_acoustic_guitar_steel").gain(0.19).pan(0.7)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@11 A@2 B C D E F G@2 H I J K L M I N@2 O P Q R S T U H V T W T X H G@2 P J W T Y Z A@2 B C D E F G@2 H I J K L M I
  N@2 O P Q R S T U H V T W T X H G@2 P J W T M AA AB@2 ~@2
>`.pickRestart({
  A: "g1@9 g1 ~@2 g1@10 ~@2", B: "g1@8 ~ g1@2 ~ g1@11 ~", C: "d2@8 ~ d2 ~@2 d2@7 ~@5", D: "a1@8 ~ a1@2 ~ a1@11 ~",
  E: "d2@8 ~ d2@2 ~ d2@9 ~@3", F: "a1@9 a1@2 ~ d2@9 d2@2 ~", G: "g1@8 ~ g1 ~@2 g1@10 ~@2", H: "g1@8 ~ g1 ~@2 g1@11 ~",
  I: "g1@8 ~ g1 ~@2 g1@12", J: "d2@8 ~ d2 ~@2 d2@12", K: "a1@7 ~@2 a1 ~@2 a1@12", L: "d2@7 ~@2 d2 ~@2 d2@11 ~",
  M: "a1@8 ~ a1@2 ~ d2@8 ~ d2@2 ~", N: "c2@8 ~ c2 ~@2 c2@11 ~", O: "c2@8 ~ c2 ~@2 c2@10 ~@2",
  P: "g1@7 ~@2 g1 ~@2 g1@12", Q: "a#1@8 ~ a#1 ~@2 a#1@11 ~", R: "a#1@7 ~@2 a#1 ~@2 a#1@12",
  S: "f1@8 ~ f1@2 ~ a#1@8 ~ a#1@2 ~", T: "d2@8 ~ d2 ~@2 d2@11 ~", U: "g1@7 ~@2 g1 ~@2 g1@11 ~",
  V: "g1@8 ~ g1@2 ~ g1@12", W: "a1@8 ~ a1 ~@2 a1@12", X: "a1@8 ~ a1@2 ~ d2@12", Y: "a1@8 ~ a1@2 ~ d2@8 ~ d2@3",
  Z: "g1@8 ~ g1 ~@2 g1@9 ~@3", AA: "d2@9 d2@2 ~ d2@12", AB: "[g1@15 ~]/2",
})).s("gm_electric_bass_finger").gain(0.5).pan(0.3)

// drums · kick
const kick = s("bd").struct("<~@11 [x ~@2 x!2 ~@3]!80 x ~@3>").gain(0.32)

// drums · crash
const crash = s("cr").struct("<~@19 A ~@7 A ~@3 A ~@3 A ~@15 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@7 A ~@3>".pickRestart({
  A: "x",
})).gain(0.32)

// drums · bongos
const bongos = s("bongo:18").struct("<~@11 [x ~ x!2 ~@2 x ~@2 x ~@2]!80 ~@4>").gain(0.5)

// drums · congas
const congas = s("conga:18").struct("<~@11 [~@3 x ~ x ~@3 x ~@5 x ~@5 x ~@2]!80 ~@4>").gain(0.61)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@11 [x!4]!80 ~@4>").gain(1.61)

// drums · shaker
const shaker = s("sh").struct("<~@11 [~ x ~ x ~ x ~ x]!80 ~@4>").gain(0.32)

// drums · woodblocks
const woodblocks = s("woodblock:4").struct("<~@11 [~@3 x]!80 ~@4>").gain(0.46)

stack(
  string_ensemble_1, vibraphone, acoustic_guitar_steel, bass, kick, crash, bongos, congas, cabasa, shaker, woodblocks
)