Strudelify

In the Garage

Weezer

KeyG♭ majorTempo98 bpm
0:00/0:00
// In the Garage — Weezer
// 98 bpm, 4/4, key Gb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 14, 4/4 at bar 14, 2/4 at bar 23, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: ch 8 "Guitar solo" named as a guitar, played on overdriven guitar (its lead 1 square patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 91 bars on a 16-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): Guitar II, Guitar solo.
setcpm(98/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 · acoustic guitar steel · "Guitar I"
const acoustic_guitar_steel = note("<A@3 B ~@29 A@3 B ~@54>".pickRestart({
  A: "[~@3 db3 ~@19 db3, [gb2,bb3]@4 ~ ab2@3 [b2,b3]@4 [bb2,bb3]@4 [gb2,bb3]@4 ~ f3@3, ~ bb2@3 db3@3 db3@5 ~@5 bb2@3 db3@2 [ab2,bb3]@2, ~@2 [gb3,db4]@2 ab3@4 ~@2 [gb3,eb4]@2 ~ gb3@2 gb3@4 gb3@5, ~@6 f3@2 ~ eb3@2 eb3@3 eb3@2 ~@2 [db3,db4]@2 ab3@4]/3", // Gb B Bb Gb Absus2 Gb5 Ebm Db
  B: "[b2,gb3]@2 bb2 ab2 [gb2,gb3]@4, ~ gb3 ~@2", // B5 Gb
})).s("gm_acoustic_guitar_steel").gain(0.31)

// chords · overdriven guitar · "Guitar II"
const overdriven_guitar = note(`<
  ~@9 A@2 B@3 ~@4 C D E F@2 ~@10 G@3 H ~@5 I@2 B@3 ~@11 J K@2 L M N O P Q R ~@23
>`.pickRestart({
  A: "[bb3!4 ~@3 bb3@2 bb3!3 ~@4]/2",
  B: "[bb3!2 ~@6 gb5 ~@7 gb5 ~@7, ~@5 gb5@3 ~@5 gb5@3 ~@8, ~@6 db5@3 ~@5 db5@3 ~@7]/3", C: "~@4 bb3!4",
  D: "~@3 bb3@2 bb3!3", E: "~@4 bb3!2 ~@2", F: "~@4 gb5 ~@3, ~ gb5@3 ~@4, ~@2 db5@3 ~@3",
  G: "[~@23 db3, gb2@4 ~ ab2@2 db3@5 ~ bb2@3 ~ bb2@3 db3@2 [ab2,bb3]@2, ~ bb2@3 db3@2 f3@2 [b2,b3]@4 [eb2,bb3]@4 [gb2,bb3]@4 ~ f3@3, ~@2 [db3,db4]@2 ab3@4 ~@2 [gb3,eb4]@2 ~@3 gb3@4 gb3@5, ~@3 gb3@5 ~ eb3@2 eb3@3 eb3@2 ~@2 [db3,db4]@2 ab3@4]/3", // Absus2 B Eb5 Gb Db Ebm Db
  H: "[b2,gb3]@2 bb2 ab2 [gb2,gb3]@4, ~ gb3 ~@2", I: "[~@7 bb3@2 bb3!3 ~@4]/2", J: "~@5 eb3!3",
  K: "[eb3!2 f3 g3@2 ~@2 db5@2 d5@3 ~ eb3!3]/2", L: "eb3!2 f3 g3@2 ~@3", M: "gb5@2 ~@3 eb3!3",
  N: "eb3!2 f3 gb3@2 ~@2 b3", O: "bb3 b3 bb3@2 ab3@2 ~@8 b3@2", P: "bb3 b3 bb3@2 ab3@2 ~@4 bb3@2 ~@4",
  Q: "~@8 gb5@2 ~@3 db4 ~ bb3, ~ gb5@3 ~@4, ~@2 db5@3 ~@3",
  R: "ab3 gb3 ~ eb3 gb3 ab3 ~ db4 ~ gb4 ~ db5 ~@2 gb4 eb4, ~ gb5@3 gb5 ~@3, ~@2 db5@3 ~@3",
})).s("gm_overdriven_guitar").gain(0.41)

// chords · distortion guitar · "Guitar III"
const distortion_guitar = note(`<
  ~@4 A B A B A C D E F G H I H I J K L@3 M N M O M N M P Q R ~@9 S D E F T U V W X U V Y Z AA@2 AB@2 H I H I J K L@3 M
  N M O M N M AC M N M O M N M N M P Q R Q R ~
>`.pickRestart({
  A: "[gb2,b2,gb3]!6 [ab2,db3,ab3]!2", B: "[eb2,bb2,eb3]!8", C: "[gb2,db3,gb3]!4 [b2,gb3,b3]!3 [gb2,db3,gb3]",
  D: "[gb2,db3,gb3]!4 [b2,gb3,b3]!4", E: "[gb2,db3,gb3]!2 [db3,ab3,db4] [eb2,bb2,eb3]@2 [eb2,bb2,eb3]!3",
  F: "[eb2,bb2,eb3]!2 [db3,ab3,db4] [eb2,bb2,eb3]@2 [eb2,bb2,eb3]!3", G: "[eb2,eb3,bb3]!4 [gb2,b2,gb3]!4",
  H: "[gb2,b2,gb3]!2 [ab2,db3,ab3]!2 [eb2,bb2,eb3]!4", I: "[eb2,bb2,eb3]!4 [gb2,b2,gb3]!4",
  J: "[gb2,b2,gb3]!2 [ab2,db3,ab3]!2 [gb2,db3,gb3]!4", K: "[b2,gb3,b3]!3 [gb2,db3,gb3]!5",
  L: "[[b2,gb3,b3]!4 [gb2,db3,gb3]!2 [db3,ab3,db4] [eb2,bb2,eb3]@2 [eb2,bb2,eb3]!5 [db3,ab3,db4] [eb2,bb2,eb3]@2 [eb2,bb2,eb3]!3 [eb2,eb3,bb3]!4]/3", // B5 Gb5 Db5 Eb5 Db5 Eb5
  M: "[gb2,db3,gb3]!4 [db3,ab3,db4]!4", N: "[ab2,eb3,ab3]!4 [eb2,bb2,eb3]!4",
  O: "[b2,gb3,b3]@2 [bb2,gb3] [ab2,gb3] [gb2,db3,gb3]!4", P: "[b2,gb3,b3]@2 bb2 ab2 [gb2,db3,gb3]@4, ~ gb3 ~@2",
  Q: "[ab2,eb3,ab3]!2", R: "[gb2,db3,gb3]", S: "~@7 [gb2,db3,gb3]", T: "[eb2,eb3,bb3]!4 [gb2,db3,gb3]!4",
  U: "[db3,ab3,db4]!4 [ab2,eb3,ab3]!4", V: "[eb2,bb2,eb3]!4 [gb2,db3,gb3]!4",
  W: "[db3,ab3,db4]!4 [b2,gb3,b3]@2 [bb2,gb3] [ab2,gb3]", X: "[gb2,db3,gb3]!8",
  Y: "[db3,ab3,db4]!4 [b2,gb3,b3]@2 bb2 ab2, ~@3 gb3", Z: "[gb2,db3,gb3] [ab2,eb3,ab3]",
  AA: "[[ab2,eb3,ab3] [gb2,db3,gb3]@2 [ab2,eb3,ab3]]/2", AB: "[[ab2,eb3,ab3]@4 [gb2,db3,gb3]@8 [gb2,b2,gb3]!4]/2",
  AC: "[b2,gb3,b3]@2 bb2 ab2 [gb2,db3]!4, ~ gb3 ~@2", // B5 Gb5
})).s("gm_distortion_guitar").gain(0.41)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@4 A B A B A C@2 D E F G H G H I J K@3 L M L N L M L O P Q ~@4 A R A R A C@2 D E S T U V W T U V X Y@2 Z@2 G H G H I
  J K@3 L M L N L M L N L M L N L M L AA L O P Q P Q ~
>`.pickRestart({
  A: "b1!6 db2!2", B: "eb2!8", C: "[gb1!4 b1!3 gb1@2 gb1!3 b1!4]/2", D: "gb1!2 db2 eb1@2 eb1!3",
  E: "eb1!2 db2 eb1@2 eb1!3", F: "eb1!4 b1!4", G: "b1!2 db2!2 eb2!4", H: "eb2!4 b1!4", I: "b1!2 db2!2 gb1!4",
  J: "b1!3 gb1@2 gb1!3", K: "[b1!4 gb1!2 db2 eb1@2 eb1!5 db2 eb1@2 eb1!7]/3", L: "gb1!4 db2!4", M: "ab1!4 eb2!4",
  N: "b1@2 bb1 ab1 gb1!4", O: "b1@2 bb1 ab1 gb1@4", P: "ab1!2", Q: "gb1", R: "eb1!8", S: "eb1!4 gb1!4",
  T: "db2!4 ab1!4", U: "eb2!4 gb1!4", V: "db2!4 b1@2 bb1 ab1", W: "gb1!8", X: "gb1 ab1", Y: "[ab1 gb1@2 ab1]/2",
  Z: "[ab1@4 gb1@8 b1!4]/2", AA: "ab1 eb1",
})).s("gm_electric_bass_finger").gain(0.41)

// chords · harmonica
const harmonica = note("<A B C D ~@29 A B E D ~@49 F G H I ~>".pickRestart({
  A: "bb5@2 db6@2 ab5@3 bb5", B: "b5 eb6 bb5@2", C: "bb5 db6 ab5!2", D: "gb5@2 gb5!2 gb5@4", E: "bb5 db6 ab5 bb5",
  F: "gb5!2", G: "gb5 ab5 ~ bb5@8 ~@5", H: "gb5 ab5", I: "gb5",
})).s("gm_harmonica").gain(0.31)

// chords · harmonica · soft notes
const harmonica_soft = note("<A ~ B C ~@29 A ~ D C ~@51 E F ~>".pickRestart({
  A: "~@6 db6 ~", B: "~@3 b5", C: "~ bb5 bb5@2", D: "~@3 db6", E: "~ b5", F: "~ bb5@3",
})).s("gm_harmonica").gain(0.1)

// other · overdriven guitar · "Guitar solo"
const overdriven_guitar_2 = note("<~@58 A ~@3 B ~@2 C D E ~@23>".pickRestart({
  A: "~ gb5 ~@2", B: "eb6 ~@3", C: "~@10 db5@3 bb4 ~@2", D: "~@4 eb4 ~@3", E: "~@9 eb5 gb5 ab5 bb5@4",
})).s("gm_overdriven_guitar").gain(0.41)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 A@5 B C B C D A@5 E F E G H I@3 H I@2 J A K A@3 H A@5 L C B C M I@3 F I@2 N A@2 O L P A@5 E F E Q H I@3 H I@2 R H
  I@3 H I@2 S I J T K A U ~
>`.pickRestart({
  A: "x!2", B: "x ~@3 x!2 ~ x", C: "~ x ~@2 x!2 ~@2", D: "~ x ~ x!2 ~@3", E: "x!2 ~ x ~ x ~@2", F: "x!2 ~@2 x ~@3",
  G: "x!2 ~@6", H: "x ~@3 x!2 ~@2", I: "x!2 ~@2 x!2 ~@2", J: "x!3 ~", K: "x", L: "x ~@3 x ~@2 x", M: "~ x ~@2 x ~@3",
  N: "x!2 ~@2 x ~ x ~", O: "~ x", P: "~ x ~@3 x ~@2 x ~@7", Q: "x!2 ~@3 x ~ x", R: "x!2 ~ x ~ x ~ x",
  S: "~@3 x ~ x ~@2", T: "x!4", U: "x ~@6 x",
})).gain(0.41)

