Strudelify

One Night in Bangkok

Murray Head

KeyD minorTempo109 bpm
0:00/0:00
// One Night in Bangkok — Murray Head
// 109 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 88 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(109/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.

// other · pad poly
const pad_poly = note("<~@15 A@2 ~@2 A@2 ~@16 B C ~@2 B C ~@26 A@2 ~@2 A@2 ~@3 B C ~@2 B C ~@4>".pickRestart({
  A: "[~@4 a4 ~ a4 ~ d4 ~ d4 ~ d4 ~ d4@6 ~@12]/2", B: "~@12 a4 ~ a4 ~", C: "d4 ~ d4 ~ d4 ~ d4@6 ~@4",
})).s("gm_pad_poly").gain(0.18).pan(0.7)

// bass · slap bass 1
const bass = note(`<
  ~ A B C D E F G H I@2 E J K L M@2 ~ L N@2 ~@2 O P@2 Q@2 R S T U V W R X Y Z AA ~ AB AC AD ~@12 AE H AF@2 E F G H I@2 E
  J K L M@2 ~ L N@2 ~@2 AB Z AA ~ AB AC AD ~@4
>`.pickRestart({
  A: "d2@4 ~@2 d2!2 ~@2 d2@2 d3 ~@3", B: "~@6 c2@4 d2 ~ d3@2 ~@2", C: "~@6 d2!2 ~@2 d2@2 d3@2 ~@2",
  D: "~@6 d2@4 d2 ~ d3@2 d2@2", E: "g1@3 g2 ~ g2 d2@2 f2@2 d2@2 g2@3 ~", F: "g1@3 g2 ~ g1 c2 d2 f2@2 d2@2 g2@2 g1@2",
  G: "d2@3 d3 ~@6 d2@2 d3@2 ~@2", H: "~@6 c2@3 ~ d2 ~ d3@2 a2@2", I: "[d2@3 d3 ~@8 a2@10 ~@2 d3@2 d2@2 d3@2 f1@2]/2",
  J: "g1@3 g2 ~ g1 c2 d2 f2 ~ d2 g1 g2@4", K: "g1@3 g2 ~@2 g1@2 db2 ~ db3 ~ db2 db3@3", L: "d2 bb1",
  M: "[f2!2 c2!2 d2@5 ~@7]/2", N: "[f1 f2 c1 c2 d2@8 ~@4]/2", O: "~@8 d2@4 ~@2 d2!2",
  P: "[~@2 d2@2 d3 ~@9 c2@4 d2 ~ d3@2 ~@8 d2!2]/2", Q: "[~@2 d2@2 d3@2 ~@8 d2@4 d2 ~ d3@2 d2@2 g1@3 g2 ~ g2 d2@2]/2",
  R: "f2@2 d2@2 g2@3 ~ g1@3 g2 ~ g1 c2 d2", S: "f2@2 d2@2 g2@2 g1@2 d2@3 d3 ~@4", T: "~ d2 d3 ~@4 c2",
  U: "~@2 d2 ~ d3@2 a2@2 d2@3 d3 ~@4", V: "~@2 a2@5 ~", W: "d3@2 d2@2 d3@2 f1@2 g1@3 g2 ~ g2 d2@2",
  X: "f2 ~ d2 g1 g2@4 g1@3 g2 ~@2 g1@2", Y: "db2 ~ db3 ~ db2 db3@3 d2@8", Z: "bb1@4 f2!2 c2!2", AA: "d2@5 ~@3",
  AB: "~ d2", AC: "bb1@4 f1 f2 c1 c2", AD: "d2", AE: "d2@3 d3 d2@2 ~@4 d2@2 d3@2 ~@2",
  AF: "[d2@3 d3 ~@8 a2@10 ~@2 d3@2 d2!2 d3@2 f1@2]/2",
})).s("gm_slap_bass_1").gain(0.46)

