Strudelify

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: edit a riff to change every repeat.

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  ~ A B C D E F G H A B C D E F G H I J K L M N O P Q R A B C D E F G H S T U V W@3 X@3 Y@2 A B C D E F G H S T U V A B
  C D E F G H Z
>`.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: "db2@6 db3 ~ db2@4 db3@3 ~ gb1@5 ~ gb2 ~ gb1@4 gb2@2 ~@2",
  F: "eb2@5 ~ eb3 ~ eb2@4 eb3@2 ~@2 ab1@5 ~ ab2 ~ ab1@4 ab2@2 ~@2",
  G: "ab1@5 ~ ab2 ~ ab1@4 ab2@2 ~@2 ab1@5 ~ ab2 ~ gb2@3 ~ eb2@3 ~",
  H: "gb1@5 ~@2 gb2 e2@3 ~ gb2@3 ~ ab1@5 ~ ab2@2 gb2@3 ~ eb2@4", I: "db2@6 db3 ~ db2@4 db3@3 gb1@6 ~ gb2 gb1@5 gb2@3 ~",
  J: "eb2@6 eb3@2 eb2@4 eb3@3 ~ ab1@6 ab2 ~ ab1@4 ab2@4", K: "ab1@3 ab2 gb2@2 eb2@2 ab1@3 ab2 ab1@2 ab2@2",
  L: "db2@6 db3@2 b2@4 ab2@3 ~ db2@6 db3@2 db2@4 db3@3 ~", M: "gb1@6 gb2@2 gb1@4 gb2@4 gb1@6 gb2@2 gb1@4 gb2@3 ~",
  N: "db2@7 db3@2 db2@4 db3@3 db2@6 db3@2 b2@4 ab2@4", O: "ab1@6 ab2@2 ab1@4 ab2@4 ab1@6 ab2@2 ab1@4 ab2@3 ~",
  P: "db2@6 db3@2 db2@4 db3 ~ db3@2 db2 ~ db2@4 db3@2 db2@4 db3@4",
  Q: "gb1@5 ~@2 gb1@5 gb2@3 gb1@7 gb2@2 gb1@4 gb2@4, ~@3 gb2 ~@12", R: "ab1@6 ab2@2 gb2@4 eb2@4 ab1@4 ~@4 db3@7 ~",
  S: "~ db2@5 db3 ~ db2@4 db3@3 ~ gb1@6 gb2 ~ gb1@4 gb2@3 ~", T: "eb2@6 ~ eb3 eb2@4 eb3@3 ~@2 ab1@5 ab2@2 gb2@4 eb2@4",
  U: "db2@6 db3@2 db2@4 db3@3 ~ gb1@6 ~@2 gb1@4 gb2@3 ~, ~@23 gb2@2 ~@7",
  V: "eb2@6 eb3 ~ eb2@4 eb3@3 ~ ab1@6 ab2@2 ab1@4 ab2@3 ~",
  W: "[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",
  X: "[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",
  Y: "[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",
  Z: "~ 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 Z ~@2
>`.pickRestart({
  A: "~@16 eb4@7 ~@2 ab4@7", B: "[db5@5 ~ bb4@2 ab4@7 ~ gb4@22 ~@10 c5@4 ~ c5@5 ~@2 c5@4]/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@3 ~@3 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@4]/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@4]/2", Z: "f4@21 ~@11",
})).s("gm_percussive_organ").gain(0.44).pan(0.4)

