Strudelify

Precious Love

Bob Welch

KeyF majorTempo127 bpm
0:00/0:00
// Precious Love — Bob Welch
// 127 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 9 "Staff-8" lead 1 square (copy of ch 8 "Staff-7" accordion)
// note: Full arrangement: all 87 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(127/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.

// bass · electric bass finger · "Staff-2"
const bass = note(`<
  ~ A B A B A B A B A B A B A B A B A B A B C@2 D@2 C@2 E F A B A B G H A B A B A B A B A B A B A B A B C@2 D@2 C@2 E F
  A B A B A B A B I J C@2 D@2 C@2 E F A B A B A B A B I K
>`.pickRestart({
  A: "e1@2 ab1@2 b1@2 eb2@3 ~ db2@2 b1@2 ab1@2", B: "gb1@2 a1@2 db2@2 b1@3 ~ a1@2 ab1@2 gb1@2", C: "a1!8", D: "ab1!8",
  E: "d2!8", F: "gb2!8", G: "e1@2 ab1 a1 b1 db2 eb2@2 db2@2 b1@2 ~@4", H: "e1@2 ab1 a1 b1 db2 eb2@2 db2@2 ~@6",
  I: "e1@3 ~@11 e1@2", J: "e1@3 ~@5 e2@4 b1@4", K: "e1@3 ~@13",
})).s("gm_electric_bass_finger").gain(0.48).pan(0.3)

// other · overdriven guitar · "Staff-3"
const overdriven_guitar = note(`<
  ~ A B A B A B A B A B A B A B A B A B A C D@2 E@2 D@2 F G A B A B H I A B A B A B A B A B A B A B A C D@2 E@2 D@2 F G
  A B A B A B A B J ~ D@2 E@2 D@2 F G A B A B A B A B J ~
>`.pickRestart({
  A: "e2 ab2 b2 eb3@2 db3 b2 ab2", B: "gb2 a2 db3 b2@2 a2 ab2 gb2", C: "gb2 a2 db3 b2@2 a2 ab2 a2",
  D: "a2 a2@2 a2 d3 eb3 e3 b2", E: "ab2 ab2@2 b2@2 db3 eb3 b2", F: "d3@3 e3 f3 gb3 d3 e3", G: "gb3 db3 gb2@2 gb2@3 f2",
  H: "e2@2 ab2 a2 b2 db3 eb3@2 db3@2 b2@2 ~@4", I: "e2@2 ab2 a2 b2 db3 eb3@2 db3@2 ~@6", J: "b2 ~@3",
})).s("gm_overdriven_guitar").gain(0.48).pan(0.7)

// chords · piano · "Staff-4"
const piano = note(`<
  ~ A B@2 C A B@2 C A C A C A C A C A C A D E F G H E F I J A B@2 K ~@2 A B@2 C A C A C A C A C A C A D E F G H E F I L
  A B@2 K A B@2 K M ~ E F G H E F N L A B@2 K A B@2 K M ~
>`.pickRestart({
  A: "[e4,ab4,b4,e5]@3 [eb4,ab4,b4,eb5]@5", // E Abm
  B: "[[db4,gb4,a4,db5]@3 [b3,eb4,gb4,b4]@2 [b3,eb4,gb4,ab4]@2 [b3,eb4,gb4] [e4,ab4,e5]@3 [eb4,ab4,b4,eb5]@5, ~@7 b4@4 ~@5]/2", // Gbm B Abm7 B E Abm
  C: "[db4,gb4,a4,db5]@3 [b3,eb4,gb4,b4]@2 [b3,eb4,gb4,ab4]@2 [b3,eb4,gb4,b4]", // Gbm B Abm7 B
  D: "[db4,gb4,a4,db5]@6 [b3,eb4,gb4,b4]@4 [b3,eb4,gb4,ab4]@3 [db6,eb6] [a5,b5] [gb5,ab5]", // Gbm B Abm7 Dbsus2 Asus2 Gbsus2
  E: "[ab4,db5,e5] [ab4,db5,e5]@2 [ab4,db5,e5] [e4,ab4,db5]@4", // Dbm
  F: "[ab4,db5,e5] [ab4,db5,e5]@2 [ab4,db5,e5] [ab4,db5,gb5]@3 [ab4,db5,e5]", // Dbm Dbsus4 Dbm
  G: "[gb4,b4,eb5]@2 [gb4,b4,eb5]@2 [gb4,b4,eb5] [gb4,ab4,b4] [gb4,b4,eb5]@2", // B Abm7 B
  H: "[gb4,b4,eb5] [gb4,b4,eb5]@3 [gb4,b4,eb5] [eb4,gb4,b4]@2 [gb4,b4,eb5]", I: "[a4,d5]@2 [a4,d5] [gb4,a4]",
  J: "[gb4,b4,db5] [gb4,bb4,db5]", K: "[db4,gb4,a4,db5]@3 [b3,eb4,gb4,b4]@2 [b3,eb4,gb4,ab4]@3",
  L: "[gb4,b4,db5] [gb4,b4,db5]@2 [gb4,b4,db5] [gb4,bb4,db5]@4", M: "[b3,e4,ab4] ~@3",
  N: "[a4,d5] [a4,d5]@2 [a4,d5] [a4,d5]@2 [gb4,a4]@2", // D5 Gbm
})).s("gm_piano").gain(0.48).pan(0.8)

