Strudelify

Celebration

Fun Factory

KeyB♭ majorTempo100 bpm
0:00/0:00
// Celebration — Fun Factory
// 100 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 102 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(100/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 2
const bass = note(`<
  ~@8 A B A B A B A B A B ~ C D E F C D E ~ A B A B A B A B A B A B A B A B A B ~ A G A G A G A ~ C D E F C D E ~ A B A
  B A B A B A B A B A B A B A B C D E F C D E ~ A B A B A B A B A B ~@4
>`.pickRestart({
  A: "[bb0,bb1]@2 ~ bb1 [bb1,bb2]@2 ~ [bb1,bb2] [g1,g2]!3 ~ [g1,g2]@2 g2 ~", // Bb G
  B: "[c1,c2]@2 ~ [c1,c2] [c2,c3]@2 ~ [c2,c3] [f1,f2]!3 ~ [f1,f2] ~ [f1,f2]@2", // C F
  C: "[bb1,bb2]@2 ~ [bb1,bb2] [bb1,bb2]@2 ~ [bb1,bb2] ~ [g1,g2]!2 ~ [g1,g2]@2 g2 ~", // Bb G
  D: "[eb1,eb2]@2 ~ [eb1,eb2] [eb1,eb2]@2 ~ [eb1,eb2] ~ [f1,f2]!2 ~ [f1,f2] ~ [f1,f2]@2", // Eb F
  E: "[bb1,bb2]@2 ~ [bb1,bb2] [bb1,bb2]@2 ~ [bb1,bb2] ~ [bb1,bb2]!2 ~ [bb1,bb2]@2 bb2 ~", // Bb
  F: "[g1,g2]@2 ~ [g1,g2] [g1,g2]@2 ~ [g1,g2] ~ [f1,f2]!2 ~ [f1,f2] ~ [f1,f2]@2", // G F
  G: "[c1,c2]@2 ~ [c1,c2] [c2,c3]@2 ~ [c2,c3] [f1,f2]!3 ~ [f1,f2] ~ [g1,g2]@2", // C F G
})).s("gm_synth_bass_2").gain(0.59)

// bass · synth bass 2 · soft notes
const bass_soft = note(`<
  ~@8 A ~ A ~ A ~ A ~ A ~@2 B ~ C ~ B ~ C ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2 A ~ A ~ A ~ A ~ B ~ C ~ B ~ C ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~ C ~ B ~ C ~ A ~ A ~ A ~ A ~ A ~@5
>`.pickRestart({
  A: "~@3 bb0 ~@10 g1 ~", B: "~@14 g1 ~", C: "~@14 bb1 ~",
})).s("gm_synth_bass_2").gain(0.39)

// chords · piano
const piano = note(`<
  A B A B A B A B A B A B A B A B A B ~ C D E F C D E ~ A B A B A B A B A B A B A B A B A B ~ G H G H G H G ~ C D E F C
  D E ~ A B A B A B A B A B A B A B A B A B C D E F C D E F A B A B A B A B A B ~@4
>`.pickRestart({
  A: "~@2 [bb3,d4,f4] ~@3 [bb3,d4,f4] ~@3 [bb3,d4,g4] ~@3 [bb3,d4,g4] ~", // Bb Gm
  B: "~@2 [c4,eb4,g4] ~@3 [c4,eb4,g4] ~@3 [a3,c4,f4] ~@3 [a3,c4,f4] ~", // Cm F
  C: "~@2 [bb3,d4,f4] ~@3 [bb3,d4,f4] ~@3 [g3,bb3,d4] ~@3 [g3,bb3,d4] ~", // Bb Gm
  D: "~@2 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~@3 [c4,f4,a4] ~@3 [c4,f4,a4] ~", // Eb F
  E: "~@2 [bb3,d4,f4] ~@3 [bb3,d4,f4] ~@3 [bb3,d4,f4] ~@3 [bb3,d4,f4] ~", // Bb
  F: "~@2 [g3,bb3,d4] ~@3 [g3,bb3,d4] ~@3 [f3,a3,c4] ~@3 [f3,a3,c4] ~", // Gm F
  G: "~@2 [f3,bb3,d4] ~@3 [f3,bb3,d4] ~@3 [g3,bb3,d4] ~@3 [g3,bb3,d4] ~", // Bb Gm
  H: "~@2 [g3,c4,eb4] ~@3 [g3,c4,eb4] ~@3 [f3,a3,c4] ~@3 [f3,a3,c4] ~", // Cm F
})).s("gm_piano").gain(0.43).pan(0.4)

