Strudelify

December

Collective Soul

KeyG majorTempo120 bpm
0:00/0:00
// December — Collective Soul
// 120 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 143 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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.

// chords · electric guitar clean · "Guitar I"
const electric_guitar_clean = note(`<
  A B C D A B C D A B C D A B C D A B C D A B C D ~@8 E F G H E F G H A B C D A B C D A B C D A B C D A B C D A B C D
  ~@16 E F G H E F G H ~@8 A B C D A B C D ~@8 E F G H E F G H E F G H E F G H E F G H E F G H A B C I@4
>`.pickRestart({
  A: "~ g3 d4 g3 d4 g4 d4 g3, g2 ~", B: "~ g3 d4 g3 d4 g4 d4 g3, f2 ~", C: "~ g3 d4 g3 d4 g4 d4 g3, c3 ~",
  D: "~ g3 d4 g3 ~ g3 ~ g3, a#2@2 a#2 b2", E: "[d4,g4] ~@3 [d4,g4] ~@3 [d4,g4]@2 [d4,a4]@2 [d4,g4]@2 [b3,e4]@2",
  F: "[c4,f4] ~@3 [c4,f4] ~@3 [c4,f4]@2 [c4,g4]@2 [c4,f4]@2 [b3,e4]@2", // F5 C5 F5 E5
  G: "[c4,e4] ~@3 [c4,e4] ~@3 [c4,e4]@2 e4@2 [c4,e4]@2 [g3,b3]@2", // C G
  H: "[a#3,d4] ~@3 [a#3,d4] ~@3 [a#3,d4]@2 d4@2 [b3,d4]@2 g3@2", // A# Bm
  I: "[~@2 g3@2 d4@2 ~ g3@2 ~@2 g3@2 ~@3 g3@3 ~@3 g4@32 ~@10, a#2@9 a#2@5 b2@5 g2@35 ~@10, ~@20 [d3,g3]@35 ~@9, ~@21 d4@33 ~@10]/4", // G5
})).s("gm_electric_guitar_clean").gain(0.36)

// chords · electric guitar muted · "Guitar I"
const electric_guitar_muted = note("<~@88 A B C ~ A B C ~@48>".pickRestart({
  A: "[g3,b3] g3!2 [g3,b3] g3!2 [g3,b3] g3", B: "[g3,b3] g3!2 [g3,b3] g3!2 [g3,b3] e3",
  C: "[c3,g3] c3!2 [c3,g3] c3!2 [c3,g3] c3", // C5
})).s("gm_electric_guitar_muted").gain(0.24)

// other · distortion guitar · "Guitar I"
const distortion_guitar = note("<~@91 [~@2 a#3!4 b3 g3] ~@3 [~@2 a#3!4 b3 g3] ~@47>")
  .s("gm_distortion_guitar").gain(0.42)

// other · distortion guitar · "Guitar I" · soft notes
const distortion_guitar_soft = note("<~@91 [a#3!2 ~@6] ~@3 [a#3!2 ~@6] ~@47>").s("gm_distortion_guitar").gain(0.24)

// chords · acoustic guitar nylon · "Guitar II"
const acoustic_guitar_nylon = note(`<
  ~@24 A B C D A B C D A B C D A B C D ~@24 A B C D A B C D A B C D A B C D A B C D A B C D ~@16 A B C D A B C D A B C D
  A B C D A B C D A B C D A B C D A B C D ~@7
>`.pickRestart({
  A: "[g3,d4,g4,d5,g5]!3 [g3,d4,g4,d5,g5]@2 [g3,d4,g4,d5,g5]@2 [g3,d4,g4,d5,g5]", // G5
  B: "[f3,d4,g4,d5,g5]!3 [f3,d4,g4,d5,g5]@2 [f3,d4,g4,d5,g5]@2 [f3,d4,g4,d5,g5]", // G7
  C: "[c4,d4,g4,d5,g5]!3 [c4,d4,g4,d5,g5]@2 [c4,d4,g4,d5,g5]@2 [c4,d4,g4,d5,g5]", // Csus2
  D: "[a#3,d4,g4,d5,g5]!3 [a#3,d4,g4,d5,g5]@2 a#3 b3 [b3,d4,g4,d5,g5], ~@5 [d4,g4,d5,g5]@2 ~", // Gm G G5
})).s("gm_acoustic_guitar_nylon").gain(0.25)

