Strudelify
Red Red Wine cover art

The Origins

Red Red Wine

Neil Diamond

KeyD♭ majorTempo90 bpm
0:00/0:00
// Red Red Wine — Neil Diamond
// 90 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 68 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(90/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, A@4 for four bars: edit a riff to change every repeat.

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  ~ A B C D C E F G A B C D C E F G H I J K L M N O P Q A B C D C E F G R S T I U@3 V@3 W@2 A B C D C E F G R S T I A B
  C D C E F G X
>`.pickRestart({
  A: "db2@4 ~@2 db3 ~ db2@4 db3@2 ~@2 gb1@4 ~@2 gb2 ~ gb1@4 gb2@2 ~@2",
  B: "eb2@5 ~ eb3 ~ eb2@3 ~ eb3@2 ~ ab1@5 ~@2 ab2 ~ ab1@4 ab2@2 ~@2",
  C: "db2@5 ~ db3 ~ db2@3 ~ db3@2 ~@2 gb1@5 ~ gb2 ~ gb1@4 gb2@2 ~@2",
  D: "eb2@5 ~ eb3 ~ eb2@3 ~ eb3@3 ~ ab1@6 ab2@2 gb2@3 ~ eb2@3 ~",
  E: "eb2@5 ~ eb3 ~ eb2@4 eb3@2 ~@2 ab1@5 ~ ab2 ~ ab1@4 ab2@2 ~@2",
  F: "ab1@5 ~ ab2 ~ ab1@4 ab2@2 ~@2 ab1@5 ~ ab2 ~ gb2@3 ~ eb2@3 ~",
  G: "gb1@5 ~@2 gb2 e2@3 ~ gb2@3 ~ ab1@5 ~ ab2@2 gb2@3 ~ eb2@4", H: "db2@6 db3 ~ db2@4 db3@3 gb1@6 ~ gb2 gb1@5 gb2@3 ~",
  I: "eb2@6 eb3 ~ eb2@4 eb3@3 ~ ab1@6 ab2@2 ab1@4 ab2@3 ~", J: "ab1@3 ab2 gb2@2 eb2@2 ab1@3 ab2 ab1@2 ab2@2",
  K: "db2@6 db3@2 b2@4 ab2@3 ~ db2@6 db3@2 db2@4 db3@3 ~", L: "gb1@6 gb2@2 gb1@4 gb2@4 gb1@6 gb2@2 gb1@4 gb2@3 ~",
  M: "db2@7 db3@2 db2@4 db3@3 db2@6 db3@2 b2@4 ab2@4", N: "ab1@6 ab2@2 ab1@4 ab2@4 ab1@6 ab2@2 ab1@4 ab2@3 ~",
  O: "db2@6 db3@2 db2@4 db3 ~ db3@2 db2 ~ db2@4 db3@2 db2@4 db3@4",
  P: "gb1@5 ~@2 gb1@5 gb2@3 gb1@7 gb2@2 gb1@4 gb2@4, ~@3 gb2 ~@12", Q: "ab1@6 ab2@2 gb2@4 eb2@4 ab1@4 ~@4 db3@7 ~",
  R: "~ db2@5 db3 ~ db2@4 db3@3 ~ gb1@6 gb2 ~ gb1@4 gb2@3 ~", S: "eb2@6 ~ eb3 eb2@4 eb3@3 ~@2 ab1@5 ab2@2 gb2@4 eb2@4",
  T: "db2@6 db3@2 db2@4 db3@3 ~ gb1@6 ~@2 gb1@4 gb2@3 ~, ~@23 gb2@2 ~@7",
  U: "[ab1@6 ~ gb2@4 eb2@4 ~ ab1@6 ~ ab1@4 ab2@4 db2@6 db3@2 b2@4 ab2@3 ~ db2@6 db3@2 db2@4 db3@3 ~ gb1@6 gb2@2 gb1@4 gb2@4 gb1@7 gb2@2 gb1@4 gb2@3 ~, ~@3 ab2 ~@7 ab2 ~@36]/3",
  V: "[db2@6 db3@2 db2@4 db3@4 db2@6 ~ b2@4 ab2@4 ab1@6 ~@2 ab1@4 ab2@4 ab1@6 ab2@2 ab1@4 ab2@3 ~ db2@6 ~@2 db2@5 db3 ~ db3@2 db2 ~ db2@4 ~ db2@5 db3@4, ~@11 db3 ~@7 ab2 ~@15 db3 ~@7 db3 ~@4]/3",
  W: "[gb1@5 gb2@2 gb1@4 gb2@3 ~ gb1@6 gb2@2 gb1@4 gb2@4 ab1@6 ab2@2 gb2@4 eb2@4 ab1@4 ~@4 db3@7 ~@2]/2",
  X: "~ db2@6 ~@25",
})).s("gm_fretless_bass").gain(0.53)

// other · percussive organ · "ORGAN 2"
const percussive_organ = note(`<
  ~@8 A B@2 C@2 D E F ~@2 G@3 H@3 I J@2 K@2 L@2 M N O ~@5 P@2 Q R S T U@2 V@2 L@2 W N O ~@4 X Y@2 L@2 W N F ~@2
