Strudelify

California Love (remix)

Tupac

KeyG minorTempo91 bpm
0:00/0:00
// California Love (remix) — Tupac
// 91.2 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 2 "fretless" fretless bass (copy of ch 1 "elec bass" electric bass finger)
// note: Full arrangement: all 91 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(91.2/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 · electric bass finger · "elec bass"
const bass = note(`<
  A B C@5 D@2 C@2 D@2 C@2 D@2 C@2 D@2 C@2 D@2 C@2 D@2 C@2 D@2 C@2 D@2 C@2 D@2 C@2 D@2 B C@3 B C@5 D@2 C@2 D@2 C@2 D@2
  C@2 D@2 C@2 D@2 C@2 D@2 C@2 ~@12
>`.pickRestart({
  A: "~@7 f1", B: "~ gb1 g1@2 ~@3 d1 g1 ~ g1 ~@3 f1@2", C: "~ gb1 g1 ~@4 d1 g1 ~ g1 ~@3 f1@2",
  D: "[~ gb1 g1@2 ~@3 d1 g1 ~ g1 ~@3 f1@3 gb1 g1 ~@4 d1 g1 ~ g1 ~@3 f1@2]/2",
})).s("gm_electric_bass_finger").gain(0.72)

// chords · piano · "acous grand"
const piano = note("<A@8 B@32 C@4 D@5 E@7 B@16 F@8 ~@11>".pickRestart({
  A: "[~@14 f4@3 gb4 g4@11 ~ f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@3 ~@9 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 [d4,f4]@2, ~@14 d4@15 ~ d4@8 ~@8 d4@7 ~@9 d4@7 ~@9 d4@6 ~@10 d4@7 ~@9 d4@6 ~@12]/8", // Dm
  B: "[~ gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 [d4,f4]@2, ~@14 d4@15 ~ d4@7 ~@9 d4@6 ~@10 d4@6 ~@10 d4@15 ~ d4@7 ~@9 d4@6 ~@12]/8", // Dm
  C: "[~ gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 [d4,f4]@2, ~@14 d4@15 ~ d4@7 ~@9 d4@6 ~@12]/4", // Dm
  D: "[~ gb4 g4@2 ~@10 f4@3 gb4 g4@11 ~ f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@3 ~@9 f4@3 gb4 g4@2 ~@10 [d4,f4]@2, ~@14 d4@15 ~ d4@8 ~@8 d4@7 ~@9 d4@7 ~@11]/5", // Dm
  E: "[~ gb4 g4@11 ~ f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@3 ~@9 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 [d4,f4]@2, ~@14 d4@8 ~@8 d4@7 ~@9 d4@7 ~@9 d4@6 ~@10 d4@7 ~@9 d4@6 ~@12]/7", // Dm
  F: "[~ gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 f4@3 gb4 g4@2 ~@10 d4@6 ~@12, ~@14 d4@15 ~ d4@7 ~@9 d4@6 ~@10 d4@6 ~@10 d4@15 ~ d4@7 ~@9 f4@4 ~@14]/8",
})).s("gm_piano").gain(0.4)

// chords · piano · "bright acous piano"
const piano_2 = note(`<
  A B C@6 D C@3 D C@3 D C@3 D C@3 D C@3 D C@3 D C@3 D C@3 D C@3 D B C@3 B C@6 D C@3 D C@3 D C@3 D C@3 D C@3 D C@2 ~@12
>`.pickRestart({
  A: "~@7 [d4,a4]", B: "~ [d4,a4] [d4,bb4] ~ [g4,bb4] ~ [d4,g4,bb4] ~ [d4,g4,bb4] ~ [d4,g4,bb4] ~@3 a4@2",
  C: "~ a4 bb4 ~ [d4,g4,bb4] ~ [d4,g4,bb4] ~ [d4,g4,bb4] ~ [d4,g4,bb4] ~@3 a4@2", // Gm
  D: "~ a4 bb4 ~ [d4,g4,bb4] ~ [d4,g4,bb4] ~ [d4,g4,bb4] ~ [d4,g4,bb4] ~@3 [d4,a4]@2", // Gm D5
})).s("gm_piano").gain(0.32)

