Strudelify

A Love So Beautiful

Michael Bolton

KeyD♭ majorTempo63 bpm
0:00/0:00
// A Love So Beautiful — Michael Bolton
// 63 bpm, 4/4, key Db major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 66 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(63/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.

// other · overdriven guitar
const overdriven_guitar = note("<~@50 A B C D ~@8 E F G ~>".pickRestart({
  A: "~ db5 eb5 f5!2 eb5!2 db5", B: "db5 c5!2 bb4@3 ~@2", C: "~ eb5 f5 gb5!2 f5!2 eb5", D: "eb5 db5!2 c5@3 ~@2",
  E: "~ db5 eb5 f5!2 eb5 db5 c5", F: "bb4 ab4!2 gb4 bb4@2 c5@2", G: "[db4,f4,ab4,db5]",
})).s("gm_overdriven_guitar").gain(0.36)

// bass · fretless bass
const bass = note(`<
  ~ A B@3 C D E F G H G I G H J K B C D E F G H G L G H M N O P Q R G H G S G H T K O P Q U G H G B V W X Y G H G S G H
  X F B Z AA ~
>`.pickRestart({
  A: "~@23 db2", B: "db2@6 ~@5 db2 db2@6 ~@5 ab1", C: "f2@6 ~@5 f2 gb2@6 ~@5 db2", D: "gb2@6 ~@5 gb2 eb2@6 ~@5 bb1",
  E: "eb2@6 ~@5 eb2 eb2@6 ~@5 a1", F: "ab2@6 ~@5 ab2 ab2@6 ~@5 eb2", G: "gb2@6 ~@5 gb2 gb2@6 ~@5 eb2",
  H: "f2@6 ~@5 f2 bb2@6 ~@5 f2", I: "f2@6 ~@5 f2 eb2@6 ~@5 bb1", J: "b2@6 ~@5 b2 eb3@6 ~@5 bb2",
  K: "ab2@6 ~@5 ab2 ab2@6 ab2 eb2 ab2!2 eb2 ab2", L: "f2@6 ~@5 f2 gb2@6 ~@5 bb2", M: "eb2@6 ~@5 eb2 ab2@6 ~@5 eb2",
  N: "db2@6 ~@5 db2 db2@6 db2 ab1 db2!2 ab1 db2", O: "e2@6 ~@5 e2 e2@6 ~@5 e2", P: "a2@6 ~@5 a2 a2@6 ~@5 e2",
  Q: "ab2@6 ~@5 ab2 ab2@6 ~@5 b2", R: "g2@6 ~@5 g2 g2@5 ~ g2 bb2 g2!2 bb2 g2", S: "f2@6 ~@5 f2 eb2@6 ~@5 a1",
  T: "b2@6 ~@5 b2 bb2@6 ~@5 bb2", U: "g2@6 ~@5 g2 g2@6 ~@5 bb2", V: "f2@6 ~@5 f2 f2@6 ~@5 ab2",
  W: "gb2@6 ~@5 gb2 gb2@6 ~@5 db2", X: "eb2@6 ~@5 eb2 eb2@6 ~@5 bb1", Y: "eb2@6 ~@5 eb2 ab2@5 ~ ab2 eb2 ab2!2 eb2 ab2",
  Z: "f2@6 ~@5 f2 gb2@6 ~@5 ab2", AA: "db2@3 ~",
})).s("gm_fretless_bass").gain(0.4)

