Strudelify

Celebrate (The Love)

Zhi-Vago

KeyC♯ minorTempo135 bpm
0:00/0:00
// Celebrate (The Love) — Zhi-Vago
// 135 bpm, 4/4, key C# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 140 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(135/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
const bass = note(`<
  ~@18 A@2 B A@3 C D A@2 C D A@2 C D A@2 C D ~ A@2 C D A@2 C D A@2 C D A@2 C D A@2 C D A@2 C D A@2 B A@3 B A@3 B A@3 B
  A@3 C D A@2 C D A@2 C D A@2 C D ~@19 A@2 C D A@2 C D A@2 C D A@2 C D A@2 C D A@2 C D ~@2
>`.pickRestart({
  A: "~@2 [c#2,c#3] ~@3 [c#2,c#3] ~@3 [c#2,c#3] ~@3 [c#2,c#3] ~", // C#
  B: "[c#2,c#3] ~ [c#2,c#3] ~@3 [c#2,c#3] ~@3 [c#2,c#3] ~@3 [c#2,c#3] ~", // C#
  C: "~@2 [a1,a2] ~@3 [a1,a2] ~@3 [a1,a2] ~@3 [a1,a2] ~", // A
  D: "~@2 [f#1,f#2] ~@3 [f#1,f#2] ~@3 [f#1,f#2] ~@3 [f#1,f#2] ~", // F#
})).s("gm_synth_bass_1").gain(0.36)

// chords · piano
const piano = note(`<
  ~ A B C D A B C D A B C D A B E F ~@21 A B C D A B C D A B C D A B E F A B C D A B E F ~@16 A B C D A B C D A B C D A
  B E F ~@19 A B C D A B C D A B C D A B E F A B C D A B E F ~@3
>`.pickRestart({
  A: "~@12 d#5 e5 f#5 g#5", B: "[d#5,e5] e5 f#5 g#5 e5!2 f#5 g#5 e5!2 f#5 g#5 e5 ~ g#4 ~",
  C: "[d#5,e5] ~ g#4 ~ d#5 ~ g#4 ~ d#5 ~ g#4 ~ d#5 e5 [g#4,f#5] g#5", // Emaj7 G#7
  D: "d#5 e5 f#5 g#5 d#5 e5 f#5 g#5 d#5 e5 f#5 g#5 c#5@2 ~@2, c#5 ~ c#5 ~ c#5 ~@3",
  E: "[d#5,e5] ~ g#4 ~ d#5 ~ g#4 ~ d#5 ~ g#4 ~ [g#4,d#5] a4 [g#4,b4] ~", // Emaj7 G#5 G#m
  F: "[g#4,c#5] a4 b4 ~ [g#4,c#5] a4 b4 ~ [g#4,c#5] a4 b4 ~ [g#4,c#5] ~@3", // C#5
})).s("gm_piano").gain(0.4)

// chords · piano · soft notes
const piano_soft = note(`<
  ~@2 A B C D A B C D A B C D A B E F ~@21 A B C D A B C D A B C D A B E F A B C D A B E F ~@16 A B C D A B C D A B C D
  A B E F ~@19 A B C D A B C D A B C D A B E F A B C D A B E F ~@2
>`.pickRestart({
  A: "~@13 e5 f#5 g#5", B: "~ e5 f#5 g#5 ~ e5 f#5 g#5 e5 ~@7", C: "~@2 g#4 ~@3 g#4 ~@5 d#5 e5 f#5 g#5",
  D: "d#5 e5 f#5 g#5 d#5 e5 f#5 g#5 c#5@2 ~@6, c#5 ~ c#5 ~@5", E: "d#5 ~ g#4 ~ d#5 ~ g#4 ~@6 a4 b4 ~", F: "c#5 ~@15",
})).s("gm_piano").gain(0.08)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@2 A B C D A B E F A B C D A B E F ~@4 G@2 ~@2 H@2 ~@2 A B C D A B E F ~ A B C D A B E F A B C D A B E F A B C D A B
  E F ~@16 A B C D A B E F A B C D A B E F ~@2 A I C D A B E F A B C D A B E F ~ J@8 K@8 L@8 ~@2
