Strudelify
KeyA minorTempo130 bpm
0:00/0:00
// American Girl — Tom Petty and The Heartbreakers
// 130 bpm, 4/4, key A minor. 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 67 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(130/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 · slap bass 1
const bass = note(`<
  A B A C A B A C A B A C A B D E F@2 G@2 A B A C A B D E F@2 G@2 A B A C A B D E F@2 G@2 A B A C A B D E F@2 G@2 A B A
  C ~ A B A C H ~
>`.pickRestart({
  A: "a1@4 ~@2 a1 ~ e1@4 ~@2 g1 ~", B: "a1@4 ~@2 a1 ~ c2@4 f2@4", C: "a1@4 ~@2 a1@2 f1 ~ f1@2 g1 ~ g1 ~",
  D: "a1@4 ~@2 a1 ~ e1@4 ~@2 e1 ~", E: "a1@5 ~ a1 ~ f1@3 ~ f#1@3 ~",
  F: "[g1@3 ~ g1@2 ~@4 g1 ~ f1 ~ e1@5 ~ e1@2 ~@2 a1@3 ~ a1@3 ~]/2",
  G: "[g1@3 ~ g1@2 ~@4 g1@2 ~@2 e1@5 ~ e1@2 ~@2 a1@3 ~ a1@2 ~@2]/2", H: "a1",
})).s("gm_slap_bass_1").gain(0.72)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@8 A B A B A B A C D@4 A B A B A B A C D@4 A B A B A B A C D@4 A B A B A B A C D@4 A B A E@2 A B A F@3
>`.pickRestart({
  A: "~@8 [a3,e4] ~@7", B: "[a3,e4] ~@7 [a3,e4]@8", C: "[a3,e4] ~@7 [a3,e4]@7 ~",
  D: "[~ a3 ~@7 a3 ~@5 c4, d4@8 d4@6 c4@11 g3@3 e4@4, ~ g3@4 g3@2 g3@2 g3@2 g3 e4@14 c4@3 g3@3, ~@4 a3@2 a3@11 g3@3 a3 g3 a3@10, ~@10 c4@3 g3@3 d4@7 g3 d4@8]/4",
  E: "[[a3,e4] ~@7 [a3,e4]@11 ~@13]/2", F: "[[a3,e4] ~@7 [a3,e4]@32 ~@8]/3",
})).s("gm_electric_guitar_clean").gain(0.28)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A B C D A B C D A B C D E F G H I@2 J@2 A B C D E F G H I@2 J@2 A B C D E F G H I@2 J@2 A B C D E F G H I@2 J@2 A B C
  D ~ A B C D ~@2
>`.pickRestart({
  A: "~@4 g3@2 [a2,a3] ~ a2 ~ [e3,a3] ~ a2@2 e3@2, a2 ~@3, ~@2 e3@5 ~@9", // A A5
  B: "[e3,a3] ~ e3 ~ a2@2 [e3,a3]@2 [f2,f3,c4] ~ f2@2 [f3,c4]@2 f2@2", // A5 F5
  C: "~@4 g3@2 [a2,e3,a3] ~ a2 ~ [e3,a3] ~@3 e3@2, a2 ~@2 a2, ~ e3@2 ~@5", // A5
  D: "[e3,a3] ~ e3 ~@3 c3@2 [f2,c3,f3] ~ f2 ~ g2 ~ g2@2, ~ a2 ~ [d3,g3]", // A5 F5 G5
  E: "~@2 e3@2 g3 ~ [e3,a3] ~ a2 ~ [e3,a3] ~@3 [e3,g3]@2, a2@3 ~@3 a2@2", // A5 Em
  F: "a3 ~ a2 ~@3 [e3,a3]@2 [f3,c4] ~ f2@2 ~@2 f2@2, ~ a2 ~ [f3,c4]", // A5 F5
  G: "~@2 e3@2 g3@2 [a2,e3,a3] ~ a2 ~ [e3,a3] ~ a2@4, a2@5 ~@11", // A5
  H: "[e3,a3] ~ e3 ~@3 e3 ~ [f2,f3,c4] ~ f2 ~ [f2,f3,c4] ~@3, ~ a2 ~@2", // A5 F5
  I: "[[g3,d4]@3 ~ [g3,d4] ~ g2 ~ g2@2 [g3,d4] ~ [g2,g3] ~@3 e2 ~ e2@2 [g3,c4,d4] ~ e2 ~ [e3,g3,c4]@3 ~ [e3,g3,c4] ~ a2 ~, g2@4 ~@10 [g3,c4,d4]@5 ~@5 a2@4 ~@4]/2", // G5 G Gsus4 C Gsus4
  J: "[[g3,d4]@3 ~ [g3,d4] ~ g2 ~ g2 ~ [g3,d4] ~ g2 ~@3 e2 ~ e2@2 [g3,c4] ~ e2@2 [a2,e3,a3]@3 ~ [a2,e3,a3] ~@3, g2@4 ~@10 [g3,c4]@5 ~@13]/2", // G5 C5 A5 C5
})).s("gm_acoustic_guitar_steel").gain(0.72)