// chords · piano
const piano = note(`<
  A@2 B C D E F G H I J I K L J M N B O F P Q R S I T I U V W X Y Z AA I J I AB L J AC N AD AE AF AG I U L D@2 AH AI AJ
  I J I AK L J AL AM B AN AO ~
>`.pickRestart({
  A: "[db4,gb4,b4]/2", B: "[ab3,db4,f4]@6 [ab3,db4,f4]@6 [ab3,db4,f4]@5 ~ [ab3,db4,f4]@5 ~",
  C: "[ab3,db4,f4]@5 ~ [ab3,db4,f4]@5 ~ [ab3,db4,f4]@5 ~ [ab3,db4,f4]@5 ~", D: "[ab3,db4,f4]!4",
  E: "[ab3,db4,f4]!2 [db4,gb4,bb4]!2", F: "[db4,gb4,bb4]!2 [bb3,eb4,gb4]!2",
  G: "[bb3,eb4,gb4]@6 [bb3,eb4,gb4]@6 [a3,db4,eb4,a4]@5 ~ [gb3,a3,eb4,a4]@5 ~", // Ebm Ebm7b5 Ebdim
  H: "[eb4,ab4,c5]@5 ~ [eb4,ab4,c5]@5 ~ [eb4,ab4,c5]@5 ~ [eb4,ab4,c5]@5 ~", I: "[db4,gb4,bb4]!2 [eb4,ab4,c5]!2",
  J: "[c4,f4,ab4,eb5]!2 [f4,bb4,db5,ab5]!2", // Fm7 Bbm7
  K: "[c4,f4,ab4]@6 [c4,f4,ab4]@6 [bb3,db4,eb4,gb4]@5 ~ [bb3,db4,eb4,gb4]@5 ~", // Fm Ebm7
  L: "[db4,gb4,bb4]@5 ~ [db4,gb4,bb4]@5 ~ [eb4,ab4,c5]@5 ~ [eb4,ab4,c5]@5 ~", M: "[gb4,b4,eb5]!2 [bb3,db4,eb4,gb4]!2",
  N: "[eb4,ab4,bb4,c5] [eb4,c5,ab5]", O: "[ab3,db4,f4]@5 ~ [ab3,db4,f4]@5 ~ [db4,gb4,bb4]@5 ~ [db4,gb4,bb4]@5 ~",
  P: "[bb3,eb4,gb4]!2 [gb3,a3,eb4,a4] [gb3,a3,db4,eb4,a4]", Q: "[eb4,ab4,c5]!4",
  R: "[db4,gb4,bb4]@6 [db4,gb4,bb4]@6 [eb4,ab4,c5]@5 ~ [eb4,ab4,c5]@5 ~", // Gb Ab
  S: "[c4,f4,ab4,eb5]@5 ~ [c4,f4,ab4,eb5]@5 ~ [f4,bb4,db5,ab5]@5 ~ [f4,bb4,db5,ab5]@5 ~", // Fm7 Bbm7
  T: "[c4,f4,ab4]!2 [bb3,db4,eb4,gb4]!2", // Fm Ebm7
  U: "[c4,f4,ab4,eb5]@6 [c4,f4,ab4,eb5]@6 [f4,bb4,db5,ab5]@5 ~ [f4,bb4,db5,ab5]@5 ~", // Fm7 Bbm7
  V: "[bb3,eb4,gb4]@5 ~ [bb3,eb4,gb4]@5 ~ [eb4,ab4,c5]@5 ~ [eb4,ab4,c5]@5 ~", W: "[ab3,db4,f4] [ab3,f4,db5]",
  X: "[b3,e4,ab4]!2 [b3,eb4,e4,ab4] [b3,d4,e4,ab4]", Y: "[e4,a4,db5,ab5]!2 [e4,a4,c5,gb5]!2",
  Z: "[b3,e4,ab4]@6 [b3,e4,ab4]@6 [b3,e4,ab4]@5 ~ [b3,e4,ab4]@5 ~", AA: "[bb3,eb4,g4]@11 ~ [bb3,db4,g4,eb5]@11 ~",
  AB: "[c4,f4,ab4]@6 [c4,f4,ab4]@6 [a3,db4,eb4,a4]@5 ~ [a3,db4,eb4,a4]@5 ~", AC: "[gb4,b4,eb5]!2 [bb3,eb4,gb4]!2",
  AD: "[b3,e4,ab4]@6 [b3,e4,ab4]@6 [b3,eb4,e4,ab4]@5 ~ [b3,d4,e4,ab4]@5 ~", // E Emaj7 E7
  AE: "[e4,a4,db5,ab5]@5 ~ [e4,a4,db5,ab5]@5 ~ [e4,a4,c5,gb5]@5 ~ [e4,a4,c5,gb5]@5 ~", AF: "[b3,e4,ab4]!4",
  AG: "[bb3,eb4,g4]!2 [f3,bb3,eb4,g4] [f3,bb3,db4,eb4,g4]", AH: "[db4,gb4,bb4]!4",
  AI: "[bb3,eb4,gb4]@6 [bb3,eb4,gb4]@6 [bb3,eb4,gb4]@5 ~ [bb3,eb4,gb4]@5 ~", AJ: "[bb3,eb4,gb4]@11 ~ [eb4,c5,ab5]@11 ~",
  AK: "[c4,f4,ab4]@6 [c4,f4,ab4]@6 [a3,db4,eb4,a4]@5 ~ [gb3,a3,eb4,a4]@5 ~", AL: "[bb3,db4,eb4,gb4]!4",
  AM: "[eb4,ab4,bb4,c5]!2 [eb4,ab4,c5]!2", // Ab
  AN: "[ab3,db4,f4]@5 ~ [ab3,db4,f4]@5 ~ [db4,gb4,bb4]@5 ~ [eb4,ab4,bb4,c5]@5 ~", AO: "[ab3,db4,f4,db5]",
})).s("gm_piano").gain(0.43)

