Strudelify

Achy Breaky Heart

Boxcar

KeyE majorTempo125 bpm
0:00/0:00
// Achy Breaky Heart — Boxcar
// 125 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 102 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): MUTED GTR.
setcpm(125/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 · "A.PIANO 1"
const piano = note(`<
  ~ A@7 B@4 C D@3 B@4 C D@3 E F@3 C D@3 B@4 C D@3 B@4 C D@3 E F@3 G@4 B@4 H@4 B@4 C D@3 E F@3 C ~@7 I D@3 E F@3 C D@3 E
  F@3 J@2
>`.pickRestart({
  A: "[[a2,a3,c#4,e4]@2 ~@2 [a2,a3,d4,f#4]@2 a1@2 [a3,c#4,e4] ~ [a2,a3,d4,f#4] ~ a1@2 c4@2 c#4@2 a1@2 [a2,a3,f#4]@2 ~@2 [a2,a3]@2 [a1,a3,d4,f#4] ~@3 c4@2 c#4@2 a1@2 [a2,a3,f#4]@2 ~@2 [a2,a3]@2 [a1,a3,d4,f#4] ~@3 c4@2 c#4@2 a1@2 [a2,a3]@2 ~@2 [c#4,e4] ~ d4@2 a1@2 c4@2 c#4@2 a1@2 [a2,a3,f#4]@2 ~@2 [a2,a3]@2 [a3,d4,f#4] ~ a1@2 c4@2 c#4@2 a1@2 [a2,a3,f#4]@2 ~@2 [a2,a3,c#4]@2 [d4,f#4] ~@3 c4@2 c#4@2 ~@2 [a3,f#4]@2 ~@4 [c#2,e4]@2 [d2,f#4]@2 [d#2,g4]@2, ~@8 a2@2 ~@4 [a2,a3,e4]@4 ~@6 [c#4,e4] ~@3 a2@6 ~@10 a2@6 ~@6 [a2,a3]@4 ~@2 [a2,a3,e4]@4 ~@12 [a2,a3,e4]@4 ~@8 a1@2 a2@6 a1@4 a2@6 ~@4, ~@30 [a3,e4]@4 ~@6 [c#4,e4] ~@5 [a3,e4]@4 ~@2 f#4 ~@5 f#4 ~@13 [c#4,e4] ~@15 e4 ~@5 [a3,e4]@4 ~@6 c#4@4 ~@4]/7", // A D A D A D A D …
  B: "[[e4,g#4,b4]@2 ~@2 [c#3,e4,c#5]@2 ~@2 [b2,g#4,b4] ~ [c#3,e4]@2 e2@2 g4@2 g#4@2 e2@2 [c#3,e4,c#5]@2 ~@2 [b2,e4]@2 [c#3,e4,a4]@2 e2@2 g4@2 g#4@2 e2@2 [c#3,e4,a4,c#5]@2 ~@2 [b2,g#4,b4] ~ [e4,a4,c#5] ~ e2@2 g4@2 g#4@2 e2@2 [c#3,e4]@2 e2@2 [b2,g#4,b4]@2 e4@2 f#4@2 a4 ~, e2 ~@5 e2@4 ~@4 [b2,e4,b4]@4 ~@12 [b2,e4,b4]@4 ~@8 c#3@2 ~@2 [b2,e4,b4]@4 ~@14, ~@8 e4@2 c#5 ~@13 [g#4,b4] ~ c#5 ~@13 e4@2 ~@10 c#5 ~@3 g4 ~@7]/4", // E C#m E C#m E5 A E A …
  C: "[a2,c#5,a5] [a1,c#5,a5] [a2,d5,b5] [d#5,c6] [a2,e5,c#6] [d#5,c6] [a2,d5,b5] [a1,c#5,a5]", // A Bm7 Cm A Cm Bm7 A
  D: "[[a2,c#4,c#5,a5]@2 a1@2 [a2,a3,f#4]@2 ~@2 [a2,a3]@2 [a3,d4,f#4] ~ a1@2 c4@2 c#4@2 a1@2 [a2,a3,f#4]@2 ~@2 [a2,a3,c#4]@2 [d4,f#4] ~@3 c4@2 c#4@2 ~@2 [a3,f#4]@2 ~@4 [c#2,e4]@2 [d2,f#4]@2 [d#2,g4]@2, ~@8 [c#4,e4] ~@5 [a2,a3,e4]@4 ~@6 e4 ~ a1@2 a2@6 a1@4 a2@6 ~@4, ~@15 [a3,e4]@2 ~@3 c#4@2 ~@2]/3", // A D A D A D C#m D …
  E: "[e2,g#4,e5] [e1,g#4,e5] [e2,a4,f#5] [a#4,g5] [e2,b4,g#5] [a#4,g5] [e2,a4,f#5] [e1,g#4,e5]", // E F#m7 D# E D# F#m7 E
  F: "[[e2,g#4]@2 e1@2 [c#3,e4,c#5]@2 ~@2 [b2,e4]@2 [c#3,e4,a4]@2 e2@2 g4@2 g#4@2 e2@2 [c#3,e4,a4,c#5]@2 ~@2 [b2,g#4,b4] ~ [e4,a4,c#5] ~ e2@2 g4@2 g#4@2 e2@2 [c#3,e4]@2 e2@2 [b2,g#4,b4]@2 e4@2 f#4@2 a4 ~, ~@8 [g#4,b4] ~ c#5 ~@3 [b2,e4,b4]@4 ~@6 e4@2 c#3@2 ~@2 [b2,e4,b4]@4 ~@2 c#5 ~@3 g4 ~@7]/3", // E C#m E5 A E A C#m E …
  G: "[[a2,c#4,c#5]@2 a1@2 [a2,a3,f#4]@2 ~@2 [a2,a3]@2 [a3,d4,f#4] ~ a1@2 [a2,c4]@2 [a2,c#4,c#5,a5]@2 a1@2 [a2,a3,f#4]@2 ~@2 [a2,a3]@2 [a3,d4,f#4] ~ a1@2 c4@2 c#4@2 a1@2 [a2,a3,f#4]@2 ~@2 [a2,a3,c#4]@2 [d4,f#4] ~@3 c4@2 c#4@2 ~@2 [a3,f#4]@2 ~@4 [c#2,e4]@2 [d2,f#4]@2 [d#2,g4]@2, ~@8 [c#4,e4] ~@5 [a3,e4]@4 ~@6 [c#4,e4] ~@5 [a2,a3,e4]@4 ~@6 e4 ~ a1@2 a2@6 a1@4 a2@6 ~@4, ~@23 [a3,e4]@2 ~@3 c#4@2 ~@2]/4", // A D A D Am A D A …
  H: "[[a2,c#4,c#5]@2 a1@2 [a2,a3,f#4]@2 ~@2 [a2,a3]@2 [a3,d4,f#4] ~ a1@2 [a2,c4]@2 [a2,c#4,c#5]@2 a1@2 [a2,a3,f#4]@2 ~@2 [a2,a3]@2 [a3,d4,f#4] ~ a1@2 c4@2 c#4@2 a1@2 [a2,a3,f#4]@2 ~@2 [a2,a3,c#4]@2 [d4,f#4] ~@3 c4@2 c#4@2 ~@2 [a3,f#4]@2 ~@4 [c#2,e4]@2 [d2,f#4]@2 [d#2,g4]@2, ~@8 [c#4,e4] ~@5 [a3,e4]@4 ~@6 [c#4,e4] ~@5 [a2,a3,e4]@4 ~@6 e4 ~ a1@2 a2@6 a1@4 a2@6 ~@4, ~@23 [a3,e4]@2 ~@3 c#4@2 ~@2]/4", // A D A D Am A D A …
  I: "[a2,c#5,e5,a5]!4 [a2,c#5,a5] [e2,e4] [g2,g4] [g#2,g#4]", // A E G G#
  J: "[[c3,c5,c6] ~ [c3,c5,c6]@2 [b2,b4,b5]@2 [a2,a4,c#5,a5]@24 ~@2]/2", // C B A
})).s("gm_piano").gain(0.45)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~ A@7 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A C ~@6 D A@3 B@4 A@4 B@4 E@2
>`.pickRestart({
  A: "[a3,e4] ~ [a3,e4] f#3 e3!2 f#3 e3", B: "[e4,b4] ~ [e4,b4] c#4 b3!2 c#4 b3", C: "[a3,e4] ~@7",
  D: "[a3,e4]!5 e3 g3 g#3", E: "[c4 ~ c4@2 b3@2 [a3,e4]@24 ~@2]/2",
})).s("gm_acoustic_guitar_steel").gain(0.24)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~ A B A C D@3 E@4 D@4 E@4 D@4 E@4 D@4 E@4 D@4 E@4 D@4 E@4 D@4 E@4 D@4 E@4 D@4 E@4 D F ~@6 G D@3 E@4 D@4 E@4 H@2
>`.pickRestart({
  A: "a1@3 a1 a1@3 e1", B: "a1 ~ a1@4 a1@2 a1@6 e1@2", C: "a1 ~ a1@4 a1@2 a1@2 e1@2 f#1@2 e1@2",
  D: "a1@3 a1!2 e1 f#1 e1", E: "e2@3 e2!2 b1 c#2 b1", F: "a1 ~@7", G: "a1!5 e1 g1 g#1",
  H: "[c2 ~ c2@2 b1@2 a1@24 ~@2]/2",
})).s("gm_electric_bass_finger").gain(0.49)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note("<~@100 A@2>".pickRestart({
  A: "[e2!2 d2 c#2@12 ~]/2",
})).s("gm_electric_guitar_muted").gain(0.32)

