Strudelify
KeyF minorTempo130 bpm
0:00/0:00
// Eraser — Nine Inch Nails
// 130 bpm, 6/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (6/4 at bar 1, 8/4 at bar 85) are rendered on a constant 6/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 106 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): OVERDRIVE.
setcpm(130/6)

// 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.

// other · piano · "A.PIANO 1"
const piano = note("<~@76 A B A B A B A B ~@22>".pickRestart({
  A: "bb3@3 c4@7 ~@2", B: "db4@3 eb4@7 ~@2",
})).s("gm_piano").gain(0.48)

// bass · slap bass 1 · "SLAPBASS 1"
const bass = note("<~@76 A B A B A B A B C D E F C D E F C D E F C D E F C D E F C G>".pickRestart({
  A: "bb1@2 bb1@2 bb1@2 bb1@2 bb1 ab1 ~@2", B: "bb1@2 bb1@2 bb1@2 bb1@2 bb1 ab1 ~ f1", C: "eb1@4 f1@4 f1!4",
  D: "f1!2 f1@2 f1@2 f1@2 eb1@8 f1@8", E: "f1@2 f1@2 f1@2 f1@2 f1!2 f1@2 f1@2 f1@2 eb1@8",
  F: "f1@8 f1@2 f1@2 f1@2 f1@2 f1!2 f1@2 f1@2 f1@2", G: "f1!2 f1@2 f1@2 f1@2 ~@16",
})).s("gm_slap_bass_1").gain(0.72)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note("<~@12 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 ~@30>".pickRestart({
  A: "[~@4 db4@3 ab3@37 ~@4]/2", B: "[~@8 db4@3 ab3@37]/2",
})).s("gm_lead_2_sawtooth").gain(0.34).pan(0)

// bass · lead 8 bass lead · "BASS&LEAD"
const bass_2 = note(`<
  ~@24 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@8 C D E
  F G H I J K L M N O P Q R S H T U V W
>`.pickRestart({
  A: "f2@2 f2@2 f2@2 f2@4 f2@2 f2@2 f2@2 f2 ~ f2@2 f2@2 ~@2",
  B: "f2@2 f2@2 f2@2 f2@4 f2@2 f2@2 f2@2 f2 ~ f2@2 f2@2 f2@2",
  C: "[f1,f2]@7 ~ [f1,f2]@8 f1@2 [f1,f2] ~ [f1,f2] ~ [f1,f2] ~, ~@16 f2 ~@7", // F
  D: "[f1,f2] ~ [f1,f2]!3 ~ [f1,f2] ~ [f1,f2]@7 ~ [f1,f2]@8", // F
  E: "~ [f1,f2] ~ [f1,f2]!2 ~ [f1,f2] ~ [f1,f2]!4 ~ [f1,f2] ~ [f1,f2] [f1,f2]@8", // F
  F: "[f1,f2]@8 [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ f2@2 [f1,f2] ~, ~@20 f1 ~@3", // F
  G: "[f1,f2]@8 [f1,f2]@8 [f1,f2]@2 f1 f2 [f1,f2] ~ [f1,f2] ~", // F
  H: "[f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2]@8 [f1,f2]@8", // F
  I: "[f1,f2]@2 [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2]@7 ~", // F
  J: "[f1,f2]@7 ~ [f1,f2]@2 [f1,f2] ~ [e1,f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~", // F Fmaj7 F
  K: "[f1,f2]@8 [f1,f2]@8 [f1,f2]@2 [f1,f2] ~ [f1,f2] ~ [f1,f2] ~", // F
  L: "[f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~@2 [f1,f2]@7 [f1,f2]@8", // F
  M: "~ [f1,f2]!2 ~ [f1,f2] ~ [f1,f2] ~ [f1,f2]!3 ~ [f1,f2] ~ [f1,f2] ~ [f1,f2]@8", // F
  N: "[f1,f2]@8 [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~", // F
  O: "[f1,f2]@7 ~ [f1,f2]@8 [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~", // F
  P: "[f1,f2] ~ [f1,f2]!2 ~@2 [f1,f2] ~ [f1,f2]@7 ~ [f1,f2]@7 ~", // F
  Q: "[f1,f2] ~ f2 ~ [f1,f2] ~ [f1,f2] ~ [f1,f2]!3 ~ [f1,f2] ~ [f1,f2] ~ [f1,f2]@8", // F
  R: "[f1,f2]@7 ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ f2!2 [f1,f2] ~ [f1,f2] ~ [f1,f2] ~, ~@8 f1 ~@3", // F
  S: "[f1,f2]@8 [f1,f2]@8 [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~", // F
  T: "[f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ f2!2 [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2]@8, ~@4 f1 ~@7", // F
  U: "[f1,f2]@8 [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] f2 [f1,f2] ~ [f1,f2] ~ [f1,f2] ~", // F
  V: "[f1,f2]@7 ~ [f1,f2]@8 f1 ~ [f1,f2] ~ [f1,f2] ~ [f1,f2] ~", W: "[f1,f2]!3 ~ [f1,f2]@2 ~@18",
})).s("gm_lead_8_bass_lead").gain(0.4)

