Strudelify

We All Need Love

Double You

KeyB majorTempo122 bpm
0:00/0:00
// We All Need Love — Double You
// 122 bpm, 4/4, key B major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: bank select 127 (Roland MT-32 map) read through the MT-32 patch table: ch 5 Elec Org 3 -> rock organ
// note: Full arrangement: all 109 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(122/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 · percussive organ
const percussive_organ = note(`<
  ~@12 A B C D E B C D E B C D E B C D F G F G F G F G F G F G F G F G E B C D E B C D F G F G F G F G F G F G F G F G E
  B C D E B C D F G F G F G F G H I H I H J K L E B C D E B C D E B C D E B C D ~
>`.pickRestart({
  A: "~@2 [g#4,c#5,e5]@2 ~ [g#4,c#5,d#5]@2 ~ [g#4,c#5,e5]@2 ~ [g#4,c#5,d#5]@2 ~ [f#4,b4,d#5]@2", // C#m G#sus4 C#m G#sus4 B
  B: "~@2 [f#4,b4,e5]@2 ~ [f#4,b4,d#5]@2 ~ [f#4,b4,e5]@2 ~ [f#4,b4,d#5]@2 ~ [f#4,b4,d#5]@2", // Esus2 B Esus2 B
  C: "~@2 [f#4,b4,e5]@2 ~ [f#4,b4,d#5]@2 ~ [f#4,b4,e5]@2 ~ [f#4,b4,d#5]@2 ~ [g#4,b4,e5]@2", // Esus2 B Esus2 B E
  D: "~@2 [g#4,b4,f#5]@2 ~ [g#4,b4,e5]@2 ~ [g#4,b4,f#5]@2 ~ [g#4,b4,e5]@2 ~ [g#4,c#5,e5]@2", // G#m7 E G#m7 E C#m
  E: "~@2 [g#4,c#5,f#5]@2 ~ [g#4,c#5,e5]@2 ~ [g#4,c#5,f#5]@2 ~ [g#4,c#5,e5]@2 ~ [f#4,b4,d#5]@2", // C#sus4 C#m C#sus4 C#m B
  F: "~@2 [a4,c#5,e5]@2 ~ [a4,c#5,d#5]@2 ~ [a4,c#5,e5]@2 ~ [a4,c#5,d#5]@2 ~ [f#4,b4,d#5]@2", // A D#m7b5 A D#m7b5 B
  G: "~@2 [f#4,b4,e5]@2 ~ [f#4,b4,d#5]@2 ~ [f#4,b4,e5]@2 ~ [f#4,b4,d#5]@2 ~ [e4,a4,c#5]@2", // Esus2 B Esus2 B A
  H: "~@2 [c5,e5,g5]@2 ~ [c5,e5,f#5]@2 ~ [c5,e5,g5]@2 ~ [c5,e5,f#5]@2 ~ [a4,d5,f#5]@2", // C F#m7b5 C F#m7b5 D
  I: "~@2 [a4,d5,g5]@2 ~ [a4,d5,f#5]@2 ~ [a4,d5,g5]@2 ~ [a4,d5,f#5]@2 ~ [g4,c5,e5]@2", // Dsus4 D Dsus4 D C
  J: "~@2 [a4,d5,g5]@2 ~ [a4,d5,f#5]@2 ~ [a4,d5,g5]@2 ~ [a4,d5,f#5]@2 ~ [a4,c#5,e5]@2", // Dsus4 D Dsus4 D A
  K: "~@2 [a4,c#5,f#5]@2 ~ [a4,c#5,e5]@2 ~ [b4,d#5,f#5]@2 ~ [b4,d#5,g#5]@2 ~ [b4,d#5,f#5]@2", // F#m A B G#m B
  L: "[a4,c#5,e5]@4 [b4,d#5,f#5]@3 ~ [g#4,c#5,f5]@2 ~ [g#4,c#5,f#5]@2 ~ [g#4,c#5,e5]@2, b3@7 ~@9", // A B C# C#sus4 C#m
})).s("gm_percussive_organ").gain(0.15).pan(0.6)

// other · baritone sax
const baritone_sax = note("<~@60 A@7 ~@9 B@3 C B@3 C ~@7 D ~@17>".pickRestart({
  A: "~@4 [b3,b4] ~@2 [b3,b4] ~@2 [b3,b4] ~@5", // B
  B: "~ [b2,b3] ~@2 [b2,b3] ~@3 [b2,b3] ~@2 [b2,b3] ~ [b2,b3] [e3,e4] [f#3,f#4]", // B E F#
  C: "~ [b2,b3] ~@2 [b2,b3] ~@2 [b2,b3] ~ [c#3,c#4] [b2,b3] [e3,e4] ~ [c#3,c#4] [e3,e4] [f#3,f#4]", // B C# B E C# E F#
  D: "~@6 [c#4,c#5] ~@4 [f#4,f#5] ~ [f#4,f#5] [e4,e5] ~", // C# F# E
})).s("gm_baritone_sax").gain(0.26).pan(0.8)

