Strudelify

Fable (Dream version)

Robert Miles

KeyC♯ minorTempo136 bpm
0:00/0:00
// Fable (Dream version) — Robert Miles
// 136 bpm, 4/4, key C# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 243 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(136/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.

// other · percussive organ · "Remixed"
const percussive_organ = 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 C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 ~@195
>`.pickRestart({
  A: "c#3", B: "b2", C: "a2/2",
})).s("gm_percussive_organ").gain(0.4)

// other · string ensemble 1 · "Remixed"
const string_ensemble_1 = note("<~@238 [e5 d#5 c#5 ~ e5 d#5 c#5 ~ e5 d#5 c#5 ~ e5 d#5 c#5 ~]!3 ~@2>")
  .s("gm_string_ensemble_1").gain(0.12)

// other · string ensemble 1 · "Remixed" · soft notes
const string_ensemble_1_soft = note("<~@241 [e5 d#5 c#5 ~ e5 d#5 c#5 ~ e5 d#5 c#5 ~ e5 d#5 c#5 ~]!2>")
  .s("gm_string_ensemble_1").gain(0.05)

// other · synth strings 2 · "Remixed"
const synth_strings_2 = 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 C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 D@8 ~@6 E@4 ~@30 F G
  H@3 I J@3 G H@3 I K@3 ~@23 L@8 F G H@3 I J@3 G H@3 I M@3 G H@3 I J@3 G H@3 I J@3 G H@3 I J@3 G H@3 I K@3 ~@15 D@8 ~@2
  N@6 O@8 ~@9 P@2
>`.pickRestart({
  A: "c#2", B: "b1", C: "a1/2", D: "c#2/8", E: "[c#7@63 ~]/4", F: "c#4", G: "d#4", H: "[e4 a4@7 g#4@4]/3", I: "b4",
  J: "[e4@2 c#4]/3", K: "[a4@11 ~@5]/3", L: "[~@3 g#4@5, c#3, ~ g#3@7, ~ c#4@3]/8", M: "[a4@2 c#4]/3",
  N: "[~@5 c#5, g#2@2 g#4, ~ c#3@5, ~ g#3@2, ~ c#4]/6", O: "[g#2,c#3,g#3,c#4,g#4,c#5]/8",
  P: "[g#2,c#3,g#3,c#4,g#4,c#5]/2", // C#5
})).s("gm_synth_strings_2").gain(0.1)

// other · acoustic guitar steel · "Remixed"
const acoustic_guitar_steel = note(`<
  ~@16 A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~@196
>`.pickRestart({
  A: "g#3 d#4 c#4 g#4@5", B: "f#3 c#4 b3 f#4@5", C: "e3 c#4 b3 e4@5",
})).s("gm_acoustic_guitar_steel").gain(0.21)

// other · string ensemble 1 · "Remixed"
const string_ensemble_1_2 = note(`<
  ~@48 A B C D A B C D A B C D A B C D ~@144 E@16 F G H@2 F G I@2 F G I@2 F G J@3 ~@2
>`.pickRestart({
  A: "c#4 ~ c#4 ~ c#4 ~ c#4 ~", B: "d#4 ~ d#4 ~ d#4 ~ d#4 ~", C: "f#4 ~ f#4 ~ f#4 ~ f#4 ~",
  D: "g#4 ~ g#4 ~ g#4 ~ g#4 ~", E: "c#5 ~ d#5 ~ e5 ~ g#5 ~", F: "e6 ~ d#6 ~ b5 ~ g#5 ~, c#6",
  G: "e6 ~ d#6 ~@3 g#5 ~, b5!2", H: "[e6 ~ d#6 ~ b5 ~ g#6 ~ e6 ~ d#6 ~ b5 ~ g#5 ~, c#6]/2",
  I: "[e6 ~ d#6 ~ b5 ~ g#5 ~ e6 ~ d#6 ~ b5 ~ g#5 ~, c#6]/2", J: "[c#5@5 ~]/3",
})).s("gm_string_ensemble_1").gain(0.09)

// other · string ensemble 1 · "Remixed" · soft notes
const string_ensemble_1_soft_2 = note("<~@136 [c#6 g#5 c#6 g#5 c#6 g#5 c#6 g#5]!8 ~@99>")
  .s("gm_string_ensemble_1").gain(0.04)

// other · synth strings 2 · "Remixed"
const synth_strings_2_2 = note(`<
  ~@16 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 C@2 A B C@2 ~@16 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 C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 ~@32 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 C@2 A B
  C@2 A B C@2 A B C@2 A B C@2 A B C@2 ~@51
>`.pickRestart({
  A: "g#4", B: "f#4", C: "e4/2",
})).s("gm_synth_strings_2").gain(0.1)

// other · pad sweep · "Remixed"
const pad_sweep = note(`<
  ~@32 A B C@2 A B D@2 A B C@2 A B D@2 ~@16 A B C@2 A B D@2 A B C@2 A B D@2 A B C@2 A B D@2 A B C@2 A B D@2 A B C@2 A B
  D@2 A B C@2 A B D@2 ~@32 A B C@2 A B D@2 A B C@2 A B D@2 A B C@2 A B D@2 A B C@2 A B D@2 A B C@2 A B D@2 A B C@2 A B
  D@2 ~@51
>`.pickRestart({
  A: "g#4", B: "b4", C: "c#5/2", D: "a4/2",
})).s("gm_pad_sweep").gain(0.1)

