Strudelify

Plump

Hole

KeyD majorTempo126 bpm
0:00/0:00
// Plump — Hole
// 126 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 3 "Guitar 2" electric guitar clean (copy of ch 2 "Guitar 1" distortion guitar)
// note: Full arrangement: all 80 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(126/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 · distortion guitar · "Guitar 1"
const distortion_guitar = note(`<
  ~ A B A B A B A B A B C@6 D@2 A B A B A B A B A B C@8 A E F ~@15 A B A B A B A B A B A B C@8 A E G@2 ~
>`.pickRestart({
  A: "[f#3,c#4,f#4]@2 [f#3,c#4,f#4]@2 [e3,b3,e4]!4 [f#3,c#4,f#4]@2 [f#3,c#4,f#4]@2 [e3,b3,e4]!4", // F#5 E5 F#5 E5
  B: "[f#3,c#4,f#4]@2 [f#3,c#4,f#4]@2 [e3,b3,e4]!4 [a3,e4,a4]@2 [a3,e4,a4]@2 [e3,b3,e4]@2 [e3,b3,e4]@2", // F#5 E5 A5 E5
  C: "[[e4,b4,e5]@2 [e4,b4,e5]@2 ~@2 [d4,a4,d5]!2 [d4,a4,d5]@24]/2", D: "[[e4,b4,e5]!2 ~ [b3,b4] [d4,d5]@10 f#4@2]/2",
  E: "[a3,e4,a4]!4", F: "[a3,e4,a4]", G: "[a3,e4,a4]/2",
})).s("gm_distortion_guitar").gain(0.25)

// other · trumpet · "Ditto"
const trumpet = note(`<
  ~@3 A@2 B C D@2 E@2 F G F H I J F K ~@2 L@2 M@2 N@2 O@2 P Q P R I S P T ~@5 U V@8 W@4 ~@4 X@2 M@2 Y Z AA@2 P Q P R I S
  P T ~@5
>`.pickRestart({
  A: "[~ b4 c#5 b4 c#5@2 c5 c#5@2 c5@3 ~@4]/2", B: "~@2 c#5 b4 c#5 e5@2 c#5", C: "c5 ~",
  D: "[~ f#4 c#5 b4 c#5@2 b4 c#5@2 f#4@3 ~@4]/2", E: "[~ f#4 c#5 b4 c#5@2 f#4 f#4@2 e4@3 ~@4]/2", F: "~@3 d5",
  G: "d5@3 a4 a4@4", H: "d5@3 e5 d5@4", I: "~@5 a4 d5@2", J: "d5 a4!2 g4", K: "d5!2 d5@2",
  L: "[~@2 c#6 c6 c#6 c6@2 c#6@2 c6@3 ~@4]/2", M: "[~@2 c#6 b5 c#6 e6@2 c#6@5 ~@4]/2",
  N: "[~@2 c#6 ~ c#6 c#6@2 c#6@5 ~@4]/2", O: "[~@2 c#6 c6 c#6 f#5!2 e5@2 f5@2 e5@3 ~@2]/2", P: "~@3 d6",
  Q: "d6@3 a5 a5@4", R: "d6@3 e6 d6@4", S: "d5 a4 a4@2", T: "d6!2 d6@2", U: "~ [d5,a5]",
  V: "[[b4,f#5]@4 ~@2 [a4,e5] [b4,f#5]@5 ~@2 [a4,e5] [b4,f#5]@5 ~@2 [a4,e5] [b4,f#5]@5 [d5,a5]@4]/4", // B5 A5 B5 A5 B5 A5 B5 D5
  W: "[[b4,f#5]@4 ~@2 [a4,e5] [b4,f#5]@5 ~@2 [a4,e5] [b4,f#5]@5 ~@2 [a4,e5] [b4,f#5]@5 ~@4]/4", // B5 A5 B5 A5 B5 A5 B5
  X: "[~ f#5 c#6 b5 c#6 c6@2 c#6@2 c6@3 ~@4]/2", Y: "~@2 c#6 b5 c#6 b5 c#6 b5", Z: "c#6@2 f#5 f#5@3 ~@2",
  AA: "[~ f#5 c#6 c6 c#6@2 f#5 e5@2 f5@2 e5@3 ~@2]/2",
})).s("gm_trumpet").gain(0.26)

