Strudelify

For Your Love

Ed Townsend

KeyC majorTempo66 bpm
0:00/0:00
// For Your Love — Ed Townsend
// 66 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 47 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(66/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 · piano · "A.PIANO 1"
const piano = note(`<
  A B A B A B A B A C A B A B A B D E F A F A B A G H A B A B A B D I A B A B A B A J ~ A K L ~
>`.pickRestart({
  A: "[c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,a5] ~ [c5,e5,a5] ~ [c5,e5,a5] ~ [c5,e5,a5] ~ [c5,e5,a5] ~ [c5,e5,a5] ~", // C Am
  B: "[d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~", // Dm G
  C: "[d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [b4,d#5,g5] ~ [b4,d#5,g5] ~ [b4,d#5,g5] ~ [b4,d#5,g5] ~ [b4,d#5,g5] ~ [b4,d#5,g5] ~", // Dm Baug
  D: "[c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~ [c5,f5,a5] ~", // C F
  E: "[c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~", // C
  F: "[d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~", // Dm
  G: "[d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~ [d5,f#5,a5] ~", // D
  H: "[b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~@11", // G
  I: "[c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~", // C G
  J: "[d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [b4,d5,g5]@12", // Dm G
  K: "[d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [d5,f5,a5] ~ [b4,d#5,g#5] ~ [b4,d#5,g#5] ~ [b4,d#5,g#5] ~ [b4,d#5,g#5] ~ [b4,d#5,g#5] ~ [b4,d#5,g#5] ~", // Dm G#m
  L: "[c5,e5,g5]@3 ~", // C
})).s("gm_piano").gain(0.33).pan(0.8)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  A B C B D E C F G H C I D F D F J K L M L N O P Q R S T U V S W X Y Z W AA AB AC AD AE AF ~ U AG AH ~
>`.pickRestart({
  A: "c2@7 ~@3 g2@2 a2@8 ~@2 e2@2", B: "d2@4 ~ a2 g2@4 ~ g2", C: "c2@8 ~@2 g2@2 a2@7 ~@3 e2@2",
  D: "c2@7 ~@3 g2@2 a2@7 ~@3 e2@2", E: "d2@7 ~@3 a2@2 g2@8 ~@2 g2@2", F: "d2@8 ~@2 a2@2 g2@7 ~@3 g2@2",
  G: "c2@7 ~@3 g2@2 a2@8 ~@2 a2@2", H: "d2@8 ~@2 a2@2 g2@4 d2@2 g2@5 ~", I: "d2@4 ~ a2 g2@4 ~ e2",
  J: "c2@7 ~@3 e2@2 f2@5 ~ f2@6", K: "c2@10 ~@2 c2@5 ~ c2@4 g2@2", L: "d2@9 ~ d2 ~ d2@9 ~ g2@2",
  M: "c2@7 ~@3 g2@2 a2@4 e2@2 a2@2 ~@2 a2@2", N: "c2@4 ~ g2 a2@2 e2 a2 ~ a2", O: "d2@4 ~ d2 g2@4 ~ g2",
  P: "c2@6 ~@4 g2@2 a2@4 e2@2 a2@5 ~", Q: "d2@10 ~@2 d2@11 ~", R: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~@11",
  S: "c2@4 ~ g2 a2@4 ~ a2", T: "d2@8 ~@2 a2@2 g2@9 ~ g2@2", U: "c2@8 ~@2 g2@2 a2@7 ~@3 a2@2",
  V: "d2@9 ~ a2@2 g2@8 ~@2 g2@2", W: "d2@9 ~ a2@2 g2@4 ~@2 g2@4 ~@2", X: "c2 f1", Y: "c2@8 ~@2 c2@2 g1@4 ~@2 g1@3 ~@3",
  Z: "c2@8 ~@2 g2@2 a2@5 ~ a2@3 ~ a2@2", AA: "c2@4 ~ g2 a2@2 ~ a2 ~ a2", AB: "d2@4 ~ a2 g2@6",
  AC: "c2@9 ~ g2@2 a2@3 ~ a2 ~ a2@3 ~@3", AD: "d2@9 ~ a2@2 g2@3 ~ g2 ~ g2@4 ~@2", AE: "c2@8 ~@2 g2@2 a2@4 ~@2 a2@5 ~",
  AF: "d2@11 ~ g2@12", AG: "d2@7 ~@3 a2@2 g2@10 ~@2", AH: "c2",
})).s("gm_acoustic_bass").gain(0.44)

// chords · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz = note("<A@2 B C D@5 E F@2 G@6 H I J K L M N O P@8 Q@7 R S@3 T@2>".pickRestart({
  A: "[[c4,e4,g4]@9 ~@3 [a4,c5]@9 ~@3 [f4,a4]@10 ~@2 [d4,g4,b4]@10 ~@2, ~@11 [c4,e4]@10 ~@2 d4@11 ~ b3@11 ~@2]/2", // C Am F G C
  B: "[c4,e4]@11 ~ [e4,a4]@9 ~@3, g4@9 ~@2 c4@10 ~@3", C: "[d4,f4,a4]@9 ~@4 b4@8 ~@3, ~@11 b3@10 ~@3, ~@6 [d4,g4]@5 ~",
  D: "[~ g4@10 ~ [e4,a4]@9 ~@3 [f4,a4]@9 ~@3 [g4,b4]@10 ~@2 [e4,g4]@10 ~@3 c5@8 ~@3 [a4,d5]@9 ~@3 [g4,b4]@10 ~@2 [e4,g4]@10 ~@2 d5@6 b4@4 a#4 a4, [c4,e4]@11 c4@10 ~@2 d4@10 ~@2 [b3,d4]@11 ~ c4@11 ~ [c4,e4]@10 ~@2 [d4,f4]@10 ~@2 [b3,d4]@11 ~ c4@9 ~@16, ~@20 a4@3 ~@17]/5", // A5 F G Em D5 G Em C …
  E: "f4@9 ~@4 g4@10 ~, ~@11 g3@2 ~@11, ~ [b3,d#4]", // B
  F: "[[c4,e4,g4]@9 ~@3 a4@6 ~@6 [f4,a4,d5]@8 ~@4 [d4,g4]@9 ~@3, ~@11 [c4,e4]@7 ~@5 d4@9 ~@3 b3@9 ~@4]/2", // C Dm G5 C
  G: "[[c4,e4,g4]@7 ~@5 [e4,a4]@8 ~@4 a4@8 ~@4 [d4,g4]@8 ~@4 [e4,g4]@9 ~@3 [e4,a4]@9 ~@3 [f4,a4]@9 ~@3 [d4,g4]@9 ~@3 [e4,g4]@9 ~@3 [f4,a4]@9 ~@3 g4@21 ~@3, ~@11 c4@9 ~@3 d4@9 ~@3 b3@9 ~@3 c4@9 ~@3 c4@10 ~@2 d4@9 ~@3 b3@9 ~@3 c4@9 ~@3 c4@10 ~@2 c4@22 ~@3, ~@120 e4@19 ~@5]/6", // C A5 G5 Em A5 F G5 Em …
  H: "~@4 [c#4,e4]@2 [d4,f4]@2 ~@2 [e4,g#4]@2 ~ a4@9 ~@2, ~@6 f4@5 ~", // C#m Dm E
  I: "~@4 [b3,d#4]@2 ~ e4@2 ~ [d#4,g#4]@2 ~ e4@10 ~, ~@3 c4 ~@2 a4@5 ~", // B G#5
  J: "~@4 [c#4,e4]@2 ~ f4@2 ~ [e4,g#4]@2 ~ f4@11, ~@3 d4 ~@2 a4@5 ~", // C#m E
  K: "~@4 [b3,d#4]@2 ~ e4@2 ~ g#4@2 [d#4,g#4] [e4,a4]@11, ~@3 c4 ~@8", // B G#5 A5
  L: "~@6 [c#4,e4] [d4,f4]@2 a4 c5@2 [g4,b4]@10 ~@2", M: "~@6 e4 ~ f4 g4 ~ a4@2 ~ b4 g4 ~ a4@7",
  N: "~@6 [f#4,a4]@4 ~@2 [f#4,c5]@5 ~ [f#4,a4]@4 ~@2, ~@5 d4@5 ~ d4@5 ~ d4@5 ~@2", // F#m F#dim F#m
  O: "[d4,f4] ~ [d4,f4,b4] ~ [d4,f4,b4] ~ [d4,f4,b4] ~ [d4,f4,b4] ~ [d4,f4,b4] ~ [d4,f4,b4] ~@11", // Dm Bdim
  P: "[[c4,e4,g4]@10 ~@2 [e4,a4]@9 ~@4 a4@8 ~@3 [d4,g4]@10 ~@2 [e4,g4]@10 ~@2 [e4,a4]@9 ~@3 [f4,a4]@9 ~@3 [d4,g4]@10 ~@2 [e4,g4]@9 ~@3 [e4,a4]@9 ~@3 [f4,a4]@9 ~@3 [d4,g4]@9 ~@3 [e4,g4]@9 ~@3 f4@9 ~@3 [e4,g4]@24, ~@11 c4@9 ~@3 d4@9 ~@3 b3@10 ~@2 c4@10 ~@2 c4@9 ~@3 d4@10 ~@2 b3@10 ~@2 c4@10 ~@2 c4@10 ~@2 d4@10 ~@2 b3@10 ~@2 c4@10 ~@2 [a3,c4]@10 ~@2 c4@23 ~@2, ~@8 f4@3 ~@53]/8", // C A5 G5 Em A5 F G5 Em …
  Q: "[[c4,e4]@11 ~ [e4,a4]@9 ~@3 [f4,a4]@10 ~@2 [d4,g4]@10 ~@2 e4@11 ~ a4@8 ~@4 [f4,a4]@9 ~@3 [d4,g4]@9 ~@3 [e4,g4]@10 ~@2 [e4,a4]@8 ~@4 [f4,a4]@9 ~@3 [d4,g4]@8 ~@4 [e4,g4]@10 ~@2 [e4,a4]@8 ~@4, g4@10 ~ c4@10 ~@2 d4@10 ~@2 b3@10 ~@2 c4@10 ~@2 [c4,e4]@10 ~@2 d4@10 ~@2 b3@10 ~@2 c4@11 ~ c4@8 ~@4 d4@10 ~@14 c4@10 ~@2 c4@9 ~@4, ~@16 g4@3 ~@37]/7", // C A5 F G5 F G5 Em A5 …
  R: "[d4,f4,a4]@3 ~ [b3,d4,g4]@4", // Dm G
  S: "[~@24 [e4,g4]@10 ~@2 [e4,a4]@8 ~@4 [f4,a4]@8 ~@5 g#4@8 ~@3, ~@23 c4@10 ~@2 c4@9 ~@3 d4@9 ~@3 b3@9 ~@4, ~@20 f4@3 ~]/3", // Em A5 F
  T: "[~ a4@9 ~@2 a4@14 ~@22, [c4,e4]@10 ~ [c4,e4]@14 ~@23, ~ c5 ~@2]/2", // C
})).s("gm_electric_guitar_jazz").gain(0.33).pan(0.3)

// other · tenor sax
const tenor_sax = note(`<
  ~@8 A B C D E F G H I J K L K M N L K O P Q R F S F T U V@2 W X Y Z AA AB ~ AC AD AE ~
