Strudelify

I Aint Mad Atcha

Tupac

KeyE♭ majorTempo85 bpm
0:00/0:00
// I Aint Mad Atcha — Tupac
// 85 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 83 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(85/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.

// chords · piano
const piano = note(`<
  A@6 B@2 C@2 B@2 C@2 D@2 E@2 D@2 E@2 D@2 E@2 F@2 E@2 B@2 C@2 B@2 C@2 D@2 E@2 D@2 E@2 D@2 E@2 D@2 G H D@2 E@2 D@2 G H
  B@2 C@2 B@2 C@2 B@2 C@2 B@2 C@2 B@2 I@2 ~
>`.pickRestart({
  A: "[~@14 f4@3 g4 ab4@2 bb4@4 ~@4 bb4@3 [g4,ab4] ~ f4 ~ bb3@2 d4@3 ~@9 b2@2 ab3@4 ~@2 eb4@3 ~ g3@2 eb4@4 ~ [d4,f4]@24 ~@4, ~@24 g2@13 ~@24 ab2@6 [g2,f3,b3]@24 ~@5, ~@25 [d3,g3,b3]@12 c3@10 ~ c3@2 ~ [bb2,bb3,db4,f4]@10 ~@35, ~@26 eb4@8 eb4@4 ~@2 eb4@12 ~@3 ab3@5 ab3@2 ~@34]/6", // Abmaj7 Dm G7 G Bbm
  B: "[[c3,c4] [d3,d4] [eb3,eb4] [d3,d4] [c3,c4] ~ [g2,g3] ~@3 [e2,bb3,c4,e4]@4 ~@8 [f3,f4] g3 ab4 g3 [f3,f4] ~ [d3,d4] ~ [bb2,bb3] ~, ~@7 [f2,c4]@9, ~@14 [ab3,g4]@9 g4@2 g4@7, ~@3 ab3]/2", // C D Eb D C G C7 F …
  C: "[[bb2,bb3] [c3,c4] [d3,d4] [c3,c4] [bb2,bb3] ~ [f2,f3] ~@3 [bb2,bb3,d4,f4]@4 [bb3,c4,eb4,ab4]@4 [bb3,eb4,g4]@3 [c2,bb3] [d2,c4,e4,g4]@4 [g2,f3,b3,eb4,f4]@6, ~@7 eb2@4 ~@5]/2", // Bb C D C Bb F Bb Ab …
  D: "[c3@3 bb2 ~@2 c3 ~@7 f2@8 eb2 ~ eb2 f2 ~@6, [bb3,d4,g4]@7 [f3,ab3,c4]@9]/2", // Gm Fm
  E: "[[bb2,ab3,bb3,c4,eb4]@11 [bb2,ab3,bb3,c4,eb4] ~@2 [ab3,bb3,c4,eb4,ab4]@6 [g3,bb3,eb4,g4]@3 bb3 [d3,c4,e4,g4]@3 g3 [g2,f3,b3,eb4,f4]@4, ~@7 eb2@5 ~@4]/2", // Ab Eb C Gaug
  F: "[c3@3 bb2 ~@2 c3 ~@3 [db4,e4,c5] ~@3 f2@8 eb2 ~ eb2 f2 ~@6, [bb3,d4,g4]@7 [f3,ab3,c4]@9, ~@7 [eb4,bb4]@8 ~]/2", // Dbm Gm Fm Eb5
  G: "[ab3,c4] [ab3,c4,d4], [bb2,bb3,eb4]@11 ~@5", // Ab Dm7b5 Eb5
  H: "[ab3,bb3,c4,eb4,ab4]@4 [g3,bb3,eb4,g4]@3 bb3 [d3,c4,e4,g4]@3 g3 [g2,f3,b3,eb4,f4]@4, eb2 ~", // Ab Eb C Gaug
  I: "[[bb2,bb3] [c3,c4] [d3,d4] [c3,c4] [bb2,bb3] ~ [f2,f3] ~@3 [bb2,bb3,d4,f4]@4 [bb3,c4,eb4,ab4]@4 [bb3,eb4,g4]@3 ~@11]/2", // Bb C D C Bb F Bb Ab …
})).s("gm_piano").gain(0.37)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@6 A@2 B@2 A@2 B@2 ~@16 A@2 B@2 A@2 B@2 ~@24 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 C@3
>`.pickRestart({
  A: "[~@5 [e3,bb3,c4,e4]@2 [f3,ab3,c4,g4]@9]/2", // C7 Fm
  B: "[~@5 [d3,bb3,d4,bb4]@2 [c4,ab4]@2 [bb3,g4]@2 [d3,c4,e4,g4]@2 [b3,eb4,f4]@3, ~@7 [eb3,eb4]@4 ~@2 g3@2 ~]/2", // Gm Fm Eb C Fm7b5 Eb
  C: "[~@5 [d3,bb3,d4,bb4]@2 ab4@2 [bb3,g4]@15, ~@7 [eb3,c4,eb4]@17]/3", // Gm Eb Cm
})).s("gm_string_ensemble_1").gain(0.2).pan(0.8)

// bass · fretless bass
const bass = note(`<
  ~@6 A@2 B@2 A@2 B@2 C@2 D@2 E@2 F@2 G@2 H@2 I@2 D@2 A@2 B@2 A@2 B@2 C@2 J@2 K@2 L@2 M@2 H@2 N@2 O P ~@4 N@2 O P A@2
  B@2 A@2 B@2 A@2 B@2 Q@2 R@2 A@2 S@3
