Strudelify

The Love Theme

Barry John

KeyG majorTempo80 bpm
0:00/0:00
// The Love Theme — Barry John
// 80 bpm, 3/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: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 76 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/3)

// 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@2 B@3 ~@6 C D E@2 F@2 G H I@4 J K L@2 M@2 N@3 O@2 H P@2 Q@6 R@4 S@4 T@4 U@4 V@2 W@2 X@2 Y@2 Z@2 AA@2 AB@5
>`.pickRestart({
  A: "[~@22 [a4,c#5]@9 ~ b4@14 ~ [b4,d#5]@5 ~ [a4,c#5]@11, ~@31 d#5@14 ~@19]/2", // A B A
  B: "[[d5,f#5]@20 ~ [a4,c#5]@10 [b4,d#5]@45 ~@9 c#5@11]/3", C: "g5", D: "c5", E: "[a5@33 d6@31, f#5]/2",
  F: "[d5@31 e5@33]/2", G: "[b4,d5]", H: "[f#5,a5]", I: "[~@2 g5@29 c5@31 ~ [f#5,a5]@65, ~@2 e5@61 ~@65]/4",
  J: "[c5,e5]", K: "f#5, a4@29 ~@3", L: "[b4,d5]/2", M: "[[c5,e5]@31 ~ b4@32, ~@31 g5@32 ~]/2",
  N: "[~ d5@32 ~@2 c5@28 ~@2 [b4,d5]@31, f#5@65 ~@31]/3", O: "[[g4,e5]@31 ~ b4@32, ~@31 d5@33]/2",
  P: "[~ g5@31 c5@32, ~ e5@61 ~@2]/2", Q: "[~ b4@30 f#4@33 b4@31 f#4@32 b4@64 ~, ~ d5@190 ~]/6",
  R: "[~@6 f#4@10 ~ g#4@20 ~ b4@10 c#5@20 e4@11 f#4@20 ~ e4@10 f#4@14 ~@4]/4",
  S: "[~@5 f#4@10 ~ g#4@20 ~ b4@11 c#5@20 e4@11 f#4@20 ~ e4@11 f#4@16 ~]/4",
  T: "[~@5 f#4@10 ~ a3@21 g3@11 e4@21 g3@10 e4@21 ~ a4@11 b4@16]/4",
  U: "[~@5 f#4@10 ~ a3@21 g3@10 e4@21 ~ g3@10 e4@22 a4@10 ~ b4@15 ~]/4", V: "[~@6 b4@10 ~ f#5@45 ~@2]/2",
  W: "[~@6 b4@11 f#5@45 ~@2]/2", X: "[~@5 d#5@10 ~ f5@31 ~ a#5@5 ~ d#5@5 f5@4 ~]/2",
  Y: "[~@5 d#5@11 f5@32 a#5@5 d#5@4 ~ f5@3 ~@3]/2", Z: "[~@5 d#4@11 f4@31 ~ a#4@5 d#4@6 f4@5]/2",
  AA: "[~@6 d#4@10 f4@32 a#4@5 d#4@6 f4@5]/2", AB: "[~ d#4@149 ~@10]/5",
})).s("gm_string_ensemble_1").gain(0.19).pan(0.3)

// chords · string ensemble 1 · "STRINGS" · soft notes
const string_ensemble_1_soft = note("<~@4 A B@2 ~@4 C D ~ E ~ F ~@59>".pickRestart({
  A: "~@21 a4@11", B: "[[b4,d#5]@11 ~@5]/2", C: "~ e5@29 ~@2", D: "e5", E: "~ c5@31", F: "g4",
})).s("gm_string_ensemble_1").gain(0.1).pan(0.3)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~@11 A B C@2 D E F G H I J@2 K L M N O P Q R S T U C V W X Y Z@4 AA AB@8 AC@4 AD AE@2 AF AG AH AI AJ@2 AK@5 AL AM@5
>`.pickRestart({
  A: "~@11 e3@20 ~, ~ c2@31, ~@3 g2@13", B: "~@11 c4@21, a2, ~@5 e3@27", C: "~@11 f#3@21, ~ d2@31, ~@3 a2@13",
  D: "~@11 b3@21, g2@31 ~, ~@5 d3@26 ~", E: "~@10 e3@21 ~, c2@31 ~, ~@5 g2@26 ~", F: "~@10 b3@21 ~, g2, ~@5 d3@27",
  G: "~@11 f#3@21, d2, ~@3 a2@13", H: "~@3 e3@5, ~ c2@30 ~, ~@6 g2@25 ~", I: "~@11 c4@20 ~, a2@31 ~, ~@5 e3@26 ~",
  J: "[~@10 f#3@20 ~@12 f#3@11 ~@11, d2@31 d2@22 ~@11, ~@5 a2@26 ~@6 a2@16 ~@11]/2",
  K: "~@21 a3@11, ~@3 a2@13, ~@11 e3@21, ~ c4", L: "~@11 d3@5, ~@3 d2@13, ~@11 a2@21, ~ f#3",
  M: "~@21 g3@11, ~@3 g2@13, ~@11 d3@21, ~ b3", N: "~@11 g3@5, ~@3 g2@13, ~@11 d3@21, ~@17 b3@15",
  O: "~@21 a3@10 ~, ~ a2@31, ~@6 e3@25 ~, ~@11 c4@20 ~", P: "~@11 e3@5, e2, ~@5 b2@27, ~@5 g3@11",
  Q: "~@11 f#3@5, ~ b2@31, ~@3 a3@13, ~@3 d4@5", R: "~@17 a3@5 ~@5 f#3@5, ~ d2@10 ~@5, ~@7 a2@15 ~@10, ~@6 f#3@5 e3@5",
  S: "~@3 b3@5, ~ g2@31, ~@7 d3@25", T: "~@11 e3@21, ~ c2@31, ~@3 g2@13", U: "~@11 b3@21, g2, ~@3 d3@13",
  V: "~@3 e3@5, ~ c2@15, ~@7 g2@25", W: "~@11 c4@21, a2, ~@3 e3@13", X: "~@11 b3@20 ~, ~ g2@30 ~, ~@6 d3@25 ~",
  Y: "~@11 d4@21, b2, ~@5 f#3@26 ~",
  Z: "[~@11 b3@20 ~@11 d4@21 ~@44 b3@21, g2@31 ~@5 f#3@27 ~@5 d3@27 ~@6 d3@27, ~@6 d3@25 b2@32 g2@32 ~ g2@32, ~@73 b3@33 ~@22]/4",
  AA: "~@27 c#4@5, ~ [e2,b2]@31, ~@7 c#4@10 c#4@10 ~@5, ~@12 b3@10 b3@9 ~", // E5
  AB: "[~@26 c#4@5 ~@27 c#4@4 ~@21 b3@11 ~@28 c#4@5 ~@27 c#4@5 ~@27 c#4@4 ~@22 b3@10 ~@28 b3@4 ~ [g1,g2], b1@31 [a2,e3]@30 ~ [g2,d3]@33 [e2,b2]@32 b1@31 ~ [a2,e3]@30 ~ [g2,d3]@33 [d2,a2]@31 ~@2, ~@6 c#4@10 c#4@10 ~@10 c#4@11 c#4@11 ~@10 c#4@10 c#4@16 ~@7 c#4@11 c#4@10 ~@11 c#4@11 c#4@10 ~@10 c#4@11 c#4@11 ~@10 c#4@11 c#4@16 ~@11 a3@10 ~ a3@10 ~, ~@11 b3@10 b3@10 ~@11 b3@10 b3@9 ~@2 b3@10 b3@10 ~@24 b3@10 b3@10 ~@11 b3@11 b3@9 ~@12 b3@10 b3@9 ~@2 b3@10 b3@11 ~@17 b3@11 b3@10 ~@6]/8", // G A5 G5 E5 A5 G5 D5
  AC: "[~@26 b3@5 ~@27 b3@5 ~@22 a3@10 ~@27 b3@5 ~, ~@5 b3@11 b3@10 ~@6 c2@31 ~@32 [d2,a2]@32 ~, ~@10 a3@11 a3@10 [g2,c3]@31 ~ [a2,e3]@31 ~@34, ~@37 b3@10 b3@11 ~@11 b3@11 b3@15 ~@6 b3@11 b3@10 ~@6, ~@42 a3@10 a3@10 ~@12 a3@11 ~@22 a3@10 a3@10 ~]/4", // D5 C5 A5
  AD: "~@26 b3@5 ~, [g1,g2]@31 ~, ~@5 b3@10 b3@11 ~@6, ~@10 a3@11 a3@10 ~", // G
  AE: "[~@26 b3@5 ~@22 a3@10 ~, [c2,g2,c3]@31 [a2,e3]@32 ~, ~@5 b3@10 b3@10 ~@12 b3@10 b3@16 ~, ~@10 a3@11 a3@10 ~@11 a3@11 ~@11]/2", // C5 A5
  AF: "~@27 c#4@5, [b1,b2]@31 ~, ~@6 c#4@11 c#4@10 ~@5, ~@11 b3@11 b3@10", // B
  AG: "~@22 b3@9 ~, [e2,b2]@31 ~, ~@6 c#4@11 c#4@14 ~, ~@6 b3@5 ~@5", // E5
  AH: "~@27 c#4@5, [b1,b2], ~@5 c#4@11 ~ c#4@10 ~@5, ~@11 b3@11 b3@10", // B
  AI: "~@21 b3@10 ~, [e2,b2]@31 ~, ~@6 c#4@10 c#4@15 ~, ~@11 b3@10 ~@11", // E5
  AJ: "[~@27 f4@3 ~@29 f4@5, [g#2,d#3]@30 c#3@33 ~, ~@6 f4@10 f4@10 ~@6 d#4@10 ~ d#4@11 d#4@10, ~@11 d#4@10 d#4@9 ~ [f3,g#3]@33, ~@19 f4@5 f4@5 ~@3]/2", // G#5 Fm
  AK: "[~@27 f4@4 ~@27 f4@5 ~@28 f4@4 ~@17 f4@17 ~@26 f4@4 ~, [g#2,d#3,g#3]@30 ~ [c#3,f3]@32 ~@32 [c#3,f3,g#3]@34 ~@31, ~@5 f4@11 f4@11 ~@5 d#4@11 d#4@10 d#4@10 d#4@11 ~ d#4@10 d#4@9 ~@3 d#4@9 d#4@22 ~ d#4@10 d#4@10 d#4@10 ~, ~@11 d#4@10 d#4@9 ~@2 g#3@31 [g#3,c4]@31 ~@35 [g#3,c4]@31, ~@38 f4@10 f4@10 ~@11 f4@11 f4@11 ~@10 f4@11 ~@22 f4@10 f4@11 ~@5]/5", // G#5 C# G#
  AL: "~ f4, [c#3,f3,g#3], ~ d#4@10 d#4@21, ~@3 f4@5 ~@8", // C#
  AM: "[~@43 d#4@21 ~@48 d#4@38 ~@10, ~@6 f4@10 f4@11 f4@10 f4@33 f4@11 f4@12 f4@12 ~ f4@43 ~@11, ~@11 d#4@10 d#4@11 d#4@11 ~@21 d#4@11 d#4@12 d#4@12 d#4@13 ~@48]/5",
})).s("gm_piano").gain(0.25)

