Strudelify

Stay Another Day

East 17

KeyD majorTempo64 bpm
0:00/0:00
// Stay Another Day — East 17
// 64 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 67 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.

// chords · piano
const piano = note(`<
  A B C D@2 E F G H E F G H I J K L I J K M N O P Q R S T H E F G H U@2 J K M H V W@2 X Y Z AA AB@2 W@2 X Y Z AA AB@2
  W@2 X Y Z AA AC@3 ~@2
>`.pickRestart({
  A: "~@15 g4, [d3,f#4]@11 f#4@2 a3 f#4@2, [a3,d4]@9 a3@3 d3@4, ~ d2@3, ~@5 d4@3", // D D5
  B: "[c#3,a3,c#4,e4]@8 g3@2 ~ d4 ~@3 g3, ~ g2, ~@8 [b3,d4]@3 a3@2 [b3,d4]@3, ~@5 g3 d3@2, ~@7 a3", // A Bm
  C: "[a3,d4]@3 ~@2 a3 [a3,d4,f#4]@2 a3@4 a3@2 ~ c#4, [d2,f#3]@2 ~ [e3,c#4], ~@3 [a3,d4,f#4]@3 ~@2 [d4,e4]@6 [a3,d4,e4]@2, ~ d3 a2@2", // D5 D C#m D Dsus2 Asus4
  D: "[[a3,c#4] d4 ~@5 g4@4 ~@12 g2 g2@7 ~, g2@11 g4@3 b3@17 ~, ~@2 d4@11 g3@18 ~, ~@2 [g3,b3]@3 g3 b3@5 g3 g2@4 [d3,g4]@15 ~, ~@4 d3@11 d4@16 ~]/2", // A G G5
  E: "~@13 a3 ~ g4, [d3,a3,d4,f#4]@11 [a3,d4,f#4]@3 [a3,d4,f#4]@2, ~ d2@3, ~@3 d3", // D
  F: "~@5 a3 [a3,c#4,e4]@2 ~@6 [a3,d4]@2, a2 [g2,g3,b3], [a3,c#4,e4]@3 ~ d4@3 ~, ~ e3 ~ d3", // A D5 G A
  G: "~ d3 ~ e3, [d2,f#3,a3,d4] [a2,a3,d4,e4]", // D Asus4
  H: "[g3,b3]@4 [g3,b3]@4 [g3,b3]@3 ~@2 g3 [g3,b3,e4]@2, g2, d3@11 d4@5, ~@11 [g3,b3]@3 ~@2, ~@3 d3", // G Em G
  I: "~@2 d3 ~@2 d3!3, d2, ~ a2@7, ~ [f#3,a3]!3, ~@3 d3@2 ~@3", // F#m
  J: "[a2,e3]@2 ~@4 c#4 d4 d3@2 ~@2 d3@2 d3@2, [a3,c#4]@5 a3@2 ~@4 g2@5, ~ e3 e3@2 ~ d3 [g3,b3]@2, ~@3 a2@4 ~ [g2,g3,b3]@4 ~@4", // A5 A G
  K: "f#3!4 e3!2 [e3,a3]!2, [d2,d3] a2, [a3,d4]!2 [a3,c#4] c#4", // A5 D D5 A
  L: "~@3 d4@2 ~@9 f#4 a3, g2@11 g3 d3 g3@3, ~ d3@10 e4@5, ~@2 g3@3 g3@2 a4@9, ~@6 d4@3 g3 d4@6",
  M: "~@3 d4@2 ~@10 f#4, g2@11 g3 d3 g3 [d4,g4]@2, ~ d3@8 g3 d4 e4@5, ~@2 g3@3 g3 d4 a4@9, ~@3 b3@5", // G5
  N: "~@2 d3 ~@2 d3!3, d2, [d3,f#3] [f#3,a3]!3, ~ a2@7, ~@3 d3@2 ~@3", // D F#m
  O: "e3 ~@2 c#4 [g2,b3] ~@2 [d3,d4], a3@7 ~ g3@5 g3@3, [a2,c#4]@3 a2@5 ~@3 [g2,b3]@5, ~@2 e3@2 e3@4 d3 ~ d3@2 d3@2 ~@2, ~@4 c#4 d4@2 ~@9", // G D A G
  P: "f#3!4 e3!2 [e3,a3]!2, [d2,d3] a2, a3 [a3,d4] [a3,c#4] ~, d4 ~@11 c#4@4", // A5 D D5 A
  Q: "~@6 g3@3 ~@6 g4, g2@11 g3 d3 g3 d5@2, ~ g3@5 ~@3 g3 d5 a5@5, ~ d4@2 d4@5, ~@3 a4@13",
  R: "[a3,d4]@4 a3@4 a3@3 ~@2 a3 ~ e6, d3@11 [a3,d4]@3 [a3,d4,g6]@2, ~ d2@3, ~@4 d4@7 f#4@5, ~@3 d3", // D5 Dsus4
  S: "e3@4 ~ a3 ~ d6 ~@6 [a3,d4]@2, a2 [g2,g3,b3], [a3,c#4]@3 [a3,c#4,e6] d4@3 ~, ~ e3 ~ d3", // D5 G A
  T: "[a3,d4] ~ d3@2 ~@2 e3@2, [d2,f#3] [a2,a3,d4,e4], ~ a3@3 ~@4, ~@3 d4@5 ~@8", // D5 D Asus4
  U: "[~@9 g4!2 ~@9 d3@2 ~@4 d3@2 d3@2 d3@2, g2@15 a4 d2@2 a2@2 [f#3,a3]@2 d3@2 [f#3,a3]@4 [f#3,a3]@4, d3@7 g4@9, g3@2 [g4,b4]@2 g3@2 [g4,b4]@3 d4@2 [g4,a4]@2 [d4,b4]@19, ~ d4@2 a4@2 d4@2 a4 g3 a4 b4@2 g3@20]/2", // F#m G Gsus2 G
  V: "a3@2 a3 ~@7 d4 ~@4 f#4, d2@3 [d2,d3], d4@5 a3@3 d3@4 ~@2 d4@2, [d3,f#4]@3 f#4@3 d4@3 a3@2 a3@2 a3@3, ~@3 a3 d3@3 f#4@4 [d4,f#4]@4 ~", // D
  W: "[a3 ~ c#4 ~@4 a4 [b3,d4] b3@2 ~@5 a3 ~ d4 ~@4 f#4 a3 ~ [d4,e4] ~@3 d4@2, a2@6 c#4@2 ~@3 [d4,g4]@2 b3@3 [d2,a2,d3,d4,f#4] a3@2 [a3,d4,f#4] [a2,d3] a3 d4@2 [d4,e4]@2 ~ [e4,a4]@5, [e3,e4] e3 g2@4 a2@2, c#4@2 ~ [e4,a4]@5 ~@3 b3 d3@2 d4 g4@9 ~ a3@2 [a3,d4]@2 a3@3, ~ a3@2 [a3,c#4]@2 a3@3 [d3,g3,g4]@4 g3@12 e3@4 e3@4]/2", // Bm Dsus2 G5 D D5 Dsus2 A5 E …
  X: "b3 ~ d4 ~@3 d4 ~@2 b3 [b3,e4] [b3,d4,e4] ~@2 b3!2, [g2,d3], [g3,g4]@4 g3@3 b3 g3@5 g3@3, d4@2 ~ [d4,g4]@4 g4@9, ~ b3@2 b3@2 b3@2 d4@4 ~ [b3,d4,e4]@2 [d4,e4]@2", // E5 E7 G5 G G5 E7 Dsus2
  Y: "a3 ~ d4 ~@12 f#4, d2, [d3,f#4]@4 d3@3 f#4@3 d4@3 a3@3, d4@2 ~ [d4,f#4]@3 d4@3 a3@3 d3@4, ~ a3@4 a3@3 d3@3 f#4@3 d4@2", // D
  Z: "a3 ~@4 e4 [e4,a4] e4 ~ d4 g4 ~@4 b4, [a2,e3]@2 d3 [g2,d3,g3], [c#4,e4]@2 c#4@6 ~@2 d4@3 d4@3, ~ a3@2 [e4,a4]@3 ~ [a4,c#5]@2 ~@2 g4@3 g4@2, ~ a3 a3@2", // A5 G5 C#m A5 A
  AA: "[a3,d4,f#4] ~ d4 ~@4 f#4 a3@2 a3 ~@3 [d4,e4,a4]@2, d2@8 ~@5 a3@3, d3@3 [d4,f#4]@3 d4@2 ~@3 [a3,d4,e4,a4]@3 ~@2, ~ a3@3 d3@4 a2@8, ~@5 a3@3 [e3,d4,e4,a4]@4 e3@4", // D Dsus2 D Asus4 Dsus2
  AB: "[[a4,b4] ~@2 g3@3 ~ b3 [g3,b3,d4,g4]@3 ~@5 a3@2 a3 ~@7 d4 ~@4 f#4, [g2,d5]@14 d4 b3 [d2,d3,d4,f#4]@3 [a3,f#4] d3 a3 d4 f#4 d3 a3@2 [a3,d4,f#4] [d2,d3] a3 d4@2, ~ b4@31, ~ g4@3 ~@2 g3@10, ~@6 g3@2 ~@3 [b3,d4,g4]@2 b3 g4@18]/2", // Asus2 G G5 D G
  AC: "[[a4,b4] ~@2 g3@3 ~ b3 [g3,b3,d4,g4]@3 ~@4 b3@32 ~, [g2,d5]@2 ~, ~ b4@32 ~@15, ~ g4@3 ~@2 g3@16 ~@2, ~@6 g3@2 ~@3 [b3,d4,g4]@2 b3 [d4,g4]@32 ~@2]/3", // Asus2 G G5 G G5
})).s("gm_piano").gain(0.46)