// chords · brass section
const brass_section = note("<A@5 ~@10 B C ~@26 B D@5 E@4 ~@24 B C ~@12>".pickRestart({
  A: "[~@14 [c4,f4,a4,c5]@3 [c4,gb4] [g4,d5]@2 ~@4 [d4,f4,g4] ~@5 [c4,f4,a4,c5]@3 gb4 [g4,bb4,d5]@2 ~@4 [d4,f4,g4] ~@5 [c4,f4,a4,c5]@3 gb4 [d4,g4,bb4,d5]@2 ~@4 [d4,f4,g4] ~@5 [c4,f4,a4,c5]@3 gb4 [d4,g4,bb4,d5]@2 ~@4 [d4,f4,g4] ~@7, ~@18 [d4,bb4] ~@15 d4 ~@45]/5", // F Cdim G5 G7 F Gm G7 F …
  B: "~ [bb3,f4] [c4,g4] [d4,a4]", C: "[f4,c5]@15 ~",
  D: "[[f4,c5]@14 [c4,f4,a4,c5]@3 [c4,gb4] [g4,d5]@2 ~@4 [d4,f4,g4] ~@5 [c4,f4,a4,c5]@3 gb4 [g4,bb4,d5]@2 ~@4 [d4,f4,g4] ~@5 [c4,f4,a4,c5]@3 gb4 [d4,g4,bb4,d5]@2 ~@4 [d4,f4,g4] ~@5 [c4,f4,a4,c5]@3 gb4 [d4,g4,bb4,d5]@2 ~@4 [d4,f4,g4] ~@5 [c4,f4,a4,c5]@2, ~@18 [d4,bb4] ~@15 d4 ~@45]/5", // F5 F Cdim G5 G7 F Gm G7 …
  E: "[~ [c4,gb4] [g4,d5]@2 ~@4 [d4,f4,g4] ~@5 [c4,f4,a4,c5]@3 gb4 [g4,bb4,d5]@2 ~@4 [d4,f4,g4] ~@5 [c4,f4,a4,c5]@3 gb4 [d4,g4,bb4,d5]@2 ~@4 [d4,f4,g4] ~@5 [c4,f4,a4,c5]@3 gb4 [d4,g4,bb4,d5]@2 ~@4 [d4,f4,g4] ~@7, ~@2 [d4,bb4] ~@15 d4 ~@45]/4", // Cdim G5 G7 F Gm G7 F Gm …
})).s("gm_brass_section").gain(0.32)

// chords · epiano1 · "rhodes piano"
const epiano1 = note("<~@5 A@12 ~@74>".pickRestart({
  A: "[~@4 [d5,g5,bb5]@15 ~ [d5,g5,bb5]@15 ~ [d5,g5,bb5]@14 ~@2 [d5,g5,bb5]@10 ~@2]/4", // Gm
})).s("gm_epiano1").gain(0.64)

// other · whistle
const whistle = note("<~@29 A B C D ~@32 A B C D ~@22>".pickRestart({
  A: "f5@6 d5 f5 e5@6 c5 e5", B: "eb5@6 c5 eb5 d5@8", C: "c5@3 bb4@3 c5 bb4", D: "g4@15 ~",
})).s("gm_whistle").gain(0.64)

// other · synth drum
const synth_drum = note("<~@45 c8!8 ~@38>").s("gm_synth_drum").gain(0.8)

