Strudelify

Bliss

Tori Amos

KeyB minorTempo115 bpm
0:00/0:00
// Bliss — Amos, Tori
// 115 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (2/4 at bar 1, 4/4 at bar 2) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 99 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(115/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.

// chords · piano
const piano = note(`<
  A B A B A B A C D E D E D E D F D@2 E D E D E D F G H I J I J K@2 L M N O A P A Q D E D E D E D E D E D E D E D F G H
  G H I J I J K@2 L M I J I J K@2 L M R S L M I J I J K@2 L M R S L M T U V@2 ~@2
>`.pickRestart({
  A: "~@2 b3@2 b3@3 ~@3 b3@2 ~@2 b3@2, f#3@7 ~ g3@4 g3@4", B: "~ b3!2 e3@2 ~ [d3,d4] [c#3,c#4], e3@3 ~@2 [a2,a3]@3",
  C: "e3", D: "~@2 b3@2 b3@3 ~@3 b3@2 ~@2 b3@2, f#3@7 ~ f#3@4 f#3@4", E: "~ b3!2 g3 ~ b3 ~ b3, g3@3 ~ e3@2 e3@2",
  F: "e3@5 ~ [d3,d4] [c#3,c#4], ~@5 [a2,a3]@3", G: "[b2,f#3,b3]!8", H: "[b2,b3]!8, g3@3 f#3@2 e3@3",
  I: "[a3,c#4]@2 [a3,d4]@3 ~ [a3,d4]@2 [a3,c#4,e5]@2 [a3,d4,d5]@3 ~ [a3,d4]@2", // A D5 A D5
  J: "[a3,d4]@2 [a3,d4,f#4]@3 ~ [a3,d4,f#4]@2 [a3,d4,a4]@2 g4@2 f#4@2 [a3,d4]@2, ~@5 [a3,d4]@2 ~", // D5 D D5
  K: "[[a3,c#4]@2 [a3,d4]@3 ~ [a3,d4]@2 [a3,c#4,e5]@2 [a3,d4,d5]@3 ~ [a3,d4]@5 ~ [b3,e4]@2 [b3,e4]@3 ~ [b3,d4,f#4]@2 [b3,d4,f#4]@2 [b3,d4,f#4]@2]/2", // A D5 A D5 E5 Bm
  L: "[a3,d4,f#4]@5 ~ [a3,d4,f#4]@3 ~ [a3,d4,f#4]@3 ~ [a3,d4,f#4]@2", // D
  M: "[a3,d4,f#4]@2 [a3,d4,f#4]@2 [a3,d4,f#4]@2 [a3,d4,f#4]@3 ~ [a3,d4,f#4]@2 [a3,d4]@2 a3@2", // D D5
  N: "[g3,c#4,e4]@2 [g3,d4,f#4]@3 ~ [g3,d4,f#4]@2 [g3,d4,f#4]@2 [g3,d4,f#4]@3 ~ [g3,d4,f#4]@2", // C#dim Gmaj7
  O: "[g3,d4,f#4]@3 ~ [g3,d4,f#4]@3 ~ [g3,d4,f#4]@2 [a3,d4]@3 ~@3", // Gmaj7 D5
  P: "~ b3!2 e3!2 ~ [d3,d4] [c#3,c#4], e3@3 ~@2 [a2,a3]@3", Q: "~ b3!2 e3 ~ b3 ~ b3, e3@3 ~ e3@4",
  R: "[d4,f#4,a4]@5 ~ [d4,f#4,a4]@3 ~ [d4,f#4,a4]@3 ~ [d4,f#4,a4]@2", // D
  S: "[d4,f#4,a4]@2 [d4,f#4,a4]@2 [d4,f#4,a4]@2 [d4,f#4,a4]@3 ~ [d4,f#4,a4]@2 [d4,f#4]@2 d4@2", // D
  T: "[b3,f#4,b4]@6 ~@2 [b3,f#4]@5 ~ [b3,f#4]@2", U: "[b3,e4]@6 ~@2 [b3,e4]@5 ~ [b3,e4]@2",
  V: "[[g3,d4]@6 ~@2 [g3,d4]@5 ~@2 [g3,d4]@2 [b3,e4]@15]/2", // G5 E5
})).s("gm_piano").gain(0.35)