>`.pickRestart({
  A: "[~@5 e1@2 f1@9]/2", B: "[~@5 bb1@2 eb1@4 d2@2 g1@3]/2", C: "[c1@7 f1@9]/2", D: "[bb1@7 eb1@5 d1@2 g1@2]/2",
  E: "[c1@5 e1@2 f1@9]/2", F: "[bb1@11 bb1 ~@2 eb1@6 c1 d1 eb1@2 d1@4 g1@4]/2",
  G: "[c1@3 c2 ~@2 bb1 ~@3 e1@4 f1@14 f2@4]/2", H: "[bb1@11 bb1 ~@2 eb1@6 ~@2 c1 db1 d1@4 g1@4]/2",
  I: "[c1@3 c2 ~@2 bb1 ~@3 e1@4 f1@8 eb1 ~ eb1 f1 ~@6]/2", J: "[bb1@7 eb1@5 d2@2 g1@2]/2",
  K: "[c2 ~@2 bb1 ~@2 g1!2 ~@3 eb1 ~@2 f1@18]/2", L: "[bb1@3 bb1 ~@2 bb1!2 ~@3 d1 ~@2 eb1@6 c1 d1 eb1@2 d1@4 g1@4]/2",
  M: "[c1@3 c2 ~@2 c1 ~@3 e1@4 f1@14 ~@3 c2]/2", N: "[c2@3 bb1 ~@2 g1!2 ~@2 e1@4 f1@5 eb1 ~@2 c1!2 ~@8]/2",
  O: "bb1@8 bb1@3 d1@5", P: "eb1@2 d1 g1", Q: "[~@10 e1@4 f1@8 f1 g1 ab1 g1 f1 ~ d1 ~ bb0 ~]/2",
  R: "[bb1@4 ~@2 bb1!2 ~@2 bb1@4 eb1@8 d2@4 g1@6]/2", S: "[~@5 bb1@2 eb1@17]/3",
})).s("gm_fretless_bass").gain(0.36)

// drums · kick
const kick = s("bd").struct("<~@5 [~ x] [x ~@2 x!2 ~@3]!75 ~@2>").gain(0.35)

// drums · rim
const rim = s("rim").struct("<~@5 [~@5 x!2 ~] [~ x ~ x]!74 ~@3>").gain(0.35)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@6 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 ~@3
>`.pickRestart({
  A: "x!5 ~ x!2", B: "x!5 ~ x ~",
})).gain(0.3)

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

// drums · crash
const crash = s("cr").struct(`<
  ~@6 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2
>`.pickRestart({
  A: "x",
})).gain(0.25)

stack(piano, string_ensemble_1, bass, kick, rim, hihat, open_hat, crash)

More by Tupac