@kongyo2/kongyoroid 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/README.md +233 -0
  2. package/dist/cache.d.ts +32 -7
  3. package/dist/cache.d.ts.map +1 -1
  4. package/dist/cache.js +138 -9
  5. package/dist/cache.js.map +1 -1
  6. package/dist/cli/flags.d.ts +270 -0
  7. package/dist/cli/flags.d.ts.map +1 -0
  8. package/dist/cli/flags.js +240 -0
  9. package/dist/cli/flags.js.map +1 -0
  10. package/dist/cli/help.d.ts +11 -0
  11. package/dist/cli/help.d.ts.map +1 -0
  12. package/dist/cli/help.js +336 -0
  13. package/dist/cli/help.js.map +1 -0
  14. package/dist/cli.js +598 -232
  15. package/dist/cli.js.map +1 -1
  16. package/dist/errors.d.ts +43 -3
  17. package/dist/errors.d.ts.map +1 -1
  18. package/dist/errors.js +56 -3
  19. package/dist/errors.js.map +1 -1
  20. package/dist/index.d.ts +59 -22
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +32 -14
  23. package/dist/index.js.map +1 -1
  24. package/dist/io.d.ts +11 -0
  25. package/dist/io.d.ts.map +1 -1
  26. package/dist/io.js +149 -5
  27. package/dist/io.js.map +1 -1
  28. package/dist/kongyoroid.d.ts +237 -10
  29. package/dist/kongyoroid.d.ts.map +1 -1
  30. package/dist/kongyoroid.js +777 -86
  31. package/dist/kongyoroid.js.map +1 -1
  32. package/dist/limits.d.ts +5 -0
  33. package/dist/limits.d.ts.map +1 -1
  34. package/dist/limits.js +6 -1
  35. package/dist/limits.js.map +1 -1
  36. package/dist/request.d.ts +1 -0
  37. package/dist/request.d.ts.map +1 -1
  38. package/dist/request.js +102 -15
  39. package/dist/request.js.map +1 -1
  40. package/dist/schema.d.ts +3 -0
  41. package/dist/schema.d.ts.map +1 -1
  42. package/dist/schema.js +271 -68
  43. package/dist/schema.js.map +1 -1
  44. package/dist/song/mml.d.ts +15 -0
  45. package/dist/song/mml.d.ts.map +1 -0
  46. package/dist/song/mml.js +184 -0
  47. package/dist/song/mml.js.map +1 -0
  48. package/dist/song/pitch.d.ts.map +1 -0
  49. package/dist/{pitch.js → song/pitch.js} +1 -1
  50. package/dist/song/pitch.js.map +1 -0
  51. package/dist/song/score.d.ts +92 -0
  52. package/dist/song/score.d.ts.map +1 -0
  53. package/dist/song/score.js +454 -0
  54. package/dist/song/score.js.map +1 -0
  55. package/dist/synth/acoustics.d.ts +27 -0
  56. package/dist/synth/acoustics.d.ts.map +1 -0
  57. package/dist/synth/acoustics.js +608 -0
  58. package/dist/synth/acoustics.js.map +1 -0
  59. package/dist/synth/analysis.d.ts +22 -0
  60. package/dist/synth/analysis.d.ts.map +1 -0
  61. package/dist/synth/analysis.js +170 -0
  62. package/dist/synth/analysis.js.map +1 -0
  63. package/dist/synth/engine.d.ts +115 -0
  64. package/dist/synth/engine.d.ts.map +1 -0
  65. package/dist/synth/engine.js +223 -0
  66. package/dist/synth/engine.js.map +1 -0
  67. package/dist/synth/filters.d.ts +60 -0
  68. package/dist/synth/filters.d.ts.map +1 -0
  69. package/dist/synth/filters.js +166 -0
  70. package/dist/synth/filters.js.map +1 -0
  71. package/dist/synth/glottal.d.ts +20 -0
  72. package/dist/synth/glottal.d.ts.map +1 -0
  73. package/dist/synth/glottal.js +76 -0
  74. package/dist/synth/glottal.js.map +1 -0
  75. package/dist/synth/phonemes.d.ts +42 -0
  76. package/dist/synth/phonemes.d.ts.map +1 -0
  77. package/dist/synth/phonemes.js +311 -0
  78. package/dist/synth/phonemes.js.map +1 -0
  79. package/dist/synth/plan.d.ts +127 -0
  80. package/dist/synth/plan.d.ts.map +1 -0
  81. package/dist/synth/plan.js +81 -0
  82. package/dist/synth/plan.js.map +1 -0
  83. package/dist/synth/prosody.d.ts +30 -0
  84. package/dist/synth/prosody.d.ts.map +1 -0
  85. package/dist/synth/prosody.js +46 -0
  86. package/dist/synth/prosody.js.map +1 -0
  87. package/dist/synth/random.d.ts +15 -0
  88. package/dist/synth/random.d.ts.map +1 -0
  89. package/dist/synth/random.js +59 -0
  90. package/dist/synth/random.js.map +1 -0
  91. package/dist/synth/renderer.d.ts +77 -0
  92. package/dist/synth/renderer.d.ts.map +1 -0
  93. package/dist/synth/renderer.js +343 -0
  94. package/dist/synth/renderer.js.map +1 -0
  95. package/dist/synth/song.d.ts +30 -0
  96. package/dist/synth/song.d.ts.map +1 -0
  97. package/dist/synth/song.js +453 -0
  98. package/dist/synth/song.js.map +1 -0
  99. package/dist/synth/speech.d.ts +49 -0
  100. package/dist/synth/speech.d.ts.map +1 -0
  101. package/dist/synth/speech.js +354 -0
  102. package/dist/synth/speech.js.map +1 -0
  103. package/dist/synth/stream.d.ts +26 -0
  104. package/dist/synth/stream.d.ts.map +1 -0
  105. package/dist/synth/stream.js +67 -0
  106. package/dist/synth/stream.js.map +1 -0
  107. package/dist/synth/textstream.d.ts +35 -0
  108. package/dist/synth/textstream.d.ts.map +1 -0
  109. package/dist/synth/textstream.js +127 -0
  110. package/dist/synth/textstream.js.map +1 -0
  111. package/dist/synth/voice.d.ts +64 -0
  112. package/dist/synth/voice.d.ts.map +1 -0
  113. package/dist/synth/voice.js +208 -0
  114. package/dist/synth/voice.js.map +1 -0
  115. package/dist/text/dictionary.d.ts +50 -0
  116. package/dist/text/dictionary.d.ts.map +1 -0
  117. package/dist/text/dictionary.js +0 -0
  118. package/dist/text/dictionary.js.map +1 -0
  119. package/dist/text/frontend.d.ts +34 -0
  120. package/dist/text/frontend.d.ts.map +1 -0
  121. package/dist/text/frontend.js +550 -0
  122. package/dist/text/frontend.js.map +1 -0
  123. package/dist/text/lexicon.d.ts +10 -0
  124. package/dist/text/lexicon.d.ts.map +1 -0
  125. package/dist/text/lexicon.js +763 -0
  126. package/dist/text/lexicon.js.map +1 -0
  127. package/dist/{mora.d.ts → text/mora.d.ts} +15 -3
  128. package/dist/text/mora.d.ts.map +1 -0
  129. package/dist/{mora.js → text/mora.js} +87 -9
  130. package/dist/text/mora.js.map +1 -0
  131. package/dist/text/normalize.d.ts +34 -0
  132. package/dist/text/normalize.d.ts.map +1 -0
  133. package/dist/text/normalize.js +496 -0
  134. package/dist/text/normalize.js.map +1 -0
  135. package/dist/text/notation.d.ts +32 -0
  136. package/dist/text/notation.d.ts.map +1 -0
  137. package/dist/text/notation.js +182 -0
  138. package/dist/text/notation.js.map +1 -0
  139. package/dist/text/reading.d.ts +52 -0
  140. package/dist/text/reading.d.ts.map +1 -0
  141. package/dist/text/reading.js +32 -0
  142. package/dist/text/reading.js.map +1 -0
  143. package/dist/text/sentences.d.ts +10 -0
  144. package/dist/text/sentences.d.ts.map +1 -0
  145. package/dist/text/sentences.js +84 -0
  146. package/dist/text/sentences.js.map +1 -0
  147. package/dist/{text.d.ts → text/split.d.ts} +2 -2
  148. package/dist/text/split.d.ts.map +1 -0
  149. package/dist/{text.js → text/split.js} +2 -2
  150. package/dist/text/split.js.map +1 -0
  151. package/dist/types.d.ts +58 -3
  152. package/dist/types.d.ts.map +1 -1
  153. package/dist/version.d.ts +4 -0
  154. package/dist/version.d.ts.map +1 -1
  155. package/dist/version.js +5 -1
  156. package/dist/version.js.map +1 -1
  157. package/dist/voicevox/client.d.ts +1 -1
  158. package/dist/voicevox/client.d.ts.map +1 -1
  159. package/dist/voicevox/dictionary.js +1 -1
  160. package/dist/voicevox/dictionary.js.map +1 -1
  161. package/dist/voicevox/song.js +1 -1
  162. package/dist/voicevox/song.js.map +1 -1
  163. package/dist/voicevox/speech.d.ts +1 -0
  164. package/dist/voicevox/speech.d.ts.map +1 -1
  165. package/dist/voicevox/speech.js +8 -2
  166. package/dist/voicevox/speech.js.map +1 -1
  167. package/docs/cli.md +251 -0
  168. package/examples/batch.jsonl +4 -3
  169. package/examples/builtin/dictionary.json +7 -0
  170. package/examples/builtin/song-compact.json +13 -0
  171. package/examples/builtin/song-mml.json +9 -0
  172. package/examples/builtin/song-notes.json +25 -0
  173. package/examples/builtin/speech-dictionary.json +9 -0
  174. package/examples/builtin/speech-kana.json +7 -0
  175. package/examples/builtin/speech.json +7 -0
  176. package/package.json +11 -3
  177. package/dist/formant.d.ts +0 -34
  178. package/dist/formant.d.ts.map +0 -1
  179. package/dist/formant.js +0 -622
  180. package/dist/formant.js.map +0 -1
  181. package/dist/mora.d.ts.map +0 -1
  182. package/dist/mora.js.map +0 -1
  183. package/dist/notation.d.ts +0 -15
  184. package/dist/notation.d.ts.map +0 -1
  185. package/dist/notation.js +0 -114
  186. package/dist/notation.js.map +0 -1
  187. package/dist/pitch.d.ts.map +0 -1
  188. package/dist/pitch.js.map +0 -1
  189. package/dist/score.d.ts +0 -37
  190. package/dist/score.d.ts.map +0 -1
  191. package/dist/score.js +0 -166
  192. package/dist/score.js.map +0 -1
  193. package/dist/text.d.ts.map +0 -1
  194. package/dist/text.js.map +0 -1
  195. package/examples/song-notes.json +0 -24
  196. /package/dist/{pitch.d.ts → song/pitch.d.ts} +0 -0
  197. /package/examples/{song.json → voicevox/song.json} +0 -0
  198. /package/examples/{speech-kana.json → voicevox/speech-kana.json} +0 -0
  199. /package/examples/{speech.json → voicevox/speech.json} +0 -0