>`.pickRestart({
  A: "[g#3,c#4,e4]", B: "[g#3,c#4,d#4]", C: "[a3,b3,e4]", D: "[a3,c#4,f#4]", E: "[e3,a3,b3]", F: "[f#3,a3,c#4]",
  G: "[e5@31 ~]/2", H: "[c#2@15 ~]/2", I: "[g#3,c#4,d#4]@15 ~",
  J: "[[g#3,c#4,e4]@15 [g#3,c#4,d#4]@16 [a3,b3,e4]@16 [a3,c#4,f#4]@16 [g#3,c#4,e4]@16 [g#3,c#4,d#4]@16 [e3,a3,b3]@16 [f#3,a3,c#4]@16 [g#3,c#4,e4]]/8", // C#m G#sus4 Asus2 F#m C#m G#sus4 Esus4 F#m …
  K: "[~@15 [g#3,c#4,d#4]@16 [a3,b3,e4]@16 [a3,c#4,f#4]@16 [g#3,c#4,e4]@16 [g#3,c#4,d#4]@16 [e3,a3,b3]@16 [f#3,a3,c#4]@16 [g#3,c#4,e4]]/8", // G#sus4 Asus2 F#m C#m G#sus4 Esus4 F#m C#m
  L: "[~@15 [g#3,c#4,d#4]@16 [a3,b3,e4]@16 [a3,c#4,f#4]@16 [g#3,c#4,e4]@16 [g#3,c#4,d#4]@16 [e3,a3,b3]@16 [f#3,a3,c#4]@16 ~]/8", // G#sus4 Asus2 F#m C#m G#sus4 Esus4 F#m
})).s("gm_synth_strings_1").gain(0.2).pan(0.4)

// other · string ensemble 2
const string_ensemble_2 = note(`<
  ~@10 A B C B A D E F ~@21 G H I J G K L M G H I J G K L M G H I N G K L M ~@12 O P Q R G H I J G K L M G H I J G K L M
  ~@6 G H I J ~@9 S@3 T@16 U@5 ~@2
>`.pickRestart({
  A: "[g#3,c#4,e4]", B: "[b3,c#4,d#4,f#4]", C: "[c#4,e4,g#4]", D: "[g#3,b3,d#4]", E: "[e3,a3,b3]", F: "[f#3,a3,c#4]",
  G: "e5", H: "f#5", I: "g#5", J: "e5 d#5", K: "d#5", L: "b4", M: "c#5", N: "e5 f#5", O: "e4", P: "f#4", Q: "g#4",
  R: "c#4", S: "[e5@15 f#5@16 g#5@16 e5]/3", T: "[~@7 d#5@8 e5@16 d#5@16 b4@16 c#5@16 e5@16 f#5@16 g#5@16 e5]/8",
  U: "[~@7 f#5@8 e5@16 d#5@16 b4@16 c#5@16 ~]/5",
})).s("gm_string_ensemble_2").gain(0.26)

// chords · harmonica
const harmonica = note(`<
  ~@47 A B C D A B E F A B C D A B E F ~@24 A B C D A B E F ~@10 A B C D A B E F ~@9 A B C D A B E F A B C D A B E F ~@2
