Strudelify
KeyD minorTempo100 bpm
0:00/0:00
// Fopp — Soundgarden
// 100 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 47 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · "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.

// bass · electric guitar clean · "Guitar"
const bass = note(`<
  ~@4 A B C D E F G@2 H I J K@3 L M@2 N O P Q@3 R S@2 T U@2 V W@2 X Y Z@2 AA AB@2 AC@2 AD@2
>`.pickRestart({
  A: "~@15 g2@9 f2@8", B: "~ d2@2 d2@2 c2@2 d2@3 ~@4 c2@3 ~@2 d2@3 ~@10",
  C: "c2@3 ~ d2 ~ d2@2 ~ c2@2 d2@3 ~@4 c2@3 ~@2 g2@9", D: "f2@8 d2 ~ d2 ~ c2@2 d2@3 ~@4 c2@3 ~ d2@3 ~@4",
  E: "~@6 c2@3 ~ d2 ~ d2@2 c2@2 d2@2 ~@5 c2@3 ~ g2@5", F: "~@3 f2@8 d2 ~ d2@2 ~ c2@2 d2@2 ~@3 c2@3 ~@2 d2@3 ~",
  G: "[~@9 c2@3 ~ d2 ~ d2 ~ c2@2 d2@3 ~@4 c2@3 ~ g2@7 f2@6 ~@2 d2 ~ d2 ~ c2@2 d2@3 ~@4 c2@3 ~ d2@2]/2",
  H: "~@11 c2@3 ~ d2 ~@2 d2 c2@2 d2@3 ~@4 c2@3 ~", I: "g2@7 ~ f2@6 ~@3 d2@3 c2@4 ~ d2@4 c2@3",
  J: "~ d2@4 c2@4 d2@3 f2@7 d2@5 c2@4 d2@4",
  K: "[c2@4 d2@4 c2@4 d2@3 f2@6 d2@4 c2@3 ~ d2@4 c2@5 d2@4 c2@4 d2@2 f2@4 ~@3 d2@4 c2@4 a1@5 g1@4 f1@17 d2@2 d2@2 c2@3]/3",
  L: "d2@3 ~@29", M: "[~@13 d2@2 d2@2 c2@2 ~ d2@3 ~@3 c2@3 ~@2 d2@3 ~@10 c2@3 ~ d2 ~@2 d2@2 c2@2 d2@3 ~@4 c2@2]/2",
  N: "~@3 g2@9 f2@8 ~ d2 ~ d2 c2@2 d2@3 ~@3", O: "~ c2@3 ~ d2@3 ~@10 c2@3 ~ d2 ~ d2@2 c2@2 d2@2 ~@2",
  P: "~@3 c2@3 ~ g2@7 ~ f2@8 d2 ~ d2@2 ~ c2@2 d2@2",
  Q: "[~@4 c2@3 ~ d2@3 ~@10 c2@3 ~ d2 ~ d2 ~ c2@2 d2@3 ~@4 c2@3 ~ g2@7 f2@6 ~@2 d2 ~ d2 ~ c2@2 d2@3 ~@4 c2@3 ~ d2@2 ~@11 c2@3 ~ d2 ~@2 d2 ~]/3",
  R: "~ d2@3 ~@4 c2@3 ~@2 g2@7 f2@6 ~@3 d2@3, c2 ~@15",
  S: "[c2@4 ~ d2@4 c2@4 d2@5 c2@4 ~@2 f2@7 d2@5 c2@4 d2@4 c2@4 d2@4 c2@4 d2@3 f2@5, ~@11 d2@2 ~@19]/2",
  T: "~ d2@4 c2@3 ~ d2@4 c2@5 d2@4 c2@4 d2@3 f2@3",
  U: "[~@3 d2@4 c2@4 a1@5 g1@4 f1@17 d2@2 ~@2 c2@3 d2@3 ~@17, ~@20 d2 ~@11]/2", V: "~@23 d2@2 d2@2 c2@2 ~ d2@2",
  W: "[~@4 c2@3 ~@2 d2@3 ~@10 c2@3 ~ d2 ~@2 d2@2 c2@2 d2@3 ~@4 c2@3 ~@2 g2@9 f2@8 ~ d2]/2",
  X: "~ d2 c2@2 d2@3 ~@4 c2@3 ~ d2@3 ~@10 c2@3 ~", Y: "d2 ~ d2@2 c2@2 d2@2 ~@5 c2@3 ~ g2@7 ~ f2@7",
  Z: "[~ d2 ~ d2@2 ~ c2@2 d2@2 ~@4 c2@3 ~ d2@3 ~@10 c2@3 ~ d2 ~ d2 ~ c2@2 d2@3 ~@4 c2@3 ~ g2@7 f2@5]/2",
  AA: "~@3 d2 ~ d2 ~ c2@2 d2@3 ~@4 c2@3 ~ d2@2 ~@10",
  AB: "[~ c2@3 ~ d2 ~@2 d2 ~@2 d2@3 ~@4 c2@3 ~@2 g2@7 f2@6 ~@3 d2@3 c2@4 ~ d2@4 c2@4 d2@5 c2@4, ~@5 c2 ~@26]/2",
  AC: "[~@2 f2@7 d2@5 c2@4 d2@4 c2@4 d2@4 c2@4 d2@3 f2@6 d2@4 c2@3 ~ d2@4 c2@5 d2@4, d2 ~@15]/2",
  AD: "[c2@4 d2@3 f2@4 ~@2 d2@4 c2@4 a1@5 g1@4 f1@17 d2@2 ~@2 c2@3 d2@3 ~@7, ~@25 d2 ~@6]/2",
})).s("gm_electric_guitar_clean").gain(0.4).pan(0.7)

