Strudelify

Touch by Touch

Ross

KeyF majorTempo133 bpm
0:00/0:00
// Touch by Touch — Ross
// 133 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 113 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(133/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 · "FINGERDBAS"
const bass = note(`<
  ~ A B C D E F G H I J K L M N O H P Q B R S N T U V W O X Y Z AA AB AC AD AE AB AC Z AF AG U AH AI AJ M H AK H I J K L
  M N O H P Q B R S N T U V W O X Y Z AA AB AC AD AE AB AC Z AF U V W O X Y Z AA AB AC AD AE AB AC Z AF AG U AH AI AJ M
  H AK AG U AH AI AJ M H AL ~
>`.pickRestart({
  A: "~@5 c2 d2 e2", B: "f2@5 ~@3 c2@5 ~@3 f2@6 ~@2 c2@4 d2@4", C: "f2@3 ~ c2@3 ~ f2@3 ~ c2@2 d2@2",
  D: "c2@5 ~@3 g1@5 ~@3 c2@6 ~@2 g1@5 ~@3", E: "c2@5 ~@3 g1@6 ~@2 c2@5 ~@3 g1@4 c2@4",
  F: "d2@6 ~@2 a1@6 ~@2 d2@5 ~@3 a1@5 ~@3", G: "d2@5 ~@3 a1@6 ~@2 d2@4 f2@4 e2@4 c2@4",
  H: "d2@5 ~@3 a1@5 ~@3 d2@5 ~@3 a1@5 ~@3", I: "d2@5 ~@3 a1@6 ~@2 d2@6 ~@2 d2@4 e2@4",
  J: "f2@5 ~@3 c2@5 ~@3 f2@6 ~@2 c2@5 ~@3", K: "f2@5 ~@3 c2@5 ~@3 f2@6 ~@2 e2@4 d2@4",
  L: "c2@5 ~@3 g1@5 ~@3 c2@5 ~@3 g1@6 ~@2", M: "c2@5 ~@3 g1@6 ~@2 c2@6 ~@2 g1@4 c2@4",
  N: "f2@5 ~@3 c2@5 ~@3 f2@5 ~@3 c2@5 ~@3", O: "f2@5 ~@3 c2@5 ~@3 f2@6 ~@2 c2@4 db2@3 ~",
  P: "d2@5 ~@3 a1@5 ~@3 d2@5 ~@3 a1@4 d2@4", Q: "f2@6 ~@2 c2@5 ~@3 f2@5 ~@3 c2@5 ~@3",
  R: "c2@5 ~@3 g1@5 ~@3 c2@5 ~@3 g1@5 ~@3", S: "c2@5 ~@3 g1@5 ~@3 c2@5 ~@3 g1@4 c2@4",
  T: "f2@5 ~@3 c2@5 ~@3 f2@5 ~@3 c2@4 db2@3 ~", U: "d2@5 ~@3 a1@5 ~@3 d2@6 ~@2 a1@4 d2@3 ~",
  V: "g2@5 ~@3 d2@5 ~@3 g2@4 f2@4 e2@4 d2@4", W: "c2@5 ~@3 g1@5 ~@3 c2@5 ~@3 g1@3 ~ c2@3 ~",
  X: "d2@5 ~@3 a1@5 ~@3 d2@5 ~@3 a1@4 d2@3 ~", Y: "g2@5 ~@3 d2@6 ~@2 g2@4 f2@4 e2@4 d2@4",
  Z: "c2@5 ~@3 g1@5 ~@3 c2@6 ~@2 g1@4 c2@3 ~", AA: "f2@5 ~@3 c2@6 ~@2 f2@3 ~ c2@4 d2@4 e2@3 ~",
  AB: "f2@5 ~@3 c2@5 ~@3 f2@5 ~@3 c2@4 f2@4", AC: "g2@5 ~@3 d2@5 ~@3 g2@5 ~@3 d2@4 g2@4",
  AD: "c2@3 ~ g1@3 ~ c2@3 ~ g1@2 c2@2", AE: "f2@5 ~@3 c2@6 ~@2 f2@4 c2@4 d2@4 e2@4",
  AF: "f2@5 ~@3 c2@6 ~@2 f2@6 ~@2 c2@4 db2@4", AG: "d2@6 ~@2 a1@5 ~@3 d2@5 ~@3 a1@4 c2@3 ~",
  AH: "f2@6 ~@2 c2@5 ~@3 f2@6 ~@2 c2@4 d2@4", AI: "f2@6 ~@2 c2@5 ~@3 f2@5 ~@3 c2@4 d2@4",
  AJ: "c2@6 ~@2 g1@5 ~@3 c2@5 ~@3 g1@4 a1@4", AK: "d2@5 ~@3 a1@6 ~@2 d2@6 ~@2 a1@4 db2@3 ~", AL: "d2",
})).s("gm_electric_bass_finger").gain(0.35)