// bass · synth bass 2 · "Remixed"
const bass = note(`<
  ~@64 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A@33 B C D A B C
  D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A@33 E A E A E A E A E A E A E A E A
  ~@2
>`.pickRestart({
  A: "c#1 c#2 c#1 c#2 c#1 c#2 c#1 c#2", B: "b0 b1 b0 b1 b0 b1 b0 b1", C: "a0 a1 a0 a1 a0 a1 a0 a1",
  D: "a0 a1 a0 a1 a0 a1 b0 b1", E: "c#1 c#2 c#1 c#2 c#1 c#2 c#1 b1",
})).s("gm_synth_bass_2").gain(0.22)

// other · string ensemble 1 · "Remixed"
const string_ensemble_1_3 = note(`<
  ~@47 A B C D E B C D E B C D E B C D E F G H@2 F G H@2 F G H@2 F G H@2 F G H@2 F G H@2 F G H@2 F G H@2 F G H@2 F G H@2
  F G H@2 F G H@2 ~@8 I J I ~ I J I ~ I J I ~ I J I ~ I J I ~ I J I ~ F G H@2 F G K@3 G H@2 F G H@2 F G H@2 F G K@3 G
  H@2 F G H@2 F G H@2 F G K@3 G H@2 F G H@2 ~@22 L M@6 N@2 O M@14 P@3 ~@2
>`.pickRestart({
  A: "~@12 e5 d#5 b4 c#5", B: "e5 ~ c#5 ~ e5 ~ c#5 ~ e5 ~ c#5 ~ e5 ~ c#5 ~",
  C: "d#5 ~ b4 ~ d#5 ~ b4 ~ d#5 ~ b4 ~ d#5 ~ b4 ~", D: "f#5 ~ d#5 ~ f#5 ~ d#5 ~ f#5 ~ d#5 ~ f#5 ~ d#5 ~",
  E: "g#5 ~ e5 ~ g#5 ~ e5 ~ g#5 ~ e5 ~ g#5 ~ e5 ~", F: "g#4 c#5 g#4 g#5@5", G: "f#4 c#5 f#4 f#5@5",
  H: "[e4 c#5 e4 e5@13]/2", I: "g#4 ~ c#5 ~ g#4 ~ g#5@2 ~@8", J: "f#4 ~ b4 ~ f#4 ~ f#5@2 ~@8",
  K: "[e4 c#5 e4 ~@9 e6@2 ~@2 g#4 c#5 g#4 g#5@5, ~@3 e5@13 ~@8, ~@14 g#6@3 ~@7]/3",
  L: "~@4 e6 ~ d#6 ~ e6 ~ c#6 ~ g#5 ~@3", M: "e6 ~ d#6 ~ e6 ~ d#6 ~ e6 ~ c#6 ~ g#5 ~@3",
  N: "e6 ~ d#6 ~ e6 ~ d#6 ~ e6 ~ d#6 ~ e6 ~ d#6 ~", O: "e6 d#6 e6 d#6 e6 d#6 e6 d#6 e6 d#6 e6 d#6 e6 d#6 e6 d#6",
  P: "e6 d#6 b5 ~ e6 d#6 b5 ~ e6 d#6 b5 ~ e6 d#6 b5 ~",
})).s("gm_string_ensemble_1").gain(0.14)

// other · string ensemble 1 · "Remixed" · soft notes
const string_ensemble_1_soft_3 = note(`<
  ~@112 A@3 ~@5 B C B D B C B D B C B D B C B D B C B D B C B D ~@7 E ~@15 E ~@15 E ~@8 A@3 ~@13 F@6 G ~@28
>`.pickRestart({
  A: "c#5 e5 ~@2 c#5 e5 ~@2 c#5 e5 ~@2 c#5 e5 ~@2", B: "~@8 g#4 ~ g#5 ~ g#4 ~ g#5 ~", C: "~@8 f#4 ~ f#5 ~ f#4 ~ f#5 ~",
  D: "g#4 ~ g#5 ~ g#4 ~ g#5 ~ g#4 ~ g#5 ~ g#4 ~ g#5 ~", E: "c#6 d#6 ~@2", F: "e6 ~ d#6 ~ e6 ~ d#6 ~ e6 ~ c#6 ~ g#5 ~@3",
  G: "e6 ~ d#6 ~@13",
})).s("gm_string_ensemble_1").gain(0.04)

// chords · piano · "Remixed"
const piano = note("<~@142 A@3 ~@98>".pickRestart({
  A: "[~@8 g#3 ~ b3 ~ c#4 ~ d#4 ~ e4 ~ f#4 ~ g#4 ~ b4 ~ c#5 ~ d#5 ~ e5 ~ f#5 f#5@2 ~@15, ~@9 g#3@2 b3@2 c#4@2 d#4@2 e4@2 f#4@2 g#4@2 b4@2 c#5@2 d#5@2 e5@2 ~@17]/3",
})).s("gm_piano").gain(0.2)

