Strudelify

Love Sex Intelligence

The Shamen

KeyG minorTempo128 bpm
0:00/0:00
// Love Sex Intelligence — The Shamen
// 128 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: bank select 127 (Roland MT-32 map) read through the MT-32 patch table: ch 4 "Ch  4" Elec Gtr 2 -> overdriven guitar; ch 7 "Ch  7" Harpsi 1 -> harpsichord
// note: Full arrangement: all 124 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(128/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · lead 8 bass lead · "Ch  1"
const bass = note(`<
  ~@4 A@3 ~ B C B ~ B D B D B D B ~ A@7 E B D B D B D B ~ B C B C B C ~@2 B F B F B F B F B D B D B D B D B G B G B G B
  G B C B C B C B ~@5 H@3 I A@7 ~@8 J K L M L M L M L N O N O N O N O N O N O P ~@3
>`.pickRestart({
  A: "g1 ~ g1 ~ g1@2 ~ g1 ~ g1 ~ g1 ~ bb1 c2@2", B: "g1 ~ g1 ~ g1@2 ~ g1 ~ g1 ~ g1!2 bb1 c2 ~",
  C: "g1 ~ g1 ~ g1@2 ~ g1 ~ g1 ~ g1 e1 f1 ~ gb1", D: "g1 ~ g1 ~ g1@2 ~ g1 ~ g1 ~ g1 bb1 c2 ~ d2",
  E: "e1 ~@2 e1!2 ~ e1 f1 ~ f1 ~ f1!2 ~@3", F: "g1 ~ g1 ~ g1@2 ~ g1 ~ g1 ~ g1 bb1@2 f1@2",
  G: "g1 ~ g1 ~ g1@2 ~ g1 ~ g1 ~ g1 bb1@2 c2@2", H: "g1 ~ g1 ~ g1@2 ~ g1 ~ g1 ~ g1 bb1 ~ c2 ~",
  I: "g1 ~ g1 ~ g1@2 ~ e1 ~ e1 ~ e1 f1 ~ gb1 ~", J: "~@7 g1!3 bb1 g1 ~ c2@2 g1",
  K: "d2@2 g1 ~ g1 ~ g1@2 ~ g1 ~ g1 ~ g1!2 bb1", L: "c2 ~ g1 ~ g1 ~ g1@2 ~ g1 ~ g1 ~ g1 bb1@2",
  M: "c2@2 g1 ~ g1 ~ g1@2 ~ g1 ~ g1 ~ g1!2 bb1", N: "c2@2 g1 ~ g1 ~ g1@2 ~ g1 ~ g1 ~ g1!2 c2",
  O: "d2 ~ g1 ~ g1 ~ g1@2 ~ g1 ~ g1 ~ g1 bb1@2", P: "c2 ~@7",
})).s("gm_lead_8_bass_lead").gain(0.64)

// bass · overdriven guitar · "Ch  4"
const bass_2 = note("<~@4 A@3 ~ B C D E ~@8 F@7 G ~@16 H@8 ~@20 B C D E ~@8 F@7 ~@33>".pickRestart({
  A: "g2 ~ g2 ~ g2!2 ~ g2 ~ g2 ~ [bb1,bb2] ~ g2 [bb1,bb2] [c2,c3]", // Bb C
  B: "~@2 [g1,g2] ~ [g1,g2]!4 ~ [g1,g2]!3 [bb1,bb2] ~ [c2,c3] ~", // G Bb C
  C: "~@2 [g1,g2] ~ [g1,g2]!4 ~ [g1,g2]!3 [e1,e2] ~ [f1,f2] ~", // G E F
  D: "~@2 [g1,g2] ~ [g1,g2]!4 ~ [g1,g2]!2 ~ [bb1,bb2] ~ [c2,c3] ~", // G Bb C
  E: "[g1,g2]!3 ~ [g1,g2]!4 ~ [g1,g2]!2 ~ [e1,e2] ~ [f1,f2] ~", // G E F
  F: "[g1,g2] ~@2 [g1,g2] ~@2 [g1,g2] ~@3 [bb1,bb2] ~@2 [c2,c3] ~@2", // G Bb C
  G: "[e1,e2] ~@2 [e1,e2] ~@2 [e1,e2] ~ [f1,f2] ~ [f1,f2] ~ [gb1,gb2] ~ [gb1,gb2] ~", // E F Gb
  H: "[g1,g2] ~@2 [g1,g2] ~@2 [g1,g2] ~@3 [g1,g2] ~@2 [g1,g2] ~@2", // G
})).s("gm_overdriven_guitar").gain(0.32)

