Strudelify

Theme From Beverly Hills 90210

Davis John

KeyB♭ majorTempo141 bpm
0:00/0:00
// Theme From Beverly Hills 90210 — Davis John
// 141 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (2/4 at bar 1, 4/4 at bar 1) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 51 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): DISTORTION.
setcpm(141/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 · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<A B A C D C E@8 F@8 G H I@3 J K@2 L M L N L M L N O@8 P@2 Q@3>".pickRestart({
  A: "~@5 db3!2 eb3", B: "eb3@3 ~@3 ab2@2 ab2@2 bb2@2 bb2@2 ~@2", C: "eb3@3 ~@3 ab2@2 ab2@2 bb2@2 db3@2 bb2@2",
  D: "eb3 db3@3 ~ db3!2 eb3",
  E: "[eb3 db3@3 [f3,bb3,d4]@16 [g3,bb3,d4]@16 [eb3,g3,bb3]@8 [f3,a3,c4]@8 [f3,bb3,d4]@8 ~@4]/8", // Bb Gm Eb F Bb
  F: "[~ [f3,bb3,d4]@4 [g3,bb3,d4]@4 [eb3,g3,bb3]@2 [f3,a3,c4]@2 [f3,bb3,d4]@3]/8", G: "~@8 db3@7 ~",
  H: "~@2 db3@2 ~@2 ab2@9 ~", I: "[~@2 ab2@2 ~@2 bb2@34 db3@7 ~]/3", J: "~@2 db3@2 ~@2 eb3@9 ~",
  K: "[~ f3 ~ f3@8 ~@5]/2", L: "~@8 bb2@5 ~@3", M: "db3@2 db3@3 ~@3 ab2@6 ~@2", N: "db3@2 db3@3 ~@3 eb3@6 ~@2",
  O: "[~ [f3,bb3,d4]@4 [g3,bb3,d4]@4 [eb3,g3,bb3]@2 [f3,a3,c4]@2 [f3,bb3,d4]@2 [f3,ab3,c4]]/8", // Bb Gm Eb F Bb Fm
  P: "[[eb3,ab3,c4] [f3,bb3,d4]@2 [f3,ab3,c4]]/2", Q: "[[eb3,ab3,c4] [f3,bb3,d4]@4 ~]/3",
})).s("gm_overdriven_guitar").gain(0.3)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar_2 = note("<~@4 A@2 B@2 C@2 D E@5 C@2 F G@4 ~@8 H I J K L@2 ~ M N@2 O@2 P Q@7>".pickRestart({
  A: "[~@3 bb5@2 ~@3]/2", B: "[~@2 f4@2 bb4@2 c5@2 d5@6 d5@11 ~ f4@2 bb4@2 c5@2]/2",
  C: "[d5@2 eb5@2 f5@2 ~@2 f5@6 bb4@11 ~ f4@2 bb4@2 c5@2]/2", D: "d5 eb5 f5 ~ f5@2 eb5!2",
  E: "[~@2 d5@2 ~@2 c5@12 bb4@2 a4@4 bb4@6 g5@4 f5@2 eb5@2 d5@2 eb5@2 d5@2 bb4@2 f4@4 f4@2 bb4@2 c5@2 d5@6 d5@11 ~ f4@2 bb4@2 c5@2]/5",
  F: "d5 eb5 f5 g5 f5@2 eb5!2", G: "[~ d5 ~ c5@6 bb4 a4@2 bb4@14 ~@6]/4", H: "~@5 [c4,f4] [bb3,eb4] [ab3,db4]",
  I: "[bb3,eb4] [ab3,db4] [f3,bb3]@2 [ab3,db4]@4 ~@8", J: "~@3 eb5", K: "db5@3 bb4@3 ab4@2 bb4@5 ~@3",
  L: "[~@12 ab5@8 f5@2 bb5@7 ~@3]/2", M: "~@4 [bb4,f5]@2 [f4,bb4] [f4,c5]",
  N: "[[bb4,d5] [bb4,eb5] [bb4,f5] [bb4,f5]@9 ~@2 [f4,bb4] [f4,c5]]/2", // Bb Eb5 Bb5 F5
  O: "[[bb4,d5]@2 [bb4,eb5]@2 [bb4,f5]@2 [bb4,f5]@6 [g4,bb4]@8 ~@4 [bb4,f5]@4 [bb4,eb5] ~ [bb4,eb5]@2]/2", // Bb Eb5 Bb5 Gm Bb5 Eb5
  P: "~@2 [bb4,d5]@3 ~ [f4,c5]@10", // Bb F5
  Q: "[~@2 [f4,bb4]@2 [f4,a4]@4 [bb3,f4,bb4]@47 ~ db4@2 c4@2 bb3@2 eb4@4 db4@2 c4@4 [bb3,bb5]@32 ~@8]/7", // Bb5 F Bb5 Bb
})).s("gm_overdriven_guitar").gain(0.8)

