Strudelify

Montego Bay

Bobby Bloom

KeyG majorTempo106 bpm
0:00/0:00
// Montego Bay — Bobby Bloom
// 106 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 79 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(106/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 · piano · "A.PIANO 1"
const piano = note(`<
  ~ A B C B D E D E D E D E F G H G H I J K L E D E D E D E F G H G H I J K A B C B D E D E D E D E F G H G H I J K L E
  D E D E D M ~@14
>`.pickRestart({
  A: "g4@2 d4@2 ~@6 g4@2 d4 ~@3", B: "g4 c4 ~@6", C: "g4 d4 ~@3 g4 d4 ~", D: "g3 d3 ~@3 g3 d3 ~", E: "g3 c3 ~@6",
  F: "[g3,g4]@2 d4 ~@3 d4@2 [g3,g4]@2 d4@2 g4@2 ~@2, ~@12 g3 ~@3", // G
  G: "[g3,g4]@2 c4 ~@3 c4@2 [g3,g4]@2 d4@2 [g3,g4]@2 ~@2", H: "[g3,g4]@2 d4 ~@3 d4@2 [g3,g4]@2 d4@2 [g3,g4]@2 ~@2",
  I: "[g3,g4]@2 c4 ~@3 c4 ~ [g3,g4] ~@3 g4 e4 c4 e4", J: "[g3,b3,d4]@11 ~@5", K: "[g3,g4] c4 ~ c4 [g3,g4] d4 [g3,g4] ~",
  L: "~ d3 ~@3 g3 d3 ~", M: "[c3,g3]",
})).s("gm_piano").gain(0.44).pan(0.2)

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  ~@2 A ~ B ~ C ~ A ~ D ~ E F G F H F I F I ~ J ~ B ~ D ~ B K H F H K I F I ~ L ~ C ~ E ~ E ~ E ~ E K H K I K I F I K H
  K I K I F M ~@14
