Strudelify

Always on My Mind

Willie Nelson

KeyG majorTempo123 bpm
0:00/0:00
// Always on My Mind — Willie Nelson
// 123 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 13 "Accordion" bandoneon (copy of ch 4 "Melody" synth choir, 0.25 beats late)
// note: Full arrangement: all 121 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(123/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 · brass section · "Brass"
const brass_section = note(`<
  ~@2 A B C D A B C D A B C D@3 A ~@15 A B C D A B C E F ~@15 A B C D A B C E F ~@27 A B C D A B C D A B C D A B C D A B
  C D A B C D A B C D ~
>`.pickRestart({
  A: "[b4,d5,g5,b5] ~@7", // G
  B: "[a4,d5,f#5,a5] ~ [a4,d5,f#5,a5] ~ [a4,d5,f#5,a5] ~ [a4,f#5,a5] ~@5 [b4,d5,b5] ~@3, ~@3 d5 ~@2 f#5 ~", // D Bm
  C: "[g4,b4,e5,g5] ~@7", D: "[g4,c5,e5,g5] ~ [g4,c5,e5,g5] ~ [g4,c5,e5,g5] ~ [g4,c5,e5,g5] ~@5 [a4,d5,f#5,a5]@2 ~@2",
  E: "[e4,a4,e5,a5] ~ [e4,a4,e5,a5] ~ [e4,a4,e5,a5] ~ [e4,a4,e5,a5] ~@5 [g4,e5,g5] ~@3, ~@6 e4 ~", // A5 C
  F: "[e4,c5,e5,c6] ~@7", // C
})).s("gm_brass_section").gain(0.24).pan(0.6)

// bass · synth bass 1 · "Bass"
const bass = note(`<
  ~@2 A B C D A B C D A B C D@3 A B C D A B C E F A G H B A I J A B C D A B C E F A G H B A I J K C L M K C L M A B C D
  A B C E F A G H B A I J ~@4 K C L M B A I N B A I N B A I J A B C D A B C D A B C D A B C D A B C D A B C D A B C D ~
>`.pickRestart({
  A: "g1!2 g2!2 g1!2 g2!2 g1!2 g2!2 g1!2 g2!2", B: "d1!2 d2!2 d1!2 d2!2 d1!2 d2!2 d1!2 d2!2",
  C: "e1!2 e2!2 e1!2 e2!2 d1!2 d2!2 d1!2 d2!2", D: "c1!2 c2!2 c1!2 c2!2 c1!2 c2!2 d1!2 d2!2",
  E: "a1!2 a2!2 a1!2 a2!2 a1!2 a2!2 a1!2 a2!2", F: "c2!2 c3!2 c2!2 c3!2 c2!2 c3!2 c2!2 c3!2",
  G: "c2!2 c3!2 c2!2 c3!2 c2!2 c3!2 b1!2 b2!2", H: "a1!2 a2!2 a1!2 a2!2 g1!2 g2!2 e1!2 e2!2",
  I: "c1!2 c2!2 c1!2 c2!2 d1!2 d2!2 d1!2 d2!2", J: "a#0!2 a#1!2 a#0!2 a#1!2 c1!2 c2!2 c1!2 c2!2",
  K: "g1!2 g2!2 g1!2 g2!2 f#1!2 f#2!2 f#1!2 f#2!2", L: "c1!2 c2!2 c1!2 c2!2 b0!2 b1!2 b0!2 b1!2",
  M: "a0!2 a1!2 a0!2 a1!2 d1!2 d2!2 d1!2 d2!2", N: "g1!2 g2!2 g1!2 g2!2 g1!2 g2!2 e1!2 e2!2",
})).s("gm_synth_bass_1").gain(0.32)

// other · orchestra hit
const orchestra_hit = note(`<
  ~@2 A ~@2 B C ~@2 B C ~@2 B D@2 C ~@14 E A ~@14 F A ~@6 G H ~@12 I J F ~@17 K L M A ~@2 B A ~@2 B A ~@2 B A ~@2 B A
  ~@2 B A ~@2 B A ~@2 B ~
>`.pickRestart({
  A: "g4 ~@3", B: "~@3 d5", C: "g5 ~@3", D: "c4 ~@5 d5@2", E: "~ a#4 ~ c5", F: "~ [a#3,a#4] ~ [c4,c5]", G: "~@15 d4",
  H: "[g4,g5]@3 ~@13", I: "~@2 g5!2 a5!2 b5!2, ~ g4 a4 b4", J: "~ c4@4 ~@11, c5 ~@3", K: "~@2 g5!2 a5!2 b5!2",
  L: "c6 ~@3", M: "~ a#5!2 ~@2 c6!3",
})).s("gm_orchestra_hit").gain(0.35).pan(0.6)

// other · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@24 A B C D E@2 F G ~@8 A B C D E@2 F G H I J K H I J K ~ L@6 M A B C D E@2 F G H I J K H I J K E@2 N O E@2 N O E@2 N
  G ~@29
