Strudelify

Hold My Body Tight

East 17

KeyA minorTempo98 bpm
0:00/0:00
// Hold My Body Tight — East 17
// 98 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 94 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(98/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 · fretless bass · "FRETLESS"
const bass = note(`<
  ~ A B C D E F G H E F G I E J K L G M N O P Q R S A B C D E F G H E F G I E J K L G M N O P Q R S A B C D E F G H E F
  G I E J K T G M N O P Q R S A B C D E F G H A B C D E F G H U@3 ~@2
>`.pickRestart({
  A: "f1 ~ f1@2 ~@3 f1!2 ~ f1@3 ~@3", B: "e1@2 e1@3 ~@2 e1 e1@2 e1@2 g1@2 g#1@2", C: "a1 ~ a1@2 ~@3 a1!2 ~ a1@3 ~@3",
  D: "g1@2 g1@3 ~@2 g1 g1@2 e2@2 d2 b1 g1@2", E: "f1@3 ~@4 f1!2 ~ f1@3 ~@3", F: "e1@4 ~@3 e1 e1@2 e1@2 g1@2 g#1@2",
  G: "a1@3 ~@4 a1!2 ~ a1@3 ~@3", H: "g1@4 ~@3 g1 g1@2 a1@2 g1 ~ e1@2", I: "g1@3 ~@4 g1 g1@2 g1@2 a1@2 g1@2",
  J: "e1@4 ~@3 e1 e1@2 e1@2 g1 e1 g#1@2", K: "a1@3 ~@4 g1 a1 ~ a1@2 a1@2 ~ g1", L: "a1@4 ~@3 g1 a1@2 a1@2 c2@2 a1 g1",
  M: "a1@4 ~@3 a1 a1@2 a1@2 a1 ~ e1@2", N: "d1@3 ~@4 d1!2 ~ d1@3 ~@3", O: "d1@4 ~@3 d1 d1@2 d2@2 c2@2 a1@2",
  P: "f1@4 ~@3 f1 f1@2 f1@4 ~@2", Q: "f1@2 f1@3 ~@2 f1 f1@2 f1@4 ~@2", R: "g1@4 ~@3 g1 g1@2 g1@4 ~@2",
  S: "g1@2 g1@3 ~@2 g1 g1@2 ~@2 g1@4", T: "~@10 a1@2 c2@2 a1 g1", U: "[f1@41 ~@7]/3",
})).s("gm_fretless_bass").gain(0.6)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~ A B C D A B C D A E C D A F G@2 H I J@2 K@2 L M A B C D A B C D A E C D A F G@2 H I J@2 K@2 L M A B C D A B C D ~@8
  H I J@2 K@2 L M A B C D A B C D A B C D A B C D N O@4
