Strudelify

Somebody's Crying

Chris Isaak

KeyF majorTempo115 bpm
0:00/0:00
// Somebody's Crying — Chris Isaak
// 115 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 76 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(115/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 · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  A B C B A B A B ~@3 D@2 E F G ~ H I J@2 ~@2 G ~@8 A B A G ~@8 A B A G ~@7 G ~@8 A B A G ~@8
>`.pickRestart({
  A: "~ [a3,a4] [f4,f5] [c3,c4] ~ [a3,a4] [d4,d5] [a2,a3], f3 d3, f4 ~ d4 ~", // A F C A D A
  B: "~ [f3,f4] [bb3,bb4] ~@2 [a3,a4] [f4,f5] [c4,c5], bb2@3 [f2,f3]@5, bb3 ~@3", // F Bb A F C F
  C: "~ [a3,a4] [f4,f5] [c3,c4] ~ [a3,a4] [d4,d5] [a2,a3], [f2,f3] d3, f4 ~ d4 ~", D: "[~@5 c3!2 a3@2 ~@7]/2",
  E: "~@5 a4 g4 f4, ~@10 g4 ~@5", F: "c4 ~@3", G: "~ [f3,f4] [bb3,bb4] [f2,f3]@5, bb2@3 ~@5, bb3 ~@3",
  H: "~@10 f4 ~ g4@2 f4@2, ~@11 a4@2 ~@3", I: "c4@5 ~@11", J: "[~@10 c3 ~ c3@2 a3@5 ~@13]/2",
})).s("gm_acoustic_guitar_steel").gain(0.2)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@3 A B C D E D E D E D E D E D E D E D E D E F@8 D E D E F@8 D E D E D E D E D E D E F@8 D E D E F@7 G
>`.pickRestart({
  A: "~@10 bb1 ~ bb1@2 a1@2, ~@11 c2@2 ~@3", B: "f1@3 c2 d2@3 a1", C: "bb1@6 f1@9 ~", D: "f1@3 c2 d2@4",
  E: "bb1@3 f1@5", F: "f1@2 f1 a1 bb1@2 bb1 c2", G: "bb1@2 ~ a1 ~@2 g1 ~@2 f1@7",
})).s("gm_electric_bass_finger").gain(0.6)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel_2 = note(`<
  ~@4 A B A B A B A B A B A B A B A B A B A B C@8 D B A B C@8 D B A B A B A B A B A B C@8 D B A B E@8
>`.pickRestart({
  A: "[c4,f4,a4]@4 [c4,f4,a4]@2 ~@2 [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~", B: "[c4,f4,bb4]@3 ~ [c4,f4,bb4]@2 [c4,f4,a4]@7 ~@3",
  C: "[~ [g3,g4] [f3,f4] [c3,c4]@2 [e3,e4] [f3,f4] [c3,c4]@2 [g3,g4] [f3,f4] [c3,c4]@2 [e3,e4] [f3,f4] [c3,c4]@2 [g3,g4] [f3,f4] [c3,c4]@2 [e3,e4] [f3,f4] [c3,c4]@2 [g3,g4] [f3,f4] [c3,c4]@2 [e3,e4] [f3,f4] [c3,c4]@2 [g3,g4] [f3,f4] [c3,c4]@2 [e3,e4] [f3,f4] [c3,c4]@2 [g3,g4] [f3,f4] [c3,c4]@2 [e3,e4] [f3,f4] [c3,c4]@2 [g3,g4] [f3,f4] [c3,c4]@2 [e3,e4] [f3,f4] [c3,c4]@2 [g3,g4] [f3,f4] [c3,c4]@2 [e3,e4] [f3,f4] [c3,c4]]/8", // G F C E F C G F …
  D: "[f4,a4]@4 [c4,f4,a4]@2 ~@2 [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~, c4 ~@7", // F Dm
  E: "[~@2 [g3,g4]@2 [f3,f4]@2 [c3,c4]@4 [e3,e4]@2 [f3,f4]@2 [c3,c4]@4 [g3,g4]@2 [f3,f4]@2 [c3,c4]@4 [e3,e4]@2 [f3,f4]@2 [c3,c4]@4 [g3,g4]@2 [f3,f4]@2 [c3,c4]@4 [e3,e4]@2 [f3,f4]@2 [c3,c4]@4 [g3,g4]@2 [f3,f4]@2 [c3,c4]@4 [e3,e4]@2 [f3,f4]@2 [c3,c4]@4 [g3,g4]@2 [f3,f4]@2 [c3,c4]@4 [e3,e4]@2 [f3,f4]@2 [c3,c4]@4 [g3,g4]@2 [f3,f4]@2 [c3,c4]@4 [e3,e4]@2 [f3,f4]@2 [c3,c4]@4 [g3,g4]@2 [f3,f4]@2 [c3,c4]@4 [e3,e4]@2 [f3,f4]@2 ~@2 bb3@2 ~ a3 ~@2 g3 ~@2 f3@7, ~@55 [c3,c4]@2 ~@7]/8", // G F C E F C G F …
})).s("gm_acoustic_guitar_steel").gain(0.22)

