Strudelify

Never Ending Love for You

Brown Clarence Gatemouth

KeyA majorTempo104 bpm
0:00/0:00
// Never Ending Love for You — Brown Clarence Gatemouth
// 104 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 70 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(104/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 · piano · "BANJO"
const bass = note("<c#-1 ~@69>").s("gm_piano").gain(0.05)

// chords · banjo
const banjo = note(`<
  ~@3 A B C D A C@2 A@2 C@2 A D E C A F@2 A@2 G H I J K A C E A@2 E@2 A L E@2 A@2 E@2 A F M N O F M P@2 Q R S T U V W X
  R Y Z AA AB R Z@2 AC AD
>`.pickRestart({
  A: "[a4,c#5] ~ [e4,c#5] ~ [f#4,c#5] ~ [a4,c#5] ~ [e4,c#5] ~ [f#4,c#5] [a4,c#5] ~ e4 [f#4,c#5] ~", // A C#m F#5 A C#m F#5 A F#5
  B: "g#4 ~ e4 ~ [f#4,b4] ~ [g#4,b4] ~ [e4,b4] ~ [f#4,b4] [g#4,b4] ~ [e4,b4] [f#4,b4] ~", // B5 G#m E5 B5 G#m E5 B5
  C: "[g#4,b4] ~ [e4,b4] ~ [f#4,b4] ~ [g#4,b4] ~ [e4,b4] ~ [f#4,b4] [g#4,b4] ~ [e4,b4] [f#4,b4] ~", // G#m E5 B5 G#m E5 B5 G#m E5 …
  D: "[a4,c#5] ~ [e4,c#5] ~ [f#4,c#5] ~ [a4,c#5] ~ [e4,c#5] ~ [f#4,c#5] [a4,c#5] ~ [e4,c#5] [f#4,c#5] ~", // A C#m F#5 A C#m F#5 A C#m …
  E: "[g#4,b4] ~ [e4,b4] ~ [f#4,b4] ~ [g#4,b4] ~ [e4,b4] ~ [f#4,b4] [g#4,b4] ~ e4 [f#4,b4] ~", // G#m E5 B5 G#m E5 B5 G#m B5
  F: "[f#4,a4] ~ d4 ~ [f#4,a4] ~ [f#4,b4] ~ [f#4,a4] ~ d4 [f#4,a4] ~ d4 [f#4,b4] ~", // F#m B5 F#m B5
  G: "b4 ~ d4 ~ [f#4,a4] ~ [f#4,b4] ~ [f#4,a4] ~ d4 [f#4,a4] ~ d4 [f#4,b4] ~", // F#m B5 F#m B5
  H: "[f#4,a4] ~ [d4,f#4] ~ [f#4,a4] ~ [f#4,b4] ~ [f#4,a4] ~ d4 [f#4,a4] ~ [d4,f#4] [f#4,a4] ~", // F#m D F#m B5 F#m D F#m
  I: "[g#4,b4] ~ e4 ~ [g#4,b4] ~ [g#4,c#5] ~ [g#4,b4] ~ e4 [g#4,b4] ~ e4 [a4,c#5] ~", // G#m C#5 G#m A
  J: "[g#4,b4] ~ e4 ~ [g#4,b4] ~ [g#4,c#5] ~ [g#4,b4] ~ e4 [g#4,b4] ~ e4 g#4 ~", // G#m C#5 G#m
  K: "[b4,d5] ~ e4 ~ [g#4,b4] ~ [a4,c#5] ~ [b4,d5] ~ e4 [g#4,b4] ~ e4 [g#4,b4] ~", // Bm G#m A Bm G#m
  L: "[a4,c#5] ~ [e4,c#5] ~ [f#4,c#5] ~ [a4,c#5] ~ e4 ~ [f#4,c#5] [a4,c#5] ~ e4 [f#4,c#5] ~", // A C#m F#5 A F#5 A F#5
  M: "[f#4,a4] ~ d4 ~ [f#4,a4] ~ [f#4,b4] ~ [f#4,a4] ~ d4 [f#4,a4] ~ d4 [f#4,a4] ~", // F#m B5 F#m
  N: "[a4,c#5] ~ e4 ~ [f#4,c#5] ~ [a4,c#5] ~ [e4,c#5] ~ [f#4,c#5] [a4,c#5] ~ [e4,c#5] [f#4,c#5] ~", // A F#5 A C#m F#5 A C#m F#5
  O: "[a4,c#5] ~ [e4,c#5] ~ [f#4,c#5] ~ [a4,c#5] ~ [e4,c#5] ~ f#4 [a4,c#5] ~ e4 [f#4,a4,c#5] ~", // A C#m F#5 A C#m A F#m
  P: "[g#4,b4] ~ e4 ~ [g#4,b4] ~ [g#4,c#5] ~ [g#4,b4] ~ e4 [g#4,b4] ~ e4 [g#4,c#5] ~", // G#m C#5 G#m C#5
  Q: "[g#4,b4] ~ e4 ~ [g#4,b4] ~ [a4,c#5] ~ [b4,d5] ~ e4 [a4,c#5] ~ e4 [g#4,b4] ~", // G#m A Bm A G#m
  R: "[a4,c#5] ~ e4 ~ [f#4,c#5] ~ [a4,c#5] ~ [f#4,c#5] ~ e4 [f#4,c#5] ~ e4 [f#4,c#5] ~", // A F#5 A F#5
  S: "[g#4,a4,b4] ~ [e4,b4] ~ [f#4,b4] ~ [g#4,b4] ~ [f#4,b4] ~ [e4,b4] [f#4,b4] ~ e4 [f#4,b4] ~", // G#m E5 B5 G#m B5 E5 B5
  T: "[g#4,b4] ~ [e4,b4] ~ [f#4,b4] ~ [g#4,b4] ~ [f#4,b4] ~ e4 [f#4,b4] ~ e4 [g#4,b4] ~", // G#m E5 B5 G#m B5 G#m
  U: "[a4,c#5] ~ e4 ~ [f#4,c#5] ~ [a4,c#5] ~ [f#4,c#5] ~ [e4,c#5] [f#4,c#5] ~ e4 [f#4,c#5] ~", // A F#5 A F#5 C#m F#5
  V: "[a4,c#5] ~ [e4,c#5] ~ [f#4,c#5] ~ [a4,c#5] ~ [f#4,c#5] ~ [e4,c#5] [f#4,c#5] ~ e4 [f#4,c#5] ~", // A C#m F#5 A F#5 C#m F#5
  W: "[g#4,b4] ~ [e4,b4] ~ [f#4,a4,b4] ~ [g#4,b4] ~ [f#4,b4] ~ e4 [f#4,b4] ~ e4 [f#4,b4] ~", // G#m E5 B7 G#m B5
  X: "[g#4,b4] ~ [e4,b4] ~ [f#4,b4] ~ [g#4,b4] ~ [f#4,b4] ~ e4 [f#4,b4] ~ e4 [f#4,b4] ~", // G#m E5 B5 G#m B5
  Y: "[a4,c#5] ~ [f#4,c#5] ~ e4 ~ [f#4,a#4,c#5] ~ [a4,c#5] ~ [e4,c#5] [f#4,c#5] ~ [a4,c#5] [e4,c#5] ~", // A F#5 F# A C#m F#5 A C#m
  Z: "[g#4,b4] ~ e4 ~ [f#4,b4] ~ [g#4,b4] ~ [f#4,b4] ~ e4 [f#4,b4] ~ e4 [f#4,b4] ~", // G#m B5 G#m B5
  AA: "[g#4,b4] ~ [e4,b4] ~ [f#4,b4] ~ [g#4,b4] ~ [f#4,b4] ~ [e4,b4] [f#4,b4] ~ e4 [f#4,b4] ~", // G#m E5 B5 G#m B5 E5 B5
  AB: "[a4,c#5] ~ [e4,c#5] ~ [f#4,c#5] ~ [a4,c#5] ~ [f#4,c#5] ~ e4 [f#4,c#5] ~ e4 [f#4,c#5] ~", // A C#m F#5 A F#5
  AC: "[a4,c#5] ~ e4 ~ [f#4,c#5] ~ [a4,c#5] ~ [f#4,a4] ~ d4 [f#4,b4] ~ d4 [f#4,a4] ~", // A F#5 A F#m B5 F#m
  AD: "[a4,c#5] ~ [g#4,c5] ~ [a4,c#5] ~@11", // A G# A
})).s("gm_banjo").gain(0.35).pan(0.7)