// bass · synth bass 2
const bass_2 = note(`<
  ~ A@14 B C D A B C D E F A@13 G H I F G H I J D K L M@7 A@14 B C D A B C D E F G H I F G H I J D ~
>`.pickRestart({
  A: "~@2 d3 ~@3 d3 ~@3 d3 ~@3 d3 ~", B: "~@2 f3 ~@3 c3 ~@3 d3 ~@3 d3 ~",
  C: "~@2 [d2,d3] ~ [e2,e3] ~ [f2,f3] ~ [g2,g3] ~ [g2,g3] ~ [a2,a3] ~ [bb2,bb3] ~", // D E F G A Bb
  D: "[g2,g3] ~ [a2,a3] ~ [bb2,bb3] ~ [c3,c4] ~ [d3,d4] ~ [e3,e4] ~ [f3,f4] ~ [g3,g4] ~", // G A Bb C D E F G
  E: "[a2,a3] ~ [bb2,bb3] ~ [c3,c4] ~ [d3,d4] ~ [g2,g3] ~ [a2,a3] ~ [bb2,bb3] ~ [c3,c4] ~", // A Bb C D G A Bb C
  F: "[d3,d4] ~ [e3,e4] ~ [f3,f4] ~ [g3,g4] ~@3 d3 ~@3 d3 ~", G: "~@2 d3 ~@3 d3 ~@3 f3 ~@3 c3 ~",
  H: "~@2 d3 ~@3 d3 ~@3 [d2,d3] ~ [e2,e3] ~ [f2,f3] ~", // D E F
  I: "[g2,g3] ~ [g2,g3] ~ [a2,a3] ~ [bb2,bb3] ~ [g2,g3] ~ [a2,a3] ~ [bb2,bb3] ~ [c3,c4] ~", // G A Bb G A Bb C
  J: "[d3,d4] ~ [e3,e4] ~ [f3,f4] ~ [g3,g4] ~ [a2,a3] ~ [bb2,bb3] ~ [c3,c4] ~ [d3,d4] ~", // D E F G A Bb C D
  K: "d2 ~ d3 ~ d2 ~ d3 ~ d2 ~ d3 ~ d2 ~ d3 ~", L: "g1 ~ a2 ~ a1 ~ a2 ~ a1 ~ a2 ~ a1 ~ a2 ~",
  M: "a1 ~ a2 ~ a1 ~ a2 ~ a1 ~ a2 ~ a1 ~ a2 ~",
})).s("gm_synth_bass_2").gain(0.33)

