Strudelify

Love Is Alive

Anastacia

KeyG majorTempo100 bpm
0:00/0:00
// Love Is Alive — Anastacia
// 100 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 97 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 · fretless bass
const bass = note(`<
  ~@4 A B C B C B C B C B C B C B C B C D E F E D E F G B C B H B I B C B C B C D E F E D E F G J K J L J M N O B C B C
  B C B C B A B A B C B C D E F E D E F G D E F E D E F G P@4 B ~@3
>`.pickRestart({
  A: "~@7 f1", B: "g1 ~@7", C: "a#1 c2 ~@2 c2 g1 ~ f1", D: "g1 ~@4 d2 ~ f1", E: "~@6 d2 e2 g2 e2 g1@2 g1@2 ~@2",
  F: "g2@7 ~@3 e2@2 ~@2 c2@2", G: "~@6 d2 e2 g2 e2 g1@2 g1@2 f1 ~", H: "a#1 c2 ~ f1 g1 ~@3", I: "a#1 ~@3 c2 ~@2 f1",
  J: "a#1@9 ~ a#1@2 ~@2 a#1@2", K: "c2@9 ~ c2@2 ~@2 c2@2", L: "c2@5 e2 d2@2", M: "c2@13 ~ c2@2", N: "a#1@13 ~ a#1@2",
  O: "c2@2 ~@2 c2@2 ~@2 c2@2 ~@2 c2 ~ f1@2", P: "[d2@31 f1]/4",
})).s("gm_fretless_bass").gain(0.57)

// chords · piano
const piano = note(`<
  ~@4 A B C B C B C B C B C B C B C B C D E D E D E D F B C B G B H B C B C B C D E D E D E D I J K J K J K J L B C B C
  B C B C B A B A B C B C D E D E D E D I D E D E D E D I M@4 B ~@3
>`.pickRestart({
  A: "~@7 f1", B: "g1 ~@7", C: "a#1 c2 ~@2 c2 g1 ~ f1", D: "[g2,d3,g3,d4,g4,c5]", E: "[g2,d3,g3,d4,g4,b4]",
  F: "[g2,d3,g3,d4,g4,b4]@7 f2", G: "a#1 c2 ~ f1 g1 ~@3", H: "a#1 ~@3 c2 ~@2 f1", I: "[g2,d3,g3,d4,g4,b4]@7 ~",
  J: "[a#2,d3,f3,a#3,d4]", K: "[c3,e3,g3,c4,e4]",
  L: "[c3,e3,g3,c4,e4]@2 ~@2 [c3,e3,g3,c4,e4]@2 ~@2 [c3,e3,g3,c4,e4]@2 ~@2 [c3,e3,g3,c4,e4] ~ f1 ~", M: "[d2@31 f1]/4",
})).s("gm_piano").gain(0.27).pan(0.8)

// chords · electric guitar jazz
const electric_guitar_jazz = note(`<
  ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@9 A ~ A ~@3 A ~ A ~ A ~@17 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@25
>`.pickRestart({
  A: "~@2 [a#3,e4,e5]@5 ~", // A#dim
})).s("gm_electric_guitar_jazz").gain(0.34)

// chords · rock organ
const rock_organ = note("<~@29 A@4 ~@64>".pickRestart({
  A: "[~@16 [d6,f6]@2 [c6,e6] ~@5 [c6,e6] ~ [b5,d6] ~@9 [g5,b5] ~@2 [d5,g5] ~@2 [d5,g5] ~@2 [d5,g5] ~@18, g6@7 ~]/4", // Dm C Bm G G5
})).s("gm_rock_organ").gain(0.35)

// other · overdriven guitar
const overdriven_guitar = note(`<
  ~@4 A B C B C B C B C B C B C B C B C ~@7 A B C B D B E B C B C B C ~@15 A B C B C F G H I B A B A B C B C ~@19 A B
  ~@3
>`.pickRestart({
  A: "~@7 f2", B: "g2 ~@7", C: "a#2 c3 ~@2 c3 g2 ~ f2", D: "a#2 c3 ~ f2 g2 ~@3", E: "a#2 ~@3 c3 ~@2 f2",
  F: "[d6,g6]@14 [c6,e6] [b5,d6], g2 ~@7", G: "a#2 c3 ~@2 c3 g2 ~ f2, [c6,e6] [b5,d6]@3",
  H: "[a5,c6]@14 [b5,d6] [a5,c6], g2 ~@7", I: "a#2 c3 ~@2 c3 g2 ~ f2, [g5,b5]@13 ~@3",
})).s("gm_overdriven_guitar").gain(0.29).pan(0.2)

