Strudelify
Opposites Attract cover art

1988 · Forever Your Girl

Opposites Attract

Paula Abdul

KeyF majorTempo120 bpm
0:00/0:00
// Opposites Attract — Paula Abdul
// 120 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 6 "FINGERDBAS" electric bass finger (copy of ch 2 "PICK BASS" electric bass pick); ch 5 "ORGAN 2" percussive organ (copy of ch 4 "MELODY" alto sax)
// note: Full arrangement: all 74 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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 · epiano1 · "E.PIANO 1"
const epiano1 = note(`<
  A B ~ C@2 D E@3 F G H I F G H I J E@3 J E@3 F G H I F G H I J E@3 J E@3 J E@3 K L M@2 J E@3 J E@3 J E@3 J E@3 J E@3 J
  E@3 N
>`.pickRestart({
  A: "~@8 [e2,f2] ~@4 f4 c5 [d5,e5,f5,g5,a5]", B: "[c6,g6,bb6]@3 [a6,b6] [a5,b5,c6,d6,e6] [e5,f5,g5] ~@10",
  C: "[~@14 [bb3,d4,f4]@8 ~@6 [eb5,g5,bb5,c6]@3 e5, ~@11 [a3,c4,f4]@4 ~]/2", D: "[c4,eb4,f4]@3 ~@13, [b4,c5,d5] ~@15",
  E: "[~@15 [c4,f4]@3 eb4 ~@11 [bb4,d5,f5]@8 [a4,c5,f5]@8 ~@2]/3", F: "c3 ~@5 c3!2 eb3@2 ~@6",
  G: "eb3@2 f3 ~@3 f3@4 eb3@4 eb2 ~", H: "eb2 f2 ~ f3@2 f2 eb3 ~", I: "bb3@2 ~@4 a3@2 ~@2 a3 f3 f2@2 a3@2",
  J: "[c4,eb4,f4,bb4]@3 ~@13", K: "[bb4,c5,eb5]@2 ~ [c5,eb5] ~@6 [bb4,c5] ~@2 [bb4,c5] ~@2",
  L: "[bb4,c5,eb5]@2 ~ [bb4,eb5] ~@2 [bb4,eb5] ~@3 bb4 g4@2 bb4 g4@2", // Cm7 Eb5
  M: "[~@2 [bb4,c5,eb5] ~@2 [bb4,c5,eb5] ~@2 [bb4,c5,eb5]@6 [d5,f5]@8 [a4,c5,f5]@8 ~@2, ~@7 bb4@3 ~@6]/2", // Cm7 Dm F
  N: "[c4,g4,c5] ~@15, g5 ~@7", // C5
})).s("gm_epiano1").gain(0.41)

// chords · epiano1 · "E.PIANO 1" · soft notes
const epiano1_soft = note("<A B ~@2 C ~@5 D ~@3 D ~@11 D ~@3 D ~@14 E ~@28>".pickRestart({
  A: "~@9 [g2,a2,b2] [c3,d3] [e3,f3,g3] [a3,b3,c4] [d4,e4,g4] [a4,b4] ~", B: "c7@3 f6 ~ d5 ~@10, b5 ~@15",
  C: "~@15 [f5,ab5,a5,b5]", D: "~@15 eb3", E: "~@3 bb4 ~@12",
})).s("gm_epiano1").gain(0.2)

