Strudelify
Aero Zeppelin cover art

Incesticide

Aero Zeppelin

Nirvana

KeyE majorTempo100 bpm
0:00/0:00
// Aero Zeppelin — Nirvana
// 100 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 89 bars on a 32-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.
setcpm(100/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@2 B C D E@8 F G H I@8 J K L@2 M@7 N O P O P O P O P@4 Q@4 R S R S R S R S O T O T O T O U@4 Q@4 R S R S R S R S
  V@2 ~@4
>`.pickRestart({
  A: "[~@28 [e2,b2,e3]@2 ~@7 e4@2 e4@2 e4@2 d4@7 a#3@4 d4@4 ~ a#3@4 [e2,b2,e3], ~@30 [e2,b2,e3]@33 ~]/2", // E5
  B: "~@8 e4@2 e4@2 e4@2 d4@7 a#3@4 d4@4 ~ e4@2, ~ [e2,b2,e3]@31", // E5
  C: "~@2 [e2,b2,e3]@2 ~@7 e4@2 e4@2 e4@2 ~ d4@6 a#3@4 ~ d4@3, ~ [e2,b2,e3]@7", // E5
  D: "~ a#3@4 [e2,b2,e3]@2 ~@7 e4@2 e4@2 ~ e4@2 d4@6 a#3@4 ~, ~ [e2,b2,e3]@3", // E5
  E: "[d4@4 e4@4 ~ [e2,b2,e3]@2 ~@6 e4@2 e4@2 ~ e4@2 d4@6 a#3@4 ~ d4@4 a#3@4 ~ [e2,b2,e3]@2 ~@6 e4@2 ~ e4@2 e4@2 d4@7 a#3@4 d4@4 e4@4 ~ [e2,b2,e3]@2 ~@7 e4@2 e4@2 e4@2 d4@7 a#3@4 d4@4 ~ a#3@4 [e2,b2,e3]@2 ~@7 e4@2 e4@2 e4@2 d4@7 a#3@4 d4@4 ~ e4@4 [e2,b2,e3]@2 ~@7 e4@2 e4@2 e4@2 ~ d4@6 a#3@4 ~ d4@4 a#3@4 [e2,b2,e3]@2 ~@7 e4@2 e4@2 ~ e4@2 d4@6 a#3@4 ~ d4@4 e4@4 [e2,b2,e3]@2 ~@7 e4@2 e4@2 ~ e4@2 d4@6 a#3@4 ~ d4@4 a#3@4 ~ [e2,b2,e3], ~@11 [e2,b2,e3]@33 ~@2 [e2,b2,e3]@33 ~@2 [e2,b2,e3]@33 ~@2 [e2,b2,e3]@33 ~@2 [e2,b2,e3]@33 ~@3 [e2,b2,e3]@32 ~@3 [e2,b2,e3]@33 ~]/8", // E5
  F: "~@7 e4@2 ~ e4@2 e4@2 d4@18, ~ [e2,b2,e3]@31", G: "~@2 [e2,b2,e3]@2 ~@7 e4@2 e4@2 e4@2 d4@15, ~ [e2,b2,e3]@7",
  H: "~@5 [e2,b2,e3]@2 ~@7 e4@2 e4@2 e4@2 d4@7 a#3@4 d4, ~@7 [e2,b2,e3]@25", // E5
  I: "[~@4 a#3@4 [e2,b2,e3]@2 ~@7 e4@2 e4@2 e4@2 ~ d4@6 a#3@4 ~ d4@4 e4@4 [e2,b2,e3]@2 ~@7 e4@2 e4@2 ~ e4@2 d4@6 a#3@4 ~ d4@4 a#3@4 [e2,b2,e3]@2 ~@7 e4@2 e4@2 ~ e4@2 d4@6 a#3@4 ~ d4@4 e4@4 ~ [e2,b2,e3]@2 ~@6 e4@2 ~ e4@2 e4@2 d4@7 a#3@4 d4@4 a#3@4 ~ [e2,b2,e3]@2 ~@7 e4@2 e4@2 e4@2 d4@7 a#3@4 d4@4 ~ e4@4 [e2,b2,e3]@2 ~@7 e4@2 e4@2 e4@2 d4@7 a#3@4 d4@4 ~ a#3@4 [e2,b2,e3]@2 ~@7 e4@2 e4@2 e4@2 ~ d4@19 [e2,b2,e3]@2, ~@10 [e2,b2,e3]@33 ~@3 [e2,b2,e3]@32 ~@3 [e2,b2,e3]@33 ~@2 [e2,b2,e3]@33 ~@2 [e2,b2,e3]@33 ~@2 [e2,b2,e3]@33 ~@2 [e2,b2,e3]@33 ~@2]/8", // E5
  J: "~@7 e4@2 e4@2 e4@2 ~ d4@18, ~ [e2,b2,e3]@31", K: "~ [e2,b2,e3]@2 ~@7 e4@2 e4@2 ~ e4@2 d4@15, ~ [e2,b2,e3]@7",
  L: "[~@5 [e2,b2,e3]@2 ~@6 e4@2 ~ e4@2 e4@2 d4@20 [e2,b2,e3]@2 b2@7 b2@4 b2@2 b2@7 d3@2, ~@7 [e2,b2,e3]@33 ~@2 [e2,e3]@22]/2", // E5 E
  M: "[~@2 d3@9 [e2,b2,e3]@2 b2@7 b2@2 b2@2 b2@2 ~@7 g2@4 ~@5 g2@4 [e2,b2,e3]@2 b2@7 b2@4 b2@2 ~ b2@6 d3@4 ~ d3@8 [e2,b2,e3]@2 b2@7 b2@2 b2@2 b2@2 ~@7 g2@4 ~@5 g2@4 [e2,b2,e3]@2 ~ b2@6 b2@4 ~ b2@2 b2@6 d3@4 ~ d3@9 [e2,b2,e3]@2 b2@6 b2@2 ~ b2@2 b2@2 ~@7 g2@4 ~@4 g2@4 ~ [e2,b2,e3]@2 b2@7 b2@4 b2@2 b2@7 d3@4 d3@9 [e2,b2,e3]@2, ~@13 [e2,e3]@33 ~@2 [e2,e3]@33 ~@2 [e2,e3]@33 ~@3 [e2,e3]@33 ~@2 [e2,e3]@33 ~@2 [e2,e3]@33 ~@2, ~@26 a#2@11 a#2@9 ~@51 a#2@11 a#2@9 ~@50 a#2@11 a#2@9 ~@37]/7", // E5 E
  N: "b2@7 b2@2 b2@2 b2@2 ~@7 g2@4 ~@4 g2@4, [e2,e3], ~@13 a#2@11 a#2@8", // E
  O: "[b2,f#3,b3]!4 [b2,f#3,b3]@2 [b2,f#3,b3] [d3,a3,d4] ~ [d3,a3,d4]@2 [d3,a3,d4]@2 [d3,a3,d4] [e3,b3,e4]@2", // B5 D5 E5
  P: "c#3 g#2 ~ g#2 c3 g2 ~ g2 b2 f#2 ~ f#2 a#2 f2 ~ f2",
  Q: "[e2,b2,e3] e3@3 [a2,e3,a3]@3 [g#2,d#3,g#3]@3 [e2,b2,e3]@2 [g#2,d#3,g#3] [a2,e3,a3]@3, ~ [e2,b2]@7 ~@8", // E5 A5 G#5 E5 G#5 A5 E5
  R: "[e2,b2,e3]@3 [a2,e3,a3]", S: "[e2,b2,e3]@24 [g#2,d#3,g#3]@7 ~",
  T: "~ g#2@2 g#2 ~ g2@2 g2 ~ f#2@2 f#2 ~ f2@2 f2, c#3 ~ c3 ~ b2 ~ a#2 ~",
  U: "~ g#2 ~ g#2 ~ g2 ~ g2 ~ f#2 ~ f#2 ~ f2 ~ f2, c#3 ~ c3 ~ b2 ~ a#2 ~", V: "[e2,b2,e3]/2",
})).s("gm_overdriven_guitar").gain(0.5)

// bass · electric bass pick
const bass = note(`<
  ~ A@3 B C D E@8 B C F G@8 H C F I@8 J K J K J K J K@4 L@12 J K J K J K J K@4 L@12 M N@2 O P@2
>`.pickRestart({
  A: "[~@28 e1@35 e1@33]/3", B: "~ e1@15", C: "~@5 e1@27", D: "~@9 e1@23",
  E: "[~@12 e1@35 e1@35 e1@35 e1@35 e1@35 e1@35 ~ e1@33]/8", F: "~ e1@3",
  G: "[~@11 e1@35 e1@35 ~ e1@35 e1@35 e1@35 e1@35 e1@34]/8", H: "~ e1@31",
  I: "[~@11 e1@35 e1@35 e1@35 e1@35 ~ e1@35 e1@35 e1@34]/8", J: "b1@2 b1@2 b1@3 d2 ~@2 d2@2 d2@2 e2@2",
  K: "c#2 ~ c2 ~ b1 ~ e1@2", L: "e1", M: "e1@2 e1@2 e1@2 e1 g#1", N: "e1@2 e1@2 e1@2 e1 a#1",
  O: "e1 e1@3 e1@2 e1@2 e1@2 e1@2 e1 e1@3", P: "e1 e1@3 b1 b1@2 b1@2 e1@2 e1!2 g1 a#1@2",
})).s("gm_electric_bass_pick").gain(0.8)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B C D E F G H I J K L B C D M N O P I J Q R S C T M N U V W X Q R S Y Z AA Z AA Z AA Z AA@4 AB AC AB AC AB AD AB
  AD AB AD AB AE Z AA Z AA Z AA Z AA@4 AB AC AB AC AB AD AB AD AB AD AB AD AB AD AB AD ~@2
>`.pickRestart({
  A: "~@14 x!2", B: "~@31 x", C: "~ x ~@30", D: "~ x!2 ~@13", E: "~@5 x ~@2 x ~@23", F: "~@9 x ~ x ~@20",
  G: "~@6 x!2 ~@8", H: "~@15 x ~ x ~@14", I: "~@9 x!2 ~@5", J: "~@21 x ~ x ~@8", K: "~@24 x ~@2 x ~@4",
  L: "~@27 x ~@2 x ~", M: "~@5 x ~ x ~@24", N: "~@4 x!2 ~@10", O: "~@11 x ~@2 x ~@17", P: "~@14 x ~@2 x ~@14",
  Q: "~@12 x!2 ~@2", R: "~@27 x ~ x ~@2", S: "~@15 x", T: "~ x ~@2 x ~@27", U: "~@11 x ~ x ~@18", V: "~@7 x!2 ~@7",
  W: "~@17 x ~ x ~@12", X: "~@20 x ~@2 x ~@8", Y: "x", Z: "x!2 ~ x!2 ~ x!2 ~ x ~ x ~ x!2 ~",
  AA: "x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~@3 x ~ x ~ x ~ x!2", AB: "x!4 ~ x!2 ~ x ~ x!2 ~@2 x ~",
  AC: "x ~@2 x ~ x!2 ~ x ~@2 x ~@3 x", AD: "x ~@2 x ~ x!2 ~ x ~@2 x!3 ~@2", AE: "x ~@2 x ~ x!2 ~ x ~@7",
})).gain(0.8)

