Strudelify

My Arms Keep Missing You

Caught in the Act

KeyD minorTempo123 bpm
0:00/0:00
// My Arms Keep Missing You — Caught in the Act
// 123 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 104 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.

// bass · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  A@3 B A@3 C A@3 B D@2 C E F G F H I J K L M@12 N M O P N M O Q R S R S R S R T M@8 N M O Q R S R S R S R T R S R S R S
  R T ~@4 M@4 N M O P N M O Q R S R S R T U@2
>`.pickRestart({
  A: "d1/3", B: "f1 g1", C: "g1 a1", D: "d1/2", E: "c2 d2", F: "a2@5 ~ a2@2 d2@5 ~ d2@2",
  G: "bb2@5 ~ bb2@2 c2@4 c2@3 ~", H: "bb2@5 ~ bb2@2 c2@3 ~ c2@3 ~", I: "a2@8 d2@5 ~ d2@2",
  J: "bb2@5 ~ bb2@2 c2@3 ~ c2@4", K: "a2@5 ~ a2@2 d2@7 ~", L: "bb2 a2 g2 c2", M: "d2 ~ d2 ~ d2!2 ~ d2!4 ~ d2!2 ~ d2",
  N: "a2 ~ a2 ~ a2!2 ~ a2!4 ~ a2!2 ~ a2", O: "g2 ~ g2 ~ g2!2 ~ g2!4 ~ g2!2 ~ g2",
  P: "c3 ~ c3 ~ c3!2 ~ c3 bb2!3 ~ bb2!2 ~ bb2", Q: "g1@2 g2 ~ a1@2 a2 ~ bb1@2 bb2 ~ c2@2 c3 ~",
  R: "a1@2 ~@2 a1@2 e2 d2@2 ~@2 d2!2 ~ d2 ~", S: "bb1@2 ~@2 bb1@2 ~ bb1 c2@2 ~ c2!2 ~ c2 ~",
  T: "bb1@2 bb2 ~ a1@2 a2 ~ g1@2 g2 ~ c2@2 c3 ~", U: "d2/2",
})).s("gm_synth_bass_2").gain(0.56)

// chords · piano · "A.PIANO 2"
const piano = note(`<
  A@3 B A@3 C A@3 B D@2 C E F G F H F G F I J ~@11 K L M N K L O P F G F H F G F I ~@8 K L O P F G F H F G F I ~@16 K L
  M N K L O P F G F G F I D@2