// other · timpani
const timpani = note(`<
  ~ A B C D ~@2 E F G H I J K L M N O L M N O P Q R S T U V W X Y Z AA@2 AB AC AD AE AF AC AD AE AF AG@2 ~@9 E AH G H I
  J A AH AI AJ AK AL AM L M N O L M N O P AN AD AE AF AC AD AE AF AO@3
>`.pickRestart({
  A: "~@2 c5@2 a4 ~@3 a4!5 d4!3", B: "g4 a4!2 ~ d4@2 d4!2 a4!2 a4@2 d4@2 d4 ~",
  C: "c5 ~ c5!2 a4 ~ a4 ~ a4 d4!2 ~ d4 ~ d4!2", D: "a4 ~ a4!3 d4!2 ~ a4@2 ~ a4 ~ d4 ~@2",
  E: "~@2 d5@2 a4 ~@3 a4!5 d4!3", F: "g4 a4!2 ~ d4 ~ d4!2 a4!2 a4@2 d4@2 d4 ~",
  G: "~@2 c5@2 a4@2 ~@2 c5 a4 ab4 g4 a4 g4 ~ a4", H: "a4 ~ a4 ~ g4 a4 ~ a4 ~@2 a4 g4 f4 d4 ~@2",
  I: "~@6 d4 a4@2 d4 ~@4 a4 c5", J: "d5 a4 d4 ~@3 d4 a4@2 d4 ~@4 d4@2", K: "~@4 d4 g5 d5@2 ~@8",
  L: "~@2 f4 ~ f4 ~ f4 ~ f4@2 d4@2 f4@2 g4@2", M: "a4@2 g4@2 f4 d4 ~@2", N: "~@2 d4 e4@3 f4@2 g4@2 d4 ~ d4@2 c4 ~",
  O: "c4 e4@2 d4 ~@4", P: "~@2 d4 ~ e4@2 f4 g4@3 d4 ~ d4@2 c4 ~", Q: "c4@2 e4@4 d4@2 ~@2 c5@2 a4 ~@3",
  R: "a4!5 d4!3 g4 a4!2 ~ d4@2 d4!2", S: "a4!2 a4@2 d4 ~ d5!2 d5@2 d4!3 ~ d5 ~", T: "f5!8 g5!8",
  U: "d5!3 ~ c5@2 d5@2 g5@2 f5 d5@3 c5 ~", V: "d5 c5 ~ d5 c5 ~ a4 g4@2 ~@4 g4 a4 ~",
  W: "g4 ~ a4!2 ~ d4@2 ~ g5@4 a5@3 ~", X: "g5@2 a5@2 c6@3 ~ g5!2 a5 c6@3 a5 c6",
  Y: "d6 c6 a5 ~ g5@2 a5 ~ a4 ~@2 d4@3 ~ d4", Z: "a4!5 ~ d4!2 a4 ~ a4 ~ a4@2 d4!2",
  AA: "[a4 ~ a4 ~ a4@2 d4 ~@4 a4@4 d4@2 d4 ~ a4 ~ a4!2 g4 ~@2 a4@2 d4@2 d4 ~]/2",
  AB: "a4!3 ~ g4 ~ a4 g4 ~ a4 ~ a4@2 d4@2 ~", AC: "~@10 f4 ~ f4 ~ f4 ~", AD: "f4 d4 f4 g4 a4@2 g4@2",
  AE: "f4@2 d4@2 ~@6 d4 e4@3 f4@2", AF: "g4@2 d4 ~ d4@2 c4 ~ c4@2 e4@4 d4@2",
  AG: "[~@10 d4 ~ e4@2 f4 g4@3 d4 ~ d4@2 c4 ~ c4@2 e4@4 d4@2]/2", AH: "g4 a4!2 ~ d4@2 d4!2 a4!2 a4@2 d4 ~ d4 ~",
  AI: "a4 ~@2 d4@3 ~ d4 a4!5 ~ d4!2", AJ: "a4 ~ a4 ~ a4@2 d4!2 a4 ~ a4 ~ a4@2 d4 ~",
  AK: "~@3 a4@4 d4@2 d4 ~ a4 ~ a4!2 g4", AL: "~@2 a4@2 d4@2 d4 ~ a4!3 ~ g4 ~ a4 g4", AM: "~ a4 ~ a4@2 d4@2 ~@9",
  AN: "c4@2 e4@4 d4@2 ~@2 f4 ~ f4 ~ f4 ~", AO: "[~@10 d4 ~ e4@2 f4 g4@3 d4 ~ d4@2 c4 ~ c4@2 e4@4 d4@18]/3",
})).s("gm_timpani").gain(0.41)