// other · lead 8 bass lead · "SYNTH"
const lead_8_bass_lead = note(`<
  ~@3 A@3 B C D E B F@2 G@2 H@2 I@2 J@6 K@3 L M N O P@2 E Q R@4 S@2 T U@2 V@3 W@2 X@2 Y Z@2 AA AB AC@2 AD@2 F@2 AE AF
  AG@2 AH@2 AI
>`.pickRestart({
  A: "[e5@7 ~ c#5@6 e5@10 b4@16 e5@8]/3", B: "f#5 e5 a4@2", C: "e5 c#5", D: "e5 b4", E: "e5",
  F: "[e5@4 c#5@3 e5@5 b4@4]/2", G: "[e5@20 f#5@3 a4@8 ~]/2", H: "[e5@8 c#5@6 e5@9 ~ b4@8]/2",
  I: "[e5@8 b4@7 f#5@4 ~ e5@3 a4@8 ~]/2",
  J: "[~@28 d5@3 e4@16 ~ e5@10 ~@2 [e4,a4]@3 [d4,a4]@32 ~, a4@47 a4@11 ~@38, d4@31 ~@65]/6", // A5 D5
  K: "[~@20 e5@12 b5 a5 b5 c#6 d6 c#6 d6 e6 f#6 e6 f#6 g#6 a6 g#6 a6 b6, [e4,b4]@11 ~@5]/3", // E5
  L: "a4@2 e5 c#5, c#7@3 ~@5", M: "e5@7 ~ b4@8", N: "e5@7 ~@5 f#5@4, ~@4 b4@3 ~", O: "e5 a4",
  P: "[e5@2 c#5 e5@3 b4@2]/2", Q: "f#5@4 e5@3 a4@9", R: "[e5@8 c#5@6 e5@10 b4@16 e5@11 f#5@4 ~ a4@8]/4",
  S: "[e5@8 c#5@4 e5@11 b4@9]/2", T: "e5@3 b4", U: "[f#5@2 e5@2 a4@7 d4@5]/2",
  V: "[e4@4 ~ d4@10 ~@9 b4@3 a4@12 [a4,e5]@8 ~, a4 ~, ~@2 e4@3 ~]/3", W: "[d4@5 d5@3, a4]/2",
  X: "[~@5 e5@3, [e4,b4]]/2", Y: "b5 a5 b5 c#6 d6 c#6 d6 e6 f#6 e6 f#6 g#6 a6 g#6 a6 b6",
  Z: "[[a4,c#7]@7 e5@5 c#5@3 e5@9 b4@7 ~]/2", AA: "e5@4 b4@3 f#5", AB: "e5@7 a4@5 c#5@4",
  AC: "[e5@7 c#5@7 e5@9 b4@9]/2", AD: "[e5@11 b4@4 f#5@4 e5@4 ~ a4@8]/2", AE: "e5@7 ~ b4@6 f#5@2",
  AF: "e5@7 a4@7 c#5@2", AG: "[e5@8 c#5@5 e5@8 ~ b4@10]/2", AH: "[e5@11 f#5@4 a4@16 ~]/2", AI: "~@2 g#4 ~ a4 ~@11",
})).s("gm_lead_8_bass_lead").gain(0.26).pan(0.3)