>`.pickRestart({
  A: "[d2,d3]/3", B: "[f2,f3] [g2,g3]", C: "[g2,g3] [a2,a3]", D: "[d2,d3]/2", E: "[c3,c4] [d3,d4]",
  F: "[c4,e4,g4]@2 ~@2 [c4,e4,g4]@2 ~ [c4,d4,f4]@3 ~ [c4,d4,f4] ~@2 [c4,f4] ~", // C Dm7 F5
  G: "[bb3,d4,f4]@2 ~@2 [bb3,d4,f4]@2 ~ [c4,e4,g4]@3 ~ [c4,e4,g4]@2 ~@3", // Bb C
  H: "[bb3,d4,f4]@2 ~@2 [bb3,d4,f4]@2 ~ [c4,e4,g4]@3 ~ [c4,e4,g4]@2 ~ [c4,e4,g4]@2", // Bb C
  I: "[bb3,d4,f4]@2 ~@2 [a3,d4,f4]@2 ~ [c4,e4,g4]@3 ~ [c4,e4,g4]@4 ~", J: "[d4,f4,a4] ~@7",
  K: "[a3,c4,e4] ~@3 [a3,c4,e4] ~@2 [a3,c4,e4]@7 ~@2", L: "[a3,d4,f4] ~@3 [a3,d4,f4] ~@2 [a3,d4,f4]@7 ~@2",
  M: "[g3,bb3,d4] ~@3 [g3,bb3,d4] ~@2 [g3,bb3,d4]@8 ~", N: "[g3,c4,e4]@7 ~ [g3,bb3,e4]@7 ~",
  O: "[g3,bb3,d4]@7 ~ [bb3,d4,g4]@7 ~", P: "~@4 [c4,e4,g4]@2 ~@2 [c4,e4,g4]@7 ~",
})).s("gm_piano").gain(0.32).pan(0.7)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  A@4 B@8 C@2 D@2 E@6 F@2 G@4 H@2 I@2 H@2 J@2 K L M N O P Q R E@6 F@2 H@2 I@2 H@2 J@2 K L Q R E@6 F@2 ~@8 H@2 I@2 H@2
  J@2 K L M N O P Q R E@2 S@2 T@2 U@2
>`.pickRestart({
  A: "[[d4,a4]@16 [f4,a4]@3 [e4,g4]@2 [d4,f4]@3 [c4,e4]@3 [d4,f4]@2 [e4,g4]@3 ~@16 f2@8 g2@8, d2@3 ~, [d3,a3] [g3,a3,c4,d4,g4]]/4", // D5 F Em Dm C Dm Em D5 …
  B: "[[d4,a4]@4 [f4,e5]@4 f5@3 g5 g2@2 a2@2 ~@4 a5@4 g5@4 [f2,bb5]@2 [g2,a5]@2, d2@3 a5@2 ~@3, [d3,a3]@2 [g3,c4,g4]@2 d2@3 ~, ~@2 [d3,a3,d4] [g3,c4,d4,a4]]/8", // D5 Fmaj7 Bb5 Gsus2 D5 C5 D5 Gsus4
  C: "[[d4,a4,d5] [f4,e5], [d2,d3,a3]]/2", D: "[[g2,f5]@2 [a2,g5]@2 a5 bb5 c6 db6, [g3,c4,g4], ~@2 c3 d3]/2",
  E: "[c4 ~ bb3 [c4,e4], a3 ~, ~ d4@2 ~]/2", F: "[c4@8 ~@8 bb3@8 [c4,e4]@3 bb4@5, a3 ~, ~ d4@2 ~]/2",
  G: "[[d4,a4,a5]@13 ~@3]/4", H: "[d4 e4, [d3,f3,a3]]/2", I: "[d3,g3,bb3,f4]/2",
  J: "[f4@4 g4@2 c4 d4, d3, [g3,bb3]@3 ~]/2", K: "[a2,a3,c4,e4]", L: "[d3,a3,d4,f4]", M: "[g2,g3,bb3,d4]",
  N: "~ g4 a4 bb4, [c3,g3,c4,e4]", O: "c5@3 e5, [a2,a3,c4,e4]", P: "[d3,a3,d4,f4,f5]", Q: "[g2,g3,bb3,d4,g5]",
  R: "g5 a5 bb5 c6, [c3,g3,c4,e4]", S: "[[c4,e6]@2 f6@2 [bb3,f6]@2 g6 a6, a3 ~, ~ d4@2 [c4,e4]]/2",
  T: "[[c4,e6] f6 [bb3,f6] [c4,e4,e6], a3 ~, ~ d4@2 ~]/2", U: "[d3,a3,d4,d6]/2",
})).s("gm_string_ensemble_2").gain(0.22).pan(0.4)

// other · clavinet
const clavinet = note(`<
  A@8 B ~@7 A C A C A C A C D@4 E@16 A C A C A C A ~ F@12 A C A C A C A ~@9 F@16 A C A C A C ~@2
>`.pickRestart({
  A: "c5 ~ d5 ~ a4 ~@2 a5 g5 d4 d5 d4 d5 ~ d4!2", B: "c5 ~ d5 ~@13", C: "c5 ~ d5 ~ bb4 ~@2 a5 g5 c4 c5 c4 c5 ~ c4!2",
  D: "c5 ~ d5 ~ a4 ~@2 a5 g5 ~ d4!2 d5 ~ d4 ~", E: "c5 ~ d5 ~ a4 ~@2 a5 g5 ~ d4 ~ d5 ~ d4 ~",
  F: "c5 ~ d5 ~ a4 ~@2 a5 g5 d4!3 d5 ~ d4!2",
})).s("gm_clavinet").gain(0.3).pan(0.2)

