Strudelify

Mea Culpa

Enigma

KeyE minorTempo111 bpm
0:00/0:00
// Mea Culpa — Enigma
// 111 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 107 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(111/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 · overdriven guitar
const overdriven_guitar = note("<~@55 A B@5 C ~ D@2 E F G@2 H@2 ~@36>".pickRestart({
  A: "d5", B: "[~@3 d5@35 ~@5 b4@2 e5@2 ~ g5@21 ~@5 b4 ~ e5 ~ f#5 ~, ~@47 f#5@2 ~@31]/5", C: "g5", D: "[d5@19 ~@13]/2",
  E: "e5@2 ~ e5@2 ~ e5@2 e5@8", F: "d5@14 a4 g4", G: "[a4@7 b4]/2", H: "[d4 e4@11 ~@4]/2",
})).s("gm_overdriven_guitar").gain(0.29).pan(0.6)

// bass · electric bass finger
const bass = note(`<
  ~@6 A B A B A B A B A B A B A B A B A B A B A B A B C D E F G H I@3 J K I@3 L K@2 I L C D E F G H M@3 N O P M Q M@3 R
  O P M@2 C D E F G H ~@6 I@3 J K I@3 L K@2 I L C D E F G H ~@5
>`.pickRestart({
  A: "e1@2 ~@4 e1!3 ~ e1 ~ e1 ~ e1!2", B: "e1 ~@2 e1 ~@2 e1!3 ~ e1 ~ e1 ~ e1!2", C: "a1@2 ~@4 a1!3 ~ a1 ~ a1 ~ a1!2",
  D: "a1 ~@2 a1 ~@2 a1!3 ~ a1 ~ a1 ~ a1!2", E: "g1@2 ~@4 g1!3 ~ g1 ~ g1 ~ g1!2",
  F: "g1 ~@2 g1 ~@2 g1!3 ~ g1 ~ g1 ~ g1!2", G: "f#1@2 ~@4 f#1!3 ~ f#1 ~ f#1 ~ f#1!2", H: "b1 ~@7",
  I: "e1@2 ~@4 e1@2 a1@2 g1@2 e1 ~ e1!2", J: "e1@2 ~@4 e1@2 a1@2 g1@2 e1 ~ d1!2",
  K: "d1@2 ~@4 d1@2 a1@2 g1@2 d1 ~ d1!2", L: "e1@3 ~@3 e1@2 a1@2 g1@2 e1 ~ e1!2",
  M: "e1@2 ~@4 e1 d1 e1@2 g1 ~ g1@2 e1 d1", N: "e1 ~@2 e1 a1 g1 e1 g1", O: "d1 ~@2 d1 a1 g1 d1 c#1",
  P: "d1 ~@2 d1 a1 g1 d1@2", Q: "e1 ~@2 e1 a1 g1 e1 d1", R: "e1@3 ~@3 e1@2 a1@2 g1@2 e1@2 g1@2",
})).s("gm_electric_bass_finger").gain(0.43)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@4 A@4 B@2 C@4 D@8 E@4 F@4 G@6 H@4 I J@4 K@2 L@2 G@6 J@4 M@2 N@2 O@2 P@2 K@2 L@2 G@6 Q@6 H@4 I J@4 K@2 L@2 G@6 R@4 ~
>`.pickRestart({
  A: "[~ e2, [e4,g4,b4]]/4", B: "[e2,e4,f#4,a4]/2", C: "[[e2,g4,b4] [e2,f#4,a4], e4]/4",
  D: "[[b3,e4,g4]@2 [b3,e4,f#4] [d4,f#4,a4] [b3,g4]@2 [a3,d4,e4,f#4]@2, e2, ~@16 e4@7 ~@9]/8", // Em Bsus4 D Em D
  E: "[[e2,g4,b4] [e2,f#4,a#4], e4]/4", F: "[e4@2 ~ c4 [b3,e4,g4]@4, e2, [f#4,a4] ~, ~ d#4 ~@2]/4",
  G: "[[a2,c5]@8 [g2,b4]@8 f#2@4 [b2,d#4] ~@3, e4@19 ~@5, g4@16 [f#4,a4]@5 ~@3]/6", H: "[[e2,e4], [g4,b4]@15 ~]/4",
  I: "[d2,d4,f#4,a4]", J: "[e2,e4,g4,b4]/4", K: "[d2,d4,f#4,a4]/2", L: "[e2,e4,g4,b4]/2", M: "[d2,e4,f#4,a4]/2",
  N: "[[e2,e4,g4,b4]@7 ~]/2", O: "[[e2,g4,b4,d5,f#5]@7 ~]/2", P: "[f#5 d5, [e2,g4,b4]]/2",
  Q: "[[g3,b3]@2 a#3@2 [e3,a3] [b2,d#3,b3], e2@5 ~, e3@2 ~, ~ f#3@2]/6", R: "[[e2,e3,g3,b3]@63 ~]/4",
})).s("gm_synth_strings_1").gain(0.22)

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

// drums · rim
const rim = s("rim").struct("<~@55 A B A B A B A B ~@44>".pickRestart({
  A: "x ~@5 x!3 ~ x ~@5", B: "x ~@2 x ~@2 x!3 ~ x ~@5",
})).gain(0.56)

// drums · snare
const snare = s("sd").struct("<~@4 A B C D@28 ~ D@18 ~ D@21 ~@7 D@18 ~@6>".pickRestart({
  A: "x!4", B: "x ~@3 x!5 ~ x ~ x ~@2 x", C: "x!2 ~ x", D: "~ x ~ x",
})).gain(0.64)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<A B A B C D ~@96 A B A B E>".pickRestart({
  A: "x ~@3 x ~ x!3 ~@3 x ~ x!2", B: "x ~@3 x!5 ~ x ~ x ~ x!2", C: "~@6 x!2 ~@6 x!2", D: "~@7 x", E: "x",
})).gain(0.32)

// drums · clap
const clap = s("cp").struct("<~@6 A@29 ~ A@18 ~ A@21 ~@7 A@18 ~@6>".pickRestart({
  A: "~ x ~ x",
})).gain(0.48)

// drums · hihat
const hihat = s("hh").struct("<~@6 A@29 B A@18 B A@21 B ~@6 A@18 B ~@5>".pickRestart({
  A: "x!16", B: "x",
})).gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@6 A B A B A B A 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 B A B A B A B A B ~@9 B A B A B A B
  A B A B A B ~@7 B A B A B A B A B A B A B A B A B A ~@6
>`.pickRestart({
  A: "x ~@3 x!2 ~@2", B: "x ~@2 x ~@4 x ~ x ~@5",
})).gain(0.48)

// drums · high tom
const high_tom = s("ht").struct("<~@6 A@29 ~ A@18 ~@9 A@13 ~@7 A@18 ~@6>".pickRestart({
  A: "~@6 x!2 ~@6 x!2",
})).gain(0.56)

// drums · tambourine
const tambourine = s("tb").struct("<~@36 A@18 B ~@16 A@5 B ~@6 A@18 B ~@5>".pickRestart({
  A: "x!16", B: "x",
})).gain(0.48)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@55 [x!16]!16 ~@36>").gain(2.03)

// drums · jingle bells
const jingle_bells = s("sleighbells:4").struct("<~@36 A@18 B ~@16 A@5 B ~@6 A@18 B ~@5>".pickRestart({
  A: "x!4", B: "x",
})).gain(1.38)

stack(
  overdriven_guitar, bass, synth_strings_1, kick, rim, snare, snare_soft, clap, hihat, mid_tom, high_tom, tambourine,
  cabasa, jingle_bells
)

More by Enigma