>`.pickRestart({
  A: "~@2 [g#3,c#4,e4] ~@3 [g#3,c#4,e4] ~@3 [g#3,c#4,e4] ~@3 [g#3,c#4,e4] ~", // C#m
  B: "~@2 [g#3,c#4,d#4] ~@3 [g#3,c#4,d#4] ~@3 [g#3,c#4,d#4] ~@3 [g#3,c#4,d#4] ~", // G#sus4
  C: "~@2 [a3,c#4,e4] ~@3 [a3,c#4,e4] ~@3 [a3,c#4,e4] ~@3 [a3,c#4,e4] ~", // A
  D: "~@2 [a3,c#4,f#4] ~@3 [a3,c#4,f#4] ~@3 [a3,c#4,f#4] ~@3 [a3,c#4,f#4] ~", // F#m
  E: "~@2 [e3,a3,b3] ~@3 [e3,a3,b3] ~@3 [e3,a3,b3] ~@3 [e3,a3,b3] ~", // Esus4
  F: "~@2 [f#3,a3,c#4] ~@3 [f#3,a3,c#4] ~@3 [f#3,a3,c#4] ~@3 [f#3,a3,c#4] ~", // F#m
})).s("gm_harmonica").gain(0.13).pan(0.6)

// other · lead 2 sawtooth
const lead_2_sawtooth = note(`<
  ~@55
  [g#3 c#4 d#4 e4 g#3 c#4 d#4 e4 g#3 c#4 d#4 e4 g#3 c#4 d#4 e4]!8
  ~@24
  [g#3 c#4 d#4 e4 g#3 c#4 d#4 e4 g#3 c#4 d#4 e4 g#3 c#4 d#4 e4]!9
  ~@34
  [g#3 c#4 d#4 e4 g#3 c#4 d#4 e4 g#3 c#4 d#4 e4 g#3 c#4 d#4 e4]!9
  ~
>`).s("gm_lead_2_sawtooth").gain(0.29).pan(0.4)

// other · pad sweep
const pad_sweep = note(`<
  ~@11 A ~@3 A ~@24 A ~@3 A ~@3 A ~@3 A ~@27 A ~@3 A ~@30 A ~@3 A ~@3 A ~@3 A ~@12
>`.pickRestart({
  A: "d#4",
})).s("gm_pad_sweep").gain(0.35).pan(0.6)

// other · percussive organ
const percussive_organ = note(`<
  ~@2 A@2 B C A@2 B C A@2 B C A@2 B C ~@12 A@2 B C A@2 B C ~ A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C ~@16 A@2 B
  C A@2 B C A@2 B C A@2 B C ~@2 A@2 B C A@2 B C A@2 B C A@2 B C ~ A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C ~@2
>`.pickRestart({
  A: "[c#3@3 e3]/2", B: "a2", C: "f#2",
})).s("gm_percussive_organ").gain(0.26).pan(0.4)

// chords · lead 5 charang
const lead_5_charang = note("<~@38 A ~@28 B ~ B ~ B ~ B ~ B ~ B A ~@34 A ~@26>".pickRestart({
  A: "~@5 b3@3", B: "~@7 [c#3,e3]@3 ~@6",
})).s("gm_lead_5_charang").gain(0.29).pan(0.6)

// other · lead 1 square
const lead_1_square = note("<~@60 A@5 ~@27 A@5 ~@38 A@5>".pickRestart({
  A: "[~@3 d#1@2 d#3 c4@4 c#5@9 ~]/5",
})).s("gm_lead_1_square").gain(0.4)

// other · string ensemble 1
const string_ensemble_1 = note("<~@55 A@2 B C A@2 B C ~@3 D E ~@6 D E ~@19 D E ~@33 A@2 B C A@2 B C ~@2>".pickRestart({
  A: "~ g#4 d#5 g#4 e5 g#4 d#5 g#4", B: "~ g#4 d#5 g#4 e5 g#4 d#5 a4", C: "~ a4 e5 a4 f#5 a4 e5 d#5",
  D: "~@2 g#3 ~ d#4@2 g#3 ~ e4@2 g#3 ~ d#4@2 g#3 ~", E: "e4 ~ d#4 ~@5",
})).s("gm_string_ensemble_1").gain(0.28).pan(0.3)

// other · string ensemble 1 · soft notes
const string_ensemble_1_soft = note("<~@63 A@2 ~@2 B ~@7 B ~@20 B ~@41 A C>".pickRestart({
  A: "f#5 a4 e5 d#5 f#5 a4 e5 d#5", B: "~@2 g#3@2 ~@2 g#3@2 e4@2 g#3@2 d#4 ~ g#3@2",
  C: "f#5@2 a4@2 e5@2 d#5@2 f#5@2 a4@2 e5@2 d#5 ~",
})).s("gm_string_ensemble_1").gain(0.11).pan(0.3)

// drums · rim
const rim = s("rim").struct("<~@63 [~ x ~@2 x ~@11]!16 ~@61>").gain(0.25)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@12 [x!16]!4 [x!6 ~ x ~ x ~ x ~ x ~@2] ~@123>").gain(0.2)

// drums · snare
const snare = s("sd").struct(`<
  ~@14 A B@3 ~@17 A B@3 C ~@7 D@11 ~ A B@3 C ~@11 A B@3 C ~@7 D@8 ~@15 A B@3 C ~@7 D@11 ~ A B@3 ~@2
>`.pickRestart({
  A: "x ~ x ~ x ~ x ~ x!8", B: "x!16", C: "x", D: "~@4 x ~@6 x ~@4",
})).gain(0.25)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@12 A@2 B ~@19 A B ~@22 A B ~@14 A B ~@33 A B ~@22 A B ~@5>".pickRestart({
  A: "x!16", B: "~ x ~ x ~ x ~ x ~@8",
})).gain(0.1)

// drums · hihat
const hihat = s("hh").struct("<A B ~@10 C@6 ~@6 C@14 ~ C@56 D ~@9 C@8 ~ C@24 D ~>".pickRestart({
  A: "x!2", B: "x!3 ~", C: "x!4", D: "x",
})).gain(0.05)

// drums · open hat
const open_hat = s("oh").struct("<~@15 A B@2 ~@8 B@12 ~ B@56 ~@10 B@8 ~ B@24 ~@2>".pickRestart({
  A: "~@5 x ~ x", B: "~ x ~ x ~ x ~ x",
})).gain(0.35)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@12 [~ x ~ x ~ x ~ x]!3 [~ x ~ x ~@4] ~@8 [~ x ~ x ~ x ~ x]!2 ~@114>")
  .gain(0.15)

// drums · splash
const splash = s("cr").struct(`<
  ~@16 A B C ~@18 D B ~@8 C ~@3 C ~@3 C ~@3 C ~ D B C ~@3 C ~@2 E C ~@2 E C ~ D B ~@8 C ~@3 C ~@20 D B ~@8 C ~@3 C ~@3 C
  ~@3 C ~ D B C ~
>`.pickRestart({
  A: "~ x", B: "x!4", C: "x", D: "x!2", E: "~@7 x",
})).gain(0.35)

// drums · ride
const ride = s("rd").struct("<~@30 [x!4]!8 ~ [x!4]!56 ~@19 [x!4]!24 ~@2>").gain(0.35)

// drums · shaker
const shaker = s("sh").struct(`<
  ~@22 A B A@3 B A C A B A@3 B A C ~ A B A@3 B A C A D A B A D A C E B A@2 E@2 A@3 B A@3 D A C A B A@3 B A C A B A@3 B A
  C E B A@2 E@2 A@2 ~@19 A B A@3 B A C A D A B A D A C E B A@2 E@2 A@2 ~@2
>`.pickRestart({
  A: "x!4", B: "x ~@3 x ~@3 x ~@3 x ~@2 x", C: "x ~@3 x ~@3 x ~@3 x!3 ~", D: "x ~@3 x ~@3 x ~@2 x!2 ~@2 x",
  E: "x ~@3 x ~@3 x ~@2 x!2 ~@3",
})).gain(0.4)

stack(
  bass, piano, piano_soft, synth_strings_1, string_ensemble_2, harmonica, lead_2_sawtooth, pad_sweep, percussive_organ,
  lead_5_charang, lead_1_square, string_ensemble_1, string_ensemble_1_soft, rim, kick, kick_soft, snare, snare_soft,
  hihat, open_hat, open_hat_soft, splash, ride, shaker
)