// other · alto sax
const alto_sax = note("<~@22 A B C D E B F G@2 ~ H@3 ~@16>".pickRestart({
  A: "~@7 [c5,d5] ab5@4 g5@2 g5@2, ~@8 eb5 ~@7", B: "~ f5 ~ f5 ~ eb5 ~ eb5", C: "~@2 d5@2 ~@2 f5@6 c5 bb4 c5@2",
  D: "bb4@6 ~@4 bb5@5 ~", E: "g5@2 f5@2 ~@3 [c5,d5] ab5@4 g5@2 g5@2, ~@8 eb5 ~@7", F: "~ f5 ~ f5@4 ~",
  G: "[a5@2 c6@6 eb6@2 f6 ~ f6@2 ~ f6@8 ~@9, ~@7 eb6 ~@8]/2", H: "[~ bb4@8 ~@3]/3",
})).s("gm_alto_sax").gain(0.8)

// other · alto sax · soft notes
const alto_sax_soft = note("<~@22 [~@6 a4 bb4 ~@8] ~@3 [~@6 a4 bb4 ~@8] ~@24>").s("gm_alto_sax").gain(0.48)

// bass · slap bass 2 · "SLAPBASS 2"
const bass = note(`<
  A B A C D C E F G H I J K@2 L F G H I J M@3 N O P Q R S T U V W X@2 V W Y@2 F G H I J Z@2 AA AB AC@3
>`.pickRestart({
  A: "~@5 db2!2 eb2", B: "eb2@3 ~@3 ab1@2 ab1@2 bb1@2 bb1@2 ~@2", C: "eb2@3 ~@3 ab1@2 ab1@2 bb1@2 db2@2 bb1@2",
  D: "eb2 db2@3 ~ db2!2 eb2", E: "eb2@2 db2@6 bb1 ~ bb1@2 ~@2 bb1 ~", F: "bb1 ~ bb1 ~@3 bb1@7 ~ bb1 ~",
  G: "bb1@3 ~ bb1 ~ bb1 ~ g1 ~ g1@2 ~@2 g1 ~", H: "g1 ~ g1 ~@3 g1@7 ~ g1 ~",
  I: "g1@2 ~@2 g1 ~ g1 ~ eb1 ~ eb1@2 ~@2 eb1 ~", J: "eb1@2 ~@2 eb1@3 ~ f1 ~ f1@2 ~@2 f1 ~",
  K: "[f1 ~ f1@2 ~@4 bb1@5 ~ bb1@5 ~ bb1 ~@3 bb1@2 bb1@2 ~@2 bb1@2]/2", L: "~@2 f1@2 g1@2 a1@2 bb1 ~ bb1@2 ~@2 bb1 ~",
  M: "[f1 ~ f1@2 ~@4 bb1@5 ~ bb1@5 ~ bb1 ~ bb1!3 ~ bb1 ~ bb1 ~ bb1@6 ~@4 db2@7 ~]/3", N: "~@2 db2@2 ~@2 ab1@9 ~",
  O: "~ ab1 ~ bb1@5", P: "bb1!2", Q: "bb1@8 db2@7 ~", R: "~@2 db2@2 ~@2 eb1@9 ~", S: "~ f1 ~ f1@2 f1!3", T: "f1!8",
  U: "f1!4 bb1!2 ~@2", V: "db2!2 ~ ab1@4 ab1", W: "ab1!4 bb1!2 ~@2", X: "[db2!2 ~@2 eb2@3 eb2@2 eb2!3 bb1!2 ~@2]/2",
  Y: "[db2@2 db2@2 ~@4 eb2@6 eb2@4 eb2@2 eb2@2 eb2@2 bb1 ~ bb1@2 ~@2 bb1 ~]/2",
  Z: "[f1 ~ f1@2 ~@4 bb1@5 ~ bb1@5 ~ bb1 ~@3 f1@6 f1 ~]/2", AA: "ab1@7 ~ bb1@6 bb1@2", AB: "~@4 bb1 ~@3 f1@7 ~",
  AC: "[ab1@7 ~ bb1@32 ~@8]/3",
})).s("gm_slap_bass_2").gain(0.56)

