Strudelify
A Love So Beautiful cover art

Michael Bolton The Very Best

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, A@4 for four bars: 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@3 C D E F G H G I G H J K B C D L F G M G I G N O P Q R S T G H G U G H V K Q W S X G N G B@2 Y Z AA G H G AB G
  H AC AD B AE AF ~
>`.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]!2 [db4,gb4,bb4]!2", D: "[db4,gb4,bb4]!2 [bb3,eb4,gb4]!2",
  E: "[bb3,eb4,gb4]@6 [bb3,eb4,gb4]@6 [a3,db4,eb4,a4]@5 ~ [gb3,a3,eb4,a4]@5 ~", // Ebm Ebm7b5 Ebdim
  F: "[eb4,ab4,c5]@5 ~ [eb4,ab4,c5]@5 ~ [eb4,ab4,c5]@5 ~ [eb4,ab4,c5]@5 ~", G: "[db4,gb4,bb4]!2 [eb4,ab4,c5]!2",
  H: "[c4,f4,ab4,eb5]!2 [f4,bb4,db5,ab5]!2", // Fm7 Bbm7
  I: "[c4,f4,ab4]@6 [c4,f4,ab4]@6 [bb3,db4,eb4,gb4]@5 ~ [bb3,db4,eb4,gb4]@5 ~", J: "[gb4,b4,eb5]!2 [bb3,db4,eb4,gb4]!2",
  K: "[eb4,ab4,bb4,c5] [eb4,c5,ab5]", L: "[bb3,eb4,gb4]!2 [gb3,a3,eb4,a4] [gb3,a3,db4,eb4,a4]",
  M: "[c4,f4,ab4,eb5]@5 ~ [c4,f4,ab4,eb5]@5 ~ [f4,bb4,db5,ab5]@5 ~ [f4,bb4,db5,ab5]@5 ~", // Fm7 Bbm7
  N: "[c4,f4,ab4,eb5]@6 [c4,f4,ab4,eb5]@6 [f4,bb4,db5,ab5]@5 ~ [f4,bb4,db5,ab5]@5 ~", // Fm7 Bbm7
  O: "[bb3,eb4,gb4]@5 ~ [bb3,eb4,gb4]@5 ~ [eb4,ab4,c5]@5 ~ [eb4,ab4,c5]@5 ~", P: "[ab3,db4,f4] [ab3,f4,db5]",
  Q: "[b3,e4,ab4]!2 [b3,eb4,e4,ab4] [b3,d4,e4,ab4]", R: "[e4,a4,db5,ab5]!2 [e4,a4,c5,gb5]!2",
  S: "[b3,e4,ab4]@6 [b3,e4,ab4]@6 [b3,e4,ab4]@5 ~ [b3,e4,ab4]@5 ~", T: "[bb3,eb4,g4]@11 ~ [bb3,db4,g4,eb5]@11 ~",
  U: "[c4,f4,ab4]@6 [c4,f4,ab4]@6 [a3,db4,eb4,a4]@5 ~ [a3,db4,eb4,a4]@5 ~", V: "[gb4,b4,eb5]!2 [bb3,eb4,gb4]!2",
  W: "[e4,a4,db5,ab5]@5 ~ [e4,a4,db5,ab5]@5 ~ [e4,a4,c5,gb5]@5 ~ [e4,a4,c5,gb5]@5 ~", // Amaj7 Gbm7b5
  X: "[bb3,eb4,g4]!2 [f3,bb3,eb4,g4] [f3,bb3,db4,eb4,g4]", Y: "[db4,gb4,bb4]!4",
  Z: "[bb3,eb4,gb4]@6 [bb3,eb4,gb4]@6 [bb3,eb4,gb4]@5 ~ [bb3,eb4,gb4]@5 ~", AA: "[bb3,eb4,gb4]@11 ~ [eb4,c5,ab5]@11 ~",
  AB: "[c4,f4,ab4]@6 [c4,f4,ab4]@6 [a3,db4,eb4,a4]@5 ~ [gb3,a3,eb4,a4]@5 ~", AC: "[bb3,db4,eb4,gb4]!4",
  AD: "[eb4,ab4,bb4,c5]!2 [eb4,ab4,c5]!2", // Ab
  AE: "[ab3,db4,f4]@5 ~ [ab3,db4,f4]@5 ~ [db4,gb4,bb4]@5 ~ [eb4,ab4,bb4,c5]@5 ~", AF: "[ab3,db4,f4,db5]",
})).s("gm_piano").gain(0.43)

// chords · pad warm
const pad_warm = note(`<
  A B C@3 D E F G H I H J H I K L C D E M G H N H J H O P Q R S T U H I H V H I W L R X T Y H O H C@2 Z AA AB H I H AC H
  I AD AE C AF C ~