// chords · synth strings 1 · "SYN STRING"
const synth_strings_1 = note(`<
  ~@2 A@4 B@4 C@4 D@8 E@6 F@6 G H@2 I@2 J@7 B@4 C@4 D@8 E@6 F@6 G H@2 I@2 K@5 L@6 G H@2 I@2 J@7 M@4 N@4 O@3
>`.pickRestart({
  A: "[[f4,a4] [e4,g4], c4@127 ~]/4", B: "[d4,f4,a4]/2", C: "[~ [e4,g4], c4]/4",
  D: "[~@32 d4@31 ~@33 [e4,g4]@32, [f4,a4]@193 ~@63, ~ c4]/8", // Em F
  E: "[~@96 bb4@32 e4@29 ~@3 [f4,a4]@32, a4@97 ~@31 c5@64, f4@93 ~@3 g4@64 ~@32, ~@32 d4@31 ~@33]/6", // F
  F: "[a4@32 bb4@32 e4@28 ~@4 [f4,a4]@64 [d4,g4,bb4]@31 ~, d4@61 ~@131, f4@27 ~@5 g4@64 ~@96, b4 ~@63 c5@99 ~@29]/6", // F Gm
  G: "[c4,e4,g4]", H: "[a4, f4@61 ~@3, c4 ~]/2", I: "[[d4,bb4] c5, g4@31 ~, ~@32 e4@29 ~@3]/2",
  J: "[c4@15 ~ d4@31 ~@33 [e4,g4]@32, [f4,a4]@5 ~@2, ~@96 c4@127 ~]/7", // Em F
  K: "[c4@30 ~@34 bb4@32 e4@29 ~@3 [f4,a4]@32, [f4,a4]@4 ~, ~@16 d4@31 ~ c5@32, ~@2 g4@2 ~]/5", // F
  L: "[b4 ~@31 bb4@32 e4@28 ~@4 [f4,a4]@64 [d4,g4,bb4]@31 ~, [f4,a4] ~, d4@61 ~@3 c5@99 ~@29, ~ g4@2 ~@3]/6", // F Gm F
  M: "[d4 d4, [f4,a4]@17 ~@15]/4", N: "[~ [e4,g4], c4@127 ~]/4", O: "[[d4,f4,a4]@17 ~@7]/3",
})).s("gm_synth_strings_1").gain(0.2)

// chords · ocarina
const ocarina = note("<A B C D E@2 F G ~@32 A B C D E@2 F G ~@48 A B C D E@2 F G A B C D E@2 F G ~>".pickRestart({
  A: "[d5,f5]@10 ~@2 [d5,f5]@4 [e5,g5]@7 ~ [f5,a5]@7 ~", B: "[d5,f5] ~@11 f5@4 [e5,g5]@8 [f5,a5]@7 ~, ~@6 d5 ~@9",
  C: "[f5,a5]@10 ~@2 [f5,a5]@4 [g5,bb5]@7 ~ [a5,c6]@8", D: "[f5,a5]@10 ~@2 a5@4 [g5,bb5]@7 ~ [a5,c6]@6 ~@2, ~@6 f5 ~@9",
  E: "[[g5,bb5]@4 [g5,bb5]@6 ~@2 [f5,a5]@4 [e5,g5]@7 ~ [d5,f5]@4 [c5,e5]@13 ~@3 e5@2 g5@2 f5@4 e5@4 d5@4 c5@4]/2", // Gm F Em Dm C
  F: "d5@5 ~ d5 f5 e5@2 d5@2 c5@2 e5@2", G: "d5@31 ~",
})).s("gm_ocarina").gain(0.35)