// other · lead 1 square · "SQUAREWAVE"
const lead_1_square = note("<~@39 A B@2 C D@4 ~@4>".pickRestart({
  A: "~@6 bb5 c6", B: "[d6@2 eb6@2 f6@2 ~@2 f6@6 bb5@15 ~ bb5@2]/2", C: "d6@2 eb6@2 f6@2 ~@2 f6@4 eb6 ~ eb6@2",
  D: "[~ d6 ~ c6@6 bb5 a5@2 bb5@16 ~@4]/4",
})).s("gm_lead_1_square").gain(0.5)

// other · pad new age · "FANTASIA"
const pad_new_age = note("<~@48 A@3>".pickRestart({
  A: "[~@7 d5@3 f5@2 bb5@6 ~@6]/3",
})).s("gm_pad_new_age").gain(0.38)

// other · guitar harmonics · "GTHARMONIC"
const guitar_harmonics = note("<~@37 [~@9 a2 d3 bb2 eb3 c3 f3 d3] [g3 eb3 a3 f3 bb3 g3 c4 a3 ~@8] ~@12>")
  .s("gm_guitar_harmonics").gain(0.8)

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

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

// drums · clap
const clap = s("cp").struct("<~@2 [x!2 ~@2] ~@19 [~@3 x]!2 ~@2 [~ x!2 ~@3 x ~] [~@3 x] ~@23>").gain(0.72)

// drums · low tom
const low_tom = s("lt").struct("<~@3 A B ~@17 C ~@7 D ~@17 E ~@2>".pickRestart({
  A: "~@5 x!3", B: "x!2 ~@6", C: "~@6 x!2 ~@8", D: "~@3 x ~@4", E: "~ x ~@2",
})).gain(0.48)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@6 A B@14 C ~@16 A B@9 C ~@2>".pickRestart({
  A: "~@4 x!4", B: "x!8", C: "x!4 ~@4",
})).gain(0.64)

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 A ~@17 B ~@7 C ~@17 D ~@2>".pickRestart({
  A: "~@4 x!4 ~@8", B: "~@2 x!4 ~@10", C: "~@4 x!2 ~@10", D: "~ x ~@6",
})).gain(0.48)

// drums · ride
const ride = s("rd").struct("<~@4 A B C ~@15 A B@15 C ~@12>".pickRestart({
  A: "~@2 x!2", B: "x!4", C: "x!2 ~@2",
})).gain(0.64)

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

stack(
  overdriven_guitar, overdriven_guitar_2, alto_sax, alto_sax_soft, bass, lead_1_square, pad_new_age, guitar_harmonics,
  kick, snare, clap, low_tom, pedal_hat, mid_tom, ride, splash
)