>`.pickRestart({
  A: "~@16 eb4@7 ~@2 ab4@7", B: "[db5@5 ~ bb4@2 ab4@7 ~ gb4@22 ~@10 c5@3 ~@2 c5@5 ~@2 c5@3 ~]/2",
  C: "[~ db5@7 ab4@8 gb4@24 ~@8 c5@4 ~@2 c5@5 ~ c5@4]/2", D: "~ db5@7 ab4@3 ~@2 ab4@7 ~@12",
  E: "~@16 gb4@4 f4@7 ~@2 eb4@3", F: "f4@5 ~@3",
  G: "[~@24 ab4@2 ~ ab4@3 ~ ab4@19 ~@6 ab4@3 ~ ab4@3 f4@6 ~@2 f4@15 ~@10]/3",
  H: "[gb4@5 ~ gb4@5 ~ gb4@7 ~ gb4@6 ~ gb4@3 ~ f4@3 ~@2 f4@14 ~@5 ab4@2 ~@2 ab4@2 ~@2 ab4@21 ~@4 ab4@3 ab4@3 ~@2]/3",
  I: "f4@6 ~ f4@11 ~@5 ab4@7 ~@2", J: "[~ gb4@6 ~ gb4@3 ~ gb4@9 ~@3 gb4@4 ab4@15 ~@5 db5@6 ~@2 db5@8]/2",
  K: "[ab4@6 ~@2 ab4@7 gb4@21 ~@12 c5@4 ~@2 c5@5 ~ c5@4]/2",
  L: "[db5@7 ~ ab4@7 ~ gb4@22 ~@10 c5@3 ~@2 c5@5 ~@2 c5@3 ~]/2", M: "db5@7 ~ ab4@3 ~ ab4@8 ~@12",
  N: "~@16 gb4@5 ~ f4@5 ~ eb4@3 ~", O: "f4@13 ~@3", P: "[~@23 ab4@3 ~ ab4@3 ~ f4@6 ~ f4@20 ~@6]/2",
  Q: "gb4@5 gb4@5 ~@2 gb4@7 gb4@6 ~@2 gb4@3 f4@2", R: "~@3 f4@15 ~@6 ab4@2 ~@2 ab4@2 ~@2",
  S: "ab4@17 ~@7 ab4@3 ~ ab4@3 ~", T: "f4@6 ~@2 f4@8 ~@8 ab4@7 ~",
  U: "[gb4@6 ~ gb4@3 ~ gb4@9 ~@3 gb4@4 ab4@15 ~@6 db5@6 ~@2 db5@8]/2",
  V: "[ab4@6 ~@2 ab4@8 gb4@24 ~@8 c5@3 ~@2 c5@5 ~@2 c5@3 ~]/2", W: "db5@7 ~ ab4@3 ~ ab4@4 ~@16", X: "~@8 db5@3 ~ db5@4",
  Y: "[ab4@6 ~@2 ab4@7 gb4@23 ~@10 c5@3 ~@2 c5@5 ~@2 c5@3 ~]/2",
})).s("gm_percussive_organ").gain(0.44).pan(0.4)

// chords · epiano1 · "E.PIANO 1"
const epiano1 = note(`<
  ~ A B A B A B C D A B E B A B C F A B C G H G C G H C A B A B A B C D A I A J C K L G M K L N A B A B A B C ~ A I A J
  A B A B A B C ~@2
