Strudelify
Violet cover art

1995

Violet

Hole

KeyG majorTempo168 bpm
0:00/0:00
// Violet — Hole
// 168 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 4 "guitar" distortion guitar (copy of ch 3 "guitar" overdriven guitar)
// note: Full arrangement: all 139 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(168/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 · acoustic guitar steel · "guitar"
const acoustic_guitar_steel = note(`<
  A B C@2 A B C@2 A B C@2 A B D ~@33 A B C@2 A B C@2 A B C@2 A B D ~@49 E F G H I@2 J K ~@19
>`.pickRestart({
  A: "[e3,g#3,b3]@2 e3@2 e3@2 [e3,g#3,b3]@2 e3@2 e3@2 [e3,g#3,b3]@2 d3!2", // E
  B: "[c3,e3,g3]@2 c3@2 c3@2 [c3,e3,g3]@2 c3@2 c3@2 [c3,e3,g3]@2 a2!2", C: "[[g2,d3,g3]@7 [c3,e3]]/2", D: "[g2,d3,g3]",
  E: "[g2,b2]@2 [g2,b2] [e2,g#2,b2]@2 [e2,g#2,b2]!3", F: "[c4,e4,g4]@2 [c4,e4,g4] [a3,e4]@2 [a3,e4]!3",
  G: "[d4,e4,a4]@2 [d4,e4,a4] [d4,e4,a4]@2 [d4,e4,a4] [d4,e4,a4]@2", H: "[b3,e4,f#4]@2 [b3,e4,f#4]!2 ~ a3!3",
  I: "[[g3,b3]@2 [g3,b3] [e3,g#3,b3]@2 [e3,g#3,b3]!3 [c4,e4,g4]@2 [c4,e4,g4] [a3,e4]@2 [a3,e4]!3, e2]/2", // G E C A5
  J: "[d4,e4,a4]@4 [d4,e4,a4]@2 [b3,e4,f#4]@4 [b3,e4,f#4]@2 [b3,e4,f#4]@2 [e3,g#3]!2", // Dsus2 Bsus4 E
  K: "[e3,g#3,b3,e4]@2 [e3,a3] [d3,g3,b3]@2 [d3,g3,b3]!3", // E A5 G
})).s("gm_acoustic_guitar_steel").gain(0.4).pan(0.2)

// chords · overdriven guitar · "guitar"
const overdriven_guitar = note("<~@128 A B C D E F G H I@3>".pickRestart({
  A: "[f#3,b3,e4]@2 [b3,e4] [b3,e4]@2 [b3,e4] [b3,e4]@2", B: "[f#3,b3,e4]@2 [c4,e4] [c4,e4]@2 [c4,e4] [c4,e4]@2",
  C: "[f#3,b3,e4]@2 [d4,a4] [d4,e4,a4]@2 [d4,e4,a4]!3", D: "f#4 e4 f#4 g4!3 f#4 e4", E: "[e4,b4,e5]!8",
  F: "[e4,g4,d5]!8", G: "[e4,a4,e5]!8", H: "g4 f#4 e4 g4@2 e4 f#4 e4", I: "[e3,e4]/3",
})).s("gm_overdriven_guitar").gain(0.4).pan(0.2)

// chords · acoustic guitar steel · "guitar"
const acoustic_guitar_steel_2 = note(`<
  ~@4 A B C@2 A B C@2 A B D@2 ~@16 E F G H I J G H ~@12 A B C@2 A B C@2 A B D@2 ~@16 E F G H I J G H ~@8 E F G H I J G H
  ~@35
>`.pickRestart({
  A: "[e3,b3,b4]@4 [e3,b3,b4]@2 [e3,b3,b4]@4 [e3,b3,b4]@2 [e3,b3,b4]@2 d3!2", // E5
  B: "[c3,d4,g4]@6 [c3,d4,g4]@4 [c3,d4,g4]@2 [c3,d4,g4]@2 a2!2", C: "[[g2,d3,g3,d4,g4]@13 [c3,d4,g4] [c3,d4,g4]@2]/2",
  D: "[[g2,d3,g3,d4], g4 ~]/2", E: "[e3,g#3,b3]@3 [e3,g#3,b3]@2 [e3,g#3,b3] [e3,g#3,b3]@2",
  F: "[c3,e3]@3 [c3,e3,g3,b3]@2 [c3,e3,g3,b3] [c3,e3,g3,b3]@2", G: "[d3,f#3,g3]@3 [d3,f#3,g3]@2 [d3,f#3,g3] d3 c#3",
  H: "[a2,c#3,d3] a2!2 [a2,c#3,d3] a2!3 g#2", I: "e2@2 e2 [e3,g#3,b3]@2 [e3,g#3,b3] [e3,g#3,b3]@2",
  J: "[c3,e3,g3,b3]@3 [c3,e3,g3,b3]@2 [c3,e3,g3,b3] [c3,e3,g3,b3]@2", // Cmaj7
})).s("gm_acoustic_guitar_steel").gain(0.34).pan(0.9)