// bass · electric bass pick · "Bass"
const bass_2 = note("<~@4 A B C@2 D@2 E@2 F G H@3 I J K@2 L M N O P Q R@3 S@2 T U V W@2 X Y Z AA AB@5 AC>".pickRestart({
  A: "~@15 g2@9 f2@8", B: "~ d2@2 d2@2 c2@3 d2@3 ~@3 c2@3 ~ d2@4 ~@10",
  C: "[~ c2@3 d2@2 ~ d2@2 c2@2 d2@3 ~@3 c2@4 ~ g2@9 f2@8 d2 ~@2 d2@2 c2@2 d2@3 ~@4 c2@3 ~ d2@3 ~@4]/2",
  D: "[~@6 c2@3 ~ d2 ~ d2 ~ c2@2 d2@2 ~@4 c2@2 ~@3 g2@8 f2@8 d2 ~ d2@2 c2@2 d2@3 ~@4 c2@3 ~ d2@3 ~]/2",
  E: "[~@8 c2@3 ~@2 d2 ~ d2 ~ c2@2 d2@2 ~@4 c2@3 ~ g2@8 f2@7 ~ d2 ~ d2 ~ c2@2 d2@2 ~@4 c2@3 ~@2 d2@2]/2",
  F: "~@10 c2@4 ~ d2 ~ d2 ~ c2@2 d2@2 ~@4 c2@3 ~@2", G: "g2@7 ~ f2@7 ~ d2@4 ~ c2@3 d2@4 c2@4",
  H: "[~ d2@4 c2@4 d2@3 f2@5 d2@6 c2@4 d2@4 c2@4 d2@4 c2@5 d2@3 f2@6 d2@4 c2@4 d2@5 c2@4 d2@4 c2@4 d2@2 f2@6 d2@5 c2@5]/3",
  I: "~@25 d2@2 d2@2 c2@2 ~", J: "d2 ~@15",
  K: "[~@14 d2 d2@2 ~ c2@2 d2@3 ~@3 c2@3 ~ d2@5 ~@9 c2@3 ~@2 d2 ~ d2@2 c2@2 d2@3 ~@4 c2@2]/2",
  L: "~@3 g2@8 f2@9 d2 ~ d2@2 c2@2 d2@3 ~@3", M: "c2@3 ~@2 d2@2 ~@12 c2@3 d2 ~ d2 ~ c2@3 d2@2 ~",
  N: "~@3 c2@4 ~ g2@8 f2@7 ~ d2@2 d2@2 ~@2 d2@2, ~@29 c2@2 ~", O: "~@4 c2@3 ~ d2@2 ~@11 d2@2 ~@3 d2 ~ d2 ~ c2@2",
  P: "d2@2 ~@4 c2@3 ~ g2@8 f2@5 ~@3 d2 ~ d2 ~ c2@2", Q: "d2@2 ~@4 c2@3 ~ d2@2 ~@12 c2@3 ~ d2 ~ d2 ~",
  R: "[c2@2 d2@2 ~@4 c2@3 ~ g2@8 f2@9 d2@4 c2@4 d2@3 ~ c2@4 d2@4 c2@4 d2@3 f2@6 d2@5 c2@4 d2@5 c2@4 d2@4 c2@4 d2@3 f2@5]/3",
  S: "[~ d2@5 c2@4 d2@4 c2@4 d2@4 c2@4 d2@3 f2@6 d2@5 c2@5 ~@19]/2", T: "~@6 d2 ~ d2@2 c2@2 d2@3 ~@17",
  U: "~@22 d2@2 ~ d2@2 c2@3 d2@2", V: "~@4 c2@3 ~ d2@4 ~@10 c2@3 ~ d2@2 d2@2 c2@2",
  W: "[~ d2@3 ~@3 c2@4 g2@9 f2@9 d2 ~ d2@2 ~ c2@2 d2@3 ~@4 c2@3 ~ d2@3 ~@10 c2@3 d2]/2",
  X: "~@2 d2 c2@2 ~ d2@2 ~@4 c2@2 ~@2 g2@8 f2@8", Y: "~ d2 ~ d2@2 c2@2 d2@3 ~@3 c2@3 ~@2 d2@3 ~@9 c2@2",
  Z: "~@2 d2 ~@2 d2 c2@2 d2@2 ~@4 c2@3 ~@2 g2@8 f2@5", AA: "~@3 d2 ~ d2 ~ c2@2 d2@2 ~@4 c2@3 ~ d2@3 ~@10",
  AB: "[c2@4 d2 ~@2 d2 c2@2 ~ d2@2 ~@4 c2@3 ~@2 g2@7 ~ f2@7 ~ d2@4 c2@4 d2@4 c2@5 d2@3 c2@4 ~ d2@2 f2@6 d2@6 c2@4 d2@4 c2@4 d2@4 c2@5 d2@2 f2@6 d2@5 c2@4 d2@4 c2@4 d2@4 c2@5 d2@2 f2@6 d2@4 c2@7 ~@9]/5",
  AC: "~@14 d2@2 ~ d2@2 c2@2 d2@2 ~@9",
})).s("gm_electric_bass_pick").gain(0.4)

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