>`.pickRestart({
  A: "[f2,f3,a3,c4,e4]", B: "[e2,e3,g#3,b3,d4]@3 [e2,g#3,b3,d4]", C: "[a2,e3,a3,c4]@13 g2 e3@2", D: "[g2,g3,b3,d4]",
  E: "e3@3 [e3,e4] [g#3,g#4]@2 [f3,f4]@2, [e2,b3,d4]@3 ~, g#3 ~", F: "d4@2 d4 [e2,g#3,c4], [e2,e3,g#3,b3]@3 ~",
  G: "[[a2,e3,a3,c4]@14 ~@9 d4 e4@2 [e3,c4,a4]@3 [a2,e3,c4,a4]@2 ~, ~@14 [a2,d3,g3,b3]@12 a2 ~@5]/2", // Am G
  H: "[e3,c#4,a4], a2@3 ~", I: "[e3,a3,c#4]@7 ~, a2", J: "[d2,d3,f3,a3,c4]@15 ~", K: "[f2,c3,f3,g#3,c4]@15 ~",
  L: "[g2,c3,f3,a3]@3 [g2,c3,f3,a3] [g2,d3,g3,b3]@4", M: "[g2,g3,c4]@2 [g2,g3,d4] ~",
  N: "e4 c5 ~ d4 b4 c4 ~ a4 b3 g4 ~ a3 f4 ~ g3 e4",
  O: "[~ f3 d4 ~ e3 c4@2 d3@2 b3@2 c3@2 a3@2 b2@2 g3@2 a2@2 ~ f3@2 ~@4 e4@23 ~@13, ~@12 a3@13 ~@7, ~@25 a2@25 ~@14, ~@27 e3@24 ~@13]/4",
})).s("gm_piano").gain(0.52)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~ A@2 ~@2 A@2 B C D ~@2 E F ~@3 G@2 H@2 I ~@3 A@2 ~@2 A@2 B C D ~@2 E F ~@3 G@2 H@2 I ~@3 A@2 ~@2 A@2 B C ~@8 G@2 H@2
  I ~@3 A@2 ~@2 A@2 B C A@2 ~@2 A@2 B C ~@5
>`.pickRestart({
  A: "e3 ~ e3 ~@5 e3 ~ e3 ~@5", B: "[a4,a5] ~@3 [a4,a5] ~@3 [a4,a5] ~@3 [a4,a5] ~@3",
  C: "[a4,a5] ~@3 [a4,a5] ~@3 [a4,a5] ~@3 [a4,a5] ~ g4@2", D: "[a4,a5] ~@15",
  E: "e4@2 d4 e4 d4@2 c4 d4 c4@2 b3 c4 b3@2 c4 b3", F: "a3@15 ~", G: "~@2 [a4,e5] ~@3 [a4,e5] ~ [a4,e5] ~@7",
  H: "d7 ~ c7 ~ d7 ~@3 d7 ~ c7 ~ d7 ~@3", I: "c6 ~ c6 ~ g#5@2 ~ [g3,g5] [g#3,g#5] [g3,g5] [g#3,g#5]@4 ~@2",
})).s("gm_string_ensemble_1").gain(0.38).pan(0.4)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@5 A B C ~@2 D E@2 ~@4 F G H I J K L M ~@4 A B C ~@2 D E@2 ~@4 F G H I J K L M ~@4 A B C ~@9 F G H I J K L M ~@4 A B
  C ~@5 A B C ~ N O@4
>`.pickRestart({
  A: "[f6,a6]", B: "[e6,g#6]@3 [a5,f6]", C: "[c6,e6]", D: "~@2 g#4 f4", E: "[e4@15 ~]/2",
  F: "[e3,e4] [a#3,a#4] [a3,a4]@2", G: "[e3,e4] [a#3,a#4] [a3,a4] [d4,d5]", H: "[c4,f4,a4]",
  I: "[f3,f4] [g3,g4] [f3,f4] [g3,g4]", J: "[g#3,g#4] ~", K: "~ a#3 g#3 [g#3,f4]", L: "[a3,f4] [b3,g4]",
  M: "[c4,a4] [d4,b4]", N: "~@2 b5@5 a5@4 g5@2 ~ f5@2",
  O: "[e5@3 ~ d5@3 c5@2 ~ b4@4 ~ a4@4 g4@5 ~ [a3,a4,a7]@27 ~@12]/4", // A
})).s("gm_string_ensemble_2").gain(0.48).pan(0.6)

// other · pad poly · "POLYSYNTH"
const pad_poly = note("<A B C D@2 B C E@2 ~@6 F ~@23 F ~@54>".pickRestart({
  A: "~@4 g5@4 a5@4 b5@3 ~", B: "c6@3 d6", C: "b5@3 a5", D: "[e5@5 g5 a5 b5]/2", E: "[e5@5 ~@3]/2",
  F: "~ a4@7, ~ e4@6 ~, ~ c4@5 ~@2",
})).s("gm_pad_poly").gain(0.41).pan(0.3)

// other · lead 8 bass lead · "BASS&LEAD"
const lead_8_bass_lead = note("<~ A@8 ~@16 A@8 ~@16 A@8 ~@16 A@16 ~@5>".pickRestart({
  A: "~ d5 ~@2",
})).s("gm_lead_8_bass_lead").gain(0.34).pan(0.8)

// other · lead 8 bass lead · "BASS&LEAD" · soft notes
const lead_8_bass_lead_soft = note(`<
  ~ A B A@3 B A@2 ~@16 A B A@3 B A@2 ~@16 A B A@3 B A@2 ~@16 A B A@3 B A@3 B A@3 B A@2 ~@5
