Strudelify

The Spirit

Centory

KeyE majorTempo119 bpm
0:00/0:00
// The Spirit — Centory
// 119 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 99 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(119/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(`<
  ~@12 A B A B A B A B A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A D ~@4 A B A B A B A C A B A
  C A B A C A B A C A B A C A B A C A B A C A B A C E F@2
>`.pickRestart({
  A: "e2 ~ e2 ~ b1@3 e2 ~ e2 ~ e2 f2@2 d2@2", B: "e2 ~ e2 ~@2 b1@2 e2 ~ e2 ~ e2 f2@2 d2@2",
  C: "d2 ~ d2 ~@2 a1@2 d2 ~ d2 ~ d2 e2@2 f2@2", D: "d2@2 ~ a1@2 ~ d2 ~ e2@2 ~ d2@2 ~ a1@2", E: "f2", F: "[e2@5 ~@3]/2",
})).s("gm_synth_bass_1").gain(0.39)

// chords · pad warm · "WARM PAD"
const pad_warm = note(`<
  ~@24 A@3 B A@3 B C@3 D E@3 F G@3 F C@3 D C@3 D C@3 H ~@8 A@3 B A@3 B C@3 D C@3 D C@3 D C@3 D C@3 D C@3 D I J ~
>`.pickRestart({
  A: "[e3,b3,e4]/3", B: "f4 f3, [a3,d4]", C: "[b4@11 c5, [e3,b3,e4]]/3", D: "f4 f3, [a3,d4,a4]",
  E: "[b5@12 c6@2 a5@2 b5@15 ~ b5@12 [c5,c6]@4, [e3,b3,e4], b4@11 ~]/3", F: "[f4,a5] [f3,e6], [a3,d4,a4]",
  G: "[b5@12 c6@2 d6@2 b5@15 ~ b5@12 [c5,c6]@4, [e3,b3,e4], b4@11 ~]/3", H: "[d3,a3,d4,f4,a4] ~@7",
  I: "~ [d6,d7]@14 ~, [f3,a3,d4]@15 ~", J: "[e3,g#3,b3] ~@15, [e6,e7] ~@7",
})).s("gm_pad_warm").gain(0.12)

// chords · lead 5 charang · "CHARANG"
const lead_5_charang = note(`<
  ~@24 A B C D A B ~@14 A B C D A B C D A B C E ~@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 F G ~
>`.pickRestart({
  A: "[b2,e3] ~@5 [b2,e3] ~@3 [b2,e3] ~ [c3,f3] [a2,d3]@3", B: "[b2,e3] ~@5 [b2,e3] ~@9",
  C: "[b2,e3] ~@5 [b2,e3] ~@3 [b2,e3] ~ [b2,e3] [c3,f3]@3", D: "[a2,d3] ~@5 [a2,d3] ~@9", E: "[a2,d3] ~@15",
  F: "[d2,a2]", G: "[e2,b2] ~@7",
})).s("gm_lead_5_charang").gain(0.41).pan(0.7)

// other · flute
const flute = note("<~ A@2 ~@24 B C D E F ~@4 G H I J K H I J ~@55>".pickRestart({
  A: "[~@7 b5@5 e6 b5 [b5,e6] e6@17]/2", B: "~@7 e6", C: "b6@3 a6 g#6@3 f6", D: "e6@3 f6 g#6@3 a6",
  E: "b6@3 a6 g#6@3 a6", F: "b6@4 c7@3 a6@2 ~@7", G: "b5@6 c6 a5", H: "b5@15 ~", I: "b5@3 c6", J: "a5 e6",
  K: "b5@6 c6 d6",
})).s("gm_flute").gain(0.23)

// other · lead 1 square · "SQUAREWAVE"
const lead_1_square = note("<A@12 B ~@43 C@4 ~@39>".pickRestart({
  A: "[e2,e3]/4", B: "e2 ~@15", C: "[e1,e2]/4",
})).s("gm_lead_1_square").gain(0.06)

// other · sitar
const sitar = note("<~@2 A B@2 C D E ~@91>".pickRestart({
  A: "~@14 e3 b3", B: "[e4@2 e4@8 b3@11 ~@11]/2", C: "~@5 e4 g#4 a4", D: "b4@6 ~@9 [b3,e4]",
  E: "c5@3 [b3,e4] a4@3 [b3,e4] b4@6 ~@2", // E5
})).s("gm_sitar").gain(0.27).pan(0.2)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@80 A B C D A B C D ~@3 E F@3 G H I ~>".pickRestart({
  A: "[e5,g#5] [f5,a5] [e5,g#5] [c5,f5] [b4,e5]@8 [c5,f5]@2 [a4,d5]@2", B: "[b4,e5]",
  C: "[e5,g#5] [f5,a5] [e5,g#5] [c5,f5] [b4,e5]@8 [c5,f5]@4", D: "[a4,d5] [e5,a5]",
  E: "~@10 [d4,d5] [e4,e5] [f4,f5] [g#4,g#5] [a4,a5] [a#4,a#5]", F: "[[b4,b5] b5@23]/3",
  G: "~@8 [e4,e5,e6] [d4,d5,d6] [e4,e5,e6] [f4,f5,f6] [g4,a4,g5,a5,g6,a6] [b4,b5,b6] [c5,c6,c7] [d5,d6,d7]", // E D E F Gsus2 B C D
  H: "[e5,e6,e7]@11 [c5,c6,c7] [b4,b5,b6] [a4,a5,a6] [g4,g5,g6] [f4,f5,f6]", I: "[e4,e5,e6] ~@15",
})).s("gm_string_ensemble_1").gain(0.23).pan(0.2)

// other · taiko drum · "TAIKO"
const taiko_drum = note("<~@8 [f#3 ~ f#3 ~@7 f#3 ~ f#3 ~@3]!3 [f#3 ~ f#3 ~@5 f#3 ~ f#3 ~@5] ~@87>")
  .s("gm_taiko_drum").gain(0.29).pan(0.2)

// drums · kick
const kick = s("bd").struct("<~@16 A@39 B C ~@3 A@35 D C@2 ~>".pickRestart({
  A: "x!4", B: "x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~", C: "x", D: "x!3 ~",
})).gain(0.51)

// drums · clap
const clap = s("cp").struct("<~@24 [~ x ~ x]!31 ~@5 [~ x ~ x]!36 ~@3>").gain(0.4)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@24 A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~@9 A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ B ~@2
>`.pickRestart({
  A: "~@15 x", B: "~@13 x!2 ~",
})).gain(0.25)