// chords · string ensemble 2
const string_ensemble_2 = note("<~@21 A@8 ~@12 A@8 B C B C B C B D ~@16 A@16 ~@8>".pickRestart({
  A: "[c6 b5 c6 b5 c6 b5 c6 b5, [g5,d6,g6]]/8", B: "[a#4,d5,f5,a#5,d6]", C: "[c5,e5,g5,c6,e6]",
  D: "[c5,e5,g5,c6,e6]@13 ~@3", // C
})).s("gm_string_ensemble_2").gain(0.16).pan(0.6)

// chords · pad sweep
const pad_sweep = note("<~ A@4 ~@27 B ~@60 C@4>".pickRestart({
  A: "[d4,a4,d5]/4", B: "[g4,d5,g5] ~", C: "[d2,g2,d3,g3,d4,g4]/4",
})).s("gm_pad_sweep").gain(0.36).pan(0.6)

// chords · lead 2 sawtooth
const lead_2_sawtooth = note("<~ A@4 ~@84 B@4 ~@4>".pickRestart({
  A: "[d1,d2]/4", B: "[[d3,a3,d4,a4,d5]@31 ~]/4",
})).s("gm_lead_2_sawtooth").gain(0.02).pan(0.4)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@20 A ~@7 A ~@11 A ~@7 A ~@23 A ~@7 A ~@7 A ~@8>".pickRestart({
  A: "x!4 ~@12",
})).gain(0.3)

// drums · low tom
const low_tom = s("lt").struct("<~@4 A ~@15 B ~@7 B ~@11 B ~@7 B ~@7 C ~@15 B ~@7 B ~@7 B ~@8>".pickRestart({
  A: "~@8 x!4 ~@4", B: "~@7 x", C: "x!6 ~@2",
})).gain(0.48)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 A B ~@15 C ~@7 C ~@11 C ~@7 C ~@23 C ~@7 C ~@7 C ~@8>".pickRestart({
  A: "~@10 x!2 ~@4", B: "~@4 x ~ x!2 ~@8", C: "~@3 x",
})).gain(0.48)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@6 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@4
>`.pickRestart({
  A: "~@5 x ~@2",
})).gain(0.42)

// drums · high tom
const high_tom = s("ht").struct("<~@3 [~@4 x ~ x ~ x!2 ~@3 x!2 ~] [x!3 ~@13] ~@92>").gain(0.54)

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

// drums · bongos
const bongos = s("bongo:4").struct("<~@5 [~@3 x ~@3 x]!27 [~@3 x ~@4] [~@3 x ~@3 x]!60 ~@4>").gain(0.79)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@5 [x!2 ~@6 x!2 ~@6]!27 [x!2 ~@6 x ~@7] [x!2 ~@6 x!2 ~@6]!60 x ~@3>")
  .gain(0.79)

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

// drums · congas
const congas_2 = s("conga:33").struct("<~@5 [~@2 x!2 ~@6 x!2 ~@4]!27 [~@2 x!2 ~@12] [~@2 x!2 ~@6 x!2 ~@4]!60 ~@4>")
  .gain(0.96)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@5 [x!8]!27 [x!5 ~@3] [x!8]!60 x ~@3>").gain(2.13)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  ~@5
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!27
  [~ x ~ x ~ x ~ x ~@8]
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!60
  ~@4
>`).gain(1.22)

stack(
  bass, piano, electric_guitar_jazz, rock_organ, overdriven_guitar, string_ensemble_2, pad_sweep, lead_2_sawtooth, kick,
  snare, snare_soft, low_tom, hihat, mid_tom, open_hat, high_tom, crash, bongos, bongos_2, congas, congas_2, cabasa,
  cabasa_soft
)

More by Anastacia