Strudelify
Red Red Wine cover art

1984 · Labour Of Love

Red Red Wine

UB40

KeyD♭ majorTempo92 bpm
0:00/0:00
// Red Red Wine — UB40
// 92 bpm, 4/4, key Db major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// 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(92/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · slap bass 2 · "SLAPBASS 2"
const bass = note(`<
  ~ A B A C A B D E A B A C A B D E A B F G H I J K H L A B A C A B D E A C A B F G H I J K H L A B A C A B D E A B A L
  A B A C A B D E A B A B A B M
>`.pickRestart({
  A: "a1@3 a2 a1@2 a2@2 d1@3 d2 d1@2 d2@2", B: "b1@3 b2 b1@2 b2@2 e1@3 e2 e1@2 e2@2",
  C: "b1@3 b2 b1@2 b2@2 e1@3 e2 d2@2 b1@2", D: "e1@3 e2 e1@2 e2@2 e1@3 e2 d2@2 b1@2",
  E: "d1@3 d2 c2@2 d2@2 e1@3 e2 d2@2 b1@2", F: "e1@3 e2 d2@2 b1@2 e1@3 e2 e1@2 e2@2",
  G: "a1@3 a2 g2@2 e2@2 a1@3 a2 a1@2 a2@2", H: "d1@3 d2 d1@2 d2@2 d1@3 d2 d1@2 d2@2",
  I: "a1@3 a2 a1@2 a2@2 a1@3 a2 g2@2 e2@2", J: "e1@3 e2 e1@2 e2@2 e1@3 e2 e1@2 e2@2",
  K: "a1@3 a2 a1@2 a2!2 a1 a1@2 a2 a1@2 a2@2", L: "e1@3 e2 d2@2 b1@2 e1@4 a2@4", M: "a2",
})).s("gm_slap_bass_2").gain(0.42)

// chords · marimba
const marimba = note(`<
  ~ A B A B A B C D A E A F A B G H A B I J K J I J K I A B A B A B C D A L A L I J K J I J K I A B A B A B C D A L A L
  A B A B A B C D A D A D A M N
>`.pickRestart({
  A: "~@2 [db5,e5,a5] ~@3 [db5,e5,a5] ~@3 [d5,gb5,a5] ~@3 [d5,gb5,a5] ~", // A D
  B: "~@2 [b4,e5,ab5] ~@3 [b4,e5,ab5] ~@3 [d5,gb5,a5] ~@3 [d5,gb5,a5] ~", // E D
  C: "~@2 [b4,e5,ab5] ~@3 [b4,e5,ab5] ~@3 [b4,e5,ab5] ~@3 [b4,e5,ab5] ~", // E
  D: "~@2 [d5,gb5,a5] ~@3 [d5,gb5,a5] ~@3 [b4,e5,ab5] ~@3 [b4,e5,ab5] ~", // D E
  E: "~@2 [b4,e5,ab5] ~@3 [b4,e5,gb5,ab5] ~@3 [d5,gb5,a5] ~@3 [d5,gb5,a5] ~", // E D
  F: "~@2 [b4,e5,gb5,ab5] ~@3 [b4,e5,ab5] ~@3 [d5,gb5,a5] ~@3 [d5,gb5,a5] ~", // E D
  G: "~@2 [b4,e5,ab5] ~@3 [b4,e5,ab5] ~@3 [b4,e5,gb5,ab5] ~@3 [b4,e5,ab5] ~", // E
  H: "~@2 [d5,gb5,a5] ~@3 [d5,gb5,a5] ~@3 [b4,e5,ab5] ~@3 [b4,e5,gb5,ab5] ~", // D E
  I: "~@2 [ab4,b4,e5] ~@3 [ab4,b4,e5] ~@3 [ab4,b4,e5] ~@3 [ab4,b4,e5] ~", // E
  J: "~@2 [db5,e5,a5] ~@3 [db5,e5,a5] ~@3 [db5,e5,a5] ~@3 [db5,e5,a5] ~", // A
  K: "~@2 [d5,gb5,a5] ~@3 [d5,gb5,a5] ~@3 [d5,gb5,a5] ~@3 [d5,gb5,a5] ~", // D
  L: "~@2 [b4,e5,a5] ~@3 [b4,e5,a5] ~@3 [ab4,b4,e5] ~@3 [ab4,b4,e5] ~", // Esus4 E
  M: "~@2 [b4,e5,ab5] ~@3 [b4,e5,ab5] ~ [d5,gb5,a5]@4 [b4,e5,ab5]@4", N: "[db5,e5,a5] ~@3",
})).s("gm_marimba").gain(0.14)