// drums · snare
const snare = s("sd").struct(`<
  ~@4 A@9 B A@8 C A@7 D E F A@13 G A@6 H E@2 I J B A@8 H A@7 H A@7 K A L E F E F@2
>`.pickRestart({
  A: "~ x ~ x", B: "x!2 ~ x", C: "~@4 x ~@3 x ~ x!3 ~ x!2", D: "x!3 ~", E: "x!2", F: "x", G: "x ~@3 x ~ x!2 ~@4 x ~@3",
  H: "~ x!3", I: "~ x", J: "x ~@7 x ~@2 x!2 ~@3", K: "x!4", L: "x ~@3 x ~@3 x ~@3 x!2 ~@2",
})).gain(0.41)

// drums · low tom
const low_tom = s("lt").struct("<~@58 [x ~ x!3 ~ x!2 ~@8] ~ [~ x ~@6] [~@3 x] ~@23 [~@14 x!2] ~@5>").gain(0.41)

// drums · hihat
const hihat = s("hh").struct("<~@4 A@5 ~@4 B A@4 C ~@14 A@3 D A@6 ~@15 B A@4 C ~@27>".pickRestart({
  A: "x!8", B: "~@4 x!4", C: "x!4 ~@4", D: "x!5 ~@3",
})).gain(0.41)

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