// chords · synth strings 1
const synth_strings_1 = note("<~@20 A@8 B@2 C@2 D@8 E@2 F@2 G@4 H@4 I@2 J@2 ~@11>".pickRestart({
  A: "[e4@23 ~ f4@8 e4@24 f4@8 e4@24 f4@7 e4@29 ~@4, [c4,a4]@125 ~@3]/8", // F
  B: "[f4 ~ d5@11 ~ [g4,a4,c5,d5]@9 ~ [e4,g4,c5]@7 ~, [g4,a4,b4]@13 ~@19]/2", // Gsus4 C G
  C: "[[g4,a4,b4,d5]@13 ~ [g4,a4,c5,d5]@9 ~ [g4,c5,e5]@7 ~]/2", // G Gsus4 C
  D: "[e4@23 ~ f4@7 ~ e4@23 f4@8 ~ e4@24 f4@7 ~ e4@24 [e4,a4,c5]@3 ~ [e4,a4,c5]@3 ~, a4@15 ~, c5@4 c5@11 ~]/8", // Am
  E: "[[d4,g4,b4]@9 ~ [d4,g4,b4]@3 ~@2 a4 ~@8 [c4,d4,e4,g4]@7 ~, [f4,a4]@2 ~@12 [c4,d4,g4]@9 ~@9, ~@7 e4 ~@8]/2", // G C F Csus2
  F: "[[d4,g4,b4]@9 ~ [d4,g4,b4]@2 ~@2 [c4,d4,g4]@9 ~ [c4,d4,e4,g4]@7 ~]/2", // G Csus2 C
  G: "[c4@40 ~@8 b3@8 c4@7 ~, [e4,a4]@63 ~, ~@20 d4@5 ~@7]/4", H: "[c4@27 ~ d4@3 ~ c4@15 ~ d4@15 ~, [e4,a4]@63 ~]/4",
  I: "[[d4,g4,b4]@13 ~ [c4,d4,g4]@10 [c4,e4,g4]@7 ~]/2", J: "[[d4,g4,b4]@13 ~ [c4,e4,g4]@9 ~ [c4,e4,g4]@8]/2",
})).s("gm_synth_strings_1").gain(0.2)

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

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@60 [~@12 x!4] ~@6>").gain(0.56)

// drums · mid tom
const mid_tom = s("mt").struct("<~@60 [~@4 x!8 ~@4] ~@6>").gain(0.56)

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

// drums · high tom
const high_tom = s("ht").struct("<~@60 [x!4 ~@12] ~@6>").gain(0.56)

// drums · crash
const crash = s("cr").struct("<A ~@3 A ~@3 A ~@11 A ~@11 A ~@11 A ~@11 A ~@4 A ~@3 A ~>".pickRestart({
  A: "x",
})).gain(0.4)

// drums · ride
const ride = s("rd").struct("<~@61 [x!4]!2 [x!5 ~ x ~] [x!4] ~@2>").gain(0.64)

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

// drums · cowbell
const cowbell = s("cb").struct("<[x!4]!60 ~ [x!4]!4 ~@2>").gain(0.72)

stack(
  bass, electric_guitar_clean, acoustic_guitar_steel, synth_strings_1, kick, snare, hihat, low_tom, mid_tom, open_hat,
  high_tom, crash, ride, ride_soft, cowbell
)

More by Tom Petty and The Heartbreakers