>`.pickRestart({
  A: "~@6 d2@2 g1@3 ~ a1@3 ~", B: "~@3 d2 g1 ~ a1 ~", C: "~@6 d2 ~ g1@3 ~ a1@2 ~@2", D: "~@6 d2@2 g1@3 ~ a1@2 ~@2",
  E: "~@6 d2 ~ g1@2 ~@2 a1@2 ~@2", F: "g2@3 ~@3 g2@2 ~@8", G: "c2@2 ~@4 d2@2 g1@3 ~@5", H: "c2 ~@2 d2 g1 ~@3",
  I: "c2@2 ~@4 d2 ~ g1@2 ~@6", J: "~@6 d2 ~ g1@2 ~@2 a1@3 ~", K: "g2 ~@2 g2 ~@4", L: "~@6 d2 ~ g1@3 ~ a1@3 ~", M: "c2",
})).s("gm_fretless_bass").gain(0.49).pan(0.6)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  A B C D E F G H I J K L M N O P Q R S T U V G H I J K L M W X P Y R S T Z B C D E F G H I J K L M AA AB AC AD R S T U
  V G H I J K L AE ~@10 AF@4
>`.pickRestart({
  A: "~@7 [f#2,f#3,a#3,c#4,f#4]", B: "[b3,d4] [b3,d4,g4] ~ [g3,b3,d4,g4] ~ [g3,b3,d4,g4] ~ [f#3,b3,d#4], g3 ~@3",
  C: "[c4,e4] [c4,e4,g4] ~ [g3,b3,d4,g4] ~ [g3,b3,d4,g4] ~ [f#3,a#3,c#4,f#4], g3 ~@3", // C G F#
  D: "[g3,b3,d4,g4]!2 ~ [g3,b3,d4,g4] ~ [g3,b3,d4,g4] ~ [b3,d#4]", // G B
  E: "[c4,e4] [g3,c4,e4,g4] ~ [g3,b3,d4,g4] ~ [g3,b3,d4,g4] ~ [f#3,a#3,c#4,f#4]", // C G F#
  F: "[b3,d4,g4]!2 ~ [b3,d4,g4] ~ [g3,b3,d4,g4] ~ [f#3,b3,d#4]", // G B
  G: "[c4,e4] [g3,c4,e4,g4] ~ [g3,b3,d4,g4] ~ [b3,d4,g4] ~ [f#3,a#3,c#4,f#4]", // C G F#
  H: "[g3,b3,d4,g4]!2 ~ [g3,b3,d4,g4] ~ [b3,d4,g4] ~ [f#3,b3,d#4]", // G B
  I: "[c4,e4] [c4,e4,g4] ~ [b3,d4,g4] ~ [g3,b3,d4,g4] ~ [f#3,a#3,c#4,f#4]", // C G F#
  J: "[d4,g4]!2 ~ [g3,b3,d4,g4] ~ [b3,d4,g4] ~ [f#3,b3,d#4], b3@5 ~@11", // G5 G B
  K: "[c4,e4] [c4,e4,g4] ~ [b3,d4,g4] ~ [b3,d4,g4] ~ [f#3,a#3,c#4,f#4]", // C G F#
  L: "[b3,d4,g4]!2 ~ [g3,b3,d4,g4] ~ [g3,b3,d4,g4] ~ [f#3,b3,d#4,f#4]", // G B
  M: "[g3,c4,e4,g4]!2 ~ [g3,b3,d4,g4] ~ [g3,b3,d4,g4] ~ [g3,b3,d4,g4]", // C G
  N: "~ [g3,b3,d4,g4] ~ [g3,b3,d4,g4] ~ [g3,b3,d4,g4] ~ [g3,b3,d4,g4]", // G
  O: "~ [g3,c4,e4,g4] ~ [g3,e4,g4] ~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4]", // C G
  P: "~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4]", // G
  Q: "~ [c3,g3,c4,e4,g4] ~ [g3,c4,e4,g4] ~ [g3,b3,d4,g4] ~ [d3,g3,b3,d4]", // C G
  R: "~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4] ~ [d3,g3,b3,d4,g4]", // G
  S: "~ [c3,g3,c4,e4,g4] ~ [c3,g3,c4,e4,g4] ~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4]", // C G
  T: "~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4] ~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4]", // G
  U: "~ [c3,g3,c4,e4,g4] ~ [c3,g3,c4,e4] ~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4]", // C G
  V: "g4 [b3,d4,g4] ~ [b3,d4,g4] ~ [g3,b3,d4,g4] ~ [f#3,b3,d#4]", // G B
  W: "~ [d3,b3,d4,g4] ~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4]", // G
  X: "~ [g3,c4,e4,g4] ~ [c3,e4,g4] ~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4]", // C G
  Y: "~ [c3,g3,c4,e4,g4] ~ [c3,g3,c4,e4,g4] ~ [g3,b3,d4,g4] ~ [d3,g3,b3,d4]", // C G
  Z: "~ [g3,c4,e4,g4] ~ [c3,g3,c4,e4] ~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4]", // C G
  AA: "~ [d3,b3,d4,g4] ~ [d3,g3,d4,g4] ~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4]", // G G5 G
  AB: "~ [g3,c4,e4,g4] ~ [g3,e4,g4] ~ [d3,g3,b3,d4,g4] ~ [g3,b3,d4,g4]", // C G
  AC: "~ [g3,b3,d4,g4] ~ [g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4,g4]", // G
  AD: "~ [c3,g3,c4,e4,g4] ~ [g3,c4,e4,g4] ~ [d3,g3,b3,d4,g4] ~ [d3,g3,b3,d4]", AE: "[g3,c4,e4,g4]",
  AF: "[~@16 c4@2 e4@2 ~@4 a#3@3 ~@5 c4@2 d#4@2 ~@4 g4@14 ~@10, ~@12 c3@7 ~ a#2@7 ~ g#2@6 ~@2 g2@17 ~@11, ~@14 g3@5 ~@3 f3@5 ~@3 g3@5 ~@3 b3@15 ~@11, ~@39 d4@15 ~@10]/4",
})).s("gm_acoustic_guitar_steel").gain(0.25).pan(0.7)

// chords · acoustic guitar steel · "STEEL GTR" · soft notes
const acoustic_guitar_steel_2 = note(`<
  ~ A ~ B C D E F D G H I ~@2 J ~@2 K ~@2 L M E F D G H I ~@2 J ~@2 K ~@2 L A ~ B C D E F D G H I ~@2 J ~@2 K ~@2 L M E
  F D G H I ~@12 N ~@2
>`.pickRestart({
  A: "g2@5 ~@11, g4 ~@7", B: "~@7 f#3", C: "g3 ~@7", D: "g3@2 ~ g3 ~@4", E: "g3 ~@4 g3 ~@2", F: "~@5 g3 ~@2",
  G: "g3@2 ~@3 g3 ~@2", H: "g3@2 ~ g3 ~ g3 ~@2", I: "g3 ~@3", J: "~@3 c4 ~@4", K: "~@5 g4 ~@2", L: "~@3 g4 ~@4",
  M: "~@3 g3 ~@4", N: "~@5 d4 ~@2",
})).s("gm_acoustic_guitar_steel").gain(0.13).pan(0.7)

