Strudelify
So What cover art

1992 · The Antidote

So What

Ronny Jordan

KeyA minorTempo110 bpm
0:00/0:00
// So What — Ronny Jordan
// 110 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (2/4 at bar 1, 4/4 at bar 2) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 54 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(110/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, A@4 for four bars: edit a riff to change every repeat.

// bass · fretless bass · "Bass"
const bass = note(`<
  ~@5 A B@2 C D E@2 F A B@2 G A B@2 A@2 B@2 C D H@2 I A B@2 G A B@2 A@2 B@2 C D E@2 F A B@2 G ~@5
>`.pickRestart({
  A: "d2 ~ d2 ~@6 d2 ~ d2 ~@5 a1 ~@2 c2 e2@2 c2",
  B: "[d2 ~ d2 ~@6 d2 ~ d2 ~@5 d2 g2@3 f2@2 ~ d2 ~ d2 ~@6 d2 ~ d2 ~@5 a1 ~@2 c2 e2@2 c2, ~@23 c2@2 ~@23]/2",
  C: "d2 ~ d2 ~@6 d2@2 d2 ~@5 a#1 ~@2 c#2 f2@2 c#2", D: "d#2@2 d#2 ~@6 d#2@2 d#2 ~@5 a#1 ~@2 c#2 f2 ~ c#2",
  E: "[d#2@2 d#2 ~@6 d#2@2 d#2 ~@5 d#2 g#2@3 f#2@2 ~ d#2@2 d#2 ~@6 d#2@2 d#2 ~@5 a#1 ~@2 c#2 f2 ~ c#2, ~@23 c#2@2 ~@23]/2",
  F: "d#2@3 ~@3 f#1@6 g#1@5 ~ a#1@6, ~@5 d#2@2 ~@17", G: "d2@3 ~@3 f1@6 g1@5 ~ a1@6, ~@5 d2@2 ~@17",
  H: "[d#2@2 d#2 ~@6 d#2@2 d#2 ~@5 d#2 g#2@3 f#2@2 ~ d#2 ~ d#2 ~@6 d#2@2 d#2 ~@5 a1 ~@2 c2 e2@2 c2, ~@23 c#2@2 ~@23]/2",
  I: "d#2 ~ d#2 ~@6 d#2@2 d#2 ~@5 a1 ~@2 c2 e2@2 c2",
})).s("gm_fretless_bass").gain(0.31).pan(0.6)

// chords · piano
const piano = note("<~ A@8 B@4 A@4 C@3 D C@3 D E@3 F C@3 D A@8 B@4 A@4 G H I J ~>".pickRestart({
  A: "~@6 [a3,d4,g4]@4 ~ [g3,d4,f4]@2 ~@11", B: "~@6 [a#3,d#4,g#4]@4 ~ [g#3,d#4,f#4]@2 ~@11",
  C: "[[a3,c4,e4]@35 ~ [g3,b3,d4] ~@5 [g3,b3,d4] ~@4 [a3,c4,e4]@24 ~]/3", // Am G Am
  D: "[d3,f3,a3]@3 ~@2 [e3,a3,c4]@4 [a3,c4,e4]@2 ~ [g3,b3,d4] ~@11", // Dm Am G
  E: "[[a#3,c#4,f4]@35 ~ [g#3,c4,d#4] ~@5 [g#3,c4,d#4] ~@4 [a#3,c#4,f4]@24 ~]/3", // A#m G# A#m
  F: "[d#3,f#3,a#3]@4 ~ [f3,a#3,c#4]@4 [a#3,c#4,f4]@2 ~ [g#3,c4,d#4] ~@11", G: "[a3,c4,f4]@23 ~", H: "[g3,c4,e4]@11 ~",
  I: "[f3,a#3,d4]@11 ~", J: "[f3,a3,c4]@16 ~@2 [e3,g3,c4]@5 [f3,a3,c4,d4]",
})).s("gm_piano").gain(0.28).pan(0.4)

// chords · flute
const flute = note("<~@17 A B ~@2 A B ~@2 C D ~@2 A B ~@23>".pickRestart({
  A: "~@21 [c5,e5]!2 ~", B: "[a4,c5] ~ [a4,c5] ~@21", C: "~@21 [c#5,f5]!2 ~", D: "[a#4,c#5]!2 ~@22",
})).s("gm_flute").gain(0.22).pan(1)

// drums · kick
const kick = s("bd").struct("<~ [x!4]!51 [x!3 ~] ~>").gain(0.36)

// drums · rim
const rim = s("rim").struct("<~ [~@3 x ~@3 x]!51 [~@3 x ~@4] ~>").gain(0.43)

// drums · snare
const snare = s("sd").struct("<~@9 [~@6 x ~@4 x ~@6 x ~@5]!40 ~@5>").gain(0.5)

// drums · clap
const clap = s("cp").struct("<~@9 [~@3 x]!40 ~@5>").gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<~ [~ x ~ x ~ x ~ x]!51 [~ x ~ x ~ x ~@2] ~>").gain(0.29)

// drums · ride
const ride = s("rd").struct(`<
  ~
  [x ~@2 x ~ x!2 ~@2 x ~ x!2 ~@2 x ~ x!2 ~@2 x ~ x]!51
  [x ~@2 x ~ x!2 ~@2 x ~ x!2 ~@2 x ~ x ~@6]
  ~
>`).gain(0.29)

stack(bass, piano, flute, kick, rim, snare, clap, hihat, ride)