// chords · acoustic guitar steel · "Fill Guitar"
const acoustic_guitar_steel = note("<~@39 A@16 ~@25>".pickRestart({
  A: "[b4 ~@2 b4 ~@7 g4 ~@4 b4 ~@2 b4 ~@7 g4 ~@4 b4 ~@2 b4 ~@7 g4 ~@4 b4 ~@2 b4 ~@7 g4 ~@3 d5, ~ b4@2 ~ b4@2 b4@2 f#4@8 ~@8 f#4@8 ~@8 f#4@8 ~@8 f#4@8, ~@2 f#5@3 f#5@2 f#5@9 ~@2 f#5@3 f#5@2 f#5@9 ~@2 f#5@3 f#5@2 f#5@9 ~@2 f#5@3 f#5@2 f#5@9, ~@9 g4@2 ~ g4@2 g4@2 ~ b4@2 ~ b4@2 b4@2 ~ g4@2 ~ g4@2 g4@2 ~ b4@2 ~ b4@2 b4@2 ~ g4@2 ~ g4@2 g4@2 ~ b4@2 ~ b4@2 b4@2 ~ g4@2 ~ g4@2 g4@2, ~@10 d5@3 d5@2 d5@9 ~@2 d5@3 d5@2 d5@9 ~@2 d5@3 d5@2 d5@9 ~@2 d5@3 d5@2 ~]/8",
})).s("gm_acoustic_guitar_steel").gain(0.25)

// chords · overdriven guitar · "Fill Guitar"
const overdriven_guitar = note("<~@77 A@2 ~>".pickRestart({
  A: "[[e4,a4]@8 [f#4,b4] [a#4,d#5] [e5,a5]@22]/2", // A5 B5 D#5 A5
})).s("gm_overdriven_guitar").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~@11 A ~ B ~ A ~ C ~@11 B ~ C ~ C ~ C ~@3 D@2 E F@3 D F@4 G D H I E ~@12 C ~ C ~ J ~ C ~@6
>`.pickRestart({
  A: "x ~@6 x ~@8", B: "~ x ~@5 x ~@8", C: "~ x ~@4 x ~@9", D: "x!2 ~ x!2 ~@3", E: "~ x ~ x!2 ~@2 x",
  F: "x!2 ~ x!2 ~@2 x", G: "x ~@2 x!2 ~@2 x", H: "~@3 x!2 ~@2 x", I: "x!2 ~ x!3 ~ x", J: "x ~@2 x ~@4",
})).gain(0.41)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<A ~@40 B ~@3 C ~@4 D C E ~ B ~@25>".pickRestart({
  A: "~@5 x ~ x", B: "x", C: "~@7 x", D: "~ x ~@6", E: "x!2 ~@6",
})).gain(0.26)

// drums · snare
const snare = s("sd").struct("<A B@16 C B@20 ~ D@2 E@12 B E B@21 ~@4>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@2 x!2 ~@2 x ~", D: "~@2 x ~@2 x!3", E: "~@2 x ~@2 x!2 ~",
})).gain(0.36)

// drums · low tom
const low_tom = s("lt").struct("<~@10 A B ~ C A B ~ D ~@11 E ~ C ~ C ~ C ~@31 C ~ C A F ~ G ~@6>".pickRestart({
  A: "~@15 x", B: "x ~@2 x ~@4", C: "x!2 ~@4 x ~@9", D: "x!2 ~@3 x!2 ~@9", E: "x!2 ~@4 x!2 ~@8", F: "x ~@4 x!2 ~@9",
  G: "~ x ~@3 x!2 ~@9",
})).gain(0.41)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@31 [~@5 x ~@10] ~ [~@3 x ~@4] ~@35 [~@5 x ~@10] ~@10>").gain(0.26)

// drums · open hat
const open_hat = s("oh").struct("<~ A@18 B A@13 B A@4 ~@17 A@21 ~@4>".pickRestart({
  A: "x!2 ~ x!3 ~ x", B: "x ~ x ~@3 x ~ x ~ x ~@4 x",
})).gain(0.31)

// drums · crash
const crash = s("cr").struct(`<
  ~@11 A B ~@2 A ~ A ~@11 C ~ A ~ A ~ C ~@2 D E ~@27 A ~ A ~ A ~ A ~@2 D F@2 E
>`.pickRestart({
  A: "~ x", B: "~ x ~ x", C: "~@9 x ~@6", D: "x!4", E: "x", F: "x!16",
})).gain(0.26)

// drums · ride
const ride = s("rd").struct("<~@13 [~@9 x ~@6] ~@19 [~ x] ~@46>").gain(0.51)

stack(
  distortion_guitar, trumpet, acoustic_guitar_steel, overdriven_guitar, kick, kick_soft, snare, low_tom, low_tom_soft,
  open_hat, crash, ride
)

More by Hole