Strudelify
KeyA minorTempo120 bpm
0:00/0:00
// You Got Lucky — Tom Petty and The Heartbreakers
// 120 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 81 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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.

// other · overdriven guitar · "Elec Gtr 1"
const overdriven_guitar = note(`<
  ~@4 A@2 B ~ C D E@2 C D E@2 ~@7 F@3 G@2 ~@8 A@2 H ~@8 F@3 G@2 ~@4 I@2 J ~ K@2 L M C D E@2 C D E@2 C D E@2 C D E@2 ~
>`.pickRestart({
  A: "[a3@28 ~@2 e3 ~]/2", B: "d3@12 ~@2 g3 ~", C: "e5@10 ~ g5@2 a5@2 ~", D: "e5@10 ~ d5@2 c5@2 ~", E: "[d5@13 ~@3]/2",
  F: "[~@14 [c5,e5]@23 ~@9 [c5,e5]@2]/3", G: "[~ a4@4 ~@3]/2", H: "d3@3 ~", I: "[d5 ~ g4@3 ~ a4@19 ~ e5@3 ~@3]/2",
  J: "d5 ~ g4@3 ~ a4@7 ~@3", K: "e5@3 ~ e5@3 ~ e5@3 ~ e5@3 ~", L: "a4@3 ~ a4@3 ~ a4@3 ~ a4@3 ~",
  M: "d5@3 ~ d5@3 ~ d5@3 ~ d5@3 ~",
})).s("gm_overdriven_guitar").gain(0.41)

// chords · distortion guitar · "Elec Gtr 2"
const distortion_guitar = note(`<
  A B C D A B C D E F G H E F G H E F G H E F G I@3 J@2 K@2 L@2 M@2 N O A B C D E F G H E F G I@3 J@2 K@2 P@2 Q@2 R O A
  B C D E F G H E F G H E F G H E F G S ~
>`.pickRestart({
  A: "[b4,c5,e5]@3 ~ [b4,c5,e5]@3 ~ [b4,c5,e5]@3 ~ [b4,c5,e5]@3 ~", // Cmaj7
  B: "[a4,c5,e5]@3 ~ [a4,c5,e5]@3 ~ [a4,c5,e5]@3 ~ [a4,c5,e5]@3 ~", // Am
  C: "[e4,f4,a4]@3 ~ [e4,f4,a4]@3 ~ [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~", // Fmaj7 Dm
  D: "[g4,c5,d5]@3 ~ [g4,b4,d5]@3 ~ [g4,a4,d5]@3 ~ [g4,c5,d5]@3 ~", // Gsus4 G Gsus2 Gsus4
  E: "[b3,c4]@3 ~ [b3,c4]@3 ~ [b3,c4]@3 ~ [b3,c4]@3 ~", F: "[a3,c4]@3 ~ [a3,c4]@3 ~ [a3,c4]@3 ~ [a3,c4]@3 ~",
  G: "[e4,f4]@3 ~ [e4,f4]@3 ~ [d4,f4]@3 ~ [d4,f4]@3 ~", // Fmaj7 Dm
  H: "[g3,c4,d4]@3 ~ [g3,b3,d4]@3 ~ [g3,a3,d4]@3 ~ [g3,c4,d4]@3 ~", // Gsus4 G Gsus2 Gsus4
  I: "[[g3,c4,d4]@3 ~ [g3,b3,d4]@3 ~ [g3,a3,d4]@3 ~ [g3,c4,d4] ~ [e4,a4]@27 ~@5 [f4,a4]@2]/3", J: "[~ [c4,f4]@4 ~@3]/2",
  K: "[~@2 [g4,c5,e5]@3 ~@9 [a4,c5,d5]@5 ~@3 [a4,c5,e5]@7 ~@3]/2", // C D7 Am
  L: "[~@2 [a4,c5,e5]@3 ~@9 [a4,c5,d5]@5 ~@3 [a4,c5,e5]@2 ~@8]/2", // Am D7 Am
  M: "[[f4,a4,d5] ~@5 [c4,f4,a4]@19 ~ [f4,a4,c5,e5]@3 ~@3]/2", N: "[b4,d5] ~@5 [b3,d4,g4,a4]@7 ~@3",
  O: "~@8 [b4,e5] ~@7", P: "[~@2 [g4,c5,e5]@3 ~@9 [a4,c5,d5]@5 ~@3 [a4,c5,e5]@3 ~@7]/2",
  Q: "[[f4,a4] ~@5 [c4,f4]@19 ~ [f4,a4,c5]@3 ~@3]/2", R: "[b4,d5] ~@5 [b3,d4,g4]@7 ~@3",
  S: "[g3,c4,d4] ~ [g3,b3,d4] ~ [g3,a3,d4] ~ [g3,c4,d4] ~", // Gsus4 G Gsus2 Gsus4
})).s("gm_distortion_guitar").gain(0.35)