// chords · synth strings 2
const synth_strings_2 = note("<A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C ~@81>".pickRestart({
  A: "[a4,c#5,e5]", B: "[f#4,b4,d#5]", C: "[g#4,b4,e5]",
})).s("gm_synth_strings_2").gain(0.09).pan(0.9)

// chords · synth strings 1
const synth_strings_1 = note(`<
  A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C D@8 E@8 A@2 B C A@2 B C D@8 E@8 A@2 B C A@2 B C D@8 F@7 G A@2
  B C A@2 B C H@2 B C A@2 B C ~
>`.pickRestart({
  A: "[[a3,c#4,e4] [f#3,b3,d#4], a2]/2", B: "[g#2,f#3,b3,d#4]", C: "[c#3,g#3,b3,e4]",
  D: "[[e3,a3,c#4]@7 [f#3,b3,d#4]@8 [e3,a3,c#4]@8 [f#3,b3,d#4]@8 [e3,a3,c#4]@8 [f#3,b3,d#4]@8 [e3,a3,c#4]@8 [f#3,b3,d#4]@8 ~]/8", // A B A B A B A B
  E: "[[e3,a3,c#4]@14 [f#3,b3,d#4]@16 [e3,a3,c#4]@16 [f#3,b3,d#4]@16 [e3,a3,c#4]@16 [f#3,b3,d#4]@16 [e3,a3,c#4]@16 [f#3,b3,d#4]@15 ~@3]/8", // A B A B A B A B
  F: "[[g3,c4,e4]@7 [a3,d4,f#4]@8 [g3,c4,e4]@8 [a3,d4,f#4]@8 [g3,c4,e4]@8 [a3,d4,f#4]@8 [a3,c#4,e4]@5 [b3,d#4,f#4]@4]/7", // C D C D C D A B
  G: "[b2,b3]@2 [c#3,c#4]@3 ~@3", H: "[[a3,c#4] [f#3,b3,d#4], a2, e4 ~@31]/2",
})).s("gm_synth_strings_1").gain(0.06)

// other · synth strings 1
const synth_strings_1_2 = note("<~@8 A B C A@2 B C A ~@93>".pickRestart({
  A: "g#5", B: "f#5", C: "b5",
})).s("gm_synth_strings_1").gain(0.11).pan(0.2)

// bass · electric bass finger
const bass = note(`<
  ~@19 A B@2 C D B@2 C E F G F H F G F I F G F H F G F I B@2 C D B@2 C J F G F H F G F I F G F H F G F I B@2 C D B@2 C J
  K@3 L K@3 L M N M O P Q R S B@2 C D B@2 C T B@2 C D B@2 C J ~
>`.pickRestart({
  A: "~@9 b1 c#2 e2 b1!2 c#2 a1", B: "a1!3 ~ a1 ~ a1!2 ~ a1!2 ~ a1 ~ a1@2",
  C: "g#1!3 ~ g#1 ~ g#1!2 ~ g#1!2 ~ g#1 ~ g#1 c#2", D: "c#2!3 ~ c#2 ~ c#2!2 ~ c#2!2 ~ c#2 e2 a1!2",
  E: "c#2!3 ~ c#2 ~ c#2!2 ~ b1 c#2 e2 b1!2 c#2!2", F: "f#1!3 ~ f#1 ~ f#1!2 ~ f#1!2 ~ f#1 ~ f#1 b1",
  G: "b1!3 ~ b1 ~ b1!2 ~ b1!2 ~ b1 ~ b1 f#1", H: "b1!3 ~ b1 ~ b1!2 ~ b1!2 ~ b1 c#2 f#1!2",
  I: "b1!3 ~ b1 ~ b1!2 ~ b1 c#2 e2 b1!2 c#2 f#1", J: "c#2!3 ~ c#2 ~ c#2!2 ~ b1 c#2 e2 b1!2 c#2 f#1",
  K: "b1!3 ~ b1 ~ b1!2 ~ b1!2 ~ b1 ~ b1!2", L: "b1!3 ~ b1 ~ b1!2 ~ b1!2 ~ b1 g#1 a1 b1",
  M: "d2!3 ~ d2 ~ d2!2 ~ d2!2 ~ d2 ~ a1 d2", N: "d2!3 ~ d2 ~ d2!2 ~ d2 d1 ~ a1 b1 a1 d2",
  O: "d2!3 ~ d2 ~ d2!2 ~ a1 c2 d2 ~ a1 c2 d2", P: "d2!3 ~ d2 ~ d2!2 ~ d2!2 ~ d2 ~ d2!2",
  Q: "d2!3 ~ d2 ~ d2!2 ~ d2!2 ~ d2 ~ a1 b1", R: "b1!3 ~ b1 ~ b1!2 ~ b1!2 ~ b1 ~ b1 c#2", S: "b1 ~@15",
  T: "c#2!3 ~ c#2 ~ c#2!2 ~ b1 c#2 e2 b1!2 c#2 g#1",
})).s("gm_electric_bass_finger").gain(0.48)

