Strudelify

Wherever I Lay My Hat

Young Paul

KeyB♭ majorTempo90 bpm
0:00/0:00
// Wherever I Lay My Hat — Young Paul
// 90 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 109 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(90/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 · fretless bass
const bass = note(`<
  A B C D E F G H I J K J L J K J M N@2 O@2 P Q R K J L S T U V S T J W X Y Z AA P G J K AB V AC AD AE AF AG@2 AH AI AJ
  AK AL AM AN AO AL AM AP AQ AR AS P L AT AU AV AW AX AY AZ BA BB BC BD BE BF BG BH BI BJ BK BL BI BM BK BL BI BJ BK BH
  BN BO BP BQ BR BO BP BQ BR BO BS BQ BR BT@2
>`.pickRestart({
  A: "~@11 d3@3 f3@2", B: "[bb2,d3]@6 a2 bb2 a2@2 f2@2 d2@4", C: "f2@10 ~ d3@2 ~ f3@2",
  D: "[bb2,d3]@11 ~ c3@4, ~@12 bb2 ~@3", E: "f2@13 ~ f2 g2", F: "bb2@6 a2 bb2 a2@2 f2@2 d2@4", G: "f2@15 ~",
  H: "bb2@9 ~@3 [c3,db3] ~@3, ~@12 d3@3 ~", I: "c3@7 ~", J: "bb1", K: "g1", L: "f2", M: "f1@15 ~",
  N: "[eb2@23 bb2 f3@7 f2]/2", O: "[g2@22 ~ g2 f2@8]/2", P: "eb2", Q: "~ f3, f2", R: "bb1@15 f1",
  S: "~@7 c3 d3@4 c3@4, bb1", T: "d2@3 bb1 g1@2 f1@2", U: "bb1@11 c2 d2@4, ~@12 db2 ~@3", V: "f1",
  W: "c3@6 ~ bb3 a3 f3 c3 f2 f2@4", X: "eb2@11 g1 bb1@4", Y: "eb2@7 bb2 f3@7 ~", Z: "g2, f2 ~@15", AA: "g3@3 ~",
  AB: "bb1@15 g1", AC: "eb2 eb3 ~ eb2 ~ eb2 ~ eb2!2 ~@5 bb1 db2", AD: "eb2!2 f2 eb2 ~ eb2 ~ eb2 ~ eb2 db2 bb1 eb2@4",
  AE: "d2@3 c2 ~ a1 c2 a1 c2 d2@4 ~ a1@2", AF: "d2@3 c2 ~ a1 c2 a1 c2 d2@7",
  AG: "[g1@8 g2@2 a2 bb2 g2@11 c3 ~ c3 bb2@2 g2@4]/2", AH: "f2@15 e3", AI: "f3@10 c3 a2 f2@3 ~",
  AJ: "bb1 ~ bb1 ~@2 bb1 ~@2 bb1@8", AK: "g1 ~ g1 ~@2 g1 ~@2 g1@7 ~", AL: "bb1 ~ bb1 ~@2 bb1 ~@2 bb1@7 g1",
  AM: "f1 ~ f1 ~@2 f1 ~@2 f1@8", AN: "bb1 ~ bb1 ~@2 bb1 ~@2 bb1@7 ~", AO: "g1 ~ g1 ~@2 g1 ~@2 g1@8",
  AP: "eb2@11 bb2 f3@3 bb2", AQ: "eb2@3 f2", AR: "g2@15 g2", AS: "[f2,f3]", AT: "bb1@2 bb2!2 ~@4 bb1 ~@2 bb1 f1@3 gb1",
  AU: "g1@13 ~ g1 f1", AV: "eb2 ~ eb2 ~@2 eb2 ~@2 eb2 ~@2 eb3 ~ eb3 eb2 bb2",
  AW: "f2 ~ f2 ~@2 f2 ~@2 f2 ~@2 f2 ~ f2 g2 a2", AX: "bb1 ~ bb1 ~@2 bb1 ~@2 bb1 ~@2 bb1 ~ bb1 bb2 bb1",
  AY: "g1 ~ g1 ~@2 g1 ~@2 g1 ~@2 g1 ~ g1 bb2 g1", AZ: "bb1 ~ bb1 ~@2 bb1 ~@2 bb1 ~@2 bb1 ~ bb1 g1 bb1",
  BA: "f1 ~ f1 ~@2 f1 ~@2 f1 ~@2 f1 ~ f1 g1 f1", BB: "bb1!2 bb2!2 ~@3 bb1 ~ bb1 ~ bb1 d2 ~ bb1 d2",
  BC: "g1!2 g2!2 ~@3 g1 ~ g1 ~ g1 g2@2 d2@2", BD: "bb1!2 bb2!2 ~@3 bb1 ~ bb1 bb2 bb1 bb2@2 bb1 g1",
  BE: "f1 ~ f1 ~@2 f1 ~ f1 f2@3 f1 ~ f1 f2 f1", BF: "bb1!2 bb2!2 ~@5 bb1 ~ bb1 d2@2 f1 ~",
  BG: "g1!2 g2!2 ~@3 d2 ~ d2 f2 d2 g2@4", BH: "bb1@2 bb2!2 ~@3 d2 ~ d2 eb2 d2 c3@2 bb2 ~",
  BI: "f1@2 f2!2 ~@3 f1 ~ f1 g1 f1 g1@2 f1 a1", BJ: "bb1@2 bb2!2 ~@3 bb1 ~ bb1 c2 bb1 d2 ~ bb1 d2",
  BK: "g1@2 g2!2 ~@3 g1 ~ g1 bb1 g1 c2@2 bb1 c2", BL: "bb1@2 bb2!2 ~@3 bb1 ~ bb1 c2 d2 c2@2 d2 ~",
  BM: "bb1@2 bb2!2 ~@3 bb1 ~ bb1 c2 bb1 d2@2 bb1 d2", BN: "f1@2 f2!2 ~@3 f1 bb2@2 ab2@2 f2@3 ~",
  BO: "bb1!2 bb2!2 ~@5 bb1 ~ bb1 bb2@2 bb1 bb2", BP: "g0 g1 g2!2 ~ g2 ~@3 g1 ~ g1 g2@2 g1 g2",
  BQ: "bb1!2 bb2!2 ~ bb2 ~ bb1 ~ bb1 ~ bb1 bb2 ~ bb2!2", BR: "f1@2 f2!2 ~ f1 ~ f1 ~ f1 f2 f1 f2 ~ f1 ~",
  BS: "g0 g1 g2!2 ~ g2 ~@3 g1 ~ g1 g2 ~ g1 g2", BT: "bb1/2",
})).s("gm_fretless_bass").gain(0.45)

