Strudelify

Good Girls Don't

The Knack

KeyG majorTempo175 bpm
0:00/0:00
// Good Girls Don't — The Knack
// 175 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 101 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): L-Guitar.
setcpm(175/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · electric guitar clean · "R-Guitar"
const electric_guitar_clean = note(`<
  A@4 B C D@2 E F E F D@2 E F E F D@2 E F E G A@4 B C D@2 E F E F D@2 E F E F D@2 E F E G A@4 B C D@2 H@2 I J K@2 I J L
  M@2 A@4 B C D@2 H@2 I J K@2 I J L N@2 A@4 B C D O D O D O P@2 ~
>`.pickRestart({
  A: "[[b2,d3,g3]@4 [b2,d3,g3]@3 [a2,d3,f#3]@9]/2", B: "[c3,e3,g3]!2", C: "[d3,f#3,a3]!2",
  D: "[f#2,b2,d3,g3] [g2,b2,d3,g3]!3 [f#2,b2,d3,g3] [g2,b2,d3,g3]!3", E: "[c3,e3,g3]@3 [c3,e3,g3]!3 [c3,e3,g3]@2",
  F: "[d3,f#3,a3]@3 [d3,f#3,a3]!3 [d3,f#3,a3]@2", G: "[a2,c3,e3]!2 [a2,c3,e3]@2 [d3,f#3,a3]!2 [d3,f#3,a3]@2",
  H: "[[c3,e3,g3]@3 [c3,e3,g3]@3 [c3,e3,g3]@3 [c3,e3,g3]@3 [c3,e3,g3]@2 [c3,e3,g3]@2]/2", // C
  I: "[c3,f3,a3]!3 [c3,f3,a3]@2 [c3,f3,a3]@2 [c3,f3,a3]", J: "[c3,e3,g3]",
  K: "[[d3,f#3,a3]@3 [d3,f#3,a3]@3 [d3,f#3,a3]@3 [d3,f#3,a3]@3 [d3,f#3,a3]@2 [d3,f#3,a3]@2]/2", // D
  L: "[c3,e3,g3]!3 [c3,e3,g3]@2 [c3,e3,g3]@2 [c3,e3,g3]", M: "[d3,f#3,a3]", N: "[d3,f#3,a3]/2",
  O: "[f#2,b2,d3,g3] [g2,b2,d3,g3]!2 [f#2,a2,d3,f#3]@5", // Gmaj7 G D
  P: "[[f#2,b2,d3,g3] [g2,b2,d3,g3]!2 [g2,c3,e3,g3]@2 [g2,c3,e3,g3]@2 [f#2,a2,d3,g3]@2 [f#2,a2,d3,f#3]!3 [g2,b2,d3,g3]@4]/2", // Gmaj7 G C D G
})).s("gm_electric_guitar_clean").gain(0.26)

// chords · harmonica
const harmonica = note("<A@2 B@2 C D@2 ~@60 A@2 B@2 C D@2 ~@27>".pickRestart({
  A: "[[d4,g4,b4]@4 [d4,g4,b4]@3 [d4,f#4,a4]@9]/2", B: "[[d4,g4,b4]@4 [d4,g4,b4] [d4,a4,c5]@2 [d4,f#4,a4]@9]/2",
  C: "[e4,a4,c5]!2", D: "[[d4,g4,b4]@4 [d4,f#4,a4]@2 [d4,f#4] [c4,f#4,a4]@2 [b3,d4,g4]@4 ~@3]/2",
})).s("gm_harmonica").gain(0.2)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@4 A B C@2 D E D E C@2 D E D E C@2 D E D F G H G H I H C@2 D E D E C@2 D E D E C@2 D E D F G H G H I H C@2 J@2 K I
  L@2 K I@2 H@2 G H G H I H C@2 J@2 K I L@2 K I@2 H@2 G H G H I H C M C M C M N@2 ~
>`.pickRestart({
  A: "~@7 c3", B: "d3", C: "g2!8", D: "c2@3 c2!5", E: "d2@3 d2!5", F: "a1!4 d2!4", G: "g2!7 d2", H: "d2!8", I: "c2!8",
  J: "[c2@3 c2@3 c2@3 c2@3 c2@2 c2@2]/2", K: "f2!3 f2@2 f2@2 f2", L: "[d2@3 d2@3 d2@3 d2@3 d2@2 d2@2]/2",
  M: "g2!3 d2!5", N: "[g2!3 g2@2 g2@2 d2@2 d2!2 f#2 g2@4]/2",
})).s("gm_electric_bass_finger").gain(0.26)

// chords · overdriven guitar · "L-Guitar"
const overdriven_guitar = note("<~@25 A ~ A ~@21 A ~ A ~@13 B ~@2 C ~ A ~@13 B D ~ C ~ A ~@8 E F ~>".pickRestart({
  A: "~ d3!3 f#3@2 a3@2", B: "~@15 [d3,a3]", C: "~@2 d3 ~ d3 ~ d3 ~ f#3@4 a3@4", D: "[d3,f#3,a3]", E: "~@5 b3@2 ~",
  F: "~ g3 ~ c4 ~@4",
})).s("gm_overdriven_guitar").gain(0.26)

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

// drums · snare
const snare = s("sd").struct("<~@5 A B@17 C B@23 D B@8 E F G B E F G B@12 E F G B E F G B@16 H I ~>".pickRestart({
  A: "~@5 x!3", B: "~ x ~ x", C: "~@2 x ~@2 x!3", D: "~@4 x ~@7 x!4", E: "x ~@2 x ~@2 x ~", F: "~ x ~@2 x ~ x ~",
  G: "x ~@2 x ~ x ~@2", H: "~@2 x!2 ~ x ~ x", I: "~ x",
})).gain(0.51)

// drums · hihat
const hihat = s("hh").struct("<~@6 A@50 ~@3 A ~@3 A@12 ~@3 A ~@3 A@16 B ~@2>".pickRestart({
  A: "x!8", B: "x!3 ~@5",
})).gain(0.51)

// drums · mid tom
const mid_tom = s("mt").struct("<~@99 [~@2 x!2 ~@4] ~>").gain(0.51)

// drums · crash
const crash = s("cr").struct(`<
  ~@6 A ~@5 A ~@5 A ~@4 B A ~ A ~ A ~ A ~@5 A ~@5 A ~@4 B A ~ A ~ A ~ A ~ C D E A C D E A ~@3 A ~ A ~ A ~ A ~ C D E A C
  D E A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ F G ~
>`.pickRestart({
  A: "x", B: "x ~@2 x ~@4", C: "x ~@2 x ~@2 x ~", D: "~ x ~@6", E: "x ~@2 x ~ x ~@2", F: "~@3 x ~ x ~ x", G: "~ x",
})).gain(0.51)

// drums · high tom
const high_tom = s("ht").struct("<~@99 [~@2 x!2 ~@12] ~>").gain(0.51)

stack(electric_guitar_clean, harmonica, bass, overdriven_guitar, kick, snare, hihat, mid_tom, crash, high_tom)

More by The Knack