Strudelify

Hang on Sloopy

Outcasts

KeyG majorTempo115 bpm
0:00/0:00
// Hang on Sloopy — Outcasts
// 115 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 5 overdriven guitar (copy of ch 6 overdriven guitar)
// note: Full arrangement: all 85 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(115/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 · epiano1 · "MIDI"
const epiano1 = note(`<
  ~@3 A B C D A B C D E F G H I J K L E F G H I J K L A B C D A B C D E F G H I J K L M N M N E F G H I J K L O@2 P@2
  O@2 P@2 O@2 P@2 O@2 Q R S A B C D A B C D A B C D ~
>`.pickRestart({
  A: "[b3,d4,g4]@7 ~ [c4,e4,g4]@3 ~ [c4,e4,g4]@3 ~", // G C
  B: "[a3,d4,f#4] ~ [a3,d4,f#4]@5 ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4]@3 ~", // D C
  C: "~@2 [b3,d4,g4] ~ [b3,d4,g4] ~@5 [c4,e4,g4] ~ [c4,e4,g4] ~@3", // G C
  D: "~@2 [a3,d4,f#4] ~ [a3,d4,f#4] ~@5 [c4,e4,g4] ~ [c4,e4,g4] ~@3", E: "[g2,d3] ~@5 [g2,d3]@2 [c3,e3] ~@5 [c3,e3] ~",
  F: "[d3,f#3,a3] ~@5 [d3,f#3,a3] ~ [c3,e3,g3]@4 ~@4", G: "[g3,b3]@7 ~ [g3,c4,e4]@7 ~, [g2,d3]@5 ~@3 c3@5 ~@3",
  H: "[d3,d4,f#4]@7 ~ [c3,g3,c4]@4 a3@2 ~@2, a3@5 ~@3 e4@2 ~@6", // D C5
  I: "[g2,d3,g3,b3] ~@5 b3@2 [c3,e3,g3] ~@5 [c3,e3,g3]@2, ~@6 g3 ~@9", // G C
  J: "[f#3,a3,d4] ~@5 [f#3,a3,d4]@2 [c3,e3,g3]@4 [f#3,a3,d4] ~@3", // D C D
  K: "[g2,d3,g3,b3,d4]@6 ~@2 [c3,g3,c4]@7 ~, ~@8 e4@5 ~@3", L: "[a3,d4,f#4]@7 ~ [c3,g3,c4,e4]@4 a3@2 ~@2",
  M: "g2 ~@2 g2 c3 ~@2 c3", N: "d3@4 ~@2 d3@2 c3@4 a2@3 ~",
  O: "[~@6 d4@2 [c4,e4] ~@3 [c4,e4] ~ [d4,f#4]@9 ~@9, ~@6 b3 ~@25]/2", // C D
  P: "[~@6 d4@2 [c4,e4] ~@3 [c4,e4] ~ [d4,f#4]@10 ~@8, ~@6 b3 ~@25]/2", // C D
  Q: "~@6 d4@2 [c4,e4] ~@3 [c4,e4] ~ [d4,f#4]@2, ~@6 b3 ~@9", // C D
  R: "[d3,f#3,a3,d4] ~ [d3,f#3,a3,d4] ~ [d3,f#3,a3,d4] ~ [d3,f#3,a3,d4] ~ [d3,f#3,a3,d4] ~ [d3,f#3,a3,d4] ~ [d3,f#3,a3,d4] ~ [d3,f#3,a3,d4] ~", // D
  S: "[d3,f#3,a3,d4] ~ [d3,f#3,a3,c4,d4] ~ [d3,f#3,a3,c4,d4] ~ [d3,f#3,a3,c4,d4] ~ [d3,f#3,a3,c4,d4] ~ [d3,f#3,a3,c4,d4] ~ [d3,f#3,a3,c4,d4] ~ [d3,f#3,a3,c4,d4] ~", // D D7
})).s("gm_epiano1").gain(0.24)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  ~@11 A B A B A B A B A B A B A B A B ~@8 C D E F G H I J K L K L A B A B A B A B A B A B A B A B A B A B A B A M@2
  ~@10 N O P