@@ -0,0 +1,166 @@
1
+ export class Resonator {
2
+ a = 1;
3
+ b = 0;
4
+ c = 0;
5
+ y1 = 0;
6
+ y2 = 0;
7
+ frequency = 0;
8
+ bandwidth = 0;
9
+ tune(frequency, bandwidth, sampleRate) {
10
+ if (frequency === this.frequency && bandwidth === this.bandwidth)
11
+ return;
12
+ this.frequency = frequency;
13
+ this.bandwidth = bandwidth;
14
+ const limited = Math.min(frequency, sampleRate * 0.47);
15
+ const r = Math.exp((-Math.PI * bandwidth) / sampleRate);
16
+ this.c = -r * r;
17
+ this.b = 2 * r * Math.cos((2 * Math.PI * limited) / sampleRate);
18
+ this.a = 1 - this.b - this.c;
19
+ }
20
+ step(x) {
21
+ const y = this.a * x + this.b * this.y1 + this.c * this.y2;
22
+ this.y2 = this.y1;
23
+ this.y1 = y;
24
+ return y;
25
+ }
26
+ reset() {
27
+ this.y1 = 0;
28
+ this.y2 = 0;
29
+ }
30
+ }
31
+ export class AntiResonator {
32
+ a = 1;
33
+ b = 0;
34
+ c = 0;
35
+ x1 = 0;
36
+ x2 = 0;
37
+ frequency = 0;
38
+ bandwidth = 0;
39
+ tune(frequency, bandwidth, sampleRate) {
40
+ if (frequency === this.frequency && bandwidth === this.bandwidth)
41
+ return;
42
+ this.frequency = frequency;
43
+ this.bandwidth = bandwidth;
44
+ const limited = Math.min(frequency, sampleRate * 0.47);
45
+ const r = Math.exp((-Math.PI * bandwidth) / sampleRate);
46
+ const c = -r * r;
47
+ const b = 2 * r * Math.cos((2 * Math.PI * limited) / sampleRate);
48
+ const a = 1 - b - c;
49
+ this.a = 1 / a;
50
+ this.b = -b / a;
51
+ this.c = -c / a;
52
+ }
53
+ step(x) {
54
+ const y = this.a * x + this.b * this.x1 + this.c * this.x2;
55
+ this.x2 = this.x1;
56
+ this.x1 = x;
57
+ return y;
58
+ }
59
+ reset() {
60
+ this.x1 = 0;
61
+ this.x2 = 0;
62
+ }
63
+ }
64
+ export class OnePole {
65
+ coefficient = 0;
66
+ y1 = 0;
67
+ setCutoff(hz, sampleRate) {
68
+ this.coefficient = Math.exp((-2 * Math.PI * hz) / sampleRate);
69
+ }
70
+ setTimeConstant(seconds, sampleRate) {
71
+ this.coefficient = seconds <= 0 ? 0 : Math.exp(-1 / (seconds * sampleRate));
72
+ }
73
+ step(x) {
74
+ this.y1 = x + this.coefficient * (this.y1 - x);
75
+ return this.y1;
76
+ }
77
+ get value() {
78
+ return this.y1;
79
+ }
80
+ reset(value = 0) {
81
+ this.y1 = value;
82
+ }
83
+ }
84
+ export class DcBlocker {
85
+ r;
86
+ x1 = 0;
87
+ y1 = 0;
88
+ constructor(cutoffHz, sampleRate) {
89
+ this.r = Math.exp((-2 * Math.PI * cutoffHz) / sampleRate);
90
+ }
91
+ step(x) {
92
+ const y = x - this.x1 + this.r * this.y1;
93
+ this.x1 = x;
94
+ this.y1 = y;
95
+ return y;
96
+ }
97
+ }
98
+ export class HighPass {
99
+ r;
100
+ x1 = 0;
101
+ y1 = 0;
102
+ constructor(cutoffHz, sampleRate) {
103
+ this.r = Math.exp((-2 * Math.PI * cutoffHz) / sampleRate);
104
+ }
105
+ step(x) {
106
+ const y = this.r * (this.y1 + x - this.x1);
107
+ this.x1 = x;
108
+ this.y1 = y;
109
+ return y;
110
+ }
111
+ }
112
+ export function smoothingCoefficient(tauSeconds, hopSamples, sampleRate) {
113
+ if (tauSeconds <= 0)
114
+ return 1;
115
+ return 1 - Math.exp(-hopSamples / (tauSeconds * sampleRate));
116
+ }
117
+ export class HalfBandDecimator {
118
+ taps;
119
+ history;
120
+ position = 0;
121
+ constructor(taps = 31) {
122
+ const coefficients = new Float64Array(taps);
123
+ const center = (taps - 1) / 2;
124
+ let sum = 0;
125
+ for (let index = 0; index < taps; index++) {
126
+ const n = index - center;
127
+ const sinc = n === 0 ? 0.5 : Math.sin((Math.PI * n) / 2) / (Math.PI * n);
128
+ const window = 0.42 - 0.5 * Math.cos((2 * Math.PI * index) / (taps - 1)) + 0.08 * Math.cos((4 * Math.PI * index) / (taps - 1));
129
+ coefficients[index] = sinc * window;
130
+ sum += sinc * window;
131
+ }
132
+ for (let index = 0; index < taps; index++)
133
+ coefficients[index] = (coefficients[index] ?? 0) / sum;
134
+ this.taps = coefficients;
135
+ this.history = new Float64Array(taps);
136
+ }
137
+ push(sample) {
138
+ this.history[this.position] = sample;
139
+ this.position = (this.position + 1) % this.history.length;
140
+ }
141
+ output() {
142
+ const length = this.history.length;
143
+ let acc = 0;
144
+ let index = this.position;
145
+ for (let k = 0; k < length; k++) {
146
+ index = index === 0 ? length - 1 : index - 1;
147
+ acc += (this.taps[k] ?? 0) * (this.history[index] ?? 0);
148
+ }
149
+ return acc;
150
+ }
151
+ }
152
+ export function dbToGain(db) {
153
+ return db <= -120 ? 0 : 10 ** (db / 20);
154
+ }
155
+ export function gainToDb(gain) {
156
+ return gain <= 0 ? -120 : 20 * Math.log10(gain);
157
+ }
158
+ export function softLimit(x, knee = 0.85) {
159
+ const magnitude = Math.abs(x);
160
+ if (magnitude <= knee)
161
+ return x;
162
+ const excess = (magnitude - knee) / (1 - knee);
163
+ const limited = knee + (1 - knee) * Math.tanh(excess);
164
+ return x < 0 ? -limited : limited;
165
+ }
166
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/synth/filters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface LfShape {
2
+ readonly te: number;
3
+ readonly tp: number;
4
+ readonly ta: number;
5
+ readonly alpha: number;
6
+ readonly epsilon: number;
7
+ readonly omega: number;
8
+ readonly e0: number;
9
+ readonly returnTail: number;
10
+ }
11
+ export declare function rdToTimingRatios(rd: number): {
12
+ readonly ra: number;
13
+ readonly rk: number;
14
+ readonly rg: number;
15
+ };
16
+ export declare function solveLfShape(rd: number): LfShape;
17
+ export declare function lfDerivative(shape: LfShape, phase: number): number;
18
+ export declare function lfShapeFor(rd: number): LfShape;
19
+ export declare function lfOpenPhaseWeight(shape: LfShape, phase: number): number;
20
+ //# sourceMappingURL=glottal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glottal.d.ts","sourceRoot":"","sources":["../../src/synth/glottal.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAM9G;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAuChD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlE;AAKD,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAQ9C;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIvE"}
@@ -0,0 +1,76 @@
1
+ export function rdToTimingRatios(rd) {
2
+ const clamped = Math.min(2.7, Math.max(0.3, rd));
3
+ const ra = (-1 + 4.8 * clamped) / 100;
4
+ const rk = (22.4 + 11.8 * clamped) / 100;
5
+ const rg = rk / (4 * ((0.11 * clamped) / (0.5 + 1.2 * rk) - ra));
6
+ return { ra: Math.max(0.005, ra), rk, rg };
7
+ }
8
+ export function solveLfShape(rd) {
9
+ const { ra, rk, rg } = rdToTimingRatios(rd);
10
+ const tp = 1 / (2 * rg);
11
+ const te = tp * (1 + rk);
12
+ const ta = ra;
13
+ const tc = 1;
14
+ const omega = Math.PI / tp;
15
+ const tail = tc - te;
16
+ let epsilon = 1 / ta;
17
+ for (let iteration = 0; iteration < 60; iteration++) {
18
+ const next = (1 - Math.exp(-epsilon * tail)) / ta;
19
+ if (Math.abs(next - epsilon) < 1e-9 * Math.max(1, epsilon)) {
20
+ epsilon = next;
21
+ break;
22
+ }
23
+ epsilon = next;
24
+ }
25
+ const returnTail = Math.exp(-epsilon * tail);
26
+ const returnArea = (1 / (epsilon * ta)) * ((1 - returnTail) / epsilon - tail * returnTail);
27
+ const theta = omega * te;
28
+ const sinTheta = Math.sin(theta);
29
+ const cosTheta = Math.cos(theta);
30
+ const openArea = (alpha) => {
31
+ const expo = Math.exp(alpha * te);
32
+ const numerator = expo * (alpha * sinTheta - omega * cosTheta) + omega;
33
+ return -numerator / ((alpha * alpha + omega * omega) * expo * sinTheta);
34
+ };
35
+ let low = -200;
36
+ let high = 200;
37
+ let alpha = 0;
38
+ for (let iteration = 0; iteration < 100; iteration++) {
39
+ alpha = (low + high) / 2;
40
+ const value = openArea(alpha);
41
+ if (value > returnArea)
42
+ low = alpha;
43
+ else
44
+ high = alpha;
45
+ if (high - low < 1e-8)
46
+ break;
47
+ }
48
+ const e0 = -1 / (Math.exp(alpha * te) * sinTheta);
49
+ return { te, tp, ta, alpha, epsilon, omega, e0, returnTail };
50
+ }
51
+ export function lfDerivative(shape, phase) {
52
+ if (phase < shape.te) {
53
+ return shape.e0 * Math.exp(shape.alpha * phase) * Math.sin(shape.omega * phase);
54
+ }
55
+ const tail = Math.exp(-shape.epsilon * (phase - shape.te));
56
+ return -(tail - shape.returnTail) / (shape.epsilon * shape.ta);
57
+ }
58
+ const SHAPE_CACHE_STEPS = 48;
59
+ const shapeCache = new Array(SHAPE_CACHE_STEPS + 1).fill(undefined);
60
+ export function lfShapeFor(rd) {
61
+ const clamped = Math.min(2.7, Math.max(0.3, rd));
62
+ const slot = Math.round(((clamped - 0.3) / 2.4) * SHAPE_CACHE_STEPS);
63
+ const cached = shapeCache[slot];
64
+ if (cached !== undefined)
65
+ return cached;
66
+ const shape = solveLfShape(0.3 + (slot / SHAPE_CACHE_STEPS) * 2.4);
67
+ shapeCache[slot] = shape;
68
+ return shape;
69
+ }
70
+ export function lfOpenPhaseWeight(shape, phase) {
71
+ if (phase >= shape.te)
72
+ return 0;
73
+ const rise = shape.tp;
74
+ return phase < rise ? phase / rise : 1 - (phase - rise) / (shape.te - rise);
75
+ }
76
+ //# sourceMappingURL=glottal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glottal.js","sourceRoot":"","sources":["../../src/synth/glottal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { Consonant, Phoneme, Vowel } from "../text/mora.ts";
2
+ export type PhonemeKind = "vowel" | "devoiced" | "nasal" | "moraic-nasal" | "stop" | "fricative" | "affricate" | "glide" | "flap" | "closure" | "silence";
3
+ export interface FricationSpec {
4
+ readonly f1: number;
5
+ readonly bw1: number;
6
+ readonly g1: number;
7
+ readonly f2: number;
8
+ readonly bw2: number;
9
+ readonly g2: number;
10
+ readonly hp: number;
11
+ }
12
+ export interface PhonemeSpec {
13
+ readonly kind: PhonemeKind;
14
+ readonly voiced: boolean;
15
+ readonly f: readonly [number, number, number];
16
+ readonly bw: readonly [number, number, number];
17
+ readonly av: number;
18
+ readonly duration: number;
19
+ readonly locus: readonly [number, number, number] | null;
20
+ readonly transition: number;
21
+ readonly fric: FricationSpec | null;
22
+ readonly af: number;
23
+ readonly closure: number;
24
+ readonly burst: number;
25
+ readonly aspiration: number;
26
+ readonly palatal: boolean;
27
+ readonly labial: boolean;
28
+ readonly nasalZero: number;
29
+ }
30
+ export declare const PHONEMES: Readonly<Record<Phoneme, PhonemeSpec>>;
31
+ export declare const VOWEL_PHONEMES: readonly Vowel[];
32
+ export declare function isVowelPhoneme(phoneme: Phoneme): phoneme is "a" | "i" | "u" | "e" | "o";
33
+ export declare function isConsonantPhoneme(phoneme: Phoneme): phoneme is Consonant;
34
+ export declare function isVoicedSustain(phoneme: Phoneme): boolean;
35
+ export declare const VOICELESS_CONSONANTS: ReadonlySet<Phoneme>;
36
+ export type MoraicNasalPlace = "bilabial" | "alveolar" | "velar" | "uvular";
37
+ export declare function moraicNasalPlace(next: Phoneme | undefined): MoraicNasalPlace;
38
+ export declare const MORAIC_NASAL_TARGETS: Readonly<Record<MoraicNasalPlace, {
39
+ readonly f: readonly [number, number, number];
40
+ readonly zero: number;
41
+ }>>;
42
+ //# sourceMappingURL=phonemes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phonemes.d.ts","sourceRoot":"","sources":["../../src/synth/phonemes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEjE,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,UAAU,GACV,OAAO,GACP,cAAc,GACd,MAAM,GACN,WAAW,GACX,WAAW,GACX,OAAO,GACP,MAAM,GACN,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACzD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAyOD,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CA8C3D,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,SAAS,KAAK,EAA8B,CAAC;AAE1E,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAEvF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,SAAS,CAGzE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAGzD;AAED,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,OAAO,CAepD,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,gBAAgB,CAkC5E;AAED,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CACzC,MAAM,CAAC,gBAAgB,EAAE;IAAE,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAMnG,CAAC"}
@@ -0,0 +1,311 @@
1
+ const NO_FRIC = null;
2
+ function vowel(f, duration = 0.1) {
3
+ return {
4
+ kind: "vowel",
5
+ voiced: true,
6
+ f,
7
+ bw: [70, 100, 160],
8
+ av: 0,
9
+ duration,
10
+ locus: null,
11
+ transition: 0.05,
12
+ fric: NO_FRIC,
13
+ af: -120,
14
+ closure: 0,
15
+ burst: 0,
16
+ aspiration: 0,
17
+ palatal: false,
18
+ labial: false,
19
+ nasalZero: 0,
20
+ };
21
+ }
22
+ function devoiced(base) {
23
+ return { ...base, kind: "devoiced", voiced: false, av: -120, duration: 0.06, bw: [150, 220, 300] };
24
+ }
25
+ function nasal(f, zero, duration, kind = "nasal") {
26
+ return {
27
+ kind,
28
+ voiced: true,
29
+ f,
30
+ bw: [110, 260, 320],
31
+ av: -10,
32
+ duration,
33
+ locus: [f[0], f[1], f[2]],
34
+ transition: 0.035,
35
+ fric: NO_FRIC,
36
+ af: -120,
37
+ closure: 0,
38
+ burst: 0,
39
+ aspiration: 0,
40
+ palatal: false,
41
+ labial: false,
42
+ nasalZero: zero,
43
+ };
44
+ }
45
+ function stop(locus, fric, voiced, closure, burst, aspiration, af) {
46
+ return {
47
+ kind: "stop",
48
+ voiced,
49
+ f: locus,
50
+ bw: [120, 160, 220],
51
+ av: voiced ? -16 : -120,
52
+ duration: closure + burst + aspiration,
53
+ locus,
54
+ transition: 0.035,
55
+ fric,
56
+ af,
57
+ closure,
58
+ burst,
59
+ aspiration,
60
+ palatal: false,
61
+ labial: false,
62
+ nasalZero: 0,
63
+ };
64
+ }
65
+ function fricative(locus, fric, voiced, duration, af, kind = "fricative", closure = 0) {
66
+ return {
67
+ kind,
68
+ voiced,
69
+ f: locus,
70
+ bw: [120, 160, 220],
71
+ av: voiced ? -9 : -120,
72
+ duration,
73
+ locus,
74
+ transition: 0.04,
75
+ fric,
76
+ af,
77
+ closure,
78
+ burst: 0,
79
+ aspiration: 0,
80
+ palatal: false,
81
+ labial: false,
82
+ nasalZero: 0,
83
+ };
84
+ }
85
+ function glide(f, duration) {
86
+ return {
87
+ kind: "glide",
88
+ voiced: true,
89
+ f,
90
+ bw: [90, 130, 200],
91
+ av: -2.5,
92
+ duration,
93
+ locus: f,
94
+ transition: 0.045,
95
+ fric: NO_FRIC,
96
+ af: -120,
97
+ closure: 0,
98
+ burst: 0,
99
+ aspiration: 0,
100
+ palatal: false,
101
+ labial: false,
102
+ nasalZero: 0,
103
+ };
104
+ }
105
+ const FRIC_S = { f1: 6200, bw1: 1300, g1: 1, f2: 8600, bw2: 2200, g2: 0.55, hp: 3200 };
106
+ const FRIC_SH = { f1: 3300, bw1: 650, g1: 1, f2: 4900, bw2: 1300, g2: 0.5, hp: 1800 };
107
+ const FRIC_HY = { f1: 3600, bw1: 800, g1: 1, f2: 5200, bw2: 1400, g2: 0.4, hp: 2400 };
108
+ const FRIC_F = { f1: 1300, bw1: 1000, g1: 1, f2: 3800, bw2: 2200, g2: 0.45, hp: 500 };
109
+ const FRIC_H = { f1: 1200, bw1: 900, g1: 1, f2: 2600, bw2: 1400, g2: 0.6, hp: 300 };
110
+ const BURST_K = { f1: 1700, bw1: 600, g1: 1, f2: 2700, bw2: 900, g2: 0.7, hp: 500 };
111
+ const BURST_KY = { f1: 3000, bw1: 700, g1: 1, f2: 4000, bw2: 1000, g2: 0.6, hp: 900 };
112
+ const BURST_T = { f1: 4200, bw1: 1600, g1: 1, f2: 6200, bw2: 2200, g2: 0.7, hp: 1500 };
113
+ const BURST_P = { f1: 900, bw1: 800, g1: 1, f2: 2200, bw2: 1800, g2: 0.45, hp: 200 };
114
+ const A = vowel([700, 1150, 2450]);
115
+ const I = vowel([290, 2250, 3000]);
116
+ const U = vowel([320, 1250, 2250]);
117
+ const E = vowel([480, 1850, 2500]);
118
+ const O = vowel([480, 800, 2400]);
119
+ const SILENCE = {
120
+ kind: "silence",
121
+ voiced: false,
122
+ f: [500, 1500, 2500],
123
+ bw: [200, 200, 200],
124
+ av: -120,
125
+ duration: 0.08,
126
+ locus: null,
127
+ transition: 0.02,
128
+ fric: NO_FRIC,
129
+ af: -120,
130
+ closure: 0,
131
+ burst: 0,
132
+ aspiration: 0,
133
+ palatal: false,
134
+ labial: false,
135
+ nasalZero: 0,
136
+ };
137
+ const CLOSURE = { ...SILENCE, kind: "closure", duration: 0.09 };
138
+ const K = stop([250, 1800, 2400], BURST_K, false, 0.05, 0.012, 0.028, 6);
139
+ const G = stop([220, 1800, 2400], BURST_K, true, 0.042, 0.01, 0.008, 3);
140
+ const T = stop([250, 1750, 2650], BURST_T, false, 0.045, 0.01, 0.022, 5);
141
+ const D = stop([220, 1750, 2650], BURST_T, true, 0.04, 0.009, 0.006, 2);
142
+ const P = stop([250, 850, 2300], BURST_P, false, 0.055, 0.01, 0.015, 2);
143
+ const B = stop([220, 850, 2300], BURST_P, true, 0.045, 0.009, 0.005, -2);
144
+ const S = fricative([300, 1750, 2650], FRIC_S, false, 0.095, 0);
145
+ const SH = fricative([280, 2100, 2800], FRIC_SH, false, 0.095, 4.5);
146
+ const Z = fricative([260, 1750, 2650], FRIC_S, true, 0.078, -6, "fricative", 0.02);
147
+ const J = fricative([260, 2100, 2800], FRIC_SH, true, 0.08, -1, "affricate", 0.03);
148
+ const CH = fricative([280, 2100, 2800], FRIC_SH, false, 0.1, 4.5, "affricate", 0.04);
149
+ const TS = fricative([300, 1750, 2650], FRIC_S, false, 0.1, 0, "affricate", 0.04);
150
+ const H = fricative([450, 1400, 2500], FRIC_H, false, 0.07, -8);
151
+ const HY = fricative([300, 2200, 2900], FRIC_HY, false, 0.075, 3);
152
+ const F = fricative([320, 1100, 2300], FRIC_F, false, 0.08, 7);
153
+ const V = fricative([300, 1100, 2300], FRIC_F, true, 0.065, 1);
154
+ const N_ALVEOLAR = nasal([270, 1450, 2350], 1500, 0.055);
155
+ const M = nasal([260, 1050, 2200], 1000, 0.06);
156
+ const Y = glide([260, 2200, 2900], 0.05);
157
+ const W = glide([300, 720, 2250], 0.05);
158
+ const R = {
159
+ kind: "flap",
160
+ voiced: true,
161
+ f: [380, 1450, 2400],
162
+ bw: [100, 140, 220],
163
+ av: -8,
164
+ duration: 0.03,
165
+ locus: [380, 1450, 2400],
166
+ transition: 0.02,
167
+ fric: NO_FRIC,
168
+ af: -120,
169
+ closure: 0,
170
+ burst: 0,
171
+ aspiration: 0,
172
+ palatal: false,
173
+ labial: false,
174
+ nasalZero: 0,
175
+ };
176
+ function palatal(base, fric) {
177
+ const locus = base.locus === null
178
+ ? [base.f[0], Math.max(base.f[1], 2100), Math.max(base.f[2], 2900)]
179
+ : [base.locus[0], Math.max(base.locus[1], 2100), Math.max(base.locus[2], 2900)];
180
+ return {
181
+ ...base,
182
+ f: locus,
183
+ locus,
184
+ palatal: true,
185
+ duration: base.duration + 0.02,
186
+ ...(fric === undefined ? {} : { fric }),
187
+ };
188
+ }
189
+ function labial(base) {
190
+ const locus = base.locus === null
191
+ ? [base.f[0], Math.min(base.f[1], 900), base.f[2]]
192
+ : [base.locus[0], Math.min(base.locus[1], 900), base.locus[2]];
193
+ return { ...base, f: locus, locus, labial: true, duration: base.duration + 0.02 };
194
+ }
195
+ export const PHONEMES = {
196
+ a: A,
197
+ i: I,
198
+ u: U,
199
+ e: E,
200
+ o: O,
201
+ A: devoiced(A),
202
+ I: devoiced(I),
203
+ U: devoiced(U),
204
+ E: devoiced(E),
205
+ O: devoiced(O),
206
+ N: nasal([280, 1200, 2300], 1200, 0.09, "moraic-nasal"),
207
+ cl: CLOSURE,
208
+ pau: SILENCE,
209
+ k: K,
210
+ ky: palatal(K, BURST_KY),
211
+ kw: labial(K),
212
+ g: G,
213
+ gy: palatal(G, { ...BURST_KY, g1: 0.8 }),
214
+ gw: labial(G),
215
+ t: T,
216
+ ty: palatal(T),
217
+ d: D,
218
+ dy: palatal(D),
219
+ p: P,
220
+ py: palatal(P),
221
+ b: B,
222
+ by: palatal(B),
223
+ s: S,
224
+ sh: SH,
225
+ z: Z,
226
+ j: J,
227
+ ch: CH,
228
+ ts: TS,
229
+ h: H,
230
+ hy: HY,
231
+ f: F,
232
+ v: V,
233
+ n: N_ALVEOLAR,
234
+ ny: palatal(N_ALVEOLAR),
235
+ m: M,
236
+ my: palatal(M),
237
+ r: R,
238
+ ry: palatal(R),
239
+ y: Y,
240
+ w: W,
241
+ };
242
+ export const VOWEL_PHONEMES = ["a", "i", "u", "e", "o"];
243
+ export function isVowelPhoneme(phoneme) {
244
+ return phoneme === "a" || phoneme === "i" || phoneme === "u" || phoneme === "e" || phoneme === "o";
245
+ }
246
+ export function isConsonantPhoneme(phoneme) {
247
+ const kind = PHONEMES[phoneme].kind;
248
+ return kind !== "vowel" && kind !== "devoiced" && kind !== "moraic-nasal" && kind !== "closure" && kind !== "silence";
249
+ }
250
+ export function isVoicedSustain(phoneme) {
251
+ const kind = PHONEMES[phoneme].kind;
252
+ return kind === "vowel" || kind === "nasal" || kind === "moraic-nasal" || kind === "glide";
253
+ }
254
+ export const VOICELESS_CONSONANTS = new Set([
255
+ "k",
256
+ "ky",
257
+ "kw",
258
+ "s",
259
+ "sh",
260
+ "t",
261
+ "ty",
262
+ "ch",
263
+ "ts",
264
+ "h",
265
+ "hy",
266
+ "f",
267
+ "p",
268
+ "py",
269
+ ]);
270
+ export function moraicNasalPlace(next) {
271
+ switch (next) {
272
+ case "m":
273
+ case "my":
274
+ case "p":
275
+ case "py":
276
+ case "b":
277
+ case "by":
278
+ return "bilabial";
279
+ case "n":
280
+ case "ny":
281
+ case "t":
282
+ case "ty":
283
+ case "d":
284
+ case "dy":
285
+ case "r":
286
+ case "ry":
287
+ case "s":
288
+ case "sh":
289
+ case "z":
290
+ case "j":
291
+ case "ch":
292
+ case "ts":
293
+ return "alveolar";
294
+ case "k":
295
+ case "ky":
296
+ case "kw":
297
+ case "g":
298
+ case "gy":
299
+ case "gw":
300
+ return "velar";
301
+ default:
302
+ return "uvular";
303
+ }
304
+ }
305
+ export const MORAIC_NASAL_TARGETS = {
306
+ bilabial: { f: [260, 1050, 2200], zero: 1000 },
307
+ alveolar: { f: [270, 1450, 2350], zero: 1500 },
308
+ velar: { f: [280, 1900, 2500], zero: 2300 },
309
+ uvular: { f: [280, 1150, 2300], zero: 1200 },
310
+ };
311
+ //# sourceMappingURL=phonemes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phonemes.js","sourceRoot":"","sources":["../../src/synth/phonemes.ts"],"names":[],"mappings":"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"}