// bass · electric bass pick · "PICK BASS"
const bass = note(`<
  ~@4 A B C D@2 E F G H E F G H B C D@2 B C D@2 E F G H E F G H B C D@2 B C D@2 B C D@2 I J K@2 B C D@2 B C D@2 B C D@2
  B C D@2 B C D@2 B C D@2 L
>`.pickRestart({
  A: "~@9 eb2 eb1 ~ eb2 eb1 e2 f2", B: "c2 ~@4 c2 g1 ~ c2@2 g1 ~@2 g1 ~@2", C: "f1@2 eb1 ~@2 f1 c2 ~ c2 ~@3 c2 g1 c2 ~",
  D: "[c2 ~@4 g1 c2 ~ c2@2 f1 ~ c2 ~ bb1@6 ~@2 a1@3 ~ f1@2 f2@2 f1 ~]/2", E: "c2 ~@5 c2!2 eb2@2 ~@6",
  F: "eb2@2 f2 ~@3 f2@4 eb2@4 eb1 eb2", G: "eb1 f1 ~ f2@2 f1 eb2 ~", H: "bb2@2 ~@4 a2@2 ~@2 a2 f2 f1@2 a2@2",
  I: "c2 ~ c2 ~@2 c2 bb1 ~ c2 ~ c2 ~@5", J: "c2 ~ c2 ~@2 c2 g1 c2 ~@8",
  K: "[c2 ~ c2 ~@2 c2 g1 ~ c2 ~ c2 ~@3 bb1@6 ~@2 a1 ~@3 a1@2 f1@2 ~@2]/2", L: "c2 ~@7",
})).s("gm_electric_bass_pick").gain(0.36)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@4 A B ~@11 B ~@3 B ~@11 B ~@3 B ~@3 B ~@6 C D E F@2 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 G
>`.pickRestart({
  A: "~@12 [eb5,g5,bb5,c6]@3 e5", B: "[a4,b4,c5,d5] ~@15", C: "~@3 bb5@5", D: "~ f4@7", E: "~@6 bb4@9 ~",
  F: "[f4@19 ~ g4 f4 ~ g4 ~ g4 ~ g4 f4!2 ~ eb4]/2", G: "[c3,g3,c4] ~@15",
})).s("gm_acoustic_guitar_steel").gain(0.41)

// chords · acoustic guitar steel · "STEEL GTR" · soft notes · Fdim
const acoustic_guitar_steel_2 = note("<~@4 [~@15 [f5,ab5,a5,b5]] ~@69>").s("gm_acoustic_guitar_steel").gain(0.2)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  A B C D@2 E F@3 G H I J G H I J K C K C K C K C G H I J G H I J K C K C K C K C L M N@2 ~@8 K C K C K C K C K C K C K
  C K C K C K C O
>`.pickRestart({
  A: "~@8 [e2,f2] [g2,a2,b2] [c3,d3] [e3,f3,g3] [a3,b3,c4] [d4,e4,f4,g4] [a4,b4,c5] [d5,e5,f5,g5,a5]", // Fmaj7 G Csus2 Em Am Em7 Am Dm
  B: "[c3,b5] ~ c3 [f6,a6,b6] [f3,bb3,eb4,a5,b5,c6,d6,e6] [d5,e5,f5,g5] c3 [f3,bb3,eb4] ~ c4 ~ c4 bb3 ~ c4 ~, [c6,g6,bb6,c7] ~@3", // Cmaj7 Bm7b5 F7 Em7 Ebsus2 C7
  C: "~@2 [bb3,eb4] ~@2 [bb3,eb4] ~@2 bb2 c3!3 [bb2,f3,bb3] c3 [eb3,g3] [c3,f3]", // Eb5 Bb5 Eb F5
  D: "[c3 ~ c3 ~ [f3,bb3,eb4] ~ c3 [f3,bb3,eb4] ~ c4 ~ c4 bb3 ~ bb3@4 bb3@3 [bb3,eb4] ~@2 bb2 c3!3 [bb2,f3,bb3] c3 [eb3,g3] [c3,f3,e5,f5,ab5,a5,b5], ~@7 [d4,f4]@4 [a3,c4,f4]@4 ~, ~@14 c4 ~@3 eb4 ~@9 [eb5,g5,bb5,c6]@4]/2", // Ebsus2 Eb5 Bb5 Eb Fmaj7 Dm F Cm7
  E: "[c3,b4,c5,d5] ~ c3 ~ [f3,bb3,eb4] ~ c3 [f3,bb3,eb4] ~ c4 ~ c4 bb3 ~ c4 ~, [c4,eb4,f4] ~@7", // G Ebsus2 F7
  F: "[~@2 [bb3,eb4] ~@2 [bb3,eb4] ~@2 bb2 c3!3 [bb2,f3,bb3] c3 [eb3,g3] [c3,f3] c3 ~ [c3,eb4] ~ [f3,bb3,eb4] ~ c3 [f3,bb3,eb4] ~ c4 ~ c4 bb3 ~ c4 ~@3 [bb3,eb4] ~@2 [bb3,eb4] ~@2 bb2 c3!3 [bb2,f3,bb3] c3 [eb3,g3] [c3,f3], ~@15 [c4,f4]@4 ~@11 [bb4,d5,f5]@8 [a4,c5,f5]@8 ~@2]/3", // Eb5 Bb5 Eb F5 Cm Ebsus2 Eb5 Bb5 …
  G: "[c3,f3,bb3,eb4] c3 [f3,bb3,eb4] ~@3 c3!2 eb3@2 [f3,bb3] ~@5", // Cm7 Ebsus2 Bb5
  H: "eb3@2 f3 ~@3 f3@4 ~@2 [f3,bb3,eb4] c3 eb2 eb3, ~@5 eb3@2 ~", // Ebsus2
  I: "eb2@2 [f3,bb3,eb4] ~@2 [f3,bb3,eb4] f3@4 f2@2 eb3@2 ~@2, ~ f2 ~@6", // Ebsus2
  J: "[bb3,d4,f4]@5 ~ a3@4 ~ f3 f2@2 a3@2, ~@3 [c4,f4]@4 ~, ~@5 a3@2 ~", // Bb F5
  K: "c3 ~ c3 ~ [f3,bb3,eb4] ~ c3 [f3,bb3,eb4] ~ c4 ~ c4 bb3 ~ c4 ~", // Ebsus2
  L: "[g3,bb3,c4] c3 ~@7 c3 [bb2,bb3,eb4] [bb3,eb4] c3@2 c3 ~", M: "c2 c3 ~ c2@2 c3 ~@4 [g3,bb3,c4,d4] [g3,bb3,d4] ~@4",
  N: "[~@2 bb2 c3@2 bb2 c3 ~ bb2 ~ eb4 ~@3 [bb3,d4,f4]@7 ~ [a3,c4,f4]@7 ~@3]/2", O: "[f4,g4,bb4] ~@7, c4 ~@15",
})).s("gm_piano").gain(0.25)