// chords · pad poly · "Polysynth"
const pad_poly = note(`<
  ~@16 A@2 B C A@2 D E A@2 F@2 G H I H F@2 J@2 A@2 D E A@2 D E A@2 D E A@2 F@2 G H I H F@2 J@2 A@2 D E A@2 D E A@2 D E
  A@2 D E A@2 D E ~
>`.pickRestart({
  A: "[[e4,a4,c5]@13 ~@3]/2", B: "[f4,a4,d5]@13 ~@3, f5 ~", C: "[g4,b4,d5]@11 ~@5",
  D: "[f4,a4,d5,f5]@5 ~@3 [f4,a4,d5]@5 ~@3", E: "[g4,b4,d5]@3 ~ [b4,d5]@3 ~ [g4,b4,d5]@3 ~ [b4,d5]@3 ~",
  F: "[[f4,a4,c5]@13 ~@3]/2", G: "[e4,g4,c5]@11 ~@5", H: "[a4,c5,e5]@5 ~@3", I: "[g4,c5,e5]@5 ~@3",
  J: "[[g4,d5]@13 ~@3]/2", // G5
})).s("gm_pad_poly").gain(0.27).pan(0.2)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@7 A B ~ C ~ B ~ C ~ D ~ C ~ D ~ C ~ E F G H I J I J G K L M ~ N O A D ~ C ~ D ~ C ~ E F G H I J I J G K L M P@2 O A
  B ~ C ~ B ~ C ~ B ~ C ~ B ~ C ~@2
>`.pickRestart({
  A: "g2@11 ~@5", B: "a2@5 ~@3", C: "d3@5 ~@11", D: "a2@11 ~@5", E: "a1@3 ~ a2@3 ~ a1@3 ~ a2 ~ a1 ~",
  F: "a1@3 ~ a2@3 ~ a1@3 ~ a2 ~@3", G: "f1@3 ~ f2@3 ~ f1@3 ~ f2 ~ f1 ~", H: "f1@3 ~ f2@3 ~ f1@3 ~ g1 ~ a1 ~",
  I: "c2@3 ~ c3@3 ~ c2@3 ~ c3 ~@3", J: "a1@3 ~ a2@3 ~ a1@3 ~ a2@3 ~", K: "f1@3 ~ f2@3 ~ f1@3 ~ f2@3 ~",
  L: "g1@3 ~ g2@3 ~ g1@3 ~ g2 ~ g1 ~", M: "g1@3 ~ g2@3 ~ g1@3 ~ g2@3 ~", N: "~@14 e3 ~", O: "d3@12 ~@2 g3 ~",
  P: "[a3@28 ~@2 e3 ~]/2",
})).s("gm_electric_bass_finger").gain(0.35).pan(0.7)

// drums · kick
const kick = s("bd").struct("<~@12 x ~@3 [x!2]!64 ~>").gain(0.36)

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

// drums · hihat
const hihat = s("hh").struct("<~@16 A@7 B A@11 B A@3 B A@7 B A@11 B A@7 B A@3 B A@3 B A@3 C ~>".pickRestart({
  A: "x!8", B: "x!5 ~@3", C: "x!7 ~",
})).gain(0.36)

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

stack(overdriven_guitar, distortion_guitar, pad_poly, bass, kick, snare, hihat, crash)

More by Tom Petty and The Heartbreakers