Strudelify

Rock Steady

The Whispers

KeyF minorTempo118 bpm
0:00/0:00
// Rock Steady — The Whispers
// 118 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 116 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(118/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 · "SLAPBASS 1"
const bass = note(`<
  ~ A B C D C E C F G H C I G H C I J K L M J N O ~ G P C Q G R C Q G H C I G H C I J K L M J N O ~ G P C Q G R C Q G P
  C Q G R C Q J S L M J N O ~ T U V W X U V Y J K L M J N O ~ G P C Q G R C Q G P C Q G R C Q G P C Q G R C Q Z@2 AA
>`.pickRestart({
  A: "c2@2 ~@4 gb2@2 g2@3 ~@5", B: "f2@4 ~@2 f1 ~ g1!2 a1 ~ bb1 ~ b1@2", C: "c2 ~@2 gb2 g2 ~@3",
  D: "f2@4 ~@2 c2 ~ f2!2 eb2 ~ d2@2 bb1@2", E: "f2@4 ~@4 f1!2 g1 ~ a1@2 bb1 ~", F: "f2@4 ~@4 f2 bb1@2 ~ bb1@2 ~@2",
  G: "c2@3 ~@3 gb2@2 g2@2 ~@6", H: "f2@3 ~@3 f1@2 f2@2 ~@2 bb1!2 b1@2", I: "f2@4 ~@4 g1!2 a1@2 bb1@2 b1@2",
  J: "f1@4 ~@2 c2 eb2 f2 ~ f2 ~ eb2 c2 ~@2", K: "~@6 c2 ab1 bb1@2 ab1 ~ bb1 ab1 c2@2",
  L: "f1@4 ~@2 f1 [a1,b1] c2 ~@3 c2 a1 ~@2", M: "f1@5 ~ f1 ~ f2 ~ f2@2 ~ f1 f2 ~",
  N: "f1@4 ~@2 f1 f2!2 ~ c2@2 ~ f1 ~@2", O: "[f1,f2]@5 ~ [gb1,gb2]@10", P: "f2@3 ~@3 f1@2 f2@2 ~@2 eb2 c2 bb1@2",
  Q: "f2@4 ~@4 g1!2 ab1 ~ bb1 ~ b1 ~", R: "f2@3 ~@3 f1@2 f2@2 ~@2 eb2 c2 bb1 ~",
  S: "~@6 c2 ab1 bb1@2 ab1@2 bb1 ab1 c2@2", T: "c2 ~@5 gb2@2 g2 ~@7", U: "f2 ~@5 c2 ~ f2 ~ f2 ~ eb2@3 ~",
  V: "c2 ~@5 gb2 ~ g2 ~@5 c2 ~", W: "f2 ~@15", X: "c2 ~@5 gb2@2 g2 ~@5 c2 ~", Y: "f2 ~@7", Z: "[f2@5 ~ gb2@24 ~@2]/2",
  AA: "c2@3 ~@13",
})).s("gm_acoustic_bass").gain(0.64)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~ A B C D E F C G ~@2 H I ~@2 H I J K ~ L M K N@2 ~ O H P ~ O C Q ~@2 H I ~@2 H I J K ~ L M K N@2 ~ O H P ~ R C Q ~ O
  H P ~ O C Q J K ~@2 M K N@2 ~@8 J K ~ L M K N@2 ~ O H P ~ R C Q ~ O H P ~ R C Q ~ O H P ~ R C Q S@2 T