// other · celesta
const celesta = note("<~@36 A B A B A B A B ~@12 A B A B A B A B ~@4 A B A B A B A C>".pickRestart({
  A: "a5@3 bb5@5", B: "a5@3 bb5@2 c6@2 bb5", C: "bb4@2 ~ a4 ~@2 g4 ~@2 f4@7, a5@7 ~@9",
})).s("gm_celesta").gain(0.51)

// drums · kick
const kick = s("bd").struct(`<
  ~@3 A B C B C B C B C B C B C B C B C B C B D E@7 F B C B C E@7 F B C B@3 C B C B C B C E@11 G E@7 H
>`.pickRestart({
  A: "~@5 x ~@2", B: "x ~@2 x!2 ~@3", C: "x!2", D: "x ~@6 x", E: "x ~ x ~ x!4", F: "x ~ x ~ x ~@2 x", G: "x!4",
  H: "x ~@2 x ~@2 x ~@2 x ~@6",
})).gain(0.46)

// drums · rim
const rim = s("rim").struct("<~@3 [~@3 x] ~@72>").gain(0.46)

// drums · snare
const snare = s("sd").struct("<~@3 A B@19 C D@7 E B@3 F D@7 E B@11 G D@11 H D@6 I J>".pickRestart({
  A: "~@11 x!2 ~ x ~", B: "~ x ~ x", C: "~@4 x ~@6 x!2 ~@3", D: "x!4", E: "x ~@3 x ~@3 x!2 ~@6",
  F: "~@4 x ~@3 x!5 ~ x ~", G: "~@4 x ~@3 x!7 ~", H: "x ~@3 x ~@3 x!7 ~", I: "x ~@3 x ~@3 x ~@2 x!2 ~ x ~",
  J: "x ~@2 x ~@2 x ~@2 x ~@6",
})).gain(0.46)

// drums · low tom
const low_tom = s("lt").struct("<~@23 [~@4 x ~@2 x] ~@7 [~@5 x!2 ~] ~@11 [~@5 x!2 ~] ~@32>").gain(0.46)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@3 A B@20 C@7 D B@4 C@7 D B@12 C@19 E>".pickRestart({
  A: "~@10 x!3 ~@3", B: "x!8", C: "x!4", D: "x!3 ~", E: "x ~@2 x ~@2 x ~@2 x ~@6",
})).gain(0.46)

// drums · open hat
const open_hat = s("oh").struct("<~@24 A@7 B ~@4 A@7 B ~@12 A@19 C>".pickRestart({
  A: "x!4", B: "x!3 ~", C: "x ~@2 x ~@2 x ~@2 x ~@6",
})).gain(0.46)

// drums · crash
const crash = s("cr").struct("<~@24 A ~@3 A ~@2 B ~@8 A ~@2 B ~@12 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3>".pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.46)

stack(
  acoustic_guitar_steel, bass, acoustic_guitar_steel_2, celesta, kick, rim, snare, low_tom, pedal_hat, open_hat, crash
)

More by Chris Isaak