>`.pickRestart({
  A: "[db4,gb4,b4]!2 [db4,gb4,b4]@2", B: "[db4,gb4,b4]!2", C: "[ab3,db4,f4]!2", D: "[ab3,db4,f4] [db4,gb4,bb4]",
  E: "[db4,gb4,bb4] [bb3,eb4,gb4]", F: "[bb3,eb4,gb4]@12 [gb3,a3,eb4,a4]@11 ~",
  G: "[eb4,ab4,c5]@11 ~ [eb4,ab4,c5]@11 ~", H: "[db4,gb4,bb4] [eb4,ab4,c5]", I: "[c4,f4,ab4,eb5] [f4,bb4,db5,ab5]",
  J: "[c4,f4,ab4]@12 [bb3,db4,eb4,gb4]@11 ~", K: "[gb4,b4,eb5] [bb3,db4,eb4,gb4]",
  L: "[bb4,eb5,ab5]@2 [eb5,ab5] [ab5,c6]", M: "[bb3,eb4,gb4] [a3,db4,eb4,a4]",
  N: "[c4,f4,ab4,eb5]@11 ~ [f4,bb4,db5,ab5]@11 ~", O: "[c4,f4,ab4,eb5]@12 [f4,bb4,db5,ab5]@11 ~",
  P: "[bb3,eb4,gb4]@11 ~ [eb4,ab4,c5]@11 ~", Q: "[f4,ab4,db5]@2 [ab4,db5] [db5,f5]",
  R: "[b3,e4,ab4]@2 [b3,eb4,e4,ab4] [b3,d4,e4,ab4]", S: "[e4,a4,db5,ab5] [e4,a4,c5,gb5]",
  T: "[b3,e4,ab4]@12 [b3,e4,ab4]@11 ~", U: "[g4,bb4,eb5]@11 ~ [db5,eb5]@5 ~ [eb5,g5]@5 ~",
  V: "[c4,f4,ab4]@12 [gb3,a3,eb4,a4]@11 ~", W: "[gb4,b4,eb5] [bb3,eb4,gb4]",
  X: "[e4,a4,db5,ab5]@11 ~ [e4,a4,c5,gb5]@11 ~", Y: "[bb3,eb4,g4] [f3,bb3,eb4,g4]", Z: "[db4,gb4,bb4]!2",
  AA: "[bb3,eb4,gb4]@12 [bb3,eb4,gb4]@11 ~", AB: "[gb4,bb4,eb5]@11 ~ [eb5,ab5]@5 ~ [ab5,c6]@5 ~",
  AC: "[c4,f4,ab4]@12 [a3,db4,eb4,a4]@11 ~", AD: "[bb3,db4,eb4,gb4]!2", AE: "[eb4,ab4,bb4,c5] [eb4,ab4,c5]",
  AF: "[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 F H F I J K L M N O F P F Q F P R S L T N U F I F A@2 V W X F P F Y F P Z AA AB AC AD ~
>`.pickRestart({
  A: "[ab3,db4,f4]!2", 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] [eb4,ab4,c5]",
  G: "[c4,f4,ab4,eb5]@11 ~ [f4,bb4,db5,ab5]@11 ~", H: "[c4,f4,ab4] [bb3,db4,eb4,gb4]",
  I: "[c4,f4,ab4,eb5]@12 [f4,bb4,db5,ab5]@11 ~", J: "[bb3,eb4,gb4]@11 ~ [eb4,ab4,c5]@11 ~",
  K: "[f4,ab4,db5]@2 [ab4,db5] [db5,f5]", L: "[b3,e4,ab4]@2 [b3,eb4,e4,ab4] [b3,d4,e4,ab4]",
  M: "[e4,a4,db5,ab5] [e4,a4,c5,gb5]", N: "[b3,e4,ab4]@12 [b3,e4,ab4]@11 ~",
  O: "[g4,bb4,eb5]@11 ~ [db5,eb5]@5 ~ [eb5,g5]@5 ~", P: "[c4,f4,ab4,eb5] [f4,bb4,db5,ab5]",
  Q: "[c4,f4,ab4]@12 [gb3,a3,eb4,a4]@11 ~", R: "[gb4,b4,eb5] [bb3,eb4,gb4]", S: "[bb4,eb5,ab5]@2 [eb5,ab5] [ab5,c6]",
  T: "[e4,a4,db5,ab5]@11 ~ [e4,a4,c5,gb5]@11 ~", U: "[bb3,eb4,g4] [f3,bb3,eb4,g4]", V: "[db4,gb4,bb4]!2",
  W: "[bb3,eb4,gb4]@12 [bb3,eb4,gb4]@11 ~", X: "[gb4,bb4,eb5]@11 ~ [eb5,ab5]@5 ~ [ab5,c6]@5 ~",
  Y: "[c4,f4,ab4]@12 [a3,db4,eb4,a4]@11 ~", Z: "[bb3,db4,eb4,gb4]!2", AA: "[eb4,ab4,bb4,c5] [eb4,ab4,c5]",
  AB: "~ db5 eb5 f5!2 eb5 db5 c5, [ab3,db4,f4]@12 [ab3,db4,f4]@11 ~", // Db
  AC: "bb4@3 ab4@3 ab4@3 gb4@3 [db4,gb4,bb4]@6 [eb4,ab4,bb4,c5]@5 ~, [ab3,db4,f4]@11 ~@13", AD: "[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