Strudelify

Celebrity Skin

Hole

KeyG majorTempo135 bpm
0:00/0:00
// Celebrity Skin — Hole
// 135 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 88 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): guitar program 30, guitar program 27.
setcpm(135/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 · overdriven guitar
const overdriven_guitar = note(`<
  A ~ A ~ A ~ B@2 C@4 D@2 E@2 A ~ A ~ A ~ B@2 C@4 D@2 E@2 F@8 G@8 A ~ A ~ A ~ B@2 C@4 D@2 E@2 F@8 G@8 A ~ A ~ A ~ H@2
>`.pickRestart({
  A: "[a2,e3,a3]!2 ~ [c#3,g#3,c#4]!2 ~ [f#2,c#3,f#3]!2", // A5 C#5 F#5
  B: "[[a2,e3,a3]!2 ~ [c#3,g#3,c#4]!2 ~ [f#2,c#3,f#3] [f#2,c#3,f#3]@9]/2", // A5 C#5 F#5
  C: "[[a2,d3,a3]!7 [a2,e3,a3]@2 [a2,e3,a3]!7]/2", D: "[[f#2,c#3,f#3]!7 [b2,f#3,b3]@2 [b2,f#3,b3]!6 [c#3,g#3,c#4]]/2",
  E: "[d3,a3,d4]!8", // D5
  F: "[a2 [a2,e3] [a2,a3] [a2,e3] d3 [d3,a3] [d3,d4] d3 a2 [a2,e3] [a2,a3] [a2,e3] d3 [d3,a3] [d3,d4] d3 a2 [a2,e3] [a2,a3] [a2,e3] d3 [d3,a3] [d3,d4] d3 f#2 [f#2,c#3] [f#2,f#3] [f#2,c#3] f#2 [f#2,c#3] [f#2,f#3] f#2 a2 [a2,e3] [a2,a3] [a2,e3] d3 [d3,a3] [d3,d4] d3 a2 [a2,e3] [a2,a3] [a2,e3] d3 [d3,a3] [d3,d4] d3 a2 [a2,e3] [a2,a3] [a2,e3] d3 [d3,a3] [d3,d4] d3 f#2 [f#2,c#3] [f#2,f#3] [f#2,c#3] f#2 [f#2,c#3] [f#2,f#3] [f#2,c#3], ~@7 a3@2 ~@6 a3@2 ~@6 a3@2 ~@2 f#3@2 ~@2 c#3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@2 f#3@2 ~@3]/8", // A5 A A5 D5 D A5 A A5 …
  G: "[a2 [a2,e3] [a2,a3] [a2,e3] d3 [d3,a3] [d3,d4] d3 a2 [a2,e3] [a2,a3] [a2,e3] d3 [d3,a3] [d3,d4] d3 a2 [a2,e3] [a2,a3] [a2,e3] d3 [d3,a3] [d3,d4] d3 f#2 [f#2,c#3] [f#2,f#3] [f#2,c#3] f#2 [f#2,c#3] [f#2,f#3] f#2 a2 [a2,e3] [a2,a3] [a2,e3] d3 [d3,a3] [d3,d4] d3 a2 [a2,e3] [a2,a3] [a2,e3] d3 [d3,a3] [d3,d4] d3 a2 [a2,e3] [a2,a3] [a2,e3] d3 [d3,a3] [d3,d4] d3 [f#2,c#3,f#3]!7 [g#2,d#3,g#3], ~@7 a3@2 ~@6 a3@2 ~@6 a3@2 ~@2 f#3@2 ~@2 c#3@2 ~@6 a3@2 ~@6 a3@2 ~@6 a3@2 ~@7]/8", // A5 A A5 D5 D A5 A A5 …
  H: "[[a2,e3,a3]!2 ~ [c#3,g#3,c#4]!2 ~ [f#2,c#3,f#3] [f#2,c#3,f#3]@8 ~]/2", // A5 C#5 F#5
})).s("gm_overdriven_guitar").gain(0.47).pan(0.3)

// bass · electric bass pick
const bass = note(`<
  ~@2 A ~ B@2 C@2 D@4 E@2 F@2 A ~ G@2 H@2 C@2 D@4 E@2 F@2 I J K L I J K L I J K L I J K M A ~ G@2 H@2 C@2 D@4 N@2 F@2 I
  J K L I J K L I J K L I J K M A ~ G@2 H@2 O@2
>`.pickRestart({
  A: "a1!2 ~ c#2!2 ~ f#1!2", B: "[a1!2 ~ c#2!2 ~ f#1 f#1@2 f#1!2 e1 f#1 e1 f#1 e1]/2",
  C: "[a1!2 ~ c#2!2 ~ f#1 f#1@2 f#1!4 e1 e1@2]/2", D: "[d1!7 a1@2 a1!7]/2", E: "[f#1!7 b1@2 b1!7]/2", F: "d2!8",
  G: "[a1!2 ~ c#2!2 ~ f#1 f#1@2 e1 f#1 e1 f#1!2 e1@2]/2", H: "[a1!2 ~ c#2!2 ~ f#1 f#1@2 f#1!7]/2",
  I: "a1@2 a1!2 d2!3 b1", J: "a1@2 a1 c#2 d2!3 b1", K: "a1@2 a1!2 d2!3 a1", L: "f#1!7 g#1", M: "f#1!7 e1",
  N: "[f#1!7 b1@2 b1!5 c#2!2]/2", O: "[a1!2 ~ c#2!2 ~ f#1 f#1@8 ~]/2",
})).s("gm_electric_bass_pick").gain(0.68)

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

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

// drums · hihat
const hihat = s("hh").struct("<[~ x ~ x] ~@31 [x!8]!8 ~@24 [x!8]!8 ~@16>").gain(0.8)

// drums · open hat
const open_hat = s("oh").struct("<A ~ B ~ C@12 B ~ C@14 ~@8 C@8 B ~ C@14 ~@8 C@7 D B ~ C@4 E ~>".pickRestart({
  A: "x", B: "x!7 ~", C: "x!8", D: "x!6 ~@2", E: "x!2 ~ x!2 ~ x!2",
})).gain(0.8)

// drums · crash
const crash = s("cr").struct("<A ~ A ~ A ~@3 A ~@7 A ~ A ~@5 A ~@23 A ~ A ~@5 A ~@23 A ~ A ~@3 B ~>".pickRestart({
  A: "x", B: "x ~@2 x ~@2 x ~",
})).gain(0.8)

stack(overdriven_guitar, bass, kick, snare, hihat, open_hat, crash)

More by Hole