// bass · overdriven guitar · "Ch  4" · soft notes · G E F Gb
const bass_soft = note(`<
  ~@7
  [[g1,g2] ~ [g1,g2] ~ [g1,g2] ~ [g1,g2] [e1,e2] ~ [e1,e2] ~ [e1,e2] [f1,f2] ~ [gb1,gb2] ~]
  ~@36
  [d2 ~@2 d2 ~@2 d2 ~@3 d2 ~@2 d2 ~@2]!8
  ~@72
>`).s("gm_overdriven_guitar").gain(0.14)

// other · melodic tom · "Ch  5"
const melodic_tom = note("<~@7 [b4 ~@2 b4 b3!2 ~@10] ~@116>").s("gm_melodic_tom").gain(0.72)

// other · melodic tom · "Ch  5" · soft notes
const melodic_tom_soft = note("<~@7 [~@7 g3 ~ g3 ~ g3 e3 ~@3] ~@116>").s("gm_melodic_tom").gain(0.4)

// chords · synth strings 1 · "Ch  6"
const synth_strings_1 = note(`<
  ~@12 A B A B A B A B ~@8 A B A B A B A B ~@16 A B A B A B A B C D C D C D C D ~@24 E@8 F@7 G@8 H@6 ~@3
>`.pickRestart({
  A: "[g4,d5,f5]", B: "[g4,c5,e5]", C: "[g4,d5,g5]", D: "[bb4,f5,bb5] [c5,e5,g5,c6]",
  E: "[~ [g4,d5,f5]@8 [g4,c5,e5]@8 [g4,d5,f5]@8 [g4,c5,e5]@8 [g4,d5,f5]@8 [g4,c5,e5]@8 [g4,d5,f5]@8 [g4,c5,e5]@7]/8", // G7 C G7 C G7 C G7 C
  F: "[~ [g4,d5,g5]@8 [bb4,f5,bb5]@4 [c5,e5,g5,c6]@4 [g4,d5,g5]@8 [bb4,f5,bb5]@4 [c5,e5,g5,c6]@4 [g4,d5,g5]@8 [bb4,f5,bb5]@4 [c5,e5,g5,c6]@4 [g4,d5,g5]@7]/7", // G5 Bb5 C G5 Bb5 C G5 Bb5 …
  G: "[~ [bb4,f5,bb5]@4 [c5,e5,g5,c6]@4 [g4,b4,d5,g5]@8 [f4,bb4,d5,f5]@4 [g4,c5,e5,g5]@4 [g4,b4,d5,g5]@8 [f4,bb4,d5,f5]@4 [g4,c5,e5,g5]@4 [g4,b4,d5,g5]@8 [f4,bb4,d5,f5]@4 [g4,c5,e5,g5]@4 [g4,b4,d5,g5]@7]/8", // Bb5 C G Bb C G Bb C …
  H: "[~ [f4,bb4,d5,f5]@4 [g4,c5,e5,g5]@4 [g4,b4,d5,g5]@8 [f4,bb4,d5,f5]@4 [g4,c5,e5,g5]@4 [g4,b4,d5,g5]@8 [f4,bb4,d5,f5]@4 [g4,c5,e5,g5]@4 ~@7]/6", // Bb C G Bb C G Bb C
})).s("gm_synth_strings_1").gain(0.14)