// chords · drawbar organ
const drawbar_organ = note("<~@67 A@3 B C@8 D@16 E@4 D@8 F@2>".pickRestart({
  A: "[f4 ~ eb4, d4@2 ~, ~ g4@2]/3", B: "[c4,f4]", C: "[f4 g4 ~ c4 ~ g4 ~ c4, d4@3 ~ d4@3 ~, ~@2 f4@3 ~ f4@2]/8",
  D: "[~ g4 ~ c4 ~ g4 ~ c4, d4@3 ~ d4@3 ~, ~@2 f4@3 ~ f4@2]/8", E: "[~ g4 ~ c4, d4@3 ~, ~ f4]/4", F: "c4/2",
})).s("gm_drawbar_organ").gain(0.3)

// chords · synth brass 2
const synth_brass_2 = note("<~@27 A B A C A B A C ~@18 A B A C A B A D E F ~@46>".pickRestart({
  A: "[d4,f4,bb4]@15 ~", B: "[d4,g4,bb4]@15 ~", C: "[c4,f4,a4]@15 ~", D: "[c4,f4,a4]", E: "[f4,bb4,d5]@15 ~",
  F: "[f4,bb4,d5]", // Bb
})).s("gm_synth_brass_2").gain(0.4)

// chords · ocarina
const ocarina = note("<~@23 A@7 B A@3 B C@2 D@2 C A ~@12 A@3 B A@3 B ~@48>".pickRestart({
  A: "~@2 [f4,bb4] ~@2 [f4,bb4] ~@2 [f4,bb4] ~@2 [f4,bb4]@2 ~ [f4,bb4] ~", // Bb5
  B: "~@2 [f4,a4] ~@2 [f4,a4] ~@2 [f4,a4] ~@2 [f4,a4]@2 ~ [f4,a4] ~", // F
  C: "~@2 [eb4,bb4] ~@2 [eb4,bb4] ~@2 [eb4,bb4] ~@2 [eb4,bb4]@2 ~ [eb4,bb4] ~", // Eb5
  D: "~@2 [g4,bb4] ~@2 [g4,bb4] ~@2 [g4,bb4] ~@2 [g4,bb4]@2 ~ [g4,bb4] ~", // Gm
})).s("gm_ocarina").gain(0.4)