// chords · piano · "A.PIANO 1"
const piano_2 = note(`<
  A B C D@2 E@2 F G@2 H I J K@3 L M N O P Q@2 R S T@2 U V W@7 X Y@6 Z AA@2 AB@4 AC@3 AD@3 AE AF@2 AG AH AI AJ AK@2 AL@2
  AM@2 AN@2 AO ~ AP@2 ~
>`.pickRestart({
  A: "~@21 [a4,c#5]@11", B: "[b4,d#5]@14 ~@2 [b4,d#5]@5 a4@11, ~@21 c#5@4 ~@7", C: "[d5,f#5]@19 ~@2 [a4,c#5]@11",
  D: "[[b4,d#5]@45 ~@8 [a4,c#5]@11]/2", E: "[[b4,d#5]@47 ~@5 d4@7 ~@5]/2", F: "d5@19 ~@2 d4@11",
  G: "[c5@17 ~@4 d5@10 b4@6 c5@6 b4@11 d4@10]/2", H: "a4@19 ~@8 b4@5",
  I: "~ e4@10 ~@16 b4@5, ~ g4@30 ~, ~@11 [c4,e4]@20 ~", J: "e4@11 ~@16 b4@5, g4, ~@11 e4@21",
  K: "[~@11 d5@16 a4@2 ~@56 d4@10 ~, [a4,e5]@29 c4@35 ~@32, ~ f#4@29 ~ [f#4,a4]@33 [g4,b4,d5]@32, ~@33 d5@31 ~@32, ~@54 d4@31 ~@11]/3", // A5 F#m G
  L: "~@21 d5@11, [e4,g4,c5]@31 ~", M: "~@5 c5@5 ~@11 d4@11, g4, d4@7 ~@9, b4@10 b4@21 ~", N: "~@27 b4@5, [d4,f#4,a4]",
  O: "~ e4@10 ~@15 b4@5 ~, ~ g4@30 ~, ~@3 [c4,e4]@5", P: "e4@11 ~@15 b4@6, g4@31 ~, ~@11 e4@20 ~",
  Q: "[~@10 d5@16 a4@3 ~@2 d5@22 ~ d4@10, [f#4,e5]@29 c4@25 ~@10, a4@13 ~@2 [f#4,a4]@12 ~@5]/2", // F#7 F#m
  R: "~@27 b4@5, ~ [c4,e4]@31, ~@11 a4@21", S: "a4@16 ~@11 c5@5, [d4,f#4]@31 ~, ~ a4, ~@11 b4@5",
  T: "[~@27 d5@5, [g4,c5]@32 ~ [g4,b4]@31, d4@26 ~ d4@37, ~@11 [b4,d5]@22 ~@31]/2", // C5 G Bm
  U: "~@26 b5@5 ~, ~ [a4,c5,e5]@31, ~@11 e6@20 ~, ~@16 d6@15 ~, ~@21 c6@10 ~", V: "~@27 e5@5, [b4,d5,g5,a5], ~@5 b5@11",
  W: "[~@44 b5@10 [d4,d5]@9 ~@24 [d4,d5]@7 ~@24 [d5,d6]@8 ~@23 [d4,d5]@9 ~@31 b4@5 ~@25 b4@5, ~ [d5,f#5,a5]@32 ~ [c5,f#5,a5]@20 ~@9 d5@23 ~@8 c5@32 b4@2 ~@6 [c5,c6]@24 ~@3 a5@33 ~@30, ~@12 b5@22 ~@31 [b5,d6]@29 ~@2 g5@29 ~@3 g5@30 ~@2 f#5@33 ~@11 d5@20, ~@27 e5@26 ~@11 g5@30 ~ e5@31 ~ d5@22 ~@10 d5@34 ~ b4@25 ~@5, ~@97 c6@29 ~@2 b5@11 [b4,b5]@19 a4@35 ~ [e4,g4]@30]/7", // D F#dim C Bm B Em
  X: "~@11 d5@16 d5@5, ~ [e4,g4,b4]@31", // Em
  Y: "[~ [g4,b4]@30 ~ [f#4,b4]@29 ~@3 d6@28 ~@3 [b5,d6]@30 ~@2 [b5,d6]@64 ~, ~ d5@60 d5@31 ~ [d5,f#5]@32 d5@64 ~@3, ~@62 g5@31 ~@33 g5@64 ~@2, ~@63 b5@29 ~@100]/6", // G B5 Bm D
  Z: "~@17 g#4@14 ~, ~ [e3,g#3,b3]@31, ~@7 f#4@25", // E
  AA: "[~@16 c#5@15 ~@16 f#4@15 ~@2, [d3,f#3,a3,b3]@30 ~ [g3,a3,c#4]@31 ~@2, ~@6 b4@25 ~@5 e4@26 ~@2]/2", // Bm7 A7
  AB: "[~@14 f#4@16 ~@18 g#4@15 ~@17 c#5@15 ~@16 f#4@15 ~@2, ~@4 e4@26 ~ [e3,g#3,b3]@32 [d3,f#3,a3,b3]@31 ~ [g3,a3,c#4]@31 ~@2, ~@37 f#4@26 ~@6 b4@26 ~@5 e4@26 ~@2]/4", // E Bm7 A7
  AC: "[~@15 f#4@16 f#3 ~@16 [a3,a4]@15 g3@6 ~@11 [e4,e5]@16, ~@4 e4@26 ~ d3@31 ~ [d3,a3]@32 ~, ~@31 a3@16 ~@22 [g3,g4]@27, ~@37 [f#4,f#5]@26 ~@33]/3", // A E D5 G F#
  AD: "[g3@5 ~@10 [e4,e5]@16 ~@17 [b4,b5]@15 ~@17 [a3,a4]@15 ~, [e3,a3]@31 ~@6 [a4,a5]@26 a3@17 ~@16, ~@5 [g3,g4]@26 [a3,c4]@31 ~ [d3,f#3]@31 ~@2, ~@69 [f#4,f#5]@26 ~]/3", // E B A A5 A G Am D …
  AE: "g3@5 ~@10 [e4,e5]@15 ~@2, [d3,a3]@31 ~, ~@5 [g3,g4]@26 ~", // E D5 G
  AF: "[g3@5 ~@10 [e4,e5]@15 ~@17 [b4,b5]@16 ~, [e3,a3]@31 ~@6 [a4,a5]@27, ~@5 [g3,g4]@26 [a3,c4]@32 ~]/2", // E B A5 A G Am
  AG: "b3@6 ~@11 [f#4,f#5]@15, [d#3,f#3,d#4]@31 ~, ~@3 [b3,b4]@13", // F# D#m B
  AH: "~@27 g#5@4 ~, [e3,g#3,b3]@31 ~, ~@6 e5@25 ~, ~@17 f#5@14 ~", // E
  AI: "b3@5 ~@12 [f#4,f#5]@15, [d#3,f#3,d#4]@31 ~, ~@5 [b3,b4]@26 ~", // F# D#m B
  AJ: "~@27 g#5@5, [e3,g#3,b3]@31 ~, ~@6 e5@25 ~, ~@16 f#5@15 ~", // E
  AK: "[~@16 f5@31 ~@12 f5@5, [g#3,c4,d#4]@47 ~@7 d#5@10, ~@6 d#5@42 a#5@15 ~]/2", // G#
  AL: "[~@16 f5@31 ~@11 f5@5 ~, [c4,d#4]@47 ~@6 d#5@10 ~, ~@5 d#5@42 ~ a#5@15 ~]/2", // Cm
  AM: "[~@16 f5@31 ~@12 f4@5, ~@5 d#5@42 ~ a#4@16, ~@53 d#4@11]/2",
  AN: "[~@16 f5@31 ~@12 f4@5, ~@6 d#5@41 ~ a#4@16, ~@53 d#4@11]/2", AO: "~ d#4@31", AP: "[d#5@35 ~@29]/2",
})).s("gm_piano").gain(0.25)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1_2 = note(`<
  ~@11 A B C@2 D E F G@2 ~@2 H I J K L M N O P Q R S T U V W X Y@4 Z AA@7 AB@5 AC@3 AD AE AF AG AH@2 AI AJ@2 AK AL AM
  AN@5
>`.pickRestart({
  A: "~@6 g2@5 e3@19 ~@2, ~ c2@9 ~@22", B: "~@5 e3@6 c4@19 ~@2, a2",
  C: "[~@6 a2@5 ~@27 c3@5 f#3@21, d2@30 ~@2 d2@31 ~, ~@11 f#3@25 ~@28]/2", D: "~@5 d3@5 ~ b3@19 ~@2, g2",
  E: "~@5 g2@5 e3@21 ~, c2@31 ~", F: "~@5 d3@5 b3@21 ~, g2", G: "[~@6 a2@5 f#3@22 c2@30 ~, d2@33 ~@31]/2",
  H: "~@11 f#3@20 ~", I: "g2@11 e3@5 c4@5 a3@10 ~", J: "~@11 a2@4 ~ f#3@6 d3@9 ~, d2@31 ~",
  K: "~@11 d3@5 b3@5 g3@11, g2@15 ~", L: "~@11 d3@5 b3@5 ~ g3@10, ~ g2@31", M: "~@12 e3@3 ~ c4@4 ~ a3@10 ~, ~ a2@31",
  N: "~@5 b2@5 g3@11 ~ e3@10, e2", O: "~@6 a3@5 ~ b3@10 a3@8 ~@2, ~ b2@30 ~",
  P: "~@7 c3@5 f#3@4 a3@5 ~ e3@5 f#3@5, ~ d2@15", Q: "~@7 d3@5 b3@18 ~@2, ~ g2@31", R: "~@6 g2@5 e3@20 ~, ~ c2@31",
  S: "~@6 d3@5 b3@20 ~, g2", T: "~@6 a2@5 f#3@20 ~, d2", U: "~@7 g2@5 g3@18 ~@2, ~ c2@15", V: "~@6 e3@5 c4@17 ~@4, a2",
  W: "~@6 d3@6 b3@19 ~, ~ g2@29 ~@2", X: "~@5 f#3@5 ~ d4@19 ~@2, b2",
  Y: "[~@5 d3@5 ~ b3@20 ~@5 f#3@6 d4@20 ~@6 d3@5 b3@22 g2@33, g2@31 b2@32 g2@30 ~@35]/4",
  Z: "~ g#3@29 ~@2, [e2,b3], e3@29 ~@3", // E5
  AA: "[[b2,f#3,a3]@31 [a2,a3,c#4]@32 [g2,g3]@32 [e2,g#3]@31 ~ [b2,f#3,a3]@32 [a2,a3,c#4]@32 [g2,g3,b3]@32 [d2,f#3,a3], ~@31 e3@29 ~@3 b3@96 ~@65, ~@63 d3@28 ~@4 e3@28 ~@36 e3@28 ~@4 d3@30 ~@3]/7", // B7 A G E B7 A G D
  AB: "[~@31 [g2,b3,d4]@32 [c2,e3,c4]@32 ~ [a2,a3]@31 ~ [d2,f#3,d4]@31 ~, ~@95 [e3,c4]@32 a3@32 ~]/5", // G C A D C
  AC: "[[g2,g3,b3,d4]@31 [c3,c4,e4]@31 ~ [a2,a3,c4,e4]@33]/3", AD: "[b1,d#4], [f#3,b3]@7 ~", AE: "[e2,e3,g#3,b3]",
  AF: "[b1,f#3,b3,d#4]@31 ~", AG: "~ e2@31, [e3,g#3,b3]@31 ~", AH: "[[g#2,c4,d#4]@32 [c#2,c#4,f4]@31 ~, g#3@61 ~@3]/2",
  AI: "[g#2,g#3,c4,d#4]", AJ: "[[c#2,g#3,c#4,f4]@31 [g#2,g#3,c4,d#4]@33]/2", AK: "~@10 c#4@21 ~, ~ [c#2,g#3,f4]@30 ~",
  AL: "~ [c4,d#4]@31, [g#2,g#3]", AM: "~ [c#2,g#3,c#4,f4]@31",
  AN: "[~@56 g#1@19 ~@5, [g#2,c4]@15 ~, ~ [g#3,d#4]@149 ~@10]/5", // G# G#5
})).s("gm_string_ensemble_1").gain(0.14).pan(0.7)

stack(string_ensemble_1, string_ensemble_1_soft, piano, piano_2, string_ensemble_1_2)

More by Barry John