Strudelify

Sleep Together

Garbage

KeyD♭ majorTempo130 bpm
0:00/0:00
// Sleep Together — Garbage
// 130 bpm, 4/4, key Db major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 12 "Guitar 3" named as a guitar, played on electric guitar clean (its synth bass 2 patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 128 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): Guitar 1.
setcpm(130/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.

// other · taiko drum · "Knock Effect"
const taiko_drum = note("<A B A B A B A B A B A B A B A B A B A ~@33 A B A B A B A B A ~@41 C@16 ~@10>".pickRestart({
  A: "f6 bb5 f6 e6 ~ bb5 e6 f6", B: "~ bb6 f6 e6 ~@4", C: "[bb5 eb5 bb5 a5@2 eb5 a5 bb5@2 eb6 bb5 a5@3 ~@2]/2",
})).s("gm_taiko_drum").gain(0.4)

// other · flute · "Whistle"
const flute = note("<A B A B A B A B A B A B ~@8 C ~@31 A B ~@8 C ~@65>".pickRestart({
  A: "f5 bb4 f5 e5 ~ bb4 e5 f5", B: "~ bb5 f5 e5 ~@4", C: "~@4 f5@4 ~ f5 ~@2 f5@4",
})).s("gm_flute").gain(0.4)

// bass · overdriven guitar · "Guitar 1"
const bass = note("<~@93 A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~@2 B@2 ~@2 B@2>".pickRestart({
  A: "[~@7 [eb1,eb2]@16 ~]/3", B: "[eb1,eb2]/2",
})).s("gm_overdriven_guitar").gain(0.4)

// other · lead 2 sawtooth · "Beep Effect 2"
const lead_2_sawtooth = note(`<
  ~@4 A B A B A B A B C D C D C D C ~ C D C D C D C D C D C D C D C D ~@18 C D C D C D C ~ C D C D C D C D C D C D C D C
  D ~@50
>`.pickRestart({
  A: "f4 ~ f4@3 ~ f4 ~ f4@3 ~ f4 ~ f4@2", B: "~@2 f4 ~ f4@3 ~ f4 ~ f4 ~ f4@3 ~", C: "~@4 f5@4 ~ f5 ~@2 f5@4",
  D: "~@4 bb4@4 ~ bb4 ~@2 bb4@4",
})).s("gm_lead_2_sawtooth").gain(0.4)

// chords · distortion guitar · "Guitar 2"
const distortion_guitar = note(`<
  ~@12 A B A B A B A B C D C D C D C D C D E F C D G@2 ~@4 H@12 ~@2 A B A B A B A B C D C D C D C D C D E F C D G@2 ~@4
  H@36 ~@10
>`.pickRestart({
  A: "[bb1,bb2]", B: "[gb1,gb2]", C: "bb1@2 bb2@2 bb1!2 bb2 ab2", D: "gb1@2 gb2@2 gb1!2 gb2 f2",
  E: "eb1@2 eb2@2 eb1!2 eb2 f2", F: "ab1@2 ab2@2 ab1!2 ab2 bb2", G: "ab1@2 ab2@2 ab1!2 ab2 ab1",
  H: "~ [eb3,bb3] [gb3,db4] [ab3,eb4]@3 [gb3,db4] ~", // Eb5 Gb5 Ab5 Gb5
})).s("gm_distortion_guitar").gain(0.32)

// chords · lead 1 square · "Beep Effect 3"
const lead_1_square = note(`<
  ~@30 A B A B A B C D E F C D E F C D E F C D E F ~@20 A B A B A B C D E F C D E F C D E F C D E F C D E F C D E F C D
  E F C D E F C D E F C D E F C D E F C D E F ~@2
>`.pickRestart({
  A: "[f4,f5]!2 ~ [f4,f5]!2 ~ [f4,f5]!2", B: "~ [f4,f5]!2 ~ [f4,f5]!3 ~", C: "[eb4,bb4]", D: "[gb4,bb4]",
  E: "[db4,ab4]", F: "[b3,gb4]",
})).s("gm_lead_1_square").gain(0.05).pan(1)

// bass · electric guitar clean · "Guitar 3"
const bass_2 = note(`<
  ~@12 A B A B A B A B C D C D C D C D C D E F C D G@2 ~@7 H I@7 J K ~ A B A B A B A B C D C D C D C D C D E F C D G@2
  ~@7 H I@7 J I@3 J I@3 J I@3 J I@3 J I@3 J I@3 J ~@10
>`.pickRestart({
  A: "[bb1,bb2]", B: "[gb1,gb2]", C: "bb1@2 bb2@2 bb1!2 bb2 ab2", D: "gb1@2 gb2@2 gb1!2 gb2 f2",
  E: "eb1@2 eb2@2 eb1!2 eb2 f2", F: "ab1@2 ab2@2 ab1!2 ab2 bb2", G: "ab1@2 ab2@2 ab1!2 ab2 ab1", H: "~@6 bb1 db2",
  I: "eb2 ~@2 eb2@2 ~ bb1 db2", J: "eb2 ~@2 eb2@2 ~ f1 ab1", K: "bb1 ~@7",
})).s("gm_electric_guitar_clean").gain(0.4)

// chords · piano · "Keyboard 1"
const piano = note("<~@20 A B A B A B A B A B C D A B E@2 ~@26 A B A B A B A B A B C D A B E@2 ~@50>".pickRestart({
  A: "[bb3,f4]!4", B: "[gb3,db4]@2 [gb3,db4]@2 [gb3,db4]@2 gb3 f3, ~@3 db4", C: "[eb3,f4]!4",
  D: "[ab3,db4]@2 [ab3,db4]@2 [ab3,db4]@2 ab3 bb3, ~@3 db4", E: "[ab3,eb4]@2 [ab3,eb4]@2 [ab3,eb4]@2 ab3!2, ~@3 eb4",
})).s("gm_piano").gain(0.4).pan(1)

// chords · piano · "Keyboard 2"
const piano_2 = note("<~@20 A B A B A B A B A B C D A B E F ~@26 A B A B A B A B A B C D A B E F ~@50>".pickRestart({
  A: "[bb3,f4]!8", B: "[gb3,db4]!7 [f3,db4]", C: "[eb3,f4]!7 [f3,f4]", D: "[ab3,db4]!6 [f3,db4] [ab3,db4]",
  E: "[ab3,eb4]!8", F: "[ab3,c4]!8",
})).s("gm_piano").gain(0.29)

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

// drums · rim
const rim = s("rim").struct(`<
  ~@12 A@3 B A@3 C A D A D A D A B A D A D A D A E ~@18 A@3 B A@3 C A D A D A D A B A D A D A D A E ~@16 A@3 B A@3 B A@3
  B A@3 B A@3 B A@3 B ~@10
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@3 x!2 ~ x!5", C: "~@10 x!6", D: "~@2 x ~@2 x!3", E: "~@4 x ~@3 x!8",
})).gain(0.62)

// drums · snare
const snare = s("sd").struct("<~@3 A B C B C B C B C ~@116>".pickRestart({
  A: "~@7 x", B: "x", C: "x ~@6 x",
})).gain(0.62)

// drums · clap
const clap = s("cp").struct(`<
  ~@12 A@3 B A@3 C A D A D A D A B A D A D A D A E F@8 G@3 H G@4 ~ I A@3 B A@3 C A D A D A D A B A D A D A D A E F@8 G@3
  H G@4 A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B F@8 ~@2
>`.pickRestart({
  A: "~@4 x ~@7 x ~@2 x", B: "~@4 x ~@3 x!2 ~ x!5", C: "~@12 x!4", D: "~@2 x ~@2 x!3", E: "~@4 x ~@3 x!8", F: "~ x",
  G: "~@2 x!3 ~@3 x!3 ~@3 x!2", H: "~@2 x!3 ~@3 x!3 ~ x ~ x!2", I: "~@3 x",
})).gain(0.62)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@12 A@3 B A@3 C A@7 B A@7 D A@16 ~@2 A@3 B A@3 C A@7 B A@7 D A@19 B A@3 B A@3 B A@3 B A@3 B A@3 B A@8 C ~
>`.pickRestart({
  A: "x!8", B: "x!5 ~ x!2", C: "x", D: "x ~ x ~ x ~ x ~ x!8",
})).gain(0.62)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@12 A@7 ~ A B A B A B A@3 B A B A B A C ~@18 A@7 ~ A B A B A B A@3 B A B A B A C ~@16 A@24 ~@10
>`.pickRestart({
  A: "~@4 x ~@4 x ~@2 x ~@3", B: "~@4 x ~@4 x!2 ~ x ~ x ~", C: "~@4 x ~@4 x!2 ~ x ~@3",
})).gain(0.62)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@12 A@3 B A@3 C A D A D A D A B A D A D A D A E ~@17 F A@3 B A@3 C A D A D A D A B A D A D A D A E ~@16 A@3 B A@3 B
  A@3 B A@3 B A@3 B A@3 B ~@10
>`.pickRestart({
  A: "x ~@2 x ~@3 x ~@2 x ~@3 x ~", B: "x ~@2 x ~@3 x!3 ~ x!5", C: "x ~@14 x", D: "x ~@2 x ~@3 x ~@8",
  E: "x ~@2 x ~@3 x!9", F: "~@3 x",
})).gain(0.62)

