Strudelify
Somethime When We Touch cover art

1977 · Longer Fuse

Somethime When We Touch

Dan Hill

KeyB♭ majorTempo112 bpm
0:00/0:00
// Somethime When We Touch — Dan Hill
// 112 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 2 "bass" named as a bass, played on electric bass finger (its piano patch is not one); ch 3 "strings" named as a string part, played on string ensemble 1 (its piano patch is not one); ch 5 "trombone" named as a brass, played on trombone (its piano patch is not one); ch 4 "trumpet" named as a brass, played on trumpet (its piano patch is not one)
// note: Full arrangement: all 105 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(112/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, A@4 for four bars: edit a riff to change every repeat.

// bass · electric bass finger · "bass"
const bass = note(`<
  ~@3 A B C D E F E G E@2 H C I J I J K L G E M J N O P Q R S T U V O W Q R X Y A E@4 G E@2 H C I J I J K L G E M J N O
  P Q R S T U V O W Q R X Y Z@2 AA@3 AB AC AD G J AE O P Q R S T U V O W Q R X Y E@2 AF AG ~
>`.pickRestart({
  A: "bb2@15 ~", B: "ab2@15 ~", C: "g2@15 ~", D: "gb2", E: "bb1@15 ~", F: "bb1@7 ~", G: "eb2@15 ~", H: "d2@15 ~",
  I: "c2@15 ~", J: "f2@15 ~", K: "bb2@8 a2@7 ~", L: "g2 f2", M: "c2@8 d2@7 ~", N: "f2@2 c3 f2",
  O: "bb2@5 ~ bb2@2 bb2@7 ~", P: "eb2@4 ~@2 eb2@2 eb2@3 ~ bb1@4", Q: "f2@4 ~@2 f2@2 f2@7 ~",
  R: "d2@5 ~ d2 ~ d2@3 ~ d2@3 ~", S: "g2@5 ~ g2@2 g2@7 ~", T: "c2@3 d2@3 e2@2", U: "f2@7 ~ eb2@7 ~", V: "d2@7 ~ c2@7 ~",
  W: "eb2@5 ~ bb1@2 eb2@3 ~ eb2@3 ~", X: "c2@4 ~@2 c2@2 c2@7 ~", Y: "eb2@5 ~ bb1@2 eb2@7 ~",
  Z: "[bb1@7 ~ bb1@4 ~@2 f2@4 eb2@4 bb1@3 ~ bb1@4 ~@2]/2", AA: "f2@7 ~ f2@7 ~",
  AB: "bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~", AC: "g2@7 ~ g2@7 ~", AD: "d2@7 ~ d2@7 ~",
  AE: "c2@2 d2@2 ~@2 eb2@3 ~ f2@4 ~@2", AF: "bb1@3 f1", AG: "bb1@11 ~@5",
})).s("gm_electric_bass_finger").gain(0.35)

// chords · string ensemble 1 · "strings"
const string_ensemble_1 = note(`<
  ~@5 A@2 ~@3 B C D@3 E F G H I J K L M N O P Q R@2 S T U V W Q X Y Z AA AB@3 AC ~ B C D@3 E F G H I J K L M N O P Q R@2
  S T U V W Q X Y Z AA ~@11 P Q R@2 S T U V W Q X Y Z AA AD AE AF AG ~
>`.pickRestart({
  A: "[eb4, g4 ~]/2", B: "g4@15 ~", C: "f4@15 ~, c5@13 ~@3", D: "[f4@15 ~ [d3,f4,a4]@16 [g3,g4]@16, d4@47 ~]/3",
  E: "c4@7 ~", F: "f3@7 ~", G: "[c3,bb4]", H: "[f3,f4,c5]", I: "[bb3,bb4,d5] [f3,f4,a4,c5]",
  J: "[g3,g4,bb4] [bb3,f4], d5@15 ~", K: "[eb3,g4,eb5]@15 ~", L: "d5@7 ~", M: "[c4,g4,c5]@8 [bb3,f4,bb4,d5]@7 ~",
  N: "[f3,f5]@15 ~", O: "[a4,c5,eb5]@2 [c3,g4,c5,eb5] [f3,a4,c5,f5], f3@3 ~@5", P: "[bb3,f4,bb4,d5]@15 ~",
  Q: "[eb3,g4,bb4,eb5]", R: "[[f3,c5,f5] [d3,d5], a4@31 ~]/2", S: "[g3,g4,bb4]", T: "[c4,g4,c5,e5]@15 ~",
  U: "[f3,a4,f5] [eb4,bb4,eb5]", V: "[d4,a4,d5] [c4,g4,c5]", W: "[bb3,f4,bb4]@15 ~", X: "[f3,a4,c5,f5]@15 ~",
  Y: "[d4,a4,d5,f5]@15 ~", Z: "[c4,c5,eb5,bb5]", AA: "[eb3,bb4,eb5,g5]@15 ~",
  AB: "[d5@3 eb5@2 ~@3 [ab3,ab4]@8 g3@8, [bb3,bb4]@8 d5@7 ~@9, ~@4 f5@7 ~@5]/3", AC: "eb3@15 ~", AD: "[d4,bb4]",
  AE: "[c4,f4]", AF: "[bb3,eb4]", AG: "bb2@7 ~",
})).s("gm_string_ensemble_1").gain(0.3)