// chords · pad warm
const pad_warm = note(`<
  A B C D E F G H I J K J L M K N O C P G Q R S T J U J V W X Y Z AA AB J K J AC M K AD O AE AF AG AH J V M E@2 AI AJ AK
  J K J AL M K AM AN C AO E ~
>`.pickRestart({
  A: "[db4,gb4,b4]!2 [db4,gb4,b4]@2", B: "[db4,gb4,b4]!2", C: "[ab3,db4,f4]@12 [ab3,db4,f4]@11 ~",
  D: "[ab3,db4,f4]@11 ~ [ab3,db4,f4]@11 ~", E: "[ab3,db4,f4]!2", F: "[ab3,db4,f4] [db4,gb4,bb4]",
  G: "[db4,gb4,bb4] [bb3,eb4,gb4]", H: "[bb3,eb4,gb4]@12 [gb3,a3,eb4,a4]@11 ~",
  I: "[eb4,ab4,c5]@11 ~ [eb4,ab4,c5]@11 ~", J: "[db4,gb4,bb4] [eb4,ab4,c5]", K: "[c4,f4,ab4,eb5] [f4,bb4,db5,ab5]",
  L: "[c4,f4,ab4]@12 [bb3,db4,eb4,gb4]@11 ~", M: "[db4,gb4,bb4]@11 ~ [eb4,ab4,c5]@11 ~",
  N: "[gb4,b4,eb5] [bb3,db4,eb4,gb4]", O: "[bb4,eb5,ab5]@2 [eb5,ab5] [ab5,c6]",
  P: "[ab3,db4,f4]@11 ~ [db4,gb4,bb4]@11 ~", Q: "[bb3,eb4,gb4] [a3,db4,eb4,a4]", R: "[eb4,ab4,c5]!2",
  S: "[db4,gb4,bb4]@12 [eb4,ab4,c5]@11 ~", T: "[c4,f4,ab4,eb5]@11 ~ [f4,bb4,db5,ab5]@11 ~",
  U: "[c4,f4,ab4] [bb3,db4,eb4,gb4]", V: "[c4,f4,ab4,eb5]@12 [f4,bb4,db5,ab5]@11 ~",
  W: "[bb3,eb4,gb4]@11 ~ [eb4,ab4,c5]@11 ~", X: "[f4,ab4,db5]@2 [ab4,db5] [db5,f5]",
  Y: "[b3,e4,ab4]@2 [b3,eb4,e4,ab4] [b3,d4,e4,ab4]", Z: "[e4,a4,db5,ab5] [e4,a4,c5,gb5]",
  AA: "[b3,e4,ab4]@12 [b3,e4,ab4]@11 ~", AB: "[g4,bb4,eb5]@11 ~ [db5,eb5]@5 ~ [eb5,g5]@5 ~",
  AC: "[c4,f4,ab4]@12 [gb3,a3,eb4,a4]@11 ~", AD: "[gb4,b4,eb5] [bb3,eb4,gb4]",
  AE: "[b3,e4,ab4]@12 [b3,eb4,e4,ab4]@6 [b3,d4,e4,ab4]@5 ~", AF: "[e4,a4,db5,ab5]@11 ~ [e4,a4,c5,gb5]@11 ~",
  AG: "[b3,e4,ab4]!2", AH: "[bb3,eb4,g4] [f3,bb3,eb4,g4]", AI: "[db4,gb4,bb4]!2",
  AJ: "[bb3,eb4,gb4]@12 [bb3,eb4,gb4]@11 ~", AK: "[gb4,bb4,eb5]@11 ~ [eb5,ab5]@5 ~ [ab5,c6]@5 ~",
  AL: "[c4,f4,ab4]@12 [a3,db4,eb4,a4]@11 ~", AM: "[bb3,db4,eb4,gb4]!2", AN: "[eb4,ab4,bb4,c5] [eb4,ab4,c5]",
  AO: "[ab3,db4,f4]@11 ~ [db4,gb4,bb4]@6 [eb4,ab4,bb4,c5]@5 ~", // Db Gb Ab
})).s("gm_pad_warm").gain(0.3)

