Strudelify
Interactive cover art

1998 · Crystal Ball

Interactive

Prince

KeyD minorTempo120 bpm
0:00/0:00
// Interactive — Prince
// 120 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 37 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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.

// other · synth brass 2
const synth_brass_2 = note("<~ A ~ B ~ B ~@5 B ~@7 B ~@15 C ~>".pickRestart({
  A: "[d4,d5] ~@7", B: "~@2 [d4,d5] ~@5", C: "~@5 [c4,c5] ~ [d4,d5]",
})).s("gm_synth_brass_2").gain(0.46)

// bass · slap bass 1
const bass = note("<~ A ~ B ~ C D@2 E@3 F G H I H I J@2 F G H I H I K@3 L@2 M N O@3 P@2>".pickRestart({
  A: "d2@3 ~@13", B: "~@4 d2@3 ~@9", C: "~@2 d2 ~@5", D: "[~@10 c2@2 d2@2 f2@4 d2@3 ~@3 c2@2 b1@2 a1@2 f1@2]/2",
  E: "[d1@2 d2@3 ~ c2@3 ~ c2@2 d2@2 f2@4 d2@3 ~@3 c2@2 b1@2 a1@2 g1@11 ~@7]/3", F: "~@4 c2 b1 a1 f1",
  G: "d1@2 d2@3 ~ c2@2 ~@2 c2@2 d2@2 f2@2", H: "~@2 d2@3 ~@3 c2@2 b1@2 a1@2 f1@2", I: "d1 d2 ~ c2 ~ c2 d2 f2",
  J: "[~@2 d2@3 ~@3 c2@2 b1@2 a1@2 g1@10 ~@8]/2",
  K: "[~@2 d2@3 ~@3 c2@2 b1@2 a1@2 g1@10 ~@6 f1@6 ~ f1@3 g1@2 g1@3 ~ d2@2]/3",
  L: "[~@2 d2@2 c2@2 b1@2 a1@2 c2@2 a1@2 f1@6 ~@2 f1@2 g1 ~ g1@3 ~ d2@2]/2", M: "~ d2 c2 b1 a1 f1 d1 f1",
  N: "~@2 f1 ~@3 f1@2 g1 ~ g1@3 ~ d2@2",
  O: "[~@2 d2@2 c2@2 b1@2 a1@2 c2@2 a1 ~ f1@4 f1@2 ~ f1@2 ~ g1@2 g1@2 ~@2 g1@10 ~@8]/3", P: "[~@5 c2 ~ d2@2 ~@7]/2",
})).s("gm_slap_bass_1").gain(0.46)

