Strudelify

Tonight I Celebrate My Love For You

Bryson

KeyE♭ majorTempo64 bpm
0:00/0:00
// Tonight I Celebrate My Love For You — Bryson
// 64 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 51 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(64/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 · fretless bass
const bass = note("<~@11 A B C D E F G D H I J K J K L G M@2 N B C D C D E F G O J K J P L G M@2 A Q@3>".pickRestart({
  A: "eb3@4 d3 eb3 g3 g2", B: "ab2 bb2", C: "eb2@4 d2 eb2 g2 g1", D: "ab1 bb1", E: "eb2 c2", F: "f1@2 bb1 ab1",
  G: "g1 c2", H: "eb2@7 bb1 eb2@7 bb1", I: "eb2@6 eb2@2 eb2@4 e1 f1 gb1 g1", J: "ab1@7 ab1 ab1@8",
  K: "g1@7 bb1 eb2@4 eb2@4", L: "ab1@3 g1 f1@4", M: "ab1@7 ab1 ab2@8", N: "eb2@4 d3 eb3 g3 g2",
  O: "ab1@8 bb1@2 bb1 f2 bb2 f2 bb1!2", P: "g1@7 bb1 eb2@4 eb2 f2 eb2@2", Q: "[ab2@8 bb2@4 ~ bb2@6 ~ eb2@25 ~@3]/3",
})).s("gm_fretless_bass").gain(0.4)

// chords · epiano2
const epiano2 = note("<~ A B C D E F G H I J K L C L M N O P Q P R S T U@8 V@2 W@2 X@7 Y@8>".pickRestart({
  A: "~ g4 bb4 eb4 d4 eb4 g4 bb3", B: "ab3@2 ab3@2 bb3@2 bb3 ~", C: "bb3 eb4 g4 bb4 d4 eb4 g4 bb3",
  D: "ab3@4 bb3@2 f4 ab4", E: "eb4@2 eb4 g4 d4 eb4 g4 bb3", F: "ab3@4 bb3@2 bb3 c4", G: "bb3 eb4 g4 bb4 c4 eb4 g4 bb4",
  H: "f3 ab3 c4 eb4 ab3 c4 d4 bb3", I: "g3 bb3 d4 bb3 g3 c4 eb4 c4", J: "f3 ab3 c4 eb4 ab3 c4 eb4 c4",
  K: "eb3 g3 bb3 eb4 eb3 g3 bb3 eb4", L: "ab3 c4 eb4 c4 bb3 d4 f4 d4", M: "g3 bb3 eb4 bb3 g3 bb3 c4 eb4",
  N: "f3 ab3 c4 eb4 f3 bb3 d4 bb3", O: "g3 bb3 d4 f4 g3 bb3 c4 eb4", P: "ab3 c4 eb4 c4 ab3 c4 eb4 c4",
  Q: "g3 bb3 eb4 bb3 f3 bb3 d4 bb3", R: "ab3 c4 eb4 g4 ab3 c4 eb4 g4, g5 eb5",
  S: "g3 bb3 d4 f4 f3 bb3 db4 eb4, f5 bb4 ab5 g5", T: "~ eb5, g5",
  U: "[~@2 bb4@2 ~@2 bb5@2 eb4 c4 ab3 g3 f3 ab3 c4 eb4 bb3!2 d4 f4 bb3!2 c4 eb4 c4!2 eb4 g4 ~ c4 eb4 g4 b3!2 eb4 g4 ~ b3 eb4 g4 bb3!2 eb4 bb3 ~ bb3 eb4 bb3 c4!2 eb4 c4 bb3!2 d4 bb3 eb3 ~ bb3 eb4 eb3 ~ bb3 eb4, f5@48 eb4@2 ~@2 [f3,d4]@5 g3@4 g3@3, ~ ab5@15, ~@3 g5@29, ~@8 c6@3 ~@5 [g3,d4,f4]@4 [g3,c4,eb4]@4 [ab3,eb4,g4]@4 ab3@4 [ab3,eb4,g4]@4 ab3@4 [g3,eb4]@4 g3@4 ab3@16]/8", // Dm G7 Cm Abmaj7 Cm
  V: "[~ c4 eb4 c4 bb3 d4 f4 d4 bb3 eb4 g4 bb4 d4 eb4 g4 bb3, ab3]/2",
  W: "[~ c4 eb4 c4 bb3 d4 f4 d4 ~ bb3 eb4 bb3 ~ bb3 c4 eb4, ab3, ~@2 g3!2]/2",
  X: "[~@2 c4 eb4 ~ bb3 d4 bb3 bb3!2 d4 f4 bb3!2 c4 eb4 c4!2 eb4 g4 c4!2 eb4 g4 ~ c4 eb4 g4 ~ c4 eb4 g4 ~ bb3 d4 f4 ~ bb3 db4 eb4 ~@4 eb5@4 f5@2 bb4@2 ab5@2 [g5,bb5]@2, f3@2 f3@14 f5@2 ab5 g5 g5@7 ~, ~ ab3@15 ab3@4 ab3@4 ab3@4 ab3@28, ~@2 g3 g3@4 eb5 g3@6, ~@8 [d4,f4]@3 ~ [c4,eb4]@3 ~ [eb4,g4]@3 ~ eb4@2 ~@2 g5@10 bb4@2 f3@20]/7", // Gm Dm Cm Eb
  Y: "[c4@2 c4@2 ~@2 [bb3,d4,f4]@2 ab3@2 ab3@2 eb4@2 ~@2 bb3@2 bb3@2 d4@2 f4@2 bb3@2 bb3@2 ~@2 eb4@2 c4@2 ~@4 g4@2 ~@6 g4@2 b3@2 b3@2 ~@2 g4@2 ~@2 b3@2 ~@2 g4@2 ~@2 bb3@2 ~@2 bb3@2 d4@2 [bb3,eb4]@2 g4@2 ~@2 c4@2 ~@6 d4@2 ~ d4@2 c4@3 c4@4 [g3,bb3,eb4]@25 ~@3, eb4@4 ~@2 c4@2 [d4,f4]@3 ~ c4@2 c4@2 eb4 c4@4 c4@18 bb3@4 c4 bb3@6 ~@14, g4@6 g3@8 eb4@10 eb4@6 ~@2 g4@4 eb4@8 eb4@4 [eb4,g4]@4 eb4@8 eb4@4 eb4@4 eb4@6 ~@2 eb4@6 c4@2 eb4@9 ~@35, ab3@4 ab3@4 [f3,c4,eb4]@4 ab3@20 ab3@8 ab3@8 ab3@8 ab3@24 ab3@13 [ab3,eb4]@7 ~@28, ~@3 f3 g3@2 g3@10 g3@2 g3@7 ~@7]/8", // Bb Eb5 Eb Dm Eb F7 Ab5
})).s("gm_epiano2").gain(0.25)

