Strudelify

The Best of Me

Bryan Adams

KeyE majorTempo109 bpm
0:00/0:00
// The Best of Me — Bryan Adams
// 109 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 92 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 30, guitar program 28, guitar program 30.
setcpm(109/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
const bass = note(`<
  ~@2 A B A B C@2 D E F G H I J K L M N O P Q R S T Q R S T U@2 D E F G H I J K V M N O P Q R S T Q R S T W X W Y W X W
  Y J K L M N O P Z AA ~@2 Z AA ~ P AB AC AD AE AF AC AD AE AF AC AD AE AF AC AD AE AF
>`.pickRestart({
  A: "e2@3 ~ e2 ~ c#2@4 c#2 ~ c#2 ~ c#2 ~", B: "a1@3 ~ a1 ~ f#1@3 ~ f#1 ~ f#1 ~ f#1 ~",
  C: "[e1@4 e1 ~ e1@3 ~ e1 ~ e1 ~ a1@7 ~ e1@3 ~ e1 ~ e1@3 ~]/2", D: "g#1@3 ~@3 g#1@3 ~ g#1 ~ g#1 ~ g#1 ~",
  E: "a1@3 ~ a1 ~ b1@3 ~ b1 ~ b1@3 ~", F: "a1@2 ~ a1@2 a1@2 ~", G: "e1@5 ~ e1@4 e1@4 ~@2",
  H: "g#1@3 ~ g#1 ~ g#1@3 ~ g#1 ~ g#1 ~ g#1 ~", I: "b1@4 b1@2 b1@3 ~ b1 ~ b1 ~ b1 ~",
  J: "e1@3 ~ e1@2 e1@3 ~ e1 ~ e1 ~ e1 ~", K: "e1@3 ~ e1 ~ e1@3 ~ e1 ~ e1@4", L: "a1@3 ~ a1@2 a1@3 ~ a1 ~ a1 ~ a1 ~",
  M: "a1@3 ~ a1@2 a1@3 ~ a1 ~ a1@4", N: "e1@3 ~ e1 ~ e1@3 ~ e1 ~ e1 ~ e1 ~", O: "g#1@4 g#1 ~ g#1 ~ g#1 ~ g#1 ~ g#1@4",
  P: "b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~", Q: "e1@4 ~@2 e1@7 ~ e1 ~", R: "c#2@5 ~ c#2@3 ~ c#2 ~ c#2@3 ~",
  S: "a1@4 ~@2 a1@3 ~ a1 ~ a1@3 ~", T: "f#1@4 ~@2 f#1@3 ~ f#1 ~ f#1@3 ~",
  U: "[e1@4 ~@2 e1@3 ~ e1 ~ e1 ~ a1@7 ~ e1@3 ~ e1 ~ e1@3 ~]/2", V: "a1@3 ~ a1@2 a1@3 ~ a1 ~ a1@2 a1 ~",
  W: "d2@5 ~ a1@3 ~ a1 ~ a1 ~ a1 ~", X: "c#2@5 ~ e1@4 e1 ~ e1 ~ e1 ~", Y: "c#2@5 ~ b1@4 b1 ~ b1 ~ b1 ~", Z: "e2",
  AA: "c#2",
  AB: "~ [b2,c3] [c#3,d3] [d#3,e3] [f3,f#3] [g3,g#3] [a3,a#3] [b3,c4] [c#4,d4] [d#4,e4] [f4,f#4] [g4,g#4] [a4,a#4] [b4,c5] c#5 ~, b1 ~@7", // Cmaj7 Dmaj7 Emaj7 F#maj7 G#maj7 A#maj7 Cmaj7 Dmaj7 …
  AC: "f#1@4 ~@2 f#1@7 ~ f#1 ~", AD: "d#2@5 ~ d#2@3 ~ d#2 ~ d#2@3 ~", AE: "b1@4 ~@2 b1@3 ~ b1 ~ b1@3 ~",
  AF: "g#1@4 ~@2 g#1@3 ~ g#1 ~ g#1@3 ~",
})).s("gm_electric_bass_finger").gain(0.57)

// chords · synth strings 2
const synth_strings_2 = note(`<
  ~@2 A B A B C D E F G H E I H J K L H E I H M N L H M N L C D E F G H E I H J K L H E I H M N L H M N L O P O Q O R O
  P H J K L H E I H M N L H M N S@2 T U V E T U V E T U V E T U V E
>`.pickRestart({
  A: "[e3,g#3,b3]@5 ~ [c#3,e3,g#3]@8 ~@2", B: "[c#3,e3,a3]@5 ~ [c#3,f#3,a3]@8 ~@2", C: "[e3,g#3,b3]@3 ~",
  D: "[e3,a3,c#4]@2 ~ [e3,g#3,b3]@4 ~", E: "[g#3,b3,d#4]", F: "[e3,a3,c#4]@4 ~@2 [d#3,f#3,b3]@9 ~", G: "[e3,a3,c4]",
  H: "[e3,g#3,b3]", I: "[d#3,f#3,b3]", J: "[e3,g#3,c4]", K: "[a3,c#4,e4]", L: "[f#3,a3,c#4]", M: "[e3,g#3,c#4]",
  N: "[e3,a3,c#4]", O: "[f#3,a3,d4]@5 ~ [c#3,e3,a3]@9 ~", P: "[e3,g#3,c#4]@5 ~ [e3,g#3,b3]@9 ~",
  Q: "[e3,g#3,c#4]@5 ~ [d#3,f#3,b3]@9 ~", R: "[e3,g#3,c#4]@5 ~ [e3,g#3,b3]@9 ~, ~@6 d3 ~@9", S: "[d#3,f#3,b3]/2",
  T: "[f#3,a#3,c#4]", U: "[f#3,a#3,d#4]", V: "[f#3,b3,d#4]",
})).s("gm_synth_strings_2").gain(0.28)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@33 A B C@2 D E@2 F@2 G H I@2 ~@2 I@2 ~@5 J K L M N ~@4 O P Q@4 ~@4 R S ~@8 T@2 ~@2 T@2 ~@2
>`.pickRestart({
  A: "c4", B: "b3", C: "d#4!4", D: "e4@6 d#4 e4", E: "[f#4@2 e4 d#4@2 e4@2 g#4@6 ~@3]/2",
  F: "[f#4@4 e4@2 f#4@3 ~ a4@4 g#4@14 ~@4]/2", G: "d#4", H: "~@6 [d#4,d#5]@2 [e4,e5]@4 [d#4,d#5]@2 [e4,e5] ~",
  I: "[f#4,f#5] [g#4,g#5] [f#4,f#5] [e4,e5]@5", J: "~@6 [f#4,f#5] [g#4,g#5]",
  K: "[a4,a5] [g#4,g#5]@2 [f#4,f#5]@2 [e4,e5]@3", // A G# F# E
  L: "[e4,e5]@2 [f#4,f#5]@2 [g#4,g#5]@2 [g#4,g#5]@5 ~ [f#4,f#5]@2 [g#4,g#5]@2", // E F# G# F# G#
  M: "[a4,a5]@2 [g#4,g#5]@3 ~ [f#4,f#5]@3 ~ [e4,e5]@4 [e4,e5] ~", N: "[e4,e5] [f#4,f#5] [g#4,g#5] [f#4,f#5]@3 ~@2",
  O: "~@6 e4 f#4 g#4 f#4 e4 g#4 b4 a4 g#4 b4",
  P: "b4 a#4 g#4 a#4 b4 a#4 b4 c#5 [g4,g#4] [a4,a#4] [b4,c5] [c#5,d5] [d#5,e5] [f5,f#5] [g5,g#5] [a5,a#5]", Q: "b5/4",
  R: "b3 ~ b3 ~ b3 ~ b3 ~ b3 ~ b3 ~ b3 ~ b3 ~",
  S: "~ [b3,c4] [c#4,d4] [d#4,e4] [f4,f#4] [g4,g#4] [a4,a#4] [b4,c5] [c#5,d5] [d#5,e5] [f5,f#5] [g5,g#5] [a5,a#5] [b5,c6] c#6 ~, b2 ~@7", // Cmaj7 Dmaj7 Emaj7 F#maj7 G#maj7 A#maj7 Cmaj7 Dmaj7 …
  T: "[g#4,g#5] [a#4,a#5] [g#4,g#5] [f#4,f#5]@5", // G# A# G# F#
})).s("gm_string_ensemble_1").gain(0.3).pan(0.6)

// other · string ensemble 1 · soft notes
const string_ensemble_1_soft = note(`<
  ~@2 A B A B ~@15 C D E F C D E F ~@13 G ~@3 E F ~@2 E F H I H J ~@4 K L M N ~@12 O P Q R O P Q R ~@2 Q R ~@2 Q R
>`.pickRestart({
  A: "[e4,g#4,b4]@5 ~ [c#4,e4,g#4]@8 ~@2", B: "[c#4,e4,a4]@5 ~ [c#4,f#4,a4]@8 ~@2", C: "[e4,g#4,b4]", D: "[e4,g#4,c#5]",
  E: "[e4,a4,c#5]", F: "[f#4,a4,c#5]", G: "[b3,g#4]", H: "[f#4,a4,d5]@5 ~ [c#4,e4,a4]@9 ~",
  I: "[e4,g#4,c#5]@5 ~ [e4,g#4,b4]@9 ~", J: "[e4,g#4,c#5]@5 ~ [d#4,b4]@9 ~, ~@3 f#4@3 ~@2", K: "[b4,b5]", L: "[c5,c6]",
  M: "[c#5,c#6]", N: "c6", O: "[f#4,a#4,c#5]", P: "[f#4,a#4,d#5]", Q: "[f#4,b4,d#5]", R: "[g#4,b4,d#5]",
})).s("gm_string_ensemble_1").gain(0.15).pan(0.6)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~@2 A B A B C D E F G C E H C I J G C E H C K J L C K J L C D E F G C E H C I J G C E H C K J L C K J L M N M O M N M
  O C I J G C E H P Q R S ~@5 T U H E T U H E T U H E T U H E
>`.pickRestart({
  A: "[b2,e3,g#3,b3]@4 ~@2 [c#3,e3,g#3,c#4]@3 ~ [e3,g#3,c#4] ~ [c#3,e3,g#3,c#4] ~ [e3,g#3,c#4] ~", // E C#m
  B: "[c#3,e3,a3,c#4]@4 ~@2 [c#3,f#3,a3,c#4]@4 [f#3,a3,c#4] ~ [c#3,f#3,a3,c#4] ~ [f#3,a3,c#4] ~", // A F#m
  C: "[b2,e3,g#3,b3]@2 [b2,e3,g#3,b3]@2 [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3]@2 [b2,e3,g#3,b3]@2 [b2,e3,g#3,b3]@2 [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3]@2", // E
  D: "[e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4] ~ [b2,e3,g#3,b3]@2 [b2,e3,g#3,b3]@2 [b2,e3,g#3,b3]@2 [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3]@2", // A E
  E: "[d#3,g#3,b3,d#4]@2 [d#3,g#3,b3,d#4]@2 [d#3,g#3,b3,d#4] ~ [d#3,g#3,b3,d#4]@2 [d#3,g#3,b3,d#4]@2 [d#3,g#3,b3,d#4]@2 [d#3,g#3,b3,d#4] ~ [d#3,g#3,b3,d#4]@2", // G#m
  F: "[e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4] ~ [e3,a3,c#4,e4]@2 [f#3,b3,d#4,f#4]@2 [f#3,b3,d#4,f#4]@2 [f#3,b3,d#4,f#4] ~ [f#3,b3,d#4,f#4]@2", // A B
  G: "[e3,a3,c4,e4]@2 [e3,a3,c4,e4]@2 [e3,a3,c4,e4] ~ [e3,a3,c4,e4]@2 [e3,a3,c4,e4]@2 [e3,a3,c4,e4]@2 [e3,a3,c4,e4] ~ [e3,a3,c4,e4]@2", // Am
  H: "[f#3,b3,d#4,f#4]@2 [f#3,b3,d#4,f#4]@2 [f#3,b3,d#4,f#4] ~ [f#3,b3,d#4,f#4]@2 [f#3,b3,d#4,f#4]@2 [f#3,b3,d#4,f#4]@2 [f#3,b3,d#4,f#4] ~ [f#3,b3,d#4,f#4]@2", // B
  I: "[b2,e3,g#3,c4]@2 [b2,e3,g#3,c4]@2 [b2,e3,g#3,c4] ~ [b2,e3,g#3,c4]@2 [b2,e3,g#3,c4]@2 [b2,e3,g#3,c4]@2 [b2,e3,g#3,c4] ~ [b2,e3,g#3,c4]@2", // E
  J: "[e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4] ~ [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4]@2 [e3,a3,c#4,e4] ~ [e3,a3,c#4,e4]@2", // A
  K: "[g#3,c#4,e4,g#4]@2 [g#3,c#4,e4,g#4]@2 [g#3,c#4,e4,g#4] ~ [g#3,c#4,e4,g#4]@2 [g#3,c#4,e4,g#4]@2 [g#3,c#4,e4,g#4]@2 [g#3,c#4,e4,g#4] ~ [g#3,c#4,e4,g#4]@2", // C#m
  L: "[c#3,f#3,a3,c#4]@2 [c#3,f#3,a3,c#4]@2 [c#3,f#3,a3,c#4] ~ [c#3,f#3,a3,c#4]@2 [c#3,f#3,a3,c#4]@2 [c#3,f#3,a3,c#4]@2 [c#3,f#3,a3,c#4] ~ [c#3,f#3,a3,c#4]@2", // F#m
  M: "[a3,d4,f#4,a4]@2 ~ [a3,e4,a4]@3 ~@2, ~@3 c#4@2 ~@3", N: "[g#3,c#4,e4,g#4]@2 ~ [g#3,b3,e4,g#4]@3 ~@2",
  O: "[g#3,c#4,e4,g#4]@2 ~ [f#3,b3,d#4,f#4]@3 ~@2", // C#m B
  P: "[e3,g#3,b3,e4]@3 ~ [g#3,b3] ~ [e3,g#3,b3,e4]@3 ~ [g#3,b3]@2 [e3,g#3,b3,e4]@2 g#3 ~", // E G#m E G#m E
  Q: "[e3,g#3,c#4,e4]@4 c#4 ~ [e3,g#3,c#4,e4]@3 ~ [g#3,c#4]@2 [c#3,e3,g#3,c#4]@2 ~@2", // C#m C#5 C#m
  R: "[e3,a3,c#4]@3 ~ [a3,c#4] ~ [e3,a3,c#4]@3 ~ [a3,c#4] ~ [e3,a3,c#4] ~ [a3,c#4] ~", // A
  S: "[f#3,a3,c#4]@3 ~ [a3,c#4] ~ [f#3,a3,c#4]@3 ~ [a3,c#4]@2 [f#3,a3,c#4]@2 [a3,c#4] ~", // F#m A F#m A F#m A
  T: "[c#3,f#3,a#3,c#4]@2 [c#3,f#3,a#3,c#4]@2 [c#3,f#3,a#3,c#4] ~ [c#3,f#3,a#3,c#4]@2 [c#3,f#3,a#3,c#4]@2 [c#3,f#3,a#3,c#4]@2 [c#3,f#3,a#3,c#4] ~ [c#3,f#3,a#3,c#4]@2", // F#
  U: "[a#3,d#4,f#4,a#4]@2 [a#3,d#4,f#4,a#4]@2 [a#3,d#4,f#4,a#4] ~ [a#3,d#4,f#4,a#4]@2 [a#3,d#4,f#4,a#4]@2 [a#3,d#4,f#4,a#4]@2 [a#3,d#4,f#4,a#4] ~ [a#3,d#4,f#4,a#4]@2", // D#m
})).s("gm_acoustic_guitar_steel").gain(0.4).pan(0.4)