// chords · overdriven guitar · "guitar"
const overdriven_guitar_2 = note(`<
  ~@16 A B C D A B C D A B C D A B C D ~@8 E F G H E F G H I@2 ~@14 A B C D A B C D A B C D A B C D ~@8 E F G H E F G H
  ~@7 J E F G H E F G H K@2 ~ L M@2 ~@2 E F G H E F G H E F G H E F G H N@3
>`.pickRestart({
  A: "[e2,b2,e3,g#3,b3,e4]@4 [e2,b2,e3,g#3,b3,e4]@2 [e2,b2,e3,g#3,b3,e4]@4 [e2,b2,e3,g#3,b3,e4]@2 [e2,b2,e3,g#3,b3,e4]@2 [e2,b2,e3,g#3,b3,e4]!2", // E
  B: "[f2,c3,f3,a3,c4,f4]@4 [f2,c3,f3,a3,c4,f4]@2 [f2,c3,f3,a3,c4,f4]@4 [f2,c3,f3,a3,c4,f4]@2 [f2,c3,f3,a3,c4,f4]@2 [f2,c3,f3,a3,c4,f4]!2", // F
  C: "[g2,d3,g3,d4,g4]@2 [g2,d3,g3,d4,g4] [g2,d3,g3,d4,g4]@2 [g2,d3,g3,d4,g4]!3", // G5
  D: "[g2,d3,g3,c4,g4]@2 [g2,d3,g3,c4,g4] [g2,d3,g3,c4,g4]@2 [g2,d3,g3,c4,g4] [g2,d3,g3,b3,g4]@2", // Gsus4 G
  E: "[e2,e3,b3]@2 [e2,e3,b3] [e2,e3,b3]@2 [e2,e3,b3]!2 [b2,f#3]", F: "[b2,f#3]@2 [c3,g3] [c3,g3]@2 [c3,g3]!3",
  G: "[c3,g4,c5]@2 [d3,a4,d5] [d3,a4,d5]@2 [d3,a4,d5] [d3,a4,d5]@2", // C5 D5
  H: "[a2,e4,a4]@2 [a2,e4,a4] [a2,e4,a4]@2 [a2,e4,a4]!3", I: "[e2,b2,e3]/2", J: "~@6 e2@6 [e2,b2,e3]!4",
  K: "[e2@3 ~]/2", L: "~@5 a2!3", M: "e2/2", N: "[[e2,b2,e3], b3 ~@2]/3",
})).s("gm_overdriven_guitar").gain(0.19).pan(0.2)

// bass · electric bass finger · "bass"
const bass = note(`<
  ~@16 A B C D A B C D A B C D A B C D E ~@3 A F G H I J K L I J K L M ~ C D I N O P I N O P I N O P A B C D A B C D A B
  C D A B C D E ~@3 I J K L I J K L I J K L ~@8 I J K L I J K L ~@8 I J K L I J K L I J K L I J K L E ~@2
>`.pickRestart({
  A: "e2@2 ~ e2@2 ~ e2@2", B: "f2@2 ~ f2@2 ~ f2@2", C: "g2@2 ~ g2@2 ~ g2@2", D: "g2@2 ~ g2@2 ~ f2@2", E: "e2 ~@3",
  F: "c2@2 ~ c2@2 ~ c2@2", G: "d2@2 ~ d2@2 ~ d2@2", H: "a1@2 ~ a1@2 ~ a1@2", I: "e2@2 ~ e2@2 ~ e2 d2",
  J: "c2@2 ~ c2@2 ~ c2 c#2", K: "d2@2 ~ d2@2 ~ d2 c2", L: "a1@2 ~ a1@2 ~ a1 d2", M: "e2 ~@7", N: "c2@2 ~ c2@2 ~ c2 g#1",
  O: "g1@2 ~ g1@2 ~ g1!2", P: "g1@2 ~ g1@2 ~ g1 d2",
})).s("gm_electric_bass_finger").gain(0.64)

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

// drums · rim
const rim = s("rim").struct("<~@2 [x ~@2 x ~@2 x ~]!13 [x ~@2 x ~@4] ~@80 [~@3 x ~@2 x ~] [x ~@2 x ~@2 x ~]!6 x ~@35>")
  .gain(0.45)

// drums · snare
const snare = s("sd").struct(`<
  ~@15 A B C@15 ~@3 D B C@11 ~@2 C@13 E B C@15 ~@3 D B C@11 ~@7 D B C@7 ~@7 D B C@15 F ~@2
>`.pickRestart({
  A: "~@12 x!4", B: "x!2 ~ x", C: "~ x ~ x", D: "~@13 x!3", E: "~@4 x ~@7 x!4", F: "x",
})).gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<~@35 A ~@47 A ~@31 B ~@3 C ~@19>".pickRestart({
  A: "~ x!2 ~ x!2 ~@2", B: "~@6 x!2", C: "~@3 x!3 ~@2",
})).gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<~@2 A@14 ~@19 A@5 ~@10 A@14 ~@19 A@5 ~@31 B ~@19>".pickRestart({
  A: "x!8", B: "~@3 x!5",
})).gain(0.45)

// drums · mid tom
const mid_tom = s("mt").struct("<~@35 [x ~@2 x ~@4] ~@47 [x ~@2 x ~@4] ~@55>").gain(0.45)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@2 A ~@13 B@16 A ~@3 C@4 B@8 A ~ C@14 B@16 A ~@3 C@4 B@8 A ~@7 B@8 A ~@3 A ~@3 B@16 A ~@2
>`.pickRestart({
  A: "x", B: "x!8", C: "x ~@2 x ~@2 x ~",
})).gain(0.45)

// drums · crash
const crash = s("cr").struct(`<
  ~@16 A@16 B ~@7 A@8 B ~@15 A@16 B ~@7 A@8 B ~@7 A@8 B ~@3 B ~@3 A@16 B ~@2
>`.pickRestart({
  A: "x ~@2 x ~@2 x ~", B: "x",
})).gain(0.45)

stack(
  acoustic_guitar_steel, overdriven_guitar, acoustic_guitar_steel_2, overdriven_guitar_2, bass, kick, rim, snare,
  low_tom, hihat, mid_tom, open_hat, crash
)

More by Hole