// chords · distortion guitar · "DISTORTION" · A5 C#m A5 C Bm A
const distortion_guitar = note(`<
  [~@14 e3 f#3]
  [[e3,a3]@2 ~@2 [e3,a3]@2 f#3@2 e3@4 f#3@2 e3 ~]
  [[e3,a3]@2 f#3@2 [e3,a3] ~ [c#4,e4]@7 ~ e3 f#3]
  [[e3,a3]@3 ~ [e3,a3]@2 f#3@2 e3@4 f#3@2 a3@2]
  [[c4,e4] ~ [c4,e4]@2 [b3,d4]@2 [a3,c#4]@10]
  ~@97
>`).s("gm_distortion_guitar").gain(0.6)

// chords · piano · "A.PIANO 1" · A E
const piano_2 = note("<~@93 [[a2,c#6,e6,a6]!8]!3 [[e2,b5,e6,g#6]!8]!4 ~@2>").s("gm_piano").gain(0.32)

// chords · piano · "A.PIANO 1"
const piano_3 = note("<~@53 A B C D E F G H I ~@22 J K ~@16>".pickRestart({
  A: "[a4,c#5,a5]!2 [b4,d5,b5] [c5,d#5,c6] [c#5,e5,c#6] [c5,d#5,c6] [b4,d5,b5] [a4,c#5,a5]", // A Bm Cm C#m Cm Bm A
  B: "[c5,d#5]@2 [c#5,e5]@2 [c5,d#5]@2 [c#5,e5]@2 c5 [e4,a4] d4@2 c4@2 c#4@2, ~@4 e5 ~@3", // Cm C#m Cm C#m A5
  C: "~ [a3,a4] [b3,b4] [c4,c5] ~ [e4,e5] [f#4,f#5] [e4,e5], ~@2 [c#4,c#5] ~", // A B C E F# E C#
  D: "[g#4,e5]!2 [a4,f#5] [a#4,g5] [b4,g#5] [a#4,g5] [a4,f#5] [g#4,e5]", // C#m D D# E D# D C#m
  E: "~@4 [g4,a#4]@2 [g#4,b4]@2 [g4,b4] [b3,e4] a3@2 g3@2 g#3@2", // Gm G#m G E5
  F: "~@4 [g5,a#5]@2 [g#5,b5]@2 [g5,b5] [b4,e5] a4@2 g4@2 g#4@2", // Gm G#m G E5
  G: "[a#4,e5] [b4,e5] [a#4,e5] [b4,e5] [g#4,e5] e4 f#4 [a4,e5]", // A#dim E5 A#dim E5 C#m A5
  H: "[c5,c6] ~ [c5,c6] ~ [b4,b5]@2 c#5!2 ~ [c#5,a5]!2 a5 [c#5,a5]!2 c#5 a5", I: "a5 ~@7",
  J: "~@9 [f#4,a4] e4@2 d4@2 c4@2, ~@4 [c#5,e5] ~@3", K: "[c#4,e4] ~@7",
})).s("gm_piano").gain(0.55)

// chords · piano · "A.PIANO 1" · soft notes
const piano_soft = note("<~@60 A@2 ~@22 B ~@17>".pickRestart({
  A: "[~@7 a5 [c#5,a5] ~@2 c#5 ~@2 a5 c#5@2 ~@15]/2", B: "[c5,d#5] [c#5,e5] [c5,d#5] [c#5,e5] ~@4",
})).s("gm_piano").gain(0.33)

// drums · kick
const kick = s("bd").struct("<~ [x!2]!99 [x!2 ~ x ~@4] ~>").gain(0.44)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!99 [~ x ~@2] ~>").gain(0.37)

// drums · clap
const clap = s("cp").struct(`<
  ~ A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A C ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@3 x!2", C: "x!4 ~@4",
})).gain(0.44)

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

// drums · crash
const crash = s("cr").struct("<~@100 [~@3 x ~@4] ~>").gain(0.37)

stack(
  piano, acoustic_guitar_steel, bass, electric_guitar_muted, distortion_guitar, piano_2, piano_3, piano_soft, kick,
  snare, clap, hihat, crash
)