// chords · clavinet
const clavinet = note(`<
  ~ A B A B A B A B C D E F C D E F A B A B A B A B C D E F C D E F A B A B A B A B A B A B G H I@2 A B A B A B A B A B
  A B A B A B A B A B A B A B J
>`.pickRestart({
  A: "c3 ~ c3 ~ [f3,bb3,eb4] ~ c3 [f3,bb3,eb4] ~ c4 ~ c4 bb3 ~ c4 ~", // Ebsus2
  B: "~@2 [bb3,eb4] ~@2 [bb3,eb4] ~@2 bb2 c3!3 [bb2,f3,bb3] c3 [eb3,g3] [c3,f3]", // Eb5 Bb5 Eb F5
  C: "[f3,bb3,eb4] c3 [f3,bb3,eb4] ~@7 [f3,bb3] ~@5", D: "~@12 [f3,bb3,eb4] c3 ~@2",
  E: "~@2 [f3,bb3,eb4] ~@2 [f3,bb3,eb4] ~@10", F: "[bb3,d4,f4]@5 ~ [a3,c4,f4]@8 ~@2",
  G: "[g3,bb3,c4] c3 ~@7 c3 [bb2,bb3,eb4] [bb3,eb4] c3@2 c3 ~", H: "c2 c3 ~ c2@2 c3 ~@4 [g3,bb3,c4,d4] [g3,bb3,d4] ~@4",
  I: "[~@2 bb2 c3@2 bb2 c3 ~ bb2 ~ [bb3,eb4] ~ db4 ~ [bb3,d4,f4]@7 ~ [a3,c4,f4]@7 ~@3, ~@14 gb4 ~@17]/2", // Eb5 Bb F
  J: "[f4,g4,bb4] ~@7, c4 ~@15", // Gm7
})).s("gm_clavinet").gain(0.36)

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

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

// drums · clap
const clap = s("cp").struct("<~@17 [~ x ~ x]!8 ~@8 [~ x ~ x]!16 ~@4 [~ x ~ x]!20 ~>").gain(0.46)

// drums · low tom
const low_tom = s("lt").struct("<~@72 [~@14 x!2] x>").gain(0.51)

// drums · hihat
const hihat = s("hh").struct("<[~@8 x!8] [x!5 ~@3 x!5 ~@3]!3 [x!16] [x!5 ~ x ~ x!5 ~ x ~]!68 ~>").gain(0.15)

// drums · mid tom
const mid_tom = s("mt").struct("<~@17 [~ x ~ x]!8 ~@8 [~ x ~ x]!12 ~@8 [~ x ~ x]!19 [~@4 x ~@5 x ~ x!2 ~@2] ~>")
  .gain(0.51)

// drums · high tom
const high_tom = s("ht").struct("<~@72 [~ x] ~>").gain(0.51)

// drums · crash
const crash = s("cr").struct(`<
  ~@9 A ~@7 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@4
>`.pickRestart({
  A: "x",
})).gain(0.51)

// drums · tambourine
const tambourine = s("tb").struct("<~@5 [x!2 ~ x!2 ~ x ~]!68 ~>").gain(0.46)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@5 [~@5 x ~ x]!68 ~>").gain(0.15)

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

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  ~ 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 ~
>`.pickRestart({
  A: "~@5 x ~@7 x ~ x", B: "~@6 x ~@6 x ~ x",
})).gain(0.78)

stack(
  epiano1, epiano1_soft, bass, acoustic_guitar_steel, acoustic_guitar_steel_2, piano, clavinet, kick, snare, clap,
  low_tom, hihat, mid_tom, high_tom, crash, tambourine, tambourine_soft, cabasa, cabasa_soft
)

More by Paula Abdul