Strudelify

Rockin' Chair

Gwen McCrae

KeyA minorTempo91 bpm
0:00/0:00
// Rockin' Chair — Gwen McCrae
// 91 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 82 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(91/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 · piano · "Track 1"
const piano = note(`<
  ~ A B C@2 A B C@2 A B C@2 A B C D E F G H I F J K ~ A B C@2 A B C D E F G H I F J K ~ A B C@2 A B C@2 ~@2 L M L M L M
  L M L M L M A B C@2 A B C@2 A B C@2 A B ~@3
>`.pickRestart({
  A: "c4 d4 f4 d4 f4 g4 d4@2 ~@8", B: "c4 d4 f4 d4 f4 g4 d4@3 ~@7", C: "g3 a3 c4 a3 c4 d4 a3@2 ~@8",
  D: "g3 a3 c4 a3 c4 d4 a3@2 ~@4 [c4,e4]@2 g4 ~", E: "[d4,g4]@2 a4@3 ~@11",
  F: "[e4,a4,c5]@3 ~ [e4,g4,b4]@3 ~ [d4,f4,a4]@3 ~ [d4,e4,g4]@3 ~", G: "[d4,f4,a4]@5 ~ e4 f4 ~ f4 e4 ~ c4@2 a3@2",
  H: "c4@6 ~@2 c4 d4 e4 ~ e4 f4 g4 ~", I: "[d4,g4]@2 a4 ~@13", J: "[d4,f4,a4]@5 ~ e4 f4 ~ f4 e4 ~ c4 ~ a3 ~",
  K: "g3@3 ~", L: "g3 a3 c4 a3 c4 d4 c4@3 ~@7", M: "e4 d4 c4 a3 c4 d4 c4@4 ~@6",
})).s("gm_piano").gain(0.55)

// bass · electric bass finger · "Track 2"
const bass = note(`<
  ~ A B C D A B C D A B C D A B C E F G H I J G K L M A B C D A B C E F G H I J G K L M A B C D A B C@2 N ~@4 O P Q R S
  T Q U V A B C D A B C D A B C D A B W@2 N
>`.pickRestart({
  A: "f2@3 d2 f2 ~ d2@4 ~@2 c2 d2 f2 d2", B: "f2@3 d2 f2 ~ d2@4 ~@2 g1 a1 c2 a1",
  C: "c2@3 a1 c2 ~ a1@4 ~@2 g1 a1 c2 a1", D: "c2@3 a1 c2 ~ a1@4 ~@2 c2 d2 f2 d2", E: "c2@3 a1 c2 ~ a1@4 ~@2 d2 ~ d#2 ~",
  F: "e2@4 b1@4 e2@3 ~ g2 ~ g#2 ~", G: "a2@3 ~ g2@2 ~@2 f2@2 ~@2 e2@2 ~@2", H: "d2@3 ~@2 d2 a1@2 d2@3 ~ a1@2 d2 a1",
  I: "d2@3 ~@3 a1@2 d2@2 ~@2 d2 ~ d#2 ~", J: "e2@3 ~ b1@3 ~ e1@2 ~@2 g2 ~ g#2 ~", K: "d2@4 a1@3 ~ d2 c2 a1@4 g#1 ~",
  L: "g1 ~ g1 ~ g1 ~ g1 ~", M: "g2@4 d2@3 ~ g2 f2 d2 ~ c2 ~ d2 ~", N: "c2 ~@15", O: "~@12 g2 a2 c3 a2", P: "d3",
  Q: "~@10 d3@3 c3 a2 ~", R: "c3@12 a2 g2 e2 d2", S: "c2@8 ~@4 g2 a2 c3 a2", T: "d3@15 ~", U: "c3@10 ~@2 a2 g2 e2 d2",
  V: "c2@8 ~@4 c2 d2 f2 d2", W: "[c2@3 ~]/2",
})).s("gm_electric_bass_finger").gain(0.64)

