Strudelify
Venus cover art

1986 · True Confessions

Venus

Bananarama

KeyE minorTempo128 bpm
0:00/0:00
// Venus — Bananarama
// 128 bpm, 4/4, key E minor. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 130 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(128/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 · synth bass 1 · "Bass"
const bass = note(`<
  ~@3 A@2 B ~ A@11 C D E A F G H A@2 G H A@9 C D E A F G H A@2 G H A@2 I J A@7 C D E A F G H A@2 G H A@9 C D E A F G H
  A@2 G H A@2 I J ~@2 A@32 ~
>`.pickRestart({
  A: "e1 ~ e1 ~ g1 ~ e1 ~ a1 ~ a1 ~ d1 ~ d#1 ~", B: "e1@3 ~@13", C: "e1 ~ e1 ~ g1 ~ a1@2 [a#1,b1] ~ b1 ~ a1 ~ g1 ~",
  D: "a1 ~ a1 ~ c2 ~ a1 ~ d2 ~ d2 ~ g1 ~ g#1 ~", E: "a1 ~ a1 ~ c2 ~ a1 ~ d2 ~ d2 ~ d1 ~ d#1 ~",
  F: "e1 ~ e1 ~ g1 ~ e1 ~ a1 ~ a1 ~ a#1 ~ b1 ~", G: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~",
  H: "b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1!3 a1 g1 f#1", I: "b1@3 ~ b1@3 ~, ~@8 a#1 ~@7", J: "b1@3 ~ b1@3 ~, a#1 ~@7 a#1 ~@7",
})).s("gm_synth_bass_1").gain(0.49)