>`.pickRestart({
  A: "~@4 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@3", // Db Gb
  B: "~@4 [ab4,c5]@2 ~@6 [eb4,ab4,c5] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@3, ~@4 eb4 ~@27", // Ab Gb
  C: "~@4 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@3", // Ab
  D: "~ gb5@8 ~@3 [db5,gb5,bb5]@2 ~@2 [eb4,ab4,c5]@6 ~@2 [db4,gb4,bb4]@6 ~@2, [db5,bb5] ~@3", // Gb Ab Gb
  E: "~@4 [db4,f4,ab4] ~@8 [db4,f4,ab4] ~@6 [db4,gb4,bb4] ~@7 [gb4,bb4]@2 ~@2, ~@28 db4 ~@3", // Db Gb
  F: "~@4 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@7 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@3", // Gb Ab
  G: "~@4 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@7 [db4,f4] ~@3, ~@14 ab4 ~", // Db
  H: "~@4 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4] ~@3, ~@14 bb4 ~", // Gb Gb5
  I: "~@4 [gb4,bb4,db5] ~@7 [gb4,bb4,db5] ~@8 [eb4,ab4,c5] ~@6 [eb4,ab4,c5] ~@3", // Gb Ab
  J: "~@4 [gb4,bb4,db5] ~@7 [gb4,bb4,db5] ~@7 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@3", // Gb Ab
  K: "~@3 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@7 [db4,f4] ~@4, ~@27 ab4@2 ~@3", // Db
  L: "~@3 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4] ~@4, ~@27 bb4@2 ~@3", // Gb Gb5
  M: "~@4 [eb4,ab4,c5] ~@6 ab4 eb4 ~@7 [eb4,ab4] ~@6 [ab4,c5] eb4 ~@3, ~@11 c5@2 ~@7 c5@2 ~@10", // Ab Ab5 Ab
  N: "~@3 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@4", // Ab
})).s("gm_epiano1").gain(0.4).pan(0.7)

// other · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz = note("<~@20 A B ~@2 C D E ~@12 F@2 B ~@2 G D H A I ~@10 A I ~@7>".pickRestart({
  A: "db5@8 ab4@8 gb4@8 f4@7 ~", B: "db4@15 ~", C: "db4@8 ~ f4@8 gb4@7 ab4@8", D: "db5@31 ~", E: "eb5@14 ~ eb6@12 ~@5",
  F: "[~@31 db5@8 ab4@8 ~ gb4@8 f4@8]/2", G: "db4@8 f4@8 gb4@7 ~ ab4@8", H: "eb5@7 eb6@6 ~@3", I: "eb4 ~",
})).s("gm_electric_guitar_jazz").gain(0.5).pan(0.7)

// other · ocarina
const ocarina = note(`<
  ~@28
  [~@2 eb4 ~ eb5 eb4 ~ eb5@5 ~@4]
  ~@19
  [~@2 eb4 ~ eb5 eb4 ~ eb5@5 ~@4]
  ~@11
  [~@4 eb4 ~@3 eb5@2 eb4@3 ~ eb5@5 ~@13]
  ~@7
>`).s("gm_ocarina").gain(0.72).pan(0.2)

// drums · kick
const kick = s("bd").struct("<[~ x] [x!2]!25 x [x!2]!19 x [x!2]!20 ~>").gain(0.5)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@2 A ~ B@2 C B C ~ A ~ B@2 C B C ~ A ~ B@2 C B C ~@3 A ~ B@2 C B C ~ A ~ B ~ B@2 C B C ~@3 A ~ B@2 C B A ~ A ~ B ~ A
  ~ B@2 C B A ~
>`.pickRestart({
  A: "~@5 x ~@10", B: "~@13 x ~@2", C: "~@5 x ~@7 x ~@2",
})).gain(0.25)

// drums · low tom
const low_tom = s("lt").struct("<~@26 [~@9 x!2 ~@5] ~@19 [~@9 x!2 ~@5] ~@21>").gain(0.45)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  [~@7 x]
  ~@25
  [~ x!4 ~@2 x!2 ~@2 x!2 ~@3]
  ~@19
  [~ x!4 ~@2 x!2 ~@2 x!2 ~@3]
  ~@11
  [~@9 x!4 ~@3]
  ~@9
>`).gain(0.45)

// drums · open hat
const open_hat = s("oh").struct("<~@54 [~ x] ~@13>").gain(0.5)

// drums · high tom
const high_tom = s("ht").struct("<A ~@24 B ~@19 B ~@8 C ~@3 D ~@9>".pickRestart({
  A: "~@11 x!2 ~@3", B: "~@15 x", C: "~@22 x!2 ~@4 x ~@3", D: "~@7 x ~@8",
})).gain(0.5)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@4 A B A C D ~@3 A B A C D E@4 F G E H G I ~@3 A B A C D ~@4 E@2 F G E H G I ~@3 A B A C J ~@7 A B A C J ~
>`.pickRestart({
  A: "~ x ~@2", B: "~@9 x ~@22", C: "~@9 x ~@7 x ~@4 x ~ x ~@3 x ~@3", D: "~@6 x ~ x!2 ~ x!2 ~ x ~",
  E: "x ~@2 x!2 ~@3 x!2 ~ x!2 ~@3", F: "x ~@6 x!2 ~@7 x ~ x ~@4 x!2 ~@7", G: "x ~@6 x!2 ~@7 x ~ x ~@4 x ~ x ~@6",
  H: "x ~@5 x ~ x ~@7 x ~ x ~@4 x!2 ~@7", I: "x", J: "~@3 x!2 ~@3",
})).gain(1.76)

stack(
  bass, percussive_organ, epiano1, electric_guitar_jazz, ocarina, kick, snare, snare_soft, low_tom, hihat, mid_tom,
  open_hat, high_tom, cabasa
)

More by Neil Diamond