// chords · synth brass 1
const synth_brass_1 = note(`<
  ~@2 A ~ B C D E A ~ B C ~ F ~@3 G H ~@2 G I ~ J K L M ~ N J K L M ~ O P ~@3 Q ~@3 R ~@10 S T S U C D V A ~ B C ~ F ~@3
  G H ~@2 G W ~@4 Q ~@3 R ~@2
>`.pickRestart({
  A: "~@6 [g3,c4,e4]@3 ~ [a3,d4,f4] ~ a3 ~ [a3,d4,f4] ~", // C Dm
  B: "~@2 [g3,c4,e4] ~ g3 ~ [g3,c4,e4]@3 ~ [a3,d4,f4] ~ a3 ~ [a3,d4,f4] ~", C: "[g4,bb4,d5,f5]@3 [g4,bb4,d5,f5] ~@12",
  D: "~@8 [g4,bb4,d5,f5]@2 ~ [g4,bb4,d5,f5] ~@2 [g4,a4,c5,e5] ~", E: "[a4,c5,e5]@2 [f4,d5] ~ [f4,a4,d5] ~@11, g4 ~@15",
  F: "[g4,bb4,d5,f5]@3 [g4,bb4,d5,f5] ~@4 [g4,bb4,db5,e5]@3 [g4,bb4,db5,e5] ~@4", // Gm7 Gdim
  G: "~@8 [g4,bb4,d5,f5]@2 ~ [g4,bb4,d5,f5] ~@2 [g4,c5,e5] ~", // Gm7 C
  H: "[c5,e5]@2 [f4,a4,d5] ~ [a4,d5]@2 ~@10, g4 ~@3 f4 ~@11", // C Dm D5
  I: "[c5,e5]@2 [g4,bb4,d5] ~ [g4,d5]@2 ~@10, g4 ~@3 bb4 ~@11", J: "~@7 [g3,c4,e4]",
  K: "~@2 [a3,d4,f4] ~ a3 ~ [a3,d4,f4] ~@9", L: "~@10 [g3,c4,e4] ~ g3 ~ [g3,c4,e4]@2",
  M: "~@2 [a3,d4,f4] ~ a3 ~ [a3,d4,f4] ~ [g4,bb4,d5,f5]@3 [g4,bb4,d5,f5] ~@4", // Dm Gm7
  N: "[g4,bb4,d5,f5]@2 ~ [g4,bb4,d5,f5] ~@2 [g4,a4,c5,e5] ~ [a4,c5,e5]@2 [f4,d5] ~ [f4,a4,d5] ~@3, ~@8 g4 ~@7", // Gm7 Am7 Am Dm
  O: "~@8 [g4,bb4,d5,f5]@3 [g4,bb4,d5,f5] ~@4", P: "[g4,bb4,db5,e5]@3 [g4,bb4,db5,e5] ~@12",
  Q: "[g4,bb4,d5,f5]@2 ~ [g4,bb4,d5,f5] ~@2 [g4,c5,e5] ~ [c5,e5]@2 [f4,a4,d5] ~ [a4,d5]@2 ~@2, ~@8 g4 ~@3 f4 ~@3", // Gm7 C Dm D5
  R: "[g4,bb4,d5,f5]@2 ~ [g4,bb4,d5,f5] ~@2 [g4,c5,e5] ~ [c5,e5]@2 [g4,bb4,d5] ~ [g4,d5]@2 ~@2, ~@8 g4 ~@3 bb4 ~@3", // Gm7 C Gm G5
  S: "~@6 [g3,c4,e4]@3 ~ [a3,d4,f4] ~@5", T: "~@6 [g3,c4,e4]@3 ~ [a3,d4,f4] ~ [g3,c4,e4] ~ [a3,d4,f4] ~",
  U: "~@2 [g3,c4,e4] ~ g3 ~ [g3,c4,e4]@3 ~ [a3,d4,f4] ~ [g3,c4,e4] ~ [a3,d4,f4] ~", // C Dm C Dm
  V: "[a4,c5]@2 [f4,d5] ~ [f4,a4,d5] ~@11, [g4,e5] ~@15", // Am Dm C
  W: "[g4,e5] ~ [g4,bb4,d5] ~ [g4,d5]@2 ~@10, c5@2 ~@2 bb4 ~@11", // C Gm G5
})).s("gm_synth_brass_1").gain(0.2).pan(0.4)

