Strudelify

To Love Somebody

Michael Bolton

KeyG majorTempo78 bpm
0:00/0:00
// To Love Somebody — Michael Bolton
// 78 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 53 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(78/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 · fretless bass · "LoveSomebody"
const bass = note(`<
  ~ A B C D E F G H I J K L M F N O P J K Q R S N H T U V W F G X Y J K Z AA AB AC AD I AE AF AG AH@2 G AI AJ AC AK@3
>`.pickRestart({
  A: "g1@6 ~ g1", B: "d2@6 ~ d2", C: "c2@7 ~", D: "c2@5 ~ g1@2 c2@5 ~@3", E: "g1@4 ~@2 g1 ~ g1@5 ~ g1@2",
  F: "a1@5 ~ a1 ~ a1@5 ~ a1@2", G: "c2@5 ~ c2 ~ c2@5 ~ c2 d2", H: "g1@5 ~ g1 ~ g1@5 ~ g1@2",
  I: "f1@5 ~ f1 ~ f1@5 ~ f1@2", J: "g1@5 ~ g1 ~ g1@5 ~ e2@2", K: "d2@5 ~ d2 ~ d2@5 ~ d2@2", L: "c2@2 ~ c2 c2@2 ~ e1",
  M: "g1@5 ~ g1 ~ g1@5 ~ g1 g#1", N: "c2@4 ~@2 c2 ~ c2@5 ~ c2 d2", O: "g1@5 ~ g1@2 g1@5 ~ g2@2",
  P: "f2@5 ~ f2 ~ f2@6 f1@2", Q: "c2@5 ~ c2 ~ c2@5 ~ c2@2", R: "g1@5 ~ g1 ~ g1@4 ~@2 g1@2",
  S: "d2@4 ~@2 d2 ~ d2@4 ~@2 d2@2", T: "d2@5 ~ d2 ~ d2@6 a1@2", U: "c2@5 ~ c2 ~ c2@5 ~ d2@2",
  V: "g1@5 ~ g1@2 g1@4 ~@2 d2 e2", W: "g2@6 g1@2 g1@5 ~ g1@2", X: "g1@5 ~ g1 ~ g1@5 ~ g2@2",
  Y: "f2@5 ~ c2@2 f1@5 ~ f1@2", Z: "c2@5 ~ c2 ~ c2@4 c2@2 d2@2", AA: "g1@5 ~ g1@2 g1@5 ~ g1@2",
  AB: "a1@4 ~@2 a1 ~ a1@5 ~ a1@2", AC: "c2@4 ~@2 c2 ~ c2@5 ~ c2@2", AD: "g1@5 ~ d2@2 g2@4 ~@2 g1@2",
  AE: "g1@5 ~ g1@2 g1@6 g1@2", AF: "d2@5 ~ d2 ~ d2@4 ~@2 d2@2", AG: "c2@4 ~@2 c2 ~ c2@7 ~",
  AH: "[g1@4 ~@2 g1@6 g2@2 f#2@6 ~@2 f#2@2 d2@5 ~ d2@2]/2", AI: "g1@5 ~ g2 ~ g2@5 ~ g1@2",
  AJ: "d2@4 ~@2 d2 ~ d2@5 ~ d2@2", AK: "[g1@5 ~@2 g1 ~ g1@9 g2@16 ~@14]/3",
})).s("gm_fretless_bass").gain(0.25)

// chords · epiano2
const epiano2 = note(`<
  ~ A B C@2 D E F G H I J K D E F D H L J K M@2 F N O P Q D E F G H I J K D E F D H L J K M@2 F N O P R S@2
>`.pickRestart({
  A: "g3@3 d3 g3@3 d3", B: "f#3@3 d3 f#3@3 d3", C: "[c3@3 c3 c3@4 c3@3 g2 c3@2 ~@2, e3@7 ~]/2", D: "g3@3 d3 g3 g3@2 d3",
  E: "~@5 a2 e3 a2, a2@5 ~@3, ~ g3@3", F: "c3!2, [e3,g3]", G: "g3@3 d3 g3 g3@2 d3, b3", H: "~ f3, f3 ~, ~ a3@3",
  I: "g3@5 a3 g3 e3", J: "d3@3 d3 d3@4, f#3", K: "~ e3 ~@2 c3@4, c3 ~, ~ a#3@3", L: "[g3,b3]@5 a3 g3 e3",
  M: "[g3@3 g3@4 f#3@2 e3@2 f#3 d3@4]/2", N: "g3@3 d3 g3@4, b3", O: "f#3@3 e3 f#3@2 d3@2", P: "[c3,e3]@3 g3 c3@4",
  Q: "g3@3 d3 g3@2 ~@2, b3@3 ~", R: "g3@6 ~ d3@2 g3@2 b3@2 ~ a3@2, b3@11 ~@5", S: "[d3 g2@8 ~@7]/2",
})).s("gm_epiano2").gain(0.35)