// other · recorder
const recorder = note("<A ~ B ~ A ~ B ~@3 C ~@98>".pickRestart({
  A: "c#7 ~@2 c#7 ~@2 c#7 ~ c#7 ~@2 c#7 ~@4", B: "f#6 ~@2 f#6 ~@2 f#6 ~ f#6 ~@2 f#6 ~@4",
  C: "~@2 b6 ~@2 b6 ~@2 b6 ~ b6 ~@2 b6 ~@2",
})).s("gm_recorder").gain(0.06).pan(0.7)

// other · recorder · soft notes
const recorder_soft = note("<A B C D A B C D ~@3 E ~@97>".pickRestart({
  A: "~@14 c#7 ~", B: "c#7 ~@2 c#7 ~@2 c#7 ~@9", C: "~@14 f#6 ~", D: "f#6 ~@2 f#6 ~@2 f#6 ~@9",
  E: "b6 ~ b6 ~@2 b6 ~@2 b6 ~@7",
})).s("gm_recorder").gain(0.02).pan(0.7)

// chords · brass section
const brass_section = note("<~@44 A ~@3 A ~@19 A ~@3 A ~@19 A ~@3 A ~@3 A ~@3 A ~@4>".pickRestart({
  A: "~@2 [b4,f#5] ~@5", // B5
})).s("gm_brass_section").gain(0.35).pan(0.2)

// other · rock organ
const rock_organ = note("<~@45 A B@2 ~ C D ~@18 A B@2 ~ C D ~@18 A B@2 E@2 F ~@2 A B@2 E@2 F ~@2>".pickRestart({
  A: "~@4 c#4@4 g#3@4 b3@3 c#4", B: "[b3@12 c#4@2 g#3@15 ~@3]/2", C: "~ c#3 f#3 c#3", D: "c#3@5 ~@11",
  E: "[c#4@19 ~ c#4 g#3@3 f#3@4 g#3@3 c#4]/2", F: "f#3 g#3@3",
})).s("gm_rock_organ").gain(0.21).pan(0.4)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@16 A B A B A B A B A B A C A B A B A B A B A B A B A B A C A B A B A B A C A B A B A B A B A B A B A B A C A B A B A
  B A C A B A B A B A B ~@8 A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "~@4 x ~@7 x ~@2 x", B: "~ x ~ x", C: "~@2 x ~ x ~ x!2 ~ x!7",
})).gain(0.35)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@16 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 ~ A B A B A B A ~ A B A B A B A B A B A B A B A ~ A B A B A
  B A ~ A B A B A B A B ~@8 A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "~@7 x ~@8", B: "~@7 x ~ x ~ x ~@3 x",
})).gain(0.2)

// drums · clap
const clap = s("cp").struct("<~@16 A@11 ~ A@23 ~ A@39 ~ A@16 ~>".pickRestart({
  A: "~ x ~ x",
})).gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<~@16 A@11 B A@23 B A@15 B A@16 B@3 C B@3 D A@16 D>".pickRestart({
  A: "x!2 ~ x!3 ~ x!3 ~ x!3 ~ x", B: "x!8", C: "x!7 ~", D: "x",
})).gain(0.2)

// drums · open hat
const open_hat = s("oh").struct("<~@16 A@11 ~ A@23 ~ A@15 ~ A@16 ~@3 B ~@4 A@16 ~>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~@7 x",
})).gain(0.25)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@12 [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!79 x [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!16 x>").gain(0.2)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@12 [~ x ~@3 x ~@3 x ~@3 x ~@2]!79 ~ [~ x ~@3 x ~@3 x ~@3 x ~@2]!16 ~>")
  .gain(0.1)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@16 [~ x ~ x ~ x ~ x]!68 ~@8 [~ x ~ x ~ x ~ x]!16 ~>").gain(1.01)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<~@16 [~@3 x ~@3 x ~@3 x ~@3 x]!68 ~@8 [~@3 x ~@3 x ~@3 x ~@3 x]!16 ~>")
  .gain(0.5)

stack(
  percussive_organ, baritone_sax, synth_strings_2, synth_strings_1, synth_strings_1_2, bass, recorder, recorder_soft,
  brass_section, rock_organ, kick, snare, snare_soft, clap, hihat, open_hat, crash, tambourine, tambourine_soft, cabasa,
  cabasa_soft
)

More by Double You