// chords · pad sweep
const pad_sweep = note("<~@45 A@2 B@4 C@2 ~@56>".pickRestart({
  A: "[eb3,bb3]/2", B: "[a3@32 g3@31 ~, d3]/4", C: "[c3,a3]/2",
})).s("gm_pad_sweep").gain(0.4)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@18 A B C ~@15 A B C ~ A B@3 D E F G H I J K@2 ~@4 L M N O P Q B C R S B@3 T B@3 T B@3 U V W V X Y Z AA@2 AB AC AB AD
  AB AC AB AD AE AF AG AH AB AC AB AD AB AC AB AD AI@2
>`.pickRestart({
  A: "~@7 d4", B: "bb4@2 d4@2 c5@2 d4@2 f4@2 d4 g4@3 d4@2", C: "bb4@2 d4@2 c5@2 d4@2 f4@2 d4 g4@3 d4 ~", D: "c4@3 ~@5",
  E: "[f4,bb4,d5]", F: "[f4,f5]@3 [d4,d5]@3 [bb3,bb4]@10", G: "[a4,d5]", H: "[d5,a5] ~@2 [c5,e5] ~@2 [a4,c5]@10",
  I: "~@14 [c5,a5] ~", J: "[d5,bb5]@2 [c5,a5] ~ [c5,a5]@2 [bb4,g5] ~ [bb4,g5]@2 [a4,f5]@2 [g4,eb5]@2 [g4,d5]@2",
  K: "[~ f5, [f4,c5]]/2", L: "~@8 [bb4,bb5]@6 [a4,a5] [f4,g4,f5,g5]", M: "[a4,a5]@3 [g4,g5]", N: "[bb4,bb5]",
  O: "[a4,c6]", P: "~@5 [g4,bb4,d5]@3", Q: "~@7 d4, ~@5 [g4,bb4,d5]@3", R: "[bb4,eb5]@2 [c5,f5] [d5,g5]",
  S: "[a4,d5]@4 ~@3 d4, ~ [g4,c5]", T: "c4@4 ~@3 d4", U: "c4 ~", V: "bb5 g5 ~ bb5 ~@6 c6@4 bb5 ~",
  W: "bb5!2 ~ bb5 ~@12", X: "d5 c5, f4", Y: "[bb4,d5]", Z: "[a4,c5]@3 [g4,bb4]@5",
  AA: "[bb4@8 g5 ~@5 c5@2, d5@7 ~, ~@9 f5@7]/2",
  AB: "~@2 [f3,bb3] ~@2 [f3,bb3] ~@2 [f3,bb3]!2 ~ [f3,bb3]@2 ~ [f3,bb3] ~", // Bb5
  AC: "~@2 [g3,bb3] ~@2 [g3,bb3] ~@2 [g3,bb3]!2 ~ [g3,bb3]@2 ~ [g3,bb3] ~", // Gm
  AD: "~@2 [f3,a3] ~@2 [f3,a3] ~@2 [f3,a3]!2 ~ [f3,a3]@2 ~ [f3,a3] ~", // F
  AE: "~@2 [f3,bb3] ~@2 [f3,bb3] ~@2 [f3,bb3]!2 ~ g5 [eb5,f5] [c5,d5] [f3,bb3,g4,bb4] ~, bb5@11 [f3,bb3]@2 ~@3", // Bb5 Ebsus2 Csus2 Gm7 Bb5
  AF: "d5@2 [g3,bb3,c5] ~@2 [g3,bb3] c5@2 [g3,bb3]!2 ~ [g3,bb3]@2 ~ [g3,bb3] ~, ~@4 bb4@2 ~@2 g4@7 ~", // C7 Gm
  AG: "~@2 [f3,bb3] ~@2 [f3,bb3] ~@2 [f3,bb3]!2 ~ [f3,bb3]@2 ~ [f3,bb3] ~, bb5", // Bb5
  AH: "a5 g5 [f3,a3,f5] ~@2 [f3,a3] ~@2 [f3,a3]!2 ~ [f3,a3]@2 ~ [f3,a3] ~, ~ c6@7", AI: "[bb3,d4,f4,a4,c5]/2",
})).s("gm_string_ensemble_1").gain(0.35).pan(0.7)

// other · french horn
const french_horn = note("<~@54 A B@2 ~@52>".pickRestart({
  A: "g4@2 a4 g4", B: "f4/2",
})).s("gm_french_horn").gain(0.4)

// other · pad new age
const pad_new_age = note(`<
  ~@18 A B C ~@15 A B C ~ A B@3 D ~@17 A B C ~ A B@3 E B@3 E B@3 D ~@11 A B@3 D ~@3 A B@3 E B@3 D F G