// other · clavinet · soft notes
const clavinet_soft = note("<~@24 [~@9 d4 ~@5 d4]!4 [~@9 d4 ~ d4 ~@3 d4]!16 ~@60>").s("gm_clavinet").gain(0.18).pan(0.2)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  A@8 B ~@7 C D C D C D C D E@20 C D C D C D C ~ F@8 G@4 C D C D C D C ~@9 H@8 G@8 C D C D C D I ~
>`.pickRestart({
  A: "[d4,a4] ~ [c4,g4] ~ a3 ~@2 d4 ~@2 a3 ~@2 a3 ~@2", B: "[d4,a4] ~@15",
  C: "[d4,a4] ~ [c4,g4] ~ a3 ~@2 d4 ~ g3 a3 ~@2 a3 ~ a3", D: "[d4,a4] ~ [c4,g4] ~ bb3 ~@2 c4 ~ f3 g3 ~@2 g3 ~ g3",
  E: "[d4,a4] ~ [c4,g4] ~ a3!2 ~ d4 ~@2 a3 c5 ~@4", F: "[d4,a4] ~ [c4,g4] ~ a3!2 ~ d4 ~@2 a3 c5 ~ a3 ~ a3",
  G: "[d4,a4] ~ [c4,g4] ~ a3!2 ~ d4 ~@2 a3 c5 ~ a3 ~@2", H: "[d4,a4] ~ [c4,g4] ~ a3!2 ~ d4 ~@3 c5 ~@4", I: "a3 ~@7",
})).s("gm_electric_guitar_muted").gain(0.24).pan(0.8)

// other · electric guitar muted · "MUTED GTR" · soft notes
const electric_guitar_muted_2 = note("<A@8 ~@16 B@20 ~@8 C@8 A@4 ~@16 D@8 A@8 ~@8>".pickRestart({
  A: "~@9 g3 ~@5 a3", B: "~@9 g3 ~@3 a3 ~ a3", C: "~@9 g3 ~@6", D: "~@9 g3 a3 ~@2 a3 ~ a3",
})).s("gm_electric_guitar_muted").gain(0.15).pan(0.8)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note("<~@8 A@8 ~@56 B C B C B C B C A@8 ~@16>".pickRestart({
  A: "[d3,a3,c4] ~ [c3,g3,d4] ~ [a2,a3] d4 d3 [d3,a4] d4 [g2,d3] [a2,d4,a4] d3 d4 a2 [d3,a4] [a2,d3]", // D7 Csus2 A D5 G5 D5
  B: "[a2,a3,c4] ~ [c3,g3,e4] ~ [a2,a3] d4 d3 [d3,a4] d4 [g2,d3] [a2,d4,a4] d3 d4 a2 [d3,a4] [a2,d3]", // Am C A D5 G5 D5
  C: "[bb2,f3,bb3] ~ [c3,g3,d4] ~ [bb2,bb3] d4 bb2 [c3,a4] c4 [g2,c3] [a2,c4,g4] c3 c4 a2 [c3,g4] [a2,c3]", // Bb5 Csus2 Bb F C5 Am7 C5 Am
})).s("gm_epiano2").gain(0.34).pan(0.3)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~ A B@2 ~ C D E@2 ~@7 F@2 G H F@2 I H ~@3 A ~@16 F@2 G H F@2 I J ~@12 F@2 G H F@2 I J ~@2 K L ~@2 K M ~@16 F@4 I J N@2
>`.pickRestart({
  A: "a4@3 g4@2 f4@3 e4@3 f4@2 g4@3", B: "d4/2", C: "e5", D: "f5", E: "a5/2",
  F: "[[e5,e6] ~@3 [e5,e6] ~@2 [e5,e6]!2 ~ [d5,d6] ~ [d5,d6] ~ [f5,f6]@6 ~@12]/2", // E D F
  G: "[e5,e6] ~@3 [e5,e6] ~@2 [e5,e6] [e5,e6]@2 [f5,f6]@2 [g5,g6]@2 [a5,a6]@2", H: "[d5,d6]@3 ~@5",
  I: "[e5,e6] ~@3 [e5,e6] ~@2 [e5,e6] [e5,e6]@2 ~ [f5,f6]@2 [a5,a6]@2 ~", J: "[d5,d6] ~@3", K: "~@14 a5 ~",
  L: "~@2 f5 ~@3 d5 ~@9", M: "~@2 f5 ~@3 d5 ~@3 bb4 ~@3 a4 ~", N: "[d2,d3]/2",
})).s("gm_string_ensemble_1").gain(0.23).pan(0.7)

// other · tenor sax
const tenor_sax = note("<~@8 A@8 ~@56 A@8 ~@18 A@3 B@2 ~>".pickRestart({
  A: "c4 d4 f4 f4@2 ~ c4 d4 f4 f4@2 ~ g4 f4 g4 a4", B: "[c4 d4 f4 f4@2 ~ c4 d4 f4 f4@2 ~ g4 f4 g4 a4@3 ~@14]/2",
})).s("gm_tenor_sax").gain(0.34).pan(0.7)

// other · orchestra hit · "ORCH.HIT"
const orchestra_hit = note("<~@24 [d4 ~@3] ~@27 [d4 ~@3] ~@27 [d4 ~@3] ~@23>").s("gm_orchestra_hit").gain(0.24).pan(0.3)

