Strudelify

Changes

Tupac

KeyG majorTempo111 bpm
0:00/0:00
// Changes — Tupac
// 111 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 3 voice oohs (copy of ch 1 "2pac" fretless bass)
// note: Full arrangement: all 127 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(111/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 · "2pac"
const bass = note(`<
  ~@8 A@2 B C D E B C D E B C D E B C D E B C D E B C D E B C D E B C D E B C D E B C ~ E B C D E B C D E B C D E B C D
  E B C D E B C D E B C D E B C D E B C D E B C ~ E B C D E B C D E B C D E B C D E B C D E B C D E B C D ~@10
>`.pickRestart({
  A: "[~@13 d2@2 e2@2 a2@2 d2 ~ b2@2 d2@2 a2@2 e2@2 d2@2 e2@2 a2@16 e2@15]/2", B: "~ d2@12 c2@19", C: "~ g1@16 d2@15",
  D: "~ c2@30 ~", E: "~ a2@16 e2@15",
})).s("gm_fretless_bass").gain(0.08).pan(0.6)

// chords · piano
const piano = note(`<
  ~@9 A B C D A B C D A B C D A B C D A B C ~@21 A B C D A B C D A B C D A B C D A B C ~@21 A B C D A B C D A B C D A B
  C D A B C ~@19
>`.pickRestart({
  A: "[a4,c5,e5,a5,c6]@15 ~ [e4,b4,e5,g5,b5]@15 ~", // Am Em
  B: "a5@6 g5@5 ~@2 g4@11 g4@6 ~@2, [d4,a4,d5,f#5]@11 ~ c5@17 ~@3, ~@12 d5@11 ~@9, ~@13 [c4,g5]@18 ~", // D C5
  C: "b4@6 a4@5 ~ b4@2 ~@2 d5@6 e5@6 d5@3 ~, [g3,d4,g4,d5]@15 ~ [d4,a4,f#5]@15 ~", // G5 D
  D: "[c5,d5]@6 ~@8 a5 b5, [c4,g4]@3 g4, ~@12 c5@15 ~@5", // Csus2 C5
})).s("gm_piano").gain(0.25)

// chords · piano
const piano_2 = note("<A@2 B C@7 ~@19 D@6 E@8 F@4 ~@22 D@6 E@8 F@4 ~@22 D@6 G@6 H@6>".pickRestart({
  A: "[~@15 [a4,c5,e5]@5 ~@2 [a4,c5,e5]@4 ~@4 [g4,b4,e5]@17 ~@4 a4@3 g4@2 a4@8]/2", B: "d5@7 b4@16 a4@3 g4@6",
  C: "[~ e4@3 d4@9 g4@3 ~ a4@3 b4@3 ~@2 c5@9 b4@6 a4@2 ~@61 d7@64 ~@57, ~@42 g4@37 e4@15 g5@5 e6@64 ~@61, ~@72 c4@11 c5@2 d5 e5 g5@2 c6@2 c5@4 c6@5 g6@64 ~@60, ~@76 d4@15 d6@2 [d5,e5]@4 d6@64 ~@63, ~@81 g4@123 ~@20]/7", // Dsus2
  D: "[~@24 [c4,d4,b4]@3 c4@5 ~@24 [g4,c5,d5]@3 ~@29 [c4,d4,b4]@3 [c4,d4,b4]@5, b3@12 d3@21 c4@12 e3@21 g4@10 d3 e3 g3@18, ~ c4@7 e4@24 b3@12 d3@21 c4@5 g3 a3@25, ~@2 g4@11 e3@21 g4@4 g3 a3@7 g3@13 [c5,d5]@13 e4@24, ~@6 g3 a3@7 g3@13 [d4,b4]@13 e4@19 g4@5 b3@32]/6", // G Gsus4 G Csus2 G
  E: "[~@16 e4@8 e4@6 ~@26 [c4,d4,b4]@3 c4@5 ~@24 [g4,c5,d5]@3 ~@29 [c4,d4,b4]@3 [c4,d4,b4]@5, b3@13 e3@20 c4 g4@11 e3@21 g4@4 g3 a3@7 g3@13 [c5,d5]@13 e4@4 d3 e3 g3@18, ~ c4@13 g3@2 [g4,c5]@8 [d4,b4]@14 g3 a3@7 g3@13 [d4,b4]@13 e4@19 g4@5 b3@32, ~@2 g4@6 e4@4 d3@18 [e4,g4]@2 b3@12 d3@21 c4@12 e3@21 g4@30, ~@6 g3 a3@23 c5@10 e4@24 b3@12 d3@21 c4@5 g3 a3@25]/8", // G Gsus4 G Csus2 C5 G Em
  F: "[~@8 e4@4 e4@3 [e4,g4,c5]@16 ~, b3@13 e3@32 ~@19, ~ c4@13 g3@32 ~@18, ~ g4@3 e4@2 d3@16 ~@10, ~@6 g3 a3@9 [g4,c5]@8 [d4,b4]@32 ~@8]/4", // C C5 G
  G: "[~@16 e4@8 ~@32 [c4,d4,b4]@3 c4@5 ~@24 [g4,c5]@3 [g4,c5]@5, b3@13 e3@20 c4@5 g3 a3@7 g3@13 [d4,b4]@13 e4@4 d3 e3 g3@18, ~ c4@13 g3@2 c5@18 g4@11 e3@21 g4@4 g3 a3@25, ~@2 g4@6 e4@4 d3@12 e4@8 b3@12 d3@21 c4@31, ~@6 g3 a3@9 g4@8 [d4,b4]@16 e4@24 b3@32]/6", // G C5 G
  H: "[~@24 [c4,d4,b4]@3 c4@5 ~@16 e4@8 [d4,e4,b4]@32 ~@8, b3@12 d3@21 c4@13 g3@32 ~@18, ~ c4@7 e4@24 b3@13 e3@32 ~@19, ~@2 g4@11 e3@21 g4@4 g3 a3@9 [g4,c5]@32 ~@16, ~@6 g3 a3@7 g3@13 [d4,b4]@13 e4@4 d3@32 ~@20]/6", // G E7 C5 G
})).s("gm_piano").gain(0.48)

