Strudelify

If You Must (demo, 1988)

Nirvana

KeyB♭ majorTempo110 bpm
0:00/0:00
// If You Must (demo, 1988) — Nirvana
// 110 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 1 "guitar" named as a guitar, played on electric guitar clean (its lead 8 bass lead patch is not one)
// 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): guitar.
setcpm(110/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 · electric guitar clean · "guitar"
const electric_guitar_clean = note("<~@5 A@2 ~@39 B C ~ B C ~@18 D@3 ~@29>".pickRestart({
  A: "[~@7 [d3,bb3,d4]@2 ~@7]/2", B: "~@2 [ab2,eb3,ab3]!2 ~@4", C: "~@6 [ab2,eb3,ab3]!2", D: "[bb2,f3,bb3]/3",
})).s("gm_electric_guitar_clean").gain(0.18).pan(0.3)

// chords · overdriven guitar · "guitar"
const overdriven_guitar = note(`<
  ~@5 A@2 B C@2 B C@2 B D@4 E B F@2 ~@2 G@6 E B C@2 B C@2 B C@2 B C@2 B F@2 ~@5 E B H@4 I@3 J K L J K L J K L M@3 J K L
  J K L N O P@2 O P@2 O P@2 O P@2 O P@2 O P@2 O Q R@2
>`.pickRestart({
  A: "[~@7 [d3,bb3,d4]@2 [bb2,f3,bb3] [f2,c3,f3] [eb2,bb2,eb3] [ab2,eb3,ab3] [d3,a3,d4]@2 [bb2,f3,bb3]]/2", // Gm Bb5 F5 Eb5 Ab5 D5 Bb5
  B: "[f2,c3,f3] [eb2,bb2,eb3] [ab2,eb3,ab3] [d3,a3,d4]@2 [bb2,f3,bb3] [f2,c3,f3] [eb2,bb2,eb3]", // F5 Eb5 Ab5 D5 Bb5 F5 Eb5
  C: "[[ab2,eb3,ab3] [d3,a3,d4]@2 [bb2,f3,bb3] [f2,c3,f3] [eb2,bb2,eb3] [ab2,eb3,ab3] [d3,a3,d4]@2 [bb2,f3,bb3] [f2,c3,f3] [eb2,bb2,eb3] [ab2,eb3,ab3] [d3,a3,d4]@2 [bb2,f3,bb3]]/2", // Ab5 D5 Bb5 F5 Eb5 Ab5 D5 Bb5 …
  D: "[[ab2,eb3,ab3] [d3,a3,d4]@2 [bb2,f3,bb3] [f2,c3,f3] [eb2,bb2,eb3] [ab2,eb3,ab3] ~ [bb2,f3,bb3]@24, ~@7 [d3,a3,d4]@2 ~@23]/4", // Ab5 D5 Bb5 F5 Eb5 Ab5 Bb5 D5
  E: "~ [bb2,f3,bb3] [f2,c3,f3] [eb2,bb2,eb3] [ab2,eb3,ab3] [d3,a3,d4]@2 [bb2,f3,bb3]", // Bb5 F5 Eb5 Ab5 D5 Bb5
  F: "[[ab2,eb3,ab3] [d3,a3,d4]@2 [bb2,f3,bb3] [f2,c3,f3] [eb2,bb2,eb3] [ab2,eb3,ab3] [d3,a3,d4]@2 ~@7]/2", // Ab5 D5 Bb5 F5 Eb5 Ab5 D5
  G: "[[bb2,bb3] [bb2,bb3], f3]/6", // Bb
  H: "[[ab2,eb3,ab3] [d3,a3,d4]@2 [bb2,f3,bb3] [f2,c3,f3] [eb2,bb2,eb3] [ab2,eb3,ab3] ~ [e3,b3,e4]@5 [c3,gb3,c4] [bb2,f3,bb3]@5 [c3,gb3,c4] [e3,b3,e4]@5 [c3,gb3,c4] [bb2,f3,bb3]@5 [c3,gb3,c4], ~@7 [d3,a3,d4]@2 ~@23]/4", // Ab5 D5 Bb5 F5 Eb5 Ab5 E5 Cdim …
  I: "[[e3,b3,e4]@5 [c3,gb3,c4] [bb2,f3,bb3]@5 [c3,gb3,c4] [e3,b3,e4]@5 [c3,gb3,c4] [bb2,f3,bb3]@5 [c3,gb3,c4]]/3", // E5 Cdim Bb5 Cdim E5 Cdim Bb5 Cdim
  J: "~@4 [ab2,eb3] [d3,a3] ~@2", K: "~@2 [ab2,eb3] [d3,a3] ~@4", L: "[ab2,eb3] [d3,a3] ~@4 [ab2,eb3] [d3,a3]",
  M: "[bb2,f3,bb3]/3", N: "~ [bb2,f3] [f2,c3] [eb2,bb2] [ab2,eb3] [d3,a3]@2 [bb2,f3]",
  O: "[f2,c3] [eb2,bb2] [ab2,eb3] [d3,a3]@2 [bb2,f3] [f2,c3] [eb2,bb2]", // F5 Eb5 Ab5 D5 Bb5 F5 Eb5
  P: "[[ab2,eb3] [d3,a3]@2 [bb2,f3] [f2,c3] [eb2,bb2] [ab2,eb3] [d3,a3]@2 [bb2,f3] [f2,c3] [eb2,bb2] [ab2,eb3] [d3,a3]@2 [bb2,f3]]/2", // Ab5 D5 Bb5 F5 Eb5 Ab5 D5 Bb5 …
  Q: "[ab2,eb3] [d3,a3]@2 [bb2,f3] [f2,c3] [eb2,bb2] [ab2,eb3] [d3,a3]", R: "[bb2@15 ~, f3@7 ~, bb3@3 ~]/2",
})).s("gm_overdriven_guitar").gain(0.37).pan(0.7)

// chords · electric guitar jazz · "guitar"
const electric_guitar_jazz = note(`<
  ~@6 A B C@2 B C@2 B D@4 A B C@2 B D@4 E@3 F G@2 F G@2 F G@2 F G@2 F G@2 H I J H I J F G@2 K@3 L@4 B C@2 B C@2 B M@2
  ~@2 A B C@2 B C@2 B C@2 B N@2 G@2 F G@2 F G@2 F G@2 F G@2 O@2
>`.pickRestart({
  A: "~ [bb2,f3] [f2,c3] [eb2,bb2] [ab2,eb3] [d3,a3]@2 [bb2,f3]", // Bb5 F5 Eb5 Ab5 D5 Bb5
  B: "[f2,c3] [eb2,bb2] [ab2,eb3] [d3,a3]@2 [bb2,f3] [f2,c3] [eb2,bb2]", // F5 Eb5 Ab5 D5 Bb5 F5 Eb5
  C: "[[ab2,eb3] [d3,a3]@2 [bb2,f3] [f2,c3] [eb2,bb2] [ab2,eb3] [d3,a3]@2 [bb2,f3] [f2,c3] [eb2,bb2] [ab2,eb3] [d3,a3]@2 [bb2,f3]]/2", // Ab5 D5 Bb5 F5 Eb5 Ab5 D5 Bb5 …
  D: "[[ab2,eb3] [d3,a3]@2 [bb2,f3] [f2,c3] [eb2,bb2] [ab2,eb3] ~ [bb2,f3,bb3]@24, ~@7 [d3,a3]@2 ~@23]/4", // Ab5 D5 Bb5 F5 Eb5 Ab5 Bb5 D5
  E: "[bb2,f3,bb3]/3", F: "[bb2,f3,bb3]@2 [f2,c3,f3] [eb2,bb2,eb3]@2 [f2,c3,f3] [bb2,f3,bb3]@2",
  G: "[[f2,c3,f3] [eb2,bb2,eb3]@2 [f2,c3,f3] [bb2,f3,bb3]@2 [f2,c3,f3] [eb2,bb2,eb3]@2 [f2,c3,f3] [bb2,f3,bb3]@2 [f2,c3,f3] [eb2,bb2,eb3]@2 [f2,c3,f3]]/2", // F5 Eb5 F5 Bb5 F5 Eb5 F5 Bb5 …
  H: "[g2,d3,g3]!6 [ab2,eb3,ab3]!2", I: "[ab2,eb3,ab3] [ab2,eb3,ab3]@3 [g2,d3,g3]!4",
  J: "[g2,d3,g3]!2 [ab2,eb3,ab3]!3 [ab2,eb3,ab3]@3", // G5 Ab5
  K: "[[e2,b2,e3]@5 [c2,gb2,c3] [bb1,f2,bb2]@5 [c2,gb2,c3] [e2,b2,e3]@5 [c2,gb2,c3] [bb1,f2,bb2]@5 [c2,gb2,c3]]/3", // E5 Cdim Bb5 Cdim E5 Cdim Bb5 Cdim
  L: "[[e2,b2,e3]@5 [c2,gb2,c3] [bb1,f2,bb2]@5 [c2,gb2,c3] [e2,b2,e3]@5 [c2,gb2,c3] [bb1,f2,bb2]@5 [c2,gb2,c3]@2 [bb2,f3] [f2,c3] [eb2,bb2] [ab2,eb3] [d3,a3]@2 [bb2,f3]]/4", // E5 Cdim Bb5 Cdim E5 Cdim Bb5 Cdim …
  M: "[[ab2,eb3] [d3,a3]@2 [bb2,f3] [f2,c3] [eb2,bb2] [ab2,eb3] [d3,a3]@2 ~@7]/2", // Ab5 D5 Bb5 F5 Eb5 Ab5 D5
  N: "[[ab2,eb3] [d3,a3]@2 [bb2,f3] [f2,c3] [eb2,bb2] [ab2,eb3] ~ [bb2,f3,bb3]@2 [f2,c3,f3] [eb2,bb2,eb3]@2 [f2,c3,f3] [bb2,f3,bb3]@2, ~@7 [d3,a3]@2 ~@7]/2", // Ab5 D5 Bb5 F5 Eb5 Ab5 Bb5 F5 …
  O: "[bb2@15 ~, f3@7 ~, bb3@3 ~]/2",
})).s("gm_electric_guitar_jazz").gain(0.45)

// bass · electric bass finger · "bass"
const bass = note(`<
  ~@3 A B C A B D@2 B C A B C A B C A B C A B C A B C A B D@2 B D@2 B D@2 B D@2 B D@2 B E@2 F G H F G A B C I@6 A B C A
  B C A B C J@3 A B C A B C A B C A B C A B C A B C A B C A B C A B C K@2
>`.pickRestart({
  A: "~ bb2 f2 eb2 ab2 d3@2 bb2", B: "f2 eb2 ab2 d3@2 bb2 f2 eb2", C: "ab2 d3@2 bb2 f2 eb2 ab2 d3",
  D: "[ab2 d3@2 bb2 f2 eb2 ab2 d3@2 bb2 f2 eb2 ab2 d3@2 bb2]/2",
  E: "[ab2 d3@2 bb2 f2 eb2 ab2 ~ g2!6 ab2!2, ~@7 d3@2 ~@7]/2", F: "ab2 ab2@3 g2!4", G: "g2!2 ab2!3 ab2@3",
  H: "g2!6 ab2!2", I: "[e3@5 c3 bb2@5 c3 e3@5 c3 bb2@5 c3]/3", J: "bb2/3", K: "[bb2@15 ~]/2",
})).s("gm_electric_bass_finger").gain(0.45)

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

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

// drums · low tom
const low_tom = s("lt").struct(`<
  A B C D E F D E F D E F D E F D E F D E F D E F D E F G H I D E F D E F D E F D E F J H I K L M K L M D E F D E F D E
  F D E F D E F D E F D E F D E F D E F D E F G H I D E F D E F D E F D E F D E F N ~
>`.pickRestart({
  A: "x ~@3 x ~@7 x!2 ~ x", B: "x!2 ~@2 x ~ x ~ x ~@3 x ~@3", C: "~@4 x!2 ~ x!4 ~ x ~ x ~", D: "x ~@2 x", E: "~ x",
  F: "~ x ~@2", G: "x!3 ~ x!4", H: "x ~ x!5 ~", I: "x!2 ~ x!2 ~ x ~", J: "x!3 ~ x ~ x ~", K: "x!3 ~ x!3 ~",
  L: "~@4 x!3 ~", M: "x!3 ~@5", N: "x",
})).gain(0.64)

// drums · hihat
const hihat = s("hh").struct("<~@6 [x!8]!93 x ~>").gain(0.64)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@5 A ~@9 B ~@8 B ~@2 B ~@2 B ~@2 B ~@2 B ~@2 B ~@2 B ~@2 B C ~ B C ~ B ~@2 B ~@2 B ~@2 B ~@2 B ~@2 B ~@2 B ~@2 B ~@2
  B ~@2 B ~@2 B ~@2 B ~@2 B ~@2 B ~@2 B ~@2 B ~@2 B ~
>`.pickRestart({
  A: "~@7 x", B: "x", C: "~ x",
})).gain(0.64)

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

// drums · ride
const ride = s("rd").struct("<[x!6 ~@2] [~@4 x!4] [x!2 ~@6] [x!8]!96 x ~>").gain(0.64)

stack(
  electric_guitar_clean, overdriven_guitar, electric_guitar_jazz, bass, kick, snare, low_tom, hihat, open_hat, crash,
  ride
)

More by Nirvana