// other · vibraphone · "Staff-6"
const vibraphone = note("<~ A B A B ~@24 A B A B ~@26 A B A B A B A B C D ~@8 A B A B A B A B C D>".pickRestart({
  A: "e5@3 eb5@5", B: "db5@3 b4@5", C: "e4@2 ab4 a4 b4 db5 eb5@2 ~@2 db5@2 ab4 e4 gb4@2", D: "e4 ~@7",
})).s("gm_vibraphone").gain(0.56).pan(0.2)

// other · accordion · "Staff-7"
const accordion = note(`<
  ~@4 A B C@2 A D@2 E A B F G H@2 I J K@2 L M N O P Q R ~@2 S T@2 A U V J A W X Y Z B F G AA AB AC J K@2 L M N O P Q R ~
  AD AE AF@2 AG AE AH AI ~ O L M N O P Q R ~ AJ AI AK AI AL AM@2 ~@2
>`.pickRestart({
  A: "~@5 b4!2 ab4", B: "b4 b4@2 db5@3 ~@2", C: "[~@6 b4@2 e5@3 eb5@2 db5 ~ b4@2 db5@3 db5@4 ~@8]/2",
  D: "[b4@2 b4@2 b4@2 db5@4 eb5 db5 b4@2 b4@6 ~@2 b4@2 e5@2 e5@2 eb5@2 db5@2]/2", E: "~ b4@6 ~@9",
  F: "~@2 b4!2 e5 eb5@2 db5", G: "b4@4 ~ db5 ab4 b4", H: "[db5@4 ~@6 b4@2 db5 ab4 b4@4 db5@6 ~@8]/2",
  I: "~ b4 b4@2 e5 eb5@2 db5", J: "b4 ~", K: "[~@15 e5@3 e5@4 db5@6 ~@2 eb5@2]/2", L: "e5 e5@2 gb5@3 ~@2",
  M: "eb5@2 eb5@2 eb5 db5 b4@2", N: "eb5@2 eb5@4 eb5 db5 b4@4 ~@2 b4@2", O: "e5 e5@2 db5@3 ~ eb5",
  P: "e5 e5@2 gb5@3 ~ e5", Q: "gb5@2 gb5@2 gb5 e5 eb5 e5", R: "gb5", S: "~ b4", T: "[~@3 b4 db5 b4@2 e4@3 ~@6]/2",
  U: "b4!3 db5@3 ~@2", V: "~@3 b4 e5 eb5@2 db5", W: "b4 b4@2 db5 ab4 b4 db5@2", X: "~@2 e5 eb5", Y: "db5 b4@6 ~@9",
  Z: "~@3 b4@2 ab4 b4 ab4", AA: "db5@2 ~ db5@2 b4 ab4 b4", AB: "db5@2 ~@5 ab4", AC: "b4!4 db5 eb5@2 db5",
  AD: "~@5 b4@2 b4", AE: "db5 ab4@2 b4 db5@2 ~@2", AF: "[~@6 b4@2 e5@3 eb5@2 db5 ~ b4@9 ~@8]/2", AG: "~@5 b4!3",
  AH: "~@4 b4@2 b4@2 db5@2 b4@2 b4@2 ab4 gb4", AI: "e4 ~@3", AJ: "~@2 b4@4 b4@2 db5@2 b4@4 ab4 gb4",
  AK: "~@6 b4@2 db5@2 b4@4 ab4 gb4", AL: "~@3 b4 db5 b4@3", AM: "b5/2",
})).s("gm_accordion").gain(0.48)