// other · electric guitar clean · "Guitar"
const electric_guitar_clean = note("<~@47 A B C B C B C B ~@44>".pickRestart({
  A: "~ b4 b4@3 b4!3", B: "~@6 b4@3 ~ b4@2 b4@2 b4@2", C: "~@6 b4@3 ~ b4@4 b4@2",
})).s("gm_electric_guitar_clean").gain(0.13)

// bass · fretless bass · "Bass Quiet"
const bass = note("<A@2 B@4 C@2 D@6 E F ~@83>".pickRestart({
  A: "[~@8 f#1@23 ~]/2", B: "[f#1@13 ~@3]/2", C: "[f#1@29 ~@3]/2", D: "[b1@7 ~ d2@21 ~@3]/2", E: "b1@7 ~ d2@7 ~",
  F: "b1@13 ~@3",
})).s("gm_fretless_bass").gain(0.09)

// bass · fretless bass · "Bass"
const bass_2 = note(`<
  ~@15 A B C@2 D E C@2 D F G@2 H I H I H J K L M N O@2 ~@2 A P D Q R@2 S@2 A P T@2 U@2 A V G@4 H I H I H J K L H I H I H
  J K L W@2 X Y H I H I H J K L W@2 X Y Z AA AB AC@3
>`.pickRestart({
  A: "b1@15 ~", B: "e1@15 ~", C: "[b1@7 ~ d2@15 ~ e2@7 ~]/2", D: "b1", E: "d2@7 ~ a1@7 ~", F: "e2@3 ~@13", G: "b1!8",
  H: "d2!4 e2!2 a1 e2", I: "f#2 b1 a1 g1 a1 b1 g2@2", J: "f#2!2 g2!3 e2 d2 b1", K: "b1 e2!3 b2!2 e2 b1",
  L: "b1 e2!5 b1 a1", M: "g1!2 d2 g1!2 d2 g1!2", N: "g1@2 g1@2 d2@2 g1@2 g1@2 f#2@5 ~", O: "[f#1@13 ~@3]/2",
  P: "d2@15 ~", Q: "d2@6 f#3@5 ~ g3@3 ~", R: "[b1@23 ~ e2@7 ~]/2", S: "[b1@23 ~ f#2@7 ~]/2", T: "[b1@31 ~]/2",
  U: "[b1@14 c#3@7 ~ d3@8 ~@2]/2", V: "e2@13 ~@3", W: "g2!6 d3 g2", X: "e2!4 b2!2 e2 b1", Y: "e2!6 b1 a1",
  Z: "b1@7 ~ d2@7 ~", AA: "e2@7 e2", AB: "g1", AC: "[~ e2@38 ~@9]/3",
})).s("gm_fretless_bass").gain(0.42)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@27 A B A B A B A B A B ~@23 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 D@3 ~@3
>`.pickRestart({
  A: "~@2 x ~@2 x ~@2", B: "~@2 x ~@2 x!2 ~", C: "~@5 x!2 ~", D: "~ x",
})).gain(0.26)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@8 A B@6 C B@8 C@2 ~ D@10 E F B G E H B G E H B G E G B G E G B I C ~@2 J D@32 B@3 K ~@2
>`.pickRestart({
  A: "~ x!3", B: "x!4", C: "x", D: "x!8", E: "x ~ x ~ x!3 ~", F: "x ~ x ~ x!4", G: "x!3 ~ x!3 ~", H: "x ~ x!6",
  I: "x!3 ~ x!4", J: "~@7 x", K: "~ x ~@14",
})).gain(0.26)

// drums · ride
const ride = s("rd").struct("<~@8 A ~ A ~ A ~ A ~ A@8 ~@14 B ~@21 C ~@32 D@2 E F ~@2>".pickRestart({
  A: "~@3 x", B: "~@3 x ~@4", C: "~@7 x", D: "x!8", E: "x ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x", F: "~ x ~@14",
})).gain(0.26)

// drums · crash
const crash = s("cr").struct("<~@27 A ~@33 A ~@7 A ~@11 A ~@17>".pickRestart({
  A: "x",
})).gain(0.26)

stack(piano, electric_guitar_clean, bass, bass_2, kick, snare, hihat, ride, crash)

More by Tori Amos