// chords · string ensemble 1 · "strings" · soft notes
const string_ensemble_1_soft = note(`<
  ~@3 A@2 ~ B C@2 D@3 ~@3 E F G ~@2 H I J K L ~@17 M@2 D@3 ~@3 E F G ~@2 H I J K L ~@43 N ~
>`.pickRestart({
  A: "[bb4 ab4, d4, f4@7 ~]/2", B: "gb4", C: "[bb3@7 ~]/2", D: "[~ eb5 ~, f4@5 ~@11, ~@4 bb4@13 ~@7]/3",
  E: "[c3,e4]@7 ~", F: "[c4,f4]@7 ~", G: "g4@15 ~", H: "~@8 bb4@7 ~", I: "bb4@15 ~", J: "[bb3,f4,bb4]@15 ~", K: "eb5 ~",
  L: "[a4,c5]@7 ~", M: "[[g4,bb4]@15 ~ [gb4,bb4]@15 ~, eb5@31 ~]/2", N: "bb3@7 ~",
})).s("gm_string_ensemble_1").gain(0.15)

// other · trombone
const trombone = note(`<
  ~@18 A B C D E F G H I J K L M@2 N O P Q R S E ~ T U V W ~@9 A B C D E F G H I J K L M@2 N O P Q R S E ~ X Y Z@4 AA AB
  I AC AD I J K L M@2 N O P Q R S E ~@6
>`.pickRestart({
  A: "~ eb5", B: "d5 c5", C: "bb4!2", D: "g4@9 ~@7", E: "bb4", F: "bb4@11 ~@5", G: "~@6 c5 d5", H: "eb5@3 f5 g5@2 a5 ~",
  I: "bb5@15 ~", J: "~ g4", K: "a4@15 ~", L: "~ d5", M: "[bb4@7 ~]/2", N: "a4@8 g4@7 ~", O: "f4@8 eb4@7 ~", P: "d5",
  Q: "eb5", R: "c5@2 ~ c5", S: "g5 f5 d5 a4", T: "f5@6 g5@6 ab5@3 ~", U: "ab5@2 g5@2 f5 ~ f5@8 ~@2",
  V: "eb5@6 f5@6 g5@3 ~", W: "gb5@7 ~", X: "bb5@4 d6@3 f6", Y: "~@2 eb6@3 ~ d6@3 ~ bb5@6", Z: "[bb5@49 ~@15]/4",
  AA: "g5", AB: "a5", AC: "~@14 bb5 ~", AD: "c6 ~ d6 ~@3 eb6 ~@3 f6 ~@5",
})).s("gm_trombone").gain(0.45)

// other · trumpet
const trumpet = note(`<
  ~@18 A B C D E F G H I J E A K@2 L M N@2 O P Q ~ R S T U ~@9 A B C D E F G H I J E A K@2 L M N@2 O P Q ~ V W X@4 Y Z U
  AA AB E J E A K@2 L M N@2 O P Q ~@6
>`.pickRestart({
  A: "~ a3", B: "bb3 a3", C: "g3 f3", D: "eb3@11 ~@5", E: "f3@15 ~", F: "g3 ~", G: "~@6 a3 bb3",
  H: "c4@3 d4 eb4@2 f4 ~", I: "f4@15 ~", J: "~ eb3", K: "[g3@7 ~]/2", L: "a3 g3", M: "f3@8 eb3@7 ~", N: "[bb3@31 ~]/2",
  O: "a3@11 ~ f3@3 ~", P: "bb3 a3 f3 d3", Q: "eb3", R: "d4@6 eb4@6 f4@3 ~", S: "f4@2 eb4@2 d4 ~ d4@8 ~@2",
  T: "c4@6 d4@6 eb4@3 ~", U: "eb4@7 ~", V: "d4@4 f4@3 a4", W: "~ g4 ~ f4 ~ d4@3", X: "[eb4@49 ~@15]/4", Y: "bb3",
  Z: "c4", AA: "~@14 d4 ~", AB: "eb4 ~ f4 ~@3 g4 ~@3 a4 ~@5",
})).s("gm_trumpet").gain(0.35)

// drums · kick
const kick = s("bd").struct("<~@9 A@17 B@18 A@17 B@14 C D E@3 F E@3 ~ G B@5 H@3 B@6 A ~@4>".pickRestart({
  A: "x", B: "x ~@2 x!2 ~@3", C: "x ~@2 x!2 ~@2 x", D: "~ x ~ x ~ x ~@2", E: "x!2", F: "x!8", G: "x!2 ~ x ~ x ~@2",
  H: "x ~ x!3 ~ x ~",
})).gain(0.4)

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

// drums · low tom
const low_tom = s("lt").struct("<~@80 [x!8] ~@11 [x!8]!2 ~@11>").gain(0.45)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@25 [~@9 x!3 ~@4] ~@50 [~@12 x!4] ~@8 [~@12 x!4] ~@19>").gain(0.35)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@25 [~@4 x!5 ~@7] ~@79>").gain(0.2)

// drums · high tom
const high_tom = s("ht").struct("<~@25 [~@12 x!4] ~@50 [~@10 x!2 ~@4] ~@28>").gain(0.45)

// drums · ride
const ride = s("rd").struct("<~@81 [~ x]!3 ~@2 [~ x]!5 ~@3 [~ x]!6 ~@5>").gain(0.5)

// drums · crash
const crash = s("cr").struct("<~@77 [~ x]!3 ~@20 x ~@4>").gain(0.3)

stack(
  bass, string_ensemble_1, string_ensemble_1_soft, trombone, trumpet, kick, snare, low_tom, hihat, mid_tom,
  mid_tom_soft, high_tom, ride, crash
)