// other · tubular bells
const tubular_bells = note("<~@47 A B@2 C D E D@2 A B@2 C D E D@3 B@2 F>".pickRestart({
  A: "~@9 d5 c#5 b4 a4 g4 f#4 e4", B: "d4 d5 c#5 b4 a4 g4 f#4 e4 d4 d5 c#5 b4 a4 g4 f#4 e4",
  C: "~ d5 c#5 b4 a4 g4 f#4 e4 d4 d5 c#5 b4 a4 g4 f#4 ~", D: "~ d5 c#5 b4 a4 g4 f#4 e4 d4 d5 c#5 b4 a4 g4 f#4 e4",
  E: "d4 d5 c#5 b4 a4 g4 f#4 e4 ~ d5 c#5 b4 a4 g4 f#4 e4", F: "d4 ~@15",
})).s("gm_tubular_bells").gain(0.29)

// other · pizzicato strings
const pizzicato_strings = note("<~@4 A B C D ~ E C D F ~@26 E C D ~ E C D F E C D ~ E C D F ~@12>".pickRestart({
  A: "~@12 d4 g4 a4!2", B: "d4 a4 d5!2 ~@12", C: "~@2 a4!2 ~@12", D: "~@2 d5!2 ~@12", E: "~ a4 d5!2 ~@12",
  F: "~@11 d4 g4 a4 g4 a4",
})).s("gm_pizzicato_strings").gain(0.29)