// chords · lead 2 sawtooth · "Synth"
const lead_2_sawtooth = note(`<
  ~@3 A B ~@2 A B A B A B A B A B A C D E A B F G A B F G A B A B A B A B A C D E A B F G A B F G A B ~ H I J K L I J M
  N D E A B F G A B F G A B ~@8 D E A B F G A B F G A B ~@4 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: "[e3,g3,b3] ~ [e3,g3,b3] ~@5 [e3,a3,c#4] ~ [e3,a3,c#4] ~@5", // Em A
  B: "[g3,b3,d4] ~ [g3,b3,d4] ~@5 [e3,a3,c#4] ~ [e3,a3,c#4] ~@5", C: "[g3,b3,d4] ~ [g3,b3,d4] ~@13",
  D: "[e3,a3,c4] ~ [e3,a3,c4] ~@5 [f#3,a3,d4] ~ [f#3,a3,d4] ~@5", // Am D
  E: "[a3,c4,e4] ~ [a3,c4,e4] ~@5 [f#3,a3,d4] ~ [f#3,a3,d4] ~@5", // Am D
  F: "[g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~", // C
  G: "[b3,c#4,e4] ~ [b3,c#4,e4] ~ [b3,c#4,e4] ~ [b3,c#4,e4] ~ [f#3,b3,d#4]@6 ~@2", H: "~@4 b3@3 ~ e4@3 ~ f#4@3 ~",
  I: "g4@3 ~@5 f#4@3 ~@5", J: "g3@2 a3@2 b3@2 e3@5 ~@5", K: "g4@3 ~ f#4@3 ~ e4@3 ~ d4@3 ~", L: "d4 e4 ~@3 b3 e4 f#4",
  M: "[g4,b4]@3 ~ [f#4,a4]@3 ~ [e4,g4]@3 ~ [d4,f#4]@3 ~", N: "[d4,f#4] [e4,g4] ~@6",
})).s("gm_lead_2_sawtooth").gain(0.29)

// chords · electric guitar clean · "Guitar"
const electric_guitar_clean = note(`<
  ~ A B ~@2 A B ~@14 C@2 D E F ~ D E F ~@11 C@2 D E F ~ D E F ~ G ~ H I H I H I H ~@3 C@2 D E F ~ D E F ~@11 C@2 D E F ~
  D E F ~@4 B ~@2 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@2
>`.pickRestart({
  A: "[e4,f#4,b4]!4 [e4,f#4,b4]@2 [e4,f#4,b4]!2 ~ [e4,f#4,b4] [e4,f#4,b4]@2 ~@2 [e4,f#4,b4]!2", // Esus2
  B: "[e4,f#4,b4]!4 [e4,f#4,b4]@2 [e4,f#4,b4]!2 ~ [e4,f#4,b4] [e4,f#4,b4]@2 ~@4", // Esus2
  C: "~@2 [e4,f#4,b4]@2 [e4,f#4,b4]!2 ~@2 [e4,f#4,b4]!4 ~@4", D: "[e3,g3,c4]@13 ~@3",
  E: "[e3,f#3,b3]@3 ~ [d#3,f#3,b3]@3 ~", F: "[g3,b3,e4]@13 ~@3", G: "~@12 [e4,f#4,b4]!4",
  H: "[e3,g3,b3] ~ [e3,g3,b3] ~@5 [e3,a3,c#4] ~ [e3,a3,c#4] ~@5", // Em A
  I: "[g3,b3,d4] ~ [g3,b3,d4] ~@5 [e3,a3,c#4] ~ [e3,a3,c#4] ~@5", // G A
})).s("gm_electric_guitar_clean").gain(0.33)

// other · synth strings 1 · "Strings"
const synth_strings_1 = note(`<
  ~@18 A B C D ~@16 A B C D ~@10 E F G H I J G K A B C D ~@17 B C D ~@21 L M N ~@13 L M N ~@6
>`.pickRestart({
  A: "~ e4 g4 a4 b4!2 a4 g4, ~@8 a#4 ~@7", B: "a4@7 ~ b4@7 ~", C: "c5@7 ~ d5@7 ~", D: "e5@7 ~@9",
  E: "~@4 [b3,b4]@3 ~ [e4,e5]@3 ~ [f#4,f#5]@3 ~", F: "[g4,g5]@3 ~@5 [f#4,f#5]@3 ~@5",
  G: "[g3,g4]@2 [a3,a4]@2 [b3,b4]@2 [e3,e4]@5 ~@5", H: "[g4,g5]@3 ~ [f#4,f#5]@3 ~ [e4,e5]@3 ~ [d4,d5]@3 ~",
  I: "[d4,d5] [e4,e5] ~@3 [b3,b4] [e4,e5] [f#4,f#5]", J: "[g4,g5,b5]@3 ~@5 [f#4,f#5,a5]@3 ~@5",
  K: "[g4,b4,g5]@3 ~ [f#4,a4,f#5]@3 ~ [e4,g4,e5]@3 ~ [d4,f#4,d5]@3 ~", L: "a3@7 ~ b3@7 ~", M: "c4@7 ~ d4@7 ~",
  N: "e4 ~",
})).s("gm_synth_strings_1").gain(0.29)

// other · vibraphone · "Bell Synth"
const vibraphone = note(`<
  A B ~@2 A B A B C D ~@4 E@2 ~@7 F G H ~ F G H ~@4 E@2 ~@7 F G H ~ F G H ~@15 F G H ~ F G H ~@13 F G H ~ F G H ~@2 A B
  I ~@2 A J A H ~@4 A J A H ~@4 A J A H ~@4 A J A H ~@3
>`.pickRestart({
  A: "~@14 e5 b5", B: "e6@3 ~@5", C: "~@14 b6 e6", D: "b5@3 ~@5", E: "[~@10 e6@2 b5@2 e5@15 ~@3]/2", F: "c6@13 ~@3",
  G: "b5@3 ~ b5@3 ~", H: "e6@13 ~@3", I: "~@5 e6 b5 e5", J: "d6@13 ~@3",
})).s("gm_vibraphone").gain(0.29)

// drums · kick
const kick = s("bd").struct(`<
  ~@3 A@21 B A@3 B A@15 B A@3 B A@17 B A@3 B A@8 C A@6 B A@3 B A@13 C A@7 C A@7 C A@7 C ~
>`.pickRestart({
  A: "x!4", B: "x ~@3 x ~@3 x ~ x!6", C: "x ~@3 x ~@3 x ~@3 x ~ x!2",
})).gain(0.42)

// drums · rim
const rim = s("rim").struct("<~@95 [~ x!3 ~@4] ~@34>").gain(0.42)

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

// drums · clap
const clap = s("cp").struct(`<
  ~@25 A B ~@2 A B ~@14 A B ~@2 A B ~ C ~@3 C ~@10 A B ~@2 A B ~@14 A B ~@2 A B ~@3 C A D A D A D A D A D A D A D A D A
  D A D A D A D A D A D A D A D E
>`.pickRestart({
  A: "~@2 x ~ x ~ x ~ x ~ x!2 ~ x!2 ~", B: "~@2 x ~ x ~ x ~ x ~ x!2 ~@4", C: "~@5 x!3",
  D: "~@2 x ~ x ~ x ~ x ~ x!2 ~ x!3", E: "x ~ x ~ x ~ x ~ x ~ x!2 ~ x!2 ~",
})).gain(0.42)

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

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@8 A ~ A ~@3 B ~@5 A ~ A ~@3 A ~@3 A ~@3 B ~@5 A ~ A ~@3 A ~@3 A ~ C ~@3 B ~@5 A ~ A ~@3 A ~@3 A ~@9 A ~ A ~@3 A ~@3
  A ~@3 C ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~ x ~@2 x ~@3", B: "~ x!2 ~@5", C: "~@7 x",
})).gain(0.42)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A ~@3 A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~
  A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~ A ~ A ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~@15 x",
})).gain(0.42)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@8 A ~ A ~@7 B ~ A ~ A ~@3 A ~@3 A ~@7 B ~ A ~ A ~@3 A ~@3 A ~ C ~@7 B ~ A ~ A ~@3 A ~@3 A ~@9 A ~ A ~@3 A ~@3 A ~@3
  D ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~ x ~@6", B: "x", C: "~@5 x!2 ~", D: "~@5 x!3",
})).gain(0.42)

// drums · congas
const congas = s("conga:13").struct("<~@95 [~@2 x ~ x ~ x ~ x ~ x!2 ~ x!2 ~] [~@2 x ~ x ~ x ~ x ~ x!2 ~ x!3] ~@33>")
  .gain(1.12)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~@12 A ~@3 A ~@15 A ~@3 A ~@17 A ~@3 A ~@71>".pickRestart({
  A: "~@7 x!2 ~ x ~ x ~@3",
})).gain(2.24)

// drums · agogo bells
const agogo_bells_2 = s("agogo:4").struct("<~@12 A ~@3 A ~@15 A ~@3 A ~@17 A ~@3 A ~@71>".pickRestart({
  A: "~@3 x ~@4",
})).gain(2.24)

// drums · shaker
const shaker = s("sh").struct("<~@7 A@11 ~ A@19 ~ A@12 ~@2 A@7 ~ A@12 ~@8 A@12 ~@4 A@32 ~>".pickRestart({
  A: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2",
})).gain(0.35)

// drums · woodblocks
const woodblocks = s("woodblock:4").struct(`<
  ~@7 A B A B A B A B A B A ~ A B A B A B A B A B A B A B A B A B A ~ A B A B A B A B A B A B ~@2 A B A B A B A ~ A B A
  B A B A B A B A B ~@8 A B A B A B A B A B A B ~@4 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: "x ~ x ~ x ~ x ~ x ~ x!2 ~ x!2 ~", B: "x ~ x ~ x ~ x ~ x ~ x!2 ~ x!3",
})).gain(0.51)

stack(
  bass, lead_2_sawtooth, electric_guitar_clean, synth_strings_1, vibraphone, kick, rim, snare, clap, low_tom, hihat,
  mid_tom, open_hat, high_tom, congas, agogo_bells, agogo_bells_2, shaker, woodblocks
)

More by Bananarama