// other · distortion guitar
const distortion_guitar = note("<~@2 A B A C ~@46 D E D F D E D F ~@3 G ~@11 H@2 ~@15>".pickRestart({
  A: "f#4@3 ~@5", B: "f#4@5 ~ e4@9 ~", C: "f#4@3 e4@4 ~", D: "~ d3!2 ~ a2!4", E: "~ c#3!2 ~ e2!4", F: "~ c#3!2 ~ b2!4",
  G: "f#2!8", H: "[~@6 f4@2 f#4@3 ~ f4@2 f4@4 ~@14]/2",
})).s("gm_distortion_guitar").gain(0.29).pan(0.6)

// other · overdriven guitar
const overdriven_guitar = note(`<
  ~@2 A B A C ~@6 D@2 ~@7 E F ~@2 E G ~@8 D@2 ~@7 E F ~@2 E G ~@2 H I H J H I H J ~@16 K L ~@2 K M ~@2 K L ~@2 K M ~@2
>`.pickRestart({
  A: "f#3@6 e3@9 ~", B: "f#3@5 ~ e3@9 ~", C: "f#3@3 e3@4 ~", D: "d#4!4", E: "~@4 e4@2 f#4@4 g#4@5 ~",
  F: "~@4 e4@2 f#4@3 ~ g#4@4 ~@2", G: "~@4 e4@2 f#4@3 ~ g#4@3 ~@3", H: "a4@2 g#4@4 f#4@4 e4@4 c#4 ~",
  I: "e4 f#4 g#4 b4@2 b4 f#4@2", J: "e4 f#4 g#4@4 ~@2", K: "~@4 f#4@2 g#4@4 a#4@5 ~", L: "~@4 f#4@2 g#4@3 ~ a#4@4 ~@2",
  M: "~@4 f#4@2 g#4@3 ~ a#4@3 ~@3",
})).s("gm_overdriven_guitar").gain(0.31).pan(0.4)