// drums · rim
const rim = s("rim").struct("<[~@25 x ~@6] [~ x ~@8 x ~@8 x ~@12] ~@87>").gain(0.8)

// drums · snare
const snare = s("sd").struct(`<
  ~@7 A B C D E F G ~@2 H I J K L M N O P Q R S I T U L V N W X Y Z AA Z AA Z AA Z AA@4 AB AC AB AC AB AD AB AD AB AD AB
  AE Z AA Z AA Z AA Z AA@4 AB AC AB AC AB AD AB AD AB AD AB AD AB AD AB AD ~@2
>`.pickRestart({
  A: "~@3 x ~@28", B: "~@3 x ~@12", C: "~@9 x ~@22", D: "~@3 x ~@4", E: "~ x", F: "~@19 x ~@12", G: "~@11 x ~@4",
  H: "~@31 x", I: "~@17 x ~@14", J: "~@3 x ~@16 x ~@11", K: "~@6 x ~@16 x ~@8", L: "~@9 x ~@16 x ~@5", M: "~@6 x ~@8 x",
  N: "~@15 x ~@16", O: "~ x ~@16 x ~@13", P: "~@2 x ~@8 x ~@4", Q: "~@7 x ~@17 x ~@6", R: "~@5 x ~@8 x ~",
  S: "~@13 x ~@17 x", T: "~ x ~@8 x ~@5", U: "~@5 x ~@17 x ~@8", V: "~@12 x ~@16 x ~@2", W: "x ~@8 x ~@6",
  X: "~@4 x ~@16 x ~@10", Y: "~@7 x ~@12 x!12", Z: "~@4 x ~@2 x ~ x ~ x ~ x!2 ~", AA: "x ~@7 x ~@7 x ~@7 x ~@3 x ~ x!2",
  AB: "~ x ~@2 x ~@4 x ~@2 x ~@2 x", AC: "~ x ~@2 x ~@4 x ~@2 x ~@3", AD: "~ x ~@2 x ~@4 x ~@2 x!2 ~@2",
  AE: "~@2 x ~@5 x ~@11 x!12",
})).gain(0.8)

