acss_renderer.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import * as EngineConst from '../common/engine_const.js';
  2. import * as EventUtil from '../common/event_util.js';
  3. import * as AudioUtil from './audio_util.js';
  4. import { MarkupRenderer } from './markup_renderer.js';
  5. export class AcssRenderer extends MarkupRenderer {
  6. markup(descrs) {
  7. this.setScaleFunction(-2, 2, 0, 10, 0);
  8. const markup = AudioUtil.personalityMarkup(descrs);
  9. const result = [];
  10. const currentPers = { open: [] };
  11. let pause = null;
  12. let isString = false;
  13. for (let i = 0, descr; (descr = markup[i]); i++) {
  14. if (AudioUtil.isMarkupElement(descr)) {
  15. AudioUtil.mergeMarkup(currentPers, descr);
  16. continue;
  17. }
  18. if (AudioUtil.isPauseElement(descr)) {
  19. if (isString) {
  20. pause = AudioUtil.mergePause(pause, descr, Math.max);
  21. }
  22. continue;
  23. }
  24. const str = '"' + this.merge(descr.span) + '"';
  25. isString = true;
  26. if (pause) {
  27. result.push(this.pause(pause));
  28. pause = null;
  29. }
  30. const prosody = this.prosody_(currentPers);
  31. result.push(prosody ? '(text (' + prosody + ') ' + str + ')' : str);
  32. }
  33. return '(exp ' + result.join(' ') + ')';
  34. }
  35. error(key) {
  36. return '(error "' + EventUtil.Move.get(key) + '")';
  37. }
  38. prosodyElement(key, value) {
  39. value = this.applyScaleFunction(value);
  40. switch (key) {
  41. case EngineConst.personalityProps.RATE:
  42. return '(richness . ' + value + ')';
  43. case EngineConst.personalityProps.PITCH:
  44. return '(average-pitch . ' + value + ')';
  45. case EngineConst.personalityProps.VOLUME:
  46. return '(stress . ' + value + ')';
  47. }
  48. return '(value . ' + value + ')';
  49. }
  50. pause(pause) {
  51. return ('(pause . ' +
  52. this.pauseValue(pause[EngineConst.personalityProps.PAUSE]) +
  53. ')');
  54. }
  55. prosody_(pros) {
  56. const keys = pros.open;
  57. const result = [];
  58. for (let i = 0, key; (key = keys[i]); i++) {
  59. result.push(this.prosodyElement(key, pros[key]));
  60. }
  61. return result.join(' ');
  62. }
  63. }