Strudelify

Hang on Sloopy

Lewis Ramsey

KeyC majorTempo120 bpm
0:00/0:00
// Hang on Sloopy — Lewis Ramsey
// 120 bpm, 4/4, key C 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: Full arrangement: all 80 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · acoustic bass · "MIDI"
const bass = note(`<
  ~@2 A B A B A B A B A B A B A B A B A B A B A B A C 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 C A
  B A B A B A C A B A B A B A B A B A D E ~
>`.pickRestart({
  A: "c2@3 ~@3 c2 ~ f2@3 ~@3 f2 ~", B: "g2@3 ~@3 g2 ~ f2@3 ~ d2@3 ~", C: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~",
  D: "g2 ~ g2 ~ g2 ~ g2 ~ f2@3 ~ d2@3 ~", E: "c2",
})).s("gm_acoustic_bass").gain(0.66)

// bass · acoustic bass · "MIDI"
const bass_2 = note("<[c2@4 c2 ~ c2@2 c2@4 c2 ~ c2@2]!2 ~@78>").s("gm_acoustic_bass").gain(0.5)

// chords · brass section · "MIDI"
const brass_section = note("<~@4 A B ~@2 A B ~@18 A B ~@2 A B ~@34 A B ~@2 A B ~@2 A C D@2>".pickRestart({
  A: "~@2 [e4,g4,c5] ~ [e4,g4,c5] ~@5 [f4,a4,c5] ~ [f4,a4,c5] ~@3", // C F
  B: "~@2 [g4,b4,d5] ~ [g4,b4,d5] ~@5 [f4,a4,c5] ~ [f4,a4,c5] ~@3", // G F
  C: "[g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~", // G
  D: "[e4,g4,c5]/2", // C
})).s("gm_brass_section").gain(0.42)

// chords · electric guitar clean · "MIDI"
const electric_guitar_clean = note(`<
  ~@2 A B A B A B A B A B A B A B A B A B A B A B A C 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 C A
  B A B A B A C A B A B A B A B A B A C D@2
>`.pickRestart({
  A: "~@4 [e4,g4,c5] ~@7 [f4,a4,c5] ~@3", B: "~@4 [g4,b4,d5] ~@7 [f4,a4,c5] ~@3",
  C: "[g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~", // G
  D: "[e4,g4,c5]/2", // C
})).s("gm_electric_guitar_clean").gain(0.42)

// drums · kick
const kick = s("bd").struct("<[x ~@2 x!2 ~@3]!78 ~@2>").gain(0.46)

// drums · snare
const snare = s("sd").struct(`<
  A@9 B A@3 B A@3 B A@3 B A@3 C A@3 B A@3 B A@3 B A@3 B A@11 B A@3 C A@3 B A@3 C A@3 B A@3 B A@3 C ~@2
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@3 x!2", C: "x ~ x ~ x ~ x ~ x!8",
})).gain(0.51)

// drums · hihat
const hihat = s("hh").struct("<~@10 A B@7 A B@7 ~@16 A B@3 A B@3 A B@3 A B@3 ~@22>".pickRestart({
  A: "~ x!4 ~ x!2", B: "x!5 ~ x!2",
})).gain(0.36)

// drums · open hat
const open_hat = s("oh").struct("<~@10 [~@5 x ~@2]!16 ~@16 [~@5 x ~@2]!16 ~@22>").gain(0.36)

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

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

stack(bass, bass_2, brass_section, electric_guitar_clean, kick, snare, hihat, open_hat, crash, ride)