Strudelify

Sometimes When We Touch

Anita Meyer

KeyB♭ majorTempo112 bpm
0:00/0:00
// Sometimes When We Touch — Anita Meyer
// 112 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 103 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
const bass = note(`<
  ~ 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.5)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@3 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_synth_strings_1").gain(0.38).pan(0.3)

// chords · synth strings 1 · soft notes
const synth_strings_1_soft = note(`<
  ~ 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_synth_strings_1").gain(0.19).pan(0.3)

// other · tuba
const tuba = note(`<
  ~@16 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_tuba").gain(0.64).pan(0.7)

// other · tuba
const tuba_2 = note(`<
  ~@16 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_tuba").gain(0.51).pan(0.9)

// other · piano
const piano = note(`<
  ~ A B C D@2 E F G H F I J K H L M N O P Q R H S T U V W X Y Z AA AB AC V W AD AE T AF AG AH F G H F I J K H L M N O P
  Q R H S T U V W X Y Z AA AB AC V W AD AE AI AJ AK AL AM AN AO AP AQ AR AS T U V W X Y Z AA AB AC V W AD AE AT AU AV@2
  ~
>`.pickRestart({
  A: "[bb3,d4]@8 [bb3,eb4]@4 [d4,f4]@3 ~, bb2@15 ~", B: "f4@2 eb4@2 d4@2 ~@2 d4@7 ~, ab2@15 ~, bb3 ~@15",
  C: "c4@8 d4@3 ~ eb4@3 ~, g2",
  D: "[eb4@2 d4@2 c4@2 ~@2 c4@4 bb3@2 ~@14 d4 ~ f4@2, gb2@7 bb4@5 f3@3 ~, ~@8 bb2@7 ~, ~@13 bb3@2 ~]/2",
  E: "[bb3,d4]@4 bb3@2 c4@2 d4@2 bb3@2 [d4,f4]@3 ~, bb2@9 ~@7", F: "d3 bb2 d3 bb3 d4 bb3 f3 d3",
  G: "eb3 bb2 eb3 g3 bb3 g3 eb3 bb2", H: "f3 c3 f3 a3 c4 a3 f3 c3", I: "f3 d3 f3 a3 d4 a3 f3 d3",
  J: "g3 d3 g3 bb3 d4 bb3 g3 d3", K: "e3 c3 e3 g3 c4 g3 e3 c3", L: "eb3 c3 eb3 g3 bb3 g3 eb3 c3",
  M: "f3 c3 eb3 f3 a3 f3 eb3 c3", N: "bb2 d3 f3 bb3 f3 c3 f3 a3", O: "g3 d3 g3 bb3!2 f3 d3 f3",
  P: "eb3 g3 eb3 g3 d4 bb3 g3 eb3", Q: "bb3 d3 f3 bb3 d4 bb3 f3 d3", R: "c3 eb3 g3 bb3!2 f3 d3 f3",
  S: "[f3,a3] [f3,c4] [g3,bb3,eb4] [a3,c4,f4], c3 ~ a3 ~@5", T: "bb3 f3 bb3 d4 f4 d4 bb3 f3",
  U: "eb4 g3 bb3 eb4 g4 eb4 bb3 g3", V: "f3 a3 c4 f3 f4 c4 a3 f3", W: "d4 f3 a3 d4 f4 d4 a3 f3",
  X: "g3 bb3 d4 bb3 g4 d4 bb3 g3", Y: "c4 g3 c4 e4 g4 e4 c4 g3", Z: "f4 a3 c4 f4 eb4 g3 bb3 eb4",
  AA: "d4 f3 a3 d4 c4 eb3 g3 c4", AB: "bb3 d3 f3 bb3 d4 bb3 f3 bb3", AC: "eb3 g3 eb3 bb3 eb4 bb3 g3 bb3",
  AD: "bb3 g3 bb3 c4 eb4 c4 bb3 g3", AE: "bb3 g3 bb3 eb4 g4 eb4 bb3 g3", AF: "bb3 f3 ab3 bb3 d4 bb3 ab3 f3",
  AG: "g3 eb3 g3 bb3 eb4 bb3 g3 eb3", AH: "eb5 d5 bb4 gb4 eb4 d4 bb3 gb3",
  AI: "bb4@2 f4@2 bb4@2 d5@2 f5@2 d5@2 bb4 ~ [f3,f4,a4,c5]@2, [f3,bb3]@13 ~@3", // F Bb5
  AJ: "~ [eb3,g4,bb4]@2 [bb3,f4,bb4]@2 [bb3,f4,bb4]@2 ~", AK: "bb4 ~ eb4@2 g4@2 bb4@2 eb5@2 bb4@2 g4 ~ eb4@2, f3@15 ~",
  AL: "g4 eb4 g4 bb4 eb5 bb4 g4 eb4, f3@15 ~", AM: "g4@2 eb4@2 g4@2 bb4@2 [eb4,eb5]@2 bb4@2 g4@2 eb4 ~, f3",
  AN: "[bb3,f4,ab4,bb4] ~ [bb3,f4,ab4,bb4] ~ [bb3,f4,ab4,bb4] ~ [bb3,f4,ab4,bb4] ~ [bb3,f4,ab4,bb4] ~ [bb3,f4,ab4,bb4] ~ [bb3,f4,ab4,bb4] ~ [bb3,f4,ab4,bb4] ~", // Bb7
  AO: "g4@2 d4@2 g4@2 bb4@2 d5@2 bb4 ~ g4@2 d4@2, g3@7 ~, bb4 ~ d3@13 ~",
  AP: "f4@2 d4@2 f4@2 a4@2 d5@2 a4@2 f4@2 d4 ~, [d3,f3,a3]@7 ~", // Dm
  AQ: "[bb4,eb5]@2 g4@2 bb4@2 eb5@2 g5 ~ eb5@2 bb4@2 g4 ~, [eb3,bb3]@15 ~", // Eb5
  AR: "bb3@2 c4@2 eb4@2 g4@2 bb4 ~ c5@2 eb5@2 g5@2, f3 ~@15",
  AS: "[c3,g4] ~ [d3,a4,d5]@3 ~ [eb3,bb4,eb5]@3 ~ [f3,c5,f5]@3 ~@3, c5 ~@7", // C5 D5 Eb5 F5
  AT: "d5 bb4 f4 d4 f4 bb4 d5 bb4, [bb2,bb3]@13 ~@3", AU: "c5 a4 f4 c4 f4 a4 c5 a4, [bb2,bb3]@7 ~",
  AV: "[bb4@2 g4@2 eb4@2 ~@2 eb4@2 g4@2 bb4@2 ~@3 d5@15, bb2@12 ~@3 d4@13 ~@4, bb3@3 bb3@3 ~ c5 bb2@8, ~@16 f4@13 ~@3, ~@17 bb4@12 ~@3]/2",
})).s("gm_piano").gain(0.45).pan(0.2)

// drums · kick
const kick = s("bd").struct("<~@7 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("<~@7 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("<~@78 [x!8] ~@11 [x!8]!2 ~@11>").gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<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("<~@23 [~@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("<~@23 [~@4 x!5 ~@7] ~@79>").gain(0.2)

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

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

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

stack(
  bass, synth_strings_1, synth_strings_1_soft, tuba, tuba_2, piano, kick, snare, low_tom, hihat, mid_tom, mid_tom_soft,
  high_tom, ride, crash
)