// chords · synth bass 1
const synth_bass_1 = note(`<
  ~@5 A B C ~@3 A ~ D ~@3 E F ~@2 E G ~@4 H ~ I ~@3 H ~ H J ~@3 K ~@3 L ~@14 A B C ~@3 A ~ D ~@3 E F ~@2 E G ~@4 K ~@3 L
  ~@2
>`.pickRestart({
  A: "[g4,bb4,d5,f5]@2 ~ [g4,bb4,d5,f5]@2 ~@11", B: "~@8 [g4,bb4,d5,f5]@2 ~ [g4,bb4,d5,f5]@2 ~ [g4,c5,e5]@2",
  C: "[g4,c5,e5] [f4,a4,d5]!2 ~@5", // C Dm
  D: "[g4,bb4,d5,f5]@2 ~ [g4,bb4,d5,f5]@2 ~@3 [g4,bb4,db5,e5]@2 ~ [g4,bb4,db5,e5]@2 ~@3", // Gm7 Gdim
  E: "~@8 [g4,bb4,d5,f5]@2 ~ [g4,bb4,d5,f5] ~@2 [g4,c5,e5] ~", F: "[g4,c5,e5] ~ [f4,a4,d5] ~ [f4,a4] ~@11, ~@2 d5 ~@5",
  G: "[g4,c5,e5] ~ [g4,bb4,d5] ~ [g4,bb4] ~@11, ~@2 d5 ~@5", H: "~@8 [g4,bb4,d5,f5]@2 ~ [g4,bb4,d5,f5]@2 ~@3",
  I: "[g4,bb4,d5,f5]@2 ~ [g4,bb4,d5,f5]@2 ~ [g4,c5,e5]@2 [g4,c5,e5]@2 [f4,a4,d5]@2 [f4,a4,d5]@2 ~@2", // Gm7 C Dm
  J: "[g4,bb4,db5,e5]@2 ~ [g4,bb4,db5,e5]@2 ~@11", // Gdim
  K: "[g4,bb4,d5,f5]@2 ~ [g4,bb4,d5,f5] ~@2 [g4,c5,e5] ~ [g4,c5,e5] ~ [f4,a4,d5] ~ [f4,a4] ~@3, ~@6 d5 ~", // Gm7 C Dm F
  L: "[g4,bb4,d5,f5]@2 ~ [g4,bb4,d5,f5] ~@2 [g4,c5,e5] ~ [g4,c5,e5] ~ [g4,bb4,d5] ~ [g4,bb4] ~@3, ~@6 d5 ~", // Gm7 C Gm
})).s("gm_synth_bass_1").gain(0.17).pan(0.7)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@14 A@3 ~ A@3 ~@15 B@2 C ~ B@2 C ~@3 D E@8 ~@13 A@3 ~ A@3 ~@2 B@2 C ~ B@2 C ~@4
>`.pickRestart({
  A: "[a4@2 bb4@2 a4 [e4,g4] [d4,f4,a4]@4 ~@2, f4@5 ~@7, d5@2 c5 ~@3]/3", // Em Dm
  B: "[~@2 a4@2 bb4@2 a4 [e4,g4], ~@2 f4@5 ~, ~ d5@2 c5]/2", C: "[d4,f4,a4]", D: "[d4,e4,a4]", E: "[a3,e4,a4]/8",
})).s("gm_synth_strings_1").gain(0.12).pan(0.4)

// drums · kick
const kick = s("bd").struct("<~ [x!4]!86 x>").gain(0.46)

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

// drums · hihat
const hihat = s("hh").struct("<~ A@12 B A@22 C A@30 B A@19 ~>".pickRestart({
  A: "x!8", B: "x!7 ~", C: "x!3 ~ x!4",
})).gain(0.15)

// drums · mid tom
const mid_tom = s("mt").struct("<[~@7 x] ~@49 [~@7 x]!3 ~ [~ x ~@2 x!4] ~@33>").gain(0.31)

// drums · open hat
const open_hat = s("oh").struct("<~@13 [~@7 x] ~@22 [~@3 x ~@4] ~@30 [~@7 x] ~@20>").gain(0.26)

// drums · high tom
const high_tom = s("ht").struct("<~@50 [~@7 x]!3 ~ [~ x ~@6] ~@33>").gain(0.31)

// drums · crash
const crash = s("cr").struct("<~ x ~@44 x!2 ~@7 x ~@32>").gain(0.36)

stack(
  pad_poly, bass, bass_2, timpani, synth_brass_1, synth_bass_1, synth_strings_1, kick, snare, hihat, mid_tom, open_hat,
  high_tom, crash
)