Strudelify

(Where Do I Begin) Love Story

Andy Williams

KeyG minorTempo80 bpm
0:00/0:00
// (Where Do I Begin) Love Story — Andy Williams
// 80 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 95 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/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 · acoustic guitar steel · "NYLON GTR"
const acoustic_guitar_steel = note(`<
  A@2 B C D E F G H@2 I J K C L M N C O P Q R S T U V W X S Y Z AA AB AC AD AE C AF E AE C AF AG AH AI@2 AJ B C D E AK G
  H@2 I J AL C L M N C AM P Q AN AO T U V W AP AQ AR Z AS AB AC AD AE C AF E AE C AF AG AH@2 AT AU AV@2 ~
>`.pickRestart({
  A: "d3 g3 bb3 g3 d4 bb3 g3 bb3", B: "[d3,g3,bb3]@3 d3", C: "[g3,bb3]", D: "[d3,gb3,a3]@3 d3", E: "[gb3,c4]",
  F: "[d3,g3,bb3]@3 bb3", G: "d4@3 eb4, [g3,bb3]",
  H: "[[gb3,c4,d4]@3 ~ [gb3,d4] [g3,c4,e4] [gb3,c4,d4] [a3,c4,eb4,gb4], ~@3 c4@2 ~@3]/2", // D7 D C D7 Adim
  I: "[g3,bb3,d4,g4] d3!2 g3!2 bb3!2 d4", J: "d4 f4!2 d4 d4@2 ~@2", K: "d4@5 d3!2 [g3,bb3]",
  L: "[gb3,a3]@5 d3!2 [gb3,a3]", M: "[gb3,a3]", N: "[d3,g3,bb3]@5 d3!2 [g3,bb3]",
  O: "[gb3,a3,d4]@5 a3 ~ [gb3,d4], ~@3 a3", P: "[gb3,a3,d4] [g3,c4,e4] [gb3,a3,c4,eb4] [gb3,a3,c4,d4]",
  Q: "[g3,b3,d4] d3 [g3,b3,d4] d3 [g3,b3,d4]@2 ~@2", R: "g3 a3 [g3,b3]@2, f3", S: "~ g3 c4 g3 [g3,c4]@4, eb3",
  T: "~ a3 eb4 a3 [a3,eb4]@4, f3", U: "~ a3 d4 a3 [a3,d4]@4, f3", V: "~ bb3 eb4 bb3 [bb3,eb4]@4, g3",
  W: "~ c4 eb4 c4 [gb3,c4,d4]@4, g3 ~", X: "~ bb3 ~@2 f3@4, g3 ~, ~ [bb3,d4]@3", Y: "~ c4 eb4 c4 [a3,eb4]@4, f3",
  Z: "~ g3 bb3 g3 [g3,bb3]@4, f3", AA: "~ g3 bb3 g3 [g3,bb3]@4, eb3", AB: "~ g3 bb3 g3 ~@2 db4@2, e3, ~ a3",
  AC: "[gb3,a3,d4]@3 gb3 a3 d4 a3 gb3", AD: "[d3,gb3,c4]@3 gb3 a3 c4 a3 gb3", AE: "[d3,g3,bb3]@5 d3 [g3,bb3] d3",
  AF: "[d3,gb3,c4]@5 d3 [gb3,c4] d3", AG: "[gb3,c4] [e3,g3,c4] [d3,gb3,c4]!2", AH: "~ d3 [g3,bb3] d3 [g3,bb3]@4",
  AI: "d3 [g3,bb3] d3 [g3,bb3]@4 ~", AJ: "[g3,bb3] [gb3,a3], d4", AK: "[d3,g3,bb3]@3 [d3,bb3]",
  AL: "d4 ~@4 d3!2 [g3,bb3]", AM: "[gb3,a3,d4]@5 a3!2 [gb3,a3,d4]", AN: "g3 ~ [g3,b3]@2, f3",
  AO: "~ g3 c4 g3 c4@4, eb3, ~@2 g3 ~", AP: "~ bb3!3 [f3,bb3]@4, g3 ~, ~ d4@3",
  AQ: "g3 [g3,c4] eb4 [g3,c4] [g3,bb3]@4, eb3", AR: "~ [bb3,c4] eb4 c4 [f3,a3,eb4]@4, [f3,g3] ~",
  AS: "~ g3 bb3 g3 [bb3,d4]@4, f3", AT: "~ eb3 [g3,bb3] eb3 [g3,bb3]@4", AU: "~ d3 [gb3,a3] d3 [gb3,a3]@4",
  AV: "[~@7 g5@19 ~@6, d3@4 g4 bb4 d5@20 ~@6, ~ g3@25 ~@6, ~ bb3@12 ~@3, ~@3 d4@23 ~@6]/2",
})).s("gm_acoustic_guitar_steel").gain(0.38)

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  ~@2 A B C D E F G@2 H@2 A B I D J F G@2 K B L M N F O B L M N F P D@2 Q@2 G@2 J F G@2 R S T R A B C D E F G@2 H@2 A B
  I D J F G@2 K B L M N F O B L M N F P D@2 Q@2 G@2 J F G@2 R S T U V@2 ~