// other · piano
const piano_3 = note(`<
  ~@30 A ~ B ~ A ~ C ~ A ~ B ~ A ~ C ~@25 A ~ B ~ A ~ C ~ A ~ B ~ A ~ C ~@25 A ~ B ~ A ~ C ~ A ~ B ~ A ~ D ~@2
>`.pickRestart({
  A: "~@6 e4@3 ~ g4@3 ~ a4 ~ b4@3 ~ b4 ~ b4@8 ~@2", B: "~@6 b4@3 ~ c5@3 ~ d5 ~ d5@3 ~ e5 ~ d5@8 ~@2",
  C: "~@4 b4@5 ~@3 a4@3 ~ b4@3 ~ a4@3 ~ g4@3 ~ b4@4", D: "~@4 b4@5 ~@3 a4@3 ~ b4@3 ~ a4@3 ~ g4@3 ~@5",
})).s("gm_piano").gain(0.47)

// chords · piano
const piano_4 = note("<A@3 B@7 ~@117>".pickRestart({
  A: "[~@15 [a3,c4,e4]@7 [a3,c4,e4]@8 [g3,b3,e4]@27 [d3,f#3,a3]@18 ~ [g3,b3]@20, ~@25 d3@7]/3", // Am Em D G
  B: "[~@3 [c3,e3,g3]@25 ~ a3@19 ~ g3@166 ~@9, ~@28 [d3,f#3]@20 [c3,e3]@167 ~@9]/7", // C D C
})).s("gm_piano").gain(0.32)

// bass · fretless bass
const bass_2 = note("<A@3 B@7 ~@117>".pickRestart({
  A: "[~@15 a1@8 a1@7 e1@27 d2@19 g1@20]/3", B: "[~@3 c2@26 d2@19 c2 c2@166 ~@9]/7",
})).s("gm_fretless_bass").gain(0.36)

// drums · kick
const kick = s("bd").struct(`<
  ~@7 A B A@3 B A@3 B A@3 B A@7 C D A@2 B A@3 B A@3 B A@3 B A@3 E A@3 B A@3 B A@3 B A@7 F A@3 B A@3 B A@3 B A@3 B A@3 G
  A@3 B A@3 B A@3 B A@7 E A@3 B A@3 B ~@10
>`.pickRestart({
  A: "x ~@2 x ~@6 x ~@5", B: "x!2 ~ x ~@6 x ~@5", C: "~ x ~@2 x ~ x ~ x ~@23", D: "~@3 x ~@6 x ~@5",
  E: "~@4 x ~ x ~@2 x ~@2 x ~@19", F: "~ x!2 ~ x!2 ~@10", G: "~@2 x!2 ~ x!2 ~@9",
})).gain(0.4)

// drums · snare
const snare = s("sd").struct("<~@7 A@21 ~ A@19 ~ A@19 ~ A@19 ~ A@19 ~ A@8 ~@10>".pickRestart({
  A: "~ x ~ x",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<~@7 A@21 ~ B A@18 ~ A@19 ~ A@19 ~ A@19 ~ A@8 ~@10>".pickRestart({
  A: "x!16", B: "~ x!15",
})).gain(0.24)

// drums · china
const china = s("cr").struct("<~@7 x ~@119>").gain(0.36)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@7 A@21 ~ B A@18 ~ A@19 ~ A@19 ~ A@19 ~ A@8 ~@10>".pickRestart({
  A: "x!4", B: "~ x!3",
})).gain(1.83)

// drums · triangle
const triangle = s("triangles:35").struct("<~@7 A@21 ~ A@19 ~ A@19 ~ A@19 ~ A@19 ~ A@8 ~@10>".pickRestart({
  A: "~@3 x",
})).gain(2.45)

stack(bass, piano, piano_2, piano_3, piano_4, bass_2, kick, snare, hihat, china, cabasa, triangle)

More by Tupac