// chords · epiano1
const epiano1 = note(`<
  A B C D E D F G H I J K L D M N O P Q R S T U T U V W X Y Z AA K L D M N AB AC AD T U T U AE AF X AG AH AI@2 AJ
>`.pickRestart({
  A: "~@3 bb4", B: "g5@2 ~ g5 [d5,f5] [eb5,g5] [g5,bb5] eb5, eb5 ~",
  C: "[c5,eb5]@4 eb5 f5 g5@2 [d5,f5]@6 bb4@2, ~ c5 ~@2", D: "[eb5,g5]@4 [d5,f5] [eb5,g5] [g5,bb5] eb5",
  E: "[c5,eb5]@4 eb5 f5 g5@2 [d5,f5]@8, ~@2 c5 ~@5", // Cm Dm
  F: "[c5,eb5]@4 eb5 f5 g5@2 [d5,f5]@4 [bb4,d5]@2 [ab4,c5]@2, ~@2 c5 ~@5", // Cm Dm Bb Ab
  G: "[g4,bb4]@2 [bb4,bb5]@2 [g4,bb4] [ab4,c5] [bb4,d5] [c5,eb5]", // Gm Bb Gm Ab Bb Cm
  H: "[c5,eb5]@4 [f4,ab4]@3 g4 f4@2 g4@2 f4@2 c5@2, ~@2 [c4,eb4] [bb3,d4]", // Cm Fm Cm Bb
  I: "[f4,bb4]@5 f4 bb4 f5 d5@4 eb5@4, d4 [g4,bb4]", // Bb5 Gm
  J: "~@5 eb5 g4 ab4 [ab3,c4,eb4,c5,eb5]@4 [ab3,c4,ab4,c5]@4, [ab3,c4,eb4] ~", // Ab
  K: "[g4,bb4,eb5]@4 [f4,bb4,d5] [g4,bb4,eb5]!3", L: "c5@5 f5 g5@2 [f4,bb4]@4 f4@2 ab4@2, [eb4,ab4] [d5,f5]",
  M: "~@2 c5 bb4 ab4 f5 g5@2 [d4,f5]@4 [d4,d5,bb5]@2 [c4,c5,ab5]@2, c4 ~", // Dm Gm Fm
  N: "[bb4,g5]@2 [bb4,bb5]@2 [g4,bb4] [ab4,c5] [bb4,d5] [c5,eb5]", // Eb Bb Gm Ab Bb Cm
  O: "[ab4,c5,eb5]@4 ab4@2 ab4 eb4 f4 g4 ab4@2 d5@2 c5 [c5,d5], ~ [eb4,f4] ~@2", // Ab Csus2 Ebsus2
  P: "bb4@4 [d5,f5,bb5]@3 [d5,f5,bb5] [bb4,eb5,g5]@4 [eb5,g5] [f5,ab5] ~ [g5,bb5]", // Bb Eb Fm Gm
  Q: "~@2 [eb5,g5] [eb5,g5]@2 [eb5,ab5]@3 [ab4,c5,eb5]@4 [ab4,c5,eb5]@4", // Eb Ab5 Ab
  R: "~@6 bb4 eb5 [bb3,d4,f4,bb4,d5]@3 c5 [bb3,d4,f4,bb4]@4, [bb3,eb4,g4] ~", // Bb Eb
  S: "[eb4,ab4,c5]@6 [c4,eb4,ab4] [bb3,eb4,g4] [c4,eb4,ab4] g4 ab4 bb4 c5 d5 eb5 f5", T: "[ab3,c4,eb4,g4]",
  U: "[g3,bb3,d4,f4]@2 [f3,ab3,bb3,db4] [g3,bb3,db4,eb4]", // Gm7 Bbm7 Eb7
  V: "[ab3,c4,eb4,g4]@3 [g3,bb3,d4,f4] [f3,ab3,c4,eb4]@2 [f3,ab3,c4,eb4]@2", // Abmaj7 Gm7 Fm7
  W: "~@5 eb5 d5 ~@4 c5 bb4@4, [bb3,d4,f4]@7 eb5@4 ~@5, ~ [bb3,c4,eb4]", // Bb Cm7
  X: "eb5 g4 ab4 eb5@2 g4 ab4 ~@3 ab3@2 g3@4, [c4,eb4], g3@5 ~@3, ~@7 eb5@9", // Cm
  Y: "bb4 g4 ab4 eb5 bb4 g4 ab4 eb5 ~@2 g3@2 [g3,b3,eb4,f5]@4, [b3,eb4]@3 ~, ab3@5 ~@3, ~@2 eb5 ~", // Gaug B
  Z: "g4 ab4 bb4 eb5@3 bb5@2 [d5,f5,bb5]@2 [eb5,g5,bb5]@2 [g5,bb5]@2 eb5@2, [g3,bb3,eb4]@3 [g3,bb3,eb4]", // Bb Eb Gm Eb
  AA: "[c5,eb5]@5 f5 g5@2 [d5,f5]@3 bb5 bb4 f5 ab5@2, [ab3,c4,eb4] [bb3,d4,f4]", // Cm Dm Ab Bb
  AB: "[ab4,c5,eb5]@4 [eb4,f4,ab4]@2 ab4 eb4 f4 g4 ab4@2 d5@2 c5 [c5,d5]", // Ab Fm7 Csus2
  AC: "bb4@8 [bb4,d5] [c5,eb5] [d5,f5]@2 [c5,eb5]@4", // Bb Cm Dm Cm
  AD: "c4@2 [c4,eb4,ab4,eb5]@2 [c4,eb4,ab4,eb5]@2 eb5 f5, ~@3 [c4,eb4,ab4]", AE: "c6@6 bb5@2 ab5@4 eb5 d5 ~ c5",
  AF: "d5@5 eb5 d5 ~@4 bb4@5, [bb3,d4,f4]@7 eb5@4 ~@5, ~ [bb3,c4,eb4]", // Bb Cm7
  AG: "eb5 g4 ab4 eb5@2 g4 ab4 ~@3 g3@2 [g3,b3,eb4]@4, [b3,eb4]@3 ~, ab3@5 ~@3, ~@7 eb5@9", // Gaug B
  AH: "g5@2 ~ g5 [d5,f5] [eb5,g5] [g5,bb5] eb5, [g3,bb3,eb4]@3 [g3,bb3,eb4], eb5 ~", // Dm Eb Gm Eb
  AI: "[[c5,eb5]@4 eb5 f5 g5@2 [bb3,d4,f4]@11 ~@2 bb5 ~ f5 eb5 ~ bb4 ~ bb5 f5 ~ bb4, [ab3,c4,eb4] ~@3, ~ c5 [d5,f5]@2 ~@4]/2", // Cm Bb Ab Dm
  AJ: "eb5@13 ~@3",
})).s("gm_epiano1").gain(0.3)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~@11 A B A C D E F G H I J K L M N O P Q R S A T A U D E F V J K L M N O P Q R ~ W@2
>`.pickRestart({
  A: "g4@4 f4 g4 bb4 eb4", B: "eb4@5 f4 g4@2 f4@8", C: "eb4@5 f4 g4@2 f4@4 [bb4,d5]@2 [ab4,c5]@2",
  D: "[bb3,eb4,g4]@5 ~ eb4 g4 c4@4 bb3@4, ~@5 bb3@3 [eb4,g4]@8", // Eb
  E: "~@2 f4 eb4 c4@2 eb4@2 ~@4 f4@2 f4@2, ~ ab3@7 [bb3,d4]@8", // Bb
  F: "g4 f4 ~ bb3@3 d4@2 [bb3,c4]@5 ~ c4@2, ~ d4@2 ~ eb4@4, ~@13 bb3@2 ~", // Bbsus2
  G: "eb4@5 ab4@4 ~ g4@2 f4@2 eb4 ~, [ab3,c4]@15 ~", H: "eb4@5 bb3 ~ bb3 [d4,f4]@5 d4 f4@2, g3 bb3, bb3@2 ~ eb4 ~@4",
  I: "[ab3,c4,eb4]@5 ~@3 ab4@2 g4@2 f4@2 eb4@2, ~@5 ab3@11, ~@3 c4@5, ~@7 eb4@5 ~@4", // Ab
  J: "~@3 eb4 g4@8 f4@2 g4 ~, ab3@7 ~@9, ~ g3@14 ~, ~@2 c4@13 ~", K: "[bb3,d4,f4]@8 ~@3 f4 eb4@4, ~@9 bb3@7, ~@5 db4@3",
  L: "~@3 eb4 g4@8 f4@2 g4 ~, ~ g3@14 ~, ~@2 c4@13 ~", M: "[bb3,d4,f4]@9 ~@2 f4 eb4@4, ~@9 bb3@7, ~@5 db4@3",
  N: "[ab3,c4,eb4]@6 [g3,bb3,d4]@2 [f3,ab3,c4]@7 ~", O: "d4@5 eb4 d4 c4 [g3,bb3]@8, [g3,bb3] ~",
  P: "[g3,c4,eb4]@2 [g3,c4,eb4] [g3,c4,eb4]@13", Q: "[g3,b3,eb4]@2 [g3,b3,eb4] [g3,b3,eb4]@12 ~", R: "[g3,bb3,g4]@15 ~",
  S: "~@7 ab4", T: "eb4@3 bb4 eb4 f4 g4@2 f4@6 bb3@2",
  U: "eb4@2 [eb4,ab4] [f4,bb4] [eb4,ab4]@4 [d4,f4]@2 [d4,f4] [eb4,g4] [d4,f4]@2 [eb4,g4] [d4,f4]", // Ab5 Bb5 Ab5 Dm Eb Dm Eb Dm
  V: "eb4@5 ab4@3 eb4 bb3 c4 eb4 c4 bb3@3, ab3@15 ~, c4@5 ~@3", W: "[~@3 [bb3,eb4,g4]@25 ~@4, ~@2 eb3@25 ~@5]/2",
})).s("gm_acoustic_guitar_nylon").gain(0.35)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@11 A B A B A B A C D E F G H I J ~@5 A B A K A B A C F G H I L M ~@3 N@3
>`.pickRestart({
  A: "[g4,bb4]", B: "[ab4,c5] [bb4,d5]", C: "[ab4,c5]", D: "~@2 d5 f5, [g4,bb4]",
  E: "[ab4,eb5]@8 ab4 g4 ab4 bb4 c5 d5 eb5 f5, c5@3 ~", F: "g5 eb5", G: "f5 bb4 ab5 g5", H: "g5", I: "f5@2 ab5 bb5",
  J: "c6 ~", K: "[ab4,c5] d5, ~@4 bb4@3 ~", L: "c6@6 bb5 ~ ab5@8", M: "bb5@3 ~",
  N: "[~@13 [eb4,ab4,c5]@6 ~ [eb4,g4,bb4]@26 ~@2]/3", // Ab Eb
})).s("gm_string_ensemble_1").gain(0.35)

