Strudelify
Blue Savannah cover art

Wild!

Blue Savannah

Erasure

KeyD majorTempo135 bpm
0:00/0:00
// Blue Savannah — Erasure
// 135 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 130 bars on a 16-step grid, each part at one level. 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 2
const bass = note(`<
  ~ A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B D@2 A@2 B@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B
  D@2 A@2 B@2 E F E@2 G@2 E@2 H@2 G I H@2 J G A B C@2 A B C@2 A B C@2 A B C@2 A B D@2 A@2 B@2 A B D@2 A@2 B@2 A B D@2
  A@2 B@2 A B D@2 K@2 L@2 ~
>`.pickRestart({
  A: "g1 ~ g1!3 ~ g1 ~ g1 ~ g1 ~ g1 ~ g2 ~", B: "a1 ~ a1!3 ~ a1 ~ a1 ~ a1 ~ a1 ~ a2 ~",
  C: "d1 ~ d1!3 ~ d1 ~ d1 ~ d1 ~ d1 ~ d2 ~", D: "b1 ~ b1!3 ~ b1 ~ b1 ~ b1 ~ b1 ~ b2 ~",
  E: "d1 ~ d1!3 ~ d1@3 ~ d1@3 ~ d1 ~", F: "c2 ~ c2 c2@2 ~ g1@4 g1@3 ~ g1 ~", G: "g1 ~ g1!3 ~ g1@3 ~ g1@3 ~ g1 ~",
  H: "c1 ~ c1!3 ~ c1@3 ~ c1@3 ~ c1 ~", I: "g1@2 g1!2 ~@2 g1@3 ~ g1@3 ~ g1 ~", J: "g1 ~ g1!3 ~ g1@3 ~ g1@4 g1 ~",
  K: "d2 ~ d2!3 ~ d2 ~ d2 ~ d2 ~ d2 ~ d3 ~", L: "a1/2",
})).s("gm_synth_bass_2").gain(0.6)

// other · piano · "Bright Acoustic Piano"
const piano = note("<~@35 A@2 ~@2 B@2 ~@42 A@2 ~@2 B@2 ~@14 C@2 ~@6 D@2 ~@6 C@2 ~@9>".pickRestart({
  A: "[~@15 f#5, d3!3 a3!3 f#4!2 f#4 d5!3 a5!3 ~, ~ a2@2 f#3@2 f#3@2 f#3@2 d4@2 d4@2 d4@2 a4@2 a4@2 a4@2 f#5@2 f#5@2 f#5@2 d6@2 g5@2 ~]/2",
  B: "[~@15 f#3, d6 f#5!3 a4!3 d4 d4!2 f#3!3 a3 f#3 ~, ~ a5@2 a5@2 d5@2 d5@2 d5@2 f#4@2 f#4@2 f#4@2 a3@2 a3@2 a3@2 d3@2 d3@2 g3@2 d3@2 ~]/2",
  C: "[~@15 a2, c#6 e5!3 a4!3 c#4 c#4!2 e3!4 c#3 ~, ~ a5@2 a5@2 c#5@2 c#5@2 c#5@2 e4@2 e4@2 e4@2 a3@2 a3@2 a3@2 c#3@2 c#3@2 d3@2 b2@2 ~]/2",
  D: "[~@15 e5, c#3!3 a3!3 e4!2 e4 c#5!3 a5!3 ~, ~ a2@2 e3@2 e3@2 e3@2 c#4@2 c#4@2 c#4@2 a4@2 a4@2 a4@2 e5@2 e5@2 e5@2 c#6@2 f#5@2 ~]/2",
})).s("gm_piano").gain(0.64)

// chords · pad poly · "Pad 3 (polysynth)"
const pad_poly = note(`<
  ~ A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 D B E@2 F@2 G@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 D B
  E@2 F@2 G@2 ~@8 H@2 I@2 J@2 I@2 A B C@2 A B C@2 A B C@2 A B C@2 D B E@2 F@2 G@2 D B E@2 F@2 G@2 D B E@2 F@2 G@2 D B
  E@2 K@2 G@2 ~
>`.pickRestart({
  A: "[g3,b3,d4]@7 ~", B: "[a3,c#4,e4]@15 ~", C: "[[a3,d4,f#4]@31 ~]/2", D: "[g3,b3,d4]@15 ~",
  E: "[[b3,d4,f#4]@15 ~]/2", F: "[[a#3,d4,g4]@31 ~]/2", G: "[a3,c#4,e4]/2", H: "[[c4,e4,g4]@31 ~]/2",
  I: "[[b3,d4,g4]@31 ~]/2", J: "[[c4,e4,g4]@15 ~]/2", K: "[[a3,d4,g4]@31 ~]/2",
})).s("gm_pad_poly").gain(0.45)

// other · synth brass 2
const synth_brass_2 = note(`<
  ~@25 A B C@2 D@2 E@2 ~@24 A B C@2 D@2 E@2 ~@20 F G H ~@9 A B C@2 D@2 E@2 A B C@2 D@2 E@2 A B C@2 D@2 E@2 A B C@2 D@2
  E@2 ~
>`.pickRestart({
  A: "b3", B: "c#4@3 a3", C: "[d4@26 ~@2 e4 f#4 g4 a4]/2", D: "a#4/2", E: "[a4@31 ~]/2", F: "g5", G: "c#5@15 ~",
  H: "d5",
})).s("gm_synth_brass_2").gain(0.4)