// bass · lead 8 bass lead · "BASS&LEAD" · soft notes
const bass_soft = note("<~@76 A B A B A B A B ~@14 C ~@2 D ~ E F ~>".pickRestart({
  A: "bb1@2 bb1@2 bb1@2 bb1@2 bb1 ab1 ~@2", B: "bb1@2 bb1@2 bb1@2 bb1@2 bb1 ab1 ~ f1", C: "~@2 f1 ~@21",
  D: "~ [f1,f2] ~@22", E: "~@17 f1 ~@6", F: "~@16 f2 ~@7",
})).s("gm_lead_8_bass_lead").gain(0.2)

// other · piano · "A.PIANO 2"
const piano_2 = note(`<
  ~@36 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D ~@30
>`.pickRestart({
  A: "a4@2 a4 ab5@2 a4!7", B: "a4@2 a4 ab5@3 c5!6", C: "c5@2 bb4 f5@3 c5!6", D: "c5@2 bb4 f5@3 a4!6",
})).s("gm_piano").gain(0.43).pan(0)

// chords · distortion guitar · "DISTORTION"
const distortion_guitar = note("<~@67 A B C D E F G H I ~@8 J K L M J K L M J K L M J K L M J K L M J N>".pickRestart({
  A: "~@16 f2!8", B: "g2!9 ab2!9 bb2!6", C: "bb2!3 c3!9 eb2!8 f2!4", D: "f2!4 g2!8 ab2!8 bb2!4",
  E: "bb2!4 c3!8 eb2!7 f2!5", F: "f2!2 g2!7 ab2!7 bb2!7 c3", G: "c3!6 eb2!6 f2!6 g2!6", H: "ab2!6 bb2!6 c3!6 eb2!5 f2",
  I: "f2!4 g2!5 ab2!5 bb2!5 c3!5", J: "[f2,c3,f3]@8 [f2,c3,f3]@8 [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~",
  K: "[f2,c3,f3]!3 ~ [f2,c3,f3]@2 [f2,c3,f3]@2 [f2,c3,f3]@8 [f2,c3,f3]@8", // F5
  L: "[f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3]!3 ~ [f2,c3,f3]@2 [f2,c3,f3]@2 [f2,c3,f3]@8", // F5
  M: "[f2,c3,f3]@8 [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3] ~ [f2,c3,f3]!3 ~ [f2,c3,f3]@2 [f2,c3,f3]@2", // F5
  N: "[f2,c3,f3]!3 ~ [f2,c3,f3]@2 [f2,c3,f3]@2 ~@16", // F5
})).s("gm_distortion_guitar").gain(0.31)