// other · piccolo
const piccolo = note("<~@29 A B ~@15 C D E@3>".pickRestart({
  A: "g5@4 f5 g5 bb5@2", B: "eb5@5 f5 g5@2 f5@8", C: "~ eb5!2 f5", D: "~@3 bb4 g5@4 f5@2 g5@2 bb5@2 eb5@2",
  E: "[eb5@5 f5 g5@2 f5@11 ~ eb5@26 ~@2]/3",
})).s("gm_piccolo").gain(0.35).pan(0.3)

// other · oboe
const oboe = note("<~@28 [~ eb5!2 f5] [g5 ~] ~@3 [~@4 f5 g5 bb5 eb5] [eb5@2 c5@2 c5@4 d5@7 c5] [bb4@3 c5@5] ~@15>")
  .s("gm_oboe").gain(0.3).pan(0.7)

// chords · pad halo · Cm B Cm B
const pad_halo = note("<~@27 [[c4,eb4]] [[b3,eb4]] ~@16 [[c4,eb4]] [[b3,eb4]] ~@4>").s("gm_pad_halo").gain(0.3)

// other · alto sax
const alto_sax = note(`<
  ~@6 A B@2 C D ~@3 A E F G H I J K L M N O P ~ A Q ~@4 A R S T U V L M N O P ~ A W X Y@2
>`.pickRestart({
  A: "~@15 bb2", B: "[g3@8 bb3@2 c4@2 d4@2 eb4 eb4@2 ab3 ab3@4 ~ g3 f3@2 g3 ab3@3 ~ d4]/2",
  C: "c4 bb3 bb3@6 ~@4 g3 ab3 ~ bb3", D: "bb3@2 eb3 eb3@12 ~", E: "bb3@3 bb3!2 c4 d4 eb4",
  F: "eb4 ab3 ab3@4 ab3 g3 f3@2 g3 ab3 d4@2 d4 c4", G: "bb3@2 bb3@6 ~@4 g3 ab3 ~ bb3", H: "bb3@2 eb3 eb3@11 ~ bb2",
  I: "eb3", J: "~@15 eb3", K: "eb4@10 ~ eb4!2 d4 c4 eb4", L: "d4@2 bb3 bb3@5 ~@6 c4 d4",
  M: "eb4 eb4@2 eb4@5 ~@3 eb4!2 d4 c4@2", N: "d4@2 bb3 bb3@9 ~@3 c4", O: "eb4@8 ~ eb4!4 d4 ~ c4",
  P: "bb3 g3 g3@2 g3@4 ~@8", Q: "g3 ~", R: "bb3@6 ~@2 bb3@2 c4@2 d4@3 eb4",
  S: "eb4 ab3 ab3@4 ~ g3 f3@2 g3@2 ab3@2 d4 c4", T: "d4 [bb3,c4] bb3@6 ~@4 g3 ab3 ~ bb3", U: "bb3@2 eb3 eb3@9 ~@3 c4",
  V: "eb4@9 ~@2 eb4!2 d4 c4 eb4", W: "g3@6 ~ g3 f3@2 g3@2 bb3@2 eb3@2", X: "eb3@5 f3 g3 f3 f3@5 ~@3",
  Y: "[~@2 bb2 ~ g3@25 ~@3]/2",
})).s("gm_alto_sax").gain(0.45).pan(0.7)

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