// chords · piano · "A.PIANO"
const piano = note(`<
  ~@3 A B C A D E F A G H F A G B F A ~@2 I ~@3 J@2 K L B M G@2 F@2 A G B F A@2 B@2 D N ~ O@2 P ~ Q ~ K R F@2 S G B F G
  D F E A G B E T U
>`.pickRestart({
  A: "~@2 [e3,a3,c#4] ~@2 [e3,a3,c#4] ~@2 [e3,a3,c#4]@8", B: "~@2 [e3,g#3,d4] ~@2 [e3,g#3,d4] ~@2 [e3,g#3,d4]@8",
  C: "~@2 [e3,f3,g#3,d4] ~@2 [e3,g#3,a#3,d4] ~@2 [e3,g#3,d4]@8", // Ddim E7
  D: "~@2 [e3,a3,c#4] ~@2 [e3,a3,c#4] ~@2 [e3,a3,c#4]@6 ~@2", // A
  E: "~@2 [e3,g#3,d4] ~@2 [e3,g#3,d4] ~@2 [e3,g#3,d4]@6 ~@2", F: "~@2 [e3,g#3,d4] ~@2 [e3,g#3,d4] ~@2 [e3,g#3,d4]@7 ~",
  G: "~@2 [e3,a3,c#4] ~@2 [e3,a3,c#4] ~@2 [e3,a3,c#4]@7 ~", H: "~@2 [e3,g#3,d4] ~@2 [e3,g#3,d4,e4] ~@2 [e3,g#3,d4]@8",
  I: "[a2,e3,a3,c#4]", J: "[[e2,e3,g#3,b3]@21 ~@11]/2", K: "g#5 f#5 g#5 a5 b5 a5 b5 c#6 d6 c#6 d6 e6 f#6 e6 f#6 g#6",
  L: "a6@2 [e3,a3,c#4] ~@2 [e3,a3,c#4] ~@2 [e3,a3,c#4]@6 ~@2", // A
  M: "~@2 [e3,g#3,d4] ~@2 [e3,g#3,d4] ~@2 [e3,g#3,d4]@5 ~@3", N: "[d3,f#3,a3]", O: "[[a2,e3,a3,c#4]@9 ~@7]/2",
  P: "[d2,d3,f#3,a3]", Q: "[e3,g#3,b3]@13 ~@3, e2@9 ~@7", R: "a6@2 [e3,a3,c#4] ~@2 [e3,a3,c#4] ~@2 [e3,a3,c#4]@5 ~@3",
  S: "~@2 [e3,a3,c#4] ~@2 [e3,a3,c#4] ~@2 [e3,a3,c#4]@8, ~@8 f#3 ~@7", // A
  T: "~@2 [e3,a3,c#4] ~@2 [e3,a3,c#4] ~@2 [f#3,a3,d4]@5 ~@3", U: "[e3,a3,c#4] ~ [d#3,g#3,c4] ~ [e3,a3,c#4]@3 ~@9",
})).s("gm_piano").gain(0.26).pan(0.7)

