Strudelify

Gimme Little Sign

Brenton Wood

KeyE♭ majorTempo112 bpm
0:00/0:00
// Gimme Little Sign — Brenton Wood
// 112 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 69 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(112/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 F G H I J K L K L K L K L A B C B D E F G H I J K L K L K L K L A B C B D E F G H I J K L K L K L K L K
  L K L K L K L K L M
>`.pickRestart({
  A: "f2@4 ~@2 f2@2 c3 ~ c3@2 c2@2 bb1@2", B: "eb2@4 ~@2 eb2@2 bb1 ~ bb1@2 eb2 ~ eb2 ~",
  C: "f2@4 ~@2 f2 ~ c3 ~ c3@2 c2@2 bb1@2", D: "f2@4 ~@2 f2@2 c3 ~ c3@2 f2 ~ f2@2",
  E: "eb2@4 e2 ~ bb1@2 eb2 ~ eb2@2 bb1@2 eb2 ~", F: "f2@5 ~ c3@5 ~ f2@2 gb2@2", G: "g2@3 d3@2 d2 d3 d2",
  H: "ab2@5 ~ eb2@3 ~ eb2@2 ab2@3 ~", I: "bb2 ~ bb2@3 ~ f2@2 bb2@4 f2@4", J: "bb1 ~@7",
  K: "f2@3 ~ f2@2 c2@2 c3!2 ab2@2 f2@2 c2@2", L: "eb2@5 ~ eb2@2 bb2 ~ bb2@2 eb2@2 e2@2",
  M: "f2@3 ~ f2@2 c2@2 c3!2 ab2@2 f2@2 eb2 ~",
})).s("gm_acoustic_bass").gain(0.72)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  A B C D E F G H I J K L M N O P Q R S T B C D E F G H I J K L M N O P Q R S T B C D E F G H I J K L M N O P Q R S T M
  N O P Q R S T Q R U
>`.pickRestart({
  A: "~@6 bb2 ~@3 c3 ~ eb3@2 ~@2",
  B: "[f2,f3,ab3,c4,f4]@2 ~@2 [ab3,c4,f4] ~ f2@2 [ab3,c4,f4] ~@5 [eb3,ab3,c4,f4]@2, ~@4 f3 f2@3, ~@5 [ab3,c4,f4]@2 ~, ~@3 f3", // Fm Fm7 Fm
  C: "[g3,bb3,eb4] ~@3 [g3,bb3,eb4] ~ eb2 ~ [g3,bb3,eb4] ~@3 eb2@2 [g3,bb3,eb4] ~, eb2@2 ~@3 [eb3,g3,bb3,eb4]@2 eb3", // Eb
  D: "[ab3,c4,f4] ~@3 [ab3,c4,f4] ~ [f3,c4] ~ [ab3,c4,f4] ~@5 [g3,bb3,eb4] ~, f2@4 ~@6 [f2,ab3,c4,f4]@5 ~, ~@3 f3", // Fm F5 Fm Eb Fm
  E: "[g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4]@2 eb2 ~ [eb3,g3,bb3,eb4] ~ [eb3,g3,bb3,eb4]@2 eb2@2 [g3,bb3,eb4] ~, eb2@4 eb3 ~@9 eb3@2", // Eb
  F: "[ab3,c4,f4] ~@3 [ab3,c4,f4] ~@3 [ab3,c4,f4] ~ [f3,ab3,c4,f4]@2 f2@2 [ab3,c4,f4] ~, f2 ~@2 [f2,f3]@2 ~@2 eb3", // Fm F
  G: "[g3,bb3,eb4] ~@3 [g3,bb3,eb4]@2 eb2@2 [eb3,g3,bb3,eb4] ~ [eb2,g3,bb3,eb4]@2 eb3@2 [eb2,g3,bb3,eb4] ~, eb2@3 ~@13", // Eb
  H: "[c3,f3,ab3,c4,f4]@5 ~ [ab3,c4,f4]@3 ~ [ab3,c4,f4] ~ [c4,f4] ~ [ab3,c4,f4] ~, ~@6 [c3,f3]@9 ~", // Fm F5 Fm F5
  I: "[d3,g3,bb3,d4,g4]@5 ~ [d3,g3,bb3,d4,g4]@6 [bb3,d4,g4] ~ [bb3,d4,g4] ~", // Gm
  J: "[eb3,ab3,c4,eb4,ab4]@4 ~@2 [c4,eb4,ab4]@5 ~ [c4,eb4,ab4] ~@3, ~@3 [eb3,ab3]@3 ~@2", // Ab Ab5
  K: "[bb2,f3,bb3,d4,f4,bb4] ~ [bb2,f3,bb3,d4,f4,bb4]@3 ~ [bb2,f3,bb3,d4,f4,bb4] ~ [bb2,f3,bb3,d4,f4,bb4]@3 ~ [bb2,f3,bb3,d4,f4,bb4]@3 ~", // Bb
  L: "[bb3,d4,f4,bb4] ~@15, bb2 ~@7", M: "[c4,f4,ab4] ~@3 [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~ [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~",
  N: "~@2 [eb4,bb4] ~ [gb4,bb4] ~ [g4,bb4] ~ [gb4,bb4] ~ [g4,bb4] ~ [gb4,bb4] ~ [eb4,bb4] ~", // Eb5 Gb Gm Gb Gm Gb Eb5
  O: "[c4,f4,ab4] ~@3 [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~ [f4,ab4]@2 ~@2 [eb4,bb4] ~, ~@10 c4 ~@5", // Fm Eb5
  P: "~@2 [gb4,bb4] ~ [g4,bb4]@2 ~@2 [g4,bb4] ~ [gb4,bb4] ~ [f4,bb4] ~ [eb4,bb4] ~", // Gb Gm Gb Bb5 Eb5
  Q: "[c4,f4,ab4] ~ ab4 ~ [c4,f4,ab4] ~@3 [c4,f4,ab4] ~ [c4,f4] ~@3 [eb4,bb4] ~, ~@5 ab4 ~@2", // Fm F5 Eb5
  R: "~@2 [gb4,bb4] ~ [g4,bb4]@2 ~@2 [g4,bb4] ~ [f4,bb4] ~ bb4@2 ~@2, ~@12 eb4 ~@3", // Gb Gm Bb5
  S: "[c4,ab4]@2 ~@2 [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~ [c4,f4] ~@3 [eb4,bb4]@2, f4 ~@9 ab4@2 ~@4", // Fm F5 Eb5
  T: "~@2 [gb4,bb4] ~ [g4,bb4]@2 ~@2 [g4,bb4] ~ [f4,bb4] ~ [eb4,bb4]@2 ~@2", // Gb Gm Bb5 Eb5
  U: "[c4,ab4]@2 ~@2 [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~ [c4,f4] ~@3 [eb4,bb4] ~, f4 ~@9 ab4@2 ~@4", // Fm F5 Eb5
})).s("gm_piano").gain(0.72)

