Strudelify

Born to Love You

Mark Collie

KeyG majorTempo106 bpm
0:00/0:00
// Born to Love You — Mark Collie
// 106 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 86 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(106/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.

// chords · piano · "HONKY TONK"
const piano = note(`<
  ~ A@2 B@2 C D E F G H I@2 J K E L M@2 N O P@2 Q@2 R@2 S@2 T@2 U V W X Y Z AA D AB@2 AC@2 AA D AD L AE AF AG@2 AH D AI
  AJ AK@2 AL@2 AM@2 AN@2 AO@2 AP@2 AQ@2 AN@2 AR@2 AS@2 AT@2 AU@2 AV@2 AW@2 AX@2 AY
>`.pickRestart({
  A: "[g2@4 [d3,g3,b3]@6 g2@2 d3@4 ~@4 [g3,b3]@5 ~ [c2,e3,c4] ~ [c2,e3,g3,c4]@4, ~@12 [g3,b3]@6 d3@7 ~ g3@2 ~@4, ~@4 g2 ~@3]/2", // G C G
  B: "[g2@2 [d3,g3]@3 g2 e3 ~ [d3,b3]@8, f2 ~@3 b3@9 ~ g3@18, ~@16 g2@11 ~@5]/2", // G5 G
  C: "~@6 d4@9 ~, e3, e2@4 b3@11 ~, ~ g3@7", D: "~@6 d4@9 ~, d3, ~@2 f#3@13 ~, ~@4 a3@11 ~",
  E: "~@3 c4@5, c3, ~ e3@7, ~ g3@3", F: "~@6 b3@9 ~, g2@15 ~, ~@2 d3@13 ~, ~@4 g3@11 ~",
  G: "c3@4 ~@8 c4@3 ~, c4@3 ~, g3@10 g3@5 ~, e3@8 e3@7 ~, ~@3 c3@3 ~@2",
  H: "[f#3,a3]@8 d3@2 ~@2 a3@3 ~, d4@15 ~, d3@6 ~@4 f#3@5 ~", // F#m
  I: "[d3@18 ~@4 g3@5 ~ f#3@3 ~, b3@22 ~@6 g3 ~@3, g3@20 d3@11 ~, g2@9 ~@9 g2@13 ~]/2",
  J: "~@3 d4@5, e3, ~ g3@7, ~ b3@3", K: "~@6 d4@9 ~, d3, ~ f#3@7, ~@4 a3@11 ~", L: "~@3 b3@5, g2, ~@2 d3@13 ~, ~ g3@3",
  M: "[~@3 c4, c3@8 ~ c3@7, ~ e3@8 ~ e3@6, ~@2 g3@8 ~ g3@5, ~@3 c4@7 ~@6]/2",
  N: "~@6 d4@9 ~, d3@15 ~, ~@2 f#3@13 ~, ~@4 a3@11 ~", O: "[d3,f#3,a3,d4]@15 ~",
  P: "[g2@2 [d3,g3,b3]@3 ~@9 b3@2, ~@5 g2@2 [g3,b3]@5 d3@4, ~@6 d3@5 g2@2 g3@3]/2", // G
  Q: "[e2@2 e3@3 ~@9 [g3,b3]@2, ~ [g3,b3]@2 e3@3 e2 ~, ~@5 e2@2 [g3,b3]@6 e3@3]/2", // G
  R: "[c2@4 c3@6 ~@12 c2 ~@5 g3@4, ~@2 [e3,g3]@4 c3@5 ~ c3@4, ~@10 c2@4 [e3,g3]@10 ~@2 e3@5 ~]/2", // Em
  S: "[g2@4 d3@12 ~@4 [g3,b3]@5 ~ [c2,e3,c4] ~ [c2,e3,g3,c4]@4, ~@4 [g3,b3]@14 d3@7 ~ g3@2 ~@4, ~@4 g2 ~@3]/2", // G C G
  T: "[g2@2 [d3,g3,b3]@3 g2 d3@6 g2 ~ g3@2, ~@6 [g3,b3]@7 d3@3]/2", U: "e2@2 [e3,g3,b3]@3 e2 [e3,g3,b3]@2",
  V: "e2@3 ~ e3@5 ~ e2@2 ~@2 g3@2, ~ b3@3, ~ g3@2 e3", W: "c2 [c3,e3,g3]@3",
  X: "~@10 c2 ~@3 e3@2, c2 g3@3, ~@2 c3@7 ~@3 c3@4, ~ e3@2 ~", Y: "g2@2 [d3,g3,b3]@5 g2", Z: "[g2,d3,g3,b3]@15 ~",
  AA: "~@6 d4@9 ~, e3, ~@2 g3@13 ~, ~@4 b3@11 ~",
  AB: "[~@6 c4@7 ~@3 c4@15 ~, c3@13 ~ [c3,e3]@16 ~@2, ~@2 e3@11 ~@19, ~@4 g3@9 ~@2 g3@16 ~]/2", // C
  AC: "[g2@4 [d3,g3,b3]@6 g2@2 d3@5 ~ g2@2 ~@2 g3@9 ~, ~@6 [g3,b3]@4 d3@5 ~]/2", // G
  AD: "~@6 c4@9 ~, c3, ~@2 e3@13 ~, ~ g3@3", AE: "~@3 c4@5, c3, ~@2 e3@13 ~, ~ g3@3",
  AF: "~@6 d4@9 ~, d3@11 ~@5, ~ f#3@7, ~ a3@3", AG: "[~@6 b3@21 ~@5, g2@25 ~@7, ~@2 d3@25 ~@5, ~@4 g3@23 ~@5]/2",
  AH: "~@3 d4@5, e3, ~@2 g3@13 ~, ~@4 b3@11 ~", AI: "~@6 c4@9 ~, c3, ~@2 e3@13 ~, ~@4 g3@11 ~",
  AJ: "~@6 b3@9 ~, g2, ~@2 d3@13 ~, ~@4 g3@11 ~",
  AK: "[~@3 c4, c3@8 ~ c3@7, ~@2 e3@16 ~@2 e3@11 ~, ~@4 g3@16 ~@2 g3@9 ~, ~@3 c4@7 ~@6]/2",
  AL: "[~@13 d3 ~ a3, d3@14 ~ d3@6 ~@11, ~@2 f#3@13 ~@3 f#3@8 ~@2 f#3@4, ~ a3@3 ~ a3@2 ~, ~@6 d4@11 ~@5 d4@6 ~@4]/2",
  AM: "[~@24 b3@7 ~, g2@15 ~@3 g2@8 ~@6, ~@2 d3@16 ~@2 d3@11 ~, ~@2 g3@8 ~ g3@5, ~@3 b3@7 ~@6]/2",
  AN: "[~@24 b3@7 ~, e2@15 ~@3 e2@14, ~@2 e3@16 ~@2 e3@11 ~, ~@4 g3@16 ~@2 g3@9 ~, ~@3 b3@7 ~@6]/2",
  AO: "[~@13 c2 ~ e3, c2@16 ~@2 c2@7 ~@7, ~ c3@8 ~ c3@3 ~ c3@2, ~@2 e3@8 ~ e3@3 ~@2, ~@3 g3@7 ~ g3@5]/2",
  AP: "[~@2 e3 ~@17 [g3,b3]@5 ~ [c2,e3,g3,c4] ~ [c2,e3,g3,c4]@4, g2@14 ~@2 g2@9 ~@7, ~@2 d3@14 ~@2 d3@7 ~@7, ~@2 g3@7 ~@7, ~@3 b3@6 ~@7]/2", // G C
  AQ: "[~@3 b3, g2@16 ~@2 g2@7 ~@7, ~ d3@8 ~ d3@6, ~@2 g3@8 ~ g3@5, ~@3 b3@7 ~@6]/2",
  AR: "[b1 ~@27 g3@4, c2@13 ~@5 c2@10 ~@4, ~ c3@8 ~@2 c3@5, ~@2 e3@8 ~@3 e3@3, ~@6 g3@15 ~@11]/2",
  AS: "[~@20 [g3,b3]@5 ~ [c2,e3,g3,c4] ~ [c2,e3,g3,c4]@4, g2@13 ~@3 g2@10 ~@6, ~@2 d3@14 ~@2 d3@7 ~@7, ~@2 g3@7 ~@7, ~@3 b3@6 ~@7]/2", // G C
  AT: "[~@3 b3, g2@16 ~@2 g2@7 ~@7, ~@2 d3@16 ~@2 d3@11 ~, ~@2 g3@8 ~ g3@5, ~@3 b3@7 ~@6]/2",
  AU: "[~@13 e2 ~ g3, e2@8 ~ e2@3 ~@4, ~ e3@8 ~ e3@3 ~ e3@2, ~@2 g3@8 ~ g3@3 ~@2, ~@3 b3@7 ~ b3@5]/2",
  AV: "[~@22 [e3,g3]@9 ~, c2@8 ~ c2@2 ~@5, ~@2 c3@16 ~@2 c3@11 ~, ~ e3@4 ~@3, ~@3 g3@7 ~@6]/2", // Em
  AW: "[~@22 b3@3 ~ [c3,e3,g3,c4] ~ [c3,e3,g3,c4]@4, g2@15 ~ g2@6 ~@10, ~@2 d3@14 ~@2 d3@7 ~@7, ~@4 g3@14 ~@2 g3@5 ~@7, ~@3 b3@6 ~@7]/2", // C
  AX: "[[g2,d3,g3,b3]@31 ~]/2", AY: "[g2,d3,g3,b3] ~@3",
})).s("gm_piano").gain(0.55)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~ A B C D E F G H G I H J E I K A K L M N H@2 O@2 G@2 A P H A O Q G R S D E T U V H D E F G A K I A D E I K A K@2 I@2
  A@2 Q O G K A P H A O@2 K@2 A B H A O Q G K A B W@2 X