>`.pickRestart({
  A: "[g3,bb3,d4,f4]@3 ~", // Gm7
  B: "[f3,ab3,c4,eb4]@4 ~@2 [ab3,c4,eb4]!2 [bb3,d4,f4] [c4,eb4,g4] ~ [bb3,d4,f4] [c4,eb4,g4]@3 ~", // Fm7 Ab Bb Cm Bb Cm
  C: "[g3,bb3,d4,f4]@7 ~", D: "[f3,ab3,c4,eb4]@3 ~", E: "[g3,bb3,d4,f4]@13 ~@3",
  F: "[f3,ab3,c4,eb4]@5 ~ [ab3,c4,eb4]!2 [bb3,d4,f4] [c4,eb4,g4] ~ [bb3,d4,f4] [c4,eb4,g4]@4", // Fm7 Ab Bb Cm Bb Cm
  G: "[f3,ab3,c4,eb4]@13 ~@3", H: "[g3,bb3,d4,f4]@15 ~", I: "[f3,ab3,c4,eb4]@15 ~",
  J: "[f3,ab3,c4,eb4]@11 ~ [c4,eb4]@2 [f3,bb3,d4] [eb3,ab3,c4], ~@12 g3 ~@3", K: "[eb3,ab3,c4] [f3,bb3,d4] ~@14",
  L: "~@8 eb4 ~ eb4 ~ eb4!2 ~@2", M: "[f3,ab3,c4,eb4]@10 ~@2 [g3,eb4]@2 [f3,bb3,d4] [eb3,ab3,c4], ~@12 c4 ~@3",
  N: "[[f3,ab3,c4,eb4,g4]@5 ~ [gb3,bb3,db4,f4,ab4]@22 ~@4]/2", // Fm7 Gbmaj7
  O: "[f3,ab3,c4,eb4]@5 ~ [c4,eb4,g4]!2 [bb3,d4,f4] [c4,eb4,g4]@2 [bb3,d4,f4] [c4,eb4,g4]@3 ~", P: "[f3,ab3,c4,eb4]",
  Q: "[f3,ab3,c4,eb4]@7 ~", // Fm7
  R: "[f3,ab3,c4,eb4]@4 ~@2 [c4,eb4,g4]!2 [bb3,d4,f4] [c4,eb4,g4]@2 [bb3,d4,f4] [c4,eb4,g4]@3 ~", // Fm7 Cm Bb Cm Bb Cm
  S: "[[c4,eb4,g4]@2 ~ [db4,f4,ab4]@12 ~]/2", T: "[c4,eb4,g4] ~@15",
})).s("gm_piano").gain(0.64)

// chords · lead 1 square · "SQUAREWAVE"
const lead_1_square = note(`<
  ~ A ~@3 B ~@19 C ~@3 B ~@19 C ~@3 B ~@3 C ~@3 B ~@27 C ~@3 B ~@3 C ~@3 B ~@3 C ~@3 B ~@6
>`.pickRestart({
  A: "~@4 [g4,c5,eb5]@3 ~ [f4,bb4,d5]@5 ~@3", B: "~@4 [g4,c5,eb5]@3 ~ [f4,bb4,d5]@6 ~@2",
  C: "~@4 [g4,c5,eb5]@3 ~ [f4,bb4,d5]@8", // Cm Bb
})).s("gm_lead_1_square").gain(0.52)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@3 A B ~@2 C D ~@4 E ~@3 F@2 G@2 H@2 I ~ J ~@2 K J ~@2 L ~@4 E ~@3 H@2 G@2 H@2 I ~ J ~@2 K J ~@2 L J ~@2 K J ~@2 L
  ~@12 M ~@3 H@2 G@2 H@2 I ~ J ~@2 K J ~@2 L J ~@2 K J ~@2 L J ~@2 K J ~@2 L ~@3
>`.pickRestart({
  A: "[g3,bb3,d4,f4]@15 ~", B: "[f3,ab3,c4,eb4]", C: "[g3,bb3,d4,f4]", D: "[f3,c4,eb4]@7 ~, ab3 ~@7",
  E: "~@2 c6 ~@3 c6 ~ g4@6 ~@2", F: "[[c4,eb4,g4]@23 ~ [c4,d4,f4]@8]/2", G: "[[c4,eb4,g4]@24 [c4,d4,f4]@7 ~]/2",
  H: "[[c4,eb4,g4]@23 ~ [c4,d4,f4]@7 ~]/2", I: "[c4,eb4,g4]@5 ~ [db4,f4,ab4]@10", J: "~@2 c6 ~@3 c6 ~@3 c6 ~@5",
  K: "[c4,eb4]@15 ~", L: "[c4,eb4]@7 ~", M: "~@2 c6 ~@3 c6 ~@5 g4@4",
})).s("gm_string_ensemble_1").gain(0.24)

// chords · string ensemble 1 · "STRINGS" · soft notes
const string_ensemble_1_soft = note(`<
  ~@9 A ~@3 B ~@13 C D ~@3 D A ~@3 B ~@13 C D ~@3 D ~@2 C D ~@3 D ~@12 E ~@13 C D ~@3 D ~@2 C D ~@3 D ~@2 C D ~@3 D ~@3
>`.pickRestart({
  A: "~@3 [g4,c5,d5,f5,g5,bb5]@3 ~@2", B: "~@9 g5@6 ~, ~@4 [c5,d5,f5,bb5]@3 ~", C: "[bb4,d5,f5]@7 ~", D: "ab3@7 ~",
  E: "~@3 [c5,d5,f5,bb5]", // Bb
})).s("gm_string_ensemble_1").gain(0.08)