// drums · crash
const crash = s("cr").struct(`<
  ~@12 A ~@3 A ~@2 A@2 ~@7 A ~@7 A ~@17 A ~@3 A ~@2 A@2 ~@7 A ~@7 A ~@15 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@9
>`.pickRestart({
  A: "x",
})).gain(0.62)

// drums · ride
const ride = s("rd").struct(`<
  ~@4 A@8 ~@3 B ~@3 C ~ D ~ D ~ D ~ B ~ D ~ D ~ D ~ C ~@21 B ~@3 C ~ D ~ D ~ D ~ B ~ D ~ D ~ D ~ C ~@19 B ~@3 B ~@3 B
  ~@3 B ~@3 B ~@3 B ~@10
>`.pickRestart({
  A: "x!4", B: "~@8 x!2 ~ x!5", C: "~@8 x!8", D: "~@5 x!3",
})).gain(0.62)

// drums · tambourine
const tambourine = s("tb").struct("<~@19 [~@8 x!8] ~@41 [~@8 x!8] ~@66>").gain(0.62)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@20 A ~@7 A ~@33 A ~@7 A ~@57>".pickRestart({
  A: "x",
})).gain(7.29)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@4 A@8 B@7 C B@16 ~@18 B@7 C B@16 ~@16 B@24 ~@10>".pickRestart({
  A: "x!4", B: "x!8", C: "x ~@3 x!4",
})).gain(3.14)

// drums · shaker
const shaker = s("sh").struct("<~@4 A@15 B A@16 C@16 ~@2 A@7 B A@16 C@16 A@24 C@8 D ~>".pickRestart({
  A: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", B: "~@9 x ~ x ~ x ~ x", C: "x!8", D: "x",
})).gain(0.62)

stack(
  taiko_drum, flute, bass, lead_2_sawtooth, distortion_guitar, lead_1_square, bass_2, piano, piano_2, kick, rim, snare,
  clap, hihat, open_hat, high_tom, crash, ride, tambourine, vibraslap, cabasa, shaker
)

More by Garbage