// drums · open hat
const open_hat = s("oh").struct("<~@48 A@5 B A B A B A C ~@11 A@5 B A B A B A B A B A B ~@2>".pickRestart({
  A: "x!8", B: "x ~ x ~ x ~ x ~ x ~ x ~ x!2 ~@2", C: "x!5 ~@3",
})).gain(0.8)

// drums · crash
const crash = s("cr").struct(`<
  ~ A B C D E F G H I J K L B C D M N O P I J Q R S C T M N U V W X Q R S Y Z AA Z AB Z AB Z AB@4 AC@5 AD AC AD AC AD AC
  AE Z AA Z AB Z AB Z AB@4 AC@5 AD AC AD AC AD AC AD AC AD AC AD ~@2
>`.pickRestart({
  A: "~@14 x!2", B: "~@31 x", C: "~ x ~@30", D: "~ x!2 ~@13", E: "~@5 x ~@2 x ~@23", F: "~@9 x ~ x ~@20",
  G: "~@6 x!2 ~@8", H: "~@15 x ~ x ~@14", I: "~@9 x!2 ~@5", J: "~@21 x ~ x ~@8", K: "~@24 x ~@2 x ~@4",
  L: "~@27 x ~@2 x ~", M: "~@5 x ~ x ~@24", N: "~@4 x!2 ~@10", O: "~@11 x ~@2 x ~@17", P: "~@14 x ~@2 x ~@14",
  Q: "~@12 x!2 ~@2", R: "~@27 x ~ x ~@2", S: "~@15 x", T: "~ x ~@2 x ~@27", U: "~@11 x ~ x ~@18", V: "~@7 x!2 ~@7",
  W: "~@17 x ~ x ~@12", X: "~@20 x ~@2 x ~@8", Y: "x", Z: "x!4 ~@3 x", AA: "x!2 ~ x ~ x ~ x",
  AB: "x ~@3 x ~@7 x ~@7 x ~@6 x ~@4", AC: "x ~ x ~ x ~ x!2", AD: "x!4", AE: "x!3 ~",
})).gain(0.8)