>`.pickRestart({
  A: "~@4 [b3,d4,g4] ~@7 [c4,e4,g4] ~@3", B: "~@4 [a3,d4,f#4] ~@7 [c4,e4,g4] ~@3",
  C: "f4 [d4,f4]!2 d4 [d4,f4]!3 f4 [d4,f4] d4 [d4,f4]!2 f4 [d4,f4] d4 [d4,f4]", // Dm
  D: "[c4,e4] f4 d4 [d4,f4] f4 [d4,f4] d4 [d4,f4]!2 f4 d4 [d4,f4] f4@2 f4@2", // C Dm
  E: "g4 ~ g4 ~ g4 ~ g4@2 a#4@2 g4@2 a#4 [f4,g4] a#4 ~", F: "c5@3 ~ c5@3 ~ c5@3 ~ a#4@3 ~",
  G: "g4@3 ~ g4@6 f4 ~ g4 ~ f4 ~", H: "d4@4 d4@7 ~ d4 ~ c4 ~", I: "d4@2 c4 ~ g3@3 ~ g3@3 ~ g3@3 ~",
  J: "[g3,g4] ~ [g3,g4] ~ [g3,g4]!2 ~ [g3,g4]!2 ~ [g3,g4] ~ [g3,g4]!2 ~@2", K: "g1 ~@2 g1 c2 ~@2 c2",
  L: "d2@4 ~@2 d2@2 c2@4 a1@3 ~",
  M: "[[a1,d2,a2]@4 [a1,d2,a2]@4 [a1,d2,a2]@4 [a1,a2]@4 [a1,a2,d3]@2 [a1,a2,d3]@2 [a1,a2,d3]@2 [a1,a2,d3]@2 [a1,a2,d3]@2 [a1,a2,d3]@2 [a1,a2,d3]@2 [a1,a2,d3] ~, ~@12 d2@19 ~]/2", // D5 A D5
  N: "~@8 [c2,g2] ~@7", O: "[d2,a2] ~@7 [c2,g2] ~@3 [c2,g2] ~@3", P: "[g1,d2,g2,b2,d3] ~@15",
})).s("gm_overdriven_guitar").gain(0.4).pan(0.7)

// chords · tenor sax
const tenor_sax = note(`<
  ~@4 A B C D E F ~@3 G H ~@2 G H ~@2 G H ~@2 G H ~ A B C D E F ~@3 G H ~@2 G H ~@30 A B C D E F ~@2 A B C ~
>`.pickRestart({
  A: "~@7 g3", B: "g2 ~@5 g2@2 c3 ~@5 c3@2", C: "d3 ~@5 d3@2 c3@4 a2@2 ~@2", D: "~@2 g2@2 g3 ~@11",
  E: "~@4 [d3,a3] ~@11", F: "g2 ~@3 g3 ~ g2 ~ c3 ~@5 c3@2", G: "~@2 [b3,d4] ~ [b3,d4] ~@5 [c4,e4] ~ [c4,e4] ~@3",
  H: "~@2 [d4,f#4] ~ [d4,f#4] ~@5 [c4,e4] ~ [c4,e4] ~@3", // D C
})).s("gm_tenor_sax").gain(0.6)

// chords · electric guitar muted
const electric_guitar_muted = note(`<
  ~ A B C D E F G H I J K L K M N M O M K L K M N M O M P Q R S T U V W K L K M N M O M X Y X Y K L K M N M O M ~@15 Z@2
  P Q R S T U V W AA AB AC AD AE