>`.pickRestart({
  A: "g2 ~@2 d2", B: "g2", C: "d2 ~@2 gb2", D: "d2", E: "g2 ~@2 f2", F: "eb2", G: "d2/2", H: "[g2@7 d2]/2",
  I: "d2 ~@2 d2", J: "g2@3 f2", K: "g2@3 ~", L: "c2", M: "f2", N: "bb2", O: "a2 d2", P: "e2 a2", Q: "g2/2",
  R: "g2@3 g2", S: "f2@3 f2", T: "eb2@3 eb2", U: "d2@3 d2", V: "[g2@3 ~]/2",
})).s("gm_fretless_bass").gain(0.43)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@12 A B C D A B C D ~ E F G H I J K L G M N O P Q R@2 Q@2 A B C D A@2 I S T@2 U@2 T V U W T@2 X@2 Y@2 X Z Y AA AB AC
  AD AE AF AG AH AI AJ G M AK O AL Q AM@2 Q@2 AM AN Q@2 AM AO AP P AQ ~@2
>`.pickRestart({
  A: "[g4,bb4,d5]@3 [d4,g4]", B: "[bb4,d5]", C: "[gb4,a4,c5,d5]@3 [d4,gb4]", D: "[a4,c5,d5]", E: "~ g4 a4 b4",
  F: "[g4,c5,eb5]", G: "[a4,c5,eb5,f5]", H: "[bb4,d5,f5,a5]", I: "[eb4,g4,bb4,d5]", J: "[g4,a4,c5,e5] [gb4,a4,c5,d5]",
  K: "~ f5, [g4,bb4,d5]", L: "~ bb4, [g4,c5,eb5]", M: "[bb4,d5,f5]", N: "[g4,bb4,eb5]", O: "[g4,a4,db5,e5]",
  P: "[d4,gb4,a4]", Q: "[gb4,a4,c5,d5]", R: "[g4,bb4,d5]", S: "[g4,bb4,g5] [gb4,a4], d5",
  T: "g4 bb4 d5 g5 bb5 g5 d5 bb4 g4 bb4 d5 g5 bb5 g5 d5 bb4", U: "gb4 a4 c5 d5 gb5 d5 c5 a4 gb4 a4 c5 d5 gb5 d5 c5 a4",
  V: "eb4 g4 bb4 d5 g5 d5 bb4 g4 eb4 g4 bb4 d5 g5 d5 bb4 g4", W: "gb4 a4 c5 d5 gb5 d5 c5 a4 gb4 a4 c5 d5 gb5 d5 c5 gb4",
  X: "[g4,bb4,d5,g5,bb5] ~@3 [g4,bb4,d5,g5,bb5] ~@3 [g4,bb4,d5,g5,bb5] ~@3 [g4,bb4,d5,g5,bb5] ~@3", // Gm
  Y: "[gb4,a4,c5,d5,gb5] ~@3 [gb4,a4,c5,d5,gb5] ~@3 [gb4,a4,c5,d5,gb5] ~@3 [gb4,a4,c5,d5,gb5] ~@3", // D7
  Z: "[eb4,g4,bb4,d5,eb5] ~@3 [eb4,g4,bb4,d5,eb5] ~@3 [eb4,g4,bb4,d5,eb5] ~@3 [g4,bb4,c5,eb5,g5] ~@3", // Ebmaj7 Cm7
  AA: "[gb4,a4,c5,d5,gb5] ~@3 [g4,c5,e5,g5] ~@3 [gb4,a4,c5,e5,gb5,a5] ~@3 [gb4,a4,c5,d5,gb5] ~@3", // D7 C Gbm7b5 D7
  AB: "[g4,b4,d5,gb5] ~@3 [g4,b4,d5,gb5] ~@3 [g4,b4,d5,gb5] ~@3 [g4,b4,d5,gb5] ~@3", AC: "[g4,b4,d5,f5] ~",
  AD: "[g4,c5,eb5,g5]@4 eb5 d5 c5 bb4", AE: "[a4,c5,eb5,f5,a5] ~", AF: "[bb4,d5,f5,a5]@4 d5 c5 bb4 a4",
  AG: "[eb4,g4,bb4,d5]@3 ~", AH: "[eb4,g4,bb4,d5]@4 d5 c5 bb4 a4", AI: "[g4,bb4,d5,g5] [g4,bb4,d5,f5]",
  AJ: "[g4,c5,eb5,g5] [g4,bb4,c5,eb5]", AK: "[g4,bb4,eb5,g5]", AL: "[d4,gb4,a4,db5]", AM: "[g4,bb4,d5,g5]",
  AN: "[eb4,g4,bb4,d5]@3 [g4,bb4,eb5,g5]", AO: "[f4,g4,bb4,d5,g5]", AP: "[eb4,g4,bb4,eb5]",
  AQ: "~@3 g6@5, [d4,g4]@4 bb5 d6@11, ~ bb4@15, ~ d5@7, ~@3 g5@13", // G5
})).s("gm_string_ensemble_2").gain(0.33)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  ~@2 A@2 B@2 C D E@2 F@2 G@2 H@2 I@2 J@2 K L M N O P Q R S T U V@2 W X G@2 H@2 Y@2 Z@2 AA AB AC AD A@2 B@2 C D E@2 F@2
  G@2 H@2 I@2 J@2 K L M N O P Q R S T U V@2 AE AF G@2 H@2 Y@2 Z@2 AA AB AC AG AH@3