// chords · rock organ · "ORGAN 3"
const rock_organ = note(`<
  ~ A B C D E F G H I J K L M N O P Q L R A B C D E F G H I J K L M N O P Q L R S T S U@2 T S V W X Y L M N O P Q L R
  Z@2 AA@2 P Q L R P Q AB
>`.pickRestart({
  A: "[ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~ [ab3,c4,eb4]@3 ~ [ab3,c4,eb4] ~@3 [g3,bb3,eb4] ~", // Ab Eb
  B: "~@2 [g3,bb3,eb4] ~ [g3,bb3,eb4]@3 ~ [g3,bb3,eb4] ~ [g3,bb3,eb4]@3 ~ [g3,bb3,eb4] ~", // Eb
  C: "[ab3,c4,eb4] ~@5 [ab3,c4,eb4]@3 ~ [ab3,c4,eb4] ~@3 [ab3,c4] ~, ~@7 eb4", // Ab
  D: "[g3,bb3] ~@3 [g3,bb3,eb4] ~@3 [g3,bb3,eb4]@3 ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~", // Gm Eb
  E: "[ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~ [ab3,c4,eb4]@3 ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~", // Ab
  F: "[g3,bb3,eb4] ~@3 [g3,bb3,eb4] ~ [g3,bb3,eb4]@3 ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~", // Eb
  G: "[ab3,c4,f4]@6 [ab3,c4,f4]@9 ~", H: "[bb3,d4,g4]@3 [bb3,d4,g4]@4 ~", I: "[c4,eb4,ab4]@2 ~ [c4,eb4,ab4]@4 ~",
  J: "[d4,f4,bb4] ~ [d4,f4,bb4]@3 ~ [d4,f4,bb4] ~@3 [d4,f4,bb4] ~ [d4,f4,bb4] ~@3", K: "[d4,f4,ab4] ~@15",
  L: "[c4,f4,ab4] ~@3 [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~ [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~", // Fm
  M: "[bb3,eb4,g4] ~ [bb3,eb4,g4] ~ [bb3,eb4,g4]@3 ~ [bb3,eb4,g4] ~ [bb3,eb4,g4]@3 ~ [bb3,eb4,g4] ~", // Eb
  N: "[c4,f4] ~@3 [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~ [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~", // F5 Fm
  O: "[bb3,eb4,g4]@3 ~ [bb3,eb4,g4] ~ [bb3,eb4,g4] ~ [bb3,eb4,g4] ~ [bb3,eb4,g4] ~ [bb3,eb4,g4]@2 ~@2", // Eb
  P: "[c4,f4,ab4] ~ ab4 ~ [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~ [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~", // Fm
  Q: "[bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~@3 [bb3,eb4,g4]@3 ~ [bb3,eb4,g4] ~ [bb3,eb4,g4] ~", // Eb
  R: "[bb3,eb4,g4] ~@3 [eb4,g4]@2 ~@2 [bb3,eb4,g4] ~ [bb3,eb4,g4] eb4 ~@2 [bb3,eb4,g4] ~, ~@4 bb3 ~@11", // Eb
  S: "~ [f5,f6] [ab5,ab6] [bb5,bb6] [ab5,ab6]@2 [bb5,bb6]@2", T: "[g5,g6]@2 [c6,c7] [bb5,bb6]",
  U: "[[g5,g6]@4 [c6,c7]@2 [bb5,bb6]@3 [f5,f6] [ab5,ab6] [bb5,bb6] [ab5,ab6]@2 [bb5,bb6]@2]/2", // G C Bb F Ab Bb Ab Bb
  V: "[g5,g6]@2 [bb5,bb6] [g5,g6]", W: "[ab5,ab6]@4 [c6,c7]@4 [ab5,ab6]@4 [c6,c7]@3 ~",
  X: "[bb5,bb6]!2 ~ [bb5,bb6]!2 ~ [bb5,bb6]!2 ~ [bb5,bb6]!2 ~ [bb5,bb6]@2 [a4,a5] [b4,c5,d5,e5,f5,b5,c6,d6,e6,f6]", // Bb A Bdim
  Y: "[g5,a5,g6,a6] ~@15, [bb5,bb6] ~@7", // Gsus2 Bb
  Z: "[[c4,f4,ab4,c6,eb6] ~@3 [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~ [c4,f4,ab4]@2 [c6,eb6] ~ [c4,f4,ab4] ~ [bb3,eb4,g4] ~ [bb3,eb4,g4] ~ [bb3,eb4,g4]@3 ~ [bb3,eb4,g4] ~ [bb3,eb4,g4]@2 [g5,bb5] ~ [bb3,eb4,g4,g5,bb5] ~, ~@4 [bb5,d6]@7 ~@3 [g5,bb5]@6 ~@6 [g5,bb5] ~@5]/2", // Fm7 Fm Cm Fm Eb Gm Eb Bb …
  AA: "[[c4,f4,c6,eb6] ~@3 [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~ [c4,f4,ab4]@2 [c6,eb6] ~ [c4,f4,ab4] ~ [bb3,eb4,g4]@3 ~ [bb3,eb4,g4] ~ [bb3,eb4,g4,g5,bb5] ~ [bb3,eb4,g4] ~ [bb3,eb4,g4,g5,bb5] ~ [bb3,eb4,g4]@2 ~@2, ~@4 [bb5,d6]@7 ~@3 [g5,bb5]@6 ~@8 [g5,bb5] ~@3]/2", // F7 Fm Cm Fm Eb Bb Gm
  AB: "[c4,f4,ab4] ~@3 [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~ [c4,f4,ab4]@3 ~ [eb4,g4,bb4] ~", // Fm Eb
})).s("gm_rock_organ").gain(0.56)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~ A B C B A B D E F G H I J I J I J I J A B C B A B D E F G H I J I J I J I J A B C B A B D E F G H I J I J I J I J I
  J I J I J I J I J I