// other · pizzicato strings · "PIZZICATO"
const pizzicato_strings = note(`<
  ~@3 A B@2 A@2 B@2 C A B@2 A@2 B@2 A ~@8 D E B@2 A@2 B@2 A@2 B@2 A@2 B@2 A ~@8 D F B@2 A@2 B@2 A@2 B@2 G A B@2 H I
>`.pickRestart({
  A: "[a2,a3] ~ [a2,a3]!3 ~ [a2,a3]!3 ~ [a2,a3]!2 ~ [a2,a3]!2 ~", // A
  B: "[e2,e3] ~ [e2,e3]!3 ~ [e2,e3]!3 ~ [e2,e3]!2 ~ [e2,e3]!2 ~", // E
  C: "[a2,a3] ~ [a2,a3]!3 ~ [a2,a3]!3 ~ [a2,a3]!2 ~ [e2,e3] [f#2,f#3] ~", // A E F#
  D: "g#3 f#3 g#3 a3 b3 a3 b3 c#4 d4 c#4 d4 e4 f#4 e4 f#4 g#4",
  E: "[a2,a4] ~ [a2,a3]!3 ~ [a2,a3]!3 ~ [a2,a3]!2 ~ [a2,a3]!2 ~", // A
  F: "a4 ~ [a2,a3]!3 ~ [a2,a3]!3 ~ [a2,a3]!2 ~ [a2,a3]!2 ~", // A
  G: "[a2,a3] ~ [a2,a3]!3 ~ [a2,a3] a3 [a2,a3] ~ [a2,a3]!2 ~ [a2,a3]!2 ~", // A
  H: "[a2,a3] ~ [a2,a3]!3 ~ [a2,a3]!2 [d3,d4] ~ [d3,d4]!2 ~ [d3,d4]!2 ~", I: "[c#3,c#4] ~ [c3,c4] ~ [c#3,c#4] ~@11",
})).s("gm_pizzicato_strings").gain(0.07).pan(0.3)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@2 A@2 B@2 C@2 B@2 C@2 B@2 C@2 B@2 D E@2 C@2 F@2 G@3 D B@2 C@2 B@2 H@2 B@2 C@2 I@2 J E@2 C@2 K@2 G@3 D B@2 C@2 B@2
  C@2 B@2 C@2 B@2 L M