// chords · electric guitar muted · "Guitar II"
const electric_guitar_muted_2 = note("<~@96 A B C ~ A B C ~@40>".pickRestart({
  A: "[g3,b3] g3!2 [g3,b3] g3!2 [g3,b3] g3", B: "[g3,b3] g3!2 [g3,b3] g3!2 [g3,b3] e3",
  C: "[c3,g3] c3!2 [c3,g3] c3!2 [c3,g3] c3", // C5
})).s("gm_electric_guitar_muted").gain(0.11)

// other · distortion guitar · "Guitar II"
const distortion_guitar_2 = note("<~@99 [~@2 a#3!4 b3 g3] ~@3 [~@2 a#3!4 b3 g3] ~@39>")
  .s("gm_distortion_guitar").gain(0.2)

// other · distortion guitar · "Guitar II" · soft notes
const distortion_guitar_soft_2 = note("<~@99 [a#3!2 ~@6] ~@3 [a#3!2 ~@6] ~@39>").s("gm_distortion_guitar").gain(0.11)

// bass · electric bass finger · "Bass"
const bass = note(`<
  A B C D A B C D A B C D A B C D A B C D A B C D E F G H E F G H E F G H E F G H A B C D A B C D A B C D A B C D A B C
  D A B C D E F G H E F G H E F G H E F G H E F G H E F G H ~@8 I J K L I J K L E F G H E F G H E F G H E F G H E F G H
  E F G H E F G H E F G H A B C M@4
>`.pickRestart({
  A: "g1@15 ~", B: "f1@15 ~", C: "c2@15 ~", D: "a#1@7 ~ a#1@3 ~ b1@3 ~", E: "g1!7 e1", F: "f1!7 e1", G: "c2!7 g1",
  H: "a#1!6 b1!2", I: "g1@11 ~ g2@3 ~", J: "f2@11 ~ g2@3 ~", K: "e2@15 ~", L: "a#1@11 ~ b1@3 ~",
  M: "[a#1@8 ~ a#1@4 ~ b1@4 ~ g1@35 ~@10]/4",
})).s("gm_electric_bass_finger").gain(0.54)

// other · string ensemble 1 · "Strings"
const string_ensemble_1 = note("<~@80 [~@2 g5 ~ g5@2 ~@4 g5 ~ g5@2 ~@2]!8 ~@55>").s("gm_string_ensemble_1").gain(0.18)

// other · string ensemble 1 · "Strings" · soft notes
const string_ensemble_1_soft = note("<~@64 A B C ~ A B C ~ A B C ~ A B C ~@21 D E C ~@40>".pickRestart({
  A: "g3@15 ~", B: "f3@15 ~", C: "e3@15 ~", D: "g2@11 ~ g3@3 ~", E: "f3@11 ~ g3@3 ~",
})).s("gm_string_ensemble_1").gain(0.11)

// chords · tremolo strings · "Strings"
const tremolo_strings = note("<~@100 A@3 B C D E F C D E F C D E F C D E G ~@23>".pickRestart({
  A: "~@4 [d5,d6] ~@7 [d5,d6] ~@3", B: "[d5,d6] ~@3 [d5,d6] ~@3 [d5,d6]!3 ~ [d5,d6]!3 ~",
  C: "~@2 [b4,d5] ~ [b4,d5] ~ [b4,d5] ~@3 [b4,d5] ~ [b4,d5] ~ [b4,d5] ~", // Bm
  D: "~@2 [a4,d5] ~ [a4,d5] ~ [a4,d5] ~@3 [a4,d5] ~ [a4,d5] ~ [a4,d5] ~", // D5
  E: "~@2 [c5,d5] ~ [c5,d5] ~ [c5,d5] ~@3 [c5,d5] ~ [c5,d5] ~ [c5,d5] ~", // Csus2
  F: "~@2 [a#4,d5] ~ [a#4,d5] ~ [a#4,d5]@3 ~ [a#4,d5] ~ [b4,d5] ~ [b4,d5] ~", // A# Bm
  G: "~@2 [a#4,a#5] ~ [g4,g5]@2 [d4,d5]@2 [a#4,a#5]@2 [b4,b5] ~@5", // A# G D A# B
})).s("gm_tremolo_strings").gain(0.14)