// other · timpani
const timpani = note("<A ~@38 B ~@3 C D E F G H I J K H I L G H I J K H I L M N O P>".pickRestart({
  A: "~@3 d3 d3@9 ~@3", B: "d2@11 ~@5", C: "d2@12 ~@2 a2 ~", D: "a2@5 ~@11", E: "d3 ~@7 a2@5 ~ g2 ~, ~@8 d3 ~@7",
  F: "g2@11 ~@5", G: "d2@11 ~@4 a2", H: "a2@5 ~@10 d3", I: "d3@6 ~ d3 a2@5 ~@2 g2", J: "g2@8 g2 ~@7", K: "d2@12 ~@3 a2",
  L: "g2@4 g2 ~@3", M: "d3@5 ~ a2 ~ d3@2 a2!2 d3 ~ a2!2", N: "d3@4 ~@2 a2!2 d3 ~ a2 ~ d3 ~ a2!2",
  O: "d3@4 ~@2 a2!2 d3 ~ a2!2 d3 ~ a2!2", P: "d3 ~@3",
})).s("gm_timpani").gain(0.42)

// chords · synth strings 1
const synth_strings_1 = note("<A B@4 C@8 ~@12 C@4 D@5 ~@3 E@2 F@4 C@4 F@4 C@4 G@4 C@4 H@4>".pickRestart({
  A: "~@4 d2@11 ~, [a3,d4,f#4]", // D
  B: "[[c#2,c#4,e4,a4] [g2,b3,g4] [d2,f#4] [a2,e4] ~@2 d5 e5, ~ d4@3 [g2,g3,d4]@4, ~@16 a3@18 a3@29 ~, ~@16 b3@3 ~@13, ~@9 a4@7]/4", // A G D A5 G5
  C: "[~@4 d2@11 [a2,c#4,e4]@8 ~ [g2,b3]@8 [d2,f#4]@8 [a2,d4,e4]@8 [g2,g3,d4]@15 ~, a3@23 g3@8 ~ a3@31 ~, [d4,f#4]@15 ~@9 d4@16 ~@24]/4", // A G D Asus4 G5 D
  D: "[~@4 d2@11 [a2,c#4,e4]@8 ~ [g2,b3]@8 [d2,f#4]@8 [a2,d4,e4]@8 [g2,g3,d4]@32, a3@23 g3@8 ~ a3@48, [d4,f#4]@15 ~@9 d4@16 ~@40]/5", // A G D Asus4 G5 D
  E: "[~ d5, [g2,g3,a3,d4,g4]]/2", // Gsus2
  F: "[~@4 d2@11 [a2,c#4,e4]@8 ~ [g2,b3]@8 [d2,f#4]@8 [a2,d4,e4]@8 [g2,g3,d4]@16, a3@23 g3@8 ~ a3@32, [d4,f#4]@15 ~@9 d4@16 ~@24]/4", // A G D Asus4 G5 D
  G: "[~@4 d2@11 [c#4,e4]@8 ~ [g2,b3]@8 [d2,f#4]@8 [a2,d4,e4]@8 [g2,g3,d4]@16, a3@23 g3@8 ~ a3@32, [d4,f#4]@15 a2@7 ~@2 d4@16 ~@24]/4", // C#m G D Asus4 G5 D
  H: "[[d4,f#4,a4,d5]@25 ~@7]/4", // D
})).s("gm_synth_strings_1").gain(0.13)