// drums · kick
const kick = s("bd").struct(`<
  A B@3 C B@3 D B@3 E B@3 F B@3 G H I H J H I H K B@4 L M B@3 D B@3 E B@3 F B@3 G H I H J H I H K B@8 M N H I H J H I H
  K B@8 L M
>`.pickRestart({
  A: "~@3 x!2 ~@3 x ~ x ~ x!4", B: "x ~@3 x ~@3 x ~@2 x!2 ~@3", C: "x ~@2 x!2 ~ x ~ x ~ x ~ x!4",
  D: "x ~@2 x!2 ~ x ~ x ~ x ~ x!2 ~ x", E: "x ~@3 x ~@3 x ~ x!2 ~ x!2 ~", F: "x ~@2 x!2 ~ x ~ x!2 ~ x ~ x!3",
  G: "x ~@2 x!2 ~ x ~ x ~ x ~ x!3 ~", H: "x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@3", I: "x ~@2 x!2 ~@2 x!2 ~@2 x!3 ~ x",
  J: "x ~@2 x!2 ~@2 x!2 ~@2 x!4 ~", K: "x ~@2 x!2 ~@3 x ~ x ~ x!4", L: "x ~@11 x!3 ~", M: "x", N: "~@12 x!3 ~",
})).gain(0.48)

// drums · snare
const snare = s("sd").struct(`<
  A B@3 C B@3 D B@3 E B@3 F B@3 G B H B I B H B J B@4 K ~ B@3 D B@3 E B@3 F B@3 G B H B I B H B J B@8 L K B H B I B H B
  J B@8 M L
>`.pickRestart({
  A: "~@3 x!2 ~@3 x ~ x ~ x!4", B: "~ x ~ x", C: "~@4 x ~@2 x!2 ~ x ~ x!4", D: "~@4 x ~@2 x!2 ~ x ~ x!2 ~ x",
  E: "~@4 x ~@3 x ~ x!2 ~ x!2 ~", F: "~@4 x ~@2 x!3 ~ x ~ x!3", G: "~@4 x ~@2 x!2 ~ x ~ x!3 ~", H: "~@4 x ~@7 x!2 ~ x",
  I: "~@4 x ~@7 x!3 ~", J: "~@4 x ~@3 x ~ x ~ x!4", K: "~@7 x", L: "x", M: "x ~@6 x",
})).gain(0.48)

// drums · hihat
const hihat = s("hh").struct("<~ A@20 B@8 A@4 C D A@16 B@8 A@8 D E B@8 A@8 C D>".pickRestart({
  A: "x ~ x!5 ~", B: "x!4", C: "x ~@11 x!2 ~@2", D: "x", E: "~@12 x!2 ~@2",
})).gain(0.4)

// drums · low tom
const low_tom = s("lt").struct("<[~@15 x] ~@86>").gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<[~@6 x ~ x ~ x ~@2 x!2 ~] ~@32 [~@13 x!2 ~] ~@53>").gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~ A@20 B@8 A@4 C ~ A@16 B@8 A@8 ~ C B@8 A@8 C ~>".pickRestart({
  A: "~ x ~@5 x", B: "~ x ~ x ~ x ~ x", C: "~@7 x",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<[~@3 x!2 ~@11] ~@32 [~@3 x] ~@53>").gain(0.4)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A@3 ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~@3 A ~ A ~
  A ~ A ~ A ~ A ~@3 A ~@3 A ~ A ~ A ~ A ~ A@2
>`.pickRestart({
  A: "x",
})).gain(0.4)

stack(
  bass, overdriven_guitar, piano, vibraphone, accordion, kick, snare, hihat, low_tom, mid_tom, open_hat, high_tom, crash
)

More by Bob Welch