>`.pickRestart({
  A: "[~@4 e4@4 d#4@4 ~@4 [a4,c#5]@15 ~, ~@12 e4@19 ~]/2", B: "[[e4,g#4,d5]@31 ~]/2", C: "[[e4,a4,c#5]@31 ~]/2",
  D: "[e4,a4,c#5]@15 ~", E: "[[f#4,a4,d5]@31 ~]/2", F: "[[f#4,d5], a4@15 ~]/2", G: "[[g#4,b4,e5]@23 ~]/3",
  H: "[[e4,a4,c#5]@15 ~]/2", I: "[[e4,g#4,d5]@15 ~]/2", J: "[a4,c#5], e4@7 ~", K: "[f#4,a4,d5]/2",
  L: "[e4,a4,c#5]@7 ~ [f#4,a4,d5]@7 ~", M: "[e4,a4,c#5] ~ [d#4,g#4,c5] ~ [e4,a4,c#5] ~@11",
})).s("gm_string_ensemble_1").gain(0.2)

// bass · electric bass finger · "ACOU BASS"
const bass_2 = note(`<
  ~@3 A B C D E C F G E C@2 H D C I J K L M N O@2 P Q R S C T D U V C D W X V Y U C Z N AA AB S AC O AD Q AE AF M AG B
  AH S T X AI S C T AJ U C AK AL AM