>`.pickRestart({
  A: "~ g3", B: "f3@11 ~ g3@10 ~@2", C: "c3@10 b2@2 a2@7 ~@3 e3@2", D: "d3@11 ~ g2@8 ~@4",
  E: "c3@9 ~ b2@2 a2@7 ~@3 e3@2", F: "d3@10 ~@2 g2@9 ~@3", G: "c3@4 ~ b2 a2@3 ~@2 e3", H: "d3@8 ~@4 g2@9 ~@3",
  I: "c3@9 ~@3 f2@11 ~", J: "c3@11 ~@13", K: "a3!4 ~@2 a3!4 ~@2", L: "g3@2 g3@2 g3@2 g3 ~@5 a3@2 a3@2 a3@2 a3@2 ~@4",
  M: "g3!4 ~@2 a3!4 ~@2", N: "a3!4 ~@2 g3!4 ~@2", O: "b3!7 ~@5", P: "c3@11 ~ a2@9 ~@3", Q: "d3@11 ~ g2@9 ~@3",
  R: "c3@3 a2@2 ~", S: "c3@11 ~ a2@8 ~@4", T: "c3@5 ~ f2@5 ~", U: "c3@6 g3@5 b3",
  V: "[~ c4@29 ~@6 a#3@7 ~ c4@2 d4@2]/2", W: "~ b3@2 g3@2 ~ g3@8 ~@2 g#3@2 ~@2 f#3@2 c3@2", X: "~ d3@13 ~@10",
  Y: "c3@6 ~@4 g3@2 a3@7 ~@5", Z: "d3@10 ~@2 g3@9 ~@3", AA: "c3@3 ~@2 g3 a3@4 ~@2", AB: "d3@10 ~@2 g2@11 ~",
  AC: "c3@7 ~@3 g3@2 a3@8 ~@4", AD: "d3@12 g2@11 ~", AE: "c3@19 ~@5",
})).s("gm_tenor_sax").gain(0.38).pan(0.7)

// other · baritone sax · "BARITONSAX"
const baritone_sax = note("<~@8 A B ~@8 C D C E C E F G ~@12 H I J K ~@3 L ~>".pickRestart({
  A: "~@6 e3@5 ~", B: "d3@5 ~ g2@5 ~", C: "f3!4 ~@2 f3!4 ~@2", D: "e3@2 e3@2 e3@2 e3 ~@5 c3@2 c3@2 c3@2 c3@2 ~@4",
  E: "e3!4 ~@2 c3!4 ~@2", F: "f#3!4 ~@2 f#3!4 ~@2", G: "d3@2 d3@2 d3@2 d3@2 d3@2 d3@2 d3 ~@11", H: "c3@11 ~ a2@9 ~@3",
  I: "d3@11 ~ g2@10 ~@2", J: "c3@9 ~@3 a2@8 ~@4", K: "d3@10 ~@2 g2@9 ~@3", L: "c3@19 ~@5",
})).s("gm_baritone_sax").gain(0.38).pan(0.2)

// drums · snare
const snare = s("sd").struct("<A@25 B A@7 C A@7 D ~ A@2 E ~>".pickRestart({
  A: "x!12", B: "x!3 ~", C: "x ~@10 x", D: "x!7 ~@5", E: "x",
})).gain(0.22)

// drums · clap
const clap = s("cp").struct("<A@25 B A@7 C A@7 D ~ A@2 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~@4 x!3 ~@5", C: "~@4 x!8", D: "~ x ~@2",
})).gain(0.44)

// drums · clap · soft notes
const clap_soft = s("cp").struct("<~@25 [x!4 ~@8] ~@7 [~ x!3 ~@8] ~@13>").gain(0.22)

stack(piano, bass, electric_guitar_jazz, tenor_sax, baritone_sax, snare, clap, clap_soft)