// drums · hihat
const hihat = s("hh").struct("<~@16 A B A B A B A B C@31 ~ C@40 ~@3>".pickRestart({
  A: "x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~", B: "x ~@2 x ~ x!2 ~ x ~@2 x ~@2 x ~", C: "x!2 ~ x!3 ~ x!3 ~ x!3 ~ x",
})).gain(0.25)

// drums · low tom
const low_tom = s("lt").struct("<A B C D E F G H ~@47 I J K L M I N O P ~@35>".pickRestart({
  A: "~@13 x!3", B: "x!2 ~@5 x!7 ~ x", C: "~@8 x!8", D: "x!3 ~ x ~@2 x!9", E: "~ x ~ x!13", F: "x!5 ~ x!10", G: "x!16",
  H: "x!3 ~ x!12", I: "~@7 x", J: "~@13 x!2 ~", K: "x!2 ~ x!3 ~ x!2 ~ x!2 ~ x!2 ~", L: "~@7 x!2 ~ x!2 ~ x!2 ~",
  M: "x!2 ~ x!3 ~ x!2 ~ x!2 ~ x ~@2", N: "x!2 ~ x!3 ~ x!2 ~ x!2 ~ x!3", O: "~ x!2 ~@4 x!2 ~ x!2 ~ x!2 ~",
  P: "x!2 ~ x!3 ~ x!2 ~ x!2 ~@4",
})).gain(0.15)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<A B C ~@5 D ~@47 E F G H I ~ J K ~@35>".pickRestart({
  A: "~@5 x!2 ~", B: "~@2 x!5 ~@9", C: "x!8 ~@8", D: "x", E: "~@11 x ~@4", F: "~@15 x", G: "~ x!2 ~ x!2 ~@10",
  H: "~@7 x", I: "~@11 x ~ x ~@2", J: "~@4 x!2 ~@10", K: "~@13 x!2 ~",
})).gain(0.1)

// drums · mid tom
const mid_tom = s("mt").struct("<~@16 A@8 ~@24 B C B@3 C B D ~@32 B C B@3 C B@2 ~@3>".pickRestart({
  A: "~@3 x ~@3 x", B: "~@9 x!6 ~", C: "~@9 x ~ x!4 ~", D: "~@6 x ~ x ~@2 x ~@4",
})).gain(0.25)

// drums · open hat
const open_hat = s("oh").struct("<~@24 [~ x ~ x ~ x ~ x]!31 ~ [~ x ~ x ~ x ~ x]!40 ~@3>").gain(0.25)