// chords · synth strings 1
const synth_strings_1 = note(`<
  A B A B A B A C A B A B A B A B A B ~ D E F G H@3 ~ A B A B A B A B A B A B A B A B A B ~@9 D E F G H@3 ~ A B A B A B
  A B A B A B A B A B A B ~@8 A B A B A B A B A B ~@4
>`.pickRestart({
  A: "f4 g4, [bb3,d4]", B: "[eb4,g4] [f4,a4], c4", C: "[c4,eb4,g4] ~", D: "[bb3,d4,f4] [g3,bb3,d4]",
  E: "[bb3,eb4,g4] [c4,f4,a4]", F: "[bb3,d4,f4]", G: "[g3,bb3,d4] [f3,a3,c4]",
  H: "[~@6 [bb4,bb5] ~ [d5,d6]@2 f5@2 ~@6 [f5,f6]@2 ~@2 [bb4,bb5] ~ [d5,d6]@2 [f5,f6] ~@7 [f5,f6]@2 ~@12, [bb3,d4,f4] [g3,bb3,d4] [bb3,eb4,g4] [c4,f4,a4] [bb3,d4,f4]@2, ~@10 f6 ~@3 [g5,g6]@4 ~@12 [g5,g6]@4 ~@14]/3", // Bb D F Bb D F Bb Gm …
})).s("gm_synth_strings_1").gain(0.29).pan(0.7)

// other · flute
const flute = note(`<
  ~@7 A ~@12 B@2 C D E F ~@8 G ~@11 H I ~ J K L J M ~ B@2 C D E F ~@8 G ~@13 N O P Q R ~@10 S T@2 ~
>`.pickRestart({
  A: "~@3 f4 d4 g4 f4@2", B: "f4@2 g4@3 ~@11", C: "~@7 g4", D: "f4 ~@7", E: "~@2 g4 f4 ~@4", F: "~@4 g4@2 f4@3 ~@7",
  G: "~@10 f4!6", H: "d4 ~ d4 ~ d4@2 ~@2 d4!2 ~ d4!2 ~ d4!2", I: "eb4 ~ eb4 ~ eb4 ~ eb4 d4 eb4 d4 eb4 d4 eb4@2 ~@2",
  J: "~@15 d4", K: "d4 ~ d4!2 d4@2 ~@9 d4", L: "eb4 ~ eb4 eb4@2 eb4@2 eb4@2 ~ eb4 ~ eb4@2 ~@2",
  M: "eb4!2 ~ eb4!2 ~ eb4@2 f4 ~ f4 ~ f4@2 ~@2", N: "~@8 eb4 ~@7", O: "d4@2 a4 ~ a4@2 f4 g4@3 f4@2 g4@2 a4@2",
  P: "bb4@4 a4@3 g4@3 f4 ~ g4@2 a4 ~", Q: "a4@2 g4 ~ g4@2 f4 f4@3 g4 ~ g4@2 a4@2",
  R: "bb4 ~ bb4 ~ bb4@2 c5@2 a4@2 g4@2 ~@4", S: "~@4 f4@2 d4 g4",
  T: "[f4@3 ~@3 f4@2 ~@2 f4@2 d4@2 f4@4 ~@8 f2@4 bb1@2, ~@14 g4 ~@17]/2",
})).s("gm_flute").gain(0.35).pan(0.6)

// other · flute · soft notes
const flute_soft = note("<~@80 A@4 ~@18>".pickRestart({
  A: "[~@10 d4 ~ d4@2 bb3 c4@3 bb3@2 ~@11 c4@3 bb3 ~@7 c4 ~ c4@2 bb3 bb3@3 c4 ~@7 eb4 ~ eb4@2 f4@2]/4",
})).s("gm_flute").gain(0.22).pan(0.6)