// chords · lead 2 sawtooth · "sawtooth"
const lead_2_sawtooth = note(`<
  ~@4 A B@2 C@7 D E F ~@15 A G@2 H@4 I@3 J K L M N M O P N M Q ~@15 R S@2 T@2 U V W X U J Y Z AA AB AC AD AE AF AG@2 AH
  AI
>`.pickRestart({
  A: "~@12 g4@2 bb4 g4", B: "[[bb4,d5] ~ d5@2 ~@6 g4 ~ g4@3 f4@3 g4 ~@9 c5 ~ c5@2]/2",
  C: "[bb4@2 a4@2 g4@6 f4@2 g4@3 a4@3 f4@2 d4@2 ~@6 g4@2 bb4 ~ bb4@2 [g4,bb4,d5]@10 g4@3 g4@2 ~@11 g4@2 bb4 ~ bb4@2 [g4,bb4,d5]@10 g4@2 ~ f4@3 g4@2 ~@8 g4@2 bb4 ~ [bb4,d5] ~ [g4,bb4,d5]@9 ~ g4 ~ g4 ~, ~@31 g4@2 ~@30 g4@2 ~@30 g4@2 ~@15, ~@32 d5 ~@31 d5 ~@47]/7", // Gm Bb Gm
  D: "f4@2 g4 ~@9 c5 ~ c5@2", E: "bb4@2 a4@2 g4@7 ~ c5 ~ c5@2", F: "bb4@2 a4@2 g4@11 ~",
  G: "[[bb4,d5] ~ [bb4,d5] ~ d6 ~ bb5 c6@3 [g4,d6] ~ g4@2 ~ f4@3 g4@2 a5 f5 ~ g5 d5 ~@3 c5 ~ c5@2, ~@7 bb5 ~@18 d5@5 ~]/2", // Bb G5
  H: "[bb4@2 a4@2 g4@6 f4@2 g4@3 a4@3 f4@2 ~ d5 ~ [f5,g5] g5@4 g4@2 bb4 ~ d5 ~ [g4,bb4,d5]@9 ~ g4!3 g4@4 ~@9 g4@2 bb4 g4, ~@20 d4@2 ~@2 f5 ~@6 [g4,bb4]@2 ~@31]/4", // Fsus2 Gm
  I: "[[g4,bb4,d5] ~ [g4,bb4,d5]@9 ~ g4 g4@2 f4@3 g4@2 ~@8 g4@2 bb4 ~ d5 ~ [g4,bb4,d5]@9 ~ g4!2 g4@2, ~@31 [g4,bb4]@2 ~@15]/3", // Gm
  J: "f4@2 g4@2 ~@8 c5 ~ c5@2", K: "bb4@2 a4@2 g4@8 c5 ~ c5@2", L: "bb4 a4 g4@5 ~",
  M: "[g4,d5] ~ [g4,d5] ~ [g4,d5] ~ [g4,d5] ~ [g4,d5] ~ [g4,d5] ~@5", // G5
  N: "[g4,d5] ~ [g4,d5] ~ [g4,d5] ~ [g4,d5] ~ [g4,d5] ~@7", O: "[g4,d5] ~ [g4,d5] ~ f5@2 [g4,g5] ~@9, ~@4 g4 ~@11",
  P: "[g4,d5] ~ g4 ~ [g4,d5] ~ [g4,d5] ~ [g4,d5] ~ [g4,d5] ~@5", // G5
  Q: "[g4,d5] ~ [g4,d5] ~ f5@2 g5@2 ~@8, ~@4 g4 ~ g4 ~@9", R: "~@6 g4 bb4",
  S: "[d5 ~@3 f5 ~ g5 ~ g5 ~ [g4,g5] ~ g4@3 f4@3 g4@2 ~@8 c5 ~ c5@2, ~@2 d5@7 ~@23]/2", // G
  T: "[bb4@2 a4@2 g4@6 f4@2 g4@3 a4@3 f4@2 d4@2 ~@6 g4@2 bb4@2]/2", U: "[a4,d5] ~ [a4,bb4,d5]@9 ~ g4!2 g4@2",
  V: "g4 ~@5 g4 bb4", W: "[a4,d5] ~ [a4,bb4,d5]@10 g4!2 g4@2", X: "f4 g4 ~@4 g4 bb4",
  Y: "bb4@2 a4@2 ~@2 g5!2 bb5@2 c6 ~ c5 ~ c5@2, ~ g4@2 ~", Z: "bb4@2 g5!2 bb5 ~ c6 ~@5 bb4 c5@2 ~, ~ a4 g4@3 g4@2 ~",
  AA: "eb3@2 g4 ~ [eb3,g4] ~ g4 ~ [eb3,g4] ~ g4 ~ eb3@2 [e3,bb4] ~, g4 ~@11 bb4 ~@3", // Eb Edim
  AB: "f3@2 c5 ~ [f3,c5] ~ d5 ~ [f3,f5] ~ f5 ~ d4@2 [c4,g5] bb3, c5 ~@11 g5 ~@3", // F5 F C5
  AC: "eb3@2 bb5 ~ [eb3,c6] ~ c6 ~ [eb3,d6] ~ d6 ~ [eb3,g6]@2 d6@2, bb5 ~@11 d6 ~ e3 ~", // Cm Ebmaj7 Eb
  AD: "[f3,db6]@2 d6@2 [f3,g6]@2 d6@2 [f3,db6]@2 d6@2 [d4,g6]@2 c4 bb3, ~@7 d6", // Db Fsus2 Db G5
  AE: "[eb3,db6]@2 d6@2 [eb3,db6]@2 d6@2 [eb3,eb6] d6@2 c6 d6 bb5 [e3,c6] g5, ~@6 eb3 ~", // Eb7 Eb C
  AF: "bb5 f5 g5 d5 [f3,f5] c5 d5 ~ f3 c5 bb4 c5 bb4 g4@3, f3@2 ~@5 bb4@2 ~@7", // F
  AG: "[~@4 bb3!2 c4!5 bb3 [bb3,d4] ~ bb3 c4@2 bb3 g3@4 bb3!2 c4!2 d4!2 f4!2 g4 ~]/2", // Bb
  AH: "g4 a4!2 bb4!2 c5!2 d5!2 f5!2 g5!2 ~ a5!2", AI: "bb5!2 c6 ~ c6 d6!2 ~ f6!2 g6!2 ~@4",
})).s("gm_lead_2_sawtooth").gain(0.48)

