Strudelify

It Must Be Love

Alan Jackson

KeyG majorTempo116 bpm
0:00/0:00
// It Must Be Love — Alan Jackson
// 116 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 91 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(116/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
const bass = note(`<
  A B C D E B C D F G H I J G H I J K L@2 J K L M J B C D E B C D F G N I J G H I J K M L J K L@2 J B C D E B C D F G H
  I J G H I J K L@2 J K M@2 J K L@2 J K L@2 J B C D E B C D O@3
>`.pickRestart({
  A: "~@10 d2@3 ~ d2 ~", B: "g1@4 d2 ~ e2 ~ g2 ~ g2@3 ~ g1 ~", C: "c2 ~ c2@4 g1 ~ c2 ~ c2@5 ~",
  D: "g1@3 ~ d2 ~ e2 ~ g2 ~ g2@4 g1 ~", E: "d2 ~ d2@3 ~ a1@2 d2 ~ d2@5 ~", F: "d2 ~ d2@3 ~ d2 ~ g1 ~ e2 ~ d2 ~ e2 ~",
  G: "g2@5 ~ d2 ~ g2 ~ g2@4 ~@2", H: "c2@4 ~@2 g1@2 c2 ~ c2@4 ~@2", I: "g2@5 ~ d2 ~ g2 ~ g2@5 ~",
  J: "d2@4 ~@2 d2 ~ g1 ~ g1 ~ d2@3 ~", K: "g1@4 d2 ~ e2 ~ g2 ~ g2@4 a1 ~", L: "c2 ~ c2@3 ~ c2 ~ g1 ~ g1@6",
  M: "c2 ~ c2@4 c2 ~ g1 ~ g1@6", N: "c2@4 ~@2 g1@2 c2 ~ c2@5 ~", O: "[d2 ~ d2@3 ~ d2 ~ g1@40]/3",
})).s("gm_fretless_bass").gain(0.38)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~ A B C D E F G H ~@3 I@2 J@2 K ~@3 L@2 ~@2 M@2 B C D E F G H ~@3 L@2 J@2 K ~@3 I@2 ~@2 M@2 B C D E F G H ~@3 L@2 J@2
  K ~@3 L@2 ~@2 I@2 ~@2 L@2 ~@2 M@2 B C D E F G N@3
>`.pickRestart({
  A: "e4@2 d4@2 ~@2 b3@3 ~ b3@2 a3@2 g3@2, g3@3 ~", B: "~@2 g3 ~ a3@2 g3@8 ~@2, [c3,e3]@7 ~",
  C: "e4@2 d4@3 ~ b3@3 ~ b3@2 a3@2 g3 ~", D: "[e4,g4] ~ [e4,g4] [d4,f#4]@4 ~, ~ a3@6 ~",
  E: "e4@2 d4@2 ~@2 b3@2 ~@2 b3@2 a3 g3 e3@2, g3@3 ~", F: "~@4 a3@2 g3@7 ~@3, c3@13 ~@3, ~@2 e3@11 ~@3",
  G: "a5@2 g5 ~ g5@2 e5 ~@3 d5 ~@3 b4@2, d5@3 ~ [b4,e5]@2 [g4,d5]@2", // E5 G5
  H: "[b4,d5] ~ [b4,d5]@2 [a4,c5]@2 b4@3 ~ b4 c5 b4 g4 e4 d4, ~@3 g4@3 ~@2", // Bm Am
  I: "[~@8 [e4,g4]@2 d4@2 [b3,d4] ~ [b3,d4]@15 ~@3, ~@8 d4 ~@23]/2", J: "[~@10 c#4 ~ b4@10 g4@2 ~@8, ~@11 d4@13 ~@8]/2",
  K: "~@8 b3@2 d4 ~ b3 a3 g3@2, ~@8 g3@5 ~@3", L: "[~@8 [e4,g4]@2 d4@2 [b3,d4]@2 [b3,d4]@15 ~@3, ~@8 d4 ~@23]/2",
  M: "[~@4 [e4,g4] d4 [b3,d4] ~ e4 ~@2 b3@2 b3 a3 g3, ~@8 d4 ~@5 b3@8 ~@10, ~@14 d4@4 d4@11 ~@3, ~@4 g3@3 ~]/2", // Em Bm
  N: "[[b4,d5]!2 [a4,c5] [g4,b4]@21]/3", // Bm Am G
})).s("gm_electric_guitar_clean").gain(0.15)

// other · electric guitar jazz
const electric_guitar_jazz = note(`<
  ~@4 A@2 B@2 ~@8 C@2 D E F ~ D E F ~@3 A@2 B@2 ~@8 C@2 D E F ~ D E F ~@3 A@2 B@2 ~@8 C@2 D E F ~ D E F ~ D E F ~ D E F
  ~@3 A@2 B@2 ~@3
>`.pickRestart({
  A: "[~@5 [b4,d5] [a4,c5]@9 ~]/2", B: "[~@10 g4@2 e4@17 ~@3]/2", C: "[~@2 [b3,g4] [c4,a4]@5]/2", D: "~@10 b4 c5 b4@4",
  E: "c5 b4", F: "a4@3 g4@4 ~",
})).s("gm_electric_guitar_jazz").gain(0.19)

// chords · electric guitar jazz
const electric_guitar_jazz_2 = note(`<
  ~ A B C D C E F G ~@16 A B C D C E F H ~@16 A I C D C E F G ~@24 A I C D C E F J@3
