Strudelify

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: edit a riff to change every repeat.

// bass · electric bass finger · "bass"
const bass = note(`<
  ~@3 A B C D E F G H E G I J K L K L M N H G O P Q R S T U V W X Y R Z T U AA AB A G@4 H E G I J K L K L M N H G O P Q
  R S T U V W X Y R Z T U AA AB AC@2 AD AE@2 AF AG AH H L AI R S T U V W X Y R Z T U AA AB E@2 AJ AK ~
>`.pickRestart({
  A: "bb2@15 ~", B: "ab2@15 ~", C: "g2", D: "gb2", E: "bb1@7 ~", F: "bb1@13 ~@3", G: "bb1@15 ~", H: "eb2@15 ~",
  I: "d2@15 ~", J: "g2@15 ~", K: "c2@15 ~", L: "f2@15 ~", M: "bb2@8 a2@7 ~", N: "g2 f2", O: "c2@8 d2@7 ~", P: "f2@7 ~",
  Q: "f2@2 c3 f2", R: "bb2@5 ~ bb2@2 bb2@7 ~", S: "eb2@4 ~@2 eb2@2 eb2@3 ~ bb1@4", T: "f2@4 ~@2 f2@2 f2@7 ~",
  U: "d2@5 ~ d2 ~ d2@3 ~ d2@3 ~", V: "g2@5 ~ g2@2 g2@7 ~", W: "c2@3 d2@3 e2@2", X: "f2@7 ~ eb2@7 ~", Y: "d2@7 ~ c2@7 ~",
  Z: "eb2@5 ~ bb1@2 eb2@3 ~ eb2@3 ~", AA: "c2@4 ~@2 c2@2 c2@7 ~", AB: "eb2@5 ~ bb1@2 eb2@7 ~",
  AC: "[bb1@7 ~ bb1@4 ~@2 f2@4 eb2@4 bb1@3 ~ bb1@4 ~@2]/2", AD: "f2@7 ~ f2@6 ~@2", AE: "f2@7 ~ f2@7 ~",
  AF: "bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~", AG: "g2@7 ~ g2@7 ~", AH: "d2@7 ~ d2@7 ~",
  AI: "c2@2 d2@2 ~@2 eb2@3 ~ f2@4 ~@2", AJ: "bb1@3 f1", AK: "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
  AC AD AE 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: "bb5@7 ~", AD: "~@14 bb5 ~", AE: "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 K A L@2 M N O@2 P Q R ~ S T U V ~@9 A B C D E F G H I J K A L@2 M N O@2 P Q R ~ W X Y@4 Z AA
  AB AC AD E J K A L@2 M N O@2 P Q R ~@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: "f3@7 ~", L: "[g3@7 ~]/2", M: "a3 g3", N: "f3@8 eb3@7 ~",
  O: "[bb3@31 ~]/2", P: "a3@11 ~ f3@3 ~", Q: "bb3 a3 f3 d3", R: "eb3", S: "d4@6 eb4@6 f4@3 ~",
  T: "f4@2 eb4@2 d4 ~ d4@8 ~@2", U: "c4@6 d4@6 eb4@3 ~", V: "eb4@7 ~", W: "d4@4 f4@3 a4", X: "~ g4 ~ f4 ~ d4@3",
  Y: "[eb4@49 ~@15]/4", Z: "bb3", AA: "c4", AB: "eb4@15 ~", AC: "~@14 d4 ~", AD: "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
)