From f408ab78de9b8cf224f1c2ee38576a1b228adb6b Mon Sep 17 00:00:00 2001 From: Gargaj Date: Sun, 14 Jul 2024 17:10:37 +0200 Subject: [PATCH 1/4] fix presets being one-off --- index.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/index.html b/index.html index c05b3fc..3ebc067 100644 --- a/index.html +++ b/index.html @@ -126,12 +126,12 @@

Presets

DescriptionSpeedPitchThroatMouth - Elf7264110160 - Little Robot9260190190 - Stuffy Guy8272110105 - Little Old Lady8232145145 - Extra-Terrestrial10064150200 - SAM7264128128 + SAM7264128128 + Elf7264110160 + Little Robot9260190190 + Stuffy Guy8272110105 + Little Old Lady8232145145 + Extra-Terrestrial10064150200 From 15effaf89ad646aded1faa120cc4a4c5a07aae86 Mon Sep 17 00:00:00 2001 From: Christian Schiffler Date: Mon, 22 Jul 2024 11:48:26 +0200 Subject: [PATCH 2/4] Bump dependencies --- yarn.lock | 786 ++++++++++++++++++++++++++---------------------------- 1 file changed, 377 insertions(+), 409 deletions(-) diff --git a/yarn.lock b/yarn.lock index 74232b6..42579e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11,9 +11,9 @@ "@jridgewell/trace-mapping" "^0.3.24" "@babel/cli@^7.17.10": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.7.tgz#eb2868c1fa384b17ea88d60107577d3e6fd05c4e" - integrity sha512-8dfPprJgV4O14WTx+AQyEA+opgUKPrsIXX/MdL50J1n06EQJ6m1T+CdsJe0qEC0B/Xl85i+Un5KVAxd/PACX9A== + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.8.tgz#79eaa55a69c77cafbea3e87537fd1df5a5a2edf8" + integrity sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg== dependencies: "@jridgewell/trace-mapping" "^0.3.25" commander "^6.2.0" @@ -34,38 +34,38 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" - integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.8": + version "7.24.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.9.tgz#53eee4e68f1c1d0282aa0eb05ddb02d033fc43a0" + integrity sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng== "@babel/core@^7.16.5": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" - integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== + version "7.24.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.9.tgz#dc07c9d307162c97fa9484ea997ade65841c7c82" + integrity sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helpers" "^7.24.7" - "@babel/parser" "^7.24.7" + "@babel/generator" "^7.24.9" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-module-transforms" "^7.24.9" + "@babel/helpers" "^7.24.8" + "@babel/parser" "^7.24.8" "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.9" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" - integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== +"@babel/generator@^7.24.8", "@babel/generator@^7.24.9": + version "7.24.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.10.tgz#a4ab681ec2a78bbb9ba22a3941195e28a81d8e76" + integrity sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg== dependencies: - "@babel/types" "^7.24.7" + "@babel/types" "^7.24.9" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" @@ -85,26 +85,26 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" - integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz#b607c3161cd9d1744977d4f97139572fe778c271" + integrity sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw== dependencies: - "@babel/compat-data" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - browserslist "^4.22.2" + "@babel/compat-data" "^7.24.8" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" lru-cache "^5.1.1" semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz#2eaed36b3a1c11c53bdf80d53838b293c52f5b3b" - integrity sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg== + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.8.tgz#47f546408d13c200c0867f9d935184eaa0851b09" + integrity sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" "@babel/helper-environment-visitor" "^7.24.7" "@babel/helper-function-name" "^7.24.7" - "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.8" "@babel/helper-optimise-call-expression" "^7.24.7" "@babel/helper-replace-supers" "^7.24.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" @@ -153,13 +153,13 @@ dependencies: "@babel/types" "^7.24.7" -"@babel/helper-member-expression-to-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz#67613d068615a70e4ed5101099affc7a41c5225f" - integrity sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w== +"@babel/helper-member-expression-to-functions@^7.24.7", "@babel/helper-member-expression-to-functions@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" + integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.8" "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.24.7": version "7.24.7" @@ -169,10 +169,10 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-module-transforms@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" - integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== +"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.24.9": + version "7.24.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz#e13d26306b89eea569180868e652e7f514de9d29" + integrity sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw== dependencies: "@babel/helper-environment-visitor" "^7.24.7" "@babel/helper-module-imports" "^7.24.7" @@ -187,10 +187,10 @@ dependencies: "@babel/types" "^7.24.7" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" - integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== "@babel/helper-remap-async-to-generator@^7.24.7": version "7.24.7" @@ -233,20 +233,20 @@ dependencies: "@babel/types" "^7.24.7" -"@babel/helper-string-parser@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" - integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== -"@babel/helper-validator-option@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" - integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== "@babel/helper-wrap-function@^7.24.7": version "7.24.7" @@ -258,13 +258,13 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helpers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" - integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== +"@babel/helpers@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.8.tgz#2820d64d5d6686cca8789dd15b074cd862795873" + integrity sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ== dependencies: "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/types" "^7.24.8" "@babel/highlight@^7.24.7": version "7.24.7" @@ -276,10 +276,10 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" - integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== +"@babel/parser@^7.24.7", "@babel/parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.8.tgz#58a4dbbcad7eb1d48930524a3fd93d93e9084c6f" + integrity sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w== "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7": version "7.24.7" @@ -502,16 +502,16 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz#4ae6ef43a12492134138c1e45913f7c46c41b4bf" - integrity sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw== +"@babel/plugin-transform-classes@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz#ad23301fe5bc153ca4cf7fb572a9bc8b0b711cf7" + integrity sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.8" "@babel/helper-environment-visitor" "^7.24.7" "@babel/helper-function-name" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/helper-replace-supers" "^7.24.7" "@babel/helper-split-export-declaration" "^7.24.7" globals "^11.1.0" @@ -524,12 +524,12 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/template" "^7.24.7" -"@babel/plugin-transform-destructuring@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz#a097f25292defb6e6cc16d6333a4cfc1e3c72d9e" - integrity sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw== +"@babel/plugin-transform-destructuring@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" + integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-dotall-regex@^7.24.7": version "7.24.7" @@ -625,13 +625,13 @@ "@babel/helper-module-transforms" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-commonjs@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz#9fd5f7fdadee9085886b183f1ad13d1ab260f4ab" - integrity sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ== +"@babel/plugin-transform-modules-commonjs@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" + integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA== dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/helper-simple-access" "^7.24.7" "@babel/plugin-transform-modules-systemjs@^7.24.7": @@ -709,12 +709,12 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz#b8f6848a80cf2da98a8a204429bec04756c6d454" - integrity sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ== +"@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" + integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-syntax-optional-chaining" "^7.8.3" @@ -806,12 +806,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-typeof-symbol@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz#f074be466580d47d6e6b27473a840c9f9ca08fb0" - integrity sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg== +"@babel/plugin-transform-typeof-symbol@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" + integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-unicode-escapes@^7.24.7": version "7.24.7" @@ -845,14 +845,14 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/preset-env@^7.16.5": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.7.tgz#ff067b4e30ba4a72f225f12f123173e77b987f37" - integrity sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ== - dependencies: - "@babel/compat-data" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.8.tgz#e0db94d7f17d6f0e2564e8d29190bc8cdacec2d1" + integrity sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ== + dependencies: + "@babel/compat-data" "^7.24.8" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-validator-option" "^7.24.8" "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" @@ -883,9 +883,9 @@ "@babel/plugin-transform-block-scoping" "^7.24.7" "@babel/plugin-transform-class-properties" "^7.24.7" "@babel/plugin-transform-class-static-block" "^7.24.7" - "@babel/plugin-transform-classes" "^7.24.7" + "@babel/plugin-transform-classes" "^7.24.8" "@babel/plugin-transform-computed-properties" "^7.24.7" - "@babel/plugin-transform-destructuring" "^7.24.7" + "@babel/plugin-transform-destructuring" "^7.24.8" "@babel/plugin-transform-dotall-regex" "^7.24.7" "@babel/plugin-transform-duplicate-keys" "^7.24.7" "@babel/plugin-transform-dynamic-import" "^7.24.7" @@ -898,7 +898,7 @@ "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" "@babel/plugin-transform-member-expression-literals" "^7.24.7" "@babel/plugin-transform-modules-amd" "^7.24.7" - "@babel/plugin-transform-modules-commonjs" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.8" "@babel/plugin-transform-modules-systemjs" "^7.24.7" "@babel/plugin-transform-modules-umd" "^7.24.7" "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" @@ -908,7 +908,7 @@ "@babel/plugin-transform-object-rest-spread" "^7.24.7" "@babel/plugin-transform-object-super" "^7.24.7" "@babel/plugin-transform-optional-catch-binding" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.8" "@babel/plugin-transform-parameters" "^7.24.7" "@babel/plugin-transform-private-methods" "^7.24.7" "@babel/plugin-transform-private-property-in-object" "^7.24.7" @@ -919,7 +919,7 @@ "@babel/plugin-transform-spread" "^7.24.7" "@babel/plugin-transform-sticky-regex" "^7.24.7" "@babel/plugin-transform-template-literals" "^7.24.7" - "@babel/plugin-transform-typeof-symbol" "^7.24.7" + "@babel/plugin-transform-typeof-symbol" "^7.24.8" "@babel/plugin-transform-unicode-escapes" "^7.24.7" "@babel/plugin-transform-unicode-property-regex" "^7.24.7" "@babel/plugin-transform-unicode-regex" "^7.24.7" @@ -928,7 +928,7 @@ babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.4" babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.31.0" + core-js-compat "^3.37.1" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": @@ -957,9 +957,9 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.16.5", "@babel/runtime@^7.8.4": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" - integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.8.tgz#5d958c3827b13cc6d05e038c07fb2e5e3420d82e" + integrity sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA== dependencies: regenerator-runtime "^0.14.0" @@ -972,28 +972,28 @@ "@babel/parser" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/traverse@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" - integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== +"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.8.tgz#6c14ed5232b7549df3371d820fbd9abfcd7dfab7" + integrity sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ== dependencies: "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" + "@babel/generator" "^7.24.8" "@babel/helper-environment-visitor" "^7.24.7" "@babel/helper-function-name" "^7.24.7" "@babel/helper-hoist-variables" "^7.24.7" "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/parser" "^7.24.8" + "@babel/types" "^7.24.8" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.24.7", "@babel/types@^7.4.4": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" - integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== +"@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.24.9", "@babel/types@^7.4.4": + version "7.24.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.9.tgz#228ce953d7b0d16646e755acf204f4cf3d08cc73" + integrity sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ== dependencies: - "@babel/helper-string-parser" "^7.24.7" + "@babel/helper-string-parser" "^7.24.8" "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" @@ -1022,9 +1022,9 @@ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" @@ -1064,85 +1064,85 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@rollup/rollup-android-arm-eabi@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" - integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== - -"@rollup/rollup-android-arm64@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" - integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== - -"@rollup/rollup-darwin-arm64@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" - integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== - -"@rollup/rollup-darwin-x64@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" - integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== - -"@rollup/rollup-linux-arm-gnueabihf@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" - integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== - -"@rollup/rollup-linux-arm-musleabihf@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" - integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== - -"@rollup/rollup-linux-arm64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" - integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== - -"@rollup/rollup-linux-arm64-musl@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" - integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== - -"@rollup/rollup-linux-powerpc64le-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" - integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== - -"@rollup/rollup-linux-riscv64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" - integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== - -"@rollup/rollup-linux-s390x-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" - integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== - -"@rollup/rollup-linux-x64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" - integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== - -"@rollup/rollup-linux-x64-musl@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" - integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== - -"@rollup/rollup-win32-arm64-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" - integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== - -"@rollup/rollup-win32-ia32-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" - integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== - -"@rollup/rollup-win32-x64-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" - integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== +"@rollup/rollup-android-arm-eabi@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.0.tgz#3d9fd50164b94964f5de68c3c4ce61933b3a338d" + integrity sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w== + +"@rollup/rollup-android-arm64@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.0.tgz#e1a6d4bca2eb08c84fd996a4bf896ce4b6f4014c" + integrity sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw== + +"@rollup/rollup-darwin-arm64@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.0.tgz#0a3fffea69489a24a96079af414b0be78df8abbc" + integrity sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA== + +"@rollup/rollup-darwin-x64@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.0.tgz#13fbdb15f58f090871b0ffff047ece06ad6ad74c" + integrity sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg== + +"@rollup/rollup-linux-arm-gnueabihf@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.0.tgz#e9d9219ddf6f6e946e2ee322198af12466d2c868" + integrity sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw== + +"@rollup/rollup-linux-arm-musleabihf@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz#4ba804a00b5e793196a622f6977e05f23e01f59a" + integrity sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ== + +"@rollup/rollup-linux-arm64-gnu@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.0.tgz#d871e3f41de759a6db27fc99235b782ba47c15cc" + integrity sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug== + +"@rollup/rollup-linux-arm64-musl@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.0.tgz#6e63f7ad4cc51bd2c693a2826fd279de9eaa05b5" + integrity sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz#1540b284d91c440bc9fa7a1714cfb71a5597e94d" + integrity sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ== + +"@rollup/rollup-linux-riscv64-gnu@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.0.tgz#70ae58103b5bc7ba2e2235738b51d97022c8ef92" + integrity sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg== + +"@rollup/rollup-linux-s390x-gnu@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz#579ca5f271421a961d3c73d221202c79e02ff03a" + integrity sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA== + +"@rollup/rollup-linux-x64-gnu@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz#f0282d761b8b4e7b92b236813475248e37231849" + integrity sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA== + +"@rollup/rollup-linux-x64-musl@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.0.tgz#65da807ac66c505ad14b76f1e5976006cb67dd5f" + integrity sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A== + +"@rollup/rollup-win32-arm64-msvc@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.0.tgz#1eed24b91f421c2eea8bb7ca8889ba0c867e1780" + integrity sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg== + +"@rollup/rollup-win32-ia32-msvc@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.0.tgz#1ed93c9cdc84e185359797a686f4d1576afcea58" + integrity sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q== + +"@rollup/rollup-win32-x64-msvc@4.19.0": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.0.tgz#baf9b65023ea2ecc5e6ec68f787a0fecfd8ee84c" + integrity sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag== "@socket.io/component-emitter@~3.1.0": version "3.1.2" @@ -1167,9 +1167,9 @@ integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/node@*", "@types/node@>=10.0.0": - version "20.14.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18" - integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q== + version "20.14.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.11.tgz#09b300423343460455043ddd4d0ded6ac579b74b" + integrity sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA== dependencies: undici-types "~5.26.4" @@ -1208,10 +1208,10 @@ acorn@^7.0.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-regex@^3.0.0: version "3.0.1" @@ -1402,7 +1402,7 @@ browser-resolve@^2.0.0: dependencies: resolve "^1.17.0" -browser-stdout@1.3.1: +browser-stdout@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== @@ -1523,15 +1523,15 @@ browserify@^17.0.0: vm-browserify "^1.0.0" xtend "^4.0.0" -browserslist@^4.22.2, browserslist@^4.23.0: - version "4.23.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" - integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== +browserslist@^4.23.0, browserslist@^4.23.1: + version "4.23.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.2.tgz#244fe803641f1c19c28c48c4b6ec9736eb3d32ed" + integrity sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA== dependencies: - caniuse-lite "^1.0.30001629" - electron-to-chromium "^1.4.796" + caniuse-lite "^1.0.30001640" + electron-to-chromium "^1.4.820" node-releases "^2.0.14" - update-browserslist-db "^1.0.16" + update-browserslist-db "^1.1.0" buffer-from@^1.0.0: version "1.1.2" @@ -1582,10 +1582,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001629: - version "1.0.30001632" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001632.tgz#964207b7cba5851701afb4c8afaf1448db3884b6" - integrity sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg== +caniuse-lite@^1.0.30001640: + version "1.0.30001643" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz#9c004caef315de9452ab970c3da71085f8241dbd" + integrity sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg== chai@^4.4.1: version "4.4.1" @@ -1624,22 +1624,7 @@ check-error@^1.0.3: dependencies: get-func-name "^2.0.2" -chokidar@3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chokidar@^3.4.0, chokidar@^3.5.1: +chokidar@^3.4.0, chokidar@^3.5.1, chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -1784,7 +1769,7 @@ cookie@~0.4.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -core-js-compat@^3.31.0, core-js-compat@^3.36.1: +core-js-compat@^3.36.1, core-js-compat@^3.37.1: version "3.37.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== @@ -1874,14 +1859,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@^4.3.5, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: version "4.3.5" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== @@ -1965,10 +1943,10 @@ di@^0.0.1: resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== diffie-hellman@^5.0.0: version "5.0.3" @@ -2006,15 +1984,15 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.796: - version "1.4.796" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.796.tgz#48dd6ff634b7f7df6313bd27aaa713f3af4a2b29" - integrity sha512-NglN/xprcM+SHD2XCli4oC6bWe6kHoytcyLKCWXmRL854F0qhPhaYgUswUsglnPxYaNQIg2uMY4BvaomIf3kLA== +electron-to-chromium@^1.4.820: + version "1.4.832" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.832.tgz#d25882ce0a9237577b039bffa124ecef1822003b" + integrity sha512-cTen3SB0H2SGU7x467NRe1eVcQgcuS6jckKfWJHia2eo0cHIGOqHoAxevIYZD4eRHcWjkvFzo93bi3vJ9W+1lA== elliptic@^6.5.3, elliptic@^6.5.5: - version "6.5.5" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" - integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== + version "6.5.6" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.6.tgz#ee5f7c3a00b98a2144ac84d67d01f04d438fa53e" + integrity sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ== dependencies: bn.js "^4.11.9" brorand "^1.1.0" @@ -2035,14 +2013,14 @@ encodeurl@~1.0.2: integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== engine.io-parser@~5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" - integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== + version "5.2.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" + integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== engine.io@~6.5.2: - version "6.5.4" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.4.tgz#6822debf324e781add2254e912f8568508850cdc" - integrity sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg== + version "6.5.5" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.5.tgz#430b80d8840caab91a50e9e23cb551455195fc93" + integrity sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA== dependencies: "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" @@ -2053,12 +2031,14 @@ engine.io@~6.5.2: cors "~2.8.5" debug "~4.3.1" engine.io-parser "~5.2.1" - ws "~8.11.0" + ws "~8.17.1" ent@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.1.tgz#68dc99a002f115792c26239baedaaea9e70c0ca2" + integrity sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A== + dependencies: + punycode "^1.4.1" es-define-property@^1.0.0: version "1.0.0" @@ -2082,16 +2062,16 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" @@ -2159,14 +2139,6 @@ find-cache-dir@^2.0.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -2174,6 +2146,14 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -2263,17 +2243,6 @@ glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - glob@^7.1.0, glob@^7.1.3, glob@^7.1.7, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -2286,6 +2255,17 @@ glob@^7.1.0, glob@^7.1.3, glob@^7.1.7, glob@^7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -2367,7 +2347,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasown@^2.0.0: +hasown@^2.0.0, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -2379,7 +2359,7 @@ hat@^0.0.3: resolved "https://registry.yarnpkg.com/hat/-/hat-0.0.3.tgz#bb014a9e64b3788aed8005917413d4ff3d502d8a" integrity sha512-zpImx2GoKXy42fVDSEad2BPKuSQdLcqsCYa48K3zHSzM/ugWuYjLDr8IXxpVuL7uCLHw56eaiLxCRthhOzf5ug== -he@1.2.0: +he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -2502,11 +2482,11 @@ is-callable@^1.1.3: integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + version "2.15.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea" + integrity sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-extglob@^2.1.1: version "2.1.1" @@ -2591,7 +2571,7 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@4.1.0: +js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -2750,14 +2730,6 @@ lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - log-symbols@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -2765,6 +2737,14 @@ log-symbols@^2.1.0: dependencies: chalk "^2.0.1" +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + log4js@^6.4.1: version "6.9.1" resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.9.1.tgz#aba5a3ff4e7872ae34f8b4c533706753709e38b6" @@ -2854,13 +2834,6 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - minimatch@^3.0.0, minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -2868,7 +2841,7 @@ minimatch@^3.0.0, minimatch@^3.0.4, minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: +minimatch@^5.0.1, minimatch@^5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== @@ -2893,30 +2866,30 @@ mkdirp@^0.5.5: minimist "^1.2.6" mocha@^10.0.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.4.0.tgz#ed03db96ee9cfc6d20c56f8e2af07b961dbae261" - integrity sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA== - dependencies: - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "8.1.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" + version "10.7.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.0.tgz#9e5cbed8fa9b37537a25bd1f7fb4f6fc45458b9a" + integrity sha512-v8/rBWr2VO5YkspYINnvu81inSz2y3ODJrhO175/Exzor1RcEZZkizgE2A+w/CAXXoESS8Kys5E62dOHGHzULA== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" module-deps@^6.2.3: version "6.2.3" @@ -2949,7 +2922,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3: +ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -2960,9 +2933,9 @@ negotiator@0.6.3: integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -2975,9 +2948,9 @@ object-assign@^4: integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== object-keys@^1.1.1: version "1.1.1" @@ -3220,9 +3193,9 @@ qs@6.11.0: side-channel "^1.0.4" qs@^6.11.2: - version "6.12.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" - integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== + version "6.12.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.3.tgz#e43ce03c8521b9c7fd7f1f13e514e5ca37727754" + integrity sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ== dependencies: side-channel "^1.0.6" @@ -3360,9 +3333,9 @@ resolve@^1.1.4, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.4.0: supports-preserve-symlinks-flag "^1.0.0" rfdc@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" - integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rimraf@^3.0.2: version "3.0.2" @@ -3380,28 +3353,28 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: inherits "^2.0.1" rollup@^4.18.0: - version "4.18.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda" - integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== + version "4.19.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.19.0.tgz#83b08cc0b2bc38c26c194cb7f2cdabd84a2a8c02" + integrity sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA== dependencies: "@types/estree" "1.0.5" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.18.0" - "@rollup/rollup-android-arm64" "4.18.0" - "@rollup/rollup-darwin-arm64" "4.18.0" - "@rollup/rollup-darwin-x64" "4.18.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" - "@rollup/rollup-linux-arm-musleabihf" "4.18.0" - "@rollup/rollup-linux-arm64-gnu" "4.18.0" - "@rollup/rollup-linux-arm64-musl" "4.18.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" - "@rollup/rollup-linux-riscv64-gnu" "4.18.0" - "@rollup/rollup-linux-s390x-gnu" "4.18.0" - "@rollup/rollup-linux-x64-gnu" "4.18.0" - "@rollup/rollup-linux-x64-musl" "4.18.0" - "@rollup/rollup-win32-arm64-msvc" "4.18.0" - "@rollup/rollup-win32-ia32-msvc" "4.18.0" - "@rollup/rollup-win32-x64-msvc" "4.18.0" + "@rollup/rollup-android-arm-eabi" "4.19.0" + "@rollup/rollup-android-arm64" "4.19.0" + "@rollup/rollup-darwin-arm64" "4.19.0" + "@rollup/rollup-darwin-x64" "4.19.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.19.0" + "@rollup/rollup-linux-arm-musleabihf" "4.19.0" + "@rollup/rollup-linux-arm64-gnu" "4.19.0" + "@rollup/rollup-linux-arm64-musl" "4.19.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.19.0" + "@rollup/rollup-linux-riscv64-gnu" "4.19.0" + "@rollup/rollup-linux-s390x-gnu" "4.19.0" + "@rollup/rollup-linux-x64-gnu" "4.19.0" + "@rollup/rollup-linux-x64-musl" "4.19.0" + "@rollup/rollup-win32-arm64-msvc" "4.19.0" + "@rollup/rollup-win32-ia32-msvc" "4.19.0" + "@rollup/rollup-win32-x64-msvc" "4.19.0" fsevents "~2.3.2" safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: @@ -3429,10 +3402,10 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" @@ -3501,12 +3474,12 @@ slash@^2.0.0: integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== socket.io-adapter@~2.5.2: - version "2.5.4" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz#4fdb1358667f6d68f25343353bd99bd11ee41006" - integrity sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg== + version "2.5.5" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082" + integrity sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg== dependencies: debug "~4.3.4" - ws "~8.11.0" + ws "~8.17.1" socket.io-parser@~4.2.4: version "4.2.4" @@ -3637,7 +3610,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-json-comments@3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -3649,13 +3622,6 @@ subarg@^1.0.0: dependencies: minimist "^1.1.0" -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -3670,6 +3636,13 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -3760,9 +3733,9 @@ ua-parser-js@^0.7.30: integrity sha512-fYmIy7fKTSFAhG3fuPlubeGaMoAd6r0rSnfEsO5nEY55i26KSLt9EH7PLQiiqPUhNqYIJvSkTy1oArIcXAbPbA== uglify-js@^3.14.5: - version "3.18.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.18.0.tgz#73b576a7e8fda63d2831e293aeead73e0a270deb" - integrity sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A== + version "3.19.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.0.tgz#6d45f1cad2c54117fa2fabd87fc2713a83e3bf7b" + integrity sha512-wNKHUY2hYYkf6oSFfhwwiHo4WCHzHmzcXsqXYTN9ja3iApYIFbb2U6ics9hBcYLHcYGQoAlwnZlTrf3oF+BL/Q== umd@^3.0.0: version "3.0.3" @@ -3818,10 +3791,10 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.16: - version "1.0.16" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" - integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== dependencies: escalade "^3.1.2" picocolors "^1.0.1" @@ -3908,10 +3881,10 @@ which@^1.2.1: dependencies: isexe "^2.0.0" -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== wrap-ansi@^7.0.0: version "7.0.0" @@ -3927,10 +3900,10 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@~8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" - integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== +ws@~8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: version "4.0.2" @@ -3947,17 +3920,12 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: +yargs-parser@^20.2.2, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-unparser@2.0.0: +yargs-unparser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== @@ -3967,7 +3935,7 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0, yargs@^16.1.1: +yargs@^16.1.1, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== From a00b02945a7080d31c978ac36564719eabb7d405 Mon Sep 17 00:00:00 2001 From: Christian Schiffler Date: Mon, 22 Jul 2024 18:31:26 +0200 Subject: [PATCH 3/4] Rebuild 0.3.1 --- dist/guessnum.common.js | 1999 +++++++++++++++------------- dist/guessnum.common.min.js | 2 +- dist/guessnum.common.min.js.map | 2 +- dist/guessnum.esm.js | 1999 +++++++++++++++------------- dist/guessnum.esm.min.js | 2 +- dist/guessnum.esm.min.js.map | 2 +- dist/guessnum.js | 1999 +++++++++++++++------------- dist/guessnum.min.js | 2 +- dist/guessnum.min.js.map | 2 +- dist/samjs.common.js | 2180 +++++++++++++++++-------------- dist/samjs.common.min.js | 2 +- dist/samjs.common.min.js.map | 2 +- dist/samjs.esm.js | 2180 +++++++++++++++++-------------- dist/samjs.esm.min.js | 2 +- dist/samjs.esm.min.js.map | 2 +- dist/samjs.js | 2180 +++++++++++++++++-------------- dist/samjs.min.js | 2 +- dist/samjs.min.js.map | 2 +- 18 files changed, 6852 insertions(+), 5709 deletions(-) diff --git a/dist/guessnum.common.js b/dist/guessnum.common.js index f72582d..5eaa59c 100644 --- a/dist/guessnum.common.js +++ b/dist/guessnum.common.js @@ -28,37 +28,31 @@ let matchesBitmask = (bits, mask) => { * * @return {Promise} */ - let Play = (context, audiobuffer) => { let abort; let promise = new Promise((resolve, reject) => { let source = context.createBufferSource(); let soundBuffer = context.createBuffer(1, audiobuffer.length, 22050); let buffer = soundBuffer.getChannelData(0); - for (let i = 0; i < audiobuffer.length; i++) { buffer[i] = audiobuffer[i]; } - source.buffer = soundBuffer; source.connect(context.destination); - source.onended = () => { resolve(true); }; - abort = reason => { source.disconnect(); reject(reason); }; - source.start(0); }); promise.abort = abort; return promise; }; - let context = null; + /** * Play an audio buffer. * @@ -66,20 +60,18 @@ let context = null; * * @return {Promise} */ - let PlayBuffer = audiobuffer => { if (null === context) { context = new AudioContext(); } - if (!context) { { throw new Error('No player available!'); } } - return Play(context, audiobuffer); }; + /** * Convert a Uint8Array wave buffer to a Float32Array WaveBuffer * @@ -87,100 +79,178 @@ let PlayBuffer = audiobuffer => { * * @return {Float32Array} */ - let Uint8ArrayToFloat32Array = buffer => { let audio = new Float32Array(buffer.length); - for (let i = 0; i < buffer.length; i++) { audio[i] = (buffer[i] - 128) / 256; } - return audio; }; let StressTable = '*12345678'.split(''); -let PhonemeNameTable = (' *' + // 00 -'.*' + // 01 -'?*' + // 02 -',*' + // 03 -'-*' + // 04 -'IY' + // 05 -'IH' + // 06 -'EH' + // 07 -'AE' + // 08 -'AA' + // 09 -'AH' + // 10 -'AO' + // 11 -'UH' + // 12 -'AX' + // 13 -'IX' + // 14 -'ER' + // 15 -'UX' + // 16 -'OH' + // 17 -'RX' + // 18 -'LX' + // 19 -'WX' + // 20 -'YX' + // 21 -'WH' + // 22 -'R*' + // 23 -'L*' + // 24 -'W*' + // 25 -'Y*' + // 26 -'M*' + // 27 -'N*' + // 28 -'NX' + // 29 -'DX' + // 30 -'Q*' + // 31 -'S*' + // 32 -'SH' + // 33 -'F*' + // 34 -'TH' + // 35 -'/H' + // 36 -'/X' + // 37 -'Z*' + // 38 -'ZH' + // 39 -'V*' + // 40 -'DH' + // 41 -'CH' + // 42 -'**' + // 43 -'J*' + // 44 -'**' + // 45 -'**' + // 46 -'**' + // 47 -'EY' + // 48 -'AY' + // 49 -'OY' + // 50 -'AW' + // 51 -'OW' + // 52 -'UW' + // 53 -'B*' + // 54 -'**' + // 55 -'**' + // 56 -'D*' + // 57 -'**' + // 58 -'**' + // 59 -'G*' + // 60 -'**' + // 61 -'**' + // 62 -'GX' + // 63 -'**' + // 64 -'**' + // 65 -'P*' + // 66 -'**' + // 67 -'**' + // 68 -'T*' + // 69 -'**' + // 70 -'**' + // 71 -'K*' + // 72 -'**' + // 73 -'**' + // 74 -'KX' + // 75 -'**' + // 76 -'**' + // 77 -'UL' + // 78 -'UM' + // 79 +let PhonemeNameTable = (' *' + +// 00 +'.*' + +// 01 +'?*' + +// 02 +',*' + +// 03 +'-*' + +// 04 +'IY' + +// 05 +'IH' + +// 06 +'EH' + +// 07 +'AE' + +// 08 +'AA' + +// 09 +'AH' + +// 10 +'AO' + +// 11 +'UH' + +// 12 +'AX' + +// 13 +'IX' + +// 14 +'ER' + +// 15 +'UX' + +// 16 +'OH' + +// 17 +'RX' + +// 18 +'LX' + +// 19 +'WX' + +// 20 +'YX' + +// 21 +'WH' + +// 22 +'R*' + +// 23 +'L*' + +// 24 +'W*' + +// 25 +'Y*' + +// 26 +'M*' + +// 27 +'N*' + +// 28 +'NX' + +// 29 +'DX' + +// 30 +'Q*' + +// 31 +'S*' + +// 32 +'SH' + +// 33 +'F*' + +// 34 +'TH' + +// 35 +'/H' + +// 36 +'/X' + +// 37 +'Z*' + +// 38 +'ZH' + +// 39 +'V*' + +// 40 +'DH' + +// 41 +'CH' + +// 42 +'**' + +// 43 +'J*' + +// 44 +'**' + +// 45 +'**' + +// 46 +'**' + +// 47 +'EY' + +// 48 +'AY' + +// 49 +'OY' + +// 50 +'AW' + +// 51 +'OW' + +// 52 +'UW' + +// 53 +'B*' + +// 54 +'**' + +// 55 +'**' + +// 56 +'D*' + +// 57 +'**' + +// 58 +'**' + +// 59 +'G*' + +// 60 +'**' + +// 61 +'**' + +// 62 +'GX' + +// 63 +'**' + +// 64 +'**' + +// 65 +'P*' + +// 66 +'**' + +// 67 +'**' + +// 68 +'T*' + +// 69 +'**' + +// 70 +'**' + +// 71 +'K*' + +// 72 +'**' + +// 73 +'**' + +// 74 +'KX' + +// 75 +'**' + +// 76 +'**' + +// 77 +'UL' + +// 78 +'UM' + +// 79 'UN' // 80 ).match(/.{1,2}/g); + /** * Flags for phoneme names. * @@ -235,89 +305,169 @@ let PhonemeNameTable = (' *' + // 00 * 'P*', '**', '**', 'T*', '**', '**', 'K*', '**', '**', 'KX', '**', * '**', 'UM', 'UN' */ - -let phonemeFlags = [0 | 0x8000, // ' *' 00 -0 | 0x8000 | 0x4000 | 0x0100, // '.*' 01 -0 | 0x8000 | 0x4000 | 0x0100, // '?*' 02 -0 | 0x8000 | 0x4000 | 0x0100, // ',*' 03 -0 | 0x8000 | 0x4000 | 0x0100, // '-*' 04 -0 | 0x0080 | 0x0020 | 0x0004, // 'IY' 05 -0 | 0x0080 | 0x0020 | 0x0004, // 'IH' 06 -0 | 0x0080 | 0x0020 | 0x0004, // 'EH' 07 -0 | 0x0080 | 0x0020 | 0x0004, // 'AE' 08 -0 | 0x0080 | 0x0020 | 0x0004, // 'AA' 09 -0 | 0x0080 | 0x0020 | 0x0004, // 'AH' 10 -0 | 0x0080 | 0x0004, // 'AO' 11 -0 | 0x0080 | 0x0004, // 'UH' 12 -0 | 0x0080 | 0x0020 | 0x0004, // 'AX' 13 -0 | 0x0080 | 0x0020 | 0x0004, // 'IX' 14 -0 | 0x0080 | 0x0004, // 'ER' 15 -0 | 0x0080 | 0x0004, // 'UX' 16 -0 | 0x0080 | 0x0004, // 'OH' 17 -0 | 0x0080 | 0x0004, // 'RX' 18 -0 | 0x0080 | 0x0004, // 'LX' 19 -0 | 0x0080 | 0x0004, // 'WX' 20 -0 | 0x0080 | 0x0004, // 'YX' 21 -0 | 0x0040 | 0x0004, // 'WH' 22 -0 | 0x1000 | 0x0040 | 0x0004, // 'R*' 23 -0 | 0x1000 | 0x0040 | 0x0004, // 'L*' 24 -0 | 0x1000 | 0x0040 | 0x0004, // 'W*' 25 -0 | 0x1000 | 0x0040 | 0x0004, // 'Y*' 26 -0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, // 'M*' 27 -0 | 0x0800 | 0x0400 | 0x0040 | 0x0008 | 0x0004, // 'N*' 28 -0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, // 'NX' 29 -0 | 0x0400 | 0x0040 | 0x0008, // 'DX' 30 -0 | 0x4000 | 0x0040 | 0x0008 | 0x0004, // 'Q*' 31 -0 | 0x2000 | 0x0400 | 0x0040, // 'S*' 32 -0 | 0x2000 | 0x0040, // 'SH' 33 -0 | 0x2000 | 0x0040, // 'F*' 34 -0 | 0x2000 | 0x0400 | 0x0040, // 'TH' 35 -0 | 0x0040, // '/H' 36 -0 | 0x0040, // '/X' 37 -0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, // 'Z*' 38 -0 | 0x2000 | 0x0040 | 0x0004, // 'ZH' 39 -0 | 0x2000 | 0x0040 | 0x0004, // 'V*' 40 -0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, // 'DH' 41 -0 | 0x2000 | 0x0040 | 0x0008, // 'CH' 42 -0 | 0x2000 | 0x0040, // '**' 43 -0 | 0x0040 | 0x0008 | 0x0004, // 'J*' 44 -0 | 0x2000 | 0x0040 | 0x0004, // '**' 45 -0, // '**' 46 -0, // '**' 47 -0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'EY' 48 -0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'AY' 49 -0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'OY' 50 -0 | 0x0080 | 0x0010 | 0x0004, // 'AW' 51 -0 | 0x0080 | 0x0010 | 0x0004, // 'OW' 52 -0 | 0x0080 | 0x0010 | 0x0004, // 'UW' 53 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'B*' 54 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 55 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 56 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'D*' 57 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 58 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 59 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'G*' 60 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 61 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 62 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'GX' 63 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 64 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 65 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'P*' 66 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 67 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 68 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'T*' 69 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 70 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 71 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'K*' 72 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 73 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 74 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'KX' 75 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 76 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 77 -0 | 0x0080, // 'UL' 78 -0 | 0x0080 | 0x0040 | 0x0001, // 'UM' 79 +let phonemeFlags = [0 | 0x8000, +// ' *' 00 +0 | 0x8000 | 0x4000 | 0x0100, +// '.*' 01 +0 | 0x8000 | 0x4000 | 0x0100, +// '?*' 02 +0 | 0x8000 | 0x4000 | 0x0100, +// ',*' 03 +0 | 0x8000 | 0x4000 | 0x0100, +// '-*' 04 +0 | 0x0080 | 0x0020 | 0x0004, +// 'IY' 05 +0 | 0x0080 | 0x0020 | 0x0004, +// 'IH' 06 +0 | 0x0080 | 0x0020 | 0x0004, +// 'EH' 07 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AE' 08 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AA' 09 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AH' 10 +0 | 0x0080 | 0x0004, +// 'AO' 11 +0 | 0x0080 | 0x0004, +// 'UH' 12 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AX' 13 +0 | 0x0080 | 0x0020 | 0x0004, +// 'IX' 14 +0 | 0x0080 | 0x0004, +// 'ER' 15 +0 | 0x0080 | 0x0004, +// 'UX' 16 +0 | 0x0080 | 0x0004, +// 'OH' 17 +0 | 0x0080 | 0x0004, +// 'RX' 18 +0 | 0x0080 | 0x0004, +// 'LX' 19 +0 | 0x0080 | 0x0004, +// 'WX' 20 +0 | 0x0080 | 0x0004, +// 'YX' 21 +0 | 0x0040 | 0x0004, +// 'WH' 22 +0 | 0x1000 | 0x0040 | 0x0004, +// 'R*' 23 +0 | 0x1000 | 0x0040 | 0x0004, +// 'L*' 24 +0 | 0x1000 | 0x0040 | 0x0004, +// 'W*' 25 +0 | 0x1000 | 0x0040 | 0x0004, +// 'Y*' 26 +0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, +// 'M*' 27 +0 | 0x0800 | 0x0400 | 0x0040 | 0x0008 | 0x0004, +// 'N*' 28 +0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, +// 'NX' 29 +0 | 0x0400 | 0x0040 | 0x0008, +// 'DX' 30 +0 | 0x4000 | 0x0040 | 0x0008 | 0x0004, +// 'Q*' 31 +0 | 0x2000 | 0x0400 | 0x0040, +// 'S*' 32 +0 | 0x2000 | 0x0040, +// 'SH' 33 +0 | 0x2000 | 0x0040, +// 'F*' 34 +0 | 0x2000 | 0x0400 | 0x0040, +// 'TH' 35 +0 | 0x0040, +// '/H' 36 +0 | 0x0040, +// '/X' 37 +0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, +// 'Z*' 38 +0 | 0x2000 | 0x0040 | 0x0004, +// 'ZH' 39 +0 | 0x2000 | 0x0040 | 0x0004, +// 'V*' 40 +0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, +// 'DH' 41 +0 | 0x2000 | 0x0040 | 0x0008, +// 'CH' 42 +0 | 0x2000 | 0x0040, +// '**' 43 +0 | 0x0040 | 0x0008 | 0x0004, +// 'J*' 44 +0 | 0x2000 | 0x0040 | 0x0004, +// '**' 45 +0, +// '**' 46 +0, +// '**' 47 +0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, +// 'EY' 48 +0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, +// 'AY' 49 +0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, +// 'OY' 50 +0 | 0x0080 | 0x0010 | 0x0004, +// 'AW' 51 +0 | 0x0080 | 0x0010 | 0x0004, +// 'OW' 52 +0 | 0x0080 | 0x0010 | 0x0004, +// 'UW' 53 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'B*' 54 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 55 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 56 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'D*' 57 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 58 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 59 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'G*' 60 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 61 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 62 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'GX' 63 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 64 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 65 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'P*' 66 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 67 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 68 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'T*' 69 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 70 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 71 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'K*' 72 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 73 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 74 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'KX' 75 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 76 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 77 +0 | 0x0080, +// 'UL' 78 +0 | 0x0080 | 0x0040 | 0x0001, +// 'UM' 79 0 | 0x0080 | 0x0040 | 0x0001 // 'UN' 80 ]; + /** * Combined table of phoneme length. * @@ -327,88 +477,167 @@ let phonemeFlags = [0 | 0x8000, // ' *' 00 * phonemeLengthTable[i] = combinedPhonemeLengthTable[i] & 0xFF * phonemeStressedLengthTable[i] = combinedPhonemeLengthTable[i] >> 8 */ - -let combinedPhonemeLengthTable = [0x0000 | 0x0000, // ' *' 00 -0x0012 | 0x1200, // '.*' 01 -0x0012 | 0x1200, // '?*' 02 -0x0012 | 0x1200, // ',*' 03 -0x0008 | 0x0800, // '-*' 04 -0x0008 | 0x0B00, // 'IY' 05 -0x0008 | 0x0900, // 'IH' 06 -0x0008 | 0x0B00, // 'EH' 07 -0x0008 | 0x0E00, // 'AE' 08 -0x000B | 0x0F00, // 'AA' 09 -0x0006 | 0x0B00, // 'AH' 10 -0x000C | 0x1000, // 'AO' 11 -0x000A | 0x0C00, // 'UH' 12 -0x0005 | 0x0600, // 'AX' 13 -0x0005 | 0x0600, // 'IX' 14 -0x000B | 0x0E00, // 'ER' 15 -0x000A | 0x0C00, // 'UX' 16 -0x000A | 0x0E00, // 'OH' 17 -0x000A | 0x0C00, // 'RX' 18 -0x0009 | 0x0B00, // 'LX' 19 -0x0008 | 0x0800, // 'WX' 20 -0x0007 | 0x0800, // 'YX' 21 -0x0009 | 0x0B00, // 'WH' 22 -0x0007 | 0x0A00, // 'R*' 23 -0x0006 | 0x0900, // 'L*' 24 -0x0008 | 0x0800, // 'W*' 25 -0x0006 | 0x0800, // 'Y*' 26 -0x0007 | 0x0800, // 'M*' 27 -0x0007 | 0x0800, // 'N*' 28 -0x0007 | 0x0800, // 'NX' 29 -0x0002 | 0x0300, // 'DX' 30 -0x0005 | 0x0500, // 'Q*' 31 -0x0002 | 0x0200, // 'S*' 32 -0x0002 | 0x0200, // 'SH' 33 -0x0002 | 0x0200, // 'F*' 34 -0x0002 | 0x0200, // 'TH' 35 -0x0002 | 0x0200, // '/H' 36 -0x0002 | 0x0200, // '/X' 37 -0x0006 | 0x0600, // 'Z*' 38 -0x0006 | 0x0600, // 'ZH' 39 -0x0007 | 0x0800, // 'V*' 40 -0x0006 | 0x0600, // 'DH' 41 -0x0006 | 0x0600, // 'CH' 42 -0x0002 | 0x0200, // '**' 43 -0x0008 | 0x0900, // 'J*' 44 -0x0003 | 0x0400, // '**' 45 -0x0001 | 0x0200, // '**' 46 -0x001E | 0x0100, // '**' 47 -0x000D | 0x0E00, // 'EY' 48 -0x000C | 0x0F00, // 'AY' 49 -0x000C | 0x0F00, // 'OY' 50 -0x000C | 0x0F00, // 'AW' 51 -0x000E | 0x0E00, // 'OW' 52 -0x0009 | 0x0E00, // 'UW' 53 -0x0006 | 0x0800, // 'B*' 54 -0x0001 | 0x0200, // '**' 55 -0x0002 | 0x0200, // '**' 56 -0x0005 | 0x0700, // 'D*' 57 -0x0001 | 0x0200, // '**' 58 -0x0001 | 0x0100, // '**' 59 -0x0006 | 0x0700, // 'G*' 60 -0x0001 | 0x0200, // '**' 61 -0x0002 | 0x0200, // '**' 62 -0x0006 | 0x0700, // 'GX' 63 -0x0001 | 0x0200, // '**' 64 -0x0002 | 0x0200, // '**' 65 -0x0008 | 0x0800, // 'P*' 66 -0x0002 | 0x0200, // '**' 67 -0x0002 | 0x0200, // '**' 68 -0x0004 | 0x0600, // 'T*' 69 -0x0002 | 0x0200, // '**' 70 -0x0002 | 0x0200, // '**' 71 -0x0006 | 0x0700, // 'K*' 72 -0x0001 | 0x0200, // '**' 73 -0x0004 | 0x0400, // '**' 74 -0x0006 | 0x0700, // 'KX' 75 -0x0001 | 0x0100, // '**' 76 -0x0004 | 0x0400, // '**' 77 -0x00C7 | 0x0500, // 'UL' 78 +let combinedPhonemeLengthTable = [0x0000 | 0x0000, +// ' *' 00 +0x0012 | 0x1200, +// '.*' 01 +0x0012 | 0x1200, +// '?*' 02 +0x0012 | 0x1200, +// ',*' 03 +0x0008 | 0x0800, +// '-*' 04 +0x0008 | 0x0B00, +// 'IY' 05 +0x0008 | 0x0900, +// 'IH' 06 +0x0008 | 0x0B00, +// 'EH' 07 +0x0008 | 0x0E00, +// 'AE' 08 +0x000B | 0x0F00, +// 'AA' 09 +0x0006 | 0x0B00, +// 'AH' 10 +0x000C | 0x1000, +// 'AO' 11 +0x000A | 0x0C00, +// 'UH' 12 +0x0005 | 0x0600, +// 'AX' 13 +0x0005 | 0x0600, +// 'IX' 14 +0x000B | 0x0E00, +// 'ER' 15 +0x000A | 0x0C00, +// 'UX' 16 +0x000A | 0x0E00, +// 'OH' 17 +0x000A | 0x0C00, +// 'RX' 18 +0x0009 | 0x0B00, +// 'LX' 19 +0x0008 | 0x0800, +// 'WX' 20 +0x0007 | 0x0800, +// 'YX' 21 +0x0009 | 0x0B00, +// 'WH' 22 +0x0007 | 0x0A00, +// 'R*' 23 +0x0006 | 0x0900, +// 'L*' 24 +0x0008 | 0x0800, +// 'W*' 25 +0x0006 | 0x0800, +// 'Y*' 26 +0x0007 | 0x0800, +// 'M*' 27 +0x0007 | 0x0800, +// 'N*' 28 +0x0007 | 0x0800, +// 'NX' 29 +0x0002 | 0x0300, +// 'DX' 30 +0x0005 | 0x0500, +// 'Q*' 31 +0x0002 | 0x0200, +// 'S*' 32 +0x0002 | 0x0200, +// 'SH' 33 +0x0002 | 0x0200, +// 'F*' 34 +0x0002 | 0x0200, +// 'TH' 35 +0x0002 | 0x0200, +// '/H' 36 +0x0002 | 0x0200, +// '/X' 37 +0x0006 | 0x0600, +// 'Z*' 38 +0x0006 | 0x0600, +// 'ZH' 39 +0x0007 | 0x0800, +// 'V*' 40 +0x0006 | 0x0600, +// 'DH' 41 +0x0006 | 0x0600, +// 'CH' 42 +0x0002 | 0x0200, +// '**' 43 +0x0008 | 0x0900, +// 'J*' 44 +0x0003 | 0x0400, +// '**' 45 +0x0001 | 0x0200, +// '**' 46 +0x001E | 0x0100, +// '**' 47 +0x000D | 0x0E00, +// 'EY' 48 +0x000C | 0x0F00, +// 'AY' 49 +0x000C | 0x0F00, +// 'OY' 50 +0x000C | 0x0F00, +// 'AW' 51 +0x000E | 0x0E00, +// 'OW' 52 +0x0009 | 0x0E00, +// 'UW' 53 +0x0006 | 0x0800, +// 'B*' 54 +0x0001 | 0x0200, +// '**' 55 +0x0002 | 0x0200, +// '**' 56 +0x0005 | 0x0700, +// 'D*' 57 +0x0001 | 0x0200, +// '**' 58 +0x0001 | 0x0100, +// '**' 59 +0x0006 | 0x0700, +// 'G*' 60 +0x0001 | 0x0200, +// '**' 61 +0x0002 | 0x0200, +// '**' 62 +0x0006 | 0x0700, +// 'GX' 63 +0x0001 | 0x0200, +// '**' 64 +0x0002 | 0x0200, +// '**' 65 +0x0008 | 0x0800, +// 'P*' 66 +0x0002 | 0x0200, +// '**' 67 +0x0002 | 0x0200, +// '**' 68 +0x0004 | 0x0600, +// 'T*' 69 +0x0002 | 0x0200, +// '**' 70 +0x0002 | 0x0200, +// '**' 71 +0x0006 | 0x0700, +// 'K*' 72 +0x0001 | 0x0200, +// '**' 73 +0x0004 | 0x0400, +// '**' 74 +0x0006 | 0x0700, +// 'KX' 75 +0x0001 | 0x0100, +// '**' 76 +0x0004 | 0x0400, +// '**' 77 +0x00C7 | 0x0500, +// 'UL' 78 0x00FF | 0x0500 // 'UM' 79 ]; + /* Ind | phoneme | flags | @@ -523,27 +752,26 @@ SPECIAL * @param {string} sign2 * @return {boolean|Number} */ - let full_match = (sign1, sign2) => { let index = PhonemeNameTable.findIndex(value => { return value === sign1 + sign2 && value[1] !== '*'; }); return index !== -1 ? index : false; }; + /** * Match single character phoneme. * * @param {string} sign1 * @return {boolean|Number} */ - - let single_match = sign1 => { let index = PhonemeNameTable.findIndex(value => { return value === sign1 + '*'; }); return index !== -1 ? index : false; }; + /** * The input[] buffer contains a string of phonemes and stress markers along * the lines of: @@ -597,46 +825,37 @@ let single_match = sign1 => { * * @return {undefined} */ - - let Parser1 = (input, addPhoneme, addStress) => { for (let srcPos = 0; srcPos < input.length; srcPos++) { { let tmp = input.toLowerCase(); - console.log("processing \"".concat(tmp.substr(0, srcPos), "%c").concat(tmp.substr(srcPos, 2).toUpperCase(), "%c").concat(tmp.substr(srcPos + 2), "\""), 'color: red;', 'color:normal;'); + console.log(`processing "${tmp.substr(0, srcPos)}%c${tmp.substr(srcPos, 2).toUpperCase()}%c${tmp.substr(srcPos + 2)}"`, 'color: red;', 'color:normal;'); } - let sign1 = input[srcPos]; let sign2 = input[srcPos + 1] || ''; let match; - if ((match = full_match(sign1, sign2)) !== false) { // Matched both characters (no single char mark) srcPos++; // Skip the second character of the input as we've matched it - addPhoneme(match); continue; } - if ((match = single_match(sign1)) !== false) { // Matched just the first character (with second character matching '*' addPhoneme(match); continue; - } // Should be a stress character. Search through the stress table backwards. - + } + // Should be a stress character. Search through the stress table backwards. match = StressTable.length; - while (sign1 !== StressTable[match] && match > 0) { --match; } - if (match === 0) { { - throw Error("Could not parse char ".concat(sign1)); + throw Error(`Could not parse char ${sign1}`); } } - addStress(match); // Set stress for prior phoneme } }; @@ -649,7 +868,6 @@ let Parser1 = (input, addPhoneme, addStress) => { * * @return {boolean} */ - let phonemeHasFlag = (phoneme, flag) => { return matchesBitmask(phonemeFlags[phoneme], flag); }; @@ -660,10 +878,10 @@ let pT = 69; let PHONEME_PERIOD = 1; let PHONEME_QUESTION = 2; let FLAG_FRICATIVE = 0x2000; + /** * liquic consonant */ - let FLAG_LIQUIC = 0x1000; let FLAG_NASAL = 0x0800; let FLAG_ALVEOLAR = 0x0400; @@ -674,7 +892,6 @@ let FLAG_CONSONANT = 0x0040; * diphthong ending with YX * */ - let FLAG_DIP_YX = 0x0020; let FLAG_DIPHTHONG = 0x0010; /** unknown: @@ -682,13 +899,12 @@ let FLAG_DIPHTHONG = 0x0010; * '**', '**', 'G*', '**', '**', 'GX', '**', '**', 'P*', '**', '**', * 'T*', '**', '**', 'K*', '**', '**', 'KX', '**', '**' */ - let FLAG_0008 = 0x0008; let FLAG_VOICED = 0x0004; + /** * stop consonant */ - let FLAG_STOPCONS = 0x0002; let FLAG_UNVOICED_STOPCONS = 0x0001; @@ -725,7 +941,6 @@ let FLAG_UNVOICED_STOPCONS = 0x0001; * * @return undefined */ - let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { /** * Rewrites: @@ -743,96 +958,77 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { // ALVEOLAR flag set? if (phonemeHasFlag(getPhoneme(pos - 1), FLAG_ALVEOLAR)) { { - console.log("".concat(pos, " RULE: UW -> UX")); + console.log(`${pos} RULE: UW -> UX`); } - setPhoneme(pos, 16); // UX } - break; } // 'CH' Example: CHEW - case 42: { { - console.log("".concat(pos, " RULE: CH -> CH CH+1")); + console.log(`${pos} RULE: CH -> CH CH+1`); } - insertPhoneme(pos + 1, 43, getStress(pos)); // '**' - break; } // 'J*' Example: JAY - case 44: { { - console.log("".concat(pos, " RULE: J -> J J+1")); + console.log(`${pos} RULE: J -> J J+1`); } - insertPhoneme(pos + 1, 45, getStress(pos)); // '**' - break; } } }; - let changeAX = (position, suffix) => { { - console.log("".concat(position, " RULE: ").concat(PhonemeNameTable[getPhoneme(position)], " -> AX ").concat(PhonemeNameTable[suffix])); + console.log(`${position} RULE: ${PhonemeNameTable[getPhoneme(position)]} -> AX ${PhonemeNameTable[suffix]}`); } - setPhoneme(position, 13); // 'AX' - insertPhoneme(position + 1, suffix, getStress(position)); }; - let pos = -1; let phoneme; - while ((phoneme = getPhoneme(++pos)) !== null) { // Is phoneme pause? if (phoneme === 0) { continue; } - if (phonemeHasFlag(phoneme, FLAG_DIPHTHONG)) { // -> WX // -> YX // Example: OIL, COW { - console.log(!phonemeHasFlag(phoneme, FLAG_DIP_YX) ? "".concat(pos, " RULE: insert WX following diphthong NOT ending in IY sound") : "".concat(pos, " RULE: insert YX following diphthong ending in IY sound")); - } // If ends with IY, use YX, else use WX + console.log(!phonemeHasFlag(phoneme, FLAG_DIP_YX) ? `${pos} RULE: insert WX following diphthong NOT ending in IY sound` : `${pos} RULE: insert YX following diphthong ending in IY sound`); + } + // If ends with IY, use YX, else use WX // Insert at WX or YX following, copying the stress // 'WX' = 20 'YX' = 21 - - insertPhoneme(pos + 1, phonemeHasFlag(phoneme, FLAG_DIP_YX) ? 21 : 20, getStress(pos)); handleUW_CH_J(phoneme, pos); continue; } - if (phoneme === 78) { // 'UL' => 'AX' 'L*' // Example: MEDDLE changeAX(pos, 24); continue; } - if (phoneme === 79) { // 'UM' => 'AX' 'M*' // Example: ASTRONOMY changeAX(pos, 27); continue; } - if (phoneme === 80) { // 'UN' => 'AX' 'N*' changeAX(pos, 28); continue; } - if (phonemeHasFlag(phoneme, FLAG_VOWEL) && getStress(pos)) { // Example: FUNCTION // RULE: @@ -841,21 +1037,16 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { if (getPhoneme(pos + 1) === 0) { // If following phoneme is a pause, get next phoneme = getPhoneme(pos + 2); - if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_VOWEL) && getStress(pos + 2)) { { - console.log("".concat(pos + 2, " RULE: Insert glottal stop between two stressed vowels with space between them")); + console.log(`${pos + 2} RULE: Insert glottal stop between two stressed vowels with space between them`); } - insertPhoneme(pos + 2, 31, 0); // 31 = 'Q' } } - continue; } - let priorPhoneme = pos === 0 ? null : getPhoneme(pos - 1); - if (phoneme === pR) { // RULES FOR PHONEMES BEFORE R switch (priorPhoneme) { @@ -863,103 +1054,88 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { { // Example: TRACK { - console.log("".concat(pos, " RULE: T* R* -> CH R*")); + console.log(`${pos} RULE: T* R* -> CH R*`); } - setPhoneme(pos - 1, 42); // 'T*' 'R*' -> 'CH' 'R*' - break; } - case pD: { // Example: DRY { - console.log("".concat(pos, " RULE: D* R* -> J* R*")); + console.log(`${pos} RULE: D* R* -> J* R*`); } - setPhoneme(pos - 1, 44); // 'J*' - break; } - default: { if (phonemeHasFlag(priorPhoneme, FLAG_VOWEL)) { // Example: ART { - console.log("".concat(pos, " R* -> RX")); + console.log(`${pos} R* -> RX`); } - setPhoneme(pos, 18); // 'RX' } } } - continue; - } // 'L*' - + } + // 'L*' if (phoneme === 24 && phonemeHasFlag(priorPhoneme, FLAG_VOWEL)) { // Example: ALL { - console.log("".concat(pos, " L* -> LX")); + console.log(`${pos} L* -> LX`); } - setPhoneme(pos, 19); // 'LX' - continue; - } // 'G*' 'S*' - - + } + // 'G*' 'S*' if (priorPhoneme === 60 && phoneme === 32) { // Can't get to fire - // 1. The G -> GX rule intervenes // 2. Reciter already replaces GS -> GZ { - console.log("".concat(pos, " G S -> G Z")); + console.log(`${pos} G S -> G Z`); } - setPhoneme(pos, 38); continue; - } // 'G*' - + } + // 'G*' if (phoneme === 60) { // G -> GX // Example: GO - let phoneme = getPhoneme(pos + 1); // If diphthong ending with YX, move continue processing next phoneme - + let phoneme = getPhoneme(pos + 1); + // If diphthong ending with YX, move continue processing next phoneme if (!phonemeHasFlag(phoneme, FLAG_DIP_YX) && phoneme !== null) { // replace G with GX and continue processing next phoneme { - console.log("".concat(pos, " RULE: G -> GX ")); + console.log(`${pos} RULE: G -> GX `); } - setPhoneme(pos, 63); // 'GX' } - continue; - } // 'K*' - + } + // 'K*' if (phoneme === 72) { // K -> KX // Example: COW - let Y = getPhoneme(pos + 1); // If at end, replace current phoneme with KX - + let Y = getPhoneme(pos + 1); + // If at end, replace current phoneme with KX if (!phonemeHasFlag(Y, FLAG_DIP_YX) || Y === null) { // VOWELS AND DIPHTHONGS ENDING WITH IY SOUND flag set? { - console.log("".concat(pos, " K -> KX ")); + console.log(`${pos} K -> KX `); } - setPhoneme(pos, 75); phoneme = 75; } - } // Replace with softer version? - + } + // Replace with softer version? if (phonemeHasFlag(phoneme, FLAG_UNVOICED_STOPCONS) && priorPhoneme === 32) { // 'S*' // RULE: @@ -971,15 +1147,14 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { // 'S*' 'UN' -> 'S*' '**' // Examples: SPY, STY, SKY, SCOWL { - console.log("".concat(pos, " RULE: S* ").concat(PhonemeNameTable[phoneme], " -> S* ").concat(PhonemeNameTable[phoneme - 12])); + console.log(`${pos} RULE: S* ${PhonemeNameTable[phoneme]} -> S* ${PhonemeNameTable[phoneme - 12]}`); } - setPhoneme(pos, phoneme - 12); } else if (!phonemeHasFlag(phoneme, FLAG_UNVOICED_STOPCONS)) { handleUW_CH_J(phoneme, pos); - } // 'T*', 'D*' - + } + // 'T*', 'D*' if (phoneme === 69 || phoneme === 57) { // RULE: Soften T following vowel // NOTE: This rule fails for cases such as "ODD" @@ -988,28 +1163,22 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { // Example: PARTY, TARDY if (pos > 0 && phonemeHasFlag(getPhoneme(pos - 1), FLAG_VOWEL)) { phoneme = getPhoneme(pos + 1); - if (phoneme === 0) { phoneme = getPhoneme(pos + 2); } - if (phonemeHasFlag(phoneme, FLAG_VOWEL) && !getStress(pos + 1)) { { - console.log("".concat(pos, " Soften T or D following vowel or ER and preceding a pause -> DX")); + console.log(`${pos} Soften T or D following vowel or ER and preceding a pause -> DX`); } - setPhoneme(pos, 30); } } - continue; } - { - console.log("".concat(pos, ": ").concat(PhonemeNameTable[phoneme])); + console.log(`${pos}: ${PhonemeNameTable[phoneme]}`); } } // while - }; /** @@ -1029,177 +1198,160 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { * * @return undefined */ - let AdjustLengths = (getPhoneme, setLength, getLength) => { { - console.log("AdjustLengths()"); - } // LENGTHEN VOWELS PRECEDING PUNCTUATION + console.log(`AdjustLengths()`); + } + + // LENGTHEN VOWELS PRECEDING PUNCTUATION // // Search for punctuation. If found, back up to the first vowel, then // process all phonemes between there and up to (but not including) the punctuation. // If any phoneme is found that is a either a fricative or voiced, the duration is // increased by (length * 1.5) + 1 - // loop index - + // loop index for (let position = 0; getPhoneme(position) !== null; position++) { // not punctuation? if (!phonemeHasFlag(getPhoneme(position), FLAG_PUNCT)) { continue; } - let loopIndex = position; - - while (--position > 1 && !phonemeHasFlag(getPhoneme(position), FLAG_VOWEL)) { - /* back up while not a vowel */ - } // If beginning of phonemes, exit loop. - - + while (--position > 1 && !phonemeHasFlag(getPhoneme(position), FLAG_VOWEL)) {/* back up while not a vowel */} + // If beginning of phonemes, exit loop. if (position === 0) { break; - } // Now handle everything between position and loopIndex - + } + // Now handle everything between position and loopIndex let vowel = position; - for (; position < loopIndex; position++) { // test for not fricative/unvoiced or not voiced if (!phonemeHasFlag(getPhoneme(position), FLAG_FRICATIVE) || phonemeHasFlag(getPhoneme(position), FLAG_VOICED)) { - let A = getLength(position); // change phoneme length to (length * 1.5) + 1 - + let A = getLength(position); + // change phoneme length to (length * 1.5) + 1 { console.log(position + ' RULE: Lengthen or ' + PhonemeNameTable[getPhoneme(position)] + ' between VOWEL:' + PhonemeNameTable[getPhoneme(vowel)] + ' and PUNCTUATION:' + PhonemeNameTable[getPhoneme(position)] + ' by 1.5'); } - setLength(position, (A >> 1) + A + 1); } } - } // Similar to the above routine, but shorten vowels under some circumstances - // Loop through all phonemes - + } + // Similar to the above routine, but shorten vowels under some circumstances + // Loop through all phonemes let loopIndex = -1; let phoneme; - while ((phoneme = getPhoneme(++loopIndex)) !== null) { - let position = loopIndex; // vowel? - + let position = loopIndex; + // vowel? if (phonemeHasFlag(phoneme, FLAG_VOWEL)) { // get next phoneme - phoneme = getPhoneme(++position); // not a consonant - + phoneme = getPhoneme(++position); + // not a consonant if (!phonemeHasFlag(phoneme, FLAG_CONSONANT)) { // 'RX' or 'LX'? if ((phoneme === 18 || phoneme === 19) && phonemeHasFlag(getPhoneme(++position), FLAG_CONSONANT)) { // followed by consonant? { console.log(loopIndex + ' RULE: ' + PhonemeNameTable[phoneme] + ' - decrease length of vowel by 1'); - } // decrease length of vowel by 1 frame - - + } + // decrease length of vowel by 1 frame setLength(loopIndex, getLength(loopIndex) - 1); } - continue; - } // Got here if not + } + // Got here if not // FIXME: the case when phoneme === END is taken over by !phonemeHasFlag(phoneme, FLAG_CONSONANT) - - - let flags = phoneme === null ? FLAG_CONSONANT | FLAG_UNVOICED_STOPCONS : phonemeFlags[phoneme]; // Unvoiced - + let flags = phoneme === null ? FLAG_CONSONANT | FLAG_UNVOICED_STOPCONS : phonemeFlags[phoneme]; + // Unvoiced if (!matchesBitmask(flags, FLAG_VOICED)) { // *, .*, ?*, ,*, -*, DX, S*, SH, F*, TH, /H, /X, CH, P*, T*, K*, KX + // unvoiced plosive if (matchesBitmask(flags, FLAG_UNVOICED_STOPCONS)) { // RULE: // { - console.log("".concat(loopIndex, " - decrease vowel by 1/8th")); + console.log(`${loopIndex} - decrease vowel by 1/8th`); } - let A = getLength(loopIndex); setLength(loopIndex, A - (A >> 3)); } - continue; - } // RULE: + } + + // RULE: // - - { - console.log("".concat(loopIndex, " RULE: - increase vowel by 1/4 + 1")); - } // increase length - - + console.log(`${loopIndex} RULE: - increase vowel by 1/4 + 1`); + } + // increase length let A = getLength(loopIndex); setLength(loopIndex, (A >> 2) + A + 1); // 5/4*A + 1 - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, M*, N*, NX, DX, Q*, S*, SH, F*, - // TH, /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX - // nasal? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, M*, N*, NX, DX, Q*, S*, SH, F*, + // TH, /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX + // nasal? if (phonemeHasFlag(phoneme, FLAG_NASAL)) { // RULE: // Set punctuation length to 6 // Set stop consonant length to 5 - // M*, N*, NX, - phoneme = getPhoneme(++position); // is next phoneme a stop consonant? + // M*, N*, NX, + phoneme = getPhoneme(++position); + // is next phoneme a stop consonant? if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // B*, D*, G*, GX, P*, T*, K*, KX { - console.log("".concat(position, " RULE: - set nasal = 5, consonant = 6")); + console.log(`${position} RULE: - set nasal = 5, consonant = 6`); } - setLength(position, 6); // set stop consonant length to 6 - setLength(position - 1, 5); // set nasal length to 5 } - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, - // /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX - // stop consonant? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, + // /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX + // stop consonant? if (phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // B*, D*, G*, GX + // RULE: {optional silence} // Shorten both to (length/2 + 1) - while ((phoneme = getPhoneme(++position)) === 0) { - /* move past silence */ - } // if another stop consonant, process. - + while ((phoneme = getPhoneme(++position)) === 0) {/* move past silence */} + // if another stop consonant, process. if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // RULE: {optional silence} { - console.log("".concat(position, " RULE: {optional silence} - shorten both to 1/2 + 1")); + console.log(`${position} RULE: {optional silence} - shorten both to 1/2 + 1`); } - setLength(position, (getLength(position) >> 1) + 1); setLength(loopIndex, (getLength(loopIndex) >> 1) + 1); } - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, - // /H, /X, Z*, ZH, V*, DH, CH, J* - // liquic consonant? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, + // /H, /X, Z*, ZH, V*, DH, CH, J* + // liquic consonant? if (position > 0 && phonemeHasFlag(phoneme, FLAG_LIQUIC) && phonemeHasFlag(getPhoneme(position - 1), FLAG_STOPCONS)) { // R*, L*, W*, Y* // RULE: // Decrease by 2 // prior phoneme is a stop consonant { - console.log("".concat(position, " RULE: - decrease by 2")); - } // decrease the phoneme length by 2 frames - - + console.log(`${position} RULE: - decrease by 2`); + } + // decrease the phoneme length by 2 frames setLength(position, getLength(position) - 2); } } @@ -1224,21 +1376,18 @@ let AdjustLengths = (getPhoneme, setLength, getLength) => { * * @return undefined */ - let CopyStress = (getPhoneme, getStress, setStress) => { // loop through all the phonemes to be output let position = 0; let phoneme; - while ((phoneme = getPhoneme(position)) !== null) { // if CONSONANT_FLAG set, skip - only vowels get stress if (phonemeHasFlag(phoneme, FLAG_CONSONANT)) { - phoneme = getPhoneme(position + 1); // if the following phoneme is the end, or a vowel, skip - + phoneme = getPhoneme(position + 1); + // if the following phoneme is the end, or a vowel, skip if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_VOWEL)) { // get the stress value at the next position let stress = getStress(position + 1); - if (stress !== 0 && stress < 0x80) { // if next phoneme is stressed, and a VOWEL OR ER // copy stress from next phoneme to this one @@ -1246,7 +1395,6 @@ let CopyStress = (getPhoneme, getStress, setStress) => { } } } - ++position; } }; @@ -1260,20 +1408,16 @@ let CopyStress = (getPhoneme, getStress, setStress) => { * * @return undefined */ - let SetPhonemeLength = (getPhoneme, getStress, setLength) => { let position = 0; let phoneme; - while ((phoneme = getPhoneme(position)) !== null) { let stress = getStress(position); - if (stress === 0 || stress > 0x7F) { setLength(position, combinedPhonemeLengthTable[phoneme] & 0xFF); } else { setLength(position, combinedPhonemeLengthTable[phoneme] >> 8); } - position++; } }; @@ -1288,32 +1432,26 @@ let SetPhonemeLength = (getPhoneme, getStress, setLength) => { * * @return undefined */ - let ProlongPlosiveStopConsonantsCode41240 = (getPhoneme, insertPhoneme, getStress) => { let pos = -1; let index; - while ((index = getPhoneme(++pos)) !== null) { // Not a stop consonant, move to next one. if (!phonemeHasFlag(index, FLAG_STOPCONS)) { continue; - } //If plosive, move to next non empty phoneme and validate the flags. - - + } + //If plosive, move to next non empty phoneme and validate the flags. if (phonemeHasFlag(index, FLAG_UNVOICED_STOPCONS)) { let nextNonEmpty; let X = pos; - do { nextNonEmpty = getPhoneme(++X); - } while (nextNonEmpty === 0); // If not END and either flag 0x0008 or '/H' or '/X' - - + } while (nextNonEmpty === 0); + // If not END and either flag 0x0008 or '/H' or '/X' if (nextNonEmpty !== null && (phonemeHasFlag(nextNonEmpty, FLAG_0008) || nextNonEmpty === 36 || nextNonEmpty === 37)) { continue; } } - insertPhoneme(pos + 1, index + 1, getStress(pos), combinedPhonemeLengthTable[index + 1] & 0xFF); insertPhoneme(pos + 2, index + 2, getStress(pos), combinedPhonemeLengthTable[index + 2] & 0xFF); pos += 2; @@ -1329,29 +1467,25 @@ let ProlongPlosiveStopConsonantsCode41240 = (getPhoneme, insertPhoneme, getStres * * @return {Array|Boolean} The parsed data. */ - let Parser = input => { if (!input) { return false; } - let getPhoneme = pos => { { if (pos < 0 || pos > phonemeindex.length) { throw new Error('Out of bounds: ' + pos); } } - return pos === phonemeindex.length ? null : phonemeindex[pos]; }; - let setPhoneme = (pos, value) => { { - console.log("".concat(pos, " CHANGE: ").concat(PhonemeNameTable[phonemeindex[pos]], " -> ").concat(PhonemeNameTable[value])); + console.log(`${pos} CHANGE: ${PhonemeNameTable[phonemeindex[pos]]} -> ${PhonemeNameTable[value]}`); } - phonemeindex[pos] = value; }; + /** * @param {Number} pos The position in the phoneme array to insert at. * @param {Number} value The phoneme to insert. @@ -1360,54 +1494,40 @@ let Parser = input => { * * @return {undefined} */ - - let insertPhoneme = (pos, value, stressValue, length) => { { - console.log("".concat(pos, " INSERT: ").concat(PhonemeNameTable[value])); + console.log(`${pos} INSERT: ${PhonemeNameTable[value]}`); } - for (let i = phonemeindex.length - 1; i >= pos; i--) { phonemeindex[i + 1] = phonemeindex[i]; phonemeLength[i + 1] = getLength(i); stress[i + 1] = getStress(i); } - phonemeindex[pos] = value; phonemeLength[pos] = length | 0; stress[pos] = stressValue; }; - let getStress = pos => stress[pos] | 0; - let setStress = (pos, stressValue) => { { - console.log("".concat(pos, " \"").concat(PhonemeNameTable[phonemeindex[pos]], "\" SET STRESS: ").concat(stress[pos], " -> ").concat(stressValue)); + console.log(`${pos} "${PhonemeNameTable[phonemeindex[pos]]}" SET STRESS: ${stress[pos]} -> ${stressValue}`); } - stress[pos] = stressValue; }; - let getLength = pos => phonemeLength[pos] | 0; - let setLength = (pos, length) => { { - console.log("".concat(pos, " \"").concat(PhonemeNameTable[phonemeindex[pos]], "\" SET LENGTH: ").concat(phonemeLength[pos], " -> ").concat(length)); - + console.log(`${pos} "${PhonemeNameTable[phonemeindex[pos]]}" SET LENGTH: ${phonemeLength[pos]} -> ${length}`); if ((length & 128) !== 0) { throw new Error('Got the flag 0x80, see CopyStress() and SetPhonemeLength() comments!'); } - if (pos < 0 || pos > phonemeindex.length) { throw new Error('Out of bounds: ' + pos); } } - phonemeLength[pos] = length; }; - let stress = []; //numbers from 0 to 8 - let phonemeLength = []; let phonemeindex = []; let pos = 0; @@ -1421,27 +1541,22 @@ let Parser = input => { throw new Error('Got the flag 0x80, see CopyStress() and SetPhonemeLength() comments!'); } } - - stress[pos - 1] = value; - /* Set stress for prior phoneme */ + stress[pos - 1] = value; /* Set stress for prior phoneme */ }); - { PrintPhonemes(phonemeindex, phonemeLength, stress); } - Parser2(insertPhoneme, setPhoneme, getPhoneme, getStress); CopyStress(getPhoneme, getStress, setStress); SetPhonemeLength(getPhoneme, getStress, setLength); AdjustLengths(getPhoneme, setLength, getLength); ProlongPlosiveStopConsonantsCode41240(getPhoneme, insertPhoneme, getStress); - { PrintPhonemes(phonemeindex, phonemeLength, stress); } - return phonemeindex.map((v, i) => v ? [v, phonemeLength[i] | 0, stress[i] | 0] : null).filter(v => v); }; + /** * Debug printing. * @@ -1451,46 +1566,45 @@ let Parser = input => { * * @return undefined */ - let PrintPhonemes = (phonemeindex, phonemeLength, stress) => { let pad = num => { let s = '000' + num; return s.substr(s.length - 3); }; - console.log('=================================='); console.log('Internal Phoneme presentation:'); console.log(' pos idx phoneme length stress'); console.log('----------------------------------'); - for (let i = 0; i < phonemeindex.length; i++) { let name = () => { if (phonemeindex[i] < 81) { return PhonemeNameTable[phonemeindex[i]]; } - return '??'; }; - console.log(' %s %s %s %s %s', pad(i), pad(phonemeindex[i]), name(phonemeindex[i]), pad(phonemeLength[i]), pad(stress[i])); } - console.log('=================================='); }; // Values substituted for zero bits in unvoiced consonant samples. // tab48426 let sampledConsonantValues0 = [0x18, 0x1A, 0x17, 0x17, 0x17]; -let stressPitch_tab47492 = [0x00, 0xE0, 0xE6, 0xEC, 0xF3, 0xF9, 0x00, 0x06, 0xC, 0x06]; // Used to decide which phoneme's blend lengths. The candidate with the lower score is selected. +let stressPitch_tab47492 = [0x00, 0xE0, 0xE6, 0xEC, 0xF3, 0xF9, 0x00, 0x06, 0xC, 0x06]; + +// Used to decide which phoneme's blend lengths. The candidate with the lower score is selected. // tab45856 +let blendRank = [0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x02, 0x0A, 0x02, 0x08, 0x05, 0x05, 0x0B, 0x0A, 0x09, 0x08, 0x08, 0xA0, 0x08, 0x08, 0x17, 0x1F, 0x12, 0x12, 0x12, 0x12, 0x1E, 0x1E, 0x14, 0x14, 0x14, 0x14, 0x17, 0x17, 0x1A, 0x1A, 0x1D, 0x1D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x17]; -let blendRank = [0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x02, 0x0A, 0x02, 0x08, 0x05, 0x05, 0x0B, 0x0A, 0x09, 0x08, 0x08, 0xA0, 0x08, 0x08, 0x17, 0x1F, 0x12, 0x12, 0x12, 0x12, 0x1E, 0x1E, 0x14, 0x14, 0x14, 0x14, 0x17, 0x17, 0x1A, 0x1A, 0x1D, 0x1D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x17]; // Number of frames at the end of a phoneme devoted to interpolating to next phoneme's final value +// Number of frames at the end of a phoneme devoted to interpolating to next phoneme's final value //tab45696 +let outBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0xA0, 0xA0]; -let outBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0xA0, 0xA0]; // Number of frames at beginning of a phoneme devoted to interpolating to phoneme's final value +// Number of frames at beginning of a phoneme devoted to interpolating to phoneme's final value // tab45776 +let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0xB0, 0xA0]; -let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0xB0, 0xA0]; // Consists of two bitfields: +// Consists of two bitfields: // Low 3 bits (masked by 7) select a 256-byte section in sampleTable, // as well as index into sampledConsonantValues0 for unvoiced. // High 5 bits (masked by 248 = 11111000), for unvoiced, @@ -1511,222 +1625,423 @@ let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, // 67: P' 27 00011011 // 70: T' 25 00011001 // tab45936 +let sampledConsonantFlags = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0xD3, 0xBB, 0x7C, 0x95, 0x01, 0x02, 0x03, 0x03, 0x00, 0x72, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; -let sampledConsonantFlags = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0xD3, 0xBB, 0x7C, 0x95, 0x01, 0x02, 0x03, 0x03, 0x00, 0x72, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; // - -let frequencyData = [//tab45056 |tab451356 |tab45216 +// +let frequencyData = [ +//tab45056 |tab451356 |tab45216 // freq1 | freq2 | freq3 -0x000000 | 0x000000 | 0x000000, // ' *' 00 -0x000013 | 0x004300 | 0x5B0000, // '.*' 01 -0x000013 | 0x004300 | 0x5B0000, // '?*' 02 -0x000013 | 0x004300 | 0x5B0000, // ',*' 03 -0x000013 | 0x004300 | 0x5B0000, // '-*' 04 -0x00000A | 0x005400 | 0x6E0000, // 'IY' 05 -0x00000E | 0x004900 | 0x5D0000, // 'IH' 06 -0x000013 | 0x004300 | 0x5B0000, // 'EH' 07 -0x000018 | 0x003F00 | 0x580000, // 'AE' 08 -0x00001B | 0x002800 | 0x590000, // 'AA' 09 -0x000017 | 0x002C00 | 0x570000, // 'AH' 10 -0x000015 | 0x001F00 | 0x580000, // 'AO' 11 -0x000010 | 0x002500 | 0x520000, // 'UH' 12 -0x000014 | 0x002D00 | 0x590000, // 'AX' 13 -0x00000E | 0x004900 | 0x5D0000, // 'IX' 14 -0x000012 | 0x003100 | 0x3E0000, // 'ER' 15 -0x00000E | 0x002400 | 0x520000, // 'UX' 16 -0x000012 | 0x001E00 | 0x580000, // 'OH' 17 -0x000012 | 0x003300 | 0x3E0000, // 'RX' 18 -0x000010 | 0x002500 | 0x6E0000, // 'LX' 19 -0x00000D | 0x001D00 | 0x500000, // 'WX' 20 -0x00000F | 0x004500 | 0x5D0000, // 'YX' 21 -0x00000B | 0x001800 | 0x5A0000, // 'WH' 22 -0x000012 | 0x003200 | 0x3C0000, // 'R*' 23 -0x00000E | 0x001E00 | 0x6E0000, // 'L*' 24 -0x00000B | 0x001800 | 0x5A0000, // 'W*' 25 -0x000009 | 0x005300 | 0x6E0000, // 'Y*' 26 -0x000006 | 0x002E00 | 0x510000, // 'M*' 27 -0x000006 | 0x003600 | 0x790000, // 'N*' 28 -0x000006 | 0x005600 | 0x650000, // 'NX' 29 -0x000006 | 0x003600 | 0x790000, // 'DX' 30 -0x000011 | 0x004300 | 0x5B0000, // 'Q*' 31 -0x000006 | 0x004900 | 0x630000, // 'S*' 32 -0x000006 | 0x004F00 | 0x6A0000, // 'SH' 33 -0x000006 | 0x001A00 | 0x510000, // 'F*' 34 -0x000006 | 0x004200 | 0x790000, // 'TH' 35 -0x00000E | 0x004900 | 0x5D0000, // '/H' 36 -0x000010 | 0x002500 | 0x520000, // '/X' 37 -0x000009 | 0x003300 | 0x5D0000, // 'Z*' 38 -0x00000A | 0x004200 | 0x670000, // 'ZH' 39 -0x000008 | 0x002800 | 0x4C0000, // 'V*' 40 -0x00000A | 0x002F00 | 0x5D0000, // 'DH' 41 -0x000006 | 0x004F00 | 0x650000, // 'CH' 42 -0x000006 | 0x004F00 | 0x650000, // '**' 43 -0x000006 | 0x004200 | 0x790000, // 'J*' 44 -0x000005 | 0x004F00 | 0x650000, // '**' 45 -0x000006 | 0x006E00 | 0x790000, // '**' 46 -0x000000 | 0x000000 | 0x000000, // '**' 47 -0x000013 | 0x004800 | 0x5A0000, // 'EY' 48 -0x00001B | 0x002700 | 0x580000, // 'AY' 49 -0x000015 | 0x001F00 | 0x580000, // 'OY' 50 -0x00001B | 0x002B00 | 0x580000, // 'AW' 51 -0x000012 | 0x001E00 | 0x580000, // 'OW' 52 -0x00000D | 0x002200 | 0x520000, // 'UW' 53 -0x000006 | 0x001A00 | 0x510000, // 'B*' 54 -0x000006 | 0x001A00 | 0x510000, // '**' 55 -0x000006 | 0x001A00 | 0x510000, // '**' 56 -0x000006 | 0x004200 | 0x790000, // 'D*' 57 -0x000006 | 0x004200 | 0x790000, // '**' 58 -0x000006 | 0x004200 | 0x790000, // '**' 59 -0x000006 | 0x006E00 | 0x700000, // 'G*' 60 -0x000006 | 0x006E00 | 0x6E0000, // '**' 61 -0x000006 | 0x006E00 | 0x6E0000, // '**' 62 -0x000006 | 0x005400 | 0x5E0000, // 'GX' 63 -0x000006 | 0x005400 | 0x5E0000, // '**' 64 -0x000006 | 0x005400 | 0x5E0000, // '**' 65 -0x000006 | 0x001A00 | 0x510000, // 'P*' 66 -0x000006 | 0x001A00 | 0x510000, // '**' 67 -0x000006 | 0x001A00 | 0x510000, // '**' 68 -0x000006 | 0x004200 | 0x790000, // 'T*' 69 -0x000006 | 0x004200 | 0x790000, // '**' 70 -0x000006 | 0x004200 | 0x790000, // '**' 71 -0x000006 | 0x006D00 | 0x650000, // 'K*' 72 -0x00000A | 0x005600 | 0x650000, // '**' 73 -0x00000A | 0x006D00 | 0x700000, // '**' 74 -0x000006 | 0x005400 | 0x5E0000, // 'KX' 75 -0x000006 | 0x005400 | 0x5E0000, // '**' 76 -0x000006 | 0x005400 | 0x5E0000, // '**' 77 -0x00002C | 0x007F00 | 0x080000, // 'UL' 78 +0x000000 | 0x000000 | 0x000000, +// ' *' 00 +0x000013 | 0x004300 | 0x5B0000, +// '.*' 01 +0x000013 | 0x004300 | 0x5B0000, +// '?*' 02 +0x000013 | 0x004300 | 0x5B0000, +// ',*' 03 +0x000013 | 0x004300 | 0x5B0000, +// '-*' 04 +0x00000A | 0x005400 | 0x6E0000, +// 'IY' 05 +0x00000E | 0x004900 | 0x5D0000, +// 'IH' 06 +0x000013 | 0x004300 | 0x5B0000, +// 'EH' 07 +0x000018 | 0x003F00 | 0x580000, +// 'AE' 08 +0x00001B | 0x002800 | 0x590000, +// 'AA' 09 +0x000017 | 0x002C00 | 0x570000, +// 'AH' 10 +0x000015 | 0x001F00 | 0x580000, +// 'AO' 11 +0x000010 | 0x002500 | 0x520000, +// 'UH' 12 +0x000014 | 0x002D00 | 0x590000, +// 'AX' 13 +0x00000E | 0x004900 | 0x5D0000, +// 'IX' 14 +0x000012 | 0x003100 | 0x3E0000, +// 'ER' 15 +0x00000E | 0x002400 | 0x520000, +// 'UX' 16 +0x000012 | 0x001E00 | 0x580000, +// 'OH' 17 +0x000012 | 0x003300 | 0x3E0000, +// 'RX' 18 +0x000010 | 0x002500 | 0x6E0000, +// 'LX' 19 +0x00000D | 0x001D00 | 0x500000, +// 'WX' 20 +0x00000F | 0x004500 | 0x5D0000, +// 'YX' 21 +0x00000B | 0x001800 | 0x5A0000, +// 'WH' 22 +0x000012 | 0x003200 | 0x3C0000, +// 'R*' 23 +0x00000E | 0x001E00 | 0x6E0000, +// 'L*' 24 +0x00000B | 0x001800 | 0x5A0000, +// 'W*' 25 +0x000009 | 0x005300 | 0x6E0000, +// 'Y*' 26 +0x000006 | 0x002E00 | 0x510000, +// 'M*' 27 +0x000006 | 0x003600 | 0x790000, +// 'N*' 28 +0x000006 | 0x005600 | 0x650000, +// 'NX' 29 +0x000006 | 0x003600 | 0x790000, +// 'DX' 30 +0x000011 | 0x004300 | 0x5B0000, +// 'Q*' 31 +0x000006 | 0x004900 | 0x630000, +// 'S*' 32 +0x000006 | 0x004F00 | 0x6A0000, +// 'SH' 33 +0x000006 | 0x001A00 | 0x510000, +// 'F*' 34 +0x000006 | 0x004200 | 0x790000, +// 'TH' 35 +0x00000E | 0x004900 | 0x5D0000, +// '/H' 36 +0x000010 | 0x002500 | 0x520000, +// '/X' 37 +0x000009 | 0x003300 | 0x5D0000, +// 'Z*' 38 +0x00000A | 0x004200 | 0x670000, +// 'ZH' 39 +0x000008 | 0x002800 | 0x4C0000, +// 'V*' 40 +0x00000A | 0x002F00 | 0x5D0000, +// 'DH' 41 +0x000006 | 0x004F00 | 0x650000, +// 'CH' 42 +0x000006 | 0x004F00 | 0x650000, +// '**' 43 +0x000006 | 0x004200 | 0x790000, +// 'J*' 44 +0x000005 | 0x004F00 | 0x650000, +// '**' 45 +0x000006 | 0x006E00 | 0x790000, +// '**' 46 +0x000000 | 0x000000 | 0x000000, +// '**' 47 +0x000013 | 0x004800 | 0x5A0000, +// 'EY' 48 +0x00001B | 0x002700 | 0x580000, +// 'AY' 49 +0x000015 | 0x001F00 | 0x580000, +// 'OY' 50 +0x00001B | 0x002B00 | 0x580000, +// 'AW' 51 +0x000012 | 0x001E00 | 0x580000, +// 'OW' 52 +0x00000D | 0x002200 | 0x520000, +// 'UW' 53 +0x000006 | 0x001A00 | 0x510000, +// 'B*' 54 +0x000006 | 0x001A00 | 0x510000, +// '**' 55 +0x000006 | 0x001A00 | 0x510000, +// '**' 56 +0x000006 | 0x004200 | 0x790000, +// 'D*' 57 +0x000006 | 0x004200 | 0x790000, +// '**' 58 +0x000006 | 0x004200 | 0x790000, +// '**' 59 +0x000006 | 0x006E00 | 0x700000, +// 'G*' 60 +0x000006 | 0x006E00 | 0x6E0000, +// '**' 61 +0x000006 | 0x006E00 | 0x6E0000, +// '**' 62 +0x000006 | 0x005400 | 0x5E0000, +// 'GX' 63 +0x000006 | 0x005400 | 0x5E0000, +// '**' 64 +0x000006 | 0x005400 | 0x5E0000, +// '**' 65 +0x000006 | 0x001A00 | 0x510000, +// 'P*' 66 +0x000006 | 0x001A00 | 0x510000, +// '**' 67 +0x000006 | 0x001A00 | 0x510000, +// '**' 68 +0x000006 | 0x004200 | 0x790000, +// 'T*' 69 +0x000006 | 0x004200 | 0x790000, +// '**' 70 +0x000006 | 0x004200 | 0x790000, +// '**' 71 +0x000006 | 0x006D00 | 0x650000, +// 'K*' 72 +0x00000A | 0x005600 | 0x650000, +// '**' 73 +0x00000A | 0x006D00 | 0x700000, +// '**' 74 +0x000006 | 0x005400 | 0x5E0000, +// 'KX' 75 +0x000006 | 0x005400 | 0x5E0000, +// '**' 76 +0x000006 | 0x005400 | 0x5E0000, +// '**' 77 +0x00002C | 0x007F00 | 0x080000, +// 'UL' 78 0x000013 | 0x007F00 | 0x010000 // 'UM' 79 ]; + /** * * ampl1data[X] = ampldata[X] & 0xFF; // F1 amplitude * ampl2data[X] = (ampldata[X] >> 8) & 0xFF; // F2 amplitude * ampl3data[X] = (ampldata[X] >> 16) & 0xFF; // F3 amplitude */ - -let ampldata = [// ampl1 | ampl2 | ampl3 -0x000000 | 0x000000 | 0x000000, // ' *' 00 -0x000000 | 0x000000 | 0x000000, // '.*' 01 -0x000000 | 0x000000 | 0x000000, // '?*' 02 -0x000000 | 0x000000 | 0x000000, // ',*' 03 -0x000000 | 0x000000 | 0x000000, // '-*' 04 -0x00000D | 0x000A00 | 0x080000, // 'IY' 05 -0x00000D | 0x000B00 | 0x070000, // 'IH' 06 -0x00000E | 0x000D00 | 0x080000, // 'EH' 07 -0x00000F | 0x000E00 | 0x080000, // 'AE' 08 -0x00000F | 0x000D00 | 0x010000, // 'AA' 09 -0x00000F | 0x000C00 | 0x010000, // 'AH' 10 -0x00000F | 0x000C00 | 0x000000, // 'AO' 11 -0x00000F | 0x000B00 | 0x010000, // 'UH' 12 -0x00000C | 0x000900 | 0x000000, // 'AX' 13 -0x00000D | 0x000B00 | 0x070000, // 'IX' 14 -0x00000C | 0x000B00 | 0x050000, // 'ER' 15 -0x00000F | 0x000C00 | 0x010000, // 'UX' 16 -0x00000F | 0x000C00 | 0x000000, // 'OH' 17 -0x00000D | 0x000C00 | 0x060000, // 'RX' 18 -0x00000D | 0x000800 | 0x010000, // 'LX' 19 -0x00000D | 0x000800 | 0x000000, // 'WX' 20 -0x00000E | 0x000C00 | 0x070000, // 'YX' 21 -0x00000D | 0x000800 | 0x000000, // 'WH' 22 -0x00000C | 0x000A00 | 0x050000, // 'R*' 23 -0x00000D | 0x000800 | 0x010000, // 'L*' 24 -0x00000D | 0x000800 | 0x000000, // 'W*' 25 -0x00000D | 0x000A00 | 0x080000, // 'Y*' 26 -0x00000C | 0x000300 | 0x000000, // 'M*' 27 -0x000009 | 0x000900 | 0x000000, // 'N*' 28 -0x000009 | 0x000600 | 0x030000, // 'NX' 29 -0x000000 | 0x000000 | 0x000000, // 'DX' 30 -0x000000 | 0x000000 | 0x000000, // 'Q*' 31 -0x000000 | 0x000000 | 0x000000, // 'S*' 32 -0x000000 | 0x000000 | 0x000000, // 'SH' 33 -0x000000 | 0x000000 | 0x000000, // 'F*' 34 -0x000000 | 0x000000 | 0x000000, // 'TH' 35 -0x000000 | 0x000000 | 0x000000, // '/H' 36 -0x000000 | 0x000000 | 0x000000, // '/X' 37 -0x00000B | 0x000300 | 0x000000, // 'Z*' 38 -0x00000B | 0x000500 | 0x010000, // 'ZH' 39 -0x00000B | 0x000300 | 0x000000, // 'V*' 40 -0x00000B | 0x000400 | 0x000000, // 'DH' 41 -0x000000 | 0x000000 | 0x000000, // 'CH' 42 -0x000000 | 0x000000 | 0x000000, // '**' 43 -0x000001 | 0x000000 | 0x000000, // 'J*' 44 -0x00000B | 0x000500 | 0x010000, // '**' 45 -0x000000 | 0x000A00 | 0x0E0000, // '**' 46 -0x000002 | 0x000200 | 0x010000, // '**' 47 -0x00000E | 0x000E00 | 0x090000, // 'EY' 48 -0x00000F | 0x000D00 | 0x010000, // 'AY' 49 -0x00000F | 0x000C00 | 0x000000, // 'OY' 50 -0x00000F | 0x000D00 | 0x010000, // 'AW' 51 -0x00000F | 0x000C00 | 0x000000, // 'OW' 52 -0x00000D | 0x000800 | 0x000000, // 'UW' 53 -0x000002 | 0x000000 | 0x000000, // 'B*' 54 -0x000004 | 0x000100 | 0x000000, // '**' 55 -0x000000 | 0x000000 | 0x000000, // '**' 56 -0x000002 | 0x000000 | 0x000000, // 'D*' 57 -0x000004 | 0x000100 | 0x000000, // '**' 58 -0x000000 | 0x000000 | 0x000000, // '**' 59 -0x000001 | 0x000000 | 0x000000, // 'G*' 60 -0x000004 | 0x000100 | 0x000000, // '**' 61 -0x000000 | 0x000000 | 0x000000, // '**' 62 -0x000001 | 0x000000 | 0x000000, // 'GX' 63 -0x000004 | 0x000100 | 0x000000, // '**' 64 -0x000000 | 0x000000 | 0x000000, // '**' 65 -0x000000 | 0x000000 | 0x000000, // 'P*' 66 -0x000000 | 0x000000 | 0x000000, // '**' 67 -0x000000 | 0x000000 | 0x000000, // '**' 68 -0x000000 | 0x000000 | 0x000000, // 'T*' 69 -0x000000 | 0x000000 | 0x000000, // '**' 70 -0x000000 | 0x000000 | 0x000000, // '**' 71 -0x000000 | 0x000000 | 0x000000, // 'K*' 72 -0x00000C | 0x000A00 | 0x070000, // '**' 73 -0x000000 | 0x000000 | 0x000000, // '**' 74 -0x000000 | 0x000000 | 0x000000, // 'KX' 75 -0x000000 | 0x000A00 | 0x050000, // '**' 76 -0x000000 | 0x000000 | 0x000000, // '**' 77 -0x00000F | 0x000000 | 0x130000, // 'UL' 78 +let ampldata = [ +// ampl1 | ampl2 | ampl3 +0x000000 | 0x000000 | 0x000000, +// ' *' 00 +0x000000 | 0x000000 | 0x000000, +// '.*' 01 +0x000000 | 0x000000 | 0x000000, +// '?*' 02 +0x000000 | 0x000000 | 0x000000, +// ',*' 03 +0x000000 | 0x000000 | 0x000000, +// '-*' 04 +0x00000D | 0x000A00 | 0x080000, +// 'IY' 05 +0x00000D | 0x000B00 | 0x070000, +// 'IH' 06 +0x00000E | 0x000D00 | 0x080000, +// 'EH' 07 +0x00000F | 0x000E00 | 0x080000, +// 'AE' 08 +0x00000F | 0x000D00 | 0x010000, +// 'AA' 09 +0x00000F | 0x000C00 | 0x010000, +// 'AH' 10 +0x00000F | 0x000C00 | 0x000000, +// 'AO' 11 +0x00000F | 0x000B00 | 0x010000, +// 'UH' 12 +0x00000C | 0x000900 | 0x000000, +// 'AX' 13 +0x00000D | 0x000B00 | 0x070000, +// 'IX' 14 +0x00000C | 0x000B00 | 0x050000, +// 'ER' 15 +0x00000F | 0x000C00 | 0x010000, +// 'UX' 16 +0x00000F | 0x000C00 | 0x000000, +// 'OH' 17 +0x00000D | 0x000C00 | 0x060000, +// 'RX' 18 +0x00000D | 0x000800 | 0x010000, +// 'LX' 19 +0x00000D | 0x000800 | 0x000000, +// 'WX' 20 +0x00000E | 0x000C00 | 0x070000, +// 'YX' 21 +0x00000D | 0x000800 | 0x000000, +// 'WH' 22 +0x00000C | 0x000A00 | 0x050000, +// 'R*' 23 +0x00000D | 0x000800 | 0x010000, +// 'L*' 24 +0x00000D | 0x000800 | 0x000000, +// 'W*' 25 +0x00000D | 0x000A00 | 0x080000, +// 'Y*' 26 +0x00000C | 0x000300 | 0x000000, +// 'M*' 27 +0x000009 | 0x000900 | 0x000000, +// 'N*' 28 +0x000009 | 0x000600 | 0x030000, +// 'NX' 29 +0x000000 | 0x000000 | 0x000000, +// 'DX' 30 +0x000000 | 0x000000 | 0x000000, +// 'Q*' 31 +0x000000 | 0x000000 | 0x000000, +// 'S*' 32 +0x000000 | 0x000000 | 0x000000, +// 'SH' 33 +0x000000 | 0x000000 | 0x000000, +// 'F*' 34 +0x000000 | 0x000000 | 0x000000, +// 'TH' 35 +0x000000 | 0x000000 | 0x000000, +// '/H' 36 +0x000000 | 0x000000 | 0x000000, +// '/X' 37 +0x00000B | 0x000300 | 0x000000, +// 'Z*' 38 +0x00000B | 0x000500 | 0x010000, +// 'ZH' 39 +0x00000B | 0x000300 | 0x000000, +// 'V*' 40 +0x00000B | 0x000400 | 0x000000, +// 'DH' 41 +0x000000 | 0x000000 | 0x000000, +// 'CH' 42 +0x000000 | 0x000000 | 0x000000, +// '**' 43 +0x000001 | 0x000000 | 0x000000, +// 'J*' 44 +0x00000B | 0x000500 | 0x010000, +// '**' 45 +0x000000 | 0x000A00 | 0x0E0000, +// '**' 46 +0x000002 | 0x000200 | 0x010000, +// '**' 47 +0x00000E | 0x000E00 | 0x090000, +// 'EY' 48 +0x00000F | 0x000D00 | 0x010000, +// 'AY' 49 +0x00000F | 0x000C00 | 0x000000, +// 'OY' 50 +0x00000F | 0x000D00 | 0x010000, +// 'AW' 51 +0x00000F | 0x000C00 | 0x000000, +// 'OW' 52 +0x00000D | 0x000800 | 0x000000, +// 'UW' 53 +0x000002 | 0x000000 | 0x000000, +// 'B*' 54 +0x000004 | 0x000100 | 0x000000, +// '**' 55 +0x000000 | 0x000000 | 0x000000, +// '**' 56 +0x000002 | 0x000000 | 0x000000, +// 'D*' 57 +0x000004 | 0x000100 | 0x000000, +// '**' 58 +0x000000 | 0x000000 | 0x000000, +// '**' 59 +0x000001 | 0x000000 | 0x000000, +// 'G*' 60 +0x000004 | 0x000100 | 0x000000, +// '**' 61 +0x000000 | 0x000000 | 0x000000, +// '**' 62 +0x000001 | 0x000000 | 0x000000, +// 'GX' 63 +0x000004 | 0x000100 | 0x000000, +// '**' 64 +0x000000 | 0x000000 | 0x000000, +// '**' 65 +0x000000 | 0x000000 | 0x000000, +// 'P*' 66 +0x000000 | 0x000000 | 0x000000, +// '**' 67 +0x000000 | 0x000000 | 0x000000, +// '**' 68 +0x000000 | 0x000000 | 0x000000, +// 'T*' 69 +0x000000 | 0x000000 | 0x000000, +// '**' 70 +0x000000 | 0x000000 | 0x000000, +// '**' 71 +0x000000 | 0x000000 | 0x000000, +// 'K*' 72 +0x00000C | 0x000A00 | 0x070000, +// '**' 73 +0x000000 | 0x000000 | 0x000000, +// '**' 74 +0x000000 | 0x000000 | 0x000000, +// 'KX' 75 +0x000000 | 0x000A00 | 0x050000, +// '**' 76 +0x000000 | 0x000000 | 0x000000, +// '**' 77 +0x00000F | 0x000000 | 0x130000, +// 'UL' 78 0x00000F | 0x000000 | 0x100000 // 'UM' 79 -]; // Sampled data for consonants, consisting of five 256-byte sections - -let sampleTable = [//00 T', S, Z (coronal) -0x38, 0x84, 0x6B, 0x19, 0xC6, 0x63, 0x18, 0x86, 0x73, 0x98, 0xC6, 0xB1, 0x1C, 0xCA, 0x31, 0x8C, 0xC7, 0x31, 0x88, 0xC2, 0x30, 0x98, 0x46, 0x31, 0x18, 0xC6, 0x35, 0x0C, 0xCA, 0x31, 0x0C, 0xC6, //20 -0x21, 0x10, 0x24, 0x69, 0x12, 0xC2, 0x31, 0x14, 0xC4, 0x71, 0x08, 0x4A, 0x22, 0x49, 0xAB, 0x6A, 0xA8, 0xAC, 0x49, 0x51, 0x32, 0xD5, 0x52, 0x88, 0x93, 0x6C, 0x94, 0x22, 0x15, 0x54, 0xD2, 0x25, //40 -0x96, 0xD4, 0x50, 0xA5, 0x46, 0x21, 0x08, 0x85, 0x6B, 0x18, 0xC4, 0x63, 0x10, 0xCE, 0x6B, 0x18, 0x8C, 0x71, 0x19, 0x8C, 0x63, 0x35, 0x0C, 0xC6, 0x33, 0x99, 0xCC, 0x6C, 0xB5, 0x4E, 0xA2, 0x99, //60 -0x46, 0x21, 0x28, 0x82, 0x95, 0x2E, 0xE3, 0x30, 0x9C, 0xC5, 0x30, 0x9C, 0xA2, 0xB1, 0x9C, 0x67, 0x31, 0x88, 0x66, 0x59, 0x2C, 0x53, 0x18, 0x84, 0x67, 0x50, 0xCA, 0xE3, 0x0A, 0xAC, 0xAB, 0x30, //80 -0xAC, 0x62, 0x30, 0x8C, 0x63, 0x10, 0x94, 0x62, 0xB1, 0x8C, 0x82, 0x28, 0x96, 0x33, 0x98, 0xD6, 0xB5, 0x4C, 0x62, 0x29, 0xA5, 0x4A, 0xB5, 0x9C, 0xC6, 0x31, 0x14, 0xD6, 0x38, 0x9C, 0x4B, 0xB4, //A0 -0x86, 0x65, 0x18, 0xAE, 0x67, 0x1C, 0xA6, 0x63, 0x19, 0x96, 0x23, 0x19, 0x84, 0x13, 0x08, 0xA6, 0x52, 0xAC, 0xCA, 0x22, 0x89, 0x6E, 0xAB, 0x19, 0x8C, 0x62, 0x34, 0xC4, 0x62, 0x19, 0x86, 0x63, //C0 -0x18, 0xC4, 0x23, 0x58, 0xD6, 0xA3, 0x50, 0x42, 0x54, 0x4A, 0xAD, 0x4A, 0x25, 0x11, 0x6B, 0x64, 0x89, 0x4A, 0x63, 0x39, 0x8A, 0x23, 0x31, 0x2A, 0xEA, 0xA2, 0xA9, 0x44, 0xC5, 0x12, 0xCD, 0x42, //E0 -0x34, 0x8C, 0x62, 0x18, 0x8C, 0x63, 0x11, 0x48, 0x66, 0x31, 0x9D, 0x44, 0x33, 0x1D, 0x46, 0x31, 0x9C, 0xC6, 0xB1, 0x0C, 0xCD, 0x32, 0x88, 0xC4, 0x73, 0x18, 0x86, 0x73, 0x08, 0xD6, 0x63, 0x58, //100 CH', J', SH, ZH (palato-alveolar) -0x07, 0x81, 0xE0, 0xF0, 0x3C, 0x07, 0x87, 0x90, 0x3C, 0x7C, 0x0F, 0xC7, 0xC0, 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x80, 0x80, 0x00, 0x1C, 0x78, 0x70, 0xF1, 0xC7, 0x1F, 0xC0, 0x0C, 0xFE, 0x1C, 0x1F, //120 -0x1F, 0x0E, 0x0A, 0x7A, 0xC0, 0x71, 0xF2, 0x83, 0x8F, 0x03, 0x0F, 0x0F, 0x0C, 0x00, 0x79, 0xF8, 0x61, 0xE0, 0x43, 0x0F, 0x83, 0xE7, 0x18, 0xF9, 0xC1, 0x13, 0xDA, 0xE9, 0x63, 0x8F, 0x0F, 0x83, //140 -0x83, 0x87, 0xC3, 0x1F, 0x3C, 0x70, 0xF0, 0xE1, 0xE1, 0xE3, 0x87, 0xB8, 0x71, 0x0E, 0x20, 0xE3, 0x8D, 0x48, 0x78, 0x1C, 0x93, 0x87, 0x30, 0xE1, 0xC1, 0xC1, 0xE4, 0x78, 0x21, 0x83, 0x83, 0xC3, //160 -0x87, 0x06, 0x39, 0xE5, 0xC3, 0x87, 0x07, 0x0E, 0x1C, 0x1C, 0x70, 0xF4, 0x71, 0x9C, 0x60, 0x36, 0x32, 0xC3, 0x1E, 0x3C, 0xF3, 0x8F, 0x0E, 0x3C, 0x70, 0xE3, 0xC7, 0x8F, 0x0F, 0x0F, 0x0E, 0x3C, //180 -0x78, 0xF0, 0xE3, 0x87, 0x06, 0xF0, 0xE3, 0x07, 0xC1, 0x99, 0x87, 0x0F, 0x18, 0x78, 0x70, 0x70, 0xFC, 0xF3, 0x10, 0xB1, 0x8C, 0x8C, 0x31, 0x7C, 0x70, 0xE1, 0x86, 0x3C, 0x64, 0x6C, 0xB0, 0xE1, //1A0 -0xE3, 0x0F, 0x23, 0x8F, 0x0F, 0x1E, 0x3E, 0x38, 0x3C, 0x38, 0x7B, 0x8F, 0x07, 0x0E, 0x3C, 0xF4, 0x17, 0x1E, 0x3C, 0x78, 0xF2, 0x9E, 0x72, 0x49, 0xE3, 0x25, 0x36, 0x38, 0x58, 0x39, 0xE2, 0xDE, //1C0 -0x3C, 0x78, 0x78, 0xE1, 0xC7, 0x61, 0xE1, 0xE1, 0xB0, 0xF0, 0xF0, 0xC3, 0xC7, 0x0E, 0x38, 0xC0, 0xF0, 0xCE, 0x73, 0x73, 0x18, 0x34, 0xB0, 0xE1, 0xC7, 0x8E, 0x1C, 0x3C, 0xF8, 0x38, 0xF0, 0xE1, //1E0 -0xC1, 0x8B, 0x86, 0x8F, 0x1C, 0x78, 0x70, 0xF0, 0x78, 0xAC, 0xB1, 0x8F, 0x39, 0x31, 0xDB, 0x38, 0x61, 0xC3, 0x0E, 0x0E, 0x38, 0x78, 0x73, 0x17, 0x1E, 0x39, 0x1E, 0x38, 0x64, 0xE1, 0xF1, 0xC1, //200 P', F, V, TH, DH ([labio]dental) -0x4E, 0x0F, 0x40, 0xA2, 0x02, 0xC5, 0x8F, 0x81, 0xA1, 0xFC, 0x12, 0x08, 0x64, 0xE0, 0x3C, 0x22, 0xE0, 0x45, 0x07, 0x8E, 0x0C, 0x32, 0x90, 0xF0, 0x1F, 0x20, 0x49, 0xE0, 0xF8, 0x0C, 0x60, 0xF0, //220 -0x17, 0x1A, 0x41, 0xAA, 0xA4, 0xD0, 0x8D, 0x12, 0x82, 0x1E, 0x1E, 0x03, 0xF8, 0x3E, 0x03, 0x0C, 0x73, 0x80, 0x70, 0x44, 0x26, 0x03, 0x24, 0xE1, 0x3E, 0x04, 0x4E, 0x04, 0x1C, 0xC1, 0x09, 0xCC, //240 -0x9E, 0x90, 0x21, 0x07, 0x90, 0x43, 0x64, 0xC0, 0x0F, 0xC6, 0x90, 0x9C, 0xC1, 0x5B, 0x03, 0xE2, 0x1D, 0x81, 0xE0, 0x5E, 0x1D, 0x03, 0x84, 0xB8, 0x2C, 0x0F, 0x80, 0xB1, 0x83, 0xE0, 0x30, 0x41, //260 -0x1E, 0x43, 0x89, 0x83, 0x50, 0xFC, 0x24, 0x2E, 0x13, 0x83, 0xF1, 0x7C, 0x4C, 0x2C, 0xC9, 0x0D, 0x83, 0xB0, 0xB5, 0x82, 0xE4, 0xE8, 0x06, 0x9C, 0x07, 0xA0, 0x99, 0x1D, 0x07, 0x3E, 0x82, 0x8F, //280 -0x70, 0x30, 0x74, 0x40, 0xCA, 0x10, 0xE4, 0xE8, 0x0F, 0x92, 0x14, 0x3F, 0x06, 0xF8, 0x84, 0x88, 0x43, 0x81, 0x0A, 0x34, 0x39, 0x41, 0xC6, 0xE3, 0x1C, 0x47, 0x03, 0xB0, 0xB8, 0x13, 0x0A, 0xC2, //2A0 -0x64, 0xF8, 0x18, 0xF9, 0x60, 0xB3, 0xC0, 0x65, 0x20, 0x60, 0xA6, 0x8C, 0xC3, 0x81, 0x20, 0x30, 0x26, 0x1E, 0x1C, 0x38, 0xD3, 0x01, 0xB0, 0x26, 0x40, 0xF4, 0x0B, 0xC3, 0x42, 0x1F, 0x85, 0x32, //2C0 -0x26, 0x60, 0x40, 0xC9, 0xCB, 0x01, 0xEC, 0x11, 0x28, 0x40, 0xFA, 0x04, 0x34, 0xE0, 0x70, 0x4C, 0x8C, 0x1D, 0x07, 0x69, 0x03, 0x16, 0xC8, 0x04, 0x23, 0xE8, 0xC6, 0x9A, 0x0B, 0x1A, 0x03, 0xE0, //2E0 -0x76, 0x06, 0x05, 0xCF, 0x1E, 0xBC, 0x58, 0x31, 0x71, 0x66, 0x00, 0xF8, 0x3F, 0x04, 0xFC, 0x0C, 0x74, 0x27, 0x8A, 0x80, 0x71, 0xC2, 0x3A, 0x26, 0x06, 0xC0, 0x1F, 0x05, 0x0F, 0x98, 0x40, 0xAE, //300 /H (palatal) -0x01, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x0E, 0xFE, 0x00, 0x03, 0xDF, 0x80, 0x03, 0xEF, 0x80, 0x1B, 0xF1, 0xC2, 0x00, 0xE7, 0xE0, 0x18, 0xFC, 0xE0, 0x21, 0xFC, 0x80, 0x3C, 0xFC, 0x40, 0x0E, 0x7E, //320 -0x00, 0x3F, 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x3E, 0xF0, 0x07, 0xFC, 0x00, 0x7E, 0x10, 0x3F, 0xFF, 0x00, 0x3F, 0x38, 0x0E, 0x7C, 0x01, 0x87, 0x0C, 0xFC, 0xC7, 0x00, 0x3E, 0x04, //340 -0x0F, 0x3E, 0x1F, 0x0F, 0x0F, 0x1F, 0x0F, 0x02, 0x83, 0x87, 0xCF, 0x03, 0x87, 0x0F, 0x3F, 0xC0, 0x07, 0x9E, 0x60, 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x77, 0xE1, 0xC0, 0xFE, 0xE0, 0xC3, //360 -0xE0, 0x01, 0xDF, 0xF8, 0x03, 0x07, 0x00, 0x7E, 0x70, 0x00, 0x7C, 0x38, 0x18, 0xFE, 0x0C, 0x1E, 0x78, 0x1C, 0x7C, 0x3E, 0x0E, 0x1F, 0x1E, 0x1E, 0x3E, 0x00, 0x7F, 0x83, 0x07, 0xDB, 0x87, 0x83, //380 -0x07, 0xC7, 0x07, 0x10, 0x71, 0xFF, 0x00, 0x3F, 0xE2, 0x01, 0xE0, 0xC1, 0xC3, 0xE1, 0x00, 0x7F, 0xC0, 0x05, 0xF0, 0x20, 0xF8, 0xF0, 0x70, 0xFE, 0x78, 0x79, 0xF8, 0x02, 0x3F, 0x0C, 0x8F, 0x03, //3a0 -0x0F, 0x9F, 0xE0, 0xC1, 0xC7, 0x87, 0x03, 0xC3, 0xC3, 0xB0, 0xE1, 0xE1, 0xC1, 0xE3, 0xE0, 0x71, 0xF0, 0x00, 0xFC, 0x70, 0x7C, 0x0C, 0x3E, 0x38, 0x0E, 0x1C, 0x70, 0xC3, 0xC7, 0x03, 0x81, 0xC1, //3c0 -0xC7, 0xE7, 0x00, 0x0F, 0xC7, 0x87, 0x19, 0x09, 0xEF, 0xC4, 0x33, 0xE0, 0xC1, 0xFC, 0xF8, 0x70, 0xF0, 0x78, 0xF8, 0xF0, 0x61, 0xC7, 0x00, 0x1F, 0xF8, 0x01, 0x7C, 0xF8, 0xF0, 0x78, 0x70, 0x3C, //3e0 -0x7C, 0xCE, 0x0E, 0x21, 0x83, 0xCF, 0x08, 0x07, 0x8F, 0x08, 0xC1, 0x87, 0x8F, 0x80, 0xC7, 0xE3, 0x00, 0x07, 0xF8, 0xE0, 0xEF, 0x00, 0x39, 0xF7, 0x80, 0x0E, 0xF8, 0xE1, 0xE3, 0xF8, 0x21, 0x9F, //400 /X (glottal) -0xC0, 0xFF, 0x03, 0xF8, 0x07, 0xC0, 0x1F, 0xF8, 0xC4, 0x04, 0xFC, 0xC4, 0xC1, 0xBC, 0x87, 0xF0, 0x0F, 0xC0, 0x7F, 0x05, 0xE0, 0x25, 0xEC, 0xC0, 0x3E, 0x84, 0x47, 0xF0, 0x8E, 0x03, 0xF8, 0x03, //420 -0xFB, 0xC0, 0x19, 0xF8, 0x07, 0x9C, 0x0C, 0x17, 0xF8, 0x07, 0xE0, 0x1F, 0xA1, 0xFC, 0x0F, 0xFC, 0x01, 0xF0, 0x3F, 0x00, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0xFD, 0x00, 0xFF, 0x88, 0x0D, 0xF9, 0x01, //440 -0xFF, 0x00, 0x70, 0x07, 0xC0, 0x3E, 0x42, 0xF3, 0x0D, 0xC4, 0x7F, 0x80, 0xFC, 0x07, 0xF0, 0x5E, 0xC0, 0x3F, 0x00, 0x78, 0x3F, 0x81, 0xFF, 0x01, 0xF8, 0x01, 0xC3, 0xE8, 0x0C, 0xE4, 0x64, 0x8F, //460 -0xE4, 0x0F, 0xF0, 0x07, 0xF0, 0xC2, 0x1F, 0x00, 0x7F, 0xC0, 0x6F, 0x80, 0x7E, 0x03, 0xF8, 0x07, 0xF0, 0x3F, 0xC0, 0x78, 0x0F, 0x82, 0x07, 0xFE, 0x22, 0x77, 0x70, 0x02, 0x76, 0x03, 0xFE, 0x00, //480 -0xFE, 0x67, 0x00, 0x7C, 0xC7, 0xF1, 0x8E, 0xC6, 0x3B, 0xE0, 0x3F, 0x84, 0xF3, 0x19, 0xD8, 0x03, 0x99, 0xFC, 0x09, 0xB8, 0x0F, 0xF8, 0x00, 0x9D, 0x24, 0x61, 0xF9, 0x0D, 0x00, 0xFD, 0x03, 0xF0, //4a0 -0x1F, 0x90, 0x3F, 0x01, 0xF8, 0x1F, 0xD0, 0x0F, 0xF8, 0x37, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFA, 0x03, 0xF0, 0x0F, 0x80, 0xFF, 0x01, //4c0 -0xB8, 0x07, 0xF0, 0x01, 0xFC, 0x01, 0xBC, 0x80, 0x13, 0x1E, 0x00, 0x7F, 0xE1, 0x40, 0x7F, 0xA0, 0x7F, 0xB0, 0x00, 0x3F, 0xC0, 0x1F, 0xC0, 0x38, 0x0F, 0xF0, 0x1F, 0x80, 0xFF, 0x01, 0xFC, 0x03, //4e0 +]; + +// Sampled data for consonants, consisting of five 256-byte sections +let sampleTable = [ +//00 T', S, Z (coronal) +0x38, 0x84, 0x6B, 0x19, 0xC6, 0x63, 0x18, 0x86, 0x73, 0x98, 0xC6, 0xB1, 0x1C, 0xCA, 0x31, 0x8C, 0xC7, 0x31, 0x88, 0xC2, 0x30, 0x98, 0x46, 0x31, 0x18, 0xC6, 0x35, 0x0C, 0xCA, 0x31, 0x0C, 0xC6, +//20 +0x21, 0x10, 0x24, 0x69, 0x12, 0xC2, 0x31, 0x14, 0xC4, 0x71, 0x08, 0x4A, 0x22, 0x49, 0xAB, 0x6A, 0xA8, 0xAC, 0x49, 0x51, 0x32, 0xD5, 0x52, 0x88, 0x93, 0x6C, 0x94, 0x22, 0x15, 0x54, 0xD2, 0x25, +//40 +0x96, 0xD4, 0x50, 0xA5, 0x46, 0x21, 0x08, 0x85, 0x6B, 0x18, 0xC4, 0x63, 0x10, 0xCE, 0x6B, 0x18, 0x8C, 0x71, 0x19, 0x8C, 0x63, 0x35, 0x0C, 0xC6, 0x33, 0x99, 0xCC, 0x6C, 0xB5, 0x4E, 0xA2, 0x99, +//60 +0x46, 0x21, 0x28, 0x82, 0x95, 0x2E, 0xE3, 0x30, 0x9C, 0xC5, 0x30, 0x9C, 0xA2, 0xB1, 0x9C, 0x67, 0x31, 0x88, 0x66, 0x59, 0x2C, 0x53, 0x18, 0x84, 0x67, 0x50, 0xCA, 0xE3, 0x0A, 0xAC, 0xAB, 0x30, +//80 +0xAC, 0x62, 0x30, 0x8C, 0x63, 0x10, 0x94, 0x62, 0xB1, 0x8C, 0x82, 0x28, 0x96, 0x33, 0x98, 0xD6, 0xB5, 0x4C, 0x62, 0x29, 0xA5, 0x4A, 0xB5, 0x9C, 0xC6, 0x31, 0x14, 0xD6, 0x38, 0x9C, 0x4B, 0xB4, +//A0 +0x86, 0x65, 0x18, 0xAE, 0x67, 0x1C, 0xA6, 0x63, 0x19, 0x96, 0x23, 0x19, 0x84, 0x13, 0x08, 0xA6, 0x52, 0xAC, 0xCA, 0x22, 0x89, 0x6E, 0xAB, 0x19, 0x8C, 0x62, 0x34, 0xC4, 0x62, 0x19, 0x86, 0x63, +//C0 +0x18, 0xC4, 0x23, 0x58, 0xD6, 0xA3, 0x50, 0x42, 0x54, 0x4A, 0xAD, 0x4A, 0x25, 0x11, 0x6B, 0x64, 0x89, 0x4A, 0x63, 0x39, 0x8A, 0x23, 0x31, 0x2A, 0xEA, 0xA2, 0xA9, 0x44, 0xC5, 0x12, 0xCD, 0x42, +//E0 +0x34, 0x8C, 0x62, 0x18, 0x8C, 0x63, 0x11, 0x48, 0x66, 0x31, 0x9D, 0x44, 0x33, 0x1D, 0x46, 0x31, 0x9C, 0xC6, 0xB1, 0x0C, 0xCD, 0x32, 0x88, 0xC4, 0x73, 0x18, 0x86, 0x73, 0x08, 0xD6, 0x63, 0x58, +//100 CH', J', SH, ZH (palato-alveolar) +0x07, 0x81, 0xE0, 0xF0, 0x3C, 0x07, 0x87, 0x90, 0x3C, 0x7C, 0x0F, 0xC7, 0xC0, 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x80, 0x80, 0x00, 0x1C, 0x78, 0x70, 0xF1, 0xC7, 0x1F, 0xC0, 0x0C, 0xFE, 0x1C, 0x1F, +//120 +0x1F, 0x0E, 0x0A, 0x7A, 0xC0, 0x71, 0xF2, 0x83, 0x8F, 0x03, 0x0F, 0x0F, 0x0C, 0x00, 0x79, 0xF8, 0x61, 0xE0, 0x43, 0x0F, 0x83, 0xE7, 0x18, 0xF9, 0xC1, 0x13, 0xDA, 0xE9, 0x63, 0x8F, 0x0F, 0x83, +//140 +0x83, 0x87, 0xC3, 0x1F, 0x3C, 0x70, 0xF0, 0xE1, 0xE1, 0xE3, 0x87, 0xB8, 0x71, 0x0E, 0x20, 0xE3, 0x8D, 0x48, 0x78, 0x1C, 0x93, 0x87, 0x30, 0xE1, 0xC1, 0xC1, 0xE4, 0x78, 0x21, 0x83, 0x83, 0xC3, +//160 +0x87, 0x06, 0x39, 0xE5, 0xC3, 0x87, 0x07, 0x0E, 0x1C, 0x1C, 0x70, 0xF4, 0x71, 0x9C, 0x60, 0x36, 0x32, 0xC3, 0x1E, 0x3C, 0xF3, 0x8F, 0x0E, 0x3C, 0x70, 0xE3, 0xC7, 0x8F, 0x0F, 0x0F, 0x0E, 0x3C, +//180 +0x78, 0xF0, 0xE3, 0x87, 0x06, 0xF0, 0xE3, 0x07, 0xC1, 0x99, 0x87, 0x0F, 0x18, 0x78, 0x70, 0x70, 0xFC, 0xF3, 0x10, 0xB1, 0x8C, 0x8C, 0x31, 0x7C, 0x70, 0xE1, 0x86, 0x3C, 0x64, 0x6C, 0xB0, 0xE1, +//1A0 +0xE3, 0x0F, 0x23, 0x8F, 0x0F, 0x1E, 0x3E, 0x38, 0x3C, 0x38, 0x7B, 0x8F, 0x07, 0x0E, 0x3C, 0xF4, 0x17, 0x1E, 0x3C, 0x78, 0xF2, 0x9E, 0x72, 0x49, 0xE3, 0x25, 0x36, 0x38, 0x58, 0x39, 0xE2, 0xDE, +//1C0 +0x3C, 0x78, 0x78, 0xE1, 0xC7, 0x61, 0xE1, 0xE1, 0xB0, 0xF0, 0xF0, 0xC3, 0xC7, 0x0E, 0x38, 0xC0, 0xF0, 0xCE, 0x73, 0x73, 0x18, 0x34, 0xB0, 0xE1, 0xC7, 0x8E, 0x1C, 0x3C, 0xF8, 0x38, 0xF0, 0xE1, +//1E0 +0xC1, 0x8B, 0x86, 0x8F, 0x1C, 0x78, 0x70, 0xF0, 0x78, 0xAC, 0xB1, 0x8F, 0x39, 0x31, 0xDB, 0x38, 0x61, 0xC3, 0x0E, 0x0E, 0x38, 0x78, 0x73, 0x17, 0x1E, 0x39, 0x1E, 0x38, 0x64, 0xE1, 0xF1, 0xC1, +//200 P', F, V, TH, DH ([labio]dental) +0x4E, 0x0F, 0x40, 0xA2, 0x02, 0xC5, 0x8F, 0x81, 0xA1, 0xFC, 0x12, 0x08, 0x64, 0xE0, 0x3C, 0x22, 0xE0, 0x45, 0x07, 0x8E, 0x0C, 0x32, 0x90, 0xF0, 0x1F, 0x20, 0x49, 0xE0, 0xF8, 0x0C, 0x60, 0xF0, +//220 +0x17, 0x1A, 0x41, 0xAA, 0xA4, 0xD0, 0x8D, 0x12, 0x82, 0x1E, 0x1E, 0x03, 0xF8, 0x3E, 0x03, 0x0C, 0x73, 0x80, 0x70, 0x44, 0x26, 0x03, 0x24, 0xE1, 0x3E, 0x04, 0x4E, 0x04, 0x1C, 0xC1, 0x09, 0xCC, +//240 +0x9E, 0x90, 0x21, 0x07, 0x90, 0x43, 0x64, 0xC0, 0x0F, 0xC6, 0x90, 0x9C, 0xC1, 0x5B, 0x03, 0xE2, 0x1D, 0x81, 0xE0, 0x5E, 0x1D, 0x03, 0x84, 0xB8, 0x2C, 0x0F, 0x80, 0xB1, 0x83, 0xE0, 0x30, 0x41, +//260 +0x1E, 0x43, 0x89, 0x83, 0x50, 0xFC, 0x24, 0x2E, 0x13, 0x83, 0xF1, 0x7C, 0x4C, 0x2C, 0xC9, 0x0D, 0x83, 0xB0, 0xB5, 0x82, 0xE4, 0xE8, 0x06, 0x9C, 0x07, 0xA0, 0x99, 0x1D, 0x07, 0x3E, 0x82, 0x8F, +//280 +0x70, 0x30, 0x74, 0x40, 0xCA, 0x10, 0xE4, 0xE8, 0x0F, 0x92, 0x14, 0x3F, 0x06, 0xF8, 0x84, 0x88, 0x43, 0x81, 0x0A, 0x34, 0x39, 0x41, 0xC6, 0xE3, 0x1C, 0x47, 0x03, 0xB0, 0xB8, 0x13, 0x0A, 0xC2, +//2A0 +0x64, 0xF8, 0x18, 0xF9, 0x60, 0xB3, 0xC0, 0x65, 0x20, 0x60, 0xA6, 0x8C, 0xC3, 0x81, 0x20, 0x30, 0x26, 0x1E, 0x1C, 0x38, 0xD3, 0x01, 0xB0, 0x26, 0x40, 0xF4, 0x0B, 0xC3, 0x42, 0x1F, 0x85, 0x32, +//2C0 +0x26, 0x60, 0x40, 0xC9, 0xCB, 0x01, 0xEC, 0x11, 0x28, 0x40, 0xFA, 0x04, 0x34, 0xE0, 0x70, 0x4C, 0x8C, 0x1D, 0x07, 0x69, 0x03, 0x16, 0xC8, 0x04, 0x23, 0xE8, 0xC6, 0x9A, 0x0B, 0x1A, 0x03, 0xE0, +//2E0 +0x76, 0x06, 0x05, 0xCF, 0x1E, 0xBC, 0x58, 0x31, 0x71, 0x66, 0x00, 0xF8, 0x3F, 0x04, 0xFC, 0x0C, 0x74, 0x27, 0x8A, 0x80, 0x71, 0xC2, 0x3A, 0x26, 0x06, 0xC0, 0x1F, 0x05, 0x0F, 0x98, 0x40, 0xAE, +//300 /H (palatal) +0x01, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x0E, 0xFE, 0x00, 0x03, 0xDF, 0x80, 0x03, 0xEF, 0x80, 0x1B, 0xF1, 0xC2, 0x00, 0xE7, 0xE0, 0x18, 0xFC, 0xE0, 0x21, 0xFC, 0x80, 0x3C, 0xFC, 0x40, 0x0E, 0x7E, +//320 +0x00, 0x3F, 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x3E, 0xF0, 0x07, 0xFC, 0x00, 0x7E, 0x10, 0x3F, 0xFF, 0x00, 0x3F, 0x38, 0x0E, 0x7C, 0x01, 0x87, 0x0C, 0xFC, 0xC7, 0x00, 0x3E, 0x04, +//340 +0x0F, 0x3E, 0x1F, 0x0F, 0x0F, 0x1F, 0x0F, 0x02, 0x83, 0x87, 0xCF, 0x03, 0x87, 0x0F, 0x3F, 0xC0, 0x07, 0x9E, 0x60, 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x77, 0xE1, 0xC0, 0xFE, 0xE0, 0xC3, +//360 +0xE0, 0x01, 0xDF, 0xF8, 0x03, 0x07, 0x00, 0x7E, 0x70, 0x00, 0x7C, 0x38, 0x18, 0xFE, 0x0C, 0x1E, 0x78, 0x1C, 0x7C, 0x3E, 0x0E, 0x1F, 0x1E, 0x1E, 0x3E, 0x00, 0x7F, 0x83, 0x07, 0xDB, 0x87, 0x83, +//380 +0x07, 0xC7, 0x07, 0x10, 0x71, 0xFF, 0x00, 0x3F, 0xE2, 0x01, 0xE0, 0xC1, 0xC3, 0xE1, 0x00, 0x7F, 0xC0, 0x05, 0xF0, 0x20, 0xF8, 0xF0, 0x70, 0xFE, 0x78, 0x79, 0xF8, 0x02, 0x3F, 0x0C, 0x8F, 0x03, +//3a0 +0x0F, 0x9F, 0xE0, 0xC1, 0xC7, 0x87, 0x03, 0xC3, 0xC3, 0xB0, 0xE1, 0xE1, 0xC1, 0xE3, 0xE0, 0x71, 0xF0, 0x00, 0xFC, 0x70, 0x7C, 0x0C, 0x3E, 0x38, 0x0E, 0x1C, 0x70, 0xC3, 0xC7, 0x03, 0x81, 0xC1, +//3c0 +0xC7, 0xE7, 0x00, 0x0F, 0xC7, 0x87, 0x19, 0x09, 0xEF, 0xC4, 0x33, 0xE0, 0xC1, 0xFC, 0xF8, 0x70, 0xF0, 0x78, 0xF8, 0xF0, 0x61, 0xC7, 0x00, 0x1F, 0xF8, 0x01, 0x7C, 0xF8, 0xF0, 0x78, 0x70, 0x3C, +//3e0 +0x7C, 0xCE, 0x0E, 0x21, 0x83, 0xCF, 0x08, 0x07, 0x8F, 0x08, 0xC1, 0x87, 0x8F, 0x80, 0xC7, 0xE3, 0x00, 0x07, 0xF8, 0xE0, 0xEF, 0x00, 0x39, 0xF7, 0x80, 0x0E, 0xF8, 0xE1, 0xE3, 0xF8, 0x21, 0x9F, +//400 /X (glottal) +0xC0, 0xFF, 0x03, 0xF8, 0x07, 0xC0, 0x1F, 0xF8, 0xC4, 0x04, 0xFC, 0xC4, 0xC1, 0xBC, 0x87, 0xF0, 0x0F, 0xC0, 0x7F, 0x05, 0xE0, 0x25, 0xEC, 0xC0, 0x3E, 0x84, 0x47, 0xF0, 0x8E, 0x03, 0xF8, 0x03, +//420 +0xFB, 0xC0, 0x19, 0xF8, 0x07, 0x9C, 0x0C, 0x17, 0xF8, 0x07, 0xE0, 0x1F, 0xA1, 0xFC, 0x0F, 0xFC, 0x01, 0xF0, 0x3F, 0x00, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0xFD, 0x00, 0xFF, 0x88, 0x0D, 0xF9, 0x01, +//440 +0xFF, 0x00, 0x70, 0x07, 0xC0, 0x3E, 0x42, 0xF3, 0x0D, 0xC4, 0x7F, 0x80, 0xFC, 0x07, 0xF0, 0x5E, 0xC0, 0x3F, 0x00, 0x78, 0x3F, 0x81, 0xFF, 0x01, 0xF8, 0x01, 0xC3, 0xE8, 0x0C, 0xE4, 0x64, 0x8F, +//460 +0xE4, 0x0F, 0xF0, 0x07, 0xF0, 0xC2, 0x1F, 0x00, 0x7F, 0xC0, 0x6F, 0x80, 0x7E, 0x03, 0xF8, 0x07, 0xF0, 0x3F, 0xC0, 0x78, 0x0F, 0x82, 0x07, 0xFE, 0x22, 0x77, 0x70, 0x02, 0x76, 0x03, 0xFE, 0x00, +//480 +0xFE, 0x67, 0x00, 0x7C, 0xC7, 0xF1, 0x8E, 0xC6, 0x3B, 0xE0, 0x3F, 0x84, 0xF3, 0x19, 0xD8, 0x03, 0x99, 0xFC, 0x09, 0xB8, 0x0F, 0xF8, 0x00, 0x9D, 0x24, 0x61, 0xF9, 0x0D, 0x00, 0xFD, 0x03, 0xF0, +//4a0 +0x1F, 0x90, 0x3F, 0x01, 0xF8, 0x1F, 0xD0, 0x0F, 0xF8, 0x37, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFA, 0x03, 0xF0, 0x0F, 0x80, 0xFF, 0x01, +//4c0 +0xB8, 0x07, 0xF0, 0x01, 0xFC, 0x01, 0xBC, 0x80, 0x13, 0x1E, 0x00, 0x7F, 0xE1, 0x40, 0x7F, 0xA0, 0x7F, 0xB0, 0x00, 0x3F, 0xC0, 0x1F, 0xC0, 0x38, 0x0F, 0xF0, 0x1F, 0x80, 0xFF, 0x01, 0xFC, 0x03, +//4e0 0xF1, 0x7E, 0x01, 0xFE, 0x01, 0xF0, 0xFF, 0x00, 0x7F, 0xC0, 0x1D, 0x07, 0xF0, 0x0F, 0xC0, 0x7E, 0x06, 0xE0, 0x07, 0xE0, 0x0F, 0xF8, 0x06, 0xC1, 0xFE, 0x01, 0xFC, 0x03, 0xE0, 0x0F, 0x00, 0xFC]; /** @@ -1741,34 +2056,33 @@ let sampleTable = [//00 T', S, Z (coronal) * * @return {Array} */ - let SetMouthThroat = (mouth, throat) => { let trans = (factor, initialFrequency) => { return (factor * initialFrequency >> 8 & 0xFF) << 1; }; - let freqdata = [[], [], []]; frequencyData.map((v, i) => { freqdata[0][i] = v & 0xFF; freqdata[1][i] = v >> 8 & 0xFF; freqdata[2][i] = v >> 16 & 0xFF; - }); // recalculate formant frequencies 5..29 for the mouth (F1) and throat (F2) + }); + // recalculate formant frequencies 5..29 for the mouth (F1) and throat (F2) for (let pos = 5; pos < 30; pos++) { // recalculate mouth frequency - freqdata[0][pos] = trans(mouth, freqdata[0][pos]); // recalculate throat frequency + freqdata[0][pos] = trans(mouth, freqdata[0][pos]); + // recalculate throat frequency freqdata[1][pos] = trans(throat, freqdata[1][pos]); - } // recalculate formant frequencies 48..53 - + } + // recalculate formant frequencies 48..53 for (let pos = 48; pos < 54; pos++) { // recalculate F1 (mouth formant) - freqdata[0][pos] = trans(mouth, freqdata[0][pos]); // recalculate F2 (throat formant) - + freqdata[0][pos] = trans(mouth, freqdata[0][pos]); + // recalculate F2 (throat formant) freqdata[1][pos] = trans(throat, freqdata[1][pos]); } - return freqdata; }; @@ -1814,7 +2128,6 @@ let SetMouthThroat = (mouth, throat) => { * * @return {Number} */ - let CreateTransitions = (pitches, frequency, amplitude, tuples) => { // 0=pitches // 1=frequency1 @@ -1824,64 +2137,58 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { // 5=amplitude2 // 6=amplitude3 let tables = [pitches, frequency[0], frequency[1], frequency[2], amplitude[0], amplitude[1], amplitude[2]]; - let Read = (table, pos) => { { if (table < 0 || table > tables.length - 1) { - throw new Error("Error invalid table in Read: ".concat(table)); + throw new Error(`Error invalid table in Read: ${table}`); } } - return tables[table][pos]; - }; // linearly interpolate values - + }; + // linearly interpolate values let interpolate = (width, table, frame, change) => { let sign = change < 0; let remainder = Math.abs(change) % width; let div = change / width | 0; let error = 0; let pos = width; - while (--pos > 0) { let val = Read(table, frame) + div; error += remainder; - if (error >= width) { // accumulated a whole integer error, so adjust output error -= width; - if (sign) { val--; } else if (val) { // if input is 0, we always leave it alone val++; } - } // Write updated value back to next frame. - + } + // Write updated value back to next frame. { if (table < 0 || table > tables.length - 1) { - throw new Error("Error invalid table in Read: ".concat(table)); + throw new Error(`Error invalid table in Read: ${table}`); } } - tables[table][++frame] = val; val += div; } }; - let outBlendFrames; let inBlendFrames; let boundary = 0; - for (let pos = 0; pos < tuples.length - 1; pos++) { let phoneme = tuples[pos][0]; - let next_phoneme = tuples[pos + 1][0]; // get the ranking of each phoneme + let next_phoneme = tuples[pos + 1][0]; + // get the ranking of each phoneme let next_rank = blendRank[next_phoneme]; - let rank = blendRank[phoneme]; // compare the rank - lower rank value is stronger + let rank = blendRank[phoneme]; + // compare the rank - lower rank value is stronger if (rank === next_rank) { // same rank, so use out blend lengths from each phoneme outBlendFrames = outBlendLength[phoneme]; @@ -1896,7 +2203,6 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { outBlendFrames = outBlendLength[phoneme]; inBlendFrames = inBlendLength[phoneme]; } - boundary += tuples[pos][1]; let trans_end = boundary + inBlendFrames; let trans_start = boundary - outBlendFrames; @@ -1906,13 +2212,13 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { // unlike the other values, the pitches[] interpolates from // the middle of the current phoneme to the middle of the // next phoneme + // half the width of the current and next phoneme let cur_width = tuples[pos][1] >> 1; let next_width = tuples[pos + 1][1] >> 1; - let pitch = pitches[boundary + next_width] - pitches[boundary - cur_width]; // interpolate the values - + let pitch = pitches[boundary + next_width] - pitches[boundary - cur_width]; + // interpolate the values interpolate(cur_width + next_width, 0, trans_start, pitch); - for (let table = 1; table < 7; table++) { // tables: // 0 pitches @@ -1926,14 +2232,15 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { interpolate(trans_length, table, trans_start, value); } } - } // add the length of last phoneme - + } + // add the length of last phoneme return boundary + tuples[tuples.length - 1][1]; }; let RISING_INFLECTION = 255; let FALLING_INFLECTION = 1; + /** CREATE FRAMES * * The length parameter in the list corresponds to the number of frames @@ -1957,7 +2264,6 @@ let FALLING_INFLECTION = 1; * * @return Array */ - let CreateFrames = (pitch, tuples, frequencyData) => { /** * Create a rising or falling inflection 30 frames prior to index X. @@ -1966,78 +2272,62 @@ let CreateFrames = (pitch, tuples, frequencyData) => { let AddInflection = (inflection, pos, pitches) => { // store the location of the punctuation let end = pos; - if (pos < 30) { pos = 0; } else { pos -= 30; } - - let A; // FIXME: Explain this fix better, it's not obvious + let A; + // FIXME: Explain this fix better, it's not obvious // ML : A =, fixes a problem with invalid pitch with '.' - while ((A = pitches[pos]) === 127) { ++pos; } - while (pos !== end) { // add the inflection direction - A += inflection; // set the inflection + A += inflection; + // set the inflection pitches[pos] = A & 0xFF; - - while (++pos !== end && pitches[pos] === 255) { - /* keep looping */ - } + while (++pos !== end && pitches[pos] === 255) {/* keep looping */} } }; - let pitches = []; let frequency = [[], [], []]; let amplitude = [[], [], []]; let sampledConsonantFlag = []; let X = 0; - for (let i = 0; i < tuples.length; i++) { // get the phoneme at the index let phoneme = tuples[i][0]; - if (phoneme === PHONEME_PERIOD) { AddInflection(FALLING_INFLECTION, X, pitches); } else if (phoneme === PHONEME_QUESTION) { AddInflection(RISING_INFLECTION, X, pitches); - } // get the stress amount (more stress = higher pitch) - + } - let phase1 = stressPitch_tab47492[tuples[i][2]]; // get number of frames to write + // get the stress amount (more stress = higher pitch) + let phase1 = stressPitch_tab47492[tuples[i][2]]; + // get number of frames to write // copy from the source to the frames list - for (let frames = tuples[i][1]; frames > 0; frames--) { frequency[0][X] = frequencyData[0][phoneme]; // F1 frequency - frequency[1][X] = frequencyData[1][phoneme]; // F2 frequency - frequency[2][X] = frequencyData[2][phoneme]; // F3 frequency - amplitude[0][X] = ampldata[phoneme] & 0xFF; // F1 amplitude - amplitude[1][X] = ampldata[phoneme] >> 8 & 0xFF; // F2 amplitude - amplitude[2][X] = ampldata[phoneme] >> 16 & 0xFF; // F3 amplitude - sampledConsonantFlag[X] = sampledConsonantFlags[phoneme]; // phoneme data for sampled consonants - pitches[X] = pitch + phase1 & 0xFF; // pitch - X++; } } - return [pitches, frequency, amplitude, sampledConsonantFlag]; }; let PrepareFrames = (phonemes, pitch, mouth, throat, singmode) => { let freqdata = SetMouthThroat(mouth, throat); + /** * RENDER THE PHONEMES IN THE LIST * @@ -2055,7 +2345,6 @@ let PrepareFrames = (phonemes, pitch, mouth, throat, singmode) => { const [pitches, frequency, amplitude, sampledConsonantFlag] = CreateFrames(pitch, phonemes, freqdata); let t = CreateTransitions(pitches, frequency, amplitude, phonemes); - if (!singmode) { /* ASSIGN PITCH CONTOUR * @@ -2069,72 +2358,68 @@ let PrepareFrames = (phonemes, pitch, mouth, throat, singmode) => { pitches[i] -= frequency[0][i] >> 1; } } + /* * RESCALE AMPLITUDE * * Rescale volume from decibels to the linear scale. */ - - let amplitudeRescale = [0x00, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06, 0x08, 0x09, 0x0B, 0x0D, 0x0F]; - for (let i = amplitude[0].length - 1; i >= 0; i--) { amplitude[0][i] = amplitudeRescale[amplitude[0][i]]; amplitude[1][i] = amplitudeRescale[amplitude[1][i]]; amplitude[2][i] = amplitudeRescale[amplitude[2][i]]; } - let result = [t, frequency, pitches, amplitude, sampledConsonantFlag]; - return result; }; let CreateOutputBuffer = buffersize => { let buffer = new Uint8Array(buffersize); let bufferpos = 0; - let oldTimeTableIndex = 0; // Scale by 16 and write five times. - + let oldTimeTableIndex = 0; + // Scale by 16 and write five times. let writer = (index, A) => { let scaled = (A & 15) * 16; writer.ary(index, [scaled, scaled, scaled, scaled, scaled]); - }; // Write the five given values. - - + }; + // Write the five given values. writer.ary = (index, array) => { // timetable for more accurate c64 simulation - let timetable = [[162, 167, 167, 127, 128], // formants synth - [226, 60, 60, 0, 0], // unvoiced sample 0 - [225, 60, 59, 0, 0], // unvoiced sample 1 - [200, 0, 0, 54, 55], // voiced sample 0 + let timetable = [[162, 167, 167, 127, 128], + // formants synth + [226, 60, 60, 0, 0], + // unvoiced sample 0 + [225, 60, 59, 0, 0], + // unvoiced sample 1 + [200, 0, 0, 54, 55], + // voiced sample 0 [199, 0, 0, 54, 54] // voiced sample 1 ]; bufferpos += timetable[oldTimeTableIndex][index]; - if ((bufferpos / 50 | 0) > buffer.length) { { - throw new Error("Buffer overflow, want ".concat(bufferpos / 50 | 0, " but buffersize is only ").concat(buffer.length, "!")); + throw new Error(`Buffer overflow, want ${bufferpos / 50 | 0} but buffersize is only ${buffer.length}!`); } } - - oldTimeTableIndex = index; // write a little bit in advance - + oldTimeTableIndex = index; + // write a little bit in advance for (let k = 0; k < 5; k++) { buffer[(bufferpos / 50 | 0) + k] = array[k]; } }; - writer.get = () => { - return buffer.slice(0, bufferpos / 50 | 0); }; - return writer; }; let RenderSample = (Output, lastSampleOffset, consonantFlag, pitch) => { // mask low three bits and subtract 1 get value to // convert 0 bits on unvoiced samples. - let kind = (consonantFlag & 7) - 1; // determine which value to use from table { 0x18, 0x1A, 0x17, 0x17, 0x17 } + let kind = (consonantFlag & 7) - 1; + + // determine which value to use from table { 0x18, 0x1A, 0x17, 0x17, 0x17 } // T', S, Z 0 0x18 coronal // CH', J', SH, ZH 1 0x1A palato-alveolar // P', F, V, TH, DH 2 0x17 [labio]dental @@ -2142,53 +2427,43 @@ let RenderSample = (Output, lastSampleOffset, consonantFlag, pitch) => { // /X 4 0x17 glottal let samplePage = kind * 256 & 0xFFFF; // unsigned short - let off = consonantFlag & 248; // unsigned char let renderSample = (index1, value1, index0, value0) => { let bit = 8; let sample = sampleTable[samplePage + off]; - do { if ((sample & 128) !== 0) { Output(index1, value1); } else { Output(index0, value0); } - sample <<= 1; } while (--bit); }; - if (off === 0) { // voiced phoneme: Z*, ZH, V*, DH let phase1 = pitch >> 4 ^ 255 & 0xFF; // unsigned char - off = lastSampleOffset & 0xFF; // unsigned char - do { renderSample(3, 26, 4, 6); off++; off &= 0xFF; } while (++phase1 & 0xFF); - return off; - } // unvoiced - - + } + // unvoiced off = off ^ 255 & 0xFF; // unsigned char - let value0 = sampledConsonantValues0[kind] & 0xFF; // unsigned char - do { renderSample(2, 5, 1, value0); } while (++off & 0xFF); - return lastSampleOffset; -}; // Removed sine table stored a pre calculated sine wave but in modern CPU, we can calculate inline. - +}; +// Removed sine table stored a pre calculated sine wave but in modern CPU, we can calculate inline. let sinus = x => Math.sin(2 * Math.PI * (x / 256)) * 127 | 0; + /** * PROCESS THE FRAMES * @@ -2199,8 +2474,6 @@ let sinus = x => Math.sin(2 * Math.PI * (x / 256)) * 127 | 0; * To simulate them being driven by the glottal pulse, the waveforms are * reset at the beginning of each glottal pulse. */ - - let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, sampledConsonantFlag) => { let speedcounter = speed; let phase1 = 0; @@ -2210,13 +2483,13 @@ let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, s let pos = 0; let glottal_pulse = pitches[0]; let mem38 = glottal_pulse * .75 | 0; - while (frameCount) { - let flags = sampledConsonantFlag[pos]; // unvoiced sampled phoneme? + let flags = sampledConsonantFlag[pos]; + // unvoiced sampled phoneme? if ((flags & 248) !== 0) { - lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); // skip ahead two in the phoneme buffer - + lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); + // skip ahead two in the phoneme buffer pos += 2; frameCount -= 2; speedcounter = speed; @@ -2225,104 +2498,66 @@ let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, s // Rectangle wave consisting of: // 0-128 = 0x90 // 128-255 = 0x70 + // simulate the glottal pulse and formants let ary = []; - let - /* unsigned int */ - p1 = phase1 * 256; // Fixed point integers because we need to divide later on - - let - /* unsigned int */ - p2 = phase2 * 256; - let - /* unsigned int */ - p3 = phase3 * 256; - + let /* unsigned int */p1 = phase1 * 256; // Fixed point integers because we need to divide later on + let /* unsigned int */p2 = phase2 * 256; + let /* unsigned int */p3 = phase3 * 256; for (let k = 0; k < 5; k++) { - const - /* signed char */ - sp1 = sinus(0xff & p1 >> 8); - const - /* signed char */ - sp2 = sinus(0xff & p2 >> 8); - const - /* signed char */ - rp3 = (0xff & p3 >> 8) < 129 ? -0x70 : 0x70; - const - /* signed int */ - sin1 = sp1 * ( - /* (unsigned char) */ - amplitude[0][pos] & 0x0F); - const - /* signed int */ - sin2 = sp2 * ( - /* (unsigned char) */ - amplitude[1][pos] & 0x0F); - const - /* signed int */ - rect = rp3 * ( - /* (unsigned char) */ - amplitude[2][pos] & 0x0F); - let - /* signed int */ - mux = sin1 + sin2 + rect; + const /* signed char */sp1 = sinus(0xff & p1 >> 8); + const /* signed char */sp2 = sinus(0xff & p2 >> 8); + const /* signed char */rp3 = (0xff & p3 >> 8) < 129 ? -0x70 : 0x70; + const /* signed int */sin1 = sp1 * ( /* (unsigned char) */amplitude[0][pos] & 0x0F); + const /* signed int */sin2 = sp2 * ( /* (unsigned char) */amplitude[1][pos] & 0x0F); + const /* signed int */rect = rp3 * ( /* (unsigned char) */amplitude[2][pos] & 0x0F); + let /* signed int */mux = sin1 + sin2 + rect; mux /= 32; mux += 128; // Go from signed to unsigned amplitude - ary[k] = mux | 0; p1 += frequency[0][pos] * 256 / 4; // Compromise, this becomes a shift and works well - p2 += frequency[1][pos] * 256 / 4; p3 += frequency[2][pos] * 256 / 4; } - Output.ary(0, ary); } speedcounter--; - if (speedcounter === 0) { pos++; //go to next amplitude // decrement the frame count - frameCount--; - if (frameCount === 0) { return; } - speedcounter = speed; } - glottal_pulse--; - if (glottal_pulse !== 0) { // not finished with a glottal pulse - mem38--; // within the first 75% of the glottal pulse? - // is the count non-zero and the sampled flag is zero? + mem38--; + // within the first 75% of the glottal pulse? + // is the count non-zero and the sampled flag is zero? if (mem38 !== 0 || flags === 0) { // update the phase of the formants // TODO: we should have a switch to disable this, it causes a pretty nice voice without the masking! phase1 = phase1 + frequency[0][pos]; // & 0xFF; - phase2 = phase2 + frequency[1][pos]; // & 0xFF; - phase3 = phase3 + frequency[2][pos]; // & 0xFF; - continue; - } // voiced sampled phonemes interleave the sample with the + } + + // voiced sampled phonemes interleave the sample with the // glottal pulse. The sample flag is non-zero, so render // the sample for the phoneme. - - lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); } } - glottal_pulse = pitches[pos]; - mem38 = glottal_pulse * .75 | 0; // reset the formant wave generators to keep them in - // sync with the glottal pulse + mem38 = glottal_pulse * .75 | 0; + // reset the formant wave generators to keep them in + // sync with the glottal pulse phase1 = 0; phase2 = 0; phase3 = 0; @@ -2339,44 +2574,38 @@ let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, s * * @return Uint8Array */ - let Renderer = (phonemes, pitch, mouth, throat, speed, singmode) => { pitch = pitch === undefined ? 64 : pitch & 0xFF; mouth = mouth === undefined ? 128 : mouth & 0xFF; throat = throat === undefined ? 128 : throat & 0xFF; speed = (speed || 72) & 0xFF; singmode = singmode || false; - let sentences = PrepareFrames(phonemes, pitch, mouth, throat, singmode); // Reserve 176.4*speed samples (=8*speed ms) for each frame. + let sentences = PrepareFrames(phonemes, pitch, mouth, throat, singmode); + // Reserve 176.4*speed samples (=8*speed ms) for each frame. let Output = CreateOutputBuffer(176.4 // = (22050/125) * phonemes.reduce((pre, v) => pre + v[1], 0) // Combined phoneme length in frames. * speed | 0); const [t, frequency, pitches, amplitude, sampledConsonantFlag] = sentences; - { PrintOutput(pitches, frequency, amplitude, sampledConsonantFlag); } - ProcessFrames(Output, t, speed, frequency, pitches, amplitude, sampledConsonantFlag); return Output.get(); }; - let PrintOutput = (pitches, frequency, amplitude, sampledConsonantFlag) => { let pad = num => { let s = '00000' + num; return s.substr(s.length - 5); }; - console.log('==========================================='); console.log('Final data for speech output:'); console.log(' flags ampl1 freq1 ampl2 freq2 ampl3 freq3 pitch'); console.log('------------------------------------------------'); - for (let i = 0; i < sampledConsonantFlag.length; i++) { console.log(' %s %s %s %s %s %s %s %s', pad(sampledConsonantFlag[i]), pad(amplitude[0][i]), pad(frequency[0][i]), pad(amplitude[1][i]), pad(frequency[1][i]), pad(amplitude[2][i]), pad(frequency[2][i]), pad(pitches[i])); i++; } - console.log('==========================================='); }; @@ -2394,17 +2623,16 @@ let PrintOutput = (pitches, frequency, amplitude, sampledConsonantFlag) => { * * @return {Promise} */ - let SamSpeak = (input, options) => { let buffer = SamBuffer(input, options); - if (false === buffer) { return Promise.reject(); - } // Now push buffer to wave player. - + } + // Now push buffer to wave player. return PlayBuffer(buffer); }; + /** * Process the input and return the audio buffer. * @@ -2419,16 +2647,14 @@ let SamSpeak = (input, options) => { * * @return {Float32Array|Boolean} */ - let SamBuffer = (input, options) => { let buffer = SamProcess(input, options); - if (false === buffer) { return false; } - return Uint8ArrayToFloat32Array(buffer); }; + /** * Process the input and return the audiobuffer. * @@ -2443,15 +2669,12 @@ let SamBuffer = (input, options) => { * * @return {Uint8Array|Boolean} */ - let SamProcess = function (input) { let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; let parsed = Parser(input); - if (false === parsed) { return false; } - return Renderer(parsed, options.pitch, options.mouth, options.throat, options.speed, options.singmode); }; @@ -2468,39 +2691,30 @@ let IS_MUCH_TOO_LOW = 'IHZ MAH3CH TUW4 LAXOW,'; let IS_TOO_LOW = 'IHZ TUW3 LAXOW.'; let IS_A_LITTLE_TOO_LOW = 'IHZ AH LIH3TUL TUW4 LAXOW,'; let IS_CORRECT = 'IHZ KAORREHKT, PLEY5 AXGEH4N? AOR DUW5 YUW PRIY4FER PAONX?'; - let numberToPhonemes = number => { if (number >= 10 && number < 20) { return lookup_teens[number - 10]; } - let n; let phonemes = ''; - if ((n = Math.floor(number / 10) - 2) >= 0) { phonemes += lookup_tens[n]; } - if (n = number % 10) { phonemes += ' ' + lookup_ones[n - 1]; } - return phonemes; }; + /** * @param {Element} e */ - - var guessnum = (e => { let output = e.ownerDocument.createElement('pre'); let button = e.ownerDocument.createElement('button'); let input = e.ownerDocument.createElement('input'); - let show = e => e.style.display = 'inline-block'; - let hide = e => e.style.display = 'none'; - let number; e.appendChild(output); e.appendChild(button); @@ -2515,84 +2729,67 @@ var guessnum = (e => { hide(button); show(input); }); - let say = (phonemes, raw) => { let text = phonemes; - while (text.length < 256) { text += ' '; } - if (raw) { output.innerText += "\n" + raw; } - SamSpeak(phonemes); }; - input.onkeydown = e => { if (e.keyCode === 13) { e.preventDefault(); - if (guess(parseInt(input.value))) { output.innerText = "\n" + output.innerText.split("\n").pop(); hide(input); show(button); } - input.value = ''; } }; + /** * Guess the number. * * @param {Number} guess The guess */ - - let guess = guess => { if (guess > 100) { say(THATS_MORE_THAN_100); return false; } - if (guess < 1) { say(THATS_LESS_THAN_ONE); return false; } - let phonetic = numberToPhonemes(guess); - if (guess > number + 25) { say(phonetic + ' ' + IS_MUCH_TOO_HIGH, guess + ' is much too high.'); return false; } - if (guess > number + 5) { say(phonetic + ' ' + IS_TOO_HIGH, guess + ' is too high.'); return false; } - if (guess > number) { say(phonetic + ' ' + IS_A_LITTLE_TOO_HIGH, guess + ' is a little too high.'); return false; } - if (guess < number - 25) { say(phonetic + ' ' + IS_MUCH_TOO_LOW, guess + ' is much too low.'); return false; } - if (guess < number - 5) { say(phonetic + ' ' + IS_TOO_LOW, guess + ' is too low.'); return false; } - if (guess < number) { say(phonetic + ' ' + IS_A_LITTLE_TOO_LOW, guess + ' is a little too low.'); return false; } - if (guess === number) { say(phonetic + ' ' + IS_CORRECT, guess + ' is correct, play again? or do you prefer PONG?.'); return true; diff --git a/dist/guessnum.common.min.js b/dist/guessnum.common.min.js index dd35e85..6f78887 100644 --- a/dist/guessnum.common.min.js +++ b/dist/guessnum.common.min.js @@ -9,5 +9,5 @@ * * @author 2017 Christian Schiffler */ -"use strict";let P=(e,r)=>0!=(e&r),H=null,K="*12345678".split(""),V=" *.*?*,*-*IYIHEHAEAAAHAOUHAXIXERUXOHRXLXWXYXWHR*L*W*Y*M*N*NXDXQ*S*SHF*TH/H/XZ*ZHV*DHCH**J*******EYAYOYAWOWUWB*****D*****G*****GX****P*****T*****K*****KX****ULUMUN".match(/.{1,2}/g),B=[32768,49408,49408,49408,49408,164,164,164,164,164,164,132,132,164,164,132,132,132,132,132,132,132,68,4164,4164,4164,4164,2124,3148,2124,1096,16460,9280,8256,8256,9280,64,64,9284,8260,8260,9284,8264,8256,76,8260,0,0,180,180,180,148,148,148,78,78,78,1102,1102,1102,78,78,78,78,78,78,75,75,75,1099,1099,1099,75,75,75,75,75,75,128,193,193],G=[0,4626,4626,4626,2056,2824,2312,2824,3592,3851,2822,4108,3082,1541,1541,3595,3082,3594,3082,2825,2056,2055,2825,2567,2310,2056,2054,2055,2055,2055,770,1285,514,514,514,514,514,514,1542,1542,2055,1542,1542,514,2312,1027,513,286,3597,3852,3852,3852,3598,3593,2054,513,514,1797,513,257,1798,513,514,1798,513,514,2056,514,514,1540,514,514,1798,513,1028,1798,257,1028,1479,1535],Q=(e,r)=>P(B[e],r),j=128,u=[24,26,23,23,23],A=[0,224,230,236,243,249,0,6,12,6],c=[0,31,31,31,31,2,2,2,2,2,2,2,2,2,5,5,2,10,2,8,5,5,11,10,9,8,8,160,8,8,23,31,18,18,18,18,30,30,20,20,20,20,23,23,26,26,29,29,2,2,2,2,2,2,26,29,27,26,29,27,26,29,27,26,29,27,23,29,23,23,29,23,23,29,23,23,29,23,23,23],Y=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,2,4,4,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,0,1,0,5,5,5,5,5,4,4,2,0,1,2,0,1,2,0,1,2,0,1,2,0,2,2,0,1,3,0,2,3,0,2,160,160],E=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,4,4,3,3,3,3,3,1,2,3,2,1,3,3,3,3,1,1,3,3,3,2,2,3,2,3,0,0,5,5,5,5,4,4,2,0,2,2,0,3,2,0,4,2,0,3,2,0,2,2,0,2,3,0,3,3,0,3,176,160],I=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,226,211,187,124,149,1,2,3,3,0,114,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,25,0,0,0,0,0,0,0,0,0],s=[0,5980947,5980947,5980947,5980947,7230474,6113550,5980947,5783320,5842971,5712919,5775125,5383440,5844244,6113550,4075794,5383182,5774866,4076306,7218448,5250317,6112527,5904395,3944978,7216654,5904395,7230217,5320198,7943686,6641158,7943686,5980945,6506758,6967046,5315078,7946758,6113550,5383440,6107913,6767114,4990984,6106890,6639366,6639366,7946758,6639365,7958022,0,5916691,5777179,5775125,5778203,5774866,5382669,5315078,5315078,5315078,7946758,7946758,7946758,7368198,7237126,7237126,6181894,6181894,6181894,5315078,5315078,5315078,7946758,7946758,7946758,6647046,6641162,7367946,6181894,6181894,6181894,556844,98067],h=[0,0,0,0,0,526861,461581,527630,527887,68879,68623,3087,68367,2316,461581,330508,68623,3087,396301,67597,2061,461838,2061,330252,67597,2061,526861,780,2313,198153,0,0,0,0,0,0,0,0,779,66827,779,1035,0,0,1,66827,920064,66050,593422,68879,3087,68879,3087,2061,2,260,0,2,260,0,1,260,0,1,260,0,0,0,0,0,0,0,0,461324,0,0,330240,0,1245199,1048591],v=[56,132,107,25,198,99,24,134,115,152,198,177,28,202,49,140,199,49,136,194,48,152,70,49,24,198,53,12,202,49,12,198,33,16,36,105,18,194,49,20,196,113,8,74,34,73,171,106,168,172,73,81,50,213,82,136,147,108,148,34,21,84,210,37,150,212,80,165,70,33,8,133,107,24,196,99,16,206,107,24,140,113,25,140,99,53,12,198,51,153,204,108,181,78,162,153,70,33,40,130,149,46,227,48,156,197,48,156,162,177,156,103,49,136,102,89,44,83,24,132,103,80,202,227,10,172,171,48,172,98,48,140,99,16,148,98,177,140,130,40,150,51,152,214,181,76,98,41,165,74,181,156,198,49,20,214,56,156,75,180,134,101,24,174,103,28,166,99,25,150,35,25,132,19,8,166,82,172,202,34,137,110,171,25,140,98,52,196,98,25,134,99,24,196,35,88,214,163,80,66,84,74,173,74,37,17,107,100,137,74,99,57,138,35,49,42,234,162,169,68,197,18,205,66,52,140,98,24,140,99,17,72,102,49,157,68,51,29,70,49,156,198,177,12,205,50,136,196,115,24,134,115,8,214,99,88,7,129,224,240,60,7,135,144,60,124,15,199,192,192,240,124,30,7,128,128,0,28,120,112,241,199,31,192,12,254,28,31,31,14,10,122,192,113,242,131,143,3,15,15,12,0,121,248,97,224,67,15,131,231,24,249,193,19,218,233,99,143,15,131,131,135,195,31,60,112,240,225,225,227,135,184,113,14,32,227,141,72,120,28,147,135,48,225,193,193,228,120,33,131,131,195,135,6,57,229,195,135,7,14,28,28,112,244,113,156,96,54,50,195,30,60,243,143,14,60,112,227,199,143,15,15,14,60,120,240,227,135,6,240,227,7,193,153,135,15,24,120,112,112,252,243,16,177,140,140,49,124,112,225,134,60,100,108,176,225,227,15,35,143,15,30,62,56,60,56,123,143,7,14,60,244,23,30,60,120,242,158,114,73,227,37,54,56,88,57,226,222,60,120,120,225,199,97,225,225,176,240,240,195,199,14,56,192,240,206,115,115,24,52,176,225,199,142,28,60,248,56,240,225,193,139,134,143,28,120,112,240,120,172,177,143,57,49,219,56,97,195,14,14,56,120,115,23,30,57,30,56,100,225,241,193,78,15,64,162,2,197,143,129,161,252,18,8,100,224,60,34,224,69,7,142,12,50,144,240,31,32,73,224,248,12,96,240,23,26,65,170,164,208,141,18,130,30,30,3,248,62,3,12,115,128,112,68,38,3,36,225,62,4,78,4,28,193,9,204,158,144,33,7,144,67,100,192,15,198,144,156,193,91,3,226,29,129,224,94,29,3,132,184,44,15,128,177,131,224,48,65,30,67,137,131,80,252,36,46,19,131,241,124,76,44,201,13,131,176,181,130,228,232,6,156,7,160,153,29,7,62,130,143,112,48,116,64,202,16,228,232,15,146,20,63,6,248,132,136,67,129,10,52,57,65,198,227,28,71,3,176,184,19,10,194,100,248,24,249,96,179,192,101,32,96,166,140,195,129,32,48,38,30,28,56,211,1,176,38,64,244,11,195,66,31,133,50,38,96,64,201,203,1,236,17,40,64,250,4,52,224,112,76,140,29,7,105,3,22,200,4,35,232,198,154,11,26,3,224,118,6,5,207,30,188,88,49,113,102,0,248,63,4,252,12,116,39,138,128,113,194,58,38,6,192,31,5,15,152,64,174,1,127,192,7,255,0,14,254,0,3,223,128,3,239,128,27,241,194,0,231,224,24,252,224,33,252,128,60,252,64,14,126,0,63,62,0,15,254,0,31,255,0,62,240,7,252,0,126,16,63,255,0,63,56,14,124,1,135,12,252,199,0,62,4,15,62,31,15,15,31,15,2,131,135,207,3,135,15,63,192,7,158,96,63,192,3,254,0,63,224,119,225,192,254,224,195,224,1,223,248,3,7,0,126,112,0,124,56,24,254,12,30,120,28,124,62,14,31,30,30,62,0,127,131,7,219,135,131,7,199,7,16,113,255,0,63,226,1,224,193,195,225,0,127,192,5,240,32,248,240,112,254,120,121,248,2,63,12,143,3,15,159,224,193,199,135,3,195,195,176,225,225,193,227,224,113,240,0,252,112,124,12,62,56,14,28,112,195,199,3,129,193,199,231,0,15,199,135,25,9,239,196,51,224,193,252,248,112,240,120,248,240,97,199,0,31,248,1,124,248,240,120,112,60,124,206,14,33,131,207,8,7,143,8,193,135,143,128,199,227,0,7,248,224,239,0,57,247,128,14,248,225,227,248,33,159,192,255,3,248,7,192,31,248,196,4,252,196,193,188,135,240,15,192,127,5,224,37,236,192,62,132,71,240,142,3,248,3,251,192,25,248,7,156,12,23,248,7,224,31,161,252,15,252,1,240,63,0,254,3,240,31,0,253,0,255,136,13,249,1,255,0,112,7,192,62,66,243,13,196,127,128,252,7,240,94,192,63,0,120,63,129,255,1,248,1,195,232,12,228,100,143,228,15,240,7,240,194,31,0,127,192,111,128,126,3,248,7,240,63,192,120,15,130,7,254,34,119,112,2,118,3,254,0,254,103,0,124,199,241,142,198,59,224,63,132,243,25,216,3,153,252,9,184,15,248,0,157,36,97,249,13,0,253,3,240,31,144,63,1,248,31,208,15,248,55,1,248,7,240,15,192,63,0,254,3,248,15,192,63,0,250,3,240,15,128,255,1,184,7,240,1,252,1,188,128,19,30,0,127,225,64,127,160,127,176,0,63,192,31,192,56,15,240,31,128,255,1,252,3,241,126,1,254,1,240,255,0,127,192,29,7,240,15,192,126,6,224,7,224,15,248,6,193,254,1,252,3,224,15,0,252],d=(a,r,e,t)=>{var l=(7&e)-1;let i=256*l&65535,f=248&e;var n=(e,r,t,l)=>{let n=8,o=v[i+f];for(;0!=(128&o)?a(e,r):a(t,l),o<<=1,--n;);};if(0===f){let e=t>>4^255;for(f=255&r;n(3,26,4,6),f++,f&=255,255&++e;);return f}f^=255;for(var o=255&u[l];n(2,5,1,o),255&++f;);return r},W=e=>127*Math.sin(2*Math.PI*(e/256))|0,T=["WAHN","TUW5","THRIY5","FOHR5","FAY5V","SIH5KS","SEH5VUN","EY5T","NAY5N"],N=["TEH4N","IHLEH4VIXN","TWEH4LV","THER4TIY6N","FOH4RTIY6N","FIH4FTIY6N","SIH4KSTIY6N","SEH4VUNTIY6N","EY4TIY6N","NAY4NTIY6N"],g=["TWEHNTIY","THERTIY","FOHRTIY","FIH4FTIY6","SIHKSTIY6","SEH4VUNTIY6","EY4T1Y6","NAY4NTIY6"];module.exports=e=>{let l=e.ownerDocument.createElement("pre"),r=e.ownerDocument.createElement("button"),t=e.ownerDocument.createElement("input"),n=e=>e.style.display="inline-block",o=e=>e.style.display="none",a,i=(e.appendChild(l),e.appendChild(r),e.appendChild(t),o(t),r.type="button",r.innerText="Start game",r.addEventListener("click",()=>{l.textContent="",a=Math.floor(99*Math.random()+1),i("GEH3S DHAX NAH4MBER BIXTWIY5N WAH4N Q AEND WAHN /HAH4NDRIHD"),o(r),n(t)}),(r,t)=>{let e=r;for(;e.length<256;)e+=" ";if(t&&(l.innerText+="\n"+t),!1===(t=(()=>{var i,x=r,e=!(i={})!==(e=(()=>{if(!x)return!1;var l=e=>e===I.length?null:I[e],n=(r,e,t,l)=>{for(let e=I.length-1;e>=r;e--)I[e+1]=I[e],A[e+1]=a(e),s[e+1]=o(e);I[r]=e,A[r]=0|l,s[r]=t};let o=e=>0|s[e],a=e=>0|A[e];var r,t,i,f,e,H,u=(e,r)=>{A[e]=r};let s=[],A=[],I=[],h=0;var v=x,T=e=>{s[h]=0,A[h]=0,I[h++]=e};for(let r=0;r{var e=V.findIndex(e=>e===r+t&&"*"!==e[1]);return-1!==e&&e})(N,c)))r++,T(e);else if(!1!==(e=(r=>{var e=V.findIndex(e=>e===r+"*");return-1!==e&&e})(N)))T(e);else{for(e=K.length;N!==K[e]&&0{I[e]=r},d=l,W=o,g=(e,r)=>{switch(e){case 53:Q(d(r-1),1024)&&E(r,16);break;case 42:Y(r+1,43,W(r));break;case 44:Y(r+1,45,W(r))}},p=(e,r)=>{E(e,13),Y(e+1,r,W(e))};let e=-1,r;for(;null!==(r=d(++e));)if(0!==r)if(Q(r,16))Y(e+1,Q(r,32)?21:20,W(e)),g(r,e);else if(78===r)p(e,24);else if(79===r)p(e,27);else if(80===r)p(e,28);else if(Q(r,j)&&W(e))0===d(e+1)&&null!==(r=d(e+2))&&Q(r,j)&&W(e+2)&&Y(e+2,31,0);else{var U,X=0===e?null:d(e-1);if(23===r)switch(X){case 69:E(e-1,42);break;case 57:E(e-1,44);break;default:Q(X,j)&&E(e,18)}else 24===r&&Q(X,j)?E(e,19):60===X&&32===r?E(e,38):60===r?(U=d(e+1),Q(U,32)||null===U||E(e,63)):(72===r&&(U=d(e+1),Q(U,32)&&null!==U||(E(e,75),r=75)),Q(r,1)&&32===X?E(e,r-12):Q(r,1)||g(r,e),69!==r&&57!==r||0>8),e++}}{var w=l,R=u,S=a;for(let e=0;null!==w(e);e++)if(Q(w(e),256)){for(var L,k=e;1<--e&&!Q(w(e),j););if(0===e)break;for(;e>1)+L+1))}let r=-1,t;for(;null!==(t=w(++r));){let e=r;if(Q(t,j))t=w(++e),Q(t,64)?(i=null===t?65:B[t],P(i,4)?(f=S(r),R(r,(f>>2)+f+1)):P(i,1)&&(f=S(r),R(r,f-(f>>3)))):18!==t&&19!==t||!Q(w(++e),64)||R(r,S(r)-1);else if(Q(t,2048))null!==(t=w(++e))&&Q(t,2)&&(R(e,6),R(e-1,5));else if(Q(t,2)){for(;0===(t=w(++e)););null!==t&&Q(t,2)&&(R(e,1+(S(e)>>1)),R(r,1+(S(r)>>1)))}else 0e?[e,0|A[r],0|s[r]]:null).filter(e=>e)})())&&((e,r,t,l,n)=>{n=255&(i.speed||72),r=((e,r,t,l,n)=>{const[o,a,i,f]=((t,l,n)=>{var e=(e,r,t)=>{var l=r;r<30?r=0:r-=30;let n;for(;127===(n=t[r]);)++r;for(;r!==l;)for(n+=e,t[r]=255&n;++r!==l&&255===t[r];);};let o=[],a=[[],[],[]],i=[[],[],[]],f=[],H=0;for(let r=0;r>8&255,i[2][H]=h[u]>>16&255,f[H]=I[u],o[H]=t+s&255,H++}return[o,a,i,f]})(r,e,((r,t)=>{var l=(e,r)=>(e*r>>8&255)<<1;let n=[[],[],[]];s.map((e,r)=>{n[0][r]=255&e,n[1][r]=e>>8&255,n[2][r]=e>>16&255});for(let e=5;e<30;e++)n[0][e]=l(r,n[0][e]),n[1][e]=l(t,n[1][e]);for(let e=48;e<54;e++)n[0][e]=l(r,n[0][e]),n[1][e]=l(t,n[1][e]);return n})(t,l));if(r=((r,e,t,l)=>{let H=[r,e[0],e[1],e[2],t[0],t[1],t[2]],u=(e,r)=>H[e][r];var n=(r,t,l,e)=>{var n=e<0,o=Math.abs(e)%r,a=e/r|0;let i=0,f=r;for(;0<--f;){let e=u(t,l)+a;(i+=o)>=r&&(i-=r,n?e--:e&&e++),H[t][++l]=e,e+=a}};let o,a,i=0;for(let e=0;e>1)+(A=l[e+1][1]>>1),0,v,r[i+A]-r[i-I]);for(let e=1;e<7;e++){var N=u(e,h)-u(e,v);n(T,e,v,N)}}}return i+l[l.length-1][1]})(o,a,i,e),!n)for(let e=0;e>1;var H=[0,1,2,2,2,3,3,4,4,5,6,8,9,11,13,15];for(let e=i[0].length-1;0<=e;e--)i[0][e]=H[i[0][e]],i[1][e]=H[i[1][e]],i[2][e]=H[i[2][e]];return[r,a,o,i,f]})(e,r=void 0===r?64:255&r,t=void 0===t?128:255&t,l=void 0===l?128:255&l,i.singmode||!1);let o=(e=>{let t=new Uint8Array(e),l=0,n=0,o=(e,r)=>{r=16*(15&r),o.ary(e,[r,r,r,r,r])};return o.ary=(e,r)=>{if(((l+=[[162,167,167,127,128],[226,60,60,0,0],[225,60,59,0,0],[200,0,0,54,55],[199,0,0,54,54]][n][e])/50|0)>t.length)throw new Error;n=e;for(let e=0;e<5;e++)t[(l/50|0)+e]=r[e]},o.get=()=>t.slice(0,l/50|0),o})(176.4*e.reduce((e,r)=>e+r[1],0)*n|0);var[t,l,e,r,a]=r;return((e,r,t,o,l,a,n)=>{let i=t,f=0,H=0,u=0,s=0,A=0,I=l[0],h=.75*I|0;for(;r;){var v=n[A];if(0!=(248&v))s=d(e,s,v,l[255&A]),A+=2,r-=2,i=t;else{{let r=[],t=256*f,l=256*H,n=256*u;for(let e=0;e<5;e++){var T=W(255&t>>8),N=W(255&l>>8),c=(255&n>>8)<129?-112:112,T=(T*(15&a[0][A])+N*(15&a[1][A])+c*(15&a[2][A]))/32+128;r[e]=0|T,t+=256*o[0][A]/4,l+=256*o[1][A]/4,n+=256*o[2][A]/4}e.ary(0,r)}if(0==--i){if(A++,0==--r)return;i=t}if(0!=--I){if(0!=--h||0===v){f+=o[0][A],H+=o[1][A],u+=o[2][A];continue}s=d(e,s,v,l[255&A])}}I=l[A],h=.75*I|0,f=0,H=0,u=0}})(o,t,n,l,e,r,a),o.get()})(e,i.pitch,i.mouth,i.throat);if(!1===e)return!1;{var t=e;let r=new Float32Array(t.length);for(let e=0;e{let t=a.createBufferSource(),l=a.createBuffer(1,i.length,22050),n=l.getChannelData(0);for(let e=0;e{e(!0)},o=e=>{t.disconnect(),r(e)},t.start(0)});e.abort=o,e}}}),f=(t.onkeydown=e=>{13===e.keyCode&&(e.preventDefault(),f(parseInt(t.value))&&(l.innerText="\n"+l.innerText.split("\n").pop(),o(t),n(r)),t.value="")},e=>{if(100{if(10<=e&&e<20)return N[e-10];let r,t="";return 0<=(r=Math.floor(e/10)-2)&&(t+=g[r]),(r=e%10)&&(t+=" "+T[r-1]),t})(e);return e>a+25?(i(r+" IHZ MAH3CH TUW5 /HAY6.",e+" is much too high."),!1):e>a+5?(i(r+" IHZ TUW3 /HAY6.",e+" is too high."),!1):e>a?(i(r+" IHZ AH LIH3TUL TUW4 /HAY6,",e+" is a little too high."),!1):e0!=(e&t),H=null,R="*12345678".split(""),S=" *.*?*,*-*IYIHEHAEAAAHAOUHAXIXERUXOHRXLXWXYXWHR*L*W*Y*M*N*NXDXQ*S*SHF*TH/H/XZ*ZHV*DHCH**J*******EYAYOYAWOWUWB*****D*****G*****GX****P*****T*****K*****KX****ULUMUN".match(/.{1,2}/g),L=[32768,49408,49408,49408,49408,164,164,164,164,164,164,132,132,164,164,132,132,132,132,132,132,132,68,4164,4164,4164,4164,2124,3148,2124,1096,16460,9280,8256,8256,9280,64,64,9284,8260,8260,9284,8264,8256,76,8260,0,0,180,180,180,148,148,148,78,78,78,1102,1102,1102,78,78,78,78,78,78,75,75,75,1099,1099,1099,75,75,75,75,75,75,128,193,193],O=[0,4626,4626,4626,2056,2824,2312,2824,3592,3851,2822,4108,3082,1541,1541,3595,3082,3594,3082,2825,2056,2055,2825,2567,2310,2056,2054,2055,2055,2055,770,1285,514,514,514,514,514,514,1542,1542,2055,1542,1542,514,2312,1027,513,286,3597,3852,3852,3852,3598,3593,2054,513,514,1797,513,257,1798,513,514,1798,513,514,2056,514,514,1540,514,514,1798,513,1028,1798,257,1028,1479,1535],y=(e,t)=>w(L[e],t),M=128,u=[24,26,23,23,23],A=[0,224,230,236,243,249,0,6,12,6],E=[0,31,31,31,31,2,2,2,2,2,2,2,2,2,5,5,2,10,2,8,5,5,11,10,9,8,8,160,8,8,23,31,18,18,18,18,30,30,20,20,20,20,23,23,26,26,29,29,2,2,2,2,2,2,26,29,27,26,29,27,26,29,27,26,29,27,23,29,23,23,29,23,23,29,23,23,29,23,23,23],d=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,2,4,4,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,0,1,0,5,5,5,5,5,4,4,2,0,1,2,0,1,2,0,1,2,0,1,2,0,2,2,0,1,3,0,2,3,0,2,160,160],v=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,4,4,3,3,3,3,3,1,2,3,2,1,3,3,3,3,1,1,3,3,3,2,2,3,2,3,0,0,5,5,5,5,4,4,2,0,2,2,0,3,2,0,4,2,0,3,2,0,2,2,0,2,3,0,3,3,0,3,176,160],I=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,226,211,187,124,149,1,2,3,3,0,114,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,25,0,0,0,0,0,0,0,0,0],s=[0,5980947,5980947,5980947,5980947,7230474,6113550,5980947,5783320,5842971,5712919,5775125,5383440,5844244,6113550,4075794,5383182,5774866,4076306,7218448,5250317,6112527,5904395,3944978,7216654,5904395,7230217,5320198,7943686,6641158,7943686,5980945,6506758,6967046,5315078,7946758,6113550,5383440,6107913,6767114,4990984,6106890,6639366,6639366,7946758,6639365,7958022,0,5916691,5777179,5775125,5778203,5774866,5382669,5315078,5315078,5315078,7946758,7946758,7946758,7368198,7237126,7237126,6181894,6181894,6181894,5315078,5315078,5315078,7946758,7946758,7946758,6647046,6641162,7367946,6181894,6181894,6181894,556844,98067],h=[0,0,0,0,0,526861,461581,527630,527887,68879,68623,3087,68367,2316,461581,330508,68623,3087,396301,67597,2061,461838,2061,330252,67597,2061,526861,780,2313,198153,0,0,0,0,0,0,0,0,779,66827,779,1035,0,0,1,66827,920064,66050,593422,68879,3087,68879,3087,2061,2,260,0,2,260,0,1,260,0,1,260,0,0,0,0,0,0,0,0,461324,0,0,330240,0,1245199,1048591],T=[56,132,107,25,198,99,24,134,115,152,198,177,28,202,49,140,199,49,136,194,48,152,70,49,24,198,53,12,202,49,12,198,33,16,36,105,18,194,49,20,196,113,8,74,34,73,171,106,168,172,73,81,50,213,82,136,147,108,148,34,21,84,210,37,150,212,80,165,70,33,8,133,107,24,196,99,16,206,107,24,140,113,25,140,99,53,12,198,51,153,204,108,181,78,162,153,70,33,40,130,149,46,227,48,156,197,48,156,162,177,156,103,49,136,102,89,44,83,24,132,103,80,202,227,10,172,171,48,172,98,48,140,99,16,148,98,177,140,130,40,150,51,152,214,181,76,98,41,165,74,181,156,198,49,20,214,56,156,75,180,134,101,24,174,103,28,166,99,25,150,35,25,132,19,8,166,82,172,202,34,137,110,171,25,140,98,52,196,98,25,134,99,24,196,35,88,214,163,80,66,84,74,173,74,37,17,107,100,137,74,99,57,138,35,49,42,234,162,169,68,197,18,205,66,52,140,98,24,140,99,17,72,102,49,157,68,51,29,70,49,156,198,177,12,205,50,136,196,115,24,134,115,8,214,99,88,7,129,224,240,60,7,135,144,60,124,15,199,192,192,240,124,30,7,128,128,0,28,120,112,241,199,31,192,12,254,28,31,31,14,10,122,192,113,242,131,143,3,15,15,12,0,121,248,97,224,67,15,131,231,24,249,193,19,218,233,99,143,15,131,131,135,195,31,60,112,240,225,225,227,135,184,113,14,32,227,141,72,120,28,147,135,48,225,193,193,228,120,33,131,131,195,135,6,57,229,195,135,7,14,28,28,112,244,113,156,96,54,50,195,30,60,243,143,14,60,112,227,199,143,15,15,14,60,120,240,227,135,6,240,227,7,193,153,135,15,24,120,112,112,252,243,16,177,140,140,49,124,112,225,134,60,100,108,176,225,227,15,35,143,15,30,62,56,60,56,123,143,7,14,60,244,23,30,60,120,242,158,114,73,227,37,54,56,88,57,226,222,60,120,120,225,199,97,225,225,176,240,240,195,199,14,56,192,240,206,115,115,24,52,176,225,199,142,28,60,248,56,240,225,193,139,134,143,28,120,112,240,120,172,177,143,57,49,219,56,97,195,14,14,56,120,115,23,30,57,30,56,100,225,241,193,78,15,64,162,2,197,143,129,161,252,18,8,100,224,60,34,224,69,7,142,12,50,144,240,31,32,73,224,248,12,96,240,23,26,65,170,164,208,141,18,130,30,30,3,248,62,3,12,115,128,112,68,38,3,36,225,62,4,78,4,28,193,9,204,158,144,33,7,144,67,100,192,15,198,144,156,193,91,3,226,29,129,224,94,29,3,132,184,44,15,128,177,131,224,48,65,30,67,137,131,80,252,36,46,19,131,241,124,76,44,201,13,131,176,181,130,228,232,6,156,7,160,153,29,7,62,130,143,112,48,116,64,202,16,228,232,15,146,20,63,6,248,132,136,67,129,10,52,57,65,198,227,28,71,3,176,184,19,10,194,100,248,24,249,96,179,192,101,32,96,166,140,195,129,32,48,38,30,28,56,211,1,176,38,64,244,11,195,66,31,133,50,38,96,64,201,203,1,236,17,40,64,250,4,52,224,112,76,140,29,7,105,3,22,200,4,35,232,198,154,11,26,3,224,118,6,5,207,30,188,88,49,113,102,0,248,63,4,252,12,116,39,138,128,113,194,58,38,6,192,31,5,15,152,64,174,1,127,192,7,255,0,14,254,0,3,223,128,3,239,128,27,241,194,0,231,224,24,252,224,33,252,128,60,252,64,14,126,0,63,62,0,15,254,0,31,255,0,62,240,7,252,0,126,16,63,255,0,63,56,14,124,1,135,12,252,199,0,62,4,15,62,31,15,15,31,15,2,131,135,207,3,135,15,63,192,7,158,96,63,192,3,254,0,63,224,119,225,192,254,224,195,224,1,223,248,3,7,0,126,112,0,124,56,24,254,12,30,120,28,124,62,14,31,30,30,62,0,127,131,7,219,135,131,7,199,7,16,113,255,0,63,226,1,224,193,195,225,0,127,192,5,240,32,248,240,112,254,120,121,248,2,63,12,143,3,15,159,224,193,199,135,3,195,195,176,225,225,193,227,224,113,240,0,252,112,124,12,62,56,14,28,112,195,199,3,129,193,199,231,0,15,199,135,25,9,239,196,51,224,193,252,248,112,240,120,248,240,97,199,0,31,248,1,124,248,240,120,112,60,124,206,14,33,131,207,8,7,143,8,193,135,143,128,199,227,0,7,248,224,239,0,57,247,128,14,248,225,227,248,33,159,192,255,3,248,7,192,31,248,196,4,252,196,193,188,135,240,15,192,127,5,224,37,236,192,62,132,71,240,142,3,248,3,251,192,25,248,7,156,12,23,248,7,224,31,161,252,15,252,1,240,63,0,254,3,240,31,0,253,0,255,136,13,249,1,255,0,112,7,192,62,66,243,13,196,127,128,252,7,240,94,192,63,0,120,63,129,255,1,248,1,195,232,12,228,100,143,228,15,240,7,240,194,31,0,127,192,111,128,126,3,248,7,240,63,192,120,15,130,7,254,34,119,112,2,118,3,254,0,254,103,0,124,199,241,142,198,59,224,63,132,243,25,216,3,153,252,9,184,15,248,0,157,36,97,249,13,0,253,3,240,31,144,63,1,248,31,208,15,248,55,1,248,7,240,15,192,63,0,254,3,248,15,192,63,0,250,3,240,15,128,255,1,184,7,240,1,252,1,188,128,19,30,0,127,225,64,127,160,127,176,0,63,192,31,192,56,15,240,31,128,255,1,252,3,241,126,1,254,1,240,255,0,127,192,29,7,240,15,192,126,6,224,7,224,15,248,6,193,254,1,252,3,224,15,0,252],g=(i,t,e,r)=>{let l=(7&e)-1,f=256*l&65535,a=248&e,n=(e,t,r,l)=>{let n=8,o=T[f+a];for(;0!=(128&o)?i(e,t):i(r,l),o<<=1,--n;);};if(0===a){let e=r>>4^255;for(a=255&t;n(3,26,4,6),a++,a&=255,255&++e;);return a}a^=255;for(var o=255&u[l];n(2,5,1,o),255&++a;);return t},W=e=>127*Math.sin(2*Math.PI*(e/256))|0,N=["WAHN","TUW5","THRIY5","FOHR5","FAY5V","SIH5KS","SEH5VUN","EY5T","NAY5N"],Y=["TEH4N","IHLEH4VIXN","TWEH4LV","THER4TIY6N","FOH4RTIY6N","FIH4FTIY6N","SIH4KSTIY6N","SEH4VUNTIY6N","EY4TIY6N","NAY4NTIY6N"],c=["TWEHNTIY","THERTIY","FOHRTIY","FIH4FTIY6","SIHKSTIY6","SEH4VUNTIY6","EY4T1Y6","NAY4NTIY6"];module.exports=e=>{let l=e.ownerDocument.createElement("pre"),t=e.ownerDocument.createElement("button"),r=e.ownerDocument.createElement("input"),n=e=>e.style.display="inline-block",o=e=>e.style.display="none",i,f=(e.appendChild(l),e.appendChild(t),e.appendChild(r),o(r),t.type="button",t.innerText="Start game",t.addEventListener("click",()=>{l.textContent="",i=Math.floor(99*Math.random()+1),f("GEH3S DHAX NAH4MBER BIXTWIY5N WAH4N Q AEND WAHN /HAH4NDRIHD"),o(t),n(r)}),(e,t)=>{let r=e;for(;r.length<256;)r+=" ";if(t&&(l.innerText+="\n"+t),!1===(e=!1!==(t=function(e,t){var u=1{if(!e)return!1;let i=e=>e===s.length?null:s[e],n=(t,e,r,l)=>{for(let e=s.length-1;e>=t;e--)s[e+1]=s[e],u[e+1]=f(e),H[e+1]=o(e);s[t]=e,u[t]=0|l,H[t]=r},o=e=>0|H[e],f=e=>0|u[e],a=(e,t)=>{u[e]=t},H=[],u=[],s=[],A=0;var l,I,h,T,N,Y=e,c=e=>{H[A]=0,u[A]=0,s[A++]=e};for(let l=0;l{var e=S.findIndex(e=>e===t+r&&"*"!==e[1]);return-1!==e&&e})(e,t)))l++,c(r);else if(!1!==(r=(t=>{var e=S.findIndex(e=>e===t+"*");return-1!==e&&e})(e)))c(r);else{for(r=R.length;e!==R[r]&&0{s[e]=t},v=i,g=o;let e=(e,t)=>{switch(e){case 53:y(v(t-1),1024)&&d(t,16);break;case 42:E(t+1,43,g(t));break;case 44:E(t+1,45,g(t))}},t=(e,t)=>{d(e,13),E(e+1,t,g(e))},r=-1,l;for(;null!==(l=v(++r));)if(0!==l)if(y(l,16))E(r+1,y(l,32)?21:20,g(r)),e(l,r);else if(78===l)t(r,24);else if(79===l)t(r,27);else if(80===l)t(r,28);else if(y(l,M)&&g(r))0===v(r+1)&&null!==(l=v(r+2))&&y(l,M)&&g(r+2)&&E(r+2,31,0);else{var W,p=0===r?null:v(r-1);if(23===l)switch(p){case 69:d(r-1,42);break;case 57:d(r-1,44);break;default:y(p,M)&&d(r,18)}else 24===l&&y(p,M)?d(r,19):60===p&&32===l?d(r,38):60===l?(W=v(r+1),y(W,32)||null===W||d(r,63)):(72===l&&(W=v(r+1),y(W,32)&&null!==W||(d(r,75),l=75)),y(l,1)&&32===p?d(r,l-12):y(l,1)||e(l,r),69!==l&&57!==l||0>8),l++}}{var X=i,D=a,m=f;for(let e=0;null!==X(e);e++)if(y(X(e),256)){for(var t,r=e;1<--e&&!y(X(e),M););if(0===e)break;for(;e>1)+t+1))}let n=-1,o;for(;null!==(o=X(++n));){let e=n,t,r,l;if(y(o,M))o=X(++e),y(o,64)?(t=null===o?65:L[o],w(t,4)?(l=m(n),D(n,(l>>2)+l+1)):w(t,1)&&(r=m(n),D(n,r-(r>>3)))):18!==o&&19!==o||!y(X(++e),64)||D(n,m(n)-1);else if(y(o,2048))null!==(o=X(++e))&&y(o,2)&&(D(e,6),D(e-1,5));else if(y(o,2)){for(;0===(o=X(++e)););null!==o&&y(o,2)&&(D(e,1+(m(e)>>1)),D(n,1+(m(n)>>1)))}else 0e?[e,0|u[t],0|H[t]]:null).filter(e=>e)})();return!1!==t&&((e,o,i,f,t)=>{t=255&(u.speed||72);var[r,l,n,a,H]=((e,t)=>{var[r,Y,c,l]=((r,l,n)=>{let e=(e,t,r)=>{var l=t;t<30?t=0:t-=30;let n;for(;127===(n=r[t]);)++t;for(;t!==l;)for(n+=e,r[t]=255&n;++t!==l&&255===r[t];);},o=[],i=[[],[],[]],f=[[],[],[]],a=[],H=0;for(let t=0;t>8&255,f[2][H]=h[u]>>16&255,a[H]=I[u],o[H]=r+s&255,H++}return[o,i,f,a]})(void 0===o?64:255&o,e,((t,r)=>{let l=(e,t)=>(e*t>>8&255)<<1,n=[[],[],[]];s.map((e,t)=>{n[0][t]=255&e,n[1][t]=e>>8&255,n[2][t]=e>>16&255});for(let e=5;e<30;e++)n[0][e]=l(t,n[0][e]),n[1][e]=l(r,n[1][e]);for(let e=48;e<54;e++)n[0][e]=l(t,n[0][e]),n[1][e]=l(r,n[1][e]);return n})(void 0===i?128:255&i,void 0===f?128:255&f)),e=((t,r)=>{let H=[t,Y[0],Y[1],Y[2],c[0],c[1],c[2]],u=(e,t)=>H[e][t],l=(t,r,l,e)=>{let n=e<0,o=Math.abs(e)%t,i=e/t|0,f=0,a=t;for(;0<--a;){let e=u(r,l)+i;(f+=o)>=t&&(f-=t,n?e--:e&&e++),H[r][++l]=e,e+=i}},n,o,i=0;for(let e=0;e>1)+(s=r[e+1][1]>>1),0,h,t[i+s]-t[i-A]);for(let e=1;e<7;e++){var N=u(e,I)-u(e,h);l(T,e,h,N)}}}return i+r[r.length-1][1]})(r,e);if(!t)for(let e=0;e>1;var n=[0,1,2,2,2,3,3,4,4,5,6,8,9,11,13,15];for(let e=c[0].length-1;0<=e;e--)c[0][e]=n[c[0][e]],c[1][e]=n[c[1][e]],c[2][e]=n[c[2][e]];return[e,Y,r,c,l]})(e,u.singmode||!1);return((e,t,r,o,l,i,n)=>{let f=r,a=0,H=0,u=0,s=0,A=0,I=l[0],h=.75*I|0;for(;t;){var T=n[A];if(0!=(248&T))s=g(e,s,T,l[255&A]),A+=2,t-=2,f=r;else{{let t=[],r=256*a,l=256*H,n=256*u;for(let e=0;e<5;e++){var N=W(255&r>>8),Y=W(255&l>>8),c=(255&n>>8)<129?-112:112,N=(N*(15&i[0][A])+Y*(15&i[1][A])+c*(15&i[2][A]))/32+128;t[e]=0|N,r+=256*o[0][A]/4,l+=256*o[1][A]/4,n+=256*o[2][A]/4}e.ary(0,t)}if(0==--f){if(A++,0==--t)return;f=r}if(0!=--I){if(0!=--h||0===T){a+=o[0][A],H+=o[1][A],u+=o[2][A];continue}s=g(e,s,T,l[255&A])}}I=l[A],h=.75*I|0,a=0,H=0,u=0}})(e=(e=>{let r=new Uint8Array(e),l=0,n=0,o=(e,t)=>{t=16*(15&t),o.ary(e,[t,t,t,t,t])};return o.ary=(e,t)=>{if(((l+=[[162,167,167,127,128],[226,60,60,0,0],[225,60,59,0,0],[200,0,0,54,55],[199,0,0,54,54]][n][e])/50|0)>r.length)throw new Error;n=e;for(let e=0;e<5;e++)r[(l/50|0)+e]=t[e]},o.get=()=>r.slice(0,l/50|0),o})(176.4*e.reduce((e,t)=>e+t[1],0)*t|0),r,t,l,n,a,H),e.get()})(t,u.pitch,u.mouth,u.throat)}(e,void 0))&&(t=>{var r=new Float32Array(t.length);for(let e=0;e{let r=i.createBufferSource(),l=i.createBuffer(1,f.length,22050),n=l.getChannelData(0);for(let e=0;e{e(!0)},o=e=>{r.disconnect(),t(e)},r.start(0)});e.abort=o}}}),a=(r.onkeydown=e=>{13===e.keyCode&&(e.preventDefault(),a(parseInt(r.value))&&(l.innerText="\n"+l.innerText.split("\n").pop(),o(r),n(t)),r.value="")},e=>{var t;return 100{if(10<=e&&e<20)return Y[e-10];let t,r="";return 0<=(t=Math.floor(e/10)-2)&&(r+=c[t]),(t=e%10)&&(r+=" "+N[t-1]),r})(e),e>i+25?(f(t+" IHZ MAH3CH TUW5 /HAY6.",e+" is much too high."),!1):e>i+5?(f(t+" IHZ TUW3 /HAY6.",e+" is too high."),!1):e>i?(f(t+" IHZ AH LIH3TUL TUW4 /HAY6,",e+" is a little too high."),!1):e { * * @return {Promise} */ - let Play = (context, audiobuffer) => { let abort; let promise = new Promise((resolve, reject) => { let source = context.createBufferSource(); let soundBuffer = context.createBuffer(1, audiobuffer.length, 22050); let buffer = soundBuffer.getChannelData(0); - for (let i = 0; i < audiobuffer.length; i++) { buffer[i] = audiobuffer[i]; } - source.buffer = soundBuffer; source.connect(context.destination); - source.onended = () => { resolve(true); }; - abort = reason => { source.disconnect(); reject(reason); }; - source.start(0); }); promise.abort = abort; return promise; }; - let context = null; + /** * Play an audio buffer. * @@ -64,20 +58,18 @@ let context = null; * * @return {Promise} */ - let PlayBuffer = audiobuffer => { if (null === context) { context = new AudioContext(); } - if (!context) { { throw new Error('No player available!'); } } - return Play(context, audiobuffer); }; + /** * Convert a Uint8Array wave buffer to a Float32Array WaveBuffer * @@ -85,100 +77,178 @@ let PlayBuffer = audiobuffer => { * * @return {Float32Array} */ - let Uint8ArrayToFloat32Array = buffer => { let audio = new Float32Array(buffer.length); - for (let i = 0; i < buffer.length; i++) { audio[i] = (buffer[i] - 128) / 256; } - return audio; }; let StressTable = '*12345678'.split(''); -let PhonemeNameTable = (' *' + // 00 -'.*' + // 01 -'?*' + // 02 -',*' + // 03 -'-*' + // 04 -'IY' + // 05 -'IH' + // 06 -'EH' + // 07 -'AE' + // 08 -'AA' + // 09 -'AH' + // 10 -'AO' + // 11 -'UH' + // 12 -'AX' + // 13 -'IX' + // 14 -'ER' + // 15 -'UX' + // 16 -'OH' + // 17 -'RX' + // 18 -'LX' + // 19 -'WX' + // 20 -'YX' + // 21 -'WH' + // 22 -'R*' + // 23 -'L*' + // 24 -'W*' + // 25 -'Y*' + // 26 -'M*' + // 27 -'N*' + // 28 -'NX' + // 29 -'DX' + // 30 -'Q*' + // 31 -'S*' + // 32 -'SH' + // 33 -'F*' + // 34 -'TH' + // 35 -'/H' + // 36 -'/X' + // 37 -'Z*' + // 38 -'ZH' + // 39 -'V*' + // 40 -'DH' + // 41 -'CH' + // 42 -'**' + // 43 -'J*' + // 44 -'**' + // 45 -'**' + // 46 -'**' + // 47 -'EY' + // 48 -'AY' + // 49 -'OY' + // 50 -'AW' + // 51 -'OW' + // 52 -'UW' + // 53 -'B*' + // 54 -'**' + // 55 -'**' + // 56 -'D*' + // 57 -'**' + // 58 -'**' + // 59 -'G*' + // 60 -'**' + // 61 -'**' + // 62 -'GX' + // 63 -'**' + // 64 -'**' + // 65 -'P*' + // 66 -'**' + // 67 -'**' + // 68 -'T*' + // 69 -'**' + // 70 -'**' + // 71 -'K*' + // 72 -'**' + // 73 -'**' + // 74 -'KX' + // 75 -'**' + // 76 -'**' + // 77 -'UL' + // 78 -'UM' + // 79 +let PhonemeNameTable = (' *' + +// 00 +'.*' + +// 01 +'?*' + +// 02 +',*' + +// 03 +'-*' + +// 04 +'IY' + +// 05 +'IH' + +// 06 +'EH' + +// 07 +'AE' + +// 08 +'AA' + +// 09 +'AH' + +// 10 +'AO' + +// 11 +'UH' + +// 12 +'AX' + +// 13 +'IX' + +// 14 +'ER' + +// 15 +'UX' + +// 16 +'OH' + +// 17 +'RX' + +// 18 +'LX' + +// 19 +'WX' + +// 20 +'YX' + +// 21 +'WH' + +// 22 +'R*' + +// 23 +'L*' + +// 24 +'W*' + +// 25 +'Y*' + +// 26 +'M*' + +// 27 +'N*' + +// 28 +'NX' + +// 29 +'DX' + +// 30 +'Q*' + +// 31 +'S*' + +// 32 +'SH' + +// 33 +'F*' + +// 34 +'TH' + +// 35 +'/H' + +// 36 +'/X' + +// 37 +'Z*' + +// 38 +'ZH' + +// 39 +'V*' + +// 40 +'DH' + +// 41 +'CH' + +// 42 +'**' + +// 43 +'J*' + +// 44 +'**' + +// 45 +'**' + +// 46 +'**' + +// 47 +'EY' + +// 48 +'AY' + +// 49 +'OY' + +// 50 +'AW' + +// 51 +'OW' + +// 52 +'UW' + +// 53 +'B*' + +// 54 +'**' + +// 55 +'**' + +// 56 +'D*' + +// 57 +'**' + +// 58 +'**' + +// 59 +'G*' + +// 60 +'**' + +// 61 +'**' + +// 62 +'GX' + +// 63 +'**' + +// 64 +'**' + +// 65 +'P*' + +// 66 +'**' + +// 67 +'**' + +// 68 +'T*' + +// 69 +'**' + +// 70 +'**' + +// 71 +'K*' + +// 72 +'**' + +// 73 +'**' + +// 74 +'KX' + +// 75 +'**' + +// 76 +'**' + +// 77 +'UL' + +// 78 +'UM' + +// 79 'UN' // 80 ).match(/.{1,2}/g); + /** * Flags for phoneme names. * @@ -233,89 +303,169 @@ let PhonemeNameTable = (' *' + // 00 * 'P*', '**', '**', 'T*', '**', '**', 'K*', '**', '**', 'KX', '**', * '**', 'UM', 'UN' */ - -let phonemeFlags = [0 | 0x8000, // ' *' 00 -0 | 0x8000 | 0x4000 | 0x0100, // '.*' 01 -0 | 0x8000 | 0x4000 | 0x0100, // '?*' 02 -0 | 0x8000 | 0x4000 | 0x0100, // ',*' 03 -0 | 0x8000 | 0x4000 | 0x0100, // '-*' 04 -0 | 0x0080 | 0x0020 | 0x0004, // 'IY' 05 -0 | 0x0080 | 0x0020 | 0x0004, // 'IH' 06 -0 | 0x0080 | 0x0020 | 0x0004, // 'EH' 07 -0 | 0x0080 | 0x0020 | 0x0004, // 'AE' 08 -0 | 0x0080 | 0x0020 | 0x0004, // 'AA' 09 -0 | 0x0080 | 0x0020 | 0x0004, // 'AH' 10 -0 | 0x0080 | 0x0004, // 'AO' 11 -0 | 0x0080 | 0x0004, // 'UH' 12 -0 | 0x0080 | 0x0020 | 0x0004, // 'AX' 13 -0 | 0x0080 | 0x0020 | 0x0004, // 'IX' 14 -0 | 0x0080 | 0x0004, // 'ER' 15 -0 | 0x0080 | 0x0004, // 'UX' 16 -0 | 0x0080 | 0x0004, // 'OH' 17 -0 | 0x0080 | 0x0004, // 'RX' 18 -0 | 0x0080 | 0x0004, // 'LX' 19 -0 | 0x0080 | 0x0004, // 'WX' 20 -0 | 0x0080 | 0x0004, // 'YX' 21 -0 | 0x0040 | 0x0004, // 'WH' 22 -0 | 0x1000 | 0x0040 | 0x0004, // 'R*' 23 -0 | 0x1000 | 0x0040 | 0x0004, // 'L*' 24 -0 | 0x1000 | 0x0040 | 0x0004, // 'W*' 25 -0 | 0x1000 | 0x0040 | 0x0004, // 'Y*' 26 -0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, // 'M*' 27 -0 | 0x0800 | 0x0400 | 0x0040 | 0x0008 | 0x0004, // 'N*' 28 -0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, // 'NX' 29 -0 | 0x0400 | 0x0040 | 0x0008, // 'DX' 30 -0 | 0x4000 | 0x0040 | 0x0008 | 0x0004, // 'Q*' 31 -0 | 0x2000 | 0x0400 | 0x0040, // 'S*' 32 -0 | 0x2000 | 0x0040, // 'SH' 33 -0 | 0x2000 | 0x0040, // 'F*' 34 -0 | 0x2000 | 0x0400 | 0x0040, // 'TH' 35 -0 | 0x0040, // '/H' 36 -0 | 0x0040, // '/X' 37 -0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, // 'Z*' 38 -0 | 0x2000 | 0x0040 | 0x0004, // 'ZH' 39 -0 | 0x2000 | 0x0040 | 0x0004, // 'V*' 40 -0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, // 'DH' 41 -0 | 0x2000 | 0x0040 | 0x0008, // 'CH' 42 -0 | 0x2000 | 0x0040, // '**' 43 -0 | 0x0040 | 0x0008 | 0x0004, // 'J*' 44 -0 | 0x2000 | 0x0040 | 0x0004, // '**' 45 -0, // '**' 46 -0, // '**' 47 -0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'EY' 48 -0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'AY' 49 -0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'OY' 50 -0 | 0x0080 | 0x0010 | 0x0004, // 'AW' 51 -0 | 0x0080 | 0x0010 | 0x0004, // 'OW' 52 -0 | 0x0080 | 0x0010 | 0x0004, // 'UW' 53 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'B*' 54 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 55 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 56 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'D*' 57 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 58 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 59 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'G*' 60 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 61 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 62 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'GX' 63 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 64 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 65 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'P*' 66 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 67 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 68 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'T*' 69 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 70 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 71 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'K*' 72 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 73 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 74 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'KX' 75 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 76 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 77 -0 | 0x0080, // 'UL' 78 -0 | 0x0080 | 0x0040 | 0x0001, // 'UM' 79 +let phonemeFlags = [0 | 0x8000, +// ' *' 00 +0 | 0x8000 | 0x4000 | 0x0100, +// '.*' 01 +0 | 0x8000 | 0x4000 | 0x0100, +// '?*' 02 +0 | 0x8000 | 0x4000 | 0x0100, +// ',*' 03 +0 | 0x8000 | 0x4000 | 0x0100, +// '-*' 04 +0 | 0x0080 | 0x0020 | 0x0004, +// 'IY' 05 +0 | 0x0080 | 0x0020 | 0x0004, +// 'IH' 06 +0 | 0x0080 | 0x0020 | 0x0004, +// 'EH' 07 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AE' 08 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AA' 09 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AH' 10 +0 | 0x0080 | 0x0004, +// 'AO' 11 +0 | 0x0080 | 0x0004, +// 'UH' 12 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AX' 13 +0 | 0x0080 | 0x0020 | 0x0004, +// 'IX' 14 +0 | 0x0080 | 0x0004, +// 'ER' 15 +0 | 0x0080 | 0x0004, +// 'UX' 16 +0 | 0x0080 | 0x0004, +// 'OH' 17 +0 | 0x0080 | 0x0004, +// 'RX' 18 +0 | 0x0080 | 0x0004, +// 'LX' 19 +0 | 0x0080 | 0x0004, +// 'WX' 20 +0 | 0x0080 | 0x0004, +// 'YX' 21 +0 | 0x0040 | 0x0004, +// 'WH' 22 +0 | 0x1000 | 0x0040 | 0x0004, +// 'R*' 23 +0 | 0x1000 | 0x0040 | 0x0004, +// 'L*' 24 +0 | 0x1000 | 0x0040 | 0x0004, +// 'W*' 25 +0 | 0x1000 | 0x0040 | 0x0004, +// 'Y*' 26 +0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, +// 'M*' 27 +0 | 0x0800 | 0x0400 | 0x0040 | 0x0008 | 0x0004, +// 'N*' 28 +0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, +// 'NX' 29 +0 | 0x0400 | 0x0040 | 0x0008, +// 'DX' 30 +0 | 0x4000 | 0x0040 | 0x0008 | 0x0004, +// 'Q*' 31 +0 | 0x2000 | 0x0400 | 0x0040, +// 'S*' 32 +0 | 0x2000 | 0x0040, +// 'SH' 33 +0 | 0x2000 | 0x0040, +// 'F*' 34 +0 | 0x2000 | 0x0400 | 0x0040, +// 'TH' 35 +0 | 0x0040, +// '/H' 36 +0 | 0x0040, +// '/X' 37 +0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, +// 'Z*' 38 +0 | 0x2000 | 0x0040 | 0x0004, +// 'ZH' 39 +0 | 0x2000 | 0x0040 | 0x0004, +// 'V*' 40 +0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, +// 'DH' 41 +0 | 0x2000 | 0x0040 | 0x0008, +// 'CH' 42 +0 | 0x2000 | 0x0040, +// '**' 43 +0 | 0x0040 | 0x0008 | 0x0004, +// 'J*' 44 +0 | 0x2000 | 0x0040 | 0x0004, +// '**' 45 +0, +// '**' 46 +0, +// '**' 47 +0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, +// 'EY' 48 +0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, +// 'AY' 49 +0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, +// 'OY' 50 +0 | 0x0080 | 0x0010 | 0x0004, +// 'AW' 51 +0 | 0x0080 | 0x0010 | 0x0004, +// 'OW' 52 +0 | 0x0080 | 0x0010 | 0x0004, +// 'UW' 53 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'B*' 54 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 55 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 56 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'D*' 57 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 58 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 59 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'G*' 60 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 61 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 62 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'GX' 63 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 64 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 65 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'P*' 66 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 67 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 68 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'T*' 69 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 70 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 71 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'K*' 72 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 73 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 74 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'KX' 75 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 76 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 77 +0 | 0x0080, +// 'UL' 78 +0 | 0x0080 | 0x0040 | 0x0001, +// 'UM' 79 0 | 0x0080 | 0x0040 | 0x0001 // 'UN' 80 ]; + /** * Combined table of phoneme length. * @@ -325,88 +475,167 @@ let phonemeFlags = [0 | 0x8000, // ' *' 00 * phonemeLengthTable[i] = combinedPhonemeLengthTable[i] & 0xFF * phonemeStressedLengthTable[i] = combinedPhonemeLengthTable[i] >> 8 */ - -let combinedPhonemeLengthTable = [0x0000 | 0x0000, // ' *' 00 -0x0012 | 0x1200, // '.*' 01 -0x0012 | 0x1200, // '?*' 02 -0x0012 | 0x1200, // ',*' 03 -0x0008 | 0x0800, // '-*' 04 -0x0008 | 0x0B00, // 'IY' 05 -0x0008 | 0x0900, // 'IH' 06 -0x0008 | 0x0B00, // 'EH' 07 -0x0008 | 0x0E00, // 'AE' 08 -0x000B | 0x0F00, // 'AA' 09 -0x0006 | 0x0B00, // 'AH' 10 -0x000C | 0x1000, // 'AO' 11 -0x000A | 0x0C00, // 'UH' 12 -0x0005 | 0x0600, // 'AX' 13 -0x0005 | 0x0600, // 'IX' 14 -0x000B | 0x0E00, // 'ER' 15 -0x000A | 0x0C00, // 'UX' 16 -0x000A | 0x0E00, // 'OH' 17 -0x000A | 0x0C00, // 'RX' 18 -0x0009 | 0x0B00, // 'LX' 19 -0x0008 | 0x0800, // 'WX' 20 -0x0007 | 0x0800, // 'YX' 21 -0x0009 | 0x0B00, // 'WH' 22 -0x0007 | 0x0A00, // 'R*' 23 -0x0006 | 0x0900, // 'L*' 24 -0x0008 | 0x0800, // 'W*' 25 -0x0006 | 0x0800, // 'Y*' 26 -0x0007 | 0x0800, // 'M*' 27 -0x0007 | 0x0800, // 'N*' 28 -0x0007 | 0x0800, // 'NX' 29 -0x0002 | 0x0300, // 'DX' 30 -0x0005 | 0x0500, // 'Q*' 31 -0x0002 | 0x0200, // 'S*' 32 -0x0002 | 0x0200, // 'SH' 33 -0x0002 | 0x0200, // 'F*' 34 -0x0002 | 0x0200, // 'TH' 35 -0x0002 | 0x0200, // '/H' 36 -0x0002 | 0x0200, // '/X' 37 -0x0006 | 0x0600, // 'Z*' 38 -0x0006 | 0x0600, // 'ZH' 39 -0x0007 | 0x0800, // 'V*' 40 -0x0006 | 0x0600, // 'DH' 41 -0x0006 | 0x0600, // 'CH' 42 -0x0002 | 0x0200, // '**' 43 -0x0008 | 0x0900, // 'J*' 44 -0x0003 | 0x0400, // '**' 45 -0x0001 | 0x0200, // '**' 46 -0x001E | 0x0100, // '**' 47 -0x000D | 0x0E00, // 'EY' 48 -0x000C | 0x0F00, // 'AY' 49 -0x000C | 0x0F00, // 'OY' 50 -0x000C | 0x0F00, // 'AW' 51 -0x000E | 0x0E00, // 'OW' 52 -0x0009 | 0x0E00, // 'UW' 53 -0x0006 | 0x0800, // 'B*' 54 -0x0001 | 0x0200, // '**' 55 -0x0002 | 0x0200, // '**' 56 -0x0005 | 0x0700, // 'D*' 57 -0x0001 | 0x0200, // '**' 58 -0x0001 | 0x0100, // '**' 59 -0x0006 | 0x0700, // 'G*' 60 -0x0001 | 0x0200, // '**' 61 -0x0002 | 0x0200, // '**' 62 -0x0006 | 0x0700, // 'GX' 63 -0x0001 | 0x0200, // '**' 64 -0x0002 | 0x0200, // '**' 65 -0x0008 | 0x0800, // 'P*' 66 -0x0002 | 0x0200, // '**' 67 -0x0002 | 0x0200, // '**' 68 -0x0004 | 0x0600, // 'T*' 69 -0x0002 | 0x0200, // '**' 70 -0x0002 | 0x0200, // '**' 71 -0x0006 | 0x0700, // 'K*' 72 -0x0001 | 0x0200, // '**' 73 -0x0004 | 0x0400, // '**' 74 -0x0006 | 0x0700, // 'KX' 75 -0x0001 | 0x0100, // '**' 76 -0x0004 | 0x0400, // '**' 77 -0x00C7 | 0x0500, // 'UL' 78 +let combinedPhonemeLengthTable = [0x0000 | 0x0000, +// ' *' 00 +0x0012 | 0x1200, +// '.*' 01 +0x0012 | 0x1200, +// '?*' 02 +0x0012 | 0x1200, +// ',*' 03 +0x0008 | 0x0800, +// '-*' 04 +0x0008 | 0x0B00, +// 'IY' 05 +0x0008 | 0x0900, +// 'IH' 06 +0x0008 | 0x0B00, +// 'EH' 07 +0x0008 | 0x0E00, +// 'AE' 08 +0x000B | 0x0F00, +// 'AA' 09 +0x0006 | 0x0B00, +// 'AH' 10 +0x000C | 0x1000, +// 'AO' 11 +0x000A | 0x0C00, +// 'UH' 12 +0x0005 | 0x0600, +// 'AX' 13 +0x0005 | 0x0600, +// 'IX' 14 +0x000B | 0x0E00, +// 'ER' 15 +0x000A | 0x0C00, +// 'UX' 16 +0x000A | 0x0E00, +// 'OH' 17 +0x000A | 0x0C00, +// 'RX' 18 +0x0009 | 0x0B00, +// 'LX' 19 +0x0008 | 0x0800, +// 'WX' 20 +0x0007 | 0x0800, +// 'YX' 21 +0x0009 | 0x0B00, +// 'WH' 22 +0x0007 | 0x0A00, +// 'R*' 23 +0x0006 | 0x0900, +// 'L*' 24 +0x0008 | 0x0800, +// 'W*' 25 +0x0006 | 0x0800, +// 'Y*' 26 +0x0007 | 0x0800, +// 'M*' 27 +0x0007 | 0x0800, +// 'N*' 28 +0x0007 | 0x0800, +// 'NX' 29 +0x0002 | 0x0300, +// 'DX' 30 +0x0005 | 0x0500, +// 'Q*' 31 +0x0002 | 0x0200, +// 'S*' 32 +0x0002 | 0x0200, +// 'SH' 33 +0x0002 | 0x0200, +// 'F*' 34 +0x0002 | 0x0200, +// 'TH' 35 +0x0002 | 0x0200, +// '/H' 36 +0x0002 | 0x0200, +// '/X' 37 +0x0006 | 0x0600, +// 'Z*' 38 +0x0006 | 0x0600, +// 'ZH' 39 +0x0007 | 0x0800, +// 'V*' 40 +0x0006 | 0x0600, +// 'DH' 41 +0x0006 | 0x0600, +// 'CH' 42 +0x0002 | 0x0200, +// '**' 43 +0x0008 | 0x0900, +// 'J*' 44 +0x0003 | 0x0400, +// '**' 45 +0x0001 | 0x0200, +// '**' 46 +0x001E | 0x0100, +// '**' 47 +0x000D | 0x0E00, +// 'EY' 48 +0x000C | 0x0F00, +// 'AY' 49 +0x000C | 0x0F00, +// 'OY' 50 +0x000C | 0x0F00, +// 'AW' 51 +0x000E | 0x0E00, +// 'OW' 52 +0x0009 | 0x0E00, +// 'UW' 53 +0x0006 | 0x0800, +// 'B*' 54 +0x0001 | 0x0200, +// '**' 55 +0x0002 | 0x0200, +// '**' 56 +0x0005 | 0x0700, +// 'D*' 57 +0x0001 | 0x0200, +// '**' 58 +0x0001 | 0x0100, +// '**' 59 +0x0006 | 0x0700, +// 'G*' 60 +0x0001 | 0x0200, +// '**' 61 +0x0002 | 0x0200, +// '**' 62 +0x0006 | 0x0700, +// 'GX' 63 +0x0001 | 0x0200, +// '**' 64 +0x0002 | 0x0200, +// '**' 65 +0x0008 | 0x0800, +// 'P*' 66 +0x0002 | 0x0200, +// '**' 67 +0x0002 | 0x0200, +// '**' 68 +0x0004 | 0x0600, +// 'T*' 69 +0x0002 | 0x0200, +// '**' 70 +0x0002 | 0x0200, +// '**' 71 +0x0006 | 0x0700, +// 'K*' 72 +0x0001 | 0x0200, +// '**' 73 +0x0004 | 0x0400, +// '**' 74 +0x0006 | 0x0700, +// 'KX' 75 +0x0001 | 0x0100, +// '**' 76 +0x0004 | 0x0400, +// '**' 77 +0x00C7 | 0x0500, +// 'UL' 78 0x00FF | 0x0500 // 'UM' 79 ]; + /* Ind | phoneme | flags | @@ -521,27 +750,26 @@ SPECIAL * @param {string} sign2 * @return {boolean|Number} */ - let full_match = (sign1, sign2) => { let index = PhonemeNameTable.findIndex(value => { return value === sign1 + sign2 && value[1] !== '*'; }); return index !== -1 ? index : false; }; + /** * Match single character phoneme. * * @param {string} sign1 * @return {boolean|Number} */ - - let single_match = sign1 => { let index = PhonemeNameTable.findIndex(value => { return value === sign1 + '*'; }); return index !== -1 ? index : false; }; + /** * The input[] buffer contains a string of phonemes and stress markers along * the lines of: @@ -595,46 +823,37 @@ let single_match = sign1 => { * * @return {undefined} */ - - let Parser1 = (input, addPhoneme, addStress) => { for (let srcPos = 0; srcPos < input.length; srcPos++) { { let tmp = input.toLowerCase(); - console.log("processing \"".concat(tmp.substr(0, srcPos), "%c").concat(tmp.substr(srcPos, 2).toUpperCase(), "%c").concat(tmp.substr(srcPos + 2), "\""), 'color: red;', 'color:normal;'); + console.log(`processing "${tmp.substr(0, srcPos)}%c${tmp.substr(srcPos, 2).toUpperCase()}%c${tmp.substr(srcPos + 2)}"`, 'color: red;', 'color:normal;'); } - let sign1 = input[srcPos]; let sign2 = input[srcPos + 1] || ''; let match; - if ((match = full_match(sign1, sign2)) !== false) { // Matched both characters (no single char mark) srcPos++; // Skip the second character of the input as we've matched it - addPhoneme(match); continue; } - if ((match = single_match(sign1)) !== false) { // Matched just the first character (with second character matching '*' addPhoneme(match); continue; - } // Should be a stress character. Search through the stress table backwards. - + } + // Should be a stress character. Search through the stress table backwards. match = StressTable.length; - while (sign1 !== StressTable[match] && match > 0) { --match; } - if (match === 0) { { - throw Error("Could not parse char ".concat(sign1)); + throw Error(`Could not parse char ${sign1}`); } } - addStress(match); // Set stress for prior phoneme } }; @@ -647,7 +866,6 @@ let Parser1 = (input, addPhoneme, addStress) => { * * @return {boolean} */ - let phonemeHasFlag = (phoneme, flag) => { return matchesBitmask(phonemeFlags[phoneme], flag); }; @@ -658,10 +876,10 @@ let pT = 69; let PHONEME_PERIOD = 1; let PHONEME_QUESTION = 2; let FLAG_FRICATIVE = 0x2000; + /** * liquic consonant */ - let FLAG_LIQUIC = 0x1000; let FLAG_NASAL = 0x0800; let FLAG_ALVEOLAR = 0x0400; @@ -672,7 +890,6 @@ let FLAG_CONSONANT = 0x0040; * diphthong ending with YX * */ - let FLAG_DIP_YX = 0x0020; let FLAG_DIPHTHONG = 0x0010; /** unknown: @@ -680,13 +897,12 @@ let FLAG_DIPHTHONG = 0x0010; * '**', '**', 'G*', '**', '**', 'GX', '**', '**', 'P*', '**', '**', * 'T*', '**', '**', 'K*', '**', '**', 'KX', '**', '**' */ - let FLAG_0008 = 0x0008; let FLAG_VOICED = 0x0004; + /** * stop consonant */ - let FLAG_STOPCONS = 0x0002; let FLAG_UNVOICED_STOPCONS = 0x0001; @@ -723,7 +939,6 @@ let FLAG_UNVOICED_STOPCONS = 0x0001; * * @return undefined */ - let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { /** * Rewrites: @@ -741,96 +956,77 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { // ALVEOLAR flag set? if (phonemeHasFlag(getPhoneme(pos - 1), FLAG_ALVEOLAR)) { { - console.log("".concat(pos, " RULE: UW -> UX")); + console.log(`${pos} RULE: UW -> UX`); } - setPhoneme(pos, 16); // UX } - break; } // 'CH' Example: CHEW - case 42: { { - console.log("".concat(pos, " RULE: CH -> CH CH+1")); + console.log(`${pos} RULE: CH -> CH CH+1`); } - insertPhoneme(pos + 1, 43, getStress(pos)); // '**' - break; } // 'J*' Example: JAY - case 44: { { - console.log("".concat(pos, " RULE: J -> J J+1")); + console.log(`${pos} RULE: J -> J J+1`); } - insertPhoneme(pos + 1, 45, getStress(pos)); // '**' - break; } } }; - let changeAX = (position, suffix) => { { - console.log("".concat(position, " RULE: ").concat(PhonemeNameTable[getPhoneme(position)], " -> AX ").concat(PhonemeNameTable[suffix])); + console.log(`${position} RULE: ${PhonemeNameTable[getPhoneme(position)]} -> AX ${PhonemeNameTable[suffix]}`); } - setPhoneme(position, 13); // 'AX' - insertPhoneme(position + 1, suffix, getStress(position)); }; - let pos = -1; let phoneme; - while ((phoneme = getPhoneme(++pos)) !== null) { // Is phoneme pause? if (phoneme === 0) { continue; } - if (phonemeHasFlag(phoneme, FLAG_DIPHTHONG)) { // -> WX // -> YX // Example: OIL, COW { - console.log(!phonemeHasFlag(phoneme, FLAG_DIP_YX) ? "".concat(pos, " RULE: insert WX following diphthong NOT ending in IY sound") : "".concat(pos, " RULE: insert YX following diphthong ending in IY sound")); - } // If ends with IY, use YX, else use WX + console.log(!phonemeHasFlag(phoneme, FLAG_DIP_YX) ? `${pos} RULE: insert WX following diphthong NOT ending in IY sound` : `${pos} RULE: insert YX following diphthong ending in IY sound`); + } + // If ends with IY, use YX, else use WX // Insert at WX or YX following, copying the stress // 'WX' = 20 'YX' = 21 - - insertPhoneme(pos + 1, phonemeHasFlag(phoneme, FLAG_DIP_YX) ? 21 : 20, getStress(pos)); handleUW_CH_J(phoneme, pos); continue; } - if (phoneme === 78) { // 'UL' => 'AX' 'L*' // Example: MEDDLE changeAX(pos, 24); continue; } - if (phoneme === 79) { // 'UM' => 'AX' 'M*' // Example: ASTRONOMY changeAX(pos, 27); continue; } - if (phoneme === 80) { // 'UN' => 'AX' 'N*' changeAX(pos, 28); continue; } - if (phonemeHasFlag(phoneme, FLAG_VOWEL) && getStress(pos)) { // Example: FUNCTION // RULE: @@ -839,21 +1035,16 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { if (getPhoneme(pos + 1) === 0) { // If following phoneme is a pause, get next phoneme = getPhoneme(pos + 2); - if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_VOWEL) && getStress(pos + 2)) { { - console.log("".concat(pos + 2, " RULE: Insert glottal stop between two stressed vowels with space between them")); + console.log(`${pos + 2} RULE: Insert glottal stop between two stressed vowels with space between them`); } - insertPhoneme(pos + 2, 31, 0); // 31 = 'Q' } } - continue; } - let priorPhoneme = pos === 0 ? null : getPhoneme(pos - 1); - if (phoneme === pR) { // RULES FOR PHONEMES BEFORE R switch (priorPhoneme) { @@ -861,103 +1052,88 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { { // Example: TRACK { - console.log("".concat(pos, " RULE: T* R* -> CH R*")); + console.log(`${pos} RULE: T* R* -> CH R*`); } - setPhoneme(pos - 1, 42); // 'T*' 'R*' -> 'CH' 'R*' - break; } - case pD: { // Example: DRY { - console.log("".concat(pos, " RULE: D* R* -> J* R*")); + console.log(`${pos} RULE: D* R* -> J* R*`); } - setPhoneme(pos - 1, 44); // 'J*' - break; } - default: { if (phonemeHasFlag(priorPhoneme, FLAG_VOWEL)) { // Example: ART { - console.log("".concat(pos, " R* -> RX")); + console.log(`${pos} R* -> RX`); } - setPhoneme(pos, 18); // 'RX' } } } - continue; - } // 'L*' - + } + // 'L*' if (phoneme === 24 && phonemeHasFlag(priorPhoneme, FLAG_VOWEL)) { // Example: ALL { - console.log("".concat(pos, " L* -> LX")); + console.log(`${pos} L* -> LX`); } - setPhoneme(pos, 19); // 'LX' - continue; - } // 'G*' 'S*' - - + } + // 'G*' 'S*' if (priorPhoneme === 60 && phoneme === 32) { // Can't get to fire - // 1. The G -> GX rule intervenes // 2. Reciter already replaces GS -> GZ { - console.log("".concat(pos, " G S -> G Z")); + console.log(`${pos} G S -> G Z`); } - setPhoneme(pos, 38); continue; - } // 'G*' - + } + // 'G*' if (phoneme === 60) { // G -> GX // Example: GO - let phoneme = getPhoneme(pos + 1); // If diphthong ending with YX, move continue processing next phoneme - + let phoneme = getPhoneme(pos + 1); + // If diphthong ending with YX, move continue processing next phoneme if (!phonemeHasFlag(phoneme, FLAG_DIP_YX) && phoneme !== null) { // replace G with GX and continue processing next phoneme { - console.log("".concat(pos, " RULE: G -> GX ")); + console.log(`${pos} RULE: G -> GX `); } - setPhoneme(pos, 63); // 'GX' } - continue; - } // 'K*' - + } + // 'K*' if (phoneme === 72) { // K -> KX // Example: COW - let Y = getPhoneme(pos + 1); // If at end, replace current phoneme with KX - + let Y = getPhoneme(pos + 1); + // If at end, replace current phoneme with KX if (!phonemeHasFlag(Y, FLAG_DIP_YX) || Y === null) { // VOWELS AND DIPHTHONGS ENDING WITH IY SOUND flag set? { - console.log("".concat(pos, " K -> KX ")); + console.log(`${pos} K -> KX `); } - setPhoneme(pos, 75); phoneme = 75; } - } // Replace with softer version? - + } + // Replace with softer version? if (phonemeHasFlag(phoneme, FLAG_UNVOICED_STOPCONS) && priorPhoneme === 32) { // 'S*' // RULE: @@ -969,15 +1145,14 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { // 'S*' 'UN' -> 'S*' '**' // Examples: SPY, STY, SKY, SCOWL { - console.log("".concat(pos, " RULE: S* ").concat(PhonemeNameTable[phoneme], " -> S* ").concat(PhonemeNameTable[phoneme - 12])); + console.log(`${pos} RULE: S* ${PhonemeNameTable[phoneme]} -> S* ${PhonemeNameTable[phoneme - 12]}`); } - setPhoneme(pos, phoneme - 12); } else if (!phonemeHasFlag(phoneme, FLAG_UNVOICED_STOPCONS)) { handleUW_CH_J(phoneme, pos); - } // 'T*', 'D*' - + } + // 'T*', 'D*' if (phoneme === 69 || phoneme === 57) { // RULE: Soften T following vowel // NOTE: This rule fails for cases such as "ODD" @@ -986,28 +1161,22 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { // Example: PARTY, TARDY if (pos > 0 && phonemeHasFlag(getPhoneme(pos - 1), FLAG_VOWEL)) { phoneme = getPhoneme(pos + 1); - if (phoneme === 0) { phoneme = getPhoneme(pos + 2); } - if (phonemeHasFlag(phoneme, FLAG_VOWEL) && !getStress(pos + 1)) { { - console.log("".concat(pos, " Soften T or D following vowel or ER and preceding a pause -> DX")); + console.log(`${pos} Soften T or D following vowel or ER and preceding a pause -> DX`); } - setPhoneme(pos, 30); } } - continue; } - { - console.log("".concat(pos, ": ").concat(PhonemeNameTable[phoneme])); + console.log(`${pos}: ${PhonemeNameTable[phoneme]}`); } } // while - }; /** @@ -1027,177 +1196,160 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { * * @return undefined */ - let AdjustLengths = (getPhoneme, setLength, getLength) => { { - console.log("AdjustLengths()"); - } // LENGTHEN VOWELS PRECEDING PUNCTUATION + console.log(`AdjustLengths()`); + } + + // LENGTHEN VOWELS PRECEDING PUNCTUATION // // Search for punctuation. If found, back up to the first vowel, then // process all phonemes between there and up to (but not including) the punctuation. // If any phoneme is found that is a either a fricative or voiced, the duration is // increased by (length * 1.5) + 1 - // loop index - + // loop index for (let position = 0; getPhoneme(position) !== null; position++) { // not punctuation? if (!phonemeHasFlag(getPhoneme(position), FLAG_PUNCT)) { continue; } - let loopIndex = position; - - while (--position > 1 && !phonemeHasFlag(getPhoneme(position), FLAG_VOWEL)) { - /* back up while not a vowel */ - } // If beginning of phonemes, exit loop. - - + while (--position > 1 && !phonemeHasFlag(getPhoneme(position), FLAG_VOWEL)) {/* back up while not a vowel */} + // If beginning of phonemes, exit loop. if (position === 0) { break; - } // Now handle everything between position and loopIndex - + } + // Now handle everything between position and loopIndex let vowel = position; - for (; position < loopIndex; position++) { // test for not fricative/unvoiced or not voiced if (!phonemeHasFlag(getPhoneme(position), FLAG_FRICATIVE) || phonemeHasFlag(getPhoneme(position), FLAG_VOICED)) { - let A = getLength(position); // change phoneme length to (length * 1.5) + 1 - + let A = getLength(position); + // change phoneme length to (length * 1.5) + 1 { console.log(position + ' RULE: Lengthen or ' + PhonemeNameTable[getPhoneme(position)] + ' between VOWEL:' + PhonemeNameTable[getPhoneme(vowel)] + ' and PUNCTUATION:' + PhonemeNameTable[getPhoneme(position)] + ' by 1.5'); } - setLength(position, (A >> 1) + A + 1); } } - } // Similar to the above routine, but shorten vowels under some circumstances - // Loop through all phonemes - + } + // Similar to the above routine, but shorten vowels under some circumstances + // Loop through all phonemes let loopIndex = -1; let phoneme; - while ((phoneme = getPhoneme(++loopIndex)) !== null) { - let position = loopIndex; // vowel? - + let position = loopIndex; + // vowel? if (phonemeHasFlag(phoneme, FLAG_VOWEL)) { // get next phoneme - phoneme = getPhoneme(++position); // not a consonant - + phoneme = getPhoneme(++position); + // not a consonant if (!phonemeHasFlag(phoneme, FLAG_CONSONANT)) { // 'RX' or 'LX'? if ((phoneme === 18 || phoneme === 19) && phonemeHasFlag(getPhoneme(++position), FLAG_CONSONANT)) { // followed by consonant? { console.log(loopIndex + ' RULE: ' + PhonemeNameTable[phoneme] + ' - decrease length of vowel by 1'); - } // decrease length of vowel by 1 frame - - + } + // decrease length of vowel by 1 frame setLength(loopIndex, getLength(loopIndex) - 1); } - continue; - } // Got here if not + } + // Got here if not // FIXME: the case when phoneme === END is taken over by !phonemeHasFlag(phoneme, FLAG_CONSONANT) - - - let flags = phoneme === null ? FLAG_CONSONANT | FLAG_UNVOICED_STOPCONS : phonemeFlags[phoneme]; // Unvoiced - + let flags = phoneme === null ? FLAG_CONSONANT | FLAG_UNVOICED_STOPCONS : phonemeFlags[phoneme]; + // Unvoiced if (!matchesBitmask(flags, FLAG_VOICED)) { // *, .*, ?*, ,*, -*, DX, S*, SH, F*, TH, /H, /X, CH, P*, T*, K*, KX + // unvoiced plosive if (matchesBitmask(flags, FLAG_UNVOICED_STOPCONS)) { // RULE: // { - console.log("".concat(loopIndex, " - decrease vowel by 1/8th")); + console.log(`${loopIndex} - decrease vowel by 1/8th`); } - let A = getLength(loopIndex); setLength(loopIndex, A - (A >> 3)); } - continue; - } // RULE: + } + + // RULE: // - - { - console.log("".concat(loopIndex, " RULE: - increase vowel by 1/4 + 1")); - } // increase length - - + console.log(`${loopIndex} RULE: - increase vowel by 1/4 + 1`); + } + // increase length let A = getLength(loopIndex); setLength(loopIndex, (A >> 2) + A + 1); // 5/4*A + 1 - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, M*, N*, NX, DX, Q*, S*, SH, F*, - // TH, /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX - // nasal? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, M*, N*, NX, DX, Q*, S*, SH, F*, + // TH, /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX + // nasal? if (phonemeHasFlag(phoneme, FLAG_NASAL)) { // RULE: // Set punctuation length to 6 // Set stop consonant length to 5 - // M*, N*, NX, - phoneme = getPhoneme(++position); // is next phoneme a stop consonant? + // M*, N*, NX, + phoneme = getPhoneme(++position); + // is next phoneme a stop consonant? if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // B*, D*, G*, GX, P*, T*, K*, KX { - console.log("".concat(position, " RULE: - set nasal = 5, consonant = 6")); + console.log(`${position} RULE: - set nasal = 5, consonant = 6`); } - setLength(position, 6); // set stop consonant length to 6 - setLength(position - 1, 5); // set nasal length to 5 } - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, - // /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX - // stop consonant? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, + // /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX + // stop consonant? if (phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // B*, D*, G*, GX + // RULE: {optional silence} // Shorten both to (length/2 + 1) - while ((phoneme = getPhoneme(++position)) === 0) { - /* move past silence */ - } // if another stop consonant, process. - + while ((phoneme = getPhoneme(++position)) === 0) {/* move past silence */} + // if another stop consonant, process. if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // RULE: {optional silence} { - console.log("".concat(position, " RULE: {optional silence} - shorten both to 1/2 + 1")); + console.log(`${position} RULE: {optional silence} - shorten both to 1/2 + 1`); } - setLength(position, (getLength(position) >> 1) + 1); setLength(loopIndex, (getLength(loopIndex) >> 1) + 1); } - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, - // /H, /X, Z*, ZH, V*, DH, CH, J* - // liquic consonant? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, + // /H, /X, Z*, ZH, V*, DH, CH, J* + // liquic consonant? if (position > 0 && phonemeHasFlag(phoneme, FLAG_LIQUIC) && phonemeHasFlag(getPhoneme(position - 1), FLAG_STOPCONS)) { // R*, L*, W*, Y* // RULE: // Decrease by 2 // prior phoneme is a stop consonant { - console.log("".concat(position, " RULE: - decrease by 2")); - } // decrease the phoneme length by 2 frames - - + console.log(`${position} RULE: - decrease by 2`); + } + // decrease the phoneme length by 2 frames setLength(position, getLength(position) - 2); } } @@ -1222,21 +1374,18 @@ let AdjustLengths = (getPhoneme, setLength, getLength) => { * * @return undefined */ - let CopyStress = (getPhoneme, getStress, setStress) => { // loop through all the phonemes to be output let position = 0; let phoneme; - while ((phoneme = getPhoneme(position)) !== null) { // if CONSONANT_FLAG set, skip - only vowels get stress if (phonemeHasFlag(phoneme, FLAG_CONSONANT)) { - phoneme = getPhoneme(position + 1); // if the following phoneme is the end, or a vowel, skip - + phoneme = getPhoneme(position + 1); + // if the following phoneme is the end, or a vowel, skip if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_VOWEL)) { // get the stress value at the next position let stress = getStress(position + 1); - if (stress !== 0 && stress < 0x80) { // if next phoneme is stressed, and a VOWEL OR ER // copy stress from next phoneme to this one @@ -1244,7 +1393,6 @@ let CopyStress = (getPhoneme, getStress, setStress) => { } } } - ++position; } }; @@ -1258,20 +1406,16 @@ let CopyStress = (getPhoneme, getStress, setStress) => { * * @return undefined */ - let SetPhonemeLength = (getPhoneme, getStress, setLength) => { let position = 0; let phoneme; - while ((phoneme = getPhoneme(position)) !== null) { let stress = getStress(position); - if (stress === 0 || stress > 0x7F) { setLength(position, combinedPhonemeLengthTable[phoneme] & 0xFF); } else { setLength(position, combinedPhonemeLengthTable[phoneme] >> 8); } - position++; } }; @@ -1286,32 +1430,26 @@ let SetPhonemeLength = (getPhoneme, getStress, setLength) => { * * @return undefined */ - let ProlongPlosiveStopConsonantsCode41240 = (getPhoneme, insertPhoneme, getStress) => { let pos = -1; let index; - while ((index = getPhoneme(++pos)) !== null) { // Not a stop consonant, move to next one. if (!phonemeHasFlag(index, FLAG_STOPCONS)) { continue; - } //If plosive, move to next non empty phoneme and validate the flags. - - + } + //If plosive, move to next non empty phoneme and validate the flags. if (phonemeHasFlag(index, FLAG_UNVOICED_STOPCONS)) { let nextNonEmpty; let X = pos; - do { nextNonEmpty = getPhoneme(++X); - } while (nextNonEmpty === 0); // If not END and either flag 0x0008 or '/H' or '/X' - - + } while (nextNonEmpty === 0); + // If not END and either flag 0x0008 or '/H' or '/X' if (nextNonEmpty !== null && (phonemeHasFlag(nextNonEmpty, FLAG_0008) || nextNonEmpty === 36 || nextNonEmpty === 37)) { continue; } } - insertPhoneme(pos + 1, index + 1, getStress(pos), combinedPhonemeLengthTable[index + 1] & 0xFF); insertPhoneme(pos + 2, index + 2, getStress(pos), combinedPhonemeLengthTable[index + 2] & 0xFF); pos += 2; @@ -1327,29 +1465,25 @@ let ProlongPlosiveStopConsonantsCode41240 = (getPhoneme, insertPhoneme, getStres * * @return {Array|Boolean} The parsed data. */ - let Parser = input => { if (!input) { return false; } - let getPhoneme = pos => { { if (pos < 0 || pos > phonemeindex.length) { throw new Error('Out of bounds: ' + pos); } } - return pos === phonemeindex.length ? null : phonemeindex[pos]; }; - let setPhoneme = (pos, value) => { { - console.log("".concat(pos, " CHANGE: ").concat(PhonemeNameTable[phonemeindex[pos]], " -> ").concat(PhonemeNameTable[value])); + console.log(`${pos} CHANGE: ${PhonemeNameTable[phonemeindex[pos]]} -> ${PhonemeNameTable[value]}`); } - phonemeindex[pos] = value; }; + /** * @param {Number} pos The position in the phoneme array to insert at. * @param {Number} value The phoneme to insert. @@ -1358,54 +1492,40 @@ let Parser = input => { * * @return {undefined} */ - - let insertPhoneme = (pos, value, stressValue, length) => { { - console.log("".concat(pos, " INSERT: ").concat(PhonemeNameTable[value])); + console.log(`${pos} INSERT: ${PhonemeNameTable[value]}`); } - for (let i = phonemeindex.length - 1; i >= pos; i--) { phonemeindex[i + 1] = phonemeindex[i]; phonemeLength[i + 1] = getLength(i); stress[i + 1] = getStress(i); } - phonemeindex[pos] = value; phonemeLength[pos] = length | 0; stress[pos] = stressValue; }; - let getStress = pos => stress[pos] | 0; - let setStress = (pos, stressValue) => { { - console.log("".concat(pos, " \"").concat(PhonemeNameTable[phonemeindex[pos]], "\" SET STRESS: ").concat(stress[pos], " -> ").concat(stressValue)); + console.log(`${pos} "${PhonemeNameTable[phonemeindex[pos]]}" SET STRESS: ${stress[pos]} -> ${stressValue}`); } - stress[pos] = stressValue; }; - let getLength = pos => phonemeLength[pos] | 0; - let setLength = (pos, length) => { { - console.log("".concat(pos, " \"").concat(PhonemeNameTable[phonemeindex[pos]], "\" SET LENGTH: ").concat(phonemeLength[pos], " -> ").concat(length)); - + console.log(`${pos} "${PhonemeNameTable[phonemeindex[pos]]}" SET LENGTH: ${phonemeLength[pos]} -> ${length}`); if ((length & 128) !== 0) { throw new Error('Got the flag 0x80, see CopyStress() and SetPhonemeLength() comments!'); } - if (pos < 0 || pos > phonemeindex.length) { throw new Error('Out of bounds: ' + pos); } } - phonemeLength[pos] = length; }; - let stress = []; //numbers from 0 to 8 - let phonemeLength = []; let phonemeindex = []; let pos = 0; @@ -1419,27 +1539,22 @@ let Parser = input => { throw new Error('Got the flag 0x80, see CopyStress() and SetPhonemeLength() comments!'); } } - - stress[pos - 1] = value; - /* Set stress for prior phoneme */ + stress[pos - 1] = value; /* Set stress for prior phoneme */ }); - { PrintPhonemes(phonemeindex, phonemeLength, stress); } - Parser2(insertPhoneme, setPhoneme, getPhoneme, getStress); CopyStress(getPhoneme, getStress, setStress); SetPhonemeLength(getPhoneme, getStress, setLength); AdjustLengths(getPhoneme, setLength, getLength); ProlongPlosiveStopConsonantsCode41240(getPhoneme, insertPhoneme, getStress); - { PrintPhonemes(phonemeindex, phonemeLength, stress); } - return phonemeindex.map((v, i) => v ? [v, phonemeLength[i] | 0, stress[i] | 0] : null).filter(v => v); }; + /** * Debug printing. * @@ -1449,46 +1564,45 @@ let Parser = input => { * * @return undefined */ - let PrintPhonemes = (phonemeindex, phonemeLength, stress) => { let pad = num => { let s = '000' + num; return s.substr(s.length - 3); }; - console.log('=================================='); console.log('Internal Phoneme presentation:'); console.log(' pos idx phoneme length stress'); console.log('----------------------------------'); - for (let i = 0; i < phonemeindex.length; i++) { let name = () => { if (phonemeindex[i] < 81) { return PhonemeNameTable[phonemeindex[i]]; } - return '??'; }; - console.log(' %s %s %s %s %s', pad(i), pad(phonemeindex[i]), name(phonemeindex[i]), pad(phonemeLength[i]), pad(stress[i])); } - console.log('=================================='); }; // Values substituted for zero bits in unvoiced consonant samples. // tab48426 let sampledConsonantValues0 = [0x18, 0x1A, 0x17, 0x17, 0x17]; -let stressPitch_tab47492 = [0x00, 0xE0, 0xE6, 0xEC, 0xF3, 0xF9, 0x00, 0x06, 0xC, 0x06]; // Used to decide which phoneme's blend lengths. The candidate with the lower score is selected. +let stressPitch_tab47492 = [0x00, 0xE0, 0xE6, 0xEC, 0xF3, 0xF9, 0x00, 0x06, 0xC, 0x06]; + +// Used to decide which phoneme's blend lengths. The candidate with the lower score is selected. // tab45856 +let blendRank = [0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x02, 0x0A, 0x02, 0x08, 0x05, 0x05, 0x0B, 0x0A, 0x09, 0x08, 0x08, 0xA0, 0x08, 0x08, 0x17, 0x1F, 0x12, 0x12, 0x12, 0x12, 0x1E, 0x1E, 0x14, 0x14, 0x14, 0x14, 0x17, 0x17, 0x1A, 0x1A, 0x1D, 0x1D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x17]; -let blendRank = [0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x02, 0x0A, 0x02, 0x08, 0x05, 0x05, 0x0B, 0x0A, 0x09, 0x08, 0x08, 0xA0, 0x08, 0x08, 0x17, 0x1F, 0x12, 0x12, 0x12, 0x12, 0x1E, 0x1E, 0x14, 0x14, 0x14, 0x14, 0x17, 0x17, 0x1A, 0x1A, 0x1D, 0x1D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x17]; // Number of frames at the end of a phoneme devoted to interpolating to next phoneme's final value +// Number of frames at the end of a phoneme devoted to interpolating to next phoneme's final value //tab45696 +let outBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0xA0, 0xA0]; -let outBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0xA0, 0xA0]; // Number of frames at beginning of a phoneme devoted to interpolating to phoneme's final value +// Number of frames at beginning of a phoneme devoted to interpolating to phoneme's final value // tab45776 +let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0xB0, 0xA0]; -let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0xB0, 0xA0]; // Consists of two bitfields: +// Consists of two bitfields: // Low 3 bits (masked by 7) select a 256-byte section in sampleTable, // as well as index into sampledConsonantValues0 for unvoiced. // High 5 bits (masked by 248 = 11111000), for unvoiced, @@ -1509,222 +1623,423 @@ let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, // 67: P' 27 00011011 // 70: T' 25 00011001 // tab45936 +let sampledConsonantFlags = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0xD3, 0xBB, 0x7C, 0x95, 0x01, 0x02, 0x03, 0x03, 0x00, 0x72, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; -let sampledConsonantFlags = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0xD3, 0xBB, 0x7C, 0x95, 0x01, 0x02, 0x03, 0x03, 0x00, 0x72, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; // - -let frequencyData = [//tab45056 |tab451356 |tab45216 +// +let frequencyData = [ +//tab45056 |tab451356 |tab45216 // freq1 | freq2 | freq3 -0x000000 | 0x000000 | 0x000000, // ' *' 00 -0x000013 | 0x004300 | 0x5B0000, // '.*' 01 -0x000013 | 0x004300 | 0x5B0000, // '?*' 02 -0x000013 | 0x004300 | 0x5B0000, // ',*' 03 -0x000013 | 0x004300 | 0x5B0000, // '-*' 04 -0x00000A | 0x005400 | 0x6E0000, // 'IY' 05 -0x00000E | 0x004900 | 0x5D0000, // 'IH' 06 -0x000013 | 0x004300 | 0x5B0000, // 'EH' 07 -0x000018 | 0x003F00 | 0x580000, // 'AE' 08 -0x00001B | 0x002800 | 0x590000, // 'AA' 09 -0x000017 | 0x002C00 | 0x570000, // 'AH' 10 -0x000015 | 0x001F00 | 0x580000, // 'AO' 11 -0x000010 | 0x002500 | 0x520000, // 'UH' 12 -0x000014 | 0x002D00 | 0x590000, // 'AX' 13 -0x00000E | 0x004900 | 0x5D0000, // 'IX' 14 -0x000012 | 0x003100 | 0x3E0000, // 'ER' 15 -0x00000E | 0x002400 | 0x520000, // 'UX' 16 -0x000012 | 0x001E00 | 0x580000, // 'OH' 17 -0x000012 | 0x003300 | 0x3E0000, // 'RX' 18 -0x000010 | 0x002500 | 0x6E0000, // 'LX' 19 -0x00000D | 0x001D00 | 0x500000, // 'WX' 20 -0x00000F | 0x004500 | 0x5D0000, // 'YX' 21 -0x00000B | 0x001800 | 0x5A0000, // 'WH' 22 -0x000012 | 0x003200 | 0x3C0000, // 'R*' 23 -0x00000E | 0x001E00 | 0x6E0000, // 'L*' 24 -0x00000B | 0x001800 | 0x5A0000, // 'W*' 25 -0x000009 | 0x005300 | 0x6E0000, // 'Y*' 26 -0x000006 | 0x002E00 | 0x510000, // 'M*' 27 -0x000006 | 0x003600 | 0x790000, // 'N*' 28 -0x000006 | 0x005600 | 0x650000, // 'NX' 29 -0x000006 | 0x003600 | 0x790000, // 'DX' 30 -0x000011 | 0x004300 | 0x5B0000, // 'Q*' 31 -0x000006 | 0x004900 | 0x630000, // 'S*' 32 -0x000006 | 0x004F00 | 0x6A0000, // 'SH' 33 -0x000006 | 0x001A00 | 0x510000, // 'F*' 34 -0x000006 | 0x004200 | 0x790000, // 'TH' 35 -0x00000E | 0x004900 | 0x5D0000, // '/H' 36 -0x000010 | 0x002500 | 0x520000, // '/X' 37 -0x000009 | 0x003300 | 0x5D0000, // 'Z*' 38 -0x00000A | 0x004200 | 0x670000, // 'ZH' 39 -0x000008 | 0x002800 | 0x4C0000, // 'V*' 40 -0x00000A | 0x002F00 | 0x5D0000, // 'DH' 41 -0x000006 | 0x004F00 | 0x650000, // 'CH' 42 -0x000006 | 0x004F00 | 0x650000, // '**' 43 -0x000006 | 0x004200 | 0x790000, // 'J*' 44 -0x000005 | 0x004F00 | 0x650000, // '**' 45 -0x000006 | 0x006E00 | 0x790000, // '**' 46 -0x000000 | 0x000000 | 0x000000, // '**' 47 -0x000013 | 0x004800 | 0x5A0000, // 'EY' 48 -0x00001B | 0x002700 | 0x580000, // 'AY' 49 -0x000015 | 0x001F00 | 0x580000, // 'OY' 50 -0x00001B | 0x002B00 | 0x580000, // 'AW' 51 -0x000012 | 0x001E00 | 0x580000, // 'OW' 52 -0x00000D | 0x002200 | 0x520000, // 'UW' 53 -0x000006 | 0x001A00 | 0x510000, // 'B*' 54 -0x000006 | 0x001A00 | 0x510000, // '**' 55 -0x000006 | 0x001A00 | 0x510000, // '**' 56 -0x000006 | 0x004200 | 0x790000, // 'D*' 57 -0x000006 | 0x004200 | 0x790000, // '**' 58 -0x000006 | 0x004200 | 0x790000, // '**' 59 -0x000006 | 0x006E00 | 0x700000, // 'G*' 60 -0x000006 | 0x006E00 | 0x6E0000, // '**' 61 -0x000006 | 0x006E00 | 0x6E0000, // '**' 62 -0x000006 | 0x005400 | 0x5E0000, // 'GX' 63 -0x000006 | 0x005400 | 0x5E0000, // '**' 64 -0x000006 | 0x005400 | 0x5E0000, // '**' 65 -0x000006 | 0x001A00 | 0x510000, // 'P*' 66 -0x000006 | 0x001A00 | 0x510000, // '**' 67 -0x000006 | 0x001A00 | 0x510000, // '**' 68 -0x000006 | 0x004200 | 0x790000, // 'T*' 69 -0x000006 | 0x004200 | 0x790000, // '**' 70 -0x000006 | 0x004200 | 0x790000, // '**' 71 -0x000006 | 0x006D00 | 0x650000, // 'K*' 72 -0x00000A | 0x005600 | 0x650000, // '**' 73 -0x00000A | 0x006D00 | 0x700000, // '**' 74 -0x000006 | 0x005400 | 0x5E0000, // 'KX' 75 -0x000006 | 0x005400 | 0x5E0000, // '**' 76 -0x000006 | 0x005400 | 0x5E0000, // '**' 77 -0x00002C | 0x007F00 | 0x080000, // 'UL' 78 +0x000000 | 0x000000 | 0x000000, +// ' *' 00 +0x000013 | 0x004300 | 0x5B0000, +// '.*' 01 +0x000013 | 0x004300 | 0x5B0000, +// '?*' 02 +0x000013 | 0x004300 | 0x5B0000, +// ',*' 03 +0x000013 | 0x004300 | 0x5B0000, +// '-*' 04 +0x00000A | 0x005400 | 0x6E0000, +// 'IY' 05 +0x00000E | 0x004900 | 0x5D0000, +// 'IH' 06 +0x000013 | 0x004300 | 0x5B0000, +// 'EH' 07 +0x000018 | 0x003F00 | 0x580000, +// 'AE' 08 +0x00001B | 0x002800 | 0x590000, +// 'AA' 09 +0x000017 | 0x002C00 | 0x570000, +// 'AH' 10 +0x000015 | 0x001F00 | 0x580000, +// 'AO' 11 +0x000010 | 0x002500 | 0x520000, +// 'UH' 12 +0x000014 | 0x002D00 | 0x590000, +// 'AX' 13 +0x00000E | 0x004900 | 0x5D0000, +// 'IX' 14 +0x000012 | 0x003100 | 0x3E0000, +// 'ER' 15 +0x00000E | 0x002400 | 0x520000, +// 'UX' 16 +0x000012 | 0x001E00 | 0x580000, +// 'OH' 17 +0x000012 | 0x003300 | 0x3E0000, +// 'RX' 18 +0x000010 | 0x002500 | 0x6E0000, +// 'LX' 19 +0x00000D | 0x001D00 | 0x500000, +// 'WX' 20 +0x00000F | 0x004500 | 0x5D0000, +// 'YX' 21 +0x00000B | 0x001800 | 0x5A0000, +// 'WH' 22 +0x000012 | 0x003200 | 0x3C0000, +// 'R*' 23 +0x00000E | 0x001E00 | 0x6E0000, +// 'L*' 24 +0x00000B | 0x001800 | 0x5A0000, +// 'W*' 25 +0x000009 | 0x005300 | 0x6E0000, +// 'Y*' 26 +0x000006 | 0x002E00 | 0x510000, +// 'M*' 27 +0x000006 | 0x003600 | 0x790000, +// 'N*' 28 +0x000006 | 0x005600 | 0x650000, +// 'NX' 29 +0x000006 | 0x003600 | 0x790000, +// 'DX' 30 +0x000011 | 0x004300 | 0x5B0000, +// 'Q*' 31 +0x000006 | 0x004900 | 0x630000, +// 'S*' 32 +0x000006 | 0x004F00 | 0x6A0000, +// 'SH' 33 +0x000006 | 0x001A00 | 0x510000, +// 'F*' 34 +0x000006 | 0x004200 | 0x790000, +// 'TH' 35 +0x00000E | 0x004900 | 0x5D0000, +// '/H' 36 +0x000010 | 0x002500 | 0x520000, +// '/X' 37 +0x000009 | 0x003300 | 0x5D0000, +// 'Z*' 38 +0x00000A | 0x004200 | 0x670000, +// 'ZH' 39 +0x000008 | 0x002800 | 0x4C0000, +// 'V*' 40 +0x00000A | 0x002F00 | 0x5D0000, +// 'DH' 41 +0x000006 | 0x004F00 | 0x650000, +// 'CH' 42 +0x000006 | 0x004F00 | 0x650000, +// '**' 43 +0x000006 | 0x004200 | 0x790000, +// 'J*' 44 +0x000005 | 0x004F00 | 0x650000, +// '**' 45 +0x000006 | 0x006E00 | 0x790000, +// '**' 46 +0x000000 | 0x000000 | 0x000000, +// '**' 47 +0x000013 | 0x004800 | 0x5A0000, +// 'EY' 48 +0x00001B | 0x002700 | 0x580000, +// 'AY' 49 +0x000015 | 0x001F00 | 0x580000, +// 'OY' 50 +0x00001B | 0x002B00 | 0x580000, +// 'AW' 51 +0x000012 | 0x001E00 | 0x580000, +// 'OW' 52 +0x00000D | 0x002200 | 0x520000, +// 'UW' 53 +0x000006 | 0x001A00 | 0x510000, +// 'B*' 54 +0x000006 | 0x001A00 | 0x510000, +// '**' 55 +0x000006 | 0x001A00 | 0x510000, +// '**' 56 +0x000006 | 0x004200 | 0x790000, +// 'D*' 57 +0x000006 | 0x004200 | 0x790000, +// '**' 58 +0x000006 | 0x004200 | 0x790000, +// '**' 59 +0x000006 | 0x006E00 | 0x700000, +// 'G*' 60 +0x000006 | 0x006E00 | 0x6E0000, +// '**' 61 +0x000006 | 0x006E00 | 0x6E0000, +// '**' 62 +0x000006 | 0x005400 | 0x5E0000, +// 'GX' 63 +0x000006 | 0x005400 | 0x5E0000, +// '**' 64 +0x000006 | 0x005400 | 0x5E0000, +// '**' 65 +0x000006 | 0x001A00 | 0x510000, +// 'P*' 66 +0x000006 | 0x001A00 | 0x510000, +// '**' 67 +0x000006 | 0x001A00 | 0x510000, +// '**' 68 +0x000006 | 0x004200 | 0x790000, +// 'T*' 69 +0x000006 | 0x004200 | 0x790000, +// '**' 70 +0x000006 | 0x004200 | 0x790000, +// '**' 71 +0x000006 | 0x006D00 | 0x650000, +// 'K*' 72 +0x00000A | 0x005600 | 0x650000, +// '**' 73 +0x00000A | 0x006D00 | 0x700000, +// '**' 74 +0x000006 | 0x005400 | 0x5E0000, +// 'KX' 75 +0x000006 | 0x005400 | 0x5E0000, +// '**' 76 +0x000006 | 0x005400 | 0x5E0000, +// '**' 77 +0x00002C | 0x007F00 | 0x080000, +// 'UL' 78 0x000013 | 0x007F00 | 0x010000 // 'UM' 79 ]; + /** * * ampl1data[X] = ampldata[X] & 0xFF; // F1 amplitude * ampl2data[X] = (ampldata[X] >> 8) & 0xFF; // F2 amplitude * ampl3data[X] = (ampldata[X] >> 16) & 0xFF; // F3 amplitude */ - -let ampldata = [// ampl1 | ampl2 | ampl3 -0x000000 | 0x000000 | 0x000000, // ' *' 00 -0x000000 | 0x000000 | 0x000000, // '.*' 01 -0x000000 | 0x000000 | 0x000000, // '?*' 02 -0x000000 | 0x000000 | 0x000000, // ',*' 03 -0x000000 | 0x000000 | 0x000000, // '-*' 04 -0x00000D | 0x000A00 | 0x080000, // 'IY' 05 -0x00000D | 0x000B00 | 0x070000, // 'IH' 06 -0x00000E | 0x000D00 | 0x080000, // 'EH' 07 -0x00000F | 0x000E00 | 0x080000, // 'AE' 08 -0x00000F | 0x000D00 | 0x010000, // 'AA' 09 -0x00000F | 0x000C00 | 0x010000, // 'AH' 10 -0x00000F | 0x000C00 | 0x000000, // 'AO' 11 -0x00000F | 0x000B00 | 0x010000, // 'UH' 12 -0x00000C | 0x000900 | 0x000000, // 'AX' 13 -0x00000D | 0x000B00 | 0x070000, // 'IX' 14 -0x00000C | 0x000B00 | 0x050000, // 'ER' 15 -0x00000F | 0x000C00 | 0x010000, // 'UX' 16 -0x00000F | 0x000C00 | 0x000000, // 'OH' 17 -0x00000D | 0x000C00 | 0x060000, // 'RX' 18 -0x00000D | 0x000800 | 0x010000, // 'LX' 19 -0x00000D | 0x000800 | 0x000000, // 'WX' 20 -0x00000E | 0x000C00 | 0x070000, // 'YX' 21 -0x00000D | 0x000800 | 0x000000, // 'WH' 22 -0x00000C | 0x000A00 | 0x050000, // 'R*' 23 -0x00000D | 0x000800 | 0x010000, // 'L*' 24 -0x00000D | 0x000800 | 0x000000, // 'W*' 25 -0x00000D | 0x000A00 | 0x080000, // 'Y*' 26 -0x00000C | 0x000300 | 0x000000, // 'M*' 27 -0x000009 | 0x000900 | 0x000000, // 'N*' 28 -0x000009 | 0x000600 | 0x030000, // 'NX' 29 -0x000000 | 0x000000 | 0x000000, // 'DX' 30 -0x000000 | 0x000000 | 0x000000, // 'Q*' 31 -0x000000 | 0x000000 | 0x000000, // 'S*' 32 -0x000000 | 0x000000 | 0x000000, // 'SH' 33 -0x000000 | 0x000000 | 0x000000, // 'F*' 34 -0x000000 | 0x000000 | 0x000000, // 'TH' 35 -0x000000 | 0x000000 | 0x000000, // '/H' 36 -0x000000 | 0x000000 | 0x000000, // '/X' 37 -0x00000B | 0x000300 | 0x000000, // 'Z*' 38 -0x00000B | 0x000500 | 0x010000, // 'ZH' 39 -0x00000B | 0x000300 | 0x000000, // 'V*' 40 -0x00000B | 0x000400 | 0x000000, // 'DH' 41 -0x000000 | 0x000000 | 0x000000, // 'CH' 42 -0x000000 | 0x000000 | 0x000000, // '**' 43 -0x000001 | 0x000000 | 0x000000, // 'J*' 44 -0x00000B | 0x000500 | 0x010000, // '**' 45 -0x000000 | 0x000A00 | 0x0E0000, // '**' 46 -0x000002 | 0x000200 | 0x010000, // '**' 47 -0x00000E | 0x000E00 | 0x090000, // 'EY' 48 -0x00000F | 0x000D00 | 0x010000, // 'AY' 49 -0x00000F | 0x000C00 | 0x000000, // 'OY' 50 -0x00000F | 0x000D00 | 0x010000, // 'AW' 51 -0x00000F | 0x000C00 | 0x000000, // 'OW' 52 -0x00000D | 0x000800 | 0x000000, // 'UW' 53 -0x000002 | 0x000000 | 0x000000, // 'B*' 54 -0x000004 | 0x000100 | 0x000000, // '**' 55 -0x000000 | 0x000000 | 0x000000, // '**' 56 -0x000002 | 0x000000 | 0x000000, // 'D*' 57 -0x000004 | 0x000100 | 0x000000, // '**' 58 -0x000000 | 0x000000 | 0x000000, // '**' 59 -0x000001 | 0x000000 | 0x000000, // 'G*' 60 -0x000004 | 0x000100 | 0x000000, // '**' 61 -0x000000 | 0x000000 | 0x000000, // '**' 62 -0x000001 | 0x000000 | 0x000000, // 'GX' 63 -0x000004 | 0x000100 | 0x000000, // '**' 64 -0x000000 | 0x000000 | 0x000000, // '**' 65 -0x000000 | 0x000000 | 0x000000, // 'P*' 66 -0x000000 | 0x000000 | 0x000000, // '**' 67 -0x000000 | 0x000000 | 0x000000, // '**' 68 -0x000000 | 0x000000 | 0x000000, // 'T*' 69 -0x000000 | 0x000000 | 0x000000, // '**' 70 -0x000000 | 0x000000 | 0x000000, // '**' 71 -0x000000 | 0x000000 | 0x000000, // 'K*' 72 -0x00000C | 0x000A00 | 0x070000, // '**' 73 -0x000000 | 0x000000 | 0x000000, // '**' 74 -0x000000 | 0x000000 | 0x000000, // 'KX' 75 -0x000000 | 0x000A00 | 0x050000, // '**' 76 -0x000000 | 0x000000 | 0x000000, // '**' 77 -0x00000F | 0x000000 | 0x130000, // 'UL' 78 +let ampldata = [ +// ampl1 | ampl2 | ampl3 +0x000000 | 0x000000 | 0x000000, +// ' *' 00 +0x000000 | 0x000000 | 0x000000, +// '.*' 01 +0x000000 | 0x000000 | 0x000000, +// '?*' 02 +0x000000 | 0x000000 | 0x000000, +// ',*' 03 +0x000000 | 0x000000 | 0x000000, +// '-*' 04 +0x00000D | 0x000A00 | 0x080000, +// 'IY' 05 +0x00000D | 0x000B00 | 0x070000, +// 'IH' 06 +0x00000E | 0x000D00 | 0x080000, +// 'EH' 07 +0x00000F | 0x000E00 | 0x080000, +// 'AE' 08 +0x00000F | 0x000D00 | 0x010000, +// 'AA' 09 +0x00000F | 0x000C00 | 0x010000, +// 'AH' 10 +0x00000F | 0x000C00 | 0x000000, +// 'AO' 11 +0x00000F | 0x000B00 | 0x010000, +// 'UH' 12 +0x00000C | 0x000900 | 0x000000, +// 'AX' 13 +0x00000D | 0x000B00 | 0x070000, +// 'IX' 14 +0x00000C | 0x000B00 | 0x050000, +// 'ER' 15 +0x00000F | 0x000C00 | 0x010000, +// 'UX' 16 +0x00000F | 0x000C00 | 0x000000, +// 'OH' 17 +0x00000D | 0x000C00 | 0x060000, +// 'RX' 18 +0x00000D | 0x000800 | 0x010000, +// 'LX' 19 +0x00000D | 0x000800 | 0x000000, +// 'WX' 20 +0x00000E | 0x000C00 | 0x070000, +// 'YX' 21 +0x00000D | 0x000800 | 0x000000, +// 'WH' 22 +0x00000C | 0x000A00 | 0x050000, +// 'R*' 23 +0x00000D | 0x000800 | 0x010000, +// 'L*' 24 +0x00000D | 0x000800 | 0x000000, +// 'W*' 25 +0x00000D | 0x000A00 | 0x080000, +// 'Y*' 26 +0x00000C | 0x000300 | 0x000000, +// 'M*' 27 +0x000009 | 0x000900 | 0x000000, +// 'N*' 28 +0x000009 | 0x000600 | 0x030000, +// 'NX' 29 +0x000000 | 0x000000 | 0x000000, +// 'DX' 30 +0x000000 | 0x000000 | 0x000000, +// 'Q*' 31 +0x000000 | 0x000000 | 0x000000, +// 'S*' 32 +0x000000 | 0x000000 | 0x000000, +// 'SH' 33 +0x000000 | 0x000000 | 0x000000, +// 'F*' 34 +0x000000 | 0x000000 | 0x000000, +// 'TH' 35 +0x000000 | 0x000000 | 0x000000, +// '/H' 36 +0x000000 | 0x000000 | 0x000000, +// '/X' 37 +0x00000B | 0x000300 | 0x000000, +// 'Z*' 38 +0x00000B | 0x000500 | 0x010000, +// 'ZH' 39 +0x00000B | 0x000300 | 0x000000, +// 'V*' 40 +0x00000B | 0x000400 | 0x000000, +// 'DH' 41 +0x000000 | 0x000000 | 0x000000, +// 'CH' 42 +0x000000 | 0x000000 | 0x000000, +// '**' 43 +0x000001 | 0x000000 | 0x000000, +// 'J*' 44 +0x00000B | 0x000500 | 0x010000, +// '**' 45 +0x000000 | 0x000A00 | 0x0E0000, +// '**' 46 +0x000002 | 0x000200 | 0x010000, +// '**' 47 +0x00000E | 0x000E00 | 0x090000, +// 'EY' 48 +0x00000F | 0x000D00 | 0x010000, +// 'AY' 49 +0x00000F | 0x000C00 | 0x000000, +// 'OY' 50 +0x00000F | 0x000D00 | 0x010000, +// 'AW' 51 +0x00000F | 0x000C00 | 0x000000, +// 'OW' 52 +0x00000D | 0x000800 | 0x000000, +// 'UW' 53 +0x000002 | 0x000000 | 0x000000, +// 'B*' 54 +0x000004 | 0x000100 | 0x000000, +// '**' 55 +0x000000 | 0x000000 | 0x000000, +// '**' 56 +0x000002 | 0x000000 | 0x000000, +// 'D*' 57 +0x000004 | 0x000100 | 0x000000, +// '**' 58 +0x000000 | 0x000000 | 0x000000, +// '**' 59 +0x000001 | 0x000000 | 0x000000, +// 'G*' 60 +0x000004 | 0x000100 | 0x000000, +// '**' 61 +0x000000 | 0x000000 | 0x000000, +// '**' 62 +0x000001 | 0x000000 | 0x000000, +// 'GX' 63 +0x000004 | 0x000100 | 0x000000, +// '**' 64 +0x000000 | 0x000000 | 0x000000, +// '**' 65 +0x000000 | 0x000000 | 0x000000, +// 'P*' 66 +0x000000 | 0x000000 | 0x000000, +// '**' 67 +0x000000 | 0x000000 | 0x000000, +// '**' 68 +0x000000 | 0x000000 | 0x000000, +// 'T*' 69 +0x000000 | 0x000000 | 0x000000, +// '**' 70 +0x000000 | 0x000000 | 0x000000, +// '**' 71 +0x000000 | 0x000000 | 0x000000, +// 'K*' 72 +0x00000C | 0x000A00 | 0x070000, +// '**' 73 +0x000000 | 0x000000 | 0x000000, +// '**' 74 +0x000000 | 0x000000 | 0x000000, +// 'KX' 75 +0x000000 | 0x000A00 | 0x050000, +// '**' 76 +0x000000 | 0x000000 | 0x000000, +// '**' 77 +0x00000F | 0x000000 | 0x130000, +// 'UL' 78 0x00000F | 0x000000 | 0x100000 // 'UM' 79 -]; // Sampled data for consonants, consisting of five 256-byte sections - -let sampleTable = [//00 T', S, Z (coronal) -0x38, 0x84, 0x6B, 0x19, 0xC6, 0x63, 0x18, 0x86, 0x73, 0x98, 0xC6, 0xB1, 0x1C, 0xCA, 0x31, 0x8C, 0xC7, 0x31, 0x88, 0xC2, 0x30, 0x98, 0x46, 0x31, 0x18, 0xC6, 0x35, 0x0C, 0xCA, 0x31, 0x0C, 0xC6, //20 -0x21, 0x10, 0x24, 0x69, 0x12, 0xC2, 0x31, 0x14, 0xC4, 0x71, 0x08, 0x4A, 0x22, 0x49, 0xAB, 0x6A, 0xA8, 0xAC, 0x49, 0x51, 0x32, 0xD5, 0x52, 0x88, 0x93, 0x6C, 0x94, 0x22, 0x15, 0x54, 0xD2, 0x25, //40 -0x96, 0xD4, 0x50, 0xA5, 0x46, 0x21, 0x08, 0x85, 0x6B, 0x18, 0xC4, 0x63, 0x10, 0xCE, 0x6B, 0x18, 0x8C, 0x71, 0x19, 0x8C, 0x63, 0x35, 0x0C, 0xC6, 0x33, 0x99, 0xCC, 0x6C, 0xB5, 0x4E, 0xA2, 0x99, //60 -0x46, 0x21, 0x28, 0x82, 0x95, 0x2E, 0xE3, 0x30, 0x9C, 0xC5, 0x30, 0x9C, 0xA2, 0xB1, 0x9C, 0x67, 0x31, 0x88, 0x66, 0x59, 0x2C, 0x53, 0x18, 0x84, 0x67, 0x50, 0xCA, 0xE3, 0x0A, 0xAC, 0xAB, 0x30, //80 -0xAC, 0x62, 0x30, 0x8C, 0x63, 0x10, 0x94, 0x62, 0xB1, 0x8C, 0x82, 0x28, 0x96, 0x33, 0x98, 0xD6, 0xB5, 0x4C, 0x62, 0x29, 0xA5, 0x4A, 0xB5, 0x9C, 0xC6, 0x31, 0x14, 0xD6, 0x38, 0x9C, 0x4B, 0xB4, //A0 -0x86, 0x65, 0x18, 0xAE, 0x67, 0x1C, 0xA6, 0x63, 0x19, 0x96, 0x23, 0x19, 0x84, 0x13, 0x08, 0xA6, 0x52, 0xAC, 0xCA, 0x22, 0x89, 0x6E, 0xAB, 0x19, 0x8C, 0x62, 0x34, 0xC4, 0x62, 0x19, 0x86, 0x63, //C0 -0x18, 0xC4, 0x23, 0x58, 0xD6, 0xA3, 0x50, 0x42, 0x54, 0x4A, 0xAD, 0x4A, 0x25, 0x11, 0x6B, 0x64, 0x89, 0x4A, 0x63, 0x39, 0x8A, 0x23, 0x31, 0x2A, 0xEA, 0xA2, 0xA9, 0x44, 0xC5, 0x12, 0xCD, 0x42, //E0 -0x34, 0x8C, 0x62, 0x18, 0x8C, 0x63, 0x11, 0x48, 0x66, 0x31, 0x9D, 0x44, 0x33, 0x1D, 0x46, 0x31, 0x9C, 0xC6, 0xB1, 0x0C, 0xCD, 0x32, 0x88, 0xC4, 0x73, 0x18, 0x86, 0x73, 0x08, 0xD6, 0x63, 0x58, //100 CH', J', SH, ZH (palato-alveolar) -0x07, 0x81, 0xE0, 0xF0, 0x3C, 0x07, 0x87, 0x90, 0x3C, 0x7C, 0x0F, 0xC7, 0xC0, 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x80, 0x80, 0x00, 0x1C, 0x78, 0x70, 0xF1, 0xC7, 0x1F, 0xC0, 0x0C, 0xFE, 0x1C, 0x1F, //120 -0x1F, 0x0E, 0x0A, 0x7A, 0xC0, 0x71, 0xF2, 0x83, 0x8F, 0x03, 0x0F, 0x0F, 0x0C, 0x00, 0x79, 0xF8, 0x61, 0xE0, 0x43, 0x0F, 0x83, 0xE7, 0x18, 0xF9, 0xC1, 0x13, 0xDA, 0xE9, 0x63, 0x8F, 0x0F, 0x83, //140 -0x83, 0x87, 0xC3, 0x1F, 0x3C, 0x70, 0xF0, 0xE1, 0xE1, 0xE3, 0x87, 0xB8, 0x71, 0x0E, 0x20, 0xE3, 0x8D, 0x48, 0x78, 0x1C, 0x93, 0x87, 0x30, 0xE1, 0xC1, 0xC1, 0xE4, 0x78, 0x21, 0x83, 0x83, 0xC3, //160 -0x87, 0x06, 0x39, 0xE5, 0xC3, 0x87, 0x07, 0x0E, 0x1C, 0x1C, 0x70, 0xF4, 0x71, 0x9C, 0x60, 0x36, 0x32, 0xC3, 0x1E, 0x3C, 0xF3, 0x8F, 0x0E, 0x3C, 0x70, 0xE3, 0xC7, 0x8F, 0x0F, 0x0F, 0x0E, 0x3C, //180 -0x78, 0xF0, 0xE3, 0x87, 0x06, 0xF0, 0xE3, 0x07, 0xC1, 0x99, 0x87, 0x0F, 0x18, 0x78, 0x70, 0x70, 0xFC, 0xF3, 0x10, 0xB1, 0x8C, 0x8C, 0x31, 0x7C, 0x70, 0xE1, 0x86, 0x3C, 0x64, 0x6C, 0xB0, 0xE1, //1A0 -0xE3, 0x0F, 0x23, 0x8F, 0x0F, 0x1E, 0x3E, 0x38, 0x3C, 0x38, 0x7B, 0x8F, 0x07, 0x0E, 0x3C, 0xF4, 0x17, 0x1E, 0x3C, 0x78, 0xF2, 0x9E, 0x72, 0x49, 0xE3, 0x25, 0x36, 0x38, 0x58, 0x39, 0xE2, 0xDE, //1C0 -0x3C, 0x78, 0x78, 0xE1, 0xC7, 0x61, 0xE1, 0xE1, 0xB0, 0xF0, 0xF0, 0xC3, 0xC7, 0x0E, 0x38, 0xC0, 0xF0, 0xCE, 0x73, 0x73, 0x18, 0x34, 0xB0, 0xE1, 0xC7, 0x8E, 0x1C, 0x3C, 0xF8, 0x38, 0xF0, 0xE1, //1E0 -0xC1, 0x8B, 0x86, 0x8F, 0x1C, 0x78, 0x70, 0xF0, 0x78, 0xAC, 0xB1, 0x8F, 0x39, 0x31, 0xDB, 0x38, 0x61, 0xC3, 0x0E, 0x0E, 0x38, 0x78, 0x73, 0x17, 0x1E, 0x39, 0x1E, 0x38, 0x64, 0xE1, 0xF1, 0xC1, //200 P', F, V, TH, DH ([labio]dental) -0x4E, 0x0F, 0x40, 0xA2, 0x02, 0xC5, 0x8F, 0x81, 0xA1, 0xFC, 0x12, 0x08, 0x64, 0xE0, 0x3C, 0x22, 0xE0, 0x45, 0x07, 0x8E, 0x0C, 0x32, 0x90, 0xF0, 0x1F, 0x20, 0x49, 0xE0, 0xF8, 0x0C, 0x60, 0xF0, //220 -0x17, 0x1A, 0x41, 0xAA, 0xA4, 0xD0, 0x8D, 0x12, 0x82, 0x1E, 0x1E, 0x03, 0xF8, 0x3E, 0x03, 0x0C, 0x73, 0x80, 0x70, 0x44, 0x26, 0x03, 0x24, 0xE1, 0x3E, 0x04, 0x4E, 0x04, 0x1C, 0xC1, 0x09, 0xCC, //240 -0x9E, 0x90, 0x21, 0x07, 0x90, 0x43, 0x64, 0xC0, 0x0F, 0xC6, 0x90, 0x9C, 0xC1, 0x5B, 0x03, 0xE2, 0x1D, 0x81, 0xE0, 0x5E, 0x1D, 0x03, 0x84, 0xB8, 0x2C, 0x0F, 0x80, 0xB1, 0x83, 0xE0, 0x30, 0x41, //260 -0x1E, 0x43, 0x89, 0x83, 0x50, 0xFC, 0x24, 0x2E, 0x13, 0x83, 0xF1, 0x7C, 0x4C, 0x2C, 0xC9, 0x0D, 0x83, 0xB0, 0xB5, 0x82, 0xE4, 0xE8, 0x06, 0x9C, 0x07, 0xA0, 0x99, 0x1D, 0x07, 0x3E, 0x82, 0x8F, //280 -0x70, 0x30, 0x74, 0x40, 0xCA, 0x10, 0xE4, 0xE8, 0x0F, 0x92, 0x14, 0x3F, 0x06, 0xF8, 0x84, 0x88, 0x43, 0x81, 0x0A, 0x34, 0x39, 0x41, 0xC6, 0xE3, 0x1C, 0x47, 0x03, 0xB0, 0xB8, 0x13, 0x0A, 0xC2, //2A0 -0x64, 0xF8, 0x18, 0xF9, 0x60, 0xB3, 0xC0, 0x65, 0x20, 0x60, 0xA6, 0x8C, 0xC3, 0x81, 0x20, 0x30, 0x26, 0x1E, 0x1C, 0x38, 0xD3, 0x01, 0xB0, 0x26, 0x40, 0xF4, 0x0B, 0xC3, 0x42, 0x1F, 0x85, 0x32, //2C0 -0x26, 0x60, 0x40, 0xC9, 0xCB, 0x01, 0xEC, 0x11, 0x28, 0x40, 0xFA, 0x04, 0x34, 0xE0, 0x70, 0x4C, 0x8C, 0x1D, 0x07, 0x69, 0x03, 0x16, 0xC8, 0x04, 0x23, 0xE8, 0xC6, 0x9A, 0x0B, 0x1A, 0x03, 0xE0, //2E0 -0x76, 0x06, 0x05, 0xCF, 0x1E, 0xBC, 0x58, 0x31, 0x71, 0x66, 0x00, 0xF8, 0x3F, 0x04, 0xFC, 0x0C, 0x74, 0x27, 0x8A, 0x80, 0x71, 0xC2, 0x3A, 0x26, 0x06, 0xC0, 0x1F, 0x05, 0x0F, 0x98, 0x40, 0xAE, //300 /H (palatal) -0x01, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x0E, 0xFE, 0x00, 0x03, 0xDF, 0x80, 0x03, 0xEF, 0x80, 0x1B, 0xF1, 0xC2, 0x00, 0xE7, 0xE0, 0x18, 0xFC, 0xE0, 0x21, 0xFC, 0x80, 0x3C, 0xFC, 0x40, 0x0E, 0x7E, //320 -0x00, 0x3F, 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x3E, 0xF0, 0x07, 0xFC, 0x00, 0x7E, 0x10, 0x3F, 0xFF, 0x00, 0x3F, 0x38, 0x0E, 0x7C, 0x01, 0x87, 0x0C, 0xFC, 0xC7, 0x00, 0x3E, 0x04, //340 -0x0F, 0x3E, 0x1F, 0x0F, 0x0F, 0x1F, 0x0F, 0x02, 0x83, 0x87, 0xCF, 0x03, 0x87, 0x0F, 0x3F, 0xC0, 0x07, 0x9E, 0x60, 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x77, 0xE1, 0xC0, 0xFE, 0xE0, 0xC3, //360 -0xE0, 0x01, 0xDF, 0xF8, 0x03, 0x07, 0x00, 0x7E, 0x70, 0x00, 0x7C, 0x38, 0x18, 0xFE, 0x0C, 0x1E, 0x78, 0x1C, 0x7C, 0x3E, 0x0E, 0x1F, 0x1E, 0x1E, 0x3E, 0x00, 0x7F, 0x83, 0x07, 0xDB, 0x87, 0x83, //380 -0x07, 0xC7, 0x07, 0x10, 0x71, 0xFF, 0x00, 0x3F, 0xE2, 0x01, 0xE0, 0xC1, 0xC3, 0xE1, 0x00, 0x7F, 0xC0, 0x05, 0xF0, 0x20, 0xF8, 0xF0, 0x70, 0xFE, 0x78, 0x79, 0xF8, 0x02, 0x3F, 0x0C, 0x8F, 0x03, //3a0 -0x0F, 0x9F, 0xE0, 0xC1, 0xC7, 0x87, 0x03, 0xC3, 0xC3, 0xB0, 0xE1, 0xE1, 0xC1, 0xE3, 0xE0, 0x71, 0xF0, 0x00, 0xFC, 0x70, 0x7C, 0x0C, 0x3E, 0x38, 0x0E, 0x1C, 0x70, 0xC3, 0xC7, 0x03, 0x81, 0xC1, //3c0 -0xC7, 0xE7, 0x00, 0x0F, 0xC7, 0x87, 0x19, 0x09, 0xEF, 0xC4, 0x33, 0xE0, 0xC1, 0xFC, 0xF8, 0x70, 0xF0, 0x78, 0xF8, 0xF0, 0x61, 0xC7, 0x00, 0x1F, 0xF8, 0x01, 0x7C, 0xF8, 0xF0, 0x78, 0x70, 0x3C, //3e0 -0x7C, 0xCE, 0x0E, 0x21, 0x83, 0xCF, 0x08, 0x07, 0x8F, 0x08, 0xC1, 0x87, 0x8F, 0x80, 0xC7, 0xE3, 0x00, 0x07, 0xF8, 0xE0, 0xEF, 0x00, 0x39, 0xF7, 0x80, 0x0E, 0xF8, 0xE1, 0xE3, 0xF8, 0x21, 0x9F, //400 /X (glottal) -0xC0, 0xFF, 0x03, 0xF8, 0x07, 0xC0, 0x1F, 0xF8, 0xC4, 0x04, 0xFC, 0xC4, 0xC1, 0xBC, 0x87, 0xF0, 0x0F, 0xC0, 0x7F, 0x05, 0xE0, 0x25, 0xEC, 0xC0, 0x3E, 0x84, 0x47, 0xF0, 0x8E, 0x03, 0xF8, 0x03, //420 -0xFB, 0xC0, 0x19, 0xF8, 0x07, 0x9C, 0x0C, 0x17, 0xF8, 0x07, 0xE0, 0x1F, 0xA1, 0xFC, 0x0F, 0xFC, 0x01, 0xF0, 0x3F, 0x00, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0xFD, 0x00, 0xFF, 0x88, 0x0D, 0xF9, 0x01, //440 -0xFF, 0x00, 0x70, 0x07, 0xC0, 0x3E, 0x42, 0xF3, 0x0D, 0xC4, 0x7F, 0x80, 0xFC, 0x07, 0xF0, 0x5E, 0xC0, 0x3F, 0x00, 0x78, 0x3F, 0x81, 0xFF, 0x01, 0xF8, 0x01, 0xC3, 0xE8, 0x0C, 0xE4, 0x64, 0x8F, //460 -0xE4, 0x0F, 0xF0, 0x07, 0xF0, 0xC2, 0x1F, 0x00, 0x7F, 0xC0, 0x6F, 0x80, 0x7E, 0x03, 0xF8, 0x07, 0xF0, 0x3F, 0xC0, 0x78, 0x0F, 0x82, 0x07, 0xFE, 0x22, 0x77, 0x70, 0x02, 0x76, 0x03, 0xFE, 0x00, //480 -0xFE, 0x67, 0x00, 0x7C, 0xC7, 0xF1, 0x8E, 0xC6, 0x3B, 0xE0, 0x3F, 0x84, 0xF3, 0x19, 0xD8, 0x03, 0x99, 0xFC, 0x09, 0xB8, 0x0F, 0xF8, 0x00, 0x9D, 0x24, 0x61, 0xF9, 0x0D, 0x00, 0xFD, 0x03, 0xF0, //4a0 -0x1F, 0x90, 0x3F, 0x01, 0xF8, 0x1F, 0xD0, 0x0F, 0xF8, 0x37, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFA, 0x03, 0xF0, 0x0F, 0x80, 0xFF, 0x01, //4c0 -0xB8, 0x07, 0xF0, 0x01, 0xFC, 0x01, 0xBC, 0x80, 0x13, 0x1E, 0x00, 0x7F, 0xE1, 0x40, 0x7F, 0xA0, 0x7F, 0xB0, 0x00, 0x3F, 0xC0, 0x1F, 0xC0, 0x38, 0x0F, 0xF0, 0x1F, 0x80, 0xFF, 0x01, 0xFC, 0x03, //4e0 +]; + +// Sampled data for consonants, consisting of five 256-byte sections +let sampleTable = [ +//00 T', S, Z (coronal) +0x38, 0x84, 0x6B, 0x19, 0xC6, 0x63, 0x18, 0x86, 0x73, 0x98, 0xC6, 0xB1, 0x1C, 0xCA, 0x31, 0x8C, 0xC7, 0x31, 0x88, 0xC2, 0x30, 0x98, 0x46, 0x31, 0x18, 0xC6, 0x35, 0x0C, 0xCA, 0x31, 0x0C, 0xC6, +//20 +0x21, 0x10, 0x24, 0x69, 0x12, 0xC2, 0x31, 0x14, 0xC4, 0x71, 0x08, 0x4A, 0x22, 0x49, 0xAB, 0x6A, 0xA8, 0xAC, 0x49, 0x51, 0x32, 0xD5, 0x52, 0x88, 0x93, 0x6C, 0x94, 0x22, 0x15, 0x54, 0xD2, 0x25, +//40 +0x96, 0xD4, 0x50, 0xA5, 0x46, 0x21, 0x08, 0x85, 0x6B, 0x18, 0xC4, 0x63, 0x10, 0xCE, 0x6B, 0x18, 0x8C, 0x71, 0x19, 0x8C, 0x63, 0x35, 0x0C, 0xC6, 0x33, 0x99, 0xCC, 0x6C, 0xB5, 0x4E, 0xA2, 0x99, +//60 +0x46, 0x21, 0x28, 0x82, 0x95, 0x2E, 0xE3, 0x30, 0x9C, 0xC5, 0x30, 0x9C, 0xA2, 0xB1, 0x9C, 0x67, 0x31, 0x88, 0x66, 0x59, 0x2C, 0x53, 0x18, 0x84, 0x67, 0x50, 0xCA, 0xE3, 0x0A, 0xAC, 0xAB, 0x30, +//80 +0xAC, 0x62, 0x30, 0x8C, 0x63, 0x10, 0x94, 0x62, 0xB1, 0x8C, 0x82, 0x28, 0x96, 0x33, 0x98, 0xD6, 0xB5, 0x4C, 0x62, 0x29, 0xA5, 0x4A, 0xB5, 0x9C, 0xC6, 0x31, 0x14, 0xD6, 0x38, 0x9C, 0x4B, 0xB4, +//A0 +0x86, 0x65, 0x18, 0xAE, 0x67, 0x1C, 0xA6, 0x63, 0x19, 0x96, 0x23, 0x19, 0x84, 0x13, 0x08, 0xA6, 0x52, 0xAC, 0xCA, 0x22, 0x89, 0x6E, 0xAB, 0x19, 0x8C, 0x62, 0x34, 0xC4, 0x62, 0x19, 0x86, 0x63, +//C0 +0x18, 0xC4, 0x23, 0x58, 0xD6, 0xA3, 0x50, 0x42, 0x54, 0x4A, 0xAD, 0x4A, 0x25, 0x11, 0x6B, 0x64, 0x89, 0x4A, 0x63, 0x39, 0x8A, 0x23, 0x31, 0x2A, 0xEA, 0xA2, 0xA9, 0x44, 0xC5, 0x12, 0xCD, 0x42, +//E0 +0x34, 0x8C, 0x62, 0x18, 0x8C, 0x63, 0x11, 0x48, 0x66, 0x31, 0x9D, 0x44, 0x33, 0x1D, 0x46, 0x31, 0x9C, 0xC6, 0xB1, 0x0C, 0xCD, 0x32, 0x88, 0xC4, 0x73, 0x18, 0x86, 0x73, 0x08, 0xD6, 0x63, 0x58, +//100 CH', J', SH, ZH (palato-alveolar) +0x07, 0x81, 0xE0, 0xF0, 0x3C, 0x07, 0x87, 0x90, 0x3C, 0x7C, 0x0F, 0xC7, 0xC0, 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x80, 0x80, 0x00, 0x1C, 0x78, 0x70, 0xF1, 0xC7, 0x1F, 0xC0, 0x0C, 0xFE, 0x1C, 0x1F, +//120 +0x1F, 0x0E, 0x0A, 0x7A, 0xC0, 0x71, 0xF2, 0x83, 0x8F, 0x03, 0x0F, 0x0F, 0x0C, 0x00, 0x79, 0xF8, 0x61, 0xE0, 0x43, 0x0F, 0x83, 0xE7, 0x18, 0xF9, 0xC1, 0x13, 0xDA, 0xE9, 0x63, 0x8F, 0x0F, 0x83, +//140 +0x83, 0x87, 0xC3, 0x1F, 0x3C, 0x70, 0xF0, 0xE1, 0xE1, 0xE3, 0x87, 0xB8, 0x71, 0x0E, 0x20, 0xE3, 0x8D, 0x48, 0x78, 0x1C, 0x93, 0x87, 0x30, 0xE1, 0xC1, 0xC1, 0xE4, 0x78, 0x21, 0x83, 0x83, 0xC3, +//160 +0x87, 0x06, 0x39, 0xE5, 0xC3, 0x87, 0x07, 0x0E, 0x1C, 0x1C, 0x70, 0xF4, 0x71, 0x9C, 0x60, 0x36, 0x32, 0xC3, 0x1E, 0x3C, 0xF3, 0x8F, 0x0E, 0x3C, 0x70, 0xE3, 0xC7, 0x8F, 0x0F, 0x0F, 0x0E, 0x3C, +//180 +0x78, 0xF0, 0xE3, 0x87, 0x06, 0xF0, 0xE3, 0x07, 0xC1, 0x99, 0x87, 0x0F, 0x18, 0x78, 0x70, 0x70, 0xFC, 0xF3, 0x10, 0xB1, 0x8C, 0x8C, 0x31, 0x7C, 0x70, 0xE1, 0x86, 0x3C, 0x64, 0x6C, 0xB0, 0xE1, +//1A0 +0xE3, 0x0F, 0x23, 0x8F, 0x0F, 0x1E, 0x3E, 0x38, 0x3C, 0x38, 0x7B, 0x8F, 0x07, 0x0E, 0x3C, 0xF4, 0x17, 0x1E, 0x3C, 0x78, 0xF2, 0x9E, 0x72, 0x49, 0xE3, 0x25, 0x36, 0x38, 0x58, 0x39, 0xE2, 0xDE, +//1C0 +0x3C, 0x78, 0x78, 0xE1, 0xC7, 0x61, 0xE1, 0xE1, 0xB0, 0xF0, 0xF0, 0xC3, 0xC7, 0x0E, 0x38, 0xC0, 0xF0, 0xCE, 0x73, 0x73, 0x18, 0x34, 0xB0, 0xE1, 0xC7, 0x8E, 0x1C, 0x3C, 0xF8, 0x38, 0xF0, 0xE1, +//1E0 +0xC1, 0x8B, 0x86, 0x8F, 0x1C, 0x78, 0x70, 0xF0, 0x78, 0xAC, 0xB1, 0x8F, 0x39, 0x31, 0xDB, 0x38, 0x61, 0xC3, 0x0E, 0x0E, 0x38, 0x78, 0x73, 0x17, 0x1E, 0x39, 0x1E, 0x38, 0x64, 0xE1, 0xF1, 0xC1, +//200 P', F, V, TH, DH ([labio]dental) +0x4E, 0x0F, 0x40, 0xA2, 0x02, 0xC5, 0x8F, 0x81, 0xA1, 0xFC, 0x12, 0x08, 0x64, 0xE0, 0x3C, 0x22, 0xE0, 0x45, 0x07, 0x8E, 0x0C, 0x32, 0x90, 0xF0, 0x1F, 0x20, 0x49, 0xE0, 0xF8, 0x0C, 0x60, 0xF0, +//220 +0x17, 0x1A, 0x41, 0xAA, 0xA4, 0xD0, 0x8D, 0x12, 0x82, 0x1E, 0x1E, 0x03, 0xF8, 0x3E, 0x03, 0x0C, 0x73, 0x80, 0x70, 0x44, 0x26, 0x03, 0x24, 0xE1, 0x3E, 0x04, 0x4E, 0x04, 0x1C, 0xC1, 0x09, 0xCC, +//240 +0x9E, 0x90, 0x21, 0x07, 0x90, 0x43, 0x64, 0xC0, 0x0F, 0xC6, 0x90, 0x9C, 0xC1, 0x5B, 0x03, 0xE2, 0x1D, 0x81, 0xE0, 0x5E, 0x1D, 0x03, 0x84, 0xB8, 0x2C, 0x0F, 0x80, 0xB1, 0x83, 0xE0, 0x30, 0x41, +//260 +0x1E, 0x43, 0x89, 0x83, 0x50, 0xFC, 0x24, 0x2E, 0x13, 0x83, 0xF1, 0x7C, 0x4C, 0x2C, 0xC9, 0x0D, 0x83, 0xB0, 0xB5, 0x82, 0xE4, 0xE8, 0x06, 0x9C, 0x07, 0xA0, 0x99, 0x1D, 0x07, 0x3E, 0x82, 0x8F, +//280 +0x70, 0x30, 0x74, 0x40, 0xCA, 0x10, 0xE4, 0xE8, 0x0F, 0x92, 0x14, 0x3F, 0x06, 0xF8, 0x84, 0x88, 0x43, 0x81, 0x0A, 0x34, 0x39, 0x41, 0xC6, 0xE3, 0x1C, 0x47, 0x03, 0xB0, 0xB8, 0x13, 0x0A, 0xC2, +//2A0 +0x64, 0xF8, 0x18, 0xF9, 0x60, 0xB3, 0xC0, 0x65, 0x20, 0x60, 0xA6, 0x8C, 0xC3, 0x81, 0x20, 0x30, 0x26, 0x1E, 0x1C, 0x38, 0xD3, 0x01, 0xB0, 0x26, 0x40, 0xF4, 0x0B, 0xC3, 0x42, 0x1F, 0x85, 0x32, +//2C0 +0x26, 0x60, 0x40, 0xC9, 0xCB, 0x01, 0xEC, 0x11, 0x28, 0x40, 0xFA, 0x04, 0x34, 0xE0, 0x70, 0x4C, 0x8C, 0x1D, 0x07, 0x69, 0x03, 0x16, 0xC8, 0x04, 0x23, 0xE8, 0xC6, 0x9A, 0x0B, 0x1A, 0x03, 0xE0, +//2E0 +0x76, 0x06, 0x05, 0xCF, 0x1E, 0xBC, 0x58, 0x31, 0x71, 0x66, 0x00, 0xF8, 0x3F, 0x04, 0xFC, 0x0C, 0x74, 0x27, 0x8A, 0x80, 0x71, 0xC2, 0x3A, 0x26, 0x06, 0xC0, 0x1F, 0x05, 0x0F, 0x98, 0x40, 0xAE, +//300 /H (palatal) +0x01, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x0E, 0xFE, 0x00, 0x03, 0xDF, 0x80, 0x03, 0xEF, 0x80, 0x1B, 0xF1, 0xC2, 0x00, 0xE7, 0xE0, 0x18, 0xFC, 0xE0, 0x21, 0xFC, 0x80, 0x3C, 0xFC, 0x40, 0x0E, 0x7E, +//320 +0x00, 0x3F, 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x3E, 0xF0, 0x07, 0xFC, 0x00, 0x7E, 0x10, 0x3F, 0xFF, 0x00, 0x3F, 0x38, 0x0E, 0x7C, 0x01, 0x87, 0x0C, 0xFC, 0xC7, 0x00, 0x3E, 0x04, +//340 +0x0F, 0x3E, 0x1F, 0x0F, 0x0F, 0x1F, 0x0F, 0x02, 0x83, 0x87, 0xCF, 0x03, 0x87, 0x0F, 0x3F, 0xC0, 0x07, 0x9E, 0x60, 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x77, 0xE1, 0xC0, 0xFE, 0xE0, 0xC3, +//360 +0xE0, 0x01, 0xDF, 0xF8, 0x03, 0x07, 0x00, 0x7E, 0x70, 0x00, 0x7C, 0x38, 0x18, 0xFE, 0x0C, 0x1E, 0x78, 0x1C, 0x7C, 0x3E, 0x0E, 0x1F, 0x1E, 0x1E, 0x3E, 0x00, 0x7F, 0x83, 0x07, 0xDB, 0x87, 0x83, +//380 +0x07, 0xC7, 0x07, 0x10, 0x71, 0xFF, 0x00, 0x3F, 0xE2, 0x01, 0xE0, 0xC1, 0xC3, 0xE1, 0x00, 0x7F, 0xC0, 0x05, 0xF0, 0x20, 0xF8, 0xF0, 0x70, 0xFE, 0x78, 0x79, 0xF8, 0x02, 0x3F, 0x0C, 0x8F, 0x03, +//3a0 +0x0F, 0x9F, 0xE0, 0xC1, 0xC7, 0x87, 0x03, 0xC3, 0xC3, 0xB0, 0xE1, 0xE1, 0xC1, 0xE3, 0xE0, 0x71, 0xF0, 0x00, 0xFC, 0x70, 0x7C, 0x0C, 0x3E, 0x38, 0x0E, 0x1C, 0x70, 0xC3, 0xC7, 0x03, 0x81, 0xC1, +//3c0 +0xC7, 0xE7, 0x00, 0x0F, 0xC7, 0x87, 0x19, 0x09, 0xEF, 0xC4, 0x33, 0xE0, 0xC1, 0xFC, 0xF8, 0x70, 0xF0, 0x78, 0xF8, 0xF0, 0x61, 0xC7, 0x00, 0x1F, 0xF8, 0x01, 0x7C, 0xF8, 0xF0, 0x78, 0x70, 0x3C, +//3e0 +0x7C, 0xCE, 0x0E, 0x21, 0x83, 0xCF, 0x08, 0x07, 0x8F, 0x08, 0xC1, 0x87, 0x8F, 0x80, 0xC7, 0xE3, 0x00, 0x07, 0xF8, 0xE0, 0xEF, 0x00, 0x39, 0xF7, 0x80, 0x0E, 0xF8, 0xE1, 0xE3, 0xF8, 0x21, 0x9F, +//400 /X (glottal) +0xC0, 0xFF, 0x03, 0xF8, 0x07, 0xC0, 0x1F, 0xF8, 0xC4, 0x04, 0xFC, 0xC4, 0xC1, 0xBC, 0x87, 0xF0, 0x0F, 0xC0, 0x7F, 0x05, 0xE0, 0x25, 0xEC, 0xC0, 0x3E, 0x84, 0x47, 0xF0, 0x8E, 0x03, 0xF8, 0x03, +//420 +0xFB, 0xC0, 0x19, 0xF8, 0x07, 0x9C, 0x0C, 0x17, 0xF8, 0x07, 0xE0, 0x1F, 0xA1, 0xFC, 0x0F, 0xFC, 0x01, 0xF0, 0x3F, 0x00, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0xFD, 0x00, 0xFF, 0x88, 0x0D, 0xF9, 0x01, +//440 +0xFF, 0x00, 0x70, 0x07, 0xC0, 0x3E, 0x42, 0xF3, 0x0D, 0xC4, 0x7F, 0x80, 0xFC, 0x07, 0xF0, 0x5E, 0xC0, 0x3F, 0x00, 0x78, 0x3F, 0x81, 0xFF, 0x01, 0xF8, 0x01, 0xC3, 0xE8, 0x0C, 0xE4, 0x64, 0x8F, +//460 +0xE4, 0x0F, 0xF0, 0x07, 0xF0, 0xC2, 0x1F, 0x00, 0x7F, 0xC0, 0x6F, 0x80, 0x7E, 0x03, 0xF8, 0x07, 0xF0, 0x3F, 0xC0, 0x78, 0x0F, 0x82, 0x07, 0xFE, 0x22, 0x77, 0x70, 0x02, 0x76, 0x03, 0xFE, 0x00, +//480 +0xFE, 0x67, 0x00, 0x7C, 0xC7, 0xF1, 0x8E, 0xC6, 0x3B, 0xE0, 0x3F, 0x84, 0xF3, 0x19, 0xD8, 0x03, 0x99, 0xFC, 0x09, 0xB8, 0x0F, 0xF8, 0x00, 0x9D, 0x24, 0x61, 0xF9, 0x0D, 0x00, 0xFD, 0x03, 0xF0, +//4a0 +0x1F, 0x90, 0x3F, 0x01, 0xF8, 0x1F, 0xD0, 0x0F, 0xF8, 0x37, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFA, 0x03, 0xF0, 0x0F, 0x80, 0xFF, 0x01, +//4c0 +0xB8, 0x07, 0xF0, 0x01, 0xFC, 0x01, 0xBC, 0x80, 0x13, 0x1E, 0x00, 0x7F, 0xE1, 0x40, 0x7F, 0xA0, 0x7F, 0xB0, 0x00, 0x3F, 0xC0, 0x1F, 0xC0, 0x38, 0x0F, 0xF0, 0x1F, 0x80, 0xFF, 0x01, 0xFC, 0x03, +//4e0 0xF1, 0x7E, 0x01, 0xFE, 0x01, 0xF0, 0xFF, 0x00, 0x7F, 0xC0, 0x1D, 0x07, 0xF0, 0x0F, 0xC0, 0x7E, 0x06, 0xE0, 0x07, 0xE0, 0x0F, 0xF8, 0x06, 0xC1, 0xFE, 0x01, 0xFC, 0x03, 0xE0, 0x0F, 0x00, 0xFC]; /** @@ -1739,34 +2054,33 @@ let sampleTable = [//00 T', S, Z (coronal) * * @return {Array} */ - let SetMouthThroat = (mouth, throat) => { let trans = (factor, initialFrequency) => { return (factor * initialFrequency >> 8 & 0xFF) << 1; }; - let freqdata = [[], [], []]; frequencyData.map((v, i) => { freqdata[0][i] = v & 0xFF; freqdata[1][i] = v >> 8 & 0xFF; freqdata[2][i] = v >> 16 & 0xFF; - }); // recalculate formant frequencies 5..29 for the mouth (F1) and throat (F2) + }); + // recalculate formant frequencies 5..29 for the mouth (F1) and throat (F2) for (let pos = 5; pos < 30; pos++) { // recalculate mouth frequency - freqdata[0][pos] = trans(mouth, freqdata[0][pos]); // recalculate throat frequency + freqdata[0][pos] = trans(mouth, freqdata[0][pos]); + // recalculate throat frequency freqdata[1][pos] = trans(throat, freqdata[1][pos]); - } // recalculate formant frequencies 48..53 - + } + // recalculate formant frequencies 48..53 for (let pos = 48; pos < 54; pos++) { // recalculate F1 (mouth formant) - freqdata[0][pos] = trans(mouth, freqdata[0][pos]); // recalculate F2 (throat formant) - + freqdata[0][pos] = trans(mouth, freqdata[0][pos]); + // recalculate F2 (throat formant) freqdata[1][pos] = trans(throat, freqdata[1][pos]); } - return freqdata; }; @@ -1812,7 +2126,6 @@ let SetMouthThroat = (mouth, throat) => { * * @return {Number} */ - let CreateTransitions = (pitches, frequency, amplitude, tuples) => { // 0=pitches // 1=frequency1 @@ -1822,64 +2135,58 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { // 5=amplitude2 // 6=amplitude3 let tables = [pitches, frequency[0], frequency[1], frequency[2], amplitude[0], amplitude[1], amplitude[2]]; - let Read = (table, pos) => { { if (table < 0 || table > tables.length - 1) { - throw new Error("Error invalid table in Read: ".concat(table)); + throw new Error(`Error invalid table in Read: ${table}`); } } - return tables[table][pos]; - }; // linearly interpolate values - + }; + // linearly interpolate values let interpolate = (width, table, frame, change) => { let sign = change < 0; let remainder = Math.abs(change) % width; let div = change / width | 0; let error = 0; let pos = width; - while (--pos > 0) { let val = Read(table, frame) + div; error += remainder; - if (error >= width) { // accumulated a whole integer error, so adjust output error -= width; - if (sign) { val--; } else if (val) { // if input is 0, we always leave it alone val++; } - } // Write updated value back to next frame. - + } + // Write updated value back to next frame. { if (table < 0 || table > tables.length - 1) { - throw new Error("Error invalid table in Read: ".concat(table)); + throw new Error(`Error invalid table in Read: ${table}`); } } - tables[table][++frame] = val; val += div; } }; - let outBlendFrames; let inBlendFrames; let boundary = 0; - for (let pos = 0; pos < tuples.length - 1; pos++) { let phoneme = tuples[pos][0]; - let next_phoneme = tuples[pos + 1][0]; // get the ranking of each phoneme + let next_phoneme = tuples[pos + 1][0]; + // get the ranking of each phoneme let next_rank = blendRank[next_phoneme]; - let rank = blendRank[phoneme]; // compare the rank - lower rank value is stronger + let rank = blendRank[phoneme]; + // compare the rank - lower rank value is stronger if (rank === next_rank) { // same rank, so use out blend lengths from each phoneme outBlendFrames = outBlendLength[phoneme]; @@ -1894,7 +2201,6 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { outBlendFrames = outBlendLength[phoneme]; inBlendFrames = inBlendLength[phoneme]; } - boundary += tuples[pos][1]; let trans_end = boundary + inBlendFrames; let trans_start = boundary - outBlendFrames; @@ -1904,13 +2210,13 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { // unlike the other values, the pitches[] interpolates from // the middle of the current phoneme to the middle of the // next phoneme + // half the width of the current and next phoneme let cur_width = tuples[pos][1] >> 1; let next_width = tuples[pos + 1][1] >> 1; - let pitch = pitches[boundary + next_width] - pitches[boundary - cur_width]; // interpolate the values - + let pitch = pitches[boundary + next_width] - pitches[boundary - cur_width]; + // interpolate the values interpolate(cur_width + next_width, 0, trans_start, pitch); - for (let table = 1; table < 7; table++) { // tables: // 0 pitches @@ -1924,14 +2230,15 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { interpolate(trans_length, table, trans_start, value); } } - } // add the length of last phoneme - + } + // add the length of last phoneme return boundary + tuples[tuples.length - 1][1]; }; let RISING_INFLECTION = 255; let FALLING_INFLECTION = 1; + /** CREATE FRAMES * * The length parameter in the list corresponds to the number of frames @@ -1955,7 +2262,6 @@ let FALLING_INFLECTION = 1; * * @return Array */ - let CreateFrames = (pitch, tuples, frequencyData) => { /** * Create a rising or falling inflection 30 frames prior to index X. @@ -1964,78 +2270,62 @@ let CreateFrames = (pitch, tuples, frequencyData) => { let AddInflection = (inflection, pos, pitches) => { // store the location of the punctuation let end = pos; - if (pos < 30) { pos = 0; } else { pos -= 30; } - - let A; // FIXME: Explain this fix better, it's not obvious + let A; + // FIXME: Explain this fix better, it's not obvious // ML : A =, fixes a problem with invalid pitch with '.' - while ((A = pitches[pos]) === 127) { ++pos; } - while (pos !== end) { // add the inflection direction - A += inflection; // set the inflection + A += inflection; + // set the inflection pitches[pos] = A & 0xFF; - - while (++pos !== end && pitches[pos] === 255) { - /* keep looping */ - } + while (++pos !== end && pitches[pos] === 255) {/* keep looping */} } }; - let pitches = []; let frequency = [[], [], []]; let amplitude = [[], [], []]; let sampledConsonantFlag = []; let X = 0; - for (let i = 0; i < tuples.length; i++) { // get the phoneme at the index let phoneme = tuples[i][0]; - if (phoneme === PHONEME_PERIOD) { AddInflection(FALLING_INFLECTION, X, pitches); } else if (phoneme === PHONEME_QUESTION) { AddInflection(RISING_INFLECTION, X, pitches); - } // get the stress amount (more stress = higher pitch) - + } - let phase1 = stressPitch_tab47492[tuples[i][2]]; // get number of frames to write + // get the stress amount (more stress = higher pitch) + let phase1 = stressPitch_tab47492[tuples[i][2]]; + // get number of frames to write // copy from the source to the frames list - for (let frames = tuples[i][1]; frames > 0; frames--) { frequency[0][X] = frequencyData[0][phoneme]; // F1 frequency - frequency[1][X] = frequencyData[1][phoneme]; // F2 frequency - frequency[2][X] = frequencyData[2][phoneme]; // F3 frequency - amplitude[0][X] = ampldata[phoneme] & 0xFF; // F1 amplitude - amplitude[1][X] = ampldata[phoneme] >> 8 & 0xFF; // F2 amplitude - amplitude[2][X] = ampldata[phoneme] >> 16 & 0xFF; // F3 amplitude - sampledConsonantFlag[X] = sampledConsonantFlags[phoneme]; // phoneme data for sampled consonants - pitches[X] = pitch + phase1 & 0xFF; // pitch - X++; } } - return [pitches, frequency, amplitude, sampledConsonantFlag]; }; let PrepareFrames = (phonemes, pitch, mouth, throat, singmode) => { let freqdata = SetMouthThroat(mouth, throat); + /** * RENDER THE PHONEMES IN THE LIST * @@ -2053,7 +2343,6 @@ let PrepareFrames = (phonemes, pitch, mouth, throat, singmode) => { const [pitches, frequency, amplitude, sampledConsonantFlag] = CreateFrames(pitch, phonemes, freqdata); let t = CreateTransitions(pitches, frequency, amplitude, phonemes); - if (!singmode) { /* ASSIGN PITCH CONTOUR * @@ -2067,72 +2356,68 @@ let PrepareFrames = (phonemes, pitch, mouth, throat, singmode) => { pitches[i] -= frequency[0][i] >> 1; } } + /* * RESCALE AMPLITUDE * * Rescale volume from decibels to the linear scale. */ - - let amplitudeRescale = [0x00, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06, 0x08, 0x09, 0x0B, 0x0D, 0x0F]; - for (let i = amplitude[0].length - 1; i >= 0; i--) { amplitude[0][i] = amplitudeRescale[amplitude[0][i]]; amplitude[1][i] = amplitudeRescale[amplitude[1][i]]; amplitude[2][i] = amplitudeRescale[amplitude[2][i]]; } - let result = [t, frequency, pitches, amplitude, sampledConsonantFlag]; - return result; }; let CreateOutputBuffer = buffersize => { let buffer = new Uint8Array(buffersize); let bufferpos = 0; - let oldTimeTableIndex = 0; // Scale by 16 and write five times. - + let oldTimeTableIndex = 0; + // Scale by 16 and write five times. let writer = (index, A) => { let scaled = (A & 15) * 16; writer.ary(index, [scaled, scaled, scaled, scaled, scaled]); - }; // Write the five given values. - - + }; + // Write the five given values. writer.ary = (index, array) => { // timetable for more accurate c64 simulation - let timetable = [[162, 167, 167, 127, 128], // formants synth - [226, 60, 60, 0, 0], // unvoiced sample 0 - [225, 60, 59, 0, 0], // unvoiced sample 1 - [200, 0, 0, 54, 55], // voiced sample 0 + let timetable = [[162, 167, 167, 127, 128], + // formants synth + [226, 60, 60, 0, 0], + // unvoiced sample 0 + [225, 60, 59, 0, 0], + // unvoiced sample 1 + [200, 0, 0, 54, 55], + // voiced sample 0 [199, 0, 0, 54, 54] // voiced sample 1 ]; bufferpos += timetable[oldTimeTableIndex][index]; - if ((bufferpos / 50 | 0) > buffer.length) { { - throw new Error("Buffer overflow, want ".concat(bufferpos / 50 | 0, " but buffersize is only ").concat(buffer.length, "!")); + throw new Error(`Buffer overflow, want ${bufferpos / 50 | 0} but buffersize is only ${buffer.length}!`); } } - - oldTimeTableIndex = index; // write a little bit in advance - + oldTimeTableIndex = index; + // write a little bit in advance for (let k = 0; k < 5; k++) { buffer[(bufferpos / 50 | 0) + k] = array[k]; } }; - writer.get = () => { - return buffer.slice(0, bufferpos / 50 | 0); }; - return writer; }; let RenderSample = (Output, lastSampleOffset, consonantFlag, pitch) => { // mask low three bits and subtract 1 get value to // convert 0 bits on unvoiced samples. - let kind = (consonantFlag & 7) - 1; // determine which value to use from table { 0x18, 0x1A, 0x17, 0x17, 0x17 } + let kind = (consonantFlag & 7) - 1; + + // determine which value to use from table { 0x18, 0x1A, 0x17, 0x17, 0x17 } // T', S, Z 0 0x18 coronal // CH', J', SH, ZH 1 0x1A palato-alveolar // P', F, V, TH, DH 2 0x17 [labio]dental @@ -2140,53 +2425,43 @@ let RenderSample = (Output, lastSampleOffset, consonantFlag, pitch) => { // /X 4 0x17 glottal let samplePage = kind * 256 & 0xFFFF; // unsigned short - let off = consonantFlag & 248; // unsigned char let renderSample = (index1, value1, index0, value0) => { let bit = 8; let sample = sampleTable[samplePage + off]; - do { if ((sample & 128) !== 0) { Output(index1, value1); } else { Output(index0, value0); } - sample <<= 1; } while (--bit); }; - if (off === 0) { // voiced phoneme: Z*, ZH, V*, DH let phase1 = pitch >> 4 ^ 255 & 0xFF; // unsigned char - off = lastSampleOffset & 0xFF; // unsigned char - do { renderSample(3, 26, 4, 6); off++; off &= 0xFF; } while (++phase1 & 0xFF); - return off; - } // unvoiced - - + } + // unvoiced off = off ^ 255 & 0xFF; // unsigned char - let value0 = sampledConsonantValues0[kind] & 0xFF; // unsigned char - do { renderSample(2, 5, 1, value0); } while (++off & 0xFF); - return lastSampleOffset; -}; // Removed sine table stored a pre calculated sine wave but in modern CPU, we can calculate inline. - +}; +// Removed sine table stored a pre calculated sine wave but in modern CPU, we can calculate inline. let sinus = x => Math.sin(2 * Math.PI * (x / 256)) * 127 | 0; + /** * PROCESS THE FRAMES * @@ -2197,8 +2472,6 @@ let sinus = x => Math.sin(2 * Math.PI * (x / 256)) * 127 | 0; * To simulate them being driven by the glottal pulse, the waveforms are * reset at the beginning of each glottal pulse. */ - - let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, sampledConsonantFlag) => { let speedcounter = speed; let phase1 = 0; @@ -2208,13 +2481,13 @@ let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, s let pos = 0; let glottal_pulse = pitches[0]; let mem38 = glottal_pulse * .75 | 0; - while (frameCount) { - let flags = sampledConsonantFlag[pos]; // unvoiced sampled phoneme? + let flags = sampledConsonantFlag[pos]; + // unvoiced sampled phoneme? if ((flags & 248) !== 0) { - lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); // skip ahead two in the phoneme buffer - + lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); + // skip ahead two in the phoneme buffer pos += 2; frameCount -= 2; speedcounter = speed; @@ -2223,104 +2496,66 @@ let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, s // Rectangle wave consisting of: // 0-128 = 0x90 // 128-255 = 0x70 + // simulate the glottal pulse and formants let ary = []; - let - /* unsigned int */ - p1 = phase1 * 256; // Fixed point integers because we need to divide later on - - let - /* unsigned int */ - p2 = phase2 * 256; - let - /* unsigned int */ - p3 = phase3 * 256; - + let /* unsigned int */p1 = phase1 * 256; // Fixed point integers because we need to divide later on + let /* unsigned int */p2 = phase2 * 256; + let /* unsigned int */p3 = phase3 * 256; for (let k = 0; k < 5; k++) { - const - /* signed char */ - sp1 = sinus(0xff & p1 >> 8); - const - /* signed char */ - sp2 = sinus(0xff & p2 >> 8); - const - /* signed char */ - rp3 = (0xff & p3 >> 8) < 129 ? -0x70 : 0x70; - const - /* signed int */ - sin1 = sp1 * ( - /* (unsigned char) */ - amplitude[0][pos] & 0x0F); - const - /* signed int */ - sin2 = sp2 * ( - /* (unsigned char) */ - amplitude[1][pos] & 0x0F); - const - /* signed int */ - rect = rp3 * ( - /* (unsigned char) */ - amplitude[2][pos] & 0x0F); - let - /* signed int */ - mux = sin1 + sin2 + rect; + const /* signed char */sp1 = sinus(0xff & p1 >> 8); + const /* signed char */sp2 = sinus(0xff & p2 >> 8); + const /* signed char */rp3 = (0xff & p3 >> 8) < 129 ? -0x70 : 0x70; + const /* signed int */sin1 = sp1 * ( /* (unsigned char) */amplitude[0][pos] & 0x0F); + const /* signed int */sin2 = sp2 * ( /* (unsigned char) */amplitude[1][pos] & 0x0F); + const /* signed int */rect = rp3 * ( /* (unsigned char) */amplitude[2][pos] & 0x0F); + let /* signed int */mux = sin1 + sin2 + rect; mux /= 32; mux += 128; // Go from signed to unsigned amplitude - ary[k] = mux | 0; p1 += frequency[0][pos] * 256 / 4; // Compromise, this becomes a shift and works well - p2 += frequency[1][pos] * 256 / 4; p3 += frequency[2][pos] * 256 / 4; } - Output.ary(0, ary); } speedcounter--; - if (speedcounter === 0) { pos++; //go to next amplitude // decrement the frame count - frameCount--; - if (frameCount === 0) { return; } - speedcounter = speed; } - glottal_pulse--; - if (glottal_pulse !== 0) { // not finished with a glottal pulse - mem38--; // within the first 75% of the glottal pulse? - // is the count non-zero and the sampled flag is zero? + mem38--; + // within the first 75% of the glottal pulse? + // is the count non-zero and the sampled flag is zero? if (mem38 !== 0 || flags === 0) { // update the phase of the formants // TODO: we should have a switch to disable this, it causes a pretty nice voice without the masking! phase1 = phase1 + frequency[0][pos]; // & 0xFF; - phase2 = phase2 + frequency[1][pos]; // & 0xFF; - phase3 = phase3 + frequency[2][pos]; // & 0xFF; - continue; - } // voiced sampled phonemes interleave the sample with the + } + + // voiced sampled phonemes interleave the sample with the // glottal pulse. The sample flag is non-zero, so render // the sample for the phoneme. - - lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); } } - glottal_pulse = pitches[pos]; - mem38 = glottal_pulse * .75 | 0; // reset the formant wave generators to keep them in - // sync with the glottal pulse + mem38 = glottal_pulse * .75 | 0; + // reset the formant wave generators to keep them in + // sync with the glottal pulse phase1 = 0; phase2 = 0; phase3 = 0; @@ -2337,44 +2572,38 @@ let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, s * * @return Uint8Array */ - let Renderer = (phonemes, pitch, mouth, throat, speed, singmode) => { pitch = pitch === undefined ? 64 : pitch & 0xFF; mouth = mouth === undefined ? 128 : mouth & 0xFF; throat = throat === undefined ? 128 : throat & 0xFF; speed = (speed || 72) & 0xFF; singmode = singmode || false; - let sentences = PrepareFrames(phonemes, pitch, mouth, throat, singmode); // Reserve 176.4*speed samples (=8*speed ms) for each frame. + let sentences = PrepareFrames(phonemes, pitch, mouth, throat, singmode); + // Reserve 176.4*speed samples (=8*speed ms) for each frame. let Output = CreateOutputBuffer(176.4 // = (22050/125) * phonemes.reduce((pre, v) => pre + v[1], 0) // Combined phoneme length in frames. * speed | 0); const [t, frequency, pitches, amplitude, sampledConsonantFlag] = sentences; - { PrintOutput(pitches, frequency, amplitude, sampledConsonantFlag); } - ProcessFrames(Output, t, speed, frequency, pitches, amplitude, sampledConsonantFlag); return Output.get(); }; - let PrintOutput = (pitches, frequency, amplitude, sampledConsonantFlag) => { let pad = num => { let s = '00000' + num; return s.substr(s.length - 5); }; - console.log('==========================================='); console.log('Final data for speech output:'); console.log(' flags ampl1 freq1 ampl2 freq2 ampl3 freq3 pitch'); console.log('------------------------------------------------'); - for (let i = 0; i < sampledConsonantFlag.length; i++) { console.log(' %s %s %s %s %s %s %s %s', pad(sampledConsonantFlag[i]), pad(amplitude[0][i]), pad(frequency[0][i]), pad(amplitude[1][i]), pad(frequency[1][i]), pad(amplitude[2][i]), pad(frequency[2][i]), pad(pitches[i])); i++; } - console.log('==========================================='); }; @@ -2392,17 +2621,16 @@ let PrintOutput = (pitches, frequency, amplitude, sampledConsonantFlag) => { * * @return {Promise} */ - let SamSpeak = (input, options) => { let buffer = SamBuffer(input, options); - if (false === buffer) { return Promise.reject(); - } // Now push buffer to wave player. - + } + // Now push buffer to wave player. return PlayBuffer(buffer); }; + /** * Process the input and return the audio buffer. * @@ -2417,16 +2645,14 @@ let SamSpeak = (input, options) => { * * @return {Float32Array|Boolean} */ - let SamBuffer = (input, options) => { let buffer = SamProcess(input, options); - if (false === buffer) { return false; } - return Uint8ArrayToFloat32Array(buffer); }; + /** * Process the input and return the audiobuffer. * @@ -2441,15 +2667,12 @@ let SamBuffer = (input, options) => { * * @return {Uint8Array|Boolean} */ - let SamProcess = function (input) { let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; let parsed = Parser(input); - if (false === parsed) { return false; } - return Renderer(parsed, options.pitch, options.mouth, options.throat, options.speed, options.singmode); }; @@ -2466,39 +2689,30 @@ let IS_MUCH_TOO_LOW = 'IHZ MAH3CH TUW4 LAXOW,'; let IS_TOO_LOW = 'IHZ TUW3 LAXOW.'; let IS_A_LITTLE_TOO_LOW = 'IHZ AH LIH3TUL TUW4 LAXOW,'; let IS_CORRECT = 'IHZ KAORREHKT, PLEY5 AXGEH4N? AOR DUW5 YUW PRIY4FER PAONX?'; - let numberToPhonemes = number => { if (number >= 10 && number < 20) { return lookup_teens[number - 10]; } - let n; let phonemes = ''; - if ((n = Math.floor(number / 10) - 2) >= 0) { phonemes += lookup_tens[n]; } - if (n = number % 10) { phonemes += ' ' + lookup_ones[n - 1]; } - return phonemes; }; + /** * @param {Element} e */ - - var guessnum = (e => { let output = e.ownerDocument.createElement('pre'); let button = e.ownerDocument.createElement('button'); let input = e.ownerDocument.createElement('input'); - let show = e => e.style.display = 'inline-block'; - let hide = e => e.style.display = 'none'; - let number; e.appendChild(output); e.appendChild(button); @@ -2513,84 +2727,67 @@ var guessnum = (e => { hide(button); show(input); }); - let say = (phonemes, raw) => { let text = phonemes; - while (text.length < 256) { text += ' '; } - if (raw) { output.innerText += "\n" + raw; } - SamSpeak(phonemes); }; - input.onkeydown = e => { if (e.keyCode === 13) { e.preventDefault(); - if (guess(parseInt(input.value))) { output.innerText = "\n" + output.innerText.split("\n").pop(); hide(input); show(button); } - input.value = ''; } }; + /** * Guess the number. * * @param {Number} guess The guess */ - - let guess = guess => { if (guess > 100) { say(THATS_MORE_THAN_100); return false; } - if (guess < 1) { say(THATS_LESS_THAN_ONE); return false; } - let phonetic = numberToPhonemes(guess); - if (guess > number + 25) { say(phonetic + ' ' + IS_MUCH_TOO_HIGH, guess + ' is much too high.'); return false; } - if (guess > number + 5) { say(phonetic + ' ' + IS_TOO_HIGH, guess + ' is too high.'); return false; } - if (guess > number) { say(phonetic + ' ' + IS_A_LITTLE_TOO_HIGH, guess + ' is a little too high.'); return false; } - if (guess < number - 25) { say(phonetic + ' ' + IS_MUCH_TOO_LOW, guess + ' is much too low.'); return false; } - if (guess < number - 5) { say(phonetic + ' ' + IS_TOO_LOW, guess + ' is too low.'); return false; } - if (guess < number) { say(phonetic + ' ' + IS_A_LITTLE_TOO_LOW, guess + ' is a little too low.'); return false; } - if (guess === number) { say(phonetic + ' ' + IS_CORRECT, guess + ' is correct, play again? or do you prefer PONG?.'); return true; diff --git a/dist/guessnum.esm.min.js b/dist/guessnum.esm.min.js index f027d5a..187a362 100644 --- a/dist/guessnum.esm.min.js +++ b/dist/guessnum.esm.min.js @@ -9,5 +9,5 @@ * * @author 2017 Christian Schiffler */ -let P=(e,r)=>0!=(e&r),H=null,K="*12345678".split(""),V=" *.*?*,*-*IYIHEHAEAAAHAOUHAXIXERUXOHRXLXWXYXWHR*L*W*Y*M*N*NXDXQ*S*SHF*TH/H/XZ*ZHV*DHCH**J*******EYAYOYAWOWUWB*****D*****G*****GX****P*****T*****K*****KX****ULUMUN".match(/.{1,2}/g),B=[32768,49408,49408,49408,49408,164,164,164,164,164,164,132,132,164,164,132,132,132,132,132,132,132,68,4164,4164,4164,4164,2124,3148,2124,1096,16460,9280,8256,8256,9280,64,64,9284,8260,8260,9284,8264,8256,76,8260,0,0,180,180,180,148,148,148,78,78,78,1102,1102,1102,78,78,78,78,78,78,75,75,75,1099,1099,1099,75,75,75,75,75,75,128,193,193],G=[0,4626,4626,4626,2056,2824,2312,2824,3592,3851,2822,4108,3082,1541,1541,3595,3082,3594,3082,2825,2056,2055,2825,2567,2310,2056,2054,2055,2055,2055,770,1285,514,514,514,514,514,514,1542,1542,2055,1542,1542,514,2312,1027,513,286,3597,3852,3852,3852,3598,3593,2054,513,514,1797,513,257,1798,513,514,1798,513,514,2056,514,514,1540,514,514,1798,513,1028,1798,257,1028,1479,1535],Q=(e,r)=>P(B[e],r),j=128,u=[24,26,23,23,23],v=[0,224,230,236,243,249,0,6,12,6],c=[0,31,31,31,31,2,2,2,2,2,2,2,2,2,5,5,2,10,2,8,5,5,11,10,9,8,8,160,8,8,23,31,18,18,18,18,30,30,20,20,20,20,23,23,26,26,29,29,2,2,2,2,2,2,26,29,27,26,29,27,26,29,27,26,29,27,23,29,23,23,29,23,23,29,23,23,29,23,23,23],Y=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,2,4,4,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,0,1,0,5,5,5,5,5,4,4,2,0,1,2,0,1,2,0,1,2,0,1,2,0,2,2,0,1,3,0,2,3,0,2,160,160],E=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,4,4,3,3,3,3,3,1,2,3,2,1,3,3,3,3,1,1,3,3,3,2,2,3,2,3,0,0,5,5,5,5,4,4,2,0,2,2,0,3,2,0,4,2,0,3,2,0,2,2,0,2,3,0,3,3,0,3,176,160],A=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,226,211,187,124,149,1,2,3,3,0,114,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,25,0,0,0,0,0,0,0,0,0],s=[0,5980947,5980947,5980947,5980947,7230474,6113550,5980947,5783320,5842971,5712919,5775125,5383440,5844244,6113550,4075794,5383182,5774866,4076306,7218448,5250317,6112527,5904395,3944978,7216654,5904395,7230217,5320198,7943686,6641158,7943686,5980945,6506758,6967046,5315078,7946758,6113550,5383440,6107913,6767114,4990984,6106890,6639366,6639366,7946758,6639365,7958022,0,5916691,5777179,5775125,5778203,5774866,5382669,5315078,5315078,5315078,7946758,7946758,7946758,7368198,7237126,7237126,6181894,6181894,6181894,5315078,5315078,5315078,7946758,7946758,7946758,6647046,6641162,7367946,6181894,6181894,6181894,556844,98067],I=[0,0,0,0,0,526861,461581,527630,527887,68879,68623,3087,68367,2316,461581,330508,68623,3087,396301,67597,2061,461838,2061,330252,67597,2061,526861,780,2313,198153,0,0,0,0,0,0,0,0,779,66827,779,1035,0,0,1,66827,920064,66050,593422,68879,3087,68879,3087,2061,2,260,0,2,260,0,1,260,0,1,260,0,0,0,0,0,0,0,0,461324,0,0,330240,0,1245199,1048591],h=[56,132,107,25,198,99,24,134,115,152,198,177,28,202,49,140,199,49,136,194,48,152,70,49,24,198,53,12,202,49,12,198,33,16,36,105,18,194,49,20,196,113,8,74,34,73,171,106,168,172,73,81,50,213,82,136,147,108,148,34,21,84,210,37,150,212,80,165,70,33,8,133,107,24,196,99,16,206,107,24,140,113,25,140,99,53,12,198,51,153,204,108,181,78,162,153,70,33,40,130,149,46,227,48,156,197,48,156,162,177,156,103,49,136,102,89,44,83,24,132,103,80,202,227,10,172,171,48,172,98,48,140,99,16,148,98,177,140,130,40,150,51,152,214,181,76,98,41,165,74,181,156,198,49,20,214,56,156,75,180,134,101,24,174,103,28,166,99,25,150,35,25,132,19,8,166,82,172,202,34,137,110,171,25,140,98,52,196,98,25,134,99,24,196,35,88,214,163,80,66,84,74,173,74,37,17,107,100,137,74,99,57,138,35,49,42,234,162,169,68,197,18,205,66,52,140,98,24,140,99,17,72,102,49,157,68,51,29,70,49,156,198,177,12,205,50,136,196,115,24,134,115,8,214,99,88,7,129,224,240,60,7,135,144,60,124,15,199,192,192,240,124,30,7,128,128,0,28,120,112,241,199,31,192,12,254,28,31,31,14,10,122,192,113,242,131,143,3,15,15,12,0,121,248,97,224,67,15,131,231,24,249,193,19,218,233,99,143,15,131,131,135,195,31,60,112,240,225,225,227,135,184,113,14,32,227,141,72,120,28,147,135,48,225,193,193,228,120,33,131,131,195,135,6,57,229,195,135,7,14,28,28,112,244,113,156,96,54,50,195,30,60,243,143,14,60,112,227,199,143,15,15,14,60,120,240,227,135,6,240,227,7,193,153,135,15,24,120,112,112,252,243,16,177,140,140,49,124,112,225,134,60,100,108,176,225,227,15,35,143,15,30,62,56,60,56,123,143,7,14,60,244,23,30,60,120,242,158,114,73,227,37,54,56,88,57,226,222,60,120,120,225,199,97,225,225,176,240,240,195,199,14,56,192,240,206,115,115,24,52,176,225,199,142,28,60,248,56,240,225,193,139,134,143,28,120,112,240,120,172,177,143,57,49,219,56,97,195,14,14,56,120,115,23,30,57,30,56,100,225,241,193,78,15,64,162,2,197,143,129,161,252,18,8,100,224,60,34,224,69,7,142,12,50,144,240,31,32,73,224,248,12,96,240,23,26,65,170,164,208,141,18,130,30,30,3,248,62,3,12,115,128,112,68,38,3,36,225,62,4,78,4,28,193,9,204,158,144,33,7,144,67,100,192,15,198,144,156,193,91,3,226,29,129,224,94,29,3,132,184,44,15,128,177,131,224,48,65,30,67,137,131,80,252,36,46,19,131,241,124,76,44,201,13,131,176,181,130,228,232,6,156,7,160,153,29,7,62,130,143,112,48,116,64,202,16,228,232,15,146,20,63,6,248,132,136,67,129,10,52,57,65,198,227,28,71,3,176,184,19,10,194,100,248,24,249,96,179,192,101,32,96,166,140,195,129,32,48,38,30,28,56,211,1,176,38,64,244,11,195,66,31,133,50,38,96,64,201,203,1,236,17,40,64,250,4,52,224,112,76,140,29,7,105,3,22,200,4,35,232,198,154,11,26,3,224,118,6,5,207,30,188,88,49,113,102,0,248,63,4,252,12,116,39,138,128,113,194,58,38,6,192,31,5,15,152,64,174,1,127,192,7,255,0,14,254,0,3,223,128,3,239,128,27,241,194,0,231,224,24,252,224,33,252,128,60,252,64,14,126,0,63,62,0,15,254,0,31,255,0,62,240,7,252,0,126,16,63,255,0,63,56,14,124,1,135,12,252,199,0,62,4,15,62,31,15,15,31,15,2,131,135,207,3,135,15,63,192,7,158,96,63,192,3,254,0,63,224,119,225,192,254,224,195,224,1,223,248,3,7,0,126,112,0,124,56,24,254,12,30,120,28,124,62,14,31,30,30,62,0,127,131,7,219,135,131,7,199,7,16,113,255,0,63,226,1,224,193,195,225,0,127,192,5,240,32,248,240,112,254,120,121,248,2,63,12,143,3,15,159,224,193,199,135,3,195,195,176,225,225,193,227,224,113,240,0,252,112,124,12,62,56,14,28,112,195,199,3,129,193,199,231,0,15,199,135,25,9,239,196,51,224,193,252,248,112,240,120,248,240,97,199,0,31,248,1,124,248,240,120,112,60,124,206,14,33,131,207,8,7,143,8,193,135,143,128,199,227,0,7,248,224,239,0,57,247,128,14,248,225,227,248,33,159,192,255,3,248,7,192,31,248,196,4,252,196,193,188,135,240,15,192,127,5,224,37,236,192,62,132,71,240,142,3,248,3,251,192,25,248,7,156,12,23,248,7,224,31,161,252,15,252,1,240,63,0,254,3,240,31,0,253,0,255,136,13,249,1,255,0,112,7,192,62,66,243,13,196,127,128,252,7,240,94,192,63,0,120,63,129,255,1,248,1,195,232,12,228,100,143,228,15,240,7,240,194,31,0,127,192,111,128,126,3,248,7,240,63,192,120,15,130,7,254,34,119,112,2,118,3,254,0,254,103,0,124,199,241,142,198,59,224,63,132,243,25,216,3,153,252,9,184,15,248,0,157,36,97,249,13,0,253,3,240,31,144,63,1,248,31,208,15,248,55,1,248,7,240,15,192,63,0,254,3,248,15,192,63,0,250,3,240,15,128,255,1,184,7,240,1,252,1,188,128,19,30,0,127,225,64,127,160,127,176,0,63,192,31,192,56,15,240,31,128,255,1,252,3,241,126,1,254,1,240,255,0,127,192,29,7,240,15,192,126,6,224,7,224,15,248,6,193,254,1,252,3,224,15,0,252],d=(a,r,e,t)=>{var l=(7&e)-1;let i=256*l&65535,f=248&e;var n=(e,r,t,l)=>{let n=8,o=h[i+f];for(;0!=(128&o)?a(e,r):a(t,l),o<<=1,--n;);};if(0===f){let e=t>>4^255;for(f=255&r;n(3,26,4,6),f++,f&=255,255&++e;);return f}f^=255;for(var o=255&u[l];n(2,5,1,o),255&++f;);return r},g=e=>127*Math.sin(2*Math.PI*(e/256))|0,T=["WAHN","TUW5","THRIY5","FOHR5","FAY5V","SIH5KS","SEH5VUN","EY5T","NAY5N"],N=["TEH4N","IHLEH4VIXN","TWEH4LV","THER4TIY6N","FOH4RTIY6N","FIH4FTIY6N","SIH4KSTIY6N","SEH4VUNTIY6N","EY4TIY6N","NAY4NTIY6N"],W=["TWEHNTIY","THERTIY","FOHRTIY","FIH4FTIY6","SIHKSTIY6","SEH4VUNTIY6","EY4T1Y6","NAY4NTIY6"];var e=e=>{let l=e.ownerDocument.createElement("pre"),r=e.ownerDocument.createElement("button"),t=e.ownerDocument.createElement("input"),n=e=>e.style.display="inline-block",o=e=>e.style.display="none",a,i=(e.appendChild(l),e.appendChild(r),e.appendChild(t),o(t),r.type="button",r.innerText="Start game",r.addEventListener("click",()=>{l.textContent="",a=Math.floor(99*Math.random()+1),i("GEH3S DHAX NAH4MBER BIXTWIY5N WAH4N Q AEND WAHN /HAH4NDRIHD"),o(r),n(t)}),(r,t)=>{let e=r;for(;e.length<256;)e+=" ";if(t&&(l.innerText+="\n"+t),!1===(t=(()=>{var e=function(x,e){var r=1{if(!x)return!1;var l=e=>e===A.length?null:A[e],n=(r,e,t,l)=>{for(let e=A.length-1;e>=r;e--)A[e+1]=A[e],v[e+1]=a(e),s[e+1]=o(e);A[r]=e,v[r]=0|l,s[r]=t};let o=e=>0|s[e],a=e=>0|v[e];var r,t,i,f,e,H,u=(e,r)=>{v[e]=r};let s=[],v=[],A=[],I=0;var h=x,T=e=>{s[I]=0,v[I]=0,A[I++]=e};for(let r=0;r{var e=V.findIndex(e=>e===r+t&&"*"!==e[1]);return-1!==e&&e})(N,c)))r++,T(e);else if(!1!==(e=(r=>{var e=V.findIndex(e=>e===r+"*");return-1!==e&&e})(N)))T(e);else{for(e=K.length;N!==K[e]&&0{A[e]=r},d=l,g=o,W=(e,r)=>{switch(e){case 53:Q(d(r-1),1024)&&E(r,16);break;case 42:Y(r+1,43,g(r));break;case 44:Y(r+1,45,g(r))}},p=(e,r)=>{E(e,13),Y(e+1,r,g(e))};let e=-1,r;for(;null!==(r=d(++e));)if(0!==r)if(Q(r,16))Y(e+1,Q(r,32)?21:20,g(e)),W(r,e);else if(78===r)p(e,24);else if(79===r)p(e,27);else if(80===r)p(e,28);else if(Q(r,j)&&g(e))0===d(e+1)&&null!==(r=d(e+2))&&Q(r,j)&&g(e+2)&&Y(e+2,31,0);else{var U,X=0===e?null:d(e-1);if(23===r)switch(X){case 69:E(e-1,42);break;case 57:E(e-1,44);break;default:Q(X,j)&&E(e,18)}else 24===r&&Q(X,j)?E(e,19):60===X&&32===r?E(e,38):60===r?(U=d(e+1),Q(U,32)||null===U||E(e,63)):(72===r&&(U=d(e+1),Q(U,32)&&null!==U||(E(e,75),r=75)),Q(r,1)&&32===X?E(e,r-12):Q(r,1)||W(r,e),69!==r&&57!==r||0>8),e++}}{var R=l,m=u,S=a;for(let e=0;null!==R(e);e++)if(Q(R(e),256)){for(var L,k=e;1<--e&&!Q(R(e),j););if(0===e)break;for(;e>1)+L+1))}let r=-1,t;for(;null!==(t=R(++r));){let e=r;if(Q(t,j))t=R(++e),Q(t,64)?(i=null===t?65:B[t],P(i,4)?(f=S(r),m(r,(f>>2)+f+1)):P(i,1)&&(f=S(r),m(r,f-(f>>3)))):18!==t&&19!==t||!Q(R(++e),64)||m(r,S(r)-1);else if(Q(t,2048))null!==(t=R(++e))&&Q(t,2)&&(m(e,6),m(e-1,5));else if(Q(t,2)){for(;0===(t=R(++e)););null!==t&&Q(t,2)&&(m(e,1+(S(e)>>1)),m(r,1+(S(r)>>1)))}else 0e?[e,0|v[r],0|s[r]]:null).filter(e=>e)})();return!1!==t&&((e,i,f,H,r,t)=>{r=255&(r||72),t=((e,r)=>{const[t,l,n,o]=((t,l,n)=>{var e=(e,r,t)=>{var l=r;r<30?r=0:r-=30;let n;for(;127===(n=t[r]);)++r;for(;r!==l;)for(n+=e,t[r]=255&n;++r!==l&&255===t[r];);};let o=[],a=[[],[],[]],i=[[],[],[]],f=[],H=0;for(let r=0;r>8&255,i[2][H]=I[u]>>16&255,f[H]=A[u],o[H]=t+s&255,H++}return[o,a,i,f]})(i,e,((r,t)=>{var l=(e,r)=>(e*r>>8&255)<<1;let n=[[],[],[]];s.map((e,r)=>{n[0][r]=255&e,n[1][r]=e>>8&255,n[2][r]=e>>16&255});for(let e=5;e<30;e++)n[0][e]=l(r,n[0][e]),n[1][e]=l(t,n[1][e]);for(let e=48;e<54;e++)n[0][e]=l(r,n[0][e]),n[1][e]=l(t,n[1][e]);return n})(f,H));if(e=((r,e,t,l)=>{let H=[r,e[0],e[1],e[2],t[0],t[1],t[2]],u=(e,r)=>H[e][r];var n=(r,t,l,e)=>{var n=e<0,o=Math.abs(e)%r,a=e/r|0;let i=0,f=r;for(;0<--f;){let e=u(t,l)+a;(i+=o)>=r&&(i-=r,n?e--:e&&e++),H[t][++l]=e,e+=a}};let o,a,i=0;for(let e=0;e>1)+(v=l[e+1][1]>>1),0,h,r[i+v]-r[i-A]);for(let e=1;e<7;e++){var N=u(e,I)-u(e,h);n(T,e,h,N)}}}return i+l[l.length-1][1]})(t,l,n,e),!r)for(let e=0;e>1;var a=[0,1,2,2,2,3,3,4,4,5,6,8,9,11,13,15];for(let e=n[0].length-1;0<=e;e--)n[0][e]=a[n[0][e]],n[1][e]=a[n[1][e]],n[2][e]=a[n[2][e]];return[e,l,t,n,o]})(e,(i=void 0===i?64:255&i,f=void 0===f?128:255&f,H=void 0===H?128:255&H,t||!1));let l=(e=>{let t=new Uint8Array(e),l=0,n=0,o=(e,r)=>{r=16*(15&r),o.ary(e,[r,r,r,r,r])};return o.ary=(e,r)=>{if(((l+=[[162,167,167,127,128],[226,60,60,0,0],[225,60,59,0,0],[200,0,0,54,55],[199,0,0,54,54]][n][e])/50|0)>t.length)throw new Error;n=e;for(let e=0;e<5;e++)t[(l/50|0)+e]=r[e]},o.get=()=>t.slice(0,l/50|0),o})(176.4*e.reduce((e,r)=>e+r[1],0)*r|0);var[e,t,n,o,a]=t;return((e,r,t,o,l,a,n)=>{let i=t,f=0,H=0,u=0,s=0,v=0,A=l[0],I=.75*A|0;for(;r;){var h=n[v];if(0!=(248&h))s=d(e,s,h,l[255&v]),v+=2,r-=2,i=t;else{{let r=[],t=256*f,l=256*H,n=256*u;for(let e=0;e<5;e++){var T=g(255&t>>8),N=g(255&l>>8),c=(255&n>>8)<129?-112:112,T=(T*(15&a[0][v])+N*(15&a[1][v])+c*(15&a[2][v]))/32+128;r[e]=0|T,t+=256*o[0][v]/4,l+=256*o[1][v]/4,n+=256*o[2][v]/4}e.ary(0,r)}if(0==--i){if(v++,0==--r)return;i=t}if(0!=--A){if(0!=--I||0===h){f+=o[0][v],H+=o[1][v],u+=o[2][v];continue}s=d(e,s,h,l[255&v])}}A=l[v],I=.75*A|0,f=0,H=0,u=0}})(l,e,r,t,n,o,a),l.get()})(t,r.pitch,r.mouth,r.throat,r.speed,r.singmode)}(r,void 0);if(!1===e)return!1;{var t=e;let r=new Float32Array(t.length);for(let e=0;e{let t=a.createBufferSource(),l=a.createBuffer(1,i.length,22050),n=l.getChannelData(0);for(let e=0;e{e(!0)},o=e=>{t.disconnect(),r(e)},t.start(0)});e.abort=o,e}}}),f=(t.onkeydown=e=>{13===e.keyCode&&(e.preventDefault(),f(parseInt(t.value))&&(l.innerText="\n"+l.innerText.split("\n").pop(),o(t),n(r)),t.value="")},e=>{if(100{if(10<=e&&e<20)return N[e-10];let r,t="";return 0<=(r=Math.floor(e/10)-2)&&(t+=W[r]),(r=e%10)&&(t+=" "+T[r-1]),t})(e);return e>a+25?(i(r+" IHZ MAH3CH TUW5 /HAY6.",e+" is much too high."),!1):e>a+5?(i(r+" IHZ TUW3 /HAY6.",e+" is too high."),!1):e>a?(i(r+" IHZ AH LIH3TUL TUW4 /HAY6,",e+" is a little too high."),!1):e0!=(e&t),H=null,m="*12345678".split(""),S=" *.*?*,*-*IYIHEHAEAAAHAOUHAXIXERUXOHRXLXWXYXWHR*L*W*Y*M*N*NXDXQ*S*SHF*TH/H/XZ*ZHV*DHCH**J*******EYAYOYAWOWUWB*****D*****G*****GX****P*****T*****K*****KX****ULUMUN".match(/.{1,2}/g),L=[32768,49408,49408,49408,49408,164,164,164,164,164,164,132,132,164,164,132,132,132,132,132,132,132,68,4164,4164,4164,4164,2124,3148,2124,1096,16460,9280,8256,8256,9280,64,64,9284,8260,8260,9284,8264,8256,76,8260,0,0,180,180,180,148,148,148,78,78,78,1102,1102,1102,78,78,78,78,78,78,75,75,75,1099,1099,1099,75,75,75,75,75,75,128,193,193],O=[0,4626,4626,4626,2056,2824,2312,2824,3592,3851,2822,4108,3082,1541,1541,3595,3082,3594,3082,2825,2056,2055,2825,2567,2310,2056,2054,2055,2055,2055,770,1285,514,514,514,514,514,514,1542,1542,2055,1542,1542,514,2312,1027,513,286,3597,3852,3852,3852,3598,3593,2054,513,514,1797,513,257,1798,513,514,1798,513,514,2056,514,514,1540,514,514,1798,513,1028,1798,257,1028,1479,1535],y=(e,t)=>R(L[e],t),M=128,u=[24,26,23,23,23],A=[0,224,230,236,243,249,0,6,12,6],E=[0,31,31,31,31,2,2,2,2,2,2,2,2,2,5,5,2,10,2,8,5,5,11,10,9,8,8,160,8,8,23,31,18,18,18,18,30,30,20,20,20,20,23,23,26,26,29,29,2,2,2,2,2,2,26,29,27,26,29,27,26,29,27,26,29,27,23,29,23,23,29,23,23,29,23,23,29,23,23,23],d=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,2,4,4,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,0,1,0,5,5,5,5,5,4,4,2,0,1,2,0,1,2,0,1,2,0,1,2,0,2,2,0,1,3,0,2,3,0,2,160,160],v=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,4,4,3,3,3,3,3,1,2,3,2,1,3,3,3,3,1,1,3,3,3,2,2,3,2,3,0,0,5,5,5,5,4,4,2,0,2,2,0,3,2,0,4,2,0,3,2,0,2,2,0,2,3,0,3,3,0,3,176,160],I=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,226,211,187,124,149,1,2,3,3,0,114,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,25,0,0,0,0,0,0,0,0,0],s=[0,5980947,5980947,5980947,5980947,7230474,6113550,5980947,5783320,5842971,5712919,5775125,5383440,5844244,6113550,4075794,5383182,5774866,4076306,7218448,5250317,6112527,5904395,3944978,7216654,5904395,7230217,5320198,7943686,6641158,7943686,5980945,6506758,6967046,5315078,7946758,6113550,5383440,6107913,6767114,4990984,6106890,6639366,6639366,7946758,6639365,7958022,0,5916691,5777179,5775125,5778203,5774866,5382669,5315078,5315078,5315078,7946758,7946758,7946758,7368198,7237126,7237126,6181894,6181894,6181894,5315078,5315078,5315078,7946758,7946758,7946758,6647046,6641162,7367946,6181894,6181894,6181894,556844,98067],h=[0,0,0,0,0,526861,461581,527630,527887,68879,68623,3087,68367,2316,461581,330508,68623,3087,396301,67597,2061,461838,2061,330252,67597,2061,526861,780,2313,198153,0,0,0,0,0,0,0,0,779,66827,779,1035,0,0,1,66827,920064,66050,593422,68879,3087,68879,3087,2061,2,260,0,2,260,0,1,260,0,1,260,0,0,0,0,0,0,0,0,461324,0,0,330240,0,1245199,1048591],T=[56,132,107,25,198,99,24,134,115,152,198,177,28,202,49,140,199,49,136,194,48,152,70,49,24,198,53,12,202,49,12,198,33,16,36,105,18,194,49,20,196,113,8,74,34,73,171,106,168,172,73,81,50,213,82,136,147,108,148,34,21,84,210,37,150,212,80,165,70,33,8,133,107,24,196,99,16,206,107,24,140,113,25,140,99,53,12,198,51,153,204,108,181,78,162,153,70,33,40,130,149,46,227,48,156,197,48,156,162,177,156,103,49,136,102,89,44,83,24,132,103,80,202,227,10,172,171,48,172,98,48,140,99,16,148,98,177,140,130,40,150,51,152,214,181,76,98,41,165,74,181,156,198,49,20,214,56,156,75,180,134,101,24,174,103,28,166,99,25,150,35,25,132,19,8,166,82,172,202,34,137,110,171,25,140,98,52,196,98,25,134,99,24,196,35,88,214,163,80,66,84,74,173,74,37,17,107,100,137,74,99,57,138,35,49,42,234,162,169,68,197,18,205,66,52,140,98,24,140,99,17,72,102,49,157,68,51,29,70,49,156,198,177,12,205,50,136,196,115,24,134,115,8,214,99,88,7,129,224,240,60,7,135,144,60,124,15,199,192,192,240,124,30,7,128,128,0,28,120,112,241,199,31,192,12,254,28,31,31,14,10,122,192,113,242,131,143,3,15,15,12,0,121,248,97,224,67,15,131,231,24,249,193,19,218,233,99,143,15,131,131,135,195,31,60,112,240,225,225,227,135,184,113,14,32,227,141,72,120,28,147,135,48,225,193,193,228,120,33,131,131,195,135,6,57,229,195,135,7,14,28,28,112,244,113,156,96,54,50,195,30,60,243,143,14,60,112,227,199,143,15,15,14,60,120,240,227,135,6,240,227,7,193,153,135,15,24,120,112,112,252,243,16,177,140,140,49,124,112,225,134,60,100,108,176,225,227,15,35,143,15,30,62,56,60,56,123,143,7,14,60,244,23,30,60,120,242,158,114,73,227,37,54,56,88,57,226,222,60,120,120,225,199,97,225,225,176,240,240,195,199,14,56,192,240,206,115,115,24,52,176,225,199,142,28,60,248,56,240,225,193,139,134,143,28,120,112,240,120,172,177,143,57,49,219,56,97,195,14,14,56,120,115,23,30,57,30,56,100,225,241,193,78,15,64,162,2,197,143,129,161,252,18,8,100,224,60,34,224,69,7,142,12,50,144,240,31,32,73,224,248,12,96,240,23,26,65,170,164,208,141,18,130,30,30,3,248,62,3,12,115,128,112,68,38,3,36,225,62,4,78,4,28,193,9,204,158,144,33,7,144,67,100,192,15,198,144,156,193,91,3,226,29,129,224,94,29,3,132,184,44,15,128,177,131,224,48,65,30,67,137,131,80,252,36,46,19,131,241,124,76,44,201,13,131,176,181,130,228,232,6,156,7,160,153,29,7,62,130,143,112,48,116,64,202,16,228,232,15,146,20,63,6,248,132,136,67,129,10,52,57,65,198,227,28,71,3,176,184,19,10,194,100,248,24,249,96,179,192,101,32,96,166,140,195,129,32,48,38,30,28,56,211,1,176,38,64,244,11,195,66,31,133,50,38,96,64,201,203,1,236,17,40,64,250,4,52,224,112,76,140,29,7,105,3,22,200,4,35,232,198,154,11,26,3,224,118,6,5,207,30,188,88,49,113,102,0,248,63,4,252,12,116,39,138,128,113,194,58,38,6,192,31,5,15,152,64,174,1,127,192,7,255,0,14,254,0,3,223,128,3,239,128,27,241,194,0,231,224,24,252,224,33,252,128,60,252,64,14,126,0,63,62,0,15,254,0,31,255,0,62,240,7,252,0,126,16,63,255,0,63,56,14,124,1,135,12,252,199,0,62,4,15,62,31,15,15,31,15,2,131,135,207,3,135,15,63,192,7,158,96,63,192,3,254,0,63,224,119,225,192,254,224,195,224,1,223,248,3,7,0,126,112,0,124,56,24,254,12,30,120,28,124,62,14,31,30,30,62,0,127,131,7,219,135,131,7,199,7,16,113,255,0,63,226,1,224,193,195,225,0,127,192,5,240,32,248,240,112,254,120,121,248,2,63,12,143,3,15,159,224,193,199,135,3,195,195,176,225,225,193,227,224,113,240,0,252,112,124,12,62,56,14,28,112,195,199,3,129,193,199,231,0,15,199,135,25,9,239,196,51,224,193,252,248,112,240,120,248,240,97,199,0,31,248,1,124,248,240,120,112,60,124,206,14,33,131,207,8,7,143,8,193,135,143,128,199,227,0,7,248,224,239,0,57,247,128,14,248,225,227,248,33,159,192,255,3,248,7,192,31,248,196,4,252,196,193,188,135,240,15,192,127,5,224,37,236,192,62,132,71,240,142,3,248,3,251,192,25,248,7,156,12,23,248,7,224,31,161,252,15,252,1,240,63,0,254,3,240,31,0,253,0,255,136,13,249,1,255,0,112,7,192,62,66,243,13,196,127,128,252,7,240,94,192,63,0,120,63,129,255,1,248,1,195,232,12,228,100,143,228,15,240,7,240,194,31,0,127,192,111,128,126,3,248,7,240,63,192,120,15,130,7,254,34,119,112,2,118,3,254,0,254,103,0,124,199,241,142,198,59,224,63,132,243,25,216,3,153,252,9,184,15,248,0,157,36,97,249,13,0,253,3,240,31,144,63,1,248,31,208,15,248,55,1,248,7,240,15,192,63,0,254,3,248,15,192,63,0,250,3,240,15,128,255,1,184,7,240,1,252,1,188,128,19,30,0,127,225,64,127,160,127,176,0,63,192,31,192,56,15,240,31,128,255,1,252,3,241,126,1,254,1,240,255,0,127,192,29,7,240,15,192,126,6,224,7,224,15,248,6,193,254,1,252,3,224,15,0,252],g=(i,t,e,r)=>{let l=(7&e)-1,a=256*l&65535,f=248&e,n=(e,t,r,l)=>{let n=8,o=T[a+f];for(;0!=(128&o)?i(e,t):i(r,l),o<<=1,--n;);};if(0===f){let e=r>>4^255;for(f=255&t;n(3,26,4,6),f++,f&=255,255&++e;);return f}f^=255;for(var o=255&u[l];n(2,5,1,o),255&++f;);return t},W=e=>127*Math.sin(2*Math.PI*(e/256))|0,N=["WAHN","TUW5","THRIY5","FOHR5","FAY5V","SIH5KS","SEH5VUN","EY5T","NAY5N"],Y=["TEH4N","IHLEH4VIXN","TWEH4LV","THER4TIY6N","FOH4RTIY6N","FIH4FTIY6N","SIH4KSTIY6N","SEH4VUNTIY6N","EY4TIY6N","NAY4NTIY6N"],c=["TWEHNTIY","THERTIY","FOHRTIY","FIH4FTIY6","SIHKSTIY6","SEH4VUNTIY6","EY4T1Y6","NAY4NTIY6"],e=e=>{let l=e.ownerDocument.createElement("pre"),t=e.ownerDocument.createElement("button"),r=e.ownerDocument.createElement("input"),n=e=>e.style.display="inline-block",o=e=>e.style.display="none",i,a=(e.appendChild(l),e.appendChild(t),e.appendChild(r),o(r),t.type="button",t.innerText="Start game",t.addEventListener("click",()=>{l.textContent="",i=Math.floor(99*Math.random()+1),a("GEH3S DHAX NAH4MBER BIXTWIY5N WAH4N Q AEND WAHN /HAH4NDRIHD"),o(t),n(r)}),(e,t)=>{let r=e;for(;r.length<256;)r+=" ";if(t&&(l.innerText+="\n"+t),!1!==(e=!1!==(t=function(e,t){var u=1{if(!e)return!1;let i=e=>e===s.length?null:s[e],n=(t,e,r,l)=>{for(let e=s.length-1;e>=t;e--)s[e+1]=s[e],u[e+1]=a(e),H[e+1]=o(e);s[t]=e,u[t]=0|l,H[t]=r},o=e=>0|H[e],a=e=>0|u[e],f=(e,t)=>{u[e]=t},H=[],u=[],s=[],A=0;var l,I,h,T,N,Y=e,c=e=>{H[A]=0,u[A]=0,s[A++]=e};for(let l=0;l{var e=S.findIndex(e=>e===t+r&&"*"!==e[1]);return-1!==e&&e})(e,t)))l++,c(r);else if(!1!==(r=(t=>{var e=S.findIndex(e=>e===t+"*");return-1!==e&&e})(e)))c(r);else{for(r=m.length;e!==m[r]&&0{s[e]=t},v=i,g=o;let e=(e,t)=>{switch(e){case 53:y(v(t-1),1024)&&d(t,16);break;case 42:E(t+1,43,g(t));break;case 44:E(t+1,45,g(t))}},t=(e,t)=>{d(e,13),E(e+1,t,g(e))},r=-1,l;for(;null!==(l=v(++r));)if(0!==l)if(y(l,16))E(r+1,y(l,32)?21:20,g(r)),e(l,r);else if(78===l)t(r,24);else if(79===l)t(r,27);else if(80===l)t(r,28);else if(y(l,M)&&g(r))0===v(r+1)&&null!==(l=v(r+2))&&y(l,M)&&g(r+2)&&E(r+2,31,0);else{var W,p=0===r?null:v(r-1);if(23===l)switch(p){case 69:d(r-1,42);break;case 57:d(r-1,44);break;default:y(p,M)&&d(r,18)}else 24===l&&y(p,M)?d(r,19):60===p&&32===l?d(r,38):60===l?(W=v(r+1),y(W,32)||null===W||d(r,63)):(72===l&&(W=v(r+1),y(W,32)&&null!==W||(d(r,75),l=75)),y(l,1)&&32===p?d(r,l-12):y(l,1)||e(l,r),69!==l&&57!==l||0>8),l++}}{var X=i,D=f,w=a;for(let e=0;null!==X(e);e++)if(y(X(e),256)){for(var t,r=e;1<--e&&!y(X(e),M););if(0===e)break;for(;e>1)+t+1))}let n=-1,o;for(;null!==(o=X(++n));){let e=n,t,r,l;if(y(o,M))o=X(++e),y(o,64)?(t=null===o?65:L[o],R(t,4)?(l=w(n),D(n,(l>>2)+l+1)):R(t,1)&&(r=w(n),D(n,r-(r>>3)))):18!==o&&19!==o||!y(X(++e),64)||D(n,w(n)-1);else if(y(o,2048))null!==(o=X(++e))&&y(o,2)&&(D(e,6),D(e-1,5));else if(y(o,2)){for(;0===(o=X(++e)););null!==o&&y(o,2)&&(D(e,1+(w(e)>>1)),D(n,1+(w(n)>>1)))}else 0e?[e,0|u[t],0|H[t]]:null).filter(e=>e)})();return!1!==t&&((e,o,i,a,t)=>{t=255&(u.speed||72);var[r,l,n,f,H]=((e,t)=>{var[r,Y,c,l]=((r,l,n)=>{let e=(e,t,r)=>{var l=t;t<30?t=0:t-=30;let n;for(;127===(n=r[t]);)++t;for(;t!==l;)for(n+=e,r[t]=255&n;++t!==l&&255===r[t];);},o=[],i=[[],[],[]],a=[[],[],[]],f=[],H=0;for(let t=0;t>8&255,a[2][H]=h[u]>>16&255,f[H]=I[u],o[H]=r+s&255,H++}return[o,i,a,f]})(void 0===o?64:255&o,e,((t,r)=>{let l=(e,t)=>(e*t>>8&255)<<1,n=[[],[],[]];s.map((e,t)=>{n[0][t]=255&e,n[1][t]=e>>8&255,n[2][t]=e>>16&255});for(let e=5;e<30;e++)n[0][e]=l(t,n[0][e]),n[1][e]=l(r,n[1][e]);for(let e=48;e<54;e++)n[0][e]=l(t,n[0][e]),n[1][e]=l(r,n[1][e]);return n})(void 0===i?128:255&i,void 0===a?128:255&a)),e=((t,r)=>{let H=[t,Y[0],Y[1],Y[2],c[0],c[1],c[2]],u=(e,t)=>H[e][t],l=(t,r,l,e)=>{let n=e<0,o=Math.abs(e)%t,i=e/t|0,a=0,f=t;for(;0<--f;){let e=u(r,l)+i;(a+=o)>=t&&(a-=t,n?e--:e&&e++),H[r][++l]=e,e+=i}},n,o,i=0;for(let e=0;e>1)+(s=r[e+1][1]>>1),0,h,t[i+s]-t[i-A]);for(let e=1;e<7;e++){var N=u(e,I)-u(e,h);l(T,e,h,N)}}}return i+r[r.length-1][1]})(r,e);if(!t)for(let e=0;e>1;var n=[0,1,2,2,2,3,3,4,4,5,6,8,9,11,13,15];for(let e=c[0].length-1;0<=e;e--)c[0][e]=n[c[0][e]],c[1][e]=n[c[1][e]],c[2][e]=n[c[2][e]];return[e,Y,r,c,l]})(e,u.singmode||!1);return((e,t,r,o,l,i,n)=>{let a=r,f=0,H=0,u=0,s=0,A=0,I=l[0],h=.75*I|0;for(;t;){var T=n[A];if(0!=(248&T))s=g(e,s,T,l[255&A]),A+=2,t-=2,a=r;else{{let t=[],r=256*f,l=256*H,n=256*u;for(let e=0;e<5;e++){var N=W(255&r>>8),Y=W(255&l>>8),c=(255&n>>8)<129?-112:112,N=(N*(15&i[0][A])+Y*(15&i[1][A])+c*(15&i[2][A]))/32+128;t[e]=0|N,r+=256*o[0][A]/4,l+=256*o[1][A]/4,n+=256*o[2][A]/4}e.ary(0,t)}if(0==--a){if(A++,0==--t)return;a=r}if(0!=--I){if(0!=--h||0===T){f+=o[0][A],H+=o[1][A],u+=o[2][A];continue}s=g(e,s,T,l[255&A])}}I=l[A],h=.75*I|0,f=0,H=0,u=0}})(e=(e=>{let r=new Uint8Array(e),l=0,n=0,o=(e,t)=>{t=16*(15&t),o.ary(e,[t,t,t,t,t])};return o.ary=(e,t)=>{if(((l+=[[162,167,167,127,128],[226,60,60,0,0],[225,60,59,0,0],[200,0,0,54,55],[199,0,0,54,54]][n][e])/50|0)>r.length)throw new Error;n=e;for(let e=0;e<5;e++)r[(l/50|0)+e]=t[e]},o.get=()=>r.slice(0,l/50|0),o})(176.4*e.reduce((e,t)=>e+t[1],0)*t|0),r,t,l,n,f,H),e.get()})(t,u.pitch,u.mouth,u.throat)}(e,void 0))&&(t=>{var r=new Float32Array(t.length);for(let e=0;e{let r=i.createBufferSource(),l=i.createBuffer(1,a.length,22050),n=l.getChannelData(0);for(let e=0;e{e(!0)},o=e=>{r.disconnect(),t(e)},r.start(0)});e.abort=o}}else Promise.reject()}),f=(r.onkeydown=e=>{13===e.keyCode&&(e.preventDefault(),f(parseInt(r.value))&&(l.innerText="\n"+l.innerText.split("\n").pop(),o(r),n(t)),r.value="")},e=>{var t;return 100{if(10<=e&&e<20)return Y[e-10];let t,r="";return 0<=(t=Math.floor(e/10)-2)&&(r+=c[t]),(t=e%10)&&(r+=" "+N[t-1]),r})(e),e>i+25?(a(t+" IHZ MAH3CH TUW5 /HAY6.",e+" is much too high."),!1):e>i+5?(a(t+" IHZ TUW3 /HAY6.",e+" is too high."),!1):e>i?(a(t+" IHZ AH LIH3TUL TUW4 /HAY6,",e+" is a little too high."),!1):e { let abort; let promise = new Promise((resolve, reject) => { let source = context.createBufferSource(); let soundBuffer = context.createBuffer(1, audiobuffer.length, 22050); let buffer = soundBuffer.getChannelData(0); - for (let i = 0; i < audiobuffer.length; i++) { buffer[i] = audiobuffer[i]; } - source.buffer = soundBuffer; source.connect(context.destination); - source.onended = () => { resolve(true); }; - abort = reason => { source.disconnect(); reject(reason); }; - source.start(0); }); promise.abort = abort; return promise; }; - let context = null; + /** * Play an audio buffer. * @@ -70,20 +64,18 @@ * * @return {Promise} */ - let PlayBuffer = audiobuffer => { if (null === context) { context = new AudioContext(); } - if (!context) { { throw new Error('No player available!'); } } - return Play(context, audiobuffer); }; + /** * Convert a Uint8Array wave buffer to a Float32Array WaveBuffer * @@ -91,100 +83,178 @@ * * @return {Float32Array} */ - let Uint8ArrayToFloat32Array = buffer => { let audio = new Float32Array(buffer.length); - for (let i = 0; i < buffer.length; i++) { audio[i] = (buffer[i] - 128) / 256; } - return audio; }; let StressTable = '*12345678'.split(''); - let PhonemeNameTable = (' *' + // 00 - '.*' + // 01 - '?*' + // 02 - ',*' + // 03 - '-*' + // 04 - 'IY' + // 05 - 'IH' + // 06 - 'EH' + // 07 - 'AE' + // 08 - 'AA' + // 09 - 'AH' + // 10 - 'AO' + // 11 - 'UH' + // 12 - 'AX' + // 13 - 'IX' + // 14 - 'ER' + // 15 - 'UX' + // 16 - 'OH' + // 17 - 'RX' + // 18 - 'LX' + // 19 - 'WX' + // 20 - 'YX' + // 21 - 'WH' + // 22 - 'R*' + // 23 - 'L*' + // 24 - 'W*' + // 25 - 'Y*' + // 26 - 'M*' + // 27 - 'N*' + // 28 - 'NX' + // 29 - 'DX' + // 30 - 'Q*' + // 31 - 'S*' + // 32 - 'SH' + // 33 - 'F*' + // 34 - 'TH' + // 35 - '/H' + // 36 - '/X' + // 37 - 'Z*' + // 38 - 'ZH' + // 39 - 'V*' + // 40 - 'DH' + // 41 - 'CH' + // 42 - '**' + // 43 - 'J*' + // 44 - '**' + // 45 - '**' + // 46 - '**' + // 47 - 'EY' + // 48 - 'AY' + // 49 - 'OY' + // 50 - 'AW' + // 51 - 'OW' + // 52 - 'UW' + // 53 - 'B*' + // 54 - '**' + // 55 - '**' + // 56 - 'D*' + // 57 - '**' + // 58 - '**' + // 59 - 'G*' + // 60 - '**' + // 61 - '**' + // 62 - 'GX' + // 63 - '**' + // 64 - '**' + // 65 - 'P*' + // 66 - '**' + // 67 - '**' + // 68 - 'T*' + // 69 - '**' + // 70 - '**' + // 71 - 'K*' + // 72 - '**' + // 73 - '**' + // 74 - 'KX' + // 75 - '**' + // 76 - '**' + // 77 - 'UL' + // 78 - 'UM' + // 79 + let PhonemeNameTable = (' *' + + // 00 + '.*' + + // 01 + '?*' + + // 02 + ',*' + + // 03 + '-*' + + // 04 + 'IY' + + // 05 + 'IH' + + // 06 + 'EH' + + // 07 + 'AE' + + // 08 + 'AA' + + // 09 + 'AH' + + // 10 + 'AO' + + // 11 + 'UH' + + // 12 + 'AX' + + // 13 + 'IX' + + // 14 + 'ER' + + // 15 + 'UX' + + // 16 + 'OH' + + // 17 + 'RX' + + // 18 + 'LX' + + // 19 + 'WX' + + // 20 + 'YX' + + // 21 + 'WH' + + // 22 + 'R*' + + // 23 + 'L*' + + // 24 + 'W*' + + // 25 + 'Y*' + + // 26 + 'M*' + + // 27 + 'N*' + + // 28 + 'NX' + + // 29 + 'DX' + + // 30 + 'Q*' + + // 31 + 'S*' + + // 32 + 'SH' + + // 33 + 'F*' + + // 34 + 'TH' + + // 35 + '/H' + + // 36 + '/X' + + // 37 + 'Z*' + + // 38 + 'ZH' + + // 39 + 'V*' + + // 40 + 'DH' + + // 41 + 'CH' + + // 42 + '**' + + // 43 + 'J*' + + // 44 + '**' + + // 45 + '**' + + // 46 + '**' + + // 47 + 'EY' + + // 48 + 'AY' + + // 49 + 'OY' + + // 50 + 'AW' + + // 51 + 'OW' + + // 52 + 'UW' + + // 53 + 'B*' + + // 54 + '**' + + // 55 + '**' + + // 56 + 'D*' + + // 57 + '**' + + // 58 + '**' + + // 59 + 'G*' + + // 60 + '**' + + // 61 + '**' + + // 62 + 'GX' + + // 63 + '**' + + // 64 + '**' + + // 65 + 'P*' + + // 66 + '**' + + // 67 + '**' + + // 68 + 'T*' + + // 69 + '**' + + // 70 + '**' + + // 71 + 'K*' + + // 72 + '**' + + // 73 + '**' + + // 74 + 'KX' + + // 75 + '**' + + // 76 + '**' + + // 77 + 'UL' + + // 78 + 'UM' + + // 79 'UN' // 80 ).match(/.{1,2}/g); + /** * Flags for phoneme names. * @@ -239,89 +309,169 @@ * 'P*', '**', '**', 'T*', '**', '**', 'K*', '**', '**', 'KX', '**', * '**', 'UM', 'UN' */ - - let phonemeFlags = [0 | 0x8000, // ' *' 00 - 0 | 0x8000 | 0x4000 | 0x0100, // '.*' 01 - 0 | 0x8000 | 0x4000 | 0x0100, // '?*' 02 - 0 | 0x8000 | 0x4000 | 0x0100, // ',*' 03 - 0 | 0x8000 | 0x4000 | 0x0100, // '-*' 04 - 0 | 0x0080 | 0x0020 | 0x0004, // 'IY' 05 - 0 | 0x0080 | 0x0020 | 0x0004, // 'IH' 06 - 0 | 0x0080 | 0x0020 | 0x0004, // 'EH' 07 - 0 | 0x0080 | 0x0020 | 0x0004, // 'AE' 08 - 0 | 0x0080 | 0x0020 | 0x0004, // 'AA' 09 - 0 | 0x0080 | 0x0020 | 0x0004, // 'AH' 10 - 0 | 0x0080 | 0x0004, // 'AO' 11 - 0 | 0x0080 | 0x0004, // 'UH' 12 - 0 | 0x0080 | 0x0020 | 0x0004, // 'AX' 13 - 0 | 0x0080 | 0x0020 | 0x0004, // 'IX' 14 - 0 | 0x0080 | 0x0004, // 'ER' 15 - 0 | 0x0080 | 0x0004, // 'UX' 16 - 0 | 0x0080 | 0x0004, // 'OH' 17 - 0 | 0x0080 | 0x0004, // 'RX' 18 - 0 | 0x0080 | 0x0004, // 'LX' 19 - 0 | 0x0080 | 0x0004, // 'WX' 20 - 0 | 0x0080 | 0x0004, // 'YX' 21 - 0 | 0x0040 | 0x0004, // 'WH' 22 - 0 | 0x1000 | 0x0040 | 0x0004, // 'R*' 23 - 0 | 0x1000 | 0x0040 | 0x0004, // 'L*' 24 - 0 | 0x1000 | 0x0040 | 0x0004, // 'W*' 25 - 0 | 0x1000 | 0x0040 | 0x0004, // 'Y*' 26 - 0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, // 'M*' 27 - 0 | 0x0800 | 0x0400 | 0x0040 | 0x0008 | 0x0004, // 'N*' 28 - 0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, // 'NX' 29 - 0 | 0x0400 | 0x0040 | 0x0008, // 'DX' 30 - 0 | 0x4000 | 0x0040 | 0x0008 | 0x0004, // 'Q*' 31 - 0 | 0x2000 | 0x0400 | 0x0040, // 'S*' 32 - 0 | 0x2000 | 0x0040, // 'SH' 33 - 0 | 0x2000 | 0x0040, // 'F*' 34 - 0 | 0x2000 | 0x0400 | 0x0040, // 'TH' 35 - 0 | 0x0040, // '/H' 36 - 0 | 0x0040, // '/X' 37 - 0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, // 'Z*' 38 - 0 | 0x2000 | 0x0040 | 0x0004, // 'ZH' 39 - 0 | 0x2000 | 0x0040 | 0x0004, // 'V*' 40 - 0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, // 'DH' 41 - 0 | 0x2000 | 0x0040 | 0x0008, // 'CH' 42 - 0 | 0x2000 | 0x0040, // '**' 43 - 0 | 0x0040 | 0x0008 | 0x0004, // 'J*' 44 - 0 | 0x2000 | 0x0040 | 0x0004, // '**' 45 - 0, // '**' 46 - 0, // '**' 47 - 0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'EY' 48 - 0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'AY' 49 - 0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'OY' 50 - 0 | 0x0080 | 0x0010 | 0x0004, // 'AW' 51 - 0 | 0x0080 | 0x0010 | 0x0004, // 'OW' 52 - 0 | 0x0080 | 0x0010 | 0x0004, // 'UW' 53 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'B*' 54 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 55 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 56 - 0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'D*' 57 - 0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 58 - 0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 59 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'G*' 60 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 61 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 62 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'GX' 63 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 64 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 65 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'P*' 66 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 67 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 68 - 0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'T*' 69 - 0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 70 - 0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 71 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'K*' 72 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 73 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 74 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'KX' 75 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 76 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 77 - 0 | 0x0080, // 'UL' 78 - 0 | 0x0080 | 0x0040 | 0x0001, // 'UM' 79 + let phonemeFlags = [0 | 0x8000, + // ' *' 00 + 0 | 0x8000 | 0x4000 | 0x0100, + // '.*' 01 + 0 | 0x8000 | 0x4000 | 0x0100, + // '?*' 02 + 0 | 0x8000 | 0x4000 | 0x0100, + // ',*' 03 + 0 | 0x8000 | 0x4000 | 0x0100, + // '-*' 04 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'IY' 05 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'IH' 06 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'EH' 07 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'AE' 08 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'AA' 09 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'AH' 10 + 0 | 0x0080 | 0x0004, + // 'AO' 11 + 0 | 0x0080 | 0x0004, + // 'UH' 12 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'AX' 13 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'IX' 14 + 0 | 0x0080 | 0x0004, + // 'ER' 15 + 0 | 0x0080 | 0x0004, + // 'UX' 16 + 0 | 0x0080 | 0x0004, + // 'OH' 17 + 0 | 0x0080 | 0x0004, + // 'RX' 18 + 0 | 0x0080 | 0x0004, + // 'LX' 19 + 0 | 0x0080 | 0x0004, + // 'WX' 20 + 0 | 0x0080 | 0x0004, + // 'YX' 21 + 0 | 0x0040 | 0x0004, + // 'WH' 22 + 0 | 0x1000 | 0x0040 | 0x0004, + // 'R*' 23 + 0 | 0x1000 | 0x0040 | 0x0004, + // 'L*' 24 + 0 | 0x1000 | 0x0040 | 0x0004, + // 'W*' 25 + 0 | 0x1000 | 0x0040 | 0x0004, + // 'Y*' 26 + 0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, + // 'M*' 27 + 0 | 0x0800 | 0x0400 | 0x0040 | 0x0008 | 0x0004, + // 'N*' 28 + 0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, + // 'NX' 29 + 0 | 0x0400 | 0x0040 | 0x0008, + // 'DX' 30 + 0 | 0x4000 | 0x0040 | 0x0008 | 0x0004, + // 'Q*' 31 + 0 | 0x2000 | 0x0400 | 0x0040, + // 'S*' 32 + 0 | 0x2000 | 0x0040, + // 'SH' 33 + 0 | 0x2000 | 0x0040, + // 'F*' 34 + 0 | 0x2000 | 0x0400 | 0x0040, + // 'TH' 35 + 0 | 0x0040, + // '/H' 36 + 0 | 0x0040, + // '/X' 37 + 0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, + // 'Z*' 38 + 0 | 0x2000 | 0x0040 | 0x0004, + // 'ZH' 39 + 0 | 0x2000 | 0x0040 | 0x0004, + // 'V*' 40 + 0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, + // 'DH' 41 + 0 | 0x2000 | 0x0040 | 0x0008, + // 'CH' 42 + 0 | 0x2000 | 0x0040, + // '**' 43 + 0 | 0x0040 | 0x0008 | 0x0004, + // 'J*' 44 + 0 | 0x2000 | 0x0040 | 0x0004, + // '**' 45 + 0, + // '**' 46 + 0, + // '**' 47 + 0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, + // 'EY' 48 + 0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, + // 'AY' 49 + 0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, + // 'OY' 50 + 0 | 0x0080 | 0x0010 | 0x0004, + // 'AW' 51 + 0 | 0x0080 | 0x0010 | 0x0004, + // 'OW' 52 + 0 | 0x0080 | 0x0010 | 0x0004, + // 'UW' 53 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // 'B*' 54 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 55 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 56 + 0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // 'D*' 57 + 0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 58 + 0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 59 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // 'G*' 60 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 61 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 62 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // 'GX' 63 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 64 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 65 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // 'P*' 66 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 67 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 68 + 0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // 'T*' 69 + 0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 70 + 0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 71 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // 'K*' 72 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 73 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 74 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // 'KX' 75 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 76 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 77 + 0 | 0x0080, + // 'UL' 78 + 0 | 0x0080 | 0x0040 | 0x0001, + // 'UM' 79 0 | 0x0080 | 0x0040 | 0x0001 // 'UN' 80 ]; + /** * Combined table of phoneme length. * @@ -331,88 +481,167 @@ * phonemeLengthTable[i] = combinedPhonemeLengthTable[i] & 0xFF * phonemeStressedLengthTable[i] = combinedPhonemeLengthTable[i] >> 8 */ - - let combinedPhonemeLengthTable = [0x0000 | 0x0000, // ' *' 00 - 0x0012 | 0x1200, // '.*' 01 - 0x0012 | 0x1200, // '?*' 02 - 0x0012 | 0x1200, // ',*' 03 - 0x0008 | 0x0800, // '-*' 04 - 0x0008 | 0x0B00, // 'IY' 05 - 0x0008 | 0x0900, // 'IH' 06 - 0x0008 | 0x0B00, // 'EH' 07 - 0x0008 | 0x0E00, // 'AE' 08 - 0x000B | 0x0F00, // 'AA' 09 - 0x0006 | 0x0B00, // 'AH' 10 - 0x000C | 0x1000, // 'AO' 11 - 0x000A | 0x0C00, // 'UH' 12 - 0x0005 | 0x0600, // 'AX' 13 - 0x0005 | 0x0600, // 'IX' 14 - 0x000B | 0x0E00, // 'ER' 15 - 0x000A | 0x0C00, // 'UX' 16 - 0x000A | 0x0E00, // 'OH' 17 - 0x000A | 0x0C00, // 'RX' 18 - 0x0009 | 0x0B00, // 'LX' 19 - 0x0008 | 0x0800, // 'WX' 20 - 0x0007 | 0x0800, // 'YX' 21 - 0x0009 | 0x0B00, // 'WH' 22 - 0x0007 | 0x0A00, // 'R*' 23 - 0x0006 | 0x0900, // 'L*' 24 - 0x0008 | 0x0800, // 'W*' 25 - 0x0006 | 0x0800, // 'Y*' 26 - 0x0007 | 0x0800, // 'M*' 27 - 0x0007 | 0x0800, // 'N*' 28 - 0x0007 | 0x0800, // 'NX' 29 - 0x0002 | 0x0300, // 'DX' 30 - 0x0005 | 0x0500, // 'Q*' 31 - 0x0002 | 0x0200, // 'S*' 32 - 0x0002 | 0x0200, // 'SH' 33 - 0x0002 | 0x0200, // 'F*' 34 - 0x0002 | 0x0200, // 'TH' 35 - 0x0002 | 0x0200, // '/H' 36 - 0x0002 | 0x0200, // '/X' 37 - 0x0006 | 0x0600, // 'Z*' 38 - 0x0006 | 0x0600, // 'ZH' 39 - 0x0007 | 0x0800, // 'V*' 40 - 0x0006 | 0x0600, // 'DH' 41 - 0x0006 | 0x0600, // 'CH' 42 - 0x0002 | 0x0200, // '**' 43 - 0x0008 | 0x0900, // 'J*' 44 - 0x0003 | 0x0400, // '**' 45 - 0x0001 | 0x0200, // '**' 46 - 0x001E | 0x0100, // '**' 47 - 0x000D | 0x0E00, // 'EY' 48 - 0x000C | 0x0F00, // 'AY' 49 - 0x000C | 0x0F00, // 'OY' 50 - 0x000C | 0x0F00, // 'AW' 51 - 0x000E | 0x0E00, // 'OW' 52 - 0x0009 | 0x0E00, // 'UW' 53 - 0x0006 | 0x0800, // 'B*' 54 - 0x0001 | 0x0200, // '**' 55 - 0x0002 | 0x0200, // '**' 56 - 0x0005 | 0x0700, // 'D*' 57 - 0x0001 | 0x0200, // '**' 58 - 0x0001 | 0x0100, // '**' 59 - 0x0006 | 0x0700, // 'G*' 60 - 0x0001 | 0x0200, // '**' 61 - 0x0002 | 0x0200, // '**' 62 - 0x0006 | 0x0700, // 'GX' 63 - 0x0001 | 0x0200, // '**' 64 - 0x0002 | 0x0200, // '**' 65 - 0x0008 | 0x0800, // 'P*' 66 - 0x0002 | 0x0200, // '**' 67 - 0x0002 | 0x0200, // '**' 68 - 0x0004 | 0x0600, // 'T*' 69 - 0x0002 | 0x0200, // '**' 70 - 0x0002 | 0x0200, // '**' 71 - 0x0006 | 0x0700, // 'K*' 72 - 0x0001 | 0x0200, // '**' 73 - 0x0004 | 0x0400, // '**' 74 - 0x0006 | 0x0700, // 'KX' 75 - 0x0001 | 0x0100, // '**' 76 - 0x0004 | 0x0400, // '**' 77 - 0x00C7 | 0x0500, // 'UL' 78 + let combinedPhonemeLengthTable = [0x0000 | 0x0000, + // ' *' 00 + 0x0012 | 0x1200, + // '.*' 01 + 0x0012 | 0x1200, + // '?*' 02 + 0x0012 | 0x1200, + // ',*' 03 + 0x0008 | 0x0800, + // '-*' 04 + 0x0008 | 0x0B00, + // 'IY' 05 + 0x0008 | 0x0900, + // 'IH' 06 + 0x0008 | 0x0B00, + // 'EH' 07 + 0x0008 | 0x0E00, + // 'AE' 08 + 0x000B | 0x0F00, + // 'AA' 09 + 0x0006 | 0x0B00, + // 'AH' 10 + 0x000C | 0x1000, + // 'AO' 11 + 0x000A | 0x0C00, + // 'UH' 12 + 0x0005 | 0x0600, + // 'AX' 13 + 0x0005 | 0x0600, + // 'IX' 14 + 0x000B | 0x0E00, + // 'ER' 15 + 0x000A | 0x0C00, + // 'UX' 16 + 0x000A | 0x0E00, + // 'OH' 17 + 0x000A | 0x0C00, + // 'RX' 18 + 0x0009 | 0x0B00, + // 'LX' 19 + 0x0008 | 0x0800, + // 'WX' 20 + 0x0007 | 0x0800, + // 'YX' 21 + 0x0009 | 0x0B00, + // 'WH' 22 + 0x0007 | 0x0A00, + // 'R*' 23 + 0x0006 | 0x0900, + // 'L*' 24 + 0x0008 | 0x0800, + // 'W*' 25 + 0x0006 | 0x0800, + // 'Y*' 26 + 0x0007 | 0x0800, + // 'M*' 27 + 0x0007 | 0x0800, + // 'N*' 28 + 0x0007 | 0x0800, + // 'NX' 29 + 0x0002 | 0x0300, + // 'DX' 30 + 0x0005 | 0x0500, + // 'Q*' 31 + 0x0002 | 0x0200, + // 'S*' 32 + 0x0002 | 0x0200, + // 'SH' 33 + 0x0002 | 0x0200, + // 'F*' 34 + 0x0002 | 0x0200, + // 'TH' 35 + 0x0002 | 0x0200, + // '/H' 36 + 0x0002 | 0x0200, + // '/X' 37 + 0x0006 | 0x0600, + // 'Z*' 38 + 0x0006 | 0x0600, + // 'ZH' 39 + 0x0007 | 0x0800, + // 'V*' 40 + 0x0006 | 0x0600, + // 'DH' 41 + 0x0006 | 0x0600, + // 'CH' 42 + 0x0002 | 0x0200, + // '**' 43 + 0x0008 | 0x0900, + // 'J*' 44 + 0x0003 | 0x0400, + // '**' 45 + 0x0001 | 0x0200, + // '**' 46 + 0x001E | 0x0100, + // '**' 47 + 0x000D | 0x0E00, + // 'EY' 48 + 0x000C | 0x0F00, + // 'AY' 49 + 0x000C | 0x0F00, + // 'OY' 50 + 0x000C | 0x0F00, + // 'AW' 51 + 0x000E | 0x0E00, + // 'OW' 52 + 0x0009 | 0x0E00, + // 'UW' 53 + 0x0006 | 0x0800, + // 'B*' 54 + 0x0001 | 0x0200, + // '**' 55 + 0x0002 | 0x0200, + // '**' 56 + 0x0005 | 0x0700, + // 'D*' 57 + 0x0001 | 0x0200, + // '**' 58 + 0x0001 | 0x0100, + // '**' 59 + 0x0006 | 0x0700, + // 'G*' 60 + 0x0001 | 0x0200, + // '**' 61 + 0x0002 | 0x0200, + // '**' 62 + 0x0006 | 0x0700, + // 'GX' 63 + 0x0001 | 0x0200, + // '**' 64 + 0x0002 | 0x0200, + // '**' 65 + 0x0008 | 0x0800, + // 'P*' 66 + 0x0002 | 0x0200, + // '**' 67 + 0x0002 | 0x0200, + // '**' 68 + 0x0004 | 0x0600, + // 'T*' 69 + 0x0002 | 0x0200, + // '**' 70 + 0x0002 | 0x0200, + // '**' 71 + 0x0006 | 0x0700, + // 'K*' 72 + 0x0001 | 0x0200, + // '**' 73 + 0x0004 | 0x0400, + // '**' 74 + 0x0006 | 0x0700, + // 'KX' 75 + 0x0001 | 0x0100, + // '**' 76 + 0x0004 | 0x0400, + // '**' 77 + 0x00C7 | 0x0500, + // 'UL' 78 0x00FF | 0x0500 // 'UM' 79 ]; + /* Ind | phoneme | flags | @@ -527,27 +756,26 @@ * @param {string} sign2 * @return {boolean|Number} */ - let full_match = (sign1, sign2) => { let index = PhonemeNameTable.findIndex(value => { return value === sign1 + sign2 && value[1] !== '*'; }); return index !== -1 ? index : false; }; + /** * Match single character phoneme. * * @param {string} sign1 * @return {boolean|Number} */ - - let single_match = sign1 => { let index = PhonemeNameTable.findIndex(value => { return value === sign1 + '*'; }); return index !== -1 ? index : false; }; + /** * The input[] buffer contains a string of phonemes and stress markers along * the lines of: @@ -601,46 +829,37 @@ * * @return {undefined} */ - - let Parser1 = (input, addPhoneme, addStress) => { for (let srcPos = 0; srcPos < input.length; srcPos++) { { let tmp = input.toLowerCase(); - console.log("processing \"".concat(tmp.substr(0, srcPos), "%c").concat(tmp.substr(srcPos, 2).toUpperCase(), "%c").concat(tmp.substr(srcPos + 2), "\""), 'color: red;', 'color:normal;'); + console.log(`processing "${tmp.substr(0, srcPos)}%c${tmp.substr(srcPos, 2).toUpperCase()}%c${tmp.substr(srcPos + 2)}"`, 'color: red;', 'color:normal;'); } - let sign1 = input[srcPos]; let sign2 = input[srcPos + 1] || ''; let match; - if ((match = full_match(sign1, sign2)) !== false) { // Matched both characters (no single char mark) srcPos++; // Skip the second character of the input as we've matched it - addPhoneme(match); continue; } - if ((match = single_match(sign1)) !== false) { // Matched just the first character (with second character matching '*' addPhoneme(match); continue; - } // Should be a stress character. Search through the stress table backwards. - + } + // Should be a stress character. Search through the stress table backwards. match = StressTable.length; - while (sign1 !== StressTable[match] && match > 0) { --match; } - if (match === 0) { { - throw Error("Could not parse char ".concat(sign1)); + throw Error(`Could not parse char ${sign1}`); } } - addStress(match); // Set stress for prior phoneme } }; @@ -653,7 +872,6 @@ * * @return {boolean} */ - let phonemeHasFlag = (phoneme, flag) => { return matchesBitmask(phonemeFlags[phoneme], flag); }; @@ -664,10 +882,10 @@ let PHONEME_PERIOD = 1; let PHONEME_QUESTION = 2; let FLAG_FRICATIVE = 0x2000; + /** * liquic consonant */ - let FLAG_LIQUIC = 0x1000; let FLAG_NASAL = 0x0800; let FLAG_ALVEOLAR = 0x0400; @@ -678,7 +896,6 @@ * diphthong ending with YX * */ - let FLAG_DIP_YX = 0x0020; let FLAG_DIPHTHONG = 0x0010; /** unknown: @@ -686,13 +903,12 @@ * '**', '**', 'G*', '**', '**', 'GX', '**', '**', 'P*', '**', '**', * 'T*', '**', '**', 'K*', '**', '**', 'KX', '**', '**' */ - let FLAG_0008 = 0x0008; let FLAG_VOICED = 0x0004; + /** * stop consonant */ - let FLAG_STOPCONS = 0x0002; let FLAG_UNVOICED_STOPCONS = 0x0001; @@ -729,7 +945,6 @@ * * @return undefined */ - let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { /** * Rewrites: @@ -747,96 +962,77 @@ // ALVEOLAR flag set? if (phonemeHasFlag(getPhoneme(pos - 1), FLAG_ALVEOLAR)) { { - console.log("".concat(pos, " RULE: UW -> UX")); + console.log(`${pos} RULE: UW -> UX`); } - setPhoneme(pos, 16); // UX } - break; } // 'CH' Example: CHEW - case 42: { { - console.log("".concat(pos, " RULE: CH -> CH CH+1")); + console.log(`${pos} RULE: CH -> CH CH+1`); } - insertPhoneme(pos + 1, 43, getStress(pos)); // '**' - break; } // 'J*' Example: JAY - case 44: { { - console.log("".concat(pos, " RULE: J -> J J+1")); + console.log(`${pos} RULE: J -> J J+1`); } - insertPhoneme(pos + 1, 45, getStress(pos)); // '**' - break; } } }; - let changeAX = (position, suffix) => { { - console.log("".concat(position, " RULE: ").concat(PhonemeNameTable[getPhoneme(position)], " -> AX ").concat(PhonemeNameTable[suffix])); + console.log(`${position} RULE: ${PhonemeNameTable[getPhoneme(position)]} -> AX ${PhonemeNameTable[suffix]}`); } - setPhoneme(position, 13); // 'AX' - insertPhoneme(position + 1, suffix, getStress(position)); }; - let pos = -1; let phoneme; - while ((phoneme = getPhoneme(++pos)) !== null) { // Is phoneme pause? if (phoneme === 0) { continue; } - if (phonemeHasFlag(phoneme, FLAG_DIPHTHONG)) { // -> WX // -> YX // Example: OIL, COW { - console.log(!phonemeHasFlag(phoneme, FLAG_DIP_YX) ? "".concat(pos, " RULE: insert WX following diphthong NOT ending in IY sound") : "".concat(pos, " RULE: insert YX following diphthong ending in IY sound")); - } // If ends with IY, use YX, else use WX + console.log(!phonemeHasFlag(phoneme, FLAG_DIP_YX) ? `${pos} RULE: insert WX following diphthong NOT ending in IY sound` : `${pos} RULE: insert YX following diphthong ending in IY sound`); + } + // If ends with IY, use YX, else use WX // Insert at WX or YX following, copying the stress // 'WX' = 20 'YX' = 21 - - insertPhoneme(pos + 1, phonemeHasFlag(phoneme, FLAG_DIP_YX) ? 21 : 20, getStress(pos)); handleUW_CH_J(phoneme, pos); continue; } - if (phoneme === 78) { // 'UL' => 'AX' 'L*' // Example: MEDDLE changeAX(pos, 24); continue; } - if (phoneme === 79) { // 'UM' => 'AX' 'M*' // Example: ASTRONOMY changeAX(pos, 27); continue; } - if (phoneme === 80) { // 'UN' => 'AX' 'N*' changeAX(pos, 28); continue; } - if (phonemeHasFlag(phoneme, FLAG_VOWEL) && getStress(pos)) { // Example: FUNCTION // RULE: @@ -845,21 +1041,16 @@ if (getPhoneme(pos + 1) === 0) { // If following phoneme is a pause, get next phoneme = getPhoneme(pos + 2); - if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_VOWEL) && getStress(pos + 2)) { { - console.log("".concat(pos + 2, " RULE: Insert glottal stop between two stressed vowels with space between them")); + console.log(`${pos + 2} RULE: Insert glottal stop between two stressed vowels with space between them`); } - insertPhoneme(pos + 2, 31, 0); // 31 = 'Q' } } - continue; } - let priorPhoneme = pos === 0 ? null : getPhoneme(pos - 1); - if (phoneme === pR) { // RULES FOR PHONEMES BEFORE R switch (priorPhoneme) { @@ -867,103 +1058,88 @@ { // Example: TRACK { - console.log("".concat(pos, " RULE: T* R* -> CH R*")); + console.log(`${pos} RULE: T* R* -> CH R*`); } - setPhoneme(pos - 1, 42); // 'T*' 'R*' -> 'CH' 'R*' - break; } - case pD: { // Example: DRY { - console.log("".concat(pos, " RULE: D* R* -> J* R*")); + console.log(`${pos} RULE: D* R* -> J* R*`); } - setPhoneme(pos - 1, 44); // 'J*' - break; } - default: { if (phonemeHasFlag(priorPhoneme, FLAG_VOWEL)) { // Example: ART { - console.log("".concat(pos, " R* -> RX")); + console.log(`${pos} R* -> RX`); } - setPhoneme(pos, 18); // 'RX' } } } - continue; - } // 'L*' - + } + // 'L*' if (phoneme === 24 && phonemeHasFlag(priorPhoneme, FLAG_VOWEL)) { // Example: ALL { - console.log("".concat(pos, " L* -> LX")); + console.log(`${pos} L* -> LX`); } - setPhoneme(pos, 19); // 'LX' - continue; - } // 'G*' 'S*' - - + } + // 'G*' 'S*' if (priorPhoneme === 60 && phoneme === 32) { // Can't get to fire - // 1. The G -> GX rule intervenes // 2. Reciter already replaces GS -> GZ { - console.log("".concat(pos, " G S -> G Z")); + console.log(`${pos} G S -> G Z`); } - setPhoneme(pos, 38); continue; - } // 'G*' - + } + // 'G*' if (phoneme === 60) { // G -> GX // Example: GO - let phoneme = getPhoneme(pos + 1); // If diphthong ending with YX, move continue processing next phoneme - + let phoneme = getPhoneme(pos + 1); + // If diphthong ending with YX, move continue processing next phoneme if (!phonemeHasFlag(phoneme, FLAG_DIP_YX) && phoneme !== null) { // replace G with GX and continue processing next phoneme { - console.log("".concat(pos, " RULE: G -> GX ")); + console.log(`${pos} RULE: G -> GX `); } - setPhoneme(pos, 63); // 'GX' } - continue; - } // 'K*' - + } + // 'K*' if (phoneme === 72) { // K -> KX // Example: COW - let Y = getPhoneme(pos + 1); // If at end, replace current phoneme with KX - + let Y = getPhoneme(pos + 1); + // If at end, replace current phoneme with KX if (!phonemeHasFlag(Y, FLAG_DIP_YX) || Y === null) { // VOWELS AND DIPHTHONGS ENDING WITH IY SOUND flag set? { - console.log("".concat(pos, " K -> KX ")); + console.log(`${pos} K -> KX `); } - setPhoneme(pos, 75); phoneme = 75; } - } // Replace with softer version? - + } + // Replace with softer version? if (phonemeHasFlag(phoneme, FLAG_UNVOICED_STOPCONS) && priorPhoneme === 32) { // 'S*' // RULE: @@ -975,15 +1151,14 @@ // 'S*' 'UN' -> 'S*' '**' // Examples: SPY, STY, SKY, SCOWL { - console.log("".concat(pos, " RULE: S* ").concat(PhonemeNameTable[phoneme], " -> S* ").concat(PhonemeNameTable[phoneme - 12])); + console.log(`${pos} RULE: S* ${PhonemeNameTable[phoneme]} -> S* ${PhonemeNameTable[phoneme - 12]}`); } - setPhoneme(pos, phoneme - 12); } else if (!phonemeHasFlag(phoneme, FLAG_UNVOICED_STOPCONS)) { handleUW_CH_J(phoneme, pos); - } // 'T*', 'D*' - + } + // 'T*', 'D*' if (phoneme === 69 || phoneme === 57) { // RULE: Soften T following vowel // NOTE: This rule fails for cases such as "ODD" @@ -992,28 +1167,22 @@ // Example: PARTY, TARDY if (pos > 0 && phonemeHasFlag(getPhoneme(pos - 1), FLAG_VOWEL)) { phoneme = getPhoneme(pos + 1); - if (phoneme === 0) { phoneme = getPhoneme(pos + 2); } - if (phonemeHasFlag(phoneme, FLAG_VOWEL) && !getStress(pos + 1)) { { - console.log("".concat(pos, " Soften T or D following vowel or ER and preceding a pause -> DX")); + console.log(`${pos} Soften T or D following vowel or ER and preceding a pause -> DX`); } - setPhoneme(pos, 30); } } - continue; } - { - console.log("".concat(pos, ": ").concat(PhonemeNameTable[phoneme])); + console.log(`${pos}: ${PhonemeNameTable[phoneme]}`); } } // while - }; /** @@ -1033,177 +1202,160 @@ * * @return undefined */ - let AdjustLengths = (getPhoneme, setLength, getLength) => { { - console.log("AdjustLengths()"); - } // LENGTHEN VOWELS PRECEDING PUNCTUATION + console.log(`AdjustLengths()`); + } + + // LENGTHEN VOWELS PRECEDING PUNCTUATION // // Search for punctuation. If found, back up to the first vowel, then // process all phonemes between there and up to (but not including) the punctuation. // If any phoneme is found that is a either a fricative or voiced, the duration is // increased by (length * 1.5) + 1 - // loop index - + // loop index for (let position = 0; getPhoneme(position) !== null; position++) { // not punctuation? if (!phonemeHasFlag(getPhoneme(position), FLAG_PUNCT)) { continue; } - let loopIndex = position; - - while (--position > 1 && !phonemeHasFlag(getPhoneme(position), FLAG_VOWEL)) { - /* back up while not a vowel */ - } // If beginning of phonemes, exit loop. - - + while (--position > 1 && !phonemeHasFlag(getPhoneme(position), FLAG_VOWEL)) {/* back up while not a vowel */} + // If beginning of phonemes, exit loop. if (position === 0) { break; - } // Now handle everything between position and loopIndex - + } + // Now handle everything between position and loopIndex let vowel = position; - for (; position < loopIndex; position++) { // test for not fricative/unvoiced or not voiced if (!phonemeHasFlag(getPhoneme(position), FLAG_FRICATIVE) || phonemeHasFlag(getPhoneme(position), FLAG_VOICED)) { - let A = getLength(position); // change phoneme length to (length * 1.5) + 1 - + let A = getLength(position); + // change phoneme length to (length * 1.5) + 1 { console.log(position + ' RULE: Lengthen or ' + PhonemeNameTable[getPhoneme(position)] + ' between VOWEL:' + PhonemeNameTable[getPhoneme(vowel)] + ' and PUNCTUATION:' + PhonemeNameTable[getPhoneme(position)] + ' by 1.5'); } - setLength(position, (A >> 1) + A + 1); } } - } // Similar to the above routine, but shorten vowels under some circumstances - // Loop through all phonemes - + } + // Similar to the above routine, but shorten vowels under some circumstances + // Loop through all phonemes let loopIndex = -1; let phoneme; - while ((phoneme = getPhoneme(++loopIndex)) !== null) { - let position = loopIndex; // vowel? - + let position = loopIndex; + // vowel? if (phonemeHasFlag(phoneme, FLAG_VOWEL)) { // get next phoneme - phoneme = getPhoneme(++position); // not a consonant - + phoneme = getPhoneme(++position); + // not a consonant if (!phonemeHasFlag(phoneme, FLAG_CONSONANT)) { // 'RX' or 'LX'? if ((phoneme === 18 || phoneme === 19) && phonemeHasFlag(getPhoneme(++position), FLAG_CONSONANT)) { // followed by consonant? { console.log(loopIndex + ' RULE: ' + PhonemeNameTable[phoneme] + ' - decrease length of vowel by 1'); - } // decrease length of vowel by 1 frame - - + } + // decrease length of vowel by 1 frame setLength(loopIndex, getLength(loopIndex) - 1); } - continue; - } // Got here if not + } + // Got here if not // FIXME: the case when phoneme === END is taken over by !phonemeHasFlag(phoneme, FLAG_CONSONANT) - - - let flags = phoneme === null ? FLAG_CONSONANT | FLAG_UNVOICED_STOPCONS : phonemeFlags[phoneme]; // Unvoiced - + let flags = phoneme === null ? FLAG_CONSONANT | FLAG_UNVOICED_STOPCONS : phonemeFlags[phoneme]; + // Unvoiced if (!matchesBitmask(flags, FLAG_VOICED)) { // *, .*, ?*, ,*, -*, DX, S*, SH, F*, TH, /H, /X, CH, P*, T*, K*, KX + // unvoiced plosive if (matchesBitmask(flags, FLAG_UNVOICED_STOPCONS)) { // RULE: // { - console.log("".concat(loopIndex, " - decrease vowel by 1/8th")); + console.log(`${loopIndex} - decrease vowel by 1/8th`); } - let A = getLength(loopIndex); setLength(loopIndex, A - (A >> 3)); } - continue; - } // RULE: + } + + // RULE: // - - { - console.log("".concat(loopIndex, " RULE: - increase vowel by 1/4 + 1")); - } // increase length - - + console.log(`${loopIndex} RULE: - increase vowel by 1/4 + 1`); + } + // increase length let A = getLength(loopIndex); setLength(loopIndex, (A >> 2) + A + 1); // 5/4*A + 1 - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, M*, N*, NX, DX, Q*, S*, SH, F*, - // TH, /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX - // nasal? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, M*, N*, NX, DX, Q*, S*, SH, F*, + // TH, /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX + // nasal? if (phonemeHasFlag(phoneme, FLAG_NASAL)) { // RULE: // Set punctuation length to 6 // Set stop consonant length to 5 - // M*, N*, NX, - phoneme = getPhoneme(++position); // is next phoneme a stop consonant? + // M*, N*, NX, + phoneme = getPhoneme(++position); + // is next phoneme a stop consonant? if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // B*, D*, G*, GX, P*, T*, K*, KX { - console.log("".concat(position, " RULE: - set nasal = 5, consonant = 6")); + console.log(`${position} RULE: - set nasal = 5, consonant = 6`); } - setLength(position, 6); // set stop consonant length to 6 - setLength(position - 1, 5); // set nasal length to 5 } - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, - // /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX - // stop consonant? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, + // /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX + // stop consonant? if (phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // B*, D*, G*, GX + // RULE: {optional silence} // Shorten both to (length/2 + 1) - while ((phoneme = getPhoneme(++position)) === 0) { - /* move past silence */ - } // if another stop consonant, process. - + while ((phoneme = getPhoneme(++position)) === 0) {/* move past silence */} + // if another stop consonant, process. if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // RULE: {optional silence} { - console.log("".concat(position, " RULE: {optional silence} - shorten both to 1/2 + 1")); + console.log(`${position} RULE: {optional silence} - shorten both to 1/2 + 1`); } - setLength(position, (getLength(position) >> 1) + 1); setLength(loopIndex, (getLength(loopIndex) >> 1) + 1); } - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, - // /H, /X, Z*, ZH, V*, DH, CH, J* - // liquic consonant? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, + // /H, /X, Z*, ZH, V*, DH, CH, J* + // liquic consonant? if (position > 0 && phonemeHasFlag(phoneme, FLAG_LIQUIC) && phonemeHasFlag(getPhoneme(position - 1), FLAG_STOPCONS)) { // R*, L*, W*, Y* // RULE: // Decrease by 2 // prior phoneme is a stop consonant { - console.log("".concat(position, " RULE: - decrease by 2")); - } // decrease the phoneme length by 2 frames - - + console.log(`${position} RULE: - decrease by 2`); + } + // decrease the phoneme length by 2 frames setLength(position, getLength(position) - 2); } } @@ -1228,21 +1380,18 @@ * * @return undefined */ - let CopyStress = (getPhoneme, getStress, setStress) => { // loop through all the phonemes to be output let position = 0; let phoneme; - while ((phoneme = getPhoneme(position)) !== null) { // if CONSONANT_FLAG set, skip - only vowels get stress if (phonemeHasFlag(phoneme, FLAG_CONSONANT)) { - phoneme = getPhoneme(position + 1); // if the following phoneme is the end, or a vowel, skip - + phoneme = getPhoneme(position + 1); + // if the following phoneme is the end, or a vowel, skip if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_VOWEL)) { // get the stress value at the next position let stress = getStress(position + 1); - if (stress !== 0 && stress < 0x80) { // if next phoneme is stressed, and a VOWEL OR ER // copy stress from next phoneme to this one @@ -1250,7 +1399,6 @@ } } } - ++position; } }; @@ -1264,20 +1412,16 @@ * * @return undefined */ - let SetPhonemeLength = (getPhoneme, getStress, setLength) => { let position = 0; let phoneme; - while ((phoneme = getPhoneme(position)) !== null) { let stress = getStress(position); - if (stress === 0 || stress > 0x7F) { setLength(position, combinedPhonemeLengthTable[phoneme] & 0xFF); } else { setLength(position, combinedPhonemeLengthTable[phoneme] >> 8); } - position++; } }; @@ -1292,32 +1436,26 @@ * * @return undefined */ - let ProlongPlosiveStopConsonantsCode41240 = (getPhoneme, insertPhoneme, getStress) => { let pos = -1; let index; - while ((index = getPhoneme(++pos)) !== null) { // Not a stop consonant, move to next one. if (!phonemeHasFlag(index, FLAG_STOPCONS)) { continue; - } //If plosive, move to next non empty phoneme and validate the flags. - - + } + //If plosive, move to next non empty phoneme and validate the flags. if (phonemeHasFlag(index, FLAG_UNVOICED_STOPCONS)) { let nextNonEmpty; let X = pos; - do { nextNonEmpty = getPhoneme(++X); - } while (nextNonEmpty === 0); // If not END and either flag 0x0008 or '/H' or '/X' - - + } while (nextNonEmpty === 0); + // If not END and either flag 0x0008 or '/H' or '/X' if (nextNonEmpty !== null && (phonemeHasFlag(nextNonEmpty, FLAG_0008) || nextNonEmpty === 36 || nextNonEmpty === 37)) { continue; } } - insertPhoneme(pos + 1, index + 1, getStress(pos), combinedPhonemeLengthTable[index + 1] & 0xFF); insertPhoneme(pos + 2, index + 2, getStress(pos), combinedPhonemeLengthTable[index + 2] & 0xFF); pos += 2; @@ -1333,29 +1471,25 @@ * * @return {Array|Boolean} The parsed data. */ - let Parser = input => { if (!input) { return false; } - let getPhoneme = pos => { { if (pos < 0 || pos > phonemeindex.length) { throw new Error('Out of bounds: ' + pos); } } - return pos === phonemeindex.length ? null : phonemeindex[pos]; }; - let setPhoneme = (pos, value) => { { - console.log("".concat(pos, " CHANGE: ").concat(PhonemeNameTable[phonemeindex[pos]], " -> ").concat(PhonemeNameTable[value])); + console.log(`${pos} CHANGE: ${PhonemeNameTable[phonemeindex[pos]]} -> ${PhonemeNameTable[value]}`); } - phonemeindex[pos] = value; }; + /** * @param {Number} pos The position in the phoneme array to insert at. * @param {Number} value The phoneme to insert. @@ -1364,54 +1498,40 @@ * * @return {undefined} */ - - let insertPhoneme = (pos, value, stressValue, length) => { { - console.log("".concat(pos, " INSERT: ").concat(PhonemeNameTable[value])); + console.log(`${pos} INSERT: ${PhonemeNameTable[value]}`); } - for (let i = phonemeindex.length - 1; i >= pos; i--) { phonemeindex[i + 1] = phonemeindex[i]; phonemeLength[i + 1] = getLength(i); stress[i + 1] = getStress(i); } - phonemeindex[pos] = value; phonemeLength[pos] = length | 0; stress[pos] = stressValue; }; - let getStress = pos => stress[pos] | 0; - let setStress = (pos, stressValue) => { { - console.log("".concat(pos, " \"").concat(PhonemeNameTable[phonemeindex[pos]], "\" SET STRESS: ").concat(stress[pos], " -> ").concat(stressValue)); + console.log(`${pos} "${PhonemeNameTable[phonemeindex[pos]]}" SET STRESS: ${stress[pos]} -> ${stressValue}`); } - stress[pos] = stressValue; }; - let getLength = pos => phonemeLength[pos] | 0; - let setLength = (pos, length) => { { - console.log("".concat(pos, " \"").concat(PhonemeNameTable[phonemeindex[pos]], "\" SET LENGTH: ").concat(phonemeLength[pos], " -> ").concat(length)); - + console.log(`${pos} "${PhonemeNameTable[phonemeindex[pos]]}" SET LENGTH: ${phonemeLength[pos]} -> ${length}`); if ((length & 128) !== 0) { throw new Error('Got the flag 0x80, see CopyStress() and SetPhonemeLength() comments!'); } - if (pos < 0 || pos > phonemeindex.length) { throw new Error('Out of bounds: ' + pos); } } - phonemeLength[pos] = length; }; - let stress = []; //numbers from 0 to 8 - let phonemeLength = []; let phonemeindex = []; let pos = 0; @@ -1425,27 +1545,22 @@ throw new Error('Got the flag 0x80, see CopyStress() and SetPhonemeLength() comments!'); } } - - stress[pos - 1] = value; - /* Set stress for prior phoneme */ + stress[pos - 1] = value; /* Set stress for prior phoneme */ }); - { PrintPhonemes(phonemeindex, phonemeLength, stress); } - Parser2(insertPhoneme, setPhoneme, getPhoneme, getStress); CopyStress(getPhoneme, getStress, setStress); SetPhonemeLength(getPhoneme, getStress, setLength); AdjustLengths(getPhoneme, setLength, getLength); ProlongPlosiveStopConsonantsCode41240(getPhoneme, insertPhoneme, getStress); - { PrintPhonemes(phonemeindex, phonemeLength, stress); } - return phonemeindex.map((v, i) => v ? [v, phonemeLength[i] | 0, stress[i] | 0] : null).filter(v => v); }; + /** * Debug printing. * @@ -1455,46 +1570,45 @@ * * @return undefined */ - let PrintPhonemes = (phonemeindex, phonemeLength, stress) => { let pad = num => { let s = '000' + num; return s.substr(s.length - 3); }; - console.log('=================================='); console.log('Internal Phoneme presentation:'); console.log(' pos idx phoneme length stress'); console.log('----------------------------------'); - for (let i = 0; i < phonemeindex.length; i++) { let name = () => { if (phonemeindex[i] < 81) { return PhonemeNameTable[phonemeindex[i]]; } - return '??'; }; - console.log(' %s %s %s %s %s', pad(i), pad(phonemeindex[i]), name(phonemeindex[i]), pad(phonemeLength[i]), pad(stress[i])); } - console.log('=================================='); }; // Values substituted for zero bits in unvoiced consonant samples. // tab48426 let sampledConsonantValues0 = [0x18, 0x1A, 0x17, 0x17, 0x17]; - let stressPitch_tab47492 = [0x00, 0xE0, 0xE6, 0xEC, 0xF3, 0xF9, 0x00, 0x06, 0xC, 0x06]; // Used to decide which phoneme's blend lengths. The candidate with the lower score is selected. + let stressPitch_tab47492 = [0x00, 0xE0, 0xE6, 0xEC, 0xF3, 0xF9, 0x00, 0x06, 0xC, 0x06]; + + // Used to decide which phoneme's blend lengths. The candidate with the lower score is selected. // tab45856 + let blendRank = [0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x02, 0x0A, 0x02, 0x08, 0x05, 0x05, 0x0B, 0x0A, 0x09, 0x08, 0x08, 0xA0, 0x08, 0x08, 0x17, 0x1F, 0x12, 0x12, 0x12, 0x12, 0x1E, 0x1E, 0x14, 0x14, 0x14, 0x14, 0x17, 0x17, 0x1A, 0x1A, 0x1D, 0x1D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x17]; - let blendRank = [0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x02, 0x0A, 0x02, 0x08, 0x05, 0x05, 0x0B, 0x0A, 0x09, 0x08, 0x08, 0xA0, 0x08, 0x08, 0x17, 0x1F, 0x12, 0x12, 0x12, 0x12, 0x1E, 0x1E, 0x14, 0x14, 0x14, 0x14, 0x17, 0x17, 0x1A, 0x1A, 0x1D, 0x1D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x17]; // Number of frames at the end of a phoneme devoted to interpolating to next phoneme's final value + // Number of frames at the end of a phoneme devoted to interpolating to next phoneme's final value //tab45696 + let outBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0xA0, 0xA0]; - let outBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0xA0, 0xA0]; // Number of frames at beginning of a phoneme devoted to interpolating to phoneme's final value + // Number of frames at beginning of a phoneme devoted to interpolating to phoneme's final value // tab45776 + let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0xB0, 0xA0]; - let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0xB0, 0xA0]; // Consists of two bitfields: + // Consists of two bitfields: // Low 3 bits (masked by 7) select a 256-byte section in sampleTable, // as well as index into sampledConsonantValues0 for unvoiced. // High 5 bits (masked by 248 = 11111000), for unvoiced, @@ -1515,222 +1629,423 @@ // 67: P' 27 00011011 // 70: T' 25 00011001 // tab45936 + let sampledConsonantFlags = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0xD3, 0xBB, 0x7C, 0x95, 0x01, 0x02, 0x03, 0x03, 0x00, 0x72, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; - let sampledConsonantFlags = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0xD3, 0xBB, 0x7C, 0x95, 0x01, 0x02, 0x03, 0x03, 0x00, 0x72, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; // - - let frequencyData = [//tab45056 |tab451356 |tab45216 + // + let frequencyData = [ + //tab45056 |tab451356 |tab45216 // freq1 | freq2 | freq3 - 0x000000 | 0x000000 | 0x000000, // ' *' 00 - 0x000013 | 0x004300 | 0x5B0000, // '.*' 01 - 0x000013 | 0x004300 | 0x5B0000, // '?*' 02 - 0x000013 | 0x004300 | 0x5B0000, // ',*' 03 - 0x000013 | 0x004300 | 0x5B0000, // '-*' 04 - 0x00000A | 0x005400 | 0x6E0000, // 'IY' 05 - 0x00000E | 0x004900 | 0x5D0000, // 'IH' 06 - 0x000013 | 0x004300 | 0x5B0000, // 'EH' 07 - 0x000018 | 0x003F00 | 0x580000, // 'AE' 08 - 0x00001B | 0x002800 | 0x590000, // 'AA' 09 - 0x000017 | 0x002C00 | 0x570000, // 'AH' 10 - 0x000015 | 0x001F00 | 0x580000, // 'AO' 11 - 0x000010 | 0x002500 | 0x520000, // 'UH' 12 - 0x000014 | 0x002D00 | 0x590000, // 'AX' 13 - 0x00000E | 0x004900 | 0x5D0000, // 'IX' 14 - 0x000012 | 0x003100 | 0x3E0000, // 'ER' 15 - 0x00000E | 0x002400 | 0x520000, // 'UX' 16 - 0x000012 | 0x001E00 | 0x580000, // 'OH' 17 - 0x000012 | 0x003300 | 0x3E0000, // 'RX' 18 - 0x000010 | 0x002500 | 0x6E0000, // 'LX' 19 - 0x00000D | 0x001D00 | 0x500000, // 'WX' 20 - 0x00000F | 0x004500 | 0x5D0000, // 'YX' 21 - 0x00000B | 0x001800 | 0x5A0000, // 'WH' 22 - 0x000012 | 0x003200 | 0x3C0000, // 'R*' 23 - 0x00000E | 0x001E00 | 0x6E0000, // 'L*' 24 - 0x00000B | 0x001800 | 0x5A0000, // 'W*' 25 - 0x000009 | 0x005300 | 0x6E0000, // 'Y*' 26 - 0x000006 | 0x002E00 | 0x510000, // 'M*' 27 - 0x000006 | 0x003600 | 0x790000, // 'N*' 28 - 0x000006 | 0x005600 | 0x650000, // 'NX' 29 - 0x000006 | 0x003600 | 0x790000, // 'DX' 30 - 0x000011 | 0x004300 | 0x5B0000, // 'Q*' 31 - 0x000006 | 0x004900 | 0x630000, // 'S*' 32 - 0x000006 | 0x004F00 | 0x6A0000, // 'SH' 33 - 0x000006 | 0x001A00 | 0x510000, // 'F*' 34 - 0x000006 | 0x004200 | 0x790000, // 'TH' 35 - 0x00000E | 0x004900 | 0x5D0000, // '/H' 36 - 0x000010 | 0x002500 | 0x520000, // '/X' 37 - 0x000009 | 0x003300 | 0x5D0000, // 'Z*' 38 - 0x00000A | 0x004200 | 0x670000, // 'ZH' 39 - 0x000008 | 0x002800 | 0x4C0000, // 'V*' 40 - 0x00000A | 0x002F00 | 0x5D0000, // 'DH' 41 - 0x000006 | 0x004F00 | 0x650000, // 'CH' 42 - 0x000006 | 0x004F00 | 0x650000, // '**' 43 - 0x000006 | 0x004200 | 0x790000, // 'J*' 44 - 0x000005 | 0x004F00 | 0x650000, // '**' 45 - 0x000006 | 0x006E00 | 0x790000, // '**' 46 - 0x000000 | 0x000000 | 0x000000, // '**' 47 - 0x000013 | 0x004800 | 0x5A0000, // 'EY' 48 - 0x00001B | 0x002700 | 0x580000, // 'AY' 49 - 0x000015 | 0x001F00 | 0x580000, // 'OY' 50 - 0x00001B | 0x002B00 | 0x580000, // 'AW' 51 - 0x000012 | 0x001E00 | 0x580000, // 'OW' 52 - 0x00000D | 0x002200 | 0x520000, // 'UW' 53 - 0x000006 | 0x001A00 | 0x510000, // 'B*' 54 - 0x000006 | 0x001A00 | 0x510000, // '**' 55 - 0x000006 | 0x001A00 | 0x510000, // '**' 56 - 0x000006 | 0x004200 | 0x790000, // 'D*' 57 - 0x000006 | 0x004200 | 0x790000, // '**' 58 - 0x000006 | 0x004200 | 0x790000, // '**' 59 - 0x000006 | 0x006E00 | 0x700000, // 'G*' 60 - 0x000006 | 0x006E00 | 0x6E0000, // '**' 61 - 0x000006 | 0x006E00 | 0x6E0000, // '**' 62 - 0x000006 | 0x005400 | 0x5E0000, // 'GX' 63 - 0x000006 | 0x005400 | 0x5E0000, // '**' 64 - 0x000006 | 0x005400 | 0x5E0000, // '**' 65 - 0x000006 | 0x001A00 | 0x510000, // 'P*' 66 - 0x000006 | 0x001A00 | 0x510000, // '**' 67 - 0x000006 | 0x001A00 | 0x510000, // '**' 68 - 0x000006 | 0x004200 | 0x790000, // 'T*' 69 - 0x000006 | 0x004200 | 0x790000, // '**' 70 - 0x000006 | 0x004200 | 0x790000, // '**' 71 - 0x000006 | 0x006D00 | 0x650000, // 'K*' 72 - 0x00000A | 0x005600 | 0x650000, // '**' 73 - 0x00000A | 0x006D00 | 0x700000, // '**' 74 - 0x000006 | 0x005400 | 0x5E0000, // 'KX' 75 - 0x000006 | 0x005400 | 0x5E0000, // '**' 76 - 0x000006 | 0x005400 | 0x5E0000, // '**' 77 - 0x00002C | 0x007F00 | 0x080000, // 'UL' 78 + 0x000000 | 0x000000 | 0x000000, + // ' *' 00 + 0x000013 | 0x004300 | 0x5B0000, + // '.*' 01 + 0x000013 | 0x004300 | 0x5B0000, + // '?*' 02 + 0x000013 | 0x004300 | 0x5B0000, + // ',*' 03 + 0x000013 | 0x004300 | 0x5B0000, + // '-*' 04 + 0x00000A | 0x005400 | 0x6E0000, + // 'IY' 05 + 0x00000E | 0x004900 | 0x5D0000, + // 'IH' 06 + 0x000013 | 0x004300 | 0x5B0000, + // 'EH' 07 + 0x000018 | 0x003F00 | 0x580000, + // 'AE' 08 + 0x00001B | 0x002800 | 0x590000, + // 'AA' 09 + 0x000017 | 0x002C00 | 0x570000, + // 'AH' 10 + 0x000015 | 0x001F00 | 0x580000, + // 'AO' 11 + 0x000010 | 0x002500 | 0x520000, + // 'UH' 12 + 0x000014 | 0x002D00 | 0x590000, + // 'AX' 13 + 0x00000E | 0x004900 | 0x5D0000, + // 'IX' 14 + 0x000012 | 0x003100 | 0x3E0000, + // 'ER' 15 + 0x00000E | 0x002400 | 0x520000, + // 'UX' 16 + 0x000012 | 0x001E00 | 0x580000, + // 'OH' 17 + 0x000012 | 0x003300 | 0x3E0000, + // 'RX' 18 + 0x000010 | 0x002500 | 0x6E0000, + // 'LX' 19 + 0x00000D | 0x001D00 | 0x500000, + // 'WX' 20 + 0x00000F | 0x004500 | 0x5D0000, + // 'YX' 21 + 0x00000B | 0x001800 | 0x5A0000, + // 'WH' 22 + 0x000012 | 0x003200 | 0x3C0000, + // 'R*' 23 + 0x00000E | 0x001E00 | 0x6E0000, + // 'L*' 24 + 0x00000B | 0x001800 | 0x5A0000, + // 'W*' 25 + 0x000009 | 0x005300 | 0x6E0000, + // 'Y*' 26 + 0x000006 | 0x002E00 | 0x510000, + // 'M*' 27 + 0x000006 | 0x003600 | 0x790000, + // 'N*' 28 + 0x000006 | 0x005600 | 0x650000, + // 'NX' 29 + 0x000006 | 0x003600 | 0x790000, + // 'DX' 30 + 0x000011 | 0x004300 | 0x5B0000, + // 'Q*' 31 + 0x000006 | 0x004900 | 0x630000, + // 'S*' 32 + 0x000006 | 0x004F00 | 0x6A0000, + // 'SH' 33 + 0x000006 | 0x001A00 | 0x510000, + // 'F*' 34 + 0x000006 | 0x004200 | 0x790000, + // 'TH' 35 + 0x00000E | 0x004900 | 0x5D0000, + // '/H' 36 + 0x000010 | 0x002500 | 0x520000, + // '/X' 37 + 0x000009 | 0x003300 | 0x5D0000, + // 'Z*' 38 + 0x00000A | 0x004200 | 0x670000, + // 'ZH' 39 + 0x000008 | 0x002800 | 0x4C0000, + // 'V*' 40 + 0x00000A | 0x002F00 | 0x5D0000, + // 'DH' 41 + 0x000006 | 0x004F00 | 0x650000, + // 'CH' 42 + 0x000006 | 0x004F00 | 0x650000, + // '**' 43 + 0x000006 | 0x004200 | 0x790000, + // 'J*' 44 + 0x000005 | 0x004F00 | 0x650000, + // '**' 45 + 0x000006 | 0x006E00 | 0x790000, + // '**' 46 + 0x000000 | 0x000000 | 0x000000, + // '**' 47 + 0x000013 | 0x004800 | 0x5A0000, + // 'EY' 48 + 0x00001B | 0x002700 | 0x580000, + // 'AY' 49 + 0x000015 | 0x001F00 | 0x580000, + // 'OY' 50 + 0x00001B | 0x002B00 | 0x580000, + // 'AW' 51 + 0x000012 | 0x001E00 | 0x580000, + // 'OW' 52 + 0x00000D | 0x002200 | 0x520000, + // 'UW' 53 + 0x000006 | 0x001A00 | 0x510000, + // 'B*' 54 + 0x000006 | 0x001A00 | 0x510000, + // '**' 55 + 0x000006 | 0x001A00 | 0x510000, + // '**' 56 + 0x000006 | 0x004200 | 0x790000, + // 'D*' 57 + 0x000006 | 0x004200 | 0x790000, + // '**' 58 + 0x000006 | 0x004200 | 0x790000, + // '**' 59 + 0x000006 | 0x006E00 | 0x700000, + // 'G*' 60 + 0x000006 | 0x006E00 | 0x6E0000, + // '**' 61 + 0x000006 | 0x006E00 | 0x6E0000, + // '**' 62 + 0x000006 | 0x005400 | 0x5E0000, + // 'GX' 63 + 0x000006 | 0x005400 | 0x5E0000, + // '**' 64 + 0x000006 | 0x005400 | 0x5E0000, + // '**' 65 + 0x000006 | 0x001A00 | 0x510000, + // 'P*' 66 + 0x000006 | 0x001A00 | 0x510000, + // '**' 67 + 0x000006 | 0x001A00 | 0x510000, + // '**' 68 + 0x000006 | 0x004200 | 0x790000, + // 'T*' 69 + 0x000006 | 0x004200 | 0x790000, + // '**' 70 + 0x000006 | 0x004200 | 0x790000, + // '**' 71 + 0x000006 | 0x006D00 | 0x650000, + // 'K*' 72 + 0x00000A | 0x005600 | 0x650000, + // '**' 73 + 0x00000A | 0x006D00 | 0x700000, + // '**' 74 + 0x000006 | 0x005400 | 0x5E0000, + // 'KX' 75 + 0x000006 | 0x005400 | 0x5E0000, + // '**' 76 + 0x000006 | 0x005400 | 0x5E0000, + // '**' 77 + 0x00002C | 0x007F00 | 0x080000, + // 'UL' 78 0x000013 | 0x007F00 | 0x010000 // 'UM' 79 ]; + /** * * ampl1data[X] = ampldata[X] & 0xFF; // F1 amplitude * ampl2data[X] = (ampldata[X] >> 8) & 0xFF; // F2 amplitude * ampl3data[X] = (ampldata[X] >> 16) & 0xFF; // F3 amplitude */ - - let ampldata = [// ampl1 | ampl2 | ampl3 - 0x000000 | 0x000000 | 0x000000, // ' *' 00 - 0x000000 | 0x000000 | 0x000000, // '.*' 01 - 0x000000 | 0x000000 | 0x000000, // '?*' 02 - 0x000000 | 0x000000 | 0x000000, // ',*' 03 - 0x000000 | 0x000000 | 0x000000, // '-*' 04 - 0x00000D | 0x000A00 | 0x080000, // 'IY' 05 - 0x00000D | 0x000B00 | 0x070000, // 'IH' 06 - 0x00000E | 0x000D00 | 0x080000, // 'EH' 07 - 0x00000F | 0x000E00 | 0x080000, // 'AE' 08 - 0x00000F | 0x000D00 | 0x010000, // 'AA' 09 - 0x00000F | 0x000C00 | 0x010000, // 'AH' 10 - 0x00000F | 0x000C00 | 0x000000, // 'AO' 11 - 0x00000F | 0x000B00 | 0x010000, // 'UH' 12 - 0x00000C | 0x000900 | 0x000000, // 'AX' 13 - 0x00000D | 0x000B00 | 0x070000, // 'IX' 14 - 0x00000C | 0x000B00 | 0x050000, // 'ER' 15 - 0x00000F | 0x000C00 | 0x010000, // 'UX' 16 - 0x00000F | 0x000C00 | 0x000000, // 'OH' 17 - 0x00000D | 0x000C00 | 0x060000, // 'RX' 18 - 0x00000D | 0x000800 | 0x010000, // 'LX' 19 - 0x00000D | 0x000800 | 0x000000, // 'WX' 20 - 0x00000E | 0x000C00 | 0x070000, // 'YX' 21 - 0x00000D | 0x000800 | 0x000000, // 'WH' 22 - 0x00000C | 0x000A00 | 0x050000, // 'R*' 23 - 0x00000D | 0x000800 | 0x010000, // 'L*' 24 - 0x00000D | 0x000800 | 0x000000, // 'W*' 25 - 0x00000D | 0x000A00 | 0x080000, // 'Y*' 26 - 0x00000C | 0x000300 | 0x000000, // 'M*' 27 - 0x000009 | 0x000900 | 0x000000, // 'N*' 28 - 0x000009 | 0x000600 | 0x030000, // 'NX' 29 - 0x000000 | 0x000000 | 0x000000, // 'DX' 30 - 0x000000 | 0x000000 | 0x000000, // 'Q*' 31 - 0x000000 | 0x000000 | 0x000000, // 'S*' 32 - 0x000000 | 0x000000 | 0x000000, // 'SH' 33 - 0x000000 | 0x000000 | 0x000000, // 'F*' 34 - 0x000000 | 0x000000 | 0x000000, // 'TH' 35 - 0x000000 | 0x000000 | 0x000000, // '/H' 36 - 0x000000 | 0x000000 | 0x000000, // '/X' 37 - 0x00000B | 0x000300 | 0x000000, // 'Z*' 38 - 0x00000B | 0x000500 | 0x010000, // 'ZH' 39 - 0x00000B | 0x000300 | 0x000000, // 'V*' 40 - 0x00000B | 0x000400 | 0x000000, // 'DH' 41 - 0x000000 | 0x000000 | 0x000000, // 'CH' 42 - 0x000000 | 0x000000 | 0x000000, // '**' 43 - 0x000001 | 0x000000 | 0x000000, // 'J*' 44 - 0x00000B | 0x000500 | 0x010000, // '**' 45 - 0x000000 | 0x000A00 | 0x0E0000, // '**' 46 - 0x000002 | 0x000200 | 0x010000, // '**' 47 - 0x00000E | 0x000E00 | 0x090000, // 'EY' 48 - 0x00000F | 0x000D00 | 0x010000, // 'AY' 49 - 0x00000F | 0x000C00 | 0x000000, // 'OY' 50 - 0x00000F | 0x000D00 | 0x010000, // 'AW' 51 - 0x00000F | 0x000C00 | 0x000000, // 'OW' 52 - 0x00000D | 0x000800 | 0x000000, // 'UW' 53 - 0x000002 | 0x000000 | 0x000000, // 'B*' 54 - 0x000004 | 0x000100 | 0x000000, // '**' 55 - 0x000000 | 0x000000 | 0x000000, // '**' 56 - 0x000002 | 0x000000 | 0x000000, // 'D*' 57 - 0x000004 | 0x000100 | 0x000000, // '**' 58 - 0x000000 | 0x000000 | 0x000000, // '**' 59 - 0x000001 | 0x000000 | 0x000000, // 'G*' 60 - 0x000004 | 0x000100 | 0x000000, // '**' 61 - 0x000000 | 0x000000 | 0x000000, // '**' 62 - 0x000001 | 0x000000 | 0x000000, // 'GX' 63 - 0x000004 | 0x000100 | 0x000000, // '**' 64 - 0x000000 | 0x000000 | 0x000000, // '**' 65 - 0x000000 | 0x000000 | 0x000000, // 'P*' 66 - 0x000000 | 0x000000 | 0x000000, // '**' 67 - 0x000000 | 0x000000 | 0x000000, // '**' 68 - 0x000000 | 0x000000 | 0x000000, // 'T*' 69 - 0x000000 | 0x000000 | 0x000000, // '**' 70 - 0x000000 | 0x000000 | 0x000000, // '**' 71 - 0x000000 | 0x000000 | 0x000000, // 'K*' 72 - 0x00000C | 0x000A00 | 0x070000, // '**' 73 - 0x000000 | 0x000000 | 0x000000, // '**' 74 - 0x000000 | 0x000000 | 0x000000, // 'KX' 75 - 0x000000 | 0x000A00 | 0x050000, // '**' 76 - 0x000000 | 0x000000 | 0x000000, // '**' 77 - 0x00000F | 0x000000 | 0x130000, // 'UL' 78 + let ampldata = [ + // ampl1 | ampl2 | ampl3 + 0x000000 | 0x000000 | 0x000000, + // ' *' 00 + 0x000000 | 0x000000 | 0x000000, + // '.*' 01 + 0x000000 | 0x000000 | 0x000000, + // '?*' 02 + 0x000000 | 0x000000 | 0x000000, + // ',*' 03 + 0x000000 | 0x000000 | 0x000000, + // '-*' 04 + 0x00000D | 0x000A00 | 0x080000, + // 'IY' 05 + 0x00000D | 0x000B00 | 0x070000, + // 'IH' 06 + 0x00000E | 0x000D00 | 0x080000, + // 'EH' 07 + 0x00000F | 0x000E00 | 0x080000, + // 'AE' 08 + 0x00000F | 0x000D00 | 0x010000, + // 'AA' 09 + 0x00000F | 0x000C00 | 0x010000, + // 'AH' 10 + 0x00000F | 0x000C00 | 0x000000, + // 'AO' 11 + 0x00000F | 0x000B00 | 0x010000, + // 'UH' 12 + 0x00000C | 0x000900 | 0x000000, + // 'AX' 13 + 0x00000D | 0x000B00 | 0x070000, + // 'IX' 14 + 0x00000C | 0x000B00 | 0x050000, + // 'ER' 15 + 0x00000F | 0x000C00 | 0x010000, + // 'UX' 16 + 0x00000F | 0x000C00 | 0x000000, + // 'OH' 17 + 0x00000D | 0x000C00 | 0x060000, + // 'RX' 18 + 0x00000D | 0x000800 | 0x010000, + // 'LX' 19 + 0x00000D | 0x000800 | 0x000000, + // 'WX' 20 + 0x00000E | 0x000C00 | 0x070000, + // 'YX' 21 + 0x00000D | 0x000800 | 0x000000, + // 'WH' 22 + 0x00000C | 0x000A00 | 0x050000, + // 'R*' 23 + 0x00000D | 0x000800 | 0x010000, + // 'L*' 24 + 0x00000D | 0x000800 | 0x000000, + // 'W*' 25 + 0x00000D | 0x000A00 | 0x080000, + // 'Y*' 26 + 0x00000C | 0x000300 | 0x000000, + // 'M*' 27 + 0x000009 | 0x000900 | 0x000000, + // 'N*' 28 + 0x000009 | 0x000600 | 0x030000, + // 'NX' 29 + 0x000000 | 0x000000 | 0x000000, + // 'DX' 30 + 0x000000 | 0x000000 | 0x000000, + // 'Q*' 31 + 0x000000 | 0x000000 | 0x000000, + // 'S*' 32 + 0x000000 | 0x000000 | 0x000000, + // 'SH' 33 + 0x000000 | 0x000000 | 0x000000, + // 'F*' 34 + 0x000000 | 0x000000 | 0x000000, + // 'TH' 35 + 0x000000 | 0x000000 | 0x000000, + // '/H' 36 + 0x000000 | 0x000000 | 0x000000, + // '/X' 37 + 0x00000B | 0x000300 | 0x000000, + // 'Z*' 38 + 0x00000B | 0x000500 | 0x010000, + // 'ZH' 39 + 0x00000B | 0x000300 | 0x000000, + // 'V*' 40 + 0x00000B | 0x000400 | 0x000000, + // 'DH' 41 + 0x000000 | 0x000000 | 0x000000, + // 'CH' 42 + 0x000000 | 0x000000 | 0x000000, + // '**' 43 + 0x000001 | 0x000000 | 0x000000, + // 'J*' 44 + 0x00000B | 0x000500 | 0x010000, + // '**' 45 + 0x000000 | 0x000A00 | 0x0E0000, + // '**' 46 + 0x000002 | 0x000200 | 0x010000, + // '**' 47 + 0x00000E | 0x000E00 | 0x090000, + // 'EY' 48 + 0x00000F | 0x000D00 | 0x010000, + // 'AY' 49 + 0x00000F | 0x000C00 | 0x000000, + // 'OY' 50 + 0x00000F | 0x000D00 | 0x010000, + // 'AW' 51 + 0x00000F | 0x000C00 | 0x000000, + // 'OW' 52 + 0x00000D | 0x000800 | 0x000000, + // 'UW' 53 + 0x000002 | 0x000000 | 0x000000, + // 'B*' 54 + 0x000004 | 0x000100 | 0x000000, + // '**' 55 + 0x000000 | 0x000000 | 0x000000, + // '**' 56 + 0x000002 | 0x000000 | 0x000000, + // 'D*' 57 + 0x000004 | 0x000100 | 0x000000, + // '**' 58 + 0x000000 | 0x000000 | 0x000000, + // '**' 59 + 0x000001 | 0x000000 | 0x000000, + // 'G*' 60 + 0x000004 | 0x000100 | 0x000000, + // '**' 61 + 0x000000 | 0x000000 | 0x000000, + // '**' 62 + 0x000001 | 0x000000 | 0x000000, + // 'GX' 63 + 0x000004 | 0x000100 | 0x000000, + // '**' 64 + 0x000000 | 0x000000 | 0x000000, + // '**' 65 + 0x000000 | 0x000000 | 0x000000, + // 'P*' 66 + 0x000000 | 0x000000 | 0x000000, + // '**' 67 + 0x000000 | 0x000000 | 0x000000, + // '**' 68 + 0x000000 | 0x000000 | 0x000000, + // 'T*' 69 + 0x000000 | 0x000000 | 0x000000, + // '**' 70 + 0x000000 | 0x000000 | 0x000000, + // '**' 71 + 0x000000 | 0x000000 | 0x000000, + // 'K*' 72 + 0x00000C | 0x000A00 | 0x070000, + // '**' 73 + 0x000000 | 0x000000 | 0x000000, + // '**' 74 + 0x000000 | 0x000000 | 0x000000, + // 'KX' 75 + 0x000000 | 0x000A00 | 0x050000, + // '**' 76 + 0x000000 | 0x000000 | 0x000000, + // '**' 77 + 0x00000F | 0x000000 | 0x130000, + // 'UL' 78 0x00000F | 0x000000 | 0x100000 // 'UM' 79 - ]; // Sampled data for consonants, consisting of five 256-byte sections - - let sampleTable = [//00 T', S, Z (coronal) - 0x38, 0x84, 0x6B, 0x19, 0xC6, 0x63, 0x18, 0x86, 0x73, 0x98, 0xC6, 0xB1, 0x1C, 0xCA, 0x31, 0x8C, 0xC7, 0x31, 0x88, 0xC2, 0x30, 0x98, 0x46, 0x31, 0x18, 0xC6, 0x35, 0x0C, 0xCA, 0x31, 0x0C, 0xC6, //20 - 0x21, 0x10, 0x24, 0x69, 0x12, 0xC2, 0x31, 0x14, 0xC4, 0x71, 0x08, 0x4A, 0x22, 0x49, 0xAB, 0x6A, 0xA8, 0xAC, 0x49, 0x51, 0x32, 0xD5, 0x52, 0x88, 0x93, 0x6C, 0x94, 0x22, 0x15, 0x54, 0xD2, 0x25, //40 - 0x96, 0xD4, 0x50, 0xA5, 0x46, 0x21, 0x08, 0x85, 0x6B, 0x18, 0xC4, 0x63, 0x10, 0xCE, 0x6B, 0x18, 0x8C, 0x71, 0x19, 0x8C, 0x63, 0x35, 0x0C, 0xC6, 0x33, 0x99, 0xCC, 0x6C, 0xB5, 0x4E, 0xA2, 0x99, //60 - 0x46, 0x21, 0x28, 0x82, 0x95, 0x2E, 0xE3, 0x30, 0x9C, 0xC5, 0x30, 0x9C, 0xA2, 0xB1, 0x9C, 0x67, 0x31, 0x88, 0x66, 0x59, 0x2C, 0x53, 0x18, 0x84, 0x67, 0x50, 0xCA, 0xE3, 0x0A, 0xAC, 0xAB, 0x30, //80 - 0xAC, 0x62, 0x30, 0x8C, 0x63, 0x10, 0x94, 0x62, 0xB1, 0x8C, 0x82, 0x28, 0x96, 0x33, 0x98, 0xD6, 0xB5, 0x4C, 0x62, 0x29, 0xA5, 0x4A, 0xB5, 0x9C, 0xC6, 0x31, 0x14, 0xD6, 0x38, 0x9C, 0x4B, 0xB4, //A0 - 0x86, 0x65, 0x18, 0xAE, 0x67, 0x1C, 0xA6, 0x63, 0x19, 0x96, 0x23, 0x19, 0x84, 0x13, 0x08, 0xA6, 0x52, 0xAC, 0xCA, 0x22, 0x89, 0x6E, 0xAB, 0x19, 0x8C, 0x62, 0x34, 0xC4, 0x62, 0x19, 0x86, 0x63, //C0 - 0x18, 0xC4, 0x23, 0x58, 0xD6, 0xA3, 0x50, 0x42, 0x54, 0x4A, 0xAD, 0x4A, 0x25, 0x11, 0x6B, 0x64, 0x89, 0x4A, 0x63, 0x39, 0x8A, 0x23, 0x31, 0x2A, 0xEA, 0xA2, 0xA9, 0x44, 0xC5, 0x12, 0xCD, 0x42, //E0 - 0x34, 0x8C, 0x62, 0x18, 0x8C, 0x63, 0x11, 0x48, 0x66, 0x31, 0x9D, 0x44, 0x33, 0x1D, 0x46, 0x31, 0x9C, 0xC6, 0xB1, 0x0C, 0xCD, 0x32, 0x88, 0xC4, 0x73, 0x18, 0x86, 0x73, 0x08, 0xD6, 0x63, 0x58, //100 CH', J', SH, ZH (palato-alveolar) - 0x07, 0x81, 0xE0, 0xF0, 0x3C, 0x07, 0x87, 0x90, 0x3C, 0x7C, 0x0F, 0xC7, 0xC0, 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x80, 0x80, 0x00, 0x1C, 0x78, 0x70, 0xF1, 0xC7, 0x1F, 0xC0, 0x0C, 0xFE, 0x1C, 0x1F, //120 - 0x1F, 0x0E, 0x0A, 0x7A, 0xC0, 0x71, 0xF2, 0x83, 0x8F, 0x03, 0x0F, 0x0F, 0x0C, 0x00, 0x79, 0xF8, 0x61, 0xE0, 0x43, 0x0F, 0x83, 0xE7, 0x18, 0xF9, 0xC1, 0x13, 0xDA, 0xE9, 0x63, 0x8F, 0x0F, 0x83, //140 - 0x83, 0x87, 0xC3, 0x1F, 0x3C, 0x70, 0xF0, 0xE1, 0xE1, 0xE3, 0x87, 0xB8, 0x71, 0x0E, 0x20, 0xE3, 0x8D, 0x48, 0x78, 0x1C, 0x93, 0x87, 0x30, 0xE1, 0xC1, 0xC1, 0xE4, 0x78, 0x21, 0x83, 0x83, 0xC3, //160 - 0x87, 0x06, 0x39, 0xE5, 0xC3, 0x87, 0x07, 0x0E, 0x1C, 0x1C, 0x70, 0xF4, 0x71, 0x9C, 0x60, 0x36, 0x32, 0xC3, 0x1E, 0x3C, 0xF3, 0x8F, 0x0E, 0x3C, 0x70, 0xE3, 0xC7, 0x8F, 0x0F, 0x0F, 0x0E, 0x3C, //180 - 0x78, 0xF0, 0xE3, 0x87, 0x06, 0xF0, 0xE3, 0x07, 0xC1, 0x99, 0x87, 0x0F, 0x18, 0x78, 0x70, 0x70, 0xFC, 0xF3, 0x10, 0xB1, 0x8C, 0x8C, 0x31, 0x7C, 0x70, 0xE1, 0x86, 0x3C, 0x64, 0x6C, 0xB0, 0xE1, //1A0 - 0xE3, 0x0F, 0x23, 0x8F, 0x0F, 0x1E, 0x3E, 0x38, 0x3C, 0x38, 0x7B, 0x8F, 0x07, 0x0E, 0x3C, 0xF4, 0x17, 0x1E, 0x3C, 0x78, 0xF2, 0x9E, 0x72, 0x49, 0xE3, 0x25, 0x36, 0x38, 0x58, 0x39, 0xE2, 0xDE, //1C0 - 0x3C, 0x78, 0x78, 0xE1, 0xC7, 0x61, 0xE1, 0xE1, 0xB0, 0xF0, 0xF0, 0xC3, 0xC7, 0x0E, 0x38, 0xC0, 0xF0, 0xCE, 0x73, 0x73, 0x18, 0x34, 0xB0, 0xE1, 0xC7, 0x8E, 0x1C, 0x3C, 0xF8, 0x38, 0xF0, 0xE1, //1E0 - 0xC1, 0x8B, 0x86, 0x8F, 0x1C, 0x78, 0x70, 0xF0, 0x78, 0xAC, 0xB1, 0x8F, 0x39, 0x31, 0xDB, 0x38, 0x61, 0xC3, 0x0E, 0x0E, 0x38, 0x78, 0x73, 0x17, 0x1E, 0x39, 0x1E, 0x38, 0x64, 0xE1, 0xF1, 0xC1, //200 P', F, V, TH, DH ([labio]dental) - 0x4E, 0x0F, 0x40, 0xA2, 0x02, 0xC5, 0x8F, 0x81, 0xA1, 0xFC, 0x12, 0x08, 0x64, 0xE0, 0x3C, 0x22, 0xE0, 0x45, 0x07, 0x8E, 0x0C, 0x32, 0x90, 0xF0, 0x1F, 0x20, 0x49, 0xE0, 0xF8, 0x0C, 0x60, 0xF0, //220 - 0x17, 0x1A, 0x41, 0xAA, 0xA4, 0xD0, 0x8D, 0x12, 0x82, 0x1E, 0x1E, 0x03, 0xF8, 0x3E, 0x03, 0x0C, 0x73, 0x80, 0x70, 0x44, 0x26, 0x03, 0x24, 0xE1, 0x3E, 0x04, 0x4E, 0x04, 0x1C, 0xC1, 0x09, 0xCC, //240 - 0x9E, 0x90, 0x21, 0x07, 0x90, 0x43, 0x64, 0xC0, 0x0F, 0xC6, 0x90, 0x9C, 0xC1, 0x5B, 0x03, 0xE2, 0x1D, 0x81, 0xE0, 0x5E, 0x1D, 0x03, 0x84, 0xB8, 0x2C, 0x0F, 0x80, 0xB1, 0x83, 0xE0, 0x30, 0x41, //260 - 0x1E, 0x43, 0x89, 0x83, 0x50, 0xFC, 0x24, 0x2E, 0x13, 0x83, 0xF1, 0x7C, 0x4C, 0x2C, 0xC9, 0x0D, 0x83, 0xB0, 0xB5, 0x82, 0xE4, 0xE8, 0x06, 0x9C, 0x07, 0xA0, 0x99, 0x1D, 0x07, 0x3E, 0x82, 0x8F, //280 - 0x70, 0x30, 0x74, 0x40, 0xCA, 0x10, 0xE4, 0xE8, 0x0F, 0x92, 0x14, 0x3F, 0x06, 0xF8, 0x84, 0x88, 0x43, 0x81, 0x0A, 0x34, 0x39, 0x41, 0xC6, 0xE3, 0x1C, 0x47, 0x03, 0xB0, 0xB8, 0x13, 0x0A, 0xC2, //2A0 - 0x64, 0xF8, 0x18, 0xF9, 0x60, 0xB3, 0xC0, 0x65, 0x20, 0x60, 0xA6, 0x8C, 0xC3, 0x81, 0x20, 0x30, 0x26, 0x1E, 0x1C, 0x38, 0xD3, 0x01, 0xB0, 0x26, 0x40, 0xF4, 0x0B, 0xC3, 0x42, 0x1F, 0x85, 0x32, //2C0 - 0x26, 0x60, 0x40, 0xC9, 0xCB, 0x01, 0xEC, 0x11, 0x28, 0x40, 0xFA, 0x04, 0x34, 0xE0, 0x70, 0x4C, 0x8C, 0x1D, 0x07, 0x69, 0x03, 0x16, 0xC8, 0x04, 0x23, 0xE8, 0xC6, 0x9A, 0x0B, 0x1A, 0x03, 0xE0, //2E0 - 0x76, 0x06, 0x05, 0xCF, 0x1E, 0xBC, 0x58, 0x31, 0x71, 0x66, 0x00, 0xF8, 0x3F, 0x04, 0xFC, 0x0C, 0x74, 0x27, 0x8A, 0x80, 0x71, 0xC2, 0x3A, 0x26, 0x06, 0xC0, 0x1F, 0x05, 0x0F, 0x98, 0x40, 0xAE, //300 /H (palatal) - 0x01, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x0E, 0xFE, 0x00, 0x03, 0xDF, 0x80, 0x03, 0xEF, 0x80, 0x1B, 0xF1, 0xC2, 0x00, 0xE7, 0xE0, 0x18, 0xFC, 0xE0, 0x21, 0xFC, 0x80, 0x3C, 0xFC, 0x40, 0x0E, 0x7E, //320 - 0x00, 0x3F, 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x3E, 0xF0, 0x07, 0xFC, 0x00, 0x7E, 0x10, 0x3F, 0xFF, 0x00, 0x3F, 0x38, 0x0E, 0x7C, 0x01, 0x87, 0x0C, 0xFC, 0xC7, 0x00, 0x3E, 0x04, //340 - 0x0F, 0x3E, 0x1F, 0x0F, 0x0F, 0x1F, 0x0F, 0x02, 0x83, 0x87, 0xCF, 0x03, 0x87, 0x0F, 0x3F, 0xC0, 0x07, 0x9E, 0x60, 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x77, 0xE1, 0xC0, 0xFE, 0xE0, 0xC3, //360 - 0xE0, 0x01, 0xDF, 0xF8, 0x03, 0x07, 0x00, 0x7E, 0x70, 0x00, 0x7C, 0x38, 0x18, 0xFE, 0x0C, 0x1E, 0x78, 0x1C, 0x7C, 0x3E, 0x0E, 0x1F, 0x1E, 0x1E, 0x3E, 0x00, 0x7F, 0x83, 0x07, 0xDB, 0x87, 0x83, //380 - 0x07, 0xC7, 0x07, 0x10, 0x71, 0xFF, 0x00, 0x3F, 0xE2, 0x01, 0xE0, 0xC1, 0xC3, 0xE1, 0x00, 0x7F, 0xC0, 0x05, 0xF0, 0x20, 0xF8, 0xF0, 0x70, 0xFE, 0x78, 0x79, 0xF8, 0x02, 0x3F, 0x0C, 0x8F, 0x03, //3a0 - 0x0F, 0x9F, 0xE0, 0xC1, 0xC7, 0x87, 0x03, 0xC3, 0xC3, 0xB0, 0xE1, 0xE1, 0xC1, 0xE3, 0xE0, 0x71, 0xF0, 0x00, 0xFC, 0x70, 0x7C, 0x0C, 0x3E, 0x38, 0x0E, 0x1C, 0x70, 0xC3, 0xC7, 0x03, 0x81, 0xC1, //3c0 - 0xC7, 0xE7, 0x00, 0x0F, 0xC7, 0x87, 0x19, 0x09, 0xEF, 0xC4, 0x33, 0xE0, 0xC1, 0xFC, 0xF8, 0x70, 0xF0, 0x78, 0xF8, 0xF0, 0x61, 0xC7, 0x00, 0x1F, 0xF8, 0x01, 0x7C, 0xF8, 0xF0, 0x78, 0x70, 0x3C, //3e0 - 0x7C, 0xCE, 0x0E, 0x21, 0x83, 0xCF, 0x08, 0x07, 0x8F, 0x08, 0xC1, 0x87, 0x8F, 0x80, 0xC7, 0xE3, 0x00, 0x07, 0xF8, 0xE0, 0xEF, 0x00, 0x39, 0xF7, 0x80, 0x0E, 0xF8, 0xE1, 0xE3, 0xF8, 0x21, 0x9F, //400 /X (glottal) - 0xC0, 0xFF, 0x03, 0xF8, 0x07, 0xC0, 0x1F, 0xF8, 0xC4, 0x04, 0xFC, 0xC4, 0xC1, 0xBC, 0x87, 0xF0, 0x0F, 0xC0, 0x7F, 0x05, 0xE0, 0x25, 0xEC, 0xC0, 0x3E, 0x84, 0x47, 0xF0, 0x8E, 0x03, 0xF8, 0x03, //420 - 0xFB, 0xC0, 0x19, 0xF8, 0x07, 0x9C, 0x0C, 0x17, 0xF8, 0x07, 0xE0, 0x1F, 0xA1, 0xFC, 0x0F, 0xFC, 0x01, 0xF0, 0x3F, 0x00, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0xFD, 0x00, 0xFF, 0x88, 0x0D, 0xF9, 0x01, //440 - 0xFF, 0x00, 0x70, 0x07, 0xC0, 0x3E, 0x42, 0xF3, 0x0D, 0xC4, 0x7F, 0x80, 0xFC, 0x07, 0xF0, 0x5E, 0xC0, 0x3F, 0x00, 0x78, 0x3F, 0x81, 0xFF, 0x01, 0xF8, 0x01, 0xC3, 0xE8, 0x0C, 0xE4, 0x64, 0x8F, //460 - 0xE4, 0x0F, 0xF0, 0x07, 0xF0, 0xC2, 0x1F, 0x00, 0x7F, 0xC0, 0x6F, 0x80, 0x7E, 0x03, 0xF8, 0x07, 0xF0, 0x3F, 0xC0, 0x78, 0x0F, 0x82, 0x07, 0xFE, 0x22, 0x77, 0x70, 0x02, 0x76, 0x03, 0xFE, 0x00, //480 - 0xFE, 0x67, 0x00, 0x7C, 0xC7, 0xF1, 0x8E, 0xC6, 0x3B, 0xE0, 0x3F, 0x84, 0xF3, 0x19, 0xD8, 0x03, 0x99, 0xFC, 0x09, 0xB8, 0x0F, 0xF8, 0x00, 0x9D, 0x24, 0x61, 0xF9, 0x0D, 0x00, 0xFD, 0x03, 0xF0, //4a0 - 0x1F, 0x90, 0x3F, 0x01, 0xF8, 0x1F, 0xD0, 0x0F, 0xF8, 0x37, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFA, 0x03, 0xF0, 0x0F, 0x80, 0xFF, 0x01, //4c0 - 0xB8, 0x07, 0xF0, 0x01, 0xFC, 0x01, 0xBC, 0x80, 0x13, 0x1E, 0x00, 0x7F, 0xE1, 0x40, 0x7F, 0xA0, 0x7F, 0xB0, 0x00, 0x3F, 0xC0, 0x1F, 0xC0, 0x38, 0x0F, 0xF0, 0x1F, 0x80, 0xFF, 0x01, 0xFC, 0x03, //4e0 + ]; + + // Sampled data for consonants, consisting of five 256-byte sections + let sampleTable = [ + //00 T', S, Z (coronal) + 0x38, 0x84, 0x6B, 0x19, 0xC6, 0x63, 0x18, 0x86, 0x73, 0x98, 0xC6, 0xB1, 0x1C, 0xCA, 0x31, 0x8C, 0xC7, 0x31, 0x88, 0xC2, 0x30, 0x98, 0x46, 0x31, 0x18, 0xC6, 0x35, 0x0C, 0xCA, 0x31, 0x0C, 0xC6, + //20 + 0x21, 0x10, 0x24, 0x69, 0x12, 0xC2, 0x31, 0x14, 0xC4, 0x71, 0x08, 0x4A, 0x22, 0x49, 0xAB, 0x6A, 0xA8, 0xAC, 0x49, 0x51, 0x32, 0xD5, 0x52, 0x88, 0x93, 0x6C, 0x94, 0x22, 0x15, 0x54, 0xD2, 0x25, + //40 + 0x96, 0xD4, 0x50, 0xA5, 0x46, 0x21, 0x08, 0x85, 0x6B, 0x18, 0xC4, 0x63, 0x10, 0xCE, 0x6B, 0x18, 0x8C, 0x71, 0x19, 0x8C, 0x63, 0x35, 0x0C, 0xC6, 0x33, 0x99, 0xCC, 0x6C, 0xB5, 0x4E, 0xA2, 0x99, + //60 + 0x46, 0x21, 0x28, 0x82, 0x95, 0x2E, 0xE3, 0x30, 0x9C, 0xC5, 0x30, 0x9C, 0xA2, 0xB1, 0x9C, 0x67, 0x31, 0x88, 0x66, 0x59, 0x2C, 0x53, 0x18, 0x84, 0x67, 0x50, 0xCA, 0xE3, 0x0A, 0xAC, 0xAB, 0x30, + //80 + 0xAC, 0x62, 0x30, 0x8C, 0x63, 0x10, 0x94, 0x62, 0xB1, 0x8C, 0x82, 0x28, 0x96, 0x33, 0x98, 0xD6, 0xB5, 0x4C, 0x62, 0x29, 0xA5, 0x4A, 0xB5, 0x9C, 0xC6, 0x31, 0x14, 0xD6, 0x38, 0x9C, 0x4B, 0xB4, + //A0 + 0x86, 0x65, 0x18, 0xAE, 0x67, 0x1C, 0xA6, 0x63, 0x19, 0x96, 0x23, 0x19, 0x84, 0x13, 0x08, 0xA6, 0x52, 0xAC, 0xCA, 0x22, 0x89, 0x6E, 0xAB, 0x19, 0x8C, 0x62, 0x34, 0xC4, 0x62, 0x19, 0x86, 0x63, + //C0 + 0x18, 0xC4, 0x23, 0x58, 0xD6, 0xA3, 0x50, 0x42, 0x54, 0x4A, 0xAD, 0x4A, 0x25, 0x11, 0x6B, 0x64, 0x89, 0x4A, 0x63, 0x39, 0x8A, 0x23, 0x31, 0x2A, 0xEA, 0xA2, 0xA9, 0x44, 0xC5, 0x12, 0xCD, 0x42, + //E0 + 0x34, 0x8C, 0x62, 0x18, 0x8C, 0x63, 0x11, 0x48, 0x66, 0x31, 0x9D, 0x44, 0x33, 0x1D, 0x46, 0x31, 0x9C, 0xC6, 0xB1, 0x0C, 0xCD, 0x32, 0x88, 0xC4, 0x73, 0x18, 0x86, 0x73, 0x08, 0xD6, 0x63, 0x58, + //100 CH', J', SH, ZH (palato-alveolar) + 0x07, 0x81, 0xE0, 0xF0, 0x3C, 0x07, 0x87, 0x90, 0x3C, 0x7C, 0x0F, 0xC7, 0xC0, 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x80, 0x80, 0x00, 0x1C, 0x78, 0x70, 0xF1, 0xC7, 0x1F, 0xC0, 0x0C, 0xFE, 0x1C, 0x1F, + //120 + 0x1F, 0x0E, 0x0A, 0x7A, 0xC0, 0x71, 0xF2, 0x83, 0x8F, 0x03, 0x0F, 0x0F, 0x0C, 0x00, 0x79, 0xF8, 0x61, 0xE0, 0x43, 0x0F, 0x83, 0xE7, 0x18, 0xF9, 0xC1, 0x13, 0xDA, 0xE9, 0x63, 0x8F, 0x0F, 0x83, + //140 + 0x83, 0x87, 0xC3, 0x1F, 0x3C, 0x70, 0xF0, 0xE1, 0xE1, 0xE3, 0x87, 0xB8, 0x71, 0x0E, 0x20, 0xE3, 0x8D, 0x48, 0x78, 0x1C, 0x93, 0x87, 0x30, 0xE1, 0xC1, 0xC1, 0xE4, 0x78, 0x21, 0x83, 0x83, 0xC3, + //160 + 0x87, 0x06, 0x39, 0xE5, 0xC3, 0x87, 0x07, 0x0E, 0x1C, 0x1C, 0x70, 0xF4, 0x71, 0x9C, 0x60, 0x36, 0x32, 0xC3, 0x1E, 0x3C, 0xF3, 0x8F, 0x0E, 0x3C, 0x70, 0xE3, 0xC7, 0x8F, 0x0F, 0x0F, 0x0E, 0x3C, + //180 + 0x78, 0xF0, 0xE3, 0x87, 0x06, 0xF0, 0xE3, 0x07, 0xC1, 0x99, 0x87, 0x0F, 0x18, 0x78, 0x70, 0x70, 0xFC, 0xF3, 0x10, 0xB1, 0x8C, 0x8C, 0x31, 0x7C, 0x70, 0xE1, 0x86, 0x3C, 0x64, 0x6C, 0xB0, 0xE1, + //1A0 + 0xE3, 0x0F, 0x23, 0x8F, 0x0F, 0x1E, 0x3E, 0x38, 0x3C, 0x38, 0x7B, 0x8F, 0x07, 0x0E, 0x3C, 0xF4, 0x17, 0x1E, 0x3C, 0x78, 0xF2, 0x9E, 0x72, 0x49, 0xE3, 0x25, 0x36, 0x38, 0x58, 0x39, 0xE2, 0xDE, + //1C0 + 0x3C, 0x78, 0x78, 0xE1, 0xC7, 0x61, 0xE1, 0xE1, 0xB0, 0xF0, 0xF0, 0xC3, 0xC7, 0x0E, 0x38, 0xC0, 0xF0, 0xCE, 0x73, 0x73, 0x18, 0x34, 0xB0, 0xE1, 0xC7, 0x8E, 0x1C, 0x3C, 0xF8, 0x38, 0xF0, 0xE1, + //1E0 + 0xC1, 0x8B, 0x86, 0x8F, 0x1C, 0x78, 0x70, 0xF0, 0x78, 0xAC, 0xB1, 0x8F, 0x39, 0x31, 0xDB, 0x38, 0x61, 0xC3, 0x0E, 0x0E, 0x38, 0x78, 0x73, 0x17, 0x1E, 0x39, 0x1E, 0x38, 0x64, 0xE1, 0xF1, 0xC1, + //200 P', F, V, TH, DH ([labio]dental) + 0x4E, 0x0F, 0x40, 0xA2, 0x02, 0xC5, 0x8F, 0x81, 0xA1, 0xFC, 0x12, 0x08, 0x64, 0xE0, 0x3C, 0x22, 0xE0, 0x45, 0x07, 0x8E, 0x0C, 0x32, 0x90, 0xF0, 0x1F, 0x20, 0x49, 0xE0, 0xF8, 0x0C, 0x60, 0xF0, + //220 + 0x17, 0x1A, 0x41, 0xAA, 0xA4, 0xD0, 0x8D, 0x12, 0x82, 0x1E, 0x1E, 0x03, 0xF8, 0x3E, 0x03, 0x0C, 0x73, 0x80, 0x70, 0x44, 0x26, 0x03, 0x24, 0xE1, 0x3E, 0x04, 0x4E, 0x04, 0x1C, 0xC1, 0x09, 0xCC, + //240 + 0x9E, 0x90, 0x21, 0x07, 0x90, 0x43, 0x64, 0xC0, 0x0F, 0xC6, 0x90, 0x9C, 0xC1, 0x5B, 0x03, 0xE2, 0x1D, 0x81, 0xE0, 0x5E, 0x1D, 0x03, 0x84, 0xB8, 0x2C, 0x0F, 0x80, 0xB1, 0x83, 0xE0, 0x30, 0x41, + //260 + 0x1E, 0x43, 0x89, 0x83, 0x50, 0xFC, 0x24, 0x2E, 0x13, 0x83, 0xF1, 0x7C, 0x4C, 0x2C, 0xC9, 0x0D, 0x83, 0xB0, 0xB5, 0x82, 0xE4, 0xE8, 0x06, 0x9C, 0x07, 0xA0, 0x99, 0x1D, 0x07, 0x3E, 0x82, 0x8F, + //280 + 0x70, 0x30, 0x74, 0x40, 0xCA, 0x10, 0xE4, 0xE8, 0x0F, 0x92, 0x14, 0x3F, 0x06, 0xF8, 0x84, 0x88, 0x43, 0x81, 0x0A, 0x34, 0x39, 0x41, 0xC6, 0xE3, 0x1C, 0x47, 0x03, 0xB0, 0xB8, 0x13, 0x0A, 0xC2, + //2A0 + 0x64, 0xF8, 0x18, 0xF9, 0x60, 0xB3, 0xC0, 0x65, 0x20, 0x60, 0xA6, 0x8C, 0xC3, 0x81, 0x20, 0x30, 0x26, 0x1E, 0x1C, 0x38, 0xD3, 0x01, 0xB0, 0x26, 0x40, 0xF4, 0x0B, 0xC3, 0x42, 0x1F, 0x85, 0x32, + //2C0 + 0x26, 0x60, 0x40, 0xC9, 0xCB, 0x01, 0xEC, 0x11, 0x28, 0x40, 0xFA, 0x04, 0x34, 0xE0, 0x70, 0x4C, 0x8C, 0x1D, 0x07, 0x69, 0x03, 0x16, 0xC8, 0x04, 0x23, 0xE8, 0xC6, 0x9A, 0x0B, 0x1A, 0x03, 0xE0, + //2E0 + 0x76, 0x06, 0x05, 0xCF, 0x1E, 0xBC, 0x58, 0x31, 0x71, 0x66, 0x00, 0xF8, 0x3F, 0x04, 0xFC, 0x0C, 0x74, 0x27, 0x8A, 0x80, 0x71, 0xC2, 0x3A, 0x26, 0x06, 0xC0, 0x1F, 0x05, 0x0F, 0x98, 0x40, 0xAE, + //300 /H (palatal) + 0x01, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x0E, 0xFE, 0x00, 0x03, 0xDF, 0x80, 0x03, 0xEF, 0x80, 0x1B, 0xF1, 0xC2, 0x00, 0xE7, 0xE0, 0x18, 0xFC, 0xE0, 0x21, 0xFC, 0x80, 0x3C, 0xFC, 0x40, 0x0E, 0x7E, + //320 + 0x00, 0x3F, 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x3E, 0xF0, 0x07, 0xFC, 0x00, 0x7E, 0x10, 0x3F, 0xFF, 0x00, 0x3F, 0x38, 0x0E, 0x7C, 0x01, 0x87, 0x0C, 0xFC, 0xC7, 0x00, 0x3E, 0x04, + //340 + 0x0F, 0x3E, 0x1F, 0x0F, 0x0F, 0x1F, 0x0F, 0x02, 0x83, 0x87, 0xCF, 0x03, 0x87, 0x0F, 0x3F, 0xC0, 0x07, 0x9E, 0x60, 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x77, 0xE1, 0xC0, 0xFE, 0xE0, 0xC3, + //360 + 0xE0, 0x01, 0xDF, 0xF8, 0x03, 0x07, 0x00, 0x7E, 0x70, 0x00, 0x7C, 0x38, 0x18, 0xFE, 0x0C, 0x1E, 0x78, 0x1C, 0x7C, 0x3E, 0x0E, 0x1F, 0x1E, 0x1E, 0x3E, 0x00, 0x7F, 0x83, 0x07, 0xDB, 0x87, 0x83, + //380 + 0x07, 0xC7, 0x07, 0x10, 0x71, 0xFF, 0x00, 0x3F, 0xE2, 0x01, 0xE0, 0xC1, 0xC3, 0xE1, 0x00, 0x7F, 0xC0, 0x05, 0xF0, 0x20, 0xF8, 0xF0, 0x70, 0xFE, 0x78, 0x79, 0xF8, 0x02, 0x3F, 0x0C, 0x8F, 0x03, + //3a0 + 0x0F, 0x9F, 0xE0, 0xC1, 0xC7, 0x87, 0x03, 0xC3, 0xC3, 0xB0, 0xE1, 0xE1, 0xC1, 0xE3, 0xE0, 0x71, 0xF0, 0x00, 0xFC, 0x70, 0x7C, 0x0C, 0x3E, 0x38, 0x0E, 0x1C, 0x70, 0xC3, 0xC7, 0x03, 0x81, 0xC1, + //3c0 + 0xC7, 0xE7, 0x00, 0x0F, 0xC7, 0x87, 0x19, 0x09, 0xEF, 0xC4, 0x33, 0xE0, 0xC1, 0xFC, 0xF8, 0x70, 0xF0, 0x78, 0xF8, 0xF0, 0x61, 0xC7, 0x00, 0x1F, 0xF8, 0x01, 0x7C, 0xF8, 0xF0, 0x78, 0x70, 0x3C, + //3e0 + 0x7C, 0xCE, 0x0E, 0x21, 0x83, 0xCF, 0x08, 0x07, 0x8F, 0x08, 0xC1, 0x87, 0x8F, 0x80, 0xC7, 0xE3, 0x00, 0x07, 0xF8, 0xE0, 0xEF, 0x00, 0x39, 0xF7, 0x80, 0x0E, 0xF8, 0xE1, 0xE3, 0xF8, 0x21, 0x9F, + //400 /X (glottal) + 0xC0, 0xFF, 0x03, 0xF8, 0x07, 0xC0, 0x1F, 0xF8, 0xC4, 0x04, 0xFC, 0xC4, 0xC1, 0xBC, 0x87, 0xF0, 0x0F, 0xC0, 0x7F, 0x05, 0xE0, 0x25, 0xEC, 0xC0, 0x3E, 0x84, 0x47, 0xF0, 0x8E, 0x03, 0xF8, 0x03, + //420 + 0xFB, 0xC0, 0x19, 0xF8, 0x07, 0x9C, 0x0C, 0x17, 0xF8, 0x07, 0xE0, 0x1F, 0xA1, 0xFC, 0x0F, 0xFC, 0x01, 0xF0, 0x3F, 0x00, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0xFD, 0x00, 0xFF, 0x88, 0x0D, 0xF9, 0x01, + //440 + 0xFF, 0x00, 0x70, 0x07, 0xC0, 0x3E, 0x42, 0xF3, 0x0D, 0xC4, 0x7F, 0x80, 0xFC, 0x07, 0xF0, 0x5E, 0xC0, 0x3F, 0x00, 0x78, 0x3F, 0x81, 0xFF, 0x01, 0xF8, 0x01, 0xC3, 0xE8, 0x0C, 0xE4, 0x64, 0x8F, + //460 + 0xE4, 0x0F, 0xF0, 0x07, 0xF0, 0xC2, 0x1F, 0x00, 0x7F, 0xC0, 0x6F, 0x80, 0x7E, 0x03, 0xF8, 0x07, 0xF0, 0x3F, 0xC0, 0x78, 0x0F, 0x82, 0x07, 0xFE, 0x22, 0x77, 0x70, 0x02, 0x76, 0x03, 0xFE, 0x00, + //480 + 0xFE, 0x67, 0x00, 0x7C, 0xC7, 0xF1, 0x8E, 0xC6, 0x3B, 0xE0, 0x3F, 0x84, 0xF3, 0x19, 0xD8, 0x03, 0x99, 0xFC, 0x09, 0xB8, 0x0F, 0xF8, 0x00, 0x9D, 0x24, 0x61, 0xF9, 0x0D, 0x00, 0xFD, 0x03, 0xF0, + //4a0 + 0x1F, 0x90, 0x3F, 0x01, 0xF8, 0x1F, 0xD0, 0x0F, 0xF8, 0x37, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFA, 0x03, 0xF0, 0x0F, 0x80, 0xFF, 0x01, + //4c0 + 0xB8, 0x07, 0xF0, 0x01, 0xFC, 0x01, 0xBC, 0x80, 0x13, 0x1E, 0x00, 0x7F, 0xE1, 0x40, 0x7F, 0xA0, 0x7F, 0xB0, 0x00, 0x3F, 0xC0, 0x1F, 0xC0, 0x38, 0x0F, 0xF0, 0x1F, 0x80, 0xFF, 0x01, 0xFC, 0x03, + //4e0 0xF1, 0x7E, 0x01, 0xFE, 0x01, 0xF0, 0xFF, 0x00, 0x7F, 0xC0, 0x1D, 0x07, 0xF0, 0x0F, 0xC0, 0x7E, 0x06, 0xE0, 0x07, 0xE0, 0x0F, 0xF8, 0x06, 0xC1, 0xFE, 0x01, 0xFC, 0x03, 0xE0, 0x0F, 0x00, 0xFC]; /** @@ -1745,34 +2060,33 @@ * * @return {Array} */ - let SetMouthThroat = (mouth, throat) => { let trans = (factor, initialFrequency) => { return (factor * initialFrequency >> 8 & 0xFF) << 1; }; - let freqdata = [[], [], []]; frequencyData.map((v, i) => { freqdata[0][i] = v & 0xFF; freqdata[1][i] = v >> 8 & 0xFF; freqdata[2][i] = v >> 16 & 0xFF; - }); // recalculate formant frequencies 5..29 for the mouth (F1) and throat (F2) + }); + // recalculate formant frequencies 5..29 for the mouth (F1) and throat (F2) for (let pos = 5; pos < 30; pos++) { // recalculate mouth frequency - freqdata[0][pos] = trans(mouth, freqdata[0][pos]); // recalculate throat frequency + freqdata[0][pos] = trans(mouth, freqdata[0][pos]); + // recalculate throat frequency freqdata[1][pos] = trans(throat, freqdata[1][pos]); - } // recalculate formant frequencies 48..53 - + } + // recalculate formant frequencies 48..53 for (let pos = 48; pos < 54; pos++) { // recalculate F1 (mouth formant) - freqdata[0][pos] = trans(mouth, freqdata[0][pos]); // recalculate F2 (throat formant) - + freqdata[0][pos] = trans(mouth, freqdata[0][pos]); + // recalculate F2 (throat formant) freqdata[1][pos] = trans(throat, freqdata[1][pos]); } - return freqdata; }; @@ -1818,7 +2132,6 @@ * * @return {Number} */ - let CreateTransitions = (pitches, frequency, amplitude, tuples) => { // 0=pitches // 1=frequency1 @@ -1828,64 +2141,58 @@ // 5=amplitude2 // 6=amplitude3 let tables = [pitches, frequency[0], frequency[1], frequency[2], amplitude[0], amplitude[1], amplitude[2]]; - let Read = (table, pos) => { { if (table < 0 || table > tables.length - 1) { - throw new Error("Error invalid table in Read: ".concat(table)); + throw new Error(`Error invalid table in Read: ${table}`); } } - return tables[table][pos]; - }; // linearly interpolate values - + }; + // linearly interpolate values let interpolate = (width, table, frame, change) => { let sign = change < 0; let remainder = Math.abs(change) % width; let div = change / width | 0; let error = 0; let pos = width; - while (--pos > 0) { let val = Read(table, frame) + div; error += remainder; - if (error >= width) { // accumulated a whole integer error, so adjust output error -= width; - if (sign) { val--; } else if (val) { // if input is 0, we always leave it alone val++; } - } // Write updated value back to next frame. - + } + // Write updated value back to next frame. { if (table < 0 || table > tables.length - 1) { - throw new Error("Error invalid table in Read: ".concat(table)); + throw new Error(`Error invalid table in Read: ${table}`); } } - tables[table][++frame] = val; val += div; } }; - let outBlendFrames; let inBlendFrames; let boundary = 0; - for (let pos = 0; pos < tuples.length - 1; pos++) { let phoneme = tuples[pos][0]; - let next_phoneme = tuples[pos + 1][0]; // get the ranking of each phoneme + let next_phoneme = tuples[pos + 1][0]; + // get the ranking of each phoneme let next_rank = blendRank[next_phoneme]; - let rank = blendRank[phoneme]; // compare the rank - lower rank value is stronger + let rank = blendRank[phoneme]; + // compare the rank - lower rank value is stronger if (rank === next_rank) { // same rank, so use out blend lengths from each phoneme outBlendFrames = outBlendLength[phoneme]; @@ -1900,7 +2207,6 @@ outBlendFrames = outBlendLength[phoneme]; inBlendFrames = inBlendLength[phoneme]; } - boundary += tuples[pos][1]; let trans_end = boundary + inBlendFrames; let trans_start = boundary - outBlendFrames; @@ -1910,13 +2216,13 @@ // unlike the other values, the pitches[] interpolates from // the middle of the current phoneme to the middle of the // next phoneme + // half the width of the current and next phoneme let cur_width = tuples[pos][1] >> 1; let next_width = tuples[pos + 1][1] >> 1; - let pitch = pitches[boundary + next_width] - pitches[boundary - cur_width]; // interpolate the values - + let pitch = pitches[boundary + next_width] - pitches[boundary - cur_width]; + // interpolate the values interpolate(cur_width + next_width, 0, trans_start, pitch); - for (let table = 1; table < 7; table++) { // tables: // 0 pitches @@ -1930,14 +2236,15 @@ interpolate(trans_length, table, trans_start, value); } } - } // add the length of last phoneme - + } + // add the length of last phoneme return boundary + tuples[tuples.length - 1][1]; }; let RISING_INFLECTION = 255; let FALLING_INFLECTION = 1; + /** CREATE FRAMES * * The length parameter in the list corresponds to the number of frames @@ -1961,7 +2268,6 @@ * * @return Array */ - let CreateFrames = (pitch, tuples, frequencyData) => { /** * Create a rising or falling inflection 30 frames prior to index X. @@ -1970,78 +2276,62 @@ let AddInflection = (inflection, pos, pitches) => { // store the location of the punctuation let end = pos; - if (pos < 30) { pos = 0; } else { pos -= 30; } - - let A; // FIXME: Explain this fix better, it's not obvious + let A; + // FIXME: Explain this fix better, it's not obvious // ML : A =, fixes a problem with invalid pitch with '.' - while ((A = pitches[pos]) === 127) { ++pos; } - while (pos !== end) { // add the inflection direction - A += inflection; // set the inflection + A += inflection; + // set the inflection pitches[pos] = A & 0xFF; - - while (++pos !== end && pitches[pos] === 255) { - /* keep looping */ - } + while (++pos !== end && pitches[pos] === 255) {/* keep looping */} } }; - let pitches = []; let frequency = [[], [], []]; let amplitude = [[], [], []]; let sampledConsonantFlag = []; let X = 0; - for (let i = 0; i < tuples.length; i++) { // get the phoneme at the index let phoneme = tuples[i][0]; - if (phoneme === PHONEME_PERIOD) { AddInflection(FALLING_INFLECTION, X, pitches); } else if (phoneme === PHONEME_QUESTION) { AddInflection(RISING_INFLECTION, X, pitches); - } // get the stress amount (more stress = higher pitch) - + } - let phase1 = stressPitch_tab47492[tuples[i][2]]; // get number of frames to write + // get the stress amount (more stress = higher pitch) + let phase1 = stressPitch_tab47492[tuples[i][2]]; + // get number of frames to write // copy from the source to the frames list - for (let frames = tuples[i][1]; frames > 0; frames--) { frequency[0][X] = frequencyData[0][phoneme]; // F1 frequency - frequency[1][X] = frequencyData[1][phoneme]; // F2 frequency - frequency[2][X] = frequencyData[2][phoneme]; // F3 frequency - amplitude[0][X] = ampldata[phoneme] & 0xFF; // F1 amplitude - amplitude[1][X] = ampldata[phoneme] >> 8 & 0xFF; // F2 amplitude - amplitude[2][X] = ampldata[phoneme] >> 16 & 0xFF; // F3 amplitude - sampledConsonantFlag[X] = sampledConsonantFlags[phoneme]; // phoneme data for sampled consonants - pitches[X] = pitch + phase1 & 0xFF; // pitch - X++; } } - return [pitches, frequency, amplitude, sampledConsonantFlag]; }; let PrepareFrames = (phonemes, pitch, mouth, throat, singmode) => { let freqdata = SetMouthThroat(mouth, throat); + /** * RENDER THE PHONEMES IN THE LIST * @@ -2059,7 +2349,6 @@ const [pitches, frequency, amplitude, sampledConsonantFlag] = CreateFrames(pitch, phonemes, freqdata); let t = CreateTransitions(pitches, frequency, amplitude, phonemes); - if (!singmode) { /* ASSIGN PITCH CONTOUR * @@ -2073,72 +2362,68 @@ pitches[i] -= frequency[0][i] >> 1; } } + /* * RESCALE AMPLITUDE * * Rescale volume from decibels to the linear scale. */ - - let amplitudeRescale = [0x00, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06, 0x08, 0x09, 0x0B, 0x0D, 0x0F]; - for (let i = amplitude[0].length - 1; i >= 0; i--) { amplitude[0][i] = amplitudeRescale[amplitude[0][i]]; amplitude[1][i] = amplitudeRescale[amplitude[1][i]]; amplitude[2][i] = amplitudeRescale[amplitude[2][i]]; } - let result = [t, frequency, pitches, amplitude, sampledConsonantFlag]; - return result; }; let CreateOutputBuffer = buffersize => { let buffer = new Uint8Array(buffersize); let bufferpos = 0; - let oldTimeTableIndex = 0; // Scale by 16 and write five times. - + let oldTimeTableIndex = 0; + // Scale by 16 and write five times. let writer = (index, A) => { let scaled = (A & 15) * 16; writer.ary(index, [scaled, scaled, scaled, scaled, scaled]); - }; // Write the five given values. - - + }; + // Write the five given values. writer.ary = (index, array) => { // timetable for more accurate c64 simulation - let timetable = [[162, 167, 167, 127, 128], // formants synth - [226, 60, 60, 0, 0], // unvoiced sample 0 - [225, 60, 59, 0, 0], // unvoiced sample 1 - [200, 0, 0, 54, 55], // voiced sample 0 + let timetable = [[162, 167, 167, 127, 128], + // formants synth + [226, 60, 60, 0, 0], + // unvoiced sample 0 + [225, 60, 59, 0, 0], + // unvoiced sample 1 + [200, 0, 0, 54, 55], + // voiced sample 0 [199, 0, 0, 54, 54] // voiced sample 1 ]; bufferpos += timetable[oldTimeTableIndex][index]; - if ((bufferpos / 50 | 0) > buffer.length) { { - throw new Error("Buffer overflow, want ".concat(bufferpos / 50 | 0, " but buffersize is only ").concat(buffer.length, "!")); + throw new Error(`Buffer overflow, want ${bufferpos / 50 | 0} but buffersize is only ${buffer.length}!`); } } - - oldTimeTableIndex = index; // write a little bit in advance - + oldTimeTableIndex = index; + // write a little bit in advance for (let k = 0; k < 5; k++) { buffer[(bufferpos / 50 | 0) + k] = array[k]; } }; - writer.get = () => { - return buffer.slice(0, bufferpos / 50 | 0); }; - return writer; }; let RenderSample = (Output, lastSampleOffset, consonantFlag, pitch) => { // mask low three bits and subtract 1 get value to // convert 0 bits on unvoiced samples. - let kind = (consonantFlag & 7) - 1; // determine which value to use from table { 0x18, 0x1A, 0x17, 0x17, 0x17 } + let kind = (consonantFlag & 7) - 1; + + // determine which value to use from table { 0x18, 0x1A, 0x17, 0x17, 0x17 } // T', S, Z 0 0x18 coronal // CH', J', SH, ZH 1 0x1A palato-alveolar // P', F, V, TH, DH 2 0x17 [labio]dental @@ -2146,53 +2431,43 @@ // /X 4 0x17 glottal let samplePage = kind * 256 & 0xFFFF; // unsigned short - let off = consonantFlag & 248; // unsigned char let renderSample = (index1, value1, index0, value0) => { let bit = 8; let sample = sampleTable[samplePage + off]; - do { if ((sample & 128) !== 0) { Output(index1, value1); } else { Output(index0, value0); } - sample <<= 1; } while (--bit); }; - if (off === 0) { // voiced phoneme: Z*, ZH, V*, DH let phase1 = pitch >> 4 ^ 255 & 0xFF; // unsigned char - off = lastSampleOffset & 0xFF; // unsigned char - do { renderSample(3, 26, 4, 6); off++; off &= 0xFF; } while (++phase1 & 0xFF); - return off; - } // unvoiced - - + } + // unvoiced off = off ^ 255 & 0xFF; // unsigned char - let value0 = sampledConsonantValues0[kind] & 0xFF; // unsigned char - do { renderSample(2, 5, 1, value0); } while (++off & 0xFF); - return lastSampleOffset; - }; // Removed sine table stored a pre calculated sine wave but in modern CPU, we can calculate inline. - + }; + // Removed sine table stored a pre calculated sine wave but in modern CPU, we can calculate inline. let sinus = x => Math.sin(2 * Math.PI * (x / 256)) * 127 | 0; + /** * PROCESS THE FRAMES * @@ -2203,8 +2478,6 @@ * To simulate them being driven by the glottal pulse, the waveforms are * reset at the beginning of each glottal pulse. */ - - let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, sampledConsonantFlag) => { let speedcounter = speed; let phase1 = 0; @@ -2214,13 +2487,13 @@ let pos = 0; let glottal_pulse = pitches[0]; let mem38 = glottal_pulse * .75 | 0; - while (frameCount) { - let flags = sampledConsonantFlag[pos]; // unvoiced sampled phoneme? + let flags = sampledConsonantFlag[pos]; + // unvoiced sampled phoneme? if ((flags & 248) !== 0) { - lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); // skip ahead two in the phoneme buffer - + lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); + // skip ahead two in the phoneme buffer pos += 2; frameCount -= 2; speedcounter = speed; @@ -2229,104 +2502,66 @@ // Rectangle wave consisting of: // 0-128 = 0x90 // 128-255 = 0x70 + // simulate the glottal pulse and formants let ary = []; - let - /* unsigned int */ - p1 = phase1 * 256; // Fixed point integers because we need to divide later on - - let - /* unsigned int */ - p2 = phase2 * 256; - let - /* unsigned int */ - p3 = phase3 * 256; - + let /* unsigned int */p1 = phase1 * 256; // Fixed point integers because we need to divide later on + let /* unsigned int */p2 = phase2 * 256; + let /* unsigned int */p3 = phase3 * 256; for (let k = 0; k < 5; k++) { - const - /* signed char */ - sp1 = sinus(0xff & p1 >> 8); - const - /* signed char */ - sp2 = sinus(0xff & p2 >> 8); - const - /* signed char */ - rp3 = (0xff & p3 >> 8) < 129 ? -0x70 : 0x70; - const - /* signed int */ - sin1 = sp1 * ( - /* (unsigned char) */ - amplitude[0][pos] & 0x0F); - const - /* signed int */ - sin2 = sp2 * ( - /* (unsigned char) */ - amplitude[1][pos] & 0x0F); - const - /* signed int */ - rect = rp3 * ( - /* (unsigned char) */ - amplitude[2][pos] & 0x0F); - let - /* signed int */ - mux = sin1 + sin2 + rect; + const /* signed char */sp1 = sinus(0xff & p1 >> 8); + const /* signed char */sp2 = sinus(0xff & p2 >> 8); + const /* signed char */rp3 = (0xff & p3 >> 8) < 129 ? -0x70 : 0x70; + const /* signed int */sin1 = sp1 * ( /* (unsigned char) */amplitude[0][pos] & 0x0F); + const /* signed int */sin2 = sp2 * ( /* (unsigned char) */amplitude[1][pos] & 0x0F); + const /* signed int */rect = rp3 * ( /* (unsigned char) */amplitude[2][pos] & 0x0F); + let /* signed int */mux = sin1 + sin2 + rect; mux /= 32; mux += 128; // Go from signed to unsigned amplitude - ary[k] = mux | 0; p1 += frequency[0][pos] * 256 / 4; // Compromise, this becomes a shift and works well - p2 += frequency[1][pos] * 256 / 4; p3 += frequency[2][pos] * 256 / 4; } - Output.ary(0, ary); } speedcounter--; - if (speedcounter === 0) { pos++; //go to next amplitude // decrement the frame count - frameCount--; - if (frameCount === 0) { return; } - speedcounter = speed; } - glottal_pulse--; - if (glottal_pulse !== 0) { // not finished with a glottal pulse - mem38--; // within the first 75% of the glottal pulse? - // is the count non-zero and the sampled flag is zero? + mem38--; + // within the first 75% of the glottal pulse? + // is the count non-zero and the sampled flag is zero? if (mem38 !== 0 || flags === 0) { // update the phase of the formants // TODO: we should have a switch to disable this, it causes a pretty nice voice without the masking! phase1 = phase1 + frequency[0][pos]; // & 0xFF; - phase2 = phase2 + frequency[1][pos]; // & 0xFF; - phase3 = phase3 + frequency[2][pos]; // & 0xFF; - continue; - } // voiced sampled phonemes interleave the sample with the + } + + // voiced sampled phonemes interleave the sample with the // glottal pulse. The sample flag is non-zero, so render // the sample for the phoneme. - - lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); } } - glottal_pulse = pitches[pos]; - mem38 = glottal_pulse * .75 | 0; // reset the formant wave generators to keep them in - // sync with the glottal pulse + mem38 = glottal_pulse * .75 | 0; + // reset the formant wave generators to keep them in + // sync with the glottal pulse phase1 = 0; phase2 = 0; phase3 = 0; @@ -2343,44 +2578,38 @@ * * @return Uint8Array */ - let Renderer = (phonemes, pitch, mouth, throat, speed, singmode) => { pitch = pitch === undefined ? 64 : pitch & 0xFF; mouth = mouth === undefined ? 128 : mouth & 0xFF; throat = throat === undefined ? 128 : throat & 0xFF; speed = (speed || 72) & 0xFF; singmode = singmode || false; - let sentences = PrepareFrames(phonemes, pitch, mouth, throat, singmode); // Reserve 176.4*speed samples (=8*speed ms) for each frame. + let sentences = PrepareFrames(phonemes, pitch, mouth, throat, singmode); + // Reserve 176.4*speed samples (=8*speed ms) for each frame. let Output = CreateOutputBuffer(176.4 // = (22050/125) * phonemes.reduce((pre, v) => pre + v[1], 0) // Combined phoneme length in frames. * speed | 0); const [t, frequency, pitches, amplitude, sampledConsonantFlag] = sentences; - { PrintOutput(pitches, frequency, amplitude, sampledConsonantFlag); } - ProcessFrames(Output, t, speed, frequency, pitches, amplitude, sampledConsonantFlag); return Output.get(); }; - let PrintOutput = (pitches, frequency, amplitude, sampledConsonantFlag) => { let pad = num => { let s = '00000' + num; return s.substr(s.length - 5); }; - console.log('==========================================='); console.log('Final data for speech output:'); console.log(' flags ampl1 freq1 ampl2 freq2 ampl3 freq3 pitch'); console.log('------------------------------------------------'); - for (let i = 0; i < sampledConsonantFlag.length; i++) { console.log(' %s %s %s %s %s %s %s %s', pad(sampledConsonantFlag[i]), pad(amplitude[0][i]), pad(frequency[0][i]), pad(amplitude[1][i]), pad(frequency[1][i]), pad(amplitude[2][i]), pad(frequency[2][i]), pad(pitches[i])); i++; } - console.log('==========================================='); }; @@ -2398,17 +2627,16 @@ * * @return {Promise} */ - let SamSpeak = (input, options) => { let buffer = SamBuffer(input, options); - if (false === buffer) { return Promise.reject(); - } // Now push buffer to wave player. - + } + // Now push buffer to wave player. return PlayBuffer(buffer); }; + /** * Process the input and return the audio buffer. * @@ -2423,16 +2651,14 @@ * * @return {Float32Array|Boolean} */ - let SamBuffer = (input, options) => { let buffer = SamProcess(input, options); - if (false === buffer) { return false; } - return Uint8ArrayToFloat32Array(buffer); }; + /** * Process the input and return the audiobuffer. * @@ -2447,15 +2673,12 @@ * * @return {Uint8Array|Boolean} */ - let SamProcess = function (input) { let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; let parsed = Parser(input); - if (false === parsed) { return false; } - return Renderer(parsed, options.pitch, options.mouth, options.throat, options.speed, options.singmode); }; @@ -2472,39 +2695,30 @@ let IS_TOO_LOW = 'IHZ TUW3 LAXOW.'; let IS_A_LITTLE_TOO_LOW = 'IHZ AH LIH3TUL TUW4 LAXOW,'; let IS_CORRECT = 'IHZ KAORREHKT, PLEY5 AXGEH4N? AOR DUW5 YUW PRIY4FER PAONX?'; - let numberToPhonemes = number => { if (number >= 10 && number < 20) { return lookup_teens[number - 10]; } - let n; let phonemes = ''; - if ((n = Math.floor(number / 10) - 2) >= 0) { phonemes += lookup_tens[n]; } - if (n = number % 10) { phonemes += ' ' + lookup_ones[n - 1]; } - return phonemes; }; + /** * @param {Element} e */ - - var guessnum = (e => { let output = e.ownerDocument.createElement('pre'); let button = e.ownerDocument.createElement('button'); let input = e.ownerDocument.createElement('input'); - let show = e => e.style.display = 'inline-block'; - let hide = e => e.style.display = 'none'; - let number; e.appendChild(output); e.appendChild(button); @@ -2519,84 +2733,67 @@ hide(button); show(input); }); - let say = (phonemes, raw) => { let text = phonemes; - while (text.length < 256) { text += ' '; } - if (raw) { output.innerText += "\n" + raw; } - SamSpeak(phonemes); }; - input.onkeydown = e => { if (e.keyCode === 13) { e.preventDefault(); - if (guess(parseInt(input.value))) { output.innerText = "\n" + output.innerText.split("\n").pop(); hide(input); show(button); } - input.value = ''; } }; + /** * Guess the number. * * @param {Number} guess The guess */ - - let guess = guess => { if (guess > 100) { say(THATS_MORE_THAN_100); return false; } - if (guess < 1) { say(THATS_LESS_THAN_ONE); return false; } - let phonetic = numberToPhonemes(guess); - if (guess > number + 25) { say(phonetic + ' ' + IS_MUCH_TOO_HIGH, guess + ' is much too high.'); return false; } - if (guess > number + 5) { say(phonetic + ' ' + IS_TOO_HIGH, guess + ' is too high.'); return false; } - if (guess > number) { say(phonetic + ' ' + IS_A_LITTLE_TOO_HIGH, guess + ' is a little too high.'); return false; } - if (guess < number - 25) { say(phonetic + ' ' + IS_MUCH_TOO_LOW, guess + ' is much too low.'); return false; } - if (guess < number - 5) { say(phonetic + ' ' + IS_TOO_LOW, guess + ' is too low.'); return false; } - if (guess < number) { say(phonetic + ' ' + IS_A_LITTLE_TOO_LOW, guess + ' is a little too low.'); return false; } - if (guess === number) { say(phonetic + ' ' + IS_CORRECT, guess + ' is correct, play again? or do you prefer PONG?.'); return true; diff --git a/dist/guessnum.min.js b/dist/guessnum.min.js index d70cb8f..3da2426 100644 --- a/dist/guessnum.min.js +++ b/dist/guessnum.min.js @@ -9,5 +9,5 @@ * * @author 2017 Christian Schiffler */ -function e(){"use strict";let P=(e,t)=>0!=(e&t),u=null,K="*12345678".split(""),V=" *.*?*,*-*IYIHEHAEAAAHAOUHAXIXERUXOHRXLXWXYXWHR*L*W*Y*M*N*NXDXQ*S*SHF*TH/H/XZ*ZHV*DHCH**J*******EYAYOYAWOWUWB*****D*****G*****GX****P*****T*****K*****KX****ULUMUN".match(/.{1,2}/g),G=[32768,49408,49408,49408,49408,164,164,164,164,164,164,132,132,164,164,132,132,132,132,132,132,132,68,4164,4164,4164,4164,2124,3148,2124,1096,16460,9280,8256,8256,9280,64,64,9284,8260,8260,9284,8264,8256,76,8260,0,0,180,180,180,148,148,148,78,78,78,1102,1102,1102,78,78,78,78,78,78,75,75,75,1099,1099,1099,75,75,75,75,75,75,128,193,193],B=[0,4626,4626,4626,2056,2824,2312,2824,3592,3851,2822,4108,3082,1541,1541,3595,3082,3594,3082,2825,2056,2055,2825,2567,2310,2056,2054,2055,2055,2055,770,1285,514,514,514,514,514,514,1542,1542,2055,1542,1542,514,2312,1027,513,286,3597,3852,3852,3852,3598,3593,2054,513,514,1797,513,257,1798,513,514,1798,513,514,2056,514,514,1540,514,514,1798,513,1028,1798,257,1028,1479,1535],j=(e,t)=>P(G[e],t),Q=128,H=[24,26,23,23,23],h=[0,224,230,236,243,249,0,6,12,6],c=[0,31,31,31,31,2,2,2,2,2,2,2,2,2,5,5,2,10,2,8,5,5,11,10,9,8,8,160,8,8,23,31,18,18,18,18,30,30,20,20,20,20,23,23,26,26,29,29,2,2,2,2,2,2,26,29,27,26,29,27,26,29,27,26,29,27,23,29,23,23,29,23,23,29,23,23,29,23,23,23],N=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,2,4,4,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,0,1,0,5,5,5,5,5,4,4,2,0,1,2,0,1,2,0,1,2,0,1,2,0,2,2,0,1,3,0,2,3,0,2,160,160],Y=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,4,4,3,3,3,3,3,1,2,3,2,1,3,3,3,3,1,1,3,3,3,2,2,3,2,3,0,0,5,5,5,5,4,4,2,0,2,2,0,3,2,0,4,2,0,3,2,0,2,2,0,2,3,0,3,3,0,3,176,160],A=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,226,211,187,124,149,1,2,3,3,0,114,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,25,0,0,0,0,0,0,0,0,0],s=[0,5980947,5980947,5980947,5980947,7230474,6113550,5980947,5783320,5842971,5712919,5775125,5383440,5844244,6113550,4075794,5383182,5774866,4076306,7218448,5250317,6112527,5904395,3944978,7216654,5904395,7230217,5320198,7943686,6641158,7943686,5980945,6506758,6967046,5315078,7946758,6113550,5383440,6107913,6767114,4990984,6106890,6639366,6639366,7946758,6639365,7958022,0,5916691,5777179,5775125,5778203,5774866,5382669,5315078,5315078,5315078,7946758,7946758,7946758,7368198,7237126,7237126,6181894,6181894,6181894,5315078,5315078,5315078,7946758,7946758,7946758,6647046,6641162,7367946,6181894,6181894,6181894,556844,98067],I=[0,0,0,0,0,526861,461581,527630,527887,68879,68623,3087,68367,2316,461581,330508,68623,3087,396301,67597,2061,461838,2061,330252,67597,2061,526861,780,2313,198153,0,0,0,0,0,0,0,0,779,66827,779,1035,0,0,1,66827,920064,66050,593422,68879,3087,68879,3087,2061,2,260,0,2,260,0,1,260,0,1,260,0,0,0,0,0,0,0,0,461324,0,0,330240,0,1245199,1048591],T=[56,132,107,25,198,99,24,134,115,152,198,177,28,202,49,140,199,49,136,194,48,152,70,49,24,198,53,12,202,49,12,198,33,16,36,105,18,194,49,20,196,113,8,74,34,73,171,106,168,172,73,81,50,213,82,136,147,108,148,34,21,84,210,37,150,212,80,165,70,33,8,133,107,24,196,99,16,206,107,24,140,113,25,140,99,53,12,198,51,153,204,108,181,78,162,153,70,33,40,130,149,46,227,48,156,197,48,156,162,177,156,103,49,136,102,89,44,83,24,132,103,80,202,227,10,172,171,48,172,98,48,140,99,16,148,98,177,140,130,40,150,51,152,214,181,76,98,41,165,74,181,156,198,49,20,214,56,156,75,180,134,101,24,174,103,28,166,99,25,150,35,25,132,19,8,166,82,172,202,34,137,110,171,25,140,98,52,196,98,25,134,99,24,196,35,88,214,163,80,66,84,74,173,74,37,17,107,100,137,74,99,57,138,35,49,42,234,162,169,68,197,18,205,66,52,140,98,24,140,99,17,72,102,49,157,68,51,29,70,49,156,198,177,12,205,50,136,196,115,24,134,115,8,214,99,88,7,129,224,240,60,7,135,144,60,124,15,199,192,192,240,124,30,7,128,128,0,28,120,112,241,199,31,192,12,254,28,31,31,14,10,122,192,113,242,131,143,3,15,15,12,0,121,248,97,224,67,15,131,231,24,249,193,19,218,233,99,143,15,131,131,135,195,31,60,112,240,225,225,227,135,184,113,14,32,227,141,72,120,28,147,135,48,225,193,193,228,120,33,131,131,195,135,6,57,229,195,135,7,14,28,28,112,244,113,156,96,54,50,195,30,60,243,143,14,60,112,227,199,143,15,15,14,60,120,240,227,135,6,240,227,7,193,153,135,15,24,120,112,112,252,243,16,177,140,140,49,124,112,225,134,60,100,108,176,225,227,15,35,143,15,30,62,56,60,56,123,143,7,14,60,244,23,30,60,120,242,158,114,73,227,37,54,56,88,57,226,222,60,120,120,225,199,97,225,225,176,240,240,195,199,14,56,192,240,206,115,115,24,52,176,225,199,142,28,60,248,56,240,225,193,139,134,143,28,120,112,240,120,172,177,143,57,49,219,56,97,195,14,14,56,120,115,23,30,57,30,56,100,225,241,193,78,15,64,162,2,197,143,129,161,252,18,8,100,224,60,34,224,69,7,142,12,50,144,240,31,32,73,224,248,12,96,240,23,26,65,170,164,208,141,18,130,30,30,3,248,62,3,12,115,128,112,68,38,3,36,225,62,4,78,4,28,193,9,204,158,144,33,7,144,67,100,192,15,198,144,156,193,91,3,226,29,129,224,94,29,3,132,184,44,15,128,177,131,224,48,65,30,67,137,131,80,252,36,46,19,131,241,124,76,44,201,13,131,176,181,130,228,232,6,156,7,160,153,29,7,62,130,143,112,48,116,64,202,16,228,232,15,146,20,63,6,248,132,136,67,129,10,52,57,65,198,227,28,71,3,176,184,19,10,194,100,248,24,249,96,179,192,101,32,96,166,140,195,129,32,48,38,30,28,56,211,1,176,38,64,244,11,195,66,31,133,50,38,96,64,201,203,1,236,17,40,64,250,4,52,224,112,76,140,29,7,105,3,22,200,4,35,232,198,154,11,26,3,224,118,6,5,207,30,188,88,49,113,102,0,248,63,4,252,12,116,39,138,128,113,194,58,38,6,192,31,5,15,152,64,174,1,127,192,7,255,0,14,254,0,3,223,128,3,239,128,27,241,194,0,231,224,24,252,224,33,252,128,60,252,64,14,126,0,63,62,0,15,254,0,31,255,0,62,240,7,252,0,126,16,63,255,0,63,56,14,124,1,135,12,252,199,0,62,4,15,62,31,15,15,31,15,2,131,135,207,3,135,15,63,192,7,158,96,63,192,3,254,0,63,224,119,225,192,254,224,195,224,1,223,248,3,7,0,126,112,0,124,56,24,254,12,30,120,28,124,62,14,31,30,30,62,0,127,131,7,219,135,131,7,199,7,16,113,255,0,63,226,1,224,193,195,225,0,127,192,5,240,32,248,240,112,254,120,121,248,2,63,12,143,3,15,159,224,193,199,135,3,195,195,176,225,225,193,227,224,113,240,0,252,112,124,12,62,56,14,28,112,195,199,3,129,193,199,231,0,15,199,135,25,9,239,196,51,224,193,252,248,112,240,120,248,240,97,199,0,31,248,1,124,248,240,120,112,60,124,206,14,33,131,207,8,7,143,8,193,135,143,128,199,227,0,7,248,224,239,0,57,247,128,14,248,225,227,248,33,159,192,255,3,248,7,192,31,248,196,4,252,196,193,188,135,240,15,192,127,5,224,37,236,192,62,132,71,240,142,3,248,3,251,192,25,248,7,156,12,23,248,7,224,31,161,252,15,252,1,240,63,0,254,3,240,31,0,253,0,255,136,13,249,1,255,0,112,7,192,62,66,243,13,196,127,128,252,7,240,94,192,63,0,120,63,129,255,1,248,1,195,232,12,228,100,143,228,15,240,7,240,194,31,0,127,192,111,128,126,3,248,7,240,63,192,120,15,130,7,254,34,119,112,2,118,3,254,0,254,103,0,124,199,241,142,198,59,224,63,132,243,25,216,3,153,252,9,184,15,248,0,157,36,97,249,13,0,253,3,240,31,144,63,1,248,31,208,15,248,55,1,248,7,240,15,192,63,0,254,3,248,15,192,63,0,250,3,240,15,128,255,1,184,7,240,1,252,1,188,128,19,30,0,127,225,64,127,160,127,176,0,63,192,31,192,56,15,240,31,128,255,1,252,3,241,126,1,254,1,240,255,0,127,192,29,7,240,15,192,126,6,224,7,224,15,248,6,193,254,1,252,3,224,15,0,252],E=(i,t,e,r)=>{var l=(7&e)-1;let a=256*l&65535,f=248&e;var n=(e,t,r,l)=>{let n=8,o=T[a+f];for(;0!=(128&o)?i(e,t):i(r,l),o<<=1,--n;);};if(0===f){let e=r>>4^255;for(f=255&t;n(3,26,4,6),f++,f&=255,255&++e;);return f}f^=255;for(var o=255&H[l];n(2,5,1,o),255&++f;);return t},p=e=>127*Math.sin(2*Math.PI*(e/256))|0,v=["WAHN","TUW5","THRIY5","FOHR5","FAY5V","SIH5KS","SEH5VUN","EY5T","NAY5N"],d=["TEH4N","IHLEH4VIXN","TWEH4LV","THER4TIY6N","FOH4RTIY6N","FIH4FTIY6N","SIH4KSTIY6N","SEH4VUNTIY6N","EY4TIY6N","NAY4NTIY6N"],g=["TWEHNTIY","THERTIY","FOHRTIY","FIH4FTIY6","SIHKSTIY6","SEH4VUNTIY6","EY4T1Y6","NAY4NTIY6"];return e=>{let l=e.ownerDocument.createElement("pre"),t=e.ownerDocument.createElement("button"),r=e.ownerDocument.createElement("input"),n=e=>e.style.display="inline-block",o=e=>e.style.display="none",i,a=(e.appendChild(l),e.appendChild(t),e.appendChild(r),o(r),t.type="button",t.innerText="Start game",t.addEventListener("click",()=>{l.textContent="",i=Math.floor(99*Math.random()+1),a("GEH3S DHAX NAH4MBER BIXTWIY5N WAH4N Q AEND WAHN /HAH4NDRIHD"),o(t),n(r)}),(t,r)=>{let e=t;for(;e.length<256;)e+=" ";if(r&&(l.innerText+="\n"+r),!1===(r=(()=>{var a,k=t,e=!(a={})!==(e=(()=>{if(!k)return!1;var l=e=>e===A.length?null:A[e],n=(t,e,r,l)=>{for(let e=A.length-1;e>=t;e--)A[e+1]=A[e],h[e+1]=i(e),s[e+1]=o(e);A[t]=e,h[t]=0|l,s[t]=r};let o=e=>0|s[e],i=e=>0|h[e];var t,r,a,f,e,u,H=(e,t)=>{h[e]=t};let s=[],h=[],A=[],I=0;var T=k,v=e=>{s[I]=0,h[I]=0,A[I++]=e};for(let t=0;t{var e=V.findIndex(e=>e===t+r&&"*"!==e[1]);return-1!==e&&e})(d,c)))t++,v(e);else if(!1!==(e=(t=>{var e=V.findIndex(e=>e===t+"*");return-1!==e&&e})(d)))v(e);else{for(e=K.length;d!==K[e]&&0{A[e]=t},E=l,p=o,g=(e,t)=>{switch(e){case 53:j(E(t-1),1024)&&Y(t,16);break;case 42:N(t+1,43,p(t));break;case 44:N(t+1,45,p(t))}},W=(e,t)=>{Y(e,13),N(e+1,t,p(e))};let e=-1,t;for(;null!==(t=E(++e));)if(0!==t)if(j(t,16))N(e+1,j(t,32)?21:20,p(e)),g(t,e);else if(78===t)W(e,24);else if(79===t)W(e,27);else if(80===t)W(e,28);else if(j(t,Q)&&p(e))0===E(e+1)&&null!==(t=E(e+2))&&j(t,Q)&&p(e+2)&&N(e+2,31,0);else{var m,U=0===e?null:E(e-1);if(23===t)switch(U){case 69:Y(e-1,42);break;case 57:Y(e-1,44);break;default:j(U,Q)&&Y(e,18)}else 24===t&&j(U,Q)?Y(e,19):60===U&&32===t?Y(e,38):60===t?(m=E(e+1),j(m,32)||null===m||Y(e,63)):(72===t&&(m=E(e+1),j(m,32)&&null!==m||(Y(e,75),t=75)),j(t,1)&&32===U?Y(e,t-12):j(t,1)||g(t,e),69!==t&&57!==t||0>8),e++}}{var w=l,y=H,R=i;for(let e=0;null!==w(e);e++)if(j(w(e),256)){for(var S,Z=e;1<--e&&!j(w(e),Q););if(0===e)break;for(;e>1)+S+1))}let t=-1,r;for(;null!==(r=w(++t));){let e=t;if(j(r,Q))r=w(++e),j(r,64)?(a=null===r?65:G[r],P(a,4)?(f=R(t),y(t,(f>>2)+f+1)):P(a,1)&&(f=R(t),y(t,f-(f>>3)))):18!==r&&19!==r||!j(w(++e),64)||y(t,R(t)-1);else if(j(r,2048))null!==(r=w(++e))&&j(r,2)&&(y(e,6),y(e-1,5));else if(j(r,2)){for(;0===(r=w(++e)););null!==r&&j(r,2)&&(y(e,1+(R(e)>>1)),y(t,1+(R(t)>>1)))}else 0e?[e,0|h[t],0|s[t]]:null).filter(e=>e)})())&&((e,t,r,l,n)=>{n=255&(a.speed||72),t=((e,t,r,l,n)=>{const[o,i,a,f]=((r,l,n)=>{var e=(e,t,r)=>{var l=t;t<30?t=0:t-=30;let n;for(;127===(n=r[t]);)++t;for(;t!==l;)for(n+=e,r[t]=255&n;++t!==l&&255===r[t];);};let o=[],i=[[],[],[]],a=[[],[],[]],f=[],u=0;for(let t=0;t>8&255,a[2][u]=I[H]>>16&255,f[u]=A[H],o[u]=r+s&255,u++}return[o,i,a,f]})(t,e,((t,r)=>{var l=(e,t)=>(e*t>>8&255)<<1;let n=[[],[],[]];s.map((e,t)=>{n[0][t]=255&e,n[1][t]=e>>8&255,n[2][t]=e>>16&255});for(let e=5;e<30;e++)n[0][e]=l(t,n[0][e]),n[1][e]=l(r,n[1][e]);for(let e=48;e<54;e++)n[0][e]=l(t,n[0][e]),n[1][e]=l(r,n[1][e]);return n})(r,l));if(t=((t,e,r,l)=>{let u=[t,e[0],e[1],e[2],r[0],r[1],r[2]],H=(e,t)=>u[e][t];var n=(t,r,l,e)=>{var n=e<0,o=Math.abs(e)%t,i=e/t|0;let a=0,f=t;for(;0<--f;){let e=H(r,l)+i;(a+=o)>=t&&(a-=t,n?e--:e&&e++),u[r][++l]=e,e+=i}};let o,i,a=0;for(let e=0;e>1)+(h=l[e+1][1]>>1),0,T,t[a+h]-t[a-A]);for(let e=1;e<7;e++){var d=H(e,I)-H(e,T);n(v,e,T,d)}}}return a+l[l.length-1][1]})(o,i,a,e),!n)for(let e=0;e>1;var u=[0,1,2,2,2,3,3,4,4,5,6,8,9,11,13,15];for(let e=a[0].length-1;0<=e;e--)a[0][e]=u[a[0][e]],a[1][e]=u[a[1][e]],a[2][e]=u[a[2][e]];return[t,i,o,a,f]})(e,t=void 0===t?64:255&t,r=void 0===r?128:255&r,l=void 0===l?128:255&l,a.singmode||!1);let o=(e=>{let r=new Uint8Array(e),l=0,n=0,o=(e,t)=>{t=16*(15&t),o.ary(e,[t,t,t,t,t])};return o.ary=(e,t)=>{if(((l+=[[162,167,167,127,128],[226,60,60,0,0],[225,60,59,0,0],[200,0,0,54,55],[199,0,0,54,54]][n][e])/50|0)>r.length)throw new Error;n=e;for(let e=0;e<5;e++)r[(l/50|0)+e]=t[e]},o.get=()=>r.slice(0,l/50|0),o})(176.4*e.reduce((e,t)=>e+t[1],0)*n|0);var[r,l,e,t,i]=t;return((e,t,r,o,l,i,n)=>{let a=r,f=0,u=0,H=0,s=0,h=0,A=l[0],I=.75*A|0;for(;t;){var T=n[h];if(0!=(248&T))s=E(e,s,T,l[255&h]),h+=2,t-=2,a=r;else{{let t=[],r=256*f,l=256*u,n=256*H;for(let e=0;e<5;e++){var v=p(255&r>>8),d=p(255&l>>8),c=(255&n>>8)<129?-112:112,v=(v*(15&i[0][h])+d*(15&i[1][h])+c*(15&i[2][h]))/32+128;t[e]=0|v,r+=256*o[0][h]/4,l+=256*o[1][h]/4,n+=256*o[2][h]/4}e.ary(0,t)}if(0==--a){if(h++,0==--t)return;a=r}if(0!=--A){if(0!=--I||0===T){f+=o[0][h],u+=o[1][h],H+=o[2][h];continue}s=E(e,s,T,l[255&h])}}A=l[h],I=.75*A|0,f=0,u=0,H=0}})(o,r,n,l,e,t,i),o.get()})(e,a.pitch,a.mouth,a.throat);if(!1===e)return!1;{var r=e;let t=new Float32Array(r.length);for(let e=0;e{let r=i.createBufferSource(),l=i.createBuffer(1,a.length,22050),n=l.getChannelData(0);for(let e=0;e{e(!0)},o=e=>{r.disconnect(),t(e)},r.start(0)});e.abort=o,e}}}),f=(r.onkeydown=e=>{13===e.keyCode&&(e.preventDefault(),f(parseInt(r.value))&&(l.innerText="\n"+l.innerText.split("\n").pop(),o(r),n(t)),r.value="")},e=>{if(100{if(10<=e&&e<20)return d[e-10];let t,r="";return 0<=(t=Math.floor(e/10)-2)&&(r+=g[t]),(t=e%10)&&(r+=" "+v[t-1]),r})(e);return e>i+25?(a(t+" IHZ MAH3CH TUW5 /HAY6.",e+" is much too high."),!1):e>i+5?(a(t+" IHZ TUW3 /HAY6.",e+" is too high."),!1):e>i?(a(t+" IHZ AH LIH3TUL TUW4 /HAY6,",e+" is a little too high."),!1):e0!=(e&t),H=null,y="*12345678".split(""),R=" *.*?*,*-*IYIHEHAEAAAHAOUHAXIXERUXOHRXLXWXYXWHR*L*W*Y*M*N*NXDXQ*S*SHF*TH/H/XZ*ZHV*DHCH**J*******EYAYOYAWOWUWB*****D*****G*****GX****P*****T*****K*****KX****ULUMUN".match(/.{1,2}/g),S=[32768,49408,49408,49408,49408,164,164,164,164,164,164,132,132,164,164,132,132,132,132,132,132,132,68,4164,4164,4164,4164,2124,3148,2124,1096,16460,9280,8256,8256,9280,64,64,9284,8260,8260,9284,8264,8256,76,8260,0,0,180,180,180,148,148,148,78,78,78,1102,1102,1102,78,78,78,78,78,78,75,75,75,1099,1099,1099,75,75,75,75,75,75,128,193,193],L=[0,4626,4626,4626,2056,2824,2312,2824,3592,3851,2822,4108,3082,1541,1541,3595,3082,3594,3082,2825,2056,2055,2825,2567,2310,2056,2054,2055,2055,2055,770,1285,514,514,514,514,514,514,1542,1542,2055,1542,1542,514,2312,1027,513,286,3597,3852,3852,3852,3598,3593,2054,513,514,1797,513,257,1798,513,514,1798,513,514,2056,514,514,1540,514,514,1798,513,1028,1798,257,1028,1479,1535],O=(e,t)=>w(S[e],t),b=128,u=[24,26,23,23,23],h=[0,224,230,236,243,249,0,6,12,6],Y=[0,31,31,31,31,2,2,2,2,2,2,2,2,2,5,5,2,10,2,8,5,5,11,10,9,8,8,160,8,8,23,31,18,18,18,18,30,30,20,20,20,20,23,23,26,26,29,29,2,2,2,2,2,2,26,29,27,26,29,27,26,29,27,26,29,27,23,29,23,23,29,23,23,29,23,23,29,23,23,23],E=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,2,4,4,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,0,1,0,5,5,5,5,5,4,4,2,0,1,2,0,1,2,0,1,2,0,1,2,0,2,2,0,1,3,0,2,3,0,2,160,160],v=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,4,4,3,3,3,3,3,1,2,3,2,1,3,3,3,3,1,1,3,3,3,2,2,3,2,3,0,0,5,5,5,5,4,4,2,0,2,2,0,3,2,0,4,2,0,3,2,0,2,2,0,2,3,0,3,3,0,3,176,160],A=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,226,211,187,124,149,1,2,3,3,0,114,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,25,0,0,0,0,0,0,0,0,0],s=[0,5980947,5980947,5980947,5980947,7230474,6113550,5980947,5783320,5842971,5712919,5775125,5383440,5844244,6113550,4075794,5383182,5774866,4076306,7218448,5250317,6112527,5904395,3944978,7216654,5904395,7230217,5320198,7943686,6641158,7943686,5980945,6506758,6967046,5315078,7946758,6113550,5383440,6107913,6767114,4990984,6106890,6639366,6639366,7946758,6639365,7958022,0,5916691,5777179,5775125,5778203,5774866,5382669,5315078,5315078,5315078,7946758,7946758,7946758,7368198,7237126,7237126,6181894,6181894,6181894,5315078,5315078,5315078,7946758,7946758,7946758,6647046,6641162,7367946,6181894,6181894,6181894,556844,98067],I=[0,0,0,0,0,526861,461581,527630,527887,68879,68623,3087,68367,2316,461581,330508,68623,3087,396301,67597,2061,461838,2061,330252,67597,2061,526861,780,2313,198153,0,0,0,0,0,0,0,0,779,66827,779,1035,0,0,1,66827,920064,66050,593422,68879,3087,68879,3087,2061,2,260,0,2,260,0,1,260,0,1,260,0,0,0,0,0,0,0,0,461324,0,0,330240,0,1245199,1048591],d=[56,132,107,25,198,99,24,134,115,152,198,177,28,202,49,140,199,49,136,194,48,152,70,49,24,198,53,12,202,49,12,198,33,16,36,105,18,194,49,20,196,113,8,74,34,73,171,106,168,172,73,81,50,213,82,136,147,108,148,34,21,84,210,37,150,212,80,165,70,33,8,133,107,24,196,99,16,206,107,24,140,113,25,140,99,53,12,198,51,153,204,108,181,78,162,153,70,33,40,130,149,46,227,48,156,197,48,156,162,177,156,103,49,136,102,89,44,83,24,132,103,80,202,227,10,172,171,48,172,98,48,140,99,16,148,98,177,140,130,40,150,51,152,214,181,76,98,41,165,74,181,156,198,49,20,214,56,156,75,180,134,101,24,174,103,28,166,99,25,150,35,25,132,19,8,166,82,172,202,34,137,110,171,25,140,98,52,196,98,25,134,99,24,196,35,88,214,163,80,66,84,74,173,74,37,17,107,100,137,74,99,57,138,35,49,42,234,162,169,68,197,18,205,66,52,140,98,24,140,99,17,72,102,49,157,68,51,29,70,49,156,198,177,12,205,50,136,196,115,24,134,115,8,214,99,88,7,129,224,240,60,7,135,144,60,124,15,199,192,192,240,124,30,7,128,128,0,28,120,112,241,199,31,192,12,254,28,31,31,14,10,122,192,113,242,131,143,3,15,15,12,0,121,248,97,224,67,15,131,231,24,249,193,19,218,233,99,143,15,131,131,135,195,31,60,112,240,225,225,227,135,184,113,14,32,227,141,72,120,28,147,135,48,225,193,193,228,120,33,131,131,195,135,6,57,229,195,135,7,14,28,28,112,244,113,156,96,54,50,195,30,60,243,143,14,60,112,227,199,143,15,15,14,60,120,240,227,135,6,240,227,7,193,153,135,15,24,120,112,112,252,243,16,177,140,140,49,124,112,225,134,60,100,108,176,225,227,15,35,143,15,30,62,56,60,56,123,143,7,14,60,244,23,30,60,120,242,158,114,73,227,37,54,56,88,57,226,222,60,120,120,225,199,97,225,225,176,240,240,195,199,14,56,192,240,206,115,115,24,52,176,225,199,142,28,60,248,56,240,225,193,139,134,143,28,120,112,240,120,172,177,143,57,49,219,56,97,195,14,14,56,120,115,23,30,57,30,56,100,225,241,193,78,15,64,162,2,197,143,129,161,252,18,8,100,224,60,34,224,69,7,142,12,50,144,240,31,32,73,224,248,12,96,240,23,26,65,170,164,208,141,18,130,30,30,3,248,62,3,12,115,128,112,68,38,3,36,225,62,4,78,4,28,193,9,204,158,144,33,7,144,67,100,192,15,198,144,156,193,91,3,226,29,129,224,94,29,3,132,184,44,15,128,177,131,224,48,65,30,67,137,131,80,252,36,46,19,131,241,124,76,44,201,13,131,176,181,130,228,232,6,156,7,160,153,29,7,62,130,143,112,48,116,64,202,16,228,232,15,146,20,63,6,248,132,136,67,129,10,52,57,65,198,227,28,71,3,176,184,19,10,194,100,248,24,249,96,179,192,101,32,96,166,140,195,129,32,48,38,30,28,56,211,1,176,38,64,244,11,195,66,31,133,50,38,96,64,201,203,1,236,17,40,64,250,4,52,224,112,76,140,29,7,105,3,22,200,4,35,232,198,154,11,26,3,224,118,6,5,207,30,188,88,49,113,102,0,248,63,4,252,12,116,39,138,128,113,194,58,38,6,192,31,5,15,152,64,174,1,127,192,7,255,0,14,254,0,3,223,128,3,239,128,27,241,194,0,231,224,24,252,224,33,252,128,60,252,64,14,126,0,63,62,0,15,254,0,31,255,0,62,240,7,252,0,126,16,63,255,0,63,56,14,124,1,135,12,252,199,0,62,4,15,62,31,15,15,31,15,2,131,135,207,3,135,15,63,192,7,158,96,63,192,3,254,0,63,224,119,225,192,254,224,195,224,1,223,248,3,7,0,126,112,0,124,56,24,254,12,30,120,28,124,62,14,31,30,30,62,0,127,131,7,219,135,131,7,199,7,16,113,255,0,63,226,1,224,193,195,225,0,127,192,5,240,32,248,240,112,254,120,121,248,2,63,12,143,3,15,159,224,193,199,135,3,195,195,176,225,225,193,227,224,113,240,0,252,112,124,12,62,56,14,28,112,195,199,3,129,193,199,231,0,15,199,135,25,9,239,196,51,224,193,252,248,112,240,120,248,240,97,199,0,31,248,1,124,248,240,120,112,60,124,206,14,33,131,207,8,7,143,8,193,135,143,128,199,227,0,7,248,224,239,0,57,247,128,14,248,225,227,248,33,159,192,255,3,248,7,192,31,248,196,4,252,196,193,188,135,240,15,192,127,5,224,37,236,192,62,132,71,240,142,3,248,3,251,192,25,248,7,156,12,23,248,7,224,31,161,252,15,252,1,240,63,0,254,3,240,31,0,253,0,255,136,13,249,1,255,0,112,7,192,62,66,243,13,196,127,128,252,7,240,94,192,63,0,120,63,129,255,1,248,1,195,232,12,228,100,143,228,15,240,7,240,194,31,0,127,192,111,128,126,3,248,7,240,63,192,120,15,130,7,254,34,119,112,2,118,3,254,0,254,103,0,124,199,241,142,198,59,224,63,132,243,25,216,3,153,252,9,184,15,248,0,157,36,97,249,13,0,253,3,240,31,144,63,1,248,31,208,15,248,55,1,248,7,240,15,192,63,0,254,3,248,15,192,63,0,250,3,240,15,128,255,1,184,7,240,1,252,1,188,128,19,30,0,127,225,64,127,160,127,176,0,63,192,31,192,56,15,240,31,128,255,1,252,3,241,126,1,254,1,240,255,0,127,192,29,7,240,15,192,126,6,224,7,224,15,248,6,193,254,1,252,3,224,15,0,252],p=(i,t,e,r)=>{let l=(7&e)-1,f=256*l&65535,a=248&e,n=(e,t,r,l)=>{let n=8,o=d[f+a];for(;0!=(128&o)?i(e,t):i(r,l),o<<=1,--n;);};if(0===a){let e=r>>4^255;for(a=255&t;n(3,26,4,6),a++,a&=255,255&++e;);return a}a^=255;for(var o=255&u[l];n(2,5,1,o),255&++a;);return t},g=e=>127*Math.sin(2*Math.PI*(e/256))|0,T=["WAHN","TUW5","THRIY5","FOHR5","FAY5V","SIH5KS","SEH5VUN","EY5T","NAY5N"],c=["TEH4N","IHLEH4VIXN","TWEH4LV","THER4TIY6N","FOH4RTIY6N","FIH4FTIY6N","SIH4KSTIY6N","SEH4VUNTIY6N","EY4TIY6N","NAY4NTIY6N"],N=["TWEHNTIY","THERTIY","FOHRTIY","FIH4FTIY6","SIHKSTIY6","SEH4VUNTIY6","EY4T1Y6","NAY4NTIY6"];return e=>{let l=e.ownerDocument.createElement("pre"),t=e.ownerDocument.createElement("button"),r=e.ownerDocument.createElement("input"),n=e=>e.style.display="inline-block",o=e=>e.style.display="none",i,f=(e.appendChild(l),e.appendChild(t),e.appendChild(r),o(r),t.type="button",t.innerText="Start game",t.addEventListener("click",()=>{l.textContent="",i=Math.floor(99*Math.random()+1),f("GEH3S DHAX NAH4MBER BIXTWIY5N WAH4N Q AEND WAHN /HAH4NDRIHD"),o(t),n(r)}),(e,t)=>{let r=e;for(;r.length<256;)r+=" ";if(t&&(l.innerText+="\n"+t),!1===(e=!1!==(t=function(e,t){var u=1{if(!e)return!1;let i=e=>e===s.length?null:s[e],n=(t,e,r,l)=>{for(let e=s.length-1;e>=t;e--)s[e+1]=s[e],u[e+1]=f(e),H[e+1]=o(e);s[t]=e,u[t]=0|l,H[t]=r},o=e=>0|H[e],f=e=>0|u[e],a=(e,t)=>{u[e]=t},H=[],u=[],s=[],h=0;var l,A,I,d,T,c=e,N=e=>{H[h]=0,u[h]=0,s[h++]=e};for(let l=0;l{var e=R.findIndex(e=>e===t+r&&"*"!==e[1]);return-1!==e&&e})(e,t)))l++,N(r);else if(!1!==(r=(t=>{var e=R.findIndex(e=>e===t+"*");return-1!==e&&e})(e)))N(r);else{for(r=y.length;e!==y[r]&&0{s[e]=t},v=i,p=o;let e=(e,t)=>{switch(e){case 53:O(v(t-1),1024)&&E(t,16);break;case 42:Y(t+1,43,p(t));break;case 44:Y(t+1,45,p(t))}},t=(e,t)=>{E(e,13),Y(e+1,t,p(e))},r=-1,l;for(;null!==(l=v(++r));)if(0!==l)if(O(l,16))Y(r+1,O(l,32)?21:20,p(r)),e(l,r);else if(78===l)t(r,24);else if(79===l)t(r,27);else if(80===l)t(r,28);else if(O(l,b)&&p(r))0===v(r+1)&&null!==(l=v(r+2))&&O(l,b)&&p(r+2)&&Y(r+2,31,0);else{var g,W=0===r?null:v(r-1);if(23===l)switch(W){case 69:E(r-1,42);break;case 57:E(r-1,44);break;default:O(W,b)&&E(r,18)}else 24===l&&O(W,b)?E(r,19):60===W&&32===l?E(r,38):60===l?(g=v(r+1),O(g,32)||null===g||E(r,63)):(72===l&&(g=v(r+1),O(g,32)&&null!==g||(E(r,75),l=75)),O(l,1)&&32===W?E(r,l-12):O(l,1)||e(l,r),69!==l&&57!==l||0>8),l++}}{var U=i,X=a,D=f;for(let e=0;null!==U(e);e++)if(O(U(e),256)){for(var t,r=e;1<--e&&!O(U(e),b););if(0===e)break;for(;e>1)+t+1))}let n=-1,o;for(;null!==(o=U(++n));){let e=n,t,r,l;if(O(o,b))o=U(++e),O(o,64)?(t=null===o?65:S[o],w(t,4)?(l=D(n),X(n,(l>>2)+l+1)):w(t,1)&&(r=D(n),X(n,r-(r>>3)))):18!==o&&19!==o||!O(U(++e),64)||X(n,D(n)-1);else if(O(o,2048))null!==(o=U(++e))&&O(o,2)&&(X(e,6),X(e-1,5));else if(O(o,2)){for(;0===(o=U(++e)););null!==o&&O(o,2)&&(X(e,1+(D(e)>>1)),X(n,1+(D(n)>>1)))}else 0e?[e,0|u[t],0|H[t]]:null).filter(e=>e)})();return!1!==t&&((e,o,i,f,t)=>{t=255&(u.speed||72);var[r,l,n,a,H]=((e,t)=>{var[r,c,N,l]=((r,l,n)=>{let e=(e,t,r)=>{var l=t;t<30?t=0:t-=30;let n;for(;127===(n=r[t]);)++t;for(;t!==l;)for(n+=e,r[t]=255&n;++t!==l&&255===r[t];);},o=[],i=[[],[],[]],f=[[],[],[]],a=[],H=0;for(let t=0;t>8&255,f[2][H]=I[u]>>16&255,a[H]=A[u],o[H]=r+s&255,H++}return[o,i,f,a]})(void 0===o?64:255&o,e,((t,r)=>{let l=(e,t)=>(e*t>>8&255)<<1,n=[[],[],[]];s.map((e,t)=>{n[0][t]=255&e,n[1][t]=e>>8&255,n[2][t]=e>>16&255});for(let e=5;e<30;e++)n[0][e]=l(t,n[0][e]),n[1][e]=l(r,n[1][e]);for(let e=48;e<54;e++)n[0][e]=l(t,n[0][e]),n[1][e]=l(r,n[1][e]);return n})(void 0===i?128:255&i,void 0===f?128:255&f)),e=((t,r)=>{let H=[t,c[0],c[1],c[2],N[0],N[1],N[2]],u=(e,t)=>H[e][t],l=(t,r,l,e)=>{let n=e<0,o=Math.abs(e)%t,i=e/t|0,f=0,a=t;for(;0<--a;){let e=u(r,l)+i;(f+=o)>=t&&(f-=t,n?e--:e&&e++),H[r][++l]=e,e+=i}},n,o,i=0;for(let e=0;e>1)+(s=r[e+1][1]>>1),0,I,t[i+s]-t[i-h]);for(let e=1;e<7;e++){var T=u(e,A)-u(e,I);l(d,e,I,T)}}}return i+r[r.length-1][1]})(r,e);if(!t)for(let e=0;e>1;var n=[0,1,2,2,2,3,3,4,4,5,6,8,9,11,13,15];for(let e=N[0].length-1;0<=e;e--)N[0][e]=n[N[0][e]],N[1][e]=n[N[1][e]],N[2][e]=n[N[2][e]];return[e,c,r,N,l]})(e,u.singmode||!1);return((e,t,r,o,l,i,n)=>{let f=r,a=0,H=0,u=0,s=0,h=0,A=l[0],I=.75*A|0;for(;t;){var d=n[h];if(0!=(248&d))s=p(e,s,d,l[255&h]),h+=2,t-=2,f=r;else{{let t=[],r=256*a,l=256*H,n=256*u;for(let e=0;e<5;e++){var T=g(255&r>>8),c=g(255&l>>8),N=(255&n>>8)<129?-112:112,T=(T*(15&i[0][h])+c*(15&i[1][h])+N*(15&i[2][h]))/32+128;t[e]=0|T,r+=256*o[0][h]/4,l+=256*o[1][h]/4,n+=256*o[2][h]/4}e.ary(0,t)}if(0==--f){if(h++,0==--t)return;f=r}if(0!=--A){if(0!=--I||0===d){a+=o[0][h],H+=o[1][h],u+=o[2][h];continue}s=p(e,s,d,l[255&h])}}A=l[h],I=.75*A|0,a=0,H=0,u=0}})(e=(e=>{let r=new Uint8Array(e),l=0,n=0,o=(e,t)=>{t=16*(15&t),o.ary(e,[t,t,t,t,t])};return o.ary=(e,t)=>{if(((l+=[[162,167,167,127,128],[226,60,60,0,0],[225,60,59,0,0],[200,0,0,54,55],[199,0,0,54,54]][n][e])/50|0)>r.length)throw new Error;n=e;for(let e=0;e<5;e++)r[(l/50|0)+e]=t[e]},o.get=()=>r.slice(0,l/50|0),o})(176.4*e.reduce((e,t)=>e+t[1],0)*t|0),r,t,l,n,a,H),e.get()})(t,u.pitch,u.mouth,u.throat)}(e,void 0))&&(t=>{var r=new Float32Array(t.length);for(let e=0;e{let r=i.createBufferSource(),l=i.createBuffer(1,f.length,22050),n=l.getChannelData(0);for(let e=0;e{e(!0)},o=e=>{r.disconnect(),t(e)},r.start(0)});e.abort=o}}}),a=(r.onkeydown=e=>{13===e.keyCode&&(e.preventDefault(),a(parseInt(r.value))&&(l.innerText="\n"+l.innerText.split("\n").pop(),o(r),n(t)),r.value="")},e=>{var t;return 100{if(10<=e&&e<20)return c[e-10];let t,r="";return 0<=(t=Math.floor(e/10)-2)&&(r+=N[t]),(t=e%10)&&(r+=" "+T[t-1]),r})(e),e>i+25?(f(t+" IHZ MAH3CH TUW5 /HAY6.",e+" is much too high."),!1):e>i+5?(f(t+" IHZ TUW3 /HAY6.",e+" is too high."),!1):e>i?(f(t+" IHZ AH LIH3TUL TUW4 /HAY6,",e+" is a little too high."),!1):e { * * @return {Promise} */ - let Play = (context, audiobuffer) => { let abort; let promise = new Promise((resolve, reject) => { let source = context.createBufferSource(); let soundBuffer = context.createBuffer(1, audiobuffer.length, 22050); let buffer = soundBuffer.getChannelData(0); - for (let i = 0; i < audiobuffer.length; i++) { buffer[i] = audiobuffer[i]; } - source.buffer = soundBuffer; source.connect(context.destination); - source.onended = () => { resolve(true); }; - abort = reason => { source.disconnect(); reject(reason); }; - source.start(0); }); promise.abort = abort; return promise; }; - let context = null; + /** * Play an audio buffer. * @@ -87,20 +81,18 @@ let context = null; * * @return {Promise} */ - let PlayBuffer = audiobuffer => { if (null === context) { context = new AudioContext(); } - if (!context) { { throw new Error('No player available!'); } } - return Play(context, audiobuffer); }; + /** * Convert a Uint8Array wave buffer to a Float32Array WaveBuffer * @@ -108,16 +100,14 @@ let PlayBuffer = audiobuffer => { * * @return {Float32Array} */ - let Uint8ArrayToFloat32Array = buffer => { let audio = new Float32Array(buffer.length); - for (let i = 0; i < buffer.length; i++) { audio[i] = (buffer[i] - 128) / 256; } - return audio; }; + /** * Converts a Uint8Array buffer to a Uint8Array wave buffer * @@ -125,67 +115,67 @@ let Uint8ArrayToFloat32Array = buffer => { * * @return {Uint8Array} */ - let ToWavBuffer = audiobuffer => { // Calculate buffer size. - let realbuffer = new Uint8Array(4 + // "RIFF" - 4 + // uint32 filesize - 4 + // "WAVE" - 4 + // "fmt " - 4 + // uint32 fmt length - 2 + // uint16 fmt - 2 + // uint16 channels - 4 + // uint32 sample rate - 4 + // uint32 bytes per second - 2 + // uint16 block align - 2 + // uint16 bits per sample - 4 + // "data" - 4 + // uint32 chunk length + let realbuffer = new Uint8Array(4 + + // "RIFF" + 4 + + // uint32 filesize + 4 + + // "WAVE" + 4 + + // "fmt " + 4 + + // uint32 fmt length + 2 + + // uint16 fmt + 2 + + // uint16 channels + 4 + + // uint32 sample rate + 4 + + // uint32 bytes per second + 2 + + // uint16 block align + 2 + + // uint16 bits per sample + 4 + + // "data" + 4 + + // uint32 chunk length audiobuffer.length); let pos = 0; - let write = buffer => { realbuffer.set(buffer, pos); pos += buffer.length; - }; //RIFF header - + }; + //RIFF header write(text2Uint8Array('RIFF')); // chunkID - write(Uint32ToUint8Array(audiobuffer.length + 12 + 16 + 8 - 8)); // ChunkSize - write(text2Uint8Array('WAVE')); // riffType //format chunk - write(text2Uint8Array('fmt ')); write(Uint32ToUint8Array(16)); // ChunkSize - write(Uint16ToUint8Array(1)); // wFormatTag - 1 = PCM - write(Uint16ToUint8Array(1)); // channels - write(Uint32ToUint8Array(22050)); // samplerate - write(Uint32ToUint8Array(22050)); // bytes/second - write(Uint16ToUint8Array(1)); // blockalign - write(Uint16ToUint8Array(8)); // bits per sample //data chunk - write(text2Uint8Array('data')); write(Uint32ToUint8Array(audiobuffer.length)); // buffer length - write(audiobuffer); return realbuffer; }; + /** * * @param {Uint8Array} audiobuffer * * @return void */ - let RenderBuffer = audiobuffer => { let filename = "sam.wav"; let blob = new Blob([ToWavBuffer(audiobuffer)], { @@ -288,13 +278,9 @@ let rules2$1 = '(A)=|' + '(!)=.|' + '(") =-AH5NKWOWT-|' + '(")=KWOW4T-|' + '(#)= let FLAG_NUMERIC = 0x01; let FLAG_RULESET2 = 0x02; let FLAG_VOICED$1 = 0x04; // FIXME: is this correct? - let FLAG_0X08 = 0x08; // unknown. - let FLAG_DIPHTHONG$1 = 0x10; // FIXME: is this correct? - let FLAG_CONSONANT$1 = 0x20; // FIXME: is this correct? - let FLAG_VOWEL_OR_Y = 0x40; let FLAG_ALPHA_OR_QUOT = 0x80; @@ -304,10 +290,10 @@ let FLAG_ALPHA_OR_QUOT = 0x80; * @param {Number} flg * @return {boolean} */ - let flags = (c, flg) => { return (charFlags[c] & flg) !== 0; }; + /** * * @param {string} text @@ -315,8 +301,6 @@ let flags = (c, flg) => { * @param {Number} flg * @return {boolean} */ - - let flagsAt = (text, pos, flg) => { return flags(text[pos], flg); }; @@ -327,11 +311,10 @@ let flagsAt = (text, pos, flg) => { * * @return {boolean} */ - - let isOneOf = (c, list) => { return list.indexOf(c) !== -1; }; + /** * Set a phoneme in the buffer. * @@ -346,30 +329,28 @@ let isOneOf = (c, list) => { * @param {String} ruleString 'xxx(yyy)zzz=foobar' 'xxx(yyy)zzz' is the source value, 'foobar' is the destination value. * @return {result} */ - - let reciterRule = ruleString => { let splitted = ruleString.split('='); - const // Must pop and join here because of rule for '=' itself. - target = splitted.pop(), - source = splitted.join('=').split('('), - tmp = source.pop().split(')'), - pre = source[0], - match = tmp[0], - post = tmp[1]; + const + // Must pop and join here because of rule for '=' itself. + target = splitted.pop(), + source = splitted.join('=').split('('), + tmp = source.pop().split(')'), + pre = source[0], + match = tmp[0], + post = tmp[1]; let TCS = ['T', 'C', 'S']; let EIY = ['E', 'I', 'Y']; + /** * Test if the rule prefix matches. * @param {string} text The input text. * @param {Number} pos The input position we are working from. * @return {boolean} */ - let checkPrefix = (text, pos) => { for (let rulePos = pre.length - 1; rulePos > -1; rulePos--) { let ruleByte = pre[rulePos]; - if (!flags(ruleByte, FLAG_ALPHA_OR_QUOT)) { if (!{ // '' - previous char must not be alpha or quotation mark. @@ -385,16 +366,14 @@ let reciterRule = ruleString => { if (flagsAt(text, --pos, FLAG_VOICED$1)) { return true; } - - let inputChar = text[pos]; // 'H' - - if (inputChar !== 'H') return false; // FIXME: this is always true?!? is there a "--pos" missing in original code? + let inputChar = text[pos]; + // 'H' + if (inputChar !== 'H') return false; + // FIXME: this is always true?!? is there a "--pos" missing in original code? // Check for 'T', 'C', 'S' - if (!isOneOf(inputChar, TCS)) { return false; } - { throw new Error('Is always false but happened? ' + inputChar); } @@ -409,32 +388,30 @@ let reciterRule = ruleString => { if (!flagsAt(text, pos - 1, FLAG_CONSONANT$1)) break; pos--; } - return true; } }[ruleByte]()) { return false; } - } // Rule char does not match. + } + // Rule char does not match. else if (text[--pos] !== ruleByte) { return false; } } - return true; }; + /** * Test if the rule suffix matches. * @param {string} text The input text. * @param {Number} pos The input position we are working from. * @return {boolean} */ - - let checkSuffix = (text, pos) => { for (let rulePos = 0; rulePos < post.length; rulePos++) { - let ruleByte = post[rulePos]; // do we have to handle the byte specially? - + let ruleByte = post[rulePos]; + // do we have to handle the byte specially? if (!flags(ruleByte, FLAG_ALPHA_OR_QUOT)) { // pos37226: if (!{ @@ -451,13 +428,13 @@ let reciterRule = ruleString => { if (flagsAt(text, ++pos, FLAG_VOICED$1)) { return true; } - let inputChar = text[pos]; - if (inputChar !== 'H') // 'H' - return false; // Check for 'T', 'C', 'S' - - if (!isOneOf(inputChar, TCS)) return false; // FIXME: This is illogical and can never be reached. Bug in orig. code? reciter.c:489 (pos37367) - + if (inputChar !== 'H') + // 'H' + return false; + // Check for 'T', 'C', 'S' + if (!isOneOf(inputChar, TCS)) return false; + // FIXME: This is illogical and can never be reached. Bug in orig. code? reciter.c:489 (pos37367) { throw new Error('This should not be possible ', inputChar); } @@ -471,10 +448,8 @@ let reciterRule = ruleString => { while (flagsAt(text, pos + 1, FLAG_CONSONANT$1)) { pos++; } - return true; }, - /* '%' - check if we have: - 'ING' - 'E' not followed by alpha or quot @@ -490,17 +465,14 @@ let reciterRule = ruleString => { pos += 3; return true; } - return false; - } // we have 'E' - check if not followed by alpha or quot. - - + } + // we have 'E' - check if not followed by alpha or quot. if (!flagsAt(text, pos + 2, FLAG_ALPHA_OR_QUOT)) { pos++; return true; - } // NOT 'ER', 'ES' OR 'ED' - - + } + // NOT 'ER', 'ES' OR 'ED' if (!isOneOf(text[pos + 2], ['R', 'S', 'D'])) { // NOT 'EL' if (text[pos + 2] !== 'L') { @@ -510,30 +482,28 @@ let reciterRule = ruleString => { pos += 4; return true; } - return false; - } // NOT 'ELY' - - + } + // NOT 'ELY' if (text[pos + 3] !== 'Y') return false; pos += 3; return true; } - pos += 2; return true; } }[ruleByte]()) { return false; } - } // Rule char does not match. + } + // Rule char does not match. else if (text[++pos] !== ruleByte) { return false; } } - return true; }; + /** * Test if the rule matches. * @@ -541,22 +511,21 @@ let reciterRule = ruleString => { * @param {Number} pos The input position we are working from. * @return {boolean} */ - - let matches = (text, pos) => { // check if content in brackets matches. if (!text.startsWith(match, pos)) { return false; - } // Check left... - + } + // Check left... if (!checkPrefix(text, pos)) { return false; - } // Check right... - + } + // Check right... return checkSuffix(text, pos + (match.length - 1)); }; + /** * This is the real implementation of rule processing. * @@ -566,32 +535,29 @@ let reciterRule = ruleString => { * * @return {boolean} */ - - let result = (text, inputPos, callback) => { if (matches(text, inputPos)) { { - console.log("".concat(source, " -> ").concat(target)); + console.log(`${source} -> ${target}`); } - callback(target, match.length); return true; } }; - result.c = match[0]; return result; -}; // Map all rules and generate processors from them. - +}; +// Map all rules and generate processors from them. let rules = {}; rules$1.split('|').map(rule => { let r = reciterRule(rule), - c = r.c; + c = r.c; rules[c] = rules[c] || []; rules[c].push(r); }); let rules2 = rules2$1.split('|').map(reciterRule); + /** * Convert the text to a phoneme string. * @@ -599,33 +565,29 @@ let rules2 = rules2$1.split('|').map(reciterRule); * * @return {boolean|string} */ - let TextToPhonemes = input => { let text = ' ' + input.toUpperCase(); let inputPos = 0, - output = ''; + output = ''; /** * The input callback (successCallback) used from the rules. * * @param {string} append The string to append. * @param {Number} inputSkip The amount or chars to move ahead in the input. */ - let successCallback = (append, inputSkip) => { inputPos += inputSkip; output += append; }; - let c = 0; - while (inputPos < text.length && c++ < 10000) { { let tmp = text.toLowerCase(); - console.log("processing \"".concat(tmp.substr(0, inputPos), "%c").concat(tmp[inputPos].toUpperCase(), "%c").concat(tmp.substr(inputPos + 1), "\""), 'color: red;', 'color:normal;'); + console.log(`processing "${tmp.substr(0, inputPos)}%c${tmp[inputPos].toUpperCase()}%c${tmp.substr(inputPos + 1)}"`, 'color: red;', 'color:normal;'); } + let currentChar = text[inputPos]; - let currentChar = text[inputPos]; // NOT '.' or '.' followed by number. - + // NOT '.' or '.' followed by number. if (currentChar !== '.' || flagsAt(text, inputPos + 1, FLAG_NUMERIC)) { //pos36607: if (flags(currentChar, FLAG_RULESET2)) { @@ -633,118 +595,194 @@ let TextToPhonemes = input => { return rule(text, inputPos, successCallback); }); continue; - } //pos36630: - - + } + //pos36630: if (charFlags[currentChar] !== 0) { // pos36677: if (!flags(currentChar, FLAG_ALPHA_OR_QUOT)) { //36683: BRK return false; - } // go to the right rules for this character. - - + } + // go to the right rules for this character. rules[currentChar].some(rule => { return rule(text, inputPos, successCallback); }); continue; } - output += ' '; inputPos++; continue; } - output += '.'; inputPos++; } - return output; }; let StressTable = '*12345678'.split(''); -let PhonemeNameTable = (' *' + // 00 -'.*' + // 01 -'?*' + // 02 -',*' + // 03 -'-*' + // 04 -'IY' + // 05 -'IH' + // 06 -'EH' + // 07 -'AE' + // 08 -'AA' + // 09 -'AH' + // 10 -'AO' + // 11 -'UH' + // 12 -'AX' + // 13 -'IX' + // 14 -'ER' + // 15 -'UX' + // 16 -'OH' + // 17 -'RX' + // 18 -'LX' + // 19 -'WX' + // 20 -'YX' + // 21 -'WH' + // 22 -'R*' + // 23 -'L*' + // 24 -'W*' + // 25 -'Y*' + // 26 -'M*' + // 27 -'N*' + // 28 -'NX' + // 29 -'DX' + // 30 -'Q*' + // 31 -'S*' + // 32 -'SH' + // 33 -'F*' + // 34 -'TH' + // 35 -'/H' + // 36 -'/X' + // 37 -'Z*' + // 38 -'ZH' + // 39 -'V*' + // 40 -'DH' + // 41 -'CH' + // 42 -'**' + // 43 -'J*' + // 44 -'**' + // 45 -'**' + // 46 -'**' + // 47 -'EY' + // 48 -'AY' + // 49 -'OY' + // 50 -'AW' + // 51 -'OW' + // 52 -'UW' + // 53 -'B*' + // 54 -'**' + // 55 -'**' + // 56 -'D*' + // 57 -'**' + // 58 -'**' + // 59 -'G*' + // 60 -'**' + // 61 -'**' + // 62 -'GX' + // 63 -'**' + // 64 -'**' + // 65 -'P*' + // 66 -'**' + // 67 -'**' + // 68 -'T*' + // 69 -'**' + // 70 -'**' + // 71 -'K*' + // 72 -'**' + // 73 -'**' + // 74 -'KX' + // 75 -'**' + // 76 -'**' + // 77 -'UL' + // 78 -'UM' + // 79 +let PhonemeNameTable = (' *' + +// 00 +'.*' + +// 01 +'?*' + +// 02 +',*' + +// 03 +'-*' + +// 04 +'IY' + +// 05 +'IH' + +// 06 +'EH' + +// 07 +'AE' + +// 08 +'AA' + +// 09 +'AH' + +// 10 +'AO' + +// 11 +'UH' + +// 12 +'AX' + +// 13 +'IX' + +// 14 +'ER' + +// 15 +'UX' + +// 16 +'OH' + +// 17 +'RX' + +// 18 +'LX' + +// 19 +'WX' + +// 20 +'YX' + +// 21 +'WH' + +// 22 +'R*' + +// 23 +'L*' + +// 24 +'W*' + +// 25 +'Y*' + +// 26 +'M*' + +// 27 +'N*' + +// 28 +'NX' + +// 29 +'DX' + +// 30 +'Q*' + +// 31 +'S*' + +// 32 +'SH' + +// 33 +'F*' + +// 34 +'TH' + +// 35 +'/H' + +// 36 +'/X' + +// 37 +'Z*' + +// 38 +'ZH' + +// 39 +'V*' + +// 40 +'DH' + +// 41 +'CH' + +// 42 +'**' + +// 43 +'J*' + +// 44 +'**' + +// 45 +'**' + +// 46 +'**' + +// 47 +'EY' + +// 48 +'AY' + +// 49 +'OY' + +// 50 +'AW' + +// 51 +'OW' + +// 52 +'UW' + +// 53 +'B*' + +// 54 +'**' + +// 55 +'**' + +// 56 +'D*' + +// 57 +'**' + +// 58 +'**' + +// 59 +'G*' + +// 60 +'**' + +// 61 +'**' + +// 62 +'GX' + +// 63 +'**' + +// 64 +'**' + +// 65 +'P*' + +// 66 +'**' + +// 67 +'**' + +// 68 +'T*' + +// 69 +'**' + +// 70 +'**' + +// 71 +'K*' + +// 72 +'**' + +// 73 +'**' + +// 74 +'KX' + +// 75 +'**' + +// 76 +'**' + +// 77 +'UL' + +// 78 +'UM' + +// 79 'UN' // 80 ).match(/.{1,2}/g); + /** * Flags for phoneme names. * @@ -799,89 +837,169 @@ let PhonemeNameTable = (' *' + // 00 * 'P*', '**', '**', 'T*', '**', '**', 'K*', '**', '**', 'KX', '**', * '**', 'UM', 'UN' */ - -let phonemeFlags = [0 | 0x8000, // ' *' 00 -0 | 0x8000 | 0x4000 | 0x0100, // '.*' 01 -0 | 0x8000 | 0x4000 | 0x0100, // '?*' 02 -0 | 0x8000 | 0x4000 | 0x0100, // ',*' 03 -0 | 0x8000 | 0x4000 | 0x0100, // '-*' 04 -0 | 0x0080 | 0x0020 | 0x0004, // 'IY' 05 -0 | 0x0080 | 0x0020 | 0x0004, // 'IH' 06 -0 | 0x0080 | 0x0020 | 0x0004, // 'EH' 07 -0 | 0x0080 | 0x0020 | 0x0004, // 'AE' 08 -0 | 0x0080 | 0x0020 | 0x0004, // 'AA' 09 -0 | 0x0080 | 0x0020 | 0x0004, // 'AH' 10 -0 | 0x0080 | 0x0004, // 'AO' 11 -0 | 0x0080 | 0x0004, // 'UH' 12 -0 | 0x0080 | 0x0020 | 0x0004, // 'AX' 13 -0 | 0x0080 | 0x0020 | 0x0004, // 'IX' 14 -0 | 0x0080 | 0x0004, // 'ER' 15 -0 | 0x0080 | 0x0004, // 'UX' 16 -0 | 0x0080 | 0x0004, // 'OH' 17 -0 | 0x0080 | 0x0004, // 'RX' 18 -0 | 0x0080 | 0x0004, // 'LX' 19 -0 | 0x0080 | 0x0004, // 'WX' 20 -0 | 0x0080 | 0x0004, // 'YX' 21 -0 | 0x0040 | 0x0004, // 'WH' 22 -0 | 0x1000 | 0x0040 | 0x0004, // 'R*' 23 -0 | 0x1000 | 0x0040 | 0x0004, // 'L*' 24 -0 | 0x1000 | 0x0040 | 0x0004, // 'W*' 25 -0 | 0x1000 | 0x0040 | 0x0004, // 'Y*' 26 -0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, // 'M*' 27 -0 | 0x0800 | 0x0400 | 0x0040 | 0x0008 | 0x0004, // 'N*' 28 -0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, // 'NX' 29 -0 | 0x0400 | 0x0040 | 0x0008, // 'DX' 30 -0 | 0x4000 | 0x0040 | 0x0008 | 0x0004, // 'Q*' 31 -0 | 0x2000 | 0x0400 | 0x0040, // 'S*' 32 -0 | 0x2000 | 0x0040, // 'SH' 33 -0 | 0x2000 | 0x0040, // 'F*' 34 -0 | 0x2000 | 0x0400 | 0x0040, // 'TH' 35 -0 | 0x0040, // '/H' 36 -0 | 0x0040, // '/X' 37 -0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, // 'Z*' 38 -0 | 0x2000 | 0x0040 | 0x0004, // 'ZH' 39 -0 | 0x2000 | 0x0040 | 0x0004, // 'V*' 40 -0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, // 'DH' 41 -0 | 0x2000 | 0x0040 | 0x0008, // 'CH' 42 -0 | 0x2000 | 0x0040, // '**' 43 -0 | 0x0040 | 0x0008 | 0x0004, // 'J*' 44 -0 | 0x2000 | 0x0040 | 0x0004, // '**' 45 -0, // '**' 46 -0, // '**' 47 -0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'EY' 48 -0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'AY' 49 -0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'OY' 50 -0 | 0x0080 | 0x0010 | 0x0004, // 'AW' 51 -0 | 0x0080 | 0x0010 | 0x0004, // 'OW' 52 -0 | 0x0080 | 0x0010 | 0x0004, // 'UW' 53 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'B*' 54 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 55 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 56 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'D*' 57 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 58 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 59 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'G*' 60 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 61 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 62 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'GX' 63 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 64 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 65 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'P*' 66 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 67 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 68 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'T*' 69 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 70 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 71 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'K*' 72 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 73 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 74 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'KX' 75 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 76 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 77 -0 | 0x0080, // 'UL' 78 -0 | 0x0080 | 0x0040 | 0x0001, // 'UM' 79 +let phonemeFlags = [0 | 0x8000, +// ' *' 00 +0 | 0x8000 | 0x4000 | 0x0100, +// '.*' 01 +0 | 0x8000 | 0x4000 | 0x0100, +// '?*' 02 +0 | 0x8000 | 0x4000 | 0x0100, +// ',*' 03 +0 | 0x8000 | 0x4000 | 0x0100, +// '-*' 04 +0 | 0x0080 | 0x0020 | 0x0004, +// 'IY' 05 +0 | 0x0080 | 0x0020 | 0x0004, +// 'IH' 06 +0 | 0x0080 | 0x0020 | 0x0004, +// 'EH' 07 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AE' 08 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AA' 09 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AH' 10 +0 | 0x0080 | 0x0004, +// 'AO' 11 +0 | 0x0080 | 0x0004, +// 'UH' 12 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AX' 13 +0 | 0x0080 | 0x0020 | 0x0004, +// 'IX' 14 +0 | 0x0080 | 0x0004, +// 'ER' 15 +0 | 0x0080 | 0x0004, +// 'UX' 16 +0 | 0x0080 | 0x0004, +// 'OH' 17 +0 | 0x0080 | 0x0004, +// 'RX' 18 +0 | 0x0080 | 0x0004, +// 'LX' 19 +0 | 0x0080 | 0x0004, +// 'WX' 20 +0 | 0x0080 | 0x0004, +// 'YX' 21 +0 | 0x0040 | 0x0004, +// 'WH' 22 +0 | 0x1000 | 0x0040 | 0x0004, +// 'R*' 23 +0 | 0x1000 | 0x0040 | 0x0004, +// 'L*' 24 +0 | 0x1000 | 0x0040 | 0x0004, +// 'W*' 25 +0 | 0x1000 | 0x0040 | 0x0004, +// 'Y*' 26 +0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, +// 'M*' 27 +0 | 0x0800 | 0x0400 | 0x0040 | 0x0008 | 0x0004, +// 'N*' 28 +0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, +// 'NX' 29 +0 | 0x0400 | 0x0040 | 0x0008, +// 'DX' 30 +0 | 0x4000 | 0x0040 | 0x0008 | 0x0004, +// 'Q*' 31 +0 | 0x2000 | 0x0400 | 0x0040, +// 'S*' 32 +0 | 0x2000 | 0x0040, +// 'SH' 33 +0 | 0x2000 | 0x0040, +// 'F*' 34 +0 | 0x2000 | 0x0400 | 0x0040, +// 'TH' 35 +0 | 0x0040, +// '/H' 36 +0 | 0x0040, +// '/X' 37 +0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, +// 'Z*' 38 +0 | 0x2000 | 0x0040 | 0x0004, +// 'ZH' 39 +0 | 0x2000 | 0x0040 | 0x0004, +// 'V*' 40 +0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, +// 'DH' 41 +0 | 0x2000 | 0x0040 | 0x0008, +// 'CH' 42 +0 | 0x2000 | 0x0040, +// '**' 43 +0 | 0x0040 | 0x0008 | 0x0004, +// 'J*' 44 +0 | 0x2000 | 0x0040 | 0x0004, +// '**' 45 +0, +// '**' 46 +0, +// '**' 47 +0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, +// 'EY' 48 +0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, +// 'AY' 49 +0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, +// 'OY' 50 +0 | 0x0080 | 0x0010 | 0x0004, +// 'AW' 51 +0 | 0x0080 | 0x0010 | 0x0004, +// 'OW' 52 +0 | 0x0080 | 0x0010 | 0x0004, +// 'UW' 53 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'B*' 54 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 55 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 56 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'D*' 57 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 58 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 59 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'G*' 60 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 61 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 62 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'GX' 63 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 64 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 65 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'P*' 66 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 67 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 68 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'T*' 69 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 70 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 71 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'K*' 72 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 73 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 74 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'KX' 75 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 76 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 77 +0 | 0x0080, +// 'UL' 78 +0 | 0x0080 | 0x0040 | 0x0001, +// 'UM' 79 0 | 0x0080 | 0x0040 | 0x0001 // 'UN' 80 ]; + /** * Combined table of phoneme length. * @@ -891,88 +1009,167 @@ let phonemeFlags = [0 | 0x8000, // ' *' 00 * phonemeLengthTable[i] = combinedPhonemeLengthTable[i] & 0xFF * phonemeStressedLengthTable[i] = combinedPhonemeLengthTable[i] >> 8 */ - -let combinedPhonemeLengthTable = [0x0000 | 0x0000, // ' *' 00 -0x0012 | 0x1200, // '.*' 01 -0x0012 | 0x1200, // '?*' 02 -0x0012 | 0x1200, // ',*' 03 -0x0008 | 0x0800, // '-*' 04 -0x0008 | 0x0B00, // 'IY' 05 -0x0008 | 0x0900, // 'IH' 06 -0x0008 | 0x0B00, // 'EH' 07 -0x0008 | 0x0E00, // 'AE' 08 -0x000B | 0x0F00, // 'AA' 09 -0x0006 | 0x0B00, // 'AH' 10 -0x000C | 0x1000, // 'AO' 11 -0x000A | 0x0C00, // 'UH' 12 -0x0005 | 0x0600, // 'AX' 13 -0x0005 | 0x0600, // 'IX' 14 -0x000B | 0x0E00, // 'ER' 15 -0x000A | 0x0C00, // 'UX' 16 -0x000A | 0x0E00, // 'OH' 17 -0x000A | 0x0C00, // 'RX' 18 -0x0009 | 0x0B00, // 'LX' 19 -0x0008 | 0x0800, // 'WX' 20 -0x0007 | 0x0800, // 'YX' 21 -0x0009 | 0x0B00, // 'WH' 22 -0x0007 | 0x0A00, // 'R*' 23 -0x0006 | 0x0900, // 'L*' 24 -0x0008 | 0x0800, // 'W*' 25 -0x0006 | 0x0800, // 'Y*' 26 -0x0007 | 0x0800, // 'M*' 27 -0x0007 | 0x0800, // 'N*' 28 -0x0007 | 0x0800, // 'NX' 29 -0x0002 | 0x0300, // 'DX' 30 -0x0005 | 0x0500, // 'Q*' 31 -0x0002 | 0x0200, // 'S*' 32 -0x0002 | 0x0200, // 'SH' 33 -0x0002 | 0x0200, // 'F*' 34 -0x0002 | 0x0200, // 'TH' 35 -0x0002 | 0x0200, // '/H' 36 -0x0002 | 0x0200, // '/X' 37 -0x0006 | 0x0600, // 'Z*' 38 -0x0006 | 0x0600, // 'ZH' 39 -0x0007 | 0x0800, // 'V*' 40 -0x0006 | 0x0600, // 'DH' 41 -0x0006 | 0x0600, // 'CH' 42 -0x0002 | 0x0200, // '**' 43 -0x0008 | 0x0900, // 'J*' 44 -0x0003 | 0x0400, // '**' 45 -0x0001 | 0x0200, // '**' 46 -0x001E | 0x0100, // '**' 47 -0x000D | 0x0E00, // 'EY' 48 -0x000C | 0x0F00, // 'AY' 49 -0x000C | 0x0F00, // 'OY' 50 -0x000C | 0x0F00, // 'AW' 51 -0x000E | 0x0E00, // 'OW' 52 -0x0009 | 0x0E00, // 'UW' 53 -0x0006 | 0x0800, // 'B*' 54 -0x0001 | 0x0200, // '**' 55 -0x0002 | 0x0200, // '**' 56 -0x0005 | 0x0700, // 'D*' 57 -0x0001 | 0x0200, // '**' 58 -0x0001 | 0x0100, // '**' 59 -0x0006 | 0x0700, // 'G*' 60 -0x0001 | 0x0200, // '**' 61 -0x0002 | 0x0200, // '**' 62 -0x0006 | 0x0700, // 'GX' 63 -0x0001 | 0x0200, // '**' 64 -0x0002 | 0x0200, // '**' 65 -0x0008 | 0x0800, // 'P*' 66 -0x0002 | 0x0200, // '**' 67 -0x0002 | 0x0200, // '**' 68 -0x0004 | 0x0600, // 'T*' 69 -0x0002 | 0x0200, // '**' 70 -0x0002 | 0x0200, // '**' 71 -0x0006 | 0x0700, // 'K*' 72 -0x0001 | 0x0200, // '**' 73 -0x0004 | 0x0400, // '**' 74 -0x0006 | 0x0700, // 'KX' 75 -0x0001 | 0x0100, // '**' 76 -0x0004 | 0x0400, // '**' 77 -0x00C7 | 0x0500, // 'UL' 78 +let combinedPhonemeLengthTable = [0x0000 | 0x0000, +// ' *' 00 +0x0012 | 0x1200, +// '.*' 01 +0x0012 | 0x1200, +// '?*' 02 +0x0012 | 0x1200, +// ',*' 03 +0x0008 | 0x0800, +// '-*' 04 +0x0008 | 0x0B00, +// 'IY' 05 +0x0008 | 0x0900, +// 'IH' 06 +0x0008 | 0x0B00, +// 'EH' 07 +0x0008 | 0x0E00, +// 'AE' 08 +0x000B | 0x0F00, +// 'AA' 09 +0x0006 | 0x0B00, +// 'AH' 10 +0x000C | 0x1000, +// 'AO' 11 +0x000A | 0x0C00, +// 'UH' 12 +0x0005 | 0x0600, +// 'AX' 13 +0x0005 | 0x0600, +// 'IX' 14 +0x000B | 0x0E00, +// 'ER' 15 +0x000A | 0x0C00, +// 'UX' 16 +0x000A | 0x0E00, +// 'OH' 17 +0x000A | 0x0C00, +// 'RX' 18 +0x0009 | 0x0B00, +// 'LX' 19 +0x0008 | 0x0800, +// 'WX' 20 +0x0007 | 0x0800, +// 'YX' 21 +0x0009 | 0x0B00, +// 'WH' 22 +0x0007 | 0x0A00, +// 'R*' 23 +0x0006 | 0x0900, +// 'L*' 24 +0x0008 | 0x0800, +// 'W*' 25 +0x0006 | 0x0800, +// 'Y*' 26 +0x0007 | 0x0800, +// 'M*' 27 +0x0007 | 0x0800, +// 'N*' 28 +0x0007 | 0x0800, +// 'NX' 29 +0x0002 | 0x0300, +// 'DX' 30 +0x0005 | 0x0500, +// 'Q*' 31 +0x0002 | 0x0200, +// 'S*' 32 +0x0002 | 0x0200, +// 'SH' 33 +0x0002 | 0x0200, +// 'F*' 34 +0x0002 | 0x0200, +// 'TH' 35 +0x0002 | 0x0200, +// '/H' 36 +0x0002 | 0x0200, +// '/X' 37 +0x0006 | 0x0600, +// 'Z*' 38 +0x0006 | 0x0600, +// 'ZH' 39 +0x0007 | 0x0800, +// 'V*' 40 +0x0006 | 0x0600, +// 'DH' 41 +0x0006 | 0x0600, +// 'CH' 42 +0x0002 | 0x0200, +// '**' 43 +0x0008 | 0x0900, +// 'J*' 44 +0x0003 | 0x0400, +// '**' 45 +0x0001 | 0x0200, +// '**' 46 +0x001E | 0x0100, +// '**' 47 +0x000D | 0x0E00, +// 'EY' 48 +0x000C | 0x0F00, +// 'AY' 49 +0x000C | 0x0F00, +// 'OY' 50 +0x000C | 0x0F00, +// 'AW' 51 +0x000E | 0x0E00, +// 'OW' 52 +0x0009 | 0x0E00, +// 'UW' 53 +0x0006 | 0x0800, +// 'B*' 54 +0x0001 | 0x0200, +// '**' 55 +0x0002 | 0x0200, +// '**' 56 +0x0005 | 0x0700, +// 'D*' 57 +0x0001 | 0x0200, +// '**' 58 +0x0001 | 0x0100, +// '**' 59 +0x0006 | 0x0700, +// 'G*' 60 +0x0001 | 0x0200, +// '**' 61 +0x0002 | 0x0200, +// '**' 62 +0x0006 | 0x0700, +// 'GX' 63 +0x0001 | 0x0200, +// '**' 64 +0x0002 | 0x0200, +// '**' 65 +0x0008 | 0x0800, +// 'P*' 66 +0x0002 | 0x0200, +// '**' 67 +0x0002 | 0x0200, +// '**' 68 +0x0004 | 0x0600, +// 'T*' 69 +0x0002 | 0x0200, +// '**' 70 +0x0002 | 0x0200, +// '**' 71 +0x0006 | 0x0700, +// 'K*' 72 +0x0001 | 0x0200, +// '**' 73 +0x0004 | 0x0400, +// '**' 74 +0x0006 | 0x0700, +// 'KX' 75 +0x0001 | 0x0100, +// '**' 76 +0x0004 | 0x0400, +// '**' 77 +0x00C7 | 0x0500, +// 'UL' 78 0x00FF | 0x0500 // 'UM' 79 ]; + /* Ind | phoneme | flags | @@ -1087,27 +1284,26 @@ SPECIAL * @param {string} sign2 * @return {boolean|Number} */ - let full_match = (sign1, sign2) => { let index = PhonemeNameTable.findIndex(value => { return value === sign1 + sign2 && value[1] !== '*'; }); return index !== -1 ? index : false; }; + /** * Match single character phoneme. * * @param {string} sign1 * @return {boolean|Number} */ - - let single_match = sign1 => { let index = PhonemeNameTable.findIndex(value => { return value === sign1 + '*'; }); return index !== -1 ? index : false; }; + /** * The input[] buffer contains a string of phonemes and stress markers along * the lines of: @@ -1161,46 +1357,37 @@ let single_match = sign1 => { * * @return {undefined} */ - - let Parser1 = (input, addPhoneme, addStress) => { for (let srcPos = 0; srcPos < input.length; srcPos++) { { let tmp = input.toLowerCase(); - console.log("processing \"".concat(tmp.substr(0, srcPos), "%c").concat(tmp.substr(srcPos, 2).toUpperCase(), "%c").concat(tmp.substr(srcPos + 2), "\""), 'color: red;', 'color:normal;'); + console.log(`processing "${tmp.substr(0, srcPos)}%c${tmp.substr(srcPos, 2).toUpperCase()}%c${tmp.substr(srcPos + 2)}"`, 'color: red;', 'color:normal;'); } - let sign1 = input[srcPos]; let sign2 = input[srcPos + 1] || ''; let match; - if ((match = full_match(sign1, sign2)) !== false) { // Matched both characters (no single char mark) srcPos++; // Skip the second character of the input as we've matched it - addPhoneme(match); continue; } - if ((match = single_match(sign1)) !== false) { // Matched just the first character (with second character matching '*' addPhoneme(match); continue; - } // Should be a stress character. Search through the stress table backwards. - + } + // Should be a stress character. Search through the stress table backwards. match = StressTable.length; - while (sign1 !== StressTable[match] && match > 0) { --match; } - if (match === 0) { { - throw Error("Could not parse char ".concat(sign1)); + throw Error(`Could not parse char ${sign1}`); } } - addStress(match); // Set stress for prior phoneme } }; @@ -1213,7 +1400,6 @@ let Parser1 = (input, addPhoneme, addStress) => { * * @return {boolean} */ - let phonemeHasFlag = (phoneme, flag) => { return matchesBitmask(phonemeFlags[phoneme], flag); }; @@ -1224,10 +1410,10 @@ let pT = 69; let PHONEME_PERIOD = 1; let PHONEME_QUESTION = 2; let FLAG_FRICATIVE = 0x2000; + /** * liquic consonant */ - let FLAG_LIQUIC = 0x1000; let FLAG_NASAL = 0x0800; let FLAG_ALVEOLAR = 0x0400; @@ -1238,7 +1424,6 @@ let FLAG_CONSONANT = 0x0040; * diphthong ending with YX * */ - let FLAG_DIP_YX = 0x0020; let FLAG_DIPHTHONG = 0x0010; /** unknown: @@ -1246,13 +1431,12 @@ let FLAG_DIPHTHONG = 0x0010; * '**', '**', 'G*', '**', '**', 'GX', '**', '**', 'P*', '**', '**', * 'T*', '**', '**', 'K*', '**', '**', 'KX', '**', '**' */ - let FLAG_0008 = 0x0008; let FLAG_VOICED = 0x0004; + /** * stop consonant */ - let FLAG_STOPCONS = 0x0002; let FLAG_UNVOICED_STOPCONS = 0x0001; @@ -1289,7 +1473,6 @@ let FLAG_UNVOICED_STOPCONS = 0x0001; * * @return undefined */ - let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { /** * Rewrites: @@ -1307,96 +1490,77 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { // ALVEOLAR flag set? if (phonemeHasFlag(getPhoneme(pos - 1), FLAG_ALVEOLAR)) { { - console.log("".concat(pos, " RULE: UW -> UX")); + console.log(`${pos} RULE: UW -> UX`); } - setPhoneme(pos, 16); // UX } - break; } // 'CH' Example: CHEW - case 42: { { - console.log("".concat(pos, " RULE: CH -> CH CH+1")); + console.log(`${pos} RULE: CH -> CH CH+1`); } - insertPhoneme(pos + 1, 43, getStress(pos)); // '**' - break; } // 'J*' Example: JAY - case 44: { { - console.log("".concat(pos, " RULE: J -> J J+1")); + console.log(`${pos} RULE: J -> J J+1`); } - insertPhoneme(pos + 1, 45, getStress(pos)); // '**' - break; } } }; - let changeAX = (position, suffix) => { { - console.log("".concat(position, " RULE: ").concat(PhonemeNameTable[getPhoneme(position)], " -> AX ").concat(PhonemeNameTable[suffix])); + console.log(`${position} RULE: ${PhonemeNameTable[getPhoneme(position)]} -> AX ${PhonemeNameTable[suffix]}`); } - setPhoneme(position, 13); // 'AX' - insertPhoneme(position + 1, suffix, getStress(position)); }; - let pos = -1; let phoneme; - while ((phoneme = getPhoneme(++pos)) !== null) { // Is phoneme pause? if (phoneme === 0) { continue; } - if (phonemeHasFlag(phoneme, FLAG_DIPHTHONG)) { // -> WX // -> YX // Example: OIL, COW { - console.log(!phonemeHasFlag(phoneme, FLAG_DIP_YX) ? "".concat(pos, " RULE: insert WX following diphthong NOT ending in IY sound") : "".concat(pos, " RULE: insert YX following diphthong ending in IY sound")); - } // If ends with IY, use YX, else use WX + console.log(!phonemeHasFlag(phoneme, FLAG_DIP_YX) ? `${pos} RULE: insert WX following diphthong NOT ending in IY sound` : `${pos} RULE: insert YX following diphthong ending in IY sound`); + } + // If ends with IY, use YX, else use WX // Insert at WX or YX following, copying the stress // 'WX' = 20 'YX' = 21 - - insertPhoneme(pos + 1, phonemeHasFlag(phoneme, FLAG_DIP_YX) ? 21 : 20, getStress(pos)); handleUW_CH_J(phoneme, pos); continue; } - if (phoneme === 78) { // 'UL' => 'AX' 'L*' // Example: MEDDLE changeAX(pos, 24); continue; } - if (phoneme === 79) { // 'UM' => 'AX' 'M*' // Example: ASTRONOMY changeAX(pos, 27); continue; } - if (phoneme === 80) { // 'UN' => 'AX' 'N*' changeAX(pos, 28); continue; } - if (phonemeHasFlag(phoneme, FLAG_VOWEL) && getStress(pos)) { // Example: FUNCTION // RULE: @@ -1405,21 +1569,16 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { if (getPhoneme(pos + 1) === 0) { // If following phoneme is a pause, get next phoneme = getPhoneme(pos + 2); - if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_VOWEL) && getStress(pos + 2)) { { - console.log("".concat(pos + 2, " RULE: Insert glottal stop between two stressed vowels with space between them")); + console.log(`${pos + 2} RULE: Insert glottal stop between two stressed vowels with space between them`); } - insertPhoneme(pos + 2, 31, 0); // 31 = 'Q' } } - continue; } - let priorPhoneme = pos === 0 ? null : getPhoneme(pos - 1); - if (phoneme === pR) { // RULES FOR PHONEMES BEFORE R switch (priorPhoneme) { @@ -1427,103 +1586,88 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { { // Example: TRACK { - console.log("".concat(pos, " RULE: T* R* -> CH R*")); + console.log(`${pos} RULE: T* R* -> CH R*`); } - setPhoneme(pos - 1, 42); // 'T*' 'R*' -> 'CH' 'R*' - break; } - case pD: { // Example: DRY { - console.log("".concat(pos, " RULE: D* R* -> J* R*")); + console.log(`${pos} RULE: D* R* -> J* R*`); } - setPhoneme(pos - 1, 44); // 'J*' - break; } - default: { if (phonemeHasFlag(priorPhoneme, FLAG_VOWEL)) { // Example: ART { - console.log("".concat(pos, " R* -> RX")); + console.log(`${pos} R* -> RX`); } - setPhoneme(pos, 18); // 'RX' } } } - continue; - } // 'L*' - + } + // 'L*' if (phoneme === 24 && phonemeHasFlag(priorPhoneme, FLAG_VOWEL)) { // Example: ALL { - console.log("".concat(pos, " L* -> LX")); + console.log(`${pos} L* -> LX`); } - setPhoneme(pos, 19); // 'LX' - continue; - } // 'G*' 'S*' - - + } + // 'G*' 'S*' if (priorPhoneme === 60 && phoneme === 32) { // Can't get to fire - // 1. The G -> GX rule intervenes // 2. Reciter already replaces GS -> GZ { - console.log("".concat(pos, " G S -> G Z")); + console.log(`${pos} G S -> G Z`); } - setPhoneme(pos, 38); continue; - } // 'G*' - + } + // 'G*' if (phoneme === 60) { // G -> GX // Example: GO - let phoneme = getPhoneme(pos + 1); // If diphthong ending with YX, move continue processing next phoneme - + let phoneme = getPhoneme(pos + 1); + // If diphthong ending with YX, move continue processing next phoneme if (!phonemeHasFlag(phoneme, FLAG_DIP_YX) && phoneme !== null) { // replace G with GX and continue processing next phoneme { - console.log("".concat(pos, " RULE: G -> GX ")); + console.log(`${pos} RULE: G -> GX `); } - setPhoneme(pos, 63); // 'GX' } - continue; - } // 'K*' - + } + // 'K*' if (phoneme === 72) { // K -> KX // Example: COW - let Y = getPhoneme(pos + 1); // If at end, replace current phoneme with KX - + let Y = getPhoneme(pos + 1); + // If at end, replace current phoneme with KX if (!phonemeHasFlag(Y, FLAG_DIP_YX) || Y === null) { // VOWELS AND DIPHTHONGS ENDING WITH IY SOUND flag set? { - console.log("".concat(pos, " K -> KX ")); + console.log(`${pos} K -> KX `); } - setPhoneme(pos, 75); phoneme = 75; } - } // Replace with softer version? - + } + // Replace with softer version? if (phonemeHasFlag(phoneme, FLAG_UNVOICED_STOPCONS) && priorPhoneme === 32) { // 'S*' // RULE: @@ -1535,15 +1679,14 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { // 'S*' 'UN' -> 'S*' '**' // Examples: SPY, STY, SKY, SCOWL { - console.log("".concat(pos, " RULE: S* ").concat(PhonemeNameTable[phoneme], " -> S* ").concat(PhonemeNameTable[phoneme - 12])); + console.log(`${pos} RULE: S* ${PhonemeNameTable[phoneme]} -> S* ${PhonemeNameTable[phoneme - 12]}`); } - setPhoneme(pos, phoneme - 12); } else if (!phonemeHasFlag(phoneme, FLAG_UNVOICED_STOPCONS)) { handleUW_CH_J(phoneme, pos); - } // 'T*', 'D*' - + } + // 'T*', 'D*' if (phoneme === 69 || phoneme === 57) { // RULE: Soften T following vowel // NOTE: This rule fails for cases such as "ODD" @@ -1552,28 +1695,22 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { // Example: PARTY, TARDY if (pos > 0 && phonemeHasFlag(getPhoneme(pos - 1), FLAG_VOWEL)) { phoneme = getPhoneme(pos + 1); - if (phoneme === 0) { phoneme = getPhoneme(pos + 2); } - if (phonemeHasFlag(phoneme, FLAG_VOWEL) && !getStress(pos + 1)) { { - console.log("".concat(pos, " Soften T or D following vowel or ER and preceding a pause -> DX")); + console.log(`${pos} Soften T or D following vowel or ER and preceding a pause -> DX`); } - setPhoneme(pos, 30); } } - continue; } - { - console.log("".concat(pos, ": ").concat(PhonemeNameTable[phoneme])); + console.log(`${pos}: ${PhonemeNameTable[phoneme]}`); } } // while - }; /** @@ -1593,177 +1730,160 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { * * @return undefined */ - let AdjustLengths = (getPhoneme, setLength, getLength) => { { - console.log("AdjustLengths()"); - } // LENGTHEN VOWELS PRECEDING PUNCTUATION + console.log(`AdjustLengths()`); + } + + // LENGTHEN VOWELS PRECEDING PUNCTUATION // // Search for punctuation. If found, back up to the first vowel, then // process all phonemes between there and up to (but not including) the punctuation. // If any phoneme is found that is a either a fricative or voiced, the duration is // increased by (length * 1.5) + 1 - // loop index - + // loop index for (let position = 0; getPhoneme(position) !== null; position++) { // not punctuation? if (!phonemeHasFlag(getPhoneme(position), FLAG_PUNCT)) { continue; } - let loopIndex = position; - - while (--position > 1 && !phonemeHasFlag(getPhoneme(position), FLAG_VOWEL)) { - /* back up while not a vowel */ - } // If beginning of phonemes, exit loop. - - + while (--position > 1 && !phonemeHasFlag(getPhoneme(position), FLAG_VOWEL)) {/* back up while not a vowel */} + // If beginning of phonemes, exit loop. if (position === 0) { break; - } // Now handle everything between position and loopIndex - + } + // Now handle everything between position and loopIndex let vowel = position; - for (; position < loopIndex; position++) { // test for not fricative/unvoiced or not voiced if (!phonemeHasFlag(getPhoneme(position), FLAG_FRICATIVE) || phonemeHasFlag(getPhoneme(position), FLAG_VOICED)) { - let A = getLength(position); // change phoneme length to (length * 1.5) + 1 - + let A = getLength(position); + // change phoneme length to (length * 1.5) + 1 { console.log(position + ' RULE: Lengthen or ' + PhonemeNameTable[getPhoneme(position)] + ' between VOWEL:' + PhonemeNameTable[getPhoneme(vowel)] + ' and PUNCTUATION:' + PhonemeNameTable[getPhoneme(position)] + ' by 1.5'); } - setLength(position, (A >> 1) + A + 1); } } - } // Similar to the above routine, but shorten vowels under some circumstances - // Loop through all phonemes - + } + // Similar to the above routine, but shorten vowels under some circumstances + // Loop through all phonemes let loopIndex = -1; let phoneme; - while ((phoneme = getPhoneme(++loopIndex)) !== null) { - let position = loopIndex; // vowel? - + let position = loopIndex; + // vowel? if (phonemeHasFlag(phoneme, FLAG_VOWEL)) { // get next phoneme - phoneme = getPhoneme(++position); // not a consonant - + phoneme = getPhoneme(++position); + // not a consonant if (!phonemeHasFlag(phoneme, FLAG_CONSONANT)) { // 'RX' or 'LX'? if ((phoneme === 18 || phoneme === 19) && phonemeHasFlag(getPhoneme(++position), FLAG_CONSONANT)) { // followed by consonant? { console.log(loopIndex + ' RULE: ' + PhonemeNameTable[phoneme] + ' - decrease length of vowel by 1'); - } // decrease length of vowel by 1 frame - - + } + // decrease length of vowel by 1 frame setLength(loopIndex, getLength(loopIndex) - 1); } - continue; - } // Got here if not + } + // Got here if not // FIXME: the case when phoneme === END is taken over by !phonemeHasFlag(phoneme, FLAG_CONSONANT) - - - let flags = phoneme === null ? FLAG_CONSONANT | FLAG_UNVOICED_STOPCONS : phonemeFlags[phoneme]; // Unvoiced - + let flags = phoneme === null ? FLAG_CONSONANT | FLAG_UNVOICED_STOPCONS : phonemeFlags[phoneme]; + // Unvoiced if (!matchesBitmask(flags, FLAG_VOICED)) { // *, .*, ?*, ,*, -*, DX, S*, SH, F*, TH, /H, /X, CH, P*, T*, K*, KX + // unvoiced plosive if (matchesBitmask(flags, FLAG_UNVOICED_STOPCONS)) { // RULE: // { - console.log("".concat(loopIndex, " - decrease vowel by 1/8th")); + console.log(`${loopIndex} - decrease vowel by 1/8th`); } - let A = getLength(loopIndex); setLength(loopIndex, A - (A >> 3)); } - continue; - } // RULE: + } + + // RULE: // - - { - console.log("".concat(loopIndex, " RULE: - increase vowel by 1/4 + 1")); - } // increase length - - + console.log(`${loopIndex} RULE: - increase vowel by 1/4 + 1`); + } + // increase length let A = getLength(loopIndex); setLength(loopIndex, (A >> 2) + A + 1); // 5/4*A + 1 - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, M*, N*, NX, DX, Q*, S*, SH, F*, - // TH, /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX - // nasal? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, M*, N*, NX, DX, Q*, S*, SH, F*, + // TH, /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX + // nasal? if (phonemeHasFlag(phoneme, FLAG_NASAL)) { // RULE: // Set punctuation length to 6 // Set stop consonant length to 5 - // M*, N*, NX, - phoneme = getPhoneme(++position); // is next phoneme a stop consonant? + // M*, N*, NX, + phoneme = getPhoneme(++position); + // is next phoneme a stop consonant? if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // B*, D*, G*, GX, P*, T*, K*, KX { - console.log("".concat(position, " RULE: - set nasal = 5, consonant = 6")); + console.log(`${position} RULE: - set nasal = 5, consonant = 6`); } - setLength(position, 6); // set stop consonant length to 6 - setLength(position - 1, 5); // set nasal length to 5 } - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, - // /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX - // stop consonant? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, + // /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX + // stop consonant? if (phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // B*, D*, G*, GX + // RULE: {optional silence} // Shorten both to (length/2 + 1) - while ((phoneme = getPhoneme(++position)) === 0) { - /* move past silence */ - } // if another stop consonant, process. - + while ((phoneme = getPhoneme(++position)) === 0) {/* move past silence */} + // if another stop consonant, process. if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // RULE: {optional silence} { - console.log("".concat(position, " RULE: {optional silence} - shorten both to 1/2 + 1")); + console.log(`${position} RULE: {optional silence} - shorten both to 1/2 + 1`); } - setLength(position, (getLength(position) >> 1) + 1); setLength(loopIndex, (getLength(loopIndex) >> 1) + 1); } - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, - // /H, /X, Z*, ZH, V*, DH, CH, J* - // liquic consonant? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, + // /H, /X, Z*, ZH, V*, DH, CH, J* + // liquic consonant? if (position > 0 && phonemeHasFlag(phoneme, FLAG_LIQUIC) && phonemeHasFlag(getPhoneme(position - 1), FLAG_STOPCONS)) { // R*, L*, W*, Y* // RULE: // Decrease by 2 // prior phoneme is a stop consonant { - console.log("".concat(position, " RULE: - decrease by 2")); - } // decrease the phoneme length by 2 frames - - + console.log(`${position} RULE: - decrease by 2`); + } + // decrease the phoneme length by 2 frames setLength(position, getLength(position) - 2); } } @@ -1788,21 +1908,18 @@ let AdjustLengths = (getPhoneme, setLength, getLength) => { * * @return undefined */ - let CopyStress = (getPhoneme, getStress, setStress) => { // loop through all the phonemes to be output let position = 0; let phoneme; - while ((phoneme = getPhoneme(position)) !== null) { // if CONSONANT_FLAG set, skip - only vowels get stress if (phonemeHasFlag(phoneme, FLAG_CONSONANT)) { - phoneme = getPhoneme(position + 1); // if the following phoneme is the end, or a vowel, skip - + phoneme = getPhoneme(position + 1); + // if the following phoneme is the end, or a vowel, skip if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_VOWEL)) { // get the stress value at the next position let stress = getStress(position + 1); - if (stress !== 0 && stress < 0x80) { // if next phoneme is stressed, and a VOWEL OR ER // copy stress from next phoneme to this one @@ -1810,7 +1927,6 @@ let CopyStress = (getPhoneme, getStress, setStress) => { } } } - ++position; } }; @@ -1824,20 +1940,16 @@ let CopyStress = (getPhoneme, getStress, setStress) => { * * @return undefined */ - let SetPhonemeLength = (getPhoneme, getStress, setLength) => { let position = 0; let phoneme; - while ((phoneme = getPhoneme(position)) !== null) { let stress = getStress(position); - if (stress === 0 || stress > 0x7F) { setLength(position, combinedPhonemeLengthTable[phoneme] & 0xFF); } else { setLength(position, combinedPhonemeLengthTable[phoneme] >> 8); } - position++; } }; @@ -1852,32 +1964,26 @@ let SetPhonemeLength = (getPhoneme, getStress, setLength) => { * * @return undefined */ - let ProlongPlosiveStopConsonantsCode41240 = (getPhoneme, insertPhoneme, getStress) => { let pos = -1; let index; - while ((index = getPhoneme(++pos)) !== null) { // Not a stop consonant, move to next one. if (!phonemeHasFlag(index, FLAG_STOPCONS)) { continue; - } //If plosive, move to next non empty phoneme and validate the flags. - - + } + //If plosive, move to next non empty phoneme and validate the flags. if (phonemeHasFlag(index, FLAG_UNVOICED_STOPCONS)) { let nextNonEmpty; let X = pos; - do { nextNonEmpty = getPhoneme(++X); - } while (nextNonEmpty === 0); // If not END and either flag 0x0008 or '/H' or '/X' - - + } while (nextNonEmpty === 0); + // If not END and either flag 0x0008 or '/H' or '/X' if (nextNonEmpty !== null && (phonemeHasFlag(nextNonEmpty, FLAG_0008) || nextNonEmpty === 36 || nextNonEmpty === 37)) { continue; } } - insertPhoneme(pos + 1, index + 1, getStress(pos), combinedPhonemeLengthTable[index + 1] & 0xFF); insertPhoneme(pos + 2, index + 2, getStress(pos), combinedPhonemeLengthTable[index + 2] & 0xFF); pos += 2; @@ -1893,29 +1999,25 @@ let ProlongPlosiveStopConsonantsCode41240 = (getPhoneme, insertPhoneme, getStres * * @return {Array|Boolean} The parsed data. */ - let Parser = input => { if (!input) { return false; } - let getPhoneme = pos => { { if (pos < 0 || pos > phonemeindex.length) { throw new Error('Out of bounds: ' + pos); } } - return pos === phonemeindex.length ? null : phonemeindex[pos]; }; - let setPhoneme = (pos, value) => { { - console.log("".concat(pos, " CHANGE: ").concat(PhonemeNameTable[phonemeindex[pos]], " -> ").concat(PhonemeNameTable[value])); + console.log(`${pos} CHANGE: ${PhonemeNameTable[phonemeindex[pos]]} -> ${PhonemeNameTable[value]}`); } - phonemeindex[pos] = value; }; + /** * @param {Number} pos The position in the phoneme array to insert at. * @param {Number} value The phoneme to insert. @@ -1924,54 +2026,40 @@ let Parser = input => { * * @return {undefined} */ - - let insertPhoneme = (pos, value, stressValue, length) => { { - console.log("".concat(pos, " INSERT: ").concat(PhonemeNameTable[value])); + console.log(`${pos} INSERT: ${PhonemeNameTable[value]}`); } - for (let i = phonemeindex.length - 1; i >= pos; i--) { phonemeindex[i + 1] = phonemeindex[i]; phonemeLength[i + 1] = getLength(i); stress[i + 1] = getStress(i); } - phonemeindex[pos] = value; phonemeLength[pos] = length | 0; stress[pos] = stressValue; }; - let getStress = pos => stress[pos] | 0; - let setStress = (pos, stressValue) => { { - console.log("".concat(pos, " \"").concat(PhonemeNameTable[phonemeindex[pos]], "\" SET STRESS: ").concat(stress[pos], " -> ").concat(stressValue)); + console.log(`${pos} "${PhonemeNameTable[phonemeindex[pos]]}" SET STRESS: ${stress[pos]} -> ${stressValue}`); } - stress[pos] = stressValue; }; - let getLength = pos => phonemeLength[pos] | 0; - let setLength = (pos, length) => { { - console.log("".concat(pos, " \"").concat(PhonemeNameTable[phonemeindex[pos]], "\" SET LENGTH: ").concat(phonemeLength[pos], " -> ").concat(length)); - + console.log(`${pos} "${PhonemeNameTable[phonemeindex[pos]]}" SET LENGTH: ${phonemeLength[pos]} -> ${length}`); if ((length & 128) !== 0) { throw new Error('Got the flag 0x80, see CopyStress() and SetPhonemeLength() comments!'); } - if (pos < 0 || pos > phonemeindex.length) { throw new Error('Out of bounds: ' + pos); } } - phonemeLength[pos] = length; }; - let stress = []; //numbers from 0 to 8 - let phonemeLength = []; let phonemeindex = []; let pos = 0; @@ -1985,27 +2073,22 @@ let Parser = input => { throw new Error('Got the flag 0x80, see CopyStress() and SetPhonemeLength() comments!'); } } - - stress[pos - 1] = value; - /* Set stress for prior phoneme */ + stress[pos - 1] = value; /* Set stress for prior phoneme */ }); - { PrintPhonemes(phonemeindex, phonemeLength, stress); } - Parser2(insertPhoneme, setPhoneme, getPhoneme, getStress); CopyStress(getPhoneme, getStress, setStress); SetPhonemeLength(getPhoneme, getStress, setLength); AdjustLengths(getPhoneme, setLength, getLength); ProlongPlosiveStopConsonantsCode41240(getPhoneme, insertPhoneme, getStress); - { PrintPhonemes(phonemeindex, phonemeLength, stress); } - return phonemeindex.map((v, i) => v ? [v, phonemeLength[i] | 0, stress[i] | 0] : null).filter(v => v); }; + /** * Debug printing. * @@ -2015,46 +2098,45 @@ let Parser = input => { * * @return undefined */ - let PrintPhonemes = (phonemeindex, phonemeLength, stress) => { let pad = num => { let s = '000' + num; return s.substr(s.length - 3); }; - console.log('=================================='); console.log('Internal Phoneme presentation:'); console.log(' pos idx phoneme length stress'); console.log('----------------------------------'); - for (let i = 0; i < phonemeindex.length; i++) { let name = () => { if (phonemeindex[i] < 81) { return PhonemeNameTable[phonemeindex[i]]; } - return '??'; }; - console.log(' %s %s %s %s %s', pad(i), pad(phonemeindex[i]), name(phonemeindex[i]), pad(phonemeLength[i]), pad(stress[i])); } - console.log('=================================='); }; // Values substituted for zero bits in unvoiced consonant samples. // tab48426 let sampledConsonantValues0 = [0x18, 0x1A, 0x17, 0x17, 0x17]; -let stressPitch_tab47492 = [0x00, 0xE0, 0xE6, 0xEC, 0xF3, 0xF9, 0x00, 0x06, 0xC, 0x06]; // Used to decide which phoneme's blend lengths. The candidate with the lower score is selected. +let stressPitch_tab47492 = [0x00, 0xE0, 0xE6, 0xEC, 0xF3, 0xF9, 0x00, 0x06, 0xC, 0x06]; + +// Used to decide which phoneme's blend lengths. The candidate with the lower score is selected. // tab45856 +let blendRank = [0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x02, 0x0A, 0x02, 0x08, 0x05, 0x05, 0x0B, 0x0A, 0x09, 0x08, 0x08, 0xA0, 0x08, 0x08, 0x17, 0x1F, 0x12, 0x12, 0x12, 0x12, 0x1E, 0x1E, 0x14, 0x14, 0x14, 0x14, 0x17, 0x17, 0x1A, 0x1A, 0x1D, 0x1D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x17]; -let blendRank = [0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x02, 0x0A, 0x02, 0x08, 0x05, 0x05, 0x0B, 0x0A, 0x09, 0x08, 0x08, 0xA0, 0x08, 0x08, 0x17, 0x1F, 0x12, 0x12, 0x12, 0x12, 0x1E, 0x1E, 0x14, 0x14, 0x14, 0x14, 0x17, 0x17, 0x1A, 0x1A, 0x1D, 0x1D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x17]; // Number of frames at the end of a phoneme devoted to interpolating to next phoneme's final value +// Number of frames at the end of a phoneme devoted to interpolating to next phoneme's final value //tab45696 +let outBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0xA0, 0xA0]; -let outBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0xA0, 0xA0]; // Number of frames at beginning of a phoneme devoted to interpolating to phoneme's final value +// Number of frames at beginning of a phoneme devoted to interpolating to phoneme's final value // tab45776 +let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0xB0, 0xA0]; -let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0xB0, 0xA0]; // Consists of two bitfields: +// Consists of two bitfields: // Low 3 bits (masked by 7) select a 256-byte section in sampleTable, // as well as index into sampledConsonantValues0 for unvoiced. // High 5 bits (masked by 248 = 11111000), for unvoiced, @@ -2075,222 +2157,423 @@ let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, // 67: P' 27 00011011 // 70: T' 25 00011001 // tab45936 +let sampledConsonantFlags = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0xD3, 0xBB, 0x7C, 0x95, 0x01, 0x02, 0x03, 0x03, 0x00, 0x72, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; -let sampledConsonantFlags = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0xD3, 0xBB, 0x7C, 0x95, 0x01, 0x02, 0x03, 0x03, 0x00, 0x72, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; // - -let frequencyData = [//tab45056 |tab451356 |tab45216 +// +let frequencyData = [ +//tab45056 |tab451356 |tab45216 // freq1 | freq2 | freq3 -0x000000 | 0x000000 | 0x000000, // ' *' 00 -0x000013 | 0x004300 | 0x5B0000, // '.*' 01 -0x000013 | 0x004300 | 0x5B0000, // '?*' 02 -0x000013 | 0x004300 | 0x5B0000, // ',*' 03 -0x000013 | 0x004300 | 0x5B0000, // '-*' 04 -0x00000A | 0x005400 | 0x6E0000, // 'IY' 05 -0x00000E | 0x004900 | 0x5D0000, // 'IH' 06 -0x000013 | 0x004300 | 0x5B0000, // 'EH' 07 -0x000018 | 0x003F00 | 0x580000, // 'AE' 08 -0x00001B | 0x002800 | 0x590000, // 'AA' 09 -0x000017 | 0x002C00 | 0x570000, // 'AH' 10 -0x000015 | 0x001F00 | 0x580000, // 'AO' 11 -0x000010 | 0x002500 | 0x520000, // 'UH' 12 -0x000014 | 0x002D00 | 0x590000, // 'AX' 13 -0x00000E | 0x004900 | 0x5D0000, // 'IX' 14 -0x000012 | 0x003100 | 0x3E0000, // 'ER' 15 -0x00000E | 0x002400 | 0x520000, // 'UX' 16 -0x000012 | 0x001E00 | 0x580000, // 'OH' 17 -0x000012 | 0x003300 | 0x3E0000, // 'RX' 18 -0x000010 | 0x002500 | 0x6E0000, // 'LX' 19 -0x00000D | 0x001D00 | 0x500000, // 'WX' 20 -0x00000F | 0x004500 | 0x5D0000, // 'YX' 21 -0x00000B | 0x001800 | 0x5A0000, // 'WH' 22 -0x000012 | 0x003200 | 0x3C0000, // 'R*' 23 -0x00000E | 0x001E00 | 0x6E0000, // 'L*' 24 -0x00000B | 0x001800 | 0x5A0000, // 'W*' 25 -0x000009 | 0x005300 | 0x6E0000, // 'Y*' 26 -0x000006 | 0x002E00 | 0x510000, // 'M*' 27 -0x000006 | 0x003600 | 0x790000, // 'N*' 28 -0x000006 | 0x005600 | 0x650000, // 'NX' 29 -0x000006 | 0x003600 | 0x790000, // 'DX' 30 -0x000011 | 0x004300 | 0x5B0000, // 'Q*' 31 -0x000006 | 0x004900 | 0x630000, // 'S*' 32 -0x000006 | 0x004F00 | 0x6A0000, // 'SH' 33 -0x000006 | 0x001A00 | 0x510000, // 'F*' 34 -0x000006 | 0x004200 | 0x790000, // 'TH' 35 -0x00000E | 0x004900 | 0x5D0000, // '/H' 36 -0x000010 | 0x002500 | 0x520000, // '/X' 37 -0x000009 | 0x003300 | 0x5D0000, // 'Z*' 38 -0x00000A | 0x004200 | 0x670000, // 'ZH' 39 -0x000008 | 0x002800 | 0x4C0000, // 'V*' 40 -0x00000A | 0x002F00 | 0x5D0000, // 'DH' 41 -0x000006 | 0x004F00 | 0x650000, // 'CH' 42 -0x000006 | 0x004F00 | 0x650000, // '**' 43 -0x000006 | 0x004200 | 0x790000, // 'J*' 44 -0x000005 | 0x004F00 | 0x650000, // '**' 45 -0x000006 | 0x006E00 | 0x790000, // '**' 46 -0x000000 | 0x000000 | 0x000000, // '**' 47 -0x000013 | 0x004800 | 0x5A0000, // 'EY' 48 -0x00001B | 0x002700 | 0x580000, // 'AY' 49 -0x000015 | 0x001F00 | 0x580000, // 'OY' 50 -0x00001B | 0x002B00 | 0x580000, // 'AW' 51 -0x000012 | 0x001E00 | 0x580000, // 'OW' 52 -0x00000D | 0x002200 | 0x520000, // 'UW' 53 -0x000006 | 0x001A00 | 0x510000, // 'B*' 54 -0x000006 | 0x001A00 | 0x510000, // '**' 55 -0x000006 | 0x001A00 | 0x510000, // '**' 56 -0x000006 | 0x004200 | 0x790000, // 'D*' 57 -0x000006 | 0x004200 | 0x790000, // '**' 58 -0x000006 | 0x004200 | 0x790000, // '**' 59 -0x000006 | 0x006E00 | 0x700000, // 'G*' 60 -0x000006 | 0x006E00 | 0x6E0000, // '**' 61 -0x000006 | 0x006E00 | 0x6E0000, // '**' 62 -0x000006 | 0x005400 | 0x5E0000, // 'GX' 63 -0x000006 | 0x005400 | 0x5E0000, // '**' 64 -0x000006 | 0x005400 | 0x5E0000, // '**' 65 -0x000006 | 0x001A00 | 0x510000, // 'P*' 66 -0x000006 | 0x001A00 | 0x510000, // '**' 67 -0x000006 | 0x001A00 | 0x510000, // '**' 68 -0x000006 | 0x004200 | 0x790000, // 'T*' 69 -0x000006 | 0x004200 | 0x790000, // '**' 70 -0x000006 | 0x004200 | 0x790000, // '**' 71 -0x000006 | 0x006D00 | 0x650000, // 'K*' 72 -0x00000A | 0x005600 | 0x650000, // '**' 73 -0x00000A | 0x006D00 | 0x700000, // '**' 74 -0x000006 | 0x005400 | 0x5E0000, // 'KX' 75 -0x000006 | 0x005400 | 0x5E0000, // '**' 76 -0x000006 | 0x005400 | 0x5E0000, // '**' 77 -0x00002C | 0x007F00 | 0x080000, // 'UL' 78 +0x000000 | 0x000000 | 0x000000, +// ' *' 00 +0x000013 | 0x004300 | 0x5B0000, +// '.*' 01 +0x000013 | 0x004300 | 0x5B0000, +// '?*' 02 +0x000013 | 0x004300 | 0x5B0000, +// ',*' 03 +0x000013 | 0x004300 | 0x5B0000, +// '-*' 04 +0x00000A | 0x005400 | 0x6E0000, +// 'IY' 05 +0x00000E | 0x004900 | 0x5D0000, +// 'IH' 06 +0x000013 | 0x004300 | 0x5B0000, +// 'EH' 07 +0x000018 | 0x003F00 | 0x580000, +// 'AE' 08 +0x00001B | 0x002800 | 0x590000, +// 'AA' 09 +0x000017 | 0x002C00 | 0x570000, +// 'AH' 10 +0x000015 | 0x001F00 | 0x580000, +// 'AO' 11 +0x000010 | 0x002500 | 0x520000, +// 'UH' 12 +0x000014 | 0x002D00 | 0x590000, +// 'AX' 13 +0x00000E | 0x004900 | 0x5D0000, +// 'IX' 14 +0x000012 | 0x003100 | 0x3E0000, +// 'ER' 15 +0x00000E | 0x002400 | 0x520000, +// 'UX' 16 +0x000012 | 0x001E00 | 0x580000, +// 'OH' 17 +0x000012 | 0x003300 | 0x3E0000, +// 'RX' 18 +0x000010 | 0x002500 | 0x6E0000, +// 'LX' 19 +0x00000D | 0x001D00 | 0x500000, +// 'WX' 20 +0x00000F | 0x004500 | 0x5D0000, +// 'YX' 21 +0x00000B | 0x001800 | 0x5A0000, +// 'WH' 22 +0x000012 | 0x003200 | 0x3C0000, +// 'R*' 23 +0x00000E | 0x001E00 | 0x6E0000, +// 'L*' 24 +0x00000B | 0x001800 | 0x5A0000, +// 'W*' 25 +0x000009 | 0x005300 | 0x6E0000, +// 'Y*' 26 +0x000006 | 0x002E00 | 0x510000, +// 'M*' 27 +0x000006 | 0x003600 | 0x790000, +// 'N*' 28 +0x000006 | 0x005600 | 0x650000, +// 'NX' 29 +0x000006 | 0x003600 | 0x790000, +// 'DX' 30 +0x000011 | 0x004300 | 0x5B0000, +// 'Q*' 31 +0x000006 | 0x004900 | 0x630000, +// 'S*' 32 +0x000006 | 0x004F00 | 0x6A0000, +// 'SH' 33 +0x000006 | 0x001A00 | 0x510000, +// 'F*' 34 +0x000006 | 0x004200 | 0x790000, +// 'TH' 35 +0x00000E | 0x004900 | 0x5D0000, +// '/H' 36 +0x000010 | 0x002500 | 0x520000, +// '/X' 37 +0x000009 | 0x003300 | 0x5D0000, +// 'Z*' 38 +0x00000A | 0x004200 | 0x670000, +// 'ZH' 39 +0x000008 | 0x002800 | 0x4C0000, +// 'V*' 40 +0x00000A | 0x002F00 | 0x5D0000, +// 'DH' 41 +0x000006 | 0x004F00 | 0x650000, +// 'CH' 42 +0x000006 | 0x004F00 | 0x650000, +// '**' 43 +0x000006 | 0x004200 | 0x790000, +// 'J*' 44 +0x000005 | 0x004F00 | 0x650000, +// '**' 45 +0x000006 | 0x006E00 | 0x790000, +// '**' 46 +0x000000 | 0x000000 | 0x000000, +// '**' 47 +0x000013 | 0x004800 | 0x5A0000, +// 'EY' 48 +0x00001B | 0x002700 | 0x580000, +// 'AY' 49 +0x000015 | 0x001F00 | 0x580000, +// 'OY' 50 +0x00001B | 0x002B00 | 0x580000, +// 'AW' 51 +0x000012 | 0x001E00 | 0x580000, +// 'OW' 52 +0x00000D | 0x002200 | 0x520000, +// 'UW' 53 +0x000006 | 0x001A00 | 0x510000, +// 'B*' 54 +0x000006 | 0x001A00 | 0x510000, +// '**' 55 +0x000006 | 0x001A00 | 0x510000, +// '**' 56 +0x000006 | 0x004200 | 0x790000, +// 'D*' 57 +0x000006 | 0x004200 | 0x790000, +// '**' 58 +0x000006 | 0x004200 | 0x790000, +// '**' 59 +0x000006 | 0x006E00 | 0x700000, +// 'G*' 60 +0x000006 | 0x006E00 | 0x6E0000, +// '**' 61 +0x000006 | 0x006E00 | 0x6E0000, +// '**' 62 +0x000006 | 0x005400 | 0x5E0000, +// 'GX' 63 +0x000006 | 0x005400 | 0x5E0000, +// '**' 64 +0x000006 | 0x005400 | 0x5E0000, +// '**' 65 +0x000006 | 0x001A00 | 0x510000, +// 'P*' 66 +0x000006 | 0x001A00 | 0x510000, +// '**' 67 +0x000006 | 0x001A00 | 0x510000, +// '**' 68 +0x000006 | 0x004200 | 0x790000, +// 'T*' 69 +0x000006 | 0x004200 | 0x790000, +// '**' 70 +0x000006 | 0x004200 | 0x790000, +// '**' 71 +0x000006 | 0x006D00 | 0x650000, +// 'K*' 72 +0x00000A | 0x005600 | 0x650000, +// '**' 73 +0x00000A | 0x006D00 | 0x700000, +// '**' 74 +0x000006 | 0x005400 | 0x5E0000, +// 'KX' 75 +0x000006 | 0x005400 | 0x5E0000, +// '**' 76 +0x000006 | 0x005400 | 0x5E0000, +// '**' 77 +0x00002C | 0x007F00 | 0x080000, +// 'UL' 78 0x000013 | 0x007F00 | 0x010000 // 'UM' 79 ]; + /** * * ampl1data[X] = ampldata[X] & 0xFF; // F1 amplitude * ampl2data[X] = (ampldata[X] >> 8) & 0xFF; // F2 amplitude * ampl3data[X] = (ampldata[X] >> 16) & 0xFF; // F3 amplitude */ - -let ampldata = [// ampl1 | ampl2 | ampl3 -0x000000 | 0x000000 | 0x000000, // ' *' 00 -0x000000 | 0x000000 | 0x000000, // '.*' 01 -0x000000 | 0x000000 | 0x000000, // '?*' 02 -0x000000 | 0x000000 | 0x000000, // ',*' 03 -0x000000 | 0x000000 | 0x000000, // '-*' 04 -0x00000D | 0x000A00 | 0x080000, // 'IY' 05 -0x00000D | 0x000B00 | 0x070000, // 'IH' 06 -0x00000E | 0x000D00 | 0x080000, // 'EH' 07 -0x00000F | 0x000E00 | 0x080000, // 'AE' 08 -0x00000F | 0x000D00 | 0x010000, // 'AA' 09 -0x00000F | 0x000C00 | 0x010000, // 'AH' 10 -0x00000F | 0x000C00 | 0x000000, // 'AO' 11 -0x00000F | 0x000B00 | 0x010000, // 'UH' 12 -0x00000C | 0x000900 | 0x000000, // 'AX' 13 -0x00000D | 0x000B00 | 0x070000, // 'IX' 14 -0x00000C | 0x000B00 | 0x050000, // 'ER' 15 -0x00000F | 0x000C00 | 0x010000, // 'UX' 16 -0x00000F | 0x000C00 | 0x000000, // 'OH' 17 -0x00000D | 0x000C00 | 0x060000, // 'RX' 18 -0x00000D | 0x000800 | 0x010000, // 'LX' 19 -0x00000D | 0x000800 | 0x000000, // 'WX' 20 -0x00000E | 0x000C00 | 0x070000, // 'YX' 21 -0x00000D | 0x000800 | 0x000000, // 'WH' 22 -0x00000C | 0x000A00 | 0x050000, // 'R*' 23 -0x00000D | 0x000800 | 0x010000, // 'L*' 24 -0x00000D | 0x000800 | 0x000000, // 'W*' 25 -0x00000D | 0x000A00 | 0x080000, // 'Y*' 26 -0x00000C | 0x000300 | 0x000000, // 'M*' 27 -0x000009 | 0x000900 | 0x000000, // 'N*' 28 -0x000009 | 0x000600 | 0x030000, // 'NX' 29 -0x000000 | 0x000000 | 0x000000, // 'DX' 30 -0x000000 | 0x000000 | 0x000000, // 'Q*' 31 -0x000000 | 0x000000 | 0x000000, // 'S*' 32 -0x000000 | 0x000000 | 0x000000, // 'SH' 33 -0x000000 | 0x000000 | 0x000000, // 'F*' 34 -0x000000 | 0x000000 | 0x000000, // 'TH' 35 -0x000000 | 0x000000 | 0x000000, // '/H' 36 -0x000000 | 0x000000 | 0x000000, // '/X' 37 -0x00000B | 0x000300 | 0x000000, // 'Z*' 38 -0x00000B | 0x000500 | 0x010000, // 'ZH' 39 -0x00000B | 0x000300 | 0x000000, // 'V*' 40 -0x00000B | 0x000400 | 0x000000, // 'DH' 41 -0x000000 | 0x000000 | 0x000000, // 'CH' 42 -0x000000 | 0x000000 | 0x000000, // '**' 43 -0x000001 | 0x000000 | 0x000000, // 'J*' 44 -0x00000B | 0x000500 | 0x010000, // '**' 45 -0x000000 | 0x000A00 | 0x0E0000, // '**' 46 -0x000002 | 0x000200 | 0x010000, // '**' 47 -0x00000E | 0x000E00 | 0x090000, // 'EY' 48 -0x00000F | 0x000D00 | 0x010000, // 'AY' 49 -0x00000F | 0x000C00 | 0x000000, // 'OY' 50 -0x00000F | 0x000D00 | 0x010000, // 'AW' 51 -0x00000F | 0x000C00 | 0x000000, // 'OW' 52 -0x00000D | 0x000800 | 0x000000, // 'UW' 53 -0x000002 | 0x000000 | 0x000000, // 'B*' 54 -0x000004 | 0x000100 | 0x000000, // '**' 55 -0x000000 | 0x000000 | 0x000000, // '**' 56 -0x000002 | 0x000000 | 0x000000, // 'D*' 57 -0x000004 | 0x000100 | 0x000000, // '**' 58 -0x000000 | 0x000000 | 0x000000, // '**' 59 -0x000001 | 0x000000 | 0x000000, // 'G*' 60 -0x000004 | 0x000100 | 0x000000, // '**' 61 -0x000000 | 0x000000 | 0x000000, // '**' 62 -0x000001 | 0x000000 | 0x000000, // 'GX' 63 -0x000004 | 0x000100 | 0x000000, // '**' 64 -0x000000 | 0x000000 | 0x000000, // '**' 65 -0x000000 | 0x000000 | 0x000000, // 'P*' 66 -0x000000 | 0x000000 | 0x000000, // '**' 67 -0x000000 | 0x000000 | 0x000000, // '**' 68 -0x000000 | 0x000000 | 0x000000, // 'T*' 69 -0x000000 | 0x000000 | 0x000000, // '**' 70 -0x000000 | 0x000000 | 0x000000, // '**' 71 -0x000000 | 0x000000 | 0x000000, // 'K*' 72 -0x00000C | 0x000A00 | 0x070000, // '**' 73 -0x000000 | 0x000000 | 0x000000, // '**' 74 -0x000000 | 0x000000 | 0x000000, // 'KX' 75 -0x000000 | 0x000A00 | 0x050000, // '**' 76 -0x000000 | 0x000000 | 0x000000, // '**' 77 -0x00000F | 0x000000 | 0x130000, // 'UL' 78 +let ampldata = [ +// ampl1 | ampl2 | ampl3 +0x000000 | 0x000000 | 0x000000, +// ' *' 00 +0x000000 | 0x000000 | 0x000000, +// '.*' 01 +0x000000 | 0x000000 | 0x000000, +// '?*' 02 +0x000000 | 0x000000 | 0x000000, +// ',*' 03 +0x000000 | 0x000000 | 0x000000, +// '-*' 04 +0x00000D | 0x000A00 | 0x080000, +// 'IY' 05 +0x00000D | 0x000B00 | 0x070000, +// 'IH' 06 +0x00000E | 0x000D00 | 0x080000, +// 'EH' 07 +0x00000F | 0x000E00 | 0x080000, +// 'AE' 08 +0x00000F | 0x000D00 | 0x010000, +// 'AA' 09 +0x00000F | 0x000C00 | 0x010000, +// 'AH' 10 +0x00000F | 0x000C00 | 0x000000, +// 'AO' 11 +0x00000F | 0x000B00 | 0x010000, +// 'UH' 12 +0x00000C | 0x000900 | 0x000000, +// 'AX' 13 +0x00000D | 0x000B00 | 0x070000, +// 'IX' 14 +0x00000C | 0x000B00 | 0x050000, +// 'ER' 15 +0x00000F | 0x000C00 | 0x010000, +// 'UX' 16 +0x00000F | 0x000C00 | 0x000000, +// 'OH' 17 +0x00000D | 0x000C00 | 0x060000, +// 'RX' 18 +0x00000D | 0x000800 | 0x010000, +// 'LX' 19 +0x00000D | 0x000800 | 0x000000, +// 'WX' 20 +0x00000E | 0x000C00 | 0x070000, +// 'YX' 21 +0x00000D | 0x000800 | 0x000000, +// 'WH' 22 +0x00000C | 0x000A00 | 0x050000, +// 'R*' 23 +0x00000D | 0x000800 | 0x010000, +// 'L*' 24 +0x00000D | 0x000800 | 0x000000, +// 'W*' 25 +0x00000D | 0x000A00 | 0x080000, +// 'Y*' 26 +0x00000C | 0x000300 | 0x000000, +// 'M*' 27 +0x000009 | 0x000900 | 0x000000, +// 'N*' 28 +0x000009 | 0x000600 | 0x030000, +// 'NX' 29 +0x000000 | 0x000000 | 0x000000, +// 'DX' 30 +0x000000 | 0x000000 | 0x000000, +// 'Q*' 31 +0x000000 | 0x000000 | 0x000000, +// 'S*' 32 +0x000000 | 0x000000 | 0x000000, +// 'SH' 33 +0x000000 | 0x000000 | 0x000000, +// 'F*' 34 +0x000000 | 0x000000 | 0x000000, +// 'TH' 35 +0x000000 | 0x000000 | 0x000000, +// '/H' 36 +0x000000 | 0x000000 | 0x000000, +// '/X' 37 +0x00000B | 0x000300 | 0x000000, +// 'Z*' 38 +0x00000B | 0x000500 | 0x010000, +// 'ZH' 39 +0x00000B | 0x000300 | 0x000000, +// 'V*' 40 +0x00000B | 0x000400 | 0x000000, +// 'DH' 41 +0x000000 | 0x000000 | 0x000000, +// 'CH' 42 +0x000000 | 0x000000 | 0x000000, +// '**' 43 +0x000001 | 0x000000 | 0x000000, +// 'J*' 44 +0x00000B | 0x000500 | 0x010000, +// '**' 45 +0x000000 | 0x000A00 | 0x0E0000, +// '**' 46 +0x000002 | 0x000200 | 0x010000, +// '**' 47 +0x00000E | 0x000E00 | 0x090000, +// 'EY' 48 +0x00000F | 0x000D00 | 0x010000, +// 'AY' 49 +0x00000F | 0x000C00 | 0x000000, +// 'OY' 50 +0x00000F | 0x000D00 | 0x010000, +// 'AW' 51 +0x00000F | 0x000C00 | 0x000000, +// 'OW' 52 +0x00000D | 0x000800 | 0x000000, +// 'UW' 53 +0x000002 | 0x000000 | 0x000000, +// 'B*' 54 +0x000004 | 0x000100 | 0x000000, +// '**' 55 +0x000000 | 0x000000 | 0x000000, +// '**' 56 +0x000002 | 0x000000 | 0x000000, +// 'D*' 57 +0x000004 | 0x000100 | 0x000000, +// '**' 58 +0x000000 | 0x000000 | 0x000000, +// '**' 59 +0x000001 | 0x000000 | 0x000000, +// 'G*' 60 +0x000004 | 0x000100 | 0x000000, +// '**' 61 +0x000000 | 0x000000 | 0x000000, +// '**' 62 +0x000001 | 0x000000 | 0x000000, +// 'GX' 63 +0x000004 | 0x000100 | 0x000000, +// '**' 64 +0x000000 | 0x000000 | 0x000000, +// '**' 65 +0x000000 | 0x000000 | 0x000000, +// 'P*' 66 +0x000000 | 0x000000 | 0x000000, +// '**' 67 +0x000000 | 0x000000 | 0x000000, +// '**' 68 +0x000000 | 0x000000 | 0x000000, +// 'T*' 69 +0x000000 | 0x000000 | 0x000000, +// '**' 70 +0x000000 | 0x000000 | 0x000000, +// '**' 71 +0x000000 | 0x000000 | 0x000000, +// 'K*' 72 +0x00000C | 0x000A00 | 0x070000, +// '**' 73 +0x000000 | 0x000000 | 0x000000, +// '**' 74 +0x000000 | 0x000000 | 0x000000, +// 'KX' 75 +0x000000 | 0x000A00 | 0x050000, +// '**' 76 +0x000000 | 0x000000 | 0x000000, +// '**' 77 +0x00000F | 0x000000 | 0x130000, +// 'UL' 78 0x00000F | 0x000000 | 0x100000 // 'UM' 79 -]; // Sampled data for consonants, consisting of five 256-byte sections - -let sampleTable = [//00 T', S, Z (coronal) -0x38, 0x84, 0x6B, 0x19, 0xC6, 0x63, 0x18, 0x86, 0x73, 0x98, 0xC6, 0xB1, 0x1C, 0xCA, 0x31, 0x8C, 0xC7, 0x31, 0x88, 0xC2, 0x30, 0x98, 0x46, 0x31, 0x18, 0xC6, 0x35, 0x0C, 0xCA, 0x31, 0x0C, 0xC6, //20 -0x21, 0x10, 0x24, 0x69, 0x12, 0xC2, 0x31, 0x14, 0xC4, 0x71, 0x08, 0x4A, 0x22, 0x49, 0xAB, 0x6A, 0xA8, 0xAC, 0x49, 0x51, 0x32, 0xD5, 0x52, 0x88, 0x93, 0x6C, 0x94, 0x22, 0x15, 0x54, 0xD2, 0x25, //40 -0x96, 0xD4, 0x50, 0xA5, 0x46, 0x21, 0x08, 0x85, 0x6B, 0x18, 0xC4, 0x63, 0x10, 0xCE, 0x6B, 0x18, 0x8C, 0x71, 0x19, 0x8C, 0x63, 0x35, 0x0C, 0xC6, 0x33, 0x99, 0xCC, 0x6C, 0xB5, 0x4E, 0xA2, 0x99, //60 -0x46, 0x21, 0x28, 0x82, 0x95, 0x2E, 0xE3, 0x30, 0x9C, 0xC5, 0x30, 0x9C, 0xA2, 0xB1, 0x9C, 0x67, 0x31, 0x88, 0x66, 0x59, 0x2C, 0x53, 0x18, 0x84, 0x67, 0x50, 0xCA, 0xE3, 0x0A, 0xAC, 0xAB, 0x30, //80 -0xAC, 0x62, 0x30, 0x8C, 0x63, 0x10, 0x94, 0x62, 0xB1, 0x8C, 0x82, 0x28, 0x96, 0x33, 0x98, 0xD6, 0xB5, 0x4C, 0x62, 0x29, 0xA5, 0x4A, 0xB5, 0x9C, 0xC6, 0x31, 0x14, 0xD6, 0x38, 0x9C, 0x4B, 0xB4, //A0 -0x86, 0x65, 0x18, 0xAE, 0x67, 0x1C, 0xA6, 0x63, 0x19, 0x96, 0x23, 0x19, 0x84, 0x13, 0x08, 0xA6, 0x52, 0xAC, 0xCA, 0x22, 0x89, 0x6E, 0xAB, 0x19, 0x8C, 0x62, 0x34, 0xC4, 0x62, 0x19, 0x86, 0x63, //C0 -0x18, 0xC4, 0x23, 0x58, 0xD6, 0xA3, 0x50, 0x42, 0x54, 0x4A, 0xAD, 0x4A, 0x25, 0x11, 0x6B, 0x64, 0x89, 0x4A, 0x63, 0x39, 0x8A, 0x23, 0x31, 0x2A, 0xEA, 0xA2, 0xA9, 0x44, 0xC5, 0x12, 0xCD, 0x42, //E0 -0x34, 0x8C, 0x62, 0x18, 0x8C, 0x63, 0x11, 0x48, 0x66, 0x31, 0x9D, 0x44, 0x33, 0x1D, 0x46, 0x31, 0x9C, 0xC6, 0xB1, 0x0C, 0xCD, 0x32, 0x88, 0xC4, 0x73, 0x18, 0x86, 0x73, 0x08, 0xD6, 0x63, 0x58, //100 CH', J', SH, ZH (palato-alveolar) -0x07, 0x81, 0xE0, 0xF0, 0x3C, 0x07, 0x87, 0x90, 0x3C, 0x7C, 0x0F, 0xC7, 0xC0, 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x80, 0x80, 0x00, 0x1C, 0x78, 0x70, 0xF1, 0xC7, 0x1F, 0xC0, 0x0C, 0xFE, 0x1C, 0x1F, //120 -0x1F, 0x0E, 0x0A, 0x7A, 0xC0, 0x71, 0xF2, 0x83, 0x8F, 0x03, 0x0F, 0x0F, 0x0C, 0x00, 0x79, 0xF8, 0x61, 0xE0, 0x43, 0x0F, 0x83, 0xE7, 0x18, 0xF9, 0xC1, 0x13, 0xDA, 0xE9, 0x63, 0x8F, 0x0F, 0x83, //140 -0x83, 0x87, 0xC3, 0x1F, 0x3C, 0x70, 0xF0, 0xE1, 0xE1, 0xE3, 0x87, 0xB8, 0x71, 0x0E, 0x20, 0xE3, 0x8D, 0x48, 0x78, 0x1C, 0x93, 0x87, 0x30, 0xE1, 0xC1, 0xC1, 0xE4, 0x78, 0x21, 0x83, 0x83, 0xC3, //160 -0x87, 0x06, 0x39, 0xE5, 0xC3, 0x87, 0x07, 0x0E, 0x1C, 0x1C, 0x70, 0xF4, 0x71, 0x9C, 0x60, 0x36, 0x32, 0xC3, 0x1E, 0x3C, 0xF3, 0x8F, 0x0E, 0x3C, 0x70, 0xE3, 0xC7, 0x8F, 0x0F, 0x0F, 0x0E, 0x3C, //180 -0x78, 0xF0, 0xE3, 0x87, 0x06, 0xF0, 0xE3, 0x07, 0xC1, 0x99, 0x87, 0x0F, 0x18, 0x78, 0x70, 0x70, 0xFC, 0xF3, 0x10, 0xB1, 0x8C, 0x8C, 0x31, 0x7C, 0x70, 0xE1, 0x86, 0x3C, 0x64, 0x6C, 0xB0, 0xE1, //1A0 -0xE3, 0x0F, 0x23, 0x8F, 0x0F, 0x1E, 0x3E, 0x38, 0x3C, 0x38, 0x7B, 0x8F, 0x07, 0x0E, 0x3C, 0xF4, 0x17, 0x1E, 0x3C, 0x78, 0xF2, 0x9E, 0x72, 0x49, 0xE3, 0x25, 0x36, 0x38, 0x58, 0x39, 0xE2, 0xDE, //1C0 -0x3C, 0x78, 0x78, 0xE1, 0xC7, 0x61, 0xE1, 0xE1, 0xB0, 0xF0, 0xF0, 0xC3, 0xC7, 0x0E, 0x38, 0xC0, 0xF0, 0xCE, 0x73, 0x73, 0x18, 0x34, 0xB0, 0xE1, 0xC7, 0x8E, 0x1C, 0x3C, 0xF8, 0x38, 0xF0, 0xE1, //1E0 -0xC1, 0x8B, 0x86, 0x8F, 0x1C, 0x78, 0x70, 0xF0, 0x78, 0xAC, 0xB1, 0x8F, 0x39, 0x31, 0xDB, 0x38, 0x61, 0xC3, 0x0E, 0x0E, 0x38, 0x78, 0x73, 0x17, 0x1E, 0x39, 0x1E, 0x38, 0x64, 0xE1, 0xF1, 0xC1, //200 P', F, V, TH, DH ([labio]dental) -0x4E, 0x0F, 0x40, 0xA2, 0x02, 0xC5, 0x8F, 0x81, 0xA1, 0xFC, 0x12, 0x08, 0x64, 0xE0, 0x3C, 0x22, 0xE0, 0x45, 0x07, 0x8E, 0x0C, 0x32, 0x90, 0xF0, 0x1F, 0x20, 0x49, 0xE0, 0xF8, 0x0C, 0x60, 0xF0, //220 -0x17, 0x1A, 0x41, 0xAA, 0xA4, 0xD0, 0x8D, 0x12, 0x82, 0x1E, 0x1E, 0x03, 0xF8, 0x3E, 0x03, 0x0C, 0x73, 0x80, 0x70, 0x44, 0x26, 0x03, 0x24, 0xE1, 0x3E, 0x04, 0x4E, 0x04, 0x1C, 0xC1, 0x09, 0xCC, //240 -0x9E, 0x90, 0x21, 0x07, 0x90, 0x43, 0x64, 0xC0, 0x0F, 0xC6, 0x90, 0x9C, 0xC1, 0x5B, 0x03, 0xE2, 0x1D, 0x81, 0xE0, 0x5E, 0x1D, 0x03, 0x84, 0xB8, 0x2C, 0x0F, 0x80, 0xB1, 0x83, 0xE0, 0x30, 0x41, //260 -0x1E, 0x43, 0x89, 0x83, 0x50, 0xFC, 0x24, 0x2E, 0x13, 0x83, 0xF1, 0x7C, 0x4C, 0x2C, 0xC9, 0x0D, 0x83, 0xB0, 0xB5, 0x82, 0xE4, 0xE8, 0x06, 0x9C, 0x07, 0xA0, 0x99, 0x1D, 0x07, 0x3E, 0x82, 0x8F, //280 -0x70, 0x30, 0x74, 0x40, 0xCA, 0x10, 0xE4, 0xE8, 0x0F, 0x92, 0x14, 0x3F, 0x06, 0xF8, 0x84, 0x88, 0x43, 0x81, 0x0A, 0x34, 0x39, 0x41, 0xC6, 0xE3, 0x1C, 0x47, 0x03, 0xB0, 0xB8, 0x13, 0x0A, 0xC2, //2A0 -0x64, 0xF8, 0x18, 0xF9, 0x60, 0xB3, 0xC0, 0x65, 0x20, 0x60, 0xA6, 0x8C, 0xC3, 0x81, 0x20, 0x30, 0x26, 0x1E, 0x1C, 0x38, 0xD3, 0x01, 0xB0, 0x26, 0x40, 0xF4, 0x0B, 0xC3, 0x42, 0x1F, 0x85, 0x32, //2C0 -0x26, 0x60, 0x40, 0xC9, 0xCB, 0x01, 0xEC, 0x11, 0x28, 0x40, 0xFA, 0x04, 0x34, 0xE0, 0x70, 0x4C, 0x8C, 0x1D, 0x07, 0x69, 0x03, 0x16, 0xC8, 0x04, 0x23, 0xE8, 0xC6, 0x9A, 0x0B, 0x1A, 0x03, 0xE0, //2E0 -0x76, 0x06, 0x05, 0xCF, 0x1E, 0xBC, 0x58, 0x31, 0x71, 0x66, 0x00, 0xF8, 0x3F, 0x04, 0xFC, 0x0C, 0x74, 0x27, 0x8A, 0x80, 0x71, 0xC2, 0x3A, 0x26, 0x06, 0xC0, 0x1F, 0x05, 0x0F, 0x98, 0x40, 0xAE, //300 /H (palatal) -0x01, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x0E, 0xFE, 0x00, 0x03, 0xDF, 0x80, 0x03, 0xEF, 0x80, 0x1B, 0xF1, 0xC2, 0x00, 0xE7, 0xE0, 0x18, 0xFC, 0xE0, 0x21, 0xFC, 0x80, 0x3C, 0xFC, 0x40, 0x0E, 0x7E, //320 -0x00, 0x3F, 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x3E, 0xF0, 0x07, 0xFC, 0x00, 0x7E, 0x10, 0x3F, 0xFF, 0x00, 0x3F, 0x38, 0x0E, 0x7C, 0x01, 0x87, 0x0C, 0xFC, 0xC7, 0x00, 0x3E, 0x04, //340 -0x0F, 0x3E, 0x1F, 0x0F, 0x0F, 0x1F, 0x0F, 0x02, 0x83, 0x87, 0xCF, 0x03, 0x87, 0x0F, 0x3F, 0xC0, 0x07, 0x9E, 0x60, 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x77, 0xE1, 0xC0, 0xFE, 0xE0, 0xC3, //360 -0xE0, 0x01, 0xDF, 0xF8, 0x03, 0x07, 0x00, 0x7E, 0x70, 0x00, 0x7C, 0x38, 0x18, 0xFE, 0x0C, 0x1E, 0x78, 0x1C, 0x7C, 0x3E, 0x0E, 0x1F, 0x1E, 0x1E, 0x3E, 0x00, 0x7F, 0x83, 0x07, 0xDB, 0x87, 0x83, //380 -0x07, 0xC7, 0x07, 0x10, 0x71, 0xFF, 0x00, 0x3F, 0xE2, 0x01, 0xE0, 0xC1, 0xC3, 0xE1, 0x00, 0x7F, 0xC0, 0x05, 0xF0, 0x20, 0xF8, 0xF0, 0x70, 0xFE, 0x78, 0x79, 0xF8, 0x02, 0x3F, 0x0C, 0x8F, 0x03, //3a0 -0x0F, 0x9F, 0xE0, 0xC1, 0xC7, 0x87, 0x03, 0xC3, 0xC3, 0xB0, 0xE1, 0xE1, 0xC1, 0xE3, 0xE0, 0x71, 0xF0, 0x00, 0xFC, 0x70, 0x7C, 0x0C, 0x3E, 0x38, 0x0E, 0x1C, 0x70, 0xC3, 0xC7, 0x03, 0x81, 0xC1, //3c0 -0xC7, 0xE7, 0x00, 0x0F, 0xC7, 0x87, 0x19, 0x09, 0xEF, 0xC4, 0x33, 0xE0, 0xC1, 0xFC, 0xF8, 0x70, 0xF0, 0x78, 0xF8, 0xF0, 0x61, 0xC7, 0x00, 0x1F, 0xF8, 0x01, 0x7C, 0xF8, 0xF0, 0x78, 0x70, 0x3C, //3e0 -0x7C, 0xCE, 0x0E, 0x21, 0x83, 0xCF, 0x08, 0x07, 0x8F, 0x08, 0xC1, 0x87, 0x8F, 0x80, 0xC7, 0xE3, 0x00, 0x07, 0xF8, 0xE0, 0xEF, 0x00, 0x39, 0xF7, 0x80, 0x0E, 0xF8, 0xE1, 0xE3, 0xF8, 0x21, 0x9F, //400 /X (glottal) -0xC0, 0xFF, 0x03, 0xF8, 0x07, 0xC0, 0x1F, 0xF8, 0xC4, 0x04, 0xFC, 0xC4, 0xC1, 0xBC, 0x87, 0xF0, 0x0F, 0xC0, 0x7F, 0x05, 0xE0, 0x25, 0xEC, 0xC0, 0x3E, 0x84, 0x47, 0xF0, 0x8E, 0x03, 0xF8, 0x03, //420 -0xFB, 0xC0, 0x19, 0xF8, 0x07, 0x9C, 0x0C, 0x17, 0xF8, 0x07, 0xE0, 0x1F, 0xA1, 0xFC, 0x0F, 0xFC, 0x01, 0xF0, 0x3F, 0x00, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0xFD, 0x00, 0xFF, 0x88, 0x0D, 0xF9, 0x01, //440 -0xFF, 0x00, 0x70, 0x07, 0xC0, 0x3E, 0x42, 0xF3, 0x0D, 0xC4, 0x7F, 0x80, 0xFC, 0x07, 0xF0, 0x5E, 0xC0, 0x3F, 0x00, 0x78, 0x3F, 0x81, 0xFF, 0x01, 0xF8, 0x01, 0xC3, 0xE8, 0x0C, 0xE4, 0x64, 0x8F, //460 -0xE4, 0x0F, 0xF0, 0x07, 0xF0, 0xC2, 0x1F, 0x00, 0x7F, 0xC0, 0x6F, 0x80, 0x7E, 0x03, 0xF8, 0x07, 0xF0, 0x3F, 0xC0, 0x78, 0x0F, 0x82, 0x07, 0xFE, 0x22, 0x77, 0x70, 0x02, 0x76, 0x03, 0xFE, 0x00, //480 -0xFE, 0x67, 0x00, 0x7C, 0xC7, 0xF1, 0x8E, 0xC6, 0x3B, 0xE0, 0x3F, 0x84, 0xF3, 0x19, 0xD8, 0x03, 0x99, 0xFC, 0x09, 0xB8, 0x0F, 0xF8, 0x00, 0x9D, 0x24, 0x61, 0xF9, 0x0D, 0x00, 0xFD, 0x03, 0xF0, //4a0 -0x1F, 0x90, 0x3F, 0x01, 0xF8, 0x1F, 0xD0, 0x0F, 0xF8, 0x37, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFA, 0x03, 0xF0, 0x0F, 0x80, 0xFF, 0x01, //4c0 -0xB8, 0x07, 0xF0, 0x01, 0xFC, 0x01, 0xBC, 0x80, 0x13, 0x1E, 0x00, 0x7F, 0xE1, 0x40, 0x7F, 0xA0, 0x7F, 0xB0, 0x00, 0x3F, 0xC0, 0x1F, 0xC0, 0x38, 0x0F, 0xF0, 0x1F, 0x80, 0xFF, 0x01, 0xFC, 0x03, //4e0 +]; + +// Sampled data for consonants, consisting of five 256-byte sections +let sampleTable = [ +//00 T', S, Z (coronal) +0x38, 0x84, 0x6B, 0x19, 0xC6, 0x63, 0x18, 0x86, 0x73, 0x98, 0xC6, 0xB1, 0x1C, 0xCA, 0x31, 0x8C, 0xC7, 0x31, 0x88, 0xC2, 0x30, 0x98, 0x46, 0x31, 0x18, 0xC6, 0x35, 0x0C, 0xCA, 0x31, 0x0C, 0xC6, +//20 +0x21, 0x10, 0x24, 0x69, 0x12, 0xC2, 0x31, 0x14, 0xC4, 0x71, 0x08, 0x4A, 0x22, 0x49, 0xAB, 0x6A, 0xA8, 0xAC, 0x49, 0x51, 0x32, 0xD5, 0x52, 0x88, 0x93, 0x6C, 0x94, 0x22, 0x15, 0x54, 0xD2, 0x25, +//40 +0x96, 0xD4, 0x50, 0xA5, 0x46, 0x21, 0x08, 0x85, 0x6B, 0x18, 0xC4, 0x63, 0x10, 0xCE, 0x6B, 0x18, 0x8C, 0x71, 0x19, 0x8C, 0x63, 0x35, 0x0C, 0xC6, 0x33, 0x99, 0xCC, 0x6C, 0xB5, 0x4E, 0xA2, 0x99, +//60 +0x46, 0x21, 0x28, 0x82, 0x95, 0x2E, 0xE3, 0x30, 0x9C, 0xC5, 0x30, 0x9C, 0xA2, 0xB1, 0x9C, 0x67, 0x31, 0x88, 0x66, 0x59, 0x2C, 0x53, 0x18, 0x84, 0x67, 0x50, 0xCA, 0xE3, 0x0A, 0xAC, 0xAB, 0x30, +//80 +0xAC, 0x62, 0x30, 0x8C, 0x63, 0x10, 0x94, 0x62, 0xB1, 0x8C, 0x82, 0x28, 0x96, 0x33, 0x98, 0xD6, 0xB5, 0x4C, 0x62, 0x29, 0xA5, 0x4A, 0xB5, 0x9C, 0xC6, 0x31, 0x14, 0xD6, 0x38, 0x9C, 0x4B, 0xB4, +//A0 +0x86, 0x65, 0x18, 0xAE, 0x67, 0x1C, 0xA6, 0x63, 0x19, 0x96, 0x23, 0x19, 0x84, 0x13, 0x08, 0xA6, 0x52, 0xAC, 0xCA, 0x22, 0x89, 0x6E, 0xAB, 0x19, 0x8C, 0x62, 0x34, 0xC4, 0x62, 0x19, 0x86, 0x63, +//C0 +0x18, 0xC4, 0x23, 0x58, 0xD6, 0xA3, 0x50, 0x42, 0x54, 0x4A, 0xAD, 0x4A, 0x25, 0x11, 0x6B, 0x64, 0x89, 0x4A, 0x63, 0x39, 0x8A, 0x23, 0x31, 0x2A, 0xEA, 0xA2, 0xA9, 0x44, 0xC5, 0x12, 0xCD, 0x42, +//E0 +0x34, 0x8C, 0x62, 0x18, 0x8C, 0x63, 0x11, 0x48, 0x66, 0x31, 0x9D, 0x44, 0x33, 0x1D, 0x46, 0x31, 0x9C, 0xC6, 0xB1, 0x0C, 0xCD, 0x32, 0x88, 0xC4, 0x73, 0x18, 0x86, 0x73, 0x08, 0xD6, 0x63, 0x58, +//100 CH', J', SH, ZH (palato-alveolar) +0x07, 0x81, 0xE0, 0xF0, 0x3C, 0x07, 0x87, 0x90, 0x3C, 0x7C, 0x0F, 0xC7, 0xC0, 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x80, 0x80, 0x00, 0x1C, 0x78, 0x70, 0xF1, 0xC7, 0x1F, 0xC0, 0x0C, 0xFE, 0x1C, 0x1F, +//120 +0x1F, 0x0E, 0x0A, 0x7A, 0xC0, 0x71, 0xF2, 0x83, 0x8F, 0x03, 0x0F, 0x0F, 0x0C, 0x00, 0x79, 0xF8, 0x61, 0xE0, 0x43, 0x0F, 0x83, 0xE7, 0x18, 0xF9, 0xC1, 0x13, 0xDA, 0xE9, 0x63, 0x8F, 0x0F, 0x83, +//140 +0x83, 0x87, 0xC3, 0x1F, 0x3C, 0x70, 0xF0, 0xE1, 0xE1, 0xE3, 0x87, 0xB8, 0x71, 0x0E, 0x20, 0xE3, 0x8D, 0x48, 0x78, 0x1C, 0x93, 0x87, 0x30, 0xE1, 0xC1, 0xC1, 0xE4, 0x78, 0x21, 0x83, 0x83, 0xC3, +//160 +0x87, 0x06, 0x39, 0xE5, 0xC3, 0x87, 0x07, 0x0E, 0x1C, 0x1C, 0x70, 0xF4, 0x71, 0x9C, 0x60, 0x36, 0x32, 0xC3, 0x1E, 0x3C, 0xF3, 0x8F, 0x0E, 0x3C, 0x70, 0xE3, 0xC7, 0x8F, 0x0F, 0x0F, 0x0E, 0x3C, +//180 +0x78, 0xF0, 0xE3, 0x87, 0x06, 0xF0, 0xE3, 0x07, 0xC1, 0x99, 0x87, 0x0F, 0x18, 0x78, 0x70, 0x70, 0xFC, 0xF3, 0x10, 0xB1, 0x8C, 0x8C, 0x31, 0x7C, 0x70, 0xE1, 0x86, 0x3C, 0x64, 0x6C, 0xB0, 0xE1, +//1A0 +0xE3, 0x0F, 0x23, 0x8F, 0x0F, 0x1E, 0x3E, 0x38, 0x3C, 0x38, 0x7B, 0x8F, 0x07, 0x0E, 0x3C, 0xF4, 0x17, 0x1E, 0x3C, 0x78, 0xF2, 0x9E, 0x72, 0x49, 0xE3, 0x25, 0x36, 0x38, 0x58, 0x39, 0xE2, 0xDE, +//1C0 +0x3C, 0x78, 0x78, 0xE1, 0xC7, 0x61, 0xE1, 0xE1, 0xB0, 0xF0, 0xF0, 0xC3, 0xC7, 0x0E, 0x38, 0xC0, 0xF0, 0xCE, 0x73, 0x73, 0x18, 0x34, 0xB0, 0xE1, 0xC7, 0x8E, 0x1C, 0x3C, 0xF8, 0x38, 0xF0, 0xE1, +//1E0 +0xC1, 0x8B, 0x86, 0x8F, 0x1C, 0x78, 0x70, 0xF0, 0x78, 0xAC, 0xB1, 0x8F, 0x39, 0x31, 0xDB, 0x38, 0x61, 0xC3, 0x0E, 0x0E, 0x38, 0x78, 0x73, 0x17, 0x1E, 0x39, 0x1E, 0x38, 0x64, 0xE1, 0xF1, 0xC1, +//200 P', F, V, TH, DH ([labio]dental) +0x4E, 0x0F, 0x40, 0xA2, 0x02, 0xC5, 0x8F, 0x81, 0xA1, 0xFC, 0x12, 0x08, 0x64, 0xE0, 0x3C, 0x22, 0xE0, 0x45, 0x07, 0x8E, 0x0C, 0x32, 0x90, 0xF0, 0x1F, 0x20, 0x49, 0xE0, 0xF8, 0x0C, 0x60, 0xF0, +//220 +0x17, 0x1A, 0x41, 0xAA, 0xA4, 0xD0, 0x8D, 0x12, 0x82, 0x1E, 0x1E, 0x03, 0xF8, 0x3E, 0x03, 0x0C, 0x73, 0x80, 0x70, 0x44, 0x26, 0x03, 0x24, 0xE1, 0x3E, 0x04, 0x4E, 0x04, 0x1C, 0xC1, 0x09, 0xCC, +//240 +0x9E, 0x90, 0x21, 0x07, 0x90, 0x43, 0x64, 0xC0, 0x0F, 0xC6, 0x90, 0x9C, 0xC1, 0x5B, 0x03, 0xE2, 0x1D, 0x81, 0xE0, 0x5E, 0x1D, 0x03, 0x84, 0xB8, 0x2C, 0x0F, 0x80, 0xB1, 0x83, 0xE0, 0x30, 0x41, +//260 +0x1E, 0x43, 0x89, 0x83, 0x50, 0xFC, 0x24, 0x2E, 0x13, 0x83, 0xF1, 0x7C, 0x4C, 0x2C, 0xC9, 0x0D, 0x83, 0xB0, 0xB5, 0x82, 0xE4, 0xE8, 0x06, 0x9C, 0x07, 0xA0, 0x99, 0x1D, 0x07, 0x3E, 0x82, 0x8F, +//280 +0x70, 0x30, 0x74, 0x40, 0xCA, 0x10, 0xE4, 0xE8, 0x0F, 0x92, 0x14, 0x3F, 0x06, 0xF8, 0x84, 0x88, 0x43, 0x81, 0x0A, 0x34, 0x39, 0x41, 0xC6, 0xE3, 0x1C, 0x47, 0x03, 0xB0, 0xB8, 0x13, 0x0A, 0xC2, +//2A0 +0x64, 0xF8, 0x18, 0xF9, 0x60, 0xB3, 0xC0, 0x65, 0x20, 0x60, 0xA6, 0x8C, 0xC3, 0x81, 0x20, 0x30, 0x26, 0x1E, 0x1C, 0x38, 0xD3, 0x01, 0xB0, 0x26, 0x40, 0xF4, 0x0B, 0xC3, 0x42, 0x1F, 0x85, 0x32, +//2C0 +0x26, 0x60, 0x40, 0xC9, 0xCB, 0x01, 0xEC, 0x11, 0x28, 0x40, 0xFA, 0x04, 0x34, 0xE0, 0x70, 0x4C, 0x8C, 0x1D, 0x07, 0x69, 0x03, 0x16, 0xC8, 0x04, 0x23, 0xE8, 0xC6, 0x9A, 0x0B, 0x1A, 0x03, 0xE0, +//2E0 +0x76, 0x06, 0x05, 0xCF, 0x1E, 0xBC, 0x58, 0x31, 0x71, 0x66, 0x00, 0xF8, 0x3F, 0x04, 0xFC, 0x0C, 0x74, 0x27, 0x8A, 0x80, 0x71, 0xC2, 0x3A, 0x26, 0x06, 0xC0, 0x1F, 0x05, 0x0F, 0x98, 0x40, 0xAE, +//300 /H (palatal) +0x01, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x0E, 0xFE, 0x00, 0x03, 0xDF, 0x80, 0x03, 0xEF, 0x80, 0x1B, 0xF1, 0xC2, 0x00, 0xE7, 0xE0, 0x18, 0xFC, 0xE0, 0x21, 0xFC, 0x80, 0x3C, 0xFC, 0x40, 0x0E, 0x7E, +//320 +0x00, 0x3F, 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x3E, 0xF0, 0x07, 0xFC, 0x00, 0x7E, 0x10, 0x3F, 0xFF, 0x00, 0x3F, 0x38, 0x0E, 0x7C, 0x01, 0x87, 0x0C, 0xFC, 0xC7, 0x00, 0x3E, 0x04, +//340 +0x0F, 0x3E, 0x1F, 0x0F, 0x0F, 0x1F, 0x0F, 0x02, 0x83, 0x87, 0xCF, 0x03, 0x87, 0x0F, 0x3F, 0xC0, 0x07, 0x9E, 0x60, 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x77, 0xE1, 0xC0, 0xFE, 0xE0, 0xC3, +//360 +0xE0, 0x01, 0xDF, 0xF8, 0x03, 0x07, 0x00, 0x7E, 0x70, 0x00, 0x7C, 0x38, 0x18, 0xFE, 0x0C, 0x1E, 0x78, 0x1C, 0x7C, 0x3E, 0x0E, 0x1F, 0x1E, 0x1E, 0x3E, 0x00, 0x7F, 0x83, 0x07, 0xDB, 0x87, 0x83, +//380 +0x07, 0xC7, 0x07, 0x10, 0x71, 0xFF, 0x00, 0x3F, 0xE2, 0x01, 0xE0, 0xC1, 0xC3, 0xE1, 0x00, 0x7F, 0xC0, 0x05, 0xF0, 0x20, 0xF8, 0xF0, 0x70, 0xFE, 0x78, 0x79, 0xF8, 0x02, 0x3F, 0x0C, 0x8F, 0x03, +//3a0 +0x0F, 0x9F, 0xE0, 0xC1, 0xC7, 0x87, 0x03, 0xC3, 0xC3, 0xB0, 0xE1, 0xE1, 0xC1, 0xE3, 0xE0, 0x71, 0xF0, 0x00, 0xFC, 0x70, 0x7C, 0x0C, 0x3E, 0x38, 0x0E, 0x1C, 0x70, 0xC3, 0xC7, 0x03, 0x81, 0xC1, +//3c0 +0xC7, 0xE7, 0x00, 0x0F, 0xC7, 0x87, 0x19, 0x09, 0xEF, 0xC4, 0x33, 0xE0, 0xC1, 0xFC, 0xF8, 0x70, 0xF0, 0x78, 0xF8, 0xF0, 0x61, 0xC7, 0x00, 0x1F, 0xF8, 0x01, 0x7C, 0xF8, 0xF0, 0x78, 0x70, 0x3C, +//3e0 +0x7C, 0xCE, 0x0E, 0x21, 0x83, 0xCF, 0x08, 0x07, 0x8F, 0x08, 0xC1, 0x87, 0x8F, 0x80, 0xC7, 0xE3, 0x00, 0x07, 0xF8, 0xE0, 0xEF, 0x00, 0x39, 0xF7, 0x80, 0x0E, 0xF8, 0xE1, 0xE3, 0xF8, 0x21, 0x9F, +//400 /X (glottal) +0xC0, 0xFF, 0x03, 0xF8, 0x07, 0xC0, 0x1F, 0xF8, 0xC4, 0x04, 0xFC, 0xC4, 0xC1, 0xBC, 0x87, 0xF0, 0x0F, 0xC0, 0x7F, 0x05, 0xE0, 0x25, 0xEC, 0xC0, 0x3E, 0x84, 0x47, 0xF0, 0x8E, 0x03, 0xF8, 0x03, +//420 +0xFB, 0xC0, 0x19, 0xF8, 0x07, 0x9C, 0x0C, 0x17, 0xF8, 0x07, 0xE0, 0x1F, 0xA1, 0xFC, 0x0F, 0xFC, 0x01, 0xF0, 0x3F, 0x00, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0xFD, 0x00, 0xFF, 0x88, 0x0D, 0xF9, 0x01, +//440 +0xFF, 0x00, 0x70, 0x07, 0xC0, 0x3E, 0x42, 0xF3, 0x0D, 0xC4, 0x7F, 0x80, 0xFC, 0x07, 0xF0, 0x5E, 0xC0, 0x3F, 0x00, 0x78, 0x3F, 0x81, 0xFF, 0x01, 0xF8, 0x01, 0xC3, 0xE8, 0x0C, 0xE4, 0x64, 0x8F, +//460 +0xE4, 0x0F, 0xF0, 0x07, 0xF0, 0xC2, 0x1F, 0x00, 0x7F, 0xC0, 0x6F, 0x80, 0x7E, 0x03, 0xF8, 0x07, 0xF0, 0x3F, 0xC0, 0x78, 0x0F, 0x82, 0x07, 0xFE, 0x22, 0x77, 0x70, 0x02, 0x76, 0x03, 0xFE, 0x00, +//480 +0xFE, 0x67, 0x00, 0x7C, 0xC7, 0xF1, 0x8E, 0xC6, 0x3B, 0xE0, 0x3F, 0x84, 0xF3, 0x19, 0xD8, 0x03, 0x99, 0xFC, 0x09, 0xB8, 0x0F, 0xF8, 0x00, 0x9D, 0x24, 0x61, 0xF9, 0x0D, 0x00, 0xFD, 0x03, 0xF0, +//4a0 +0x1F, 0x90, 0x3F, 0x01, 0xF8, 0x1F, 0xD0, 0x0F, 0xF8, 0x37, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFA, 0x03, 0xF0, 0x0F, 0x80, 0xFF, 0x01, +//4c0 +0xB8, 0x07, 0xF0, 0x01, 0xFC, 0x01, 0xBC, 0x80, 0x13, 0x1E, 0x00, 0x7F, 0xE1, 0x40, 0x7F, 0xA0, 0x7F, 0xB0, 0x00, 0x3F, 0xC0, 0x1F, 0xC0, 0x38, 0x0F, 0xF0, 0x1F, 0x80, 0xFF, 0x01, 0xFC, 0x03, +//4e0 0xF1, 0x7E, 0x01, 0xFE, 0x01, 0xF0, 0xFF, 0x00, 0x7F, 0xC0, 0x1D, 0x07, 0xF0, 0x0F, 0xC0, 0x7E, 0x06, 0xE0, 0x07, 0xE0, 0x0F, 0xF8, 0x06, 0xC1, 0xFE, 0x01, 0xFC, 0x03, 0xE0, 0x0F, 0x00, 0xFC]; /** @@ -2305,34 +2588,33 @@ let sampleTable = [//00 T', S, Z (coronal) * * @return {Array} */ - let SetMouthThroat = (mouth, throat) => { let trans = (factor, initialFrequency) => { return (factor * initialFrequency >> 8 & 0xFF) << 1; }; - let freqdata = [[], [], []]; frequencyData.map((v, i) => { freqdata[0][i] = v & 0xFF; freqdata[1][i] = v >> 8 & 0xFF; freqdata[2][i] = v >> 16 & 0xFF; - }); // recalculate formant frequencies 5..29 for the mouth (F1) and throat (F2) + }); + // recalculate formant frequencies 5..29 for the mouth (F1) and throat (F2) for (let pos = 5; pos < 30; pos++) { // recalculate mouth frequency - freqdata[0][pos] = trans(mouth, freqdata[0][pos]); // recalculate throat frequency + freqdata[0][pos] = trans(mouth, freqdata[0][pos]); + // recalculate throat frequency freqdata[1][pos] = trans(throat, freqdata[1][pos]); - } // recalculate formant frequencies 48..53 - + } + // recalculate formant frequencies 48..53 for (let pos = 48; pos < 54; pos++) { // recalculate F1 (mouth formant) - freqdata[0][pos] = trans(mouth, freqdata[0][pos]); // recalculate F2 (throat formant) - + freqdata[0][pos] = trans(mouth, freqdata[0][pos]); + // recalculate F2 (throat formant) freqdata[1][pos] = trans(throat, freqdata[1][pos]); } - return freqdata; }; @@ -2378,7 +2660,6 @@ let SetMouthThroat = (mouth, throat) => { * * @return {Number} */ - let CreateTransitions = (pitches, frequency, amplitude, tuples) => { // 0=pitches // 1=frequency1 @@ -2388,64 +2669,58 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { // 5=amplitude2 // 6=amplitude3 let tables = [pitches, frequency[0], frequency[1], frequency[2], amplitude[0], amplitude[1], amplitude[2]]; - let Read = (table, pos) => { { if (table < 0 || table > tables.length - 1) { - throw new Error("Error invalid table in Read: ".concat(table)); + throw new Error(`Error invalid table in Read: ${table}`); } } - return tables[table][pos]; - }; // linearly interpolate values - + }; + // linearly interpolate values let interpolate = (width, table, frame, change) => { let sign = change < 0; let remainder = Math.abs(change) % width; let div = change / width | 0; let error = 0; let pos = width; - while (--pos > 0) { let val = Read(table, frame) + div; error += remainder; - if (error >= width) { // accumulated a whole integer error, so adjust output error -= width; - if (sign) { val--; } else if (val) { // if input is 0, we always leave it alone val++; } - } // Write updated value back to next frame. - + } + // Write updated value back to next frame. { if (table < 0 || table > tables.length - 1) { - throw new Error("Error invalid table in Read: ".concat(table)); + throw new Error(`Error invalid table in Read: ${table}`); } } - tables[table][++frame] = val; val += div; } }; - let outBlendFrames; let inBlendFrames; let boundary = 0; - for (let pos = 0; pos < tuples.length - 1; pos++) { let phoneme = tuples[pos][0]; - let next_phoneme = tuples[pos + 1][0]; // get the ranking of each phoneme + let next_phoneme = tuples[pos + 1][0]; + // get the ranking of each phoneme let next_rank = blendRank[next_phoneme]; - let rank = blendRank[phoneme]; // compare the rank - lower rank value is stronger + let rank = blendRank[phoneme]; + // compare the rank - lower rank value is stronger if (rank === next_rank) { // same rank, so use out blend lengths from each phoneme outBlendFrames = outBlendLength[phoneme]; @@ -2460,7 +2735,6 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { outBlendFrames = outBlendLength[phoneme]; inBlendFrames = inBlendLength[phoneme]; } - boundary += tuples[pos][1]; let trans_end = boundary + inBlendFrames; let trans_start = boundary - outBlendFrames; @@ -2470,13 +2744,13 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { // unlike the other values, the pitches[] interpolates from // the middle of the current phoneme to the middle of the // next phoneme + // half the width of the current and next phoneme let cur_width = tuples[pos][1] >> 1; let next_width = tuples[pos + 1][1] >> 1; - let pitch = pitches[boundary + next_width] - pitches[boundary - cur_width]; // interpolate the values - + let pitch = pitches[boundary + next_width] - pitches[boundary - cur_width]; + // interpolate the values interpolate(cur_width + next_width, 0, trans_start, pitch); - for (let table = 1; table < 7; table++) { // tables: // 0 pitches @@ -2490,14 +2764,15 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { interpolate(trans_length, table, trans_start, value); } } - } // add the length of last phoneme - + } + // add the length of last phoneme return boundary + tuples[tuples.length - 1][1]; }; let RISING_INFLECTION = 255; let FALLING_INFLECTION = 1; + /** CREATE FRAMES * * The length parameter in the list corresponds to the number of frames @@ -2521,7 +2796,6 @@ let FALLING_INFLECTION = 1; * * @return Array */ - let CreateFrames = (pitch, tuples, frequencyData) => { /** * Create a rising or falling inflection 30 frames prior to index X. @@ -2530,78 +2804,62 @@ let CreateFrames = (pitch, tuples, frequencyData) => { let AddInflection = (inflection, pos, pitches) => { // store the location of the punctuation let end = pos; - if (pos < 30) { pos = 0; } else { pos -= 30; } - - let A; // FIXME: Explain this fix better, it's not obvious + let A; + // FIXME: Explain this fix better, it's not obvious // ML : A =, fixes a problem with invalid pitch with '.' - while ((A = pitches[pos]) === 127) { ++pos; } - while (pos !== end) { // add the inflection direction - A += inflection; // set the inflection + A += inflection; + // set the inflection pitches[pos] = A & 0xFF; - - while (++pos !== end && pitches[pos] === 255) { - /* keep looping */ - } + while (++pos !== end && pitches[pos] === 255) {/* keep looping */} } }; - let pitches = []; let frequency = [[], [], []]; let amplitude = [[], [], []]; let sampledConsonantFlag = []; let X = 0; - for (let i = 0; i < tuples.length; i++) { // get the phoneme at the index let phoneme = tuples[i][0]; - if (phoneme === PHONEME_PERIOD) { AddInflection(FALLING_INFLECTION, X, pitches); } else if (phoneme === PHONEME_QUESTION) { AddInflection(RISING_INFLECTION, X, pitches); - } // get the stress amount (more stress = higher pitch) - + } - let phase1 = stressPitch_tab47492[tuples[i][2]]; // get number of frames to write + // get the stress amount (more stress = higher pitch) + let phase1 = stressPitch_tab47492[tuples[i][2]]; + // get number of frames to write // copy from the source to the frames list - for (let frames = tuples[i][1]; frames > 0; frames--) { frequency[0][X] = frequencyData[0][phoneme]; // F1 frequency - frequency[1][X] = frequencyData[1][phoneme]; // F2 frequency - frequency[2][X] = frequencyData[2][phoneme]; // F3 frequency - amplitude[0][X] = ampldata[phoneme] & 0xFF; // F1 amplitude - amplitude[1][X] = ampldata[phoneme] >> 8 & 0xFF; // F2 amplitude - amplitude[2][X] = ampldata[phoneme] >> 16 & 0xFF; // F3 amplitude - sampledConsonantFlag[X] = sampledConsonantFlags[phoneme]; // phoneme data for sampled consonants - pitches[X] = pitch + phase1 & 0xFF; // pitch - X++; } } - return [pitches, frequency, amplitude, sampledConsonantFlag]; }; let PrepareFrames = (phonemes, pitch, mouth, throat, singmode) => { let freqdata = SetMouthThroat(mouth, throat); + /** * RENDER THE PHONEMES IN THE LIST * @@ -2619,7 +2877,6 @@ let PrepareFrames = (phonemes, pitch, mouth, throat, singmode) => { const [pitches, frequency, amplitude, sampledConsonantFlag] = CreateFrames(pitch, phonemes, freqdata); let t = CreateTransitions(pitches, frequency, amplitude, phonemes); - if (!singmode) { /* ASSIGN PITCH CONTOUR * @@ -2633,72 +2890,68 @@ let PrepareFrames = (phonemes, pitch, mouth, throat, singmode) => { pitches[i] -= frequency[0][i] >> 1; } } + /* * RESCALE AMPLITUDE * * Rescale volume from decibels to the linear scale. */ - - let amplitudeRescale = [0x00, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06, 0x08, 0x09, 0x0B, 0x0D, 0x0F]; - for (let i = amplitude[0].length - 1; i >= 0; i--) { amplitude[0][i] = amplitudeRescale[amplitude[0][i]]; amplitude[1][i] = amplitudeRescale[amplitude[1][i]]; amplitude[2][i] = amplitudeRescale[amplitude[2][i]]; } - let result = [t, frequency, pitches, amplitude, sampledConsonantFlag]; - return result; }; let CreateOutputBuffer = buffersize => { let buffer = new Uint8Array(buffersize); let bufferpos = 0; - let oldTimeTableIndex = 0; // Scale by 16 and write five times. - + let oldTimeTableIndex = 0; + // Scale by 16 and write five times. let writer = (index, A) => { let scaled = (A & 15) * 16; writer.ary(index, [scaled, scaled, scaled, scaled, scaled]); - }; // Write the five given values. - - + }; + // Write the five given values. writer.ary = (index, array) => { // timetable for more accurate c64 simulation - let timetable = [[162, 167, 167, 127, 128], // formants synth - [226, 60, 60, 0, 0], // unvoiced sample 0 - [225, 60, 59, 0, 0], // unvoiced sample 1 - [200, 0, 0, 54, 55], // voiced sample 0 + let timetable = [[162, 167, 167, 127, 128], + // formants synth + [226, 60, 60, 0, 0], + // unvoiced sample 0 + [225, 60, 59, 0, 0], + // unvoiced sample 1 + [200, 0, 0, 54, 55], + // voiced sample 0 [199, 0, 0, 54, 54] // voiced sample 1 ]; bufferpos += timetable[oldTimeTableIndex][index]; - if ((bufferpos / 50 | 0) > buffer.length) { { - throw new Error("Buffer overflow, want ".concat(bufferpos / 50 | 0, " but buffersize is only ").concat(buffer.length, "!")); + throw new Error(`Buffer overflow, want ${bufferpos / 50 | 0} but buffersize is only ${buffer.length}!`); } } - - oldTimeTableIndex = index; // write a little bit in advance - + oldTimeTableIndex = index; + // write a little bit in advance for (let k = 0; k < 5; k++) { buffer[(bufferpos / 50 | 0) + k] = array[k]; } }; - writer.get = () => { - return buffer.slice(0, bufferpos / 50 | 0); }; - return writer; }; let RenderSample = (Output, lastSampleOffset, consonantFlag, pitch) => { // mask low three bits and subtract 1 get value to // convert 0 bits on unvoiced samples. - let kind = (consonantFlag & 7) - 1; // determine which value to use from table { 0x18, 0x1A, 0x17, 0x17, 0x17 } + let kind = (consonantFlag & 7) - 1; + + // determine which value to use from table { 0x18, 0x1A, 0x17, 0x17, 0x17 } // T', S, Z 0 0x18 coronal // CH', J', SH, ZH 1 0x1A palato-alveolar // P', F, V, TH, DH 2 0x17 [labio]dental @@ -2706,53 +2959,43 @@ let RenderSample = (Output, lastSampleOffset, consonantFlag, pitch) => { // /X 4 0x17 glottal let samplePage = kind * 256 & 0xFFFF; // unsigned short - let off = consonantFlag & 248; // unsigned char let renderSample = (index1, value1, index0, value0) => { let bit = 8; let sample = sampleTable[samplePage + off]; - do { if ((sample & 128) !== 0) { Output(index1, value1); } else { Output(index0, value0); } - sample <<= 1; } while (--bit); }; - if (off === 0) { // voiced phoneme: Z*, ZH, V*, DH let phase1 = pitch >> 4 ^ 255 & 0xFF; // unsigned char - off = lastSampleOffset & 0xFF; // unsigned char - do { renderSample(3, 26, 4, 6); off++; off &= 0xFF; } while (++phase1 & 0xFF); - return off; - } // unvoiced - - + } + // unvoiced off = off ^ 255 & 0xFF; // unsigned char - let value0 = sampledConsonantValues0[kind] & 0xFF; // unsigned char - do { renderSample(2, 5, 1, value0); } while (++off & 0xFF); - return lastSampleOffset; -}; // Removed sine table stored a pre calculated sine wave but in modern CPU, we can calculate inline. - +}; +// Removed sine table stored a pre calculated sine wave but in modern CPU, we can calculate inline. let sinus = x => Math.sin(2 * Math.PI * (x / 256)) * 127 | 0; + /** * PROCESS THE FRAMES * @@ -2763,8 +3006,6 @@ let sinus = x => Math.sin(2 * Math.PI * (x / 256)) * 127 | 0; * To simulate them being driven by the glottal pulse, the waveforms are * reset at the beginning of each glottal pulse. */ - - let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, sampledConsonantFlag) => { let speedcounter = speed; let phase1 = 0; @@ -2774,13 +3015,13 @@ let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, s let pos = 0; let glottal_pulse = pitches[0]; let mem38 = glottal_pulse * .75 | 0; - while (frameCount) { - let flags = sampledConsonantFlag[pos]; // unvoiced sampled phoneme? + let flags = sampledConsonantFlag[pos]; + // unvoiced sampled phoneme? if ((flags & 248) !== 0) { - lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); // skip ahead two in the phoneme buffer - + lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); + // skip ahead two in the phoneme buffer pos += 2; frameCount -= 2; speedcounter = speed; @@ -2789,104 +3030,66 @@ let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, s // Rectangle wave consisting of: // 0-128 = 0x90 // 128-255 = 0x70 + // simulate the glottal pulse and formants let ary = []; - let - /* unsigned int */ - p1 = phase1 * 256; // Fixed point integers because we need to divide later on - - let - /* unsigned int */ - p2 = phase2 * 256; - let - /* unsigned int */ - p3 = phase3 * 256; - + let /* unsigned int */p1 = phase1 * 256; // Fixed point integers because we need to divide later on + let /* unsigned int */p2 = phase2 * 256; + let /* unsigned int */p3 = phase3 * 256; for (let k = 0; k < 5; k++) { - const - /* signed char */ - sp1 = sinus(0xff & p1 >> 8); - const - /* signed char */ - sp2 = sinus(0xff & p2 >> 8); - const - /* signed char */ - rp3 = (0xff & p3 >> 8) < 129 ? -0x70 : 0x70; - const - /* signed int */ - sin1 = sp1 * ( - /* (unsigned char) */ - amplitude[0][pos] & 0x0F); - const - /* signed int */ - sin2 = sp2 * ( - /* (unsigned char) */ - amplitude[1][pos] & 0x0F); - const - /* signed int */ - rect = rp3 * ( - /* (unsigned char) */ - amplitude[2][pos] & 0x0F); - let - /* signed int */ - mux = sin1 + sin2 + rect; + const /* signed char */sp1 = sinus(0xff & p1 >> 8); + const /* signed char */sp2 = sinus(0xff & p2 >> 8); + const /* signed char */rp3 = (0xff & p3 >> 8) < 129 ? -0x70 : 0x70; + const /* signed int */sin1 = sp1 * ( /* (unsigned char) */amplitude[0][pos] & 0x0F); + const /* signed int */sin2 = sp2 * ( /* (unsigned char) */amplitude[1][pos] & 0x0F); + const /* signed int */rect = rp3 * ( /* (unsigned char) */amplitude[2][pos] & 0x0F); + let /* signed int */mux = sin1 + sin2 + rect; mux /= 32; mux += 128; // Go from signed to unsigned amplitude - ary[k] = mux | 0; p1 += frequency[0][pos] * 256 / 4; // Compromise, this becomes a shift and works well - p2 += frequency[1][pos] * 256 / 4; p3 += frequency[2][pos] * 256 / 4; } - Output.ary(0, ary); } speedcounter--; - if (speedcounter === 0) { pos++; //go to next amplitude // decrement the frame count - frameCount--; - if (frameCount === 0) { return; } - speedcounter = speed; } - glottal_pulse--; - if (glottal_pulse !== 0) { // not finished with a glottal pulse - mem38--; // within the first 75% of the glottal pulse? - // is the count non-zero and the sampled flag is zero? + mem38--; + // within the first 75% of the glottal pulse? + // is the count non-zero and the sampled flag is zero? if (mem38 !== 0 || flags === 0) { // update the phase of the formants // TODO: we should have a switch to disable this, it causes a pretty nice voice without the masking! phase1 = phase1 + frequency[0][pos]; // & 0xFF; - phase2 = phase2 + frequency[1][pos]; // & 0xFF; - phase3 = phase3 + frequency[2][pos]; // & 0xFF; - continue; - } // voiced sampled phonemes interleave the sample with the + } + + // voiced sampled phonemes interleave the sample with the // glottal pulse. The sample flag is non-zero, so render // the sample for the phoneme. - - lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); } } - glottal_pulse = pitches[pos]; - mem38 = glottal_pulse * .75 | 0; // reset the formant wave generators to keep them in - // sync with the glottal pulse + mem38 = glottal_pulse * .75 | 0; + // reset the formant wave generators to keep them in + // sync with the glottal pulse phase1 = 0; phase2 = 0; phase3 = 0; @@ -2903,44 +3106,38 @@ let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, s * * @return Uint8Array */ - let Renderer = (phonemes, pitch, mouth, throat, speed, singmode) => { pitch = pitch === undefined ? 64 : pitch & 0xFF; mouth = mouth === undefined ? 128 : mouth & 0xFF; throat = throat === undefined ? 128 : throat & 0xFF; speed = (speed || 72) & 0xFF; singmode = singmode || false; - let sentences = PrepareFrames(phonemes, pitch, mouth, throat, singmode); // Reserve 176.4*speed samples (=8*speed ms) for each frame. + let sentences = PrepareFrames(phonemes, pitch, mouth, throat, singmode); + // Reserve 176.4*speed samples (=8*speed ms) for each frame. let Output = CreateOutputBuffer(176.4 // = (22050/125) * phonemes.reduce((pre, v) => pre + v[1], 0) // Combined phoneme length in frames. * speed | 0); const [t, frequency, pitches, amplitude, sampledConsonantFlag] = sentences; - { PrintOutput(pitches, frequency, amplitude, sampledConsonantFlag); } - ProcessFrames(Output, t, speed, frequency, pitches, amplitude, sampledConsonantFlag); return Output.get(); }; - let PrintOutput = (pitches, frequency, amplitude, sampledConsonantFlag) => { let pad = num => { let s = '00000' + num; return s.substr(s.length - 5); }; - console.log('==========================================='); console.log('Final data for speech output:'); console.log(' flags ampl1 freq1 ampl2 freq2 ampl3 freq3 pitch'); console.log('------------------------------------------------'); - for (let i = 0; i < sampledConsonantFlag.length; i++) { console.log(' %s %s %s %s %s %s %s %s', pad(sampledConsonantFlag[i]), pad(amplitude[0][i]), pad(frequency[0][i]), pad(amplitude[1][i]), pad(frequency[1][i]), pad(amplitude[2][i]), pad(frequency[2][i]), pad(pitches[i])); i++; } - console.log('==========================================='); }; @@ -2958,16 +3155,14 @@ let PrintOutput = (pitches, frequency, amplitude, sampledConsonantFlag) => { * * @return {Float32Array|Boolean} */ - let SamBuffer = (input, options) => { let buffer = SamProcess(input, options); - if (false === buffer) { return false; } - return Uint8ArrayToFloat32Array(buffer); }; + /** * Process the input and return the audiobuffer. * @@ -2982,21 +3177,19 @@ let SamBuffer = (input, options) => { * * @return {Uint8Array|Boolean} */ - let SamProcess = function (input) { let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; let parsed = Parser(input); - if (false === parsed) { return false; } - return Renderer(parsed, options.pitch, options.mouth, options.throat, options.speed, options.singmode); }; let convert = TextToPhonemes; let buf8 = SamProcess; let buf32 = SamBuffer; + /** * @param {object} [options] * @param {Boolean} [options.phonetic] Default false. @@ -3009,17 +3202,15 @@ let buf32 = SamBuffer; * * @constructor */ - function SamJs(options) { let opts = options || {}; - let ensurePhonetic = (text, phonetic) => { if (!(phonetic || opts.phonetic)) { return convert(text); } - return text.toUpperCase(); }; + /** * Render the passed text as 8bit wave buffer array. * @@ -3028,9 +3219,8 @@ function SamJs(options) { * * @return {Uint8Array|Boolean} */ - - this.buf8 = (text, phonetic) => buf8(ensurePhonetic(text, phonetic), opts); + /** * Render the passed text as 32bit wave buffer array. * @@ -3039,9 +3229,8 @@ function SamJs(options) { * * @return {Float32Array|Boolean} */ - - this.buf32 = (text, phonetic) => buf32(ensurePhonetic(text, phonetic), opts); + /** * Render the passed text as wave buffer and play it over the speakers. * @@ -3050,9 +3239,8 @@ function SamJs(options) { * * @return {Promise} */ - - this.speak = (text, phonetic) => PlayBuffer(this.buf32(text, phonetic)); + /** * Render the passed text as wave buffer and download it via URL API. * @@ -3061,11 +3249,10 @@ function SamJs(options) { * * @return void */ - - this.download = (text, phonetic) => { RenderBuffer(this.buf8(text, phonetic)); }; + /** * Render the passed text as wave buffer array. * @@ -3074,11 +3261,8 @@ function SamJs(options) { * * @return {Uint8Array|false} */ - - this.wav = (text, phonetic) => ToWavBuffer(this.buf8(text, phonetic)); } - SamJs.buf8 = buf8; SamJs.buf32 = buf32; SamJs.convert = convert; diff --git a/dist/samjs.common.min.js b/dist/samjs.common.min.js index a1b6ad5..4dc0fb2 100644 --- a/dist/samjs.common.min.js +++ b/dist/samjs.common.min.js @@ -9,5 +9,5 @@ * * @author 2017 Christian Schiffler */ -"use strict";let l=(H,A)=>0!=(H&A),r=H=>{let E=new Uint8Array(H.length);return H.split("").forEach((H,A)=>{E[A]=H.charCodeAt(0)}),E},t=H=>{let A=new Uint8Array(4);return A[0]=H,A[1]=H>>8,A[2]=H>>16,A[3]=H>>24,A},O=H=>{let A=new Uint8Array(2);return A[0]=H,A[1]=H>>8,A},I=null,R=H=>{let A=new Uint8Array(44+H.length),E=0;var e=H=>{A.set(H,E),E+=H.length};return e(r("RIFF")),e(t(H.length+12+16+8-8)),e(r("WAVE")),e(r("fmt ")),e(t(16)),e(O(1)),e(O(1)),e(t(22050)),e(t(22050)),e(O(1)),e(O(8)),e(r("data")),e(t(H.length)),e(H),A},Y={" ":0,"!":2,'"':2,"#":2,$:2,"%":2,"&":2,"'":130,"(":0,")":0,"*":2,"+":2,",":2,"-":2,".":2,"/":2,0:3,1:3,2:3,3:3,4:3,5:3,6:3,7:3,8:3,9:3,":":2,";":2,"<":2,"=":2,">":2,"?":2,"@":2,A:192,B:168,C:176,D:172,E:192,F:160,G:184,H:160,I:192,J:188,K:160,L:172,M:168,N:172,O:192,P:160,Q:160,R:172,S:180,T:164,U:192,V:168,W:168,X:176,Y:192,Z:188,"[":0,"\\":0,"]":0,"^":2,_:0,"`":32},U=128,n=(H,A)=>0!=(Y[H]&A),N=(H,A,E)=>n(H[A],E),W=(H,A)=>-1!==A.indexOf(H),E=H=>{let A=H.split("="),e=A.pop(),E=A.join("=").split("("),r=E.pop().split(")"),t=E[0],O=r[0],R=r[1],I=["T","C","S"],Y=["E","I","Y"];return(H=(H,A,E)=>{if(H.startsWith(O,A)&&((A,E)=>{for(let H=t.length-1;-1!N(A,--E,U),"#":()=>N(A,--E,64),".":()=>N(A,--E,8),"&":()=>N(A,--E,16)||W(A.substr(--E,2),["CH","SH"]),"@":()=>{if(N(A,--E,4))return!0;var H=A[E];return"H"===H&&!!W(H,I)},"^":()=>N(A,--E,32),"+":()=>W(A[--E],Y),":":()=>{for(;0<=E&&N(A,E-1,32);)E--;return!0}}[e]())return!1}return!0})(H,A)&&((A,E)=>{for(let H=0;H!N(A,++E,U),"#":()=>N(A,++E,64),".":()=>N(A,++E,8),"&":()=>N(A,++E,16)||W(A.substr(++E-2,2),["HC","HS"]),"@":()=>{if(N(A,++E,4))return!0;var H=A[E];return"H"===H&&!!W(H,I)},"^":()=>N(A,++E,32),"+":()=>W(A[++E],Y),":":()=>{for(;N(A,E+1,32);)E++;return!0},"%":()=>"E"!==A[E+1]?"ING"===A.substr(E+1,3)&&(E+=3,!0):N(A,E+2,U)?W(A[E+2],["R","S","D"])?(E+=2,!0):"L"!==A[E+2]?"FUL"===A.substr(E+2,3)&&(E+=4,!0):"Y"===A[E+3]&&(E+=3,!0):(E++,!0)}[e]())return!1}return!0})(H,A+(O.length-1)))return E(e,O.length),!0}).c=O[0],H},S={},T=(" (A.)=EH4Y. |(A) =AH| (ARE) =AAR| (AR)O=AXR|(AR)#=EH4R| ^(AS)#=EY4S|(A)WA=AX|(AW)=AO5| :(ANY)=EH4NIY|(A)^+#=EY5|#:(ALLY)=ULIY| (AL)#=UL|(AGAIN)=AXGEH4N|#:(AG)E=IHJ|(A)^%=EY|(A)^+:#=AE| :(A)^+ =EY4| (ARR)=AXR|(ARR)=AE4R| ^(AR) =AA5R|(AR)=AA5R|(AIR)=EH4R|(AI)=EY4|(AY)=EY5|(AU)=AO4|#:(AL) =UL|#:(ALS) =ULZ|(ALK)=AO4K|(AL)^=AOL| :(ABLE)=EY4BUL|(ABLE)=AXBUL|(A)VO=EY4|(ANG)+=EY4NJ|(ATARI)=AHTAA4RIY|(A)TOM=AE|(A)TTI=AE| (AT) =AET| (A)T=AH|(A)=AE| (B) =BIY4| (BE)^#=BIH|(BEING)=BIY4IHNX| (BOTH) =BOW4TH| (BUS)#=BIH4Z|(BREAK)=BREY5K|(BUIL)=BIH4L|(B)=B| (C) =SIY4| (CH)^=K|^E(CH)=K|(CHA)R#=KEH5|(CH)=CH| S(CI)#=SAY4|(CI)A=SH|(CI)O=SH|(CI)EN=SH|(CITY)=SIHTIY|(C)+=S|(CK)=K|(COMMODORE)=KAA4MAHDOHR|(COM)=KAHM|(CUIT)=KIHT|(CREA)=KRIYEY|(C)=K| (D) =DIY4| (DR.) =DAA4KTER|#:(DED) =DIHD|.E(D) =D|#:^E(D) =T| (DE)^#=DIH| (DO) =DUW| (DOES)=DAHZ|(DONE) =DAH5N|(DOING)=DUW4IHNX| (DOW)=DAW|#(DU)A=JUW|#(DU)^#=JAX|(D)=D| (E) =IYIY4|#:(E) =|':^(E) =| :(E) =IY|#(ED) =D|#:(E)D =|(EV)ER=EH4V|(E)^%=IY4|(ERI)#=IY4RIY|(ERI)=EH4RIH|#:(ER)#=ER|(ERROR)=EH4ROHR|(ERASE)=IHREY5S|(ER)#=EHR|(ER)=ER| (EVEN)=IYVEHN|#:(E)W=|@(EW)=UW|(EW)=YUW|(E)O=IY|#:&(ES) =IHZ|#:(E)S =|#:(ELY) =LIY|#:(EMENT)=MEHNT|(EFUL)=FUHL|(EE)=IY4|(EARN)=ER5N| (EAR)^=ER5|(EAD)=EHD|#:(EA) =IYAX|(EA)SU=EH5|(EA)=IY5|(EIGH)=EY4|(EI)=IY4| (EYE)=AY4|(EY)=IY|(EU)=YUW5|(EQUAL)=IY4KWUL|(E)=EH| (F) =EH4F|(FUL)=FUHL|(FRIEND)=FREH5ND|(FATHER)=FAA4DHER|(F)F=|(F)=F| (G) =JIY4|(GIV)=GIH5V| (G)I^=G|(GE)T=GEH5|SU(GGES)=GJEH4S|(GG)=G| B#(G)=G|(G)+=J|(GREAT)=GREY4T|(GON)E=GAO5N|#(GH)=| (GN)=N|(G)=G| (H) =EY4CH| (HAV)=/HAE6V| (HERE)=/HIYR| (HOUR)=AW5ER|(HOW)=/HAW|(H)#=/H|(H)=| (IN)=IHN| (I) =AY4|(I) =AY|(IN)D=AY5N|SEM(I)=IY| ANT(I)=AY|(IER)=IYER|#:R(IED) =IYD|(IED) =AY5D|(IEN)=IYEHN|(IE)T=AY4EH|(I')=AY5| :(I)^%=AY5| :(IE) =AY4|(I)%=IY|(IE)=IY4| (IDEA)=AYDIY5AH|(I)^+:#=IH|(IR)#=AYR|(IZ)%=AYZ|(IS)%=AYZ|I^(I)^#=IH|+^(I)^+=AY|#:^(I)^+=IH|(I)^+=AY|(IR)=ER|(IGH)=AY4|(ILD)=AY5LD| (IGN)=IHGN|(IGN) =AY4N|(IGN)^=AY4N|(IGN)%=AY4N|(ICRO)=AY4KROH|(IQUE)=IY4K|(I)=IH| (J) =JEY4|(J)=J| (K) =KEY4| (K)N=|(K)=K| (L) =EH4L|(LO)C#=LOW|L(L)=|#:^(L)%=UL|(LEAD)=LIYD| (LAUGH)=LAE4F|(L)=L| (M) =EH4M| (MR.) =MIH4STER| (MS.)=MIH5Z| (MRS.) =MIH4SIXZ|(MOV)=MUW4V|(MACHIN)=MAHSHIY5N|M(M)=|(M)=M| (N) =EH4N|E(NG)+=NJ|(NG)R=NXG|(NG)#=NXG|(NGL)%=NXGUL|(NG)=NX|(NK)=NXK| (NOW) =NAW4|N(N)=|(NON)E=NAH4N|(N)=N| (O) =OH4W|(OF) =AHV| (OH) =OW5|(OROUGH)=ER4OW|#:(OR) =ER|#:(ORS) =ERZ|(OR)=AOR| (ONE)=WAHN|#(ONE) =WAHN|(OW)=OW| (OVER)=OW5VER|PR(O)V=UW4|(OV)=AH4V|(O)^%=OW5|(O)^EN=OW|(O)^I#=OW5|(OL)D=OW4L|(OUGHT)=AO5T|(OUGH)=AH5F| (OU)=AW|H(OU)S#=AW4|(OUS)=AXS|(OUR)=OHR|(OULD)=UH5D|(OU)^L=AH5|(OUP)=UW5P|(OU)=AW|(OY)=OY|(OING)=OW4IHNX|(OI)=OY5|(OOR)=OH5R|(OOK)=UH5K|F(OOD)=UW5D|L(OOD)=AH5D|M(OOD)=UW5D|(OOD)=UH5D|F(OOT)=UH5T|(OO)=UW5|(O')=OH|(O)E=OW|(O) =OW|(OA)=OW4| (ONLY)=OW4NLIY| (ONCE)=WAH4NS|(ON'T)=OW4NT|C(O)N=AA|(O)NG=AO| :^(O)N=AH|I(ON)=UN|#:(ON)=UN|#^(ON)=UN|(O)ST=OW|(OF)^=AO4F|(OTHER)=AH5DHER|R(O)B=RAA|^R(O):#=OW5|(OSS) =AO5S|#:^(OM)=AHM|(O)=AA| (P) =PIY4|(PH)=F|(PEOPL)=PIY5PUL|(POW)=PAW4|(PUT) =PUHT|(P)P=|(P)S=|(P)N=|(PROF.)=PROHFEH4SER|(P)=P| (Q) =KYUW4|(QUAR)=KWOH5R|(QU)=KW|(Q)=K| (R) =AA5R| (RE)^#=RIY|(R)R=|(R)=R| (S) =EH4S|(SH)=SH|#(SION)=ZHUN|(SOME)=SAHM|#(SUR)#=ZHER|(SUR)#=SHER|#(SU)#=ZHUW|#(SSU)#=SHUW|#(SED)=ZD|#(S)#=Z|(SAID)=SEHD|^(SION)=SHUN|(S)S=|.(S) =Z|#:.E(S) =Z|#:^#(S) =S|U(S) =S| :#(S) =Z|##(S) =Z| (SCH)=SK|(S)C+=|#(SM)=ZUM|#(SN)'=ZUM|(STLE)=SUL|(S)=S| (T) =TIY4| (THE) #=DHIY| (THE) =DHAX|(TO) =TUX| (THAT)=DHAET| (THIS) =DHIHS| (THEY)=DHEY| (THERE)=DHEHR|(THER)=DHER|(THEIR)=DHEHR| (THAN) =DHAEN| (THEM) =DHAEN|(THESE) =DHIYZ| (THEN)=DHEHN|(THROUGH)=THRUW4|(THOSE)=DHOHZ|(THOUGH) =DHOW|(TODAY)=TUXDEY|(TOMO)RROW=TUMAA5|(TO)TAL=TOW5| (THUS)=DHAH4S|(TH)=TH|#:(TED)=TIXD|S(TI)#N=CH|(TI)O=SH|(TI)A=SH|(TIEN)=SHUN|(TUR)#=CHER|(TU)A=CHUW| (TWO)=TUW|&(T)EN =|(T)=T| (U) =YUW4| (UN)I=YUWN| (UN)=AHN| (UPON)=AXPAON|@(UR)#=UH4R|(UR)#=YUH4R|(UR)=ER|(U)^ =AH|(U)^^=AH5|(UY)=AY5| G(U)#=|G(U)%=|G(U)#=W|#N(U)=YUW|@(U)=UW|(U)=YUW| (V) =VIY4|(VIEW)=VYUW5|(V)=V| (W) =DAH4BULYUW| (WERE)=WER|(WA)SH=WAA|(WA)ST=WEY|(WA)S=WAH|(WA)T=WAA|(WHERE)=WHEHR|(WHAT)=WHAHT|(WHOL)=/HOWL|(WHO)=/HUW|(WH)=WH|(WAR)#=WEHR|(WAR)=WAOR|(WOR)^=WER|(WR)=R|(WOM)A=WUHM|(WOM)E=WIHM|(WEA)R=WEH|(WANT)=WAA5NT|ANS(WER)=ER|(W)=W| (X) =EH4KR| (X)=Z|(X)=KS| (Y) =WAY4|(YOUNG)=YAHNX| (YOUR)=YOHR| (YOU)=YUW| (YES)=YEHS| (Y)=Y|F(Y)=AY|PS(YCH)=AYK|#:^(Y)=IY|#:^(Y)I=IY| :(Y) =AY| :(Y)#=AY| :(Y)^+:#=IH| :(Y)^#=AY|(Y)=IH| (Z) =ZIY4|(Z)=Z".split("|").map(H=>{var A=(H=E(H)).c;S[A]=S[A]||[],S[A].push(H)}),'(A)=|(!)=.|(") =-AH5NKWOWT-|(")=KWOW4T-|(#)= NAH4MBER|($)= DAA4LER|(%)= PERSEH4NT|(&)= AEND|(\')=|(*)= AE4STERIHSK|(+)= PLAH4S|(,)=,| (-) =-|(-)=|(.)= POYNT|(/)= SLAE4SH|(0)= ZIY4ROW| (1ST)=FER4ST| (10TH)=TEH4NTH|(1)= WAH4N| (2ND)=SEH4KUND|(2)= TUW4| (3RD)=THER4D|(3)= THRIY4|(4)= FOH4R| (5TH)=FIH4FTH|(5)= FAY4V| (64) =SIH4KSTIY FOHR|(6)= SIH4KS|(7)= SEH4VUN| (8TH)=EY4TH|(8)= EY4T|(9)= NAY4N|(:)=.|(;)=.|(<)= LEH4S DHAEN|(=)= IY4KWULZ|(>)= GREY4TER DHAEN|(?)=?|(@)= AE6T|(^)= KAE4RIXT'.split("|").map(E)),f="*12345678".split(""),a=" *.*?*,*-*IYIHEHAEAAAHAOUHAXIXERUXOHRXLXWXYXWHR*L*W*Y*M*N*NXDXQ*S*SHF*TH/H/XZ*ZHV*DHCH**J*******EYAYOYAWOWUWB*****D*****G*****GX****P*****T*****K*****KX****ULUMUN".match(/.{1,2}/g),i=[32768,49408,49408,49408,49408,164,164,164,164,164,164,132,132,164,164,132,132,132,132,132,132,132,68,4164,4164,4164,4164,2124,3148,2124,1096,16460,9280,8256,8256,9280,64,64,9284,8260,8260,9284,8264,8256,76,8260,0,0,180,180,180,148,148,148,78,78,78,1102,1102,1102,78,78,78,78,78,78,75,75,75,1099,1099,1099,75,75,75,75,75,75,128,193,193],D=[0,4626,4626,4626,2056,2824,2312,2824,3592,3851,2822,4108,3082,1541,1541,3595,3082,3594,3082,2825,2056,2055,2825,2567,2310,2056,2054,2055,2055,2055,770,1285,514,514,514,514,514,514,1542,1542,2055,1542,1542,514,2312,1027,513,286,3597,3852,3852,3852,3598,3593,2054,513,514,1797,513,257,1798,513,514,1798,513,514,2056,514,514,1540,514,514,1798,513,1028,1798,257,1028,1479,1535],o=(E,e,r)=>{for(let A=0;A{var H=a.findIndex(H=>H===A+E&&"*"!==H[1]);return-1!==H&&H})(t,O)))A++,e(H);else if(!1!==(H=(A=>{var H=a.findIndex(H=>H===A+"*");return-1!==H&&H})(t)))e(H);else{for(H=f.length;t!==f[H]&&0l(i[H],A),L=128,s=(E,e,r,t)=>{var H=(H,A)=>{switch(H){case 53:u(r(A-1),1024)&&e(A,16);break;case 42:E(A+1,43,t(A));break;case 44:E(A+1,45,t(A))}},A=(H,A)=>{e(H,13),E(H+1,A,t(H))};let O=-1,R;for(;null!==(R=r(++O));)if(0!==R)if(u(R,16))E(O+1,u(R,32)?21:20,t(O)),H(R,O);else if(78===R)A(O,24);else if(79===R)A(O,27);else if(80===R)A(O,28);else if(u(R,L)&&t(O))0===r(O+1)&&null!==(R=r(O+2))&&u(R,L)&&t(O+2)&&E(O+2,31,0);else{var I,Y=0===O?null:r(O-1);if(23===R)switch(Y){case 69:e(O-1,42);break;case 57:e(O-1,44);break;default:u(Y,L)&&e(O,18)}else 24===R&&u(Y,L)?e(O,19):60===Y&&32===R?e(O,38):60===R?(I=r(O+1),u(I,32)||null===I||e(O,63)):(72===R&&(I=r(O+1),u(I,32)&&null!==I||(e(O,75),R=75)),u(R,1)&&32===Y?e(O,R-12):u(R,1)||H(R,O),69!==R&&57!==R||0{for(let H=0;null!==A(H);H++)if(u(A(H),256)){for(var r,t=H;1<--H&&!u(A(H),L););if(0===H)break;for(;H>1)+r+1))}let O=-1,R;for(;null!==(R=A(++O));){let H=O;var I,Y;if(u(R,L))R=A(++H),u(R,64)?(I=null===R?65:i[R],l(I,4)?(Y=e(O),E(O,(Y>>2)+Y+1)):l(I,1)&&(Y=e(O),E(O,Y-(Y>>3)))):18!==R&&19!==R||!u(A(++H),64)||E(O,e(O)-1);else if(u(R,2048))null!==(R=A(++H))&&u(R,2)&&(E(H,6),E(H-1,5));else if(u(R,2)){for(;0===(R=A(++H)););null!==R&&u(R,2)&&(E(H,1+(e(H)>>1)),E(O,1+(e(O)>>1)))}else 0{let e=0;for(var r;null!==(r=H(e));)u(r,64)&&null!==(r=H(e+1))&&u(r,L)&&0!==(r=A(e+1))&&r<128&&E(e,r+1),++e},v=(H,A,E)=>{let e=0;for(var r;null!==(r=H(e));){var t=A(e);E(e,0===t||127>8),e++}},g=(E,H,A)=>{let e=-1;for(var r;null!==(r=E(++e));)if(u(r,2)){if(u(r,1)){let H,A=e;for(;0===(H=E(++A)););if(null!==H&&(u(H,8)||36===H||37===H))continue}H(e+1,r+1,A(e),255&D[r+1]),H(e+2,r+2,A(e),255&D[r+2]),e+=2}},B=[24,26,23,23,23],p=[0,224,230,236,243,249,0,6,12,6],M=[0,31,31,31,31,2,2,2,2,2,2,2,2,2,5,5,2,10,2,8,5,5,11,10,9,8,8,160,8,8,23,31,18,18,18,18,30,30,20,20,20,20,23,23,26,26,29,29,2,2,2,2,2,2,26,29,27,26,29,27,26,29,27,26,29,27,23,29,23,23,29,23,23,29,23,23,29,23,23,23],K=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,2,4,4,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,0,1,0,5,5,5,5,5,4,4,2,0,1,2,0,1,2,0,1,2,0,1,2,0,2,2,0,1,3,0,2,3,0,2,160,160],C=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,4,4,3,3,3,3,3,1,2,3,2,1,3,3,3,3,1,1,3,3,3,2,2,3,2,3,0,0,5,5,5,5,4,4,2,0,2,2,0,3,2,0,4,2,0,3,2,0,2,2,0,2,3,0,3,3,0,3,176,160],V=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,226,211,187,124,149,1,2,3,3,0,114,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,25,0,0,0,0,0,0,0,0,0],b=[0,5980947,5980947,5980947,5980947,7230474,6113550,5980947,5783320,5842971,5712919,5775125,5383440,5844244,6113550,4075794,5383182,5774866,4076306,7218448,5250317,6112527,5904395,3944978,7216654,5904395,7230217,5320198,7943686,6641158,7943686,5980945,6506758,6967046,5315078,7946758,6113550,5383440,6107913,6767114,4990984,6106890,6639366,6639366,7946758,6639365,7958022,0,5916691,5777179,5775125,5778203,5774866,5382669,5315078,5315078,5315078,7946758,7946758,7946758,7368198,7237126,7237126,6181894,6181894,6181894,5315078,5315078,5315078,7946758,7946758,7946758,6647046,6641162,7367946,6181894,6181894,6181894,556844,98067],X=[0,0,0,0,0,526861,461581,527630,527887,68879,68623,3087,68367,2316,461581,330508,68623,3087,396301,67597,2061,461838,2061,330252,67597,2061,526861,780,2313,198153,0,0,0,0,0,0,0,0,779,66827,779,1035,0,0,1,66827,920064,66050,593422,68879,3087,68879,3087,2061,2,260,0,2,260,0,1,260,0,1,260,0,0,0,0,0,0,0,0,461324,0,0,330240,0,1245199,1048591],w=[56,132,107,25,198,99,24,134,115,152,198,177,28,202,49,140,199,49,136,194,48,152,70,49,24,198,53,12,202,49,12,198,33,16,36,105,18,194,49,20,196,113,8,74,34,73,171,106,168,172,73,81,50,213,82,136,147,108,148,34,21,84,210,37,150,212,80,165,70,33,8,133,107,24,196,99,16,206,107,24,140,113,25,140,99,53,12,198,51,153,204,108,181,78,162,153,70,33,40,130,149,46,227,48,156,197,48,156,162,177,156,103,49,136,102,89,44,83,24,132,103,80,202,227,10,172,171,48,172,98,48,140,99,16,148,98,177,140,130,40,150,51,152,214,181,76,98,41,165,74,181,156,198,49,20,214,56,156,75,180,134,101,24,174,103,28,166,99,25,150,35,25,132,19,8,166,82,172,202,34,137,110,171,25,140,98,52,196,98,25,134,99,24,196,35,88,214,163,80,66,84,74,173,74,37,17,107,100,137,74,99,57,138,35,49,42,234,162,169,68,197,18,205,66,52,140,98,24,140,99,17,72,102,49,157,68,51,29,70,49,156,198,177,12,205,50,136,196,115,24,134,115,8,214,99,88,7,129,224,240,60,7,135,144,60,124,15,199,192,192,240,124,30,7,128,128,0,28,120,112,241,199,31,192,12,254,28,31,31,14,10,122,192,113,242,131,143,3,15,15,12,0,121,248,97,224,67,15,131,231,24,249,193,19,218,233,99,143,15,131,131,135,195,31,60,112,240,225,225,227,135,184,113,14,32,227,141,72,120,28,147,135,48,225,193,193,228,120,33,131,131,195,135,6,57,229,195,135,7,14,28,28,112,244,113,156,96,54,50,195,30,60,243,143,14,60,112,227,199,143,15,15,14,60,120,240,227,135,6,240,227,7,193,153,135,15,24,120,112,112,252,243,16,177,140,140,49,124,112,225,134,60,100,108,176,225,227,15,35,143,15,30,62,56,60,56,123,143,7,14,60,244,23,30,60,120,242,158,114,73,227,37,54,56,88,57,226,222,60,120,120,225,199,97,225,225,176,240,240,195,199,14,56,192,240,206,115,115,24,52,176,225,199,142,28,60,248,56,240,225,193,139,134,143,28,120,112,240,120,172,177,143,57,49,219,56,97,195,14,14,56,120,115,23,30,57,30,56,100,225,241,193,78,15,64,162,2,197,143,129,161,252,18,8,100,224,60,34,224,69,7,142,12,50,144,240,31,32,73,224,248,12,96,240,23,26,65,170,164,208,141,18,130,30,30,3,248,62,3,12,115,128,112,68,38,3,36,225,62,4,78,4,28,193,9,204,158,144,33,7,144,67,100,192,15,198,144,156,193,91,3,226,29,129,224,94,29,3,132,184,44,15,128,177,131,224,48,65,30,67,137,131,80,252,36,46,19,131,241,124,76,44,201,13,131,176,181,130,228,232,6,156,7,160,153,29,7,62,130,143,112,48,116,64,202,16,228,232,15,146,20,63,6,248,132,136,67,129,10,52,57,65,198,227,28,71,3,176,184,19,10,194,100,248,24,249,96,179,192,101,32,96,166,140,195,129,32,48,38,30,28,56,211,1,176,38,64,244,11,195,66,31,133,50,38,96,64,201,203,1,236,17,40,64,250,4,52,224,112,76,140,29,7,105,3,22,200,4,35,232,198,154,11,26,3,224,118,6,5,207,30,188,88,49,113,102,0,248,63,4,252,12,116,39,138,128,113,194,58,38,6,192,31,5,15,152,64,174,1,127,192,7,255,0,14,254,0,3,223,128,3,239,128,27,241,194,0,231,224,24,252,224,33,252,128,60,252,64,14,126,0,63,62,0,15,254,0,31,255,0,62,240,7,252,0,126,16,63,255,0,63,56,14,124,1,135,12,252,199,0,62,4,15,62,31,15,15,31,15,2,131,135,207,3,135,15,63,192,7,158,96,63,192,3,254,0,63,224,119,225,192,254,224,195,224,1,223,248,3,7,0,126,112,0,124,56,24,254,12,30,120,28,124,62,14,31,30,30,62,0,127,131,7,219,135,131,7,199,7,16,113,255,0,63,226,1,224,193,195,225,0,127,192,5,240,32,248,240,112,254,120,121,248,2,63,12,143,3,15,159,224,193,199,135,3,195,195,176,225,225,193,227,224,113,240,0,252,112,124,12,62,56,14,28,112,195,199,3,129,193,199,231,0,15,199,135,25,9,239,196,51,224,193,252,248,112,240,120,248,240,97,199,0,31,248,1,124,248,240,120,112,60,124,206,14,33,131,207,8,7,143,8,193,135,143,128,199,227,0,7,248,224,239,0,57,247,128,14,248,225,227,248,33,159,192,255,3,248,7,192,31,248,196,4,252,196,193,188,135,240,15,192,127,5,224,37,236,192,62,132,71,240,142,3,248,3,251,192,25,248,7,156,12,23,248,7,224,31,161,252,15,252,1,240,63,0,254,3,240,31,0,253,0,255,136,13,249,1,255,0,112,7,192,62,66,243,13,196,127,128,252,7,240,94,192,63,0,120,63,129,255,1,248,1,195,232,12,228,100,143,228,15,240,7,240,194,31,0,127,192,111,128,126,3,248,7,240,63,192,120,15,130,7,254,34,119,112,2,118,3,254,0,254,103,0,124,199,241,142,198,59,224,63,132,243,25,216,3,153,252,9,184,15,248,0,157,36,97,249,13,0,253,3,240,31,144,63,1,248,31,208,15,248,55,1,248,7,240,15,192,63,0,254,3,248,15,192,63,0,250,3,240,15,128,255,1,184,7,240,1,252,1,188,128,19,30,0,127,225,64,127,160,127,176,0,63,192,31,192,56,15,240,31,128,255,1,252,3,241,126,1,254,1,240,255,0,127,192,29,7,240,15,192,126,6,224,7,224,15,248,6,193,254,1,252,3,224,15,0,252],m=(H,A,E,e,r)=>{const[t,O,R,I]=((E,e,r)=>{var H=(H,A,E)=>{var e=A;A<30?A=0:A-=30;let r;for(;127===(r=E[A]);)++A;for(;A!==e;)for(r+=H,E[A]=255&r;++A!==e&&255===E[A];);};let t=[],O=[[],[],[]],R=[[],[],[]],I=[],Y=0;for(let A=0;A>8&255,R[2][Y]=X[l]>>16&255,I[Y]=V[l],t[Y]=E+U&255,Y++}return[t,O,R,I]})(A,H,((A,E)=>{var e=(H,A)=>(H*A>>8&255)<<1;let r=[[],[],[]];b.map((H,A)=>{r[0][A]=255&H,r[1][A]=H>>8&255,r[2][A]=H>>16&255});for(let H=5;H<30;H++)r[0][H]=e(A,r[0][H]),r[1][H]=e(E,r[1][H]);for(let H=48;H<54;H++)r[0][H]=e(A,r[0][H]),r[1][H]=e(E,r[1][H]);return r})(E,e));if(A=((A,H,E,e)=>{let Y=[A,H[0],H[1],H[2],E[0],E[1],E[2]],l=(H,A)=>Y[H][A];var r=(A,E,e,H)=>{var r=H<0,t=Math.abs(H)%A,O=H/A|0;let R=0,I=A;for(;0<--I;){let H=l(E,e)+O;(R+=t)>=A&&(R-=A,r?H--:H&&H++),Y[E][++e]=H,H+=O}};let t,O,R=0;for(let H=0;H>1)+(n=e[H+1][1]>>1),0,S,A[R+n]-A[R-N]);for(let H=1;H<7;H++){var f=l(H,W)-l(H,S);r(T,H,S,f)}}}return R+e[e.length-1][1]})(t,O,R,H),!r)for(let H=0;H>1;var Y=[0,1,2,2,2,3,3,4,4,5,6,8,9,11,13,15];for(let H=R[0].length-1;0<=H;H--)R[0][H]=Y[R[0][H]],R[1][H]=Y[R[1][H]],R[2][H]=Y[R[2][H]];return[A,O,t,R,I]},J=H=>{let E=new Uint8Array(H),e=0,r=0,t=(H,A)=>{A=16*(15&A),t.ary(H,[A,A,A,A,A])};return t.ary=(H,A)=>{if(((e+=[[162,167,167,127,128],[226,60,60,0,0],[225,60,59,0,0],[200,0,0,54,55],[199,0,0,54,54]][r][H])/50|0)>E.length)throw new Error;r=H;for(let H=0;H<5;H++)E[(e/50|0)+H]=A[H]},t.get=()=>E.slice(0,e/50|0),t},c=(O,A,H,E)=>{var e=(7&H)-1;let R=256*e&65535,I=248&H;var r=(H,A,E,e)=>{let r=8,t=w[R+I];for(;0!=(128&t)?O(H,A):O(E,e),t<<=1,--r;);};if(0===I){let H=E>>4^255;for(I=255&A;r(3,26,4,6),I++,I&=255,255&++H;);return I}I^=255;for(var t=255&B[e];r(2,5,1,t),255&++I;);return A},d=H=>127*Math.sin(2*Math.PI*(H/256))|0,y=(H,A,E,t,e,O,r)=>{let R=E,I=0,Y=0,l=0,U=0,n=0,N=e[0],W=.75*N|0;for(;A;){var S=r[n];if(0!=(248&S))U=c(H,U,S,e[255&n]),n+=2,A-=2,R=E;else{{let A=[],E=256*I,e=256*Y,r=256*l;for(let H=0;H<5;H++){var T=d(255&E>>8),f=d(255&e>>8),a=(255&r>>8)<129?-112:112,T=(T*(15&O[0][n])+f*(15&O[1][n])+a*(15&O[2][n]))/32+128;A[H]=0|T,E+=256*t[0][n]/4,e+=256*t[1][n]/4,r+=256*t[2][n]/4}H.ary(0,A)}if(0==--R){if(n++,0==--A)return;R=E}if(0!=--N){if(0!=--W||0===S){I+=t[0][n],Y+=t[1][n],l+=t[2][n];continue}U=c(H,U,S,e[255&n])}}N=e[n],W=.75*N|0,I=0,Y=0,l=0}};function e(A){var E=1{if(!H)return!1;var A=H=>H===I.length?null:I[H],E=(A,H,E,e)=>{for(let H=I.length-1;H>=A;H--)I[H+1]=I[H],R[H+1]=t(H),O[H+1]=r(H);I[A]=H,R[A]=0|e,O[A]=E};let r=H=>0|O[H],t=H=>0|R[H];var e=(H,A)=>{R[H]=A};let O=[],R=[],I=[],Y=0;return o(H,H=>{O[Y]=0,R[Y]=0,I[Y++]=H},H=>{O[Y-1]=H}),s(E,(H,A)=>{I[H]=A},A,r),h(A,r,(H,A)=>{O[H]=A}),v(A,r,e),G(A,e,t),g(A,E,r),I.map((H,A)=>H?[H,0|R[A],0|O[A]]:null).filter(H=>H)})(A);if(!1===A)return!1;{r=void 0===(r=E.pitch)?64:255&r,t=void 0===(t=E.mouth)?128:255&t,O=void 0===(O=E.throat)?128:255&O,e=255&(E.speed||72),E=E.singmode||!1;var e,r=m(A,r,t,O,E);let H=J(176.4*A.reduce((H,A)=>H+A[1],0)*e|0);var[t,O,E,A,r]=r;return y(H,t,e,O,E,A,r),H.get()}}let F=H=>{let A=" "+H.toUpperCase(),E=0,e="",r=(H,A)=>{E+=A,e+=H},t=0;for(;EH(A,E,r));else if(0!==Y[O]){if(!n(O,U))return!1;S[O].some(H=>H(A,E,r))}else e+=" ",E++;else e+=".",E++}return e},Z=e,P=(H,A)=>{if(!1===(H=e(H,A)))return!1;{var E=H;let A=new Float32Array(E.length);for(let H=0;HA||E.phonetic?H.toUpperCase():F(H);this.buf8=(H,A)=>Z(e(H,A),E),this.buf32=(H,A)=>P(e(H,A),E),this.speak=(A,H)=>{if(A=this.buf32(A,H),I=null===I?new AudioContext:I){var O=I,R=A;let t,H=new Promise((H,A)=>{let E=O.createBufferSource(),e=O.createBuffer(1,R.length,22050),r=e.getChannelData(0);for(let H=0;H{H(!0)},t=H=>{E.disconnect(),A(H)},E.start(0)});return H.abort=t,H}throw new Error},this.download=(E,e)=>{{E=this.buf8(E,e),e=new Blob([R(E)],{type:"audio/vnd.wave"});let H=window.URL||window.webkitURL,A=(E=H.createObjectURL(e),document.createElement("a"));return A.href=E,A.target="_blank",A.download="sam.wav",document.body.appendChild(A),A.click(),document.body.removeChild(A),void H.revokeObjectURL(E)}},this.wav=(H,A)=>R(this.buf8(H,A))}H.buf8=Z,H.buf32=P,H.convert=F,module.exports=H; +let Y=(H,A)=>0!=(H&A),r=H=>{let E=new Uint8Array(H.length);return H.split("").forEach((H,A)=>{E[A]=H.charCodeAt(0)}),E},t=H=>{var A=new Uint8Array(4);return A[0]=H,A[1]=H>>8,A[2]=H>>16,A[3]=H>>24,A},O=H=>{var A=new Uint8Array(2);return A[0]=H,A[1]=H>>8,A},I=null,R=H=>{let A=new Uint8Array(44+H.length),E=0,e=H=>{A.set(H,E),E+=H.length};return e(r("RIFF")),e(t(H.length+12+16+8-8)),e(r("WAVE")),e(r("fmt ")),e(t(16)),e(O(1)),e(O(1)),e(t(22050)),e(t(22050)),e(O(1)),e(O(8)),e(r("data")),e(t(H.length)),e(H),A},l={" ":0,"!":2,'"':2,"#":2,$:2,"%":2,"&":2,"'":130,"(":0,")":0,"*":2,"+":2,",":2,"-":2,".":2,"/":2,0:3,1:3,2:3,3:3,4:3,5:3,6:3,7:3,8:3,9:3,":":2,";":2,"<":2,"=":2,">":2,"?":2,"@":2,A:192,B:168,C:176,D:172,E:192,F:160,G:184,H:160,I:192,J:188,K:160,L:172,M:168,N:172,O:192,P:160,Q:160,R:172,S:180,T:164,U:192,V:168,W:168,X:176,Y:192,Z:188,"[":0,"\\":0,"]":0,"^":2,_:0,"`":32},U=128,n=(H,A)=>0!=(l[H]&A),N=(H,A,E)=>n(H[A],E),W=(H,A)=>-1!==A.indexOf(H),E=H=>{let A=H.split("="),e=A.pop(),E=A.join("=").split("("),r=E.pop().split(")"),t=E[0],O=r[0],R=r[1],I=["T","C","S"],Y=["E","I","Y"],l=(H,A,E)=>{if(H.startsWith(O,A)&&((A,E)=>{for(let H=t.length-1;-1!N(A,--E,U),"#":()=>N(A,--E,64),".":()=>N(A,--E,8),"&":()=>N(A,--E,16)||W(A.substr(--E,2),["CH","SH"]),"@":()=>{var H;return!!N(A,--E,4)||"H"===(H=A[E])&&!!W(H,I)},"^":()=>N(A,--E,32),"+":()=>W(A[--E],Y),":":()=>{for(;0<=E&&N(A,E-1,32);)E--;return!0}}[e]())return!1}return!0})(H,A)&&((A,E)=>{for(let H=0;H!N(A,++E,U),"#":()=>N(A,++E,64),".":()=>N(A,++E,8),"&":()=>N(A,++E,16)||W(A.substr(++E-2,2),["HC","HS"]),"@":()=>{var H;return!!N(A,++E,4)||"H"===(H=A[E])&&!!W(H,I)},"^":()=>N(A,++E,32),"+":()=>W(A[++E],Y),":":()=>{for(;N(A,E+1,32);)E++;return!0},"%":()=>{if("E"!==A[E+1])return"ING"===A.substr(E+1,3)&&(E+=3,!0);if(N(A,E+2,U)){if(!W(A[E+2],["R","S","D"]))return"L"!==A[E+2]?"FUL"===A.substr(E+2,3)&&(E+=4,!0):"Y"===A[E+3]&&(E+=3,!0);E+=2}else E++;return!0}}[e]())return!1}return!0})(H,A+(O.length-1)))return E(e,O.length),!0};return l.c=O[0],l},S={},T=(" (A.)=EH4Y. |(A) =AH| (ARE) =AAR| (AR)O=AXR|(AR)#=EH4R| ^(AS)#=EY4S|(A)WA=AX|(AW)=AO5| :(ANY)=EH4NIY|(A)^+#=EY5|#:(ALLY)=ULIY| (AL)#=UL|(AGAIN)=AXGEH4N|#:(AG)E=IHJ|(A)^%=EY|(A)^+:#=AE| :(A)^+ =EY4| (ARR)=AXR|(ARR)=AE4R| ^(AR) =AA5R|(AR)=AA5R|(AIR)=EH4R|(AI)=EY4|(AY)=EY5|(AU)=AO4|#:(AL) =UL|#:(ALS) =ULZ|(ALK)=AO4K|(AL)^=AOL| :(ABLE)=EY4BUL|(ABLE)=AXBUL|(A)VO=EY4|(ANG)+=EY4NJ|(ATARI)=AHTAA4RIY|(A)TOM=AE|(A)TTI=AE| (AT) =AET| (A)T=AH|(A)=AE| (B) =BIY4| (BE)^#=BIH|(BEING)=BIY4IHNX| (BOTH) =BOW4TH| (BUS)#=BIH4Z|(BREAK)=BREY5K|(BUIL)=BIH4L|(B)=B| (C) =SIY4| (CH)^=K|^E(CH)=K|(CHA)R#=KEH5|(CH)=CH| S(CI)#=SAY4|(CI)A=SH|(CI)O=SH|(CI)EN=SH|(CITY)=SIHTIY|(C)+=S|(CK)=K|(COMMODORE)=KAA4MAHDOHR|(COM)=KAHM|(CUIT)=KIHT|(CREA)=KRIYEY|(C)=K| (D) =DIY4| (DR.) =DAA4KTER|#:(DED) =DIHD|.E(D) =D|#:^E(D) =T| (DE)^#=DIH| (DO) =DUW| (DOES)=DAHZ|(DONE) =DAH5N|(DOING)=DUW4IHNX| (DOW)=DAW|#(DU)A=JUW|#(DU)^#=JAX|(D)=D| (E) =IYIY4|#:(E) =|':^(E) =| :(E) =IY|#(ED) =D|#:(E)D =|(EV)ER=EH4V|(E)^%=IY4|(ERI)#=IY4RIY|(ERI)=EH4RIH|#:(ER)#=ER|(ERROR)=EH4ROHR|(ERASE)=IHREY5S|(ER)#=EHR|(ER)=ER| (EVEN)=IYVEHN|#:(E)W=|@(EW)=UW|(EW)=YUW|(E)O=IY|#:&(ES) =IHZ|#:(E)S =|#:(ELY) =LIY|#:(EMENT)=MEHNT|(EFUL)=FUHL|(EE)=IY4|(EARN)=ER5N| (EAR)^=ER5|(EAD)=EHD|#:(EA) =IYAX|(EA)SU=EH5|(EA)=IY5|(EIGH)=EY4|(EI)=IY4| (EYE)=AY4|(EY)=IY|(EU)=YUW5|(EQUAL)=IY4KWUL|(E)=EH| (F) =EH4F|(FUL)=FUHL|(FRIEND)=FREH5ND|(FATHER)=FAA4DHER|(F)F=|(F)=F| (G) =JIY4|(GIV)=GIH5V| (G)I^=G|(GE)T=GEH5|SU(GGES)=GJEH4S|(GG)=G| B#(G)=G|(G)+=J|(GREAT)=GREY4T|(GON)E=GAO5N|#(GH)=| (GN)=N|(G)=G| (H) =EY4CH| (HAV)=/HAE6V| (HERE)=/HIYR| (HOUR)=AW5ER|(HOW)=/HAW|(H)#=/H|(H)=| (IN)=IHN| (I) =AY4|(I) =AY|(IN)D=AY5N|SEM(I)=IY| ANT(I)=AY|(IER)=IYER|#:R(IED) =IYD|(IED) =AY5D|(IEN)=IYEHN|(IE)T=AY4EH|(I')=AY5| :(I)^%=AY5| :(IE) =AY4|(I)%=IY|(IE)=IY4| (IDEA)=AYDIY5AH|(I)^+:#=IH|(IR)#=AYR|(IZ)%=AYZ|(IS)%=AYZ|I^(I)^#=IH|+^(I)^+=AY|#:^(I)^+=IH|(I)^+=AY|(IR)=ER|(IGH)=AY4|(ILD)=AY5LD| (IGN)=IHGN|(IGN) =AY4N|(IGN)^=AY4N|(IGN)%=AY4N|(ICRO)=AY4KROH|(IQUE)=IY4K|(I)=IH| (J) =JEY4|(J)=J| (K) =KEY4| (K)N=|(K)=K| (L) =EH4L|(LO)C#=LOW|L(L)=|#:^(L)%=UL|(LEAD)=LIYD| (LAUGH)=LAE4F|(L)=L| (M) =EH4M| (MR.) =MIH4STER| (MS.)=MIH5Z| (MRS.) =MIH4SIXZ|(MOV)=MUW4V|(MACHIN)=MAHSHIY5N|M(M)=|(M)=M| (N) =EH4N|E(NG)+=NJ|(NG)R=NXG|(NG)#=NXG|(NGL)%=NXGUL|(NG)=NX|(NK)=NXK| (NOW) =NAW4|N(N)=|(NON)E=NAH4N|(N)=N| (O) =OH4W|(OF) =AHV| (OH) =OW5|(OROUGH)=ER4OW|#:(OR) =ER|#:(ORS) =ERZ|(OR)=AOR| (ONE)=WAHN|#(ONE) =WAHN|(OW)=OW| (OVER)=OW5VER|PR(O)V=UW4|(OV)=AH4V|(O)^%=OW5|(O)^EN=OW|(O)^I#=OW5|(OL)D=OW4L|(OUGHT)=AO5T|(OUGH)=AH5F| (OU)=AW|H(OU)S#=AW4|(OUS)=AXS|(OUR)=OHR|(OULD)=UH5D|(OU)^L=AH5|(OUP)=UW5P|(OU)=AW|(OY)=OY|(OING)=OW4IHNX|(OI)=OY5|(OOR)=OH5R|(OOK)=UH5K|F(OOD)=UW5D|L(OOD)=AH5D|M(OOD)=UW5D|(OOD)=UH5D|F(OOT)=UH5T|(OO)=UW5|(O')=OH|(O)E=OW|(O) =OW|(OA)=OW4| (ONLY)=OW4NLIY| (ONCE)=WAH4NS|(ON'T)=OW4NT|C(O)N=AA|(O)NG=AO| :^(O)N=AH|I(ON)=UN|#:(ON)=UN|#^(ON)=UN|(O)ST=OW|(OF)^=AO4F|(OTHER)=AH5DHER|R(O)B=RAA|^R(O):#=OW5|(OSS) =AO5S|#:^(OM)=AHM|(O)=AA| (P) =PIY4|(PH)=F|(PEOPL)=PIY5PUL|(POW)=PAW4|(PUT) =PUHT|(P)P=|(P)S=|(P)N=|(PROF.)=PROHFEH4SER|(P)=P| (Q) =KYUW4|(QUAR)=KWOH5R|(QU)=KW|(Q)=K| (R) =AA5R| (RE)^#=RIY|(R)R=|(R)=R| (S) =EH4S|(SH)=SH|#(SION)=ZHUN|(SOME)=SAHM|#(SUR)#=ZHER|(SUR)#=SHER|#(SU)#=ZHUW|#(SSU)#=SHUW|#(SED)=ZD|#(S)#=Z|(SAID)=SEHD|^(SION)=SHUN|(S)S=|.(S) =Z|#:.E(S) =Z|#:^#(S) =S|U(S) =S| :#(S) =Z|##(S) =Z| (SCH)=SK|(S)C+=|#(SM)=ZUM|#(SN)'=ZUM|(STLE)=SUL|(S)=S| (T) =TIY4| (THE) #=DHIY| (THE) =DHAX|(TO) =TUX| (THAT)=DHAET| (THIS) =DHIHS| (THEY)=DHEY| (THERE)=DHEHR|(THER)=DHER|(THEIR)=DHEHR| (THAN) =DHAEN| (THEM) =DHAEN|(THESE) =DHIYZ| (THEN)=DHEHN|(THROUGH)=THRUW4|(THOSE)=DHOHZ|(THOUGH) =DHOW|(TODAY)=TUXDEY|(TOMO)RROW=TUMAA5|(TO)TAL=TOW5| (THUS)=DHAH4S|(TH)=TH|#:(TED)=TIXD|S(TI)#N=CH|(TI)O=SH|(TI)A=SH|(TIEN)=SHUN|(TUR)#=CHER|(TU)A=CHUW| (TWO)=TUW|&(T)EN =|(T)=T| (U) =YUW4| (UN)I=YUWN| (UN)=AHN| (UPON)=AXPAON|@(UR)#=UH4R|(UR)#=YUH4R|(UR)=ER|(U)^ =AH|(U)^^=AH5|(UY)=AY5| G(U)#=|G(U)%=|G(U)#=W|#N(U)=YUW|@(U)=UW|(U)=YUW| (V) =VIY4|(VIEW)=VYUW5|(V)=V| (W) =DAH4BULYUW| (WERE)=WER|(WA)SH=WAA|(WA)ST=WEY|(WA)S=WAH|(WA)T=WAA|(WHERE)=WHEHR|(WHAT)=WHAHT|(WHOL)=/HOWL|(WHO)=/HUW|(WH)=WH|(WAR)#=WEHR|(WAR)=WAOR|(WOR)^=WER|(WR)=R|(WOM)A=WUHM|(WOM)E=WIHM|(WEA)R=WEH|(WANT)=WAA5NT|ANS(WER)=ER|(W)=W| (X) =EH4KR| (X)=Z|(X)=KS| (Y) =WAY4|(YOUNG)=YAHNX| (YOUR)=YOHR| (YOU)=YUW| (YES)=YEHS| (Y)=Y|F(Y)=AY|PS(YCH)=AYK|#:^(Y)=IY|#:^(Y)I=IY| :(Y) =AY| :(Y)#=AY| :(Y)^+:#=IH| :(Y)^#=AY|(Y)=IH| (Z) =ZIY4|(Z)=Z".split("|").map(H=>{var A=(H=E(H)).c;S[A]=S[A]||[],S[A].push(H)}),'(A)=|(!)=.|(") =-AH5NKWOWT-|(")=KWOW4T-|(#)= NAH4MBER|($)= DAA4LER|(%)= PERSEH4NT|(&)= AEND|(\')=|(*)= AE4STERIHSK|(+)= PLAH4S|(,)=,| (-) =-|(-)=|(.)= POYNT|(/)= SLAE4SH|(0)= ZIY4ROW| (1ST)=FER4ST| (10TH)=TEH4NTH|(1)= WAH4N| (2ND)=SEH4KUND|(2)= TUW4| (3RD)=THER4D|(3)= THRIY4|(4)= FOH4R| (5TH)=FIH4FTH|(5)= FAY4V| (64) =SIH4KSTIY FOHR|(6)= SIH4KS|(7)= SEH4VUN| (8TH)=EY4TH|(8)= EY4T|(9)= NAY4N|(:)=.|(;)=.|(<)= LEH4S DHAEN|(=)= IY4KWULZ|(>)= GREY4TER DHAEN|(?)=?|(@)= AE6T|(^)= KAE4RIXT'.split("|").map(E)),f="*12345678".split(""),e=" *.*?*,*-*IYIHEHAEAAAHAOUHAXIXERUXOHRXLXWXYXWHR*L*W*Y*M*N*NXDXQ*S*SHF*TH/H/XZ*ZHV*DHCH**J*******EYAYOYAWOWUWB*****D*****G*****GX****P*****T*****K*****KX****ULUMUN".match(/.{1,2}/g),D=[32768,49408,49408,49408,49408,164,164,164,164,164,164,132,132,164,164,132,132,132,132,132,132,132,68,4164,4164,4164,4164,2124,3148,2124,1096,16460,9280,8256,8256,9280,64,64,9284,8260,8260,9284,8264,8256,76,8260,0,0,180,180,180,148,148,148,78,78,78,1102,1102,1102,78,78,78,78,78,78,75,75,75,1099,1099,1099,75,75,75,75,75,75,128,193,193],i=[0,4626,4626,4626,2056,2824,2312,2824,3592,3851,2822,4108,3082,1541,1541,3595,3082,3594,3082,2825,2056,2055,2825,2567,2310,2056,2054,2055,2055,2055,770,1285,514,514,514,514,514,514,1542,1542,2055,1542,1542,514,2312,1027,513,286,3597,3852,3852,3852,3598,3593,2054,513,514,1797,513,257,1798,513,514,1798,513,514,2056,514,514,1540,514,514,1798,513,1028,1798,257,1028,1479,1535],g=(A,E)=>{var H=e.findIndex(H=>H===A+E&&"*"!==H[1]);return-1!==H&&H},B=A=>{var H=e.findIndex(H=>H===A+"*");return-1!==H&&H},p=(r,t,O)=>{for(let e=0;eY(D[H],A),V=23,b=57,w=69,m=1,J=2,y=8192,k=4096,Q=2048,x=1024,j=256,a=128,u=64,L=32,$=16,_=8,s=4,G=2,h=1,q=(E,e,r,t)=>{let H=(H,A)=>{switch(H){case 53:o(r(A-1),x)&&e(A,16);break;case 42:E(A+1,43,t(A));break;case 44:E(A+1,45,t(A))}},A=(H,A)=>{e(H,13),E(H+1,A,t(H))},O=-1,R;for(;null!==(R=r(++O));)if(0!==R)if(o(R,$))E(O+1,o(R,L)?21:20,t(O)),H(R,O);else if(78===R)A(O,24);else if(79===R)A(O,27);else if(80===R)A(O,28);else if(o(R,a)&&t(O))0===r(O+1)&&null!==(R=r(O+2))&&o(R,a)&&t(O+2)&&E(O+2,31,0);else{var I,Y=0===O?null:r(O-1);if(R===V)switch(Y){case w:e(O-1,42);break;case b:e(O-1,44);break;default:o(Y,a)&&e(O,18)}else 24===R&&o(Y,a)?e(O,19):60===Y&&32===R?e(O,38):60===R?(I=r(O+1),o(I,L)||null===I||e(O,63)):(72===R&&(I=r(O+1),o(I,L)&&null!==I||(e(O,75),R=75)),o(R,h)&&32===Y?e(O,R-12):o(R,h)||H(R,O),69!==R&&57!==R||0{for(let H=0;null!==r(H);H++)if(o(r(H),j)){for(var A,E=H;1<--H&&!o(r(H),a););if(0===H)break;for(;H>1)+A+1))}let R=-1,I;for(;null!==(I=r(++R));){let H=R,A,E,e;if(o(I,a))I=r(++H),o(I,u)?(A=null===I?u|h:D[I],Y(A,s)?(e=O(R),t(R,(e>>2)+e+1)):Y(A,h)&&(E=O(R),t(R,E-(E>>3)))):18!==I&&19!==I||!o(r(++H),u)||t(R,O(R)-1);else if(o(I,Q))null!==(I=r(++H))&&o(I,G)&&(t(H,6),t(H-1,5));else if(o(I,G)){for(;0===(I=r(++H)););null!==I&&o(I,G)&&(t(H,1+(O(H)>>1)),t(R,1+(O(R)>>1)))}else 0{let e=0;for(var r;null!==(r=H(e));)o(r,u)&&null!==(r=H(e+1))&&o(r,a)&&0!==(r=A(e+1))&&r<128&&E(e,r+1),++e},A1=(H,A,E)=>{let e=0;for(var r;null!==(r=H(e));){var t=A(e);E(e,0===t||127>8),e++}},E1=(E,H,A)=>{let e=-1;for(var r;null!==(r=E(++e));)if(o(r,G)){if(o(r,h)){let H,A=e;for(;0===(H=E(++A)););if(null!==H&&(o(H,_)||36===H||37===H))continue}H(e+1,r+1,A(e),255&i[r+1]),H(e+2,r+2,A(e),255&i[r+2]),e+=2}},e1=[24,26,23,23,23],r1=[0,224,230,236,243,249,0,6,12,6],M=[0,31,31,31,31,2,2,2,2,2,2,2,2,2,5,5,2,10,2,8,5,5,11,10,9,8,8,160,8,8,23,31,18,18,18,18,30,30,20,20,20,20,23,23,26,26,29,29,2,2,2,2,2,2,26,29,27,26,29,27,26,29,27,26,29,27,23,29,23,23,29,23,23,29,23,23,29,23,23,23],K=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,2,4,4,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,0,1,0,5,5,5,5,5,4,4,2,0,1,2,0,1,2,0,1,2,0,1,2,0,2,2,0,1,3,0,2,3,0,2,160,160],C=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,4,4,3,3,3,3,3,1,2,3,2,1,3,3,3,3,1,1,3,3,3,2,2,3,2,3,0,0,5,5,5,5,4,4,2,0,2,2,0,3,2,0,4,2,0,3,2,0,2,2,0,2,3,0,3,3,0,3,176,160],t1=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,226,211,187,124,149,1,2,3,3,0,114,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,25,0,0,0,0,0,0,0,0,0],O1=[0,5980947,5980947,5980947,5980947,7230474,6113550,5980947,5783320,5842971,5712919,5775125,5383440,5844244,6113550,4075794,5383182,5774866,4076306,7218448,5250317,6112527,5904395,3944978,7216654,5904395,7230217,5320198,7943686,6641158,7943686,5980945,6506758,6967046,5315078,7946758,6113550,5383440,6107913,6767114,4990984,6106890,6639366,6639366,7946758,6639365,7958022,0,5916691,5777179,5775125,5778203,5774866,5382669,5315078,5315078,5315078,7946758,7946758,7946758,7368198,7237126,7237126,6181894,6181894,6181894,5315078,5315078,5315078,7946758,7946758,7946758,6647046,6641162,7367946,6181894,6181894,6181894,556844,98067],v=[0,0,0,0,0,526861,461581,527630,527887,68879,68623,3087,68367,2316,461581,330508,68623,3087,396301,67597,2061,461838,2061,330252,67597,2061,526861,780,2313,198153,0,0,0,0,0,0,0,0,779,66827,779,1035,0,0,1,66827,920064,66050,593422,68879,3087,68879,3087,2061,2,260,0,2,260,0,1,260,0,1,260,0,0,0,0,0,0,0,0,461324,0,0,330240,0,1245199,1048591],R1=[56,132,107,25,198,99,24,134,115,152,198,177,28,202,49,140,199,49,136,194,48,152,70,49,24,198,53,12,202,49,12,198,33,16,36,105,18,194,49,20,196,113,8,74,34,73,171,106,168,172,73,81,50,213,82,136,147,108,148,34,21,84,210,37,150,212,80,165,70,33,8,133,107,24,196,99,16,206,107,24,140,113,25,140,99,53,12,198,51,153,204,108,181,78,162,153,70,33,40,130,149,46,227,48,156,197,48,156,162,177,156,103,49,136,102,89,44,83,24,132,103,80,202,227,10,172,171,48,172,98,48,140,99,16,148,98,177,140,130,40,150,51,152,214,181,76,98,41,165,74,181,156,198,49,20,214,56,156,75,180,134,101,24,174,103,28,166,99,25,150,35,25,132,19,8,166,82,172,202,34,137,110,171,25,140,98,52,196,98,25,134,99,24,196,35,88,214,163,80,66,84,74,173,74,37,17,107,100,137,74,99,57,138,35,49,42,234,162,169,68,197,18,205,66,52,140,98,24,140,99,17,72,102,49,157,68,51,29,70,49,156,198,177,12,205,50,136,196,115,24,134,115,8,214,99,88,7,129,224,240,60,7,135,144,60,124,15,199,192,192,240,124,30,7,128,128,0,28,120,112,241,199,31,192,12,254,28,31,31,14,10,122,192,113,242,131,143,3,15,15,12,0,121,248,97,224,67,15,131,231,24,249,193,19,218,233,99,143,15,131,131,135,195,31,60,112,240,225,225,227,135,184,113,14,32,227,141,72,120,28,147,135,48,225,193,193,228,120,33,131,131,195,135,6,57,229,195,135,7,14,28,28,112,244,113,156,96,54,50,195,30,60,243,143,14,60,112,227,199,143,15,15,14,60,120,240,227,135,6,240,227,7,193,153,135,15,24,120,112,112,252,243,16,177,140,140,49,124,112,225,134,60,100,108,176,225,227,15,35,143,15,30,62,56,60,56,123,143,7,14,60,244,23,30,60,120,242,158,114,73,227,37,54,56,88,57,226,222,60,120,120,225,199,97,225,225,176,240,240,195,199,14,56,192,240,206,115,115,24,52,176,225,199,142,28,60,248,56,240,225,193,139,134,143,28,120,112,240,120,172,177,143,57,49,219,56,97,195,14,14,56,120,115,23,30,57,30,56,100,225,241,193,78,15,64,162,2,197,143,129,161,252,18,8,100,224,60,34,224,69,7,142,12,50,144,240,31,32,73,224,248,12,96,240,23,26,65,170,164,208,141,18,130,30,30,3,248,62,3,12,115,128,112,68,38,3,36,225,62,4,78,4,28,193,9,204,158,144,33,7,144,67,100,192,15,198,144,156,193,91,3,226,29,129,224,94,29,3,132,184,44,15,128,177,131,224,48,65,30,67,137,131,80,252,36,46,19,131,241,124,76,44,201,13,131,176,181,130,228,232,6,156,7,160,153,29,7,62,130,143,112,48,116,64,202,16,228,232,15,146,20,63,6,248,132,136,67,129,10,52,57,65,198,227,28,71,3,176,184,19,10,194,100,248,24,249,96,179,192,101,32,96,166,140,195,129,32,48,38,30,28,56,211,1,176,38,64,244,11,195,66,31,133,50,38,96,64,201,203,1,236,17,40,64,250,4,52,224,112,76,140,29,7,105,3,22,200,4,35,232,198,154,11,26,3,224,118,6,5,207,30,188,88,49,113,102,0,248,63,4,252,12,116,39,138,128,113,194,58,38,6,192,31,5,15,152,64,174,1,127,192,7,255,0,14,254,0,3,223,128,3,239,128,27,241,194,0,231,224,24,252,224,33,252,128,60,252,64,14,126,0,63,62,0,15,254,0,31,255,0,62,240,7,252,0,126,16,63,255,0,63,56,14,124,1,135,12,252,199,0,62,4,15,62,31,15,15,31,15,2,131,135,207,3,135,15,63,192,7,158,96,63,192,3,254,0,63,224,119,225,192,254,224,195,224,1,223,248,3,7,0,126,112,0,124,56,24,254,12,30,120,28,124,62,14,31,30,30,62,0,127,131,7,219,135,131,7,199,7,16,113,255,0,63,226,1,224,193,195,225,0,127,192,5,240,32,248,240,112,254,120,121,248,2,63,12,143,3,15,159,224,193,199,135,3,195,195,176,225,225,193,227,224,113,240,0,252,112,124,12,62,56,14,28,112,195,199,3,129,193,199,231,0,15,199,135,25,9,239,196,51,224,193,252,248,112,240,120,248,240,97,199,0,31,248,1,124,248,240,120,112,60,124,206,14,33,131,207,8,7,143,8,193,135,143,128,199,227,0,7,248,224,239,0,57,247,128,14,248,225,227,248,33,159,192,255,3,248,7,192,31,248,196,4,252,196,193,188,135,240,15,192,127,5,224,37,236,192,62,132,71,240,142,3,248,3,251,192,25,248,7,156,12,23,248,7,224,31,161,252,15,252,1,240,63,0,254,3,240,31,0,253,0,255,136,13,249,1,255,0,112,7,192,62,66,243,13,196,127,128,252,7,240,94,192,63,0,120,63,129,255,1,248,1,195,232,12,228,100,143,228,15,240,7,240,194,31,0,127,192,111,128,126,3,248,7,240,63,192,120,15,130,7,254,34,119,112,2,118,3,254,0,254,103,0,124,199,241,142,198,59,224,63,132,243,25,216,3,153,252,9,184,15,248,0,157,36,97,249,13,0,253,3,240,31,144,63,1,248,31,208,15,248,55,1,248,7,240,15,192,63,0,254,3,248,15,192,63,0,250,3,240,15,128,255,1,184,7,240,1,252,1,188,128,19,30,0,127,225,64,127,160,127,176,0,63,192,31,192,56,15,240,31,128,255,1,252,3,241,126,1,254,1,240,255,0,127,192,29,7,240,15,192,126,6,224,7,224,15,248,6,193,254,1,252,3,224,15,0,252],I1=(A,E)=>{let e=(H,A)=>(H*A>>8&255)<<1,r=[[],[],[]];O1.map((H,A)=>{r[0][A]=255&H,r[1][A]=H>>8&255,r[2][A]=H>>16&255});for(let H=5;H<30;H++)r[0][H]=e(A,r[0][H]),r[1][H]=e(E,r[1][H]);for(let H=48;H<54;H++)r[0][H]=e(A,r[0][H]),r[1][H]=e(E,r[1][H]);return r},Y1=(A,H,E,e)=>{let Y=[A,H[0],H[1],H[2],E[0],E[1],E[2]],l=(H,A)=>Y[H][A],r=(A,E,e,H)=>{let r=H<0,t=Math.abs(H)%A,O=H/A|0,R=0,I=A;for(;0<--I;){let H=l(E,e)+O;(R+=t)>=A&&(R-=A,r?H--:H&&H++),Y[E][++e]=H,H+=O}},t,O,R=0;for(let H=0;H>1)+(n=e[H+1][1]>>1),0,S,A[R+n]-A[R-N]);for(let H=1;H<7;H++){var f=l(H,W)-l(H,S);r(T,H,S,f)}}}return R+e[e.length-1][1]},l1=255,U1=1,n1=(E,e,r)=>{let H=(H,A,E)=>{var e=A;A<30?A=0:A-=30;let r;for(;127===(r=E[A]);)++A;for(;A!==e;)for(r+=H,E[A]=255&r;++A!==e&&255===E[A];);},t=[],O=[[],[],[]],R=[[],[],[]],I=[],Y=0;for(let A=0;A>8&255,R[2][Y]=v[l]>>16&255,I[Y]=t1[l],t[Y]=E+U&255,Y++}return[t,O,R,I]},N1=(H,A,E,e,r)=>{var E=I1(E,e),[t,O,R,e]=n1(A,H,E),A=Y1(t,O,R,H);if(!r)for(let H=0;H>1;var I=[0,1,2,2,2,3,3,4,4,5,6,8,9,11,13,15];for(let H=R[0].length-1;0<=H;H--)R[0][H]=I[R[0][H]],R[1][H]=I[R[1][H]],R[2][H]=I[R[2][H]];return[A,O,t,R,e]},W1=H=>{let E=new Uint8Array(H),e=0,r=0,t=(H,A)=>{A=16*(15&A),t.ary(H,[A,A,A,A,A])};return t.ary=(H,A)=>{if(((e+=[[162,167,167,127,128],[226,60,60,0,0],[225,60,59,0,0],[200,0,0,54,55],[199,0,0,54,54]][r][H])/50|0)>E.length)throw new Error;r=H;for(let H=0;H<5;H++)E[(e/50|0)+H]=A[H]},t.get=()=>E.slice(0,e/50|0),t},X=(O,A,H,E)=>{let e=(7&H)-1,R=256*e&65535,I=248&H,r=(H,A,E,e)=>{let r=8,t=R1[R+I];for(;0!=(128&t)?O(H,A):O(E,e),t<<=1,--r;);};if(0===I){let H=E>>4^255;for(I=255&A;r(3,26,4,6),I++,I&=255,255&++H;);return I}I^=255;for(var t=255&e1[e];r(2,5,1,t),255&++I;);return A},c=H=>127*Math.sin(2*Math.PI*(H/256))|0,S1=(H,A,E,t,e,O,r)=>{let R=E,I=0,Y=0,l=0,U=0,n=0,N=e[0],W=.75*N|0;for(;A;){var S=r[n];if(0!=(248&S))U=X(H,U,S,e[255&n]),n+=2,A-=2,R=E;else{{let A=[],E=256*I,e=256*Y,r=256*l;for(let H=0;H<5;H++){var T=c(255&E>>8),f=c(255&e>>8),D=(255&r>>8)<129?-112:112,T=(T*(15&O[0][n])+f*(15&O[1][n])+D*(15&O[2][n]))/32+128;A[H]=0|T,E+=256*t[0][n]/4,e+=256*t[1][n]/4,r+=256*t[2][n]/4}H.ary(0,A)}if(0==--R){if(n++,0==--A)return;R=E}if(0!=--N){if(0!=--W||0===S){I+=t[0][n],Y+=t[1][n],l+=t[2][n];continue}U=X(H,U,S,e[255&n])}}N=e[n],W=.75*N|0,I=0,Y=0,l=0}};function d(H){var A,E,e,r,t,O=1{if(!H)return!1;let A=H=>H===I.length?null:I[H],E=(A,H,E,e)=>{for(let H=I.length-1;H>=A;H--)I[H+1]=I[H],R[H+1]=t(H),O[H+1]=r(H);I[A]=H,R[A]=0|e,O[A]=E},r=H=>0|O[H],t=H=>0|R[H],e=(H,A)=>{R[H]=A},O=[],R=[],I=[],Y=0;return p(H,H=>{O[Y]=0,R[Y]=0,I[Y++]=H},H=>{O[Y-1]=H}),q(E,(H,A)=>{I[H]=A},A,r),H1(A,r,(H,A)=>{O[H]=A}),A1(A,r,e),z(A,e,t),E1(A,E,r),I.map((H,A)=>H?[H,0|R[A],0|O[A]]:null).filter(H=>H)})(H);return!1!==H&&(r=void 0===(r=O.pitch)?64:255&r,E=void 0===(E=O.mouth)?128:255&E,e=void 0===(e=O.throat)?128:255&e,A=255&(O.speed||72),O=O.singmode||!1,r=N1(H,r,E,e,O),E=W1(176.4*H.reduce((H,A)=>H+A[1],0)*A|0),[e,O,H,r,t]=r,S1(E,e,A,O,H,r,t),E.get())}let F=H=>{let A=" "+H.toUpperCase(),E=0,e="",r=(H,A)=>{E+=A,e+=H},t=0;for(;EH(A,E,r));else if(0!==l[O]){if(!n(O,U))return!1;S[O].some(H=>H(A,E,r))}else e+=" ",E++;else e+=".",E++}return e},Z=d,P=(H,A)=>{if(!1===(H=d(H,A)))return!1;var E=H,e=new Float32Array(E.length);for(let H=0;HA||E.phonetic?H.toUpperCase():F(H);this.buf8=(H,A)=>Z(e(H,A),E),this.buf32=(H,A)=>P(e(H,A),E),this.speak=(A,H)=>{if(A=this.buf32(A,H),I=null===I?new AudioContext:I){var O=I,R=A;let t,H=new Promise((H,A)=>{let E=O.createBufferSource(),e=O.createBuffer(1,R.length,22050),r=e.getChannelData(0);for(let H=0;H{H(!0)},t=H=>{E.disconnect(),A(H)},E.start(0)});return H.abort=t,H}throw new Error},this.download=(H,A)=>{var E,H=this.buf8(H,A),A=new Blob([R(H)],{type:"audio/vnd.wave"}),A=(H=window.URL||window.webkitURL).createObjectURL(A);(E=document.createElement("a")).href=A,E.target="_blank",E.download="sam.wav",document.body.appendChild(E),E.click(),document.body.removeChild(E),H.revokeObjectURL(A)},this.wav=(H,A)=>R(this.buf8(H,A))}H.buf8=Z,H.buf32=P,H.convert=F,module.exports=H; //# sourceMappingURL=samjs.common.min.js.map \ No newline at end of file diff --git a/dist/samjs.common.min.js.map b/dist/samjs.common.min.js.map index 1ab7497..c6ee3cd 100644 --- a/dist/samjs.common.min.js.map +++ b/dist/samjs.common.min.js.map @@ -1 +1 @@ -{"version":3,"file":"samjs.common.min.js","sources":["0"],"names":["let","matchesBitmask","bits","mask","text2Uint8Array","text","buffer","Uint8Array","length","split","forEach","e","index","charCodeAt","Uint32ToUint8Array","uint32","result","Uint16ToUint8Array","uint16","context","ToWavBuffer","audiobuffer","realbuffer","pos","write","set","charFlags"," ","!","\"","#","$","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","\\","]","^","_","`","FLAG_ALPHA_OR_QUOT","flags","c","flg","flagsAt","isOneOf","list","indexOf","reciterRule","ruleString","splitted","target","pop","source","join","tmp","pre","match","post","TCS","EIY","inputPos","callback","startsWith","rulePos","ruleByte","substr","inputChar","checkPrefix","checkSuffix","rules","rules2","map","rule","r","push","StressTable","PhonemeNameTable","phonemeFlags","combinedPhonemeLengthTable","Parser1","input","addPhoneme","addStress","srcPos","sign1","sign2","findIndex","value","full_match","single_match","Error","phonemeHasFlag","phoneme","flag","FLAG_VOWEL","Parser2","insertPhoneme","setPhoneme","getPhoneme","getStress","handleUW_CH_J","changeAX","position","suffix","priorPhoneme","AdjustLengths","setLength","getLength","loopIndex","FLAG_CONSONANT","CopyStress","setStress","stress","SetPhonemeLength","ProlongPlosiveStopConsonantsCode41240","nextNonEmpty","sampledConsonantValues0","stressPitch_tab47492","blendRank","outBlendLength","inBlendLength","sampledConsonantFlags","frequencyData","ampldata","sampleTable","PrepareFrames","phonemes","pitch","mouth","throat","singmode","pitches","frequency","amplitude","sampledConsonantFlag","tuples","AddInflection","inflection","end","i","phase1","frames","CreateFrames","trans","factor","initialFrequency","freqdata","v","SetMouthThroat","t","tables","Read","table","interpolate","width","frame","change","sign","remainder","Math","abs","div","error","val","outBlendFrames","inBlendFrames","boundary","next_phoneme","next_rank","rank","trans_end","trans_start","trans_length","cur_width","next_width","CreateTransitions","amplitudeRescale","CreateOutputBuffer","buffersize","bufferpos","oldTimeTableIndex","writer","scaled","ary","array","k","get","slice","RenderSample","Output","lastSampleOffset","consonantFlag","kind","samplePage","off","renderSample","index1","value1","index0","value0","bit","sample","sinus","x","sin","PI","ProcessFrames","frameCount","speed","speedcounter","phase2","phase3","glottal_pulse","mem38","p1","p2","p3","sp1","sp2","rp3","mux","SamProcess","options","arguments","undefined","parsed","phonemeindex","stressValue","phonemeLength","filter","Parser","Renderer","sentences","reduce","convert","toUpperCase","output","successCallback","append","inputSkip","currentChar","some","buf8","buf32","Uint8ArrayToFloat32Array","audio","Float32Array","SamJs","opts","ensurePhonetic","phonetic","this","speak","AudioContext","Play","abort","promise","Promise","resolve","reject","createBufferSource","soundBuffer","createBuffer","getChannelData","connect","destination","onended","reason","disconnect","start","download","RenderBuffer","blob","Blob","type","url","window","URL","webkitURL","a","fileURL","createObjectURL","document","createElement","href","body","appendChild","click","removeChild","revokeObjectURL","wav","module","exports"],"mappings":"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EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAQC,EAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,KAASC,EAAc,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,KAASC,EAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAOC,EAAc,CAAC,EAAM,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAgB,QAAgB,QAAiB,QAAiB,QAAiB,QAAgB,QAAgB,QAAiB,QAAgB,QAAgB,QAAiB,QAAgB,QAAiB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAiB,QAAgB,QAAgB,QAAe,QAAgB,QAAiB,QAAgB,QAAgB,QAAiB,QAAgB,QAAiB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,EAAM,QAAiB,QAAgB,QAAgB,QAAiB,QAAgB,QAAgB,QAAe,QAAe,QAAe,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAe,QAAe,QAAe,QAAgB,QAAgB,QAAgB,QAAgB,QAAiB,QAAiB,QAAgB,QAAgB,QAAgB,OAAgB,OAAoBC,EAAS,CAAC,EAAM,EAAM,EAAM,EAAM,EAAM,OAAe,OAAe,OAAe,OAAe,MAAc,MAAc,KAAU,MAAc,KAAU,OAAe,OAAe,MAAc,KAAU,OAAe,MAAc,KAAU,OAAe,KAAU,OAAe,MAAc,KAAU,OAAe,IAAS,KAAS,OAAc,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,IAAS,MAAc,IAAS,KAAU,EAAM,EAAM,EAAM,MAAc,OAAc,MAAY,OAAe,MAAc,KAAU,MAAc,KAAU,KAAU,EAAM,IAAQ,EAAM,EAAM,IAAQ,EAAM,EAAM,IAAQ,EAAM,EAAM,IAAQ,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,OAAe,EAAM,EAAM,OAAc,EAAM,QAAa,SAAkBC,EAAY,CAAC,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,KAQ1sOC,EAAc,CAACC,EAASC,EAAMC,EAAMC,EAAOC,KAAsD,KAAK,CAACC,EAAQC,EAAUC,EAAUC,IAFnE,CAACP,EAAMQ,EAAOb,KAAiB/K,IAAI6L,EAAc,CAACC,EAAWvK,EAAIiK,KAAWxL,IAAI+L,EAAIxK,EAAOA,EAAI,GAAIA,EAAI,EAASA,GAAK,GAAIvB,IAAI4D,EAAE,KAAyB,OAAlBA,EAAE4H,EAAQjK,OAAeA,EAAK,KAAMA,IAAMwK,GAAsC,IAAjCnI,GAAGkI,EAAWN,EAAQjK,GAAO,IAAFqC,IAAcrC,IAAMwK,GAAoB,MAAfP,EAAQjK,OAAgBvB,IAAIwL,EAAQ,GAAOC,EAAU,CAAC,GAAG,GAAG,IAAQC,EAAU,CAAC,GAAG,GAAG,IAAQC,EAAqB,GAAOxG,EAAE,EAAE,IAAInF,IAAIgM,EAAE,EAAEA,EAAEJ,EAAOpL,OAAOwL,IAAI,CAAChM,IAAIiJ,EAAQ2C,EAAOI,GAAG,GAAiKC,GApBjlB,IAoBsbhD,EAA0B4C,EAAhd,EAAif1G,EAAEqG,GApB5d,IAoB8evC,GAA4B4C,EAA5jB,IAA4lB1G,EAAEqG,GAAqBd,EAAqBkB,EAAOI,GAAG,KAAI,IAAIhM,IAAIkM,EAAON,EAAOI,GAAG,GAAU,EAAPE,EAASA,IAAUT,EAAU,GAAGtG,GAAG4F,EAAc,GAAG9B,GAASwC,EAAU,GAAGtG,GAAG4F,EAAc,GAAG9B,GAASwC,EAAU,GAAGtG,GAAG4F,EAAc,GAAG9B,GAASyC,EAAU,GAAGvG,GAAqB,IAAlB6F,EAAS/B,GAAayC,EAAU,GAAGvG,GAAG6F,EAAS/B,IAAU,EAAE,IAAIyC,EAAU,GAAGvG,GAAG6F,EAAS/B,IAAU,GAAG,IAAI0C,EAAqBxG,GAAG2F,EAAsB7B,GAASuC,EAAQrG,GAAGiG,EAAMa,EAAO,IAAI9G,IAAM,MAAO,CAACqG,EAAQC,EAAUC,EAAUC,IAEl7BQ,CAAaf,EAAMD,GAN7J,CAACE,EAAMC,KAAUtL,IAAIoM,EAAM,CAACC,EAAOC,KAA4BD,EAAOC,GAAkB,EAAE,MAAM,EAAGtM,IAAIuM,EAAS,CAAC,GAAG,GAAG,IAAIxB,EAAcnD,IAAI,CAAC4E,EAAER,KAAKO,EAAS,GAAGP,GAAK,IAAFQ,EAAMD,EAAS,GAAGP,GAAGQ,GAAG,EAAE,IAAID,EAAS,GAAGP,GAAGQ,GAAG,GAAG,MAAO,IAAIxM,IAAIuB,EAAI,EAAEA,EAAI,GAAGA,IAAOgL,EAAS,GAAGhL,GAAK6K,EAAMf,EAAMkB,EAAS,GAAGhL,IAAMgL,EAAS,GAAGhL,GAAK6K,EAAMd,EAAOiB,EAAS,GAAGhL,IAAO,IAAIvB,IAAIuB,EAAI,GAAGA,EAAI,GAAGA,IAAOgL,EAAS,GAAGhL,GAAK6K,EAAMf,EAAMkB,EAAS,GAAGhL,IAAMgL,EAAS,GAAGhL,GAAK6K,EAAMd,EAAOiB,EAAS,GAAGhL,IAAO,OAAOgL,GAMzaE,CAAepB,EAAMC,IAAoK,GAA1DoB,GAJjL,CAAClB,EAAQC,EAAUC,EAAUE,KAAU5L,IAAI2M,EAAO,CAACnB,EAAQC,EAAU,GAAGA,EAAU,GAAGA,EAAU,GAAGC,EAAU,GAAGA,EAAU,GAAGA,EAAU,IAAQkB,EAAK,CAACC,EAAMtL,IAAcoL,EAAOE,GAAOtL,GAAMvB,IAAI8M,EAAY,CAACC,EAAMF,EAAMG,EAAMC,KAAUjN,IAAIkN,EAAKD,EAAO,EAAME,EAAUC,KAAKC,IAAIJ,GAAQF,EAAUO,EAAIL,EAAOF,EAAM,EAAE/M,IAAIuN,EAAM,EAAMhM,EAAIwL,EAAM,KAAY,IAAJxL,GAAM,CAACvB,IAAIwN,EAAIZ,EAAKC,EAAMG,GAAOM,GAAIC,GAAOJ,IAAoBJ,IAAOQ,GAAOR,EAASG,EAAMM,IAAeA,GAAKA,KAAQb,EAAOE,KAASG,GAAOQ,EAAIA,GAAKF,IAAOtN,IAAIyN,EAAmBC,EAAkBC,EAAS,EAAE,IAAI3N,IAAIuB,EAAI,EAAEA,EAAIqK,EAAOpL,OAAO,EAAEe,IAAM,CAACvB,IAAIiJ,EAAQ2C,EAAOrK,GAAK,GAAOqM,EAAahC,EAAOrK,EAAI,GAAG,GAAOsM,EAAUlD,EAAUiD,GAAkBE,EAAKnD,EAAU1B,GAAgV8E,GAA3QL,EAAzDI,IAAOD,GAAWJ,EAAe7C,EAAe3B,GAAuB2B,EAAegD,IAAuBE,EAAKD,GAAWJ,EAAe5C,EAAc+C,GAA4BhD,EAAegD,KAAqBH,EAAe7C,EAAe3B,GAAuB4B,EAAc5B,KAAU0E,GAAU/B,EAAOrK,GAAK,IAA0BmM,GAAkBM,EAAYL,EAASF,EAAmBQ,EAAaR,EAAeC,EAAc,GAA0B,IAAtBO,EAAa,EAAE,KAAS,CAAuInB,GAAlIoB,EAAUtC,EAAOrK,GAAK,IAAI,IAAM4M,EAAWvC,EAAOrK,EAAI,GAAG,IAAI,GAAsG,EAAEyM,EAA5FxC,EAAQmC,EAASQ,GAAY3C,EAAQmC,EAASO,IAAiE,IAAIlO,IAAI6M,EAAM,EAAEA,EAAM,EAAEA,IAAQ,CAAC7M,IAAI4I,EAAMgE,EAAKC,EAAMkB,GAAWnB,EAAKC,EAAMmB,GAAalB,EAAYmB,EAAapB,EAAMmB,EAAYpF,KAAU,OAAO+E,EAAS/B,EAAOA,EAAOpL,OAAO,GAAG,IAI/2C4N,CAAkB5C,EAAQC,EAAUC,EAAUP,IAAcI,EAAU,IAAIvL,IAAIgM,EAAE,EAAEA,EAAER,EAAQhL,OAAOwL,IAAKR,EAAQQ,IAAIP,EAAU,GAAGO,IAAI,EAAIhM,IAAIqO,EAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,IAAI,IAAIrO,IAAIgM,EAAEN,EAAU,GAAGlL,OAAO,EAAK,GAAHwL,EAAKA,IAAKN,EAAU,GAAGM,GAAGqC,EAAiB3C,EAAU,GAAGM,IAAIN,EAAU,GAAGM,GAAGqC,EAAiB3C,EAAU,GAAGM,IAAIN,EAAU,GAAGM,GAAGqC,EAAiB3C,EAAU,GAAGM,IAAqE,MAArD,CAACU,EAAEjB,EAAUD,EAAQE,EAAUC,IAEnnB2C,EAAmBC,IAAavO,IAAIM,EAAO,IAAIC,WAAWgO,GAAgBC,EAAU,EAAMC,EAAkB,EAAMC,EAAO,CAAC9N,EAAMgD,KAAS+K,EAAc,IAAJ,GAAF/K,GAAS8K,EAAOE,IAAIhO,EAAM,CAAC+N,EAAOA,EAAOA,EAAOA,EAAOA,KAAyX,OAA9WD,EAAOE,IAAI,CAAChO,EAAMiO,KAA8J,KAA/CL,GAAxF,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,KAA0BC,GAAmB7N,IAAqB,GAAG,GAAGN,EAAOE,OAAQ,MAAM,IAAIuI,MAAM0F,EAAkB7N,EAAM,IAAIZ,IAAI8O,EAAE,EAAEA,EAAE,EAAEA,IAAKxO,GAAQkO,EAAU,GAAG,GAAGM,GAAGD,EAAMC,IAAMJ,EAAOK,IAAI,IAAYzO,EAAO0O,MAAM,EAAER,EAAU,GAAG,GAAWE,GAExkBO,EAAa,CAACC,EAAOC,EAAiBC,EAAchE,KAASpL,IAAIqP,GAAoB,EAAdD,GAAiB,EAAEpP,IAAIsP,EAAgB,IAALD,EAAS,MAAUE,EAAkB,IAAdH,EAAkBpP,IAAIwP,EAAa,CAACC,EAAOC,EAAOC,EAAOC,KAAU5P,IAAI6P,EAAI,EAAMC,EAAO7E,EAAYqE,EAAWC,GAAK,KAAqB,IAAP,IAAPO,GAAiBZ,EAAOO,EAAOC,GAAeR,EAAOS,EAAOC,GAASE,IAAS,IAAWD,MAAM,GAAS,IAANN,EAAQ,CAACvP,IAAIiM,EAAOb,GAAO,EAAE,IAAiC,IAAzBmE,EAAqB,IAAjBJ,EAAwBK,EAAa,EAAE,GAAG,EAAE,GAAGD,IAAMA,GAAK,IAAoB,MAAPtD,IAAY,OAAOsD,EAAIA,GAAQ,IAAqD,IAA7CvP,IAAI4P,EAAqC,IAA9BnF,EAAwB4E,GAAaG,EAAa,EAAE,EAAE,EAAEI,GAAqB,MAAJL,IAAS,OAAOJ,GAAsBY,EAAMC,GAA+B,IAA5B5C,KAAK6C,IAAI,EAAE7C,KAAK8C,IAAIF,EAAE,MAAU,EAAMG,EAAc,CAACjB,EAAOkB,EAAWC,EAAM5E,EAAUD,EAAQE,EAAUC,KAAwB3L,IAAIsQ,EAAaD,EAAUpE,EAAO,EAAMsE,EAAO,EAAMC,EAAO,EAAMrB,EAAiB,EAAM5N,EAAI,EAAMkP,EAAcjF,EAAQ,GAAOkF,EAAoB,IAAdD,EAAkB,EAAE,KAAML,GAAW,CAACpQ,IAAI6F,EAAM8F,EAAqBpK,GAAK,GAAiB,IAAP,IAANsE,GAAgBsJ,EAAiBF,EAAaC,EAAOC,EAAiBtJ,EAAM2F,EAAY,IAAJjK,IAAUA,GAAK,EAAE6O,GAAY,EAAEE,EAAaD,MAAY,CAAC,CAACrQ,IAAI4O,EAAI,GAAO+B,EAAU,IAAP1E,EAAe2E,EAAU,IAAPL,EAAeM,EAAU,IAAPL,EAAW,IAAIxQ,IAAI8O,EAAE,EAAEA,EAAE,EAAEA,IAAI,CAAC9O,IAAI8Q,EAAIf,EAAM,IAAIY,GAAI,GAAOI,EAAIhB,EAAM,IAAIa,GAAI,GAAOI,GAAK,IAAIH,GAAI,GAAG,KAAK,IAAI,IAA+II,GAAlIH,GAAuB,GAAlBpF,EAAU,GAAGnK,IAAkBwP,GAAuB,GAAlBrF,EAAU,GAAGnK,IAAkByP,GAAuB,GAAlBtF,EAAU,GAAGnK,KAAqC,GAAQ,IAAIqN,EAAIE,GAAO,EAAJmC,EAAMN,GAAsB,IAAlBlF,EAAU,GAAGlK,GAAS,EAAEqP,GAAsB,IAAlBnF,EAAU,GAAGlK,GAAS,EAAEsP,GAAsB,IAAlBpF,EAAU,GAAGlK,GAAS,EAAG2N,EAAON,IAAI,EAAEA,GAAqB,GAAkB,KAAjC0B,EAAmC,CAAoB,GAAnB/O,IAAmC,KAA7B6O,EAAgC,OAAOE,EAAaD,EAAuB,GAAmB,KAAnCI,EAAqC,CAAS,GAAW,KAAnBC,GAA8B,IAAR7K,EAAU,CAACoG,GAAcR,EAAU,GAAGlK,GAAKgP,GAAc9E,EAAU,GAAGlK,GAAKiP,GAAc/E,EAAU,GAAGlK,GAAK,SAAS4N,EAAiBF,EAAaC,EAAOC,EAAiBtJ,EAAM2F,EAAY,IAAJjK,KAAYkP,EAAcjF,EAAQjK,GAAKmP,EAAoB,IAAdD,EAAkB,EAAExE,EAAO,EAAEsE,EAAO,EAAEC,EAAO,IAItyD,SAAXU,EAAoB7I,GAAOrI,IAAImR,EAAyB,EAAjBC,UAAU5Q,aAAyB6Q,IAAfD,UAAU,GAAeA,UAAU,GAAG,GAAOE,GAlB/OjJ,IAAQ,IAAIA,EAAO,OAAO,EAAMrI,IAAIuJ,EAAWhI,GAAaA,IAAMgQ,EAAa/Q,OAAO,KAAK+Q,EAAahQ,GAAiE8H,EAAc,CAAC9H,EAAIqH,EAAM4I,EAAYhR,KAAU,IAAIR,IAAIgM,EAAEuF,EAAa/Q,OAAO,EAAEwL,GAAGzK,EAAIyK,IAAKuF,EAAavF,EAAE,GAAGuF,EAAavF,GAAGyF,EAAczF,EAAE,GAAGhC,EAAUgC,GAAG3B,EAAO2B,EAAE,GAAGxC,EAAUwC,GAAIuF,EAAahQ,GAAKqH,EAAM6I,EAAclQ,GAAY,EAAPf,EAAS6J,EAAO9I,GAAKiQ,GAAcxR,IAAIwJ,EAAUjI,GAAiB,EAAZ8I,EAAO9I,GAAuEyI,EAAUzI,GAAwB,EAAnBkQ,EAAclQ,GAAOvB,IAAI+J,EAAU,CAACxI,EAAIf,KAAUiR,EAAclQ,GAAKf,GAASR,IAAIqK,EAAO,GAAOoH,EAAc,GAAOF,EAAa,GAAOhQ,EAAI,EAAiY,OAA/X6G,EAAQC,EAAMO,IAAQyB,EAAO9I,GAAK,EAAEkQ,EAAclQ,GAAK,EAAEgQ,EAAahQ,KAAOqH,GAAQA,IAAQyB,EAAO9I,EAAI,GAAGqH,IAASQ,EAAQC,EAA5qB,CAAC9H,EAAIqH,KAAS2I,EAAahQ,GAAKqH,GAAqqBW,EAAWC,GAAWW,EAAWZ,EAAWC,EAAjZ,CAACjI,EAAIiQ,KAAenH,EAAO9I,GAAKiQ,IAAsYlH,EAAiBf,EAAWC,EAAUO,GAAWD,EAAcP,EAAWQ,EAAUC,GAAWO,EAAsChB,EAAWF,EAAcG,GAAkB+H,EAAa3J,IAAI,CAAC4E,EAAER,IAAIQ,EAAE,CAACA,EAAmB,EAAjBiF,EAAczF,GAAe,EAAV3B,EAAO2B,IAAM,MAAM0F,OAAOlF,GAAGA,IAkB14BmF,CAAOtJ,GAAO,IAAG,IAAQiJ,EAAe,OAAA,EAAaM,CAF1PxG,OAAciG,KAARjG,EAEoQ+F,EAAQ/F,OAF1P,GAAS,IAANA,EAAUC,OAAcgG,KAARhG,EAE6O8F,EAAQ9F,OAFnO,IAAU,IAANA,EAAUC,OAAgB+F,KAAT/F,EAEoN6F,EAAQ7F,QAFzM,IAAW,IAAPA,EAAW+E,EAAkB,KAE+Kc,EAAQd,OAF3L,IAAQ9E,EAEyL4F,EAAQ5F,WAF9K,EAE6FqG,IAF5QvB,EAAyLwB,EAAU3G,EAAcC,EAASC,EAAMC,EAAMC,EAAOC,GAAUvL,IAAIkP,EAAOZ,EAAmB,MAAMnD,EAAS2G,OAAO,CAAClL,EAAI4F,IAAI5F,EAAI4F,EAAE,GAAG,GAAG6D,EAAM,GAAG,GAAK,CAAC3D,EAAEjB,EAAUD,EAAQE,EAAUC,GAAsBkG,EAAyF,OAA/E1B,EAAcjB,EAAOxC,EAAE2D,EAAM5E,EAAUD,EAAQE,EAAUC,GAA6BuD,EAAOH,OAEtY/O,IAE1I+R,EAxCmvF1J,IAAQrI,IAAIK,EAAK,IAAIgI,EAAM2J,cAAkB/K,EAAS,EAAEgL,EAAO,GAAOC,EAAgB,CAACC,EAAOC,KAAanL,GAAUmL,EAAUH,GAAQE,GAAarM,EAAE,EAAE,KAAMmB,EAAS5G,EAAKG,QAAQsF,IAAI,KAAM,CAAC9F,IAAIqS,EAAYhS,EAAK4G,GAAU,GAAiB,MAAdoL,GAAmBrM,EAAQ3F,EAAK4G,EAAS,EAFh/F,GAEigG,GAAGpB,EAAMwM,EAFt/F,GAEkhG1K,EAAO2K,KAAKzK,GAAcA,EAAKxH,EAAK4G,EAASiL,SAA4B,GAA4B,IAAzBxQ,EAAU2Q,GAAb,CAA+B,IAAIxM,EAAMwM,EAAYzM,GAAqB,OAAO,EAAM8B,EAAM2K,GAAaC,KAAKzK,GAAcA,EAAKxH,EAAK4G,EAASiL,SAA4BD,GAAQ,IAAIhL,SAAoBgL,GAAQ,IAAIhL,IAAY,OAAOgL,GAwC50GM,EAAKrB,EAAesB,EAFrC,CAACnK,EAAM8I,KAAgD,IAAG,KAApC7Q,EAAO4Q,EAAW7I,EAAM8I,IAAmC,OAAA,EAAasB,CAAAA,IA5CgkBnS,EA4CviBA,EA5CgjBN,IAAI0S,EAAM,IAAIC,aAAarS,EAAOE,QAAQ,IAAIR,IAAIgM,EAAE,EAAEA,EAAE1L,EAAOE,OAAOwL,IAAK0G,EAAM1G,IAAI1L,EAAO0L,GAAG,KAAK,IAAK,OAAO0G,IA8CluB,SAASE,EAAMzB,GAASnR,IAAI6S,EAAK1B,GAAS,GAAO2B,EAAe,CAACzS,EAAK0S,IAAiBA,GAAUF,EAAKE,SAAuC1S,EAAK2R,cAA1BD,EAAQ1R,GAAiC2S,KAAKT,KAAK,CAAClS,EAAK0S,IAAWR,EAAKO,EAAezS,EAAK0S,GAAUF,GAAMG,KAAKR,MAAM,CAACnS,EAAK0S,IAAWP,EAAMM,EAAezS,EAAK0S,GAAUF,GAAMG,KAAKC,MAAM,CAAC5S,EAAK0S,KA9CiN,GAA3D1R,EA8ChI2R,KAAKR,MAAMnS,EAAK0S,GA9CiJ5R,EAAhB,OAAOA,EAAiB,IAAI+R,aAAkB/R,EAAgCgS,CAAAA,IAA1mBhS,EAA+mBA,EAAvmBE,EAA+mBA,EAAhmBrB,IAAIoT,EAAUC,EAAQ,IAAIC,QAAQ,CAACC,EAAQC,KAAUxT,IAAIyG,EAAOtF,EAAQsS,qBAAyBC,EAAYvS,EAAQwS,aAAa,EAAEtS,EAAYb,OAAO,OAAWF,EAAOoT,EAAYE,eAAe,GAAG,IAAI5T,IAAIgM,EAAE,EAAEA,EAAE3K,EAAYb,OAAOwL,IAAK1L,EAAO0L,GAAG3K,EAAY2K,GAAIvF,EAAOnG,OAAOoT,EAAYjN,EAAOoN,QAAQ1S,EAAQ2S,aAAarN,EAAOsN,QAAQ,KAAKR,GAAQ,IAAQH,EAAMY,IAASvN,EAAOwN,aAAaT,EAAOQ,IAAUvN,EAAOyN,MAAM,KAA0B,OAApBb,EAAQD,MAAMA,EAAaC,EAAiH,MAAM,IAAItK,OA8CvLiK,KAAKmB,SAAS,CAAC9T,EAAK0S,KAAYqB,CA9CggC/S,EA8Cn/B2R,KAAKT,KAAKlS,EAAK0S,GA9C6gCsB,EAAK,IAAIC,KAAK,CAAClT,EAAYC,IAAc,CAACkT,KAAK,mBAAmBvU,IAAIwU,EAAIC,OAAOC,KAAKD,OAAOE,UAAoDC,GAAtCC,EAAQL,EAAIM,gBAAgBT,GAAYU,SAASC,cAAc,MA8CntCZ,OA9CwtCQ,EAAEK,KAAKJ,EAAQD,EAAErO,OAAO,SAASqO,EAAET,SAAhO,UAAkPY,SAASG,KAAKC,YAAYP,GAAGA,EAAEQ,QAAQL,SAASG,KAAKG,YAAYT,QAAGJ,EAAIc,gBAAgBT,KA8C5zC7B,KAAKuC,IAAI,CAAClV,EAAK0S,IAAW3R,EAAY4R,KAAKT,KAAKlS,EAAK0S,IAAYH,EAAML,KAAKA,EAAKK,EAAMJ,MAAMA,EAAMI,EAAMb,QAAQA,EAE1mByD,OAAOC,QAAU7C"} \ No newline at end of file +{"version":3,"file":"samjs.common.min.js","sources":["0"],"names":["let","matchesBitmask","bits","mask","text2Uint8Array","text","buffer","Uint8Array","length","split","forEach","e","index","charCodeAt","Uint32ToUint8Array","uint32","result","Uint16ToUint8Array","uint16","context","ToWavBuffer","audiobuffer","realbuffer","pos","write","set","charFlags"," ","!","\"","#","$","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","\\","]","^","_","`","FLAG_ALPHA_OR_QUOT","flags","c","flg","flagsAt","isOneOf","list","indexOf","reciterRule","ruleString","splitted","target","pop","source","join","tmp","pre","match","post","TCS","EIY","inputPos","callback","startsWith","rulePos","ruleByte","substr","inputChar","rules","rules2","map","rule","r","push","StressTable","PhonemeNameTable","phonemeFlags","combinedPhonemeLengthTable","full_match","sign1","sign2","findIndex","value","single_match","Parser1","input","addPhoneme","addStress","srcPos","Error","phonemeHasFlag","phoneme","flag","pR","pD","pT","PHONEME_PERIOD","PHONEME_QUESTION","FLAG_FRICATIVE","FLAG_LIQUIC","FLAG_NASAL","FLAG_ALVEOLAR","FLAG_PUNCT","FLAG_VOWEL","FLAG_CONSONANT","FLAG_DIP_YX","FLAG_DIPHTHONG","FLAG_0008","FLAG_VOICED","FLAG_STOPCONS","FLAG_UNVOICED_STOPCONS","Parser2","insertPhoneme","setPhoneme","getPhoneme","getStress","handleUW_CH_J","changeAX","position","suffix","priorPhoneme","AdjustLengths","setLength","getLength","loopIndex","CopyStress","setStress","stress","SetPhonemeLength","ProlongPlosiveStopConsonantsCode41240","nextNonEmpty","sampledConsonantValues0","stressPitch_tab47492","blendRank","outBlendLength","inBlendLength","sampledConsonantFlags","frequencyData","ampldata","sampleTable","SetMouthThroat","mouth","throat","trans","factor","initialFrequency","freqdata","v","i","CreateTransitions","pitches","frequency","amplitude","tuples","tables","Read","table","interpolate","width","frame","change","sign","remainder","Math","abs","div","error","val","outBlendFrames","inBlendFrames","boundary","next_phoneme","next_rank","rank","trans_end","trans_start","trans_length","cur_width","next_width","RISING_INFLECTION","FALLING_INFLECTION","CreateFrames","pitch","AddInflection","inflection","end","sampledConsonantFlag","phase1","frames","PrepareFrames","phonemes","singmode","t","amplitudeRescale","CreateOutputBuffer","buffersize","bufferpos","oldTimeTableIndex","writer","scaled","ary","array","k","get","slice","RenderSample","Output","lastSampleOffset","consonantFlag","kind","samplePage","off","renderSample","index1","value1","index0","value0","bit","sample","sinus","x","sin","PI","ProcessFrames","frameCount","speed","speedcounter","phase2","phase3","glottal_pulse","mem38","p1","p2","p3","sp1","sp2","rp3","mux","SamProcess","options","arguments","undefined","parsed","phonemeindex","stressValue","phonemeLength","filter","sentences","reduce","convert","toUpperCase","output","successCallback","append","inputSkip","currentChar","some","buf8","buf32","Uint8ArrayToFloat32Array","audio","Float32Array","SamJs","opts","ensurePhonetic","phonetic","this","speak","AudioContext","Play","abort","promise","Promise","resolve","reject","createBufferSource","soundBuffer","createBuffer","getChannelData","connect","destination","onended","reason","disconnect","start","download","a","blob","Blob","type","fileURL","url","window","URL","webkitURL","createObjectURL","document","createElement","href","body","appendChild","click","removeChild","revokeObjectURL","wav","module","exports"],"mappings":"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G,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,EAA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"} \ No newline at end of file diff --git a/dist/samjs.esm.js b/dist/samjs.esm.js index b90ec18..941a1d1 100644 --- a/dist/samjs.esm.js +++ b/dist/samjs.esm.js @@ -47,37 +47,31 @@ let Uint16ToUint8Array = uint16 => { * * @return {Promise} */ - let Play = (context, audiobuffer) => { let abort; let promise = new Promise((resolve, reject) => { let source = context.createBufferSource(); let soundBuffer = context.createBuffer(1, audiobuffer.length, 22050); let buffer = soundBuffer.getChannelData(0); - for (let i = 0; i < audiobuffer.length; i++) { buffer[i] = audiobuffer[i]; } - source.buffer = soundBuffer; source.connect(context.destination); - source.onended = () => { resolve(true); }; - abort = reason => { source.disconnect(); reject(reason); }; - source.start(0); }); promise.abort = abort; return promise; }; - let context = null; + /** * Play an audio buffer. * @@ -85,20 +79,18 @@ let context = null; * * @return {Promise} */ - let PlayBuffer = audiobuffer => { if (null === context) { context = new AudioContext(); } - if (!context) { { throw new Error('No player available!'); } } - return Play(context, audiobuffer); }; + /** * Convert a Uint8Array wave buffer to a Float32Array WaveBuffer * @@ -106,16 +98,14 @@ let PlayBuffer = audiobuffer => { * * @return {Float32Array} */ - let Uint8ArrayToFloat32Array = buffer => { let audio = new Float32Array(buffer.length); - for (let i = 0; i < buffer.length; i++) { audio[i] = (buffer[i] - 128) / 256; } - return audio; }; + /** * Converts a Uint8Array buffer to a Uint8Array wave buffer * @@ -123,67 +113,67 @@ let Uint8ArrayToFloat32Array = buffer => { * * @return {Uint8Array} */ - let ToWavBuffer = audiobuffer => { // Calculate buffer size. - let realbuffer = new Uint8Array(4 + // "RIFF" - 4 + // uint32 filesize - 4 + // "WAVE" - 4 + // "fmt " - 4 + // uint32 fmt length - 2 + // uint16 fmt - 2 + // uint16 channels - 4 + // uint32 sample rate - 4 + // uint32 bytes per second - 2 + // uint16 block align - 2 + // uint16 bits per sample - 4 + // "data" - 4 + // uint32 chunk length + let realbuffer = new Uint8Array(4 + + // "RIFF" + 4 + + // uint32 filesize + 4 + + // "WAVE" + 4 + + // "fmt " + 4 + + // uint32 fmt length + 2 + + // uint16 fmt + 2 + + // uint16 channels + 4 + + // uint32 sample rate + 4 + + // uint32 bytes per second + 2 + + // uint16 block align + 2 + + // uint16 bits per sample + 4 + + // "data" + 4 + + // uint32 chunk length audiobuffer.length); let pos = 0; - let write = buffer => { realbuffer.set(buffer, pos); pos += buffer.length; - }; //RIFF header - + }; + //RIFF header write(text2Uint8Array('RIFF')); // chunkID - write(Uint32ToUint8Array(audiobuffer.length + 12 + 16 + 8 - 8)); // ChunkSize - write(text2Uint8Array('WAVE')); // riffType //format chunk - write(text2Uint8Array('fmt ')); write(Uint32ToUint8Array(16)); // ChunkSize - write(Uint16ToUint8Array(1)); // wFormatTag - 1 = PCM - write(Uint16ToUint8Array(1)); // channels - write(Uint32ToUint8Array(22050)); // samplerate - write(Uint32ToUint8Array(22050)); // bytes/second - write(Uint16ToUint8Array(1)); // blockalign - write(Uint16ToUint8Array(8)); // bits per sample //data chunk - write(text2Uint8Array('data')); write(Uint32ToUint8Array(audiobuffer.length)); // buffer length - write(audiobuffer); return realbuffer; }; + /** * * @param {Uint8Array} audiobuffer * * @return void */ - let RenderBuffer = audiobuffer => { let filename = "sam.wav"; let blob = new Blob([ToWavBuffer(audiobuffer)], { @@ -286,13 +276,9 @@ let rules2$1 = '(A)=|' + '(!)=.|' + '(") =-AH5NKWOWT-|' + '(")=KWOW4T-|' + '(#)= let FLAG_NUMERIC = 0x01; let FLAG_RULESET2 = 0x02; let FLAG_VOICED$1 = 0x04; // FIXME: is this correct? - let FLAG_0X08 = 0x08; // unknown. - let FLAG_DIPHTHONG$1 = 0x10; // FIXME: is this correct? - let FLAG_CONSONANT$1 = 0x20; // FIXME: is this correct? - let FLAG_VOWEL_OR_Y = 0x40; let FLAG_ALPHA_OR_QUOT = 0x80; @@ -302,10 +288,10 @@ let FLAG_ALPHA_OR_QUOT = 0x80; * @param {Number} flg * @return {boolean} */ - let flags = (c, flg) => { return (charFlags[c] & flg) !== 0; }; + /** * * @param {string} text @@ -313,8 +299,6 @@ let flags = (c, flg) => { * @param {Number} flg * @return {boolean} */ - - let flagsAt = (text, pos, flg) => { return flags(text[pos], flg); }; @@ -325,11 +309,10 @@ let flagsAt = (text, pos, flg) => { * * @return {boolean} */ - - let isOneOf = (c, list) => { return list.indexOf(c) !== -1; }; + /** * Set a phoneme in the buffer. * @@ -344,30 +327,28 @@ let isOneOf = (c, list) => { * @param {String} ruleString 'xxx(yyy)zzz=foobar' 'xxx(yyy)zzz' is the source value, 'foobar' is the destination value. * @return {result} */ - - let reciterRule = ruleString => { let splitted = ruleString.split('='); - const // Must pop and join here because of rule for '=' itself. - target = splitted.pop(), - source = splitted.join('=').split('('), - tmp = source.pop().split(')'), - pre = source[0], - match = tmp[0], - post = tmp[1]; + const + // Must pop and join here because of rule for '=' itself. + target = splitted.pop(), + source = splitted.join('=').split('('), + tmp = source.pop().split(')'), + pre = source[0], + match = tmp[0], + post = tmp[1]; let TCS = ['T', 'C', 'S']; let EIY = ['E', 'I', 'Y']; + /** * Test if the rule prefix matches. * @param {string} text The input text. * @param {Number} pos The input position we are working from. * @return {boolean} */ - let checkPrefix = (text, pos) => { for (let rulePos = pre.length - 1; rulePos > -1; rulePos--) { let ruleByte = pre[rulePos]; - if (!flags(ruleByte, FLAG_ALPHA_OR_QUOT)) { if (!{ // '' - previous char must not be alpha or quotation mark. @@ -383,16 +364,14 @@ let reciterRule = ruleString => { if (flagsAt(text, --pos, FLAG_VOICED$1)) { return true; } - - let inputChar = text[pos]; // 'H' - - if (inputChar !== 'H') return false; // FIXME: this is always true?!? is there a "--pos" missing in original code? + let inputChar = text[pos]; + // 'H' + if (inputChar !== 'H') return false; + // FIXME: this is always true?!? is there a "--pos" missing in original code? // Check for 'T', 'C', 'S' - if (!isOneOf(inputChar, TCS)) { return false; } - { throw new Error('Is always false but happened? ' + inputChar); } @@ -407,32 +386,30 @@ let reciterRule = ruleString => { if (!flagsAt(text, pos - 1, FLAG_CONSONANT$1)) break; pos--; } - return true; } }[ruleByte]()) { return false; } - } // Rule char does not match. + } + // Rule char does not match. else if (text[--pos] !== ruleByte) { return false; } } - return true; }; + /** * Test if the rule suffix matches. * @param {string} text The input text. * @param {Number} pos The input position we are working from. * @return {boolean} */ - - let checkSuffix = (text, pos) => { for (let rulePos = 0; rulePos < post.length; rulePos++) { - let ruleByte = post[rulePos]; // do we have to handle the byte specially? - + let ruleByte = post[rulePos]; + // do we have to handle the byte specially? if (!flags(ruleByte, FLAG_ALPHA_OR_QUOT)) { // pos37226: if (!{ @@ -449,13 +426,13 @@ let reciterRule = ruleString => { if (flagsAt(text, ++pos, FLAG_VOICED$1)) { return true; } - let inputChar = text[pos]; - if (inputChar !== 'H') // 'H' - return false; // Check for 'T', 'C', 'S' - - if (!isOneOf(inputChar, TCS)) return false; // FIXME: This is illogical and can never be reached. Bug in orig. code? reciter.c:489 (pos37367) - + if (inputChar !== 'H') + // 'H' + return false; + // Check for 'T', 'C', 'S' + if (!isOneOf(inputChar, TCS)) return false; + // FIXME: This is illogical and can never be reached. Bug in orig. code? reciter.c:489 (pos37367) { throw new Error('This should not be possible ', inputChar); } @@ -469,10 +446,8 @@ let reciterRule = ruleString => { while (flagsAt(text, pos + 1, FLAG_CONSONANT$1)) { pos++; } - return true; }, - /* '%' - check if we have: - 'ING' - 'E' not followed by alpha or quot @@ -488,17 +463,14 @@ let reciterRule = ruleString => { pos += 3; return true; } - return false; - } // we have 'E' - check if not followed by alpha or quot. - - + } + // we have 'E' - check if not followed by alpha or quot. if (!flagsAt(text, pos + 2, FLAG_ALPHA_OR_QUOT)) { pos++; return true; - } // NOT 'ER', 'ES' OR 'ED' - - + } + // NOT 'ER', 'ES' OR 'ED' if (!isOneOf(text[pos + 2], ['R', 'S', 'D'])) { // NOT 'EL' if (text[pos + 2] !== 'L') { @@ -508,30 +480,28 @@ let reciterRule = ruleString => { pos += 4; return true; } - return false; - } // NOT 'ELY' - - + } + // NOT 'ELY' if (text[pos + 3] !== 'Y') return false; pos += 3; return true; } - pos += 2; return true; } }[ruleByte]()) { return false; } - } // Rule char does not match. + } + // Rule char does not match. else if (text[++pos] !== ruleByte) { return false; } } - return true; }; + /** * Test if the rule matches. * @@ -539,22 +509,21 @@ let reciterRule = ruleString => { * @param {Number} pos The input position we are working from. * @return {boolean} */ - - let matches = (text, pos) => { // check if content in brackets matches. if (!text.startsWith(match, pos)) { return false; - } // Check left... - + } + // Check left... if (!checkPrefix(text, pos)) { return false; - } // Check right... - + } + // Check right... return checkSuffix(text, pos + (match.length - 1)); }; + /** * This is the real implementation of rule processing. * @@ -564,32 +533,29 @@ let reciterRule = ruleString => { * * @return {boolean} */ - - let result = (text, inputPos, callback) => { if (matches(text, inputPos)) { { - console.log("".concat(source, " -> ").concat(target)); + console.log(`${source} -> ${target}`); } - callback(target, match.length); return true; } }; - result.c = match[0]; return result; -}; // Map all rules and generate processors from them. - +}; +// Map all rules and generate processors from them. let rules = {}; rules$1.split('|').map(rule => { let r = reciterRule(rule), - c = r.c; + c = r.c; rules[c] = rules[c] || []; rules[c].push(r); }); let rules2 = rules2$1.split('|').map(reciterRule); + /** * Convert the text to a phoneme string. * @@ -597,33 +563,29 @@ let rules2 = rules2$1.split('|').map(reciterRule); * * @return {boolean|string} */ - let TextToPhonemes = input => { let text = ' ' + input.toUpperCase(); let inputPos = 0, - output = ''; + output = ''; /** * The input callback (successCallback) used from the rules. * * @param {string} append The string to append. * @param {Number} inputSkip The amount or chars to move ahead in the input. */ - let successCallback = (append, inputSkip) => { inputPos += inputSkip; output += append; }; - let c = 0; - while (inputPos < text.length && c++ < 10000) { { let tmp = text.toLowerCase(); - console.log("processing \"".concat(tmp.substr(0, inputPos), "%c").concat(tmp[inputPos].toUpperCase(), "%c").concat(tmp.substr(inputPos + 1), "\""), 'color: red;', 'color:normal;'); + console.log(`processing "${tmp.substr(0, inputPos)}%c${tmp[inputPos].toUpperCase()}%c${tmp.substr(inputPos + 1)}"`, 'color: red;', 'color:normal;'); } + let currentChar = text[inputPos]; - let currentChar = text[inputPos]; // NOT '.' or '.' followed by number. - + // NOT '.' or '.' followed by number. if (currentChar !== '.' || flagsAt(text, inputPos + 1, FLAG_NUMERIC)) { //pos36607: if (flags(currentChar, FLAG_RULESET2)) { @@ -631,118 +593,194 @@ let TextToPhonemes = input => { return rule(text, inputPos, successCallback); }); continue; - } //pos36630: - - + } + //pos36630: if (charFlags[currentChar] !== 0) { // pos36677: if (!flags(currentChar, FLAG_ALPHA_OR_QUOT)) { //36683: BRK return false; - } // go to the right rules for this character. - - + } + // go to the right rules for this character. rules[currentChar].some(rule => { return rule(text, inputPos, successCallback); }); continue; } - output += ' '; inputPos++; continue; } - output += '.'; inputPos++; } - return output; }; let StressTable = '*12345678'.split(''); -let PhonemeNameTable = (' *' + // 00 -'.*' + // 01 -'?*' + // 02 -',*' + // 03 -'-*' + // 04 -'IY' + // 05 -'IH' + // 06 -'EH' + // 07 -'AE' + // 08 -'AA' + // 09 -'AH' + // 10 -'AO' + // 11 -'UH' + // 12 -'AX' + // 13 -'IX' + // 14 -'ER' + // 15 -'UX' + // 16 -'OH' + // 17 -'RX' + // 18 -'LX' + // 19 -'WX' + // 20 -'YX' + // 21 -'WH' + // 22 -'R*' + // 23 -'L*' + // 24 -'W*' + // 25 -'Y*' + // 26 -'M*' + // 27 -'N*' + // 28 -'NX' + // 29 -'DX' + // 30 -'Q*' + // 31 -'S*' + // 32 -'SH' + // 33 -'F*' + // 34 -'TH' + // 35 -'/H' + // 36 -'/X' + // 37 -'Z*' + // 38 -'ZH' + // 39 -'V*' + // 40 -'DH' + // 41 -'CH' + // 42 -'**' + // 43 -'J*' + // 44 -'**' + // 45 -'**' + // 46 -'**' + // 47 -'EY' + // 48 -'AY' + // 49 -'OY' + // 50 -'AW' + // 51 -'OW' + // 52 -'UW' + // 53 -'B*' + // 54 -'**' + // 55 -'**' + // 56 -'D*' + // 57 -'**' + // 58 -'**' + // 59 -'G*' + // 60 -'**' + // 61 -'**' + // 62 -'GX' + // 63 -'**' + // 64 -'**' + // 65 -'P*' + // 66 -'**' + // 67 -'**' + // 68 -'T*' + // 69 -'**' + // 70 -'**' + // 71 -'K*' + // 72 -'**' + // 73 -'**' + // 74 -'KX' + // 75 -'**' + // 76 -'**' + // 77 -'UL' + // 78 -'UM' + // 79 +let PhonemeNameTable = (' *' + +// 00 +'.*' + +// 01 +'?*' + +// 02 +',*' + +// 03 +'-*' + +// 04 +'IY' + +// 05 +'IH' + +// 06 +'EH' + +// 07 +'AE' + +// 08 +'AA' + +// 09 +'AH' + +// 10 +'AO' + +// 11 +'UH' + +// 12 +'AX' + +// 13 +'IX' + +// 14 +'ER' + +// 15 +'UX' + +// 16 +'OH' + +// 17 +'RX' + +// 18 +'LX' + +// 19 +'WX' + +// 20 +'YX' + +// 21 +'WH' + +// 22 +'R*' + +// 23 +'L*' + +// 24 +'W*' + +// 25 +'Y*' + +// 26 +'M*' + +// 27 +'N*' + +// 28 +'NX' + +// 29 +'DX' + +// 30 +'Q*' + +// 31 +'S*' + +// 32 +'SH' + +// 33 +'F*' + +// 34 +'TH' + +// 35 +'/H' + +// 36 +'/X' + +// 37 +'Z*' + +// 38 +'ZH' + +// 39 +'V*' + +// 40 +'DH' + +// 41 +'CH' + +// 42 +'**' + +// 43 +'J*' + +// 44 +'**' + +// 45 +'**' + +// 46 +'**' + +// 47 +'EY' + +// 48 +'AY' + +// 49 +'OY' + +// 50 +'AW' + +// 51 +'OW' + +// 52 +'UW' + +// 53 +'B*' + +// 54 +'**' + +// 55 +'**' + +// 56 +'D*' + +// 57 +'**' + +// 58 +'**' + +// 59 +'G*' + +// 60 +'**' + +// 61 +'**' + +// 62 +'GX' + +// 63 +'**' + +// 64 +'**' + +// 65 +'P*' + +// 66 +'**' + +// 67 +'**' + +// 68 +'T*' + +// 69 +'**' + +// 70 +'**' + +// 71 +'K*' + +// 72 +'**' + +// 73 +'**' + +// 74 +'KX' + +// 75 +'**' + +// 76 +'**' + +// 77 +'UL' + +// 78 +'UM' + +// 79 'UN' // 80 ).match(/.{1,2}/g); + /** * Flags for phoneme names. * @@ -797,89 +835,169 @@ let PhonemeNameTable = (' *' + // 00 * 'P*', '**', '**', 'T*', '**', '**', 'K*', '**', '**', 'KX', '**', * '**', 'UM', 'UN' */ - -let phonemeFlags = [0 | 0x8000, // ' *' 00 -0 | 0x8000 | 0x4000 | 0x0100, // '.*' 01 -0 | 0x8000 | 0x4000 | 0x0100, // '?*' 02 -0 | 0x8000 | 0x4000 | 0x0100, // ',*' 03 -0 | 0x8000 | 0x4000 | 0x0100, // '-*' 04 -0 | 0x0080 | 0x0020 | 0x0004, // 'IY' 05 -0 | 0x0080 | 0x0020 | 0x0004, // 'IH' 06 -0 | 0x0080 | 0x0020 | 0x0004, // 'EH' 07 -0 | 0x0080 | 0x0020 | 0x0004, // 'AE' 08 -0 | 0x0080 | 0x0020 | 0x0004, // 'AA' 09 -0 | 0x0080 | 0x0020 | 0x0004, // 'AH' 10 -0 | 0x0080 | 0x0004, // 'AO' 11 -0 | 0x0080 | 0x0004, // 'UH' 12 -0 | 0x0080 | 0x0020 | 0x0004, // 'AX' 13 -0 | 0x0080 | 0x0020 | 0x0004, // 'IX' 14 -0 | 0x0080 | 0x0004, // 'ER' 15 -0 | 0x0080 | 0x0004, // 'UX' 16 -0 | 0x0080 | 0x0004, // 'OH' 17 -0 | 0x0080 | 0x0004, // 'RX' 18 -0 | 0x0080 | 0x0004, // 'LX' 19 -0 | 0x0080 | 0x0004, // 'WX' 20 -0 | 0x0080 | 0x0004, // 'YX' 21 -0 | 0x0040 | 0x0004, // 'WH' 22 -0 | 0x1000 | 0x0040 | 0x0004, // 'R*' 23 -0 | 0x1000 | 0x0040 | 0x0004, // 'L*' 24 -0 | 0x1000 | 0x0040 | 0x0004, // 'W*' 25 -0 | 0x1000 | 0x0040 | 0x0004, // 'Y*' 26 -0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, // 'M*' 27 -0 | 0x0800 | 0x0400 | 0x0040 | 0x0008 | 0x0004, // 'N*' 28 -0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, // 'NX' 29 -0 | 0x0400 | 0x0040 | 0x0008, // 'DX' 30 -0 | 0x4000 | 0x0040 | 0x0008 | 0x0004, // 'Q*' 31 -0 | 0x2000 | 0x0400 | 0x0040, // 'S*' 32 -0 | 0x2000 | 0x0040, // 'SH' 33 -0 | 0x2000 | 0x0040, // 'F*' 34 -0 | 0x2000 | 0x0400 | 0x0040, // 'TH' 35 -0 | 0x0040, // '/H' 36 -0 | 0x0040, // '/X' 37 -0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, // 'Z*' 38 -0 | 0x2000 | 0x0040 | 0x0004, // 'ZH' 39 -0 | 0x2000 | 0x0040 | 0x0004, // 'V*' 40 -0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, // 'DH' 41 -0 | 0x2000 | 0x0040 | 0x0008, // 'CH' 42 -0 | 0x2000 | 0x0040, // '**' 43 -0 | 0x0040 | 0x0008 | 0x0004, // 'J*' 44 -0 | 0x2000 | 0x0040 | 0x0004, // '**' 45 -0, // '**' 46 -0, // '**' 47 -0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'EY' 48 -0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'AY' 49 -0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'OY' 50 -0 | 0x0080 | 0x0010 | 0x0004, // 'AW' 51 -0 | 0x0080 | 0x0010 | 0x0004, // 'OW' 52 -0 | 0x0080 | 0x0010 | 0x0004, // 'UW' 53 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'B*' 54 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 55 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 56 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'D*' 57 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 58 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 59 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'G*' 60 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 61 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 62 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'GX' 63 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 64 -0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 65 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'P*' 66 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 67 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 68 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'T*' 69 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 70 -0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 71 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'K*' 72 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 73 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 74 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'KX' 75 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 76 -0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 77 -0 | 0x0080, // 'UL' 78 -0 | 0x0080 | 0x0040 | 0x0001, // 'UM' 79 +let phonemeFlags = [0 | 0x8000, +// ' *' 00 +0 | 0x8000 | 0x4000 | 0x0100, +// '.*' 01 +0 | 0x8000 | 0x4000 | 0x0100, +// '?*' 02 +0 | 0x8000 | 0x4000 | 0x0100, +// ',*' 03 +0 | 0x8000 | 0x4000 | 0x0100, +// '-*' 04 +0 | 0x0080 | 0x0020 | 0x0004, +// 'IY' 05 +0 | 0x0080 | 0x0020 | 0x0004, +// 'IH' 06 +0 | 0x0080 | 0x0020 | 0x0004, +// 'EH' 07 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AE' 08 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AA' 09 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AH' 10 +0 | 0x0080 | 0x0004, +// 'AO' 11 +0 | 0x0080 | 0x0004, +// 'UH' 12 +0 | 0x0080 | 0x0020 | 0x0004, +// 'AX' 13 +0 | 0x0080 | 0x0020 | 0x0004, +// 'IX' 14 +0 | 0x0080 | 0x0004, +// 'ER' 15 +0 | 0x0080 | 0x0004, +// 'UX' 16 +0 | 0x0080 | 0x0004, +// 'OH' 17 +0 | 0x0080 | 0x0004, +// 'RX' 18 +0 | 0x0080 | 0x0004, +// 'LX' 19 +0 | 0x0080 | 0x0004, +// 'WX' 20 +0 | 0x0080 | 0x0004, +// 'YX' 21 +0 | 0x0040 | 0x0004, +// 'WH' 22 +0 | 0x1000 | 0x0040 | 0x0004, +// 'R*' 23 +0 | 0x1000 | 0x0040 | 0x0004, +// 'L*' 24 +0 | 0x1000 | 0x0040 | 0x0004, +// 'W*' 25 +0 | 0x1000 | 0x0040 | 0x0004, +// 'Y*' 26 +0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, +// 'M*' 27 +0 | 0x0800 | 0x0400 | 0x0040 | 0x0008 | 0x0004, +// 'N*' 28 +0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, +// 'NX' 29 +0 | 0x0400 | 0x0040 | 0x0008, +// 'DX' 30 +0 | 0x4000 | 0x0040 | 0x0008 | 0x0004, +// 'Q*' 31 +0 | 0x2000 | 0x0400 | 0x0040, +// 'S*' 32 +0 | 0x2000 | 0x0040, +// 'SH' 33 +0 | 0x2000 | 0x0040, +// 'F*' 34 +0 | 0x2000 | 0x0400 | 0x0040, +// 'TH' 35 +0 | 0x0040, +// '/H' 36 +0 | 0x0040, +// '/X' 37 +0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, +// 'Z*' 38 +0 | 0x2000 | 0x0040 | 0x0004, +// 'ZH' 39 +0 | 0x2000 | 0x0040 | 0x0004, +// 'V*' 40 +0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, +// 'DH' 41 +0 | 0x2000 | 0x0040 | 0x0008, +// 'CH' 42 +0 | 0x2000 | 0x0040, +// '**' 43 +0 | 0x0040 | 0x0008 | 0x0004, +// 'J*' 44 +0 | 0x2000 | 0x0040 | 0x0004, +// '**' 45 +0, +// '**' 46 +0, +// '**' 47 +0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, +// 'EY' 48 +0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, +// 'AY' 49 +0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, +// 'OY' 50 +0 | 0x0080 | 0x0010 | 0x0004, +// 'AW' 51 +0 | 0x0080 | 0x0010 | 0x0004, +// 'OW' 52 +0 | 0x0080 | 0x0010 | 0x0004, +// 'UW' 53 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'B*' 54 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 55 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 56 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'D*' 57 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 58 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 59 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'G*' 60 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 61 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 62 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// 'GX' 63 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 64 +0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, +// '**' 65 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'P*' 66 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 67 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 68 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'T*' 69 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 70 +0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 71 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'K*' 72 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 73 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 74 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// 'KX' 75 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 76 +0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, +// '**' 77 +0 | 0x0080, +// 'UL' 78 +0 | 0x0080 | 0x0040 | 0x0001, +// 'UM' 79 0 | 0x0080 | 0x0040 | 0x0001 // 'UN' 80 ]; + /** * Combined table of phoneme length. * @@ -889,88 +1007,167 @@ let phonemeFlags = [0 | 0x8000, // ' *' 00 * phonemeLengthTable[i] = combinedPhonemeLengthTable[i] & 0xFF * phonemeStressedLengthTable[i] = combinedPhonemeLengthTable[i] >> 8 */ - -let combinedPhonemeLengthTable = [0x0000 | 0x0000, // ' *' 00 -0x0012 | 0x1200, // '.*' 01 -0x0012 | 0x1200, // '?*' 02 -0x0012 | 0x1200, // ',*' 03 -0x0008 | 0x0800, // '-*' 04 -0x0008 | 0x0B00, // 'IY' 05 -0x0008 | 0x0900, // 'IH' 06 -0x0008 | 0x0B00, // 'EH' 07 -0x0008 | 0x0E00, // 'AE' 08 -0x000B | 0x0F00, // 'AA' 09 -0x0006 | 0x0B00, // 'AH' 10 -0x000C | 0x1000, // 'AO' 11 -0x000A | 0x0C00, // 'UH' 12 -0x0005 | 0x0600, // 'AX' 13 -0x0005 | 0x0600, // 'IX' 14 -0x000B | 0x0E00, // 'ER' 15 -0x000A | 0x0C00, // 'UX' 16 -0x000A | 0x0E00, // 'OH' 17 -0x000A | 0x0C00, // 'RX' 18 -0x0009 | 0x0B00, // 'LX' 19 -0x0008 | 0x0800, // 'WX' 20 -0x0007 | 0x0800, // 'YX' 21 -0x0009 | 0x0B00, // 'WH' 22 -0x0007 | 0x0A00, // 'R*' 23 -0x0006 | 0x0900, // 'L*' 24 -0x0008 | 0x0800, // 'W*' 25 -0x0006 | 0x0800, // 'Y*' 26 -0x0007 | 0x0800, // 'M*' 27 -0x0007 | 0x0800, // 'N*' 28 -0x0007 | 0x0800, // 'NX' 29 -0x0002 | 0x0300, // 'DX' 30 -0x0005 | 0x0500, // 'Q*' 31 -0x0002 | 0x0200, // 'S*' 32 -0x0002 | 0x0200, // 'SH' 33 -0x0002 | 0x0200, // 'F*' 34 -0x0002 | 0x0200, // 'TH' 35 -0x0002 | 0x0200, // '/H' 36 -0x0002 | 0x0200, // '/X' 37 -0x0006 | 0x0600, // 'Z*' 38 -0x0006 | 0x0600, // 'ZH' 39 -0x0007 | 0x0800, // 'V*' 40 -0x0006 | 0x0600, // 'DH' 41 -0x0006 | 0x0600, // 'CH' 42 -0x0002 | 0x0200, // '**' 43 -0x0008 | 0x0900, // 'J*' 44 -0x0003 | 0x0400, // '**' 45 -0x0001 | 0x0200, // '**' 46 -0x001E | 0x0100, // '**' 47 -0x000D | 0x0E00, // 'EY' 48 -0x000C | 0x0F00, // 'AY' 49 -0x000C | 0x0F00, // 'OY' 50 -0x000C | 0x0F00, // 'AW' 51 -0x000E | 0x0E00, // 'OW' 52 -0x0009 | 0x0E00, // 'UW' 53 -0x0006 | 0x0800, // 'B*' 54 -0x0001 | 0x0200, // '**' 55 -0x0002 | 0x0200, // '**' 56 -0x0005 | 0x0700, // 'D*' 57 -0x0001 | 0x0200, // '**' 58 -0x0001 | 0x0100, // '**' 59 -0x0006 | 0x0700, // 'G*' 60 -0x0001 | 0x0200, // '**' 61 -0x0002 | 0x0200, // '**' 62 -0x0006 | 0x0700, // 'GX' 63 -0x0001 | 0x0200, // '**' 64 -0x0002 | 0x0200, // '**' 65 -0x0008 | 0x0800, // 'P*' 66 -0x0002 | 0x0200, // '**' 67 -0x0002 | 0x0200, // '**' 68 -0x0004 | 0x0600, // 'T*' 69 -0x0002 | 0x0200, // '**' 70 -0x0002 | 0x0200, // '**' 71 -0x0006 | 0x0700, // 'K*' 72 -0x0001 | 0x0200, // '**' 73 -0x0004 | 0x0400, // '**' 74 -0x0006 | 0x0700, // 'KX' 75 -0x0001 | 0x0100, // '**' 76 -0x0004 | 0x0400, // '**' 77 -0x00C7 | 0x0500, // 'UL' 78 +let combinedPhonemeLengthTable = [0x0000 | 0x0000, +// ' *' 00 +0x0012 | 0x1200, +// '.*' 01 +0x0012 | 0x1200, +// '?*' 02 +0x0012 | 0x1200, +// ',*' 03 +0x0008 | 0x0800, +// '-*' 04 +0x0008 | 0x0B00, +// 'IY' 05 +0x0008 | 0x0900, +// 'IH' 06 +0x0008 | 0x0B00, +// 'EH' 07 +0x0008 | 0x0E00, +// 'AE' 08 +0x000B | 0x0F00, +// 'AA' 09 +0x0006 | 0x0B00, +// 'AH' 10 +0x000C | 0x1000, +// 'AO' 11 +0x000A | 0x0C00, +// 'UH' 12 +0x0005 | 0x0600, +// 'AX' 13 +0x0005 | 0x0600, +// 'IX' 14 +0x000B | 0x0E00, +// 'ER' 15 +0x000A | 0x0C00, +// 'UX' 16 +0x000A | 0x0E00, +// 'OH' 17 +0x000A | 0x0C00, +// 'RX' 18 +0x0009 | 0x0B00, +// 'LX' 19 +0x0008 | 0x0800, +// 'WX' 20 +0x0007 | 0x0800, +// 'YX' 21 +0x0009 | 0x0B00, +// 'WH' 22 +0x0007 | 0x0A00, +// 'R*' 23 +0x0006 | 0x0900, +// 'L*' 24 +0x0008 | 0x0800, +// 'W*' 25 +0x0006 | 0x0800, +// 'Y*' 26 +0x0007 | 0x0800, +// 'M*' 27 +0x0007 | 0x0800, +// 'N*' 28 +0x0007 | 0x0800, +// 'NX' 29 +0x0002 | 0x0300, +// 'DX' 30 +0x0005 | 0x0500, +// 'Q*' 31 +0x0002 | 0x0200, +// 'S*' 32 +0x0002 | 0x0200, +// 'SH' 33 +0x0002 | 0x0200, +// 'F*' 34 +0x0002 | 0x0200, +// 'TH' 35 +0x0002 | 0x0200, +// '/H' 36 +0x0002 | 0x0200, +// '/X' 37 +0x0006 | 0x0600, +// 'Z*' 38 +0x0006 | 0x0600, +// 'ZH' 39 +0x0007 | 0x0800, +// 'V*' 40 +0x0006 | 0x0600, +// 'DH' 41 +0x0006 | 0x0600, +// 'CH' 42 +0x0002 | 0x0200, +// '**' 43 +0x0008 | 0x0900, +// 'J*' 44 +0x0003 | 0x0400, +// '**' 45 +0x0001 | 0x0200, +// '**' 46 +0x001E | 0x0100, +// '**' 47 +0x000D | 0x0E00, +// 'EY' 48 +0x000C | 0x0F00, +// 'AY' 49 +0x000C | 0x0F00, +// 'OY' 50 +0x000C | 0x0F00, +// 'AW' 51 +0x000E | 0x0E00, +// 'OW' 52 +0x0009 | 0x0E00, +// 'UW' 53 +0x0006 | 0x0800, +// 'B*' 54 +0x0001 | 0x0200, +// '**' 55 +0x0002 | 0x0200, +// '**' 56 +0x0005 | 0x0700, +// 'D*' 57 +0x0001 | 0x0200, +// '**' 58 +0x0001 | 0x0100, +// '**' 59 +0x0006 | 0x0700, +// 'G*' 60 +0x0001 | 0x0200, +// '**' 61 +0x0002 | 0x0200, +// '**' 62 +0x0006 | 0x0700, +// 'GX' 63 +0x0001 | 0x0200, +// '**' 64 +0x0002 | 0x0200, +// '**' 65 +0x0008 | 0x0800, +// 'P*' 66 +0x0002 | 0x0200, +// '**' 67 +0x0002 | 0x0200, +// '**' 68 +0x0004 | 0x0600, +// 'T*' 69 +0x0002 | 0x0200, +// '**' 70 +0x0002 | 0x0200, +// '**' 71 +0x0006 | 0x0700, +// 'K*' 72 +0x0001 | 0x0200, +// '**' 73 +0x0004 | 0x0400, +// '**' 74 +0x0006 | 0x0700, +// 'KX' 75 +0x0001 | 0x0100, +// '**' 76 +0x0004 | 0x0400, +// '**' 77 +0x00C7 | 0x0500, +// 'UL' 78 0x00FF | 0x0500 // 'UM' 79 ]; + /* Ind | phoneme | flags | @@ -1085,27 +1282,26 @@ SPECIAL * @param {string} sign2 * @return {boolean|Number} */ - let full_match = (sign1, sign2) => { let index = PhonemeNameTable.findIndex(value => { return value === sign1 + sign2 && value[1] !== '*'; }); return index !== -1 ? index : false; }; + /** * Match single character phoneme. * * @param {string} sign1 * @return {boolean|Number} */ - - let single_match = sign1 => { let index = PhonemeNameTable.findIndex(value => { return value === sign1 + '*'; }); return index !== -1 ? index : false; }; + /** * The input[] buffer contains a string of phonemes and stress markers along * the lines of: @@ -1159,46 +1355,37 @@ let single_match = sign1 => { * * @return {undefined} */ - - let Parser1 = (input, addPhoneme, addStress) => { for (let srcPos = 0; srcPos < input.length; srcPos++) { { let tmp = input.toLowerCase(); - console.log("processing \"".concat(tmp.substr(0, srcPos), "%c").concat(tmp.substr(srcPos, 2).toUpperCase(), "%c").concat(tmp.substr(srcPos + 2), "\""), 'color: red;', 'color:normal;'); + console.log(`processing "${tmp.substr(0, srcPos)}%c${tmp.substr(srcPos, 2).toUpperCase()}%c${tmp.substr(srcPos + 2)}"`, 'color: red;', 'color:normal;'); } - let sign1 = input[srcPos]; let sign2 = input[srcPos + 1] || ''; let match; - if ((match = full_match(sign1, sign2)) !== false) { // Matched both characters (no single char mark) srcPos++; // Skip the second character of the input as we've matched it - addPhoneme(match); continue; } - if ((match = single_match(sign1)) !== false) { // Matched just the first character (with second character matching '*' addPhoneme(match); continue; - } // Should be a stress character. Search through the stress table backwards. - + } + // Should be a stress character. Search through the stress table backwards. match = StressTable.length; - while (sign1 !== StressTable[match] && match > 0) { --match; } - if (match === 0) { { - throw Error("Could not parse char ".concat(sign1)); + throw Error(`Could not parse char ${sign1}`); } } - addStress(match); // Set stress for prior phoneme } }; @@ -1211,7 +1398,6 @@ let Parser1 = (input, addPhoneme, addStress) => { * * @return {boolean} */ - let phonemeHasFlag = (phoneme, flag) => { return matchesBitmask(phonemeFlags[phoneme], flag); }; @@ -1222,10 +1408,10 @@ let pT = 69; let PHONEME_PERIOD = 1; let PHONEME_QUESTION = 2; let FLAG_FRICATIVE = 0x2000; + /** * liquic consonant */ - let FLAG_LIQUIC = 0x1000; let FLAG_NASAL = 0x0800; let FLAG_ALVEOLAR = 0x0400; @@ -1236,7 +1422,6 @@ let FLAG_CONSONANT = 0x0040; * diphthong ending with YX * */ - let FLAG_DIP_YX = 0x0020; let FLAG_DIPHTHONG = 0x0010; /** unknown: @@ -1244,13 +1429,12 @@ let FLAG_DIPHTHONG = 0x0010; * '**', '**', 'G*', '**', '**', 'GX', '**', '**', 'P*', '**', '**', * 'T*', '**', '**', 'K*', '**', '**', 'KX', '**', '**' */ - let FLAG_0008 = 0x0008; let FLAG_VOICED = 0x0004; + /** * stop consonant */ - let FLAG_STOPCONS = 0x0002; let FLAG_UNVOICED_STOPCONS = 0x0001; @@ -1287,7 +1471,6 @@ let FLAG_UNVOICED_STOPCONS = 0x0001; * * @return undefined */ - let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { /** * Rewrites: @@ -1305,96 +1488,77 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { // ALVEOLAR flag set? if (phonemeHasFlag(getPhoneme(pos - 1), FLAG_ALVEOLAR)) { { - console.log("".concat(pos, " RULE: UW -> UX")); + console.log(`${pos} RULE: UW -> UX`); } - setPhoneme(pos, 16); // UX } - break; } // 'CH' Example: CHEW - case 42: { { - console.log("".concat(pos, " RULE: CH -> CH CH+1")); + console.log(`${pos} RULE: CH -> CH CH+1`); } - insertPhoneme(pos + 1, 43, getStress(pos)); // '**' - break; } // 'J*' Example: JAY - case 44: { { - console.log("".concat(pos, " RULE: J -> J J+1")); + console.log(`${pos} RULE: J -> J J+1`); } - insertPhoneme(pos + 1, 45, getStress(pos)); // '**' - break; } } }; - let changeAX = (position, suffix) => { { - console.log("".concat(position, " RULE: ").concat(PhonemeNameTable[getPhoneme(position)], " -> AX ").concat(PhonemeNameTable[suffix])); + console.log(`${position} RULE: ${PhonemeNameTable[getPhoneme(position)]} -> AX ${PhonemeNameTable[suffix]}`); } - setPhoneme(position, 13); // 'AX' - insertPhoneme(position + 1, suffix, getStress(position)); }; - let pos = -1; let phoneme; - while ((phoneme = getPhoneme(++pos)) !== null) { // Is phoneme pause? if (phoneme === 0) { continue; } - if (phonemeHasFlag(phoneme, FLAG_DIPHTHONG)) { // -> WX // -> YX // Example: OIL, COW { - console.log(!phonemeHasFlag(phoneme, FLAG_DIP_YX) ? "".concat(pos, " RULE: insert WX following diphthong NOT ending in IY sound") : "".concat(pos, " RULE: insert YX following diphthong ending in IY sound")); - } // If ends with IY, use YX, else use WX + console.log(!phonemeHasFlag(phoneme, FLAG_DIP_YX) ? `${pos} RULE: insert WX following diphthong NOT ending in IY sound` : `${pos} RULE: insert YX following diphthong ending in IY sound`); + } + // If ends with IY, use YX, else use WX // Insert at WX or YX following, copying the stress // 'WX' = 20 'YX' = 21 - - insertPhoneme(pos + 1, phonemeHasFlag(phoneme, FLAG_DIP_YX) ? 21 : 20, getStress(pos)); handleUW_CH_J(phoneme, pos); continue; } - if (phoneme === 78) { // 'UL' => 'AX' 'L*' // Example: MEDDLE changeAX(pos, 24); continue; } - if (phoneme === 79) { // 'UM' => 'AX' 'M*' // Example: ASTRONOMY changeAX(pos, 27); continue; } - if (phoneme === 80) { // 'UN' => 'AX' 'N*' changeAX(pos, 28); continue; } - if (phonemeHasFlag(phoneme, FLAG_VOWEL) && getStress(pos)) { // Example: FUNCTION // RULE: @@ -1403,21 +1567,16 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { if (getPhoneme(pos + 1) === 0) { // If following phoneme is a pause, get next phoneme = getPhoneme(pos + 2); - if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_VOWEL) && getStress(pos + 2)) { { - console.log("".concat(pos + 2, " RULE: Insert glottal stop between two stressed vowels with space between them")); + console.log(`${pos + 2} RULE: Insert glottal stop between two stressed vowels with space between them`); } - insertPhoneme(pos + 2, 31, 0); // 31 = 'Q' } } - continue; } - let priorPhoneme = pos === 0 ? null : getPhoneme(pos - 1); - if (phoneme === pR) { // RULES FOR PHONEMES BEFORE R switch (priorPhoneme) { @@ -1425,103 +1584,88 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { { // Example: TRACK { - console.log("".concat(pos, " RULE: T* R* -> CH R*")); + console.log(`${pos} RULE: T* R* -> CH R*`); } - setPhoneme(pos - 1, 42); // 'T*' 'R*' -> 'CH' 'R*' - break; } - case pD: { // Example: DRY { - console.log("".concat(pos, " RULE: D* R* -> J* R*")); + console.log(`${pos} RULE: D* R* -> J* R*`); } - setPhoneme(pos - 1, 44); // 'J*' - break; } - default: { if (phonemeHasFlag(priorPhoneme, FLAG_VOWEL)) { // Example: ART { - console.log("".concat(pos, " R* -> RX")); + console.log(`${pos} R* -> RX`); } - setPhoneme(pos, 18); // 'RX' } } } - continue; - } // 'L*' - + } + // 'L*' if (phoneme === 24 && phonemeHasFlag(priorPhoneme, FLAG_VOWEL)) { // Example: ALL { - console.log("".concat(pos, " L* -> LX")); + console.log(`${pos} L* -> LX`); } - setPhoneme(pos, 19); // 'LX' - continue; - } // 'G*' 'S*' - - + } + // 'G*' 'S*' if (priorPhoneme === 60 && phoneme === 32) { // Can't get to fire - // 1. The G -> GX rule intervenes // 2. Reciter already replaces GS -> GZ { - console.log("".concat(pos, " G S -> G Z")); + console.log(`${pos} G S -> G Z`); } - setPhoneme(pos, 38); continue; - } // 'G*' - + } + // 'G*' if (phoneme === 60) { // G -> GX // Example: GO - let phoneme = getPhoneme(pos + 1); // If diphthong ending with YX, move continue processing next phoneme - + let phoneme = getPhoneme(pos + 1); + // If diphthong ending with YX, move continue processing next phoneme if (!phonemeHasFlag(phoneme, FLAG_DIP_YX) && phoneme !== null) { // replace G with GX and continue processing next phoneme { - console.log("".concat(pos, " RULE: G -> GX ")); + console.log(`${pos} RULE: G -> GX `); } - setPhoneme(pos, 63); // 'GX' } - continue; - } // 'K*' - + } + // 'K*' if (phoneme === 72) { // K -> KX // Example: COW - let Y = getPhoneme(pos + 1); // If at end, replace current phoneme with KX - + let Y = getPhoneme(pos + 1); + // If at end, replace current phoneme with KX if (!phonemeHasFlag(Y, FLAG_DIP_YX) || Y === null) { // VOWELS AND DIPHTHONGS ENDING WITH IY SOUND flag set? { - console.log("".concat(pos, " K -> KX ")); + console.log(`${pos} K -> KX `); } - setPhoneme(pos, 75); phoneme = 75; } - } // Replace with softer version? - + } + // Replace with softer version? if (phonemeHasFlag(phoneme, FLAG_UNVOICED_STOPCONS) && priorPhoneme === 32) { // 'S*' // RULE: @@ -1533,15 +1677,14 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { // 'S*' 'UN' -> 'S*' '**' // Examples: SPY, STY, SKY, SCOWL { - console.log("".concat(pos, " RULE: S* ").concat(PhonemeNameTable[phoneme], " -> S* ").concat(PhonemeNameTable[phoneme - 12])); + console.log(`${pos} RULE: S* ${PhonemeNameTable[phoneme]} -> S* ${PhonemeNameTable[phoneme - 12]}`); } - setPhoneme(pos, phoneme - 12); } else if (!phonemeHasFlag(phoneme, FLAG_UNVOICED_STOPCONS)) { handleUW_CH_J(phoneme, pos); - } // 'T*', 'D*' - + } + // 'T*', 'D*' if (phoneme === 69 || phoneme === 57) { // RULE: Soften T following vowel // NOTE: This rule fails for cases such as "ODD" @@ -1550,28 +1693,22 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { // Example: PARTY, TARDY if (pos > 0 && phonemeHasFlag(getPhoneme(pos - 1), FLAG_VOWEL)) { phoneme = getPhoneme(pos + 1); - if (phoneme === 0) { phoneme = getPhoneme(pos + 2); } - if (phonemeHasFlag(phoneme, FLAG_VOWEL) && !getStress(pos + 1)) { { - console.log("".concat(pos, " Soften T or D following vowel or ER and preceding a pause -> DX")); + console.log(`${pos} Soften T or D following vowel or ER and preceding a pause -> DX`); } - setPhoneme(pos, 30); } } - continue; } - { - console.log("".concat(pos, ": ").concat(PhonemeNameTable[phoneme])); + console.log(`${pos}: ${PhonemeNameTable[phoneme]}`); } } // while - }; /** @@ -1591,177 +1728,160 @@ let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { * * @return undefined */ - let AdjustLengths = (getPhoneme, setLength, getLength) => { { - console.log("AdjustLengths()"); - } // LENGTHEN VOWELS PRECEDING PUNCTUATION + console.log(`AdjustLengths()`); + } + + // LENGTHEN VOWELS PRECEDING PUNCTUATION // // Search for punctuation. If found, back up to the first vowel, then // process all phonemes between there and up to (but not including) the punctuation. // If any phoneme is found that is a either a fricative or voiced, the duration is // increased by (length * 1.5) + 1 - // loop index - + // loop index for (let position = 0; getPhoneme(position) !== null; position++) { // not punctuation? if (!phonemeHasFlag(getPhoneme(position), FLAG_PUNCT)) { continue; } - let loopIndex = position; - - while (--position > 1 && !phonemeHasFlag(getPhoneme(position), FLAG_VOWEL)) { - /* back up while not a vowel */ - } // If beginning of phonemes, exit loop. - - + while (--position > 1 && !phonemeHasFlag(getPhoneme(position), FLAG_VOWEL)) {/* back up while not a vowel */} + // If beginning of phonemes, exit loop. if (position === 0) { break; - } // Now handle everything between position and loopIndex - + } + // Now handle everything between position and loopIndex let vowel = position; - for (; position < loopIndex; position++) { // test for not fricative/unvoiced or not voiced if (!phonemeHasFlag(getPhoneme(position), FLAG_FRICATIVE) || phonemeHasFlag(getPhoneme(position), FLAG_VOICED)) { - let A = getLength(position); // change phoneme length to (length * 1.5) + 1 - + let A = getLength(position); + // change phoneme length to (length * 1.5) + 1 { console.log(position + ' RULE: Lengthen or ' + PhonemeNameTable[getPhoneme(position)] + ' between VOWEL:' + PhonemeNameTable[getPhoneme(vowel)] + ' and PUNCTUATION:' + PhonemeNameTable[getPhoneme(position)] + ' by 1.5'); } - setLength(position, (A >> 1) + A + 1); } } - } // Similar to the above routine, but shorten vowels under some circumstances - // Loop through all phonemes - + } + // Similar to the above routine, but shorten vowels under some circumstances + // Loop through all phonemes let loopIndex = -1; let phoneme; - while ((phoneme = getPhoneme(++loopIndex)) !== null) { - let position = loopIndex; // vowel? - + let position = loopIndex; + // vowel? if (phonemeHasFlag(phoneme, FLAG_VOWEL)) { // get next phoneme - phoneme = getPhoneme(++position); // not a consonant - + phoneme = getPhoneme(++position); + // not a consonant if (!phonemeHasFlag(phoneme, FLAG_CONSONANT)) { // 'RX' or 'LX'? if ((phoneme === 18 || phoneme === 19) && phonemeHasFlag(getPhoneme(++position), FLAG_CONSONANT)) { // followed by consonant? { console.log(loopIndex + ' RULE: ' + PhonemeNameTable[phoneme] + ' - decrease length of vowel by 1'); - } // decrease length of vowel by 1 frame - - + } + // decrease length of vowel by 1 frame setLength(loopIndex, getLength(loopIndex) - 1); } - continue; - } // Got here if not + } + // Got here if not // FIXME: the case when phoneme === END is taken over by !phonemeHasFlag(phoneme, FLAG_CONSONANT) - - - let flags = phoneme === null ? FLAG_CONSONANT | FLAG_UNVOICED_STOPCONS : phonemeFlags[phoneme]; // Unvoiced - + let flags = phoneme === null ? FLAG_CONSONANT | FLAG_UNVOICED_STOPCONS : phonemeFlags[phoneme]; + // Unvoiced if (!matchesBitmask(flags, FLAG_VOICED)) { // *, .*, ?*, ,*, -*, DX, S*, SH, F*, TH, /H, /X, CH, P*, T*, K*, KX + // unvoiced plosive if (matchesBitmask(flags, FLAG_UNVOICED_STOPCONS)) { // RULE: // { - console.log("".concat(loopIndex, " - decrease vowel by 1/8th")); + console.log(`${loopIndex} - decrease vowel by 1/8th`); } - let A = getLength(loopIndex); setLength(loopIndex, A - (A >> 3)); } - continue; - } // RULE: + } + + // RULE: // - - { - console.log("".concat(loopIndex, " RULE: - increase vowel by 1/4 + 1")); - } // increase length - - + console.log(`${loopIndex} RULE: - increase vowel by 1/4 + 1`); + } + // increase length let A = getLength(loopIndex); setLength(loopIndex, (A >> 2) + A + 1); // 5/4*A + 1 - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, M*, N*, NX, DX, Q*, S*, SH, F*, - // TH, /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX - // nasal? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, M*, N*, NX, DX, Q*, S*, SH, F*, + // TH, /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX + // nasal? if (phonemeHasFlag(phoneme, FLAG_NASAL)) { // RULE: // Set punctuation length to 6 // Set stop consonant length to 5 - // M*, N*, NX, - phoneme = getPhoneme(++position); // is next phoneme a stop consonant? + // M*, N*, NX, + phoneme = getPhoneme(++position); + // is next phoneme a stop consonant? if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // B*, D*, G*, GX, P*, T*, K*, KX { - console.log("".concat(position, " RULE: - set nasal = 5, consonant = 6")); + console.log(`${position} RULE: - set nasal = 5, consonant = 6`); } - setLength(position, 6); // set stop consonant length to 6 - setLength(position - 1, 5); // set nasal length to 5 } - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, - // /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX - // stop consonant? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, + // /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX + // stop consonant? if (phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // B*, D*, G*, GX + // RULE: {optional silence} // Shorten both to (length/2 + 1) - while ((phoneme = getPhoneme(++position)) === 0) { - /* move past silence */ - } // if another stop consonant, process. - + while ((phoneme = getPhoneme(++position)) === 0) {/* move past silence */} + // if another stop consonant, process. if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // RULE: {optional silence} { - console.log("".concat(position, " RULE: {optional silence} - shorten both to 1/2 + 1")); + console.log(`${position} RULE: {optional silence} - shorten both to 1/2 + 1`); } - setLength(position, (getLength(position) >> 1) + 1); setLength(loopIndex, (getLength(loopIndex) >> 1) + 1); } - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, - // /H, /X, Z*, ZH, V*, DH, CH, J* - // liquic consonant? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, + // /H, /X, Z*, ZH, V*, DH, CH, J* + // liquic consonant? if (position > 0 && phonemeHasFlag(phoneme, FLAG_LIQUIC) && phonemeHasFlag(getPhoneme(position - 1), FLAG_STOPCONS)) { // R*, L*, W*, Y* // RULE: // Decrease by 2 // prior phoneme is a stop consonant { - console.log("".concat(position, " RULE: - decrease by 2")); - } // decrease the phoneme length by 2 frames - - + console.log(`${position} RULE: - decrease by 2`); + } + // decrease the phoneme length by 2 frames setLength(position, getLength(position) - 2); } } @@ -1786,21 +1906,18 @@ let AdjustLengths = (getPhoneme, setLength, getLength) => { * * @return undefined */ - let CopyStress = (getPhoneme, getStress, setStress) => { // loop through all the phonemes to be output let position = 0; let phoneme; - while ((phoneme = getPhoneme(position)) !== null) { // if CONSONANT_FLAG set, skip - only vowels get stress if (phonemeHasFlag(phoneme, FLAG_CONSONANT)) { - phoneme = getPhoneme(position + 1); // if the following phoneme is the end, or a vowel, skip - + phoneme = getPhoneme(position + 1); + // if the following phoneme is the end, or a vowel, skip if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_VOWEL)) { // get the stress value at the next position let stress = getStress(position + 1); - if (stress !== 0 && stress < 0x80) { // if next phoneme is stressed, and a VOWEL OR ER // copy stress from next phoneme to this one @@ -1808,7 +1925,6 @@ let CopyStress = (getPhoneme, getStress, setStress) => { } } } - ++position; } }; @@ -1822,20 +1938,16 @@ let CopyStress = (getPhoneme, getStress, setStress) => { * * @return undefined */ - let SetPhonemeLength = (getPhoneme, getStress, setLength) => { let position = 0; let phoneme; - while ((phoneme = getPhoneme(position)) !== null) { let stress = getStress(position); - if (stress === 0 || stress > 0x7F) { setLength(position, combinedPhonemeLengthTable[phoneme] & 0xFF); } else { setLength(position, combinedPhonemeLengthTable[phoneme] >> 8); } - position++; } }; @@ -1850,32 +1962,26 @@ let SetPhonemeLength = (getPhoneme, getStress, setLength) => { * * @return undefined */ - let ProlongPlosiveStopConsonantsCode41240 = (getPhoneme, insertPhoneme, getStress) => { let pos = -1; let index; - while ((index = getPhoneme(++pos)) !== null) { // Not a stop consonant, move to next one. if (!phonemeHasFlag(index, FLAG_STOPCONS)) { continue; - } //If plosive, move to next non empty phoneme and validate the flags. - - + } + //If plosive, move to next non empty phoneme and validate the flags. if (phonemeHasFlag(index, FLAG_UNVOICED_STOPCONS)) { let nextNonEmpty; let X = pos; - do { nextNonEmpty = getPhoneme(++X); - } while (nextNonEmpty === 0); // If not END and either flag 0x0008 or '/H' or '/X' - - + } while (nextNonEmpty === 0); + // If not END and either flag 0x0008 or '/H' or '/X' if (nextNonEmpty !== null && (phonemeHasFlag(nextNonEmpty, FLAG_0008) || nextNonEmpty === 36 || nextNonEmpty === 37)) { continue; } } - insertPhoneme(pos + 1, index + 1, getStress(pos), combinedPhonemeLengthTable[index + 1] & 0xFF); insertPhoneme(pos + 2, index + 2, getStress(pos), combinedPhonemeLengthTable[index + 2] & 0xFF); pos += 2; @@ -1891,29 +1997,25 @@ let ProlongPlosiveStopConsonantsCode41240 = (getPhoneme, insertPhoneme, getStres * * @return {Array|Boolean} The parsed data. */ - let Parser = input => { if (!input) { return false; } - let getPhoneme = pos => { { if (pos < 0 || pos > phonemeindex.length) { throw new Error('Out of bounds: ' + pos); } } - return pos === phonemeindex.length ? null : phonemeindex[pos]; }; - let setPhoneme = (pos, value) => { { - console.log("".concat(pos, " CHANGE: ").concat(PhonemeNameTable[phonemeindex[pos]], " -> ").concat(PhonemeNameTable[value])); + console.log(`${pos} CHANGE: ${PhonemeNameTable[phonemeindex[pos]]} -> ${PhonemeNameTable[value]}`); } - phonemeindex[pos] = value; }; + /** * @param {Number} pos The position in the phoneme array to insert at. * @param {Number} value The phoneme to insert. @@ -1922,54 +2024,40 @@ let Parser = input => { * * @return {undefined} */ - - let insertPhoneme = (pos, value, stressValue, length) => { { - console.log("".concat(pos, " INSERT: ").concat(PhonemeNameTable[value])); + console.log(`${pos} INSERT: ${PhonemeNameTable[value]}`); } - for (let i = phonemeindex.length - 1; i >= pos; i--) { phonemeindex[i + 1] = phonemeindex[i]; phonemeLength[i + 1] = getLength(i); stress[i + 1] = getStress(i); } - phonemeindex[pos] = value; phonemeLength[pos] = length | 0; stress[pos] = stressValue; }; - let getStress = pos => stress[pos] | 0; - let setStress = (pos, stressValue) => { { - console.log("".concat(pos, " \"").concat(PhonemeNameTable[phonemeindex[pos]], "\" SET STRESS: ").concat(stress[pos], " -> ").concat(stressValue)); + console.log(`${pos} "${PhonemeNameTable[phonemeindex[pos]]}" SET STRESS: ${stress[pos]} -> ${stressValue}`); } - stress[pos] = stressValue; }; - let getLength = pos => phonemeLength[pos] | 0; - let setLength = (pos, length) => { { - console.log("".concat(pos, " \"").concat(PhonemeNameTable[phonemeindex[pos]], "\" SET LENGTH: ").concat(phonemeLength[pos], " -> ").concat(length)); - + console.log(`${pos} "${PhonemeNameTable[phonemeindex[pos]]}" SET LENGTH: ${phonemeLength[pos]} -> ${length}`); if ((length & 128) !== 0) { throw new Error('Got the flag 0x80, see CopyStress() and SetPhonemeLength() comments!'); } - if (pos < 0 || pos > phonemeindex.length) { throw new Error('Out of bounds: ' + pos); } } - phonemeLength[pos] = length; }; - let stress = []; //numbers from 0 to 8 - let phonemeLength = []; let phonemeindex = []; let pos = 0; @@ -1983,27 +2071,22 @@ let Parser = input => { throw new Error('Got the flag 0x80, see CopyStress() and SetPhonemeLength() comments!'); } } - - stress[pos - 1] = value; - /* Set stress for prior phoneme */ + stress[pos - 1] = value; /* Set stress for prior phoneme */ }); - { PrintPhonemes(phonemeindex, phonemeLength, stress); } - Parser2(insertPhoneme, setPhoneme, getPhoneme, getStress); CopyStress(getPhoneme, getStress, setStress); SetPhonemeLength(getPhoneme, getStress, setLength); AdjustLengths(getPhoneme, setLength, getLength); ProlongPlosiveStopConsonantsCode41240(getPhoneme, insertPhoneme, getStress); - { PrintPhonemes(phonemeindex, phonemeLength, stress); } - return phonemeindex.map((v, i) => v ? [v, phonemeLength[i] | 0, stress[i] | 0] : null).filter(v => v); }; + /** * Debug printing. * @@ -2013,46 +2096,45 @@ let Parser = input => { * * @return undefined */ - let PrintPhonemes = (phonemeindex, phonemeLength, stress) => { let pad = num => { let s = '000' + num; return s.substr(s.length - 3); }; - console.log('=================================='); console.log('Internal Phoneme presentation:'); console.log(' pos idx phoneme length stress'); console.log('----------------------------------'); - for (let i = 0; i < phonemeindex.length; i++) { let name = () => { if (phonemeindex[i] < 81) { return PhonemeNameTable[phonemeindex[i]]; } - return '??'; }; - console.log(' %s %s %s %s %s', pad(i), pad(phonemeindex[i]), name(phonemeindex[i]), pad(phonemeLength[i]), pad(stress[i])); } - console.log('=================================='); }; // Values substituted for zero bits in unvoiced consonant samples. // tab48426 let sampledConsonantValues0 = [0x18, 0x1A, 0x17, 0x17, 0x17]; -let stressPitch_tab47492 = [0x00, 0xE0, 0xE6, 0xEC, 0xF3, 0xF9, 0x00, 0x06, 0xC, 0x06]; // Used to decide which phoneme's blend lengths. The candidate with the lower score is selected. +let stressPitch_tab47492 = [0x00, 0xE0, 0xE6, 0xEC, 0xF3, 0xF9, 0x00, 0x06, 0xC, 0x06]; + +// Used to decide which phoneme's blend lengths. The candidate with the lower score is selected. // tab45856 +let blendRank = [0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x02, 0x0A, 0x02, 0x08, 0x05, 0x05, 0x0B, 0x0A, 0x09, 0x08, 0x08, 0xA0, 0x08, 0x08, 0x17, 0x1F, 0x12, 0x12, 0x12, 0x12, 0x1E, 0x1E, 0x14, 0x14, 0x14, 0x14, 0x17, 0x17, 0x1A, 0x1A, 0x1D, 0x1D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x17]; -let blendRank = [0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x02, 0x0A, 0x02, 0x08, 0x05, 0x05, 0x0B, 0x0A, 0x09, 0x08, 0x08, 0xA0, 0x08, 0x08, 0x17, 0x1F, 0x12, 0x12, 0x12, 0x12, 0x1E, 0x1E, 0x14, 0x14, 0x14, 0x14, 0x17, 0x17, 0x1A, 0x1A, 0x1D, 0x1D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x17]; // Number of frames at the end of a phoneme devoted to interpolating to next phoneme's final value +// Number of frames at the end of a phoneme devoted to interpolating to next phoneme's final value //tab45696 +let outBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0xA0, 0xA0]; -let outBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0xA0, 0xA0]; // Number of frames at beginning of a phoneme devoted to interpolating to phoneme's final value +// Number of frames at beginning of a phoneme devoted to interpolating to phoneme's final value // tab45776 +let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0xB0, 0xA0]; -let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0xB0, 0xA0]; // Consists of two bitfields: +// Consists of two bitfields: // Low 3 bits (masked by 7) select a 256-byte section in sampleTable, // as well as index into sampledConsonantValues0 for unvoiced. // High 5 bits (masked by 248 = 11111000), for unvoiced, @@ -2073,222 +2155,423 @@ let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, // 67: P' 27 00011011 // 70: T' 25 00011001 // tab45936 +let sampledConsonantFlags = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0xD3, 0xBB, 0x7C, 0x95, 0x01, 0x02, 0x03, 0x03, 0x00, 0x72, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; -let sampledConsonantFlags = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0xD3, 0xBB, 0x7C, 0x95, 0x01, 0x02, 0x03, 0x03, 0x00, 0x72, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; // - -let frequencyData = [//tab45056 |tab451356 |tab45216 +// +let frequencyData = [ +//tab45056 |tab451356 |tab45216 // freq1 | freq2 | freq3 -0x000000 | 0x000000 | 0x000000, // ' *' 00 -0x000013 | 0x004300 | 0x5B0000, // '.*' 01 -0x000013 | 0x004300 | 0x5B0000, // '?*' 02 -0x000013 | 0x004300 | 0x5B0000, // ',*' 03 -0x000013 | 0x004300 | 0x5B0000, // '-*' 04 -0x00000A | 0x005400 | 0x6E0000, // 'IY' 05 -0x00000E | 0x004900 | 0x5D0000, // 'IH' 06 -0x000013 | 0x004300 | 0x5B0000, // 'EH' 07 -0x000018 | 0x003F00 | 0x580000, // 'AE' 08 -0x00001B | 0x002800 | 0x590000, // 'AA' 09 -0x000017 | 0x002C00 | 0x570000, // 'AH' 10 -0x000015 | 0x001F00 | 0x580000, // 'AO' 11 -0x000010 | 0x002500 | 0x520000, // 'UH' 12 -0x000014 | 0x002D00 | 0x590000, // 'AX' 13 -0x00000E | 0x004900 | 0x5D0000, // 'IX' 14 -0x000012 | 0x003100 | 0x3E0000, // 'ER' 15 -0x00000E | 0x002400 | 0x520000, // 'UX' 16 -0x000012 | 0x001E00 | 0x580000, // 'OH' 17 -0x000012 | 0x003300 | 0x3E0000, // 'RX' 18 -0x000010 | 0x002500 | 0x6E0000, // 'LX' 19 -0x00000D | 0x001D00 | 0x500000, // 'WX' 20 -0x00000F | 0x004500 | 0x5D0000, // 'YX' 21 -0x00000B | 0x001800 | 0x5A0000, // 'WH' 22 -0x000012 | 0x003200 | 0x3C0000, // 'R*' 23 -0x00000E | 0x001E00 | 0x6E0000, // 'L*' 24 -0x00000B | 0x001800 | 0x5A0000, // 'W*' 25 -0x000009 | 0x005300 | 0x6E0000, // 'Y*' 26 -0x000006 | 0x002E00 | 0x510000, // 'M*' 27 -0x000006 | 0x003600 | 0x790000, // 'N*' 28 -0x000006 | 0x005600 | 0x650000, // 'NX' 29 -0x000006 | 0x003600 | 0x790000, // 'DX' 30 -0x000011 | 0x004300 | 0x5B0000, // 'Q*' 31 -0x000006 | 0x004900 | 0x630000, // 'S*' 32 -0x000006 | 0x004F00 | 0x6A0000, // 'SH' 33 -0x000006 | 0x001A00 | 0x510000, // 'F*' 34 -0x000006 | 0x004200 | 0x790000, // 'TH' 35 -0x00000E | 0x004900 | 0x5D0000, // '/H' 36 -0x000010 | 0x002500 | 0x520000, // '/X' 37 -0x000009 | 0x003300 | 0x5D0000, // 'Z*' 38 -0x00000A | 0x004200 | 0x670000, // 'ZH' 39 -0x000008 | 0x002800 | 0x4C0000, // 'V*' 40 -0x00000A | 0x002F00 | 0x5D0000, // 'DH' 41 -0x000006 | 0x004F00 | 0x650000, // 'CH' 42 -0x000006 | 0x004F00 | 0x650000, // '**' 43 -0x000006 | 0x004200 | 0x790000, // 'J*' 44 -0x000005 | 0x004F00 | 0x650000, // '**' 45 -0x000006 | 0x006E00 | 0x790000, // '**' 46 -0x000000 | 0x000000 | 0x000000, // '**' 47 -0x000013 | 0x004800 | 0x5A0000, // 'EY' 48 -0x00001B | 0x002700 | 0x580000, // 'AY' 49 -0x000015 | 0x001F00 | 0x580000, // 'OY' 50 -0x00001B | 0x002B00 | 0x580000, // 'AW' 51 -0x000012 | 0x001E00 | 0x580000, // 'OW' 52 -0x00000D | 0x002200 | 0x520000, // 'UW' 53 -0x000006 | 0x001A00 | 0x510000, // 'B*' 54 -0x000006 | 0x001A00 | 0x510000, // '**' 55 -0x000006 | 0x001A00 | 0x510000, // '**' 56 -0x000006 | 0x004200 | 0x790000, // 'D*' 57 -0x000006 | 0x004200 | 0x790000, // '**' 58 -0x000006 | 0x004200 | 0x790000, // '**' 59 -0x000006 | 0x006E00 | 0x700000, // 'G*' 60 -0x000006 | 0x006E00 | 0x6E0000, // '**' 61 -0x000006 | 0x006E00 | 0x6E0000, // '**' 62 -0x000006 | 0x005400 | 0x5E0000, // 'GX' 63 -0x000006 | 0x005400 | 0x5E0000, // '**' 64 -0x000006 | 0x005400 | 0x5E0000, // '**' 65 -0x000006 | 0x001A00 | 0x510000, // 'P*' 66 -0x000006 | 0x001A00 | 0x510000, // '**' 67 -0x000006 | 0x001A00 | 0x510000, // '**' 68 -0x000006 | 0x004200 | 0x790000, // 'T*' 69 -0x000006 | 0x004200 | 0x790000, // '**' 70 -0x000006 | 0x004200 | 0x790000, // '**' 71 -0x000006 | 0x006D00 | 0x650000, // 'K*' 72 -0x00000A | 0x005600 | 0x650000, // '**' 73 -0x00000A | 0x006D00 | 0x700000, // '**' 74 -0x000006 | 0x005400 | 0x5E0000, // 'KX' 75 -0x000006 | 0x005400 | 0x5E0000, // '**' 76 -0x000006 | 0x005400 | 0x5E0000, // '**' 77 -0x00002C | 0x007F00 | 0x080000, // 'UL' 78 +0x000000 | 0x000000 | 0x000000, +// ' *' 00 +0x000013 | 0x004300 | 0x5B0000, +// '.*' 01 +0x000013 | 0x004300 | 0x5B0000, +// '?*' 02 +0x000013 | 0x004300 | 0x5B0000, +// ',*' 03 +0x000013 | 0x004300 | 0x5B0000, +// '-*' 04 +0x00000A | 0x005400 | 0x6E0000, +// 'IY' 05 +0x00000E | 0x004900 | 0x5D0000, +// 'IH' 06 +0x000013 | 0x004300 | 0x5B0000, +// 'EH' 07 +0x000018 | 0x003F00 | 0x580000, +// 'AE' 08 +0x00001B | 0x002800 | 0x590000, +// 'AA' 09 +0x000017 | 0x002C00 | 0x570000, +// 'AH' 10 +0x000015 | 0x001F00 | 0x580000, +// 'AO' 11 +0x000010 | 0x002500 | 0x520000, +// 'UH' 12 +0x000014 | 0x002D00 | 0x590000, +// 'AX' 13 +0x00000E | 0x004900 | 0x5D0000, +// 'IX' 14 +0x000012 | 0x003100 | 0x3E0000, +// 'ER' 15 +0x00000E | 0x002400 | 0x520000, +// 'UX' 16 +0x000012 | 0x001E00 | 0x580000, +// 'OH' 17 +0x000012 | 0x003300 | 0x3E0000, +// 'RX' 18 +0x000010 | 0x002500 | 0x6E0000, +// 'LX' 19 +0x00000D | 0x001D00 | 0x500000, +// 'WX' 20 +0x00000F | 0x004500 | 0x5D0000, +// 'YX' 21 +0x00000B | 0x001800 | 0x5A0000, +// 'WH' 22 +0x000012 | 0x003200 | 0x3C0000, +// 'R*' 23 +0x00000E | 0x001E00 | 0x6E0000, +// 'L*' 24 +0x00000B | 0x001800 | 0x5A0000, +// 'W*' 25 +0x000009 | 0x005300 | 0x6E0000, +// 'Y*' 26 +0x000006 | 0x002E00 | 0x510000, +// 'M*' 27 +0x000006 | 0x003600 | 0x790000, +// 'N*' 28 +0x000006 | 0x005600 | 0x650000, +// 'NX' 29 +0x000006 | 0x003600 | 0x790000, +// 'DX' 30 +0x000011 | 0x004300 | 0x5B0000, +// 'Q*' 31 +0x000006 | 0x004900 | 0x630000, +// 'S*' 32 +0x000006 | 0x004F00 | 0x6A0000, +// 'SH' 33 +0x000006 | 0x001A00 | 0x510000, +// 'F*' 34 +0x000006 | 0x004200 | 0x790000, +// 'TH' 35 +0x00000E | 0x004900 | 0x5D0000, +// '/H' 36 +0x000010 | 0x002500 | 0x520000, +// '/X' 37 +0x000009 | 0x003300 | 0x5D0000, +// 'Z*' 38 +0x00000A | 0x004200 | 0x670000, +// 'ZH' 39 +0x000008 | 0x002800 | 0x4C0000, +// 'V*' 40 +0x00000A | 0x002F00 | 0x5D0000, +// 'DH' 41 +0x000006 | 0x004F00 | 0x650000, +// 'CH' 42 +0x000006 | 0x004F00 | 0x650000, +// '**' 43 +0x000006 | 0x004200 | 0x790000, +// 'J*' 44 +0x000005 | 0x004F00 | 0x650000, +// '**' 45 +0x000006 | 0x006E00 | 0x790000, +// '**' 46 +0x000000 | 0x000000 | 0x000000, +// '**' 47 +0x000013 | 0x004800 | 0x5A0000, +// 'EY' 48 +0x00001B | 0x002700 | 0x580000, +// 'AY' 49 +0x000015 | 0x001F00 | 0x580000, +// 'OY' 50 +0x00001B | 0x002B00 | 0x580000, +// 'AW' 51 +0x000012 | 0x001E00 | 0x580000, +// 'OW' 52 +0x00000D | 0x002200 | 0x520000, +// 'UW' 53 +0x000006 | 0x001A00 | 0x510000, +// 'B*' 54 +0x000006 | 0x001A00 | 0x510000, +// '**' 55 +0x000006 | 0x001A00 | 0x510000, +// '**' 56 +0x000006 | 0x004200 | 0x790000, +// 'D*' 57 +0x000006 | 0x004200 | 0x790000, +// '**' 58 +0x000006 | 0x004200 | 0x790000, +// '**' 59 +0x000006 | 0x006E00 | 0x700000, +// 'G*' 60 +0x000006 | 0x006E00 | 0x6E0000, +// '**' 61 +0x000006 | 0x006E00 | 0x6E0000, +// '**' 62 +0x000006 | 0x005400 | 0x5E0000, +// 'GX' 63 +0x000006 | 0x005400 | 0x5E0000, +// '**' 64 +0x000006 | 0x005400 | 0x5E0000, +// '**' 65 +0x000006 | 0x001A00 | 0x510000, +// 'P*' 66 +0x000006 | 0x001A00 | 0x510000, +// '**' 67 +0x000006 | 0x001A00 | 0x510000, +// '**' 68 +0x000006 | 0x004200 | 0x790000, +// 'T*' 69 +0x000006 | 0x004200 | 0x790000, +// '**' 70 +0x000006 | 0x004200 | 0x790000, +// '**' 71 +0x000006 | 0x006D00 | 0x650000, +// 'K*' 72 +0x00000A | 0x005600 | 0x650000, +// '**' 73 +0x00000A | 0x006D00 | 0x700000, +// '**' 74 +0x000006 | 0x005400 | 0x5E0000, +// 'KX' 75 +0x000006 | 0x005400 | 0x5E0000, +// '**' 76 +0x000006 | 0x005400 | 0x5E0000, +// '**' 77 +0x00002C | 0x007F00 | 0x080000, +// 'UL' 78 0x000013 | 0x007F00 | 0x010000 // 'UM' 79 ]; + /** * * ampl1data[X] = ampldata[X] & 0xFF; // F1 amplitude * ampl2data[X] = (ampldata[X] >> 8) & 0xFF; // F2 amplitude * ampl3data[X] = (ampldata[X] >> 16) & 0xFF; // F3 amplitude */ - -let ampldata = [// ampl1 | ampl2 | ampl3 -0x000000 | 0x000000 | 0x000000, // ' *' 00 -0x000000 | 0x000000 | 0x000000, // '.*' 01 -0x000000 | 0x000000 | 0x000000, // '?*' 02 -0x000000 | 0x000000 | 0x000000, // ',*' 03 -0x000000 | 0x000000 | 0x000000, // '-*' 04 -0x00000D | 0x000A00 | 0x080000, // 'IY' 05 -0x00000D | 0x000B00 | 0x070000, // 'IH' 06 -0x00000E | 0x000D00 | 0x080000, // 'EH' 07 -0x00000F | 0x000E00 | 0x080000, // 'AE' 08 -0x00000F | 0x000D00 | 0x010000, // 'AA' 09 -0x00000F | 0x000C00 | 0x010000, // 'AH' 10 -0x00000F | 0x000C00 | 0x000000, // 'AO' 11 -0x00000F | 0x000B00 | 0x010000, // 'UH' 12 -0x00000C | 0x000900 | 0x000000, // 'AX' 13 -0x00000D | 0x000B00 | 0x070000, // 'IX' 14 -0x00000C | 0x000B00 | 0x050000, // 'ER' 15 -0x00000F | 0x000C00 | 0x010000, // 'UX' 16 -0x00000F | 0x000C00 | 0x000000, // 'OH' 17 -0x00000D | 0x000C00 | 0x060000, // 'RX' 18 -0x00000D | 0x000800 | 0x010000, // 'LX' 19 -0x00000D | 0x000800 | 0x000000, // 'WX' 20 -0x00000E | 0x000C00 | 0x070000, // 'YX' 21 -0x00000D | 0x000800 | 0x000000, // 'WH' 22 -0x00000C | 0x000A00 | 0x050000, // 'R*' 23 -0x00000D | 0x000800 | 0x010000, // 'L*' 24 -0x00000D | 0x000800 | 0x000000, // 'W*' 25 -0x00000D | 0x000A00 | 0x080000, // 'Y*' 26 -0x00000C | 0x000300 | 0x000000, // 'M*' 27 -0x000009 | 0x000900 | 0x000000, // 'N*' 28 -0x000009 | 0x000600 | 0x030000, // 'NX' 29 -0x000000 | 0x000000 | 0x000000, // 'DX' 30 -0x000000 | 0x000000 | 0x000000, // 'Q*' 31 -0x000000 | 0x000000 | 0x000000, // 'S*' 32 -0x000000 | 0x000000 | 0x000000, // 'SH' 33 -0x000000 | 0x000000 | 0x000000, // 'F*' 34 -0x000000 | 0x000000 | 0x000000, // 'TH' 35 -0x000000 | 0x000000 | 0x000000, // '/H' 36 -0x000000 | 0x000000 | 0x000000, // '/X' 37 -0x00000B | 0x000300 | 0x000000, // 'Z*' 38 -0x00000B | 0x000500 | 0x010000, // 'ZH' 39 -0x00000B | 0x000300 | 0x000000, // 'V*' 40 -0x00000B | 0x000400 | 0x000000, // 'DH' 41 -0x000000 | 0x000000 | 0x000000, // 'CH' 42 -0x000000 | 0x000000 | 0x000000, // '**' 43 -0x000001 | 0x000000 | 0x000000, // 'J*' 44 -0x00000B | 0x000500 | 0x010000, // '**' 45 -0x000000 | 0x000A00 | 0x0E0000, // '**' 46 -0x000002 | 0x000200 | 0x010000, // '**' 47 -0x00000E | 0x000E00 | 0x090000, // 'EY' 48 -0x00000F | 0x000D00 | 0x010000, // 'AY' 49 -0x00000F | 0x000C00 | 0x000000, // 'OY' 50 -0x00000F | 0x000D00 | 0x010000, // 'AW' 51 -0x00000F | 0x000C00 | 0x000000, // 'OW' 52 -0x00000D | 0x000800 | 0x000000, // 'UW' 53 -0x000002 | 0x000000 | 0x000000, // 'B*' 54 -0x000004 | 0x000100 | 0x000000, // '**' 55 -0x000000 | 0x000000 | 0x000000, // '**' 56 -0x000002 | 0x000000 | 0x000000, // 'D*' 57 -0x000004 | 0x000100 | 0x000000, // '**' 58 -0x000000 | 0x000000 | 0x000000, // '**' 59 -0x000001 | 0x000000 | 0x000000, // 'G*' 60 -0x000004 | 0x000100 | 0x000000, // '**' 61 -0x000000 | 0x000000 | 0x000000, // '**' 62 -0x000001 | 0x000000 | 0x000000, // 'GX' 63 -0x000004 | 0x000100 | 0x000000, // '**' 64 -0x000000 | 0x000000 | 0x000000, // '**' 65 -0x000000 | 0x000000 | 0x000000, // 'P*' 66 -0x000000 | 0x000000 | 0x000000, // '**' 67 -0x000000 | 0x000000 | 0x000000, // '**' 68 -0x000000 | 0x000000 | 0x000000, // 'T*' 69 -0x000000 | 0x000000 | 0x000000, // '**' 70 -0x000000 | 0x000000 | 0x000000, // '**' 71 -0x000000 | 0x000000 | 0x000000, // 'K*' 72 -0x00000C | 0x000A00 | 0x070000, // '**' 73 -0x000000 | 0x000000 | 0x000000, // '**' 74 -0x000000 | 0x000000 | 0x000000, // 'KX' 75 -0x000000 | 0x000A00 | 0x050000, // '**' 76 -0x000000 | 0x000000 | 0x000000, // '**' 77 -0x00000F | 0x000000 | 0x130000, // 'UL' 78 +let ampldata = [ +// ampl1 | ampl2 | ampl3 +0x000000 | 0x000000 | 0x000000, +// ' *' 00 +0x000000 | 0x000000 | 0x000000, +// '.*' 01 +0x000000 | 0x000000 | 0x000000, +// '?*' 02 +0x000000 | 0x000000 | 0x000000, +// ',*' 03 +0x000000 | 0x000000 | 0x000000, +// '-*' 04 +0x00000D | 0x000A00 | 0x080000, +// 'IY' 05 +0x00000D | 0x000B00 | 0x070000, +// 'IH' 06 +0x00000E | 0x000D00 | 0x080000, +// 'EH' 07 +0x00000F | 0x000E00 | 0x080000, +// 'AE' 08 +0x00000F | 0x000D00 | 0x010000, +// 'AA' 09 +0x00000F | 0x000C00 | 0x010000, +// 'AH' 10 +0x00000F | 0x000C00 | 0x000000, +// 'AO' 11 +0x00000F | 0x000B00 | 0x010000, +// 'UH' 12 +0x00000C | 0x000900 | 0x000000, +// 'AX' 13 +0x00000D | 0x000B00 | 0x070000, +// 'IX' 14 +0x00000C | 0x000B00 | 0x050000, +// 'ER' 15 +0x00000F | 0x000C00 | 0x010000, +// 'UX' 16 +0x00000F | 0x000C00 | 0x000000, +// 'OH' 17 +0x00000D | 0x000C00 | 0x060000, +// 'RX' 18 +0x00000D | 0x000800 | 0x010000, +// 'LX' 19 +0x00000D | 0x000800 | 0x000000, +// 'WX' 20 +0x00000E | 0x000C00 | 0x070000, +// 'YX' 21 +0x00000D | 0x000800 | 0x000000, +// 'WH' 22 +0x00000C | 0x000A00 | 0x050000, +// 'R*' 23 +0x00000D | 0x000800 | 0x010000, +// 'L*' 24 +0x00000D | 0x000800 | 0x000000, +// 'W*' 25 +0x00000D | 0x000A00 | 0x080000, +// 'Y*' 26 +0x00000C | 0x000300 | 0x000000, +// 'M*' 27 +0x000009 | 0x000900 | 0x000000, +// 'N*' 28 +0x000009 | 0x000600 | 0x030000, +// 'NX' 29 +0x000000 | 0x000000 | 0x000000, +// 'DX' 30 +0x000000 | 0x000000 | 0x000000, +// 'Q*' 31 +0x000000 | 0x000000 | 0x000000, +// 'S*' 32 +0x000000 | 0x000000 | 0x000000, +// 'SH' 33 +0x000000 | 0x000000 | 0x000000, +// 'F*' 34 +0x000000 | 0x000000 | 0x000000, +// 'TH' 35 +0x000000 | 0x000000 | 0x000000, +// '/H' 36 +0x000000 | 0x000000 | 0x000000, +// '/X' 37 +0x00000B | 0x000300 | 0x000000, +// 'Z*' 38 +0x00000B | 0x000500 | 0x010000, +// 'ZH' 39 +0x00000B | 0x000300 | 0x000000, +// 'V*' 40 +0x00000B | 0x000400 | 0x000000, +// 'DH' 41 +0x000000 | 0x000000 | 0x000000, +// 'CH' 42 +0x000000 | 0x000000 | 0x000000, +// '**' 43 +0x000001 | 0x000000 | 0x000000, +// 'J*' 44 +0x00000B | 0x000500 | 0x010000, +// '**' 45 +0x000000 | 0x000A00 | 0x0E0000, +// '**' 46 +0x000002 | 0x000200 | 0x010000, +// '**' 47 +0x00000E | 0x000E00 | 0x090000, +// 'EY' 48 +0x00000F | 0x000D00 | 0x010000, +// 'AY' 49 +0x00000F | 0x000C00 | 0x000000, +// 'OY' 50 +0x00000F | 0x000D00 | 0x010000, +// 'AW' 51 +0x00000F | 0x000C00 | 0x000000, +// 'OW' 52 +0x00000D | 0x000800 | 0x000000, +// 'UW' 53 +0x000002 | 0x000000 | 0x000000, +// 'B*' 54 +0x000004 | 0x000100 | 0x000000, +// '**' 55 +0x000000 | 0x000000 | 0x000000, +// '**' 56 +0x000002 | 0x000000 | 0x000000, +// 'D*' 57 +0x000004 | 0x000100 | 0x000000, +// '**' 58 +0x000000 | 0x000000 | 0x000000, +// '**' 59 +0x000001 | 0x000000 | 0x000000, +// 'G*' 60 +0x000004 | 0x000100 | 0x000000, +// '**' 61 +0x000000 | 0x000000 | 0x000000, +// '**' 62 +0x000001 | 0x000000 | 0x000000, +// 'GX' 63 +0x000004 | 0x000100 | 0x000000, +// '**' 64 +0x000000 | 0x000000 | 0x000000, +// '**' 65 +0x000000 | 0x000000 | 0x000000, +// 'P*' 66 +0x000000 | 0x000000 | 0x000000, +// '**' 67 +0x000000 | 0x000000 | 0x000000, +// '**' 68 +0x000000 | 0x000000 | 0x000000, +// 'T*' 69 +0x000000 | 0x000000 | 0x000000, +// '**' 70 +0x000000 | 0x000000 | 0x000000, +// '**' 71 +0x000000 | 0x000000 | 0x000000, +// 'K*' 72 +0x00000C | 0x000A00 | 0x070000, +// '**' 73 +0x000000 | 0x000000 | 0x000000, +// '**' 74 +0x000000 | 0x000000 | 0x000000, +// 'KX' 75 +0x000000 | 0x000A00 | 0x050000, +// '**' 76 +0x000000 | 0x000000 | 0x000000, +// '**' 77 +0x00000F | 0x000000 | 0x130000, +// 'UL' 78 0x00000F | 0x000000 | 0x100000 // 'UM' 79 -]; // Sampled data for consonants, consisting of five 256-byte sections - -let sampleTable = [//00 T', S, Z (coronal) -0x38, 0x84, 0x6B, 0x19, 0xC6, 0x63, 0x18, 0x86, 0x73, 0x98, 0xC6, 0xB1, 0x1C, 0xCA, 0x31, 0x8C, 0xC7, 0x31, 0x88, 0xC2, 0x30, 0x98, 0x46, 0x31, 0x18, 0xC6, 0x35, 0x0C, 0xCA, 0x31, 0x0C, 0xC6, //20 -0x21, 0x10, 0x24, 0x69, 0x12, 0xC2, 0x31, 0x14, 0xC4, 0x71, 0x08, 0x4A, 0x22, 0x49, 0xAB, 0x6A, 0xA8, 0xAC, 0x49, 0x51, 0x32, 0xD5, 0x52, 0x88, 0x93, 0x6C, 0x94, 0x22, 0x15, 0x54, 0xD2, 0x25, //40 -0x96, 0xD4, 0x50, 0xA5, 0x46, 0x21, 0x08, 0x85, 0x6B, 0x18, 0xC4, 0x63, 0x10, 0xCE, 0x6B, 0x18, 0x8C, 0x71, 0x19, 0x8C, 0x63, 0x35, 0x0C, 0xC6, 0x33, 0x99, 0xCC, 0x6C, 0xB5, 0x4E, 0xA2, 0x99, //60 -0x46, 0x21, 0x28, 0x82, 0x95, 0x2E, 0xE3, 0x30, 0x9C, 0xC5, 0x30, 0x9C, 0xA2, 0xB1, 0x9C, 0x67, 0x31, 0x88, 0x66, 0x59, 0x2C, 0x53, 0x18, 0x84, 0x67, 0x50, 0xCA, 0xE3, 0x0A, 0xAC, 0xAB, 0x30, //80 -0xAC, 0x62, 0x30, 0x8C, 0x63, 0x10, 0x94, 0x62, 0xB1, 0x8C, 0x82, 0x28, 0x96, 0x33, 0x98, 0xD6, 0xB5, 0x4C, 0x62, 0x29, 0xA5, 0x4A, 0xB5, 0x9C, 0xC6, 0x31, 0x14, 0xD6, 0x38, 0x9C, 0x4B, 0xB4, //A0 -0x86, 0x65, 0x18, 0xAE, 0x67, 0x1C, 0xA6, 0x63, 0x19, 0x96, 0x23, 0x19, 0x84, 0x13, 0x08, 0xA6, 0x52, 0xAC, 0xCA, 0x22, 0x89, 0x6E, 0xAB, 0x19, 0x8C, 0x62, 0x34, 0xC4, 0x62, 0x19, 0x86, 0x63, //C0 -0x18, 0xC4, 0x23, 0x58, 0xD6, 0xA3, 0x50, 0x42, 0x54, 0x4A, 0xAD, 0x4A, 0x25, 0x11, 0x6B, 0x64, 0x89, 0x4A, 0x63, 0x39, 0x8A, 0x23, 0x31, 0x2A, 0xEA, 0xA2, 0xA9, 0x44, 0xC5, 0x12, 0xCD, 0x42, //E0 -0x34, 0x8C, 0x62, 0x18, 0x8C, 0x63, 0x11, 0x48, 0x66, 0x31, 0x9D, 0x44, 0x33, 0x1D, 0x46, 0x31, 0x9C, 0xC6, 0xB1, 0x0C, 0xCD, 0x32, 0x88, 0xC4, 0x73, 0x18, 0x86, 0x73, 0x08, 0xD6, 0x63, 0x58, //100 CH', J', SH, ZH (palato-alveolar) -0x07, 0x81, 0xE0, 0xF0, 0x3C, 0x07, 0x87, 0x90, 0x3C, 0x7C, 0x0F, 0xC7, 0xC0, 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x80, 0x80, 0x00, 0x1C, 0x78, 0x70, 0xF1, 0xC7, 0x1F, 0xC0, 0x0C, 0xFE, 0x1C, 0x1F, //120 -0x1F, 0x0E, 0x0A, 0x7A, 0xC0, 0x71, 0xF2, 0x83, 0x8F, 0x03, 0x0F, 0x0F, 0x0C, 0x00, 0x79, 0xF8, 0x61, 0xE0, 0x43, 0x0F, 0x83, 0xE7, 0x18, 0xF9, 0xC1, 0x13, 0xDA, 0xE9, 0x63, 0x8F, 0x0F, 0x83, //140 -0x83, 0x87, 0xC3, 0x1F, 0x3C, 0x70, 0xF0, 0xE1, 0xE1, 0xE3, 0x87, 0xB8, 0x71, 0x0E, 0x20, 0xE3, 0x8D, 0x48, 0x78, 0x1C, 0x93, 0x87, 0x30, 0xE1, 0xC1, 0xC1, 0xE4, 0x78, 0x21, 0x83, 0x83, 0xC3, //160 -0x87, 0x06, 0x39, 0xE5, 0xC3, 0x87, 0x07, 0x0E, 0x1C, 0x1C, 0x70, 0xF4, 0x71, 0x9C, 0x60, 0x36, 0x32, 0xC3, 0x1E, 0x3C, 0xF3, 0x8F, 0x0E, 0x3C, 0x70, 0xE3, 0xC7, 0x8F, 0x0F, 0x0F, 0x0E, 0x3C, //180 -0x78, 0xF0, 0xE3, 0x87, 0x06, 0xF0, 0xE3, 0x07, 0xC1, 0x99, 0x87, 0x0F, 0x18, 0x78, 0x70, 0x70, 0xFC, 0xF3, 0x10, 0xB1, 0x8C, 0x8C, 0x31, 0x7C, 0x70, 0xE1, 0x86, 0x3C, 0x64, 0x6C, 0xB0, 0xE1, //1A0 -0xE3, 0x0F, 0x23, 0x8F, 0x0F, 0x1E, 0x3E, 0x38, 0x3C, 0x38, 0x7B, 0x8F, 0x07, 0x0E, 0x3C, 0xF4, 0x17, 0x1E, 0x3C, 0x78, 0xF2, 0x9E, 0x72, 0x49, 0xE3, 0x25, 0x36, 0x38, 0x58, 0x39, 0xE2, 0xDE, //1C0 -0x3C, 0x78, 0x78, 0xE1, 0xC7, 0x61, 0xE1, 0xE1, 0xB0, 0xF0, 0xF0, 0xC3, 0xC7, 0x0E, 0x38, 0xC0, 0xF0, 0xCE, 0x73, 0x73, 0x18, 0x34, 0xB0, 0xE1, 0xC7, 0x8E, 0x1C, 0x3C, 0xF8, 0x38, 0xF0, 0xE1, //1E0 -0xC1, 0x8B, 0x86, 0x8F, 0x1C, 0x78, 0x70, 0xF0, 0x78, 0xAC, 0xB1, 0x8F, 0x39, 0x31, 0xDB, 0x38, 0x61, 0xC3, 0x0E, 0x0E, 0x38, 0x78, 0x73, 0x17, 0x1E, 0x39, 0x1E, 0x38, 0x64, 0xE1, 0xF1, 0xC1, //200 P', F, V, TH, DH ([labio]dental) -0x4E, 0x0F, 0x40, 0xA2, 0x02, 0xC5, 0x8F, 0x81, 0xA1, 0xFC, 0x12, 0x08, 0x64, 0xE0, 0x3C, 0x22, 0xE0, 0x45, 0x07, 0x8E, 0x0C, 0x32, 0x90, 0xF0, 0x1F, 0x20, 0x49, 0xE0, 0xF8, 0x0C, 0x60, 0xF0, //220 -0x17, 0x1A, 0x41, 0xAA, 0xA4, 0xD0, 0x8D, 0x12, 0x82, 0x1E, 0x1E, 0x03, 0xF8, 0x3E, 0x03, 0x0C, 0x73, 0x80, 0x70, 0x44, 0x26, 0x03, 0x24, 0xE1, 0x3E, 0x04, 0x4E, 0x04, 0x1C, 0xC1, 0x09, 0xCC, //240 -0x9E, 0x90, 0x21, 0x07, 0x90, 0x43, 0x64, 0xC0, 0x0F, 0xC6, 0x90, 0x9C, 0xC1, 0x5B, 0x03, 0xE2, 0x1D, 0x81, 0xE0, 0x5E, 0x1D, 0x03, 0x84, 0xB8, 0x2C, 0x0F, 0x80, 0xB1, 0x83, 0xE0, 0x30, 0x41, //260 -0x1E, 0x43, 0x89, 0x83, 0x50, 0xFC, 0x24, 0x2E, 0x13, 0x83, 0xF1, 0x7C, 0x4C, 0x2C, 0xC9, 0x0D, 0x83, 0xB0, 0xB5, 0x82, 0xE4, 0xE8, 0x06, 0x9C, 0x07, 0xA0, 0x99, 0x1D, 0x07, 0x3E, 0x82, 0x8F, //280 -0x70, 0x30, 0x74, 0x40, 0xCA, 0x10, 0xE4, 0xE8, 0x0F, 0x92, 0x14, 0x3F, 0x06, 0xF8, 0x84, 0x88, 0x43, 0x81, 0x0A, 0x34, 0x39, 0x41, 0xC6, 0xE3, 0x1C, 0x47, 0x03, 0xB0, 0xB8, 0x13, 0x0A, 0xC2, //2A0 -0x64, 0xF8, 0x18, 0xF9, 0x60, 0xB3, 0xC0, 0x65, 0x20, 0x60, 0xA6, 0x8C, 0xC3, 0x81, 0x20, 0x30, 0x26, 0x1E, 0x1C, 0x38, 0xD3, 0x01, 0xB0, 0x26, 0x40, 0xF4, 0x0B, 0xC3, 0x42, 0x1F, 0x85, 0x32, //2C0 -0x26, 0x60, 0x40, 0xC9, 0xCB, 0x01, 0xEC, 0x11, 0x28, 0x40, 0xFA, 0x04, 0x34, 0xE0, 0x70, 0x4C, 0x8C, 0x1D, 0x07, 0x69, 0x03, 0x16, 0xC8, 0x04, 0x23, 0xE8, 0xC6, 0x9A, 0x0B, 0x1A, 0x03, 0xE0, //2E0 -0x76, 0x06, 0x05, 0xCF, 0x1E, 0xBC, 0x58, 0x31, 0x71, 0x66, 0x00, 0xF8, 0x3F, 0x04, 0xFC, 0x0C, 0x74, 0x27, 0x8A, 0x80, 0x71, 0xC2, 0x3A, 0x26, 0x06, 0xC0, 0x1F, 0x05, 0x0F, 0x98, 0x40, 0xAE, //300 /H (palatal) -0x01, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x0E, 0xFE, 0x00, 0x03, 0xDF, 0x80, 0x03, 0xEF, 0x80, 0x1B, 0xF1, 0xC2, 0x00, 0xE7, 0xE0, 0x18, 0xFC, 0xE0, 0x21, 0xFC, 0x80, 0x3C, 0xFC, 0x40, 0x0E, 0x7E, //320 -0x00, 0x3F, 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x3E, 0xF0, 0x07, 0xFC, 0x00, 0x7E, 0x10, 0x3F, 0xFF, 0x00, 0x3F, 0x38, 0x0E, 0x7C, 0x01, 0x87, 0x0C, 0xFC, 0xC7, 0x00, 0x3E, 0x04, //340 -0x0F, 0x3E, 0x1F, 0x0F, 0x0F, 0x1F, 0x0F, 0x02, 0x83, 0x87, 0xCF, 0x03, 0x87, 0x0F, 0x3F, 0xC0, 0x07, 0x9E, 0x60, 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x77, 0xE1, 0xC0, 0xFE, 0xE0, 0xC3, //360 -0xE0, 0x01, 0xDF, 0xF8, 0x03, 0x07, 0x00, 0x7E, 0x70, 0x00, 0x7C, 0x38, 0x18, 0xFE, 0x0C, 0x1E, 0x78, 0x1C, 0x7C, 0x3E, 0x0E, 0x1F, 0x1E, 0x1E, 0x3E, 0x00, 0x7F, 0x83, 0x07, 0xDB, 0x87, 0x83, //380 -0x07, 0xC7, 0x07, 0x10, 0x71, 0xFF, 0x00, 0x3F, 0xE2, 0x01, 0xE0, 0xC1, 0xC3, 0xE1, 0x00, 0x7F, 0xC0, 0x05, 0xF0, 0x20, 0xF8, 0xF0, 0x70, 0xFE, 0x78, 0x79, 0xF8, 0x02, 0x3F, 0x0C, 0x8F, 0x03, //3a0 -0x0F, 0x9F, 0xE0, 0xC1, 0xC7, 0x87, 0x03, 0xC3, 0xC3, 0xB0, 0xE1, 0xE1, 0xC1, 0xE3, 0xE0, 0x71, 0xF0, 0x00, 0xFC, 0x70, 0x7C, 0x0C, 0x3E, 0x38, 0x0E, 0x1C, 0x70, 0xC3, 0xC7, 0x03, 0x81, 0xC1, //3c0 -0xC7, 0xE7, 0x00, 0x0F, 0xC7, 0x87, 0x19, 0x09, 0xEF, 0xC4, 0x33, 0xE0, 0xC1, 0xFC, 0xF8, 0x70, 0xF0, 0x78, 0xF8, 0xF0, 0x61, 0xC7, 0x00, 0x1F, 0xF8, 0x01, 0x7C, 0xF8, 0xF0, 0x78, 0x70, 0x3C, //3e0 -0x7C, 0xCE, 0x0E, 0x21, 0x83, 0xCF, 0x08, 0x07, 0x8F, 0x08, 0xC1, 0x87, 0x8F, 0x80, 0xC7, 0xE3, 0x00, 0x07, 0xF8, 0xE0, 0xEF, 0x00, 0x39, 0xF7, 0x80, 0x0E, 0xF8, 0xE1, 0xE3, 0xF8, 0x21, 0x9F, //400 /X (glottal) -0xC0, 0xFF, 0x03, 0xF8, 0x07, 0xC0, 0x1F, 0xF8, 0xC4, 0x04, 0xFC, 0xC4, 0xC1, 0xBC, 0x87, 0xF0, 0x0F, 0xC0, 0x7F, 0x05, 0xE0, 0x25, 0xEC, 0xC0, 0x3E, 0x84, 0x47, 0xF0, 0x8E, 0x03, 0xF8, 0x03, //420 -0xFB, 0xC0, 0x19, 0xF8, 0x07, 0x9C, 0x0C, 0x17, 0xF8, 0x07, 0xE0, 0x1F, 0xA1, 0xFC, 0x0F, 0xFC, 0x01, 0xF0, 0x3F, 0x00, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0xFD, 0x00, 0xFF, 0x88, 0x0D, 0xF9, 0x01, //440 -0xFF, 0x00, 0x70, 0x07, 0xC0, 0x3E, 0x42, 0xF3, 0x0D, 0xC4, 0x7F, 0x80, 0xFC, 0x07, 0xF0, 0x5E, 0xC0, 0x3F, 0x00, 0x78, 0x3F, 0x81, 0xFF, 0x01, 0xF8, 0x01, 0xC3, 0xE8, 0x0C, 0xE4, 0x64, 0x8F, //460 -0xE4, 0x0F, 0xF0, 0x07, 0xF0, 0xC2, 0x1F, 0x00, 0x7F, 0xC0, 0x6F, 0x80, 0x7E, 0x03, 0xF8, 0x07, 0xF0, 0x3F, 0xC0, 0x78, 0x0F, 0x82, 0x07, 0xFE, 0x22, 0x77, 0x70, 0x02, 0x76, 0x03, 0xFE, 0x00, //480 -0xFE, 0x67, 0x00, 0x7C, 0xC7, 0xF1, 0x8E, 0xC6, 0x3B, 0xE0, 0x3F, 0x84, 0xF3, 0x19, 0xD8, 0x03, 0x99, 0xFC, 0x09, 0xB8, 0x0F, 0xF8, 0x00, 0x9D, 0x24, 0x61, 0xF9, 0x0D, 0x00, 0xFD, 0x03, 0xF0, //4a0 -0x1F, 0x90, 0x3F, 0x01, 0xF8, 0x1F, 0xD0, 0x0F, 0xF8, 0x37, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFA, 0x03, 0xF0, 0x0F, 0x80, 0xFF, 0x01, //4c0 -0xB8, 0x07, 0xF0, 0x01, 0xFC, 0x01, 0xBC, 0x80, 0x13, 0x1E, 0x00, 0x7F, 0xE1, 0x40, 0x7F, 0xA0, 0x7F, 0xB0, 0x00, 0x3F, 0xC0, 0x1F, 0xC0, 0x38, 0x0F, 0xF0, 0x1F, 0x80, 0xFF, 0x01, 0xFC, 0x03, //4e0 +]; + +// Sampled data for consonants, consisting of five 256-byte sections +let sampleTable = [ +//00 T', S, Z (coronal) +0x38, 0x84, 0x6B, 0x19, 0xC6, 0x63, 0x18, 0x86, 0x73, 0x98, 0xC6, 0xB1, 0x1C, 0xCA, 0x31, 0x8C, 0xC7, 0x31, 0x88, 0xC2, 0x30, 0x98, 0x46, 0x31, 0x18, 0xC6, 0x35, 0x0C, 0xCA, 0x31, 0x0C, 0xC6, +//20 +0x21, 0x10, 0x24, 0x69, 0x12, 0xC2, 0x31, 0x14, 0xC4, 0x71, 0x08, 0x4A, 0x22, 0x49, 0xAB, 0x6A, 0xA8, 0xAC, 0x49, 0x51, 0x32, 0xD5, 0x52, 0x88, 0x93, 0x6C, 0x94, 0x22, 0x15, 0x54, 0xD2, 0x25, +//40 +0x96, 0xD4, 0x50, 0xA5, 0x46, 0x21, 0x08, 0x85, 0x6B, 0x18, 0xC4, 0x63, 0x10, 0xCE, 0x6B, 0x18, 0x8C, 0x71, 0x19, 0x8C, 0x63, 0x35, 0x0C, 0xC6, 0x33, 0x99, 0xCC, 0x6C, 0xB5, 0x4E, 0xA2, 0x99, +//60 +0x46, 0x21, 0x28, 0x82, 0x95, 0x2E, 0xE3, 0x30, 0x9C, 0xC5, 0x30, 0x9C, 0xA2, 0xB1, 0x9C, 0x67, 0x31, 0x88, 0x66, 0x59, 0x2C, 0x53, 0x18, 0x84, 0x67, 0x50, 0xCA, 0xE3, 0x0A, 0xAC, 0xAB, 0x30, +//80 +0xAC, 0x62, 0x30, 0x8C, 0x63, 0x10, 0x94, 0x62, 0xB1, 0x8C, 0x82, 0x28, 0x96, 0x33, 0x98, 0xD6, 0xB5, 0x4C, 0x62, 0x29, 0xA5, 0x4A, 0xB5, 0x9C, 0xC6, 0x31, 0x14, 0xD6, 0x38, 0x9C, 0x4B, 0xB4, +//A0 +0x86, 0x65, 0x18, 0xAE, 0x67, 0x1C, 0xA6, 0x63, 0x19, 0x96, 0x23, 0x19, 0x84, 0x13, 0x08, 0xA6, 0x52, 0xAC, 0xCA, 0x22, 0x89, 0x6E, 0xAB, 0x19, 0x8C, 0x62, 0x34, 0xC4, 0x62, 0x19, 0x86, 0x63, +//C0 +0x18, 0xC4, 0x23, 0x58, 0xD6, 0xA3, 0x50, 0x42, 0x54, 0x4A, 0xAD, 0x4A, 0x25, 0x11, 0x6B, 0x64, 0x89, 0x4A, 0x63, 0x39, 0x8A, 0x23, 0x31, 0x2A, 0xEA, 0xA2, 0xA9, 0x44, 0xC5, 0x12, 0xCD, 0x42, +//E0 +0x34, 0x8C, 0x62, 0x18, 0x8C, 0x63, 0x11, 0x48, 0x66, 0x31, 0x9D, 0x44, 0x33, 0x1D, 0x46, 0x31, 0x9C, 0xC6, 0xB1, 0x0C, 0xCD, 0x32, 0x88, 0xC4, 0x73, 0x18, 0x86, 0x73, 0x08, 0xD6, 0x63, 0x58, +//100 CH', J', SH, ZH (palato-alveolar) +0x07, 0x81, 0xE0, 0xF0, 0x3C, 0x07, 0x87, 0x90, 0x3C, 0x7C, 0x0F, 0xC7, 0xC0, 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x80, 0x80, 0x00, 0x1C, 0x78, 0x70, 0xF1, 0xC7, 0x1F, 0xC0, 0x0C, 0xFE, 0x1C, 0x1F, +//120 +0x1F, 0x0E, 0x0A, 0x7A, 0xC0, 0x71, 0xF2, 0x83, 0x8F, 0x03, 0x0F, 0x0F, 0x0C, 0x00, 0x79, 0xF8, 0x61, 0xE0, 0x43, 0x0F, 0x83, 0xE7, 0x18, 0xF9, 0xC1, 0x13, 0xDA, 0xE9, 0x63, 0x8F, 0x0F, 0x83, +//140 +0x83, 0x87, 0xC3, 0x1F, 0x3C, 0x70, 0xF0, 0xE1, 0xE1, 0xE3, 0x87, 0xB8, 0x71, 0x0E, 0x20, 0xE3, 0x8D, 0x48, 0x78, 0x1C, 0x93, 0x87, 0x30, 0xE1, 0xC1, 0xC1, 0xE4, 0x78, 0x21, 0x83, 0x83, 0xC3, +//160 +0x87, 0x06, 0x39, 0xE5, 0xC3, 0x87, 0x07, 0x0E, 0x1C, 0x1C, 0x70, 0xF4, 0x71, 0x9C, 0x60, 0x36, 0x32, 0xC3, 0x1E, 0x3C, 0xF3, 0x8F, 0x0E, 0x3C, 0x70, 0xE3, 0xC7, 0x8F, 0x0F, 0x0F, 0x0E, 0x3C, +//180 +0x78, 0xF0, 0xE3, 0x87, 0x06, 0xF0, 0xE3, 0x07, 0xC1, 0x99, 0x87, 0x0F, 0x18, 0x78, 0x70, 0x70, 0xFC, 0xF3, 0x10, 0xB1, 0x8C, 0x8C, 0x31, 0x7C, 0x70, 0xE1, 0x86, 0x3C, 0x64, 0x6C, 0xB0, 0xE1, +//1A0 +0xE3, 0x0F, 0x23, 0x8F, 0x0F, 0x1E, 0x3E, 0x38, 0x3C, 0x38, 0x7B, 0x8F, 0x07, 0x0E, 0x3C, 0xF4, 0x17, 0x1E, 0x3C, 0x78, 0xF2, 0x9E, 0x72, 0x49, 0xE3, 0x25, 0x36, 0x38, 0x58, 0x39, 0xE2, 0xDE, +//1C0 +0x3C, 0x78, 0x78, 0xE1, 0xC7, 0x61, 0xE1, 0xE1, 0xB0, 0xF0, 0xF0, 0xC3, 0xC7, 0x0E, 0x38, 0xC0, 0xF0, 0xCE, 0x73, 0x73, 0x18, 0x34, 0xB0, 0xE1, 0xC7, 0x8E, 0x1C, 0x3C, 0xF8, 0x38, 0xF0, 0xE1, +//1E0 +0xC1, 0x8B, 0x86, 0x8F, 0x1C, 0x78, 0x70, 0xF0, 0x78, 0xAC, 0xB1, 0x8F, 0x39, 0x31, 0xDB, 0x38, 0x61, 0xC3, 0x0E, 0x0E, 0x38, 0x78, 0x73, 0x17, 0x1E, 0x39, 0x1E, 0x38, 0x64, 0xE1, 0xF1, 0xC1, +//200 P', F, V, TH, DH ([labio]dental) +0x4E, 0x0F, 0x40, 0xA2, 0x02, 0xC5, 0x8F, 0x81, 0xA1, 0xFC, 0x12, 0x08, 0x64, 0xE0, 0x3C, 0x22, 0xE0, 0x45, 0x07, 0x8E, 0x0C, 0x32, 0x90, 0xF0, 0x1F, 0x20, 0x49, 0xE0, 0xF8, 0x0C, 0x60, 0xF0, +//220 +0x17, 0x1A, 0x41, 0xAA, 0xA4, 0xD0, 0x8D, 0x12, 0x82, 0x1E, 0x1E, 0x03, 0xF8, 0x3E, 0x03, 0x0C, 0x73, 0x80, 0x70, 0x44, 0x26, 0x03, 0x24, 0xE1, 0x3E, 0x04, 0x4E, 0x04, 0x1C, 0xC1, 0x09, 0xCC, +//240 +0x9E, 0x90, 0x21, 0x07, 0x90, 0x43, 0x64, 0xC0, 0x0F, 0xC6, 0x90, 0x9C, 0xC1, 0x5B, 0x03, 0xE2, 0x1D, 0x81, 0xE0, 0x5E, 0x1D, 0x03, 0x84, 0xB8, 0x2C, 0x0F, 0x80, 0xB1, 0x83, 0xE0, 0x30, 0x41, +//260 +0x1E, 0x43, 0x89, 0x83, 0x50, 0xFC, 0x24, 0x2E, 0x13, 0x83, 0xF1, 0x7C, 0x4C, 0x2C, 0xC9, 0x0D, 0x83, 0xB0, 0xB5, 0x82, 0xE4, 0xE8, 0x06, 0x9C, 0x07, 0xA0, 0x99, 0x1D, 0x07, 0x3E, 0x82, 0x8F, +//280 +0x70, 0x30, 0x74, 0x40, 0xCA, 0x10, 0xE4, 0xE8, 0x0F, 0x92, 0x14, 0x3F, 0x06, 0xF8, 0x84, 0x88, 0x43, 0x81, 0x0A, 0x34, 0x39, 0x41, 0xC6, 0xE3, 0x1C, 0x47, 0x03, 0xB0, 0xB8, 0x13, 0x0A, 0xC2, +//2A0 +0x64, 0xF8, 0x18, 0xF9, 0x60, 0xB3, 0xC0, 0x65, 0x20, 0x60, 0xA6, 0x8C, 0xC3, 0x81, 0x20, 0x30, 0x26, 0x1E, 0x1C, 0x38, 0xD3, 0x01, 0xB0, 0x26, 0x40, 0xF4, 0x0B, 0xC3, 0x42, 0x1F, 0x85, 0x32, +//2C0 +0x26, 0x60, 0x40, 0xC9, 0xCB, 0x01, 0xEC, 0x11, 0x28, 0x40, 0xFA, 0x04, 0x34, 0xE0, 0x70, 0x4C, 0x8C, 0x1D, 0x07, 0x69, 0x03, 0x16, 0xC8, 0x04, 0x23, 0xE8, 0xC6, 0x9A, 0x0B, 0x1A, 0x03, 0xE0, +//2E0 +0x76, 0x06, 0x05, 0xCF, 0x1E, 0xBC, 0x58, 0x31, 0x71, 0x66, 0x00, 0xF8, 0x3F, 0x04, 0xFC, 0x0C, 0x74, 0x27, 0x8A, 0x80, 0x71, 0xC2, 0x3A, 0x26, 0x06, 0xC0, 0x1F, 0x05, 0x0F, 0x98, 0x40, 0xAE, +//300 /H (palatal) +0x01, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x0E, 0xFE, 0x00, 0x03, 0xDF, 0x80, 0x03, 0xEF, 0x80, 0x1B, 0xF1, 0xC2, 0x00, 0xE7, 0xE0, 0x18, 0xFC, 0xE0, 0x21, 0xFC, 0x80, 0x3C, 0xFC, 0x40, 0x0E, 0x7E, +//320 +0x00, 0x3F, 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x3E, 0xF0, 0x07, 0xFC, 0x00, 0x7E, 0x10, 0x3F, 0xFF, 0x00, 0x3F, 0x38, 0x0E, 0x7C, 0x01, 0x87, 0x0C, 0xFC, 0xC7, 0x00, 0x3E, 0x04, +//340 +0x0F, 0x3E, 0x1F, 0x0F, 0x0F, 0x1F, 0x0F, 0x02, 0x83, 0x87, 0xCF, 0x03, 0x87, 0x0F, 0x3F, 0xC0, 0x07, 0x9E, 0x60, 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x77, 0xE1, 0xC0, 0xFE, 0xE0, 0xC3, +//360 +0xE0, 0x01, 0xDF, 0xF8, 0x03, 0x07, 0x00, 0x7E, 0x70, 0x00, 0x7C, 0x38, 0x18, 0xFE, 0x0C, 0x1E, 0x78, 0x1C, 0x7C, 0x3E, 0x0E, 0x1F, 0x1E, 0x1E, 0x3E, 0x00, 0x7F, 0x83, 0x07, 0xDB, 0x87, 0x83, +//380 +0x07, 0xC7, 0x07, 0x10, 0x71, 0xFF, 0x00, 0x3F, 0xE2, 0x01, 0xE0, 0xC1, 0xC3, 0xE1, 0x00, 0x7F, 0xC0, 0x05, 0xF0, 0x20, 0xF8, 0xF0, 0x70, 0xFE, 0x78, 0x79, 0xF8, 0x02, 0x3F, 0x0C, 0x8F, 0x03, +//3a0 +0x0F, 0x9F, 0xE0, 0xC1, 0xC7, 0x87, 0x03, 0xC3, 0xC3, 0xB0, 0xE1, 0xE1, 0xC1, 0xE3, 0xE0, 0x71, 0xF0, 0x00, 0xFC, 0x70, 0x7C, 0x0C, 0x3E, 0x38, 0x0E, 0x1C, 0x70, 0xC3, 0xC7, 0x03, 0x81, 0xC1, +//3c0 +0xC7, 0xE7, 0x00, 0x0F, 0xC7, 0x87, 0x19, 0x09, 0xEF, 0xC4, 0x33, 0xE0, 0xC1, 0xFC, 0xF8, 0x70, 0xF0, 0x78, 0xF8, 0xF0, 0x61, 0xC7, 0x00, 0x1F, 0xF8, 0x01, 0x7C, 0xF8, 0xF0, 0x78, 0x70, 0x3C, +//3e0 +0x7C, 0xCE, 0x0E, 0x21, 0x83, 0xCF, 0x08, 0x07, 0x8F, 0x08, 0xC1, 0x87, 0x8F, 0x80, 0xC7, 0xE3, 0x00, 0x07, 0xF8, 0xE0, 0xEF, 0x00, 0x39, 0xF7, 0x80, 0x0E, 0xF8, 0xE1, 0xE3, 0xF8, 0x21, 0x9F, +//400 /X (glottal) +0xC0, 0xFF, 0x03, 0xF8, 0x07, 0xC0, 0x1F, 0xF8, 0xC4, 0x04, 0xFC, 0xC4, 0xC1, 0xBC, 0x87, 0xF0, 0x0F, 0xC0, 0x7F, 0x05, 0xE0, 0x25, 0xEC, 0xC0, 0x3E, 0x84, 0x47, 0xF0, 0x8E, 0x03, 0xF8, 0x03, +//420 +0xFB, 0xC0, 0x19, 0xF8, 0x07, 0x9C, 0x0C, 0x17, 0xF8, 0x07, 0xE0, 0x1F, 0xA1, 0xFC, 0x0F, 0xFC, 0x01, 0xF0, 0x3F, 0x00, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0xFD, 0x00, 0xFF, 0x88, 0x0D, 0xF9, 0x01, +//440 +0xFF, 0x00, 0x70, 0x07, 0xC0, 0x3E, 0x42, 0xF3, 0x0D, 0xC4, 0x7F, 0x80, 0xFC, 0x07, 0xF0, 0x5E, 0xC0, 0x3F, 0x00, 0x78, 0x3F, 0x81, 0xFF, 0x01, 0xF8, 0x01, 0xC3, 0xE8, 0x0C, 0xE4, 0x64, 0x8F, +//460 +0xE4, 0x0F, 0xF0, 0x07, 0xF0, 0xC2, 0x1F, 0x00, 0x7F, 0xC0, 0x6F, 0x80, 0x7E, 0x03, 0xF8, 0x07, 0xF0, 0x3F, 0xC0, 0x78, 0x0F, 0x82, 0x07, 0xFE, 0x22, 0x77, 0x70, 0x02, 0x76, 0x03, 0xFE, 0x00, +//480 +0xFE, 0x67, 0x00, 0x7C, 0xC7, 0xF1, 0x8E, 0xC6, 0x3B, 0xE0, 0x3F, 0x84, 0xF3, 0x19, 0xD8, 0x03, 0x99, 0xFC, 0x09, 0xB8, 0x0F, 0xF8, 0x00, 0x9D, 0x24, 0x61, 0xF9, 0x0D, 0x00, 0xFD, 0x03, 0xF0, +//4a0 +0x1F, 0x90, 0x3F, 0x01, 0xF8, 0x1F, 0xD0, 0x0F, 0xF8, 0x37, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFA, 0x03, 0xF0, 0x0F, 0x80, 0xFF, 0x01, +//4c0 +0xB8, 0x07, 0xF0, 0x01, 0xFC, 0x01, 0xBC, 0x80, 0x13, 0x1E, 0x00, 0x7F, 0xE1, 0x40, 0x7F, 0xA0, 0x7F, 0xB0, 0x00, 0x3F, 0xC0, 0x1F, 0xC0, 0x38, 0x0F, 0xF0, 0x1F, 0x80, 0xFF, 0x01, 0xFC, 0x03, +//4e0 0xF1, 0x7E, 0x01, 0xFE, 0x01, 0xF0, 0xFF, 0x00, 0x7F, 0xC0, 0x1D, 0x07, 0xF0, 0x0F, 0xC0, 0x7E, 0x06, 0xE0, 0x07, 0xE0, 0x0F, 0xF8, 0x06, 0xC1, 0xFE, 0x01, 0xFC, 0x03, 0xE0, 0x0F, 0x00, 0xFC]; /** @@ -2303,34 +2586,33 @@ let sampleTable = [//00 T', S, Z (coronal) * * @return {Array} */ - let SetMouthThroat = (mouth, throat) => { let trans = (factor, initialFrequency) => { return (factor * initialFrequency >> 8 & 0xFF) << 1; }; - let freqdata = [[], [], []]; frequencyData.map((v, i) => { freqdata[0][i] = v & 0xFF; freqdata[1][i] = v >> 8 & 0xFF; freqdata[2][i] = v >> 16 & 0xFF; - }); // recalculate formant frequencies 5..29 for the mouth (F1) and throat (F2) + }); + // recalculate formant frequencies 5..29 for the mouth (F1) and throat (F2) for (let pos = 5; pos < 30; pos++) { // recalculate mouth frequency - freqdata[0][pos] = trans(mouth, freqdata[0][pos]); // recalculate throat frequency + freqdata[0][pos] = trans(mouth, freqdata[0][pos]); + // recalculate throat frequency freqdata[1][pos] = trans(throat, freqdata[1][pos]); - } // recalculate formant frequencies 48..53 - + } + // recalculate formant frequencies 48..53 for (let pos = 48; pos < 54; pos++) { // recalculate F1 (mouth formant) - freqdata[0][pos] = trans(mouth, freqdata[0][pos]); // recalculate F2 (throat formant) - + freqdata[0][pos] = trans(mouth, freqdata[0][pos]); + // recalculate F2 (throat formant) freqdata[1][pos] = trans(throat, freqdata[1][pos]); } - return freqdata; }; @@ -2376,7 +2658,6 @@ let SetMouthThroat = (mouth, throat) => { * * @return {Number} */ - let CreateTransitions = (pitches, frequency, amplitude, tuples) => { // 0=pitches // 1=frequency1 @@ -2386,64 +2667,58 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { // 5=amplitude2 // 6=amplitude3 let tables = [pitches, frequency[0], frequency[1], frequency[2], amplitude[0], amplitude[1], amplitude[2]]; - let Read = (table, pos) => { { if (table < 0 || table > tables.length - 1) { - throw new Error("Error invalid table in Read: ".concat(table)); + throw new Error(`Error invalid table in Read: ${table}`); } } - return tables[table][pos]; - }; // linearly interpolate values - + }; + // linearly interpolate values let interpolate = (width, table, frame, change) => { let sign = change < 0; let remainder = Math.abs(change) % width; let div = change / width | 0; let error = 0; let pos = width; - while (--pos > 0) { let val = Read(table, frame) + div; error += remainder; - if (error >= width) { // accumulated a whole integer error, so adjust output error -= width; - if (sign) { val--; } else if (val) { // if input is 0, we always leave it alone val++; } - } // Write updated value back to next frame. - + } + // Write updated value back to next frame. { if (table < 0 || table > tables.length - 1) { - throw new Error("Error invalid table in Read: ".concat(table)); + throw new Error(`Error invalid table in Read: ${table}`); } } - tables[table][++frame] = val; val += div; } }; - let outBlendFrames; let inBlendFrames; let boundary = 0; - for (let pos = 0; pos < tuples.length - 1; pos++) { let phoneme = tuples[pos][0]; - let next_phoneme = tuples[pos + 1][0]; // get the ranking of each phoneme + let next_phoneme = tuples[pos + 1][0]; + // get the ranking of each phoneme let next_rank = blendRank[next_phoneme]; - let rank = blendRank[phoneme]; // compare the rank - lower rank value is stronger + let rank = blendRank[phoneme]; + // compare the rank - lower rank value is stronger if (rank === next_rank) { // same rank, so use out blend lengths from each phoneme outBlendFrames = outBlendLength[phoneme]; @@ -2458,7 +2733,6 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { outBlendFrames = outBlendLength[phoneme]; inBlendFrames = inBlendLength[phoneme]; } - boundary += tuples[pos][1]; let trans_end = boundary + inBlendFrames; let trans_start = boundary - outBlendFrames; @@ -2468,13 +2742,13 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { // unlike the other values, the pitches[] interpolates from // the middle of the current phoneme to the middle of the // next phoneme + // half the width of the current and next phoneme let cur_width = tuples[pos][1] >> 1; let next_width = tuples[pos + 1][1] >> 1; - let pitch = pitches[boundary + next_width] - pitches[boundary - cur_width]; // interpolate the values - + let pitch = pitches[boundary + next_width] - pitches[boundary - cur_width]; + // interpolate the values interpolate(cur_width + next_width, 0, trans_start, pitch); - for (let table = 1; table < 7; table++) { // tables: // 0 pitches @@ -2488,14 +2762,15 @@ let CreateTransitions = (pitches, frequency, amplitude, tuples) => { interpolate(trans_length, table, trans_start, value); } } - } // add the length of last phoneme - + } + // add the length of last phoneme return boundary + tuples[tuples.length - 1][1]; }; let RISING_INFLECTION = 255; let FALLING_INFLECTION = 1; + /** CREATE FRAMES * * The length parameter in the list corresponds to the number of frames @@ -2519,7 +2794,6 @@ let FALLING_INFLECTION = 1; * * @return Array */ - let CreateFrames = (pitch, tuples, frequencyData) => { /** * Create a rising or falling inflection 30 frames prior to index X. @@ -2528,78 +2802,62 @@ let CreateFrames = (pitch, tuples, frequencyData) => { let AddInflection = (inflection, pos, pitches) => { // store the location of the punctuation let end = pos; - if (pos < 30) { pos = 0; } else { pos -= 30; } - - let A; // FIXME: Explain this fix better, it's not obvious + let A; + // FIXME: Explain this fix better, it's not obvious // ML : A =, fixes a problem with invalid pitch with '.' - while ((A = pitches[pos]) === 127) { ++pos; } - while (pos !== end) { // add the inflection direction - A += inflection; // set the inflection + A += inflection; + // set the inflection pitches[pos] = A & 0xFF; - - while (++pos !== end && pitches[pos] === 255) { - /* keep looping */ - } + while (++pos !== end && pitches[pos] === 255) {/* keep looping */} } }; - let pitches = []; let frequency = [[], [], []]; let amplitude = [[], [], []]; let sampledConsonantFlag = []; let X = 0; - for (let i = 0; i < tuples.length; i++) { // get the phoneme at the index let phoneme = tuples[i][0]; - if (phoneme === PHONEME_PERIOD) { AddInflection(FALLING_INFLECTION, X, pitches); } else if (phoneme === PHONEME_QUESTION) { AddInflection(RISING_INFLECTION, X, pitches); - } // get the stress amount (more stress = higher pitch) - + } - let phase1 = stressPitch_tab47492[tuples[i][2]]; // get number of frames to write + // get the stress amount (more stress = higher pitch) + let phase1 = stressPitch_tab47492[tuples[i][2]]; + // get number of frames to write // copy from the source to the frames list - for (let frames = tuples[i][1]; frames > 0; frames--) { frequency[0][X] = frequencyData[0][phoneme]; // F1 frequency - frequency[1][X] = frequencyData[1][phoneme]; // F2 frequency - frequency[2][X] = frequencyData[2][phoneme]; // F3 frequency - amplitude[0][X] = ampldata[phoneme] & 0xFF; // F1 amplitude - amplitude[1][X] = ampldata[phoneme] >> 8 & 0xFF; // F2 amplitude - amplitude[2][X] = ampldata[phoneme] >> 16 & 0xFF; // F3 amplitude - sampledConsonantFlag[X] = sampledConsonantFlags[phoneme]; // phoneme data for sampled consonants - pitches[X] = pitch + phase1 & 0xFF; // pitch - X++; } } - return [pitches, frequency, amplitude, sampledConsonantFlag]; }; let PrepareFrames = (phonemes, pitch, mouth, throat, singmode) => { let freqdata = SetMouthThroat(mouth, throat); + /** * RENDER THE PHONEMES IN THE LIST * @@ -2617,7 +2875,6 @@ let PrepareFrames = (phonemes, pitch, mouth, throat, singmode) => { const [pitches, frequency, amplitude, sampledConsonantFlag] = CreateFrames(pitch, phonemes, freqdata); let t = CreateTransitions(pitches, frequency, amplitude, phonemes); - if (!singmode) { /* ASSIGN PITCH CONTOUR * @@ -2631,72 +2888,68 @@ let PrepareFrames = (phonemes, pitch, mouth, throat, singmode) => { pitches[i] -= frequency[0][i] >> 1; } } + /* * RESCALE AMPLITUDE * * Rescale volume from decibels to the linear scale. */ - - let amplitudeRescale = [0x00, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06, 0x08, 0x09, 0x0B, 0x0D, 0x0F]; - for (let i = amplitude[0].length - 1; i >= 0; i--) { amplitude[0][i] = amplitudeRescale[amplitude[0][i]]; amplitude[1][i] = amplitudeRescale[amplitude[1][i]]; amplitude[2][i] = amplitudeRescale[amplitude[2][i]]; } - let result = [t, frequency, pitches, amplitude, sampledConsonantFlag]; - return result; }; let CreateOutputBuffer = buffersize => { let buffer = new Uint8Array(buffersize); let bufferpos = 0; - let oldTimeTableIndex = 0; // Scale by 16 and write five times. - + let oldTimeTableIndex = 0; + // Scale by 16 and write five times. let writer = (index, A) => { let scaled = (A & 15) * 16; writer.ary(index, [scaled, scaled, scaled, scaled, scaled]); - }; // Write the five given values. - - + }; + // Write the five given values. writer.ary = (index, array) => { // timetable for more accurate c64 simulation - let timetable = [[162, 167, 167, 127, 128], // formants synth - [226, 60, 60, 0, 0], // unvoiced sample 0 - [225, 60, 59, 0, 0], // unvoiced sample 1 - [200, 0, 0, 54, 55], // voiced sample 0 + let timetable = [[162, 167, 167, 127, 128], + // formants synth + [226, 60, 60, 0, 0], + // unvoiced sample 0 + [225, 60, 59, 0, 0], + // unvoiced sample 1 + [200, 0, 0, 54, 55], + // voiced sample 0 [199, 0, 0, 54, 54] // voiced sample 1 ]; bufferpos += timetable[oldTimeTableIndex][index]; - if ((bufferpos / 50 | 0) > buffer.length) { { - throw new Error("Buffer overflow, want ".concat(bufferpos / 50 | 0, " but buffersize is only ").concat(buffer.length, "!")); + throw new Error(`Buffer overflow, want ${bufferpos / 50 | 0} but buffersize is only ${buffer.length}!`); } } - - oldTimeTableIndex = index; // write a little bit in advance - + oldTimeTableIndex = index; + // write a little bit in advance for (let k = 0; k < 5; k++) { buffer[(bufferpos / 50 | 0) + k] = array[k]; } }; - writer.get = () => { - return buffer.slice(0, bufferpos / 50 | 0); }; - return writer; }; let RenderSample = (Output, lastSampleOffset, consonantFlag, pitch) => { // mask low three bits and subtract 1 get value to // convert 0 bits on unvoiced samples. - let kind = (consonantFlag & 7) - 1; // determine which value to use from table { 0x18, 0x1A, 0x17, 0x17, 0x17 } + let kind = (consonantFlag & 7) - 1; + + // determine which value to use from table { 0x18, 0x1A, 0x17, 0x17, 0x17 } // T', S, Z 0 0x18 coronal // CH', J', SH, ZH 1 0x1A palato-alveolar // P', F, V, TH, DH 2 0x17 [labio]dental @@ -2704,53 +2957,43 @@ let RenderSample = (Output, lastSampleOffset, consonantFlag, pitch) => { // /X 4 0x17 glottal let samplePage = kind * 256 & 0xFFFF; // unsigned short - let off = consonantFlag & 248; // unsigned char let renderSample = (index1, value1, index0, value0) => { let bit = 8; let sample = sampleTable[samplePage + off]; - do { if ((sample & 128) !== 0) { Output(index1, value1); } else { Output(index0, value0); } - sample <<= 1; } while (--bit); }; - if (off === 0) { // voiced phoneme: Z*, ZH, V*, DH let phase1 = pitch >> 4 ^ 255 & 0xFF; // unsigned char - off = lastSampleOffset & 0xFF; // unsigned char - do { renderSample(3, 26, 4, 6); off++; off &= 0xFF; } while (++phase1 & 0xFF); - return off; - } // unvoiced - - + } + // unvoiced off = off ^ 255 & 0xFF; // unsigned char - let value0 = sampledConsonantValues0[kind] & 0xFF; // unsigned char - do { renderSample(2, 5, 1, value0); } while (++off & 0xFF); - return lastSampleOffset; -}; // Removed sine table stored a pre calculated sine wave but in modern CPU, we can calculate inline. - +}; +// Removed sine table stored a pre calculated sine wave but in modern CPU, we can calculate inline. let sinus = x => Math.sin(2 * Math.PI * (x / 256)) * 127 | 0; + /** * PROCESS THE FRAMES * @@ -2761,8 +3004,6 @@ let sinus = x => Math.sin(2 * Math.PI * (x / 256)) * 127 | 0; * To simulate them being driven by the glottal pulse, the waveforms are * reset at the beginning of each glottal pulse. */ - - let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, sampledConsonantFlag) => { let speedcounter = speed; let phase1 = 0; @@ -2772,13 +3013,13 @@ let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, s let pos = 0; let glottal_pulse = pitches[0]; let mem38 = glottal_pulse * .75 | 0; - while (frameCount) { - let flags = sampledConsonantFlag[pos]; // unvoiced sampled phoneme? + let flags = sampledConsonantFlag[pos]; + // unvoiced sampled phoneme? if ((flags & 248) !== 0) { - lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); // skip ahead two in the phoneme buffer - + lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); + // skip ahead two in the phoneme buffer pos += 2; frameCount -= 2; speedcounter = speed; @@ -2787,104 +3028,66 @@ let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, s // Rectangle wave consisting of: // 0-128 = 0x90 // 128-255 = 0x70 + // simulate the glottal pulse and formants let ary = []; - let - /* unsigned int */ - p1 = phase1 * 256; // Fixed point integers because we need to divide later on - - let - /* unsigned int */ - p2 = phase2 * 256; - let - /* unsigned int */ - p3 = phase3 * 256; - + let /* unsigned int */p1 = phase1 * 256; // Fixed point integers because we need to divide later on + let /* unsigned int */p2 = phase2 * 256; + let /* unsigned int */p3 = phase3 * 256; for (let k = 0; k < 5; k++) { - const - /* signed char */ - sp1 = sinus(0xff & p1 >> 8); - const - /* signed char */ - sp2 = sinus(0xff & p2 >> 8); - const - /* signed char */ - rp3 = (0xff & p3 >> 8) < 129 ? -0x70 : 0x70; - const - /* signed int */ - sin1 = sp1 * ( - /* (unsigned char) */ - amplitude[0][pos] & 0x0F); - const - /* signed int */ - sin2 = sp2 * ( - /* (unsigned char) */ - amplitude[1][pos] & 0x0F); - const - /* signed int */ - rect = rp3 * ( - /* (unsigned char) */ - amplitude[2][pos] & 0x0F); - let - /* signed int */ - mux = sin1 + sin2 + rect; + const /* signed char */sp1 = sinus(0xff & p1 >> 8); + const /* signed char */sp2 = sinus(0xff & p2 >> 8); + const /* signed char */rp3 = (0xff & p3 >> 8) < 129 ? -0x70 : 0x70; + const /* signed int */sin1 = sp1 * ( /* (unsigned char) */amplitude[0][pos] & 0x0F); + const /* signed int */sin2 = sp2 * ( /* (unsigned char) */amplitude[1][pos] & 0x0F); + const /* signed int */rect = rp3 * ( /* (unsigned char) */amplitude[2][pos] & 0x0F); + let /* signed int */mux = sin1 + sin2 + rect; mux /= 32; mux += 128; // Go from signed to unsigned amplitude - ary[k] = mux | 0; p1 += frequency[0][pos] * 256 / 4; // Compromise, this becomes a shift and works well - p2 += frequency[1][pos] * 256 / 4; p3 += frequency[2][pos] * 256 / 4; } - Output.ary(0, ary); } speedcounter--; - if (speedcounter === 0) { pos++; //go to next amplitude // decrement the frame count - frameCount--; - if (frameCount === 0) { return; } - speedcounter = speed; } - glottal_pulse--; - if (glottal_pulse !== 0) { // not finished with a glottal pulse - mem38--; // within the first 75% of the glottal pulse? - // is the count non-zero and the sampled flag is zero? + mem38--; + // within the first 75% of the glottal pulse? + // is the count non-zero and the sampled flag is zero? if (mem38 !== 0 || flags === 0) { // update the phase of the formants // TODO: we should have a switch to disable this, it causes a pretty nice voice without the masking! phase1 = phase1 + frequency[0][pos]; // & 0xFF; - phase2 = phase2 + frequency[1][pos]; // & 0xFF; - phase3 = phase3 + frequency[2][pos]; // & 0xFF; - continue; - } // voiced sampled phonemes interleave the sample with the + } + + // voiced sampled phonemes interleave the sample with the // glottal pulse. The sample flag is non-zero, so render // the sample for the phoneme. - - lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); } } - glottal_pulse = pitches[pos]; - mem38 = glottal_pulse * .75 | 0; // reset the formant wave generators to keep them in - // sync with the glottal pulse + mem38 = glottal_pulse * .75 | 0; + // reset the formant wave generators to keep them in + // sync with the glottal pulse phase1 = 0; phase2 = 0; phase3 = 0; @@ -2901,44 +3104,38 @@ let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, s * * @return Uint8Array */ - let Renderer = (phonemes, pitch, mouth, throat, speed, singmode) => { pitch = pitch === undefined ? 64 : pitch & 0xFF; mouth = mouth === undefined ? 128 : mouth & 0xFF; throat = throat === undefined ? 128 : throat & 0xFF; speed = (speed || 72) & 0xFF; singmode = singmode || false; - let sentences = PrepareFrames(phonemes, pitch, mouth, throat, singmode); // Reserve 176.4*speed samples (=8*speed ms) for each frame. + let sentences = PrepareFrames(phonemes, pitch, mouth, throat, singmode); + // Reserve 176.4*speed samples (=8*speed ms) for each frame. let Output = CreateOutputBuffer(176.4 // = (22050/125) * phonemes.reduce((pre, v) => pre + v[1], 0) // Combined phoneme length in frames. * speed | 0); const [t, frequency, pitches, amplitude, sampledConsonantFlag] = sentences; - { PrintOutput(pitches, frequency, amplitude, sampledConsonantFlag); } - ProcessFrames(Output, t, speed, frequency, pitches, amplitude, sampledConsonantFlag); return Output.get(); }; - let PrintOutput = (pitches, frequency, amplitude, sampledConsonantFlag) => { let pad = num => { let s = '00000' + num; return s.substr(s.length - 5); }; - console.log('==========================================='); console.log('Final data for speech output:'); console.log(' flags ampl1 freq1 ampl2 freq2 ampl3 freq3 pitch'); console.log('------------------------------------------------'); - for (let i = 0; i < sampledConsonantFlag.length; i++) { console.log(' %s %s %s %s %s %s %s %s', pad(sampledConsonantFlag[i]), pad(amplitude[0][i]), pad(frequency[0][i]), pad(amplitude[1][i]), pad(frequency[1][i]), pad(amplitude[2][i]), pad(frequency[2][i]), pad(pitches[i])); i++; } - console.log('==========================================='); }; @@ -2956,16 +3153,14 @@ let PrintOutput = (pitches, frequency, amplitude, sampledConsonantFlag) => { * * @return {Float32Array|Boolean} */ - let SamBuffer = (input, options) => { let buffer = SamProcess(input, options); - if (false === buffer) { return false; } - return Uint8ArrayToFloat32Array(buffer); }; + /** * Process the input and return the audiobuffer. * @@ -2980,21 +3175,19 @@ let SamBuffer = (input, options) => { * * @return {Uint8Array|Boolean} */ - let SamProcess = function (input) { let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; let parsed = Parser(input); - if (false === parsed) { return false; } - return Renderer(parsed, options.pitch, options.mouth, options.throat, options.speed, options.singmode); }; let convert = TextToPhonemes; let buf8 = SamProcess; let buf32 = SamBuffer; + /** * @param {object} [options] * @param {Boolean} [options.phonetic] Default false. @@ -3007,17 +3200,15 @@ let buf32 = SamBuffer; * * @constructor */ - function SamJs(options) { let opts = options || {}; - let ensurePhonetic = (text, phonetic) => { if (!(phonetic || opts.phonetic)) { return convert(text); } - return text.toUpperCase(); }; + /** * Render the passed text as 8bit wave buffer array. * @@ -3026,9 +3217,8 @@ function SamJs(options) { * * @return {Uint8Array|Boolean} */ - - this.buf8 = (text, phonetic) => buf8(ensurePhonetic(text, phonetic), opts); + /** * Render the passed text as 32bit wave buffer array. * @@ -3037,9 +3227,8 @@ function SamJs(options) { * * @return {Float32Array|Boolean} */ - - this.buf32 = (text, phonetic) => buf32(ensurePhonetic(text, phonetic), opts); + /** * Render the passed text as wave buffer and play it over the speakers. * @@ -3048,9 +3237,8 @@ function SamJs(options) { * * @return {Promise} */ - - this.speak = (text, phonetic) => PlayBuffer(this.buf32(text, phonetic)); + /** * Render the passed text as wave buffer and download it via URL API. * @@ -3059,11 +3247,10 @@ function SamJs(options) { * * @return void */ - - this.download = (text, phonetic) => { RenderBuffer(this.buf8(text, phonetic)); }; + /** * Render the passed text as wave buffer array. * @@ -3072,11 +3259,8 @@ function SamJs(options) { * * @return {Uint8Array|false} */ - - this.wav = (text, phonetic) => ToWavBuffer(this.buf8(text, phonetic)); } - SamJs.buf8 = buf8; SamJs.buf32 = buf32; SamJs.convert = convert; diff --git a/dist/samjs.esm.min.js b/dist/samjs.esm.min.js index cfa8192..7bb2501 100644 --- a/dist/samjs.esm.min.js +++ b/dist/samjs.esm.min.js @@ -9,5 +9,5 @@ * * @author 2017 Christian Schiffler */ -let l=(H,A)=>0!=(H&A),r=H=>{let E=new Uint8Array(H.length);return H.split("").forEach((H,A)=>{E[A]=H.charCodeAt(0)}),E},t=H=>{let A=new Uint8Array(4);return A[0]=H,A[1]=H>>8,A[2]=H>>16,A[3]=H>>24,A},O=H=>{let A=new Uint8Array(2);return A[0]=H,A[1]=H>>8,A},I=null,R=H=>{let A=new Uint8Array(44+H.length),E=0;var e=H=>{A.set(H,E),E+=H.length};return e(r("RIFF")),e(t(H.length+12+16+8-8)),e(r("WAVE")),e(r("fmt ")),e(t(16)),e(O(1)),e(O(1)),e(t(22050)),e(t(22050)),e(O(1)),e(O(8)),e(r("data")),e(t(H.length)),e(H),A},Y={" ":0,"!":2,'"':2,"#":2,$:2,"%":2,"&":2,"'":130,"(":0,")":0,"*":2,"+":2,",":2,"-":2,".":2,"/":2,0:3,1:3,2:3,3:3,4:3,5:3,6:3,7:3,8:3,9:3,":":2,";":2,"<":2,"=":2,">":2,"?":2,"@":2,A:192,B:168,C:176,D:172,E:192,F:160,G:184,H:160,I:192,J:188,K:160,L:172,M:168,N:172,O:192,P:160,Q:160,R:172,S:180,T:164,U:192,V:168,W:168,X:176,Y:192,Z:188,"[":0,"\\":0,"]":0,"^":2,_:0,"`":32},U=128,n=(H,A)=>0!=(Y[H]&A),N=(H,A,E)=>n(H[A],E),W=(H,A)=>-1!==A.indexOf(H),E=H=>{let A=H.split("="),e=A.pop(),E=A.join("=").split("("),r=E.pop().split(")"),t=E[0],O=r[0],R=r[1],I=["T","C","S"],Y=["E","I","Y"];return(H=(H,A,E)=>{if(H.startsWith(O,A)&&((A,E)=>{for(let H=t.length-1;-1!N(A,--E,U),"#":()=>N(A,--E,64),".":()=>N(A,--E,8),"&":()=>N(A,--E,16)||W(A.substr(--E,2),["CH","SH"]),"@":()=>{if(N(A,--E,4))return!0;var H=A[E];return"H"===H&&!!W(H,I)},"^":()=>N(A,--E,32),"+":()=>W(A[--E],Y),":":()=>{for(;0<=E&&N(A,E-1,32);)E--;return!0}}[e]())return!1}return!0})(H,A)&&((A,E)=>{for(let H=0;H!N(A,++E,U),"#":()=>N(A,++E,64),".":()=>N(A,++E,8),"&":()=>N(A,++E,16)||W(A.substr(++E-2,2),["HC","HS"]),"@":()=>{if(N(A,++E,4))return!0;var H=A[E];return"H"===H&&!!W(H,I)},"^":()=>N(A,++E,32),"+":()=>W(A[++E],Y),":":()=>{for(;N(A,E+1,32);)E++;return!0},"%":()=>"E"!==A[E+1]?"ING"===A.substr(E+1,3)&&(E+=3,!0):N(A,E+2,U)?W(A[E+2],["R","S","D"])?(E+=2,!0):"L"!==A[E+2]?"FUL"===A.substr(E+2,3)&&(E+=4,!0):"Y"===A[E+3]&&(E+=3,!0):(E++,!0)}[e]())return!1}return!0})(H,A+(O.length-1)))return E(e,O.length),!0}).c=O[0],H},S={},T=(" (A.)=EH4Y. |(A) =AH| (ARE) =AAR| (AR)O=AXR|(AR)#=EH4R| ^(AS)#=EY4S|(A)WA=AX|(AW)=AO5| :(ANY)=EH4NIY|(A)^+#=EY5|#:(ALLY)=ULIY| (AL)#=UL|(AGAIN)=AXGEH4N|#:(AG)E=IHJ|(A)^%=EY|(A)^+:#=AE| :(A)^+ =EY4| (ARR)=AXR|(ARR)=AE4R| ^(AR) =AA5R|(AR)=AA5R|(AIR)=EH4R|(AI)=EY4|(AY)=EY5|(AU)=AO4|#:(AL) =UL|#:(ALS) =ULZ|(ALK)=AO4K|(AL)^=AOL| :(ABLE)=EY4BUL|(ABLE)=AXBUL|(A)VO=EY4|(ANG)+=EY4NJ|(ATARI)=AHTAA4RIY|(A)TOM=AE|(A)TTI=AE| (AT) =AET| (A)T=AH|(A)=AE| (B) =BIY4| (BE)^#=BIH|(BEING)=BIY4IHNX| (BOTH) =BOW4TH| (BUS)#=BIH4Z|(BREAK)=BREY5K|(BUIL)=BIH4L|(B)=B| (C) =SIY4| (CH)^=K|^E(CH)=K|(CHA)R#=KEH5|(CH)=CH| S(CI)#=SAY4|(CI)A=SH|(CI)O=SH|(CI)EN=SH|(CITY)=SIHTIY|(C)+=S|(CK)=K|(COMMODORE)=KAA4MAHDOHR|(COM)=KAHM|(CUIT)=KIHT|(CREA)=KRIYEY|(C)=K| (D) =DIY4| (DR.) =DAA4KTER|#:(DED) =DIHD|.E(D) =D|#:^E(D) =T| (DE)^#=DIH| (DO) =DUW| (DOES)=DAHZ|(DONE) =DAH5N|(DOING)=DUW4IHNX| (DOW)=DAW|#(DU)A=JUW|#(DU)^#=JAX|(D)=D| (E) =IYIY4|#:(E) =|':^(E) =| :(E) =IY|#(ED) =D|#:(E)D =|(EV)ER=EH4V|(E)^%=IY4|(ERI)#=IY4RIY|(ERI)=EH4RIH|#:(ER)#=ER|(ERROR)=EH4ROHR|(ERASE)=IHREY5S|(ER)#=EHR|(ER)=ER| (EVEN)=IYVEHN|#:(E)W=|@(EW)=UW|(EW)=YUW|(E)O=IY|#:&(ES) =IHZ|#:(E)S =|#:(ELY) =LIY|#:(EMENT)=MEHNT|(EFUL)=FUHL|(EE)=IY4|(EARN)=ER5N| (EAR)^=ER5|(EAD)=EHD|#:(EA) =IYAX|(EA)SU=EH5|(EA)=IY5|(EIGH)=EY4|(EI)=IY4| (EYE)=AY4|(EY)=IY|(EU)=YUW5|(EQUAL)=IY4KWUL|(E)=EH| (F) =EH4F|(FUL)=FUHL|(FRIEND)=FREH5ND|(FATHER)=FAA4DHER|(F)F=|(F)=F| (G) =JIY4|(GIV)=GIH5V| (G)I^=G|(GE)T=GEH5|SU(GGES)=GJEH4S|(GG)=G| B#(G)=G|(G)+=J|(GREAT)=GREY4T|(GON)E=GAO5N|#(GH)=| (GN)=N|(G)=G| (H) =EY4CH| (HAV)=/HAE6V| (HERE)=/HIYR| (HOUR)=AW5ER|(HOW)=/HAW|(H)#=/H|(H)=| (IN)=IHN| (I) =AY4|(I) =AY|(IN)D=AY5N|SEM(I)=IY| ANT(I)=AY|(IER)=IYER|#:R(IED) =IYD|(IED) =AY5D|(IEN)=IYEHN|(IE)T=AY4EH|(I')=AY5| :(I)^%=AY5| :(IE) =AY4|(I)%=IY|(IE)=IY4| (IDEA)=AYDIY5AH|(I)^+:#=IH|(IR)#=AYR|(IZ)%=AYZ|(IS)%=AYZ|I^(I)^#=IH|+^(I)^+=AY|#:^(I)^+=IH|(I)^+=AY|(IR)=ER|(IGH)=AY4|(ILD)=AY5LD| (IGN)=IHGN|(IGN) =AY4N|(IGN)^=AY4N|(IGN)%=AY4N|(ICRO)=AY4KROH|(IQUE)=IY4K|(I)=IH| (J) =JEY4|(J)=J| (K) =KEY4| (K)N=|(K)=K| (L) =EH4L|(LO)C#=LOW|L(L)=|#:^(L)%=UL|(LEAD)=LIYD| (LAUGH)=LAE4F|(L)=L| (M) =EH4M| (MR.) =MIH4STER| (MS.)=MIH5Z| (MRS.) =MIH4SIXZ|(MOV)=MUW4V|(MACHIN)=MAHSHIY5N|M(M)=|(M)=M| (N) =EH4N|E(NG)+=NJ|(NG)R=NXG|(NG)#=NXG|(NGL)%=NXGUL|(NG)=NX|(NK)=NXK| (NOW) =NAW4|N(N)=|(NON)E=NAH4N|(N)=N| (O) =OH4W|(OF) =AHV| (OH) =OW5|(OROUGH)=ER4OW|#:(OR) =ER|#:(ORS) =ERZ|(OR)=AOR| (ONE)=WAHN|#(ONE) =WAHN|(OW)=OW| (OVER)=OW5VER|PR(O)V=UW4|(OV)=AH4V|(O)^%=OW5|(O)^EN=OW|(O)^I#=OW5|(OL)D=OW4L|(OUGHT)=AO5T|(OUGH)=AH5F| (OU)=AW|H(OU)S#=AW4|(OUS)=AXS|(OUR)=OHR|(OULD)=UH5D|(OU)^L=AH5|(OUP)=UW5P|(OU)=AW|(OY)=OY|(OING)=OW4IHNX|(OI)=OY5|(OOR)=OH5R|(OOK)=UH5K|F(OOD)=UW5D|L(OOD)=AH5D|M(OOD)=UW5D|(OOD)=UH5D|F(OOT)=UH5T|(OO)=UW5|(O')=OH|(O)E=OW|(O) =OW|(OA)=OW4| (ONLY)=OW4NLIY| (ONCE)=WAH4NS|(ON'T)=OW4NT|C(O)N=AA|(O)NG=AO| :^(O)N=AH|I(ON)=UN|#:(ON)=UN|#^(ON)=UN|(O)ST=OW|(OF)^=AO4F|(OTHER)=AH5DHER|R(O)B=RAA|^R(O):#=OW5|(OSS) =AO5S|#:^(OM)=AHM|(O)=AA| (P) =PIY4|(PH)=F|(PEOPL)=PIY5PUL|(POW)=PAW4|(PUT) =PUHT|(P)P=|(P)S=|(P)N=|(PROF.)=PROHFEH4SER|(P)=P| (Q) =KYUW4|(QUAR)=KWOH5R|(QU)=KW|(Q)=K| (R) =AA5R| (RE)^#=RIY|(R)R=|(R)=R| (S) =EH4S|(SH)=SH|#(SION)=ZHUN|(SOME)=SAHM|#(SUR)#=ZHER|(SUR)#=SHER|#(SU)#=ZHUW|#(SSU)#=SHUW|#(SED)=ZD|#(S)#=Z|(SAID)=SEHD|^(SION)=SHUN|(S)S=|.(S) =Z|#:.E(S) =Z|#:^#(S) =S|U(S) =S| :#(S) =Z|##(S) =Z| (SCH)=SK|(S)C+=|#(SM)=ZUM|#(SN)'=ZUM|(STLE)=SUL|(S)=S| (T) =TIY4| (THE) #=DHIY| (THE) =DHAX|(TO) =TUX| (THAT)=DHAET| (THIS) =DHIHS| (THEY)=DHEY| (THERE)=DHEHR|(THER)=DHER|(THEIR)=DHEHR| (THAN) =DHAEN| (THEM) =DHAEN|(THESE) =DHIYZ| (THEN)=DHEHN|(THROUGH)=THRUW4|(THOSE)=DHOHZ|(THOUGH) =DHOW|(TODAY)=TUXDEY|(TOMO)RROW=TUMAA5|(TO)TAL=TOW5| (THUS)=DHAH4S|(TH)=TH|#:(TED)=TIXD|S(TI)#N=CH|(TI)O=SH|(TI)A=SH|(TIEN)=SHUN|(TUR)#=CHER|(TU)A=CHUW| (TWO)=TUW|&(T)EN =|(T)=T| (U) =YUW4| (UN)I=YUWN| (UN)=AHN| (UPON)=AXPAON|@(UR)#=UH4R|(UR)#=YUH4R|(UR)=ER|(U)^ =AH|(U)^^=AH5|(UY)=AY5| G(U)#=|G(U)%=|G(U)#=W|#N(U)=YUW|@(U)=UW|(U)=YUW| (V) =VIY4|(VIEW)=VYUW5|(V)=V| (W) =DAH4BULYUW| (WERE)=WER|(WA)SH=WAA|(WA)ST=WEY|(WA)S=WAH|(WA)T=WAA|(WHERE)=WHEHR|(WHAT)=WHAHT|(WHOL)=/HOWL|(WHO)=/HUW|(WH)=WH|(WAR)#=WEHR|(WAR)=WAOR|(WOR)^=WER|(WR)=R|(WOM)A=WUHM|(WOM)E=WIHM|(WEA)R=WEH|(WANT)=WAA5NT|ANS(WER)=ER|(W)=W| (X) =EH4KR| (X)=Z|(X)=KS| (Y) =WAY4|(YOUNG)=YAHNX| (YOUR)=YOHR| (YOU)=YUW| (YES)=YEHS| (Y)=Y|F(Y)=AY|PS(YCH)=AYK|#:^(Y)=IY|#:^(Y)I=IY| :(Y) =AY| :(Y)#=AY| :(Y)^+:#=IH| :(Y)^#=AY|(Y)=IH| (Z) =ZIY4|(Z)=Z".split("|").map(H=>{var A=(H=E(H)).c;S[A]=S[A]||[],S[A].push(H)}),'(A)=|(!)=.|(") =-AH5NKWOWT-|(")=KWOW4T-|(#)= NAH4MBER|($)= DAA4LER|(%)= PERSEH4NT|(&)= AEND|(\')=|(*)= AE4STERIHSK|(+)= PLAH4S|(,)=,| (-) =-|(-)=|(.)= POYNT|(/)= SLAE4SH|(0)= ZIY4ROW| (1ST)=FER4ST| (10TH)=TEH4NTH|(1)= WAH4N| (2ND)=SEH4KUND|(2)= TUW4| (3RD)=THER4D|(3)= THRIY4|(4)= FOH4R| (5TH)=FIH4FTH|(5)= FAY4V| (64) =SIH4KSTIY FOHR|(6)= SIH4KS|(7)= SEH4VUN| (8TH)=EY4TH|(8)= EY4T|(9)= NAY4N|(:)=.|(;)=.|(<)= LEH4S DHAEN|(=)= IY4KWULZ|(>)= GREY4TER DHAEN|(?)=?|(@)= AE6T|(^)= KAE4RIXT'.split("|").map(E)),f="*12345678".split(""),a=" *.*?*,*-*IYIHEHAEAAAHAOUHAXIXERUXOHRXLXWXYXWHR*L*W*Y*M*N*NXDXQ*S*SHF*TH/H/XZ*ZHV*DHCH**J*******EYAYOYAWOWUWB*****D*****G*****GX****P*****T*****K*****KX****ULUMUN".match(/.{1,2}/g),i=[32768,49408,49408,49408,49408,164,164,164,164,164,164,132,132,164,164,132,132,132,132,132,132,132,68,4164,4164,4164,4164,2124,3148,2124,1096,16460,9280,8256,8256,9280,64,64,9284,8260,8260,9284,8264,8256,76,8260,0,0,180,180,180,148,148,148,78,78,78,1102,1102,1102,78,78,78,78,78,78,75,75,75,1099,1099,1099,75,75,75,75,75,75,128,193,193],D=[0,4626,4626,4626,2056,2824,2312,2824,3592,3851,2822,4108,3082,1541,1541,3595,3082,3594,3082,2825,2056,2055,2825,2567,2310,2056,2054,2055,2055,2055,770,1285,514,514,514,514,514,514,1542,1542,2055,1542,1542,514,2312,1027,513,286,3597,3852,3852,3852,3598,3593,2054,513,514,1797,513,257,1798,513,514,1798,513,514,2056,514,514,1540,514,514,1798,513,1028,1798,257,1028,1479,1535],o=(E,e,r)=>{for(let A=0;A{var H=a.findIndex(H=>H===A+E&&"*"!==H[1]);return-1!==H&&H})(t,O)))A++,e(H);else if(!1!==(H=(A=>{var H=a.findIndex(H=>H===A+"*");return-1!==H&&H})(t)))e(H);else{for(H=f.length;t!==f[H]&&0l(i[H],A),L=128,s=(E,e,r,t)=>{var H=(H,A)=>{switch(H){case 53:u(r(A-1),1024)&&e(A,16);break;case 42:E(A+1,43,t(A));break;case 44:E(A+1,45,t(A))}},A=(H,A)=>{e(H,13),E(H+1,A,t(H))};let O=-1,R;for(;null!==(R=r(++O));)if(0!==R)if(u(R,16))E(O+1,u(R,32)?21:20,t(O)),H(R,O);else if(78===R)A(O,24);else if(79===R)A(O,27);else if(80===R)A(O,28);else if(u(R,L)&&t(O))0===r(O+1)&&null!==(R=r(O+2))&&u(R,L)&&t(O+2)&&E(O+2,31,0);else{var I,Y=0===O?null:r(O-1);if(23===R)switch(Y){case 69:e(O-1,42);break;case 57:e(O-1,44);break;default:u(Y,L)&&e(O,18)}else 24===R&&u(Y,L)?e(O,19):60===Y&&32===R?e(O,38):60===R?(I=r(O+1),u(I,32)||null===I||e(O,63)):(72===R&&(I=r(O+1),u(I,32)&&null!==I||(e(O,75),R=75)),u(R,1)&&32===Y?e(O,R-12):u(R,1)||H(R,O),69!==R&&57!==R||0{for(let H=0;null!==A(H);H++)if(u(A(H),256)){for(var r,t=H;1<--H&&!u(A(H),L););if(0===H)break;for(;H>1)+r+1))}let O=-1,R;for(;null!==(R=A(++O));){let H=O;var I,Y;if(u(R,L))R=A(++H),u(R,64)?(I=null===R?65:i[R],l(I,4)?(Y=e(O),E(O,(Y>>2)+Y+1)):l(I,1)&&(Y=e(O),E(O,Y-(Y>>3)))):18!==R&&19!==R||!u(A(++H),64)||E(O,e(O)-1);else if(u(R,2048))null!==(R=A(++H))&&u(R,2)&&(E(H,6),E(H-1,5));else if(u(R,2)){for(;0===(R=A(++H)););null!==R&&u(R,2)&&(E(H,1+(e(H)>>1)),E(O,1+(e(O)>>1)))}else 0{let e=0;for(var r;null!==(r=H(e));)u(r,64)&&null!==(r=H(e+1))&&u(r,L)&&0!==(r=A(e+1))&&r<128&&E(e,r+1),++e},v=(H,A,E)=>{let e=0;for(var r;null!==(r=H(e));){var t=A(e);E(e,0===t||127>8),e++}},g=(E,H,A)=>{let e=-1;for(var r;null!==(r=E(++e));)if(u(r,2)){if(u(r,1)){let H,A=e;for(;0===(H=E(++A)););if(null!==H&&(u(H,8)||36===H||37===H))continue}H(e+1,r+1,A(e),255&D[r+1]),H(e+2,r+2,A(e),255&D[r+2]),e+=2}},B=[24,26,23,23,23],p=[0,224,230,236,243,249,0,6,12,6],M=[0,31,31,31,31,2,2,2,2,2,2,2,2,2,5,5,2,10,2,8,5,5,11,10,9,8,8,160,8,8,23,31,18,18,18,18,30,30,20,20,20,20,23,23,26,26,29,29,2,2,2,2,2,2,26,29,27,26,29,27,26,29,27,26,29,27,23,29,23,23,29,23,23,29,23,23,29,23,23,23],K=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,2,4,4,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,0,1,0,5,5,5,5,5,4,4,2,0,1,2,0,1,2,0,1,2,0,1,2,0,2,2,0,1,3,0,2,3,0,2,160,160],C=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,4,4,3,3,3,3,3,1,2,3,2,1,3,3,3,3,1,1,3,3,3,2,2,3,2,3,0,0,5,5,5,5,4,4,2,0,2,2,0,3,2,0,4,2,0,3,2,0,2,2,0,2,3,0,3,3,0,3,176,160],V=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,226,211,187,124,149,1,2,3,3,0,114,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,25,0,0,0,0,0,0,0,0,0],b=[0,5980947,5980947,5980947,5980947,7230474,6113550,5980947,5783320,5842971,5712919,5775125,5383440,5844244,6113550,4075794,5383182,5774866,4076306,7218448,5250317,6112527,5904395,3944978,7216654,5904395,7230217,5320198,7943686,6641158,7943686,5980945,6506758,6967046,5315078,7946758,6113550,5383440,6107913,6767114,4990984,6106890,6639366,6639366,7946758,6639365,7958022,0,5916691,5777179,5775125,5778203,5774866,5382669,5315078,5315078,5315078,7946758,7946758,7946758,7368198,7237126,7237126,6181894,6181894,6181894,5315078,5315078,5315078,7946758,7946758,7946758,6647046,6641162,7367946,6181894,6181894,6181894,556844,98067],X=[0,0,0,0,0,526861,461581,527630,527887,68879,68623,3087,68367,2316,461581,330508,68623,3087,396301,67597,2061,461838,2061,330252,67597,2061,526861,780,2313,198153,0,0,0,0,0,0,0,0,779,66827,779,1035,0,0,1,66827,920064,66050,593422,68879,3087,68879,3087,2061,2,260,0,2,260,0,1,260,0,1,260,0,0,0,0,0,0,0,0,461324,0,0,330240,0,1245199,1048591],w=[56,132,107,25,198,99,24,134,115,152,198,177,28,202,49,140,199,49,136,194,48,152,70,49,24,198,53,12,202,49,12,198,33,16,36,105,18,194,49,20,196,113,8,74,34,73,171,106,168,172,73,81,50,213,82,136,147,108,148,34,21,84,210,37,150,212,80,165,70,33,8,133,107,24,196,99,16,206,107,24,140,113,25,140,99,53,12,198,51,153,204,108,181,78,162,153,70,33,40,130,149,46,227,48,156,197,48,156,162,177,156,103,49,136,102,89,44,83,24,132,103,80,202,227,10,172,171,48,172,98,48,140,99,16,148,98,177,140,130,40,150,51,152,214,181,76,98,41,165,74,181,156,198,49,20,214,56,156,75,180,134,101,24,174,103,28,166,99,25,150,35,25,132,19,8,166,82,172,202,34,137,110,171,25,140,98,52,196,98,25,134,99,24,196,35,88,214,163,80,66,84,74,173,74,37,17,107,100,137,74,99,57,138,35,49,42,234,162,169,68,197,18,205,66,52,140,98,24,140,99,17,72,102,49,157,68,51,29,70,49,156,198,177,12,205,50,136,196,115,24,134,115,8,214,99,88,7,129,224,240,60,7,135,144,60,124,15,199,192,192,240,124,30,7,128,128,0,28,120,112,241,199,31,192,12,254,28,31,31,14,10,122,192,113,242,131,143,3,15,15,12,0,121,248,97,224,67,15,131,231,24,249,193,19,218,233,99,143,15,131,131,135,195,31,60,112,240,225,225,227,135,184,113,14,32,227,141,72,120,28,147,135,48,225,193,193,228,120,33,131,131,195,135,6,57,229,195,135,7,14,28,28,112,244,113,156,96,54,50,195,30,60,243,143,14,60,112,227,199,143,15,15,14,60,120,240,227,135,6,240,227,7,193,153,135,15,24,120,112,112,252,243,16,177,140,140,49,124,112,225,134,60,100,108,176,225,227,15,35,143,15,30,62,56,60,56,123,143,7,14,60,244,23,30,60,120,242,158,114,73,227,37,54,56,88,57,226,222,60,120,120,225,199,97,225,225,176,240,240,195,199,14,56,192,240,206,115,115,24,52,176,225,199,142,28,60,248,56,240,225,193,139,134,143,28,120,112,240,120,172,177,143,57,49,219,56,97,195,14,14,56,120,115,23,30,57,30,56,100,225,241,193,78,15,64,162,2,197,143,129,161,252,18,8,100,224,60,34,224,69,7,142,12,50,144,240,31,32,73,224,248,12,96,240,23,26,65,170,164,208,141,18,130,30,30,3,248,62,3,12,115,128,112,68,38,3,36,225,62,4,78,4,28,193,9,204,158,144,33,7,144,67,100,192,15,198,144,156,193,91,3,226,29,129,224,94,29,3,132,184,44,15,128,177,131,224,48,65,30,67,137,131,80,252,36,46,19,131,241,124,76,44,201,13,131,176,181,130,228,232,6,156,7,160,153,29,7,62,130,143,112,48,116,64,202,16,228,232,15,146,20,63,6,248,132,136,67,129,10,52,57,65,198,227,28,71,3,176,184,19,10,194,100,248,24,249,96,179,192,101,32,96,166,140,195,129,32,48,38,30,28,56,211,1,176,38,64,244,11,195,66,31,133,50,38,96,64,201,203,1,236,17,40,64,250,4,52,224,112,76,140,29,7,105,3,22,200,4,35,232,198,154,11,26,3,224,118,6,5,207,30,188,88,49,113,102,0,248,63,4,252,12,116,39,138,128,113,194,58,38,6,192,31,5,15,152,64,174,1,127,192,7,255,0,14,254,0,3,223,128,3,239,128,27,241,194,0,231,224,24,252,224,33,252,128,60,252,64,14,126,0,63,62,0,15,254,0,31,255,0,62,240,7,252,0,126,16,63,255,0,63,56,14,124,1,135,12,252,199,0,62,4,15,62,31,15,15,31,15,2,131,135,207,3,135,15,63,192,7,158,96,63,192,3,254,0,63,224,119,225,192,254,224,195,224,1,223,248,3,7,0,126,112,0,124,56,24,254,12,30,120,28,124,62,14,31,30,30,62,0,127,131,7,219,135,131,7,199,7,16,113,255,0,63,226,1,224,193,195,225,0,127,192,5,240,32,248,240,112,254,120,121,248,2,63,12,143,3,15,159,224,193,199,135,3,195,195,176,225,225,193,227,224,113,240,0,252,112,124,12,62,56,14,28,112,195,199,3,129,193,199,231,0,15,199,135,25,9,239,196,51,224,193,252,248,112,240,120,248,240,97,199,0,31,248,1,124,248,240,120,112,60,124,206,14,33,131,207,8,7,143,8,193,135,143,128,199,227,0,7,248,224,239,0,57,247,128,14,248,225,227,248,33,159,192,255,3,248,7,192,31,248,196,4,252,196,193,188,135,240,15,192,127,5,224,37,236,192,62,132,71,240,142,3,248,3,251,192,25,248,7,156,12,23,248,7,224,31,161,252,15,252,1,240,63,0,254,3,240,31,0,253,0,255,136,13,249,1,255,0,112,7,192,62,66,243,13,196,127,128,252,7,240,94,192,63,0,120,63,129,255,1,248,1,195,232,12,228,100,143,228,15,240,7,240,194,31,0,127,192,111,128,126,3,248,7,240,63,192,120,15,130,7,254,34,119,112,2,118,3,254,0,254,103,0,124,199,241,142,198,59,224,63,132,243,25,216,3,153,252,9,184,15,248,0,157,36,97,249,13,0,253,3,240,31,144,63,1,248,31,208,15,248,55,1,248,7,240,15,192,63,0,254,3,248,15,192,63,0,250,3,240,15,128,255,1,184,7,240,1,252,1,188,128,19,30,0,127,225,64,127,160,127,176,0,63,192,31,192,56,15,240,31,128,255,1,252,3,241,126,1,254,1,240,255,0,127,192,29,7,240,15,192,126,6,224,7,224,15,248,6,193,254,1,252,3,224,15,0,252],m=(H,A,E,e,r)=>{const[t,O,R,I]=((E,e,r)=>{var H=(H,A,E)=>{var e=A;A<30?A=0:A-=30;let r;for(;127===(r=E[A]);)++A;for(;A!==e;)for(r+=H,E[A]=255&r;++A!==e&&255===E[A];);};let t=[],O=[[],[],[]],R=[[],[],[]],I=[],Y=0;for(let A=0;A>8&255,R[2][Y]=X[l]>>16&255,I[Y]=V[l],t[Y]=E+U&255,Y++}return[t,O,R,I]})(A,H,((A,E)=>{var e=(H,A)=>(H*A>>8&255)<<1;let r=[[],[],[]];b.map((H,A)=>{r[0][A]=255&H,r[1][A]=H>>8&255,r[2][A]=H>>16&255});for(let H=5;H<30;H++)r[0][H]=e(A,r[0][H]),r[1][H]=e(E,r[1][H]);for(let H=48;H<54;H++)r[0][H]=e(A,r[0][H]),r[1][H]=e(E,r[1][H]);return r})(E,e));if(A=((A,H,E,e)=>{let Y=[A,H[0],H[1],H[2],E[0],E[1],E[2]],l=(H,A)=>Y[H][A];var r=(A,E,e,H)=>{var r=H<0,t=Math.abs(H)%A,O=H/A|0;let R=0,I=A;for(;0<--I;){let H=l(E,e)+O;(R+=t)>=A&&(R-=A,r?H--:H&&H++),Y[E][++e]=H,H+=O}};let t,O,R=0;for(let H=0;H>1)+(n=e[H+1][1]>>1),0,S,A[R+n]-A[R-N]);for(let H=1;H<7;H++){var f=l(H,W)-l(H,S);r(T,H,S,f)}}}return R+e[e.length-1][1]})(t,O,R,H),!r)for(let H=0;H>1;var Y=[0,1,2,2,2,3,3,4,4,5,6,8,9,11,13,15];for(let H=R[0].length-1;0<=H;H--)R[0][H]=Y[R[0][H]],R[1][H]=Y[R[1][H]],R[2][H]=Y[R[2][H]];return[A,O,t,R,I]},J=H=>{let E=new Uint8Array(H),e=0,r=0,t=(H,A)=>{A=16*(15&A),t.ary(H,[A,A,A,A,A])};return t.ary=(H,A)=>{if(((e+=[[162,167,167,127,128],[226,60,60,0,0],[225,60,59,0,0],[200,0,0,54,55],[199,0,0,54,54]][r][H])/50|0)>E.length)throw new Error;r=H;for(let H=0;H<5;H++)E[(e/50|0)+H]=A[H]},t.get=()=>E.slice(0,e/50|0),t},c=(O,A,H,E)=>{var e=(7&H)-1;let R=256*e&65535,I=248&H;var r=(H,A,E,e)=>{let r=8,t=w[R+I];for(;0!=(128&t)?O(H,A):O(E,e),t<<=1,--r;);};if(0===I){let H=E>>4^255;for(I=255&A;r(3,26,4,6),I++,I&=255,255&++H;);return I}I^=255;for(var t=255&B[e];r(2,5,1,t),255&++I;);return A},d=H=>127*Math.sin(2*Math.PI*(H/256))|0,y=(H,A,E,t,e,O,r)=>{let R=E,I=0,Y=0,l=0,U=0,n=0,N=e[0],W=.75*N|0;for(;A;){var S=r[n];if(0!=(248&S))U=c(H,U,S,e[255&n]),n+=2,A-=2,R=E;else{{let A=[],E=256*I,e=256*Y,r=256*l;for(let H=0;H<5;H++){var T=d(255&E>>8),f=d(255&e>>8),a=(255&r>>8)<129?-112:112,T=(T*(15&O[0][n])+f*(15&O[1][n])+a*(15&O[2][n]))/32+128;A[H]=0|T,E+=256*t[0][n]/4,e+=256*t[1][n]/4,r+=256*t[2][n]/4}H.ary(0,A)}if(0==--R){if(n++,0==--A)return;R=E}if(0!=--N){if(0!=--W||0===S){I+=t[0][n],Y+=t[1][n],l+=t[2][n];continue}U=c(H,U,S,e[255&n])}}N=e[n],W=.75*N|0,I=0,Y=0,l=0}};function e(H){var A=1{if(!H)return!1;var A=H=>H===I.length?null:I[H],E=(A,H,E,e)=>{for(let H=I.length-1;H>=A;H--)I[H+1]=I[H],R[H+1]=t(H),O[H+1]=r(H);I[A]=H,R[A]=0|e,O[A]=E};let r=H=>0|O[H],t=H=>0|R[H];var e=(H,A)=>{R[H]=A};let O=[],R=[],I=[],Y=0;return o(H,H=>{O[Y]=0,R[Y]=0,I[Y++]=H},H=>{O[Y-1]=H}),s(E,(H,A)=>{I[H]=A},A,r),h(A,r,(H,A)=>{O[H]=A}),v(A,r,e),G(A,e,t),g(A,E,r),I.map((H,A)=>H?[H,0|R[A],0|O[A]]:null).filter(H=>H)})(H)))return!1;{e=void 0===(e=A.pitch)?64:255&e,r=void 0===(r=A.mouth)?128:255&r,t=void 0===(t=A.throat)?128:255&t,E=255&(A.speed||72),A=A.singmode||!1;var E,e=m(O,e,r,t,A);let H=J(176.4*O.reduce((H,A)=>H+A[1],0)*E|0);var[r,t,A,O,e]=e;return y(H,r,E,t,A,O,e),H.get()}}let F=H=>{let A=" "+H.toUpperCase(),E=0,e="",r=(H,A)=>{E+=A,e+=H},t=0;for(;EH(A,E,r));else if(0!==Y[O]){if(!n(O,U))return!1;S[O].some(H=>H(A,E,r))}else e+=" ",E++;else e+=".",E++}return e},Z=e,P=(H,A)=>{if(!1===(H=e(H,A)))return!1;{var E=H;let A=new Float32Array(E.length);for(let H=0;HA||E.phonetic?H.toUpperCase():F(H);this.buf8=(H,A)=>Z(e(H,A),E),this.buf32=(H,A)=>P(e(H,A),E),this.speak=(A,H)=>{if(A=this.buf32(A,H),I=null===I?new AudioContext:I){var O=I,R=A;let t,H=new Promise((H,A)=>{let E=O.createBufferSource(),e=O.createBuffer(1,R.length,22050),r=e.getChannelData(0);for(let H=0;H{H(!0)},t=H=>{E.disconnect(),A(H)},E.start(0)});return H.abort=t,H}throw new Error},this.download=(E,e)=>{{E=this.buf8(E,e),e=new Blob([R(E)],{type:"audio/vnd.wave"});let H=window.URL||window.webkitURL,A=(E=H.createObjectURL(e),document.createElement("a"));return A.href=E,A.target="_blank",A.download="sam.wav",document.body.appendChild(A),A.click(),document.body.removeChild(A),void H.revokeObjectURL(E)}},this.wav=(H,A)=>R(this.buf8(H,A))}H.buf8=Z,H.buf32=P,H.convert=F;export{H as default}; +let Y=(H,A)=>0!=(H&A),r=H=>{let E=new Uint8Array(H.length);return H.split("").forEach((H,A)=>{E[A]=H.charCodeAt(0)}),E},t=H=>{var A=new Uint8Array(4);return A[0]=H,A[1]=H>>8,A[2]=H>>16,A[3]=H>>24,A},O=H=>{var A=new Uint8Array(2);return A[0]=H,A[1]=H>>8,A},I=null,R=H=>{let A=new Uint8Array(44+H.length),E=0,e=H=>{A.set(H,E),E+=H.length};return e(r("RIFF")),e(t(H.length+12+16+8-8)),e(r("WAVE")),e(r("fmt ")),e(t(16)),e(O(1)),e(O(1)),e(t(22050)),e(t(22050)),e(O(1)),e(O(8)),e(r("data")),e(t(H.length)),e(H),A},l={" ":0,"!":2,'"':2,"#":2,$:2,"%":2,"&":2,"'":130,"(":0,")":0,"*":2,"+":2,",":2,"-":2,".":2,"/":2,0:3,1:3,2:3,3:3,4:3,5:3,6:3,7:3,8:3,9:3,":":2,";":2,"<":2,"=":2,">":2,"?":2,"@":2,A:192,B:168,C:176,D:172,E:192,F:160,G:184,H:160,I:192,J:188,K:160,L:172,M:168,N:172,O:192,P:160,Q:160,R:172,S:180,T:164,U:192,V:168,W:168,X:176,Y:192,Z:188,"[":0,"\\":0,"]":0,"^":2,_:0,"`":32},U=128,n=(H,A)=>0!=(l[H]&A),N=(H,A,E)=>n(H[A],E),W=(H,A)=>-1!==A.indexOf(H),E=H=>{let A=H.split("="),e=A.pop(),E=A.join("=").split("("),r=E.pop().split(")"),t=E[0],O=r[0],R=r[1],I=["T","C","S"],Y=["E","I","Y"],l=(H,A,E)=>{if(H.startsWith(O,A)&&((A,E)=>{for(let H=t.length-1;-1!N(A,--E,U),"#":()=>N(A,--E,64),".":()=>N(A,--E,8),"&":()=>N(A,--E,16)||W(A.substr(--E,2),["CH","SH"]),"@":()=>{var H;return!!N(A,--E,4)||"H"===(H=A[E])&&!!W(H,I)},"^":()=>N(A,--E,32),"+":()=>W(A[--E],Y),":":()=>{for(;0<=E&&N(A,E-1,32);)E--;return!0}}[e]())return!1}return!0})(H,A)&&((A,E)=>{for(let H=0;H!N(A,++E,U),"#":()=>N(A,++E,64),".":()=>N(A,++E,8),"&":()=>N(A,++E,16)||W(A.substr(++E-2,2),["HC","HS"]),"@":()=>{var H;return!!N(A,++E,4)||"H"===(H=A[E])&&!!W(H,I)},"^":()=>N(A,++E,32),"+":()=>W(A[++E],Y),":":()=>{for(;N(A,E+1,32);)E++;return!0},"%":()=>{if("E"!==A[E+1])return"ING"===A.substr(E+1,3)&&(E+=3,!0);if(N(A,E+2,U)){if(!W(A[E+2],["R","S","D"]))return"L"!==A[E+2]?"FUL"===A.substr(E+2,3)&&(E+=4,!0):"Y"===A[E+3]&&(E+=3,!0);E+=2}else E++;return!0}}[e]())return!1}return!0})(H,A+(O.length-1)))return E(e,O.length),!0};return l.c=O[0],l},S={},T=(" (A.)=EH4Y. |(A) =AH| (ARE) =AAR| (AR)O=AXR|(AR)#=EH4R| ^(AS)#=EY4S|(A)WA=AX|(AW)=AO5| :(ANY)=EH4NIY|(A)^+#=EY5|#:(ALLY)=ULIY| (AL)#=UL|(AGAIN)=AXGEH4N|#:(AG)E=IHJ|(A)^%=EY|(A)^+:#=AE| :(A)^+ =EY4| (ARR)=AXR|(ARR)=AE4R| ^(AR) =AA5R|(AR)=AA5R|(AIR)=EH4R|(AI)=EY4|(AY)=EY5|(AU)=AO4|#:(AL) =UL|#:(ALS) =ULZ|(ALK)=AO4K|(AL)^=AOL| :(ABLE)=EY4BUL|(ABLE)=AXBUL|(A)VO=EY4|(ANG)+=EY4NJ|(ATARI)=AHTAA4RIY|(A)TOM=AE|(A)TTI=AE| (AT) =AET| (A)T=AH|(A)=AE| (B) =BIY4| (BE)^#=BIH|(BEING)=BIY4IHNX| (BOTH) =BOW4TH| (BUS)#=BIH4Z|(BREAK)=BREY5K|(BUIL)=BIH4L|(B)=B| (C) =SIY4| (CH)^=K|^E(CH)=K|(CHA)R#=KEH5|(CH)=CH| S(CI)#=SAY4|(CI)A=SH|(CI)O=SH|(CI)EN=SH|(CITY)=SIHTIY|(C)+=S|(CK)=K|(COMMODORE)=KAA4MAHDOHR|(COM)=KAHM|(CUIT)=KIHT|(CREA)=KRIYEY|(C)=K| (D) =DIY4| (DR.) =DAA4KTER|#:(DED) =DIHD|.E(D) =D|#:^E(D) =T| (DE)^#=DIH| (DO) =DUW| (DOES)=DAHZ|(DONE) =DAH5N|(DOING)=DUW4IHNX| (DOW)=DAW|#(DU)A=JUW|#(DU)^#=JAX|(D)=D| (E) =IYIY4|#:(E) =|':^(E) =| :(E) =IY|#(ED) =D|#:(E)D =|(EV)ER=EH4V|(E)^%=IY4|(ERI)#=IY4RIY|(ERI)=EH4RIH|#:(ER)#=ER|(ERROR)=EH4ROHR|(ERASE)=IHREY5S|(ER)#=EHR|(ER)=ER| (EVEN)=IYVEHN|#:(E)W=|@(EW)=UW|(EW)=YUW|(E)O=IY|#:&(ES) =IHZ|#:(E)S =|#:(ELY) =LIY|#:(EMENT)=MEHNT|(EFUL)=FUHL|(EE)=IY4|(EARN)=ER5N| (EAR)^=ER5|(EAD)=EHD|#:(EA) =IYAX|(EA)SU=EH5|(EA)=IY5|(EIGH)=EY4|(EI)=IY4| (EYE)=AY4|(EY)=IY|(EU)=YUW5|(EQUAL)=IY4KWUL|(E)=EH| (F) =EH4F|(FUL)=FUHL|(FRIEND)=FREH5ND|(FATHER)=FAA4DHER|(F)F=|(F)=F| (G) =JIY4|(GIV)=GIH5V| (G)I^=G|(GE)T=GEH5|SU(GGES)=GJEH4S|(GG)=G| B#(G)=G|(G)+=J|(GREAT)=GREY4T|(GON)E=GAO5N|#(GH)=| (GN)=N|(G)=G| (H) =EY4CH| (HAV)=/HAE6V| (HERE)=/HIYR| (HOUR)=AW5ER|(HOW)=/HAW|(H)#=/H|(H)=| (IN)=IHN| (I) =AY4|(I) =AY|(IN)D=AY5N|SEM(I)=IY| ANT(I)=AY|(IER)=IYER|#:R(IED) =IYD|(IED) =AY5D|(IEN)=IYEHN|(IE)T=AY4EH|(I')=AY5| :(I)^%=AY5| :(IE) =AY4|(I)%=IY|(IE)=IY4| (IDEA)=AYDIY5AH|(I)^+:#=IH|(IR)#=AYR|(IZ)%=AYZ|(IS)%=AYZ|I^(I)^#=IH|+^(I)^+=AY|#:^(I)^+=IH|(I)^+=AY|(IR)=ER|(IGH)=AY4|(ILD)=AY5LD| (IGN)=IHGN|(IGN) =AY4N|(IGN)^=AY4N|(IGN)%=AY4N|(ICRO)=AY4KROH|(IQUE)=IY4K|(I)=IH| (J) =JEY4|(J)=J| (K) =KEY4| (K)N=|(K)=K| (L) =EH4L|(LO)C#=LOW|L(L)=|#:^(L)%=UL|(LEAD)=LIYD| (LAUGH)=LAE4F|(L)=L| (M) =EH4M| (MR.) =MIH4STER| (MS.)=MIH5Z| (MRS.) =MIH4SIXZ|(MOV)=MUW4V|(MACHIN)=MAHSHIY5N|M(M)=|(M)=M| (N) =EH4N|E(NG)+=NJ|(NG)R=NXG|(NG)#=NXG|(NGL)%=NXGUL|(NG)=NX|(NK)=NXK| (NOW) =NAW4|N(N)=|(NON)E=NAH4N|(N)=N| (O) =OH4W|(OF) =AHV| (OH) =OW5|(OROUGH)=ER4OW|#:(OR) =ER|#:(ORS) =ERZ|(OR)=AOR| (ONE)=WAHN|#(ONE) =WAHN|(OW)=OW| (OVER)=OW5VER|PR(O)V=UW4|(OV)=AH4V|(O)^%=OW5|(O)^EN=OW|(O)^I#=OW5|(OL)D=OW4L|(OUGHT)=AO5T|(OUGH)=AH5F| (OU)=AW|H(OU)S#=AW4|(OUS)=AXS|(OUR)=OHR|(OULD)=UH5D|(OU)^L=AH5|(OUP)=UW5P|(OU)=AW|(OY)=OY|(OING)=OW4IHNX|(OI)=OY5|(OOR)=OH5R|(OOK)=UH5K|F(OOD)=UW5D|L(OOD)=AH5D|M(OOD)=UW5D|(OOD)=UH5D|F(OOT)=UH5T|(OO)=UW5|(O')=OH|(O)E=OW|(O) =OW|(OA)=OW4| (ONLY)=OW4NLIY| (ONCE)=WAH4NS|(ON'T)=OW4NT|C(O)N=AA|(O)NG=AO| :^(O)N=AH|I(ON)=UN|#:(ON)=UN|#^(ON)=UN|(O)ST=OW|(OF)^=AO4F|(OTHER)=AH5DHER|R(O)B=RAA|^R(O):#=OW5|(OSS) =AO5S|#:^(OM)=AHM|(O)=AA| (P) =PIY4|(PH)=F|(PEOPL)=PIY5PUL|(POW)=PAW4|(PUT) =PUHT|(P)P=|(P)S=|(P)N=|(PROF.)=PROHFEH4SER|(P)=P| (Q) =KYUW4|(QUAR)=KWOH5R|(QU)=KW|(Q)=K| (R) =AA5R| (RE)^#=RIY|(R)R=|(R)=R| (S) =EH4S|(SH)=SH|#(SION)=ZHUN|(SOME)=SAHM|#(SUR)#=ZHER|(SUR)#=SHER|#(SU)#=ZHUW|#(SSU)#=SHUW|#(SED)=ZD|#(S)#=Z|(SAID)=SEHD|^(SION)=SHUN|(S)S=|.(S) =Z|#:.E(S) =Z|#:^#(S) =S|U(S) =S| :#(S) =Z|##(S) =Z| (SCH)=SK|(S)C+=|#(SM)=ZUM|#(SN)'=ZUM|(STLE)=SUL|(S)=S| (T) =TIY4| (THE) #=DHIY| (THE) =DHAX|(TO) =TUX| (THAT)=DHAET| (THIS) =DHIHS| (THEY)=DHEY| (THERE)=DHEHR|(THER)=DHER|(THEIR)=DHEHR| (THAN) =DHAEN| (THEM) =DHAEN|(THESE) =DHIYZ| (THEN)=DHEHN|(THROUGH)=THRUW4|(THOSE)=DHOHZ|(THOUGH) =DHOW|(TODAY)=TUXDEY|(TOMO)RROW=TUMAA5|(TO)TAL=TOW5| (THUS)=DHAH4S|(TH)=TH|#:(TED)=TIXD|S(TI)#N=CH|(TI)O=SH|(TI)A=SH|(TIEN)=SHUN|(TUR)#=CHER|(TU)A=CHUW| (TWO)=TUW|&(T)EN =|(T)=T| (U) =YUW4| (UN)I=YUWN| (UN)=AHN| (UPON)=AXPAON|@(UR)#=UH4R|(UR)#=YUH4R|(UR)=ER|(U)^ =AH|(U)^^=AH5|(UY)=AY5| G(U)#=|G(U)%=|G(U)#=W|#N(U)=YUW|@(U)=UW|(U)=YUW| (V) =VIY4|(VIEW)=VYUW5|(V)=V| (W) =DAH4BULYUW| (WERE)=WER|(WA)SH=WAA|(WA)ST=WEY|(WA)S=WAH|(WA)T=WAA|(WHERE)=WHEHR|(WHAT)=WHAHT|(WHOL)=/HOWL|(WHO)=/HUW|(WH)=WH|(WAR)#=WEHR|(WAR)=WAOR|(WOR)^=WER|(WR)=R|(WOM)A=WUHM|(WOM)E=WIHM|(WEA)R=WEH|(WANT)=WAA5NT|ANS(WER)=ER|(W)=W| (X) =EH4KR| (X)=Z|(X)=KS| (Y) =WAY4|(YOUNG)=YAHNX| (YOUR)=YOHR| (YOU)=YUW| (YES)=YEHS| (Y)=Y|F(Y)=AY|PS(YCH)=AYK|#:^(Y)=IY|#:^(Y)I=IY| :(Y) =AY| :(Y)#=AY| :(Y)^+:#=IH| :(Y)^#=AY|(Y)=IH| (Z) =ZIY4|(Z)=Z".split("|").map(H=>{var A=(H=E(H)).c;S[A]=S[A]||[],S[A].push(H)}),'(A)=|(!)=.|(") =-AH5NKWOWT-|(")=KWOW4T-|(#)= NAH4MBER|($)= DAA4LER|(%)= PERSEH4NT|(&)= AEND|(\')=|(*)= AE4STERIHSK|(+)= PLAH4S|(,)=,| (-) =-|(-)=|(.)= POYNT|(/)= SLAE4SH|(0)= ZIY4ROW| (1ST)=FER4ST| (10TH)=TEH4NTH|(1)= WAH4N| (2ND)=SEH4KUND|(2)= TUW4| (3RD)=THER4D|(3)= THRIY4|(4)= FOH4R| (5TH)=FIH4FTH|(5)= FAY4V| (64) =SIH4KSTIY FOHR|(6)= SIH4KS|(7)= SEH4VUN| (8TH)=EY4TH|(8)= EY4T|(9)= NAY4N|(:)=.|(;)=.|(<)= LEH4S DHAEN|(=)= IY4KWULZ|(>)= GREY4TER DHAEN|(?)=?|(@)= AE6T|(^)= KAE4RIXT'.split("|").map(E)),f="*12345678".split(""),e=" *.*?*,*-*IYIHEHAEAAAHAOUHAXIXERUXOHRXLXWXYXWHR*L*W*Y*M*N*NXDXQ*S*SHF*TH/H/XZ*ZHV*DHCH**J*******EYAYOYAWOWUWB*****D*****G*****GX****P*****T*****K*****KX****ULUMUN".match(/.{1,2}/g),D=[32768,49408,49408,49408,49408,164,164,164,164,164,164,132,132,164,164,132,132,132,132,132,132,132,68,4164,4164,4164,4164,2124,3148,2124,1096,16460,9280,8256,8256,9280,64,64,9284,8260,8260,9284,8264,8256,76,8260,0,0,180,180,180,148,148,148,78,78,78,1102,1102,1102,78,78,78,78,78,78,75,75,75,1099,1099,1099,75,75,75,75,75,75,128,193,193],i=[0,4626,4626,4626,2056,2824,2312,2824,3592,3851,2822,4108,3082,1541,1541,3595,3082,3594,3082,2825,2056,2055,2825,2567,2310,2056,2054,2055,2055,2055,770,1285,514,514,514,514,514,514,1542,1542,2055,1542,1542,514,2312,1027,513,286,3597,3852,3852,3852,3598,3593,2054,513,514,1797,513,257,1798,513,514,1798,513,514,2056,514,514,1540,514,514,1798,513,1028,1798,257,1028,1479,1535],g=(A,E)=>{var H=e.findIndex(H=>H===A+E&&"*"!==H[1]);return-1!==H&&H},B=A=>{var H=e.findIndex(H=>H===A+"*");return-1!==H&&H},p=(r,t,O)=>{for(let e=0;eY(D[H],A),V=23,b=57,w=69,m=1,J=2,y=8192,k=4096,Q=2048,x=1024,j=256,a=128,u=64,L=32,$=16,_=8,s=4,G=2,h=1,q=(E,e,r,t)=>{let H=(H,A)=>{switch(H){case 53:o(r(A-1),x)&&e(A,16);break;case 42:E(A+1,43,t(A));break;case 44:E(A+1,45,t(A))}},A=(H,A)=>{e(H,13),E(H+1,A,t(H))},O=-1,R;for(;null!==(R=r(++O));)if(0!==R)if(o(R,$))E(O+1,o(R,L)?21:20,t(O)),H(R,O);else if(78===R)A(O,24);else if(79===R)A(O,27);else if(80===R)A(O,28);else if(o(R,a)&&t(O))0===r(O+1)&&null!==(R=r(O+2))&&o(R,a)&&t(O+2)&&E(O+2,31,0);else{var I,Y=0===O?null:r(O-1);if(R===V)switch(Y){case w:e(O-1,42);break;case b:e(O-1,44);break;default:o(Y,a)&&e(O,18)}else 24===R&&o(Y,a)?e(O,19):60===Y&&32===R?e(O,38):60===R?(I=r(O+1),o(I,L)||null===I||e(O,63)):(72===R&&(I=r(O+1),o(I,L)&&null!==I||(e(O,75),R=75)),o(R,h)&&32===Y?e(O,R-12):o(R,h)||H(R,O),69!==R&&57!==R||0{for(let H=0;null!==r(H);H++)if(o(r(H),j)){for(var A,E=H;1<--H&&!o(r(H),a););if(0===H)break;for(;H>1)+A+1))}let R=-1,I;for(;null!==(I=r(++R));){let H=R,A,E,e;if(o(I,a))I=r(++H),o(I,u)?(A=null===I?u|h:D[I],Y(A,s)?(e=O(R),t(R,(e>>2)+e+1)):Y(A,h)&&(E=O(R),t(R,E-(E>>3)))):18!==I&&19!==I||!o(r(++H),u)||t(R,O(R)-1);else if(o(I,Q))null!==(I=r(++H))&&o(I,G)&&(t(H,6),t(H-1,5));else if(o(I,G)){for(;0===(I=r(++H)););null!==I&&o(I,G)&&(t(H,1+(O(H)>>1)),t(R,1+(O(R)>>1)))}else 0{let e=0;for(var r;null!==(r=H(e));)o(r,u)&&null!==(r=H(e+1))&&o(r,a)&&0!==(r=A(e+1))&&r<128&&E(e,r+1),++e},A1=(H,A,E)=>{let e=0;for(var r;null!==(r=H(e));){var t=A(e);E(e,0===t||127>8),e++}},E1=(E,H,A)=>{let e=-1;for(var r;null!==(r=E(++e));)if(o(r,G)){if(o(r,h)){let H,A=e;for(;0===(H=E(++A)););if(null!==H&&(o(H,_)||36===H||37===H))continue}H(e+1,r+1,A(e),255&i[r+1]),H(e+2,r+2,A(e),255&i[r+2]),e+=2}},e1=[24,26,23,23,23],r1=[0,224,230,236,243,249,0,6,12,6],M=[0,31,31,31,31,2,2,2,2,2,2,2,2,2,5,5,2,10,2,8,5,5,11,10,9,8,8,160,8,8,23,31,18,18,18,18,30,30,20,20,20,20,23,23,26,26,29,29,2,2,2,2,2,2,26,29,27,26,29,27,26,29,27,26,29,27,23,29,23,23,29,23,23,29,23,23,29,23,23,23],K=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,2,4,4,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,0,1,0,5,5,5,5,5,4,4,2,0,1,2,0,1,2,0,1,2,0,1,2,0,2,2,0,1,3,0,2,3,0,2,160,160],C=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,4,4,3,3,3,3,3,1,2,3,2,1,3,3,3,3,1,1,3,3,3,2,2,3,2,3,0,0,5,5,5,5,4,4,2,0,2,2,0,3,2,0,4,2,0,3,2,0,2,2,0,2,3,0,3,3,0,3,176,160],t1=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,226,211,187,124,149,1,2,3,3,0,114,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,25,0,0,0,0,0,0,0,0,0],O1=[0,5980947,5980947,5980947,5980947,7230474,6113550,5980947,5783320,5842971,5712919,5775125,5383440,5844244,6113550,4075794,5383182,5774866,4076306,7218448,5250317,6112527,5904395,3944978,7216654,5904395,7230217,5320198,7943686,6641158,7943686,5980945,6506758,6967046,5315078,7946758,6113550,5383440,6107913,6767114,4990984,6106890,6639366,6639366,7946758,6639365,7958022,0,5916691,5777179,5775125,5778203,5774866,5382669,5315078,5315078,5315078,7946758,7946758,7946758,7368198,7237126,7237126,6181894,6181894,6181894,5315078,5315078,5315078,7946758,7946758,7946758,6647046,6641162,7367946,6181894,6181894,6181894,556844,98067],v=[0,0,0,0,0,526861,461581,527630,527887,68879,68623,3087,68367,2316,461581,330508,68623,3087,396301,67597,2061,461838,2061,330252,67597,2061,526861,780,2313,198153,0,0,0,0,0,0,0,0,779,66827,779,1035,0,0,1,66827,920064,66050,593422,68879,3087,68879,3087,2061,2,260,0,2,260,0,1,260,0,1,260,0,0,0,0,0,0,0,0,461324,0,0,330240,0,1245199,1048591],R1=[56,132,107,25,198,99,24,134,115,152,198,177,28,202,49,140,199,49,136,194,48,152,70,49,24,198,53,12,202,49,12,198,33,16,36,105,18,194,49,20,196,113,8,74,34,73,171,106,168,172,73,81,50,213,82,136,147,108,148,34,21,84,210,37,150,212,80,165,70,33,8,133,107,24,196,99,16,206,107,24,140,113,25,140,99,53,12,198,51,153,204,108,181,78,162,153,70,33,40,130,149,46,227,48,156,197,48,156,162,177,156,103,49,136,102,89,44,83,24,132,103,80,202,227,10,172,171,48,172,98,48,140,99,16,148,98,177,140,130,40,150,51,152,214,181,76,98,41,165,74,181,156,198,49,20,214,56,156,75,180,134,101,24,174,103,28,166,99,25,150,35,25,132,19,8,166,82,172,202,34,137,110,171,25,140,98,52,196,98,25,134,99,24,196,35,88,214,163,80,66,84,74,173,74,37,17,107,100,137,74,99,57,138,35,49,42,234,162,169,68,197,18,205,66,52,140,98,24,140,99,17,72,102,49,157,68,51,29,70,49,156,198,177,12,205,50,136,196,115,24,134,115,8,214,99,88,7,129,224,240,60,7,135,144,60,124,15,199,192,192,240,124,30,7,128,128,0,28,120,112,241,199,31,192,12,254,28,31,31,14,10,122,192,113,242,131,143,3,15,15,12,0,121,248,97,224,67,15,131,231,24,249,193,19,218,233,99,143,15,131,131,135,195,31,60,112,240,225,225,227,135,184,113,14,32,227,141,72,120,28,147,135,48,225,193,193,228,120,33,131,131,195,135,6,57,229,195,135,7,14,28,28,112,244,113,156,96,54,50,195,30,60,243,143,14,60,112,227,199,143,15,15,14,60,120,240,227,135,6,240,227,7,193,153,135,15,24,120,112,112,252,243,16,177,140,140,49,124,112,225,134,60,100,108,176,225,227,15,35,143,15,30,62,56,60,56,123,143,7,14,60,244,23,30,60,120,242,158,114,73,227,37,54,56,88,57,226,222,60,120,120,225,199,97,225,225,176,240,240,195,199,14,56,192,240,206,115,115,24,52,176,225,199,142,28,60,248,56,240,225,193,139,134,143,28,120,112,240,120,172,177,143,57,49,219,56,97,195,14,14,56,120,115,23,30,57,30,56,100,225,241,193,78,15,64,162,2,197,143,129,161,252,18,8,100,224,60,34,224,69,7,142,12,50,144,240,31,32,73,224,248,12,96,240,23,26,65,170,164,208,141,18,130,30,30,3,248,62,3,12,115,128,112,68,38,3,36,225,62,4,78,4,28,193,9,204,158,144,33,7,144,67,100,192,15,198,144,156,193,91,3,226,29,129,224,94,29,3,132,184,44,15,128,177,131,224,48,65,30,67,137,131,80,252,36,46,19,131,241,124,76,44,201,13,131,176,181,130,228,232,6,156,7,160,153,29,7,62,130,143,112,48,116,64,202,16,228,232,15,146,20,63,6,248,132,136,67,129,10,52,57,65,198,227,28,71,3,176,184,19,10,194,100,248,24,249,96,179,192,101,32,96,166,140,195,129,32,48,38,30,28,56,211,1,176,38,64,244,11,195,66,31,133,50,38,96,64,201,203,1,236,17,40,64,250,4,52,224,112,76,140,29,7,105,3,22,200,4,35,232,198,154,11,26,3,224,118,6,5,207,30,188,88,49,113,102,0,248,63,4,252,12,116,39,138,128,113,194,58,38,6,192,31,5,15,152,64,174,1,127,192,7,255,0,14,254,0,3,223,128,3,239,128,27,241,194,0,231,224,24,252,224,33,252,128,60,252,64,14,126,0,63,62,0,15,254,0,31,255,0,62,240,7,252,0,126,16,63,255,0,63,56,14,124,1,135,12,252,199,0,62,4,15,62,31,15,15,31,15,2,131,135,207,3,135,15,63,192,7,158,96,63,192,3,254,0,63,224,119,225,192,254,224,195,224,1,223,248,3,7,0,126,112,0,124,56,24,254,12,30,120,28,124,62,14,31,30,30,62,0,127,131,7,219,135,131,7,199,7,16,113,255,0,63,226,1,224,193,195,225,0,127,192,5,240,32,248,240,112,254,120,121,248,2,63,12,143,3,15,159,224,193,199,135,3,195,195,176,225,225,193,227,224,113,240,0,252,112,124,12,62,56,14,28,112,195,199,3,129,193,199,231,0,15,199,135,25,9,239,196,51,224,193,252,248,112,240,120,248,240,97,199,0,31,248,1,124,248,240,120,112,60,124,206,14,33,131,207,8,7,143,8,193,135,143,128,199,227,0,7,248,224,239,0,57,247,128,14,248,225,227,248,33,159,192,255,3,248,7,192,31,248,196,4,252,196,193,188,135,240,15,192,127,5,224,37,236,192,62,132,71,240,142,3,248,3,251,192,25,248,7,156,12,23,248,7,224,31,161,252,15,252,1,240,63,0,254,3,240,31,0,253,0,255,136,13,249,1,255,0,112,7,192,62,66,243,13,196,127,128,252,7,240,94,192,63,0,120,63,129,255,1,248,1,195,232,12,228,100,143,228,15,240,7,240,194,31,0,127,192,111,128,126,3,248,7,240,63,192,120,15,130,7,254,34,119,112,2,118,3,254,0,254,103,0,124,199,241,142,198,59,224,63,132,243,25,216,3,153,252,9,184,15,248,0,157,36,97,249,13,0,253,3,240,31,144,63,1,248,31,208,15,248,55,1,248,7,240,15,192,63,0,254,3,248,15,192,63,0,250,3,240,15,128,255,1,184,7,240,1,252,1,188,128,19,30,0,127,225,64,127,160,127,176,0,63,192,31,192,56,15,240,31,128,255,1,252,3,241,126,1,254,1,240,255,0,127,192,29,7,240,15,192,126,6,224,7,224,15,248,6,193,254,1,252,3,224,15,0,252],I1=(A,E)=>{let e=(H,A)=>(H*A>>8&255)<<1,r=[[],[],[]];O1.map((H,A)=>{r[0][A]=255&H,r[1][A]=H>>8&255,r[2][A]=H>>16&255});for(let H=5;H<30;H++)r[0][H]=e(A,r[0][H]),r[1][H]=e(E,r[1][H]);for(let H=48;H<54;H++)r[0][H]=e(A,r[0][H]),r[1][H]=e(E,r[1][H]);return r},Y1=(A,H,E,e)=>{let Y=[A,H[0],H[1],H[2],E[0],E[1],E[2]],l=(H,A)=>Y[H][A],r=(A,E,e,H)=>{let r=H<0,t=Math.abs(H)%A,O=H/A|0,R=0,I=A;for(;0<--I;){let H=l(E,e)+O;(R+=t)>=A&&(R-=A,r?H--:H&&H++),Y[E][++e]=H,H+=O}},t,O,R=0;for(let H=0;H>1)+(n=e[H+1][1]>>1),0,S,A[R+n]-A[R-N]);for(let H=1;H<7;H++){var f=l(H,W)-l(H,S);r(T,H,S,f)}}}return R+e[e.length-1][1]},l1=255,U1=1,n1=(E,e,r)=>{let H=(H,A,E)=>{var e=A;A<30?A=0:A-=30;let r;for(;127===(r=E[A]);)++A;for(;A!==e;)for(r+=H,E[A]=255&r;++A!==e&&255===E[A];);},t=[],O=[[],[],[]],R=[[],[],[]],I=[],Y=0;for(let A=0;A>8&255,R[2][Y]=v[l]>>16&255,I[Y]=t1[l],t[Y]=E+U&255,Y++}return[t,O,R,I]},N1=(H,A,E,e,r)=>{var E=I1(E,e),[t,O,R,e]=n1(A,H,E),A=Y1(t,O,R,H);if(!r)for(let H=0;H>1;var I=[0,1,2,2,2,3,3,4,4,5,6,8,9,11,13,15];for(let H=R[0].length-1;0<=H;H--)R[0][H]=I[R[0][H]],R[1][H]=I[R[1][H]],R[2][H]=I[R[2][H]];return[A,O,t,R,e]},W1=H=>{let E=new Uint8Array(H),e=0,r=0,t=(H,A)=>{A=16*(15&A),t.ary(H,[A,A,A,A,A])};return t.ary=(H,A)=>{if(((e+=[[162,167,167,127,128],[226,60,60,0,0],[225,60,59,0,0],[200,0,0,54,55],[199,0,0,54,54]][r][H])/50|0)>E.length)throw new Error;r=H;for(let H=0;H<5;H++)E[(e/50|0)+H]=A[H]},t.get=()=>E.slice(0,e/50|0),t},X=(O,A,H,E)=>{let e=(7&H)-1,R=256*e&65535,I=248&H,r=(H,A,E,e)=>{let r=8,t=R1[R+I];for(;0!=(128&t)?O(H,A):O(E,e),t<<=1,--r;);};if(0===I){let H=E>>4^255;for(I=255&A;r(3,26,4,6),I++,I&=255,255&++H;);return I}I^=255;for(var t=255&e1[e];r(2,5,1,t),255&++I;);return A},c=H=>127*Math.sin(2*Math.PI*(H/256))|0,S1=(H,A,E,t,e,O,r)=>{let R=E,I=0,Y=0,l=0,U=0,n=0,N=e[0],W=.75*N|0;for(;A;){var S=r[n];if(0!=(248&S))U=X(H,U,S,e[255&n]),n+=2,A-=2,R=E;else{{let A=[],E=256*I,e=256*Y,r=256*l;for(let H=0;H<5;H++){var T=c(255&E>>8),f=c(255&e>>8),D=(255&r>>8)<129?-112:112,T=(T*(15&O[0][n])+f*(15&O[1][n])+D*(15&O[2][n]))/32+128;A[H]=0|T,E+=256*t[0][n]/4,e+=256*t[1][n]/4,r+=256*t[2][n]/4}H.ary(0,A)}if(0==--R){if(n++,0==--A)return;R=E}if(0!=--N){if(0!=--W||0===S){I+=t[0][n],Y+=t[1][n],l+=t[2][n];continue}U=X(H,U,S,e[255&n])}}N=e[n],W=.75*N|0,I=0,Y=0,l=0}};function d(H){var A,E,e,r,t,O=1{if(!H)return!1;let A=H=>H===I.length?null:I[H],E=(A,H,E,e)=>{for(let H=I.length-1;H>=A;H--)I[H+1]=I[H],R[H+1]=t(H),O[H+1]=r(H);I[A]=H,R[A]=0|e,O[A]=E},r=H=>0|O[H],t=H=>0|R[H],e=(H,A)=>{R[H]=A},O=[],R=[],I=[],Y=0;return p(H,H=>{O[Y]=0,R[Y]=0,I[Y++]=H},H=>{O[Y-1]=H}),q(E,(H,A)=>{I[H]=A},A,r),H1(A,r,(H,A)=>{O[H]=A}),A1(A,r,e),z(A,e,t),E1(A,E,r),I.map((H,A)=>H?[H,0|R[A],0|O[A]]:null).filter(H=>H)})(H);return!1!==H&&(r=void 0===(r=O.pitch)?64:255&r,E=void 0===(E=O.mouth)?128:255&E,e=void 0===(e=O.throat)?128:255&e,A=255&(O.speed||72),O=O.singmode||!1,r=N1(H,r,E,e,O),E=W1(176.4*H.reduce((H,A)=>H+A[1],0)*A|0),[e,O,H,r,t]=r,S1(E,e,A,O,H,r,t),E.get())}let F=H=>{let A=" "+H.toUpperCase(),E=0,e="",r=(H,A)=>{E+=A,e+=H},t=0;for(;EH(A,E,r));else if(0!==l[O]){if(!n(O,U))return!1;S[O].some(H=>H(A,E,r))}else e+=" ",E++;else e+=".",E++}return e},Z=d,P=(H,A)=>{if(!1===(H=d(H,A)))return!1;var E=H,e=new Float32Array(E.length);for(let H=0;HA||E.phonetic?H.toUpperCase():F(H);this.buf8=(H,A)=>Z(e(H,A),E),this.buf32=(H,A)=>P(e(H,A),E),this.speak=(A,H)=>{if(A=this.buf32(A,H),I=null===I?new AudioContext:I){var O=I,R=A;let t,H=new Promise((H,A)=>{let E=O.createBufferSource(),e=O.createBuffer(1,R.length,22050),r=e.getChannelData(0);for(let H=0;H{H(!0)},t=H=>{E.disconnect(),A(H)},E.start(0)});return H.abort=t,H}throw new Error},this.download=(H,A)=>{var E,H=this.buf8(H,A),A=new Blob([R(H)],{type:"audio/vnd.wave"}),A=(H=window.URL||window.webkitURL).createObjectURL(A);(E=document.createElement("a")).href=A,E.target="_blank",E.download="sam.wav",document.body.appendChild(E),E.click(),document.body.removeChild(E),H.revokeObjectURL(A)},this.wav=(H,A)=>R(this.buf8(H,A))}H.buf8=Z,H.buf32=P,H.convert=F;export{H as default}; //# sourceMappingURL=samjs.esm.min.js.map \ No newline at end of file diff --git a/dist/samjs.esm.min.js.map b/dist/samjs.esm.min.js.map index e299e34..52ee7a1 100644 --- a/dist/samjs.esm.min.js.map +++ b/dist/samjs.esm.min.js.map @@ -1 +1 @@ -{"version":3,"file":"samjs.esm.min.js","sources":["0"],"names":["let","matchesBitmask","bits","mask","text2Uint8Array","text","buffer","Uint8Array","length","split","forEach","e","index","charCodeAt","Uint32ToUint8Array","uint32","result","Uint16ToUint8Array","uint16","context","ToWavBuffer","audiobuffer","realbuffer","pos","write","set","charFlags"," ","!","\"","#","$","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","\\","]","^","_","`","FLAG_ALPHA_OR_QUOT","flags","c","flg","flagsAt","isOneOf","list","indexOf","reciterRule","ruleString","splitted","target","pop","source","join","tmp","pre","match","post","TCS","EIY","inputPos","callback","startsWith","rulePos","ruleByte","substr","inputChar","checkPrefix","checkSuffix","rules","rules2","map","rule","r","push","StressTable","PhonemeNameTable","phonemeFlags","combinedPhonemeLengthTable","Parser1","input","addPhoneme","addStress","srcPos","sign1","sign2","findIndex","value","full_match","single_match","Error","phonemeHasFlag","phoneme","flag","FLAG_VOWEL","Parser2","insertPhoneme","setPhoneme","getPhoneme","getStress","handleUW_CH_J","changeAX","position","suffix","priorPhoneme","AdjustLengths","setLength","getLength","loopIndex","FLAG_CONSONANT","CopyStress","setStress","stress","SetPhonemeLength","ProlongPlosiveStopConsonantsCode41240","nextNonEmpty","sampledConsonantValues0","stressPitch_tab47492","blendRank","outBlendLength","inBlendLength","sampledConsonantFlags","frequencyData","ampldata","sampleTable","PrepareFrames","phonemes","pitch","mouth","throat","singmode","pitches","frequency","amplitude","sampledConsonantFlag","tuples","AddInflection","inflection","end","i","phase1","frames","CreateFrames","trans","factor","initialFrequency","freqdata","v","SetMouthThroat","t","tables","Read","table","interpolate","width","frame","change","sign","remainder","Math","abs","div","error","val","outBlendFrames","inBlendFrames","boundary","next_phoneme","next_rank","rank","trans_end","trans_start","trans_length","cur_width","next_width","CreateTransitions","amplitudeRescale","CreateOutputBuffer","buffersize","bufferpos","oldTimeTableIndex","writer","scaled","ary","array","k","get","slice","RenderSample","Output","lastSampleOffset","consonantFlag","kind","samplePage","off","renderSample","index1","value1","index0","value0","bit","sample","sinus","x","sin","PI","ProcessFrames","frameCount","speed","speedcounter","phase2","phase3","glottal_pulse","mem38","p1","p2","p3","sp1","sp2","rp3","mux","SamProcess","options","arguments","undefined","parsed","phonemeindex","stressValue","phonemeLength","filter","Parser","Renderer","sentences","reduce","convert","toUpperCase","output","successCallback","append","inputSkip","currentChar","some","buf8","buf32","Uint8ArrayToFloat32Array","audio","Float32Array","SamJs","opts","ensurePhonetic","phonetic","this","speak","AudioContext","Play","abort","promise","Promise","resolve","reject","createBufferSource","soundBuffer","createBuffer","getChannelData","connect","destination","onended","reason","disconnect","start","download","RenderBuffer","blob","Blob","type","url","window","URL","webkitURL","a","fileURL","createObjectURL","document","createElement","href","body","appendChild","click","removeChild","revokeObjectURL","wav"],"mappings":"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EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAQC,EAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,KAASC,EAAc,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,KAASC,EAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAOC,EAAc,CAAC,EAAM,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAgB,QAAgB,QAAiB,QAAiB,QAAiB,QAAgB,QAAgB,QAAiB,QAAgB,QAAgB,QAAiB,QAAgB,QAAiB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAiB,QAAgB,QAAgB,QAAe,QAAgB,QAAiB,QAAgB,QAAgB,QAAiB,QAAgB,QAAiB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,EAAM,QAAiB,QAAgB,QAAgB,QAAiB,QAAgB,QAAgB,QAAe,QAAe,QAAe,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAe,QAAe,QAAe,QAAgB,QAAgB,QAAgB,QAAgB,QAAiB,QAAiB,QAAgB,QAAgB,QAAgB,OAAgB,OAAoBC,EAAS,CAAC,EAAM,EAAM,EAAM,EAAM,EAAM,OAAe,OAAe,OAAe,OAAe,MAAc,MAAc,KAAU,MAAc,KAAU,OAAe,OAAe,MAAc,KAAU,OAAe,MAAc,KAAU,OAAe,KAAU,OAAe,MAAc,KAAU,OAAe,IAAS,KAAS,OAAc,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,IAAS,MAAc,IAAS,KAAU,EAAM,EAAM,EAAM,MAAc,OAAc,MAAY,OAAe,MAAc,KAAU,MAAc,KAAU,KAAU,EAAM,IAAQ,EAAM,EAAM,IAAQ,EAAM,EAAM,IAAQ,EAAM,EAAM,IAAQ,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,OAAe,EAAM,EAAM,OAAc,EAAM,QAAa,SAAkBC,EAAY,CAAC,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,I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"} \ No newline at end of file +{"version":3,"file":"samjs.esm.min.js","sources":["0"],"names":["let","matchesBitmask","bits","mask","text2Uint8Array","text","buffer","Uint8Array","length","split","forEach","e","index","charCodeAt","Uint32ToUint8Array","uint32","result","Uint16ToUint8Array","uint16","context","ToWavBuffer","audiobuffer","realbuffer","pos","write","set","charFlags"," ","!","\"","#","$","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","\\","]","^","_","`","FLAG_ALPHA_OR_QUOT","flags","c","flg","flagsAt","isOneOf","list","indexOf","reciterRule","ruleString","splitted","target","pop","source","join","tmp","pre","match","post","TCS","EIY","inputPos","callback","startsWith","rulePos","ruleByte","substr","inputChar","rules","rules2","map","rule","r","push","StressTable","PhonemeNameTable","phonemeFlags","combinedPhonemeLengthTable","full_match","sign1","sign2","findIndex","value","single_match","Parser1","input","addPhoneme","addStress","srcPos","Error","phonemeHasFlag","phoneme","flag","pR","pD","pT","PHONEME_PERIOD","PHONEME_QUESTION","FLAG_FRICATIVE","FLAG_LIQUIC","FLAG_NASAL","FLAG_ALVEOLAR","FLAG_PUNCT","FLAG_VOWEL","FLAG_CONSONANT","FLAG_DIP_YX","FLAG_DIPHTHONG","FLAG_0008","FLAG_VOICED","FLAG_STOPCONS","FLAG_UNVOICED_STOPCONS","Parser2","insertPhoneme","setPhoneme","getPhoneme","getStress","handleUW_CH_J","changeAX","position","suffix","priorPhoneme","AdjustLengths","setLength","getLength","loopIndex","CopyStress","setStress","stress","SetPhonemeLength","ProlongPlosiveStopConsonantsCode41240","nextNonEmpty","sampledConsonantValues0","stressPitch_tab47492","blendRank","outBlendLength","inBlendLength","sampledConsonantFlags","frequencyData","ampldata","sampleTable","SetMouthThroat","mouth","throat","trans","factor","initialFrequency","freqdata","v","i","CreateTransitions","pitches","frequency","amplitude","tuples","tables","Read","table","interpolate","width","frame","change","sign","remainder","Math","abs","div","error","val","outBlendFrames","inBlendFrames","boundary","next_phoneme","next_rank","rank","trans_end","trans_start","trans_length","cur_width","next_width","RISING_INFLECTION","FALLING_INFLECTION","CreateFrames","pitch","AddInflection","inflection","end","sampledConsonantFlag","phase1","frames","PrepareFrames","phonemes","singmode","t","amplitudeRescale","CreateOutputBuffer","buffersize","bufferpos","oldTimeTableIndex","writer","scaled","ary","array","k","get","slice","RenderSample","Output","lastSampleOffset","consonantFlag","kind","samplePage","off","renderSample","index1","value1","index0","value0","bit","sample","sinus","x","sin","PI","ProcessFrames","frameCount","speed","speedcounter","phase2","phase3","glottal_pulse","mem38","p1","p2","p3","sp1","sp2","rp3","mux","SamProcess","options","arguments","undefined","parsed","phonemeindex","stressValue","phonemeLength","filter","sentences","reduce","convert","toUpperCase","output","successCallback","append","inputSkip","currentChar","some","buf8","buf32","Uint8ArrayToFloat32Array","audio","Float32Array","SamJs","opts","ensurePhonetic","phonetic","this","speak","AudioContext","Play","abort","promise","Promise","resolve","reject","createBufferSource","soundBuffer","createBuffer","getChannelData","connect","destination","onended","reason","disconnect","start","download","a","blob","Blob","type","fileURL","url","window","URL","webkitURL","createObjectURL","document","createElement","href","body","appendChild","click","removeChild","revokeObjectURL","wav"],"mappings":"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G,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,EAA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"} \ No newline at end of file diff --git a/dist/samjs.js b/dist/samjs.js index 07eeeec..dc09fa8 100644 --- a/dist/samjs.js +++ b/dist/samjs.js @@ -53,37 +53,31 @@ * * @return {Promise} */ - let Play = (context, audiobuffer) => { let abort; let promise = new Promise((resolve, reject) => { let source = context.createBufferSource(); let soundBuffer = context.createBuffer(1, audiobuffer.length, 22050); let buffer = soundBuffer.getChannelData(0); - for (let i = 0; i < audiobuffer.length; i++) { buffer[i] = audiobuffer[i]; } - source.buffer = soundBuffer; source.connect(context.destination); - source.onended = () => { resolve(true); }; - abort = reason => { source.disconnect(); reject(reason); }; - source.start(0); }); promise.abort = abort; return promise; }; - let context = null; + /** * Play an audio buffer. * @@ -91,20 +85,18 @@ * * @return {Promise} */ - let PlayBuffer = audiobuffer => { if (null === context) { context = new AudioContext(); } - if (!context) { { throw new Error('No player available!'); } } - return Play(context, audiobuffer); }; + /** * Convert a Uint8Array wave buffer to a Float32Array WaveBuffer * @@ -112,16 +104,14 @@ * * @return {Float32Array} */ - let Uint8ArrayToFloat32Array = buffer => { let audio = new Float32Array(buffer.length); - for (let i = 0; i < buffer.length; i++) { audio[i] = (buffer[i] - 128) / 256; } - return audio; }; + /** * Converts a Uint8Array buffer to a Uint8Array wave buffer * @@ -129,67 +119,67 @@ * * @return {Uint8Array} */ - let ToWavBuffer = audiobuffer => { // Calculate buffer size. - let realbuffer = new Uint8Array(4 + // "RIFF" - 4 + // uint32 filesize - 4 + // "WAVE" - 4 + // "fmt " - 4 + // uint32 fmt length - 2 + // uint16 fmt - 2 + // uint16 channels - 4 + // uint32 sample rate - 4 + // uint32 bytes per second - 2 + // uint16 block align - 2 + // uint16 bits per sample - 4 + // "data" - 4 + // uint32 chunk length + let realbuffer = new Uint8Array(4 + + // "RIFF" + 4 + + // uint32 filesize + 4 + + // "WAVE" + 4 + + // "fmt " + 4 + + // uint32 fmt length + 2 + + // uint16 fmt + 2 + + // uint16 channels + 4 + + // uint32 sample rate + 4 + + // uint32 bytes per second + 2 + + // uint16 block align + 2 + + // uint16 bits per sample + 4 + + // "data" + 4 + + // uint32 chunk length audiobuffer.length); let pos = 0; - let write = buffer => { realbuffer.set(buffer, pos); pos += buffer.length; - }; //RIFF header - + }; + //RIFF header write(text2Uint8Array('RIFF')); // chunkID - write(Uint32ToUint8Array(audiobuffer.length + 12 + 16 + 8 - 8)); // ChunkSize - write(text2Uint8Array('WAVE')); // riffType //format chunk - write(text2Uint8Array('fmt ')); write(Uint32ToUint8Array(16)); // ChunkSize - write(Uint16ToUint8Array(1)); // wFormatTag - 1 = PCM - write(Uint16ToUint8Array(1)); // channels - write(Uint32ToUint8Array(22050)); // samplerate - write(Uint32ToUint8Array(22050)); // bytes/second - write(Uint16ToUint8Array(1)); // blockalign - write(Uint16ToUint8Array(8)); // bits per sample //data chunk - write(text2Uint8Array('data')); write(Uint32ToUint8Array(audiobuffer.length)); // buffer length - write(audiobuffer); return realbuffer; }; + /** * * @param {Uint8Array} audiobuffer * * @return void */ - let RenderBuffer = audiobuffer => { let filename = "sam.wav"; let blob = new Blob([ToWavBuffer(audiobuffer)], { @@ -292,13 +282,9 @@ let FLAG_NUMERIC = 0x01; let FLAG_RULESET2 = 0x02; let FLAG_VOICED$1 = 0x04; // FIXME: is this correct? - let FLAG_0X08 = 0x08; // unknown. - let FLAG_DIPHTHONG$1 = 0x10; // FIXME: is this correct? - let FLAG_CONSONANT$1 = 0x20; // FIXME: is this correct? - let FLAG_VOWEL_OR_Y = 0x40; let FLAG_ALPHA_OR_QUOT = 0x80; @@ -308,10 +294,10 @@ * @param {Number} flg * @return {boolean} */ - let flags = (c, flg) => { return (charFlags[c] & flg) !== 0; }; + /** * * @param {string} text @@ -319,8 +305,6 @@ * @param {Number} flg * @return {boolean} */ - - let flagsAt = (text, pos, flg) => { return flags(text[pos], flg); }; @@ -331,11 +315,10 @@ * * @return {boolean} */ - - let isOneOf = (c, list) => { return list.indexOf(c) !== -1; }; + /** * Set a phoneme in the buffer. * @@ -350,30 +333,28 @@ * @param {String} ruleString 'xxx(yyy)zzz=foobar' 'xxx(yyy)zzz' is the source value, 'foobar' is the destination value. * @return {result} */ - - let reciterRule = ruleString => { let splitted = ruleString.split('='); - const // Must pop and join here because of rule for '=' itself. - target = splitted.pop(), - source = splitted.join('=').split('('), - tmp = source.pop().split(')'), - pre = source[0], - match = tmp[0], - post = tmp[1]; + const + // Must pop and join here because of rule for '=' itself. + target = splitted.pop(), + source = splitted.join('=').split('('), + tmp = source.pop().split(')'), + pre = source[0], + match = tmp[0], + post = tmp[1]; let TCS = ['T', 'C', 'S']; let EIY = ['E', 'I', 'Y']; + /** * Test if the rule prefix matches. * @param {string} text The input text. * @param {Number} pos The input position we are working from. * @return {boolean} */ - let checkPrefix = (text, pos) => { for (let rulePos = pre.length - 1; rulePos > -1; rulePos--) { let ruleByte = pre[rulePos]; - if (!flags(ruleByte, FLAG_ALPHA_OR_QUOT)) { if (!{ // '' - previous char must not be alpha or quotation mark. @@ -389,16 +370,14 @@ if (flagsAt(text, --pos, FLAG_VOICED$1)) { return true; } - - let inputChar = text[pos]; // 'H' - - if (inputChar !== 'H') return false; // FIXME: this is always true?!? is there a "--pos" missing in original code? + let inputChar = text[pos]; + // 'H' + if (inputChar !== 'H') return false; + // FIXME: this is always true?!? is there a "--pos" missing in original code? // Check for 'T', 'C', 'S' - if (!isOneOf(inputChar, TCS)) { return false; } - { throw new Error('Is always false but happened? ' + inputChar); } @@ -413,32 +392,30 @@ if (!flagsAt(text, pos - 1, FLAG_CONSONANT$1)) break; pos--; } - return true; } }[ruleByte]()) { return false; } - } // Rule char does not match. + } + // Rule char does not match. else if (text[--pos] !== ruleByte) { return false; } } - return true; }; + /** * Test if the rule suffix matches. * @param {string} text The input text. * @param {Number} pos The input position we are working from. * @return {boolean} */ - - let checkSuffix = (text, pos) => { for (let rulePos = 0; rulePos < post.length; rulePos++) { - let ruleByte = post[rulePos]; // do we have to handle the byte specially? - + let ruleByte = post[rulePos]; + // do we have to handle the byte specially? if (!flags(ruleByte, FLAG_ALPHA_OR_QUOT)) { // pos37226: if (!{ @@ -455,13 +432,13 @@ if (flagsAt(text, ++pos, FLAG_VOICED$1)) { return true; } - let inputChar = text[pos]; - if (inputChar !== 'H') // 'H' - return false; // Check for 'T', 'C', 'S' - - if (!isOneOf(inputChar, TCS)) return false; // FIXME: This is illogical and can never be reached. Bug in orig. code? reciter.c:489 (pos37367) - + if (inputChar !== 'H') + // 'H' + return false; + // Check for 'T', 'C', 'S' + if (!isOneOf(inputChar, TCS)) return false; + // FIXME: This is illogical and can never be reached. Bug in orig. code? reciter.c:489 (pos37367) { throw new Error('This should not be possible ', inputChar); } @@ -475,10 +452,8 @@ while (flagsAt(text, pos + 1, FLAG_CONSONANT$1)) { pos++; } - return true; }, - /* '%' - check if we have: - 'ING' - 'E' not followed by alpha or quot @@ -494,17 +469,14 @@ pos += 3; return true; } - return false; - } // we have 'E' - check if not followed by alpha or quot. - - + } + // we have 'E' - check if not followed by alpha or quot. if (!flagsAt(text, pos + 2, FLAG_ALPHA_OR_QUOT)) { pos++; return true; - } // NOT 'ER', 'ES' OR 'ED' - - + } + // NOT 'ER', 'ES' OR 'ED' if (!isOneOf(text[pos + 2], ['R', 'S', 'D'])) { // NOT 'EL' if (text[pos + 2] !== 'L') { @@ -514,30 +486,28 @@ pos += 4; return true; } - return false; - } // NOT 'ELY' - - + } + // NOT 'ELY' if (text[pos + 3] !== 'Y') return false; pos += 3; return true; } - pos += 2; return true; } }[ruleByte]()) { return false; } - } // Rule char does not match. + } + // Rule char does not match. else if (text[++pos] !== ruleByte) { return false; } } - return true; }; + /** * Test if the rule matches. * @@ -545,22 +515,21 @@ * @param {Number} pos The input position we are working from. * @return {boolean} */ - - let matches = (text, pos) => { // check if content in brackets matches. if (!text.startsWith(match, pos)) { return false; - } // Check left... - + } + // Check left... if (!checkPrefix(text, pos)) { return false; - } // Check right... - + } + // Check right... return checkSuffix(text, pos + (match.length - 1)); }; + /** * This is the real implementation of rule processing. * @@ -570,32 +539,29 @@ * * @return {boolean} */ - - let result = (text, inputPos, callback) => { if (matches(text, inputPos)) { { - console.log("".concat(source, " -> ").concat(target)); + console.log(`${source} -> ${target}`); } - callback(target, match.length); return true; } }; - result.c = match[0]; return result; - }; // Map all rules and generate processors from them. - + }; + // Map all rules and generate processors from them. let rules = {}; rules$1.split('|').map(rule => { let r = reciterRule(rule), - c = r.c; + c = r.c; rules[c] = rules[c] || []; rules[c].push(r); }); let rules2 = rules2$1.split('|').map(reciterRule); + /** * Convert the text to a phoneme string. * @@ -603,33 +569,29 @@ * * @return {boolean|string} */ - let TextToPhonemes = input => { let text = ' ' + input.toUpperCase(); let inputPos = 0, - output = ''; + output = ''; /** * The input callback (successCallback) used from the rules. * * @param {string} append The string to append. * @param {Number} inputSkip The amount or chars to move ahead in the input. */ - let successCallback = (append, inputSkip) => { inputPos += inputSkip; output += append; }; - let c = 0; - while (inputPos < text.length && c++ < 10000) { { let tmp = text.toLowerCase(); - console.log("processing \"".concat(tmp.substr(0, inputPos), "%c").concat(tmp[inputPos].toUpperCase(), "%c").concat(tmp.substr(inputPos + 1), "\""), 'color: red;', 'color:normal;'); + console.log(`processing "${tmp.substr(0, inputPos)}%c${tmp[inputPos].toUpperCase()}%c${tmp.substr(inputPos + 1)}"`, 'color: red;', 'color:normal;'); } + let currentChar = text[inputPos]; - let currentChar = text[inputPos]; // NOT '.' or '.' followed by number. - + // NOT '.' or '.' followed by number. if (currentChar !== '.' || flagsAt(text, inputPos + 1, FLAG_NUMERIC)) { //pos36607: if (flags(currentChar, FLAG_RULESET2)) { @@ -637,118 +599,194 @@ return rule(text, inputPos, successCallback); }); continue; - } //pos36630: - - + } + //pos36630: if (charFlags[currentChar] !== 0) { // pos36677: if (!flags(currentChar, FLAG_ALPHA_OR_QUOT)) { //36683: BRK return false; - } // go to the right rules for this character. - - + } + // go to the right rules for this character. rules[currentChar].some(rule => { return rule(text, inputPos, successCallback); }); continue; } - output += ' '; inputPos++; continue; } - output += '.'; inputPos++; } - return output; }; let StressTable = '*12345678'.split(''); - let PhonemeNameTable = (' *' + // 00 - '.*' + // 01 - '?*' + // 02 - ',*' + // 03 - '-*' + // 04 - 'IY' + // 05 - 'IH' + // 06 - 'EH' + // 07 - 'AE' + // 08 - 'AA' + // 09 - 'AH' + // 10 - 'AO' + // 11 - 'UH' + // 12 - 'AX' + // 13 - 'IX' + // 14 - 'ER' + // 15 - 'UX' + // 16 - 'OH' + // 17 - 'RX' + // 18 - 'LX' + // 19 - 'WX' + // 20 - 'YX' + // 21 - 'WH' + // 22 - 'R*' + // 23 - 'L*' + // 24 - 'W*' + // 25 - 'Y*' + // 26 - 'M*' + // 27 - 'N*' + // 28 - 'NX' + // 29 - 'DX' + // 30 - 'Q*' + // 31 - 'S*' + // 32 - 'SH' + // 33 - 'F*' + // 34 - 'TH' + // 35 - '/H' + // 36 - '/X' + // 37 - 'Z*' + // 38 - 'ZH' + // 39 - 'V*' + // 40 - 'DH' + // 41 - 'CH' + // 42 - '**' + // 43 - 'J*' + // 44 - '**' + // 45 - '**' + // 46 - '**' + // 47 - 'EY' + // 48 - 'AY' + // 49 - 'OY' + // 50 - 'AW' + // 51 - 'OW' + // 52 - 'UW' + // 53 - 'B*' + // 54 - '**' + // 55 - '**' + // 56 - 'D*' + // 57 - '**' + // 58 - '**' + // 59 - 'G*' + // 60 - '**' + // 61 - '**' + // 62 - 'GX' + // 63 - '**' + // 64 - '**' + // 65 - 'P*' + // 66 - '**' + // 67 - '**' + // 68 - 'T*' + // 69 - '**' + // 70 - '**' + // 71 - 'K*' + // 72 - '**' + // 73 - '**' + // 74 - 'KX' + // 75 - '**' + // 76 - '**' + // 77 - 'UL' + // 78 - 'UM' + // 79 + let PhonemeNameTable = (' *' + + // 00 + '.*' + + // 01 + '?*' + + // 02 + ',*' + + // 03 + '-*' + + // 04 + 'IY' + + // 05 + 'IH' + + // 06 + 'EH' + + // 07 + 'AE' + + // 08 + 'AA' + + // 09 + 'AH' + + // 10 + 'AO' + + // 11 + 'UH' + + // 12 + 'AX' + + // 13 + 'IX' + + // 14 + 'ER' + + // 15 + 'UX' + + // 16 + 'OH' + + // 17 + 'RX' + + // 18 + 'LX' + + // 19 + 'WX' + + // 20 + 'YX' + + // 21 + 'WH' + + // 22 + 'R*' + + // 23 + 'L*' + + // 24 + 'W*' + + // 25 + 'Y*' + + // 26 + 'M*' + + // 27 + 'N*' + + // 28 + 'NX' + + // 29 + 'DX' + + // 30 + 'Q*' + + // 31 + 'S*' + + // 32 + 'SH' + + // 33 + 'F*' + + // 34 + 'TH' + + // 35 + '/H' + + // 36 + '/X' + + // 37 + 'Z*' + + // 38 + 'ZH' + + // 39 + 'V*' + + // 40 + 'DH' + + // 41 + 'CH' + + // 42 + '**' + + // 43 + 'J*' + + // 44 + '**' + + // 45 + '**' + + // 46 + '**' + + // 47 + 'EY' + + // 48 + 'AY' + + // 49 + 'OY' + + // 50 + 'AW' + + // 51 + 'OW' + + // 52 + 'UW' + + // 53 + 'B*' + + // 54 + '**' + + // 55 + '**' + + // 56 + 'D*' + + // 57 + '**' + + // 58 + '**' + + // 59 + 'G*' + + // 60 + '**' + + // 61 + '**' + + // 62 + 'GX' + + // 63 + '**' + + // 64 + '**' + + // 65 + 'P*' + + // 66 + '**' + + // 67 + '**' + + // 68 + 'T*' + + // 69 + '**' + + // 70 + '**' + + // 71 + 'K*' + + // 72 + '**' + + // 73 + '**' + + // 74 + 'KX' + + // 75 + '**' + + // 76 + '**' + + // 77 + 'UL' + + // 78 + 'UM' + + // 79 'UN' // 80 ).match(/.{1,2}/g); + /** * Flags for phoneme names. * @@ -803,89 +841,169 @@ * 'P*', '**', '**', 'T*', '**', '**', 'K*', '**', '**', 'KX', '**', * '**', 'UM', 'UN' */ - - let phonemeFlags = [0 | 0x8000, // ' *' 00 - 0 | 0x8000 | 0x4000 | 0x0100, // '.*' 01 - 0 | 0x8000 | 0x4000 | 0x0100, // '?*' 02 - 0 | 0x8000 | 0x4000 | 0x0100, // ',*' 03 - 0 | 0x8000 | 0x4000 | 0x0100, // '-*' 04 - 0 | 0x0080 | 0x0020 | 0x0004, // 'IY' 05 - 0 | 0x0080 | 0x0020 | 0x0004, // 'IH' 06 - 0 | 0x0080 | 0x0020 | 0x0004, // 'EH' 07 - 0 | 0x0080 | 0x0020 | 0x0004, // 'AE' 08 - 0 | 0x0080 | 0x0020 | 0x0004, // 'AA' 09 - 0 | 0x0080 | 0x0020 | 0x0004, // 'AH' 10 - 0 | 0x0080 | 0x0004, // 'AO' 11 - 0 | 0x0080 | 0x0004, // 'UH' 12 - 0 | 0x0080 | 0x0020 | 0x0004, // 'AX' 13 - 0 | 0x0080 | 0x0020 | 0x0004, // 'IX' 14 - 0 | 0x0080 | 0x0004, // 'ER' 15 - 0 | 0x0080 | 0x0004, // 'UX' 16 - 0 | 0x0080 | 0x0004, // 'OH' 17 - 0 | 0x0080 | 0x0004, // 'RX' 18 - 0 | 0x0080 | 0x0004, // 'LX' 19 - 0 | 0x0080 | 0x0004, // 'WX' 20 - 0 | 0x0080 | 0x0004, // 'YX' 21 - 0 | 0x0040 | 0x0004, // 'WH' 22 - 0 | 0x1000 | 0x0040 | 0x0004, // 'R*' 23 - 0 | 0x1000 | 0x0040 | 0x0004, // 'L*' 24 - 0 | 0x1000 | 0x0040 | 0x0004, // 'W*' 25 - 0 | 0x1000 | 0x0040 | 0x0004, // 'Y*' 26 - 0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, // 'M*' 27 - 0 | 0x0800 | 0x0400 | 0x0040 | 0x0008 | 0x0004, // 'N*' 28 - 0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, // 'NX' 29 - 0 | 0x0400 | 0x0040 | 0x0008, // 'DX' 30 - 0 | 0x4000 | 0x0040 | 0x0008 | 0x0004, // 'Q*' 31 - 0 | 0x2000 | 0x0400 | 0x0040, // 'S*' 32 - 0 | 0x2000 | 0x0040, // 'SH' 33 - 0 | 0x2000 | 0x0040, // 'F*' 34 - 0 | 0x2000 | 0x0400 | 0x0040, // 'TH' 35 - 0 | 0x0040, // '/H' 36 - 0 | 0x0040, // '/X' 37 - 0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, // 'Z*' 38 - 0 | 0x2000 | 0x0040 | 0x0004, // 'ZH' 39 - 0 | 0x2000 | 0x0040 | 0x0004, // 'V*' 40 - 0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, // 'DH' 41 - 0 | 0x2000 | 0x0040 | 0x0008, // 'CH' 42 - 0 | 0x2000 | 0x0040, // '**' 43 - 0 | 0x0040 | 0x0008 | 0x0004, // 'J*' 44 - 0 | 0x2000 | 0x0040 | 0x0004, // '**' 45 - 0, // '**' 46 - 0, // '**' 47 - 0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'EY' 48 - 0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'AY' 49 - 0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, // 'OY' 50 - 0 | 0x0080 | 0x0010 | 0x0004, // 'AW' 51 - 0 | 0x0080 | 0x0010 | 0x0004, // 'OW' 52 - 0 | 0x0080 | 0x0010 | 0x0004, // 'UW' 53 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'B*' 54 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 55 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 56 - 0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'D*' 57 - 0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 58 - 0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 59 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'G*' 60 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 61 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 62 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // 'GX' 63 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 64 - 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, // '**' 65 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'P*' 66 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 67 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 68 - 0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'T*' 69 - 0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 70 - 0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 71 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'K*' 72 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 73 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 74 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // 'KX' 75 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 76 - 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, // '**' 77 - 0 | 0x0080, // 'UL' 78 - 0 | 0x0080 | 0x0040 | 0x0001, // 'UM' 79 + let phonemeFlags = [0 | 0x8000, + // ' *' 00 + 0 | 0x8000 | 0x4000 | 0x0100, + // '.*' 01 + 0 | 0x8000 | 0x4000 | 0x0100, + // '?*' 02 + 0 | 0x8000 | 0x4000 | 0x0100, + // ',*' 03 + 0 | 0x8000 | 0x4000 | 0x0100, + // '-*' 04 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'IY' 05 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'IH' 06 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'EH' 07 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'AE' 08 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'AA' 09 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'AH' 10 + 0 | 0x0080 | 0x0004, + // 'AO' 11 + 0 | 0x0080 | 0x0004, + // 'UH' 12 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'AX' 13 + 0 | 0x0080 | 0x0020 | 0x0004, + // 'IX' 14 + 0 | 0x0080 | 0x0004, + // 'ER' 15 + 0 | 0x0080 | 0x0004, + // 'UX' 16 + 0 | 0x0080 | 0x0004, + // 'OH' 17 + 0 | 0x0080 | 0x0004, + // 'RX' 18 + 0 | 0x0080 | 0x0004, + // 'LX' 19 + 0 | 0x0080 | 0x0004, + // 'WX' 20 + 0 | 0x0080 | 0x0004, + // 'YX' 21 + 0 | 0x0040 | 0x0004, + // 'WH' 22 + 0 | 0x1000 | 0x0040 | 0x0004, + // 'R*' 23 + 0 | 0x1000 | 0x0040 | 0x0004, + // 'L*' 24 + 0 | 0x1000 | 0x0040 | 0x0004, + // 'W*' 25 + 0 | 0x1000 | 0x0040 | 0x0004, + // 'Y*' 26 + 0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, + // 'M*' 27 + 0 | 0x0800 | 0x0400 | 0x0040 | 0x0008 | 0x0004, + // 'N*' 28 + 0 | 0x0800 | 0x0040 | 0x0008 | 0x0004, + // 'NX' 29 + 0 | 0x0400 | 0x0040 | 0x0008, + // 'DX' 30 + 0 | 0x4000 | 0x0040 | 0x0008 | 0x0004, + // 'Q*' 31 + 0 | 0x2000 | 0x0400 | 0x0040, + // 'S*' 32 + 0 | 0x2000 | 0x0040, + // 'SH' 33 + 0 | 0x2000 | 0x0040, + // 'F*' 34 + 0 | 0x2000 | 0x0400 | 0x0040, + // 'TH' 35 + 0 | 0x0040, + // '/H' 36 + 0 | 0x0040, + // '/X' 37 + 0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, + // 'Z*' 38 + 0 | 0x2000 | 0x0040 | 0x0004, + // 'ZH' 39 + 0 | 0x2000 | 0x0040 | 0x0004, + // 'V*' 40 + 0 | 0x2000 | 0x0400 | 0x0040 | 0x0004, + // 'DH' 41 + 0 | 0x2000 | 0x0040 | 0x0008, + // 'CH' 42 + 0 | 0x2000 | 0x0040, + // '**' 43 + 0 | 0x0040 | 0x0008 | 0x0004, + // 'J*' 44 + 0 | 0x2000 | 0x0040 | 0x0004, + // '**' 45 + 0, + // '**' 46 + 0, + // '**' 47 + 0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, + // 'EY' 48 + 0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, + // 'AY' 49 + 0 | 0x0080 | 0x0020 | 0x0010 | 0x0004, + // 'OY' 50 + 0 | 0x0080 | 0x0010 | 0x0004, + // 'AW' 51 + 0 | 0x0080 | 0x0010 | 0x0004, + // 'OW' 52 + 0 | 0x0080 | 0x0010 | 0x0004, + // 'UW' 53 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // 'B*' 54 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 55 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 56 + 0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // 'D*' 57 + 0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 58 + 0 | 0x0400 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 59 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // 'G*' 60 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 61 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 62 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // 'GX' 63 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 64 + 0 | 0x0040 | 0x0008 | 0x0004 | 0x0002, + // '**' 65 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // 'P*' 66 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 67 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 68 + 0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // 'T*' 69 + 0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 70 + 0 | 0x0400 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 71 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // 'K*' 72 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 73 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 74 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // 'KX' 75 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 76 + 0 | 0x0040 | 0x0008 | 0x0002 | 0x0001, + // '**' 77 + 0 | 0x0080, + // 'UL' 78 + 0 | 0x0080 | 0x0040 | 0x0001, + // 'UM' 79 0 | 0x0080 | 0x0040 | 0x0001 // 'UN' 80 ]; + /** * Combined table of phoneme length. * @@ -895,88 +1013,167 @@ * phonemeLengthTable[i] = combinedPhonemeLengthTable[i] & 0xFF * phonemeStressedLengthTable[i] = combinedPhonemeLengthTable[i] >> 8 */ - - let combinedPhonemeLengthTable = [0x0000 | 0x0000, // ' *' 00 - 0x0012 | 0x1200, // '.*' 01 - 0x0012 | 0x1200, // '?*' 02 - 0x0012 | 0x1200, // ',*' 03 - 0x0008 | 0x0800, // '-*' 04 - 0x0008 | 0x0B00, // 'IY' 05 - 0x0008 | 0x0900, // 'IH' 06 - 0x0008 | 0x0B00, // 'EH' 07 - 0x0008 | 0x0E00, // 'AE' 08 - 0x000B | 0x0F00, // 'AA' 09 - 0x0006 | 0x0B00, // 'AH' 10 - 0x000C | 0x1000, // 'AO' 11 - 0x000A | 0x0C00, // 'UH' 12 - 0x0005 | 0x0600, // 'AX' 13 - 0x0005 | 0x0600, // 'IX' 14 - 0x000B | 0x0E00, // 'ER' 15 - 0x000A | 0x0C00, // 'UX' 16 - 0x000A | 0x0E00, // 'OH' 17 - 0x000A | 0x0C00, // 'RX' 18 - 0x0009 | 0x0B00, // 'LX' 19 - 0x0008 | 0x0800, // 'WX' 20 - 0x0007 | 0x0800, // 'YX' 21 - 0x0009 | 0x0B00, // 'WH' 22 - 0x0007 | 0x0A00, // 'R*' 23 - 0x0006 | 0x0900, // 'L*' 24 - 0x0008 | 0x0800, // 'W*' 25 - 0x0006 | 0x0800, // 'Y*' 26 - 0x0007 | 0x0800, // 'M*' 27 - 0x0007 | 0x0800, // 'N*' 28 - 0x0007 | 0x0800, // 'NX' 29 - 0x0002 | 0x0300, // 'DX' 30 - 0x0005 | 0x0500, // 'Q*' 31 - 0x0002 | 0x0200, // 'S*' 32 - 0x0002 | 0x0200, // 'SH' 33 - 0x0002 | 0x0200, // 'F*' 34 - 0x0002 | 0x0200, // 'TH' 35 - 0x0002 | 0x0200, // '/H' 36 - 0x0002 | 0x0200, // '/X' 37 - 0x0006 | 0x0600, // 'Z*' 38 - 0x0006 | 0x0600, // 'ZH' 39 - 0x0007 | 0x0800, // 'V*' 40 - 0x0006 | 0x0600, // 'DH' 41 - 0x0006 | 0x0600, // 'CH' 42 - 0x0002 | 0x0200, // '**' 43 - 0x0008 | 0x0900, // 'J*' 44 - 0x0003 | 0x0400, // '**' 45 - 0x0001 | 0x0200, // '**' 46 - 0x001E | 0x0100, // '**' 47 - 0x000D | 0x0E00, // 'EY' 48 - 0x000C | 0x0F00, // 'AY' 49 - 0x000C | 0x0F00, // 'OY' 50 - 0x000C | 0x0F00, // 'AW' 51 - 0x000E | 0x0E00, // 'OW' 52 - 0x0009 | 0x0E00, // 'UW' 53 - 0x0006 | 0x0800, // 'B*' 54 - 0x0001 | 0x0200, // '**' 55 - 0x0002 | 0x0200, // '**' 56 - 0x0005 | 0x0700, // 'D*' 57 - 0x0001 | 0x0200, // '**' 58 - 0x0001 | 0x0100, // '**' 59 - 0x0006 | 0x0700, // 'G*' 60 - 0x0001 | 0x0200, // '**' 61 - 0x0002 | 0x0200, // '**' 62 - 0x0006 | 0x0700, // 'GX' 63 - 0x0001 | 0x0200, // '**' 64 - 0x0002 | 0x0200, // '**' 65 - 0x0008 | 0x0800, // 'P*' 66 - 0x0002 | 0x0200, // '**' 67 - 0x0002 | 0x0200, // '**' 68 - 0x0004 | 0x0600, // 'T*' 69 - 0x0002 | 0x0200, // '**' 70 - 0x0002 | 0x0200, // '**' 71 - 0x0006 | 0x0700, // 'K*' 72 - 0x0001 | 0x0200, // '**' 73 - 0x0004 | 0x0400, // '**' 74 - 0x0006 | 0x0700, // 'KX' 75 - 0x0001 | 0x0100, // '**' 76 - 0x0004 | 0x0400, // '**' 77 - 0x00C7 | 0x0500, // 'UL' 78 + let combinedPhonemeLengthTable = [0x0000 | 0x0000, + // ' *' 00 + 0x0012 | 0x1200, + // '.*' 01 + 0x0012 | 0x1200, + // '?*' 02 + 0x0012 | 0x1200, + // ',*' 03 + 0x0008 | 0x0800, + // '-*' 04 + 0x0008 | 0x0B00, + // 'IY' 05 + 0x0008 | 0x0900, + // 'IH' 06 + 0x0008 | 0x0B00, + // 'EH' 07 + 0x0008 | 0x0E00, + // 'AE' 08 + 0x000B | 0x0F00, + // 'AA' 09 + 0x0006 | 0x0B00, + // 'AH' 10 + 0x000C | 0x1000, + // 'AO' 11 + 0x000A | 0x0C00, + // 'UH' 12 + 0x0005 | 0x0600, + // 'AX' 13 + 0x0005 | 0x0600, + // 'IX' 14 + 0x000B | 0x0E00, + // 'ER' 15 + 0x000A | 0x0C00, + // 'UX' 16 + 0x000A | 0x0E00, + // 'OH' 17 + 0x000A | 0x0C00, + // 'RX' 18 + 0x0009 | 0x0B00, + // 'LX' 19 + 0x0008 | 0x0800, + // 'WX' 20 + 0x0007 | 0x0800, + // 'YX' 21 + 0x0009 | 0x0B00, + // 'WH' 22 + 0x0007 | 0x0A00, + // 'R*' 23 + 0x0006 | 0x0900, + // 'L*' 24 + 0x0008 | 0x0800, + // 'W*' 25 + 0x0006 | 0x0800, + // 'Y*' 26 + 0x0007 | 0x0800, + // 'M*' 27 + 0x0007 | 0x0800, + // 'N*' 28 + 0x0007 | 0x0800, + // 'NX' 29 + 0x0002 | 0x0300, + // 'DX' 30 + 0x0005 | 0x0500, + // 'Q*' 31 + 0x0002 | 0x0200, + // 'S*' 32 + 0x0002 | 0x0200, + // 'SH' 33 + 0x0002 | 0x0200, + // 'F*' 34 + 0x0002 | 0x0200, + // 'TH' 35 + 0x0002 | 0x0200, + // '/H' 36 + 0x0002 | 0x0200, + // '/X' 37 + 0x0006 | 0x0600, + // 'Z*' 38 + 0x0006 | 0x0600, + // 'ZH' 39 + 0x0007 | 0x0800, + // 'V*' 40 + 0x0006 | 0x0600, + // 'DH' 41 + 0x0006 | 0x0600, + // 'CH' 42 + 0x0002 | 0x0200, + // '**' 43 + 0x0008 | 0x0900, + // 'J*' 44 + 0x0003 | 0x0400, + // '**' 45 + 0x0001 | 0x0200, + // '**' 46 + 0x001E | 0x0100, + // '**' 47 + 0x000D | 0x0E00, + // 'EY' 48 + 0x000C | 0x0F00, + // 'AY' 49 + 0x000C | 0x0F00, + // 'OY' 50 + 0x000C | 0x0F00, + // 'AW' 51 + 0x000E | 0x0E00, + // 'OW' 52 + 0x0009 | 0x0E00, + // 'UW' 53 + 0x0006 | 0x0800, + // 'B*' 54 + 0x0001 | 0x0200, + // '**' 55 + 0x0002 | 0x0200, + // '**' 56 + 0x0005 | 0x0700, + // 'D*' 57 + 0x0001 | 0x0200, + // '**' 58 + 0x0001 | 0x0100, + // '**' 59 + 0x0006 | 0x0700, + // 'G*' 60 + 0x0001 | 0x0200, + // '**' 61 + 0x0002 | 0x0200, + // '**' 62 + 0x0006 | 0x0700, + // 'GX' 63 + 0x0001 | 0x0200, + // '**' 64 + 0x0002 | 0x0200, + // '**' 65 + 0x0008 | 0x0800, + // 'P*' 66 + 0x0002 | 0x0200, + // '**' 67 + 0x0002 | 0x0200, + // '**' 68 + 0x0004 | 0x0600, + // 'T*' 69 + 0x0002 | 0x0200, + // '**' 70 + 0x0002 | 0x0200, + // '**' 71 + 0x0006 | 0x0700, + // 'K*' 72 + 0x0001 | 0x0200, + // '**' 73 + 0x0004 | 0x0400, + // '**' 74 + 0x0006 | 0x0700, + // 'KX' 75 + 0x0001 | 0x0100, + // '**' 76 + 0x0004 | 0x0400, + // '**' 77 + 0x00C7 | 0x0500, + // 'UL' 78 0x00FF | 0x0500 // 'UM' 79 ]; + /* Ind | phoneme | flags | @@ -1091,27 +1288,26 @@ * @param {string} sign2 * @return {boolean|Number} */ - let full_match = (sign1, sign2) => { let index = PhonemeNameTable.findIndex(value => { return value === sign1 + sign2 && value[1] !== '*'; }); return index !== -1 ? index : false; }; + /** * Match single character phoneme. * * @param {string} sign1 * @return {boolean|Number} */ - - let single_match = sign1 => { let index = PhonemeNameTable.findIndex(value => { return value === sign1 + '*'; }); return index !== -1 ? index : false; }; + /** * The input[] buffer contains a string of phonemes and stress markers along * the lines of: @@ -1165,46 +1361,37 @@ * * @return {undefined} */ - - let Parser1 = (input, addPhoneme, addStress) => { for (let srcPos = 0; srcPos < input.length; srcPos++) { { let tmp = input.toLowerCase(); - console.log("processing \"".concat(tmp.substr(0, srcPos), "%c").concat(tmp.substr(srcPos, 2).toUpperCase(), "%c").concat(tmp.substr(srcPos + 2), "\""), 'color: red;', 'color:normal;'); + console.log(`processing "${tmp.substr(0, srcPos)}%c${tmp.substr(srcPos, 2).toUpperCase()}%c${tmp.substr(srcPos + 2)}"`, 'color: red;', 'color:normal;'); } - let sign1 = input[srcPos]; let sign2 = input[srcPos + 1] || ''; let match; - if ((match = full_match(sign1, sign2)) !== false) { // Matched both characters (no single char mark) srcPos++; // Skip the second character of the input as we've matched it - addPhoneme(match); continue; } - if ((match = single_match(sign1)) !== false) { // Matched just the first character (with second character matching '*' addPhoneme(match); continue; - } // Should be a stress character. Search through the stress table backwards. - + } + // Should be a stress character. Search through the stress table backwards. match = StressTable.length; - while (sign1 !== StressTable[match] && match > 0) { --match; } - if (match === 0) { { - throw Error("Could not parse char ".concat(sign1)); + throw Error(`Could not parse char ${sign1}`); } } - addStress(match); // Set stress for prior phoneme } }; @@ -1217,7 +1404,6 @@ * * @return {boolean} */ - let phonemeHasFlag = (phoneme, flag) => { return matchesBitmask(phonemeFlags[phoneme], flag); }; @@ -1228,10 +1414,10 @@ let PHONEME_PERIOD = 1; let PHONEME_QUESTION = 2; let FLAG_FRICATIVE = 0x2000; + /** * liquic consonant */ - let FLAG_LIQUIC = 0x1000; let FLAG_NASAL = 0x0800; let FLAG_ALVEOLAR = 0x0400; @@ -1242,7 +1428,6 @@ * diphthong ending with YX * */ - let FLAG_DIP_YX = 0x0020; let FLAG_DIPHTHONG = 0x0010; /** unknown: @@ -1250,13 +1435,12 @@ * '**', '**', 'G*', '**', '**', 'GX', '**', '**', 'P*', '**', '**', * 'T*', '**', '**', 'K*', '**', '**', 'KX', '**', '**' */ - let FLAG_0008 = 0x0008; let FLAG_VOICED = 0x0004; + /** * stop consonant */ - let FLAG_STOPCONS = 0x0002; let FLAG_UNVOICED_STOPCONS = 0x0001; @@ -1293,7 +1477,6 @@ * * @return undefined */ - let Parser2 = (insertPhoneme, setPhoneme, getPhoneme, getStress) => { /** * Rewrites: @@ -1311,96 +1494,77 @@ // ALVEOLAR flag set? if (phonemeHasFlag(getPhoneme(pos - 1), FLAG_ALVEOLAR)) { { - console.log("".concat(pos, " RULE: UW -> UX")); + console.log(`${pos} RULE: UW -> UX`); } - setPhoneme(pos, 16); // UX } - break; } // 'CH' Example: CHEW - case 42: { { - console.log("".concat(pos, " RULE: CH -> CH CH+1")); + console.log(`${pos} RULE: CH -> CH CH+1`); } - insertPhoneme(pos + 1, 43, getStress(pos)); // '**' - break; } // 'J*' Example: JAY - case 44: { { - console.log("".concat(pos, " RULE: J -> J J+1")); + console.log(`${pos} RULE: J -> J J+1`); } - insertPhoneme(pos + 1, 45, getStress(pos)); // '**' - break; } } }; - let changeAX = (position, suffix) => { { - console.log("".concat(position, " RULE: ").concat(PhonemeNameTable[getPhoneme(position)], " -> AX ").concat(PhonemeNameTable[suffix])); + console.log(`${position} RULE: ${PhonemeNameTable[getPhoneme(position)]} -> AX ${PhonemeNameTable[suffix]}`); } - setPhoneme(position, 13); // 'AX' - insertPhoneme(position + 1, suffix, getStress(position)); }; - let pos = -1; let phoneme; - while ((phoneme = getPhoneme(++pos)) !== null) { // Is phoneme pause? if (phoneme === 0) { continue; } - if (phonemeHasFlag(phoneme, FLAG_DIPHTHONG)) { // -> WX // -> YX // Example: OIL, COW { - console.log(!phonemeHasFlag(phoneme, FLAG_DIP_YX) ? "".concat(pos, " RULE: insert WX following diphthong NOT ending in IY sound") : "".concat(pos, " RULE: insert YX following diphthong ending in IY sound")); - } // If ends with IY, use YX, else use WX + console.log(!phonemeHasFlag(phoneme, FLAG_DIP_YX) ? `${pos} RULE: insert WX following diphthong NOT ending in IY sound` : `${pos} RULE: insert YX following diphthong ending in IY sound`); + } + // If ends with IY, use YX, else use WX // Insert at WX or YX following, copying the stress // 'WX' = 20 'YX' = 21 - - insertPhoneme(pos + 1, phonemeHasFlag(phoneme, FLAG_DIP_YX) ? 21 : 20, getStress(pos)); handleUW_CH_J(phoneme, pos); continue; } - if (phoneme === 78) { // 'UL' => 'AX' 'L*' // Example: MEDDLE changeAX(pos, 24); continue; } - if (phoneme === 79) { // 'UM' => 'AX' 'M*' // Example: ASTRONOMY changeAX(pos, 27); continue; } - if (phoneme === 80) { // 'UN' => 'AX' 'N*' changeAX(pos, 28); continue; } - if (phonemeHasFlag(phoneme, FLAG_VOWEL) && getStress(pos)) { // Example: FUNCTION // RULE: @@ -1409,21 +1573,16 @@ if (getPhoneme(pos + 1) === 0) { // If following phoneme is a pause, get next phoneme = getPhoneme(pos + 2); - if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_VOWEL) && getStress(pos + 2)) { { - console.log("".concat(pos + 2, " RULE: Insert glottal stop between two stressed vowels with space between them")); + console.log(`${pos + 2} RULE: Insert glottal stop between two stressed vowels with space between them`); } - insertPhoneme(pos + 2, 31, 0); // 31 = 'Q' } } - continue; } - let priorPhoneme = pos === 0 ? null : getPhoneme(pos - 1); - if (phoneme === pR) { // RULES FOR PHONEMES BEFORE R switch (priorPhoneme) { @@ -1431,103 +1590,88 @@ { // Example: TRACK { - console.log("".concat(pos, " RULE: T* R* -> CH R*")); + console.log(`${pos} RULE: T* R* -> CH R*`); } - setPhoneme(pos - 1, 42); // 'T*' 'R*' -> 'CH' 'R*' - break; } - case pD: { // Example: DRY { - console.log("".concat(pos, " RULE: D* R* -> J* R*")); + console.log(`${pos} RULE: D* R* -> J* R*`); } - setPhoneme(pos - 1, 44); // 'J*' - break; } - default: { if (phonemeHasFlag(priorPhoneme, FLAG_VOWEL)) { // Example: ART { - console.log("".concat(pos, " R* -> RX")); + console.log(`${pos} R* -> RX`); } - setPhoneme(pos, 18); // 'RX' } } } - continue; - } // 'L*' - + } + // 'L*' if (phoneme === 24 && phonemeHasFlag(priorPhoneme, FLAG_VOWEL)) { // Example: ALL { - console.log("".concat(pos, " L* -> LX")); + console.log(`${pos} L* -> LX`); } - setPhoneme(pos, 19); // 'LX' - continue; - } // 'G*' 'S*' - - + } + // 'G*' 'S*' if (priorPhoneme === 60 && phoneme === 32) { // Can't get to fire - // 1. The G -> GX rule intervenes // 2. Reciter already replaces GS -> GZ { - console.log("".concat(pos, " G S -> G Z")); + console.log(`${pos} G S -> G Z`); } - setPhoneme(pos, 38); continue; - } // 'G*' - + } + // 'G*' if (phoneme === 60) { // G -> GX // Example: GO - let phoneme = getPhoneme(pos + 1); // If diphthong ending with YX, move continue processing next phoneme - + let phoneme = getPhoneme(pos + 1); + // If diphthong ending with YX, move continue processing next phoneme if (!phonemeHasFlag(phoneme, FLAG_DIP_YX) && phoneme !== null) { // replace G with GX and continue processing next phoneme { - console.log("".concat(pos, " RULE: G -> GX ")); + console.log(`${pos} RULE: G -> GX `); } - setPhoneme(pos, 63); // 'GX' } - continue; - } // 'K*' - + } + // 'K*' if (phoneme === 72) { // K -> KX // Example: COW - let Y = getPhoneme(pos + 1); // If at end, replace current phoneme with KX - + let Y = getPhoneme(pos + 1); + // If at end, replace current phoneme with KX if (!phonemeHasFlag(Y, FLAG_DIP_YX) || Y === null) { // VOWELS AND DIPHTHONGS ENDING WITH IY SOUND flag set? { - console.log("".concat(pos, " K -> KX ")); + console.log(`${pos} K -> KX `); } - setPhoneme(pos, 75); phoneme = 75; } - } // Replace with softer version? - + } + // Replace with softer version? if (phonemeHasFlag(phoneme, FLAG_UNVOICED_STOPCONS) && priorPhoneme === 32) { // 'S*' // RULE: @@ -1539,15 +1683,14 @@ // 'S*' 'UN' -> 'S*' '**' // Examples: SPY, STY, SKY, SCOWL { - console.log("".concat(pos, " RULE: S* ").concat(PhonemeNameTable[phoneme], " -> S* ").concat(PhonemeNameTable[phoneme - 12])); + console.log(`${pos} RULE: S* ${PhonemeNameTable[phoneme]} -> S* ${PhonemeNameTable[phoneme - 12]}`); } - setPhoneme(pos, phoneme - 12); } else if (!phonemeHasFlag(phoneme, FLAG_UNVOICED_STOPCONS)) { handleUW_CH_J(phoneme, pos); - } // 'T*', 'D*' - + } + // 'T*', 'D*' if (phoneme === 69 || phoneme === 57) { // RULE: Soften T following vowel // NOTE: This rule fails for cases such as "ODD" @@ -1556,28 +1699,22 @@ // Example: PARTY, TARDY if (pos > 0 && phonemeHasFlag(getPhoneme(pos - 1), FLAG_VOWEL)) { phoneme = getPhoneme(pos + 1); - if (phoneme === 0) { phoneme = getPhoneme(pos + 2); } - if (phonemeHasFlag(phoneme, FLAG_VOWEL) && !getStress(pos + 1)) { { - console.log("".concat(pos, " Soften T or D following vowel or ER and preceding a pause -> DX")); + console.log(`${pos} Soften T or D following vowel or ER and preceding a pause -> DX`); } - setPhoneme(pos, 30); } } - continue; } - { - console.log("".concat(pos, ": ").concat(PhonemeNameTable[phoneme])); + console.log(`${pos}: ${PhonemeNameTable[phoneme]}`); } } // while - }; /** @@ -1597,177 +1734,160 @@ * * @return undefined */ - let AdjustLengths = (getPhoneme, setLength, getLength) => { { - console.log("AdjustLengths()"); - } // LENGTHEN VOWELS PRECEDING PUNCTUATION + console.log(`AdjustLengths()`); + } + + // LENGTHEN VOWELS PRECEDING PUNCTUATION // // Search for punctuation. If found, back up to the first vowel, then // process all phonemes between there and up to (but not including) the punctuation. // If any phoneme is found that is a either a fricative or voiced, the duration is // increased by (length * 1.5) + 1 - // loop index - + // loop index for (let position = 0; getPhoneme(position) !== null; position++) { // not punctuation? if (!phonemeHasFlag(getPhoneme(position), FLAG_PUNCT)) { continue; } - let loopIndex = position; - - while (--position > 1 && !phonemeHasFlag(getPhoneme(position), FLAG_VOWEL)) { - /* back up while not a vowel */ - } // If beginning of phonemes, exit loop. - - + while (--position > 1 && !phonemeHasFlag(getPhoneme(position), FLAG_VOWEL)) {/* back up while not a vowel */} + // If beginning of phonemes, exit loop. if (position === 0) { break; - } // Now handle everything between position and loopIndex - + } + // Now handle everything between position and loopIndex let vowel = position; - for (; position < loopIndex; position++) { // test for not fricative/unvoiced or not voiced if (!phonemeHasFlag(getPhoneme(position), FLAG_FRICATIVE) || phonemeHasFlag(getPhoneme(position), FLAG_VOICED)) { - let A = getLength(position); // change phoneme length to (length * 1.5) + 1 - + let A = getLength(position); + // change phoneme length to (length * 1.5) + 1 { console.log(position + ' RULE: Lengthen or ' + PhonemeNameTable[getPhoneme(position)] + ' between VOWEL:' + PhonemeNameTable[getPhoneme(vowel)] + ' and PUNCTUATION:' + PhonemeNameTable[getPhoneme(position)] + ' by 1.5'); } - setLength(position, (A >> 1) + A + 1); } } - } // Similar to the above routine, but shorten vowels under some circumstances - // Loop through all phonemes - + } + // Similar to the above routine, but shorten vowels under some circumstances + // Loop through all phonemes let loopIndex = -1; let phoneme; - while ((phoneme = getPhoneme(++loopIndex)) !== null) { - let position = loopIndex; // vowel? - + let position = loopIndex; + // vowel? if (phonemeHasFlag(phoneme, FLAG_VOWEL)) { // get next phoneme - phoneme = getPhoneme(++position); // not a consonant - + phoneme = getPhoneme(++position); + // not a consonant if (!phonemeHasFlag(phoneme, FLAG_CONSONANT)) { // 'RX' or 'LX'? if ((phoneme === 18 || phoneme === 19) && phonemeHasFlag(getPhoneme(++position), FLAG_CONSONANT)) { // followed by consonant? { console.log(loopIndex + ' RULE: ' + PhonemeNameTable[phoneme] + ' - decrease length of vowel by 1'); - } // decrease length of vowel by 1 frame - - + } + // decrease length of vowel by 1 frame setLength(loopIndex, getLength(loopIndex) - 1); } - continue; - } // Got here if not + } + // Got here if not // FIXME: the case when phoneme === END is taken over by !phonemeHasFlag(phoneme, FLAG_CONSONANT) - - - let flags = phoneme === null ? FLAG_CONSONANT | FLAG_UNVOICED_STOPCONS : phonemeFlags[phoneme]; // Unvoiced - + let flags = phoneme === null ? FLAG_CONSONANT | FLAG_UNVOICED_STOPCONS : phonemeFlags[phoneme]; + // Unvoiced if (!matchesBitmask(flags, FLAG_VOICED)) { // *, .*, ?*, ,*, -*, DX, S*, SH, F*, TH, /H, /X, CH, P*, T*, K*, KX + // unvoiced plosive if (matchesBitmask(flags, FLAG_UNVOICED_STOPCONS)) { // RULE: // { - console.log("".concat(loopIndex, " - decrease vowel by 1/8th")); + console.log(`${loopIndex} - decrease vowel by 1/8th`); } - let A = getLength(loopIndex); setLength(loopIndex, A - (A >> 3)); } - continue; - } // RULE: + } + + // RULE: // - - { - console.log("".concat(loopIndex, " RULE: - increase vowel by 1/4 + 1")); - } // increase length - - + console.log(`${loopIndex} RULE: - increase vowel by 1/4 + 1`); + } + // increase length let A = getLength(loopIndex); setLength(loopIndex, (A >> 2) + A + 1); // 5/4*A + 1 - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, M*, N*, NX, DX, Q*, S*, SH, F*, - // TH, /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX - // nasal? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, M*, N*, NX, DX, Q*, S*, SH, F*, + // TH, /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX + // nasal? if (phonemeHasFlag(phoneme, FLAG_NASAL)) { // RULE: // Set punctuation length to 6 // Set stop consonant length to 5 - // M*, N*, NX, - phoneme = getPhoneme(++position); // is next phoneme a stop consonant? + // M*, N*, NX, + phoneme = getPhoneme(++position); + // is next phoneme a stop consonant? if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // B*, D*, G*, GX, P*, T*, K*, KX { - console.log("".concat(position, " RULE: - set nasal = 5, consonant = 6")); + console.log(`${position} RULE: - set nasal = 5, consonant = 6`); } - setLength(position, 6); // set stop consonant length to 6 - setLength(position - 1, 5); // set nasal length to 5 } - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, - // /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX - // stop consonant? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, + // /H, /X, Z*, ZH, V*, DH, CH, J*, B*, D*, G*, GX, P*, T*, K*, KX + // stop consonant? if (phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // B*, D*, G*, GX + // RULE: {optional silence} // Shorten both to (length/2 + 1) - while ((phoneme = getPhoneme(++position)) === 0) { - /* move past silence */ - } // if another stop consonant, process. - + while ((phoneme = getPhoneme(++position)) === 0) {/* move past silence */} + // if another stop consonant, process. if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_STOPCONS)) { // RULE: {optional silence} { - console.log("".concat(position, " RULE: {optional silence} - shorten both to 1/2 + 1")); + console.log(`${position} RULE: {optional silence} - shorten both to 1/2 + 1`); } - setLength(position, (getLength(position) >> 1) + 1); setLength(loopIndex, (getLength(loopIndex) >> 1) + 1); } - continue; - } // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, - // /H, /X, Z*, ZH, V*, DH, CH, J* - // liquic consonant? + } + // *, .*, ?*, ,*, -*, WH, R*, L*, W*, Y*, DX, Q*, S*, SH, F*, TH, + // /H, /X, Z*, ZH, V*, DH, CH, J* + // liquic consonant? if (position > 0 && phonemeHasFlag(phoneme, FLAG_LIQUIC) && phonemeHasFlag(getPhoneme(position - 1), FLAG_STOPCONS)) { // R*, L*, W*, Y* // RULE: // Decrease by 2 // prior phoneme is a stop consonant { - console.log("".concat(position, " RULE: - decrease by 2")); - } // decrease the phoneme length by 2 frames - - + console.log(`${position} RULE: - decrease by 2`); + } + // decrease the phoneme length by 2 frames setLength(position, getLength(position) - 2); } } @@ -1792,21 +1912,18 @@ * * @return undefined */ - let CopyStress = (getPhoneme, getStress, setStress) => { // loop through all the phonemes to be output let position = 0; let phoneme; - while ((phoneme = getPhoneme(position)) !== null) { // if CONSONANT_FLAG set, skip - only vowels get stress if (phonemeHasFlag(phoneme, FLAG_CONSONANT)) { - phoneme = getPhoneme(position + 1); // if the following phoneme is the end, or a vowel, skip - + phoneme = getPhoneme(position + 1); + // if the following phoneme is the end, or a vowel, skip if (phoneme !== null && phonemeHasFlag(phoneme, FLAG_VOWEL)) { // get the stress value at the next position let stress = getStress(position + 1); - if (stress !== 0 && stress < 0x80) { // if next phoneme is stressed, and a VOWEL OR ER // copy stress from next phoneme to this one @@ -1814,7 +1931,6 @@ } } } - ++position; } }; @@ -1828,20 +1944,16 @@ * * @return undefined */ - let SetPhonemeLength = (getPhoneme, getStress, setLength) => { let position = 0; let phoneme; - while ((phoneme = getPhoneme(position)) !== null) { let stress = getStress(position); - if (stress === 0 || stress > 0x7F) { setLength(position, combinedPhonemeLengthTable[phoneme] & 0xFF); } else { setLength(position, combinedPhonemeLengthTable[phoneme] >> 8); } - position++; } }; @@ -1856,32 +1968,26 @@ * * @return undefined */ - let ProlongPlosiveStopConsonantsCode41240 = (getPhoneme, insertPhoneme, getStress) => { let pos = -1; let index; - while ((index = getPhoneme(++pos)) !== null) { // Not a stop consonant, move to next one. if (!phonemeHasFlag(index, FLAG_STOPCONS)) { continue; - } //If plosive, move to next non empty phoneme and validate the flags. - - + } + //If plosive, move to next non empty phoneme and validate the flags. if (phonemeHasFlag(index, FLAG_UNVOICED_STOPCONS)) { let nextNonEmpty; let X = pos; - do { nextNonEmpty = getPhoneme(++X); - } while (nextNonEmpty === 0); // If not END and either flag 0x0008 or '/H' or '/X' - - + } while (nextNonEmpty === 0); + // If not END and either flag 0x0008 or '/H' or '/X' if (nextNonEmpty !== null && (phonemeHasFlag(nextNonEmpty, FLAG_0008) || nextNonEmpty === 36 || nextNonEmpty === 37)) { continue; } } - insertPhoneme(pos + 1, index + 1, getStress(pos), combinedPhonemeLengthTable[index + 1] & 0xFF); insertPhoneme(pos + 2, index + 2, getStress(pos), combinedPhonemeLengthTable[index + 2] & 0xFF); pos += 2; @@ -1897,29 +2003,25 @@ * * @return {Array|Boolean} The parsed data. */ - let Parser = input => { if (!input) { return false; } - let getPhoneme = pos => { { if (pos < 0 || pos > phonemeindex.length) { throw new Error('Out of bounds: ' + pos); } } - return pos === phonemeindex.length ? null : phonemeindex[pos]; }; - let setPhoneme = (pos, value) => { { - console.log("".concat(pos, " CHANGE: ").concat(PhonemeNameTable[phonemeindex[pos]], " -> ").concat(PhonemeNameTable[value])); + console.log(`${pos} CHANGE: ${PhonemeNameTable[phonemeindex[pos]]} -> ${PhonemeNameTable[value]}`); } - phonemeindex[pos] = value; }; + /** * @param {Number} pos The position in the phoneme array to insert at. * @param {Number} value The phoneme to insert. @@ -1928,54 +2030,40 @@ * * @return {undefined} */ - - let insertPhoneme = (pos, value, stressValue, length) => { { - console.log("".concat(pos, " INSERT: ").concat(PhonemeNameTable[value])); + console.log(`${pos} INSERT: ${PhonemeNameTable[value]}`); } - for (let i = phonemeindex.length - 1; i >= pos; i--) { phonemeindex[i + 1] = phonemeindex[i]; phonemeLength[i + 1] = getLength(i); stress[i + 1] = getStress(i); } - phonemeindex[pos] = value; phonemeLength[pos] = length | 0; stress[pos] = stressValue; }; - let getStress = pos => stress[pos] | 0; - let setStress = (pos, stressValue) => { { - console.log("".concat(pos, " \"").concat(PhonemeNameTable[phonemeindex[pos]], "\" SET STRESS: ").concat(stress[pos], " -> ").concat(stressValue)); + console.log(`${pos} "${PhonemeNameTable[phonemeindex[pos]]}" SET STRESS: ${stress[pos]} -> ${stressValue}`); } - stress[pos] = stressValue; }; - let getLength = pos => phonemeLength[pos] | 0; - let setLength = (pos, length) => { { - console.log("".concat(pos, " \"").concat(PhonemeNameTable[phonemeindex[pos]], "\" SET LENGTH: ").concat(phonemeLength[pos], " -> ").concat(length)); - + console.log(`${pos} "${PhonemeNameTable[phonemeindex[pos]]}" SET LENGTH: ${phonemeLength[pos]} -> ${length}`); if ((length & 128) !== 0) { throw new Error('Got the flag 0x80, see CopyStress() and SetPhonemeLength() comments!'); } - if (pos < 0 || pos > phonemeindex.length) { throw new Error('Out of bounds: ' + pos); } } - phonemeLength[pos] = length; }; - let stress = []; //numbers from 0 to 8 - let phonemeLength = []; let phonemeindex = []; let pos = 0; @@ -1989,27 +2077,22 @@ throw new Error('Got the flag 0x80, see CopyStress() and SetPhonemeLength() comments!'); } } - - stress[pos - 1] = value; - /* Set stress for prior phoneme */ + stress[pos - 1] = value; /* Set stress for prior phoneme */ }); - { PrintPhonemes(phonemeindex, phonemeLength, stress); } - Parser2(insertPhoneme, setPhoneme, getPhoneme, getStress); CopyStress(getPhoneme, getStress, setStress); SetPhonemeLength(getPhoneme, getStress, setLength); AdjustLengths(getPhoneme, setLength, getLength); ProlongPlosiveStopConsonantsCode41240(getPhoneme, insertPhoneme, getStress); - { PrintPhonemes(phonemeindex, phonemeLength, stress); } - return phonemeindex.map((v, i) => v ? [v, phonemeLength[i] | 0, stress[i] | 0] : null).filter(v => v); }; + /** * Debug printing. * @@ -2019,46 +2102,45 @@ * * @return undefined */ - let PrintPhonemes = (phonemeindex, phonemeLength, stress) => { let pad = num => { let s = '000' + num; return s.substr(s.length - 3); }; - console.log('=================================='); console.log('Internal Phoneme presentation:'); console.log(' pos idx phoneme length stress'); console.log('----------------------------------'); - for (let i = 0; i < phonemeindex.length; i++) { let name = () => { if (phonemeindex[i] < 81) { return PhonemeNameTable[phonemeindex[i]]; } - return '??'; }; - console.log(' %s %s %s %s %s', pad(i), pad(phonemeindex[i]), name(phonemeindex[i]), pad(phonemeLength[i]), pad(stress[i])); } - console.log('=================================='); }; // Values substituted for zero bits in unvoiced consonant samples. // tab48426 let sampledConsonantValues0 = [0x18, 0x1A, 0x17, 0x17, 0x17]; - let stressPitch_tab47492 = [0x00, 0xE0, 0xE6, 0xEC, 0xF3, 0xF9, 0x00, 0x06, 0xC, 0x06]; // Used to decide which phoneme's blend lengths. The candidate with the lower score is selected. + let stressPitch_tab47492 = [0x00, 0xE0, 0xE6, 0xEC, 0xF3, 0xF9, 0x00, 0x06, 0xC, 0x06]; + + // Used to decide which phoneme's blend lengths. The candidate with the lower score is selected. // tab45856 + let blendRank = [0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x02, 0x0A, 0x02, 0x08, 0x05, 0x05, 0x0B, 0x0A, 0x09, 0x08, 0x08, 0xA0, 0x08, 0x08, 0x17, 0x1F, 0x12, 0x12, 0x12, 0x12, 0x1E, 0x1E, 0x14, 0x14, 0x14, 0x14, 0x17, 0x17, 0x1A, 0x1A, 0x1D, 0x1D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x17]; - let blendRank = [0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05, 0x05, 0x02, 0x0A, 0x02, 0x08, 0x05, 0x05, 0x0B, 0x0A, 0x09, 0x08, 0x08, 0xA0, 0x08, 0x08, 0x17, 0x1F, 0x12, 0x12, 0x12, 0x12, 0x1E, 0x1E, 0x14, 0x14, 0x14, 0x14, 0x17, 0x17, 0x1A, 0x1A, 0x1D, 0x1D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x17]; // Number of frames at the end of a phoneme devoted to interpolating to next phoneme's final value + // Number of frames at the end of a phoneme devoted to interpolating to next phoneme's final value //tab45696 + let outBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0xA0, 0xA0]; - let outBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0xA0, 0xA0]; // Number of frames at beginning of a phoneme devoted to interpolating to phoneme's final value + // Number of frames at beginning of a phoneme devoted to interpolating to phoneme's final value // tab45776 + let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0xB0, 0xA0]; - let inBlendLength = [0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0xB0, 0xA0]; // Consists of two bitfields: + // Consists of two bitfields: // Low 3 bits (masked by 7) select a 256-byte section in sampleTable, // as well as index into sampledConsonantValues0 for unvoiced. // High 5 bits (masked by 248 = 11111000), for unvoiced, @@ -2079,222 +2161,423 @@ // 67: P' 27 00011011 // 70: T' 25 00011001 // tab45936 + let sampledConsonantFlags = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0xD3, 0xBB, 0x7C, 0x95, 0x01, 0x02, 0x03, 0x03, 0x00, 0x72, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; - let sampledConsonantFlags = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0xD3, 0xBB, 0x7C, 0x95, 0x01, 0x02, 0x03, 0x03, 0x00, 0x72, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; // - - let frequencyData = [//tab45056 |tab451356 |tab45216 + // + let frequencyData = [ + //tab45056 |tab451356 |tab45216 // freq1 | freq2 | freq3 - 0x000000 | 0x000000 | 0x000000, // ' *' 00 - 0x000013 | 0x004300 | 0x5B0000, // '.*' 01 - 0x000013 | 0x004300 | 0x5B0000, // '?*' 02 - 0x000013 | 0x004300 | 0x5B0000, // ',*' 03 - 0x000013 | 0x004300 | 0x5B0000, // '-*' 04 - 0x00000A | 0x005400 | 0x6E0000, // 'IY' 05 - 0x00000E | 0x004900 | 0x5D0000, // 'IH' 06 - 0x000013 | 0x004300 | 0x5B0000, // 'EH' 07 - 0x000018 | 0x003F00 | 0x580000, // 'AE' 08 - 0x00001B | 0x002800 | 0x590000, // 'AA' 09 - 0x000017 | 0x002C00 | 0x570000, // 'AH' 10 - 0x000015 | 0x001F00 | 0x580000, // 'AO' 11 - 0x000010 | 0x002500 | 0x520000, // 'UH' 12 - 0x000014 | 0x002D00 | 0x590000, // 'AX' 13 - 0x00000E | 0x004900 | 0x5D0000, // 'IX' 14 - 0x000012 | 0x003100 | 0x3E0000, // 'ER' 15 - 0x00000E | 0x002400 | 0x520000, // 'UX' 16 - 0x000012 | 0x001E00 | 0x580000, // 'OH' 17 - 0x000012 | 0x003300 | 0x3E0000, // 'RX' 18 - 0x000010 | 0x002500 | 0x6E0000, // 'LX' 19 - 0x00000D | 0x001D00 | 0x500000, // 'WX' 20 - 0x00000F | 0x004500 | 0x5D0000, // 'YX' 21 - 0x00000B | 0x001800 | 0x5A0000, // 'WH' 22 - 0x000012 | 0x003200 | 0x3C0000, // 'R*' 23 - 0x00000E | 0x001E00 | 0x6E0000, // 'L*' 24 - 0x00000B | 0x001800 | 0x5A0000, // 'W*' 25 - 0x000009 | 0x005300 | 0x6E0000, // 'Y*' 26 - 0x000006 | 0x002E00 | 0x510000, // 'M*' 27 - 0x000006 | 0x003600 | 0x790000, // 'N*' 28 - 0x000006 | 0x005600 | 0x650000, // 'NX' 29 - 0x000006 | 0x003600 | 0x790000, // 'DX' 30 - 0x000011 | 0x004300 | 0x5B0000, // 'Q*' 31 - 0x000006 | 0x004900 | 0x630000, // 'S*' 32 - 0x000006 | 0x004F00 | 0x6A0000, // 'SH' 33 - 0x000006 | 0x001A00 | 0x510000, // 'F*' 34 - 0x000006 | 0x004200 | 0x790000, // 'TH' 35 - 0x00000E | 0x004900 | 0x5D0000, // '/H' 36 - 0x000010 | 0x002500 | 0x520000, // '/X' 37 - 0x000009 | 0x003300 | 0x5D0000, // 'Z*' 38 - 0x00000A | 0x004200 | 0x670000, // 'ZH' 39 - 0x000008 | 0x002800 | 0x4C0000, // 'V*' 40 - 0x00000A | 0x002F00 | 0x5D0000, // 'DH' 41 - 0x000006 | 0x004F00 | 0x650000, // 'CH' 42 - 0x000006 | 0x004F00 | 0x650000, // '**' 43 - 0x000006 | 0x004200 | 0x790000, // 'J*' 44 - 0x000005 | 0x004F00 | 0x650000, // '**' 45 - 0x000006 | 0x006E00 | 0x790000, // '**' 46 - 0x000000 | 0x000000 | 0x000000, // '**' 47 - 0x000013 | 0x004800 | 0x5A0000, // 'EY' 48 - 0x00001B | 0x002700 | 0x580000, // 'AY' 49 - 0x000015 | 0x001F00 | 0x580000, // 'OY' 50 - 0x00001B | 0x002B00 | 0x580000, // 'AW' 51 - 0x000012 | 0x001E00 | 0x580000, // 'OW' 52 - 0x00000D | 0x002200 | 0x520000, // 'UW' 53 - 0x000006 | 0x001A00 | 0x510000, // 'B*' 54 - 0x000006 | 0x001A00 | 0x510000, // '**' 55 - 0x000006 | 0x001A00 | 0x510000, // '**' 56 - 0x000006 | 0x004200 | 0x790000, // 'D*' 57 - 0x000006 | 0x004200 | 0x790000, // '**' 58 - 0x000006 | 0x004200 | 0x790000, // '**' 59 - 0x000006 | 0x006E00 | 0x700000, // 'G*' 60 - 0x000006 | 0x006E00 | 0x6E0000, // '**' 61 - 0x000006 | 0x006E00 | 0x6E0000, // '**' 62 - 0x000006 | 0x005400 | 0x5E0000, // 'GX' 63 - 0x000006 | 0x005400 | 0x5E0000, // '**' 64 - 0x000006 | 0x005400 | 0x5E0000, // '**' 65 - 0x000006 | 0x001A00 | 0x510000, // 'P*' 66 - 0x000006 | 0x001A00 | 0x510000, // '**' 67 - 0x000006 | 0x001A00 | 0x510000, // '**' 68 - 0x000006 | 0x004200 | 0x790000, // 'T*' 69 - 0x000006 | 0x004200 | 0x790000, // '**' 70 - 0x000006 | 0x004200 | 0x790000, // '**' 71 - 0x000006 | 0x006D00 | 0x650000, // 'K*' 72 - 0x00000A | 0x005600 | 0x650000, // '**' 73 - 0x00000A | 0x006D00 | 0x700000, // '**' 74 - 0x000006 | 0x005400 | 0x5E0000, // 'KX' 75 - 0x000006 | 0x005400 | 0x5E0000, // '**' 76 - 0x000006 | 0x005400 | 0x5E0000, // '**' 77 - 0x00002C | 0x007F00 | 0x080000, // 'UL' 78 + 0x000000 | 0x000000 | 0x000000, + // ' *' 00 + 0x000013 | 0x004300 | 0x5B0000, + // '.*' 01 + 0x000013 | 0x004300 | 0x5B0000, + // '?*' 02 + 0x000013 | 0x004300 | 0x5B0000, + // ',*' 03 + 0x000013 | 0x004300 | 0x5B0000, + // '-*' 04 + 0x00000A | 0x005400 | 0x6E0000, + // 'IY' 05 + 0x00000E | 0x004900 | 0x5D0000, + // 'IH' 06 + 0x000013 | 0x004300 | 0x5B0000, + // 'EH' 07 + 0x000018 | 0x003F00 | 0x580000, + // 'AE' 08 + 0x00001B | 0x002800 | 0x590000, + // 'AA' 09 + 0x000017 | 0x002C00 | 0x570000, + // 'AH' 10 + 0x000015 | 0x001F00 | 0x580000, + // 'AO' 11 + 0x000010 | 0x002500 | 0x520000, + // 'UH' 12 + 0x000014 | 0x002D00 | 0x590000, + // 'AX' 13 + 0x00000E | 0x004900 | 0x5D0000, + // 'IX' 14 + 0x000012 | 0x003100 | 0x3E0000, + // 'ER' 15 + 0x00000E | 0x002400 | 0x520000, + // 'UX' 16 + 0x000012 | 0x001E00 | 0x580000, + // 'OH' 17 + 0x000012 | 0x003300 | 0x3E0000, + // 'RX' 18 + 0x000010 | 0x002500 | 0x6E0000, + // 'LX' 19 + 0x00000D | 0x001D00 | 0x500000, + // 'WX' 20 + 0x00000F | 0x004500 | 0x5D0000, + // 'YX' 21 + 0x00000B | 0x001800 | 0x5A0000, + // 'WH' 22 + 0x000012 | 0x003200 | 0x3C0000, + // 'R*' 23 + 0x00000E | 0x001E00 | 0x6E0000, + // 'L*' 24 + 0x00000B | 0x001800 | 0x5A0000, + // 'W*' 25 + 0x000009 | 0x005300 | 0x6E0000, + // 'Y*' 26 + 0x000006 | 0x002E00 | 0x510000, + // 'M*' 27 + 0x000006 | 0x003600 | 0x790000, + // 'N*' 28 + 0x000006 | 0x005600 | 0x650000, + // 'NX' 29 + 0x000006 | 0x003600 | 0x790000, + // 'DX' 30 + 0x000011 | 0x004300 | 0x5B0000, + // 'Q*' 31 + 0x000006 | 0x004900 | 0x630000, + // 'S*' 32 + 0x000006 | 0x004F00 | 0x6A0000, + // 'SH' 33 + 0x000006 | 0x001A00 | 0x510000, + // 'F*' 34 + 0x000006 | 0x004200 | 0x790000, + // 'TH' 35 + 0x00000E | 0x004900 | 0x5D0000, + // '/H' 36 + 0x000010 | 0x002500 | 0x520000, + // '/X' 37 + 0x000009 | 0x003300 | 0x5D0000, + // 'Z*' 38 + 0x00000A | 0x004200 | 0x670000, + // 'ZH' 39 + 0x000008 | 0x002800 | 0x4C0000, + // 'V*' 40 + 0x00000A | 0x002F00 | 0x5D0000, + // 'DH' 41 + 0x000006 | 0x004F00 | 0x650000, + // 'CH' 42 + 0x000006 | 0x004F00 | 0x650000, + // '**' 43 + 0x000006 | 0x004200 | 0x790000, + // 'J*' 44 + 0x000005 | 0x004F00 | 0x650000, + // '**' 45 + 0x000006 | 0x006E00 | 0x790000, + // '**' 46 + 0x000000 | 0x000000 | 0x000000, + // '**' 47 + 0x000013 | 0x004800 | 0x5A0000, + // 'EY' 48 + 0x00001B | 0x002700 | 0x580000, + // 'AY' 49 + 0x000015 | 0x001F00 | 0x580000, + // 'OY' 50 + 0x00001B | 0x002B00 | 0x580000, + // 'AW' 51 + 0x000012 | 0x001E00 | 0x580000, + // 'OW' 52 + 0x00000D | 0x002200 | 0x520000, + // 'UW' 53 + 0x000006 | 0x001A00 | 0x510000, + // 'B*' 54 + 0x000006 | 0x001A00 | 0x510000, + // '**' 55 + 0x000006 | 0x001A00 | 0x510000, + // '**' 56 + 0x000006 | 0x004200 | 0x790000, + // 'D*' 57 + 0x000006 | 0x004200 | 0x790000, + // '**' 58 + 0x000006 | 0x004200 | 0x790000, + // '**' 59 + 0x000006 | 0x006E00 | 0x700000, + // 'G*' 60 + 0x000006 | 0x006E00 | 0x6E0000, + // '**' 61 + 0x000006 | 0x006E00 | 0x6E0000, + // '**' 62 + 0x000006 | 0x005400 | 0x5E0000, + // 'GX' 63 + 0x000006 | 0x005400 | 0x5E0000, + // '**' 64 + 0x000006 | 0x005400 | 0x5E0000, + // '**' 65 + 0x000006 | 0x001A00 | 0x510000, + // 'P*' 66 + 0x000006 | 0x001A00 | 0x510000, + // '**' 67 + 0x000006 | 0x001A00 | 0x510000, + // '**' 68 + 0x000006 | 0x004200 | 0x790000, + // 'T*' 69 + 0x000006 | 0x004200 | 0x790000, + // '**' 70 + 0x000006 | 0x004200 | 0x790000, + // '**' 71 + 0x000006 | 0x006D00 | 0x650000, + // 'K*' 72 + 0x00000A | 0x005600 | 0x650000, + // '**' 73 + 0x00000A | 0x006D00 | 0x700000, + // '**' 74 + 0x000006 | 0x005400 | 0x5E0000, + // 'KX' 75 + 0x000006 | 0x005400 | 0x5E0000, + // '**' 76 + 0x000006 | 0x005400 | 0x5E0000, + // '**' 77 + 0x00002C | 0x007F00 | 0x080000, + // 'UL' 78 0x000013 | 0x007F00 | 0x010000 // 'UM' 79 ]; + /** * * ampl1data[X] = ampldata[X] & 0xFF; // F1 amplitude * ampl2data[X] = (ampldata[X] >> 8) & 0xFF; // F2 amplitude * ampl3data[X] = (ampldata[X] >> 16) & 0xFF; // F3 amplitude */ - - let ampldata = [// ampl1 | ampl2 | ampl3 - 0x000000 | 0x000000 | 0x000000, // ' *' 00 - 0x000000 | 0x000000 | 0x000000, // '.*' 01 - 0x000000 | 0x000000 | 0x000000, // '?*' 02 - 0x000000 | 0x000000 | 0x000000, // ',*' 03 - 0x000000 | 0x000000 | 0x000000, // '-*' 04 - 0x00000D | 0x000A00 | 0x080000, // 'IY' 05 - 0x00000D | 0x000B00 | 0x070000, // 'IH' 06 - 0x00000E | 0x000D00 | 0x080000, // 'EH' 07 - 0x00000F | 0x000E00 | 0x080000, // 'AE' 08 - 0x00000F | 0x000D00 | 0x010000, // 'AA' 09 - 0x00000F | 0x000C00 | 0x010000, // 'AH' 10 - 0x00000F | 0x000C00 | 0x000000, // 'AO' 11 - 0x00000F | 0x000B00 | 0x010000, // 'UH' 12 - 0x00000C | 0x000900 | 0x000000, // 'AX' 13 - 0x00000D | 0x000B00 | 0x070000, // 'IX' 14 - 0x00000C | 0x000B00 | 0x050000, // 'ER' 15 - 0x00000F | 0x000C00 | 0x010000, // 'UX' 16 - 0x00000F | 0x000C00 | 0x000000, // 'OH' 17 - 0x00000D | 0x000C00 | 0x060000, // 'RX' 18 - 0x00000D | 0x000800 | 0x010000, // 'LX' 19 - 0x00000D | 0x000800 | 0x000000, // 'WX' 20 - 0x00000E | 0x000C00 | 0x070000, // 'YX' 21 - 0x00000D | 0x000800 | 0x000000, // 'WH' 22 - 0x00000C | 0x000A00 | 0x050000, // 'R*' 23 - 0x00000D | 0x000800 | 0x010000, // 'L*' 24 - 0x00000D | 0x000800 | 0x000000, // 'W*' 25 - 0x00000D | 0x000A00 | 0x080000, // 'Y*' 26 - 0x00000C | 0x000300 | 0x000000, // 'M*' 27 - 0x000009 | 0x000900 | 0x000000, // 'N*' 28 - 0x000009 | 0x000600 | 0x030000, // 'NX' 29 - 0x000000 | 0x000000 | 0x000000, // 'DX' 30 - 0x000000 | 0x000000 | 0x000000, // 'Q*' 31 - 0x000000 | 0x000000 | 0x000000, // 'S*' 32 - 0x000000 | 0x000000 | 0x000000, // 'SH' 33 - 0x000000 | 0x000000 | 0x000000, // 'F*' 34 - 0x000000 | 0x000000 | 0x000000, // 'TH' 35 - 0x000000 | 0x000000 | 0x000000, // '/H' 36 - 0x000000 | 0x000000 | 0x000000, // '/X' 37 - 0x00000B | 0x000300 | 0x000000, // 'Z*' 38 - 0x00000B | 0x000500 | 0x010000, // 'ZH' 39 - 0x00000B | 0x000300 | 0x000000, // 'V*' 40 - 0x00000B | 0x000400 | 0x000000, // 'DH' 41 - 0x000000 | 0x000000 | 0x000000, // 'CH' 42 - 0x000000 | 0x000000 | 0x000000, // '**' 43 - 0x000001 | 0x000000 | 0x000000, // 'J*' 44 - 0x00000B | 0x000500 | 0x010000, // '**' 45 - 0x000000 | 0x000A00 | 0x0E0000, // '**' 46 - 0x000002 | 0x000200 | 0x010000, // '**' 47 - 0x00000E | 0x000E00 | 0x090000, // 'EY' 48 - 0x00000F | 0x000D00 | 0x010000, // 'AY' 49 - 0x00000F | 0x000C00 | 0x000000, // 'OY' 50 - 0x00000F | 0x000D00 | 0x010000, // 'AW' 51 - 0x00000F | 0x000C00 | 0x000000, // 'OW' 52 - 0x00000D | 0x000800 | 0x000000, // 'UW' 53 - 0x000002 | 0x000000 | 0x000000, // 'B*' 54 - 0x000004 | 0x000100 | 0x000000, // '**' 55 - 0x000000 | 0x000000 | 0x000000, // '**' 56 - 0x000002 | 0x000000 | 0x000000, // 'D*' 57 - 0x000004 | 0x000100 | 0x000000, // '**' 58 - 0x000000 | 0x000000 | 0x000000, // '**' 59 - 0x000001 | 0x000000 | 0x000000, // 'G*' 60 - 0x000004 | 0x000100 | 0x000000, // '**' 61 - 0x000000 | 0x000000 | 0x000000, // '**' 62 - 0x000001 | 0x000000 | 0x000000, // 'GX' 63 - 0x000004 | 0x000100 | 0x000000, // '**' 64 - 0x000000 | 0x000000 | 0x000000, // '**' 65 - 0x000000 | 0x000000 | 0x000000, // 'P*' 66 - 0x000000 | 0x000000 | 0x000000, // '**' 67 - 0x000000 | 0x000000 | 0x000000, // '**' 68 - 0x000000 | 0x000000 | 0x000000, // 'T*' 69 - 0x000000 | 0x000000 | 0x000000, // '**' 70 - 0x000000 | 0x000000 | 0x000000, // '**' 71 - 0x000000 | 0x000000 | 0x000000, // 'K*' 72 - 0x00000C | 0x000A00 | 0x070000, // '**' 73 - 0x000000 | 0x000000 | 0x000000, // '**' 74 - 0x000000 | 0x000000 | 0x000000, // 'KX' 75 - 0x000000 | 0x000A00 | 0x050000, // '**' 76 - 0x000000 | 0x000000 | 0x000000, // '**' 77 - 0x00000F | 0x000000 | 0x130000, // 'UL' 78 + let ampldata = [ + // ampl1 | ampl2 | ampl3 + 0x000000 | 0x000000 | 0x000000, + // ' *' 00 + 0x000000 | 0x000000 | 0x000000, + // '.*' 01 + 0x000000 | 0x000000 | 0x000000, + // '?*' 02 + 0x000000 | 0x000000 | 0x000000, + // ',*' 03 + 0x000000 | 0x000000 | 0x000000, + // '-*' 04 + 0x00000D | 0x000A00 | 0x080000, + // 'IY' 05 + 0x00000D | 0x000B00 | 0x070000, + // 'IH' 06 + 0x00000E | 0x000D00 | 0x080000, + // 'EH' 07 + 0x00000F | 0x000E00 | 0x080000, + // 'AE' 08 + 0x00000F | 0x000D00 | 0x010000, + // 'AA' 09 + 0x00000F | 0x000C00 | 0x010000, + // 'AH' 10 + 0x00000F | 0x000C00 | 0x000000, + // 'AO' 11 + 0x00000F | 0x000B00 | 0x010000, + // 'UH' 12 + 0x00000C | 0x000900 | 0x000000, + // 'AX' 13 + 0x00000D | 0x000B00 | 0x070000, + // 'IX' 14 + 0x00000C | 0x000B00 | 0x050000, + // 'ER' 15 + 0x00000F | 0x000C00 | 0x010000, + // 'UX' 16 + 0x00000F | 0x000C00 | 0x000000, + // 'OH' 17 + 0x00000D | 0x000C00 | 0x060000, + // 'RX' 18 + 0x00000D | 0x000800 | 0x010000, + // 'LX' 19 + 0x00000D | 0x000800 | 0x000000, + // 'WX' 20 + 0x00000E | 0x000C00 | 0x070000, + // 'YX' 21 + 0x00000D | 0x000800 | 0x000000, + // 'WH' 22 + 0x00000C | 0x000A00 | 0x050000, + // 'R*' 23 + 0x00000D | 0x000800 | 0x010000, + // 'L*' 24 + 0x00000D | 0x000800 | 0x000000, + // 'W*' 25 + 0x00000D | 0x000A00 | 0x080000, + // 'Y*' 26 + 0x00000C | 0x000300 | 0x000000, + // 'M*' 27 + 0x000009 | 0x000900 | 0x000000, + // 'N*' 28 + 0x000009 | 0x000600 | 0x030000, + // 'NX' 29 + 0x000000 | 0x000000 | 0x000000, + // 'DX' 30 + 0x000000 | 0x000000 | 0x000000, + // 'Q*' 31 + 0x000000 | 0x000000 | 0x000000, + // 'S*' 32 + 0x000000 | 0x000000 | 0x000000, + // 'SH' 33 + 0x000000 | 0x000000 | 0x000000, + // 'F*' 34 + 0x000000 | 0x000000 | 0x000000, + // 'TH' 35 + 0x000000 | 0x000000 | 0x000000, + // '/H' 36 + 0x000000 | 0x000000 | 0x000000, + // '/X' 37 + 0x00000B | 0x000300 | 0x000000, + // 'Z*' 38 + 0x00000B | 0x000500 | 0x010000, + // 'ZH' 39 + 0x00000B | 0x000300 | 0x000000, + // 'V*' 40 + 0x00000B | 0x000400 | 0x000000, + // 'DH' 41 + 0x000000 | 0x000000 | 0x000000, + // 'CH' 42 + 0x000000 | 0x000000 | 0x000000, + // '**' 43 + 0x000001 | 0x000000 | 0x000000, + // 'J*' 44 + 0x00000B | 0x000500 | 0x010000, + // '**' 45 + 0x000000 | 0x000A00 | 0x0E0000, + // '**' 46 + 0x000002 | 0x000200 | 0x010000, + // '**' 47 + 0x00000E | 0x000E00 | 0x090000, + // 'EY' 48 + 0x00000F | 0x000D00 | 0x010000, + // 'AY' 49 + 0x00000F | 0x000C00 | 0x000000, + // 'OY' 50 + 0x00000F | 0x000D00 | 0x010000, + // 'AW' 51 + 0x00000F | 0x000C00 | 0x000000, + // 'OW' 52 + 0x00000D | 0x000800 | 0x000000, + // 'UW' 53 + 0x000002 | 0x000000 | 0x000000, + // 'B*' 54 + 0x000004 | 0x000100 | 0x000000, + // '**' 55 + 0x000000 | 0x000000 | 0x000000, + // '**' 56 + 0x000002 | 0x000000 | 0x000000, + // 'D*' 57 + 0x000004 | 0x000100 | 0x000000, + // '**' 58 + 0x000000 | 0x000000 | 0x000000, + // '**' 59 + 0x000001 | 0x000000 | 0x000000, + // 'G*' 60 + 0x000004 | 0x000100 | 0x000000, + // '**' 61 + 0x000000 | 0x000000 | 0x000000, + // '**' 62 + 0x000001 | 0x000000 | 0x000000, + // 'GX' 63 + 0x000004 | 0x000100 | 0x000000, + // '**' 64 + 0x000000 | 0x000000 | 0x000000, + // '**' 65 + 0x000000 | 0x000000 | 0x000000, + // 'P*' 66 + 0x000000 | 0x000000 | 0x000000, + // '**' 67 + 0x000000 | 0x000000 | 0x000000, + // '**' 68 + 0x000000 | 0x000000 | 0x000000, + // 'T*' 69 + 0x000000 | 0x000000 | 0x000000, + // '**' 70 + 0x000000 | 0x000000 | 0x000000, + // '**' 71 + 0x000000 | 0x000000 | 0x000000, + // 'K*' 72 + 0x00000C | 0x000A00 | 0x070000, + // '**' 73 + 0x000000 | 0x000000 | 0x000000, + // '**' 74 + 0x000000 | 0x000000 | 0x000000, + // 'KX' 75 + 0x000000 | 0x000A00 | 0x050000, + // '**' 76 + 0x000000 | 0x000000 | 0x000000, + // '**' 77 + 0x00000F | 0x000000 | 0x130000, + // 'UL' 78 0x00000F | 0x000000 | 0x100000 // 'UM' 79 - ]; // Sampled data for consonants, consisting of five 256-byte sections - - let sampleTable = [//00 T', S, Z (coronal) - 0x38, 0x84, 0x6B, 0x19, 0xC6, 0x63, 0x18, 0x86, 0x73, 0x98, 0xC6, 0xB1, 0x1C, 0xCA, 0x31, 0x8C, 0xC7, 0x31, 0x88, 0xC2, 0x30, 0x98, 0x46, 0x31, 0x18, 0xC6, 0x35, 0x0C, 0xCA, 0x31, 0x0C, 0xC6, //20 - 0x21, 0x10, 0x24, 0x69, 0x12, 0xC2, 0x31, 0x14, 0xC4, 0x71, 0x08, 0x4A, 0x22, 0x49, 0xAB, 0x6A, 0xA8, 0xAC, 0x49, 0x51, 0x32, 0xD5, 0x52, 0x88, 0x93, 0x6C, 0x94, 0x22, 0x15, 0x54, 0xD2, 0x25, //40 - 0x96, 0xD4, 0x50, 0xA5, 0x46, 0x21, 0x08, 0x85, 0x6B, 0x18, 0xC4, 0x63, 0x10, 0xCE, 0x6B, 0x18, 0x8C, 0x71, 0x19, 0x8C, 0x63, 0x35, 0x0C, 0xC6, 0x33, 0x99, 0xCC, 0x6C, 0xB5, 0x4E, 0xA2, 0x99, //60 - 0x46, 0x21, 0x28, 0x82, 0x95, 0x2E, 0xE3, 0x30, 0x9C, 0xC5, 0x30, 0x9C, 0xA2, 0xB1, 0x9C, 0x67, 0x31, 0x88, 0x66, 0x59, 0x2C, 0x53, 0x18, 0x84, 0x67, 0x50, 0xCA, 0xE3, 0x0A, 0xAC, 0xAB, 0x30, //80 - 0xAC, 0x62, 0x30, 0x8C, 0x63, 0x10, 0x94, 0x62, 0xB1, 0x8C, 0x82, 0x28, 0x96, 0x33, 0x98, 0xD6, 0xB5, 0x4C, 0x62, 0x29, 0xA5, 0x4A, 0xB5, 0x9C, 0xC6, 0x31, 0x14, 0xD6, 0x38, 0x9C, 0x4B, 0xB4, //A0 - 0x86, 0x65, 0x18, 0xAE, 0x67, 0x1C, 0xA6, 0x63, 0x19, 0x96, 0x23, 0x19, 0x84, 0x13, 0x08, 0xA6, 0x52, 0xAC, 0xCA, 0x22, 0x89, 0x6E, 0xAB, 0x19, 0x8C, 0x62, 0x34, 0xC4, 0x62, 0x19, 0x86, 0x63, //C0 - 0x18, 0xC4, 0x23, 0x58, 0xD6, 0xA3, 0x50, 0x42, 0x54, 0x4A, 0xAD, 0x4A, 0x25, 0x11, 0x6B, 0x64, 0x89, 0x4A, 0x63, 0x39, 0x8A, 0x23, 0x31, 0x2A, 0xEA, 0xA2, 0xA9, 0x44, 0xC5, 0x12, 0xCD, 0x42, //E0 - 0x34, 0x8C, 0x62, 0x18, 0x8C, 0x63, 0x11, 0x48, 0x66, 0x31, 0x9D, 0x44, 0x33, 0x1D, 0x46, 0x31, 0x9C, 0xC6, 0xB1, 0x0C, 0xCD, 0x32, 0x88, 0xC4, 0x73, 0x18, 0x86, 0x73, 0x08, 0xD6, 0x63, 0x58, //100 CH', J', SH, ZH (palato-alveolar) - 0x07, 0x81, 0xE0, 0xF0, 0x3C, 0x07, 0x87, 0x90, 0x3C, 0x7C, 0x0F, 0xC7, 0xC0, 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x80, 0x80, 0x00, 0x1C, 0x78, 0x70, 0xF1, 0xC7, 0x1F, 0xC0, 0x0C, 0xFE, 0x1C, 0x1F, //120 - 0x1F, 0x0E, 0x0A, 0x7A, 0xC0, 0x71, 0xF2, 0x83, 0x8F, 0x03, 0x0F, 0x0F, 0x0C, 0x00, 0x79, 0xF8, 0x61, 0xE0, 0x43, 0x0F, 0x83, 0xE7, 0x18, 0xF9, 0xC1, 0x13, 0xDA, 0xE9, 0x63, 0x8F, 0x0F, 0x83, //140 - 0x83, 0x87, 0xC3, 0x1F, 0x3C, 0x70, 0xF0, 0xE1, 0xE1, 0xE3, 0x87, 0xB8, 0x71, 0x0E, 0x20, 0xE3, 0x8D, 0x48, 0x78, 0x1C, 0x93, 0x87, 0x30, 0xE1, 0xC1, 0xC1, 0xE4, 0x78, 0x21, 0x83, 0x83, 0xC3, //160 - 0x87, 0x06, 0x39, 0xE5, 0xC3, 0x87, 0x07, 0x0E, 0x1C, 0x1C, 0x70, 0xF4, 0x71, 0x9C, 0x60, 0x36, 0x32, 0xC3, 0x1E, 0x3C, 0xF3, 0x8F, 0x0E, 0x3C, 0x70, 0xE3, 0xC7, 0x8F, 0x0F, 0x0F, 0x0E, 0x3C, //180 - 0x78, 0xF0, 0xE3, 0x87, 0x06, 0xF0, 0xE3, 0x07, 0xC1, 0x99, 0x87, 0x0F, 0x18, 0x78, 0x70, 0x70, 0xFC, 0xF3, 0x10, 0xB1, 0x8C, 0x8C, 0x31, 0x7C, 0x70, 0xE1, 0x86, 0x3C, 0x64, 0x6C, 0xB0, 0xE1, //1A0 - 0xE3, 0x0F, 0x23, 0x8F, 0x0F, 0x1E, 0x3E, 0x38, 0x3C, 0x38, 0x7B, 0x8F, 0x07, 0x0E, 0x3C, 0xF4, 0x17, 0x1E, 0x3C, 0x78, 0xF2, 0x9E, 0x72, 0x49, 0xE3, 0x25, 0x36, 0x38, 0x58, 0x39, 0xE2, 0xDE, //1C0 - 0x3C, 0x78, 0x78, 0xE1, 0xC7, 0x61, 0xE1, 0xE1, 0xB0, 0xF0, 0xF0, 0xC3, 0xC7, 0x0E, 0x38, 0xC0, 0xF0, 0xCE, 0x73, 0x73, 0x18, 0x34, 0xB0, 0xE1, 0xC7, 0x8E, 0x1C, 0x3C, 0xF8, 0x38, 0xF0, 0xE1, //1E0 - 0xC1, 0x8B, 0x86, 0x8F, 0x1C, 0x78, 0x70, 0xF0, 0x78, 0xAC, 0xB1, 0x8F, 0x39, 0x31, 0xDB, 0x38, 0x61, 0xC3, 0x0E, 0x0E, 0x38, 0x78, 0x73, 0x17, 0x1E, 0x39, 0x1E, 0x38, 0x64, 0xE1, 0xF1, 0xC1, //200 P', F, V, TH, DH ([labio]dental) - 0x4E, 0x0F, 0x40, 0xA2, 0x02, 0xC5, 0x8F, 0x81, 0xA1, 0xFC, 0x12, 0x08, 0x64, 0xE0, 0x3C, 0x22, 0xE0, 0x45, 0x07, 0x8E, 0x0C, 0x32, 0x90, 0xF0, 0x1F, 0x20, 0x49, 0xE0, 0xF8, 0x0C, 0x60, 0xF0, //220 - 0x17, 0x1A, 0x41, 0xAA, 0xA4, 0xD0, 0x8D, 0x12, 0x82, 0x1E, 0x1E, 0x03, 0xF8, 0x3E, 0x03, 0x0C, 0x73, 0x80, 0x70, 0x44, 0x26, 0x03, 0x24, 0xE1, 0x3E, 0x04, 0x4E, 0x04, 0x1C, 0xC1, 0x09, 0xCC, //240 - 0x9E, 0x90, 0x21, 0x07, 0x90, 0x43, 0x64, 0xC0, 0x0F, 0xC6, 0x90, 0x9C, 0xC1, 0x5B, 0x03, 0xE2, 0x1D, 0x81, 0xE0, 0x5E, 0x1D, 0x03, 0x84, 0xB8, 0x2C, 0x0F, 0x80, 0xB1, 0x83, 0xE0, 0x30, 0x41, //260 - 0x1E, 0x43, 0x89, 0x83, 0x50, 0xFC, 0x24, 0x2E, 0x13, 0x83, 0xF1, 0x7C, 0x4C, 0x2C, 0xC9, 0x0D, 0x83, 0xB0, 0xB5, 0x82, 0xE4, 0xE8, 0x06, 0x9C, 0x07, 0xA0, 0x99, 0x1D, 0x07, 0x3E, 0x82, 0x8F, //280 - 0x70, 0x30, 0x74, 0x40, 0xCA, 0x10, 0xE4, 0xE8, 0x0F, 0x92, 0x14, 0x3F, 0x06, 0xF8, 0x84, 0x88, 0x43, 0x81, 0x0A, 0x34, 0x39, 0x41, 0xC6, 0xE3, 0x1C, 0x47, 0x03, 0xB0, 0xB8, 0x13, 0x0A, 0xC2, //2A0 - 0x64, 0xF8, 0x18, 0xF9, 0x60, 0xB3, 0xC0, 0x65, 0x20, 0x60, 0xA6, 0x8C, 0xC3, 0x81, 0x20, 0x30, 0x26, 0x1E, 0x1C, 0x38, 0xD3, 0x01, 0xB0, 0x26, 0x40, 0xF4, 0x0B, 0xC3, 0x42, 0x1F, 0x85, 0x32, //2C0 - 0x26, 0x60, 0x40, 0xC9, 0xCB, 0x01, 0xEC, 0x11, 0x28, 0x40, 0xFA, 0x04, 0x34, 0xE0, 0x70, 0x4C, 0x8C, 0x1D, 0x07, 0x69, 0x03, 0x16, 0xC8, 0x04, 0x23, 0xE8, 0xC6, 0x9A, 0x0B, 0x1A, 0x03, 0xE0, //2E0 - 0x76, 0x06, 0x05, 0xCF, 0x1E, 0xBC, 0x58, 0x31, 0x71, 0x66, 0x00, 0xF8, 0x3F, 0x04, 0xFC, 0x0C, 0x74, 0x27, 0x8A, 0x80, 0x71, 0xC2, 0x3A, 0x26, 0x06, 0xC0, 0x1F, 0x05, 0x0F, 0x98, 0x40, 0xAE, //300 /H (palatal) - 0x01, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x0E, 0xFE, 0x00, 0x03, 0xDF, 0x80, 0x03, 0xEF, 0x80, 0x1B, 0xF1, 0xC2, 0x00, 0xE7, 0xE0, 0x18, 0xFC, 0xE0, 0x21, 0xFC, 0x80, 0x3C, 0xFC, 0x40, 0x0E, 0x7E, //320 - 0x00, 0x3F, 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x3E, 0xF0, 0x07, 0xFC, 0x00, 0x7E, 0x10, 0x3F, 0xFF, 0x00, 0x3F, 0x38, 0x0E, 0x7C, 0x01, 0x87, 0x0C, 0xFC, 0xC7, 0x00, 0x3E, 0x04, //340 - 0x0F, 0x3E, 0x1F, 0x0F, 0x0F, 0x1F, 0x0F, 0x02, 0x83, 0x87, 0xCF, 0x03, 0x87, 0x0F, 0x3F, 0xC0, 0x07, 0x9E, 0x60, 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x77, 0xE1, 0xC0, 0xFE, 0xE0, 0xC3, //360 - 0xE0, 0x01, 0xDF, 0xF8, 0x03, 0x07, 0x00, 0x7E, 0x70, 0x00, 0x7C, 0x38, 0x18, 0xFE, 0x0C, 0x1E, 0x78, 0x1C, 0x7C, 0x3E, 0x0E, 0x1F, 0x1E, 0x1E, 0x3E, 0x00, 0x7F, 0x83, 0x07, 0xDB, 0x87, 0x83, //380 - 0x07, 0xC7, 0x07, 0x10, 0x71, 0xFF, 0x00, 0x3F, 0xE2, 0x01, 0xE0, 0xC1, 0xC3, 0xE1, 0x00, 0x7F, 0xC0, 0x05, 0xF0, 0x20, 0xF8, 0xF0, 0x70, 0xFE, 0x78, 0x79, 0xF8, 0x02, 0x3F, 0x0C, 0x8F, 0x03, //3a0 - 0x0F, 0x9F, 0xE0, 0xC1, 0xC7, 0x87, 0x03, 0xC3, 0xC3, 0xB0, 0xE1, 0xE1, 0xC1, 0xE3, 0xE0, 0x71, 0xF0, 0x00, 0xFC, 0x70, 0x7C, 0x0C, 0x3E, 0x38, 0x0E, 0x1C, 0x70, 0xC3, 0xC7, 0x03, 0x81, 0xC1, //3c0 - 0xC7, 0xE7, 0x00, 0x0F, 0xC7, 0x87, 0x19, 0x09, 0xEF, 0xC4, 0x33, 0xE0, 0xC1, 0xFC, 0xF8, 0x70, 0xF0, 0x78, 0xF8, 0xF0, 0x61, 0xC7, 0x00, 0x1F, 0xF8, 0x01, 0x7C, 0xF8, 0xF0, 0x78, 0x70, 0x3C, //3e0 - 0x7C, 0xCE, 0x0E, 0x21, 0x83, 0xCF, 0x08, 0x07, 0x8F, 0x08, 0xC1, 0x87, 0x8F, 0x80, 0xC7, 0xE3, 0x00, 0x07, 0xF8, 0xE0, 0xEF, 0x00, 0x39, 0xF7, 0x80, 0x0E, 0xF8, 0xE1, 0xE3, 0xF8, 0x21, 0x9F, //400 /X (glottal) - 0xC0, 0xFF, 0x03, 0xF8, 0x07, 0xC0, 0x1F, 0xF8, 0xC4, 0x04, 0xFC, 0xC4, 0xC1, 0xBC, 0x87, 0xF0, 0x0F, 0xC0, 0x7F, 0x05, 0xE0, 0x25, 0xEC, 0xC0, 0x3E, 0x84, 0x47, 0xF0, 0x8E, 0x03, 0xF8, 0x03, //420 - 0xFB, 0xC0, 0x19, 0xF8, 0x07, 0x9C, 0x0C, 0x17, 0xF8, 0x07, 0xE0, 0x1F, 0xA1, 0xFC, 0x0F, 0xFC, 0x01, 0xF0, 0x3F, 0x00, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0xFD, 0x00, 0xFF, 0x88, 0x0D, 0xF9, 0x01, //440 - 0xFF, 0x00, 0x70, 0x07, 0xC0, 0x3E, 0x42, 0xF3, 0x0D, 0xC4, 0x7F, 0x80, 0xFC, 0x07, 0xF0, 0x5E, 0xC0, 0x3F, 0x00, 0x78, 0x3F, 0x81, 0xFF, 0x01, 0xF8, 0x01, 0xC3, 0xE8, 0x0C, 0xE4, 0x64, 0x8F, //460 - 0xE4, 0x0F, 0xF0, 0x07, 0xF0, 0xC2, 0x1F, 0x00, 0x7F, 0xC0, 0x6F, 0x80, 0x7E, 0x03, 0xF8, 0x07, 0xF0, 0x3F, 0xC0, 0x78, 0x0F, 0x82, 0x07, 0xFE, 0x22, 0x77, 0x70, 0x02, 0x76, 0x03, 0xFE, 0x00, //480 - 0xFE, 0x67, 0x00, 0x7C, 0xC7, 0xF1, 0x8E, 0xC6, 0x3B, 0xE0, 0x3F, 0x84, 0xF3, 0x19, 0xD8, 0x03, 0x99, 0xFC, 0x09, 0xB8, 0x0F, 0xF8, 0x00, 0x9D, 0x24, 0x61, 0xF9, 0x0D, 0x00, 0xFD, 0x03, 0xF0, //4a0 - 0x1F, 0x90, 0x3F, 0x01, 0xF8, 0x1F, 0xD0, 0x0F, 0xF8, 0x37, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFA, 0x03, 0xF0, 0x0F, 0x80, 0xFF, 0x01, //4c0 - 0xB8, 0x07, 0xF0, 0x01, 0xFC, 0x01, 0xBC, 0x80, 0x13, 0x1E, 0x00, 0x7F, 0xE1, 0x40, 0x7F, 0xA0, 0x7F, 0xB0, 0x00, 0x3F, 0xC0, 0x1F, 0xC0, 0x38, 0x0F, 0xF0, 0x1F, 0x80, 0xFF, 0x01, 0xFC, 0x03, //4e0 + ]; + + // Sampled data for consonants, consisting of five 256-byte sections + let sampleTable = [ + //00 T', S, Z (coronal) + 0x38, 0x84, 0x6B, 0x19, 0xC6, 0x63, 0x18, 0x86, 0x73, 0x98, 0xC6, 0xB1, 0x1C, 0xCA, 0x31, 0x8C, 0xC7, 0x31, 0x88, 0xC2, 0x30, 0x98, 0x46, 0x31, 0x18, 0xC6, 0x35, 0x0C, 0xCA, 0x31, 0x0C, 0xC6, + //20 + 0x21, 0x10, 0x24, 0x69, 0x12, 0xC2, 0x31, 0x14, 0xC4, 0x71, 0x08, 0x4A, 0x22, 0x49, 0xAB, 0x6A, 0xA8, 0xAC, 0x49, 0x51, 0x32, 0xD5, 0x52, 0x88, 0x93, 0x6C, 0x94, 0x22, 0x15, 0x54, 0xD2, 0x25, + //40 + 0x96, 0xD4, 0x50, 0xA5, 0x46, 0x21, 0x08, 0x85, 0x6B, 0x18, 0xC4, 0x63, 0x10, 0xCE, 0x6B, 0x18, 0x8C, 0x71, 0x19, 0x8C, 0x63, 0x35, 0x0C, 0xC6, 0x33, 0x99, 0xCC, 0x6C, 0xB5, 0x4E, 0xA2, 0x99, + //60 + 0x46, 0x21, 0x28, 0x82, 0x95, 0x2E, 0xE3, 0x30, 0x9C, 0xC5, 0x30, 0x9C, 0xA2, 0xB1, 0x9C, 0x67, 0x31, 0x88, 0x66, 0x59, 0x2C, 0x53, 0x18, 0x84, 0x67, 0x50, 0xCA, 0xE3, 0x0A, 0xAC, 0xAB, 0x30, + //80 + 0xAC, 0x62, 0x30, 0x8C, 0x63, 0x10, 0x94, 0x62, 0xB1, 0x8C, 0x82, 0x28, 0x96, 0x33, 0x98, 0xD6, 0xB5, 0x4C, 0x62, 0x29, 0xA5, 0x4A, 0xB5, 0x9C, 0xC6, 0x31, 0x14, 0xD6, 0x38, 0x9C, 0x4B, 0xB4, + //A0 + 0x86, 0x65, 0x18, 0xAE, 0x67, 0x1C, 0xA6, 0x63, 0x19, 0x96, 0x23, 0x19, 0x84, 0x13, 0x08, 0xA6, 0x52, 0xAC, 0xCA, 0x22, 0x89, 0x6E, 0xAB, 0x19, 0x8C, 0x62, 0x34, 0xC4, 0x62, 0x19, 0x86, 0x63, + //C0 + 0x18, 0xC4, 0x23, 0x58, 0xD6, 0xA3, 0x50, 0x42, 0x54, 0x4A, 0xAD, 0x4A, 0x25, 0x11, 0x6B, 0x64, 0x89, 0x4A, 0x63, 0x39, 0x8A, 0x23, 0x31, 0x2A, 0xEA, 0xA2, 0xA9, 0x44, 0xC5, 0x12, 0xCD, 0x42, + //E0 + 0x34, 0x8C, 0x62, 0x18, 0x8C, 0x63, 0x11, 0x48, 0x66, 0x31, 0x9D, 0x44, 0x33, 0x1D, 0x46, 0x31, 0x9C, 0xC6, 0xB1, 0x0C, 0xCD, 0x32, 0x88, 0xC4, 0x73, 0x18, 0x86, 0x73, 0x08, 0xD6, 0x63, 0x58, + //100 CH', J', SH, ZH (palato-alveolar) + 0x07, 0x81, 0xE0, 0xF0, 0x3C, 0x07, 0x87, 0x90, 0x3C, 0x7C, 0x0F, 0xC7, 0xC0, 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x80, 0x80, 0x00, 0x1C, 0x78, 0x70, 0xF1, 0xC7, 0x1F, 0xC0, 0x0C, 0xFE, 0x1C, 0x1F, + //120 + 0x1F, 0x0E, 0x0A, 0x7A, 0xC0, 0x71, 0xF2, 0x83, 0x8F, 0x03, 0x0F, 0x0F, 0x0C, 0x00, 0x79, 0xF8, 0x61, 0xE0, 0x43, 0x0F, 0x83, 0xE7, 0x18, 0xF9, 0xC1, 0x13, 0xDA, 0xE9, 0x63, 0x8F, 0x0F, 0x83, + //140 + 0x83, 0x87, 0xC3, 0x1F, 0x3C, 0x70, 0xF0, 0xE1, 0xE1, 0xE3, 0x87, 0xB8, 0x71, 0x0E, 0x20, 0xE3, 0x8D, 0x48, 0x78, 0x1C, 0x93, 0x87, 0x30, 0xE1, 0xC1, 0xC1, 0xE4, 0x78, 0x21, 0x83, 0x83, 0xC3, + //160 + 0x87, 0x06, 0x39, 0xE5, 0xC3, 0x87, 0x07, 0x0E, 0x1C, 0x1C, 0x70, 0xF4, 0x71, 0x9C, 0x60, 0x36, 0x32, 0xC3, 0x1E, 0x3C, 0xF3, 0x8F, 0x0E, 0x3C, 0x70, 0xE3, 0xC7, 0x8F, 0x0F, 0x0F, 0x0E, 0x3C, + //180 + 0x78, 0xF0, 0xE3, 0x87, 0x06, 0xF0, 0xE3, 0x07, 0xC1, 0x99, 0x87, 0x0F, 0x18, 0x78, 0x70, 0x70, 0xFC, 0xF3, 0x10, 0xB1, 0x8C, 0x8C, 0x31, 0x7C, 0x70, 0xE1, 0x86, 0x3C, 0x64, 0x6C, 0xB0, 0xE1, + //1A0 + 0xE3, 0x0F, 0x23, 0x8F, 0x0F, 0x1E, 0x3E, 0x38, 0x3C, 0x38, 0x7B, 0x8F, 0x07, 0x0E, 0x3C, 0xF4, 0x17, 0x1E, 0x3C, 0x78, 0xF2, 0x9E, 0x72, 0x49, 0xE3, 0x25, 0x36, 0x38, 0x58, 0x39, 0xE2, 0xDE, + //1C0 + 0x3C, 0x78, 0x78, 0xE1, 0xC7, 0x61, 0xE1, 0xE1, 0xB0, 0xF0, 0xF0, 0xC3, 0xC7, 0x0E, 0x38, 0xC0, 0xF0, 0xCE, 0x73, 0x73, 0x18, 0x34, 0xB0, 0xE1, 0xC7, 0x8E, 0x1C, 0x3C, 0xF8, 0x38, 0xF0, 0xE1, + //1E0 + 0xC1, 0x8B, 0x86, 0x8F, 0x1C, 0x78, 0x70, 0xF0, 0x78, 0xAC, 0xB1, 0x8F, 0x39, 0x31, 0xDB, 0x38, 0x61, 0xC3, 0x0E, 0x0E, 0x38, 0x78, 0x73, 0x17, 0x1E, 0x39, 0x1E, 0x38, 0x64, 0xE1, 0xF1, 0xC1, + //200 P', F, V, TH, DH ([labio]dental) + 0x4E, 0x0F, 0x40, 0xA2, 0x02, 0xC5, 0x8F, 0x81, 0xA1, 0xFC, 0x12, 0x08, 0x64, 0xE0, 0x3C, 0x22, 0xE0, 0x45, 0x07, 0x8E, 0x0C, 0x32, 0x90, 0xF0, 0x1F, 0x20, 0x49, 0xE0, 0xF8, 0x0C, 0x60, 0xF0, + //220 + 0x17, 0x1A, 0x41, 0xAA, 0xA4, 0xD0, 0x8D, 0x12, 0x82, 0x1E, 0x1E, 0x03, 0xF8, 0x3E, 0x03, 0x0C, 0x73, 0x80, 0x70, 0x44, 0x26, 0x03, 0x24, 0xE1, 0x3E, 0x04, 0x4E, 0x04, 0x1C, 0xC1, 0x09, 0xCC, + //240 + 0x9E, 0x90, 0x21, 0x07, 0x90, 0x43, 0x64, 0xC0, 0x0F, 0xC6, 0x90, 0x9C, 0xC1, 0x5B, 0x03, 0xE2, 0x1D, 0x81, 0xE0, 0x5E, 0x1D, 0x03, 0x84, 0xB8, 0x2C, 0x0F, 0x80, 0xB1, 0x83, 0xE0, 0x30, 0x41, + //260 + 0x1E, 0x43, 0x89, 0x83, 0x50, 0xFC, 0x24, 0x2E, 0x13, 0x83, 0xF1, 0x7C, 0x4C, 0x2C, 0xC9, 0x0D, 0x83, 0xB0, 0xB5, 0x82, 0xE4, 0xE8, 0x06, 0x9C, 0x07, 0xA0, 0x99, 0x1D, 0x07, 0x3E, 0x82, 0x8F, + //280 + 0x70, 0x30, 0x74, 0x40, 0xCA, 0x10, 0xE4, 0xE8, 0x0F, 0x92, 0x14, 0x3F, 0x06, 0xF8, 0x84, 0x88, 0x43, 0x81, 0x0A, 0x34, 0x39, 0x41, 0xC6, 0xE3, 0x1C, 0x47, 0x03, 0xB0, 0xB8, 0x13, 0x0A, 0xC2, + //2A0 + 0x64, 0xF8, 0x18, 0xF9, 0x60, 0xB3, 0xC0, 0x65, 0x20, 0x60, 0xA6, 0x8C, 0xC3, 0x81, 0x20, 0x30, 0x26, 0x1E, 0x1C, 0x38, 0xD3, 0x01, 0xB0, 0x26, 0x40, 0xF4, 0x0B, 0xC3, 0x42, 0x1F, 0x85, 0x32, + //2C0 + 0x26, 0x60, 0x40, 0xC9, 0xCB, 0x01, 0xEC, 0x11, 0x28, 0x40, 0xFA, 0x04, 0x34, 0xE0, 0x70, 0x4C, 0x8C, 0x1D, 0x07, 0x69, 0x03, 0x16, 0xC8, 0x04, 0x23, 0xE8, 0xC6, 0x9A, 0x0B, 0x1A, 0x03, 0xE0, + //2E0 + 0x76, 0x06, 0x05, 0xCF, 0x1E, 0xBC, 0x58, 0x31, 0x71, 0x66, 0x00, 0xF8, 0x3F, 0x04, 0xFC, 0x0C, 0x74, 0x27, 0x8A, 0x80, 0x71, 0xC2, 0x3A, 0x26, 0x06, 0xC0, 0x1F, 0x05, 0x0F, 0x98, 0x40, 0xAE, + //300 /H (palatal) + 0x01, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x0E, 0xFE, 0x00, 0x03, 0xDF, 0x80, 0x03, 0xEF, 0x80, 0x1B, 0xF1, 0xC2, 0x00, 0xE7, 0xE0, 0x18, 0xFC, 0xE0, 0x21, 0xFC, 0x80, 0x3C, 0xFC, 0x40, 0x0E, 0x7E, + //320 + 0x00, 0x3F, 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x3E, 0xF0, 0x07, 0xFC, 0x00, 0x7E, 0x10, 0x3F, 0xFF, 0x00, 0x3F, 0x38, 0x0E, 0x7C, 0x01, 0x87, 0x0C, 0xFC, 0xC7, 0x00, 0x3E, 0x04, + //340 + 0x0F, 0x3E, 0x1F, 0x0F, 0x0F, 0x1F, 0x0F, 0x02, 0x83, 0x87, 0xCF, 0x03, 0x87, 0x0F, 0x3F, 0xC0, 0x07, 0x9E, 0x60, 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x77, 0xE1, 0xC0, 0xFE, 0xE0, 0xC3, + //360 + 0xE0, 0x01, 0xDF, 0xF8, 0x03, 0x07, 0x00, 0x7E, 0x70, 0x00, 0x7C, 0x38, 0x18, 0xFE, 0x0C, 0x1E, 0x78, 0x1C, 0x7C, 0x3E, 0x0E, 0x1F, 0x1E, 0x1E, 0x3E, 0x00, 0x7F, 0x83, 0x07, 0xDB, 0x87, 0x83, + //380 + 0x07, 0xC7, 0x07, 0x10, 0x71, 0xFF, 0x00, 0x3F, 0xE2, 0x01, 0xE0, 0xC1, 0xC3, 0xE1, 0x00, 0x7F, 0xC0, 0x05, 0xF0, 0x20, 0xF8, 0xF0, 0x70, 0xFE, 0x78, 0x79, 0xF8, 0x02, 0x3F, 0x0C, 0x8F, 0x03, + //3a0 + 0x0F, 0x9F, 0xE0, 0xC1, 0xC7, 0x87, 0x03, 0xC3, 0xC3, 0xB0, 0xE1, 0xE1, 0xC1, 0xE3, 0xE0, 0x71, 0xF0, 0x00, 0xFC, 0x70, 0x7C, 0x0C, 0x3E, 0x38, 0x0E, 0x1C, 0x70, 0xC3, 0xC7, 0x03, 0x81, 0xC1, + //3c0 + 0xC7, 0xE7, 0x00, 0x0F, 0xC7, 0x87, 0x19, 0x09, 0xEF, 0xC4, 0x33, 0xE0, 0xC1, 0xFC, 0xF8, 0x70, 0xF0, 0x78, 0xF8, 0xF0, 0x61, 0xC7, 0x00, 0x1F, 0xF8, 0x01, 0x7C, 0xF8, 0xF0, 0x78, 0x70, 0x3C, + //3e0 + 0x7C, 0xCE, 0x0E, 0x21, 0x83, 0xCF, 0x08, 0x07, 0x8F, 0x08, 0xC1, 0x87, 0x8F, 0x80, 0xC7, 0xE3, 0x00, 0x07, 0xF8, 0xE0, 0xEF, 0x00, 0x39, 0xF7, 0x80, 0x0E, 0xF8, 0xE1, 0xE3, 0xF8, 0x21, 0x9F, + //400 /X (glottal) + 0xC0, 0xFF, 0x03, 0xF8, 0x07, 0xC0, 0x1F, 0xF8, 0xC4, 0x04, 0xFC, 0xC4, 0xC1, 0xBC, 0x87, 0xF0, 0x0F, 0xC0, 0x7F, 0x05, 0xE0, 0x25, 0xEC, 0xC0, 0x3E, 0x84, 0x47, 0xF0, 0x8E, 0x03, 0xF8, 0x03, + //420 + 0xFB, 0xC0, 0x19, 0xF8, 0x07, 0x9C, 0x0C, 0x17, 0xF8, 0x07, 0xE0, 0x1F, 0xA1, 0xFC, 0x0F, 0xFC, 0x01, 0xF0, 0x3F, 0x00, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0xFD, 0x00, 0xFF, 0x88, 0x0D, 0xF9, 0x01, + //440 + 0xFF, 0x00, 0x70, 0x07, 0xC0, 0x3E, 0x42, 0xF3, 0x0D, 0xC4, 0x7F, 0x80, 0xFC, 0x07, 0xF0, 0x5E, 0xC0, 0x3F, 0x00, 0x78, 0x3F, 0x81, 0xFF, 0x01, 0xF8, 0x01, 0xC3, 0xE8, 0x0C, 0xE4, 0x64, 0x8F, + //460 + 0xE4, 0x0F, 0xF0, 0x07, 0xF0, 0xC2, 0x1F, 0x00, 0x7F, 0xC0, 0x6F, 0x80, 0x7E, 0x03, 0xF8, 0x07, 0xF0, 0x3F, 0xC0, 0x78, 0x0F, 0x82, 0x07, 0xFE, 0x22, 0x77, 0x70, 0x02, 0x76, 0x03, 0xFE, 0x00, + //480 + 0xFE, 0x67, 0x00, 0x7C, 0xC7, 0xF1, 0x8E, 0xC6, 0x3B, 0xE0, 0x3F, 0x84, 0xF3, 0x19, 0xD8, 0x03, 0x99, 0xFC, 0x09, 0xB8, 0x0F, 0xF8, 0x00, 0x9D, 0x24, 0x61, 0xF9, 0x0D, 0x00, 0xFD, 0x03, 0xF0, + //4a0 + 0x1F, 0x90, 0x3F, 0x01, 0xF8, 0x1F, 0xD0, 0x0F, 0xF8, 0x37, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x00, 0xFA, 0x03, 0xF0, 0x0F, 0x80, 0xFF, 0x01, + //4c0 + 0xB8, 0x07, 0xF0, 0x01, 0xFC, 0x01, 0xBC, 0x80, 0x13, 0x1E, 0x00, 0x7F, 0xE1, 0x40, 0x7F, 0xA0, 0x7F, 0xB0, 0x00, 0x3F, 0xC0, 0x1F, 0xC0, 0x38, 0x0F, 0xF0, 0x1F, 0x80, 0xFF, 0x01, 0xFC, 0x03, + //4e0 0xF1, 0x7E, 0x01, 0xFE, 0x01, 0xF0, 0xFF, 0x00, 0x7F, 0xC0, 0x1D, 0x07, 0xF0, 0x0F, 0xC0, 0x7E, 0x06, 0xE0, 0x07, 0xE0, 0x0F, 0xF8, 0x06, 0xC1, 0xFE, 0x01, 0xFC, 0x03, 0xE0, 0x0F, 0x00, 0xFC]; /** @@ -2309,34 +2592,33 @@ * * @return {Array} */ - let SetMouthThroat = (mouth, throat) => { let trans = (factor, initialFrequency) => { return (factor * initialFrequency >> 8 & 0xFF) << 1; }; - let freqdata = [[], [], []]; frequencyData.map((v, i) => { freqdata[0][i] = v & 0xFF; freqdata[1][i] = v >> 8 & 0xFF; freqdata[2][i] = v >> 16 & 0xFF; - }); // recalculate formant frequencies 5..29 for the mouth (F1) and throat (F2) + }); + // recalculate formant frequencies 5..29 for the mouth (F1) and throat (F2) for (let pos = 5; pos < 30; pos++) { // recalculate mouth frequency - freqdata[0][pos] = trans(mouth, freqdata[0][pos]); // recalculate throat frequency + freqdata[0][pos] = trans(mouth, freqdata[0][pos]); + // recalculate throat frequency freqdata[1][pos] = trans(throat, freqdata[1][pos]); - } // recalculate formant frequencies 48..53 - + } + // recalculate formant frequencies 48..53 for (let pos = 48; pos < 54; pos++) { // recalculate F1 (mouth formant) - freqdata[0][pos] = trans(mouth, freqdata[0][pos]); // recalculate F2 (throat formant) - + freqdata[0][pos] = trans(mouth, freqdata[0][pos]); + // recalculate F2 (throat formant) freqdata[1][pos] = trans(throat, freqdata[1][pos]); } - return freqdata; }; @@ -2382,7 +2664,6 @@ * * @return {Number} */ - let CreateTransitions = (pitches, frequency, amplitude, tuples) => { // 0=pitches // 1=frequency1 @@ -2392,64 +2673,58 @@ // 5=amplitude2 // 6=amplitude3 let tables = [pitches, frequency[0], frequency[1], frequency[2], amplitude[0], amplitude[1], amplitude[2]]; - let Read = (table, pos) => { { if (table < 0 || table > tables.length - 1) { - throw new Error("Error invalid table in Read: ".concat(table)); + throw new Error(`Error invalid table in Read: ${table}`); } } - return tables[table][pos]; - }; // linearly interpolate values - + }; + // linearly interpolate values let interpolate = (width, table, frame, change) => { let sign = change < 0; let remainder = Math.abs(change) % width; let div = change / width | 0; let error = 0; let pos = width; - while (--pos > 0) { let val = Read(table, frame) + div; error += remainder; - if (error >= width) { // accumulated a whole integer error, so adjust output error -= width; - if (sign) { val--; } else if (val) { // if input is 0, we always leave it alone val++; } - } // Write updated value back to next frame. - + } + // Write updated value back to next frame. { if (table < 0 || table > tables.length - 1) { - throw new Error("Error invalid table in Read: ".concat(table)); + throw new Error(`Error invalid table in Read: ${table}`); } } - tables[table][++frame] = val; val += div; } }; - let outBlendFrames; let inBlendFrames; let boundary = 0; - for (let pos = 0; pos < tuples.length - 1; pos++) { let phoneme = tuples[pos][0]; - let next_phoneme = tuples[pos + 1][0]; // get the ranking of each phoneme + let next_phoneme = tuples[pos + 1][0]; + // get the ranking of each phoneme let next_rank = blendRank[next_phoneme]; - let rank = blendRank[phoneme]; // compare the rank - lower rank value is stronger + let rank = blendRank[phoneme]; + // compare the rank - lower rank value is stronger if (rank === next_rank) { // same rank, so use out blend lengths from each phoneme outBlendFrames = outBlendLength[phoneme]; @@ -2464,7 +2739,6 @@ outBlendFrames = outBlendLength[phoneme]; inBlendFrames = inBlendLength[phoneme]; } - boundary += tuples[pos][1]; let trans_end = boundary + inBlendFrames; let trans_start = boundary - outBlendFrames; @@ -2474,13 +2748,13 @@ // unlike the other values, the pitches[] interpolates from // the middle of the current phoneme to the middle of the // next phoneme + // half the width of the current and next phoneme let cur_width = tuples[pos][1] >> 1; let next_width = tuples[pos + 1][1] >> 1; - let pitch = pitches[boundary + next_width] - pitches[boundary - cur_width]; // interpolate the values - + let pitch = pitches[boundary + next_width] - pitches[boundary - cur_width]; + // interpolate the values interpolate(cur_width + next_width, 0, trans_start, pitch); - for (let table = 1; table < 7; table++) { // tables: // 0 pitches @@ -2494,14 +2768,15 @@ interpolate(trans_length, table, trans_start, value); } } - } // add the length of last phoneme - + } + // add the length of last phoneme return boundary + tuples[tuples.length - 1][1]; }; let RISING_INFLECTION = 255; let FALLING_INFLECTION = 1; + /** CREATE FRAMES * * The length parameter in the list corresponds to the number of frames @@ -2525,7 +2800,6 @@ * * @return Array */ - let CreateFrames = (pitch, tuples, frequencyData) => { /** * Create a rising or falling inflection 30 frames prior to index X. @@ -2534,78 +2808,62 @@ let AddInflection = (inflection, pos, pitches) => { // store the location of the punctuation let end = pos; - if (pos < 30) { pos = 0; } else { pos -= 30; } - - let A; // FIXME: Explain this fix better, it's not obvious + let A; + // FIXME: Explain this fix better, it's not obvious // ML : A =, fixes a problem with invalid pitch with '.' - while ((A = pitches[pos]) === 127) { ++pos; } - while (pos !== end) { // add the inflection direction - A += inflection; // set the inflection + A += inflection; + // set the inflection pitches[pos] = A & 0xFF; - - while (++pos !== end && pitches[pos] === 255) { - /* keep looping */ - } + while (++pos !== end && pitches[pos] === 255) {/* keep looping */} } }; - let pitches = []; let frequency = [[], [], []]; let amplitude = [[], [], []]; let sampledConsonantFlag = []; let X = 0; - for (let i = 0; i < tuples.length; i++) { // get the phoneme at the index let phoneme = tuples[i][0]; - if (phoneme === PHONEME_PERIOD) { AddInflection(FALLING_INFLECTION, X, pitches); } else if (phoneme === PHONEME_QUESTION) { AddInflection(RISING_INFLECTION, X, pitches); - } // get the stress amount (more stress = higher pitch) - + } - let phase1 = stressPitch_tab47492[tuples[i][2]]; // get number of frames to write + // get the stress amount (more stress = higher pitch) + let phase1 = stressPitch_tab47492[tuples[i][2]]; + // get number of frames to write // copy from the source to the frames list - for (let frames = tuples[i][1]; frames > 0; frames--) { frequency[0][X] = frequencyData[0][phoneme]; // F1 frequency - frequency[1][X] = frequencyData[1][phoneme]; // F2 frequency - frequency[2][X] = frequencyData[2][phoneme]; // F3 frequency - amplitude[0][X] = ampldata[phoneme] & 0xFF; // F1 amplitude - amplitude[1][X] = ampldata[phoneme] >> 8 & 0xFF; // F2 amplitude - amplitude[2][X] = ampldata[phoneme] >> 16 & 0xFF; // F3 amplitude - sampledConsonantFlag[X] = sampledConsonantFlags[phoneme]; // phoneme data for sampled consonants - pitches[X] = pitch + phase1 & 0xFF; // pitch - X++; } } - return [pitches, frequency, amplitude, sampledConsonantFlag]; }; let PrepareFrames = (phonemes, pitch, mouth, throat, singmode) => { let freqdata = SetMouthThroat(mouth, throat); + /** * RENDER THE PHONEMES IN THE LIST * @@ -2623,7 +2881,6 @@ const [pitches, frequency, amplitude, sampledConsonantFlag] = CreateFrames(pitch, phonemes, freqdata); let t = CreateTransitions(pitches, frequency, amplitude, phonemes); - if (!singmode) { /* ASSIGN PITCH CONTOUR * @@ -2637,72 +2894,68 @@ pitches[i] -= frequency[0][i] >> 1; } } + /* * RESCALE AMPLITUDE * * Rescale volume from decibels to the linear scale. */ - - let amplitudeRescale = [0x00, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06, 0x08, 0x09, 0x0B, 0x0D, 0x0F]; - for (let i = amplitude[0].length - 1; i >= 0; i--) { amplitude[0][i] = amplitudeRescale[amplitude[0][i]]; amplitude[1][i] = amplitudeRescale[amplitude[1][i]]; amplitude[2][i] = amplitudeRescale[amplitude[2][i]]; } - let result = [t, frequency, pitches, amplitude, sampledConsonantFlag]; - return result; }; let CreateOutputBuffer = buffersize => { let buffer = new Uint8Array(buffersize); let bufferpos = 0; - let oldTimeTableIndex = 0; // Scale by 16 and write five times. - + let oldTimeTableIndex = 0; + // Scale by 16 and write five times. let writer = (index, A) => { let scaled = (A & 15) * 16; writer.ary(index, [scaled, scaled, scaled, scaled, scaled]); - }; // Write the five given values. - - + }; + // Write the five given values. writer.ary = (index, array) => { // timetable for more accurate c64 simulation - let timetable = [[162, 167, 167, 127, 128], // formants synth - [226, 60, 60, 0, 0], // unvoiced sample 0 - [225, 60, 59, 0, 0], // unvoiced sample 1 - [200, 0, 0, 54, 55], // voiced sample 0 + let timetable = [[162, 167, 167, 127, 128], + // formants synth + [226, 60, 60, 0, 0], + // unvoiced sample 0 + [225, 60, 59, 0, 0], + // unvoiced sample 1 + [200, 0, 0, 54, 55], + // voiced sample 0 [199, 0, 0, 54, 54] // voiced sample 1 ]; bufferpos += timetable[oldTimeTableIndex][index]; - if ((bufferpos / 50 | 0) > buffer.length) { { - throw new Error("Buffer overflow, want ".concat(bufferpos / 50 | 0, " but buffersize is only ").concat(buffer.length, "!")); + throw new Error(`Buffer overflow, want ${bufferpos / 50 | 0} but buffersize is only ${buffer.length}!`); } } - - oldTimeTableIndex = index; // write a little bit in advance - + oldTimeTableIndex = index; + // write a little bit in advance for (let k = 0; k < 5; k++) { buffer[(bufferpos / 50 | 0) + k] = array[k]; } }; - writer.get = () => { - return buffer.slice(0, bufferpos / 50 | 0); }; - return writer; }; let RenderSample = (Output, lastSampleOffset, consonantFlag, pitch) => { // mask low three bits and subtract 1 get value to // convert 0 bits on unvoiced samples. - let kind = (consonantFlag & 7) - 1; // determine which value to use from table { 0x18, 0x1A, 0x17, 0x17, 0x17 } + let kind = (consonantFlag & 7) - 1; + + // determine which value to use from table { 0x18, 0x1A, 0x17, 0x17, 0x17 } // T', S, Z 0 0x18 coronal // CH', J', SH, ZH 1 0x1A palato-alveolar // P', F, V, TH, DH 2 0x17 [labio]dental @@ -2710,53 +2963,43 @@ // /X 4 0x17 glottal let samplePage = kind * 256 & 0xFFFF; // unsigned short - let off = consonantFlag & 248; // unsigned char let renderSample = (index1, value1, index0, value0) => { let bit = 8; let sample = sampleTable[samplePage + off]; - do { if ((sample & 128) !== 0) { Output(index1, value1); } else { Output(index0, value0); } - sample <<= 1; } while (--bit); }; - if (off === 0) { // voiced phoneme: Z*, ZH, V*, DH let phase1 = pitch >> 4 ^ 255 & 0xFF; // unsigned char - off = lastSampleOffset & 0xFF; // unsigned char - do { renderSample(3, 26, 4, 6); off++; off &= 0xFF; } while (++phase1 & 0xFF); - return off; - } // unvoiced - - + } + // unvoiced off = off ^ 255 & 0xFF; // unsigned char - let value0 = sampledConsonantValues0[kind] & 0xFF; // unsigned char - do { renderSample(2, 5, 1, value0); } while (++off & 0xFF); - return lastSampleOffset; - }; // Removed sine table stored a pre calculated sine wave but in modern CPU, we can calculate inline. - + }; + // Removed sine table stored a pre calculated sine wave but in modern CPU, we can calculate inline. let sinus = x => Math.sin(2 * Math.PI * (x / 256)) * 127 | 0; + /** * PROCESS THE FRAMES * @@ -2767,8 +3010,6 @@ * To simulate them being driven by the glottal pulse, the waveforms are * reset at the beginning of each glottal pulse. */ - - let ProcessFrames = (Output, frameCount, speed, frequency, pitches, amplitude, sampledConsonantFlag) => { let speedcounter = speed; let phase1 = 0; @@ -2778,13 +3019,13 @@ let pos = 0; let glottal_pulse = pitches[0]; let mem38 = glottal_pulse * .75 | 0; - while (frameCount) { - let flags = sampledConsonantFlag[pos]; // unvoiced sampled phoneme? + let flags = sampledConsonantFlag[pos]; + // unvoiced sampled phoneme? if ((flags & 248) !== 0) { - lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); // skip ahead two in the phoneme buffer - + lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); + // skip ahead two in the phoneme buffer pos += 2; frameCount -= 2; speedcounter = speed; @@ -2793,104 +3034,66 @@ // Rectangle wave consisting of: // 0-128 = 0x90 // 128-255 = 0x70 + // simulate the glottal pulse and formants let ary = []; - let - /* unsigned int */ - p1 = phase1 * 256; // Fixed point integers because we need to divide later on - - let - /* unsigned int */ - p2 = phase2 * 256; - let - /* unsigned int */ - p3 = phase3 * 256; - + let /* unsigned int */p1 = phase1 * 256; // Fixed point integers because we need to divide later on + let /* unsigned int */p2 = phase2 * 256; + let /* unsigned int */p3 = phase3 * 256; for (let k = 0; k < 5; k++) { - const - /* signed char */ - sp1 = sinus(0xff & p1 >> 8); - const - /* signed char */ - sp2 = sinus(0xff & p2 >> 8); - const - /* signed char */ - rp3 = (0xff & p3 >> 8) < 129 ? -0x70 : 0x70; - const - /* signed int */ - sin1 = sp1 * ( - /* (unsigned char) */ - amplitude[0][pos] & 0x0F); - const - /* signed int */ - sin2 = sp2 * ( - /* (unsigned char) */ - amplitude[1][pos] & 0x0F); - const - /* signed int */ - rect = rp3 * ( - /* (unsigned char) */ - amplitude[2][pos] & 0x0F); - let - /* signed int */ - mux = sin1 + sin2 + rect; + const /* signed char */sp1 = sinus(0xff & p1 >> 8); + const /* signed char */sp2 = sinus(0xff & p2 >> 8); + const /* signed char */rp3 = (0xff & p3 >> 8) < 129 ? -0x70 : 0x70; + const /* signed int */sin1 = sp1 * ( /* (unsigned char) */amplitude[0][pos] & 0x0F); + const /* signed int */sin2 = sp2 * ( /* (unsigned char) */amplitude[1][pos] & 0x0F); + const /* signed int */rect = rp3 * ( /* (unsigned char) */amplitude[2][pos] & 0x0F); + let /* signed int */mux = sin1 + sin2 + rect; mux /= 32; mux += 128; // Go from signed to unsigned amplitude - ary[k] = mux | 0; p1 += frequency[0][pos] * 256 / 4; // Compromise, this becomes a shift and works well - p2 += frequency[1][pos] * 256 / 4; p3 += frequency[2][pos] * 256 / 4; } - Output.ary(0, ary); } speedcounter--; - if (speedcounter === 0) { pos++; //go to next amplitude // decrement the frame count - frameCount--; - if (frameCount === 0) { return; } - speedcounter = speed; } - glottal_pulse--; - if (glottal_pulse !== 0) { // not finished with a glottal pulse - mem38--; // within the first 75% of the glottal pulse? - // is the count non-zero and the sampled flag is zero? + mem38--; + // within the first 75% of the glottal pulse? + // is the count non-zero and the sampled flag is zero? if (mem38 !== 0 || flags === 0) { // update the phase of the formants // TODO: we should have a switch to disable this, it causes a pretty nice voice without the masking! phase1 = phase1 + frequency[0][pos]; // & 0xFF; - phase2 = phase2 + frequency[1][pos]; // & 0xFF; - phase3 = phase3 + frequency[2][pos]; // & 0xFF; - continue; - } // voiced sampled phonemes interleave the sample with the + } + + // voiced sampled phonemes interleave the sample with the // glottal pulse. The sample flag is non-zero, so render // the sample for the phoneme. - - lastSampleOffset = RenderSample(Output, lastSampleOffset, flags, pitches[pos & 0xFF]); } } - glottal_pulse = pitches[pos]; - mem38 = glottal_pulse * .75 | 0; // reset the formant wave generators to keep them in - // sync with the glottal pulse + mem38 = glottal_pulse * .75 | 0; + // reset the formant wave generators to keep them in + // sync with the glottal pulse phase1 = 0; phase2 = 0; phase3 = 0; @@ -2907,44 +3110,38 @@ * * @return Uint8Array */ - let Renderer = (phonemes, pitch, mouth, throat, speed, singmode) => { pitch = pitch === undefined ? 64 : pitch & 0xFF; mouth = mouth === undefined ? 128 : mouth & 0xFF; throat = throat === undefined ? 128 : throat & 0xFF; speed = (speed || 72) & 0xFF; singmode = singmode || false; - let sentences = PrepareFrames(phonemes, pitch, mouth, throat, singmode); // Reserve 176.4*speed samples (=8*speed ms) for each frame. + let sentences = PrepareFrames(phonemes, pitch, mouth, throat, singmode); + // Reserve 176.4*speed samples (=8*speed ms) for each frame. let Output = CreateOutputBuffer(176.4 // = (22050/125) * phonemes.reduce((pre, v) => pre + v[1], 0) // Combined phoneme length in frames. * speed | 0); const [t, frequency, pitches, amplitude, sampledConsonantFlag] = sentences; - { PrintOutput(pitches, frequency, amplitude, sampledConsonantFlag); } - ProcessFrames(Output, t, speed, frequency, pitches, amplitude, sampledConsonantFlag); return Output.get(); }; - let PrintOutput = (pitches, frequency, amplitude, sampledConsonantFlag) => { let pad = num => { let s = '00000' + num; return s.substr(s.length - 5); }; - console.log('==========================================='); console.log('Final data for speech output:'); console.log(' flags ampl1 freq1 ampl2 freq2 ampl3 freq3 pitch'); console.log('------------------------------------------------'); - for (let i = 0; i < sampledConsonantFlag.length; i++) { console.log(' %s %s %s %s %s %s %s %s', pad(sampledConsonantFlag[i]), pad(amplitude[0][i]), pad(frequency[0][i]), pad(amplitude[1][i]), pad(frequency[1][i]), pad(amplitude[2][i]), pad(frequency[2][i]), pad(pitches[i])); i++; } - console.log('==========================================='); }; @@ -2962,16 +3159,14 @@ * * @return {Float32Array|Boolean} */ - let SamBuffer = (input, options) => { let buffer = SamProcess(input, options); - if (false === buffer) { return false; } - return Uint8ArrayToFloat32Array(buffer); }; + /** * Process the input and return the audiobuffer. * @@ -2986,21 +3181,19 @@ * * @return {Uint8Array|Boolean} */ - let SamProcess = function (input) { let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; let parsed = Parser(input); - if (false === parsed) { return false; } - return Renderer(parsed, options.pitch, options.mouth, options.throat, options.speed, options.singmode); }; let convert = TextToPhonemes; let buf8 = SamProcess; let buf32 = SamBuffer; + /** * @param {object} [options] * @param {Boolean} [options.phonetic] Default false. @@ -3013,17 +3206,15 @@ * * @constructor */ - function SamJs(options) { let opts = options || {}; - let ensurePhonetic = (text, phonetic) => { if (!(phonetic || opts.phonetic)) { return convert(text); } - return text.toUpperCase(); }; + /** * Render the passed text as 8bit wave buffer array. * @@ -3032,9 +3223,8 @@ * * @return {Uint8Array|Boolean} */ - - this.buf8 = (text, phonetic) => buf8(ensurePhonetic(text, phonetic), opts); + /** * Render the passed text as 32bit wave buffer array. * @@ -3043,9 +3233,8 @@ * * @return {Float32Array|Boolean} */ - - this.buf32 = (text, phonetic) => buf32(ensurePhonetic(text, phonetic), opts); + /** * Render the passed text as wave buffer and play it over the speakers. * @@ -3054,9 +3243,8 @@ * * @return {Promise} */ - - this.speak = (text, phonetic) => PlayBuffer(this.buf32(text, phonetic)); + /** * Render the passed text as wave buffer and download it via URL API. * @@ -3065,11 +3253,10 @@ * * @return void */ - - this.download = (text, phonetic) => { RenderBuffer(this.buf8(text, phonetic)); }; + /** * Render the passed text as wave buffer array. * @@ -3078,11 +3265,8 @@ * * @return {Uint8Array|false} */ - - this.wav = (text, phonetic) => ToWavBuffer(this.buf8(text, phonetic)); } - SamJs.buf8 = buf8; SamJs.buf32 = buf32; SamJs.convert = convert; diff --git a/dist/samjs.min.js b/dist/samjs.min.js index 1d2a044..6cf84b9 100644 --- a/dist/samjs.min.js +++ b/dist/samjs.min.js @@ -9,5 +9,5 @@ * * @author 2017 Christian Schiffler */ -function H(){"use strict";let Y=(H,e)=>0!=(H&e),r=H=>{let A=new Uint8Array(H.length);return H.split("").forEach((H,e)=>{A[e]=H.charCodeAt(0)}),A},t=H=>{let e=new Uint8Array(4);return e[0]=H,e[1]=H>>8,e[2]=H>>16,e[3]=H>>24,e},O=H=>{let e=new Uint8Array(2);return e[0]=H,e[1]=H>>8,e},I=null,R=H=>{let e=new Uint8Array(44+H.length),A=0;var E=H=>{e.set(H,A),A+=H.length};return E(r("RIFF")),E(t(H.length+12+16+8-8)),E(r("WAVE")),E(r("fmt ")),E(t(16)),E(O(1)),E(O(1)),E(t(22050)),E(t(22050)),E(O(1)),E(O(8)),E(r("data")),E(t(H.length)),E(H),e},l={" ":0,"!":2,'"':2,"#":2,$:2,"%":2,"&":2,"'":130,"(":0,")":0,"*":2,"+":2,",":2,"-":2,".":2,"/":2,0:3,1:3,2:3,3:3,4:3,5:3,6:3,7:3,8:3,9:3,":":2,";":2,"<":2,"=":2,">":2,"?":2,"@":2,A:192,B:168,C:176,D:172,E:192,F:160,G:184,H:160,I:192,J:188,K:160,L:172,M:168,N:172,O:192,P:160,Q:160,R:172,S:180,T:164,U:192,V:168,W:168,X:176,Y:192,Z:188,"[":0,"\\":0,"]":0,"^":2,_:0,"`":32},n=128,U=(H,e)=>0!=(l[H]&e),N=(H,e,A)=>U(H[e],A),W=(H,e)=>-1!==e.indexOf(H),A=H=>{let e=H.split("="),E=e.pop(),A=e.join("=").split("("),r=A.pop().split(")"),t=A[0],O=r[0],R=r[1],I=["T","C","S"],l=["E","I","Y"];return(H=(H,e,A)=>{if(H.startsWith(O,e)&&((e,A)=>{for(let H=t.length-1;-1!N(e,--A,n),"#":()=>N(e,--A,64),".":()=>N(e,--A,8),"&":()=>N(e,--A,16)||W(e.substr(--A,2),["CH","SH"]),"@":()=>{if(N(e,--A,4))return!0;var H=e[A];return"H"===H&&!!W(H,I)},"^":()=>N(e,--A,32),"+":()=>W(e[--A],l),":":()=>{for(;0<=A&&N(e,A-1,32);)A--;return!0}}[E]())return!1}return!0})(H,e)&&((e,A)=>{for(let H=0;H!N(e,++A,n),"#":()=>N(e,++A,64),".":()=>N(e,++A,8),"&":()=>N(e,++A,16)||W(e.substr(++A-2,2),["HC","HS"]),"@":()=>{if(N(e,++A,4))return!0;var H=e[A];return"H"===H&&!!W(H,I)},"^":()=>N(e,++A,32),"+":()=>W(e[++A],l),":":()=>{for(;N(e,A+1,32);)A++;return!0},"%":()=>"E"!==e[A+1]?"ING"===e.substr(A+1,3)&&(A+=3,!0):N(e,A+2,n)?W(e[A+2],["R","S","D"])?(A+=2,!0):"L"!==e[A+2]?"FUL"===e.substr(A+2,3)&&(A+=4,!0):"Y"===e[A+3]&&(A+=3,!0):(A++,!0)}[E]())return!1}return!0})(H,e+(O.length-1)))return A(E,O.length),!0}).c=O[0],H},S={},f=(" (A.)=EH4Y. |(A) =AH| (ARE) =AAR| (AR)O=AXR|(AR)#=EH4R| ^(AS)#=EY4S|(A)WA=AX|(AW)=AO5| :(ANY)=EH4NIY|(A)^+#=EY5|#:(ALLY)=ULIY| (AL)#=UL|(AGAIN)=AXGEH4N|#:(AG)E=IHJ|(A)^%=EY|(A)^+:#=AE| :(A)^+ =EY4| (ARR)=AXR|(ARR)=AE4R| ^(AR) =AA5R|(AR)=AA5R|(AIR)=EH4R|(AI)=EY4|(AY)=EY5|(AU)=AO4|#:(AL) =UL|#:(ALS) =ULZ|(ALK)=AO4K|(AL)^=AOL| :(ABLE)=EY4BUL|(ABLE)=AXBUL|(A)VO=EY4|(ANG)+=EY4NJ|(ATARI)=AHTAA4RIY|(A)TOM=AE|(A)TTI=AE| (AT) =AET| (A)T=AH|(A)=AE| (B) =BIY4| (BE)^#=BIH|(BEING)=BIY4IHNX| (BOTH) =BOW4TH| (BUS)#=BIH4Z|(BREAK)=BREY5K|(BUIL)=BIH4L|(B)=B| (C) =SIY4| (CH)^=K|^E(CH)=K|(CHA)R#=KEH5|(CH)=CH| S(CI)#=SAY4|(CI)A=SH|(CI)O=SH|(CI)EN=SH|(CITY)=SIHTIY|(C)+=S|(CK)=K|(COMMODORE)=KAA4MAHDOHR|(COM)=KAHM|(CUIT)=KIHT|(CREA)=KRIYEY|(C)=K| (D) =DIY4| (DR.) =DAA4KTER|#:(DED) =DIHD|.E(D) =D|#:^E(D) =T| (DE)^#=DIH| (DO) =DUW| (DOES)=DAHZ|(DONE) =DAH5N|(DOING)=DUW4IHNX| (DOW)=DAW|#(DU)A=JUW|#(DU)^#=JAX|(D)=D| (E) =IYIY4|#:(E) =|':^(E) =| :(E) =IY|#(ED) =D|#:(E)D =|(EV)ER=EH4V|(E)^%=IY4|(ERI)#=IY4RIY|(ERI)=EH4RIH|#:(ER)#=ER|(ERROR)=EH4ROHR|(ERASE)=IHREY5S|(ER)#=EHR|(ER)=ER| (EVEN)=IYVEHN|#:(E)W=|@(EW)=UW|(EW)=YUW|(E)O=IY|#:&(ES) =IHZ|#:(E)S =|#:(ELY) =LIY|#:(EMENT)=MEHNT|(EFUL)=FUHL|(EE)=IY4|(EARN)=ER5N| (EAR)^=ER5|(EAD)=EHD|#:(EA) =IYAX|(EA)SU=EH5|(EA)=IY5|(EIGH)=EY4|(EI)=IY4| (EYE)=AY4|(EY)=IY|(EU)=YUW5|(EQUAL)=IY4KWUL|(E)=EH| (F) =EH4F|(FUL)=FUHL|(FRIEND)=FREH5ND|(FATHER)=FAA4DHER|(F)F=|(F)=F| (G) =JIY4|(GIV)=GIH5V| (G)I^=G|(GE)T=GEH5|SU(GGES)=GJEH4S|(GG)=G| B#(G)=G|(G)+=J|(GREAT)=GREY4T|(GON)E=GAO5N|#(GH)=| (GN)=N|(G)=G| (H) =EY4CH| (HAV)=/HAE6V| (HERE)=/HIYR| (HOUR)=AW5ER|(HOW)=/HAW|(H)#=/H|(H)=| (IN)=IHN| (I) =AY4|(I) =AY|(IN)D=AY5N|SEM(I)=IY| ANT(I)=AY|(IER)=IYER|#:R(IED) =IYD|(IED) =AY5D|(IEN)=IYEHN|(IE)T=AY4EH|(I')=AY5| :(I)^%=AY5| :(IE) =AY4|(I)%=IY|(IE)=IY4| (IDEA)=AYDIY5AH|(I)^+:#=IH|(IR)#=AYR|(IZ)%=AYZ|(IS)%=AYZ|I^(I)^#=IH|+^(I)^+=AY|#:^(I)^+=IH|(I)^+=AY|(IR)=ER|(IGH)=AY4|(ILD)=AY5LD| (IGN)=IHGN|(IGN) =AY4N|(IGN)^=AY4N|(IGN)%=AY4N|(ICRO)=AY4KROH|(IQUE)=IY4K|(I)=IH| (J) =JEY4|(J)=J| (K) =KEY4| (K)N=|(K)=K| (L) =EH4L|(LO)C#=LOW|L(L)=|#:^(L)%=UL|(LEAD)=LIYD| (LAUGH)=LAE4F|(L)=L| (M) =EH4M| (MR.) =MIH4STER| (MS.)=MIH5Z| (MRS.) =MIH4SIXZ|(MOV)=MUW4V|(MACHIN)=MAHSHIY5N|M(M)=|(M)=M| (N) =EH4N|E(NG)+=NJ|(NG)R=NXG|(NG)#=NXG|(NGL)%=NXGUL|(NG)=NX|(NK)=NXK| (NOW) =NAW4|N(N)=|(NON)E=NAH4N|(N)=N| (O) =OH4W|(OF) =AHV| (OH) =OW5|(OROUGH)=ER4OW|#:(OR) =ER|#:(ORS) =ERZ|(OR)=AOR| (ONE)=WAHN|#(ONE) =WAHN|(OW)=OW| (OVER)=OW5VER|PR(O)V=UW4|(OV)=AH4V|(O)^%=OW5|(O)^EN=OW|(O)^I#=OW5|(OL)D=OW4L|(OUGHT)=AO5T|(OUGH)=AH5F| (OU)=AW|H(OU)S#=AW4|(OUS)=AXS|(OUR)=OHR|(OULD)=UH5D|(OU)^L=AH5|(OUP)=UW5P|(OU)=AW|(OY)=OY|(OING)=OW4IHNX|(OI)=OY5|(OOR)=OH5R|(OOK)=UH5K|F(OOD)=UW5D|L(OOD)=AH5D|M(OOD)=UW5D|(OOD)=UH5D|F(OOT)=UH5T|(OO)=UW5|(O')=OH|(O)E=OW|(O) =OW|(OA)=OW4| (ONLY)=OW4NLIY| (ONCE)=WAH4NS|(ON'T)=OW4NT|C(O)N=AA|(O)NG=AO| :^(O)N=AH|I(ON)=UN|#:(ON)=UN|#^(ON)=UN|(O)ST=OW|(OF)^=AO4F|(OTHER)=AH5DHER|R(O)B=RAA|^R(O):#=OW5|(OSS) =AO5S|#:^(OM)=AHM|(O)=AA| (P) =PIY4|(PH)=F|(PEOPL)=PIY5PUL|(POW)=PAW4|(PUT) =PUHT|(P)P=|(P)S=|(P)N=|(PROF.)=PROHFEH4SER|(P)=P| (Q) =KYUW4|(QUAR)=KWOH5R|(QU)=KW|(Q)=K| (R) =AA5R| (RE)^#=RIY|(R)R=|(R)=R| (S) =EH4S|(SH)=SH|#(SION)=ZHUN|(SOME)=SAHM|#(SUR)#=ZHER|(SUR)#=SHER|#(SU)#=ZHUW|#(SSU)#=SHUW|#(SED)=ZD|#(S)#=Z|(SAID)=SEHD|^(SION)=SHUN|(S)S=|.(S) =Z|#:.E(S) =Z|#:^#(S) =S|U(S) =S| :#(S) =Z|##(S) =Z| (SCH)=SK|(S)C+=|#(SM)=ZUM|#(SN)'=ZUM|(STLE)=SUL|(S)=S| (T) =TIY4| (THE) #=DHIY| (THE) =DHAX|(TO) =TUX| (THAT)=DHAET| (THIS) =DHIHS| (THEY)=DHEY| (THERE)=DHEHR|(THER)=DHER|(THEIR)=DHEHR| (THAN) =DHAEN| (THEM) =DHAEN|(THESE) =DHIYZ| (THEN)=DHEHN|(THROUGH)=THRUW4|(THOSE)=DHOHZ|(THOUGH) =DHOW|(TODAY)=TUXDEY|(TOMO)RROW=TUMAA5|(TO)TAL=TOW5| (THUS)=DHAH4S|(TH)=TH|#:(TED)=TIXD|S(TI)#N=CH|(TI)O=SH|(TI)A=SH|(TIEN)=SHUN|(TUR)#=CHER|(TU)A=CHUW| (TWO)=TUW|&(T)EN =|(T)=T| (U) =YUW4| (UN)I=YUWN| (UN)=AHN| (UPON)=AXPAON|@(UR)#=UH4R|(UR)#=YUH4R|(UR)=ER|(U)^ =AH|(U)^^=AH5|(UY)=AY5| G(U)#=|G(U)%=|G(U)#=W|#N(U)=YUW|@(U)=UW|(U)=YUW| (V) =VIY4|(VIEW)=VYUW5|(V)=V| (W) =DAH4BULYUW| (WERE)=WER|(WA)SH=WAA|(WA)ST=WEY|(WA)S=WAH|(WA)T=WAA|(WHERE)=WHEHR|(WHAT)=WHAHT|(WHOL)=/HOWL|(WHO)=/HUW|(WH)=WH|(WAR)#=WEHR|(WAR)=WAOR|(WOR)^=WER|(WR)=R|(WOM)A=WUHM|(WOM)E=WIHM|(WEA)R=WEH|(WANT)=WAA5NT|ANS(WER)=ER|(W)=W| (X) =EH4KR| (X)=Z|(X)=KS| (Y) =WAY4|(YOUNG)=YAHNX| (YOUR)=YOHR| (YOU)=YUW| (YES)=YEHS| (Y)=Y|F(Y)=AY|PS(YCH)=AYK|#:^(Y)=IY|#:^(Y)I=IY| :(Y) =AY| :(Y)#=AY| :(Y)^+:#=IH| :(Y)^#=AY|(Y)=IH| (Z) =ZIY4|(Z)=Z".split("|").map(H=>{var e=(H=A(H)).c;S[e]=S[e]||[],S[e].push(H)}),'(A)=|(!)=.|(") =-AH5NKWOWT-|(")=KWOW4T-|(#)= NAH4MBER|($)= DAA4LER|(%)= PERSEH4NT|(&)= AEND|(\')=|(*)= AE4STERIHSK|(+)= PLAH4S|(,)=,| (-) =-|(-)=|(.)= POYNT|(/)= SLAE4SH|(0)= ZIY4ROW| (1ST)=FER4ST| (10TH)=TEH4NTH|(1)= WAH4N| (2ND)=SEH4KUND|(2)= TUW4| (3RD)=THER4D|(3)= THRIY4|(4)= FOH4R| (5TH)=FIH4FTH|(5)= FAY4V| (64) =SIH4KSTIY FOHR|(6)= SIH4KS|(7)= SEH4VUN| (8TH)=EY4TH|(8)= EY4T|(9)= NAY4N|(:)=.|(;)=.|(<)= LEH4S DHAEN|(=)= IY4KWULZ|(>)= GREY4TER DHAEN|(?)=?|(@)= AE6T|(^)= KAE4RIXT'.split("|").map(A)),T="*12345678".split(""),i=" *.*?*,*-*IYIHEHAEAAAHAOUHAXIXERUXOHRXLXWXYXWHR*L*W*Y*M*N*NXDXQ*S*SHF*TH/H/XZ*ZHV*DHCH**J*******EYAYOYAWOWUWB*****D*****G*****GX****P*****T*****K*****KX****ULUMUN".match(/.{1,2}/g),o=[32768,49408,49408,49408,49408,164,164,164,164,164,164,132,132,164,164,132,132,132,132,132,132,132,68,4164,4164,4164,4164,2124,3148,2124,1096,16460,9280,8256,8256,9280,64,64,9284,8260,8260,9284,8264,8256,76,8260,0,0,180,180,180,148,148,148,78,78,78,1102,1102,1102,78,78,78,78,78,78,75,75,75,1099,1099,1099,75,75,75,75,75,75,128,193,193],a=[0,4626,4626,4626,2056,2824,2312,2824,3592,3851,2822,4108,3082,1541,1541,3595,3082,3594,3082,2825,2056,2055,2825,2567,2310,2056,2054,2055,2055,2055,770,1285,514,514,514,514,514,514,1542,1542,2055,1542,1542,514,2312,1027,513,286,3597,3852,3852,3852,3598,3593,2054,513,514,1797,513,257,1798,513,514,1798,513,514,2056,514,514,1540,514,514,1798,513,1028,1798,257,1028,1479,1535],D=(A,E,r)=>{for(let e=0;e{var H=i.findIndex(H=>H===e+A&&"*"!==H[1]);return-1!==H&&H})(t,O)))e++,E(H);else if(!1!==(H=(e=>{var H=i.findIndex(H=>H===e+"*");return-1!==H&&H})(t)))E(H);else{for(H=T.length;t!==T[H]&&0Y(o[H],e),s=128,L=(A,E,r,t)=>{var H=(H,e)=>{switch(H){case 53:u(r(e-1),1024)&&E(e,16);break;case 42:A(e+1,43,t(e));break;case 44:A(e+1,45,t(e))}},e=(H,e)=>{E(H,13),A(H+1,e,t(H))};let O=-1,R;for(;null!==(R=r(++O));)if(0!==R)if(u(R,16))A(O+1,u(R,32)?21:20,t(O)),H(R,O);else if(78===R)e(O,24);else if(79===R)e(O,27);else if(80===R)e(O,28);else if(u(R,s)&&t(O))0===r(O+1)&&null!==(R=r(O+2))&&u(R,s)&&t(O+2)&&A(O+2,31,0);else{var I,l=0===O?null:r(O-1);if(23===R)switch(l){case 69:E(O-1,42);break;case 57:E(O-1,44);break;default:u(l,s)&&E(O,18)}else 24===R&&u(l,s)?E(O,19):60===l&&32===R?E(O,38):60===R?(I=r(O+1),u(I,32)||null===I||E(O,63)):(72===R&&(I=r(O+1),u(I,32)&&null!==I||(E(O,75),R=75)),u(R,1)&&32===l?E(O,R-12):u(R,1)||H(R,O),69!==R&&57!==R||0{for(let H=0;null!==e(H);H++)if(u(e(H),256)){for(var r,t=H;1<--H&&!u(e(H),s););if(0===H)break;for(;H>1)+r+1))}let O=-1,R;for(;null!==(R=e(++O));){let H=O;var I,l;if(u(R,s))R=e(++H),u(R,64)?(I=null===R?65:o[R],Y(I,4)?(l=E(O),A(O,(l>>2)+l+1)):Y(I,1)&&(l=E(O),A(O,l-(l>>3)))):18!==R&&19!==R||!u(e(++H),64)||A(O,E(O)-1);else if(u(R,2048))null!==(R=e(++H))&&u(R,2)&&(A(H,6),A(H-1,5));else if(u(R,2)){for(;0===(R=e(++H)););null!==R&&u(R,2)&&(A(H,1+(E(H)>>1)),A(O,1+(E(O)>>1)))}else 0{let E=0;for(var r;null!==(r=H(E));)u(r,64)&&null!==(r=H(E+1))&&u(r,s)&&0!==(r=e(E+1))&&r<128&&A(E,r+1),++E},v=(H,e,A)=>{let E=0;for(var r;null!==(r=H(E));){var t=e(E);A(E,0===t||127>8),E++}},Z=(A,H,e)=>{let E=-1;for(var r;null!==(r=A(++E));)if(u(r,2)){if(u(r,1)){let H,e=E;for(;0===(H=A(++e)););if(null!==H&&(u(H,8)||36===H||37===H))continue}H(E+1,r+1,e(E),255&a[r+1]),H(E+2,r+2,e(E),255&a[r+2]),E+=2}},P=[24,26,23,23,23],b=[0,224,230,236,243,249,0,6,12,6],d=[0,31,31,31,31,2,2,2,2,2,2,2,2,2,5,5,2,10,2,8,5,5,11,10,9,8,8,160,8,8,23,31,18,18,18,18,30,30,20,20,20,20,23,23,26,26,29,29,2,2,2,2,2,2,26,29,27,26,29,27,26,29,27,26,29,27,23,29,23,23,29,23,23,29,23,23,29,23,23,23],M=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,2,4,4,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,0,1,0,5,5,5,5,5,4,4,2,0,1,2,0,1,2,0,1,2,0,1,2,0,2,2,0,1,3,0,2,3,0,2,160,160],K=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,4,4,3,3,3,3,3,1,2,3,2,1,3,3,3,3,1,1,3,3,3,2,2,3,2,3,0,0,5,5,5,5,4,4,2,0,2,2,0,3,2,0,4,2,0,3,2,0,2,2,0,2,3,0,3,3,0,3,176,160],B=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,226,211,187,124,149,1,2,3,3,0,114,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,25,0,0,0,0,0,0,0,0,0],V=[0,5980947,5980947,5980947,5980947,7230474,6113550,5980947,5783320,5842971,5712919,5775125,5383440,5844244,6113550,4075794,5383182,5774866,4076306,7218448,5250317,6112527,5904395,3944978,7216654,5904395,7230217,5320198,7943686,6641158,7943686,5980945,6506758,6967046,5315078,7946758,6113550,5383440,6107913,6767114,4990984,6106890,6639366,6639366,7946758,6639365,7958022,0,5916691,5777179,5775125,5778203,5774866,5382669,5315078,5315078,5315078,7946758,7946758,7946758,7368198,7237126,7237126,6181894,6181894,6181894,5315078,5315078,5315078,7946758,7946758,7946758,6647046,6641162,7367946,6181894,6181894,6181894,556844,98067],c=[0,0,0,0,0,526861,461581,527630,527887,68879,68623,3087,68367,2316,461581,330508,68623,3087,396301,67597,2061,461838,2061,330252,67597,2061,526861,780,2313,198153,0,0,0,0,0,0,0,0,779,66827,779,1035,0,0,1,66827,920064,66050,593422,68879,3087,68879,3087,2061,2,260,0,2,260,0,1,260,0,1,260,0,0,0,0,0,0,0,0,461324,0,0,330240,0,1245199,1048591],w=[56,132,107,25,198,99,24,134,115,152,198,177,28,202,49,140,199,49,136,194,48,152,70,49,24,198,53,12,202,49,12,198,33,16,36,105,18,194,49,20,196,113,8,74,34,73,171,106,168,172,73,81,50,213,82,136,147,108,148,34,21,84,210,37,150,212,80,165,70,33,8,133,107,24,196,99,16,206,107,24,140,113,25,140,99,53,12,198,51,153,204,108,181,78,162,153,70,33,40,130,149,46,227,48,156,197,48,156,162,177,156,103,49,136,102,89,44,83,24,132,103,80,202,227,10,172,171,48,172,98,48,140,99,16,148,98,177,140,130,40,150,51,152,214,181,76,98,41,165,74,181,156,198,49,20,214,56,156,75,180,134,101,24,174,103,28,166,99,25,150,35,25,132,19,8,166,82,172,202,34,137,110,171,25,140,98,52,196,98,25,134,99,24,196,35,88,214,163,80,66,84,74,173,74,37,17,107,100,137,74,99,57,138,35,49,42,234,162,169,68,197,18,205,66,52,140,98,24,140,99,17,72,102,49,157,68,51,29,70,49,156,198,177,12,205,50,136,196,115,24,134,115,8,214,99,88,7,129,224,240,60,7,135,144,60,124,15,199,192,192,240,124,30,7,128,128,0,28,120,112,241,199,31,192,12,254,28,31,31,14,10,122,192,113,242,131,143,3,15,15,12,0,121,248,97,224,67,15,131,231,24,249,193,19,218,233,99,143,15,131,131,135,195,31,60,112,240,225,225,227,135,184,113,14,32,227,141,72,120,28,147,135,48,225,193,193,228,120,33,131,131,195,135,6,57,229,195,135,7,14,28,28,112,244,113,156,96,54,50,195,30,60,243,143,14,60,112,227,199,143,15,15,14,60,120,240,227,135,6,240,227,7,193,153,135,15,24,120,112,112,252,243,16,177,140,140,49,124,112,225,134,60,100,108,176,225,227,15,35,143,15,30,62,56,60,56,123,143,7,14,60,244,23,30,60,120,242,158,114,73,227,37,54,56,88,57,226,222,60,120,120,225,199,97,225,225,176,240,240,195,199,14,56,192,240,206,115,115,24,52,176,225,199,142,28,60,248,56,240,225,193,139,134,143,28,120,112,240,120,172,177,143,57,49,219,56,97,195,14,14,56,120,115,23,30,57,30,56,100,225,241,193,78,15,64,162,2,197,143,129,161,252,18,8,100,224,60,34,224,69,7,142,12,50,144,240,31,32,73,224,248,12,96,240,23,26,65,170,164,208,141,18,130,30,30,3,248,62,3,12,115,128,112,68,38,3,36,225,62,4,78,4,28,193,9,204,158,144,33,7,144,67,100,192,15,198,144,156,193,91,3,226,29,129,224,94,29,3,132,184,44,15,128,177,131,224,48,65,30,67,137,131,80,252,36,46,19,131,241,124,76,44,201,13,131,176,181,130,228,232,6,156,7,160,153,29,7,62,130,143,112,48,116,64,202,16,228,232,15,146,20,63,6,248,132,136,67,129,10,52,57,65,198,227,28,71,3,176,184,19,10,194,100,248,24,249,96,179,192,101,32,96,166,140,195,129,32,48,38,30,28,56,211,1,176,38,64,244,11,195,66,31,133,50,38,96,64,201,203,1,236,17,40,64,250,4,52,224,112,76,140,29,7,105,3,22,200,4,35,232,198,154,11,26,3,224,118,6,5,207,30,188,88,49,113,102,0,248,63,4,252,12,116,39,138,128,113,194,58,38,6,192,31,5,15,152,64,174,1,127,192,7,255,0,14,254,0,3,223,128,3,239,128,27,241,194,0,231,224,24,252,224,33,252,128,60,252,64,14,126,0,63,62,0,15,254,0,31,255,0,62,240,7,252,0,126,16,63,255,0,63,56,14,124,1,135,12,252,199,0,62,4,15,62,31,15,15,31,15,2,131,135,207,3,135,15,63,192,7,158,96,63,192,3,254,0,63,224,119,225,192,254,224,195,224,1,223,248,3,7,0,126,112,0,124,56,24,254,12,30,120,28,124,62,14,31,30,30,62,0,127,131,7,219,135,131,7,199,7,16,113,255,0,63,226,1,224,193,195,225,0,127,192,5,240,32,248,240,112,254,120,121,248,2,63,12,143,3,15,159,224,193,199,135,3,195,195,176,225,225,193,227,224,113,240,0,252,112,124,12,62,56,14,28,112,195,199,3,129,193,199,231,0,15,199,135,25,9,239,196,51,224,193,252,248,112,240,120,248,240,97,199,0,31,248,1,124,248,240,120,112,60,124,206,14,33,131,207,8,7,143,8,193,135,143,128,199,227,0,7,248,224,239,0,57,247,128,14,248,225,227,248,33,159,192,255,3,248,7,192,31,248,196,4,252,196,193,188,135,240,15,192,127,5,224,37,236,192,62,132,71,240,142,3,248,3,251,192,25,248,7,156,12,23,248,7,224,31,161,252,15,252,1,240,63,0,254,3,240,31,0,253,0,255,136,13,249,1,255,0,112,7,192,62,66,243,13,196,127,128,252,7,240,94,192,63,0,120,63,129,255,1,248,1,195,232,12,228,100,143,228,15,240,7,240,194,31,0,127,192,111,128,126,3,248,7,240,63,192,120,15,130,7,254,34,119,112,2,118,3,254,0,254,103,0,124,199,241,142,198,59,224,63,132,243,25,216,3,153,252,9,184,15,248,0,157,36,97,249,13,0,253,3,240,31,144,63,1,248,31,208,15,248,55,1,248,7,240,15,192,63,0,254,3,248,15,192,63,0,250,3,240,15,128,255,1,184,7,240,1,252,1,188,128,19,30,0,127,225,64,127,160,127,176,0,63,192,31,192,56,15,240,31,128,255,1,252,3,241,126,1,254,1,240,255,0,127,192,29,7,240,15,192,126,6,224,7,224,15,248,6,193,254,1,252,3,224,15,0,252],m=(H,e,A,E,r)=>{const[t,O,R,I]=((A,E,r)=>{var H=(H,e,A)=>{var E=e;e<30?e=0:e-=30;let r;for(;127===(r=A[e]);)++e;for(;e!==E;)for(r+=H,A[e]=255&r;++e!==E&&255===A[e];);};let t=[],O=[[],[],[]],R=[[],[],[]],I=[],l=0;for(let e=0;e>8&255,R[2][l]=c[Y]>>16&255,I[l]=B[Y],t[l]=A+n&255,l++}return[t,O,R,I]})(e,H,((e,A)=>{var E=(H,e)=>(H*e>>8&255)<<1;let r=[[],[],[]];V.map((H,e)=>{r[0][e]=255&H,r[1][e]=H>>8&255,r[2][e]=H>>16&255});for(let H=5;H<30;H++)r[0][H]=E(e,r[0][H]),r[1][H]=E(A,r[1][H]);for(let H=48;H<54;H++)r[0][H]=E(e,r[0][H]),r[1][H]=E(A,r[1][H]);return r})(A,E));if(e=((e,H,A,E)=>{let l=[e,H[0],H[1],H[2],A[0],A[1],A[2]],Y=(H,e)=>l[H][e];var r=(e,A,E,H)=>{var r=H<0,t=Math.abs(H)%e,O=H/e|0;let R=0,I=e;for(;0<--I;){let H=Y(A,E)+O;(R+=t)>=e&&(R-=e,r?H--:H&&H++),l[A][++E]=H,H+=O}};let t,O,R=0;for(let H=0;H>1)+(U=E[H+1][1]>>1),0,S,e[R+U]-e[R-N]);for(let H=1;H<7;H++){var T=Y(H,W)-Y(H,S);r(f,H,S,T)}}}return R+E[E.length-1][1]})(t,O,R,H),!r)for(let H=0;H>1;var l=[0,1,2,2,2,3,3,4,4,5,6,8,9,11,13,15];for(let H=R[0].length-1;0<=H;H--)R[0][H]=l[R[0][H]],R[1][H]=l[R[1][H]],R[2][H]=l[R[2][H]];return[e,O,t,R,I]},y=H=>{let A=new Uint8Array(H),E=0,r=0,t=(H,e)=>{e=16*(15&e),t.ary(H,[e,e,e,e,e])};return t.ary=(H,e)=>{if(((E+=[[162,167,167,127,128],[226,60,60,0,0],[225,60,59,0,0],[200,0,0,54,55],[199,0,0,54,54]][r][H])/50|0)>A.length)throw new Error;r=H;for(let H=0;H<5;H++)A[(E/50|0)+H]=e[H]},t.get=()=>A.slice(0,E/50|0),t},C=(O,e,H,A)=>{var E=(7&H)-1;let R=256*E&65535,I=248&H;var r=(H,e,A,E)=>{let r=8,t=w[R+I];for(;0!=(128&t)?O(H,e):O(A,E),t<<=1,--r;);};if(0===I){let H=A>>4^255;for(I=255&e;r(3,26,4,6),I++,I&=255,255&++H;);return I}I^=255;for(var t=255&P[E];r(2,5,1,t),255&++I;);return e},X=H=>127*Math.sin(2*Math.PI*(H/256))|0,J=(H,e,A,t,E,O,r)=>{let R=A,I=0,l=0,Y=0,n=0,U=0,N=E[0],W=.75*N|0;for(;e;){var S=r[U];if(0!=(248&S))n=C(H,n,S,E[255&U]),U+=2,e-=2,R=A;else{{let e=[],A=256*I,E=256*l,r=256*Y;for(let H=0;H<5;H++){var f=X(255&A>>8),T=X(255&E>>8),i=(255&r>>8)<129?-112:112,f=(f*(15&O[0][U])+T*(15&O[1][U])+i*(15&O[2][U]))/32+128;e[H]=0|f,A+=256*t[0][U]/4,E+=256*t[1][U]/4,r+=256*t[2][U]/4}H.ary(0,e)}if(0==--R){if(U++,0==--e)return;R=A}if(0!=--N){if(0!=--W||0===S){I+=t[0][U],l+=t[1][U],Y+=t[2][U];continue}n=C(H,n,S,E[255&U])}}N=E[U],W=.75*N|0,I=0,l=0,Y=0}};function E(e){var A=1{if(!H)return!1;var e=H=>H===I.length?null:I[H],A=(e,H,A,E)=>{for(let H=I.length-1;H>=e;H--)I[H+1]=I[H],R[H+1]=t(H),O[H+1]=r(H);I[e]=H,R[e]=0|E,O[e]=A};let r=H=>0|O[H],t=H=>0|R[H];var E=(H,e)=>{R[H]=e};let O=[],R=[],I=[],l=0;return D(H,H=>{O[l]=0,R[l]=0,I[l++]=H},H=>{O[l-1]=H}),L(A,(H,e)=>{I[H]=e},e,r),h(e,r,(H,e)=>{O[H]=e}),v(e,r,E),G(e,E,t),Z(e,A,r),I.map((H,e)=>H?[H,0|R[e],0|O[e]]:null).filter(H=>H)})(e);if(!1===e)return!1;{r=void 0===(r=A.pitch)?64:255&r,t=void 0===(t=A.mouth)?128:255&t,O=void 0===(O=A.throat)?128:255&O,E=255&(A.speed||72),A=A.singmode||!1;var E,r=m(e,r,t,O,A);let H=y(176.4*e.reduce((H,e)=>H+e[1],0)*E|0);var[t,O,A,e,r]=r;return J(H,t,E,O,A,e,r),H.get()}}let F=H=>{let e=" "+H.toUpperCase(),A=0,E="",r=(H,e)=>{A+=e,E+=H},t=0;for(;AH(e,A,r));else if(0!==l[O]){if(!U(O,n))return!1;S[O].some(H=>H(e,A,r))}else E+=" ",A++;else E+=".",A++}return E},g=E,p=(H,e)=>{if(!1===(H=E(H,e)))return!1;{var A=H;let e=new Float32Array(A.length);for(let H=0;He||A.phonetic?H.toUpperCase():F(H);this.buf8=(H,e)=>g(E(H,e),A),this.buf32=(H,e)=>p(E(H,e),A),this.speak=(e,H)=>{if(e=this.buf32(e,H),I=null===I?new AudioContext:I){var O=I,R=e;let t,H=new Promise((H,e)=>{let A=O.createBufferSource(),E=O.createBuffer(1,R.length,22050),r=E.getChannelData(0);for(let H=0;H{H(!0)},t=H=>{A.disconnect(),e(H)},A.start(0)});return H.abort=t,H}throw new Error},this.download=(A,E)=>{{A=this.buf8(A,E),E=new Blob([R(A)],{type:"audio/vnd.wave"});let H=window.URL||window.webkitURL,e=(A=H.createObjectURL(E),document.createElement("a"));return e.href=A,e.target="_blank",e.download="sam.wav",document.body.appendChild(e),e.click(),document.body.removeChild(e),void H.revokeObjectURL(A)}},this.wav=(H,e)=>R(this.buf8(H,e))}return H.buf8=g,H.buf32=p,H.convert=F,H}var e=this;"object"==typeof exports&&"undefined"!=typeof module?module.exports=H():"function"==typeof define&&define.amd?define(H):(e="undefined"!=typeof globalThis?globalThis:e||self).SamJs=H(); +function H(){let Y=(H,e)=>0!=(H&e),r=H=>{let A=new Uint8Array(H.length);return H.split("").forEach((H,e)=>{A[e]=H.charCodeAt(0)}),A},t=H=>{var e=new Uint8Array(4);return e[0]=H,e[1]=H>>8,e[2]=H>>16,e[3]=H>>24,e},O=H=>{var e=new Uint8Array(2);return e[0]=H,e[1]=H>>8,e},I=null,R=H=>{let e=new Uint8Array(44+H.length),A=0,E=H=>{e.set(H,A),A+=H.length};return E(r("RIFF")),E(t(H.length+12+16+8-8)),E(r("WAVE")),E(r("fmt ")),E(t(16)),E(O(1)),E(O(1)),E(t(22050)),E(t(22050)),E(O(1)),E(O(8)),E(r("data")),E(t(H.length)),E(H),e},l={" ":0,"!":2,'"':2,"#":2,$:2,"%":2,"&":2,"'":130,"(":0,")":0,"*":2,"+":2,",":2,"-":2,".":2,"/":2,0:3,1:3,2:3,3:3,4:3,5:3,6:3,7:3,8:3,9:3,":":2,";":2,"<":2,"=":2,">":2,"?":2,"@":2,A:192,B:168,C:176,D:172,E:192,F:160,G:184,H:160,I:192,J:188,K:160,L:172,M:168,N:172,O:192,P:160,Q:160,R:172,S:180,T:164,U:192,V:168,W:168,X:176,Y:192,Z:188,"[":0,"\\":0,"]":0,"^":2,_:0,"`":32},n=128,U=(H,e)=>0!=(l[H]&e),N=(H,e,A)=>U(H[e],A),W=(H,e)=>-1!==e.indexOf(H),A=H=>{let e=H.split("="),E=e.pop(),A=e.join("=").split("("),r=A.pop().split(")"),t=A[0],O=r[0],R=r[1],I=["T","C","S"],Y=["E","I","Y"],l=(H,e,A)=>{if(H.startsWith(O,e)&&((e,A)=>{for(let H=t.length-1;-1!N(e,--A,n),"#":()=>N(e,--A,64),".":()=>N(e,--A,8),"&":()=>N(e,--A,16)||W(e.substr(--A,2),["CH","SH"]),"@":()=>{var H;return!!N(e,--A,4)||"H"===(H=e[A])&&!!W(H,I)},"^":()=>N(e,--A,32),"+":()=>W(e[--A],Y),":":()=>{for(;0<=A&&N(e,A-1,32);)A--;return!0}}[E]())return!1}return!0})(H,e)&&((e,A)=>{for(let H=0;H!N(e,++A,n),"#":()=>N(e,++A,64),".":()=>N(e,++A,8),"&":()=>N(e,++A,16)||W(e.substr(++A-2,2),["HC","HS"]),"@":()=>{var H;return!!N(e,++A,4)||"H"===(H=e[A])&&!!W(H,I)},"^":()=>N(e,++A,32),"+":()=>W(e[++A],Y),":":()=>{for(;N(e,A+1,32);)A++;return!0},"%":()=>{if("E"!==e[A+1])return"ING"===e.substr(A+1,3)&&(A+=3,!0);if(N(e,A+2,n)){if(!W(e[A+2],["R","S","D"]))return"L"!==e[A+2]?"FUL"===e.substr(A+2,3)&&(A+=4,!0):"Y"===e[A+3]&&(A+=3,!0);A+=2}else A++;return!0}}[E]())return!1}return!0})(H,e+(O.length-1)))return A(E,O.length),!0};return l.c=O[0],l},S={},f=(" (A.)=EH4Y. |(A) =AH| (ARE) =AAR| (AR)O=AXR|(AR)#=EH4R| ^(AS)#=EY4S|(A)WA=AX|(AW)=AO5| :(ANY)=EH4NIY|(A)^+#=EY5|#:(ALLY)=ULIY| (AL)#=UL|(AGAIN)=AXGEH4N|#:(AG)E=IHJ|(A)^%=EY|(A)^+:#=AE| :(A)^+ =EY4| (ARR)=AXR|(ARR)=AE4R| ^(AR) =AA5R|(AR)=AA5R|(AIR)=EH4R|(AI)=EY4|(AY)=EY5|(AU)=AO4|#:(AL) =UL|#:(ALS) =ULZ|(ALK)=AO4K|(AL)^=AOL| :(ABLE)=EY4BUL|(ABLE)=AXBUL|(A)VO=EY4|(ANG)+=EY4NJ|(ATARI)=AHTAA4RIY|(A)TOM=AE|(A)TTI=AE| (AT) =AET| (A)T=AH|(A)=AE| (B) =BIY4| (BE)^#=BIH|(BEING)=BIY4IHNX| (BOTH) =BOW4TH| (BUS)#=BIH4Z|(BREAK)=BREY5K|(BUIL)=BIH4L|(B)=B| (C) =SIY4| (CH)^=K|^E(CH)=K|(CHA)R#=KEH5|(CH)=CH| S(CI)#=SAY4|(CI)A=SH|(CI)O=SH|(CI)EN=SH|(CITY)=SIHTIY|(C)+=S|(CK)=K|(COMMODORE)=KAA4MAHDOHR|(COM)=KAHM|(CUIT)=KIHT|(CREA)=KRIYEY|(C)=K| (D) =DIY4| (DR.) =DAA4KTER|#:(DED) =DIHD|.E(D) =D|#:^E(D) =T| (DE)^#=DIH| (DO) =DUW| (DOES)=DAHZ|(DONE) =DAH5N|(DOING)=DUW4IHNX| (DOW)=DAW|#(DU)A=JUW|#(DU)^#=JAX|(D)=D| (E) =IYIY4|#:(E) =|':^(E) =| :(E) =IY|#(ED) =D|#:(E)D =|(EV)ER=EH4V|(E)^%=IY4|(ERI)#=IY4RIY|(ERI)=EH4RIH|#:(ER)#=ER|(ERROR)=EH4ROHR|(ERASE)=IHREY5S|(ER)#=EHR|(ER)=ER| (EVEN)=IYVEHN|#:(E)W=|@(EW)=UW|(EW)=YUW|(E)O=IY|#:&(ES) =IHZ|#:(E)S =|#:(ELY) =LIY|#:(EMENT)=MEHNT|(EFUL)=FUHL|(EE)=IY4|(EARN)=ER5N| (EAR)^=ER5|(EAD)=EHD|#:(EA) =IYAX|(EA)SU=EH5|(EA)=IY5|(EIGH)=EY4|(EI)=IY4| (EYE)=AY4|(EY)=IY|(EU)=YUW5|(EQUAL)=IY4KWUL|(E)=EH| (F) =EH4F|(FUL)=FUHL|(FRIEND)=FREH5ND|(FATHER)=FAA4DHER|(F)F=|(F)=F| (G) =JIY4|(GIV)=GIH5V| (G)I^=G|(GE)T=GEH5|SU(GGES)=GJEH4S|(GG)=G| B#(G)=G|(G)+=J|(GREAT)=GREY4T|(GON)E=GAO5N|#(GH)=| (GN)=N|(G)=G| (H) =EY4CH| (HAV)=/HAE6V| (HERE)=/HIYR| (HOUR)=AW5ER|(HOW)=/HAW|(H)#=/H|(H)=| (IN)=IHN| (I) =AY4|(I) =AY|(IN)D=AY5N|SEM(I)=IY| ANT(I)=AY|(IER)=IYER|#:R(IED) =IYD|(IED) =AY5D|(IEN)=IYEHN|(IE)T=AY4EH|(I')=AY5| :(I)^%=AY5| :(IE) =AY4|(I)%=IY|(IE)=IY4| (IDEA)=AYDIY5AH|(I)^+:#=IH|(IR)#=AYR|(IZ)%=AYZ|(IS)%=AYZ|I^(I)^#=IH|+^(I)^+=AY|#:^(I)^+=IH|(I)^+=AY|(IR)=ER|(IGH)=AY4|(ILD)=AY5LD| (IGN)=IHGN|(IGN) =AY4N|(IGN)^=AY4N|(IGN)%=AY4N|(ICRO)=AY4KROH|(IQUE)=IY4K|(I)=IH| (J) =JEY4|(J)=J| (K) =KEY4| (K)N=|(K)=K| (L) =EH4L|(LO)C#=LOW|L(L)=|#:^(L)%=UL|(LEAD)=LIYD| (LAUGH)=LAE4F|(L)=L| (M) =EH4M| (MR.) =MIH4STER| (MS.)=MIH5Z| (MRS.) =MIH4SIXZ|(MOV)=MUW4V|(MACHIN)=MAHSHIY5N|M(M)=|(M)=M| (N) =EH4N|E(NG)+=NJ|(NG)R=NXG|(NG)#=NXG|(NGL)%=NXGUL|(NG)=NX|(NK)=NXK| (NOW) =NAW4|N(N)=|(NON)E=NAH4N|(N)=N| (O) =OH4W|(OF) =AHV| (OH) =OW5|(OROUGH)=ER4OW|#:(OR) =ER|#:(ORS) =ERZ|(OR)=AOR| (ONE)=WAHN|#(ONE) =WAHN|(OW)=OW| (OVER)=OW5VER|PR(O)V=UW4|(OV)=AH4V|(O)^%=OW5|(O)^EN=OW|(O)^I#=OW5|(OL)D=OW4L|(OUGHT)=AO5T|(OUGH)=AH5F| (OU)=AW|H(OU)S#=AW4|(OUS)=AXS|(OUR)=OHR|(OULD)=UH5D|(OU)^L=AH5|(OUP)=UW5P|(OU)=AW|(OY)=OY|(OING)=OW4IHNX|(OI)=OY5|(OOR)=OH5R|(OOK)=UH5K|F(OOD)=UW5D|L(OOD)=AH5D|M(OOD)=UW5D|(OOD)=UH5D|F(OOT)=UH5T|(OO)=UW5|(O')=OH|(O)E=OW|(O) =OW|(OA)=OW4| (ONLY)=OW4NLIY| (ONCE)=WAH4NS|(ON'T)=OW4NT|C(O)N=AA|(O)NG=AO| :^(O)N=AH|I(ON)=UN|#:(ON)=UN|#^(ON)=UN|(O)ST=OW|(OF)^=AO4F|(OTHER)=AH5DHER|R(O)B=RAA|^R(O):#=OW5|(OSS) =AO5S|#:^(OM)=AHM|(O)=AA| (P) =PIY4|(PH)=F|(PEOPL)=PIY5PUL|(POW)=PAW4|(PUT) =PUHT|(P)P=|(P)S=|(P)N=|(PROF.)=PROHFEH4SER|(P)=P| (Q) =KYUW4|(QUAR)=KWOH5R|(QU)=KW|(Q)=K| (R) =AA5R| (RE)^#=RIY|(R)R=|(R)=R| (S) =EH4S|(SH)=SH|#(SION)=ZHUN|(SOME)=SAHM|#(SUR)#=ZHER|(SUR)#=SHER|#(SU)#=ZHUW|#(SSU)#=SHUW|#(SED)=ZD|#(S)#=Z|(SAID)=SEHD|^(SION)=SHUN|(S)S=|.(S) =Z|#:.E(S) =Z|#:^#(S) =S|U(S) =S| :#(S) =Z|##(S) =Z| (SCH)=SK|(S)C+=|#(SM)=ZUM|#(SN)'=ZUM|(STLE)=SUL|(S)=S| (T) =TIY4| (THE) #=DHIY| (THE) =DHAX|(TO) =TUX| (THAT)=DHAET| (THIS) =DHIHS| (THEY)=DHEY| (THERE)=DHEHR|(THER)=DHER|(THEIR)=DHEHR| (THAN) =DHAEN| (THEM) =DHAEN|(THESE) =DHIYZ| (THEN)=DHEHN|(THROUGH)=THRUW4|(THOSE)=DHOHZ|(THOUGH) =DHOW|(TODAY)=TUXDEY|(TOMO)RROW=TUMAA5|(TO)TAL=TOW5| (THUS)=DHAH4S|(TH)=TH|#:(TED)=TIXD|S(TI)#N=CH|(TI)O=SH|(TI)A=SH|(TIEN)=SHUN|(TUR)#=CHER|(TU)A=CHUW| (TWO)=TUW|&(T)EN =|(T)=T| (U) =YUW4| (UN)I=YUWN| (UN)=AHN| (UPON)=AXPAON|@(UR)#=UH4R|(UR)#=YUH4R|(UR)=ER|(U)^ =AH|(U)^^=AH5|(UY)=AY5| G(U)#=|G(U)%=|G(U)#=W|#N(U)=YUW|@(U)=UW|(U)=YUW| (V) =VIY4|(VIEW)=VYUW5|(V)=V| (W) =DAH4BULYUW| (WERE)=WER|(WA)SH=WAA|(WA)ST=WEY|(WA)S=WAH|(WA)T=WAA|(WHERE)=WHEHR|(WHAT)=WHAHT|(WHOL)=/HOWL|(WHO)=/HUW|(WH)=WH|(WAR)#=WEHR|(WAR)=WAOR|(WOR)^=WER|(WR)=R|(WOM)A=WUHM|(WOM)E=WIHM|(WEA)R=WEH|(WANT)=WAA5NT|ANS(WER)=ER|(W)=W| (X) =EH4KR| (X)=Z|(X)=KS| (Y) =WAY4|(YOUNG)=YAHNX| (YOUR)=YOHR| (YOU)=YUW| (YES)=YEHS| (Y)=Y|F(Y)=AY|PS(YCH)=AYK|#:^(Y)=IY|#:^(Y)I=IY| :(Y) =AY| :(Y)#=AY| :(Y)^+:#=IH| :(Y)^#=AY|(Y)=IH| (Z) =ZIY4|(Z)=Z".split("|").map(H=>{var e=(H=A(H)).c;S[e]=S[e]||[],S[e].push(H)}),'(A)=|(!)=.|(") =-AH5NKWOWT-|(")=KWOW4T-|(#)= NAH4MBER|($)= DAA4LER|(%)= PERSEH4NT|(&)= AEND|(\')=|(*)= AE4STERIHSK|(+)= PLAH4S|(,)=,| (-) =-|(-)=|(.)= POYNT|(/)= SLAE4SH|(0)= ZIY4ROW| (1ST)=FER4ST| (10TH)=TEH4NTH|(1)= WAH4N| (2ND)=SEH4KUND|(2)= TUW4| (3RD)=THER4D|(3)= THRIY4|(4)= FOH4R| (5TH)=FIH4FTH|(5)= FAY4V| (64) =SIH4KSTIY FOHR|(6)= SIH4KS|(7)= SEH4VUN| (8TH)=EY4TH|(8)= EY4T|(9)= NAY4N|(:)=.|(;)=.|(<)= LEH4S DHAEN|(=)= IY4KWULZ|(>)= GREY4TER DHAEN|(?)=?|(@)= AE6T|(^)= KAE4RIXT'.split("|").map(A)),T="*12345678".split(""),E=" *.*?*,*-*IYIHEHAEAAAHAOUHAXIXERUXOHRXLXWXYXWHR*L*W*Y*M*N*NXDXQ*S*SHF*TH/H/XZ*ZHV*DHCH**J*******EYAYOYAWOWUWB*****D*****G*****GX****P*****T*****K*****KX****ULUMUN".match(/.{1,2}/g),i=[32768,49408,49408,49408,49408,164,164,164,164,164,164,132,132,164,164,132,132,132,132,132,132,132,68,4164,4164,4164,4164,2124,3148,2124,1096,16460,9280,8256,8256,9280,64,64,9284,8260,8260,9284,8264,8256,76,8260,0,0,180,180,180,148,148,148,78,78,78,1102,1102,1102,78,78,78,78,78,78,75,75,75,1099,1099,1099,75,75,75,75,75,75,128,193,193],o=[0,4626,4626,4626,2056,2824,2312,2824,3592,3851,2822,4108,3082,1541,1541,3595,3082,3594,3082,2825,2056,2055,2825,2567,2310,2056,2054,2055,2055,2055,770,1285,514,514,514,514,514,514,1542,1542,2055,1542,1542,514,2312,1027,513,286,3597,3852,3852,3852,3598,3593,2054,513,514,1797,513,257,1798,513,514,1798,513,514,2056,514,514,1540,514,514,1798,513,1028,1798,257,1028,1479,1535],Z=(e,A)=>{var H=E.findIndex(H=>H===e+A&&"*"!==H[1]);return-1!==H&&H},P=e=>{var H=E.findIndex(H=>H===e+"*");return-1!==H&&H},b=(r,t,O)=>{for(let E=0;EY(i[H],e),B=23,V=57,w=69,m=1,y=2,J=8192,k=4096,Q=2048,x=1024,j=256,a=128,u=64,s=32,$=16,_=8,L=4,G=2,h=1,q=(A,E,r,t)=>{let H=(H,e)=>{switch(H){case 53:D(r(e-1),x)&&E(e,16);break;case 42:A(e+1,43,t(e));break;case 44:A(e+1,45,t(e))}},e=(H,e)=>{E(H,13),A(H+1,e,t(H))},O=-1,R;for(;null!==(R=r(++O));)if(0!==R)if(D(R,$))A(O+1,D(R,s)?21:20,t(O)),H(R,O);else if(78===R)e(O,24);else if(79===R)e(O,27);else if(80===R)e(O,28);else if(D(R,a)&&t(O))0===r(O+1)&&null!==(R=r(O+2))&&D(R,a)&&t(O+2)&&A(O+2,31,0);else{var I,Y=0===O?null:r(O-1);if(R===B)switch(Y){case w:E(O-1,42);break;case V:E(O-1,44);break;default:D(Y,a)&&E(O,18)}else 24===R&&D(Y,a)?E(O,19):60===Y&&32===R?E(O,38):60===R?(I=r(O+1),D(I,s)||null===I||E(O,63)):(72===R&&(I=r(O+1),D(I,s)&&null!==I||(E(O,75),R=75)),D(R,h)&&32===Y?E(O,R-12):D(R,h)||H(R,O),69!==R&&57!==R||0{for(let H=0;null!==r(H);H++)if(D(r(H),j)){for(var e,A=H;1<--H&&!D(r(H),a););if(0===H)break;for(;H>1)+e+1))}let R=-1,I;for(;null!==(I=r(++R));){let H=R,e,A,E;if(D(I,a))I=r(++H),D(I,u)?(e=null===I?u|h:i[I],Y(e,L)?(E=O(R),t(R,(E>>2)+E+1)):Y(e,h)&&(A=O(R),t(R,A-(A>>3)))):18!==I&&19!==I||!D(r(++H),u)||t(R,O(R)-1);else if(D(I,Q))null!==(I=r(++H))&&D(I,G)&&(t(H,6),t(H-1,5));else if(D(I,G)){for(;0===(I=r(++H)););null!==I&&D(I,G)&&(t(H,1+(O(H)>>1)),t(R,1+(O(R)>>1)))}else 0{let E=0;for(var r;null!==(r=H(E));)D(r,u)&&null!==(r=H(E+1))&&D(r,a)&&0!==(r=e(E+1))&&r<128&&A(E,r+1),++E},e1=(H,e,A)=>{let E=0;for(var r;null!==(r=H(E));){var t=e(E);A(E,0===t||127>8),E++}},A1=(A,H,e)=>{let E=-1;for(var r;null!==(r=A(++E));)if(D(r,G)){if(D(r,h)){let H,e=E;for(;0===(H=A(++e)););if(null!==H&&(D(H,_)||36===H||37===H))continue}H(E+1,r+1,e(E),255&o[r+1]),H(E+2,r+2,e(E),255&o[r+2]),E+=2}},E1=[24,26,23,23,23],r1=[0,224,230,236,243,249,0,6,12,6],M=[0,31,31,31,31,2,2,2,2,2,2,2,2,2,5,5,2,10,2,8,5,5,11,10,9,8,8,160,8,8,23,31,18,18,18,18,30,30,20,20,20,20,23,23,26,26,29,29,2,2,2,2,2,2,26,29,27,26,29,27,26,29,27,26,29,27,23,29,23,23,29,23,23,29,23,23,29,23,23,23],d=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,2,4,4,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,0,1,0,5,5,5,5,5,4,4,2,0,1,2,0,1,2,0,1,2,0,1,2,0,2,2,0,1,3,0,2,3,0,2,160,160],K=[0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,4,4,3,3,3,3,3,1,2,3,2,1,3,3,3,3,1,1,3,3,3,2,2,3,2,3,0,0,5,5,5,5,4,4,2,0,2,2,0,3,2,0,4,2,0,3,2,0,2,2,0,2,3,0,3,3,0,3,176,160],t1=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,226,211,187,124,149,1,2,3,3,0,114,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,25,0,0,0,0,0,0,0,0,0],O1=[0,5980947,5980947,5980947,5980947,7230474,6113550,5980947,5783320,5842971,5712919,5775125,5383440,5844244,6113550,4075794,5383182,5774866,4076306,7218448,5250317,6112527,5904395,3944978,7216654,5904395,7230217,5320198,7943686,6641158,7943686,5980945,6506758,6967046,5315078,7946758,6113550,5383440,6107913,6767114,4990984,6106890,6639366,6639366,7946758,6639365,7958022,0,5916691,5777179,5775125,5778203,5774866,5382669,5315078,5315078,5315078,7946758,7946758,7946758,7368198,7237126,7237126,6181894,6181894,6181894,5315078,5315078,5315078,7946758,7946758,7946758,6647046,6641162,7367946,6181894,6181894,6181894,556844,98067],C=[0,0,0,0,0,526861,461581,527630,527887,68879,68623,3087,68367,2316,461581,330508,68623,3087,396301,67597,2061,461838,2061,330252,67597,2061,526861,780,2313,198153,0,0,0,0,0,0,0,0,779,66827,779,1035,0,0,1,66827,920064,66050,593422,68879,3087,68879,3087,2061,2,260,0,2,260,0,1,260,0,1,260,0,0,0,0,0,0,0,0,461324,0,0,330240,0,1245199,1048591],R1=[56,132,107,25,198,99,24,134,115,152,198,177,28,202,49,140,199,49,136,194,48,152,70,49,24,198,53,12,202,49,12,198,33,16,36,105,18,194,49,20,196,113,8,74,34,73,171,106,168,172,73,81,50,213,82,136,147,108,148,34,21,84,210,37,150,212,80,165,70,33,8,133,107,24,196,99,16,206,107,24,140,113,25,140,99,53,12,198,51,153,204,108,181,78,162,153,70,33,40,130,149,46,227,48,156,197,48,156,162,177,156,103,49,136,102,89,44,83,24,132,103,80,202,227,10,172,171,48,172,98,48,140,99,16,148,98,177,140,130,40,150,51,152,214,181,76,98,41,165,74,181,156,198,49,20,214,56,156,75,180,134,101,24,174,103,28,166,99,25,150,35,25,132,19,8,166,82,172,202,34,137,110,171,25,140,98,52,196,98,25,134,99,24,196,35,88,214,163,80,66,84,74,173,74,37,17,107,100,137,74,99,57,138,35,49,42,234,162,169,68,197,18,205,66,52,140,98,24,140,99,17,72,102,49,157,68,51,29,70,49,156,198,177,12,205,50,136,196,115,24,134,115,8,214,99,88,7,129,224,240,60,7,135,144,60,124,15,199,192,192,240,124,30,7,128,128,0,28,120,112,241,199,31,192,12,254,28,31,31,14,10,122,192,113,242,131,143,3,15,15,12,0,121,248,97,224,67,15,131,231,24,249,193,19,218,233,99,143,15,131,131,135,195,31,60,112,240,225,225,227,135,184,113,14,32,227,141,72,120,28,147,135,48,225,193,193,228,120,33,131,131,195,135,6,57,229,195,135,7,14,28,28,112,244,113,156,96,54,50,195,30,60,243,143,14,60,112,227,199,143,15,15,14,60,120,240,227,135,6,240,227,7,193,153,135,15,24,120,112,112,252,243,16,177,140,140,49,124,112,225,134,60,100,108,176,225,227,15,35,143,15,30,62,56,60,56,123,143,7,14,60,244,23,30,60,120,242,158,114,73,227,37,54,56,88,57,226,222,60,120,120,225,199,97,225,225,176,240,240,195,199,14,56,192,240,206,115,115,24,52,176,225,199,142,28,60,248,56,240,225,193,139,134,143,28,120,112,240,120,172,177,143,57,49,219,56,97,195,14,14,56,120,115,23,30,57,30,56,100,225,241,193,78,15,64,162,2,197,143,129,161,252,18,8,100,224,60,34,224,69,7,142,12,50,144,240,31,32,73,224,248,12,96,240,23,26,65,170,164,208,141,18,130,30,30,3,248,62,3,12,115,128,112,68,38,3,36,225,62,4,78,4,28,193,9,204,158,144,33,7,144,67,100,192,15,198,144,156,193,91,3,226,29,129,224,94,29,3,132,184,44,15,128,177,131,224,48,65,30,67,137,131,80,252,36,46,19,131,241,124,76,44,201,13,131,176,181,130,228,232,6,156,7,160,153,29,7,62,130,143,112,48,116,64,202,16,228,232,15,146,20,63,6,248,132,136,67,129,10,52,57,65,198,227,28,71,3,176,184,19,10,194,100,248,24,249,96,179,192,101,32,96,166,140,195,129,32,48,38,30,28,56,211,1,176,38,64,244,11,195,66,31,133,50,38,96,64,201,203,1,236,17,40,64,250,4,52,224,112,76,140,29,7,105,3,22,200,4,35,232,198,154,11,26,3,224,118,6,5,207,30,188,88,49,113,102,0,248,63,4,252,12,116,39,138,128,113,194,58,38,6,192,31,5,15,152,64,174,1,127,192,7,255,0,14,254,0,3,223,128,3,239,128,27,241,194,0,231,224,24,252,224,33,252,128,60,252,64,14,126,0,63,62,0,15,254,0,31,255,0,62,240,7,252,0,126,16,63,255,0,63,56,14,124,1,135,12,252,199,0,62,4,15,62,31,15,15,31,15,2,131,135,207,3,135,15,63,192,7,158,96,63,192,3,254,0,63,224,119,225,192,254,224,195,224,1,223,248,3,7,0,126,112,0,124,56,24,254,12,30,120,28,124,62,14,31,30,30,62,0,127,131,7,219,135,131,7,199,7,16,113,255,0,63,226,1,224,193,195,225,0,127,192,5,240,32,248,240,112,254,120,121,248,2,63,12,143,3,15,159,224,193,199,135,3,195,195,176,225,225,193,227,224,113,240,0,252,112,124,12,62,56,14,28,112,195,199,3,129,193,199,231,0,15,199,135,25,9,239,196,51,224,193,252,248,112,240,120,248,240,97,199,0,31,248,1,124,248,240,120,112,60,124,206,14,33,131,207,8,7,143,8,193,135,143,128,199,227,0,7,248,224,239,0,57,247,128,14,248,225,227,248,33,159,192,255,3,248,7,192,31,248,196,4,252,196,193,188,135,240,15,192,127,5,224,37,236,192,62,132,71,240,142,3,248,3,251,192,25,248,7,156,12,23,248,7,224,31,161,252,15,252,1,240,63,0,254,3,240,31,0,253,0,255,136,13,249,1,255,0,112,7,192,62,66,243,13,196,127,128,252,7,240,94,192,63,0,120,63,129,255,1,248,1,195,232,12,228,100,143,228,15,240,7,240,194,31,0,127,192,111,128,126,3,248,7,240,63,192,120,15,130,7,254,34,119,112,2,118,3,254,0,254,103,0,124,199,241,142,198,59,224,63,132,243,25,216,3,153,252,9,184,15,248,0,157,36,97,249,13,0,253,3,240,31,144,63,1,248,31,208,15,248,55,1,248,7,240,15,192,63,0,254,3,248,15,192,63,0,250,3,240,15,128,255,1,184,7,240,1,252,1,188,128,19,30,0,127,225,64,127,160,127,176,0,63,192,31,192,56,15,240,31,128,255,1,252,3,241,126,1,254,1,240,255,0,127,192,29,7,240,15,192,126,6,224,7,224,15,248,6,193,254,1,252,3,224,15,0,252],I1=(e,A)=>{let E=(H,e)=>(H*e>>8&255)<<1,r=[[],[],[]];O1.map((H,e)=>{r[0][e]=255&H,r[1][e]=H>>8&255,r[2][e]=H>>16&255});for(let H=5;H<30;H++)r[0][H]=E(e,r[0][H]),r[1][H]=E(A,r[1][H]);for(let H=48;H<54;H++)r[0][H]=E(e,r[0][H]),r[1][H]=E(A,r[1][H]);return r},Y1=(e,H,A,E)=>{let Y=[e,H[0],H[1],H[2],A[0],A[1],A[2]],l=(H,e)=>Y[H][e],r=(e,A,E,H)=>{let r=H<0,t=Math.abs(H)%e,O=H/e|0,R=0,I=e;for(;0<--I;){let H=l(A,E)+O;(R+=t)>=e&&(R-=e,r?H--:H&&H++),Y[A][++E]=H,H+=O}},t,O,R=0;for(let H=0;H>1)+(U=E[H+1][1]>>1),0,S,e[R+U]-e[R-N]);for(let H=1;H<7;H++){var T=l(H,W)-l(H,S);r(f,H,S,T)}}}return R+E[E.length-1][1]},l1=255,n1=1,U1=(A,E,r)=>{let H=(H,e,A)=>{var E=e;e<30?e=0:e-=30;let r;for(;127===(r=A[e]);)++e;for(;e!==E;)for(r+=H,A[e]=255&r;++e!==E&&255===A[e];);},t=[],O=[[],[],[]],R=[[],[],[]],I=[],Y=0;for(let e=0;e>8&255,R[2][Y]=C[l]>>16&255,I[Y]=t1[l],t[Y]=A+n&255,Y++}return[t,O,R,I]},N1=(H,e,A,E,r)=>{var A=I1(A,E),[t,O,R,E]=U1(e,H,A),e=Y1(t,O,R,H);if(!r)for(let H=0;H>1;var I=[0,1,2,2,2,3,3,4,4,5,6,8,9,11,13,15];for(let H=R[0].length-1;0<=H;H--)R[0][H]=I[R[0][H]],R[1][H]=I[R[1][H]],R[2][H]=I[R[2][H]];return[e,O,t,R,E]},W1=H=>{let A=new Uint8Array(H),E=0,r=0,t=(H,e)=>{e=16*(15&e),t.ary(H,[e,e,e,e,e])};return t.ary=(H,e)=>{if(((E+=[[162,167,167,127,128],[226,60,60,0,0],[225,60,59,0,0],[200,0,0,54,55],[199,0,0,54,54]][r][H])/50|0)>A.length)throw new Error;r=H;for(let H=0;H<5;H++)A[(E/50|0)+H]=e[H]},t.get=()=>A.slice(0,E/50|0),t},v=(O,e,H,A)=>{let E=(7&H)-1,R=256*E&65535,I=248&H,r=(H,e,A,E)=>{let r=8,t=R1[R+I];for(;0!=(128&t)?O(H,e):O(A,E),t<<=1,--r;);};if(0===I){let H=A>>4^255;for(I=255&e;r(3,26,4,6),I++,I&=255,255&++H;);return I}I^=255;for(var t=255&E1[E];r(2,5,1,t),255&++I;);return e},c=H=>127*Math.sin(2*Math.PI*(H/256))|0,S1=(H,e,A,t,E,O,r)=>{let R=A,I=0,Y=0,l=0,n=0,U=0,N=E[0],W=.75*N|0;for(;e;){var S=r[U];if(0!=(248&S))n=v(H,n,S,E[255&U]),U+=2,e-=2,R=A;else{{let e=[],A=256*I,E=256*Y,r=256*l;for(let H=0;H<5;H++){var f=c(255&A>>8),T=c(255&E>>8),i=(255&r>>8)<129?-112:112,f=(f*(15&O[0][U])+T*(15&O[1][U])+i*(15&O[2][U]))/32+128;e[H]=0|f,A+=256*t[0][U]/4,E+=256*t[1][U]/4,r+=256*t[2][U]/4}H.ary(0,e)}if(0==--R){if(U++,0==--e)return;R=A}if(0!=--N){if(0!=--W||0===S){I+=t[0][U],Y+=t[1][U],l+=t[2][U];continue}n=v(H,n,S,E[255&U])}}N=E[U],W=.75*N|0,I=0,Y=0,l=0}};function X(H){var e,A,E,r,t,O=1{if(!H)return!1;let e=H=>H===I.length?null:I[H],A=(e,H,A,E)=>{for(let H=I.length-1;H>=e;H--)I[H+1]=I[H],R[H+1]=t(H),O[H+1]=r(H);I[e]=H,R[e]=0|E,O[e]=A},r=H=>0|O[H],t=H=>0|R[H],E=(H,e)=>{R[H]=e},O=[],R=[],I=[],Y=0;return b(H,H=>{O[Y]=0,R[Y]=0,I[Y++]=H},H=>{O[Y-1]=H}),q(A,(H,e)=>{I[H]=e},e,r),H1(e,r,(H,e)=>{O[H]=e}),e1(e,r,E),z(e,E,t),A1(e,A,r),I.map((H,e)=>H?[H,0|R[e],0|O[e]]:null).filter(H=>H)})(H);return!1!==H&&(r=void 0===(r=O.pitch)?64:255&r,A=void 0===(A=O.mouth)?128:255&A,E=void 0===(E=O.throat)?128:255&E,e=255&(O.speed||72),O=O.singmode||!1,r=N1(H,r,A,E,O),A=W1(176.4*H.reduce((H,e)=>H+e[1],0)*e|0),[E,O,H,r,t]=r,S1(A,E,e,O,H,r,t),A.get())}let F=H=>{let e=" "+H.toUpperCase(),A=0,E="",r=(H,e)=>{A+=e,E+=H},t=0;for(;AH(e,A,r));else if(0!==l[O]){if(!U(O,n))return!1;S[O].some(H=>H(e,A,r))}else E+=" ",A++;else E+=".",A++}return E},g=X,p=(H,e)=>{if(!1===(H=X(H,e)))return!1;var A=H,E=new Float32Array(A.length);for(let H=0;He||A.phonetic?H.toUpperCase():F(H);this.buf8=(H,e)=>g(E(H,e),A),this.buf32=(H,e)=>p(E(H,e),A),this.speak=(e,H)=>{if(e=this.buf32(e,H),I=null===I?new AudioContext:I){var O=I,R=e;let t,H=new Promise((H,e)=>{let A=O.createBufferSource(),E=O.createBuffer(1,R.length,22050),r=E.getChannelData(0);for(let H=0;H{H(!0)},t=H=>{A.disconnect(),e(H)},A.start(0)});return H.abort=t,H}throw new Error},this.download=(H,e)=>{var A,H=this.buf8(H,e),e=new Blob([R(H)],{type:"audio/vnd.wave"}),e=(H=window.URL||window.webkitURL).createObjectURL(e);(A=document.createElement("a")).href=e,A.target="_blank",A.download="sam.wav",document.body.appendChild(A),A.click(),document.body.removeChild(A),H.revokeObjectURL(e)},this.wav=(H,e)=>R(this.buf8(H,e))}return H.buf8=g,H.buf32=p,H.convert=F,H}var e=this;"object"==typeof exports&&"undefined"!=typeof module?module.exports=H():"function"==typeof define&&define.amd?define(H):(e="undefined"!=typeof globalThis?globalThis:e||self).SamJs=H(); //# sourceMappingURL=samjs.min.js.map \ No newline at end of file diff --git a/dist/samjs.min.js.map b/dist/samjs.min.js.map index 4201de5..286ac4a 100644 --- a/dist/samjs.min.js.map +++ b/dist/samjs.min.js.map @@ -1 +1 @@ -{"version":3,"file":"samjs.min.js","sources":["0"],"names":["factory","let","matchesBitmask","bits","mask","text2Uint8Array","text","buffer","Uint8Array","length","split","forEach","e","index","charCodeAt","Uint32ToUint8Array","uint32","result","Uint16ToUint8Array","uint16","context","ToWavBuffer","audiobuffer","realbuffer","pos","write","set","charFlags"," ","!","\"","#","$","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","\\","]","^","_","`","FLAG_ALPHA_OR_QUOT","flags","c","flg","flagsAt","isOneOf","list","indexOf","reciterRule","ruleString","splitted","target","pop","source","join","tmp","pre","match","post","TCS","EIY","inputPos","callback","startsWith","rulePos","ruleByte","substr","inputChar","checkPrefix","checkSuffix","rules","rules2","map","rule","r","push","StressTable","PhonemeNameTable","phonemeFlags","combinedPhonemeLengthTable","Parser1","input","addPhoneme","addStress","srcPos","sign1","sign2","findIndex","value","full_match","single_match","Error","phonemeHasFlag","phoneme","flag","FLAG_VOWEL","Parser2","insertPhoneme","setPhoneme","getPhoneme","getStress","handleUW_CH_J","changeAX","position","suffix","priorPhoneme","AdjustLengths","setLength","getLength","loopIndex","FLAG_CONSONANT","CopyStress","setStress","stress","SetPhonemeLength","ProlongPlosiveStopConsonantsCode41240","nextNonEmpty","sampledConsonantValues0","stressPitch_tab47492","blendRank","outBlendLength","inBlendLength","sampledConsonantFlags","frequencyData","ampldata","sampleTable","PrepareFrames","phonemes","pitch","mouth","throat","singmode","pitches","frequency","amplitude","sampledConsonantFlag","tuples","AddInflection","inflection","end","i","phase1","frames","CreateFrames","trans","factor","initialFrequency","freqdata","v","SetMouthThroat","t","tables","Read","table","interpolate","width","frame","change","sign","remainder","Math","abs","div","error","val","outBlendFrames","inBlendFrames","boundary","next_phoneme","next_rank","rank","trans_end","trans_start","trans_length","cur_width","next_width","CreateTransitions","amplitudeRescale","CreateOutputBuffer","buffersize","bufferpos","oldTimeTableIndex","writer","scaled","ary","array","k","get","slice","RenderSample","Output","lastSampleOffset","consonantFlag","kind","samplePage","off","renderSample","index1","value1","index0","value0","bit","sample","sinus","x","sin","PI","ProcessFrames","frameCount","speed","speedcounter","phase2","phase3","glottal_pulse","mem38","p1","p2","p3","sp1","sp2","rp3","mux","SamProcess","options","arguments","undefined","parsed","phonemeindex","stressValue","phonemeLength","filter","Parser","Renderer","sentences","reduce","convert","toUpperCase","output","successCallback","append","inputSkip","currentChar","some","buf8","buf32","Uint8ArrayToFloat32Array","audio","Float32Array","SamJs","opts","ensurePhonetic","phonetic","this","speak","AudioContext","Play","abort","promise","Promise","resolve","reject","createBufferSource","soundBuffer","createBuffer","getChannelData","connect","destination","onended","reason","disconnect","start","download","RenderBuffer","blob","Blob","type","url","window","URL","webkitURL","a","fileURL","createObjectURL","document","createElement","href","body","appendChild","click","removeChild","revokeObjectURL","wav","global","exports","module","define","amd","globalThis","self"],"mappings":"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AG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAQC,EAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,KAASC,EAAc,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,KAASC,EAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAOC,EAAc,CAAC,EAAM,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAiB,QAAgB,QAAgB,QAAiB,QAAiB,QAAiB,QAAgB,QAAgB,QAAiB,QAAgB,QAAgB,QAAiB,QAAgB,QAAiB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAiB,QAAgB,QAAgB,QAAe,QAAgB,QAAiB,QAAgB,QAAgB,QAAiB,QAAgB,QAAiB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,EAAM,QAAiB,QAAgB,QAAgB,QAAiB,QAAgB,QAAgB,QAAe,QAAe,QAAe,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAgB,QAAe,QAAe,QAAe,QAAgB,QAAgB,QAAgB,QAAgB,QAAiB,QAAiB,QAAgB,QAAgB,QAAgB,OAAgB,OAAoBC,EAAS,CAAC,EAAM,EAAM,EAAM,EAAM,EAAM,OAAe,OAAe,OAAe,OAAe,MAAc,MAAc,KAAU,MAAc,KAAU,OAAe,OAAe,MAAc,KAAU,OAAe,MAAc,KAAU,OAAe,KAAU,OAAe,MAAc,KAAU,OAAe,IAAS,KAAS,OAAc,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,IAAS,MAAc,IAAS,KAAU,EAAM,EAAM,EAAM,MAAc,OAAc,MAAY,OAAe,MAAc,KAAU,MAAc,KAAU,KAAU,EAAM,IAAQ,EAAM,EAAM,IAAQ,EAAM,EAAM,IAAQ,EAAM,EAAM,IAAQ,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,OAAe,EAAM,EAAM,OAAc,EAAM,QAAa,SAAkBC,EAAY,CAAC,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,KAQ1sOC,EAAc,CAACC,EAASC,EAAMC,EAAMC,EAAOC,KAAsD,KAAK,CAACC,EAAQC,EAAUC,EAAUC,IAFnE,CAACP,EAAMQ,EAAOb,KAAiB/K,IAAI6L,EAAc,CAACC,EAAWvK,EAAIiK,KAAWxL,IAAI+L,EAAIxK,EAAOA,EAAI,GAAIA,EAAI,EAASA,GAAK,GAAIvB,IAAI4D,EAAE,KAAyB,OAAlBA,EAAE4H,EAAQjK,OAAeA,EAAK,KAAMA,IAAMwK,GAAsC,IAAjCnI,GAAGkI,EAAWN,EAAQjK,GAAO,IAAFqC,IAAcrC,IAAMwK,GAAoB,MAAfP,EAAQjK,OAAgBvB,IAAIwL,EAAQ,GAAOC,EAAU,CAAC,GAAG,GAAG,IAAQC,EAAU,CAAC,GAAG,GAAG,IAAQC,EAAqB,GAAOxG,EAAE,EAAE,IAAInF,IAAIgM,EAAE,EAAEA,EAAEJ,EAAOpL,OAAOwL,IAAI,CAAChM,IAAIiJ,EAAQ2C,EAAOI,GAAG,GAAiKC,GApBjlB,IAoBsbhD,EAA0B4C,EAAhd,EAAif1G,EAAEqG,GApB5d,IAoB8evC,GAA4B4C,EAA5jB,IAA4lB1G,EAAEqG,GAAqBd,EAAqBkB,EAAOI,GAAG,KAAI,IAAIhM,IAAIkM,EAAON,EAAOI,GAAG,GAAU,EAAPE,EAASA,IAAUT,EAAU,GAAGtG,GAAG4F,EAAc,GAAG9B,GAASwC,EAAU,GAAGtG,GAAG4F,EAAc,GAAG9B,GAASwC,EAAU,GAAGtG,GAAG4F,EAAc,GAAG9B,GAASyC,EAAU,GAAGvG,GAAqB,IAAlB6F,EAAS/B,GAAayC,EAAU,GAAGvG,GAAG6F,EAAS/B,IAAU,EAAE,IAAIyC,EAAU,GAAGvG,GAAG6F,EAAS/B,IAAU,GAAG,IAAI0C,EAAqBxG,GAAG2F,EAAsB7B,GAASuC,EAAQrG,GAAGiG,EAAMa,EAAO,IAAI9G,IAAM,MAAO,CAACqG,EAAQC,EAAUC,EAAUC,IAEl7BQ,CAAaf,EAAMD,GAN7J,CAACE,EAAMC,KAAUtL,IAAIoM,EAAM,CAACC,EAAOC,KAA4BD,EAAOC,GAAkB,EAAE,MAAM,EAAGtM,IAAIuM,EAAS,CAAC,GAAG,GAAG,IAAIxB,EAAcnD,IAAI,CAAC4E,EAAER,KAAKO,EAAS,GAAGP,GAAK,IAAFQ,EAAMD,EAAS,GAAGP,GAAGQ,GAAG,EAAE,IAAID,EAAS,GAAGP,GAAGQ,GAAG,GAAG,MAAO,IAAIxM,IAAIuB,EAAI,EAAEA,EAAI,GAAGA,IAAOgL,EAAS,GAAGhL,GAAK6K,EAAMf,EAAMkB,EAAS,GAAGhL,IAAMgL,EAAS,GAAGhL,GAAK6K,EAAMd,EAAOiB,EAAS,GAAGhL,IAAO,IAAIvB,IAAIuB,EAAI,GAAGA,EAAI,GAAGA,IAAOgL,EAAS,GAAGhL,GAAK6K,EAAMf,EAAMkB,EAAS,GAAGhL,IAAMgL,EAAS,GAAGhL,GAAK6K,EAAMd,EAAOiB,EAAS,GAAGhL,IAAO,OAAOgL,GAMzaE,CAAepB,EAAMC,IAAoK,GAA1DoB,GAJjL,CAAClB,EAAQC,EAAUC,EAAUE,KAAU5L,IAAI2M,EAAO,CAACnB,EAAQC,EAAU,GAAGA,EAAU,GAAGA,EAAU,GAAGC,EAAU,GAAGA,EAAU,GAAGA,EAAU,IAAQkB,EAAK,CAACC,EAAMtL,IAAcoL,EAAOE,GAAOtL,GAAMvB,IAAI8M,EAAY,CAACC,EAAMF,EAAMG,EAAMC,KAAUjN,IAAIkN,EAAKD,EAAO,EAAME,EAAUC,KAAKC,IAAIJ,GAAQF,EAAUO,EAAIL,EAAOF,EAAM,EAAE/M,IAAIuN,EAAM,EAAMhM,EAAIwL,EAAM,KAAY,IAAJxL,GAAM,CAACvB,IAAIwN,EAAIZ,EAAKC,EAAMG,GAAOM,GAAIC,GAAOJ,IAAoBJ,IAAOQ,GAAOR,EAASG,EAAMM,IAAeA,GAAKA,KAAQb,EAAOE,KAASG,GAAOQ,EAAIA,GAAKF,IAAOtN,IAAIyN,EAAmBC,EAAkBC,EAAS,EAAE,IAAI3N,IAAIuB,EAAI,EAAEA,EAAIqK,EAAOpL,OAAO,EAAEe,IAAM,CAACvB,IAAIiJ,EAAQ2C,EAAOrK,GAAK,GAAOqM,EAAahC,EAAOrK,EAAI,GAAG,GAAOsM,EAAUlD,EAAUiD,GAAkBE,EAAKnD,EAAU1B,GAAgV8E,GAA3QL,EAAzDI,IAAOD,GAAWJ,EAAe7C,EAAe3B,GAAuB2B,EAAegD,IAAuBE,EAAKD,GAAWJ,EAAe5C,EAAc+C,GAA4BhD,EAAegD,KAAqBH,EAAe7C,EAAe3B,GAAuB4B,EAAc5B,KAAU0E,GAAU/B,EAAOrK,GAAK,IAA0BmM,GAAkBM,EAAYL,EAASF,EAAmBQ,EAAaR,EAAeC,EAAc,GAA0B,IAAtBO,EAAa,EAAE,KAAS,CAAuInB,GAAlIoB,EAAUtC,EAAOrK,GAAK,IAAI,IAAM4M,EAAWvC,EAAOrK,EAAI,GAAG,IAAI,GAAsG,EAAEyM,EAA5FxC,EAAQmC,EAASQ,GAAY3C,EAAQmC,EAASO,IAAiE,IAAIlO,IAAI6M,EAAM,EAAEA,EAAM,EAAEA,IAAQ,CAAC7M,IAAI4I,EAAMgE,EAAKC,EAAMkB,GAAWnB,EAAKC,EAAMmB,GAAalB,EAAYmB,EAAapB,EAAMmB,EAAYpF,KAAU,OAAO+E,EAAS/B,EAAOA,EAAOpL,OAAO,GAAG,IAI/2C4N,CAAkB5C,EAAQC,EAAUC,EAAUP,IAAcI,EAAU,IAAIvL,IAAIgM,EAAE,EAAEA,EAAER,EAAQhL,OAAOwL,IAAKR,EAAQQ,IAAIP,EAAU,GAAGO,IAAI,EAAIhM,IAAIqO,EAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,IAAI,IAAIrO,IAAIgM,EAAEN,EAAU,GAAGlL,OAAO,EAAK,GAAHwL,EAAKA,IAAKN,EAAU,GAAGM,GAAGqC,EAAiB3C,EAAU,GAAGM,IAAIN,EAAU,GAAGM,GAAGqC,EAAiB3C,EAAU,GAAGM,IAAIN,EAAU,GAAGM,GAAGqC,EAAiB3C,EAAU,GAAGM,IAAqE,MAArD,CAACU,EAAEjB,EAAUD,EAAQE,EAAUC,IAEnnB2C,EAAmBC,IAAavO,IAAIM,EAAO,IAAIC,WAAWgO,GAAgBC,EAAU,EAAMC,EAAkB,EAAMC,EAAO,CAAC9N,EAAMgD,KAAS+K,EAAc,IAAJ,GAAF/K,GAAS8K,EAAOE,IAAIhO,EAAM,CAAC+N,EAAOA,EAAOA,EAAOA,EAAOA,KAAyX,OAA9WD,EAAOE,IAAI,CAAChO,EAAMiO,KAA8J,KAA/CL,GAAxF,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,KAA0BC,GAAmB7N,IAAqB,GAAG,GAAGN,EAAOE,OAAQ,MAAM,IAAIuI,MAAM0F,EAAkB7N,EAAM,IAAIZ,IAAI8O,EAAE,EAAEA,EAAE,EAAEA,IAAKxO,GAAQkO,EAAU,GAAG,GAAGM,GAAGD,EAAMC,IAAMJ,EAAOK,IAAI,IAAYzO,EAAO0O,MAAM,EAAER,EAAU,GAAG,GAAWE,GAExkBO,EAAa,CAACC,EAAOC,EAAiBC,EAAchE,KAASpL,IAAIqP,GAAoB,EAAdD,GAAiB,EAAEpP,IAAIsP,EAAgB,IAALD,EAAS,MAAUE,EAAkB,IAAdH,EAAkBpP,IAAIwP,EAAa,CAACC,EAAOC,EAAOC,EAAOC,KAAU5P,IAAI6P,EAAI,EAAMC,EAAO7E,EAAYqE,EAAWC,GAAK,KAAqB,IAAP,IAAPO,GAAiBZ,EAAOO,EAAOC,GAAeR,EAAOS,EAAOC,GAASE,IAAS,IAAWD,MAAM,GAAS,IAANN,EAAQ,CAACvP,IAAIiM,EAAOb,GAAO,EAAE,IAAiC,IAAzBmE,EAAqB,IAAjBJ,EAAwBK,EAAa,EAAE,GAAG,EAAE,GAAGD,IAAMA,GAAK,IAAoB,MAAPtD,IAAY,OAAOsD,EAAIA,GAAQ,IAAqD,IAA7CvP,IAAI4P,EAAqC,IAA9BnF,EAAwB4E,GAAaG,EAAa,EAAE,EAAE,EAAEI,GAAqB,MAAJL,IAAS,OAAOJ,GAAsBY,EAAMC,GAA+B,IAA5B5C,KAAK6C,IAAI,EAAE7C,KAAK8C,IAAIF,EAAE,MAAU,EAAMG,EAAc,CAACjB,EAAOkB,EAAWC,EAAM5E,EAAUD,EAAQE,EAAUC,KAAwB3L,IAAIsQ,EAAaD,EAAUpE,EAAO,EAAMsE,EAAO,EAAMC,EAAO,EAAMrB,EAAiB,EAAM5N,EAAI,EAAMkP,EAAcjF,EAAQ,GAAOkF,EAAoB,IAAdD,EAAkB,EAAE,KAAML,GAAW,CAACpQ,IAAI6F,EAAM8F,EAAqBpK,GAAK,GAAiB,IAAP,IAANsE,GAAgBsJ,EAAiBF,EAAaC,EAAOC,EAAiBtJ,EAAM2F,EAAY,IAAJjK,IAAUA,GAAK,EAAE6O,GAAY,EAAEE,EAAaD,MAAY,CAAC,CAACrQ,IAAI4O,EAAI,GAAO+B,EAAU,IAAP1E,EAAe2E,EAAU,IAAPL,EAAeM,EAAU,IAAPL,EAAW,IAAIxQ,IAAI8O,EAAE,EAAEA,EAAE,EAAEA,IAAI,CAAC9O,IAAI8Q,EAAIf,EAAM,IAAIY,GAAI,GAAOI,EAAIhB,EAAM,IAAIa,GAAI,GAAOI,GAAK,IAAIH,GAAI,GAAG,KAAK,IAAI,IAA+II,GAAlIH,GAAuB,GAAlBpF,EAAU,GAAGnK,IAAkBwP,GAAuB,GAAlBrF,EAAU,GAAGnK,IAAkByP,GAAuB,GAAlBtF,EAAU,GAAGnK,KAAqC,GAAQ,IAAIqN,EAAIE,GAAO,EAAJmC,EAAMN,GAAsB,IAAlBlF,EAAU,GAAGlK,GAAS,EAAEqP,GAAsB,IAAlBnF,EAAU,GAAGlK,GAAS,EAAEsP,GAAsB,IAAlBpF,EAAU,GAAGlK,GAAS,EAAG2N,EAAON,IAAI,EAAEA,GAAqB,GAAkB,KAAjC0B,EAAmC,CAAoB,GAAnB/O,IAAmC,KAA7B6O,EAAgC,OAAOE,EAAaD,EAAuB,GAAmB,KAAnCI,EAAqC,CAAS,GAAW,KAAnBC,GAA8B,IAAR7K,EAAU,CAACoG,GAAcR,EAAU,GAAGlK,GAAKgP,GAAc9E,EAAU,GAAGlK,GAAKiP,GAAc/E,EAAU,GAAGlK,GAAK,SAAS4N,EAAiBF,EAAaC,EAAOC,EAAiBtJ,EAAM2F,EAAY,IAAJjK,KAAYkP,EAAcjF,EAAQjK,GAAKmP,EAAoB,IAAdD,EAAkB,EAAExE,EAAO,EAAEsE,EAAO,EAAEC,EAAO,IAItyD,SAAXU,EAAoB7I,GAAOrI,IAAImR,EAAyB,EAAjBC,UAAU5Q,aAAyB6Q,IAAfD,UAAU,GAAeA,UAAU,GAAG,GAAOE,GAlB/OjJ,IAAQ,IAAIA,EAAO,OAAO,EAAMrI,IAAIuJ,EAAWhI,GAAaA,IAAMgQ,EAAa/Q,OAAO,KAAK+Q,EAAahQ,GAAiE8H,EAAc,CAAC9H,EAAIqH,EAAM4I,EAAYhR,KAAU,IAAIR,IAAIgM,EAAEuF,EAAa/Q,OAAO,EAAEwL,GAAGzK,EAAIyK,IAAKuF,EAAavF,EAAE,GAAGuF,EAAavF,GAAGyF,EAAczF,EAAE,GAAGhC,EAAUgC,GAAG3B,EAAO2B,EAAE,GAAGxC,EAAUwC,GAAIuF,EAAahQ,GAAKqH,EAAM6I,EAAclQ,GAAY,EAAPf,EAAS6J,EAAO9I,GAAKiQ,GAAcxR,IAAIwJ,EAAUjI,GAAiB,EAAZ8I,EAAO9I,GAAuEyI,EAAUzI,GAAwB,EAAnBkQ,EAAclQ,GAAOvB,IAAI+J,EAAU,CAACxI,EAAIf,KAAUiR,EAAclQ,GAAKf,GAASR,IAAIqK,EAAO,GAAOoH,EAAc,GAAOF,EAAa,GAAOhQ,EAAI,EAAiY,OAA/X6G,EAAQC,EAAMO,IAAQyB,EAAO9I,GAAK,EAAEkQ,EAAclQ,GAAK,EAAEgQ,EAAahQ,KAAOqH,GAAQA,IAAQyB,EAAO9I,EAAI,GAAGqH,IAASQ,EAAQC,EAA5qB,CAAC9H,EAAIqH,KAAS2I,EAAahQ,GAAKqH,GAAqqBW,EAAWC,GAAWW,EAAWZ,EAAWC,EAAjZ,CAACjI,EAAIiQ,KAAenH,EAAO9I,GAAKiQ,IAAsYlH,EAAiBf,EAAWC,EAAUO,GAAWD,EAAcP,EAAWQ,EAAUC,GAAWO,EAAsChB,EAAWF,EAAcG,GAAkB+H,EAAa3J,IAAI,CAAC4E,EAAER,IAAIQ,EAAE,CAACA,EAAmB,EAAjBiF,EAAczF,GAAe,EAAV3B,EAAO2B,IAAM,MAAM0F,OAAOlF,GAAGA,IAkB14BmF,CAAOtJ,GAAO,IAAG,IAAQiJ,EAAe,OAAA,EAAaM,CAF1PxG,OAAciG,KAARjG,EAEoQ+F,EAAQ/F,OAF1P,GAAS,IAANA,EAAUC,OAAcgG,KAARhG,EAE6O8F,EAAQ9F,OAFnO,IAAU,IAANA,EAAUC,OAAgB+F,KAAT/F,EAEoN6F,EAAQ7F,QAFzM,IAAW,IAAPA,EAAW+E,EAAkB,KAE+Kc,EAAQd,OAF3L,IAAQ9E,EAEyL4F,EAAQ5F,WAF9K,EAE6FqG,IAF5QvB,EAAyLwB,EAAU3G,EAAcC,EAASC,EAAMC,EAAMC,EAAOC,GAAUvL,IAAIkP,EAAOZ,EAAmB,MAAMnD,EAAS2G,OAAO,CAAClL,EAAI4F,IAAI5F,EAAI4F,EAAE,GAAG,GAAG6D,EAAM,GAAG,GAAK,CAAC3D,EAAEjB,EAAUD,EAAQE,EAAUC,GAAsBkG,EAAyF,OAA/E1B,EAAcjB,EAAOxC,EAAE2D,EAAM5E,EAAUD,EAAQE,EAAUC,GAA6BuD,EAAOH,OAEtY/O,IAE1I+R,EAxCmvF1J,IAAQrI,IAAIK,EAAK,IAAIgI,EAAM2J,cAAkB/K,EAAS,EAAEgL,EAAO,GAAOC,EAAgB,CAACC,EAAOC,KAAanL,GAAUmL,EAAUH,GAAQE,GAAarM,EAAE,EAAE,KAAMmB,EAAS5G,EAAKG,QAAQsF,IAAI,KAAM,CAAC9F,IAAIqS,EAAYhS,EAAK4G,GAAU,GAAiB,MAAdoL,GAAmBrM,EAAQ3F,EAAK4G,EAAS,EAFh/F,GAEigG,GAAGpB,EAAMwM,EAFt/F,GAEkhG1K,EAAO2K,KAAKzK,GAAcA,EAAKxH,EAAK4G,EAASiL,SAA4B,GAA4B,IAAzBxQ,EAAU2Q,GAAb,CAA+B,IAAIxM,EAAMwM,EAAYzM,GAAqB,OAAO,EAAM8B,EAAM2K,GAAaC,KAAKzK,GAAcA,EAAKxH,EAAK4G,EAASiL,SAA4BD,GAAQ,IAAIhL,SAAoBgL,GAAQ,IAAIhL,IAAY,OAAOgL,GAwC50GM,EAAKrB,EAAesB,EAFrC,CAACnK,EAAM8I,KAAgD,IAAG,KAApC7Q,EAAO4Q,EAAW7I,EAAM8I,IAAmC,OAAA,EAAasB,CAAAA,IA5CgkBnS,EA4CviBA,EA5CgjBN,IAAI0S,EAAM,IAAIC,aAAarS,EAAOE,QAAQ,IAAIR,IAAIgM,EAAE,EAAEA,EAAE1L,EAAOE,OAAOwL,IAAK0G,EAAM1G,IAAI1L,EAAO0L,GAAG,KAAK,IAAK,OAAO0G,IA8CluB,SAASE,EAAMzB,GAASnR,IAAI6S,EAAK1B,GAAS,GAAO2B,EAAe,CAACzS,EAAK0S,IAAiBA,GAAUF,EAAKE,SAAuC1S,EAAK2R,cAA1BD,EAAQ1R,GAAiC2S,KAAKT,KAAK,CAAClS,EAAK0S,IAAWR,EAAKO,EAAezS,EAAK0S,GAAUF,GAAMG,KAAKR,MAAM,CAACnS,EAAK0S,IAAWP,EAAMM,EAAezS,EAAK0S,GAAUF,GAAMG,KAAKC,MAAM,CAAC5S,EAAK0S,KA9CiN,GAA3D1R,EA8ChI2R,KAAKR,MAAMnS,EAAK0S,GA9CiJ5R,EAAhB,OAAOA,EAAiB,IAAI+R,aAAkB/R,EAAgCgS,CAAAA,IAA1mBhS,EAA+mBA,EAAvmBE,EAA+mBA,EAAhmBrB,IAAIoT,EAAUC,EAAQ,IAAIC,QAAQ,CAACC,EAAQC,KAAUxT,IAAIyG,EAAOtF,EAAQsS,qBAAyBC,EAAYvS,EAAQwS,aAAa,EAAEtS,EAAYb,OAAO,OAAWF,EAAOoT,EAAYE,eAAe,GAAG,IAAI5T,IAAIgM,EAAE,EAAEA,EAAE3K,EAAYb,OAAOwL,IAAK1L,EAAO0L,GAAG3K,EAAY2K,GAAIvF,EAAOnG,OAAOoT,EAAYjN,EAAOoN,QAAQ1S,EAAQ2S,aAAarN,EAAOsN,QAAQ,KAAKR,GAAQ,IAAQH,EAAMY,IAASvN,EAAOwN,aAAaT,EAAOQ,IAAUvN,EAAOyN,MAAM,KAA0B,OAApBb,EAAQD,MAAMA,EAAaC,EAAiH,MAAM,IAAItK,OA8CvLiK,KAAKmB,SAAS,CAAC9T,EAAK0S,KAAYqB,CA9CggC/S,EA8Cn/B2R,KAAKT,KAAKlS,EAAK0S,GA9C6gCsB,EAAK,IAAIC,KAAK,CAAClT,EAAYC,IAAc,CAACkT,KAAK,mBAAmBvU,IAAIwU,EAAIC,OAAOC,KAAKD,OAAOE,UAAoDC,GAAtCC,EAAQL,EAAIM,gBAAgBT,GAAYU,SAASC,cAAc,MA8CntCZ,OA9CwtCQ,EAAEK,KAAKJ,EAAQD,EAAErO,OAAO,SAASqO,EAAET,SAAhO,UAAkPY,SAASG,KAAKC,YAAYP,GAAGA,EAAEQ,QAAQL,SAASG,KAAKG,YAAYT,QAAGJ,EAAIc,gBAAgBT,KA8C5zC7B,KAAKuC,IAAI,CAAClV,EAAK0S,IAAW3R,EAAY4R,KAAKT,KAAKlS,EAAK0S,IAE9iB,OAF0jBH,EAAML,KAAKA,EAAKK,EAAMJ,MAAMA,EAAMI,EAAMb,QAAQA,EAEnmBa,EAxDT,IAAW4C,EAIRxC,KAHkB,iBAAZyC,SAA0C,oBAAXC,OAAyBA,OAAOD,QAAU1V,IAC9D,mBAAX4V,QAAyBA,OAAOC,IAAMD,OAAO5V,IACnDyV,EAA+B,oBAAfK,WAA6BA,WAAaL,GAAUM,MAAalD,MAAQ7S"} \ No newline at end of file +{"version":3,"file":"samjs.min.js","sources":["0"],"names":["factory","let","matchesBitmask","bits","mask","text2Uint8Array","text","buffer","Uint8Array","length","split","forEach","e","index","charCodeAt","Uint32ToUint8Array","uint32","result","Uint16ToUint8Array","uint16","context","ToWavBuffer","audiobuffer","realbuffer","pos","write","set","charFlags"," ","!","\"","#","$","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","\\","]","^","_","`","FLAG_ALPHA_OR_QUOT","flags","c","flg","flagsAt","isOneOf","list","indexOf","reciterRule","ruleString","splitted","target","pop","source","join","tmp","pre","match","post","TCS","EIY","inputPos","callback","startsWith","rulePos","ruleByte","substr","inputChar","rules","rules2","map","rule","r","push","StressTable","PhonemeNameTable","phonemeFlags","combinedPhonemeLengthTable","full_match","sign1","sign2","findIndex","value","single_match","Parser1","input","addPhoneme","addStress","srcPos","Error","phonemeHasFlag","phoneme","flag","pR","pD","pT","PHONEME_PERIOD","PHONEME_QUESTION","FLAG_FRICATIVE","FLAG_LIQUIC","FLAG_NASAL","FLAG_ALVEOLAR","FLAG_PUNCT","FLAG_VOWEL","FLAG_CONSONANT","FLAG_DIP_YX","FLAG_DIPHTHONG","FLAG_0008","FLAG_VOICED","FLAG_STOPCONS","FLAG_UNVOICED_STOPCONS","Parser2","insertPhoneme","setPhoneme","getPhoneme","getStress","handleUW_CH_J","changeAX","position","suffix","priorPhoneme","AdjustLengths","setLength","getLength","loopIndex","CopyStress","setStress","stress","SetPhonemeLength","ProlongPlosiveStopConsonantsCode41240","nextNonEmpty","sampledConsonantValues0","stressPitch_tab47492","blendRank","outBlendLength","inBlendLength","sampledConsonantFlags","frequencyData","ampldata","sampleTable","SetMouthThroat","mouth","throat","trans","factor","initialFrequency","freqdata","v","i","CreateTransitions","pitches","frequency","amplitude","tuples","tables","Read","table","interpolate","width","frame","change","sign","remainder","Math","abs","div","error","val","outBlendFrames","inBlendFrames","boundary","next_phoneme","next_rank","rank","trans_end","trans_start","trans_length","cur_width","next_width","RISING_INFLECTION","FALLING_INFLECTION","CreateFrames","pitch","AddInflection","inflection","end","sampledConsonantFlag","phase1","frames","PrepareFrames","phonemes","singmode","t","amplitudeRescale","CreateOutputBuffer","buffersize","bufferpos","oldTimeTableIndex","writer","scaled","ary","array","k","get","slice","RenderSample","Output","lastSampleOffset","consonantFlag","kind","samplePage","off","renderSample","index1","value1","index0","value0","bit","sample","sinus","x","sin","PI","ProcessFrames","frameCount","speed","speedcounter","phase2","phase3","glottal_pulse","mem38","p1","p2","p3","sp1","sp2","rp3","mux","SamProcess","options","arguments","undefined","parsed","phonemeindex","stressValue","phonemeLength","filter","sentences","reduce","convert","toUpperCase","output","successCallback","append","inputSkip","currentChar","some","buf8","buf32","Uint8ArrayToFloat32Array","audio","Float32Array","SamJs","opts","ensurePhonetic","phonetic","this","speak","AudioContext","Play","abort","promise","Promise","resolve","reject","createBufferSource","soundBuffer","createBuffer","getChannelData","connect","destination","onended","reason","disconnect","start","download","a","blob","Blob","type","fileURL","url","window","URL","webkitURL","createObjectURL","document","createElement","href","body","appendChild","click","removeChild","revokeObjectURL","wav","global","exports","module","define","amd","globalThis","self"],"mappings":"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AAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,E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"} \ No newline at end of file From 6c3755c1f86b0b44ff19ccc946848e934bf1bd60 Mon Sep 17 00:00:00 2001 From: Christian Schiffler Date: Mon, 22 Jul 2024 18:36:54 +0200 Subject: [PATCH 4/4] Publish version 0.3.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 714b8d3..fc5d42e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sam-js", - "version": "0.3.0", + "version": "0.3.1", "description": "SAM - The Software Automatic Mouth", "author": "Christian Schiffler ", "private": false,