Strudelify

1971

Ain't No Sunshine

Bill Withers

KeyA minorTempo82 bpm
0:00/0:00
// Ain't No Sunshine — Bill Withers
// 82 bpm, 4/4, key A minor. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 61 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(82/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 · "bass"
const bass = note(`<
  ~@10 A B C D E F G H ~@2 I@2 J B A B C D E F G K L M N O P Q R S A B C D E F G K A B A B A B A B A B A B ~
>`.pickRestart({
  A: "d#2!3 ~@3 d#2 ~ a#1@4 c#2@3 a#1", B: "d#2!3 ~@13", C: "d#2!3 ~@3 d#2@2 a#1@4 c#2@4", D: "d#2!3 ~@7 d#2@3 c#2@3",
  E: "a#1@2 a#1 g#1, b1 ~@15", F: "g#1@8 g#1@3 ~ g#1 ~ c#2 d2", G: "d#2!3 ~@5 a#1@4 c#2@4", H: "d#2@3 ~@13",
  I: "[~ a#1@2 g#1]/2", J: "d#2 d#2@2 ~@3 d#2@2 a#1@4 c#2@3 ~", K: "d#2@3 ~ a#1@8 ~@4", L: "~@14 a#1 c#2",
  M: "d#2!3 ~@11 d#2 f#2", N: "g#2!3 ~@11 a#1 c#2", O: "d#2!3 ~@7 a#2@6", P: "b2@3 ~ b2!2 ~@2 b2 ~@2 b2@4 ~",
  Q: "a#2@2 ~@2 a#2!3 ~ a#2 ~@2 a#2@4 ~", R: "d#2@5 ~@3 a#1@4 c#2@4",
  S: "d#2!2 ~@2 a#2@4 a#3 g#3 f3 d#3 a#2 g#2 f2 c#2",
})).s("gm_fretless_bass").gain(0.64)