// other · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@24 A B C D A B C D@2 E C D A E C D ~@24 A B C D A B C D@2 E C D A E C D A B C D A B C D@2 E C D A E C D ~@17
>`.pickRestart({
  A: "a5 f5 a5 f5 a5 f5 a5 f5 a5 f5 a5 f5 a5 f5 a5 f5 a5 f5 a5 f5 a5 f5 a5 f5 a5 f5 a5 f5 a5 f5 a5 f5",
  B: "bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 a5 f5 a5 f5 g5 e5 g5 e5 f5 d5 f5 d5",
  C: "e5 c5 e5 c5 e5 c5 e5 c5 e5 c5 e5 c5 e5 c5 e5 c5 e5 c5 e5 c5 e5 c5 e5 c5 e5 c5 e5 c5 e5 c5 e5 c5",
  D: "f5 c5 f5 c5 f5 c5 f5 c5 f5 c5 f5 c5 f5 c5 f5 c5 f5 c5 f5 c5 f5 c5 f5 c5 f5 c5 f5 c5 f5 c5 f5 c5",
  E: "bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5 bb5 g5",
})).s("gm_acoustic_guitar_steel").gain(0.3)

// other · piano · "A.PIANO"
const piano = note(`<
  ~@2 A@2 B@2 C@2 D@2 A@2 B@2 A@2 D@2 A@2 B@2 A@2 D E B A D F B A@2 F B A G F B A D@2 A@2 B@2 D@4 A@2 B@2 A@2 D@2 A@2
  B@2 A@2 D E B A D F B A@2 F B A G F B A D E B A D F B A@2 F B A G F B A ~@17
>`.pickRestart({
  A: "a4 ~ a4 ~ a4 ~ a4 ~ c5 ~ c5 ~ c5 ~ c5 ~ f5 ~ f5 ~ f5 ~ f5 ~ c5 ~ c5 ~ c5 ~ c5 ~",
  B: "g4 ~ g4 ~ g4 ~ g4 ~ c5 ~ c5 ~ c5 ~ c5 ~ e5 ~ e5 ~ e5 ~ e5 ~ c5 ~ c5 ~ c5 ~ c5 ~",
  C: "a4 ~ a4 ~ a4 ~ a4 ~ d5 ~ d5 ~ d5 ~ d5 ~ f5 ~ f5 ~ f5 ~ f5 ~ a5 ~ a5 ~ a5 ~ a5 ~",
  D: "a4 ~ a4 ~ a4 ~ a4 ~ d5 ~ d5 ~ d5 ~ d5 ~ f5 ~ f5 ~ f5 ~ f5 ~ d5 ~ d5 ~ d5 ~ d5 ~",
  E: "g4 ~ g4 ~ g4 ~ g4 ~ bb4 ~ bb4 ~ bb4 ~ bb4 ~ d5 ~ d5 ~ d5 ~ d5 ~ bb4 ~ bb4 ~ bb4 ~ bb4 ~",
  F: "bb4 ~ bb4 ~ bb4 ~ bb4 ~ d5 ~ d5 ~ d5 ~ d5 ~ g5 ~ g5 ~ g5 ~ g5 ~ d5 ~ d5 ~ d5 ~ d5 ~",
  G: "a4 ~ a4 ~ a4 ~ a4 ~ c5 ~ c5 ~ c5 ~ c5 ~ f5 ~ f5 ~ f5 ~ f5 ~ c5 ~ c5 ~ c5 ~ c5@2",
})).s("gm_piano").gain(0.3)

// drums · kick
const kick = s("bd").struct("<~@2 [x!2]!109 x ~>").gain(0.36)

// drums · snare
const snare = s("sd").struct("<~@2 [~ x ~ x]!109 x ~>").gain(0.46)

// drums · hihat
const hihat = s("hh").struct("<~@2 [x!16]!109 x ~>").gain(0.36)

stack(bass, synth_strings_1, ocarina, acoustic_guitar_steel, piano, kick, snare, hihat)

More by Ross