// drums · snare
const snare = s("sd").struct("<~@21 A@6 ~@8 A B ~ C A@6 ~@6>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@5 x ~@2",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<~@11 A@7 B ~@2 C@5 D ~@12 C@5 E ~@6>".pickRestart({
  A: "x!2", B: "x ~@2 x", C: "x!8", D: "x ~ x ~ x ~ x!2", E: "x!5 ~ x!2",
})).gain(0.35)

// drums · mid tom
const mid_tom = s("mt").struct("<~@20 [~@10 x ~ x!2 ~@2] ~@17 [~@12 x!2 ~@2] ~@12>").gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@21 A ~@17 A ~@3 A ~@2 B ~@2 C ~>".pickRestart({
  A: "x", B: "~ x", C: "~ x ~@2",
})).gain(0.4)

// drums · ride
const ride = s("rd").struct("<~@11 A@7 B C D ~@6 E F G ~ E@7 H ~@6 E D G ~@3>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~ x!3 ~@5 x!2", C: "x ~@3 x ~@3 x ~@3 x ~ x!2", D: "x!2 ~@2", E: "x!4", F: "x!3 ~", G: "x",
  H: "x ~@3 x ~@2 x!2 ~@7",
})).gain(0.4)

stack(
  bass, epiano2, epiano1, acoustic_guitar_nylon, string_ensemble_1, piccolo, oboe, pad_halo, alto_sax, kick, snare,
  hihat, mid_tom, crash, ride
)