Strudelify
Mammagamma cover art

1982 · Eye In The Sky

Mammagamma

The Alan Parsons Project

KeyD majorTempo102 bpm
0:00/0:00
// Mammagamma — The Alan Parsons Project
// 102 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 92 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(102/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 · synth bass 1 · "SYN BASS 1"
const bass = note(`<
  ~@4 A@4 B C D A@5 B C D A E@2 A@2 E B F G A@3 H I C A J K L A@2 E B M ~ A J A@5 N O A@2 P ~@36
>`.pickRestart({
  A: "d3@5 ~ c4@2 ~@2 g3 a3 ~@4", B: "g2@3 g2@3 g3@2 ~@2 g3@2 g2@4", C: "f2@3 f2@3 f3@2 ~@2 f3@2 c3@4",
  D: "d3@5 ~ c4@2 ~@2 g3 a3 c4@4", E: "g2@5 ~ f3@2 ~@2 c3 d3 ~@4", F: "a2@3 a2@3 a3@2 ~@2 a3@2 a2@2 a3@2", G: "a2 ~@7",
  H: "d3@5 ~ c4@2 ~@2 g3 a3 c4!2 a3 ~", I: "g2@3 g2@3 g3@2 ~@2 g3@2 g2@2 g3@2", J: "d3@5 ~ c4@2 ~@2 g3 a3 c4!2 a3@2",
  K: "g2@3 g2@3 g3@2 ~@2 g3 ~ c3 d3 f3@2", L: "g2@3 g2@3 f3@2 ~@2 f3 ~ f3 e3@3", M: "a2@3 a2@3 a3@2 ~@2 a3@2 ~@2 a3@2",
  N: "d3@5 ~ c4@2 ~@2 f4 g4@3 e4 f4", O: "~@6 c4@2 ~@2 g3 a3 ~@4", P: "d3@3 ~ d3@4 d3@2 g3 a3 ~@4",
})).s("gm_synth_bass_1").gain(0.48)

// bass · slap bass 2 · "SLAPBASS 2"
const bass_2 = note("<~@47 A B ~@7 C@2 D E ~ F C@2 G@4 H I G@2 J K G@2 J L M N G@4 O P G@2 Q R G S>".pickRestart({
  A: "~@12 f3 g3 e3 f3", B: "d3", C: "~@6 d3 ~@3 a2 b2 d3@4", D: "~@2 d3 ~@3 d3 ~@3 a2 b2 d3@4",
  E: "~@6 d3 ~@3 a2 b2 d3@3 ~", F: "~@10 g2@3 f#2@3", G: "~@6 d3 e3 ~@2 a2 b2 d3@4", H: "~@10 a2 ~@2 a2 ~@2",
  I: "~@10 g2@3 f#2@2 ~", J: "~@6 g2 a2 ~@2 d2 e2 g2@4", K: "~@6 g2 a2 ~@2 g2 ~ g2 f#2@3",
  L: "~@2 a2 ~@2 a2 ~@5 a2 ~@2 a2 ~", M: "~@2 b2 ~@2 b2 ~@5 b2 ~@4", N: "~@2 b2 ~@2 b2 ~@2 b2@2 e2 f#2 b2@4",
  O: "~@6 a2 ~@9", P: "~@3 g2 ~@2 g2 ~@5 g2 f#2@3", Q: "~@6 g2 ~@3 g2 ~@2 g2 ~@2", R: "~@6 a2 ~@3 a2 ~@2 a2 ~@2",
  S: "~@6 d3 e3 ~@8",
})).s("gm_slap_bass_2").gain(0.8)

// bass · slap bass 1 · "SLAPBASS 1"
const bass_3 = note("<~@56 A@4 B C A@6 B C A@2 D@2 A@2 D B E F A@4 B G A@2 H B A I>".pickRestart({
  A: "e1 ~ e1 ~ e1 ~ e1 ~", B: "a1 ~ a1 ~ a1 ~ a1 ~", C: "g1 ~ g1 ~ g1 ~ f#1 ~", D: "a1 ~ a1 ~ a1 ~@3",
  E: "b1 ~ b1 ~ b1 ~ b1 ~", F: "b1 ~@7", G: "g1 ~ g1 ~ g1 ~@3", H: "g1 ~ g1 ~ g1 ~ g1 ~", I: "e1 ~ e1 ~ e1 ~@3",
})).s("gm_slap_bass_1").gain(0.65)