>`.pickRestart({
  A: "[g2,g3] ~@5 g2@2 c3 ~@5 c3 ~", B: "d3 ~@5 d3 ~ c3@3 ~ a2 ~@3",
  C: "[g2,d3,g3,b3,d4] ~ [g3,b3,d4] [g2,d3] [g3,b3,d4] ~ [g3,b3,d4] ~ [c3,e3,g3]@2 [c4,e4] ~ [c4,e4,g4] ~ [c3,e3,g3] ~", // G G5 G C
  D: "[f#3,a3,d4] ~ [f#3,a3,d4] d3 [f#3,a3,d4] ~ [f#3,a3,d4] ~ [c3,g3]@2 [c4,e4] ~ [c4,e4,g4] ~ g3 ~", // D C5 C
  E: "[g2,d3,g3,b3,d4] ~ [g3,b3,d4] [g2,d3] [g3,b3,d4] ~ [g3,b3,d4] ~ [c3,g3]@2 [c4,e4] ~ [c4,e4,g4] ~ [c3,g3] ~", // G G5 G C5 C C5
  F: "[a3,d4] ~ [d3,a3,d4] ~ [f#3,a3,d4] ~ [f#3,a3,d4] ~@7 [c4,e4,g4]@2, f#3 ~@3 [c3,g3]@2 [c3,g3]@2, ~@5 [c4,e4]@2 ~", // D5 D C C5 C
  G: "[g2,d3,g3,b3,d4] ~ [g3,b3,d4] [g2,d3] [g3,b3,d4] ~ [g2,d3] ~ [c3,g3]@2 [c4,e4] ~ [c4,e4,g4] ~ [c3,g3] ~", // G G5 G G5 C5 C C5
  H: "[f#3,a3,d4] ~ [f#3,a3,d4] d3 [f#3,a3,d4] ~ [f#3,a3,d4] ~ [c3,g3]@2 [c4,e4] ~ [c4,e4,g4] ~ d3 ~", // D C5 C
  I: "~@2 [g3,b3,d4] ~ [g3,b3,d4] ~ [c3,g3] ~ [c3,g3]@2 [c4,e4,g4] ~ [c4,e4,g4] ~ [c3,g3] ~, [g2,d3]@5 ~@3 [c4,e4] ~@7", // G C5 C C5 G5 C
  J: "[f#3,a3,d4] ~ [f#3,a3,d4] d3 [f#3,a3,d4] ~ [f#3,a3,d4] ~ [c3,g3]@2 [c4,e4]@2 [c3,g3] ~ [c4,e4,g4] ~", // D C5 C C5 C
  K: "[g2,d3] ~@5 [g2,d3]@2 [c3,e3,g3] ~@5 [c3,e3,g3] ~", L: "[d3,f#3,a3] ~@5 [d3,f#3,a3] ~ [c3,e3,g3]@3 ~ a3@2 ~@2",
  M: "[d3,f#3,a3] ~@5 [d3,f#3,a3] ~ [c3,e3,g3]@3 ~ [c3,e3,g3] ~@3", // D C
  N: "[g2,d3] ~@5 [g2,d3] ~ [c3,e3,g3] ~@5 [c3,e3,g3] ~", O: "[g2,d3,g3,b3] ~@5 [g2,d3]@2 [c3,e3,g3] ~@5 [c3,e3,g3] ~",
  P: "[g2,d3,g3,b3,d4] ~ [g3,b3,d4]!2 ~ [c4,e4] ~ [c3,e3,g3], ~ [g3,b3,d4] ~@4 [c4,e4,g4]@2, ~@3 [g2,d3]@5 [c3,e3,g3]@6 ~@2", // G C G C G5 C
  Q: "[f#3,a3,d4] ~ [f#3,a3,d4]!2 ~ [c4,e4] ~ g3, ~ [f#3,a3,d4] ~@2 g3@3 ~, ~@3 d3@5 c3@8, ~@3 [c4,e4,g4]", // D C D C
  R: "[g3,b3,d4] ~@3 [g3,b3,d4]@2 [g3,b3,d4]@2 ~@2 [c4,e4]@2 ~@2 [c3,g3]@2, [g2,d3] [g3,b3,d4] ~@4 [c4,e4,g4]@2, ~@3 [g2,d3]@5 [c3,g3]@6 ~@2", // G C C5 G5 G C G5 C5
  S: "[a3,d4]!2 [f#3,a3,d4]!2 ~@3 [c4,e4,g4], f#3@2 ~@3 [c4,e4]@2 ~, ~ d3@3 [c3,g3]@2 [c3,g3]@2", // D5 D C C5
  T: "[g2,d3,g3,b3] ~@2 [g2,d3] ~ [c4,e4] ~ [c3,g3], d4 ~ [g3,b3,d4]@2 [g3,b3,d4]@4 ~@4 [c4,e4,g4]@4, ~@3 [g2,d3]@3 ~@2 [c3,g3]@6 ~@2", // G G5 C C5 G C G5 C5
  U: "[f#3,a3,d4] ~ [f#3,a3,d4]!2 ~ [c4,e4] ~ d3, ~ [f#3,a3,d4] ~@4 [c4,e4,g4]@2, ~@3 d3@5 [c3,g3]@8", // D C D C C5
  V: "~@2 [g3,b3,d4]@2 g3@2 [c3,g3]@2 [c4,e4] ~ [c4,e4,g4]@2 ~@2 [c3,g3]@2, [g2,d3]@4 [c3,g3]@3 ~, ~ [b3,d4] ~ [c4,e4,g4]", // G C5 C C5 G5 C5 Bm C
  W: "[f#3,a3,d4]@2 ~@2 [f#3,a3,d4]@2 [f#3,a3,d4]@2 ~@4 [c3,g3]@2 [c4,e4,g4] ~, ~ [f#3,a3,d4] ~@3 [c4,e4]@2 ~, ~@3 d3@5 [c3,g3]@4 ~@4", // D C5 C D C C5
  X: "g2 ~@2 g2 c3 ~@2 c3", Y: "d3@4 ~@2 d3@2 c3@4 a2@3 ~",
  Z: "[[d3,f#3,a3,d4]@2 [d3,f#3,a3,d4]@2 [d3,f#3,a3,d4]@2 [d3,f#3,a3,d4]@2 [d3,f#3,a3,d4]@2 [d3,f#3,a3,d4]@2 d3@2 d3@2 [d3,d4,f#4,a4]@2 [d3,d4,f#4,a4]@2 [d3,d4,f#4,a4]@2 [d3,d4,f#4,a4]@2 [d3,d4,f#4,a4]@2 [d3,d4,f#4,a4]@2 [d3,d4,f#4,a4]@2 [d3,d4,f#4,a4] ~, ~@12 [f#3,a3]@19 ~, ~@3 d4 ~@4]/2", // D F#m
  AA: "[g2,d3,g3,b3,d4] ~ [g3,b3,d4]!2 ~ [c4,e4] ~ [c3,g3], ~ [g3,b3,d4] ~@4 [c4,e4,g4]@2, ~@3 [g2,d3]@5 [c3,g3]@6 ~@2", // G C C5 G C G5 C5
  AB: "[f#3,a3,d4]@2 ~@2 [f#3,a3,d4]@2 [f#3,a3,d4]@2 ~@4 [c3,g3]@3 ~, ~@2 [f#3,a3,d4]@2 ~@6 [c4,e4]@5 ~, ~@3 d3@5 [c3,g3]@4 ~@4", // D C5 D C C5
  AC: "[g3,b3,d4] ~ [g3,b3,d4] ~ [g3,b3,d4] ~@5 [c3,g3,c4,e4,g4] ~ [c3,g3,c4,e4,g4] ~@3", // G C
  AD: "~@2 [d3,f#3,a3,d4] ~ [d3,f#3,a3,d4] ~@5 [c3,g3,c4,e4,g4] ~ [c3,g3,c4,e4,g4] ~ [c3,g3,c4,e4,g4] ~", // D C
  AE: "[b3,d4,g4] ~@15", // G
})).s("gm_electric_guitar_muted").gain(0.36)

// bass · electric bass finger
const bass = note(`<
  ~ A B A C A C D C A C A E A E F E F E A E A E F E F E A C A C D C A C A E A E F E F E A E A E A E A E F E F E A E A E
  A E A E A E A E A E A G H A C A C D C A C A C A C I