// chords · epiano1 · "piano"
const epiano1 = note(`<
  ~@2 A@2 B C D@2 E F G H I J K L M@2 ~@2 N@2 O P G H I J K L M@2 J@2 Q R S T U V G H I J K L M@2 G H W X Y Z AA AB AC
  AD AE AF ~
>`.pickRestart({
  A: "[[d#2,a#3,c#4,f#4]@8 [a#3,c#4,f4]@4 a#3@2 ~@2 [d#2,a#3,f#4]@15 ~, ~ a#2 ~@2, ~@14 c#4@17 ~]/2", // D#m7 A#m D#m
  B: "[d#2,a#3,c#4,f#4]@7 ~ [a#2,c#4,f4]@4 [c#3,c#4,f4]@4, ~@8 a#3@7 ~", C: "[d#2,a#3,c#4,f#4]@15 ~",
  D: "[[a#3,c#4,f4,g#4]@7 ~ g#2@8, a#2@15 [f#4,b4]@14 ~@3, ~@8 d#4@7 ~]/2", // A#m7 B5
  E: "[d#2,a#3,c#4,f#4]@8 f4@4 c#4@3 ~, ~ [a#2,a#3]", F: "[d#2,a#3,d#4,f#4]@9 ~@7",
  G: "[d#3,a#3,d#4,f#4]@2 a#2 c#3, ~ [a#3,c#4,f4,g#4]", H: "[d#3,a#3,d#4,f#4]@7 ~",
  I: "[d#3,a#3,d#4,f#4]@2 a#2 c#3, ~ [a#3,c#4,f4]", J: "[d#3,a#3,d#4,f#4]@15 ~", K: "[a#2,a#3,c#4,f4]@15 ~",
  L: "[g#2,f#3,b3,d#4]@15 ~", M: "[[d#3,d#4,f#4]@4 a#2@2 c#3@2 [d#3,d#4,f#4] ~@7, a#3@9 ~@7, ~ [c#4,f4] ~@2]/2",
  N: "[~@8 [f3,a#3,c#4]@15 ~ [d#3,f#3,b3]@7 ~]/2", O: "[d#3,f#3,a#3]@7 ~ [c#3,f3,a#3]@7 ~", P: "[d#3,f#3,a#3] ~",
  Q: "[g#2,b3,d#4,g#4]@15 ~", R: "[d#3,a#3,d#4,f#4]@10 [a#2,a#3,d4,f4]@5 ~", S: "[b2,b3,d#4,f#4]@15 ~",
  T: "[a#2,a#3,d4,f4,g#4]@15 ~", U: "[d#3,a#3,d#4,f#4]@2 a#2 c#3, ~@8 [a#3,c#4,f4]@7 ~",
  V: "[d#3,a#3,d#4,f#4] [a#2,a#3,a#4]@3", // D#m A#
  W: "d#4@2 e4 f4 ~ f4 d#4 f4 a#3 ~ c#4 ~@4 d#4, [d#3,a#3]@2 a#2 c#3, f#4@4 f#4@3 ~ [f4,g#4]@8, ~@2 d#4@4 ~@2 c#4@2 ~ c#4@3 c#4@2, ~@9 a#3@4 a#3@3", // D#5 Fm
  X: "d#4@5 ~ f4 ~ g#4 a#4 g#4 ~ f4 d#4 c#4 a#3, [d#3,a#3]@7 ~, f#4@7 f#4@4 f#4@3 ~@2, ~@5 d#4@8 ~@3", // D#5
  Y: "d#4@2 ~ f4 ~ g#4 f#4 d#4 a#3 ~@6 d#4, [d#3,a#3]@8 a#2@3 d#4@2 a#3@3, f#4@2 f#4 ~ [f4,g#4]@4, ~@2 d#4@5 ~ c#4@2 c#4@4 c#4@2, ~@9 a#3@3 c#3@4", // D#5 Fm
  Z: "[d#4,f#4]@2 f#4@2 f#4 [a#4,d#5] ~@4 [d#4,f#4,a#4] [d#4,f#4]@2 [a#3,d#4,f#4] ~@2, [d#3,a#3]@7 ~, ~ d#4@4 ~@3, ~@2 a#4 ~@2 f#4@5 ~ a#4 ~@4", // D#m D#5 D#m D#5
  AA: "a#3 ~@3 f4@2 c#4 [c#4,f4] a#3@2 ~@4 f#3@2, d#3@8 [a#2,c#4]@4 c#3@2 g#3 ~, [d#4,f#4]@2 d#4@5 ~@4 c#4@5, ~ a#3@6 ~@3 a#3@3 a#3@3, ~@3 f#4@4 ~ [f4,g#4]@8", // C# A#m D#m Fm
  AB: "d#3@2 f3 [f#3,g#3] ~ [b3,c#4] f4 g#4 a#4 ~ a#4 c#5 ~ d#5 ~ c#5, f#4@7 f#4@7 ~@2, [a#3,d#4]@2 a#3@5 ~, ~ d#3@6 ~, ~@5 d#4@9 ~@2", // F#sus2 Bsus2 D#5
  AC: "d#5!2 f5 f#5 g#5 f#5 f5 d#5 f5 c#5 a#4 ~@3 a#4 c#5, [d#3,a#3,d#4,f#4] [a#3,c#4,f4], ~@2 [a#2,g#4] c#3, ~@11 c#5@2 g#4@2 ~", // D#m A#m A#7
  AD: "d#5 ~ d#5 ~ d#5 c#5 a#4 c#5@2 d#5!3 f5 f#5 g#5 a5, [d#3,a#3,d#4,f#4]@7 ~", // D#m
  AE: "a#5!2 c#6 d#6 f#6 d#6 ~@3 [e6,f6] ~ [d#6,f6] c#6 a#5 g#5 f#5, [d#3,a#3,d#4,f#4] [a#3,c#4,f4,g#4], ~@2 a#2 c#3", // Fmaj7 D#sus2 D#m A#m7
  AF: "~ d#5 f5 ~@13, [d#3,a#3,d#4,f#4]@7 ~", // D#m
})).s("gm_epiano1").gain(0.42).pan(0.4)