// other · trumpet
const trumpet = note(`<
  ~@9 A ~@7 A ~@15 B C D ~ B C D ~ A ~@7 A E ~@30 B C D ~ B C D ~ A E ~@14 B C ~@6 B C D ~@5 B C D ~@6
>`.pickRestart({
  A: "~@2 [b5,d6] ~@2 [b5,d6] ~@2", B: "~@2 d6 ~@2 d6 ~ d6", C: "~@4 d6@2 ~@4 d6 ~@3 d5@2", D: "~@2 d6 ~@5",
  E: "[b5,d6] ~@7", // Bm
})).s("gm_trumpet").gain(0.4).pan(0.8)

// chords · shamisen
const shamisen = note("<~ A@24 B@7 C@5 A@20 B@7 D@3 ~@14 A@12 E@6 ~@6 B@7 F@8 G@8 ~@2>".pickRestart({
  A: "[d3@3 ~@5 e3@3 ~@5 d3@3 d3@5 d3@3 d3@5, ~@3 d3@13 ~@16, ~@11 e3@16 ~@5]/4",
  B: "[d3@3 ~@5 e3@3 ~@5 f#3@3 f#3@5 f#3@3 ~@5 g3@3 g3@5 g3@3 ~@5 e3@3 e3@5, ~@3 d3@16 ~@37, ~@11 e3@16 f#3@16 g3@13]/7",
  C: "[e3@3 ~@5 d3@3 ~@5 e3@3 ~@5 d3@3 d3@5 d3@3 d3@5, ~@3 e3@13 ~@3 e3@16 ~@5, ~@11 d3@13 ~@16]/5",
  D: "[e3@3 e3@16 ~@5]/3", E: "[d3@3 ~@5 e3@3 ~@5 d3@3 d3@5 d3@3 d3@16 ~@5, ~@3 d3@13 ~@32, ~@11 e3@16 ~@21]/6",
  F: "[e3@3 ~@5 d3@3 ~@5 e3@3 ~@5 f#3@3 f#3@5 f#3@3 ~@5 g3@3 g3@5 g3@3 ~@5 e3@3 e3@5, ~@3 e3@13 ~@3 e3@16 f#3@16 g3@13, ~@11 d3@16 ~@37]/8",
  G: "[e3@3 ~@5 d3@3 ~@5 e3@3 ~@5 f#3@3 f#3@5 f#3@3 ~@5 d4@3 d4@5 d4@3 d4@13, ~@3 e3@13 ~@3 e3@16 f#3@16 ~@13, ~@11 d3@16 ~@37]/8",
})).s("gm_shamisen").gain(0.5).pan(0.3)

// other · pad new age · "Pad 1 (new age)"
const pad_new_age = note("<~@64 A B@3 C D@3 E@4 F@4 ~@50>".pickRestart({
  A: "~@7 e5", B: "[f#5!3 f#5@2 d5!2 e5@3 e5 d5@2 c5 b4 b4@2 a4@3 ~@4]/3", C: "~@7 a4",
  D: "[b4!3 d5@2 d5!2 d5@3 d5 d5@2 e5 f#5 f#5@2 e5 d5@4 ~@2]/3",
  E: "[~@4 a4!3 c5@3 b4 c5@3 b4 c5@3 b4 c5@2 b4@2 b4@2 a4 g4@6]/4",
  F: "[~@4 g4 a4 b4 c5@3 b4 c5@3 b4 c5@3 b4 c5@2 d5!2 d5@2 c5 g4@6]/4",
})).s("gm_pad_new_age").gain(0.4).pan(0.1)

// chords · pad metallic · "Pad 6 (metallic)"
const pad_metallic = note("<~@65 A B C@2 D@2 C@2 E@2 D@2 F@2 G@2 ~@49>".pickRestart({
  A: "[d4,f#4,a4]@15 ~", B: "[c4,e4,g4]@7 ~ [b3,d4,g4]@7 ~", C: "[[d4,f#4,a4]@15 ~]/2", D: "[[d4,g4,b4]@15 ~]/2",
  E: "[[c4,e4,g4]@15 ~]/2", F: "[[e4,g4,c5]@15 ~]/2", G: "[~ g5, [g4,b4,d5]]/2",
})).s("gm_pad_metallic").gain(0.5)

// drums · kick
const kick = s("bd").struct("<~ A@64 B@3 C B@7 C B@4 A@46 ~@3>".pickRestart({
  A: "x!4", B: "x ~ x ~@3 x ~@3 x ~@4 x", C: "x!2 ~ x ~ x ~ x",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct("<A B C@30 D C@31 D C@15 D C@16 ~@7 E C@22 ~@3>".pickRestart({
  A: "~@14 x!2", B: "x!2 ~ x", C: "~ x ~ x", D: "~@4 x ~@5 x!5 ~", E: "~@12 x!4",
})).gain(0.5)

// drums · crash
const crash = s("cr").struct("<~ x ~@128>").gain(0.5)

// drums · cowbell
const cowbell = s("cb").struct(`<
  ~
  [x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~]!64
  ~@16
  [x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~]!16
  ~@4
  [x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~]!26
  ~@3
>`).gain(0.35)

// drums · congas
const congas = s("conga:13").struct("<~@8 A ~@7 A ~@7 A ~@15 A ~@7 A ~@7 A ~@31 A ~@7 A ~@15 A ~@7 A ~@9>".pickRestart({
  A: "~@10 x!3 ~ x ~",
})).gain(1.59)

// drums · guiro
const guiro = s("guiro:0").struct("<~ [x!8]!64 ~@8 [x!8]!24 ~@4 [x!8]!26 ~@3>").gain(9.43)

stack(
  bass, piano, pad_poly, synth_brass_2, trumpet, shamisen, pad_new_age, pad_metallic, kick, snare, crash, cowbell,
  congas, guiro
)

More by Erasure