>`.pickRestart({
  A: "~@4 [ab3,c4,f4] ~@7 [ab3,c4,f4] ~@3", B: "~@4 [g3,bb3,eb4] ~@7 [g3,bb3,eb4] ~@3",
  C: "~@4 [ab3,c4,f4] ~@5 [ab3,c4,f4] ~@3 [ab3,c4,f4] ~", D: "[ab3,c4,f4]@4 ~@2 [ab3,c4,f4]@3 ~@3 [ab3,c4,f4] ~@3",
  E: "[bb3,d4,g4]@2 ~ [bb3,d4,g4]@3 ~@2", F: "[c4,eb4,ab4]@2 ~ [c4,eb4,ab4]@3 ~@2",
  G: "[d4,f4,bb4]@4 ~@2 [d4,f4,bb4]@5 ~ [d4,f4,bb4]@2 ~@2", H: "[d4,f4,ab4] ~@7",
  I: "[c4,f4,ab4] ~@3 [c4,f4,ab4] ~@3 [c4,f4,ab4] ~@3 [c4,f4,ab4] ~@3", // Fm
  J: "[bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~@3", // Eb
})).s("gm_acoustic_guitar_steel").gain(0.54)

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

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@68 [~@7 x]>").gain(0.78)

// drums · hihat
const hihat = s("hh").struct("<~ [x!4]!10 [~ x ~ x] [x!4]!18 [~ x ~ x] [x!4]!18 [~ x ~ x] [x!4]!19>").gain(0.78)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~ A@9 B ~ A@17 B ~ A@17 B ~ A@18 C>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~@3 x ~ x ~ x", C: "~ x ~ x ~ x ~@2",
})).gain(0.23)

// drums · mid tom
const mid_tom = s("mt").struct("<~@68 [~@5 x!2 ~]>").gain(0.78)

// drums · open hat
const open_hat = s("oh").struct("<~@10 [~ x ~@6] ~@18 [~ x ~@6] ~@18 [~ x ~@6] ~@20>").gain(0.78)

// drums · ride
const ride = s("rd").struct("<~@7 A@3 B ~ C@8 ~@6 A@3 B ~ C@14 A@3 B ~ C@18 D>".pickRestart({
  A: "x ~@2 x ~@4", B: "x ~ x!2", C: "x!4", D: "x ~ x ~ x ~ x!2",
})).gain(0.78)

stack(
  bass, piano, rock_organ, acoustic_guitar_steel, kick, snare, snare_soft, low_tom, hihat, hihat_soft, mid_tom,
  open_hat, ride
)