// drums · crash
const crash = s("cr").struct(`<
  ~@9 A ~ B C D ~@4 E ~ F G E A ~@2 H ~@3 I J A ~@3 I ~@5 F E B C I ~@3 K ~@2 L J@2 E J ~@5 E ~ F G L A ~@2 H ~@3 I A
  ~@2 H ~@3 A ~ I J A J A ~
>`.pickRestart({
  A: "x", B: "~@3 x ~@4", C: "x ~@2 x ~@4", D: "x!2 ~@2", E: "~ x", F: "~@7 x", G: "~@4 x ~@2 x", H: "~@3 x",
  I: "x!3 ~", J: "x!2", K: "~ x ~@2", L: "~@2 x!2",
})).gain(0.41)

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

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

// drums · ht
const ht = s("ht").struct("<~@59 [~ x ~@2] ~ [~ x ~@2] ~ [~ x ~@2] ~@27>").gain(0.41)

// drums · mt
const mt = s("mt").struct("<~@63 [~@3 x ~@4]!2 [~@3 x!2 ~@3] ~@25>").gain(0.41)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~@59 [~@3 x ~@4] ~ [~@3 x ~@4] ~@29>").gain(2.61)

// drums · agogo bells
const agogo_bells_2 = s("agogo:4").struct("<~@64 [~ x ~@2]!2 ~@25>").gain(2.61)

// drums · shaker
const shaker = s("sh").struct("<~@59 [~@5 x ~@2] ~@4 [x!2 ~@6]!2 ~@25>").gain(0.41)

// drums · whistle
const whistle = s("ballwhistle:1").struct("<~@63 [~@7 x] [~ x ~@12 x ~] [~ x ~@14] ~@25>").gain(0.53)

// drums · guiro
const guiro = s("guiro:0").struct("<~@63 [~@5 x ~@2]!2 ~@26>").gain(8.65)

// drums · rim
const rim = s("rim").struct("<~@59 [~@7 x] ~@31>").gain(0.41)

stack(
  acoustic_guitar_steel, overdriven_guitar, distortion_guitar, bass, harmonica, harmonica_soft, overdriven_guitar_2,
  kick, snare, low_tom, hihat, open_hat, crash, ride, congas, ht, mt, agogo_bells, agogo_bells_2, shaker, whistle,
  guiro, rim
)

More by Weezer