Strudelify
Massachusetts cover art

1967 · Horizontal

Massachusetts

Bee Gees

KeyG majorTempo106 bpm
0:00/0:00
// Massachusetts — Bee Gees
// 106 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 3 "chord" harpsichord (copy of ch 7 "Piano" epiano2)
// note: Full arrangement: all 70 bars on a 24-step grid, each part at one level. 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, A@4 for four bars: edit a riff to change every repeat.

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~ A@3 B A C B@2 A C B@2 A D E@2 A F A G A C B@2 A C B@2 A D E@2 A C A H A C A B A C A B A D E@2 A I J A K L M L N A O
  A P A K A O Q R J ~
>`.pickRestart({
  A: "g1@7 ~@2 g1@2 ~ g1@10 ~@2", B: "g1@7 ~@2 g1@2 ~ g1@6 d2@5 ~", C: "a1@7 ~@2 a1@2 ~ c2@11 ~",
  D: "g1@7 ~@2 g1@2 ~ a1@5 ~ b1@4 ~@2", E: "c2@7 ~@2 c2@2 ~ c2@10 ~@2", F: "a1@7 ~@2 a1@2 ~ d2@11 ~",
  G: "a1@7 ~@2 a1@2 ~ d2@5 ~ d2@5 ~", H: "a1@7 ~@2 a1@2 ~ d2@5 ~ d2@4 ~@2", I: "a1@23 ~", J: "d2@11 ~",
  K: "a1@7 ~@2 a1@2 ~ d2@5 ~ c2@3 ~@3", L: "g1@7 ~@2 g1 ~@2 g1@8 ~ g1@2 ~", M: "a1@7 ~@2 a1@2 ~ d2@7 ~@2 d2@2 ~",
  N: "a1@6 ~@3 a1@2 ~ d2@6 c2@4 ~@2", O: "a1@7 ~@2 a1@2 ~ c2@8 ~ c2@2 ~", P: "a1@7 ~@2 a1@2 ~ d2@5 ~ c2@4 ~@2",
  Q: "g1@11 ~", R: "c2@11 ~",
})).s("gm_electric_bass_finger").gain(0.24)

// chords · string ensemble 1 · "String"
const string_ensemble_1 = note(`<
  A@4 B ~@2 C@2 ~@2 D E@8 F@2 ~ C@2 ~@2 D G@8 H@2 ~ I@2 ~@2 D J@8 K@2 L M@6 N@8 ~
>`.pickRestart({
  A: "[~@23 d4@12 e4@6 g4@6 a4@3 b4@6 a4@4 b4@11 b5@6 a5@6 g5@6 f#5@7]/4", B: "e5@6 b4@2 a4@3 b4@10 ~@3",
  C: "[~@8 d4@3 e4@6 g4@6 a4@3 b4@6 a4@3 b4@8 ~@5]/2", D: "~@8 d4@3 e4@6 g4@6 a4",
  E: "[~@2 b4@6 a4@3 b4@10 ~@2 g4@24 f4@23 ~ [c5,e5]@46 ~@2 [b4,d5]@23 ~ [c5,e5]@12 [d4,f#4]@12 [g4,b4]@9 d4@3 e4@6 g4@6 a4, ~@23 [b4,d5]@47 g4@73 a4@24 ~@25]/8", // C Bm C D G Bm
  F: "[~@2 b4@6 a4@3 b4@3 d5@3 b4@3 g4@3 d4@9 ~@16]/2",
  G: "[~@2 b4@6 a4@3 ~@11 g4@24 ~ f4@24 [g4,c5,e5]@12 c5@3 b4@3 a4@3 g4@3 e4@23 ~@18 d5@6 c5@13 [a4,d5]@11 ~ g4@9 d4@3 e4@6 g4@6 a4, ~@11 b4@60 ~@47 [g4,b4]@21 ~@3 a4@11 ~@13 b4@10 ~@16, ~@22 d5@47 ~@123]/8", // C D5 G
  H: "[~@2 b4@6 a4@3 b4@3 d5@3 b4@3 g4@3 d4@7 ~@18]/2", I: "[~@8 d4@3 e4@6 g4@6 a4@3 b4@6 a4@3 b4@9 ~@4]/2",
  J: "[~@2 b4@6 a4@3 ~@11 g4@24 f4@25 [g4,c5,e5]@12 c5@3 b4@3 a4@3 g4@3 e4@23 ~ g4@23 ~ c5@25 d5@23 ~, ~@11 b4@60 ~@47 b4@24 ~ a4@46 ~@3, ~@22 d5@47 ~@49 d5@22 ~@52]/8", // C
  K: "[~@8 d4@3 e4@6 g4@6 a4@3 b4@6 a4@3 b4@11 ~@2, [g4,b4,d5]@5 ~@19]/2", L: "[g4,b4,d5]@23 ~",
  M: "[a4@10 ~@13 [b4,d5]@23 ~ [c5,e5]@11 ~@13 [g4,b4]@23 ~ [c5,e5]@11 ~@13 [g4,b4]@23 ~ [a4,c5,e5], [c5,e5]@11 ~@18 f#5@6 ~@18 f#5@6 ~@13, ~@11 g4@34 ~@2 a4@23 ~@25 a4@23 ~@26, ~@59 d5@36 ~@12 d5@36 ~]/6", // Bm C G C G Am C
  N: "[~@11 [d5,f#5]@12 [g4,b4,d5]@23 ~ a4@11 ~@13 [b4,d5]@23 ~ [c5,e5]@11 ~ [d5,f#5]@10 ~@3 d5@23 ~ [c5,e5]@22 ~ [a4,d5]@13 ~@12, ~@47 [c5,e5]@23 ~@49 b4@24 ~@49, ~@59 g4@35 ~ a4@23 ~ g4@46 ~@27]/8", // D G Bm C D C D5 C
})).s("gm_string_ensemble_1").gain(0.26).pan(0.7)

// other · string ensemble 1 · "String"
const string_ensemble_1_2 = note(`<
  ~ A@4 ~@2 B@2 ~@2 C D@8 E F ~ G@3 ~ H@5 I J@4 F ~ K@2 ~@2 L M@4 N O@3 P@5 Q R S T@2 U V W@2 X@2 ~@2