// drums · ride
const ride = s("rd").struct(`<
  ~@2 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI ~ AJ ~ AJ ~ AJ ~ AJ@4 ~@11 AK ~ AJ
  ~ AJ ~ AJ ~ AJ@4 ~@18
>`.pickRestart({
  A: "~@5 x ~ x ~ x ~ x ~@4 x ~ x ~@3 x ~@4 x ~@4", B: "~@8 x ~ x ~ x ~ x ~@4 x ~ x ~@3 x ~@4 x ~",
  C: "~@11 x ~ x ~ x ~@2 x ~@3 x ~ x ~@4 x ~@2", D: "~ x ~@12 x ~ x ~@2 x ~ x ~@3 x ~ x ~@4",
  E: "x ~@3 x ~@12 x ~ x ~@2 x ~ x ~@3 x ~ x ~", F: "~@3 x ~@3 x ~@12 x ~@2 x ~ x ~ x ~@3 x", G: "~ x ~ x ~ x ~@6 x!4",
  H: "~@3 x ~ x ~@3 x ~@4 x ~@12 x ~ x ~ x", I: "~ x ~@4 x ~ x ~@3 x ~@4 x ~@12 x ~",
  J: "x ~ x ~@2 x ~@3 x ~ x ~@4 x ~@3 x ~@11", K: "~ x ~ x ~@2 x ~ x ~@3 x ~ x ~@4 x ~@3 x ~@8",
  L: "~@4 x ~ x ~@2 x ~ x ~@3 x ~ x ~@4 x ~@3 x ~@5", M: "~@7 x ~@2 x ~ x ~ x ~@17", N: "~@11 x ~ x ~ x ~ x ~@14",
  O: "~@14 x ~ x ~ x ~ x ~@4 x ~ x ~@3 x", P: "~@4 x ~@12 x ~ x ~ x ~@2 x ~@3 x ~ x ~",
  Q: "~@3 x ~@3 x ~@12 x ~ x ~@2 x ~ x ~@3 x", R: "~ x ~@4 x ~@3 x ~@12 x ~ x ~@2 x ~ x ~",
  S: "~@2 x ~ x ~@4 x ~@3 x ~@12 x ~@2 x ~ x", T: "~ x ~@3 x ~@2 x ~@3 x ~@3 x ~@13 x ~",
  U: "x ~ x ~ x ~@4 x ~ x ~@3 x ~@4 x ~@11", V: "~ x ~ x ~ x ~ x ~@4 x ~ x ~@3 x ~@4 x ~@8",
  W: "~@4 x ~ x ~ x ~@2 x ~@20", X: "~@7 x ~ x ~ x ~@2 x ~@17", Y: "~@10 x ~ x ~@2 x ~ x ~@14",
  Z: "~@13 x ~@2 x ~ x ~ x ~@11", AA: "~@8 x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~@2 x ~ x ~",
  AB: "x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~@2 x ~ x",
  AC: "~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~@2 x ~",
  AD: "x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~",
  AE: "~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x",
  AF: "~@2 x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~",
  AG: "x ~@2 x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x",
  AH: "~ x ~@2 x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~",
  AI: "x ~ x ~@2 x ~ x ~ x ~ x ~ x ~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~", AJ: "x!8", AK: "~@10 x!6",
})).gain(0.8)

stack(overdriven_guitar, bass, kick, rim, snare, open_hat, crash, ride)

More by Nirvana