Strudelify
KeyC majorTempo66 bpm
0:00/0:00
// Again — Janet Jackson
// 66 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 1 "bass notes" named as a bass, played on electric bass finger (its piano patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 61 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(66/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · "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 · electric bass finger · "bass notes"
const bass = note("<A@6 B@4 C@7 D@5 B@4 C@7 D@5 E@5 F@3 G@7 H@4 I@2 J@2>".pickRestart({
  A: "[~@11 f2, c3@2 c3 c3 c3@2, ~@2 g2@7 g2@5 g2@4 g2@6, ~@2 a2@3 a2@4 ~ a2@2, ~@6 f2@5 f2@8 ~@5]/6",
  B: "[~@7 d2, c3 c3@2 a2, ~ g2@5 g2@8 ~@2, ~ a2@3 c2@4, ~@3 f2@7 e2@6]/4",
  C: "[~@13 a#2, d2@11 d2@15 b2@16 ~@6 b2@8, ~@4 e2@15 e2@21 a#2@24 a#2@32 ~@16, ~ f2 f2@2 b2@2 a2@4 c3@4, ~@3 g2@3 c2@8 ~@4 f2@8 ~@2]/7",
  D: "[~@9 f2, a2@4 g2@3 g2@3, ~ b2@8 ~ d3@8 ~@2, ~ a#2@2 c3@2, ~@3 f2@4 ~ a2@2]/5",
  E: "[~@7 d2@3, c3 c3@2 a2@2, ~ g2@5 g2@8 ~@6, ~ a2@3 c2@4 ~@2, ~@3 f2@7 e2@8 ~@2]/5",
  F: "[~@7 g2@5, ~ a2 f2@2, ~@7 c3@16 ~, ~ d2@2, ~@5 e2@7]/3",
  G: "[~@13 f2, f2 c3@2 c3 c3 c3@2, ~@3 e2@21 g2@28 g2@20 g2@16 g2@24, ~@3 d2@13 a2@12 a2@16 ~@4 a2@8, ~@2 c2@8 f2@5 f2@8 ~@5]/7",
  H: "[~@2 c2 c2, c3 c3@2 ~, ~ g2@5 g2@8 ~@2, ~ a2@4 ~@3, ~@3 f2@8 ~@5]/4", I: "c2", J: "c2/2",
})).s("gm_electric_bass_finger").gain(0.37)

// other · piano · "accomp 1"
const piano = note(`<
  A B C D E F G H I J K L M N O P M Q O R S T G H I U K V M W O P M Q O R S T G H I X@3 Y@2 Z AA AB AC A AD AE AF AG AH
  AI@2 AJ AK@2
>`.pickRestart({
  A: "c5 b4", B: "c5@2 a4 ~", C: "e5 ~@3 d5 ~@3 c5 ~@3 f5 ~@3", D: "c5 a4", E: "g4@3 ~@5 d4@8", F: "c4@2 a3 ~",
  G: "c4@2 ~@2 b3@2 ~@2 g3@2 ~@2 a3 ~@3", H: "~ c4@2 ~ c4@2 ~@2", I: "c4 ~@3 d4 ~@3", J: "e4 ~@3 e4@3 ~",
  K: "c4@2 ~@2 c4@2 ~@2 a3@2 ~ f3@2 ~@3", L: "f4@3 e4@3 d4@2 c4@4 ~@4", M: "d4@4 d4 ~@3",
  N: "a3@2 a3 c4 d4@2 g4 a4 b4@2 g4@2 d5@2 d4 e4", O: "d4@2 ~@5 a3@9", P: "c4@2 ~@2 c4@7 ~@5",
  Q: "a3@3 ~ b3@2 b4 a4 b4@2 g4@2 d5@2 ~@2", R: "a3@2 g3@2 f3@2 g3 ~", S: "e4@2 e5 g5 a5 g5 d5@2",
  T: "g4 b4 c5 ~@5 c4 d4 e4@2 f4 e4 d4 c4", U: "e4 ~@3 e4@2 ~@2", V: "f4@3 e4@3 d4@2 c4@3 ~@5", W: "a3 ~ d4 ~@5",
  X: "[e4 ~@3 a4@18 ~@2]/3", Y: "[c4@2 ~@2 c4@3 ~ a3@4 f3@16 ~@4]/2", Z: "f4@3 e4@3 d4@2 c4@8", AA: "e4 d4",
  AB: "e4@8 c4@3 ~ c5 g4 d5@2", AC: "c5 ~@3 b4 ~@3 a4 ~@3 a4 ~@3", AD: "e4 g4", AE: "e4@8 c4 ~@3 c4@2 d4@2",
  AF: "c4 ~@3 d4 ~@3 a3@2 ~@2 c4 ~@3", AG: "c4 g3", AH: "g3", AI: "f4", AJ: "g4", AK: "g4/2",
})).s("gm_piano").gain(0.37)

// other · piano · "accomp 2"
const piano_2 = note("<A B ~ C D E ~ F G H I J G K L M ~@45>".pickRestart({
  A: "e5 d5", B: "e5@2 c5 ~", C: "e5 c5", D: "c5@3 ~@5 b3@8", E: "g3 ~", F: "~@2 a3 ~", G: "~@4 b3 ~@3",
  H: "c4 ~@3 a3@3 ~", I: "a3 ~ g3 ~@5", J: "a3@3 g3@3 f3@2 e3@4 ~@4", K: "f3 ~ g3 ~@5", L: "b3 ~@7", M: "a3 ~@7",
})).s("gm_piano").gain(0.37)

stack(bass, piano, piano_2)

More by Janet Jackson