Strudelify

Medication

Garbage

KeyE♭ majorTempo90 bpm
0:00/0:00
// Medication — Garbage
// 90 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: ch 2 "Guitar 2" named as a guitar, played on electric guitar clean (its acoustic bass patch is not one); ch 5 "Distortion Strings 2" named as a guitar, played on distortion guitar (its pad bowed patch is not one); ch 6 "Distortion Strings 3" named as a guitar, played on distortion guitar (its pad warm patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 93 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): Distortion Strings 3.
setcpm(90/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 1"
const electric_guitar_clean = note(`<
  A B A B A B A B A B A B C D E F ~@8 A B A B A B A B A B A B C D E F ~@8 G@3 H I J G H I J@3 K L M L K L M L K L M L K
  L M@2 N O P Q P Q P Q P Q P Q P R@3 ~
>`.pickRestart({
  A: "ab3 c4 eb4 ab3 bb4@2 f4 eb4", B: "c3 g3 eb4 c4 f4@2 eb4 c4", C: "db3 ab3 f4 db3 ab3 f4 ab3 f4",
  D: "bb2 f4 bb4 bb2 f4 bb4 bb2 bb4", E: "db4 ab3 f4 ab3 db4 f4 ab3 f4", F: "gb3 bb3 db4 gb3 bb3 db4 gb3 bb3",
  G: "[ab3,c4,eb4]!8", H: "[g3,bb3,eb4]!8", I: "[ab3,c4,f4]!8", J: "[ab3,db4,f4]!8", K: "[bb3,d4,f4]!8",
  L: "[bb3,c4,e4]!8", M: "[bb3,eb4,g4]!8", N: "[bb3,eb4]!3 [bb3,f4]@2 [bb3,eb4]!3",
  O: "[bb3,gb4]!3 [bb3,f4]@2 [bb3,eb4]!3", P: "~ eb3 eb4 c4 bb4@2 f4 eb4", Q: "~ eb3 eb4 c4 f4@2 eb4 c4",
  R: "[~@2 eb3@2 eb4@2 c4@2 f4@4 ~ eb4@2 ~ eb4 [ab4,bb4]@19 ~@12, ~@15 c4@2 ~@31]/3", // Absus2
})).s("gm_electric_guitar_clean").gain(0.17)

// other · electric guitar clean · "Guitar 2"
const electric_guitar_clean_2 = note(`<
  A B A B A B A B A B A B C D E F G H I H G H J K A B A B A B A B A B A B C D E F G H I H G H J K ~@12 G H I H G H I H G
  H I H G H J@2 K ~@16
>`.pickRestart({
  A: "[ab2,ab3] c4 eb4 [ab2,ab3]@2 [ab2,ab3]@2 [ab2,ab3], ~ ab2@2 ~@5", // Ab
  B: "[c2,c3] [c2,g3]@2 [c2,c3]@2 [c2,c3]@2 [c2,c3]", C: "db3@3 db3@2 db3@2 db3", D: "bb2@3 bb2@2 bb2@2 bb2",
  E: "db3@3 db3@3 ab2@2", F: "gb2@3 gb2@3 gb2@2", G: "bb2!3 [bb2,bb3] bb2!3 [bb2,bb3], bb3@3 ~ bb3@3 ~",
  H: "c3!3 [c3,c4] c3!3 [c3,c4], c4@3 ~ c4@3 ~", I: "eb3!3 [eb3,eb4] eb3!2 f3 [eb3,eb4], eb4@3 ~ eb4@3 ~",
  J: "eb3!3 [eb3,eb4] eb3!2 f3 [bb2,bb3], eb4@3 ~ eb4@3 ~", K: "[eb3,eb4]",
})).s("gm_electric_guitar_clean").gain(0.36)

// other · synth strings 1 · "Distortion Strings 1"
const synth_strings_1 = note(`<
  A B A B A B A B A B A B C D E F G H I H G H I J A B A B A B A B A B A B C D E F G H I H G H I J K ~ L@2 M N L@2 M N@3
  G H I H G H I H G H I H G H I@2 O@3 L@10 P Q@3
>`.pickRestart({
  A: "[ab3,c4,eb4]", B: "[g3,c4,d4]", C: "[ab3,db4,f4]", D: "[bb3,f4,bb4]", E: "[ab3,db4,f4,ab4]",
  F: "[gb3,bb3,db4,gb4]", G: "bb4 bb4@5 e5 e5@5 f5 f5@3, bb3@3 e4@3 f4@2", H: "g4 g4@5 e5 e5@5 f5 f5@3, g3@3 e4@3 f4@2",
  I: "g5 g5@5 a4 a4@5 bb4 bb4@3, g4@3 a3@3 bb3@2", J: "bb4 bb4@15, bb3", K: "ab4", L: "eb4@3 bb4@3 ab4@2",
  M: "f4@3 c5@3 ab4@2", N: "db4@3 ab4@3 f4@2",
  O: "[bb4 bb4@15 ~@16 eb4@6 bb4@6 ab4@4, bb3@3 bb3@3 ~@2, ~@4 bb4 bb4@4 ~@3]/3", P: "eb4@6 bb4@7 ab4@3",
  Q: "[~ [eb4,ab4]@43 ~@4]/3", // Ab5
})).s("gm_synth_strings_1").gain(0.1)

// other · distortion guitar · "Distortion Strings 2"
const distortion_guitar = note(`<
  ~@16 A B C B A B C D ~@16 A B C B A B C D ~@2 E@2 F G E@2 F H@2 I A B C B A B C B A B C B A B C J K@3 E@10 L@4
>`.pickRestart({
  A: "bb4 bb4@5 e5 e5@5 f5 f5@3, bb3@3 e4@3 f4@2", B: "g4 g4@5 e5 e5@5 f5 f5@3, g3@3 e4@3 f4@2",
  C: "g5 g5@5 a4 a4@5 bb4 bb4@3, g4@3 a3@3 bb3@2", D: "bb4 bb4@15, bb3", E: "eb4@3 bb4@3 ab4@2", F: "f4@3 c5@3 ab4@2",
  G: "db4@3 ab4@3 f4@2", H: "db4@3 ~@5", I: "db4", J: "g4@6 a3@6 bb4 bb4@3, ~@3 bb3",
  K: "[bb4 bb4@17 ~@14 eb4@6 bb4@6 ab4@4, bb3@3 ~, ~@3 bb4@3 ~@2]/3", L: "[eb4@6 bb4@7 ab4@4 eb4@43 ~@4]/4",
})).s("gm_distortion_guitar").gain(0.62)

// other · distortion guitar · "Distortion Strings 3"
const distortion_guitar_2 = note("<~@77 A@2 ~@11 B@3>".pickRestart({
  A: "[~ bb4@19 ~@12, bb5@5 ~@3]/2", B: "[~ c4@43 ~@4]/3",
})).s("gm_distortion_guitar").gain(0.62)

// bass · lead 8 bass lead · "Bass"
const bass = note(`<
  ~@16 A B C B A B D E ~@16 A B C B A B D@2 F@2 G H I J G H I J@3 A B C B A B C B A B C B A B D K@3 G B G L G B G L G L
  G M@3 ~
>`.pickRestart({
  A: "bb1!3 [bb1,bb2] bb1!3 [bb1,bb2], bb2@3 ~ bb2@3 ~", B: "c2!3 [c2,c3] c2!3 [c2,c3], c3@3 ~ c3@3 ~",
  C: "eb2!3 [eb2,eb3] eb2!2 f2 [eb2,eb3], eb3@3 ~ eb3@3 ~", D: "eb2!3 [eb2,eb3] eb2!2 f2 [bb1,bb2], eb3@3 ~ eb3@3 ~",
  E: "[eb2,eb3]", F: "ab1!3 [ab1,ab2] ab1!2 bb1 [eb1,eb2], ab2@3 ~ ab2@3 ~",
  G: "ab1!3 [ab1,ab2] ab1!3 [c2,ab2], ab2@3 ~ ab2@3 ~", H: "eb1!3 [eb1,eb2] eb1!3 [eb1,eb2], eb2@3 ~ eb2@3 ~",
  I: "f1!3 [f1,f2] f1!3 [c1,f2], f2@3 ~ f2@3 ~", J: "db1!3 [db1,db2] db1!3 [db1,db2], db2@3 ~ db2@3 ~",
  K: "[eb2!3 [eb2,eb3] eb2!2 f2 ~ [eb2,eb3]@16, eb3@3 ~ eb3@3 [bb1,bb2]@16 ~]/3", // Eb Bb
  L: "c1!3 [c1,c2] c1!3 [c1,c2], c2@3 ~ c2@3 ~", // C
  M: "[c1@2 c1@2 c1@2 [c1,c2]@2 c1@2 c1@2 ~ c1@2 [c1,c2]@2 ab2@29 ~@2, c2@6 ~@2 c2@7 ~@33]/3", // C
})).s("gm_lead_8_bass_lead").gain(0.36)

// drums · kick
const kick = s("bd").struct("<~@12 A B@2 C D@7 ~ E@12 F G@2 H I@4 D@4 J@10 K@2 D@16 ~@2 E@11 L M ~@2>".pickRestart({
  A: "x ~@2 x ~@2 x ~ x ~ x ~ x ~@3", B: "x!2 ~ x ~@2 x ~ x ~ x ~ x ~@3", C: "x!2 ~ x ~@2 x ~ x ~ x ~ x ~ x ~",
  D: "x ~@2 x!3 ~@2", E: "~ x ~ x", F: "x ~@2 x!2 ~ x ~ x ~ x ~ x ~@3", G: "x!2 ~ x!2 ~ x ~ x ~ x ~ x ~@3",
  H: "x!2 ~ x!2 ~ x ~ x ~ x ~ x ~ x ~", I: "x ~ x!5 ~", J: "x!2 ~ x", K: "x", L: "~@4 x ~@8 x ~@2", M: "~ x ~@14",
})).gain(0.41)

// drums · snare
const snare = s("sd").struct("<~@12 A@3 B C@7 ~ C@12 A@3 D C@36 ~@2 C@11 E ~@3>".pickRestart({
  A: "x!2 ~ x!2 ~@7 x ~ x ~", B: "x!2 ~ x!2 ~@11", C: "~ x ~ x", D: "x!2 ~ x!2 ~@7 x ~@3", E: "~@4 x ~@8 x ~@2",
})).gain(0.41)

// drums · clap
const clap = s("cp").struct("<~@12 A@3 B C@7 ~@13 A@3 B C@8 ~@12 C@16 ~@17>".pickRestart({
  A: "~ x ~@2 x ~@4 x ~@4 x ~", B: "~ x ~@2 x ~@4 x!2 ~ x ~ x ~", C: "~@9 x ~@2 x ~ x ~",
})).gain(0.41)

// drums · low tom
const low_tom = s("lt").struct("<~@15 A ~@8 B@15 C B@4 ~@4 B@12 ~@18 B@12 D ~@2>".pickRestart({
  A: "~@5 x!3", B: "x ~@2 x!2 ~@3", C: "x ~@2 x!5", D: "~ x ~@14",
})).gain(0.41)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@24 [x!8]!20 ~@4 [x!8]!12 ~@18 [x!8]!11 [x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x] ~@3>")
  .gain(0.41)

// drums · open hat
const open_hat = s("oh").struct("<~@16 A@7 B ~@16 A@8 ~@12 A@16 B ~@16>".pickRestart({
  A: "x!8", B: "x",
})).gain(0.41)

// drums · high tom
const high_tom = s("ht").struct("<~@12 A@4 B@7 ~@13 A@4 B@8 C@12 B@16 ~@17>".pickRestart({
  A: "~@3 x ~@2 x ~ x ~ x ~ x ~ x ~", B: "x!2 ~ x ~@2 x ~ x ~ x ~ x ~ x ~", C: "x",
})).gain(0.41)

// drums · ride
const ride = s("rd").struct("<~@12 A@3 B C@7 D E@16 C@8 E@12 C@16 D ~ E@11 F G ~@2>".pickRestart({
  A: "x ~@2 x ~@4", B: "x ~@2 x ~ x!3", C: "x!16", D: "x", E: "x!8", F: "x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x",
  G: "~ x ~@14",
})).gain(0.41)

// drums · splash
const splash = s("cr").struct(`<
  ~@15 A B ~@3 B ~@2 B@2 ~@14 A B ~@3 B ~@2 B@14 ~@3 B ~@3 B ~@3 B ~@3 B ~@13 C ~@2
>`.pickRestart({
  A: "~@5 x!3", B: "x", C: "~ x ~@14",
})).gain(0.41)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@16 A ~@23 A ~@19 A ~@3 A ~@3 A ~@24>".pickRestart({
  A: "x",
})).gain(4.81)