// other · electric guitar muted
const electric_guitar_muted = note("<~@2 A B A B ~@46 C D C E C D C E ~@5 F ~@26>".pickRestart({
  A: "~ e3 g#3 ~ e3 ~@3", B: "~ a2 e3 ~ f#2 ~@3", C: "~ d3 f#3 ~ a2!2 e3 e2", D: "~ c#3 e3 ~ e3!2 b2 e3",
  E: "~ c#3 e3 ~ b2!2 d#3 b2", F: "~@3 c#2 ~@3 c#2",
})).s("gm_electric_guitar_muted").gain(0.35).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~@2 [x ~@2 x ~ x ~@2]!65 ~@8 x [x ~@2 x ~ x ~@2]!16>").gain(0.45)

// drums · snare
const snare = s("sd").struct("<~@2 A@26 B A@38 ~@7 C D A@11 ~@5>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~ x!2", C: "~@4 x!4", D: "x ~@10 x!2 ~@3",
})).gain(0.5)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@74 [x!4 ~@4] [~@5 x ~@2] ~@11 [~ x ~ x]!5>").gain(0.2)

// drums · low tom
const low_tom = s("lt").struct("<~@5 A ~@37 B ~@7 A ~@31 A ~@7 A>".pickRestart({
  A: "~@7 x", B: "~@15 x",
})).gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<A B C A C D C@11 A C@14 A C@2 A C@4 A C@44 ~@7>".pickRestart({
  A: "x!4", B: "x!3 ~", C: "x ~ x ~ x ~ x!2", D: "x ~ x ~@3 x!2",
})).gain(0.45)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@2 [~ x ~ x ~ x ~@2]!83 [x!8]!7>").gain(0.25)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@5 A ~@7 B ~@6 C ~@3 B ~@11 B ~@6 C ~@3 B ~@3 D ~@7 E ~@6 B ~@7 F G ~@3 B ~@3 D ~@8
>`.pickRestart({
  A: "~@5 x!3", B: "~@7 x", C: "~@13 x!2 ~", D: "~@12 x!2 ~@2", E: "~@6 x!2", F: "~@4 x!4", G: "x",
})).gain(0.45)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@74 [x!4 ~@4] ~@12 [~@7 x] ~@3 [~@12 x!2 ~@2]>").gain(0.2)

// drums · open hat
const open_hat = s("oh").struct("<~@3 A ~ B ~@11 A ~@14 A ~@2 A ~@4 A ~@51>".pickRestart({
  A: "~@7 x", B: "~ x",
})).gain(0.45)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@5 A ~@14 A ~@3 A ~@3 A ~@14 A ~@3 A ~@3 B ~@7 C ~@6 A ~@7 D E ~@3 A ~@3 B ~@8
>`.pickRestart({
  A: "~@5 x!2 ~", B: "~@10 x!2 ~@4", C: "~@4 x!2 ~@2", D: "~@3 x!5", E: "x",
})).gain(0.45)