// other · string ensemble 1
const string_ensemble_1 = note("<~@20 [~@9 c#3 d3 c#3 d3 c#3 d3@2] ~@16 [~@9 c#3 d3 c#3 d3 c#3 d3@2] ~@29>")
  .s("gm_string_ensemble_1").gain(0.15)

// chords · string ensemble 2
const string_ensemble_2 = note(`<
  ~@3 A@2 ~@8 B@2 C D E@2 F@2 E@2 G@2 H@2 I J H@2 I K@2 E@2 L@3 ~@8 M N O@2 P@2 Q@2 R S T@2 U@2 V@2 W@4
>`.pickRestart({
  A: "[g3@3 ~@2 d5@2 e5, ~@3 d4@5, ~ g4]/2", B: "[~@15 c#3@8 ~ b2@8]/2", C: "a2@7 ~ c#3@8", D: "b2@15 ~",
  E: "[~@16 c#4@7 ~ b2@8, ~@15 c#3@8 b3@9]/2", F: "[[a2,a3]@4 a3@3 ~ d3@4 ~@4, ~ c#3 ~@2, ~@7 g3@9]/2",
  G: "[[a2,a3]@4 c#4@3 ~ d3@4 ~@4, ~ c#3 ~@2, ~@7 d4@9]/2", H: "[a3@3 b3]/2", I: "a3", J: "d4", K: "d4/2",
  L: "[[a2,a3]@4 a3@3 ~ d3@16, ~ c#3 ~@4, ~@7 g3@17]/3", M: "[f#4,a4,d5]", N: "[e4,a4,c#5] [d4,g4,b4]",
  O: "[f#4 e4@3, [a4,d5]@31 ~]/2", P: "[[f#4,d5]@2 [e4,c#5] [d4,g4,b4], a4@3 ~]/2", Q: "[f#4@7 e4@8 ~@17, [a4,d5]]/2",
  R: "[a4,d5]", S: "c#5 [g4,b4], a4", T: "[[a4,d5]@31 ~]/2", U: "[d5@2 c#5 [g4,b4], a4@3 ~]/2", V: "[a4,d5]/2",
  W: "[[d2,a5]@25 ~@7, [a4,d5]@3 ~]/4", // D5
})).s("gm_string_ensemble_2").gain(0.12)

// drums · crash
const crash = s("cr").struct("<~@39 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7>".pickRestart({
  A: "x",
})).gain(0.13)

stack(piano, tubular_bells, pizzicato_strings, timpani, synth_strings_1, string_ensemble_1, string_ensemble_2, crash)

More by East 17