// chords · drawbar organ
const drawbar_organ = note("<~ A ~ B ~ B C@2 D E@2 F G H I J K L@2 B M N@2 O@2 P@6 Q@4 R ~>".pickRestart({
  A: "[d5,d6] ~@7", B: "~@2 [d5,d6] ~@5", C: "[~@14 [d5,f5,a5,c6]@8 ~@2 [d5,g5,b5,d6]@7 ~]/2",
  D: "[d5,f5,a5,c6]@5 ~ [d5,g5,b5,d6]@10", E: "[~@2 [d5,f5,a5,c6]@11 ~ [g5,b5,d6,f6]@12 ~@6]/2",
  F: "~@2 [d5,d6] ~@3 [f4,b4]@2", G: "[f4,a4] ~@3 [f4,d5]@2 c5 ~@3 c5@2 d5 ~ f5@2, ~@4 b4 ~@11",
  H: "~ d5 ~@4 [f4,b4]@2", I: "a4 ~@3 [f4,d5]@2 c5 ~@3 c5@2 d5 ~ f5@2", J: "~ d5@2 ~@3 [f4,b4]@2",
  K: "a4 ~@3 [f4,b4,d5]@2 c5 ~@3 c5@2 d5 ~ f5@2", L: "[~ d5@2 ~@4 [g5,b5,d6,f6]@5 ~@4]/2",
  M: "[d5,f5,a5,c6]@7 ~ [d5,g5,b5,d6]@8", N: "[~@2 [d5,f5,a5,c6]@21 ~ [d5,g5,b5,d6]@8]/2",
  O: "[~ [d5,f5,a5,c6]@11 [d5,g5,b5,d6]@4]/2", // Dm7 G
  P: "[~@2 [d5,f5,a5,c6]@11 ~ [g5,b5,d6,f6]@10 ~@6 [f5,a5,c6]@9 ~ [g5,b5,d6]@5 ~ [a5,c6,d6,f6]@15 ~ [f5,a5,c6]@8 ~@2 [g5,b5,d6]@5 ~ [c6,d6]@4 d6@2 ~@2 d6@2 ~@4 f6@2 a5 ~, ~@14 e6 ~@63 a5@16 ~@2, ~@78 f6@6 c6@4 d6@7 ~, ~@86 f6@4 c6@5 ~]/6", // Dm7 G7 F G Dm7 F G Csus2
  Q: "[[f5,a5,c6]@7 ~ [g5,b5,d6]@5 ~ d6@12 c6@2 d6@2 [f5,a5,c6]@7 ~ [g5,b5,d6]@7 ~ [g5,b5,d6,f6]@11 ~@7, ~@14 [a5,f6]@15 ~@35, ~@14 c6@11 ~@39, ~@14 e6 ~@49]/4", // F G F G G7 Dm
  R: "~@5 [e5,g5,c6] ~ [f5,a5,d6]", // C Dm
})).s("gm_drawbar_organ").gain(0.36)

// other · lead 1 square
const lead_1_square = note(`<
  ~
  [d6 ~ d6 ~ d6 ~ d6 ~ d6 ~ d6 ~ d6 ~ d6 ~]!6
  ~@27
  [d6 ~ d6 ~ d6 ~ d6 ~ d6 ~ d6 ~ d6 ~ d6 ~]!2
  ~
>`).s("gm_lead_1_square").gain(0.41)

// drums · kick
const kick = s("bd").struct("<~ A ~ B ~ B C D E D ~ F D E D E D E ~ F D E D E D E G H E H I H I J@2 K ~>".pickRestart({
  A: "x", B: "~ x ~@2", C: "~@5 x!3", D: "x ~@3 x ~@2 x", E: "~ x ~@2 x!2 ~ x", F: "~@2 x ~@2 x ~ x", G: "~@4 x ~@2 x",
  H: "~ x ~ x ~ x ~ x", I: "~ x ~@2 x ~@3", J: "x!2", K: "~@5 x ~ x",
})).gain(0.36)

// drums · snare
const snare = s("sd").struct("<~ A ~ B ~ B C D@3 E F D@6 E F D@6 C D@3 G D G H E I ~>".pickRestart({
  A: "x", B: "~ x ~@2", C: "~@5 x!2 ~", D: "~ x ~ x", E: "~ x", F: "~ x!3", G: "~@2 x ~@2 x!2 ~", H: "~ x!2 ~@2 x!2 ~",
  I: "~@5 x ~ x",
})).gain(0.51)

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

// drums · hihat
const hihat = s("hh").struct("<A B ~ C ~ C D E@3 A F E@6 A F E@6 G A@8 G ~>".pickRestart({
  A: "x!4", B: "x", C: "~ x ~@2", D: "~@5 x!3", E: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2", F: "x ~ x!5 ~", G: "x!3 ~",
})).gain(0.2)

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

// drums · open hat
const open_hat = s("oh").struct("<~@11 A ~@7 A ~@8 B ~@5 C ~@2>".pickRestart({
  A: "~@7 x", B: "~@13 x ~@2", C: "~ x ~@14",
})).gain(0.2)

// drums · high tom
const high_tom = s("ht").struct("<~@6 [~@5 x ~@2] ~@30>").gain(0.2)

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

// drums · ride
const ride = s("rd").struct("<~@10 x ~@7 x ~@7 x ~@10>").gain(0.26)

stack(
  synth_brass_2, bass, drawbar_organ, lead_1_square, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash,
  ride
)

More by Prince