>`.pickRestart({
  A: "g1 ~@2 g1 c2 ~@2 c2", B: "d2@2 ~@4 d2@2 c2@3 ~ a1@2 ~@2", C: "d2@2 ~@4 d2@2 c2@4 a1@3 ~",
  D: "g1@2 ~@4 g1@2 c2@3 ~@3 c2@2", E: "d2@4 ~@2 d2@2 c2@4 a1@3 ~", F: "g1 ~@5 g1@2 c2 ~@5 c2@2",
  G: "d2 ~ d2@2 d2 ~ d2@2 d2 ~ d2 ~ d2@2 a1@2", H: "d2 ~ d2@2 d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~", I: "g1 ~@7",
})).s("gm_electric_bass_finger").gain(0.6)

// drums · kick
const kick = s("bd").struct(`<
  A B C B C B C B C@2 D B C B C B C B C B C B C E@3 F B C B C B C@2 D B C B C B C@2 D B C B C B C B C B C B C B C B C
  E@11 F G B C B C B C E F B C B C H
>`.pickRestart({
  A: "~@7 x", B: "x ~@2 x!2 ~@2 x", C: "x ~@2 x!3 ~ x", D: "x!2 ~ x!3 ~ x", E: "x ~ x!2 ~@2 x ~ x ~ x!2 ~@2 x ~",
  F: "x!6 ~ x", G: "x ~@2 x ~ x!3", H: "x",
})).gain(0.5)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<A ~ B ~@23 C ~@43 D E ~@7 C ~@3 F ~>".pickRestart({
  A: "~@10 x!2 ~@4", B: "~@13 x ~@2", C: "~@7 x ~@5 x ~@2", D: "x ~ x ~ x ~ x!2 ~@5 x ~@2", E: "x!6 ~@2",
  F: "~@12 x!2 ~@2",
})).gain(0.25)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@2 A ~@7 B ~@8 C@4 ~@2 D@2 ~@7 B ~@7 B ~@2 C@2 ~@8 C@4 ~@10 D E F ~@6 D@2 ~@3 A G
>`.pickRestart({
  A: "~@7 x", B: "~@3 x", C: "~ x ~ x", D: "~ x", E: "~@4 x!4", F: "~@5 x!3", G: "x",
})).gain(0.5)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B C A B A B A B A B A B A B ~
>`.pickRestart({
  A: "x!8", B: "x!7 ~", C: "x ~ x ~ x ~ x ~@6 x ~@2",
})).gain(0.5)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@2 A ~@7 B ~@8 C D C D ~@3 E ~@7 B ~@7 B ~@2 C D ~@8 C D C D ~@11 F G ~@7 E ~@3 A ~
>`.pickRestart({
  A: "~@3 x", B: "~@5 x ~ x", C: "~@11 x ~@4", D: "~@3 x ~@7 x ~@4", E: "~ x ~@2", F: "~@2 x!2 ~@4", G: "~@3 x!2 ~@3",
})).gain(0.5)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A B ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~@7 x", B: "~@4 x ~ x!2",
})).gain(0.5)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@2 A ~@16 B C B C ~@2 D E ~@18 B C ~@8 B C B C ~@10 D F G ~@6 D E ~@3 H ~
>`.pickRestart({
  A: "~@8 x ~ x!2 ~@4", B: "~@3 x ~@6 x ~@5", C: "~ x ~@3 x ~@2", D: "~@7 x ~@6 x ~", E: "x", F: "x!2 ~@6",
  G: "~ x!2 ~@5", H: "~@4 x!2 ~@2",
})).gain(0.5)

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

// drums · ride
const ride = s("rd").struct("<~@3 A@8 ~@16 A@16 ~@24 A B A@3 ~@10 A@2 ~>".pickRestart({
  A: "x!4", B: "x!3 ~ x!4",
})).gain(0.5)

stack(
  epiano1, overdriven_guitar, tenor_sax, electric_guitar_muted, bass, kick, snare, snare_soft, low_tom, hihat, mid_tom,
  open_hat, high_tom, crash, ride
)