// other · synth bass 1 · "SYN BASS 1"
const synth_bass_1 = note(`<
  ~@4 A@4 ~@2 A@6 ~@2 A@2 B@2 A@2 B ~@2 C A@3 ~@3 A ~@3 A@2 B ~@2 D A ~ A@5 ~ A@4 ~@36
>`.pickRestart({
  A: "~@3 c4", B: "~@3 f3", C: "~@5 e3 a3@2", D: "a2@4 ~@6 d3 e3 a3@4",
})).s("gm_synth_bass_1").gain(0.48)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~@55 A@2 ~@24 B@2 ~@6 C@2 ~>".pickRestart({
  A: "[a6,d7]/2", B: "[~@7 [b6,e7]@16 ~@9]/2", C: "[~@15 [b6,e7]@16 ~]/2",
})).s("gm_string_ensemble_2").gain(0.15)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@8 A B C@2 ~@4 A B C@2 D@2 C@2 D@2 E ~ F@4 A B C@2 D@2 C@2 D@2 E ~ G H I J@8 K ~@4 L A M@2 ~@4 L A M@2 N@2 M@2 N@2 O
  ~ P@4 L A M@2 Q@2 R ~
>`.pickRestart({
  A: "[g3,d4]", B: "[f3,c4]", C: "[d3,a3]/2", D: "[g3,d4]/2", E: "[a3,e4]@3 ~", F: "[d3,a3]/4", G: "[d4,a4]",
  H: "a3 g4, [c4,e4]", I: "[d4,f4,a4]",
  J: "[e4@8 ~@26 e5@4 ~ c6 ~@12 e5@4 d5@8, c5@12 d5@7 d5@7 ~@6, g4@8 a4@11 ~@13, ~ e5@2 g5@2 c6@3]/8", K: "[a5,d6]",
  L: "[a3,e4]", M: "[e3,b3]/2", N: "[a3,e4]/2", O: "[b3,f#4]", P: "[e3,b3]/4", Q: "[b3 a3, e4]/2", R: "[e3,b3]",
})).s("gm_string_ensemble_1").gain(0.37)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1_2 = note("<~@44 A@8 B@2 C@2 ~@36>".pickRestart({
  A: "[~@48 e4@16 f4@15 ~ [d4,f4]@8 e4@8 d4@24 [c4,e4]@8, d3]/8", B: "[[d4,f4]@3 [e4,g4]]/2",
  C: "[f4@16 [g4,a4]@11 ~@5, d4@27 ~@5]/2", // Gsus2
})).s("gm_string_ensemble_1").gain(0.44)

// drums · kick
const kick = s("bd").struct("<[x!2]!27 x [x!2]!15 x [x!2]!35 x [x!2]!12>").gain(0.41)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!27 ~ [~ x ~ x]!15 [~@3 x] [~ x ~ x]!35 [~@3 x] [~ x ~ x]!11 [~ x ~@2]>")
  .gain(0.55)

// drums · low tom
const low_tom = s("lt").struct("<~@55 [~@4 x ~@2 x] ~@36>").gain(0.69)

// drums · hihat
const hihat = s("hh").struct(`<
  A@26 B ~ A@14 B ~ C@12 A D A D A D A D A D A D A D A D A D A D A D B ~ A D A D A D A D A D A E
>`.pickRestart({
  A: "x!7 ~", B: "x!8", C: "x ~ x ~ x ~ x ~ x ~ x ~ x!2 ~@2", D: "x ~ x ~ x ~ x ~ x!3 ~ x ~@3", E: "x!4 ~@4",
})).gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct("<~@55 [~@5 x ~@7 x ~@2] ~@36>").gain(0.69)

// drums · open hat
const open_hat = s("oh").struct("<[~@7 x]!26 ~@2 [~@7 x]!14 ~@2 [~@7 x]!34 ~@2 [~@7 x]!11 ~>").gain(0.48)

// drums · high tom
const high_tom = s("ht").struct("<~@55 [~ x ~@4 x ~] ~@36>").gain(0.69)

// drums · crash
const crash = s("cr").struct("<~@20 A ~@3 A ~@3 A ~@15 A ~@10 A@2 ~@7 A ~@7 A ~ A ~ A ~ A ~ A ~@7 A@3 ~>".pickRestart({
  A: "x",
})).gain(0.69)

stack(
  bass, bass_2, bass_3, synth_bass_1, string_ensemble_2, string_ensemble_1, string_ensemble_1_2, kick, snare, low_tom,
  hihat, mid_tom, open_hat, high_tom, crash
)

More by The Alan Parsons Project