// chords · electric guitar muted · "Track 3"
const electric_guitar_muted = note(`<
  ~ A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@9 A@2 B@2 A@2 B@2 ~@9 A@2 B@2 A@2 B@16 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C
>`.pickRestart({
  A: "[c4,f4,a4] ~@2 [c4,f4,a4] ~@2 [c4,f4,a4] ~@3 [c4,f4,a4] ~@2 [c4,f4,a4] ~@2", // F
  B: "[c4,e4,g4] ~@2 [c4,e4,g4] ~@2 [c4,e4,g4] ~@3 [c4,e4,g4] ~@2 [c4,e4,g4] ~@2", C: "[c4,e4,g4] ~@15",
})).s("gm_electric_guitar_muted").gain(0.65)

// chords · brass section · "Track 5"
const brass_section = note(`<
  ~ A B C@2 A B C@2 ~@3 D ~@3 E F G H@2 F G I J K ~@3 L ~@3 M F G N@2 F G I J O ~@3 P ~@3 Q ~@14 A B C@2 A B C@2 A B C@2
  A B R ~@2
>`.pickRestart({
  A: "[f4,a4,c5]@4 ~@2 [f4,a4,d5]@9 ~", B: "[f4,a4,c5]@2 ~ [f4,a4,d5]@4 ~", C: "[c4,e4,g4]@2 ~ [c4,e4,a4]@4 ~",
  D: "~@6 [e4,a4,c5]@9 d5", E: "~@3 [e4,a4,c5]@4 ~", F: "~@4 g4 a4 b4@9 ~", G: "[a4,c5] [g4,b4] [f4,a4] [e4,g4]",
  H: "[[f4,a4]@7 ~]/2", I: "[f4,a4]", J: "g4 a4 b4 c5", K: "d5@4 e5@4 f5@4 g5@3 ~", L: "~@6 [e4,a4,c5]@9 ~",
  M: "~@6 [e4,a4,c5]@7 ~@3", N: "[[f4,a4]@27 ~@5]/2", O: "d5 e5 f5 g5", P: "~@3 [e4,a4,c5]@5",
  Q: "~@3 [e4,a4,c5]@4 ~, ~@6 b4 ~@9", R: "[c4,e4,g4]",
})).s("gm_brass_section").gain(0.72)

// other · lead 4 chiff · "Track 6"
const lead_4_chiff = note("<~@2 A B@2 ~ A C@2 ~@57 A C@2 ~ A C@2 ~ A C@2 ~@5>".pickRestart({
  A: "~@3 a4", B: "[c5@29 ~@3]/2", C: "[c5@7 ~]/2",
})).s("gm_lead_4_chiff").gain(0.39)

// drums · kick
const kick = s("bd").struct("<A B@50 ~@3 C D@9 E B@14 F ~ F>".pickRestart({
  A: "~@11 x ~ x ~@2", B: "x ~@2 x ~@4 x ~@2 x ~@4", C: "~@15 x", D: "x ~@6 x!2 ~@6 x", E: "x ~@6 x!2 ~@7", F: "x",
})).gain(0.78)

// drums · snare
const snare = s("sd").struct(`<
  A B@7 C B@7 C B@3 C B@3 D C B@7 C B@3 C B@3 D C B@7 C ~@13 E B@7 C B@5 C ~@3
>`.pickRestart({
  A: "~@8 x!3 ~ x ~@3", B: "~ x ~ x", C: "~@4 x ~@7 x!4", D: "~@4 x ~@7 x!2 ~@2", E: "~@10 x!4 ~@2",
})).gain(0.78)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@64 [~@15 x] ~@17>").gain(0.78)

// drums · high tom
const high_tom = s("ht").struct("<~@64 [~@7 x] ~@17>").gain(0.78)

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

// drums · ride
const ride = s("rd").struct("<~@55 [~ x ~ x]!10 ~@17>").gain(0.78)

stack(
  piano, bass, electric_guitar_muted, brass_section, lead_4_chiff, kick, snare, hihat, mid_tom, high_tom, crash, ride
)