// chords · string ensemble 2
const string_ensemble_2 = note(`<
  ~ A B C D E F@2 G H I J K@2 L@2 M H I J K@2 N O@2 N P@2 Q R@3 S T J U V W X Y Z AA@2 AB AC@2 AD@3 AE@3 ~
>`.pickRestart({
  A: "b4@11 ~ c5@2 b4@2", B: "b4@2 a4@9 ~ b4@2 a4 ~", C: "a4 g4@7", D: "~ d4 c4@2, e4", E: "[b3,d4]",
  F: "[a3 e4, c4]/2", G: "b3 b4, d4", H: "[c4,a4]", I: "[b3,g4]", J: "[a3,f#4]", K: "[[a#3,e4] [b3,d4], g3]/2",
  L: "[c4 g4, e4]/2", M: "b4@5 c5 b4 g4, d4", N: "[a3,d4,f#4]", O: "[[c4,e4] [b3,d4], g4]/2",
  P: "[[c4,e4]@4 [b3,d4]@3 ~, g3@7 ~]/2", Q: "d5", R: "[e4 ~ b4, c5@2 ~, ~ g4@2]/3", S: "[f4,a4]",
  T: "[d4,b4]@3 g4, ~@6 b3 ~", U: "[g3,a#3,e4]", V: "[g3,b3,d4]", W: "[g3,c4,e4]", X: "[c4,e4,g4]",
  Y: "d4@4 d5@3 g5, b4", Z: "f5 e5, a4", AA: "[d5 ~ [f#4,a4]@2, b4 ~, ~ d4@3]/2", AB: "[a#3,e4,g4]",
  AC: "[[b3,g4]@7 [a3,f#4]@9, d4]/2", AD: "[[c4,e4] b3 [a3,f#4], g3@2 ~, ~ d4@2]/3",
  AE: "[[c4,e4]@16 [b3,d4]@18 ~@5 [b3,g4]@9, g3@17 ~@7]/3", // C Bm Em
})).s("gm_string_ensemble_2").gain(0.1).pan(0.3)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~ A B C D E F G H I J K L M N O P Q R S T U@2 V W X Y Z AA AB AC AD AE AF@2 AG AH AI AJ AK AL AM AN AO AP@2 AQ@2 AR
  AS@4