// chords · epiano1 · "E.PIANO 1"
const epiano1 = note(`<
  ~ A B C D E F G H I J K L M N G O P Q R S T S U V W G A B C D E F G H I X I Y Z AA AB S AC AD AE AF A B C D E F G ~ I
  X I Y A B C D E F G ~@2
>`.pickRestart({
  A: "~@4 [db4,f4,ab4] ~@7 [db4,f4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@3, ~@6 ab4 ~@9", // 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 [db4,f4] ~@7 [db4,f4,ab4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@3, ~@2 ab4 ~@13", // Db Gb
  D: "~@4 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@7 [db4,gb4] ~@7 [db4,gb4,bb4] ~@3, ~@10 bb4 ~@5", // Ab Gb5 Gb
  E: "~@4 [f4,ab4] db4 ~@6 [db4,f4] ~@7 [db4,gb4,bb4] ~@7 [db4,bb4] ~@3, ~@6 ab4 ~@7 gb4 ~", // Fm Db Gb
  F: "~@4 [eb4,ab4,c5] ~@7 [eb4,c5] ~@7 [gb4,bb4]@2 ~@6 [gb4,bb4]@2 ~@2, ~@12 ab4@2 ~@6 db4 ~@7 db4 ~@3", // Ab Cm Gb
  G: "~@4 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@3", // Ab
  H: "~ gb5@8 ~@3 [db5,gb5,bb5]@2 ~@2 [eb4,ab4,c5]@6 ~@2 [db4,gb4,bb4]@6 ~@2, [db5,bb5] ~@3", // Gb Ab Gb
  I: "~@4 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@3", // Db Gb
  J: "~@4 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@7 [gb4,bb4]@2 ~@6 [db4,gb4,bb4] ~@3, ~@20 db4 ~@11", // Ab Gb
  K: "~@4 [db4,f4,ab4] ~@8 [db4,f4,ab4] ~@6 [db4,gb4,bb4] ~@7 [gb4,bb4]@2 ~@2, ~@28 db4 ~@3", // Db Gb
  L: "~@4 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@3", // Ab Gb
  M: "~@4 [db4,f4] ~@7 [db4,f4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@3, ~@2 ab4 ~@3 ab4 ~@9", // Db Gb
  N: "~@4 [eb4,ab4,c5] ~@7 [eb4,ab4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@3, ~@6 c5 ~@9", // Ab Ab5 Gb
  O: "~@4 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@7 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@3", // Gb Ab
  P: "~@4 [db4,f4,ab4] ~@7 [db4,f4] ~@7 [db4,bb4] ~@7 [gb4,bb4]@2 ~@2, ~@12 ab4@2 ~@6 gb4@2 ~@6 db4 ~@3", // Db Gb
  Q: "~@4 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4] ~@3, ~@14 bb4 ~", // Ab Gb Gb5
  R: "~@4 [eb4,ab4,c5] ~@7 [eb4,ab4] ~@7 [eb4,ab4] ~@7 [eb4,ab4,c5] ~@3, ~@6 c5 ~@3 c5 ~@5", // Ab Ab5 Ab
  S: "~@4 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@7 [db4,f4] ~@3, ~@14 ab4 ~", // Db
  T: "~@4 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4] ~@3, ~@14 bb4 ~", // Gb Gb5
  U: "~@4 [eb4,ab4] ~@7 [eb4,ab4] ~@7 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@3, ~@2 c5 ~@3 c5 ~@9", // Ab5 Ab
  V: "~@4 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@3", // Db
  W: "~@4 [gb4,bb4]@2 ~@6 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4] ~@3, ~@4 db4 ~@23 bb4@2 ~@2", // Gb Gb5
  X: "~@4 [gb4,bb4,db5] ~@7 [gb4,bb4,db5] ~@8 [eb4,ab4,c5] ~@6 [eb4,ab4,c5] ~@3", // Gb Ab
  Y: "~@4 [gb4,bb4,db5] ~@7 [gb4,bb4,db5] ~@7 [eb4,ab4,c5] ~@7 [eb4,ab4,c5] ~@3", // Gb Ab
  Z: "~@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
  AA: "~@3 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@7 [db4,f4] ~@4, ~@27 ab4@2 ~@3", // Db
  AB: "~@3 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4] ~@4, ~@27 bb4@2 ~@3", // Gb Gb5
  AC: "~@3 [eb4,ab4] ~@7 [eb4,ab4] ~@7 ab4 [eb4,c5] ~@6 [eb4,ab4,c5] ~@4, ~@3 c5@2 ~@6 c5@2 ~@19", // Ab5 Cm Ab
  AD: "~@3 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@7 [db4,f4,ab4] ~@4", // Db
  AE: "~@3 [gb4,bb4]@2 ~@6 [db4,gb4,bb4] ~@7 [db4,gb4,bb4] ~@7 [db4,gb4] ~@4, ~@3 db4 ~@23 bb4@2 ~@3", // Gb Gb5
  AF: "~@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 I J ~@10 I J ~@7>".pickRestart({
  A: "db5@8 ab4@8 ~ gb4@7 f4@8", 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: "db5@8 ab4@8 gb4@8 f4@7 ~", J: "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
  [~@3 eb4 ~@4 eb5@2 eb4 ~@3 eb5@11 ~@7]
  ~@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
  [~@2 x ~ x ~ x!2 ~@6 x!2 ~@6 x ~ x ~@7]
  ~@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@2 F G H I J K I L ~@3 A B A C D ~@4 F G H I J K I L ~@3 A B A C M ~@7 A B A C M ~
>`.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 ~@5 x ~ x ~@7 x ~ x ~@4 x!2 ~@7",
  H: "x ~@6 x ~ x ~@6 x ~ x ~@3 x ~ x ~@7", I: "x ~@6 x!2 ~@7 x ~ x ~@4 x ~ x ~@6",
  J: "x ~@5 x ~ x ~@6 x ~ x ~@4 x ~ x ~@7", K: "x ~@5 x ~ x ~@7 x ~ x ~@4 x ~ x ~@6", L: "x", M: "~@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