Strudelify

I've Been Loving You Too Long

Otis Redding

KeyA majorTempo72 bpm
0:00/0:00
// I've Been Loving You Too Long — REDDING OTIS
// 72 bpm, 6/8, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 75 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(72/3)

// 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 C D E F G H I J K L M N O P Q@2 R S I@2 T U A B C D E F G H I J K L M N O P Q@2 R S I@2 V W X@2 Y Z AA@4 AB@2
  AC@3 AD AE@3 AF@3 AG@2 AH AI@2 ~
>`.pickRestart({
  A: "~ a4 c#5 a4 c#5 a4, a3@19 ~@5, e4 e5", B: "e4 a4 c#5 [a4,e5] c#5 a4, a3@12 e4@7 ~@5",
  C: "~ g#4 b4 g#4 b4 g#4, e3@7 ~, e4@4 ~@2 e5@5 ~", D: "e4 g#4 b4 g#4 b4 g#4, e3, ~@12 e5@11 ~",
  E: "e4 a4 c#5 a4 c#5 a4, a3@5 ~, ~@12 e5@7 ~@5", F: "e4 a4 c#5 [a4,e5] c#5 a4, a3@5 ~",
  G: "e4 g#4 b4 [g#4,e5] b4 g#4, e3@13 ~@11", H: "e4 g#4 b4 [g#4,e5] b4 g#4", I: "e4 a4 c#5 [a4,e5] c#5 a4, a3@7 ~",
  J: "e4 a4 c#5 [e4,e5] c#5 a4, a3", K: "g#4 c#5 f5 [g#4,g#5] f5 c#5, c#3@5 ~",
  L: "g#4@4 c#5@4 f5@3 ~ [g#4,g#5]@4 f5@4 c#5@4, c#3", M: "a4@4 d5@4 f#5@3 ~ [a4,d5,a5]@4 f#5@4 d5@4, d3@5 ~",
  N: "a4@4 d5@4 f#5@4 [a4,a5]@4 f#5@4 d5@3 ~, d4@23 ~", O: "f4 a4 c5 [a4,f5] c5 a4, f3@7 ~",
  P: "f4 a4 c5 [a4,f5] c5 a4, f3", // Dm
  Q: "[e4@4 a4@4 c#5@3 ~ [e4,a4,e5]@4 c#5@4 a4@4 e4@4 a4@4 c#5@4 [e4,a4,e5]@4 c#5@4 a4@4, a2@15 ~, a3@17 ~@7 a3@9 ~@3 a3@9 ~@3]/2", // A5
  R: "e4 g#4 b4 [g#4,e5] b4 g#4, e3@5 ~", S: "e4 g#4 b4 [g#4,e5] b4 g#4, e3",
  T: "~@4 [g#4,e5]@3 ~@5 [e3,e4,g#4,b4,e5]@3 ~ [e3,e4,g#4,b4,e5]@3 ~@5, [e3,e4] ~@2, ~@4 b4 ~@19", // C#m E
  U: "[e3,e4,g#4,b4,e5]@3 ~ [e3,e4,g#4,b4,e5]@3 ~@17", V: "f4 a4 c5 f5 c5 a4", W: "f4@4 a4@4 c5@4 f5@4 c5@4 a4@3 ~",
  X: "[~ d4 f4 [a#3,d4] ~ d4 ~ d4 f4 a#4 f4 d4, [a#2,a#3]@3 a#4@5 ~@4, ~ f3 a#2 ~, ~@16 f4@11 ~@21, ~@24 a#3@8 ~@4 [f3,a#3]@9 ~@3]/2", // A# A#5
  Y: "~ f4 a4 f4 ~ f4, f3@19 ~@5, c4@9 ~@3 [c4,c5]@7 ~@5, ~@2 a4", // C
  Z: "~ f4 a4 [c4,c5] ~ f4, f3@14 ~@3 f3@7, c4@7 ~@9 a4@4 ~@4", // C
  AA: "[~@4 d4@4 f4@3 ~ [a#3,d4]@4 f4@4 d4@4 ~@4 d4@4 f4@4 ~@4 f4@4 ~@8 e4@2 ~@2 [c#4,e4,f#4]@3 ~ [c#4,e4]@7 ~ [c#4,e4]@3 ~ c#4@3 ~ c#4@3 ~ [c#4,e4,f#4]@3 ~ [c#4,e4,f#4]@3 ~ [c#4,e4]@3 ~ [f#3,c#4,e4]@4, a#2@20 f3@2 ~@2 a#2@13 ~@11 [c#4,f#4]@7 ~@5 f#4@11 ~ [e4,f#4]@7 ~@9 f#4@8, a#3@9 ~@3 a#4@16 ~@8 [a#3,a#4]@7 ~ a#3@39 ~ a#3@10 ~@2, ~@24 a#3@10 ~@2 f3@12 f#3@21 ~@3 f#3@10 ~@2 f#3@4 ~@8]/4", // A# F#7 C#m F#7 C#m F#7 F#5 Esus2 …
  AB: "[~ d4 f4 d4 ~ d4 ~ d4 f4 ~ f4 d4, [a#2,a#3]@3 a#4@5 ~ a#3@2 ~, ~@12 a#3@7 ~@5 a#2@12 ~@12, ~@12 f3 ~@3 f4@8 a#3@9 ~@3 [f3,a#4]@12]/2", // A# A#5
  AC: "[~@16 f#4@4 c#4@4 ~@4 c#4@4 f#4@3 ~ c#4@4 f#4@4 c#4@4 ~@4 d4@4 f4@4 d4@4 f4@3 ~ d4@4, [f#3,a#3]@21 ~@3 f#3@14 ~@2 f#3@8 [a#2,a#3]@12 [a#3,a#4]@9 ~@3, ~@8 c#4@9 ~@7 a#3@9 ~@3 a#3@8 ~@16 f3@12, ~@12 a#4@17 ~@7 a#4@19 ~@17]/3", // F# A#
  AD: "~@2 d4@2 f4@2 [a#3,d4]@2 f4@2 d4 ~, a#2@4 a#4@3 ~, a#3@3 ~ f3@4", // A#
  AE: "[[c#4,e4]@3 ~ [c#4,e4]@3 ~ [c#4,e4]@3 ~ e4@3 ~ e4@3 ~ [c#4,e4]@3 ~ e4@3 ~ e4@4 ~@8 f#4@4 ~@4 [d4,f4]@4 a#3@4 d4@2 ~@2 d4@4 f4@4 d4@4, a#3@33 ~@3 [a#3,c#4]@7 ~ a#3@7 ~@9 [f3,a#4]@12, [f#3,f#4]@12 f#4@20 ~@4 a#4@13 ~@23, ~@12 [f#3,c#4]@9 ~@2 f#3@6 ~@3 f#3@7 ~ f#3@8 a#2@12 ~@12, ~@24 c#4@9 ~@27 a#3@8 ~@4]/3", // C#m Dm A#m A#5 F# F#5
  AF: "[~@4 d4@4 f4@4 [a#3,d4]@4 f4@4 d4@4 ~@4 c#4@4 f#4@3 ~ c#4@4 ~@4 c#4@4 a#3@4 c#4@4 [a#3,f#4]@4 [f#3,c#4]@4 [a#3,f#4]@4 [f#3,c#4]@4, a#2@12 f3@12 f#3@11 ~ [f#3,a#3]@8 ~@4 f#3@12 ~@12, a#3@9 ~@3 a#4@15 ~@9 a#4@20 ~@4 a#4@12, ~@24 a#3@7 ~@9 f#4@10 ~@22]/3", // A# D#m F#5 D#m F#5 F#
  AG: "[~@4 d4@4 f4@4 d4@4 ~@4 d4@4 ~@4 d4@4 f4@4 d4@4 f4@4 d4@3 ~, a#2@12 f3@12 a#2@13 ~@11, a#3@9 ~@3 a#4@19 ~@17, ~@12 a#3@8 ~@4 a#3@9 ~@3 [f3,a#4]@11 ~, ~@16 f4@8 ~@12 a#3@7 ~@5]/2", // A#5
  AH: "f#4 ~@3 [c#4,e4]@3 ~ [c#4,e4,f#4]@3 ~ [c#4,e4,f#4]@3 ~ [e4,f#4]@3 ~ [e4,f#4]@3 ~, a#3, a#2@13 ~@3 c#4@7 ~, f#3@9 ~@3 f#3@11 ~", // C#m F#7 Esus2
  AI: "[e4@3 ~ e4@3 ~ e4@3 ~ [c#4,f#4]@4 [c#4,e4]@3 ~ [c#4,e4] ~@3 [a#2,d4,f4,a#4]@24, a#3, f#3@19 ~ f#3@4 ~@24, [c#4,f#4]@11 ~ e4@2 ~@2 f#4@4 ~@28]/2", // F#5 C#m A# F#5
})).s("gm_piano").gain(0.33).pan(0.3)

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  ~ A@2 B C A D E F A D G H I J K@2 A L C@2 A@2 M N A@2 B C A D E F A D G H I J K@2 A L C@2 A@2 K O P@2 K@2 P@2 Q R S P
  T Q U@2 Q V S P T Q U@2 Q V W ~
>`.pickRestart({
  A: "a1@7 ~", B: "e1@7 ~", C: "e1@5 ~", D: "a1@5 ~", E: "e1@3 ~ e1@3 ~ e1@3 ~ e1@3 ~ e1@3 ~ e1@3 ~",
  F: "e1@3 ~ e1@3 ~ e1@3 ~ e1@3 ~ e1@3 ~ e1@4", G: "c#2@7 ~", H: "c#2@8 ~@2 c#2 ~", I: "d2@7 ~", J: "d2@5 ~",
  K: "f1@5 ~", L: "a1@17 ~@3 a1 ~@3", M: "e1@3 ~ e1@5 ~@3 e1@3 ~ e1@5 ~@3", N: "e1@3 ~ e1@4 ~@16",
  O: "f1@6 ~@2 g1 ~ a1 ~", P: "a#1@5 ~", Q: "f#1@7 ~", R: "f#1@4 f#1@3 ~ f#1@3 ~ f#1@3 ~ f#1@3 ~ f#1@4",
  S: "a#1@19 ~@4 f1", T: "f#1@5 ~", U: "[a#1@5 ~ a#1@5 g#1, ~@23 f1@2 ~@23]/2",
  V: "f#1@3 ~ f#1@3 ~ f#1@3 ~ f#1@3 ~ f#1@2 ~@2 f#1@3 ~", W: "a#1",
})).s("gm_fretless_bass").gain(0.44)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~ A B C@2 D A E F G A H I J K L@2 A M N@2 O@2 P Q A B C@2 D A E F G A H I J K L@2 A M N@2 R@2 S T U@2 V W X@2 Y@2 Z@2
  AA@2 AB AC AD@2 Z@2 AA@2 AB AC AD@2 AE ~