// chords · whistle
const whistle_2 = note("<~@37 A ~ B ~@3 C@2 D E F G H I H J ~@17 K ~@20>".pickRestart({
  A: "~@2 g4 d5 c5 bb4 g4@2", B: "~@4 a5@2 d5 g5@3 d5@2 ~@4, ~@4 d5 ~@11",
  C: "~@4 [c5,c6] ~ [c5,c6]@2 [bb4,bb5]@2 [a4,a5]@2 [g4,g5]@2 ~@2", D: "~@4 [g5,bb5] ~ g5 ~ [g5,bb5] ~ [g5,bb5] ~@5",
  E: "~@4 [g5,bb5] ~ g5 ~ [g5,bb5] ~@7", F: "bb5@2 g5 ~ [g5,bb5] ~ g5 ~ [g5,bb5] ~ [g5,bb5] ~@5, g5 ~@15",
  G: "[g5,bb5] ~ g5 ~ [g5,bb5] ~ [g5,bb5] ~@9", H: "[g5,bb5] ~ g5 ~ [g5,bb5] ~ g5 ~ [g5,bb5] ~ [g5,bb5] ~@5",
  I: "[g5,bb5] ~ g5 ~ [g5,bb5] ~ g5 ~ [g5,bb5] ~@7", J: "[g5,bb5] ~ g5 ~ [a5,c6]@2 [bb5,d6] ~@9",
  K: "~@4 c6!2 c6@2 bb5@2 g5 g5@4 ~",
})).s("gm_whistle").gain(0.48)

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

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!78 ~@12>").gain(0.72)

// drums · open hat
const open_hat = s("oh").struct("<~ x!78 ~@12>").gain(0.72)

// drums · ride
const ride = s("rd").struct("<~ x!78 ~@12>").gain(0.72)

// drums · shaker
const shaker = s("sh").struct("<~ [x!16]!78 ~@12>").gain(0.4)

// drums · whistle
const whistle_3 = s("ballwhistle:1").struct(`<
  ~ A B C D B@2 E D B@2 E D B@2 E D B@2 E D B@2 E D B@2 E D B@2 E D B@2 E D B@2 E D B@2 E D A B C D A B C D B@2 E D B@2
  E D B@2 E D B@2 E D B@2 E D B@2 E D B@2 ~@12
>`.pickRestart({
  A: "~@8 x!2 ~ x ~@4", B: "~@3 x ~@4 x!2 ~ x ~@4", C: "~@3 x ~@4 x!2 ~@6", D: "x", E: "~@2 x ~@5 x!2 ~ x ~@4",
})).gain(0.21)

// drums · whistle
const whistle_4 = s("ballwhistle:0").struct(`<
  ~ A B C ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A B C ~ A B C ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~
  A@3 ~ A@2 ~@12
>`.pickRestart({
  A: "~@4 x!2 ~ x ~@4 x ~@3", B: "~@4 x ~@2 x ~@4 x ~@3", C: "~@4 x!2 ~ x ~@3 x ~@2 x ~",
})).gain(0.21)

stack(
  bass, piano, piano_2, brass_section, epiano1, whistle, synth_drum, lead_2_sawtooth, whistle_2, kick, snare, open_hat,
  ride, shaker, whistle_3, whistle_4
)

More by Tupac