// drums · bongos
const bongos = s("bongo:4").struct("<~@12 A@3 B C@7 ~@13 A@3 B C@8 ~@12 C@16 ~@17>".pickRestart({
  A: "~@4 x ~@4 x ~@4 x ~", B: "~@2 x ~@2 x!3", C: "~@4 x ~@4 x ~@2 x ~ x ~",
})).gain(1.08)

// drums · congas
const congas = s("conga:18").struct("<~@12 [~@6 x!2]!3 ~@21 [~@6 x!2]!3 ~@54>").gain(1.31)

// drums · shaker
const shaker = s("sh").struct("<~@12 A@3 B C@7 ~ C@12 D@3 E C@36 ~@2 C@11 F G ~@2>".pickRestart({
  A: "x!4 ~@8 x ~ x!2", B: "x!4 ~@12", C: "x!8", D: "x!5 ~ x ~ x ~ x ~ x ~ x!2", E: "x!5 ~ x ~ x ~ x ~ x ~ x ~",
  F: "x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x", G: "~ x ~@14",
})).gain(0.41)

stack(
  electric_guitar_clean, electric_guitar_clean_2, synth_strings_1, distortion_guitar, distortion_guitar_2, bass, kick,
  snare, clap, low_tom, pedal_hat, open_hat, high_tom, ride, splash, vibraslap, bongos, congas, shaker
)

More by Garbage