>`.pickRestart({
  A: "~@2 d3@2 ~@4 d4@7 ~, b3 ~, ~@4 g3@11 ~, ~@3 d3@5", B: "~ d3 f#3 ~ d4@4, a3 ~, ~@3 d3@5",
  C: "~ e3 ~@2 e4@3 ~, g3 ~, ~ c4@2 ~, ~@6 e3@9 ~", D: "~@2 e3@2 c4@11 ~, g3 ~@3",
  E: "~ d3 ~ d3 ~ d3 ~ d3, b3@5 ~ b3@2, ~@2 g3@3 ~@3, ~@4 d4@3 ~",
  F: "~ e3 ~ e3 ~ e3 ~ e3, c4@3 ~ e4@2 ~@2, ~@4 a3@5 ~@3 c4@4", G: "g3 e3 ~ e3 g3 e3 e4 e3, ~ c4@2 ~",
  H: "~ d3 ~ d3 ~ d3 ~ d3, b3@2 g3@3 ~@3, ~@2 d4 b3", I: "~ c3 f3@2 ~ c3 ~ c3, a3@2 c4 a3",
  J: "~@2 d3@2 ~@2 d3@2 ~@2 d3@2 b3@2 g3 ~, b3@2 g3@3 ~@3, ~@2 d4 ~", K: "f#3 d3 ~ d3 d4@2 ~ d3, ~ a3 ~ a3",
  L: "~@2 a#3@5 ~, c4@15 ~, ~ e3@7", M: "~ d3 ~ d3 ~ d3 ~ d3, b3@2 d4 b3, ~ g3 ~@2",
  N: "~@2 e3@2 ~@2 e3@3 ~ e3@2 g3@2 e3 ~, c4@7 ~@9, ~@2 a3@3 ~@3", O: "~ e3 e4@2 ~ e3 ~ e3, g3@5 ~ g3@2, ~@4 c4@3 ~",
  P: "~ d3 ~ d3 d4@2 b3 g3, b3 ~, ~ g3 ~@2", Q: "~ c3 ~ c3 ~ c3 a3@2, a3@2 c4 ~, ~ f3 ~@2",
  R: "b3 d3 ~@2 d4 a3 g3 e3, ~@2 g3@3 ~@3, ~@6 d3@5 ~@5",
  S: "f#3@2 ~@4 f#3@2 ~@2 d3@2 f#3@2 d3 ~, ~@2 d3@7 ~@7, ~@2 a3@2 d4@3 ~", T: "~@3 g3, e3",
  U: "[~ d3 ~ d3 d4 ~ b3 ~@4 d3 f#3 d3 ~ d3, b3@2 g3@2 ~ d3@2 a3@7 d4@2]/2",
  V: "~@2 g3@2 ~@4 g4@2 d4 e4 c4@2 g3@2, c4 e4 ~@2, ~@6 g3@5 ~@5",
  W: "~@2 d3@2 g3@2 ~@2 d4@2 g3 ~ g3 ~ g3@2, b3 ~, ~@3 d3@3 ~@2", X: "d4@2 ~@2 a3@8 d4@3 ~, ~ f#3@5 ~@2",
  Y: "~@2 g3@5 ~, c4 ~@3, ~@2 e3@13 ~", Z: "~@4 d4 ~ b3 c4, b3@5 ~@3, ~ d3@4 ~@3, ~@2 g3@3 ~@3",
  AA: "b3 g3 ~ g3 ~ d3 g3 d3, ~ d4 b3@2", AB: "c4@3 ~ c4 d4 c4 d4 e4@7 ~", AC: "c4 g3 ~ g3 e4@2 c4 ~, ~ c4 ~@2",
  AD: "d4@4 ~@2 b4 c5 b4@2 g4@2 d4@2 b3@2", AE: "a3@6 ~ f3, ~@3 c4", AF: "[b3@2 g3@4 d4 e4 d4@12 f#3@2 a3@2 d4@8]/2",
  AG: "e3 ~@2 g3, ~@3 g4@4 ~, ~@8 e4@7 ~", AH: "b3@7 ~@3 b4 c5 b4@2 g4@2", AI: "e4@9 ~ e4!3 d4 c4 d4",
  AJ: "~@4 g3@2 c4@2 g3 ~ e3@2 g3@2 c4@2, e4@3 ~@5", AK: "~ d3 ~ d3 d4 c4 b3 g3, b3@3 ~@5, ~ g3 ~@2",
  AL: "a3@3 f3 a3 f3 c4 a3", AM: "~@2 d3@2 g3@3 ~@3 g4!3 ~ g4 ~, b3@3 ~@5", AN: "g4@2 f#4@9 ~ g4@2 f#4 ~",
  AO: "~@2 g3@3 ~@3 a#3@6 ~@2, ~@3 g3@4 ~", AP: "[g4 ~ g4@2 ~@2 g4@3 ~ a4@2 g4@2 f#4@14 ~@2 b3@2]/2",
  AQ: "[c4 ~ c4@2 ~@2 c4@3 ~ c4 ~ c4@2 b3@11 ~ d4@2 g4 ~ g4 ~]/2", AR: "g4@2 f#4@7 ~ f#4@2 g4 ~ g4 ~",
  AS: "[f#4@2 e4@7 ~ c4 ~ g4 e4 d4 ~ b3@19 ~@4 d4@12 ~@13, ~@15 c4@2 ~@47]/4",
})).s("gm_acoustic_guitar_nylon").gain(0.2)

// chords · acoustic guitar nylon · soft notes
const acoustic_guitar_nylon_2 = note("<~@4 A ~@4 B ~ C ~@2 D E F G ~@4 H ~@6 I J ~ K ~@2 L ~@17>".pickRestart({
  A: "~ g3, ~@3 e3@5", B: "~@3 c3 ~@4", C: "~@10 d3@3 ~@3", D: "~ c4", E: "~@3 e3 ~@4", F: "~@5 d3@2 ~", G: "~@7 c3",
  H: "d3@2 f#3@2 d3 ~@11", I: "~@15 d4", J: "~@5 g3 ~ g3", K: "~@2 f3 ~", L: "~@5 g3 ~@2",
})).s("gm_acoustic_guitar_nylon").gain(0.1)

// other · recorder
const recorder = note("<~@21 A B C D E F G ~@8 H I J K L M N O A B C D E F P ~@2>".pickRestart({
  A: "b4 g4 b4 g4 d5 g4 g5 ~ b4 g4 b4 g4 d5 g4 g5 g4", B: "a4 ~ f#4 d4 a4 d4 d5 d4 f#4 ~ f#4 ~ a4 d4 d5 g4",
  C: "c5 g4 c5 g4 e5 g4 g5 g4 c5 g4 c5 g4 e5 g4 g5 g4", D: "b4 ~ b4 g4 d5 g4 g5 g4 b4 g4 b4 g4 d5 g4 g5 g4",
  E: "d5 a4 d5 a4 f#5 a4 a5 a4 d5 a4 d5 a4 f#5 a4 a5 a4", F: "c5 g4 c5 g4 e5 ~ g5 g4 c5 ~ c5 g4 e5 ~ g5 g4",
  G: "b4 g4 b4 ~ d5 g4 g5 ~ d5 ~@7", H: "b4 ~ g4 d4 b4 d4 d5 d4 g4 d4 g4 d4 b4 ~ d5 ~",
  I: "c5 e4 a4 ~ c5 e4 e5 ~ c5 ~ a4 e4 c5 e4 e5 e4", J: "g4 ~ c5 e4 g4 e4 c5 e4 e5 ~ c5 ~ g4 ~ c5 e4",
  K: "b4 d4 g4 d4 d5 d4 b4 d4 g4 d4 b4 d4 d5 d4 ~ d4", L: "a4 c4 f4 c4 c5 c4 a4 c4 f4 c4 a4 c4 c5 c4 a4 c4",
  M: "g4 d4 b4 d4 d5 d4 b4 d4 g4 d4 b4 d4 d5 d4 b4 d4", N: "f#4 d4 a4 d4 d5 d4 ~ d4 a4 ~ f#4 d4 d5 d4 f#4 d4",
  O: "e4 c4 g4 c4 a#4 ~ g4 c4 e4 ~ g4 c4 ~@2 g4 ~", P: "b4 g4 b4 ~@2 d5 g4 g5 ~ d5 ~@6",
})).s("gm_recorder").gain(0.13)

// other · recorder · soft notes
const recorder_soft = note("<~@21 A B ~ C ~ D E ~@8 F G H ~@3 I J A B ~ C ~ D K ~@2>".pickRestart({
  A: "~@7 g4 ~@8", B: "~@9 d4 ~ d4 ~@4", C: "~ g4 ~@14", D: "~@5 g4 ~@3 g4 ~@3 g4 ~@2", E: "~@3 g4 ~@3 g4 ~@8",
  F: "~ d4 ~@11 d4 ~ d4", G: "~@7 e4 ~ e4 ~@6", H: "~ e4 ~@7 e4 ~ e4 ~ e4 ~@2", I: "~@6 f#4 ~@2 d4 ~@6",
  J: "~@5 c4 ~@3 c4 ~@2 a#4 c4 ~@2", K: "~@4 g4 ~@3 g4 ~@7",
})).s("gm_recorder").gain(0.06)

// drums · kick
const kick = s("bd").struct(`<
  ~@5 A B A C A B A C A B A C A B A D A B A C A B A@2 B A C A B A C A B A C A B A D A B A C A B E ~@2