// chords · string ensemble 2 · "strings"
const string_ensemble_2 = note(`<
  ~@6 A B C D ~@3 E@2 F G H ~@2 I@4 ~@3 E@2 F J K G@3 L M N@3 O ~ O E@2 F J K H ~@12
>`.pickRestart({
  A: "a#2", B: "[g#2,d#4]", C: "d#2@7 ~ [a#1,a#3]@8, a#4", D: "d#2@9 ~@7", E: "[[d#4,f#4] [c#4,f4], a#4]/2",
  F: "[b3,d#4,f#4]@7 ~", G: "d#5 ~@3 d#5 ~@3 d#5 ~@3 d#5 ~@3", H: "d#5 ~@15",
  I: "[~@8 [c#4,f4,a#4]@16 [b3,d#4]@8 d#4@8 [c#4,f4]@8 [f#3,d#4]@9 ~@7, ~@3 f#4@2 ~@3, ~@32 a#3@25 ~@7]/4", // A#m B C# D#m
  J: "[d#4,f#4,a#4] [g#3,c#4,f4]", K: "a#4", L: "d#5 ~@3 d#5 ~@3 d#5 ~ [a#4,d5,f5]@4 ~@2", M: "[b4,d#5,f#5]@15 ~",
  N: "[[d5,f5]@8 [d#3,f#4,d#5]@4 a#2@2 c#3@2 [d#3,f#4,d#5] ~@7, a#4@12 a#4@5 ~@7, ~@24 f4@7 ~@17]/3", // Dm D#m
  O: "~@4 f#5 g#5 ~@2 f5 ~@2 d#5 ~@2 c#5 d#5",
})).s("gm_string_ensemble_2").gain(0.44).pan(0.9)

// chords · string ensemble 2 · "strings" · soft notes · C# B5 D#5
const string_ensemble_2_soft = note(`<
  ~@6
  [[c#4,f4,g#4]]
  [[f#4,b4]]
  [f#4@7 ~ f4@8, c#4@7 ~]
  [[a#3,d#4]@5 ~@3]
  ~@28
  [~ c#5]
  ~@22
>`).s("gm_string_ensemble_2").gain(0.22).pan(0.9)

// chords · electric guitar clean · "guitar"
const electric_guitar_clean = note(`<
  ~@10 A B A B C D A E ~@2 F G H I A B A B C D A E ~@8 A B A B C D A E A J K E K E K E K E K E ~
>`.pickRestart({
  A: "~@2 [f#3,a#3,d#4] ~@3 [f#3,a#3,d#4] ~@3 [f3,g#3,c#4] ~@3 [f3,g#3,c#4] ~", // D#m C#
  B: "~@2 [f#3,a#3,d#4] ~@3 [f#3,a#3,d#4] ~@3 [f#3,a#3,d#4] ~@3 [f#3,a#3,d#4] ~", // D#m
  C: "~@2 [f3,a#3,c#4] ~@3 [f3,a#3,c#4] ~@3 [f3,a#3,c#4] ~@3 [f3,a#3,c#4] ~", // A#m
  D: "~@2 [d#3,f#3,b3] ~@3 [d#3,f#3,b3] ~@3 [d#3,f#3,b3] ~@3 [d#3,f#3,b3] ~", E: "[f#3,a#3,d#4] ~@15",
  F: "~@10 [a#3,c#4,f4] ~@3 [a#3,c#4,f4] c-1", // A#m
  G: "~@2 [a#3,c#4,f4] ~@3 [a#3,c#4,f4] ~@3 [f#3,b3,d#4] ~@3 [f#3,b3,d#4] ~", // A#m B
  H: "~@2 [f#3,a#3,d#4] ~@3 [f#3,a#3,d#4] ~@3 [f3,a#3,c#4] ~@3 [f3,a#3,c#4] ~", I: "[d#3,f#3,a#3,c#4]@11 ~@5",
  J: "~@2 [f#3,a#3,d#4] ~@13", // D#m
  K: "~@2 [f#3,a#3,d#4] ~@2 [f#3,a#3,d#4] ~@2 [f3,g#3,c#4] ~@2 [f3,g#3,c#4] ~@2 [f3,g#3,c#4] ~", // D#m C#
})).s("gm_electric_guitar_clean").gain(0.57).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~@10 [x ~@2 x ~ x ~@2 x ~@2 x ~@2 x ~]!49 [x ~@2 x ~ x ~@10] ~>").gain(0.4)