// chords · tremolo strings · "Strings" · soft notes
const tremolo_strings_soft = note("<~@120 A B C D A B C D E F G H I J K L ~@7>".pickRestart({
  A: "[g4,g5]@15 ~", B: "[a4,a5]@15 ~", C: "[a#4,a#5]@15 ~", D: "[f4,f5]@11 ~ [f#4,f#5]@3 ~",
  E: "[b4,b5]@7 ~ [g4,g5]@7 ~", F: "[c4,c5]@7 ~ [g4,g5]@7 ~", G: "[e4,e5]@7 ~ [e4,e5]@7 ~",
  H: "[f4,f5]@7 ~ [f4,f5]@3 ~ [f#4,f#5]@3 ~", I: "[b4,b5] ~ [b4,b5] ~ [g4,g5] ~ [g4,g5] ~",
  J: "[c4,c5] ~ [c4,c5] ~ [g4,g5] ~ [g4,g5] ~", K: "[e4,e5] ~ [e4,e5] ~ [e4,e5] ~ [e4,e5] ~",
  L: "~@2 [a#4,a#5] ~ [g4,g5]@2 [d4,d5]@2 [a#4,a#5]@2 [b4,b5] ~@5", // A# G D A# B
})).s("gm_tremolo_strings").gain(0.09)

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

// drums · snare
const snare = s("sd").struct("<~@23 A B@15 C ~@23 D B@15 C B@7 C ~@9 A@3 B@3 E B@15 F B@15 G ~@7>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@4 x ~@7 x!3 ~", D: "~@8 x!3 ~ x!3 ~", E: "x ~@3 x ~@3 x!3 ~ x!3 ~",
  F: "~@4 x ~@5 x ~ x!4", G: "~@4 x ~@7 x!4",
})).gain(0.54)

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

// drums · low tom
const low_tom = s("lt").struct("<~@47 [~@7 x] x ~@6 [~@7 x] x ~@86>").gain(0.6)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@47 [~@5 x!2 ~] ~@7 [~@5 x!2 ~] ~@87>").gain(0.36)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@28 A ~@3 A ~@3 A ~@31 A ~@3 A ~@3 A ~@7 A ~@13 A@2 ~ A@2 ~@5 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@10
>`.pickRestart({
  A: "x",
})).gain(0.54)

// drums · tambourine
const tambourine = s("tb").struct("<~@104 [~ x ~ x]!16 [x!16]!16 ~@7>").gain(0.42)

// drums · crash
const crash = s("cr").struct("<~@40 A ~@39 A ~@7 A ~@15 A ~@15 A ~@15 A ~@6>".pickRestart({
  A: "x",
})).gain(0.54)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@40 A@4 B A@7 B A@7 B A@3 ~@32 A@8 B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C ~@7
>`.pickRestart({
  A: "~ x ~@2", B: "~@3 x!2 ~@11", C: "~@3 x!2 ~@5 x ~@5",
})).gain(1.73)

// drums · congas
const congas_2 = s("conga:18").struct("<~@40 [~@5 x!2 ~]!23 ~@33 [~@5 x!2 ~]!7 ~@40>").gain(1.73)

// drums · congas
const congas_3 = s("conga:33").struct(`<
  ~@40 A B A B A B A B A B A B A B A B A B A B A B A C ~@32 A B A B A B A C A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B
  A@3 B ~@7
>`.pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "x ~@2 x!2 ~@3", C: "x ~@2 x ~@4",
})).gain(1.73)

stack(
  electric_guitar_clean, electric_guitar_muted, distortion_guitar, distortion_guitar_soft, acoustic_guitar_nylon,
  electric_guitar_muted_2, distortion_guitar_2, distortion_guitar_soft_2, bass, string_ensemble_1,
  string_ensemble_1_soft, tremolo_strings, tremolo_strings_soft, kick, snare, hihat, low_tom, low_tom_soft, open_hat,
  tambourine, crash, congas, congas_2, congas_3
)

More by Collective Soul