Strudelify

Sugar Shack

Jimmy Gilmer

KeyG majorTempo132 bpm
0:00/0:00
// Sugar Shack — Jimmy Gilmer
// 132 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 70 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(132/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.

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  A B C B D E C B D E C B D F G H I F J E C B D E C B D E C B D F G H I F J E C B D E C B D E C B D E C B D F G H I F J
  E C B D E C B D K@3
>`.pickRestart({
  A: "~@7 f#1", B: "g1 ~ g2 b1 c2 ~ g2 f#1", C: "g1@2 ~@2 g2@2 b1@2 c2@2 ~@2 g2 ~ f#1@2",
  D: "g1@3 ~ g2@2 b1@2 c2@2 ~@2 g2@2 f#1 ~", E: "g1 ~ g2 b1 c2 ~ g2 f#1, f#1 ~@15", F: "a2 g2 f#2 e2", G: "d2 c2 b1 a1",
  H: "a2@4 g2@4 f#2@4 e2@3 ~", I: "d2@4 c2@3 ~ b1@4 a1@4", J: "d2@3 ~ c2@3 ~ b1@4 a1@3 ~", K: "[g1@11 ~@5]/3",
})).s("gm_acoustic_bass").gain(0.72)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  A B C B D E F@2 G F@3 H I@2 J@2 K L M C B D E F@2 G F@3 H I@2 J@2 K L M C B D M C B D E F@2 G F@3 H I@2 J@2 K L M C B
  D M C B D N@3
>`.pickRestart({
  A: "~@7 f#2", B: "g2 ~ g3 b2 c3 ~ g3 f#2", C: "g2@2 ~@2 g3@2 b2@2 c3@2 ~@2 g3 ~ f#2@2",
  D: "g2@3 ~ g3@2 b2@2 c3@2 ~@2 g3@2 f#2 ~", E: "[g2,g3,b3,d4] [g3,c4,e4]", F: "[g3,b3,d4]@7 ~ [g3,c4,e4]@7 ~",
  G: "[g3,b3,d4]@7 ~ [g3,c4,e4]@6 ~@2", H: "[g3,b3,d4]@2 [g3,c4,e4] ~",
  I: "[[a2,e3,g3,c4,e4]@15 ~ [c4,e4]@15 ~, ~@15 [d3,f#3]@16 ~, ~@15 a3@10 ~@7]/2", // Am7 C D
  J: "[[g3,c4,e4]@15 d#3 [c4,e4]@12 ~@4, [a2,e3]@10 ~@5 [d3,f#3,a3]@13 ~@4]/2", K: "[a2,e3,g3]@3 ~, [c4,e4]@15 ~",
  L: "[d3,f#3,a3,c4,e4]@3 ~", M: "g2 ~ g3 b2 c3 ~ g3 f#2, f#2 ~@15", N: "[[g2,g3,b3,d4]@17 ~@7]/3",
})).s("gm_epiano2").gain(0.63)

// other · rock organ · "ORGAN 3"
const rock_organ = note(`<
  ~@7 A B ~@2 A B ~@6 C D E F ~@2 G H ~@2 G H ~@6 C D E F C D E F ~@2 G H ~@2 G H ~@6 C D E F C D E F ~@3
>`.pickRestart({
  A: "[g6,g7]@2 ~@2 [g6,g7]@2 ~@2 [e6,e7]@2 [d6,d7] ~@3 [a#5,a#6]@2", // G E D A#
  B: "[b5,b6] [d6,d7] [b5,b6] [a5,a6] [b5,b6] [d6,d7] ~@2", C: "[g6,g7] ~ [g6,g7] ~ [g6,g7] ~ [g6,g7] ~",
  D: "[g6,g7]@2 ~@2 [g6,g7]@3 ~ [e6,e7]@2 [d6,d7]@2 [e6,e7]@2 [d6,d7]@2", E: "~@2 [g6,g7] ~ [g6,g7] ~ [g6,g7] ~",
  F: "[g6,g7]@3 ~ [e6,e7]@2 [d6,d7]@2 [e6,e7]@2 [d6,d7]@2 [b5,b6]@2 [d6,d7] ~", // G E D E D B D
  G: "[g5,g6]@2 ~@2 [g5,g6]@2 ~@2 [e5,e6]@2 [d5,d6] ~@3 [a#4,a#5]@2", // G E D A#
  H: "[b4,b5] [d5,d6] [b4,b5] [a4,a5] [b4,b5] [d5,d6] ~@2", // B D B A B D
})).s("gm_rock_organ").gain(0.5)

// drums · kick
const kick = s("bd").struct("<A B@12 C@6 B@12 C@6 B@16 C@6 B@8 D ~@2>".pickRestart({
  A: "~@7 x", B: "x ~@2 x!2 ~@2 x", C: "x!4", D: "x",
})).gain(0.69)

// drums · snare
const snare = s("sd").struct("<A B@12 ~@5 C B@12 ~@5 C B@16 ~@5 C B@7 D ~@3>".pickRestart({
  A: "~@4 x!3 ~", B: "~ x ~ x", C: "~@7 x", D: "~@2 x ~@4 x",
})).gain(0.69)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@18 A ~@17 A ~@21 A ~@7 B ~@3>".pickRestart({
  A: "~@5 x!2 ~", B: "~@3 x!4 ~",
})).gain(0.21)

// drums · hihat
const hihat = s("hh").struct("<~ [x!4]!66 ~@3>").gain(0.69)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~ A B A B A B A B A B A B ~@6 A B A B A B A B A B A B ~@6 A B A B A B A B A B A B A B A B ~@6 A B A B A B A B ~@3
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2",
})).gain(0.21)

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

// drums · ride
const ride = s("rd").struct("<~@13 A@6 ~@12 A@6 ~@16 A@6 ~@8 A ~@2>".pickRestart({
  A: "x",
})).gain(0.69)

stack(bass, epiano2, rock_organ, kick, snare, snare_soft, hihat, hihat_soft, open_hat, ride)