// chords · brass section · "BRASS 1"
const brass_section = note(`<
  ~ A ~@2 B C ~@11 D ~@3 E ~ F@2 ~@16 D ~@3 E ~ F@2 ~@16 D ~@3 E ~ G ~@9 D ~@3 E ~ F@2 ~@27
>`.pickRestart({
  A: "[c5,c6]@3 ~@9 [bb4,bb5]@3 ~", B: "~@13 [g4,g5] [bb4,bb5] [b4,b5]", C: "[c5,c6]@3 ~@9 [eb5,eb6]@2 ~@2",
  D: "~@2 [eb5,g5] ~@5, ~@4 ab4 ~@11", E: "~@2 [ab4,c5,eb5,g5] ~@5",
  F: "[[ab4,c5,eb5,g5]@2 ~ [gb4,bb4,db5,f5,ab5]@7 ~@6]/2", G: "[ab4,c5,eb5,g5] ~@3",
})).s("gm_brass_section").gain(0.64)

// chords · brass section · "BRASS 1" · soft notes
const brass_section_soft = note("<~@17 A ~@23 A ~@23 A ~@15 A ~@34>".pickRestart({
  A: "~@2 c5 ~@5",
})).s("gm_brass_section").gain(0.4)

// chords · piano · "A.PIANO 2"
const piano_2 = note("<~@65 A B C D E F G@2 ~@43>".pickRestart({
  A: "[eb3,f3]@9 ~@2 eb3 c4@2 c4@2, [ab3,c4]@7 ~@5 g3 ~ f3 ~", B: "[eb3,c4] f3 ~@8 eb4!2 ~ eb4 ~ eb4",
  C: "[eb4,bb4,eb5] [eb4,c5] [bb4,eb5] [eb4,bb4] ~ [eb4,bb4,eb5] ~@3 gb5 f5 eb5 ~@2 ab4 g4, ~@8 [g5,bb5]@3 ~@5", // Eb5 Cm Eb5 Gm
  D: "g4@5 ~@2 eb4 c4 ab3 c4 d4 eb4 f4 d4 bb3, f4 ~@15", E: "[g3,c4] ab3@10 ~ [g3,c4] ~ [f3,c4] ~, ~ bb3@2 ~@13",
  F: "[eb3,c4] f3 ~@8 [c4,c5]!2 [eb4,eb5] ~ [f4,f5] ~", G: "[g4@2 [f4,f5] ~ [eb4,eb5] ~ [ab4,ab5]@14 ~@12, g5 ~@31]/2",
})).s("gm_piano").gain(0.64)

// drums · kick
const kick = s("bd").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 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
>`.pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x ~@5 x ~ x ~ x!2 ~@4", C: "x",
})).gain(0.8)

// drums · snare
const snare = s("sd").struct("<A B@23 C B@23 C B@23 C B@15 C B@25 D E>".pickRestart({
  A: "~@8 x!8", B: "~ x ~ x", C: "~@4 x ~@7 x ~ x!2", D: "~@4 x ~@7 x!4", E: "x",
})).gain(0.8)

// drums · clap
const clap = s("cp").struct("<~@25 A@8 ~@16 A@22 ~@2 A@14 ~@2 A@24 ~@3>".pickRestart({
  A: "~ x ~ x",
})).gain(0.8)

// drums · low tom
const low_tom = s("lt").struct("<[~@14 x!2] ~@115>").gain(0.8)

// drums · hihat
const hihat = s("hh").struct("<~ [x!8]!113 [x!5 ~ x ~] x>").gain(0.8)

// drums · mid tom
const mid_tom = s("mt").struct("<[~@12 x!2 ~@2] ~@113 [~@10 x ~@2 x ~@2] ~>").gain(0.8)

// drums · high tom
const high_tom = s("ht").struct("<[~@8 x!4 ~@4] ~@113 [~@8 x!2 ~@6] ~>").gain(0.8)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@3 A ~@11 A ~@3 A ~ B ~ A ~@3 A ~@11 A ~@3 A ~ B ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~ A ~ B ~ A ~@3 A ~@3 A ~@3 A ~
  B ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 B ~@2
>`.pickRestart({
  A: "x", B: "x ~@2 x ~@4",
})).gain(0.8)

stack(
  bass, piano, lead_1_square, string_ensemble_1, string_ensemble_1_soft, brass_section, brass_section_soft, piano_2,
  kick, snare, clap, low_tom, hihat, mid_tom, high_tom, crash
)

More by The Whispers