>`.pickRestart({
  A: "g1@4 ~@2 g1 ~ g1@7 ~", B: "g1@5 ~ g1 ~ g1 ~ c2 ~ c2@3 ~", C: "g1@4 ~@2 g1 ~ g1@6 ~@2",
  D: "g1@7 ~ g1@2 a1@2 g1@2 f#1@2", E: "e1@5 ~ e1 ~ e1@7 ~", F: "d2@5 ~ d2 ~ d2@7 ~", G: "c2@5 ~ c2 ~ c2@7 ~",
  H: "g1@5 ~ g1 ~ g1@7 ~", I: "d2@4 ~@2 d2 ~ d2@7 ~", J: "g1@3 ~ g1 a1 g1 f#1", K: "c2@4 ~@2 c2 ~ c2@7 ~",
  L: "c2@4 ~@2 c2 ~ c2@6 ~@2", M: "d2@4 ~@2 d2 ~ d2@5 ~ a1@2", N: "d2@15 ~", O: "e2@5 ~ e2 ~ e2@7 ~",
  P: "g1@4 ~@2 g1 ~ g1 ~ c2 ~ c2@3 ~", Q: "e2@4 ~@2 e2 ~ e2@7 ~", R: "c2@5 ~ c2 ~ c2@6 ~@2", S: "g1@5 ~ g1 ~ g1@6 ~@2",
  T: "d2@4 ~@2 d2 ~ d2@3 ~ a1@2 b1@2", U: "c2@5 ~ c2 ~ c2@3 ~ g1 ~ a1@2", V: "c2@15 ~", W: "[g1@15 ~]/2", X: "g1 ~@3",
})).s("gm_electric_bass_finger").gain(0.55)

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

// drums · snare
const snare = s("sd").struct("<A B C B ~ B@15 D B@18 E F B@25 C B@15 C ~@3>".pickRestart({
  A: "~@5 x!3", B: "~ x ~ x", C: "~@2 x ~@2 x!2 ~", D: "~@3 x", E: "~@2 x ~ x ~ x!2", F: "~@11 x!2 ~@3",
})).gain(0.6)

// drums · low tom
const low_tom = s("lt").struct("<~@19 A@2 ~@18 B@2 ~@25 C ~@7 B ~@7 C ~@3>".pickRestart({
  A: "~@3 x", B: "~@7 x", C: "~@5 x!2 ~",
})).gain(0.6)

// drums · hihat
const hihat = s("hh").struct("<~ A B@2 C A@14 B C A@19 D A@42 D@2 ~>".pickRestart({
  A: "x!8", B: "x!7 ~", C: "x!2 ~ x", D: "~ x ~ x",
})).gain(0.54)

// drums · mid tom
const mid_tom = s("mt").struct("<~@19 [~@5 x ~@2] ~@19 [~@11 x!2 ~@3] ~@34 [~@3 x] ~@11>").gain(0.6)

// drums · open hat
const open_hat = s("oh").struct("<~@2 [~@7 x]!2 ~@15 [~@7 x]!2 ~@65>").gain(0.54)

// drums · high tom
const high_tom = s("ht").struct("<~@74 [~@5 x ~@2] ~@11>").gain(0.6)

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

// drums · ride
const ride = s("rd").struct("<~@21 A@7 B A@7 C ~@22 A@7 D A@7 D A@7 D ~@3>".pickRestart({
  A: "x!8", B: "x!5 ~ x!2", C: "x!7 ~", D: "x!5 ~@3",
})).gain(0.6)

stack(piano, bass, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash, ride)