>`.pickRestart({
  A: "x!2", B: "x ~@6 x!2 ~@5 x ~", C: "x ~@3 x!2 ~ x", D: "x ~@3 x!2 ~@2", E: "x ~@6 x ~ x ~@6",
})).gain(0.25)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@5 A ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@2 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~@4
>`.pickRestart({
  A: "~@7 x ~@8",
})).gain(0.15)

// drums · rim
const rim = s("rim").struct("<~@5 A@15 B ~@7 A@15 B ~@6 C ~@2>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@5 x ~@8 x ~",
})).gain(0.3)

// drums · snare
const snare = s("sd").struct("<~@20 [~@3 x] [~ x ~ x]!6 [~ x!2 ~] ~@15 [~@3 x] [~ x ~ x]!6 ~@3>").gain(0.3)

// drums · low tom
const low_tom = s("lt").struct("<~@4 [~@6 x!2] ~@15 [~@14 x!2] ~@22 [~@14 x!2] ~@9>").gain(0.3)

// drums · hihat
const hihat = s("hh").struct(`<
  A B@3 C D E F G A E F G D E F G A E F G D E F G D E H D E F G A E F G D E F G A E F G D E F G D E I ~@2
>`.pickRestart({
  A: "x!4", B: "~ x ~ x", C: "~ x ~@2", D: "~ x!3", E: "x ~ x!3 ~ x!2", F: "x ~ x ~ x!3 ~", G: "x ~ x ~ x ~ x!2",
  H: "x!3 ~", I: "x ~@4 x ~@3 x ~@6",
})).gain(0.2)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@5 A B C D A B C D A B C D A B C E A B C D A B F A B C D A B C D A B C D A B C E A B C D A B G ~@2
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~@6", C: "~ x ~ x ~@3 x", D: "~@6 x ~@3 x ~@4 x", E: "~@3 x ~ x ~@2", F: "~ x ~ x ~@4",
  G: "~@2 x ~@4 x ~@8",
})).gain(0.1)

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 [~@11 x ~@4] ~@15 [~@13 x ~@2] ~@22 [~@13 x ~@2] ~@9>").gain(0.3)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@6 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~@2 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~@3
>`.pickRestart({
  A: "~@5 x ~@2", B: "~ x ~@6",
})).gain(0.15)

// drums · crash
const crash = s("cr").struct("<~@21 A ~@3 A ~@18 A ~@3 A ~@4>".pickRestart({
  A: "x",
})).gain(0.15)

// drums · ride
const ride = s("rd").struct("<~ A@2 B ~ B ~@7 B ~@14 B ~@7 B ~@13 B C ~>".pickRestart({
  A: "x ~@6 x", B: "x", C: "x!3 ~@4 x ~@8",
})).gain(0.15)

// drums · tambourine
const tambourine = s("tb").struct("<~@5 [~ x ~ x]!45 [~@5 x ~@10] ~@2>").gain(0.3)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@4 A B C D E B C D E B C D E B C D E B C D E B C F B C D E B C D E B C D E B C D E B C D E B C G ~@2
>`.pickRestart({
  A: "~@7 x", B: "x!3 ~ x!3 ~ x!3 ~ x ~@3", C: "x!3 ~ x!3 ~ x!3 ~ x ~ x ~", D: "x!2 ~ x!13", E: "x!3 ~ x!3 ~ x!5 ~ x ~",
  F: "x!2 ~ x!10 ~@3", G: "x",
})).gain(0.5)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  ~@4 A B C D E B C D E B C D E B C D E B C D E B C D B C D E B C D E B C D E B C D E B C D E B C ~@3
>`.pickRestart({
  A: "~@13 x ~ x", B: "~@3 x ~@3 x ~@3 x ~ x!3", C: "~@3 x ~@3 x ~@3 x ~ x ~ x", D: "~ x ~@6",
  E: "~@3 x ~@3 x ~@5 x ~ x",
})).gain(0.25)

stack(
  bass, epiano2, string_ensemble_2, acoustic_guitar_nylon, acoustic_guitar_nylon_2, recorder, recorder_soft, kick,
  kick_soft, rim, snare, low_tom, hihat, hihat_soft, mid_tom, open_hat, crash, ride, tambourine, cabasa, cabasa_soft
)

More by Michael Bolton