>`.pickRestart({
  A: "a1@3 ~ e2@2 ~@2 a1@3 ~ e2@2 ~@2", B: "b1@2 ~@2 e2@3 ~ b1@3 ~ e2@3 ~", C: "b1@3 ~ e2@3 ~ b1@3 ~ e2@3 ~",
  D: "a1@3 ~ e2@3 ~ a1@3 ~ e2@3 ~", E: "a1@2 ~@2 e2@3 ~ a1@3 ~ e2@3 ~", F: "b1@3 ~ e2@3 ~ b1@2 e2@2 f#1@2 g#1 ~",
  G: "a1@2 ~@2 e2@4 a1 ~@3 e2 ~ e2@2", H: "a1@2 ~@2 e2@4 a1@2 ~@2 e2@3 ~", I: "b1@3 ~ e2@3 ~ b1 ~ e2@2 f#1 ~ g#1 ~",
  J: "a1@2 ~@2 e2@3 ~ a1 ~ a1 ~ b1 ~ c#2 ~", K: "d2@2 ~@2 a1@2 ~@2 d2@2 ~@2 a1@3 ~",
  L: "d2@2 ~@2 a1@3 ~ d2@2 ~@2 a1@2 ~@2", M: "a1@2 ~@2 e2@2 ~@2 a1@2 ~@2 e2@3 ~",
  N: "a1@2 ~@2 e2@3 ~ a1 ~ a1@2 b1@2 c#2@2", O: "d2@2 ~@2 a1@3 ~ d2@3 ~ a1@2 ~@2",
  P: "e2@2 ~@2 b1@2 ~@2 e2@3 ~ b1@2 ~@2", Q: "e2@3 ~ b1@2 ~@2 e2@2 ~@2 b1@2 ~@2",
  R: "e2@3 ~ b1@2 ~@2 e2 ~ d2 ~ c#2 ~ b1 ~", S: "a1@2 ~@2 e2@2 ~@2 a1@3 ~ e2@3 ~", T: "b1@3 ~ e2@2 ~@2 b1@3 ~ e2@3 ~",
  U: "a1@2 ~@2 e2@2 ~@2 a1@3 ~ e2@2 ~@2", V: "b1@3 ~ e2@2 ~@2 b1@3 ~ e2@2 ~@2", W: "a1 ~ e2 ~ a1 ~ e2 ~",
  X: "b1@3 ~ e2@3 ~ b1@3 ~ e2@2 ~@2", Y: "a1@3 ~ e2@3 ~ a1@3 ~ e2@2 ~@2", Z: "b1@3 ~ e2@3 ~ b1 ~ e2@2 f#1@2 g#1@2",
  AA: "d2 ~ a1 ~ d2 ~ a1 ~", AB: "d2@3 ~ a1@3 ~ d2@2 ~@2 a1@2 ~@2", AC: "a1@3 ~ e2@3 ~ a1 ~ a1@2 b1@2 c#2@2",
  AD: "d2@3 ~ a1@2 ~@2 d2@3 ~ a1@3 ~", AE: "e2@3 ~ b1@2 ~@2 e2@3 ~ b1@2 ~@2", AF: "e2@3 ~ b1@4 e2 ~ d2 ~ c#2 ~ b1 ~",
  AG: "b1@3 ~ e2@2 ~@2 b1@2 ~@2 e2@3 ~", AH: "a1 ~ e2 ~ a1 ~ e2 f#1", AI: "a1@3 ~ e2@3 ~ a1 ~ e2@2 f#1@2 g#1@2",
  AJ: "a1@3 ~ e2@2 ~@2 a1@2 e2@2 f#1 ~ g#1@2", AK: "b1@3 ~ e2@3 ~ b1@4 e2@2 ~@2", AL: "a1@3 ~ a1@2 ~@2 d2@3 ~ d2@2 ~@2",
  AM: "a1 ~ g#1 ~ a1@10 ~@2",
})).s("gm_electric_bass_finger").gain(0.51)

// drums · kick
const kick = s("bd").struct("<~@3 [x!4]!66 [x!3 ~@5]>").gain(0.51)

// drums · snare
const snare = s("sd").struct("<~@3 [~@2 x ~@3 x ~@3 x!2 ~ x!2 ~]!66 ~>").gain(0.51)

// drums · clap
const clap = s("cp").struct(`<
  ~@3
  [~ x ~ x ~ x ~ x]!15
  [~ x ~ x ~ x ~@2]
  ~@9
  [~ x ~ x ~ x ~ x]!16
  ~@9
  [~ x ~ x ~ x ~ x]!16
  ~
>`).gain(0.31)

// drums · hihat
const hihat = s("hh").struct("<~@3 [x!8]!66 [x!3 ~@5]>").gain(0.31)

// drums · crash
const crash = s("cr").struct("<~@3 A ~@7 A ~@7 A ~@8 A ~@3 A ~@3 A ~@7 A ~@3 A ~@4 A ~@7 A ~@7 B>".pickRestart({
  A: "x", B: "~ x ~@2",
})).gain(0.36)

// drums · shaker
const shaker = s("sh").struct("<~@3 [x!16]!16 ~@9 [x!16]!16 ~@9 [x!16]!16 [x!3 ~@5]>").gain(0.15)

stack(
  bass, banjo, lead_8_bass_lead, piano, pizzicato_strings, string_ensemble_1, bass_2, kick, snare, clap, hihat, crash,
  shaker
)