// chords · distortion guitar · "DISTORTION" · soft notes
const distortion_guitar_soft = note("<~@59 A B C D E F G H I ~@38>".pickRestart({
  A: "eb2!12 f2!12", B: "g2!12 ab2!12", C: "bb2!12 c3!12", D: "eb2!11 f2!11 g2!2", E: "g2!9 ab2!11 bb2!4",
  F: "bb2!7 c3!11 eb2!6", G: "eb2!4 f2!10 g2!10", H: "ab2!10 bb2!10 c3!4", I: "c3!6 eb2!9 f2 ~@8",
})).s("gm_distortion_guitar").gain(0.15)

// other · pad new age · "FANTASIA"
const pad_new_age = note("<~@20 A@8 ~@78>".pickRestart({
  A: "eb4/8",
})).s("gm_pad_new_age").gain(0.23)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  ~@44 A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B ~@8 C D E F G H I J C D E F G H I J C D E F G ~
>`.pickRestart({
  A: "[g4,c5]@4 [g4,c5]@5 ~@5 [g4,c5] ~ [g4,c5]!3 ~ [g4,c5] ~ [g4,c5] ~", // C5
  B: "[g4,c5]@4 [g4,c5]@5 ~@3 [eb4,bb4]@2 [f4,bb4]@2 [eb4,bb4]@2 [f4,bb4]@2 [eb4,bb4]@2 [ab4,bb4]@2", // C5 Eb5 Bb5 Eb5 Bb5 Eb5 Absus2
  C: "[bb2,f3,bb3] [c3,g3,c4] ~", D: "~ [eb3,bb3,eb4] [f3,c4,f4]", E: "~@2 [bb2,f3,bb3]", F: "[c3,g3,c4] ~@2",
  G: "[eb3,bb3,eb4] [f3,c4,f4] ~", H: "~ [bb2,f3,bb3] [c3,g3,c4]", I: "~@2 [eb3,bb3,eb4]", J: "[f3,c4,f4] ~@2",
})).s("gm_overdriven_guitar").gain(0.15).pan(1)

// other · piano · "A.PIANO 2"
const piano_3 = note("<~@54 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@29 C>".pickRestart({
  A: "~@2 c5!10", B: "c5@2 c5!10", C: "~@2 f5@3 ~",
})).s("gm_piano").gain(0.39)

// chords · lead 5 charang · "CHARANG"
const lead_5_charang = note("<~@93 A B C D@2 B C D@2 B C E@2>".pickRestart({
  A: "~ [c3,f3] [f3,bb3]@2 [gb3,b3]@2", B: "[g3,c4]@3 [bb3,eb4]@2 [c3,f3] [c3,f3]@2 [f3,bb3]@4",
  C: "[gb3,b3]@4 [g3,c4]@3 [bb3,eb4]@2 [c3,f3] [c3,f3]@2", // B5 C5 Eb5 F5
  D: "[[f3,bb3]@4 [gb3,b3]@4 [g3,c4]@3 [bb3,eb4]@2 [c3,f3] [c3,f3]@2 [f3,bb3]@4 [gb3,b3]@4]/2", // Bb5 B5 C5 Eb5 F5 Bb5 B5
  E: "[[f3,bb3]@4 [gb3,b3]@4 [g3,c4]@3 [bb3,eb4]@2 [c3,f3] [c3,f3]@2 ~@8]/2", // Bb5 B5 C5 Eb5 F5
})).s("gm_lead_5_charang").gain(0.41)

// chords · lead 5 charang · "CHARANG" · soft notes
const lead_5_charang_soft = note("<~@89 A B C D@2 ~@12>".pickRestart({
  A: "~ [f3,bb3] [gb3,b3]", B: "[g3,c4]@3 [bb3,eb4]@2 [c3,f3] [c3,f3]@2 [f3,bb3]@4",
  C: "[gb3,b3]@4 [g3,c4]@3 [bb3,eb4]@2 [c3,f3] [c3,f3]@2", // B5 C5 Eb5 F5
  D: "[[f3,bb3]@4 [gb3,b3]@4 [g3,c4]@3 [bb3,eb4]@2 [c3,f3] ~@10]/2", // Bb5 B5 C5 Eb5 F5
})).s("gm_lead_5_charang").gain(0.2)

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

// drums · rim
const rim = s("rim").struct("<~@84 A B C D A B C D A B C D A B C D A B C D A B>".pickRestart({
  A: "~@11 x", B: "~ x ~@10", C: "~@3 x ~ x ~@6", D: "~@7 x ~ x ~@2",
})).gain(0.8)

// drums · snare
const snare = s("sd").struct("<~@12 A@72 B C D E B C D E B C D E B C D E B C D E B F>".pickRestart({
  A: "~@4 x ~@4 x ~@2", B: "x ~@3 x ~@3 x ~@2 x", C: "~ x ~@2 x ~@3 x ~@3", D: "x ~@2 x ~ x ~@2 x ~@3",
  E: "x ~@3 x ~@2 x ~ x ~@2", F: "~ x ~@10",
})).gain(0.72)

// drums · low tom
const low_tom = s("lt").struct("<~@12 A@72 ~ B C D E F G H ~ B C D E F G H ~ B C D E ~>".pickRestart({
  A: "~@5 x", B: "~@2 x!2 ~@2 x ~@3 x ~", C: "~@3 x ~@3 x ~@4", D: "~@10 x!2", E: "~@2 x ~@3 x ~@4 x", F: "~ x ~@2",
  G: "~@6 x!2 ~@2 x ~", H: "~@2 x ~@4 x ~@3 x",
})).gain(0.72)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<[x!8 ~@3 x] x ~@104>").gain(0.24)

// drums · mid tom
const mid_tom = s("mt").struct("<~@12 A@72 ~@2 B ~ C D ~ E ~@2 B ~ C D ~ E ~@2 B ~ C D>".pickRestart({
  A: "x ~ x ~@2 x ~ x ~@2 x!2", B: "~ x!2 ~@2 x!2 ~@5", C: "~@9 x!2 ~", D: "~ x!2 ~@9", E: "~@5 x!2 ~@2 x!2 ~",
})).gain(0.72)

// drums · open hat
const open_hat = s("oh").struct("<~@5 A@7 ~@72 B C D E ~ F G H B C D E ~ F G H B C D E ~ I>".pickRestart({
  A: "~@2 x", B: "~ x ~ x ~ x", C: "~@2 x!2 ~@8", D: "~@6 x!2 ~@2 x ~", E: "~@2 x ~@3 x ~@3 x!2",
  F: "~@2 x!2 ~@2 x ~@3 x ~", G: "~@2 x ~@3 x!2 ~@4", H: "~@10 x!2", I: "~ x ~@4",
})).gain(0.64)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<[~@2 x]!5 ~@101>").gain(0.32)

// drums · high tom
const high_tom = s("ht").struct("<~@12 A@72 ~@2 B ~ C D ~ E ~@2 B ~ C D ~ E ~@2 B ~ C D>".pickRestart({
  A: "~@4 x ~@4 x!3", B: "x ~@7 x!2 ~@14", C: "~@2 x", D: "x!2 ~@22", E: "~@8 x ~@7 x!2 ~@6",
})).gain(0.72)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@76 [x!6]!8 ~@22>").gain(2.43)

// drums · shaker
const shaker = s("sh").struct("<~ [~@11 x] [x!9 ~@2 x]!10 ~@64 [x!6]!8 ~@22>").gain(0.48)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<[x!9 ~@2 x] [x!9 ~@3] ~@104>").gain(0.24)

stack(
  piano, bass, lead_2_sawtooth, bass_2, bass_soft, piano_2, distortion_guitar, distortion_guitar_soft, pad_new_age,
  overdriven_guitar, piano_3, lead_5_charang, lead_5_charang_soft, kick, rim, snare, low_tom, hihat, hihat_soft,
  mid_tom, open_hat, open_hat_soft, high_tom, cabasa, shaker, shaker_soft
)

More by Nine Inch Nails