// drums · high tom · soft notes
const high_tom_soft = s("ht").struct("<~@74 [x!3 ~@5] ~@12 [~@5 x!2 ~] ~@3 [~@10 x!2 ~@4]>").gain(0.2)

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

// drums · ride
const ride = s("rd").struct("<~@21 A@3 B A@4 ~@15 A@3 B A@19 ~@9 A@3 B A@5 ~@7>".pickRestart({
  A: "~@2 x!2", B: "~@4 x!4",
})).gain(0.45)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@85 [~@2 x!2]!2 [~@4 x!4] [~@2 x!2]!4>").gain(0.2)

// drums · tambourine
const tambourine = s("tb").struct("<~@21 [x!16]!8 ~@15 [x!16]!23 ~@9 [x!16]!12 ~@4>").gain(0.3)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@88 [x!16]!4>").gain(0.15)

stack(
  bass, synth_strings_2, string_ensemble_1, string_ensemble_1_soft, acoustic_guitar_steel, distortion_guitar,
  overdriven_guitar, electric_guitar_muted, kick, snare, snare_soft, low_tom, hihat, hihat_soft, mid_tom, mid_tom_soft,
  open_hat, high_tom, high_tom_soft, crash, ride, ride_soft, tambourine, tambourine_soft
)

More by Bryan Adams