// drums · high tom
const high_tom = s("ht").struct("<~@16 A@8 ~@24 B C@2 D B C@2 E ~@32 B C@2 D B C@2 D ~@3>".pickRestart({
  A: "x!2", B: "x ~ x ~ x!2 ~ x!2 ~@7", C: "x ~ x ~@2 x ~ x!2 ~@7", D: "x ~ x ~ x!5 ~@7", E: "x ~@2 x ~@12",
})).gain(0.3)

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

// drums · cowbell
const cowbell = s("cb").struct("<~@32 A B A C A B A C A B A C A B A C D@7 ~@9 D@32 ~@3>".pickRestart({
  A: "x ~ x!2 ~ x!2 ~@2 x ~ x!2 ~ x!2", B: "x ~ x!2 ~@2 x ~@2 x ~ x!2 ~ x!2", C: "x ~ x!2 ~ x ~ x ~@2 x ~ x ~ x!2",
  D: "x!2 ~ x ~@3 x ~ x ~ x ~ x ~@2",
})).gain(0.3)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@3 [~ x ~@6] ~@54 [~ x] ~@40>").gain(3.57)

// drums · ride
const ride = s("rd").struct("<~@24 A@31 ~ B C B D B C B D A@32 ~@3>".pickRestart({
  A: "x!16", B: "x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~", C: "x ~@2 x ~@2 x ~ x ~ x!2 ~ x!2 ~", D: "x ~@2 x ~ x!2 ~ x ~ x!5 ~",
})).gain(0.2)

// drums · bongos
const bongos = s("bongo:4").struct("<~@16 [~@6 x!2]!8 ~@75>").gain(1.2)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@16 [~@4 x!2 ~@2]!8 ~@75>").gain(1.2)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@8
  [~@2 x ~@4 x]!3
  [~ x ~ x]
  ~@36
  [~@4 x ~ x!2 ~@5 x ~@2]!7
  ~@17
  [~@4 x ~ x!2 ~@5 x ~@2]!24
  ~@3
>`).gain(1.13)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~@48
  [x ~ x ~@2 x ~@4 x!2 ~@2 x ~]!7
  ~@17
  [x ~ x ~@2 x ~@4 x!2 ~@2 x ~]!24
  ~@3
>`).gain(1.13)

// drums · congas · soft notes
const congas_soft = s("conga:18").struct("<~@48 [~ x ~@14]!7 ~@17 [~ x ~@14]!24 ~@3>").gain(0.65)

// drums · shaker
const shaker = s("sh").struct("<A B C D E F G H ~@48 I J K L M N O P ~@35>".pickRestart({
  A: "~@13 x!3", B: "x!2 ~@5 x!7 ~ x", C: "~@8 x!8", D: "x!3 ~ x ~@2 x!9", E: "~ x ~ x!13", F: "x!5 ~ x!10", G: "x!16",
  H: "x!3 ~ x!12", I: "~@13 x!2 ~", J: "x!2 ~ x!3 ~ x!2 ~ x!2 ~ x!2 ~", K: "~@7 x!2 ~ x!2 ~ x!2 ~",
  L: "x!2 ~ x!3 ~ x!2 ~ x!2 ~ x ~@2", M: "~@7 x", N: "x!2 ~ x!3 ~ x!2 ~ x!2 ~ x!3", O: "~ x!2 ~@4 x!2 ~ x!2 ~ x!2 ~",
  P: "x!2 ~ x!3 ~ x!2 ~ x!2 ~@4",
})).gain(0.15)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<A B C ~@5 D ~@47 E F G H I ~ J K ~@35>".pickRestart({
  A: "~@5 x!2 ~", B: "~@2 x!5 ~@9", C: "x!8 ~@8", D: "x", E: "~@11 x ~@4", F: "~@15 x", G: "~ x!2 ~ x!2 ~@10",
  H: "~@7 x", I: "~@11 x ~ x ~@2", J: "~@4 x!2 ~@10", K: "~@13 x!2 ~",
})).gain(0.1)

stack(
  bass, pad_warm, lead_5_charang, flute, lead_1_square, sitar, string_ensemble_1, taiko_drum, kick, clap, snare,
  snare_soft, hihat, low_tom, low_tom_soft, mid_tom, open_hat, high_tom, crash, cowbell, vibraslap, ride, bongos,
  bongos_2, congas, congas_2, congas_soft, shaker, shaker_soft
)

More by Centory