Strudelify

Angry Chair

Alice in Chains

KeyE♭ minorTempo88 bpm
0:00/0:00
// Angry Chair — Alice in Chains
// 87.5 bpm, 4/4, key D# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 42 bars on a 48-step grid, each part at one level. Source detail keeps the original performance.
setcpm(87.5/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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 bass finger
const bass = note("<A B@5 C D@5 E F@3 G@2 H@4 I@2 J@4 K@2 L@2 M@2 N@2 O@2 P@2 Q ~>".pickRestart({
  A: "eb2@10 bb2@4 ~ eb2@9 ~@2 b2@15 eb2@7",
  B: "[~@4 bb2@5 eb2@10 b2@15 eb2@10 ~ bb2@5 eb2@9 ~ b2@14 ~@2 eb2@10 bb2@5 eb2@9 ~ b2@15 ~ eb2@10 bb2@4 ~ eb2@9 ~@2 b2@15 eb2@10 bb2@5 eb2@10 ~ b2@15 eb2@10 ~ bb2@5 eb2@9 ~ b2@14 ~]/5",
  C: "~ eb2@10 bb2@5 eb2@9 ~ b2@15 ~ eb2@6",
  D: "[~@4 bb2@5 eb2@9 ~@2 b2@15 eb2@10 bb2@5 ~ eb2@10 b2@14 ~ eb2@10 ~ bb2@5 eb2@9 ~ b2@15 eb2@10 ~ bb2@5 eb2@9 ~ bb2@5 eb2@7 ~@4 b1@10 gb2@4 ~ b1@10 g2@14 ~@2 b1@9 ~ gb2@5 b1@9 ~@2 g2@14]/5",
  E: "~ b1@9 ~ gb2@5 ~ b1@10 g2@15 b1@6",
  F: "[~@5 gb2@5 b1@9 ~ g2@5 b1@7 ~@4 eb2@10 bb2@4 ~ eb2@10 b2@15 ~ eb2@9 ~ bb2@5 eb2@9 ~@2 b2@15 eb2@10 bb2@5 ~ eb2@9 ~]/3",
  G: "[b2@14 ~ eb2@10 ~ bb2@5 eb2@9 ~ b2@5 eb2@6 ~@5 gb2@15 f2@2 ~@22]/2",
  H: "[~@2 gb2@14 ~ f2@2 ~@14 db2@10 eb2@9 ~ bb2@5 eb2@10 ~ b2@14 ~ eb2@10 bb2@5 ~ eb2@9 ~ b2@15 eb2@10 ~ bb2@5 eb2@10 b2@7 ~@4 bb2@5 eb2@2 ~@23]/4",
  I: "[~@16 eb2@10 bb2@4 ~ eb2@9 ~@2 b2@15 eb2@10 bb2@5 ~ eb2@10 b2@13]/2",
  J: "[~@2 eb2@10 ~ bb2@5 eb2@9 ~ b2@14 ~@2 eb2@10 bb2@5 eb2@9 ~ b2@15 ~ eb2@9 ~ bb2@5 eb2@9 ~@2 b2@15 eb2@10 bb2@5 eb2@10 ~ b2@14 ~ eb2@10 ~ bb2@5 eb2@9]/4",
  K: "[~ b2@15 eb2@10 ~ bb2@5 eb2@9 ~ bb2@4 ~ eb2@7 ~@4 b1@10 gb2@4 ~ b1@10 g2@13]/2",
  L: "[~@3 b1@9 ~ gb2@5 b1@9 ~@2 g2@15 b1@9 ~ gb2@5 ~ b1@10 g2@15 b1@9 ~@2]/2",
  M: "[gb2@5 b1@9 ~ g2@5 b1@7 ~@4 eb2@10 bb2@4 ~ eb2@10 b2@15 ~ eb2@9 ~ bb2@5 eb2@9]/2",
  N: "[~@2 b2@15 eb2@10 bb2@5 ~ eb2@9 ~ b2@14 ~ eb2@10 ~ bb2@5 eb2@9 ~ b2@5 eb2@6 ~]/2",
  O: "[~@4 gb2@15 f2@2 ~@24 gb2@15 f2@2 ~@14 db2@10 eb2@9 ~]/2",
  P: "[bb2@5 eb2@10 ~ b2@14 ~ eb2@10 bb2@5 ~ eb2@9 ~ b2@15 eb2@10 ~ bb2@5 eb2@8]/2",
  Q: "~@2 b2@7 ~@3 bb2@5 ~ eb2@2 ~@28",
})).s("gm_electric_bass_finger").gain(0.25)

// other · string ensemble 1
const string_ensemble_1 = note("<A@8 ~@10 B@4 C@8 ~@7 D@5>".pickRestart({
  A: "eb7/8", B: "[~@43 eb7@124 ~@25]/4", C: "[~ eb7@23]/8", D: "[~@38 eb7@165 ~@37]/5",
})).s("gm_string_ensemble_1").gain(0.1)

// other · pizzicato strings
const pizzicato_strings = note("<~@22 A B C ~ D ~ E F G H I J K L M N O P Q ~>".pickRestart({
  A: "~@42 gb5@2 ~@3 f5", B: "~@2 eb5 ~@21", C: "~@28 gb5@2 ~@3 f5@2 ~@3 eb5@2 ~@8",
  D: "~@15 gb5@2 ~@3 f5@2 ~@3 eb5@2 ~@21", E: "~ gb5@2 ~@3 f5@2 ~@3 eb5@2 ~@35", F: "~@35 d5@2 ~@4 b4@2 ~@3 g4@2",
  G: "~@29 d5@2 ~@3 b4@2 ~@3 g4@2 ~@7", H: "~@22 d5@2 ~@3 b4@2 ~@3 g4@2 ~@14", I: "~@15 d5@2 ~@3 b4@2 ~@3 g4@2 ~@21",
  J: "~@8 gb5@2 ~@4 f5 ~@4 eb5@2 ~@27", K: "~@43 gb5@2 ~@3", L: "f5 ~@4 eb5@2 ~@41", M: "~@4 gb4 ~@14 f4 ~@25 gb4 ~@2",
  N: "~@6 f4 ~@7 db4 ~@9", O: "~@16 gb5@2 ~@3 f5@2 ~@3 eb5@2 ~@20", P: "~@9 gb5@2 ~@3 f5@2 ~@3 eb5@2 ~@27",
  Q: "~@2 gb5@2 ~@3 f5@2 ~@3 eb5@2 ~@4 eb5@2 ~@28",
})).s("gm_pizzicato_strings").gain(0.25).pan(0.3)

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

// 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 X Y Z AA AB AC AD AE AF AG AB AH AI AJ AK AL AM AN AO
>`.pickRestart({
  A: "~@5 x ~@7 x ~@4 x ~@5", B: "~@4 x ~@14 x ~@9 x ~@15 x ~@2", C: "~@6 x ~@4 x ~@7 x ~@4",
  D: "~@5 x ~@10 x ~@14 x ~@16", E: "~@4 x ~@19 x ~@20 x ~@2", F: "~@6 x ~@4 x ~@4", G: "~@11 x ~@14 x ~@21",
  H: "~@4 x ~@20 x ~@19 x ~@2", I: "~@6 x ~@6 x ~@2", J: "~@11 x ~@20 x ~@14 x", K: "~@9 x ~@15 x ~@14 x ~@7",
  L: "~@9 x ~@7 x ~@6", M: "~@11 x ~@15 x ~@20", N: "~@5 x ~@14 x ~@9 x ~@15 x ~", O: "~@13 x ~@25 x ~@8",
  P: "~@7 x ~@24 x ~@15", Q: "x ~@25 x ~@14 x ~@6", R: "~@3 x ~@15 x ~@28", S: "~ x ~@2", T: "~@5 x ~@15 x ~@24 x ~",
  U: "~@7 x ~@12 x ~@3", V: "~@7 x ~@15 x ~@24", W: "x ~@2 x ~@9 x ~@7 x ~@2", X: "~@19 x ~@15 x ~@12",
  Y: "~@13 x ~@19 x ~@14", Z: "~@6 x ~@14 x ~@25 x", AA: "~@15 x ~@24 x ~@7", AB: "~@4 x ~@12 x ~@6",
  AC: "~ x ~@25 x ~@14 x ~@5", AD: "~@5 x ~@14 x ~@14 x ~@12", AE: "~@13 x ~@15 x ~@18", AF: "~@3 x ~@7 x ~@12",
  AG: "x ~@14 x ~@9 x ~@15 x ~@6", AH: "~@2 x ~@24 x ~@15 x ~@4", AI: "~@21 x ~@14 x ~@9 x ~", AJ: "~@7 x ~@16",
  AK: "~@7 x ~@14 x ~@5 x ~@19", AL: "x ~@15 x ~@24 x ~@6", AM: "~@9 x ~@25 x ~@12",
  AN: "~@2 x ~@15 x ~@9 x ~@4 x ~@4 x ~@4 x ~@4", AO: "x!2 ~@6",
})).gain(0.35)

// drums · hihat
const hihat = s("hh").struct("<A ~@16 B C ~@2 D E ~@13 F G ~@4>".pickRestart({
  A: "x", B: "~ x", C: "~@17 x ~@30", D: "~@22 x ~@10 x ~@9 x ~@4", E: "~@5 x ~@42",
  F: "~@4 x ~@9 x ~@9 x ~@9 x ~@10 x ~@2", G: "~@7 x ~@9 x ~@10 x ~@19",
})).gain(0.35)

// drums · open hat
const open_hat = s("oh").struct("<~@3 A ~@13 B C D E F ~@14 G H ~@2 I J>".pickRestart({
  A: "~@7 x ~@8", B: "~@3 x ~@2 x ~@9", C: "~ x ~@4 x ~@9 x ~@4 x ~@2", D: "~@5 x ~@9 x ~@9 x ~@10 x ~@9 x ~",
  E: "~@8 x ~@10 x ~@9 x ~@9 x ~@8", F: "~ x ~@4 x ~@2 x ~@14", G: "~@29 x ~@18", H: "~@11 x ~@12", I: "~@7 x ~@4",
  J: "~ x ~@6",
})).gain(0.3)

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

// drums · congas
const congas = s("conga:13").struct("<~@22 A B C D E F G H ~ I J F K L M N O P Q ~>".pickRestart({
  A: "~@13 x ~@7 x ~@2", B: "~@19 x ~@15 x ~@12", C: "~@13 x ~@14 x ~@19", D: "~@6 x ~@14 x ~@25 x",
  E: "~@15 x ~@24 x ~@7", F: "~@4 x ~@12 x ~@6", G: "~ x ~@25 x ~@14 x ~@5", H: "~@5 x ~@6", I: "~ x ~@6",
  J: "~@41 x ~@6", K: "~@2 x ~@24 x ~@15 x ~@4", L: "~@7 x ~@4 x ~@3", M: "~@14 x ~@14 x ~@4 x ~@13",
  N: "~@7 x ~@14 x ~@25", O: "x ~@15 x ~@24 x ~@6", P: "~@9 x ~@25 x ~@12", Q: "~ x ~@12 x ~@9",
})).gain(0.95)

// drums · congas
const congas_2 = s("conga:18").struct("<~@22 A B C D E F G ~ F ~ H I J K ~@2 L I J ~>".pickRestart({
  A: "~@47 x", B: "~@5 x", C: "~@11 x ~@4", D: "~@9 x ~@6", E: "~@5 x ~@6", F: "~@13 x ~@34", G: "~@6 x ~@40 x", H: "x",
  I: "~@7 x ~@16", J: "~@7 x ~@40", K: "x ~@40 x ~@6", L: "~@7 x ~@8",
})).gain(0.95)

// drums · congas
const congas_3 = s("conga:33").struct("<~@23 A B C D E F G H I J K L M ~ N O K P Q>".pickRestart({
  A: "~@4 x ~@40 x ~@2", B: "~@19 x ~@4", C: "~@2 x", D: "~@25 x ~@22", E: "~@3 x ~@4", F: "~@11 x ~@36",
  G: "~@5 x ~@35 x ~@4 x ~", H: "~@34 x ~@4 x ~@8", I: "~@27 x ~@4 x ~@15", J: "~@15 x ~@4 x ~@4 x ~@22",
  K: "~@19 x ~@28", L: "~ x ~@2", M: "~@5 x ~@40 x ~", N: "~@28 x ~@4 x ~@14", O: "~@13 x ~@10",
  P: "~@12 x ~@25 x ~@4 x ~@4", Q: "x!2 ~@6",
})).gain(0.95)

stack(bass, string_ensemble_1, pizzicato_strings, kick, snare, hihat, open_hat, ride, congas, congas_2, congas_3)

More by Alice in Chains