>`.pickRestart({
  A: "[d3@12 e3@6 g3@5 a3@4 b3@6 a3@3 b3@12]/2", B: "[~@8 d3@3 e3@6 g3@6 a3@3 ~ b3@5 a3@3 b3@11 ~@2]/2",
  C: "~@8 d3@3 e3@6 g3@6 a3",
  D: "[~@2 b3@6 a3@3 b3@12 g3@24 f3@24 e3@51 g3@21 a3@12 d4@6 c4@6 g3@9 d3@3 e3@6 g3@6 a3]/8",
  E: "~@2 b3@6 a3@3 b3@3 d4@3 ~ b3@3 g3@3", F: "d3@3 ~", G: "[~@8 d3@3 e3@6 g3@6 a3@3 b3@6 a3@3 b3@15 ~@22]/3",
  H: "[~@8 d3@3 e3@6 g3@6 a3@3 b3@6 a3@3 b3@12 g3@24 ~@12 g3@12 c4@11 ~@2 c4@3 b3@3 a3@3 g3@3, ~@71 f3@14 ~@35]/5",
  I: "e3@23 ~", J: "[~@8 g3@10 b3@5 a3@12 c4@6 b3@6 g3@9 d3@3 e3@6 g3@6 a3@3 b3@6 a3@3 b3@3 d4@3 b3@3 a3@4]/4",
  K: "[~@8 d3@3 e3@6 g3@6 a3@3 ~ b3@5 a3@3 b3@13]/2", L: "~@4 d3@2 e3@3 g3@3",
  M: "[a3@3 b3@6 a3@3 b3@35 f3@12 g3@12 c4@11 ~ c4@3 b3@3 a3@4 g3@3]/4", N: "e3@2 ~",
  O: "[~@5 g3@6 a3@6 b3@6 c4@24 d4@21 ~@4]/3",
  P: "[d3@9 d3@3 e3@6 g3@5 a3@12 ~ b3@5 a3@4 ~@2 g3@11 ~@2 g3@5 ~ g3@5 a3@8 ~ a3@3 ~ c4@7 ~ c4@3 b3@18 a3@3 g3@4]/5",
  Q: "~ a3@18 ~@5", R: "g3@11 ~ g3@5 ~ g3@5 ~", S: "~@8 b3@3 c4@8 ~ c4@3 ~, a3@5 ~@7",
  T: "[c4@5 ~ b3@11 a3@3 g3@3 a3@21 ~@4]/2", U: "g3@5 ~ g3@2 ~ g3@2 ~", V: "a3@8 b3@2 ~@2 c4@7 ~ c4@2 ~@2",
  W: "[c4@5 b3@11 ~ a3@3 g3@3 a3@22 ~@3]/2", X: "[c4@23 d4@14 e4@11]/2",
})).s("gm_string_ensemble_1").gain(0.24).pan(0.3)

// chords · epiano2 · "Piano"
const epiano2 = note("<~ A@4 B@4 C@4 D E@3 F@8 G@4 H I@2 J K@8 L@4 M N@6 O@5 P@8 Q@5>".pickRestart({
  A: "[[b3,d4]@2 ~@3 [b3,d4] ~ g3 g3 ~@3 b3@2 [b3,d4]@2 [g3,b3,d4]@2 g3 ~@2 d4 ~ g3 ~@7 b3, ~@2 [b3,d4]@3 c4@16 ~@11, ~@9 g3@12 ~@6 g3@6 g3@15 ~@9 g3@12 ~@3 g3@6 g3@5 ~ g3@12, ~@18 [b3,d4]@6 [b3,d4]@6 d4@12 ~@12 d4@9 ~@3 d4@12 d4@11 ~ d4@6, ~@30 b3@6 ~@18 b3@6 b3@6 b3@9 b3@6 b3@5 b3@6 ~@4]/4", // Bm G Bm
  B: "[[b3,d4]@6 ~@6 b3@3 ~@6 [a3,c4]@12 c4@3 [c4,e4]@9 ~@3 g3@9 ~@6 d4@3 b3@3 b3@3 g3@3 ~@9 b3@2 ~ d4@3 [g3,b3,d4]@6, g3@9 g3@6 g3@21 g3@12 b3@9 g3@15 ~@3 g3@3 b3@5 ~@3 b3@4 ~@6, ~@2 d4@3 ~@2 e4@5 ~@3 [c4,e4]@16 ~, ~@6 b3@6 ~@3 [b3,d4]@33 d4@12 b3@6 d4@6 [b3,d4]@6 d4@8 ~@10, ~@11 a3@16 g3@3 ~@2]/4", // Bm Am C G C Bm
  C: "[b3@3 b3@3 ~@6 b3@3 ~@5 c4@10 ~@3 g3@3 [c4,e4]@9 ~@3 [b3,d4]@6 ~@9 d4@3 g3@6 ~@3 b3@3 g3@3 ~@9 d4@6, c4@20 a3@10 c4@6 g3@12 g3@6 b3@3 g3@9 b3@6 g3@6 b3@9 b3@9, g3@3 g3@2 g3@6 a3@16 g3@5, d4@6 d4@9 ~@5 e4@16 ~@9 [c4,e4]@48 ~@3, ~@2 b3@2 ~ [b3,d4]@11 ~@2 d4@2 b3@2 d4@4 d4@4 ~@2]/4", // C Bm C Bm
  D: "[b3,d4]@2 ~@5 [b3,d4], g3@3 g3@3 g3@2, ~@2 [b3,d4]@3 [b3,d4]@2 ~", // Bm
  E: "[[f3,b3,d4]@3 [b3,d4] [b3,d4]@2 ~@2 g3@2 ~@5 c4 e4@2 ~@5 g3, ~@3 f3@3 [f3,b3,d4]@16 ~@2, ~@4 e4@2 e4@2 ~ e4@2 ~, ~@8 c4@3 c4@2 c4@2 ~ c4@3 c4@3 [c4,e4]@2, ~@10 g3@4 g3@2 g3@5 g3@2 ~]/3", // Bdim Bm Bdim C
  F: "[[b3,d4]@6 ~@18 a3@9 a3@9 d4@6 d4@9 ~@43 b3@2 b3@3 ~@15 a3@6 ~@3 c4@3 [g3,c4,e4]@9 g3@3 [b3,d4]@6 ~@15 b3@3 g3@3 ~@12 d4@3 ~@3 b3@3, g3@3 g3@3 [g3,b3]@10 [g3,b3]@8 a4 b4@2 a4@10 b3@11 g3@2 b3 g3@5 ~ g3@2 g3@3 [g3,d4]@2, ~@6 d4@9 d4@27 [a3,f#4]@24 g4@31 g3@5 d4@3 b3@3 g3@6 d4@30 ~@6 d4@6 b3@6 d4@6 [b3,d4]@6 d4@9 ~@9, ~@2 b3@2 b3@2 ~@2 c4@12 e4@10 b4@16 ~ [c4,e4]@16 ~, ~@8 e4@11 d4@9 b4 d5@11 [c4,e4]@2 a3@16 b3@2 b3@3 ~]/8", // Bm C Bm G G5 D Bm C
  G: "[~@8 c4@2 ~@2 g3@2 ~@2 [b3,d4]@2 ~@2 b3@2 [g3,b3]@2 b3!2 g3 ~@2 d4 [g3,b3,d4]@2, g3@4 g3@4 a3@2 c4 a3@16 g3@3 ~@2, ~ b3@2 b3@2 b3@2 b3@8 [c4,e4]@16 ~, ~@2 d4@4 d4@10 ~@2 d4@4 d4@4 d4@3 ~@3, ~@8 e4@4 [c4,e4]@2 g3@2 g3@2 b3 g3@3 ~@2 g3@2 b3@2 b3@2 ~@2]/4", // Bm G C
  H: "[b3,d4] ~ b3 [g3,b3,d4], ~ d4@2 ~, ~ b3 ~@2, ~@3 g3@3 ~@2", // Bm G
  I: "[f3@3 f3 f3@2 ~@2 g3@2 ~@5 g3, [b3,d4] [b3,d4]@3, ~@3 f3@5, ~@24 e4@9 c4@3 e4@11 ~, ~@4 c4 g3@2 c4]/2", // Bm
  J: "[c4,e4]@6 ~@9 e4@2 ~ g3@3 g3@3, g3@9 g3@8 ~@7, ~@3 e4@4 ~@5, ~@6 c4@6 c4@5 [c4,e4]@7", // C
  K: "[[b3,d4]@6 ~@18 a3@9 a3@3 d4@12 g3@9 ~@6 g3@3 ~@6 [a3,c4,e4]@2 ~@7 a3@3 ~@12 [b3,d4]@5 ~@10 d4@3 ~@6 a3@6 ~@3 c4@3 g3@6 ~@6 [b3,d4]@6 ~@6 b3@6 [b3,d4]@6 [b3,d4]@6 ~@9 d4@3 [g3,d4]@6, g3@3 g3@4 g3@5 a3@10 d4@6 a3@8 b3@2 [b3,d4]@10 ~@2 d4@4 ~@4 d4@3 ~@3, ~@2 d4@3 d4@7 f#4@16 f#4@12 c4@2 a3@16 b3@2 b3@4, ~@2 b3@2 b3@2 b3@10 [b3,d4]@3 g3 b3@2 [g3,b3]@8 [c4,e4]@10 e4@4 [c4,e4]@3 [c4,e4]@16 ~, ~@24 [c4,e4]@48 ~@2 [c4,e4] a3@3 [c4,e4]@6 d4@12 g3@5 b3 d4@3 g3@27 ~@6 g3@6 g3@6 b3@3 g3@15 g3@9 g3@9 ~@6]/8", // Bm Am Bm G5 Bm G C
  L: "[b3@6 ~@6 b3@3 ~@6 a3@6 ~@9 [c4,e4]@6 ~@3 g3@3 [b3,d4]@6 ~@9 d4@3 b3@6 b3@5 ~@4 g3@3 ~@9 b3@3, g3@9 g3@6 g3@21 g3@9 ~@3 g3@6 b3@3 g3@15 g3@5 b3@10 b3@6 ~@3, ~@2 d4@3 ~@2 [c4,e4]@3 [c4,e4]@2 ~@2 [c4,e4]@16 ~@2, ~@6 b3@6 ~@3 [b3,d4]@33 ~@6 d4@6 b3@6 d4@11 d4@13 d4@6, ~@27 a3@6 a3@48 ~@3 g3@11 ~]/4", // C Bm C Bm
  M: "[b3,d4]@2 ~@2 b3!2 g3!2, g3@3 g3@3 ~@2, ~ d4@2 ~, ~ b3 ~ [b3,d4]", // Bm
  N: "[[f3,b3,d4]@6 f3@3 ~@2 b3@3 ~ b3@3 ~@6 [c4,e4]@6 ~@6 c4@3 ~@21 g3@3 c4@3 ~@3 g3@3 [b3,d4]@6 ~@6 b3@6 ~@6 a3@24 [a3,d4,f#4]@24, ~@2 d4@3 d4@16 ~@5 d4@4 d4@10 ~@8, ~@6 b3@5 ~@7 b3@48 c4@30 [c4,e4]@48, ~@9 f3@44 g3@3 c4@7 g3@6 ~@3 g3@6 b3@3 g3@9 [g3,b3]@48 ~@6, ~@24 g3@6 [c4,e4]@3 g3@6 [g3,c4]@3 e4@3 c4@3 g3@2 c4@3 e4@9 ~ e4@33 ~@48]/6", // Bdim C Bm D C G C C5
  O: "[[b3,d4]@2 ~@2 b3@2 ~@2 a3 ~@2 a3 ~@4 [b3,d4]@2 ~@2 b3@2 ~@2 a3@2 ~ [c4,e4] [g3,c4,e4]@3 g3 [b3,d4]@2 b3 ~@2 b3 [g3,b3,d4]@2, g3@3 g3@3 [g3,b3]@8 [c4,e4]@8 g3@6 ~@3 [c4,e4]@9, ~ d4@2 d4@3 f#4@8 ~@3 d4@2 ~, ~@6 b3@5 ~@13 [c4,e4]@6 [c4,e4]@6 d4@12 g3@6 [b3,d4]@3 g3@9 [b3,d4]@30 g3@9 b3@3 g3@6 ~@6, ~@9 a3@2 ~ a3@12 [c4,e4]@2 a3@14]/5", // Bm C Bm G C Bm C
  P: "[a3@9 ~@12 c4@3 b3@6 b3@2 ~@6 b3@3 ~@7 [a3,c4,e4]@9 a3@3 ~@12 g3@9 ~@39 g3@15 ~@9 [a3,c4,e4]@9 [c4,e4]@3 [c4,e4]@9 ~@3 g3@9 ~@11 g3@4, [c4,e4]@5 [c4,e4] b3 e4 g3@2 d4 b3 g3@2 [g3,b3]@8 [c4,e4]@6 b3 d4@3 a3@14 b3@9 [c4,e4]@9, ~@3 a3@11 d4@6 a3@10 b3@6 d4@2 [c4,e4]@9 d4@9 d4@4 b3 d4@3, ~@4 f#4@16 f#4@12 [c4,e4]@4 f#4@15 a3@13, ~@4 d4@2 d4@2 c4@8 ~@3 [c4,e4] d4@4 [b3,d4]@3 g3@13 [b3,d4]@5 g3@7 g3@4 b3@3 g3@3 b3@2]/8", // Am C G C Bm
  Q: "[~@3 [d4,f#4]@2, a3@2 ~@3, [c4,e4]@3 [c4,e4]@5 [c4,e4]@8 ~@4, ~ f#4@4 ~@5, ~ d4 [g3,b3,d4]@4 ~@4]/5", // D C G
})).s("gm_epiano2").gain(0.22).pan(0.2)

// drums · kick
const kick = s("bd").struct("<~ [x ~@2 x!2 ~@3]!49 x ~ [x ~@2 x!2 ~@3]!14 x!3 ~>").gain(0.32)

// drums · rim
const rim = s("rim").struct("<~@5 A@15 B A@15 B A@13 ~@2 A@14 ~@4>".pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!2 ~",
})).gain(0.28)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!3 [~@6 x ~@10 x ~@6] ~@55 [~ x ~@2] ~@9>").gain(0.32)

// drums · low tom
const low_tom = s("lt").struct("<~@4 [~@7 x] ~@48 [~@7 x] ~@11 [~@7 x] ~@4>").gain(0.24)

// drums · hihat
const hihat = s("hh").struct("<[x!4] [~ x!7] [x!8]!48 ~ [x!4] [x!8]!14 ~@4>").gain(0.2)

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 [~@3 x] ~@48 [~@3 x] ~@11 [~@3 x] ~@4>").gain(0.24)

// drums · open hat
const open_hat = s("oh").struct("<~@12 A ~@7 A ~@7 A ~@7 A ~@7 A ~@25>".pickRestart({
  A: "~@7 x",
})).gain(0.2)

// drums · crash
const crash = s("cr").struct("<~ A ~@48 A ~ A ~ A ~@3 A ~@3 A ~@3 A@3 ~>".pickRestart({
  A: "x",
})).gain(0.28)

// drums · ride
const ride = s("rd").struct("<~@5 A ~@7 A ~@5 A ~ A ~@7 A ~@5 A ~ A ~@7 A ~@24>".pickRestart({
  A: "x",
})).gain(0.28)

stack(
  bass, string_ensemble_1, string_ensemble_1_2, epiano2, kick, rim, snare, low_tom, hihat, mid_tom, open_hat, crash,
  ride
)

More by Bee Gees