>`.pickRestart({
  A: "[bb5 d5!2 bb5 bb5@5 d5!2 bb5!2 d5 eb5 d5]/2", B: "[c5!3 a5 a5@5 c5!2 a5!2 c5 d5 c5]/2", C: "bb4!3 g5 g5@4",
  D: "~ bb4!2 g5!2 bb4 c5 bb4", E: "[a4!3 gb5 gb5@6 [e5,g5]@2 [d5,gb5,a5]@2 [c5,eb5]@2]/2", F: "[[bb4,d5]@7 ~]/2",
  G: "[[g5,bb5] d5!2 [g5,bb5] [g5,bb5]@5 d5!2 [g5,bb5]!2 d5 eb5 d5]/2", // Gm
  H: "[c5!3 [gb5,a5] [gb5,a5]@5 c5!2 [gb5,a5]!2 c5 d5 c5]/2", // Gbm
  I: "[bb4!3 [bb4,g5] [bb4,g5]@5 bb4 ~ g5!2 bb4 c5 bb4, ~@10 bb4@3 ~@3]/2", // Eb
  J: "[a4!3 [c5,gb5] [c5,gb5]@6 [c5,e5,g5]@2 [c5,e5,gb5,a5]@2 [c5,d5,gb5]@2]/2", K: "[b4,d5,gb5,b5]@3 b4",
  L: "b4 c5 d5 g4", M: "eb5@5 g4 eb5 g4", N: "g4 a4 a4@3 c5 eb5 c5", O: "d5@5 f4 d5 f4", P: "f4 g4 g4@3 bb4 d5 bb4",
  Q: "c5@5 a4 c5 a4", R: "bb4@3 c5 d5 g4 bb4 d5", S: "eb5@5 f4 g4 bb4", T: "bb4@2 a4@3 bb4 c5 eb4", U: "d4@5 d4 eb4 f4",
  V: "[a4@4 g4@6 g4@2 ~ eb4@2 ~ db4@10 e4@2 g4@2 e4@2, ~@12 f4@2 ~ d4@2 ~@15]/2", W: "~ [db5,gb5] [db5,gb5]@6, gb4",
  X: "gb4 [d5,gb5] [d5,gb5]@4 d5@2", Y: "[bb4!3 [bb4,d5,g5] [bb4,d5,g5]@5 bb4!2 [bb4,d5,g5]!2 bb4 c5 bb4]/2",
  Z: "[a4!3 [a4,c5,gb5] [a4,c5,gb5]@6 [g4,c5,e5,g5]@2 [gb4,c5,eb5,a5]@2 [a4,c5,d5,gb5]@2]/2", AA: "[g4,bb4,d5,g5]",
  AB: "[g4,bb4,d5,f5]", AC: "[eb4,g4,bb4,d5]", AD: "[g4,bb4] [gb4,a4], [d4,d5]", AE: "~@2 [db5,gb5] [db5,gb5]@5, gb4",
  AF: "gb4 [d5,gb5] [d5,gb5]@4 gb5@2", AG: "[d4,gb4,bb4,d5]",
  AH: "[~@5 g7@12 ~@7, d4 g5 bb6@6 ~@4, ~ g4@4 bb5@4 d7@24 ~@15, ~ bb4@2 d6@12 ~@9, ~@3 d5@4 g6@24 ~@17]/3",
})).s("gm_epiano2").gain(0.72)

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

// drums · snare
const snare = s("sd").struct("<~@12 [~@2 x!2 ~@2 x ~]!80 ~@3>").gain(0.39)

// drums · hihat
const hihat = s("hh").struct("<~@3 [x!4]!9 [x ~ x ~ x ~ x ~ x!5 ~ x ~]!80 ~@3>").gain(0.26)

// drums · open hat
const open_hat = s("oh").struct("<~@92 [~@4 x!12] x ~>").gain(0.19)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@92 [x!4 ~@12] ~@2>").gain(0.06)

// drums · crash
const crash = s("cr").struct("<~@93 x ~>").gain(0.13)

stack(acoustic_guitar_steel, bass, string_ensemble_2, epiano2, kick, snare, hihat, open_hat, open_hat_soft, crash)

More by Andy Williams