>`.pickRestart({
  A: "[d4,g4]@2 [d4,g4]@2 ~@2 [b3,d4]@3 ~ [b3,d4]@3 ~@3", B: "[g3,c4] ~ [g3,c4] ~@3 [g3,c4]@7 ~@3",
  C: "[d4,g4] ~ [d4,g4]@2 ~@2 [b3,d4]@3 ~ [b3,d4]@3 ~@3", D: "[a3,e4] ~@3 [a3,e4]@2 [a3,d4]@8 ~@2",
  E: "[g3,c4]@2 ~@2 [g3,c4]@2 [g3,c4]@7 ~@3", // C5
  F: "[e5,a5]@2 [d5,g5] ~ [d5,g5]@2 [b4,e5] ~ [b4,e5]@2 [a4,d5] ~ [a4,d5]@2 b4 ~", // A5 G5 E5 D5
  G: "~@4 a4@2 [d4,g4]@9 ~, b4 ~@3, ~ d4@2 ~@5", H: "~@2 d4@2 a4@2 [d4,g4]@9 ~, b4 ~@3",
  I: "[g3,c4]@2 [g3,c4] ~@3 [g3,c4]@7 ~@3", J: "[~ d4 a4 [d4,g4]@21, b4 ~@11]/3",
})).s("gm_electric_guitar_jazz").gain(0.25)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~ A B C D A E F G H I J K H I J K L M@2 K L M@2 K A B C D A E F G H I J K H I J K L M@2 K L M@2 K A B C D A E F G H I
  J K H I J K L M@2 K L M@2 K L M@2 K L M@2 K A B C D A E F N@3
>`.pickRestart({
  A: "[d3,g3]@5 ~ [d3,g3]@5 ~ [d3,g3]@3 ~", B: "[c3,g3]@3 ~@3 [c3,g3]@4 c3@2 g3@2 c3@2",
  C: "[d3,g3] ~@5 [d3,g3]@5 ~ [d3,g3]@3 ~", D: "[d3,a3]@2 ~@4 [d3,a3]@4 d3@2 a3@2 d3 ~",
  E: "[c3,g3]@2 ~@4 [c3,g3]@5 ~ [c3,g3]@3 ~", F: "[d3,g3]@4 ~@2 [d3,g3]@5 ~ [d3,g3]@3 ~",
  G: "[d3,a3]@3 ~ [d3,a3] ~ [d3,g3]@10", H: "[g3,b3]@3 [g3,b3]@2 d3 [g3,b3] d3, d3@3 ~@3 d3@3 ~@7",
  I: "[e3,g3,c4]@2 ~ [e3,g3,c4]@2 c3 [e3,g3,c4] c3, c3 ~ c3@2 ~@4", // C
  J: "[g3,b3]@4 ~@2 [g3,b3]@4 d3@2 [g3,b3]@2 d3 ~, d3@3 ~ d3@5 ~@7", // G
  K: "[d3,f#3,a3,d4]@3 ~ [f#3,a3,d4]@2 d3 ~ [g3,b3]@6 d3 ~, ~@2 d3 ~", // D G
  L: "[d3,g3,b3]@4 ~@2 [g3,b3]@4 d3@2 b3@2 d3 ~, g2 ~@3 g2@4 ~@4 g3 ~@3", // G
  M: "c3 ~ c3 [g3,b3]@2 ~ [g3,b3]@2, [e3,g3,c4]@3 d3 ~ d3@3", N: "[[d3,a3]@3 ~ [d3,a3] ~ [g3,b3,d4,g4]@42]/3",
})).s("gm_acoustic_guitar_steel").gain(0.32)

// chords · piano · "BuVoc"
const piano = note("<~@17 A B ~@4 C D ~@16 A B ~@4 C D ~@16 A B ~@4 C D A B ~@4 C D ~@10>".pickRestart({
  A: "[b3,d4,g4]", B: "[c4,e4,g4]@3 [b3,d4,g4]@3 ~@2", C: "[c4,e4,g4]@3 [b3,d4,g4]@5",
  D: "[a3,d4,f#4]@3 [b3,d4,g4]@3 ~@2", // D G
})).s("gm_piano").gain(0.48)

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

// drums · snare
const snare = s("sd").struct("<[~@3 x] [~ x ~ x]!85 [~ x ~@2] ~@4>").gain(0.43)

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

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

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

// drums · cowbell
const cowbell = s("cb").struct("<~ A@8 ~@8 A@16 ~@8 A@16 ~@8 A@23 B ~@2>".pickRestart({
  A: "x!4", B: "x!3 ~",
})).gain(0.33)

stack(
  bass, electric_guitar_clean, electric_guitar_jazz, electric_guitar_jazz_2, acoustic_guitar_steel, piano, kick, snare,
  hihat, open_hat, crash, cowbell
)

More by Alan Jackson