// drums · kick
const kick = s("bd").struct("<~@15 A B@35 C B@7 D B@11 C B@7 D ~@8 B@14 E ~>".pickRestart({
  A: "~@6 x!2", B: "x!4", C: "x ~@5 x!2", D: "x ~ x ~ x ~ x!2", E: "x",
})).gain(0.66)

// drums · snare
const snare = s("sd").struct(`<
  A@15 B C@7 D ~@18 E F C@7 G C@6 H D C@2 I F C@7 G C@6 H D ~@8 C@6 I F C@4 J K ~@2
>`.pickRestart({
  A: "~ x ~ x", B: "x!10 ~ x!5", C: "~@4 x ~@2 x ~ x ~ x!2 ~ x ~", D: "x!16", E: "~@8 x!8", F: "x!10 ~ x ~ x!2 ~",
  G: "~@12 x ~ x!2", H: "~@4 x ~@2 x ~ x ~ x!2 ~ x!2", I: "~@4 x ~@2 x!9", J: "~@4 x ~@2 x ~ x ~ x!4 ~",
  K: "x!5 ~ x!10",
})).gain(0.26)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@16 A@7 ~@21 A@7 ~ A@6 B ~ A@2 ~@2 A@7 ~ A@6 B ~@9 A@6 ~@2 A@5 ~@3>".pickRestart({
  A: "~@10 x ~@4 x", B: "~@5 x ~@2",
})).gain(0.13)

// drums · clap
const clap = s("cp").struct("<A@24 ~@20 A@7 ~ A@11 ~ A@7 ~ A@23 ~ A@6 ~@2>".pickRestart({
  A: "~ x ~ x",
})).gain(0.52)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<[x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!12 [~@15 x] ~ [~@9 x ~@6] ~@89>").gain(0.2)

// drums · open hat
const open_hat = s("oh").struct("<~@12 A@2 B ~@21 C@7 ~@9 C@7 ~ C@3 ~@29 C@3 ~@9>".pickRestart({
  A: "~ x ~@3 x ~@2", B: "~ x ~@6", C: "~ x ~ x ~ x ~ x",
})).gain(0.26)

// drums · crash
const crash = s("cr").struct("<A ~@7 A ~@3 A ~ B C A ~@7 D@20 A ~@7 D@12 A ~@7 A ~@6 C D@16 A ~@5 A ~>".pickRestart({
  A: "x", B: "x!2", C: "~ x!3", D: "x!4",
})).gain(0.2)

// drums · tambourine
const tambourine = s("tb").struct("<~@16 A@8 ~@20 A@7 B ~@12 A@7 B A@8 ~@16 A@6 B ~>".pickRestart({
  A: "x!8", B: "x",
})).gain(0.33)

// drums · congas
const congas = s("conga:18").struct("<~@24 [~@5 x ~@7 x ~@2]!20 ~@8 [~@5 x ~@7 x ~@2]!12 ~@24 [~@5 x ~@7 x ~@2]!8 ~@8>")
  .gain(0.84)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  ~@24
  [x ~@3 x ~@3 x ~@2 x!2 ~ x ~]!20
  ~@8
  [x ~@3 x ~@3 x ~@2 x!2 ~ x ~]!8
  [x ~ x ~ x ~@2 x!2 ~ x!3 ~ x ~]!4
  ~@24
  [x ~ x ~ x ~@2 x!2 ~ x!3 ~ x ~]!8
  ~@8
>`).gain(0.84)

// drums · congas · soft notes
const congas_soft = s("conga:33").struct(`<
  ~@24
  [~@2 x ~@4 x ~ x!2 ~@4 x]!20
  ~@8
  [~@2 x ~@4 x ~ x!2 ~@4 x]!8
  [~@9 x ~@5 x]!4
  ~@24
  [~@9 x ~@5 x]!8
  ~@8
>`).gain(0.42)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@28 [x!16]!16 ~@8 [x!16]!12 ~@24 [x!16]!8 ~@8>").gain(0.67)

stack(
  bass, piano, string_ensemble_2, clavinet, clavinet_soft, electric_guitar_muted, electric_guitar_muted_2, epiano2,
  string_ensemble_1, tenor_sax, orchestra_hit, kick, snare, snare_soft, clap, hihat, hihat_soft, open_hat, crash,
  tambourine, congas, congas_2, congas_soft, cabasa
)

More by Caught in the Act