// drums · rim
const rim = s("rim").struct("<~@10 [~ x ~ x]!25 [~@2 x ~@2 x ~@2] [~ x ~ x]!23 [~ x ~@2] ~>").gain(0.45)

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

// drums · hihat
const hihat = s("hh").struct(`<
  [x!4]
  ~@9
  [~@3 x!2 ~@2 x ~@3 x!2 ~@2 x]!25
  [~@3 x!2 ~@2 x ~@8]
  [~@3 x!2 ~@2 x ~@3 x!2 ~@2 x]!23
  [~@3 x!2 ~@11]
  ~
>`).gain(0.45)

// drums · open hat
const open_hat = s("oh").struct("<~@10 [~ x ~ x ~ x ~ x]!25 [~ x ~ x ~ x ~@2] [~ x ~ x ~ x ~ x]!23 [~ x ~@6] ~>")
  .gain(0.35)

// drums · tambourine
const tambourine = s("tb").struct("<~@10 [x!16]!49 [x!6 ~@10] ~>").gain(0.35)

// drums · splash
const splash = s("cr").struct("<~@45 x ~@15>").gain(0.4)

// drums · congas
const congas = s("conga:13").struct("<~@18 A@3 ~ A@2 ~@8 A@3 ~ A@2 ~@12 A@9 ~@2>".pickRestart({
  A: "~@13 x!2 ~",
})).gain(1.27)

// drums · congas
const congas_2 = s("conga:18").struct("<~@18 A@3 ~ A@2 ~@8 A@3 ~ A@2 ~@12 A@10 ~>".pickRestart({
  A: "~ x!2 ~ x ~@11",
})).gain(1.27)

// drums · congas
const congas_3 = s("conga:33").struct("<~@18 A@3 ~ A@2 ~@8 A@3 ~ A@2 ~@12 A@2 B A@6 ~@2>".pickRestart({
  A: "~@3 x ~ x ~@2", B: "~@2 x!2 ~@2 x ~@3 x ~ x!2 ~@2",
})).gain(1.27)

// drums · ht
const ht = s("ht").struct("<~@9 A ~@13 A ~@13 A ~ A ~@9 A ~@11>".pickRestart({
  A: "~@11 x!4 ~",
})).gain(0.35)

// drums · ht · soft notes
const ht_soft = s("ht").struct("<~@9 A B ~@12 A B ~@12 A B A B ~@8 A B ~@10>".pickRestart({
  A: "~@15 x", B: "x",
})).gain(0.15)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~@18 A@3 ~ A@2 ~@8 A@3 ~ A@2 ~@12 A@9 B ~>".pickRestart({
  A: "x ~@2 x ~@4 x ~@3 x ~@3", B: "x ~@2 x ~@12",
})).gain(2.85)

// drums · shaker
const shaker = s("sh").struct("<~@41 [x!3 ~@13]!2 ~@9 [~ x] ~@8>").gain(0.4)

stack(
  bass, epiano1, string_ensemble_2, string_ensemble_2_soft, electric_guitar_clean, kick, rim, snare, hihat, open_hat,
  tambourine, splash, congas, congas_2, congas_3, ht, ht_soft, agogo_bells, shaker
)

More by Bill Withers