// other · alto sax
const alto_sax = note("<~@9 A B ~@17 A B ~@6 A B ~@9 C D E F G H I ~@9 A B ~@6 A B ~@16 A B ~@9 J ~>".pickRestart({
  A: "~@5 f2 g2 a2", B: "bb2@5 ~@11", C: "~@15 d4", D: "d4 db4 d4 db4 d4!2 ~ d4!2 db4 d4 db4 d4@2 ~ d4",
  E: "eb4!2 ~ eb4!2 ~ eb4 ~ eb4!2 ~ eb4 eb4@3 ~", F: "~@7 d4!2 ~ d4 db4 d4@2 ~@2", G: "~@15 c4",
  H: "d4 d4@2 c4 d4 ~ d4 c4 d4!2 ~ d4 d4@2 ~ d4", I: "eb4!2 ~ eb4!2 ~ eb4@2 f4 ~ f4 ~ f4@2 ~@2",
  J: "~@2 f2@4 bb1@3 ~@7",
})).s("gm_alto_sax").gain(0.54).pan(0.1)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@8 A B C D A E F ~ F ~@10 A B C D A E F ~ A B C D A E F ~ F ~@18 A B C D A E F ~ A B C D A E F ~ F ~@9 A B C D A E F
  ~ F ~@5
>`.pickRestart({
  A: "bb5 g6", B: "eb6@2 ~@2 eb6 ~@3 f6 ~@3 f6 ~@3", C: "bb5@8 g5@7 ~", D: "g5 a5", E: "g6 f6", F: "f6",
})).s("gm_string_ensemble_1").gain(0.32).pan(0.9)

// drums · kick
const kick = s("bd").struct("<~@8 A@10 B A@7 B A@18 B A@7 B A@7 B A@25 ~ A@10 ~@4>".pickRestart({
  A: "x ~@2 x ~ x ~ x", B: "x!2 ~ x!3 ~@2",
})).gain(0.48)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@8 A@10 ~ A@7 ~ A@18 ~ A@7 ~ A@7 ~ A@25 ~ A@10 ~@4>".pickRestart({
  A: "~@3 x ~@11 x",
})).gain(0.32)

// drums · clap
const clap = s("cp").struct("<~@4 A@4 B@10 ~ B@7 ~ B@18 ~ B@7 ~ B@7 ~ B@36 ~@4>".pickRestart({
  A: "~@3 x", B: "~ x ~ x",
})).gain(0.54)

// drums · snare
const snare = s("sd").struct("<~@7 A B@10 ~ B@7 ~ B@18 ~ B@7 ~ B@7 ~ B@36 ~@4>".pickRestart({
  A: "~@3 x", B: "~ x ~ x",
})).gain(0.43)

// drums · hihat
const hihat = s("hh").struct("<~@8 A@10 ~ A@7 ~ A@18 ~ A@7 ~ A@7 ~ A@25 ~ A@10 ~@4>".pickRestart({
  A: "x!5 ~ x!2",
})).gain(0.43)

// drums · open hat
const open_hat = s("oh").struct("<~@8 A@10 ~ A@7 ~ A@18 ~ A@7 ~ A@7 ~ A@25 ~ A@10 ~@4>".pickRestart({
  A: "~@5 x ~@2",
})).gain(0.54)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@7 A ~ A ~@7 A@2 ~@7 A ~@7 A ~ A ~@7 A ~@7 A@2 ~@7 A ~@7 A ~@9 A ~@7 A ~@5
>`.pickRestart({
  A: "x",
})).gain(0.54)

// drums · tambourine
const tambourine = s("tb").struct("<A@7 B A@10 ~@9 A@18 ~@17 A@18 ~@8 A@10 ~@4>".pickRestart({
  A: "x!16", B: "x!8 ~@8",
})).gain(0.38)

// drums · ht
const ht = s("ht").struct("<~@18 A ~@7 A ~@18 A ~@7 A ~@7 A ~@17 A ~@22>".pickRestart({
  A: "~@4 x ~@5 x ~ x!2 ~ x",
})).gain(0.48)

// drums · mt
const mt = s("mt").struct("<~@18 A ~@7 A ~@18 A ~@7 A ~@7 A ~@17 A ~@22>".pickRestart({
  A: "~@2 x ~@4 x",
})).gain(0.54)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@8 A@10 B ~@7 B A@18 B ~@7 B ~@7 B A@18 ~@8 A@10 ~@4>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "x!16",
})).gain(2.18)

// drums · shaker
const shaker = s("sh").struct("<~@19 A@7 ~@20 A@7 ~ A@7 ~@19 A@8 ~@14>".pickRestart({
  A: "x!16",
})).gain(0.38)

stack(
  bass, bass_soft, piano, synth_strings_1, flute, flute_soft, alto_sax, string_ensemble_1, kick, kick_soft, clap, snare,
  hihat, open_hat, crash, tambourine, ht, mt, cabasa, shaker
)

More by Fun Factory