// chords · string ensemble 2
const string_ensemble_2 = note(`<
  ~@17 A B C D E F G H I H J K L M N O P H Q H R S Q T U V W X Y H J S Z@2 AA AB AC H Q H AD S Q AE AF AG AH AI ~
>`.pickRestart({
  A: "[ab3,db4,f4]@12 [ab3,db4,f4]@11 ~", B: "[ab3,db4,f4]@11 ~ [db4,gb4,bb4]@11 ~", C: "[db4,gb4,bb4] [bb3,eb4,gb4]",
  D: "[bb3,eb4,gb4] [a3,db4,eb4,a4]", E: "[eb4,ab4,c5]!2", F: "[db4,gb4,bb4]@12 [eb4,ab4,c5]@11 ~",
  G: "[c4,f4,ab4,eb5]@11 ~ [f4,bb4,db5,ab5]@11 ~", H: "[db4,gb4,bb4] [eb4,ab4,c5]", I: "[c4,f4,ab4] [bb3,db4,eb4,gb4]",
  J: "[c4,f4,ab4,eb5]@12 [f4,bb4,db5,ab5]@11 ~", K: "[bb3,eb4,gb4]@11 ~ [eb4,ab4,c5]@11 ~",
  L: "[f4,ab4,db5]@2 [ab4,db5] [db5,f5]", M: "[b3,e4,ab4]@2 [b3,eb4,e4,ab4] [b3,d4,e4,ab4]",
  N: "[e4,a4,db5,ab5] [e4,a4,c5,gb5]", O: "[b3,e4,ab4]@12 [b3,e4,ab4]@11 ~",
  P: "[g4,bb4,eb5]@11 ~ [db5,eb5]@5 ~ [eb5,g5]@5 ~", Q: "[c4,f4,ab4,eb5] [f4,bb4,db5,ab5]",
  R: "[c4,f4,ab4]@12 [gb3,a3,eb4,a4]@11 ~", S: "[db4,gb4,bb4]@11 ~ [eb4,ab4,c5]@11 ~", T: "[gb4,b4,eb5] [bb3,eb4,gb4]",
  U: "[bb4,eb5,ab5]@2 [eb5,ab5] [ab5,c6]", V: "[b3,e4,ab4]@12 [b3,eb4,e4,ab4]@6 [b3,d4,e4,ab4]@5 ~",
  W: "[e4,a4,db5,ab5]@11 ~ [e4,a4,c5,gb5]@11 ~", X: "[b3,e4,ab4]!2", Y: "[bb3,eb4,g4] [f3,bb3,eb4,g4]",
  Z: "[ab3,db4,f4]!2", AA: "[db4,gb4,bb4]!2", AB: "[bb3,eb4,gb4]@12 [bb3,eb4,gb4]@11 ~",
  AC: "[gb4,bb4,eb5]@11 ~ [eb5,ab5]@5 ~ [ab5,c6]@5 ~", AD: "[c4,f4,ab4]@12 [a3,db4,eb4,a4]@11 ~",
  AE: "[bb3,db4,eb4,gb4]!2", AF: "[eb4,ab4,bb4,c5] [eb4,ab4,c5]",
  AG: "~ db5 eb5 f5!2 eb5 db5 c5, [ab3,db4,f4]@12 [ab3,db4,f4]@11 ~", // Db
  AH: "bb4@3 ab4@3 ab4@3 gb4@3 [db4,gb4,bb4]@6 [eb4,ab4,bb4,c5]@5 ~, [ab3,db4,f4]@11 ~@13", AI: "[ab3,db4,f4]",
})).s("gm_string_ensemble_2").gain(0.15)

// drums · kick
const kick = s("bd").struct("<~@2 A@14 B A@12 B A@3 B A@7 B A@11 B A@10 ~@2>".pickRestart({
  A: "x ~@10 x!2 ~@10 x", B: "x ~@10 x!2 ~@11",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct("<~@2 A@14 B A@12 B A@3 B A@7 B A@11 B A@10 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~@6 x ~@11 x ~@4 x",
})).gain(0.45)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@16 A ~@12 A ~@3 A ~@7 A ~@11 A ~@12>".pickRestart({
  A: "~@21 x!2 ~",
})).gain(0.2)

// drums · hihat
const hihat = s("hh").struct("<~@2 [x!8]!62 ~@2>").gain(0.3)

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

stack(overdriven_guitar, bass, piano, pad_warm, string_ensemble_2, kick, snare, snare_soft, hihat, open_hat)

More by Michael Bolton