Strudelify

Rhythm of Love

Yes

KeyG majorTempo125 bpm
0:00/0:00
// Rhythm of Love — Yes
// 125 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 133 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): PRG.CHANGE, PRG.CHANGE.
setcpm(125/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 1 · "PRG.CHANGE"
const bass = note(`<
  ~@17 A B@2 C@2 B@2 D E F G H I J@2 H I K@2 H L F M N@2 O@2 P Q R@2 S@2 T U V W X Y Z C AA AB AC AD AE AB AF AG AH AI
  AJ AK AL AM AB AN AO AP AQ AR AS AT R AU AV ~ AW AX AY AZ Y BA BB BC BD BE BF BG@2 BH BI BJ ~@3 BK BL BM ~ BN BO BP AP
  BQ BR BS@2 BT BU@2 BV BW BX BY BZ CA CB CC BZ CD CE CF BF CG ~
>`.pickRestart({
  A: "~ b0", B: "d1!8", C: "g1!8", D: "g1!5 g2 g#2 a2", E: "c2 c#2 d2 f1 f#1 g1 c1 d1",
  F: "d1@2 d1@2 a1@2 d1@2 c2@2 d1@3 ~ d2@2", G: "d1 c2 d1 d2!2 e1 d2 g2", H: "g2@2 g2@2 g1@2 g2@2 f2@2 g2@3 ~ g2@2",
  I: "g2 d2 ~ f2!2 g2!2 d2", J: "[d1@2 d1@2 a1@2 d1@2 c2@2 d1@3 ~ d2@4 d1@2 ~@2 c2@2 c2@2 d1@2 c2@2 g2@2]/2",
  K: "[d1@2 d1@2 a1@2 d1@2 c2@2 d1@3 ~ d2@4 d1@2 d1@2 c2@2 c2@2 d1@2 c2@2 g2@2]/2", L: "~ d2 ~ f2!2 g2!2 d2",
  M: "d1 a1 ~ c2!2 d1 c2 g2", N: "[g2@2 g2@2 g2@2 g2@2 f2@2 g2@3 ~ g2@4 g2@2 a2 ~ c2@2 c#2@2 d2@2 g1@2 g#1@2]/2",
  O: "a1/2", P: "e3", Q: "b2@5 ~ g2@6 d2@4, a2 ~@15", R: "a1@6 a1@2 a1@5 ~@3",
  S: "[a1@3 a1 a1@2 ~ a1@2 b1@2 d2@2 g2@3]/2", T: "d3 ~@7", U: "d1@4 ~@2 c1@2 d1@5 ~ d1@2", V: "d1@2 ~ c1 d1!2 ~ d1",
  W: "g1@5 ~ g1@2 ~@2 g1@2 b1@4", X: "~ b1 ~ c2!2 ~ c#2 ~", Y: "d2@2 c2@2 a1 ~ d1@2 d1@4 ~@2 d1@2",
  Z: "d2@5 ~ c2@2 c2@2 d2@4 d2 ~", AA: "g1!2 b0@2 c1@2 c#1@2", AB: "d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~",
  AC: "d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ f#1@2", AD: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~",
  AE: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ d1@2", AF: "d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ g1@2",
  AG: "g1 ~ g1 ~ g1 ~ g1 ~ f#2 ~ g2 ~ g#2 ~ a2 ~", AH: "c2 ~ c#2 ~ d2 ~ g1 ~ g#1 ~ a1@2 c1@2 d1@2",
  AI: "d1!2 a1 d1 c2 d1@2 d2", AJ: "d1!3 c2!2 d1 c2 g2", AK: "g2!2 g1 g2 f2 g2@2 g2", AL: "~ g2 ~ g1 g#1 a1 c1 d1",
  AM: "~@2 d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~", AN: "g1!6 ~ g1", AO: "g2@2 g#2@2 a2 ~ c2@2 c#2@2 d2@2 g1@2 g#1@2",
  AP: "a1", AQ: "a1@3 e2 a1@4", AR: "a1@3 a1 a1@4", AS: "a2@5 ~ g2@5 ~ d2@4", AT: "a1@5 ~ a1@2 a1@7 ~",
  AU: "a1@6 a1@2 a1@5 ~ a1@2", AV: "b1@3 d2@2 g2@3", AW: "d1@2 d1@3 ~ c1@2 d1@2 d1@2 ~@2 c1@2",
  AX: "d1@2 ~ c1 d1 ~ c1 d1", AY: "g1@5 ~ g1@3 ~ g1@2 b1@4", AZ: "~ b1@3 c2 ~ d2@2", BA: "d1@2 ~ c1 d1 d1@2 d1",
  BB: "g1!4 ~ g1 b1!2", BC: "c2!4 c#2!2 d2!2", BD: "d2@2 c2@2 a1 ~ d1@2 d1@2 d1@4 c1@2", BE: "d1 d1@2 c1 d1 d1@2 d1",
  BF: "g1 ~ g1 ~ g1 ~ g1 ~@3 g1 ~ b1 ~ b1 ~",
  BG: "[c2@2 c2@2 c2@2 c2@2 c#2 ~ c#2 ~ d2 ~ d2@4 c2@2 a1 ~ d1@2 d1@2 d1@4 c1@2]/2",
  BH: "d1@2 d1@3 ~ c1@2 d1@2 d1@4 d1@2", BI: "g1 ~ g1 ~ g1 ~ g1 ~@3 g1 ~ g1 ~ g1 ~",
  BJ: "g1@2 g1@2 b1@2 b1@2 c2@2 c2@2 c#2@2 d2 ~", BK: "~@3 d1@5", BL: "~ d1 ~@2", BM: "~@4 d1@2 c1@6 d1@3 ~",
  BN: "~@3 g1@5", BO: "d1", BP: "c1", BQ: "g1@13 ~@3", BR: "d2", BS: "e2/2", BT: "g2@13 ~ c1@2",
  BU: "d1@2 ~ c1 d1!2 ~ c1", BV: "g1!2 ~ g1 ~ g1 b1@2", BW: "~ b1 c2@2 c#2 ~ d2@2", BX: "d2@2 c2 ~ a1 ~ d1@6 ~@2 c1@2",
  BY: "d1@5 ~ c1@2 d1 ~ d1 ~ d1 ~ d1 ~", BZ: "g1 ~ g1 ~ g1 ~ g1@2 ~@2 g1 ~ b1 ~ b1 ~",
  CA: "c2 ~ c2 ~ c2 ~ c2 ~ c#2 ~ c#2 ~ d2 ~ d2 ~", CB: "d2 ~ c2 ~ a1@2 d1@2 d1 ~ d1 ~ d1@2 d1@2",
  CC: "d1 ~ d1 ~ d1@2 d1@2 d1 ~ d1 ~ d1@2 d1@2", CD: "b1 ~ b1@4 b1@2 c2 ~ c2@2 c#2@2 c#2@2",
  CE: "d2@2 c2 ~ a1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~", CF: "d1 ~ d1 ~ d1@2 d1@2 d1 ~ d1 ~ d1 ~ d1 ~",
  CG: "b1 ~ b1 ~ b1 ~ b1 ~ c2@2 c2 ~ c#2@2 c#2@2",
})).s("gm_synth_bass_1").gain(0.59).pan(0.3)

// other · electric guitar muted · "PRG.CHANGE"
const electric_guitar_muted = note(`<
  ~@31 A ~@4 B ~@2 C@2 ~@7 D E ~@9 F ~ G ~@2 H ~@4 B I ~ J@2 K ~@3 L M@3 N ~@42 O ~@7
>`.pickRestart({
  A: "~@6 c4 ~", B: "~@4 [g3,g4] ~@3", C: "[~@7 c4@7 ~@2]/2", D: "~@7 [a3,a4]", E: "[b3,b4]!2 ~@3 [b3,b4] ~ [b3,b4]",
  F: "[d3,d4] ~@7", G: "~@2 d4 ~@3 d4 ~", H: "~@5 a3 c4 ~", I: "~ d4 ~@2 f4 ~@3",
  J: "[~@12 [g3,g4] ~ [g3,g4] ~, ~@7 c4@7 ~@2]/2", K: "[g3,g4]!8", L: "[b3,b4]!8", M: "[a3,a4]!8",
  N: "[b3,b4]!4 ~ [b3,b4]!3", O: "~@14 d3 ~",
})).s("gm_electric_guitar_muted").gain(0.2).pan(0.6)

// chords · lead 1 square · "PRG.CHANGE"
const lead_1_square = note(`<
  ~@26 A@3 B C@3 D@2 E@2 F G H I ~@9 J@3 ~ K@3 L@7 M@2 N@3 O@3 P Q ~@9 R@2 ~@2 S ~ T@2 U V W X Y Z AA Z AB@2 ~@7 AC@4
  AD@3 AE ~@8 AF AG AH AI AJ AG AH AI ~
>`.pickRestart({
  A: "[a4@2 d4@3 ~ g4@2 ~@2 c4@2 ~@2 d4@4 g4@2 ~@10 a4@4 d4@3 ~ g4@3 ~ c4@3 ~ f4@2]/3", B: "~@7 a4",
  C: "[~@2 d4@4 g4@2 ~@2 c4@4 d4@4 g4@2 ~@10 a4@4 f4@4 g4@3 ~ c4@3 ~ d4@2]/3",
  D: "[~@12 f4@2 c5@4 f4@4 a4@4 f4@3 ~ g4@2]/2", E: "[~@4 f4 ~ e4@6 f4 ~ e4@14 f4@2 d4@2]/2", F: "~@5 c5 a4 c5",
  G: "~ a4@3 ~@12", H: "c5@4 b4@3 ~ a4@4 g4 ~ a4@2", I: "f4 d4@5 ~@2",
  J: "[~@2 [d4,g4,b4]!3 [d4,g4,c5] [d4,g4,b4] [c4,f4,a4]@2 [c4,f4,a4]@2 [c4,f4,a4]@2 [c4,f4,a4]@2 [c4,f4,a4]@3 ~@6]/3", // G Csus2 G F
  K: "[~@4 [d4,f4,b4]@2 [d4,f4,b4]@2 [d4,f4,b4]@2 [e4,g4,c5]@2 [d4,f4,a4,b4]@2 [d4,f4,a4,c5]@4 [d4,f4,a4,c5]@4 [d4,f4,a4,c5]@4 [d4,f4,a4,c5]@4 [d4,f4,a4,c5]@6 ~@2 [d4,g4,b4]@2 [d4,g4,b4]@2 [d4,g4,b4]@2 [d4,g4,b4]@3 ~]/3", // Bdim C Bm7b5 Dm7 G
  L: "[[c4,f4,a4,c5]@30 a4@4 d4@2 ~@2 g4@4 c4@4 d4@4 g4@7 ~@5 a4@4 d4@3 ~ g4@2 ~@2 c4@2 ~@2 f4@8 ~@8 c5@4 f4@3 ~ a4@2 ~@2 f4@4 g4@2]/7", // F
  M: "[~ f4 ~ e4 ~ f4 ~ e4@7 f4!2]/2", N: "[~@7 c5@2 c5!2 b4 a4@2 ~ c5@2 c5!2 b4 a4 ~ a4!2]/3",
  O: "[a4@2 b4@2 c5@2 b4@4 c5@2 ~@2 b4@10 ~@4 c5@2 c5@4 a4@2 a3@2 a3 ~ g3@2 f3@2 a4@2 b4 ~, ~@11 d3]/3",
  P: "c5@4 b4 ~ a4@6 g4@2 a4@2", Q: "f4@2 d4@7 ~@7", R: "[~@3 [d4,g4,b4,d5]!4 [c4,f4,a4,c5]@2 ~@7]/2",
  S: "~@2 [d4,f4,b4]!3 [e4,g4,c5] [d4,f4,a4,b4] [d4,f4,a4,c5]", // Bdim C Bm7b5 Dm7
  T: "[~@3 [f4,a4,c5]!2 [e4,g4,b4] [d4,f4,a4] [f4,a4,c5]@9]/2", // F Em Dm F
  U: "~@2 [d4,g4,b4,d5]!2 [c4,f4,a4,c5] [d4,g4,b4,d5]!2 [c4,f4,a4,c5]", V: "~@2 [a3,c4,f4,a4]@3 [b3,d4,g4,b4]@2 ~",
  W: "[g3,c4,f4]@3 ~ [f4,a4,c5] [e4,g4,b4] [d4,f4,a4]@2, ~@3 [a3,d4]@3 ~@2, ~@3 g4@2 ~@3", // Csus4 F Em Dm D5
  X: "[c4,f4,a4]@2 a3@3 [d4,g4,b4]@3, c5, ~ [c4,f4,a4]@3", Y: "[f4,g4]@3 [f4,b4]@3 ~@2, [c4,a4,c5]@3 ~",
  Z: "~@2 [c4,f4,a4]@3 [d4,g4,b4]@2 ~", AA: "[g3,c4,f4]@6 [a3,d4,g4]@7 ~@3",
  AB: "[[d4,g4,c5]@5 ~ a4@2 g4@2 f4@12 ~@10, ~@3 [d4,b4]@8 ~@5]/2", // Csus2 G
  AC: "[d4@2 a4@4 g4@4 f#4@4 c4@4 g4@4 f#4@4 d4@4 e4@5 b3 a3@3 a3 b3@3 [a3,e4]@4 g4@4 f#4@4 d4@4 e4@3 ~ d4, ~@35 d4@3 ~ c#4@4 ~@21]/4", // A5
  AD: "[[f#4,g4]@3 [f#4,g4]@3 ~ [d4,a4]@4 [a3,d4]@4 c5@4 b4@3 ~ a4@4 g4@3 a4@4 b4@2 ~@2 b4@4 c5@2 a4@4]/3", // Gmaj7 D5
  AE: "~@2 [c5,f5]!4 [c5,f5]@2", AF: "~@4 [a3,c4,f4,a4]@6 [b3,d4,g4,b4]@3 ~@3", AG: "[g3,c4,f4]@3 [a3,d4,g4]@5",
  AH: "~@4 [c4,f4,a4]@6 [f4,g4,b4]@3 ~@3", // F G7
  AI: "[f4,g4,c5]@3 f4 [d4,a4] c5 [f4,a4,d5]!2, ~@3 b4@5, ~@3 g4@2 g4@3, ~@2 f4 ~", // Fsus2 D5 Dm
  AJ: "~@4 [c4,f4,a4]@6 [d4,g4,b4]@3 ~@3", // F G
})).s("gm_lead_1_square").gain(0.37)

// other · lead 3 calliope · "PRG.CHANGE"
const lead_3_calliope = note("<~@42 A@2 B C A@2 D E ~@25 A@2 D C A@2 D F ~@50>".pickRestart({
  A: "b4@3 a4@4 ~", B: "b4@6 a4@4 d5@2 b4@3 ~", C: "a4@6 g4@9 ~", D: "b4@6 a4@3 ~ d5@3 b4@3", E: "a4@3 g4@5",
  F: "a4@5 ~ g4@10",
})).s("gm_lead_3_calliope").gain(0.37)

// other · cello · "PRG.CHANGE"
const cello = note("<~@4 A@7 ~@122>".pickRestart({
  A: "[~@9 e4@29 f#4@30 e4@40 ~@4]/7",
})).s("gm_cello").gain(0.11).pan(0.2)

// chords · overdriven guitar · "PRG.CHANGE"
const overdriven_guitar = note("<~@18 A@2 B@2 A@2 B@2 ~@62 C@3 ~@42>".pickRestart({
  A: "[~ [a3,d4,f4,g4,a4]@7]/2", B: "g4/2", C: "[~ [d4,f4,g4,a4]@9 ~@2]/3",
})).s("gm_overdriven_guitar").gain(0.2).pan(0.2)

// chords · reed organ · "PRG.CHANGE"
const reed_organ = note("<~@97 A@3 ~@33>".pickRestart({
  A: "[f2,c3,f3]/3", // F5
})).s("gm_reed_organ").gain(0.47).pan(0.2)

// other · trumpet · "PRG.CHANGE"
const trumpet = note("<~@110 [~@8 a5@7 g5] a5 ~@21>").s("gm_trumpet").gain(0.33).pan(0.2)

// chords · string ensemble 2 · "PRG.CHANGE"
const string_ensemble_2 = note("<~@2 A@6 B@3 ~@122>".pickRestart({
  A: "[~@14 [a3,a4,a5]@27 [b4,b5]@10 [a4,a5]@19 [b4,b5]@6 [a4,a5]@20, ~@41 [c#3,c#4,e4]@29 f#4@26]/6", // A B A B A C#m
  B: "[~@4 [b4,b5]@11 [a4,a5]@29 ~@4, ~ [c#4,e4]@10 ~, ~ [e2,e3]@5 ~@6]/3", // B A C#m E
})).s("gm_string_ensemble_2").gain(0.11).pan(0.4)

// chords · string ensemble 2 · "PRG.CHANGE" · soft notes
const string_ensemble_2_soft = note("<~@4 A@5 ~@124>".pickRestart({
  A: "[~@9 [e2,a2]@29 [b2,d3,d4]@30 ~@12]/5", // A5 Bm
})).s("gm_string_ensemble_2").gain(0.06).pan(0.4)

// other · orchestra hit · "PRG.CHANGE" · D
const orchestra_hit = note("<~@25 [~@7 [d3,d4,d5]] ~@32 [~@7 [d4,d5]] ~@74>").s("gm_orchestra_hit").gain(0.47).pan(0.4)

// chords · rock organ · "PRG.CHANGE"
const rock_organ = note("<~@29 A@2 B@2 ~@4 C@2 D E@2 ~@18 F ~@72>".pickRestart({
  A: "[~@14 [d4,g4,a4]@7 ~@11]/2", B: "[~@3 [g5,a5]@2 a4@2 [g5,a5,c6]@5 ~@4]/2", C: "[~@13 [d5,g5,a5]@8 ~@11]/2",
  D: "~ [g5,a5]@2 d5", E: "[g4,d5,g5]/2", F: "~@3 [g4,c5]!2 a3 ~@2",
})).s("gm_rock_organ").gain(0.38).pan(0.4)

// chords · rock organ · "PRG.CHANGE" · soft notes · Gsus2 Dsus4
const rock_organ_soft = note("<~@60 [~@3 [g3,a3]!2 [d3,g3,a4] ~@2] ~@72>").s("gm_rock_organ").gain(0.19).pan(0.4)

// chords · synth strings 2 · "PRG.CHANGE"
const synth_strings_2 = note("<~@67 A@4 ~@62>".pickRestart({
  A: "[~@8 g4@5 ~@3, ~ [d3,f3,a3,d4]@51 ~@12, ~@4 f4@9 ~@3]/4", // Dm
})).s("gm_synth_strings_2").gain(0.34).pan(0.4)

// chords · string ensemble 1 · "PRG.CHANGE"
const string_ensemble_1 = note("<~@75 A B C D E F G H ~@10 I J K@2 ~@36>".pickRestart({
  A: "d3@3 ~", B: "c#3@3 ~", C: "c3@3 ~", D: "b2@3 ~", E: "d3@5 ~@3", F: "c#3@5 ~@3", G: "c3@5 ~@3", H: "b2@5 ~@3",
  I: "g3 a3", J: "g3!8", K: "[g3!7 a3@5 ~@4]/2",
})).s("gm_string_ensemble_1").gain(0.29).pan(0.4)

// chords · string ensemble 1 · "PRG.CHANGE" · soft notes
const string_ensemble_1_soft = note("<~@108 A B C D A E@3 ~@17>".pickRestart({
  A: "[d5,a5,d6]", B: "[c5,g5,c6]", C: "b5@8 a5@7 g5, [a4,e5]", D: "[a4,e5,a5]", E: "[[c5,g5,c6]@3 [a4,e5,a5]@5]/3",
})).s("gm_string_ensemble_1").gain(0.14).pan(0.4)

// chords · drawbar organ · "PRG.CHANGE" · F5 D#5 F5 G#5 A#5 G# D#5 F5 …
const drawbar_organ = note(`<
  ~@97
  [~@2 [c5,f5] ~ [c5,f5] [a#4,d#5] ~ [c5,f5]]
  [~ [d#5,g#5] [f5,a#5] [g#5,c6] ~ [a#5,d#6] ~ [c6,f6]]
  [[c6,f6] [d#6,g#6] ~ [f6,a#6] ~ [g#6,c7] ~@2]
  ~@33
>`).s("gm_drawbar_organ").gain(0.38).pan(0.4)

// other · flute · "PRG.CHANGE" · Gmaj7 Bsus2 Gmaj7
const flute = note(`<
  ~@5
  [~@5 f#6 g6 [f#6,g6] f#6 [f#6,g6] g6 f#6 [f#6,g6] g6 f#6 [f#6,g6]]
  [g6 [f#6,g6] f#6 g6 [f#6,g6] f#6 [f#6,g6] g6 f#6 [f#6,g6] g6 ~@5]
  [~@9 b5 c#6 b5 c#6 [b5,c#6] b5 c#6]
  [b5 c#6 [b5,c#6] b5 c#6 b5 [b5,c#6] ~@9]
  [~ [f#6,g6] f#6 [f#6,g6] g6 f#6 [f#6,g6] g6 [f#6,g6] f#6 [f#6,g6]!3 g6 [f#6,g6]!2]
  [f#6 [f#6,g6]!3 ~@12]
  ~@122
>`).s("gm_flute").gain(0.14).pan(0.2)

// other · flute · "PRG.CHANGE" · soft notes · Gmaj7 Bsus2 Gmaj7
const flute_soft = note(`<
  ~@6
  [~@11 f#6 [f#6,g6] g6 ~@2]
  ~
  [~@7 c#6 b5 c#6 b5 [b5,c#6] c#6 ~@3]
  ~
  [~@4 g6 [f#6,g6]!2 f#6 [f#6,g6]!3 g6 ~@4]
  ~@122
>`).s("gm_flute").gain(0.06).pan(0.2)

// other · orchestral harp · "PRG.CHANGE" · F#m Asus2 D Bsus2 A5 A
const orchestral_harp = note(`<
  ~@4
  [~@11 e3 a3 c#4 e4 a4, ~@9 e2@2 ~@5, ~@5 a2 ~@2]
  [c#5 e5 a5 ~ c#6 e6 f#6 e6 c#6 a5 c#5 [c#4,a4] a3 c#3@2 a2]
  [~@6 b1@3 d2@2 f#2 b2 c#3 d3 e3]
  [f#3 a3 b3 c#4 d4 e4 f#4 ~ [a4,b4] c#5 d5 e5 f#5 e5 d5 a4]
  [[d4,f#4] a3 ~@2 a2@3 c#3@2 ~ f#3 a3 b3 c#4 e4 a4, ~@9 e3@2 ~@5]
  [[b4,c#5] e5 f#5 e5 c#5 [e4,a4] c#4 a3 e3 [a2,c#3] e2 ~@5]
  ~@123
>`).s("gm_orchestral_harp").gain(0.32).pan(0.8)

// chords · overdriven guitar · "PRG.CHANGE"
const overdriven_guitar_2 = note("<~@51 A B A C D B D E ~@25 D F D C G F G C ~@41>".pickRestart({
  A: "~@4 [c4,f4]@4 [c4,f4]@5 ~@3", B: "[g3,c4] [g3,c4]@3", C: "[c4,f4]@3 [c4,f4]@5", D: "~ [c4,f4]!2 ~",
  E: "[c4,f4]@5 ~ [c4,f4]@10", F: "[g3,c4]@2 [g3,c4] [g3,c4]@5", G: "~@4 [c4,f4]@4 [c4,f4]@3 ~@5",
// … 49 more lines

More by Yes