>`.pickRestart({
  A: "~@7 d4", B: "bb4@2 d4@2 c5@2 d4@2 f4@2 d4 g4@3 d4@2", C: "bb4@2 d4@2 c5@2 d4@2 f4@2 d4 g4@3 d4 ~", D: "c4 ~",
  E: "c4@4 ~@3 d4", F: "~@5 bb5 ~@2 f5 ~@3 d5 ~@3", G: "~ c5 ~@14",
})).s("gm_pad_new_age").gain(0.4)

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

// drums · snare
const snare = s("sd").struct("<~@27 A@18 B@8 A C A C A C A C A C A C A C A C A C B@15 D B@20 ~@2>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@12 x!2 ~@2", D: "~@4 x ~@3 x ~ x ~ x!2 ~@2",
})).gain(0.45)

// drums · crash
const crash = s("cr").struct("<~@108 [~@11 x!5]>").gain(0.1)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@108 [~@9 x!2 ~@5]>").gain(0.05)

// drums · tambourine
const tambourine = s("tb").struct("<~ [~@3 x]!52 ~@56>").gain(0.35)

// drums · bongos
const bongos = s("bongo:4").struct("<~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@83>".pickRestart({
  A: "~@14 x!2",
})).gain(0.91)

// drums · bongos
const bongos_2 = s("bongo:18").struct(`<
  ~@27 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3
>`.pickRestart({
  A: "~@14 x!2",
})).gain(0.91)

// drums · congas
const congas = s("conga:18").struct("<~ [~@4 x ~@2 x ~@8]!106 ~@2>").gain(1.11)

// drums · shaker
const shaker = s("sh").struct("<~ [x!16]!106 ~@2>").gain(0.3)

// drums · claves
const claves = s("clave:2").struct("<~ [x!4]!106 ~@2>").gain(1.7)

stack(
  bass, drawbar_organ, synth_brass_2, ocarina, pad_sweep, string_ensemble_1, french_horn, pad_new_age, kick, snare,
  crash, crash_soft, tambourine, bongos, bongos_2, congas, shaker, claves
)

More by Young Paul