// drums · low tom
const low_tom = s("lt").struct("<~@45 [~@26 x ~@4 x] ~>").gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  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 AK AL AM AN AO AP AQ AR AS AT AU
>`.pickRestart({
  A: "~@13 x ~@18", B: "~@7 x ~@3 x ~@14 x ~@5", C: "~@9 x ~@3 x ~@16 x ~", D: "~@6 x ~@8 x",
  E: "~@11 x ~@9 x ~@7 x ~@2", F: "~@2 x ~@12 x ~@3 x ~@12", G: "~@5 x ~ x ~@10 x ~@4 x ~@8", H: "~@8 x ~ x ~@14 x ~@6",
  I: "~@10 x ~ x ~@10 x ~@3 x ~@4", J: "~@11 x ~@16 x ~@3", K: "~@13 x ~ x ~@9 x ~@3 x ~@2", L: "~@7 x!2 ~@4 x ~ x",
  M: "~@11 x ~@3 x ~@2 x ~@9 x ~@3", N: "x ~@16 x ~@12 x ~", O: "~@6 x ~@6 x ~@5 x ~@12", P: "x ~@8 x ~@15 x ~@6",
  Q: "~@2 x ~@3 x ~@16 x ~@3 x ~@4", R: "x ~@7 x ~@16 x ~ x ~@4", S: "~@15 x ~@5 x ~@10", T: "x ~@7 x ~@18 x ~@3 x",
  U: "~@12 x ~@4 x ~@14", V: "~@2 x ~@2 x ~@10 x ~@4 x ~@10", W: "~@5 x ~@2 x ~@13 x ~@9", X: "~@4 x!2 ~@4 x ~ x ~@3",
  Y: "~@9 x ~@16 x ~@5", Z: "~@11 x!2 ~@10 x ~@3 x ~@4", AA: "~@11 x ~@2 x ~@9 x ~@3 x ~@3",
  AB: "~@9 x ~@3 x ~ x ~@10 x ~@3 x ~", AC: "~@15 x ~@12 x ~@3", AD: "~@4 x ~@6 x ~@5 x ~@12 x ~",
  AE: "~@6 x ~@16 x ~@8", AF: "x ~@3 x ~@16 x ~@3 x ~@3 x ~@2", AG: "~@6 x ~@19 x ~@4 x", AH: "~@10 x ~@8 x ~@12",
  AI: "~@5 x ~@4 x ~@12 x ~@3 x ~@4", AJ: "~@13 x ~ x ~@10 x ~@4 x", AK: "~@8 x!2 ~@6", AL: "~ x ~@16 x ~ x ~@10 x",
  AM: "~@3 x ~@15 x ~@12", AN: "~@4 x ~@16 x ~ x ~@8", AO: "~ x ~@3 x ~@16 x ~ x ~@7",
  AP: "~@2 x ~@3 x ~@12 x ~@3 x ~@2 x ~@5", AQ: "~@4 x ~@3 x ~@16 x ~@6", AR: "~@6 x ~@7 x ~@6 x ~@5 x ~@4",
  AS: "~@8 x ~@8 x ~@14", AT: "~ x ~@8 x ~@3 x ~@7 x ~@8 x", AU: "~@3 x ~@4 x ~@7 x ~@15",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<A ~@32 B C D E F G H I J K L M N O>".pickRestart({
  A: "~@23 x ~@8", B: "~@23 x ~@2 x ~ x ~ x ~", C: "~@4 x ~@4 x ~@12 x ~@3 x ~@2 x ~ x", D: "~ x ~@6 x ~@22 x",
  E: "~ x ~ x ~ x ~@5 x ~@4 x ~@11 x ~@3", F: "x ~@2 x!2 ~@2 x ~@5 x ~@18", G: "~@2 x ~ x ~ x ~ x ~@5 x ~@3 x ~@12 x",
  H: "~@3 x ~ x ~@2 x ~ x ~@5 x ~@15", I: "~@4 x ~ x!2 ~@2 x ~@5 x ~@4 x ~@10", J: "~ x ~@4 x ~ x ~ x ~ x ~@6 x ~@12",
  K: "~@7 x ~@3 x ~@3 x ~@3 x ~@4 x ~@3 x ~@3", L: "x ~@8 x ~@4 x ~@3 x ~@3 x ~@4 x ~@3 x",
  M: "~@3 x ~@7 x ~@4 x ~@3 x ~@3 x ~@3 x ~@3", N: "x ~@4 x ~@7 x ~@3 x ~@14", O: "~@16 x ~ x!2 ~@2 x ~@9",
})).gain(0.4)

// drums · china
const china = s("cr").struct("<A ~@34 B ~ C ~ D ~ A ~@5>".pickRestart({
  A: "~@23 x ~@8", B: "~@13 x ~@18", C: "~@9 x ~@6", D: "~@5 x ~@2",
})).gain(0.4)

// drums · ride bell
const ride_bell = s("rd").struct("<~@35 A ~ B ~ C ~ D ~ E F G ~>".pickRestart({
  A: "~@11 x ~@4", B: "~@25 x ~@6", C: "~@7 x", D: "~@31 x", E: "~@3 x ~@28", F: "~@5 x ~@26", G: "~@7 x ~@24",
})).gain(0.4)

// drums · shaker
const shaker = s("sh").struct(`<
  ~ A B C D E F G H I J K L M N O P Q ~@2 R S T U V W X Y Z AA AB AC AD ~ AE AF AG AH AI AJ AK AL AM AN AO AP AQ