>`.pickRestart({
  A: "~@2 a3 c#4 ~ e3, a2@5 ~, ~ e3@3 a3@2", B: "~@2 a3 c#4 ~ e3, a2@19 ~@5, ~ e3@3 a3@2",
  C: "[~@2 e3 g#3 ~ b2 ~@2 e3 g#3 ~ b2, e2@20 ~@4 e2@16 e3@7 ~, ~@4 b2@12 e3@12 b2@15 ~@5]/2",
  D: "~@2 a3 c#4 ~ e3, a2@2 ~, ~ e3@3 a3@2",
  E: "[e2,b2]@3 ~ [e2,b2]@3 ~ [e2,b2]@3 ~ b2@3 ~ b2@3 ~ [e2,b2]@3 ~, ~@12 e2@7 ~@5", // E5
  F: "[e2,b2]@3 ~ [e2,b2]@3 ~ [e2,b2]@3 ~ [e2,b2]@3 ~ [e2,b2]@3 ~ [e2,b2]@3 ~", // E5
  G: "~@2 a3 c#4 ~ e3, a2@15 ~ a3@8, ~@4 e3@13 ~@7", H: "~@2 c#4 f4 c#4 g#3, c#3 ~, ~ g#3@2 ~@3",
  I: "~@2 c#4 ~ c#4 g#3, c#3@5 ~@3, ~ g#3@2 f4@3", J: "~@2 d4 f#4 ~ a3, d3@5 ~, ~ a3@3 d4@2",
  K: "~@4 d4@2 f#4@2 ~@2 a3 ~, d3@5 ~@3, ~ a3@3 d4@2",
  L: "[~@2 f3 a3 ~ c3 ~@2 f3 a3 ~ c3, f2@20 ~@4 f2@21 ~@3, ~ c3@3 f3@3 c3@3 f3@2]/2",
  M: "~@2 a3 c#4 ~ e3, a2@5 ~, ~@4 e3@11 ~ a3@8",
  N: "[~@2 e3 g#3 ~ b2 ~@2 e3 g#3 ~ b2, e2@20 ~@4 e2@21 ~@3, ~ b2@3 e3@3 b2@3 e3@2]/2",
  O: "[~@2 a3 c#4 ~ e3 ~@2 a3 c#4 ~ e3, a2@20 ~@4 a2@21 ~@3, ~ e3@3 a3@3 e3@3 a3@2]/2",
  P: "e2@3 ~ e2@4 ~@4 e2@4 [e2,b2]@5 ~@3, ~@6 b2 ~@5", Q: "[e2,b2]@3 ~ [e2,b2]@3 ~@17",
  R: "[~@2 a3 c#4 ~ e3 ~@2 a3 c#4 a3 e3, a2@20 ~@4 a2@21 ~@3, ~@4 e3@12 a3@12 e3@13 ~@7]/2",
  S: "f2@3 ~@9 f2@3 ~ [f2,c3]@3 ~ [f2,c3]@4, c3@7 ~ c3@7 ~@9, ~@4 f2@7 ~@13", // F5
  T: "f2@3 ~ f2@3 ~ [f2,c3]@3 ~ [f2,c3]@4 g2@4 a2@3 ~, c3@7 ~@17", U: "~@2 a#3 d4 ~ f3, a#2@2 a#3, ~@4 f3@13 ~@7",
  V: "~@2 f3 a3 ~ c3, f2@5 ~@3, ~ c3@3 f3@2", W: "~@2 f3 a3 ~ c3, f2@5 ~, ~ c3@3 f3@2",
  X: "[~@2 a#3 d4 ~ f3 ~@2 a#3 d4 ~ f3, a#2@2 ~ a#2@2 a#3, ~@4 f3@12 a#3@12 f3@13 ~@7]/2",
  Y: "[~@2 f#3 a#3 ~ c#3 ~@2 f#3 a#3 ~ c#3, f#2@4 f#3@3 c#3@3 f#3@2, ~@4 c#3@13 ~@7 f#2@17 ~@7]/2",
  Z: "[~@2 a#3 d4 ~ f3 ~@2 a#3 d4 ~ f3, a#2@16 a#3@12 f3@13 ~@7, ~@4 f3@13 ~@7 a#2@15 ~ a#3@8]/2",
  AA: "[~@2 f#3 a#3 ~ c#3 ~@2 f#3 a#3 f#3 c#3, f#2@13 ~@11 f#2@12 ~@12, ~@4 c#3@9 ~@3 f#3@12 c#3@9 ~@11]/2",
  AB: "~@2 a#3 d4 ~ f3, a#2@17 ~@7, ~ f3@3 a#3@2", AC: "~@2 a#3 d4 ~ a#2, a#2@7 ~ a#3@4, ~ f3@4 ~",
  AD: "[~@2 f#3 a#3 ~ c#3 ~@2 f#3 a#3 f#3 c#3, f#2@17 ~@7 f#2@18 ~@6, ~@4 c#3@11 ~ f#3@12 c#3@13 ~@7]/2",
  AE: "[a#2,f3]", // A#5
})).s("gm_electric_guitar_clean").gain(0.18).pan(0.7)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<~@4 A ~@15 B ~@7 A ~@15 B ~@30>".pickRestart({
  A: "~@3 b4 [f#4,a4] [g#4,b4], g#4@7 ~ g#4@8 ~@8, ~@4 b4@7 ~@13", B: "~@2 [g#4,b4]@3 ~@3 [g#4,b4]@3 ~",
})).s("gm_overdriven_guitar").gain(0.27)

// chords · trumpet
const trumpet = note("<~@7 A B C ~@13 D E ~@6 A B C ~@15 F@2 G@2 H@2 I@2 F@2 J@4 K@2 ~@2 L@2 M@2 N@2 O ~>".pickRestart({
  A: "~@4 e4@4 f#4@4 g#4@3 a4@5 a#4@4", B: "b4@4 c#5@4 d5@4 e5@4 f#5@4 g#5@3 ~", C: "a5@23 ~, g#5 ~@23",
  D: "[e4,e5]@4 [e4,e5] ~@7 [e4,e5]@3 ~ e4@2 ~@6, ~@16 e5 ~@7", E: "[e4,e5]@3 ~ [e4,e5]@2 ~@18",
  F: "[[d4,f4,a#4]@11 ~]/2", G: "[[a3,f4,c5]@11 ~]/2", H: "[[d4,f4,a#4]@41 ~@7]/2", I: "[[c#4,f#4,a#4]@11 ~]/2",
  J: "[[c#4,f#4,c#5]@44 ~@4 d4@45 ~@3, ~@47 [a#4,f5]@45 ~@4]/4", K: "[[c#4,a#4,f#5]@11 ~]/2",
  L: "[[c#4,a#4,c#5,c#6]@41 ~@7]/2", M: "[[d4,a#4,a#5]@15 ~]/2", N: "[[f#4,c#5,a#5]@43 ~@5]/2", O: "[f4,d5,a#5]",
})).s("gm_trumpet").gain(0.24).pan(0.3)

// other · trombone
const trombone = note("<~@7 A B C ~@21 A B C ~@41>".pickRestart({
  A: "~@4 e2@3 f#2@4 ~ g#2@4 a2@4 a#2@4", B: "b2@3 c#3@4 ~ d3@4 e3@3 f#3@4 ~ g#3@3 ~", C: "g#3 a3@23",
})).s("gm_trombone").gain(0.16).pan(0.8)

// other · brass section · "BRASS 1"
const brass_section = note(`<
  ~@7 A B C ~@13 D@2 ~@6 A B C ~@15 E@2 F@2 G@2 H@2 I@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2 Q ~