// bass · harpsichord · "Ch  7"
const bass_3 = note(`<
  ~@12 A B A B A B A C ~@8 A B A B A B A C D E D E D E F G ~@8 A B A B A B A B H I H I H I H I D E D E ~@4 J K J K L M N
  O ~@8 P Q@6 R S T U T U T U T V W X W X W X W X W X W Y ~@3
>`.pickRestart({
  A: "g1@2 g2 ~ g2@2 g1 g1@2 g2 ~ g1 bb1 bb2 c2 c3", B: "g1 g2 g2@2 g2 ~ g1 g1@2 g2 ~ g1 bb1 bb2 f1 f2",
  C: "g1 g2 g2@2 g2 ~ g1 g1@2 g2 ~ g1 e1 e2 f1 f2", D: "~@2 [g1,g2] ~ [g1,g2]!4 ~ [g1,g2]!3 [bb1,bb2] ~ [c2,c3] ~",
  E: "~@2 [g1,g2] ~ [g1,g2]!4 ~ [g1,g2]!3 [e1,e2] ~ [f1,f2] ~", // G E F
  F: "[g1,g2] ~ g1 ~ [g1,g2] g2 g1 [g1,g2] ~ [g1,g2] g1 [g1,g2] [bb1,bb2] ~ [c2,c3] ~", // G Bb C
  G: "[g1,g2] ~ g1 ~ [g1,g2] d2 g1 [g1,g2] ~ g2 e1 [e1,e2] [f1,f2] f2 [gb1,gb2] gb1", // G E F Gb
  H: "[g1,g2] ~ [g1,g2] ~ d2 g2 g1 [g1,g2] ~ g2 ~ [g1,g2] d2 [g1,g2] d2 [g1,g2]", // G
  I: "[bb1,bb2] ~ bb1 bb2 [bb1,bb2] f2 [bb1,bb2] [c2,c3] ~ c2 ~ [c2,c3] c2 c3 g2 [c2,c3]", // Bb C
  J: "[g1,d2,g2] ~@2 [g1,d2,g2] ~@2 [g1,d2,g2] ~@3 [g1,d2,g2] ~@2 [g1,d2,g2] ~@2", // G5
  K: "[bb1,f2,bb2] ~@2 [bb1,f2,bb2] ~@2 [bb1,f2,bb2] ~ [c2,g2,c3] ~@2 [c2,g2,c3] ~@2 [c2,g2,c3] ~", // Bb5 C5
  L: "[g1,d2,f2,g2] ~@2 [g1,d2,f2,g2] ~@2 [g1,d2,f2,g2] ~@3 [g1,d2,g2] ~@2 [g1,d2,g2] ~@2", // G7 G5
  M: "[bb1,bb2] ~@2 [bb1,bb2] ~@2 [bb1,bb2] ~ [c2,g2,c3] ~@2 [c2,g2,c3] ~@2 [c2,g2,c3] ~", // Bb C5
  N: "[g1,b1,d2,g2] ~@2 [g1,b1,d2,g2] ~@2 [g1,b1,d2,g2] ~@3 [g1,d2,g2] ~@2 [g1,d2,g2] ~@2", // G G5
  O: "[e1,e2] ~@2 [e1,e2] ~@2 [e1,e2] ~ [f1,c2,f2] ~@2 [f1,c2,f2] ~@2 [f1,c2,f2] ~", // E F5
  P: "~@2 g1 ~ g1 ~ g1@2 ~ g1 ~ g1 ~ g1 ~ g1", Q: "bb1 c2 g1 ~ g1 ~ g1@2 ~ g1 ~ g1 ~ g1 ~ g1",
  R: "bb1 c2 g1 ~ g1 ~ g1@2 ~ e1 ~ e1 ~ f1 ~ f1",
  S: "gb1!2 [g1,g2] ~ [g1,g2] ~ d2 g2 g1 [g1,g2] ~ g2 ~ [g1,g2] d2 [g1,g2]", // G
  T: "d2 [g1,g2] [bb1,bb2] ~ bb1 bb2 [bb1,bb2] f2 [bb1,bb2] [c2,c3] ~ c2 ~ [c2,c3] c2 c3", // G Bb C
  U: "g2 [c2,c3] [g1,g2] ~ [g1,g2] ~ d2 g2 g1 [g1,g2] ~ g2 ~ [g1,g2] d2 [g1,g2]", // C G
  V: "g2 [c2,c3] [g1,g2] g3 [g1,g2] ~ [d2,g2] [g2,f3] [g1,g3] [g1,g2] ~ g2 g3 [g1,g2] [d2,g2] [g1,g2,f3]", // C G G5 G7 G G5 G7
  W: "[d2,g3] [g1,g2,d4] [bb1,bb2] bb3 [bb1,bb2] bb2 [bb1,bb2] [f2,f3] [bb1,bb2,bb3] [c2,c3] ~ [c2,c3] c4 [c2,c3] [c2,bb3] [c3,c4]", // G5 Bb F Bb C C7 C
  X: "[g2,f4] [c2,c3,g4] [g1,g2] g3 [g1,g2] ~ [d2,g2] [g2,f3] [g1,g3] [g1,g2] ~ g2 g3 [g1,g2] [d2,g2] [g1,g2,f3]", // G7 C5 G G5 G7 G G5 G7
  Y: "[g2,f4] [c2,c3,g4] g1@4 ~@10", // G7 C5
})).s("gm_harpsichord").gain(0.4)