// other · whistle
const whistle = note("<~ A B C D ~@32 C B C D C E C E C F A B ~@8 C E C B ~@18>".pickRestart({
  A: "d6@3 ~ g6 ~ a6 b6 ~@2 d7@2 ~@4", B: "c7@3 ~ b6 a6 ~ g6@2 ~@7", C: "d6@3 ~ g6 a6 ~ b6 ~@2 d7@2 ~@4",
  D: "c7@3 ~ b6 a6@2 g6 ~@8", E: "c7@3 ~ b6 a6 ~ g6 ~@8", F: "c7@3 ~ b6 ~ a6 g6 ~@8",
})).s("gm_whistle").gain(0.33).pan(0.7)

// other · flute
const flute = note("<~@13 A B A B A B A B ~@8 A B A B A B A B ~@42>".pickRestart({
  A: "d5!2 ~ d5 ~ d5 c5 ~ b4 ~@3 b4 ~@3", B: "d5!2 ~ d5 ~ d5 c5 ~ b4 ~@7",
})).s("gm_flute").gain(0.38).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~ [x!4]!63 x ~@14>").gain(0.49)

// drums · rim
const rim = s("rim").struct("<~ A@4 ~@8 B C B D@4 B ~@8 B C B D@4 B ~@12 B C B D@4 B@2 C B D@4 ~@15>".pickRestart({
  A: "~@3 x ~@2 x ~", B: "x ~@2 x ~ x!2 ~ x ~@7", C: "x!2 ~ x ~ x ~@2 x ~@7", D: "x!2 ~ x ~ x!2 ~ x ~@7",
})).gain(0.27)

// drums · rim · soft notes
const rim_soft = s("rim").struct("<~@13 A B A ~@4 A ~@8 A B A ~@4 A ~@12 A B A ~@4 A@2 B A ~@19>".pickRestart({
  A: "~ x ~@14", B: "~@3 x ~@4",
})).gain(0.16)

// drums · clap
const clap = s("cp").struct("<~ [~ x ~ x]!63 ~@15>").gain(0.44)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@2 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 ~@16
>`.pickRestart({
  A: "~@3 x",
})).gain(0.38)

// drums · hihat
const hihat = s("hh").struct("<~ [x!4]!63 ~@15>").gain(0.38)

// drums · bongos
const bongos = s("bongo:4").struct(`<
  ~ A@4 ~@8 B C B D B C B D ~@8 B C B D B C B D ~@12 B C B D B C B D B C B D B C B ~@15
>`.pickRestart({
  A: "~@3 x ~@2 x ~", B: "x ~@2 x ~ x!2 ~ x ~@3 x ~@3", C: "x!2 ~ x ~ x!2 ~ x ~@7", D: "x ~@2 x ~ x!2 ~ x ~@7",
})).gain(0.86)

// drums · bongos · soft notes
const bongos_soft = s("bongo:4").struct(`<
  ~@13 A ~ A@3 ~ A@2 ~@8 A ~ A@3 ~ A@2 ~@12 A ~ A@3 ~ A@3 ~ A@3 ~ A ~@15
>`.pickRestart({
  A: "~ x ~@14",
})).gain(0.43)

// drums · congas
const congas = s("conga:13").struct("<~ [~@5 x ~@2]!23 [~@3 x] ~ [x ~@4 x ~@2] [~@5 x ~@2]!37 ~@15>").gain(1.22)

// drums · congas
const congas_2 = s("conga:18").struct("<~ x!24 [~@5 x ~@2] ~ x!37 ~@15>").gain(1.22)

// drums · congas
const congas_3 = s("conga:33").struct(`<
  ~
  [~@2 x ~@3 x ~@5 x ~@2 x]!23
  [~ x ~ x ~ x ~ x]
  [x ~ x ~@3 x ~@5 x ~@2 x]
  [~@2 x ~@3 x ~@5 x ~@2 x]!38
  x
  ~@14
>`).gain(1.22)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@5 [x!16]!59 ~@15>").gain(1.39)

stack(
  piano, bass, acoustic_guitar_steel, acoustic_guitar_steel_2, whistle, flute, kick, rim, rim_soft, clap, low_tom,
  hihat, bongos, bongos_soft, congas, congas_2, congas_3, cabasa
)