>`.pickRestart({
  A: "~ x ~@5 x ~@3 x ~@3 x ~@4 x ~ x ~@3 x ~@4 x", B: "~@3 x ~@5 x ~@3 x ~@3 x ~@2 x ~ x ~@2 x ~@3 x ~@2",
  C: "~ x ~ x ~@2 x ~ x ~ x ~ x!2 ~ x", D: "x ~@3 x ~ x ~@2 x ~@6 x ~@15",
  E: "~@3 x ~@2 x ~@4 x ~@3 x ~@4 x ~@4 x ~@2 x ~@3", F: "~ x ~@3 x ~ x ~@2 x ~@3 x ~@3 x ~@4 x ~@5 x ~ x",
  G: "~@3 x ~@4 x ~ x ~@2 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2", H: "~ x ~@4 x ~@3 x ~ x ~@3 x ~@2 x ~@3 x ~@3 x ~@3 x",
  I: "~@3 x ~@3 x ~@3 x ~ x ~ x ~ x ~@2 x ~@3 x ~@3 x ~@3", J: "~@5 x ~@3 x ~@3 x ~ x ~@3 x ~ x ~@3 x ~@3 x ~@2",
  K: "~ x ~@3 x ~@3 x ~@4 x ~ x ~@2 x ~@2 x ~@3 x ~@4 x", L: "~@3 x ~@3 x ~@3 x ~@3 x ~@2 x ~ x ~ x ~ x ~@3 x ~@3",
  M: "x ~@7 x ~@4 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2", N: "~@2 x ~@4 x ~@3 x ~ x ~@5 x ~@4 x ~@3 x ~@3",
  O: "~ x ~@2 x ~@4 x ~@5 x ~@5 x ~@7 x ~@2", P: "~@2 x ~@3 x ~@6 x ~@2 x ~@6 x ~@3 x ~@3 x",
  Q: "~@4 x ~@3 x ~@16 x ~ x ~ x ~ x", R: "x ~@3 x ~@4 x ~@3 x ~@3 x ~@5 x ~@2 x ~@3 x ~",
  S: "~@3 x ~ x ~@2 x ~@2 x ~@4 x ~@3 x ~@6 x ~ x ~@2", T: "~ x ~@4 x!2 ~@3 x ~@2 x ~@3 x ~@4 x ~@3 x ~@3 x",
  U: "~@3 x ~@4 x ~ x ~@3 x ~ x ~@3 x ~@4 x ~@3 x ~@2", V: "~ x ~@3 x ~@3 x ~ x ~ x ~ x ~@2 x ~@3 x ~@3 x ~@5",
  W: "~@2 x ~@3 x ~@4 x!2 ~@3 x ~@2 x ~@3 x ~@3 x ~@3 x", X: "~@3 x ~@3 x ~@3 x ~@2 x ~ x ~@3 x ~@3 x ~@3 x ~@3",
  Y: "x ~@3 x ~@4 x ~@3 x ~ x ~ x ~@2 x ~ x ~@2 x ~@4 x ~", Z: "~@6 x ~@4 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x",
  AA: "~@4 x ~@3 x ~ x ~@6 x ~@3 x ~@4 x ~@4 x", AB: "~@2 x ~@3 x ~@5 x ~@6 x ~@7 x ~@3 x",
  AC: "~@3 x ~@7 x ~@2 x ~@5 x ~@4 x ~@3 x ~@2", AD: "~ x ~@4 x ~@25", AE: "~@11 x ~@2 x ~@4 x ~@3 x ~@4 x ~@3",
  AF: "~ x ~@2 x ~@4 x ~@3 x ~ x ~@2 x ~@3 x ~@3 x ~@4 x", AG: "~@5 x ~ x ~@3 x ~@4 x ~ x ~@2 x ~@3 x ~@3 x ~@2",
  AH: "~ x ~@3 x ~@3 x ~@4 x ~@3 x ~ x ~@3 x ~@2 x ~@3 x", AI: "~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~ x ~ x ~ x ~@2 x ~@3",
  AJ: "x ~@3 x ~@8 x ~@3 x ~@3 x ~ x ~@3 x ~ x ~@2", AK: "~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@4 x ~ x ~@2 x ~@2 x ~",
  AL: "~@2 x ~@4 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2 x ~ x ~ x ~", AM: "x ~@3 x ~@3 x ~@7 x ~@4 x ~@3 x ~@3 x ~@2",
  AN: "~ x ~@3 x ~@4 x ~@4 x ~@3 x ~ x ~@5 x ~@4", AO: "x ~@3 x ~@4 x ~@2 x ~@4 x ~@5 x ~@5 x ~@2",
  AP: "~@5 x ~@4 x ~@3 x ~@6 x ~@2 x ~@6 x", AQ: "~@3 x ~@3 x ~@4 x ~@3 x ~@15",
})).gain(0.4)

stack(bass, bass_2, snare, low_tom, mid_tom, high_tom, china, ride_bell, shaker)

More by Soundgarden