>`.pickRestart({
  A: "~@8 c5@3 ~@5", B: "~@4 c5 ~@3",
})).s("gm_lead_8_bass_lead").gain(0.2).pan(0.8)

// other · lead 4 chiff · "CHIFFRLEAD"
const lead_4_chiff = note("<~@3 A B ~@9 C@3 ~@10 A B ~@9 C@3 ~@10 A B ~@22 A B ~@6 A B ~@9>".pickRestart({
  A: "~@4 a6 c7 a6 c7@3 a6@2 ~@4", B: "~@4 a6 c7 a6 ~ d7@2 c7 a6@2 ~@3",
  C: "[~@10 a6 g6 a6 g6 c7 a6@8 ~@3 a6 g6 a6 g6 c7 a6@3 ~@14]/3",
})).s("gm_lead_4_chiff").gain(0.29).pan(0.4)

// chords · distortion guitar · "DISTORTION" · E5 G5 G#5 A5 G5 F5 E5 G5 …
const distortion_guitar = note(`<
  ~@58
  [~@7 [e2,b2] [e2,b2]@2 [e2,b2]@2 [g2,d3]@2 [g#2,d#3]@2]
  [[a2,e3]@3 ~@13]
  [~@7 [g2,d3]]
  [[f2,c3] ~@7]
  [~@7 [e2,b2]@2 ~ [e2,b2] ~ [g2,d3]@2 [g#2,d#3] ~]
  [[a2,e3] ~@15]
  ~@30
>`).s("gm_distortion_guitar").gain(0.54).pan(0.6)

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

// drums · rim
const rim = s("rim").struct("<A ~@3 B ~@9 B ~@13 B ~@9 B ~@13 B ~@9 B ~@13 B ~@7 B ~@9>".pickRestart({
  A: "~@5 x ~@2", B: "~@11 x ~@4",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct("<[~ x!5 ~@6 x ~@3] [~ x ~ x]!63 [~@3 x] [~ x ~ x]!24 ~@5>").gain(0.6)

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

// drums · low tom
const low_tom = s("lt").struct("<A ~@15 B ~@7 C ~@15 B ~@7 C ~@15 D ~@7 C ~@21>".pickRestart({
  A: "~@14 x!2", B: "~@5 x ~@2", C: "~@2 x!2", D: "~@9 x ~@5 x",
})).gain(0.6)

// drums · open hat
const open_hat = s("oh").struct("<~ A@18 B A@4 ~ A@18 B A@4 ~ A@15 ~ A@2 B A@4 ~ A@16 ~@5>".pickRestart({
  A: "~@7 x", B: "~@5 x ~ x",
})).gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<A ~@7 B ~@7 C ~ B ~@13 B ~@7 C ~ B ~@13 B ~@7 D ~ B ~@13 B ~@7 B ~@5>".pickRestart({
  A: "~@6 x ~ x ~@2 x ~ x ~@2", B: "~@11 x!2 ~ x ~", C: "~@9 x ~@6", D: "~@7 x",
})).gain(0.38)

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

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ A@23 B A@23 B A@15 ~ A@7 B A@16 ~@5>".pickRestart({
  A: "x!16", B: "x!8 ~@8",
})).gain(1.14)

stack(
  bass, piano, string_ensemble_1, string_ensemble_2, pad_poly, lead_8_bass_lead, lead_8_bass_lead_soft, lead_4_chiff,
  distortion_guitar, kick, rim, snare, hihat, low_tom, open_hat, mid_tom, crash, cabasa
)

More by East 17