>`.pickRestart({
  A: "c4", B: "b3", C: "c4@3 b3", D: "a3@2 g3 e3",
  E: "[d3@18 ~@2 [g3,g4] ~ [g3,g4] ~ [a3,a4] ~ [a3,a4] ~ [b3,b4] ~ [b3,b4] ~]/2", F: "[c4,c5]",
  G: "[a#3,a#4]@8 [c4,c5]@7 ~", H: "[g2,g3] [f#2,f#3]", I: "e3 [d2,d3]", J: "c3 [b1,b2]", K: "[a1,a2] [d2,d3]",
  L: "[~ b6@23]/6", M: "c#7", N: "[c4,c5]@15 ~", O: "[g3,g4]@7 ~ [g3,g4] ~ [g3,g4] ~ e3 ~ e3 ~",
})).s("gm_string_ensemble_1").gain(0.28).pan(0.6)

// other · string ensemble 1 · "Strings" · soft notes
const string_ensemble_1_soft = note("<~@49 A B ~@2 A B ~ C ~@16 A B ~@2 A B ~@4 D ~@3 D ~@33>".pickRestart({
  A: "e2 ~", B: "c2 ~", C: "~@8 c4 ~@7", D: "~@12 e4 ~ e4 ~",
})).s("gm_string_ensemble_1").gain(0.16).pan(0.6)

// chords · string ensemble 2 · "Strings 2"
const string_ensemble_2 = note(`<
  ~@2 A B C D A B C D A E F G@3 A E F G A E F H I J K@2 L J M N A E F G A E F H I J K@2 L J M N O@2 P Q O@2 P Q A E F G
  A E F H I J K@2 L J M N O@2 P Q O@2 P R L J M J L J M J L J M N A B C D A B C D A B C D A B C D A B C D A B C D A B C
  D ~
>`.pickRestart({
  A: "[d4,g4,b4]@15 ~", B: "[d4,f#4,a4]@11 ~ [d4,f#4,b4]@4", C: "e4 d4, [g4,b4]@15 ~",
  D: "[e4,g4,c5]@11 ~ [d4,f#4,d5]@4", E: "[d4,f#4,a4]@15 ~", F: "[e4,g4,b4] [d4,g4,b4]",
  G: "[c4,e4,g4]@11 ~ [d4,f#4,a4]@4", H: "[c#4,e4,a4]@15 ~", I: "[c4,e4,g4]@15 ~", J: "[b3,d4,g4]@15 ~",
  K: "[[c4,e4,g4]@11 ~ [b3,d4]@4 [c4,e4]@15 ~, ~@12 g4@19 ~]/2", L: "[a3,d4,f#4]@15 ~", M: "[c4,e4,g4] [c4,f#4,a4]",
  N: "[d4,f4,a#4] [e4,g4,c5]", O: "[b3,d4]/2", P: "[c4,e4] [b3,d4]", Q: "[a3,c4]", R: "[a2,a3]@2 [a2,a3] [e3,e4]",
})).s("gm_string_ensemble_2").gain(0.16).pan(0.3)

// other · overdriven guitar
const overdriven_guitar = note("<~@56 A@8 ~@57>".pickRestart({
  A: "[~ b5@15]/8",
})).s("gm_overdriven_guitar").gain(0.21)

// drums · kick
const kick = s("bd").struct("<[x!4]!120 ~>").gain(0.43)

// drums · snare
const snare = s("sd").struct("<~ [~@3 x] [~ x ~ x]!70 ~@3 [~@3 x] [~ x ~ x]!44 ~>").gain(0.33)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@2 A B@3 A B@3 A B@2 A@4 B@5 ~@2 A B@3 A B@2 C A B@5 ~@2 A B@3 A B@2 C A B@3 A B@3 A B@3 A B ~@2 A B@3 A B@2 C A B@3
  A B@3 A B@2 C A B@3 D B@2 C A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 ~
>`.pickRestart({
  A: "~ x!7", B: "x!8", C: "x!6 ~ x", D: "x!2 ~ x!5",
})).gain(0.33)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@5 A ~@3 A ~@3 A@3 ~@43 A ~@3 A ~@15 A ~@3 B ~@11 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~
>`.pickRestart({
  A: "~@12 x!4", B: "~@14 x!2",
})).gain(0.33)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@5 A ~@3 A ~@3 A@3 ~@15 A ~@15 A ~@7 B C ~@2 A ~@3 A ~@7 A ~@3 D ~@3 A ~@3 E ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
  A ~@3 A ~
>`.pickRestart({
  A: "~@4 x!8 ~@4", B: "~@15 x", C: "x", D: "~@3 x", E: "~@6 x!6 ~ x ~@2",
})).gain(0.33)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@5 A ~@3 A ~@3 A@3 ~@43 A ~@3 A ~@15 A ~@3 B ~@11 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~
>`.pickRestart({
  A: "x!4 ~@12", B: "~@2 x!4 ~@10",
})).gain(0.33)

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

// drums · cowbell
const cowbell = s("cb").struct("<[~@2 x ~@2 x ~@2 x ~@2 x ~@2 x!2]!120 ~>").gain(0.29)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<A@16 ~@12 A@4 ~@12 A@4 ~@20 A@4 ~@8 A@40 ~>".pickRestart({
  A: "x ~ x ~@4 x ~ x ~ x ~@4",
})).gain(1.52)

// drums · agogo bells
const agogo_bells_2 = s("agogo:4").struct("<A@16 ~@12 A@4 ~@12 A@4 ~@20 A@4 ~@8 A@40 ~>".pickRestart({
  A: "~@2 x ~@3 x!2",
})).gain(1.52)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<[x!16]!120 ~>").gain(1.45)

// drums · woodblocks
const woodblocks = s("woodblock:4").struct(`<
  ~@2 A ~@3 A ~@3 A ~@3 A ~@17 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@15 A ~@3 A ~@3 A ~@3 A ~@3 A
  ~@3 A ~@3 A ~@4
>`.pickRestart({
  A: "x!16",
})).gain(0.48)

stack(
  brass_section, bass, orchestra_hit, string_ensemble_1, string_ensemble_1_soft, string_ensemble_2, overdriven_guitar,
  kick, snare, hihat, low_tom, mid_tom, high_tom, crash, cowbell, agogo_bells, agogo_bells_2, cabasa, woodblocks
)

More by Willie Nelson