// chords · piano · "Remixed" · soft notes
const piano_soft = note("<~@142 [c#3 ~ d#3 ~ e3 ~ f#3 f#3@2 ~@7, ~ c#3@2 d#3@2 e3@2 ~@9] ~@100>")
  .s("gm_piano").gain(0.12)

// other · piano · "Remixed"
const piano_2 = note(`<
  ~@80 A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B ~@48 A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A
  ~@2 B A ~@2 B A ~@2 B ~@16 C@33 ~@2
>`.pickRestart({
  A: "c#5 c#6 c#5 c#6 ~@12", B: "~@12 a4 a5 a4 a5", C: "~@10 g#4 ~@5",
})).s("gm_piano").gain(0.05)

// other · epiano1 · "Remixed"
const epiano1 = note(`<
  ~@80 A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B ~@48 A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A
  ~@2 B A ~@2 B A ~@2 B ~@16 C@33 ~@2
>`.pickRestart({
  A: "~@4 c#5 c#6 c#5 c#6 ~@8", B: "~@8 a4 a5 a4 a5 ~@4", C: "~@6 g#4 ~@9",
})).s("gm_epiano1").gain(0.05)

// other · epiano2 · "Remixed"
const epiano2 = note(`<
  ~@80 A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B ~@48 A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A
  ~@2 B A ~@2 B A ~@2 B ~@16 C@33 ~@2
>`.pickRestart({
  A: "~@8 c#5 c#6 c#5 c#6 ~@4", B: "~@4 a4 a5 a4 a5 ~@8", C: "~@12 c4 ~@3",
})).s("gm_epiano2").gain(0.05)

// other · harpsichord · "Remixed"
const harpsichord = note(`<
  ~@80 A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B ~@48 A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A
  ~@2 B A ~@2 B A ~@2 B ~@16 C@33 ~@2
>`.pickRestart({
  A: "~@12 c#5 c#6 c#5 c#6", B: "a4 a5 a4 a5 ~@12", C: "~@2 g#4 ~@13",
})).s("gm_harpsichord").gain(0.05)

// other · clavinet · "Remixed"
const clavinet = note(`<
  ~@81 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@50 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2
  A B ~@2 A B ~@17 C@33 ~@2
>`.pickRestart({
  A: "b4 b5 b4 b5 ~@12", B: "~@12 a4 a5 a4 a5", C: "~@8 c4 ~@7",
})).s("gm_clavinet").gain(0.05)

// other · celesta · "Remixed"
const celesta = note(`<
  ~@81 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@50 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2
  A B ~@2 A B ~@17 C@33 ~@2
>`.pickRestart({
  A: "~@4 b4 b5 b4 b5 ~@8", B: "~@8 a4 a5 a4 a5 ~@4", C: "~@4 d5 ~@11",
})).s("gm_celesta").gain(0.05)

// other · glockenspiel · "Remixed"
const glockenspiel = note(`<
  ~@81 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@50 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2
  A B ~@2 A B ~@52
>`.pickRestart({
  A: "~@8 b4 b5 b4 b5 ~@4", B: "~@4 a4 a5 a4 a5 ~@8",
})).s("gm_glockenspiel").gain(0.05)

// other · music box · "Remixed"
const music_box = note(`<
  ~@81 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@50 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2
  A B ~@2 A B ~@17 C@33 ~@2
>`.pickRestart({
  A: "~@12 b4 b5 b4 b5", B: "a4 a5 a4 a5 ~@12", C: "d5 ~@15",
})).s("gm_music_box").gain(0.05)

// drums · kick
const kick = s("bd").struct(`<
  ~@62 A B C@7 D C@15 E C@15 D C@7 ~ C@3 F C@3 G C@7 H C@7 D C@31 I C@15 I C@7 ~ C@3 F C@3 F C@7 J C@16 J C J C J C J C
  J C J C J C K B L M ~
>`.pickRestart({
  A: "~@2 x!6", B: "x!16", C: "x!4", D: "x ~@3 x ~@3 x!3 ~ x ~ x ~", E: "x ~@3 x!3 ~ x ~@3 x ~@3",
  F: "x ~@3 x ~@3 x ~@3 x ~@2 x", G: "x ~@3 x ~@3 x!3 ~ x ~@3", H: "x ~@3 x ~@3 x ~@2 x!2 ~@3",
  I: "x ~@3 x ~@3 x ~@3 x!2 ~@2", J: "x ~ x ~ x ~ x!2", K: "x!8", L: "x!13 ~ x ~", M: "x",
})).gain(0.48)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@58 A B C D E ~@64 F ~@23 G ~@91>".pickRestart({
  A: "x ~@6 x", B: "x", C: "x!2", D: "x!4", E: "x!2 ~@6", F: "~@15 x", G: "~@13 x ~@2",
})).gain(0.24)

// drums · snare
// … 45 more lines

More by Robert Miles