// chords · rock organ · "ORGAN 3"
const rock_organ = note(`<
  ~ A B A B A B C D A B A B A B C E A B F G H G F G H F A B A B A B C D I J I J F G H G F G H F A B A B A B C D I J I K
  L B A B A B C D A D M D M N O
>`.pickRestart({
  A: "~@2 [a4,db5,e5] ~@3 [a4,db5,e5] ~@3 [a4,d5,gb5] ~@3 [a4,d5,gb5] ~", // A D
  B: "~@2 [b4,e5,ab5] ~@3 [b4,e5,ab5] ~@3 [a4,d5,gb5] ~@3 [a4,d5,gb5] ~", // E D
  C: "~@2 [b4,e5,ab5] ~@3 [b4,e5,ab5] ~@3 [b4,e5,ab5] ~@3 [b4,e5,ab5] ~", // E
  D: "[d5,gb5,a5,d6]@2 [gb5,a5] ~@3 [d5,gb5,a5] ~ [b4,e5,ab5]@4 [e5,ab5,b5]@4", // D Gbm D E
  E: "~@2 [a4,d5,gb5] ~@3 [a4,d5,gb5] ~@3 [b4,e5,ab5] ~@3 [b4,e5,ab5] ~", // D E
  F: "~@2 [b3,e4,ab4] ~@3 [b3,e4,ab4] ~@3 [b3,e4,ab4] ~@3 [b3,e4,ab4] ~", // E
  G: "~@2 [db4,e4,a4] ~@3 [db4,e4,a4] ~@3 [db4,e4,a4] ~@3 [db4,e4,a4] ~", // A
  H: "~@2 [a3,d4,gb4] ~@3 [a3,d4,gb4] ~@3 [a3,d4,gb4] ~@3 [a3,d4,gb4] ~", // D
  I: "~@2 [db4,e4,a4] ~@3 [db4,e4,a4] ~@3 [a3,d4,gb4] ~@3 [a3,d4,gb4] ~", // A D
  J: "~@2 [b3,e4,a4] ~@3 [b3,e4,a4] ~@3 [b3,e4,ab4] ~@3 [b3,e4,ab4] ~", // Esus4 E
  K: "~@2 [b3,e4,a4] ~@3 [b3,e4,a4] ~@3 [e4,ab4,b4] ~@3 [e4,ab4,b4] ~", // Esus4 E
  L: "~@2 [e4,a4,db5] ~@3 [e4,a4,db5] ~@3 [a4,d5,gb5] ~@3 [a4,d5,gb5] ~", // A D
  M: "~@2 [db5,e5,a5] ~@3 [a4,db5,e5] ~@3 [a4,d5,gb5] ~@3 [a4,d5,gb5] ~", // A D
  N: "~@2 [b4,e5,ab5] ~@3 [b4,e5,ab5] ~ [a4,d5,gb5]@4 [b4,e5,ab5]@4", O: "[e4,db5,e5,a5] ~",
})).s("gm_rock_organ").gain(0.22)

// drums · kick
const kick = s("bd").struct("<A B@7 C B@7 C B@2 C@8 B@7 C B@4 C@8 B@7 D B@11 C B C B C B@2 E>".pickRestart({
  A: "~ x", B: "x!2", C: "x ~@7 x ~@2 x ~@4", D: "x ~@3 x ~@2 x", E: "x",
})).gain(0.48)

// drums · rim
const rim = s("rim").struct("<~ [~@4 x!3 ~@5 x!3 ~]!53 [~@4 x!3 ~@9] [~@4 x!3 ~@5 x!3 ~]!18 ~>").gain(0.24)

// drums · snare
const snare = s("sd").struct("<~ A@17 B A@17 B A B A@15 C A B A B A@14 D>".pickRestart({
  A: "~@4 x!2 ~@6 x!2 ~@2", B: "~@4 x!2 ~@6 x!2 ~ x", C: "~@4 x!2 ~@10", D: "x",
})).gain(0.12)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~ [~@3 x ~@3 x]!53 [~@3 x ~@4] [~@3 x ~@3 x]!18 ~>").gain(0.06)

// drums · low tom
const low_tom = s("lt").struct("<[~@7 x] ~@25 [~ x!4 ~@6 x!4 ~] ~@19 [~ x!4 ~@6 x!4 ~] ~@7 [~@7 x] ~@19>").gain(0.36)

// drums · hihat
const hihat = s("hh").struct(`<
  A B C B C B C@3 B C B C B C B C B C@9 B C B C B C@3 B C B C@9 B C B C B C@3 B C B C B C B C B C@3 B C B C B C ~
>`.pickRestart({
  A: "~@2 x!2", B: "~@2 x ~ x ~ x ~ x!3 ~ x ~ x ~", C: "x!3 ~ x ~ x ~ x ~ x ~ x ~ x ~",
})).gain(0.36)

// drums · mid tom
const mid_tom = s("mt").struct("<~@25 [~@15 x] [~@7 x!4 ~@5] ~@18 [~@15 x] [~@7 x!4 ~@5] ~@27>").gain(0.3)

// drums · open hat
const open_hat = s("oh").struct("<[~ x] ~@53 [~ x] ~@18 x>").gain(0.36)

// drums · crash
const crash = s("cr").struct("<~@73 x>").gain(0.18)

// drums · cowbell
const cowbell = s("cb").struct("<~ [~ x ~ x ~ x ~ x]!72 ~>").gain(0.3)

// drums · ht
const ht = s("ht").struct("<[~@11 x!2 ~@3] ~@53 [~@11 x!2 ~@3] ~@19>").gain(0.48)

stack(bass, marimba, rock_organ, kick, rim, snare, snare_soft, low_tom, hihat, mid_tom, open_hat, crash, cowbell, ht)

More by UB40