Strudelify

Ain't No Sunshine

Boney James

KeyA minorTempo80 bpm
0:00/0:00
// Ain't No Sunshine — Boney James
// 80 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 42 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/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.

// other · piano
const piano = note("<A ~@8 B C D C E ~ F C G ~@6 H I C D C J K L C D C D C D C M@2 ~>".pickRestart({
  A: "~ [c4,e4,a4]", B: "~@11 e2 g2@2 g#2@2", C: "a2@2 e2 g2", D: "a2@10 ~ e2 g2@2 g#2@2", E: "a2 ~",
  F: "~@5 e2 g2 g#2", G: "a2@5 ~@3", H: "[a2,e3,c4]@2 e2 g2, ~ [g3,b3]", I: "[a2,e3,c4]@15 ~", J: "a2@4 ~ a2 c2 d2",
  K: "e2 ~", L: "d2@9 ~@2 e2 g2@2 g#2@2", M: "[a2@2 [b3,c4,e4]@23 ~@7]/2",
})).s("gm_piano").gain(0.4).pan(0.6)

// bass · acoustic bass
const bass = note("<~@2 A B A C D E A F G B H C D I J K ~@6 G B L B H C D M L B L B N B G O ~@2>".pickRestart({
  A: "a1@2 e1 g1", B: "a1@8 ~@3 e1 g1@2 g#1@2", C: "a1@4 ~ a1 c2 d2", D: "e2@6 g2@4 b2@4 e2 d#2", E: "d2@5 ~ g1 g#1",
  F: "a1@10 ~ e1 g1@2 g#1@2", G: "a1@7 ~ e1@4 g1@3 ~", H: "a1@7 ~ e1@3 ~ g1@3 ~", I: "d2@2 d2@2 ~ e1 g1 g#1",
  J: "a1@6 ~@2 e1@4 g1@3 ~", K: "a1 ~", L: "a1@7 ~ e1@4 g1@4", M: "d2@8 ~@3 e1 g1@2 g#1@2", N: "a1@3 ~ e1@2 g1@2",
  O: "a1",
})).s("gm_acoustic_bass").gain(0.4)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~@2 A B C B D E F B G B H I D J K B ~@6 L B M B N O D P Q O R I S B N T@2 ~
>`.pickRestart({
  A: "~ [g3,c4]!3 ~ [d3,g3] g2 [f3,b3], a2@7 ~ e2@4 ~@4", B: "~ [g3,c4]@6 ~, a2@15 ~",
  C: "a2 [g3,c4] ~ [g3,c4] ~ [d3,g3] g2 [f3,b3], ~ a2 e2 ~", D: "e3 [d4,g4] e3 [d4,g4] e3 [d4,g4] e3 [d4,g4]",
  E: "d3 [c4,f4] ~ [c4,f4] ~ [c4,f4] d3 [c4,f4], ~ d3!2 ~", F: "~ [g3,c4] a2 [g3,c4] e2 [d3,g3] g2 [f3,b3], a2 ~@3",
  G: "~ [g3,c4]@3 ~ [d3,g3] ~ [f3,b3], a2@7 ~ e2@4 g2@4", H: "~ [g3,c4]@3 ~ [d3,g3] g2 [f3,b3], a2@2 e2 ~",
  I: "~@2 [g3,c4]@13 ~, a2@15 ~", J: "d3 [c4,f4] ~ [c4,f4] ~ [c4,f4] ~ [c4,f4], ~ d3!3",
  K: "~ [g3,c4] ~ [g3,c4] ~ [d3,g3] g2 [f3,b3], a2@7 ~ e2@4 ~@4", // C5 G5 Fdim
  L: "~ [g3,c4] ~ [g3,c4] ~ [d3,g3] g2 [f3,b3], a2@2 e2 ~", // C5 G5 Fdim
  M: "~@2 [g3,c4]@3 ~ [g3,c4]@2 e2@2 [d3,g3]@2 g2@2 [f3,b3]@2, a2@7 ~@9", // C5 G5 Fdim
  N: "~ [g3,c4] ~ [g3,c4] e2 [d3,g3] g2 [f3,b3], a2@7 ~@9", O: "~ [g3,c4]@5 ~@2, a2@15 ~",
  P: "d3 [c4,f4] ~ [c4,f4] d3 [c4,f4] d3 [c4,f4], ~ d3 ~@2", // F5
  Q: "~ [g3,c4] ~ [g3,c4] ~ [d3,g3] ~ [f3,b3], a2@7 ~ e2@4 g2@4", // C5 G5 Fdim
  R: "~ [g3,c4]@2 [g3,c4] ~ [d3,g3] g2 [f3,b3], a2@7 ~ e2@4 ~@4", // C5 G5 Fdim
  S: "~@2 [g3,c4]@3 ~ [g3,c4]@2 e2@2 [d3,g3]@2 ~@2 [f3,b3]@2, a2@7 ~@5 g2@4", T: "[~ [g3,c4]@9 ~@6, a2@15 ~@17]/2",
})).s("gm_acoustic_guitar_steel").gain(0.3).pan(0.4)

// chords · string ensemble 1
const string_ensemble_1 = note("<~@10 A B A C D E F G ~@8 A B A C D E F H F H F H F I@3>".pickRestart({
  A: "[c5,e5] [e5,a5] [g5,b5] [d5,g5]", B: "[c5,e5]@15 ~", C: "[c5,e5]", D: "[d5,g5]", E: "[c5,f5]@15 ~",
  F: "[a4,e5]@2 [g4,d5]!2", G: "[a4,e5]@15 ~", H: "[a4,e5]", I: "[[b4,e5]@5 ~]/3",
})).s("gm_string_ensemble_1").gain(0.25).pan(0.3)

// chords · string ensemble 1
const string_ensemble_1_2 = note("<~@10 A B A B C D E F ~@8 A B A B C D E F E F E F E G@3>".pickRestart({
  A: "a3 c4 [e2,b3] [g2,g3], a2 ~", B: "[a2,a3]", C: "[e2,b3]", D: "[d2,a3]", E: "[a2,c4]@2 [e2,b3] [g2,b3]",
  F: "[a2,c4]", G: "[[a2,c4]@5 ~]/3",
})).s("gm_string_ensemble_1").gain(0.3).pan(0.7)

// drums · kick
const kick = s("bd").struct("<~@10 A B A B A@2 C D E D F E@2 G C H I J I B A@2 D F@5 C K ~@2>".pickRestart({
  A: "x ~@7 x ~@2 x ~@4", B: "x ~@8 x ~ x ~@4", C: "x!2", D: "x ~ x!2 ~@4 x ~ x!2 ~@4", E: "x ~ x!2 ~@4 x ~@2 x ~@4",
  F: "x ~@2 x ~@4 x ~ x!2 ~@4", G: "x ~@2 x ~@4 x ~@2 x ~@4", H: "~ x ~ x ~@5 x ~ x ~@4", I: "x ~@7 x ~ x!2 ~@4",
  J: "x ~@2 x ~@5 x ~ x ~@4", K: "x",
})).gain(0.4)

// drums · rim
const rim = s("rim").struct("<~@10 [~ x ~ x]!29 ~@3>").gain(0.5)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@10 [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!29 ~@3>").gain(0.15)

// drums · ride
const ride = s("rd").struct("<~@39 x ~@2>").gain(0.5)

// drums · congas
const congas = s("conga:13").struct("<~@16 [~@3 x ~@3 x]!8 ~@18>").gain(1.11)

// drums · congas
const congas_2 = s("conga:33").struct("<~@16 [~@2 x!2 ~@6 x!2 ~@4]!8 ~@18>").gain(1.11)

// drums · lt
const lt = s("lt").struct("<~ [~ x!3] [x!4]!14 ~@8 [x!4]!15 ~@3>").gain(0.3)

stack(
  piano, bass, acoustic_guitar_steel, string_ensemble_1, string_ensemble_1_2, kick, rim, hihat, hihat_soft, ride,
  congas, congas_2, lt
)