>`.pickRestart({
  A: "~ [e3,e4] [f#3,f#4] [g#3,g#4] [a3,a4] [a#3,a#4]", // E F# G# A A#
  B: "[b3,b4]@4 [c#4,c#5]@4 [d4,d5]@4 [e4,e5]@4 [f#4,f#5]@4 [g#4,g#5]@3 g#4", C: "[a4,a5], g#5 ~@23",
  D: "[[e3,e4]@4 [e3,e4]@2 ~@6 [e3,e4]@3 ~ [e3,e4]@2 ~@5 [e3,e4]@4 ~ [e3,e4]@2 ~@18]/2", E: "[a#4@37 ~@11]/2",
  F: "[c5@5 ~]/2", G: "[a#4@5 ~]/2", H: "[a#4@13 ~@3]/2", I: "[a#4@19 ~@5]/2", J: "[c#5@19 ~@5]/2", K: "[f5@5 ~]/2",
  L: "[f#5@41 ~@7]/2", M: "[a#5@5 ~]/2", N: "[c#6@7 ~]/2", O: "[a#5@15 ~]/2", P: "[a#5@47 ~]/2", Q: "a#5",
})).s("gm_brass_section").gain(0.3)

// drums · kick
const kick = s("bd").struct("<~ A@6 B@2 A@14 C D A@6 B@2 A@24 E A E A E A E A E A E A E A E A@2 ~>".pickRestart({
  A: "x", B: "x!2", C: "x!2 ~ x!2 ~", D: "x!2 ~@4", E: "x ~@22 x",
})).gain(0.44)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@22 A B ~@32 C ~@7 D ~@7 D ~@2>".pickRestart({
  A: "~@23 x", B: "~@11 x ~@11 x", C: "~ x!3 ~@8", D: "~ x ~@10",
})).gain(0.22)

// drums · ride
const ride = s("rd").struct("<~ A@6 ~@2 A@14 B ~ A@30 C@2 D E F G H G@2 C D E F G H G@2 C B ~>".pickRestart({
  A: "x!2", B: "x", C: "x!6", D: "~@4 x ~@3 x ~@3 x ~@7 x ~@2 x", E: "x!2 ~ x ~@2", F: "x ~ x!4",
  G: "x ~@3 x ~@2 x!2 ~@3 x ~@3 x ~@2 x!2 ~@3", H: "x ~@6 x!2 ~@3 x ~@3 x ~@2 x!2 ~@3",
})).gain(0.27)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@57 A B C ~ D ~@3 A B C ~ D ~@5>".pickRestart({
  A: "~@2 x", B: "~@2 x ~ x!2", C: "~@4 x ~@2 x ~@11 x ~@4", D: "~ x ~@4",
})).gain(0.16)

// drums · crash
const crash = s("cr").struct("<~@57 x ~@7 x ~@9>").gain(0.27)

stack(
  piano, bass, electric_guitar_clean, overdriven_guitar, trumpet, trombone, brass_section, kick, snare, snare_soft,
  ride, ride_soft, crash
)

More by Otis Redding