// other · melodic tom · "Ch 14"
const melodic_tom_2 = note("<~@7 [b5 ~@2 b5 b4!2 ~@10] ~@116>").s("gm_melodic_tom").gain(0.59)

// other · melodic tom · "Ch 14" · soft notes
const melodic_tom_soft_2 = note("<~@7 [~@7 g4 ~ g4 ~ g4 e4 ~@3] ~@116>").s("gm_melodic_tom").gain(0.33)

// drums · kick
const kick = s("bd").struct(`<
  ~@8 A B A ~ A B A B A B A@11 B A B A B A@3 B A B A B A ~ A B A B A B A@3 B A B A B A B A B A B A B A B A B A B A B A ~
  A B A B A B A B A@7 ~ C@2 D C D C E ~ C@2 D C D C D C D C D C D C D C D C D C F ~@3
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!2", C: "~ x ~ x ~ x ~ x", D: "x!2 ~ x ~ x ~ x", E: "x", F: "x!2 ~@6",
})).gain(0.8)

// drums · snare
const snare = s("sd").struct(`<
  ~@7 A B@3 C D@6 E F G@7 H D@6 E F B@7 ~ G I G I G I G J D@8 B@15 C B@7 K G@7 ~ L@6 ~ M N L@7 O P Q P Q P Q P Q P Q P R
  ~@3
>`.pickRestart({
  A: "~@7 x!3 ~ x!5", B: "~ x ~ x", C: "x!3 ~ x!4 ~ x!7", D: "~@4 x ~@7 x ~@2 x", E: "~@2 x ~@3 x!2", F: "x!10 ~ x!5",
  G: "~@4 x ~@2 x ~@4 x ~@3", H: "~@3 x ~@3 x!9", I: "~@4 x ~@2 x ~ x ~ x!2 ~ x!2", J: "x!10 ~ x ~ x!2 ~",
  K: "x!2 ~ x!3 ~ x!9", L: "~@3 x ~@3 x", M: "~@2 x!12 ~ x", N: "x!2 ~@4 x ~@7 x ~", O: "~@6 x ~@2 x ~@4 x ~",
  P: "~@6 x ~@2 x ~ x ~ x!3", Q: "x ~@5 x ~@2 x ~@4 x ~", R: "x",
})).gain(0.8)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@4 A@3 ~@53 B C B C B C B C ~@8 D E F G F G H ~@17 I J K J K J K J L ~@15
>`.pickRestart({
  A: "~ x ~ x", B: "~@7 x ~@8", C: "~@7 x ~ x ~ x ~ x!3", D: "~@7 x ~ x!2 ~@5", E: "~@7 x!3 ~ x ~ x!2 ~",
  F: "x ~ x!2 ~@12", G: "x!3 ~@3 x!2 ~ x ~ x ~@4", H: "~@9 x!3 ~ x ~ x", I: "~@9 x ~@6", J: "~@9 x ~ x ~ x ~ x",
  K: "x!2 ~@7 x ~@6", L: "x!2 ~@14",
})).gain(0.48)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@3 A ~@3 A ~@7 A ~@7 A ~@7 A ~@15 A ~@23 A ~@7 A ~@7 B ~@7 B ~@19 B ~ B ~
>`.pickRestart({
  A: "x", B: "~ x ~@6",
})).gain(0.8)

// drums · tambourine
const tambourine = s("tb").struct("<~@4 A@3 ~ A@3 ~ A@8 ~@8 A@15 ~ A@31 ~ A@8 ~@16 B A@21 C ~>".pickRestart({
  A: "x!16", B: "~@2 x!14", C: "x!2 ~@14",
})).gain(0.64)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<~@20 [~@3 x ~@7 x ~@4]!7 ~@57 [~@3 x ~@7 x ~@4]!7 ~@33>").gain(0.7)

stack(
  bass, bass_2, bass_soft, melodic_tom, melodic_tom_soft, synth_strings_1, bass_3, melodic_tom_2, melodic_tom_soft_2,
  kick, snare, snare_soft, crash, tambourine, woodblocks
)

More by The Shamen