@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,454 @@
1
+ import { invalid } from "../errors.js";
2
+ import { kanaToMoras, kanaToUnits, lookupMora, toKatakana, vowelToKana } from "../text/mora.js";
3
+ import { array, boolean, has, integer, isObject, keys, number, object, string } from "../validate.js";
4
+ import { parseMml } from "./mml.js";
5
+ import { noteToMidi } from "./pitch.js";
6
+ export const DEFAULT_FRAME_RATE = 93.75;
7
+ export const MAX_NOTES = 4096;
8
+ export const MIN_BEATS = 1 / 64;
9
+ export const MAX_BEATS = 64;
10
+ export const MAX_LYRIC_MORAS = 8;
11
+ export const NOTE_KEYS = [
12
+ "id",
13
+ "key",
14
+ "beats",
15
+ "lyric",
16
+ "continuation",
17
+ "continueFrom",
18
+ "articulation",
19
+ "velocity",
20
+ "gainDb",
21
+ "portamentoMs",
22
+ "vibrato",
23
+ ];
24
+ const REST_TOKENS = new Set(["r", "rest", "_"]);
25
+ const TIE_TOKENS = new Set(["~", "-", "ー", "&"]);
26
+ function parseBeat(token, path) {
27
+ const fraction = /^(\d+(?:\.\d+)?)\/(\d+(?:\.\d+)?)$/u.exec(token);
28
+ const value = fraction === null ? Number(token) : Number(fraction[1]) / Number(fraction[2]);
29
+ return number(value, path, MIN_BEATS, MAX_BEATS);
30
+ }
31
+ function tokens(text) {
32
+ return text
33
+ .normalize("NFKC")
34
+ .replaceAll("|", " ")
35
+ .split(/[\s,]+/u)
36
+ .filter((token) => token.length > 0);
37
+ }
38
+ export function alignLyrics(lyrics, melody, path = "$") {
39
+ const moras = kanaToUnits(lyrics, `${path}.lyrics`)
40
+ .filter((unit) => unit.kind === "mora")
41
+ .map((unit) => unit.text);
42
+ const assigned = [];
43
+ const unfilled = [];
44
+ let moraIndex = 0;
45
+ let pitched = 0;
46
+ for (const [index, token] of melody.entries()) {
47
+ const lower = token.toLowerCase();
48
+ if (REST_TOKENS.has(lower) || TIE_TOKENS.has(token) || token.startsWith("~"))
49
+ continue;
50
+ pitched += 1;
51
+ const text = moras[moraIndex];
52
+ if (text === undefined) {
53
+ unfilled.push(index);
54
+ continue;
55
+ }
56
+ assigned.push({ note: index, mora: moraIndex, text });
57
+ moraIndex += 1;
58
+ }
59
+ return { moras, pitchedNotes: pitched, assigned, leftoverMoras: moras.slice(moraIndex), unfilledNotes: unfilled };
60
+ }
61
+ export function parseScoreText(input, path = "$") {
62
+ const melody = tokens(string(input.melody, `${path}.melody`, 1, 100_000));
63
+ if (melody.length === 0)
64
+ invalid(`${path}.melody`, "The melody has no notes.");
65
+ if (melody.length > MAX_NOTES)
66
+ invalid(`${path}.melody`, `A score is limited to ${MAX_NOTES} notes.`);
67
+ const rawBeats = input.beats;
68
+ const beatTokens = rawBeats === undefined ? [] : typeof rawBeats === "string" ? tokens(rawBeats) : rawBeats.map((b) => String(b));
69
+ const beats = beatTokens.map((token, index) => parseBeat(token, `${path}.beats[${index}]`));
70
+ if (beats.length > 1 && beats.length !== melody.length) {
71
+ invalid(`${path}.beats`, `Expected ${melody.length} beat values to match the melody, got ${beats.length}.`);
72
+ }
73
+ const lyrics = string(input.lyrics, `${path}.lyrics`, 0, 100_000);
74
+ const alignment = alignLyrics(lyrics, melody, path);
75
+ const notes = [];
76
+ let moraIndex = 0;
77
+ for (const [index, token] of melody.entries()) {
78
+ const beat = beats.length === 0 ? 1 : (beats[beats.length === 1 ? 0 : index] ?? 1);
79
+ const lower = token.toLowerCase();
80
+ if (REST_TOKENS.has(lower)) {
81
+ notes.push({ key: null, beats: beat, lyric: "" });
82
+ continue;
83
+ }
84
+ if (TIE_TOKENS.has(token)) {
85
+ const previous = notes.at(-1);
86
+ if (previous === undefined || previous.key === null) {
87
+ invalid(`${path}.melody[${index}]`, "A tie (~) must directly follow a pitched note.", {
88
+ hint: "Ties cannot cross rests; after R start a new note with a lyric.",
89
+ });
90
+ }
91
+ notes.push({ key: previous.key, beats: beat, continuation: "tie" });
92
+ continue;
93
+ }
94
+ if (token.startsWith("~") && token.length > 1) {
95
+ const previous = notes.at(-1);
96
+ if (previous === undefined || previous.key === null) {
97
+ invalid(`${path}.melody[${index}]`, "A melisma (~C5) must directly follow a pitched note.");
98
+ }
99
+ notes.push({ key: noteToMidi(token.slice(1), `${path}.melody[${index}]`), beats: beat, continuation: "melisma" });
100
+ continue;
101
+ }
102
+ const mora = alignment.moras[moraIndex];
103
+ if (mora === undefined) {
104
+ invalid(`${path}.lyrics`, `The melody has ${alignment.pitchedNotes} pitched notes but the lyrics have only ${alignment.moras.length} moras.`, {
105
+ hint: "Give one kana mora per pitched note, use R for rests, ~ to hold the previous note, or ~C5 to move the vowel to a new pitch.",
106
+ detail: { alignment },
107
+ repairOptions: [
108
+ {
109
+ action: "use-vowel-continuation",
110
+ description: "Replace surplus notes with ~ (tie) or ~<key> (melisma).",
111
+ path: `${path}.melody`,
112
+ },
113
+ {
114
+ action: "shorten-input",
115
+ description: `Remove ${alignment.unfilledNotes.length} pitched note(s) or add moras to the lyrics.`,
116
+ },
117
+ ],
118
+ });
119
+ }
120
+ moraIndex += 1;
121
+ notes.push({ key: noteToMidi(token, `${path}.melody[${index}]`), beats: beat, lyric: mora });
122
+ }
123
+ if (moraIndex < alignment.moras.length) {
124
+ invalid(`${path}.lyrics`, `The lyrics have ${alignment.moras.length - moraIndex} more moras than the melody has pitched notes.`, {
125
+ hint: "Add notes to the melody or shorten the lyrics.",
126
+ detail: { alignment },
127
+ repairOptions: [
128
+ {
129
+ action: "shorten-input",
130
+ description: `Remove the leftover moras: ${alignment.leftoverMoras.join("")}.`,
131
+ path: `${path}.lyrics`,
132
+ },
133
+ ],
134
+ });
135
+ }
136
+ return notes;
137
+ }
138
+ export function parseMmlScore(input, path = "$") {
139
+ const parsed = parseMml(string(input.mml, `${path}.mml`, 1, 100_000), `${path}.mml`);
140
+ const lyrics = input.lyrics === undefined ? "" : string(input.lyrics, `${path}.lyrics`, 0, 100_000);
141
+ const moras = kanaToMoras(lyrics, `${path}.lyrics`).map((unit) => unit.text);
142
+ const notes = [];
143
+ let moraIndex = 0;
144
+ let pitched = 0;
145
+ for (const [index, note] of parsed.notes.entries()) {
146
+ if (note.key === null) {
147
+ notes.push({ key: null, beats: note.beats });
148
+ continue;
149
+ }
150
+ if (note.continuation !== "none") {
151
+ notes.push({
152
+ key: note.key,
153
+ beats: note.beats,
154
+ continuation: note.continuation,
155
+ ...(note.velocity === undefined ? {} : { velocity: note.velocity }),
156
+ });
157
+ continue;
158
+ }
159
+ pitched += 1;
160
+ if (lyrics.length === 0) {
161
+ notes.push({
162
+ key: note.key,
163
+ beats: note.beats,
164
+ lyric: note.lyric ?? "ラ",
165
+ ...(note.velocity === undefined ? {} : { velocity: note.velocity }),
166
+ });
167
+ continue;
168
+ }
169
+ const mora = note.lyric ?? moras[moraIndex];
170
+ if (mora === undefined) {
171
+ invalid(`${path}.lyrics`, `The MML has ${pitched} or more pitched notes but the lyrics have only ${moras.length} moras (note ${index + 1}).`, {
172
+ hint: "Give one kana mora per pitched note, or use & to hold a vowel across notes.",
173
+ });
174
+ }
175
+ if (note.lyric === undefined)
176
+ moraIndex += 1;
177
+ notes.push({
178
+ key: note.key,
179
+ beats: note.beats,
180
+ lyric: mora,
181
+ ...(note.velocity === undefined ? {} : { velocity: note.velocity }),
182
+ });
183
+ }
184
+ if (lyrics.length > 0 && moraIndex < moras.length) {
185
+ invalid(`${path}.lyrics`, `The lyrics have ${moras.length - moraIndex} more moras than the MML has pitched notes.`, {
186
+ hint: "Add notes to the MML or shorten the lyrics.",
187
+ });
188
+ }
189
+ if (notes.length === 0)
190
+ invalid(`${path}.mml`, "The MML contains no notes.");
191
+ return { notes, tempo: parsed.tempo };
192
+ }
193
+ function parseVibrato(value, path) {
194
+ if (value === false)
195
+ return false;
196
+ const o = object(value, path);
197
+ keys(o, ["depthCents", "rateHz", "delayMs", "fadeMs"], path);
198
+ return {
199
+ ...(has(o, "depthCents") ? { depthCents: number(o["depthCents"], `${path}.depthCents`, 0, 200) } : {}),
200
+ ...(has(o, "rateHz") ? { rateHz: number(o["rateHz"], `${path}.rateHz`, 0, 12) } : {}),
201
+ ...(has(o, "delayMs") ? { delayMs: number(o["delayMs"], `${path}.delayMs`, 0, 5000) } : {}),
202
+ ...(has(o, "fadeMs") ? { fadeMs: number(o["fadeMs"], `${path}.fadeMs`, 0, 5000) } : {}),
203
+ };
204
+ }
205
+ export function parseNoteInput(value, path) {
206
+ const note = object(value, path);
207
+ keys(note, NOTE_KEYS, path);
208
+ const key = note["key"];
209
+ if (key !== null && typeof key !== "number" && typeof key !== "string") {
210
+ invalid(`${path}.key`, "Expected a MIDI integer, a note name such as C4, or null for a rest.");
211
+ }
212
+ const beats = number(note["beats"], `${path}.beats`, MIN_BEATS, MAX_BEATS);
213
+ const continuation = note["continuation"];
214
+ if (continuation !== undefined && continuation !== "none" && continuation !== "tie" && continuation !== "melisma") {
215
+ invalid(`${path}.continuation`, 'Expected "tie", "melisma", or "none".');
216
+ }
217
+ const articulation = note["articulation"];
218
+ if (articulation !== undefined &&
219
+ articulation !== "auto" &&
220
+ articulation !== "legato" &&
221
+ articulation !== "rearticulate") {
222
+ invalid(`${path}.articulation`, 'Expected "auto", "legato", or "rearticulate".');
223
+ }
224
+ const gainDb = has(note, "gainDb") ? number(note["gainDb"], `${path}.gainDb`, -40, 12) : undefined;
225
+ const velocity = has(note, "velocity") ? integer(note["velocity"], `${path}.velocity`, 1, 127) : undefined;
226
+ if (gainDb !== undefined && velocity !== undefined)
227
+ invalid(path, "Give either velocity or gainDb, not both.");
228
+ return {
229
+ key,
230
+ beats,
231
+ ...(has(note, "id") ? { id: string(note["id"], `${path}.id`, 1, 64) } : {}),
232
+ ...(has(note, "lyric") ? { lyric: string(note["lyric"], `${path}.lyric`, 0, 32) } : {}),
233
+ ...(continuation === undefined ? {} : { continuation }),
234
+ ...(has(note, "continueFrom") ? { continueFrom: string(note["continueFrom"], `${path}.continueFrom`, 1, 64) } : {}),
235
+ ...(articulation === undefined ? {} : { articulation }),
236
+ ...(velocity === undefined ? {} : { velocity }),
237
+ ...(gainDb === undefined ? {} : { gainDb }),
238
+ ...(has(note, "portamentoMs")
239
+ ? { portamentoMs: number(note["portamentoMs"], `${path}.portamentoMs`, 0, 2000) }
240
+ : {}),
241
+ ...(has(note, "vibrato") ? { vibrato: parseVibrato(note["vibrato"], `${path}.vibrato`) } : {}),
242
+ };
243
+ }
244
+ function tooShortRepairs(path) {
245
+ return [
246
+ { action: "increase-duration", description: "Give the note more beats or lower the tempo.", path },
247
+ {
248
+ action: "use-vowel-continuation",
249
+ description: "Hold the previous vowel with a tie or melisma instead of a new lyric.",
250
+ },
251
+ ];
252
+ }
253
+ export function resolveNotes(input, path = "$.notes", transpose = 0) {
254
+ const resolved = [];
255
+ const ids = new Set();
256
+ for (const [index, note] of input.entries()) {
257
+ const notePath = `${path}[${index}]`;
258
+ const id = note.id ?? `n${index + 1}`;
259
+ if (ids.has(id))
260
+ invalid(`${notePath}.id`, `Duplicate note id ${JSON.stringify(id)}.`);
261
+ ids.add(id);
262
+ const rawLyric = toKatakana(note.lyric ?? "").replaceAll(/\s+/gu, "");
263
+ const previous = resolved.at(-1);
264
+ const velocity = note.velocity ?? 100;
265
+ const gainDb = note.gainDb ?? 20 * Math.log10(velocity / 100);
266
+ const base = {
267
+ id,
268
+ index,
269
+ beats: note.beats,
270
+ velocity,
271
+ gainDb,
272
+ portamentoSeconds: note.portamentoMs === undefined ? undefined : note.portamentoMs / 1000,
273
+ vibrato: note.vibrato,
274
+ articulation: note.articulation ?? "auto",
275
+ };
276
+ if (note.key === null) {
277
+ if (rawLyric !== "")
278
+ invalid(`${notePath}.lyric`, "A rest (key null) must have an empty lyric.");
279
+ if (note.continuation !== undefined && note.continuation !== "none")
280
+ invalid(`${notePath}.continuation`, "A rest cannot continue a note.");
281
+ resolved.push({ ...base, key: null, lyric: "", moras: [], moraTexts: [], continuation: "none" });
282
+ continue;
283
+ }
284
+ const key = noteToMidi(note.key, `${notePath}.key`) + transpose;
285
+ if (key < 0 || key > 127)
286
+ invalid(`${notePath}.key`, `Transposed key ${key} is outside the MIDI range 0–127.`);
287
+ let continuation = note.continuation ?? "none";
288
+ if (continuation === "none" && TIE_TOKENS.has(rawLyric))
289
+ continuation = previous !== undefined && previous.key === key ? "tie" : "melisma";
290
+ if (note.continueFrom !== undefined) {
291
+ if (previous === undefined || previous.id !== note.continueFrom) {
292
+ invalid(`${notePath}.continueFrom`, `continueFrom must name the directly preceding note (${previous === undefined ? "none" : JSON.stringify(previous.id)}).`);
293
+ }
294
+ if (continuation === "none")
295
+ continuation = previous.key === key ? "tie" : "melisma";
296
+ }
297
+ if (continuation !== "none") {
298
+ if (rawLyric !== "" && !TIE_TOKENS.has(rawLyric)) {
299
+ invalid(`${notePath}.lyric`, "A continued note (tie or melisma) must not carry a new lyric.", {
300
+ hint: "Remove the lyric, or drop the continuation to re-articulate the mora.",
301
+ });
302
+ }
303
+ if (previous === undefined || previous.key === null) {
304
+ invalid(`${notePath}.continuation`, "A tie or melisma must directly follow a pitched note; it cannot cross a rest.", {
305
+ hint: "After a rest, start a new note with a lyric (for example the vowel of the previous mora).",
306
+ repairOptions: [
307
+ {
308
+ action: "use-vowel-continuation",
309
+ description: "Move the continuation before the rest, or give this note a lyric.",
310
+ },
311
+ ],
312
+ });
313
+ }
314
+ if (continuation === "tie" && previous.key !== key) {
315
+ invalid(`${notePath}.continuation`, `A tie must keep the previous pitch (${previous.key}); use "melisma" to change pitch on the same vowel.`, {
316
+ hint: 'Set continuation to "melisma" or make the keys equal.',
317
+ });
318
+ }
319
+ const lastMora = previous.moras.at(-1);
320
+ if (lastMora === undefined || lastMora.vowel === "cl" || lastMora.vowel === "pau") {
321
+ invalid(`${notePath}.continuation`, "A continuation must follow a note with a voiced vowel.");
322
+ }
323
+ const vowelKana = vowelToKana(lastMora.vowel);
324
+ resolved.push({
325
+ ...base,
326
+ key,
327
+ lyric: "ー",
328
+ moras: [{ consonant: null, vowel: lastMora.vowel }],
329
+ moraTexts: [vowelKana],
330
+ continuation,
331
+ });
332
+ continue;
333
+ }
334
+ if (rawLyric.length === 0) {
335
+ invalid(`${notePath}.lyric`, "A pitched note needs a lyric of one or more kana moras such as ア or キャ.", {
336
+ hint: 'Give a lyric, or set continuation to "tie"/"melisma" to hold the previous vowel.',
337
+ });
338
+ }
339
+ const units = kanaToMoras(rawLyric, `${notePath}.lyric`);
340
+ if (units.length === 0)
341
+ invalid(`${notePath}.lyric`, `Lyric ${JSON.stringify(note.lyric)} contains no kana mora.`);
342
+ if (units.length > MAX_LYRIC_MORAS) {
343
+ invalid(`${notePath}.lyric`, `Lyric ${JSON.stringify(note.lyric)} has ${units.length} moras; a note holds at most ${MAX_LYRIC_MORAS}.`, {
344
+ hint: "Split the lyric across several notes.",
345
+ repairOptions: tooShortRepairs(`${notePath}.beats`),
346
+ });
347
+ }
348
+ const moras = [];
349
+ const moraTexts = [];
350
+ for (const unit of units) {
351
+ if (unit.vowel === "cl" && units.length === 1) {
352
+ invalid(`${notePath}.lyric`, "A note cannot consist only of ッ (a closure has no voice).", {
353
+ hint: "Attach ッ to the preceding mora, e.g. キッ.",
354
+ });
355
+ }
356
+ const phonemes = unit.text === "ー"
357
+ ? { consonant: null, vowel: unit.vowel }
358
+ : (lookupMora(unit.text) ?? { consonant: unit.consonant, vowel: unit.vowel });
359
+ moras.push(phonemes);
360
+ moraTexts.push(unit.text);
361
+ }
362
+ const last = moras.at(-1);
363
+ if (last !== undefined && last.vowel === "cl") {
364
+ invalid(`${notePath}.lyric`, `Lyric ${JSON.stringify(note.lyric)} ends with ッ; a note must end in a voiced vowel or ン.`, {
365
+ hint: "Move ッ to the start of the next note's lyric, or drop it.",
366
+ });
367
+ }
368
+ resolved.push({ ...base, key, lyric: rawLyric, moras, moraTexts, continuation: "none" });
369
+ }
370
+ return resolved;
371
+ }
372
+ export function parseNotes(value, path = "$.notes") {
373
+ if (isObject(value)) {
374
+ if (has(value, "mml")) {
375
+ keys(value, ["mml", "lyrics"], path);
376
+ const parsed = parseMmlScore({
377
+ mml: string(value["mml"], `${path}.mml`, 1, 100_000),
378
+ ...(has(value, "lyrics") ? { lyrics: string(value["lyrics"], `${path}.lyrics`, 0, 100_000) } : {}),
379
+ }, path);
380
+ return { notes: parsed.notes, tempo: parsed.tempo, form: "mml" };
381
+ }
382
+ keys(value, ["lyrics", "melody", "beats"], path);
383
+ const beats = value["beats"];
384
+ if (beats !== undefined && typeof beats !== "string" && !Array.isArray(beats)) {
385
+ invalid(`${path}.beats`, "Expected a string of beat values or an array of numbers.");
386
+ }
387
+ return {
388
+ notes: parseScoreText({
389
+ lyrics: string(value["lyrics"], `${path}.lyrics`, 0, 100_000),
390
+ melody: string(value["melody"], `${path}.melody`, 1, 100_000),
391
+ ...(beats === undefined
392
+ ? {}
393
+ : {
394
+ beats: typeof beats === "string"
395
+ ? beats
396
+ : beats.map((b, i) => number(b, `${path}.beats[${i}]`, MIN_BEATS, MAX_BEATS)),
397
+ }),
398
+ }, path),
399
+ tempo: undefined,
400
+ form: "compact",
401
+ };
402
+ }
403
+ return {
404
+ notes: array(value, path, 1, MAX_NOTES).map((note, index) => parseNoteInput(note, `${path}[${index}]`)),
405
+ tempo: undefined,
406
+ form: "list",
407
+ };
408
+ }
409
+ export function scoreSeconds(notes, tempo) {
410
+ let beats = 0;
411
+ for (const note of notes)
412
+ beats += note.beats;
413
+ return (beats * 60) / tempo;
414
+ }
415
+ export function notesToEngineScore(notes, tempo, frameRate = DEFAULT_FRAME_RATE, leadIn = 0.16, leadOut = 0.16) {
416
+ const engineNotes = [];
417
+ const padding = (seconds) => Math.max(1, Math.round(seconds * frameRate));
418
+ if (notes[0]?.key !== null)
419
+ engineNotes.push({ id: "lead-in", key: null, frame_length: padding(leadIn), lyric: "" });
420
+ let frames = 0;
421
+ let seconds = 0;
422
+ for (const [index, note] of notes.entries()) {
423
+ seconds += (note.beats * 60) / tempo;
424
+ const boundary = Math.round(seconds * frameRate);
425
+ const length = boundary - frames;
426
+ if (length < 1) {
427
+ invalid(`$.notes[${index}].beats`, `Note ${index} is shorter than one engine frame (${(1000 / frameRate).toFixed(2)} ms at ${tempo} BPM).`);
428
+ }
429
+ if (note.key !== null && note.moras.length > 1) {
430
+ invalid(`$.notes[${index}].lyric`, "VOICEVOX sings exactly one mora per note; split multi-mora lyrics across notes.", {
431
+ hint: "Use the formant engine for multi-mora lyrics, or add notes.",
432
+ });
433
+ }
434
+ const lyric = note.key === null ? "" : note.continuation === "none" ? note.lyric : (note.moraTexts[0] ?? "ア");
435
+ engineNotes.push({ id: note.id, key: note.key, frame_length: length, lyric });
436
+ frames = boundary;
437
+ }
438
+ if (notes.at(-1)?.key !== null)
439
+ engineNotes.push({ id: "lead-out", key: null, frame_length: padding(leadOut), lyric: "" });
440
+ return { notes: engineNotes };
441
+ }
442
+ export function engineScoreFrames(score) {
443
+ let total = 0;
444
+ for (const note of score.notes)
445
+ total += note.frame_length;
446
+ return total;
447
+ }
448
+ export function transposeInput(value, path) {
449
+ return integer(value, path, -48, 48);
450
+ }
451
+ export function parseBooleanFlag(value, path) {
452
+ return boolean(value, path);
453
+ }
454
+ //# sourceMappingURL=score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score.js","sourceRoot":"","sources":["../../src/song/score.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAChG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,CAAC,MAAM,kBAAkB,GAAW,KAAK,CAAC;AAChD,MAAM,CAAC,MAAM,SAAS,GAAW,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,SAAS,GAAW,CAAC,GAAG,EAAE,CAAC;AACxC,MAAM,CAAC,MAAM,SAAS,GAAW,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,eAAe,GAAW,CAAC,CAAC;AAgEzC,MAAM,CAAC,MAAM,SAAS,GAAsB;IAC1C,IAAI;IACJ,KAAK;IACL,OAAO;IACP,OAAO;IACP,cAAc;IACd,cAAc;IACd,cAAc;IACd,UAAU;IACV,QAAQ;IACR,cAAc;IACd,SAAS;CACV,CAAC;AAEF,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AACrE,MAAM,UAAU,GAAwB,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAEtE,SAAS,SAAS,CAAC,KAAa,EAAE,IAAY;IAC5C,MAAM,QAAQ,GAAG,qCAAqC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,OAAO,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,IAAI;SACR,SAAS,CAAC,MAAM,CAAC;SACjB,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;SACpB,KAAK,CAAC,SAAS,CAAC;SAChB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAUD,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,MAAyB,EAAE,OAAe,GAAG;IACvF,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC;SAChD,MAAM,CAAC,CAAC,IAAI,EAAoB,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;SACxD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAmD,EAAE,CAAC;IACpE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACvF,OAAO,IAAI,CAAC,CAAC;QACb,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,SAAS,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;AACpH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAgB,EAAE,OAAe,GAAG;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,IAAI,SAAS,EAAE,0BAA0B,CAAC,CAAC;IAC/E,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS;QAAE,OAAO,CAAC,GAAG,IAAI,SAAS,EAAE,yBAAyB,SAAS,SAAS,CAAC,CAAC;IACtG,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC;IAC7B,MAAM,UAAU,GACd,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACjH,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,IAAI,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC;IAC5F,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,IAAI,QAAQ,EAAE,YAAY,MAAM,CAAC,MAAM,yCAAyC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9G,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACpD,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACnF,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QACD,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;gBACpD,OAAO,CAAC,GAAG,IAAI,WAAW,KAAK,GAAG,EAAE,gDAAgD,EAAE;oBACpF,IAAI,EAAE,iEAAiE;iBACxE,CAAC,CAAC;YACL,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;YACpE,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;gBACpD,OAAO,CAAC,GAAG,IAAI,WAAW,KAAK,GAAG,EAAE,sDAAsD,CAAC,CAAC;YAC9F,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,WAAW,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;YAClH,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CACL,GAAG,IAAI,SAAS,EAChB,kBAAkB,SAAS,CAAC,YAAY,2CAA2C,SAAS,CAAC,KAAK,CAAC,MAAM,SAAS,EAClH;gBACE,IAAI,EAAE,6HAA6H;gBACnI,MAAM,EAAE,EAAE,SAAS,EAAE;gBACrB,aAAa,EAAE;oBACb;wBACE,MAAM,EAAE,wBAAwB;wBAChC,WAAW,EAAE,yDAAyD;wBACtE,IAAI,EAAE,GAAG,IAAI,SAAS;qBACvB;oBACD;wBACE,MAAM,EAAE,eAAe;wBACvB,WAAW,EAAE,UAAU,SAAS,CAAC,aAAa,CAAC,MAAM,8CAA8C;qBACpG;iBACF;aACF,CACF,CAAC;QACJ,CAAC;QACD,SAAS,IAAI,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,GAAG,IAAI,WAAW,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACvC,OAAO,CACL,GAAG,IAAI,SAAS,EAChB,mBAAmB,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,gDAAgD,EACrG;YACE,IAAI,EAAE,gDAAgD;YACtD,MAAM,EAAE,EAAE,SAAS,EAAE;YACrB,aAAa,EAAE;gBACb;oBACE,MAAM,EAAE,eAAe;oBACvB,WAAW,EAAE,8BAA8B,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG;oBAC9E,IAAI,EAAE,GAAG,IAAI,SAAS;iBACvB;aACF;SACF,CACF,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAAe,EACf,OAAe,GAAG;IAElB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IACpG,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACnD,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7C,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC;gBACT,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;aACpE,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,OAAO,IAAI,CAAC,CAAC;QACb,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC;gBACT,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG;gBACxB,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;aACpE,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CACL,GAAG,IAAI,SAAS,EAChB,eAAe,OAAO,mDAAmD,KAAK,CAAC,MAAM,gBAAgB,KAAK,GAAG,CAAC,IAAI,EAClH;gBACE,IAAI,EAAE,6EAA6E;aACpF,CACF,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,SAAS,IAAI,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC;YACT,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI;YACX,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;SACpE,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAClD,OAAO,CACL,GAAG,IAAI,SAAS,EAChB,mBAAmB,KAAK,CAAC,MAAM,GAAG,SAAS,6CAA6C,EACxF;YACE,IAAI,EAAE,6CAA6C;SACpD,CACF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,IAAI,MAAM,EAAE,4BAA4B,CAAC,CAAC;IAC7E,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,IAAY;IAChD,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7D,OAAO;QACL,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,aAAa,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,IAAY;IACzD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACvE,OAAO,CAAC,GAAG,IAAI,MAAM,EAAE,sEAAsE,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1C,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,MAAM,IAAI,YAAY,KAAK,KAAK,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAClH,OAAO,CAAC,GAAG,IAAI,eAAe,EAAE,uCAAuC,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1C,IACE,YAAY,KAAK,SAAS;QAC1B,YAAY,KAAK,MAAM;QACvB,YAAY,KAAK,QAAQ;QACzB,YAAY,KAAK,cAAc,EAC/B,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,eAAe,EAAE,+CAA+C,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnG,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3G,IAAI,MAAM,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,CAAC,IAAI,EAAE,2CAA2C,CAAC,CAAC;IAC/G,OAAO;QACL,GAAG;QACH,KAAK;QACL,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;QACvD,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnH,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;QACvD,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/C,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3C,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC;YAC3B,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;YACjF,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/F,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO;QACL,EAAE,MAAM,EAAE,mBAAmB,EAAE,WAAW,EAAE,8CAA8C,EAAE,IAAI,EAAE;QAClG;YACE,MAAM,EAAE,wBAAwB;YAChC,WAAW,EAAE,uEAAuE;SACrF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,KAA2B,EAC3B,OAAe,SAAS,EACxB,YAAoB,CAAC;IAErB,MAAM,QAAQ,GAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACtC,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,GAAG,QAAQ,KAAK,EAAE,qBAAqB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACvF,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACZ,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG;YACX,EAAE;YACF,KAAK;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ;YACR,MAAM;YACN,iBAAiB,EAAE,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI;YACzF,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,MAAM;SACjC,CAAC;QACX,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;YACtB,IAAI,QAAQ,KAAK,EAAE;gBAAE,OAAO,CAAC,GAAG,QAAQ,QAAQ,EAAE,6CAA6C,CAAC,CAAC;YACjG,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM;gBACjE,OAAO,CAAC,GAAG,QAAQ,eAAe,EAAE,gCAAgC,CAAC,CAAC;YACxE,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;YACjG,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,MAAM,CAAC,GAAG,SAAS,CAAC;QAChE,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG;YAAE,OAAO,CAAC,GAAG,QAAQ,MAAM,EAAE,kBAAkB,GAAG,mCAAmC,CAAC,CAAC;QAC/G,IAAI,YAAY,GAAiB,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC;QAC7D,IAAI,YAAY,KAAK,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;YACrD,YAAY,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACpF,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChE,OAAO,CACL,GAAG,QAAQ,eAAe,EAC1B,uDAAuD,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CACzH,CAAC;YACJ,CAAC;YACD,IAAI,YAAY,KAAK,MAAM;gBAAE,YAAY,GAAG,QAAQ,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACvF,CAAC;QACD,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YAC5B,IAAI,QAAQ,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjD,OAAO,CAAC,GAAG,QAAQ,QAAQ,EAAE,+DAA+D,EAAE;oBAC5F,IAAI,EAAE,uEAAuE;iBAC9E,CAAC,CAAC;YACL,CAAC;YACD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;gBACpD,OAAO,CACL,GAAG,QAAQ,eAAe,EAC1B,+EAA+E,EAC/E;oBACE,IAAI,EAAE,2FAA2F;oBACjG,aAAa,EAAE;wBACb;4BACE,MAAM,EAAE,wBAAwB;4BAChC,WAAW,EAAE,mEAAmE;yBACjF;qBACF;iBACF,CACF,CAAC;YACJ,CAAC;YACD,IAAI,YAAY,KAAK,KAAK,IAAI,QAAQ,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;gBACnD,OAAO,CACL,GAAG,QAAQ,eAAe,EAC1B,uCAAuC,QAAQ,CAAC,GAAG,qDAAqD,EACxG;oBACE,IAAI,EAAE,uDAAuD;iBAC9D,CACF,CAAC;YACJ,CAAC;YACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBAClF,OAAO,CAAC,GAAG,QAAQ,eAAe,EAAE,wDAAwD,CAAC,CAAC;YAChG,CAAC;YACD,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC9C,QAAQ,CAAC,IAAI,CAAC;gBACZ,GAAG,IAAI;gBACP,GAAG;gBACH,KAAK,EAAE,GAAG;gBACV,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnD,SAAS,EAAE,CAAC,SAAS,CAAC;gBACtB,YAAY;aACb,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,QAAQ,QAAQ,EAAE,yEAAyE,EAAE;gBACtG,IAAI,EAAE,kFAAkF;aACzF,CAAC,CAAC;QACL,CAAC;QACD,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,EAAE,GAAG,QAAQ,QAAQ,CAAC,CAAC;QACzD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,QAAQ,QAAQ,EAAE,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACnH,IAAI,KAAK,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YACnC,OAAO,CACL,GAAG,QAAQ,QAAQ,EACnB,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,MAAM,gCAAgC,eAAe,GAAG,EACzG;gBACE,IAAI,EAAE,uCAAuC;gBAC7C,aAAa,EAAE,eAAe,CAAC,GAAG,QAAQ,QAAQ,CAAC;aACpD,CACF,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAmB,EAAE,CAAC;QACjC,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,OAAO,CAAC,GAAG,QAAQ,QAAQ,EAAE,2DAA2D,EAAE;oBACxF,IAAI,EAAE,0CAA0C;iBACjD,CAAC,CAAC;YACL,CAAC;YACD,MAAM,QAAQ,GACZ,IAAI,CAAC,IAAI,KAAK,GAAG;gBACf,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;gBACxC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAClF,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC9C,OAAO,CACL,GAAG,QAAQ,QAAQ,EACnB,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,uDAAuD,EAC1F;gBACE,IAAI,EAAE,2DAA2D;aAClE,CACF,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAQD,MAAM,UAAU,UAAU,CAAC,KAAc,EAAE,OAAe,SAAS;IACjE,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,aAAa,CAC1B;gBACE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC;gBACpD,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnG,EACD,IAAI,CACL,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9E,OAAO,CAAC,GAAG,IAAI,QAAQ,EAAE,0DAA0D,CAAC,CAAC;QACvF,CAAC;QACD,OAAO;YACL,KAAK,EAAE,cAAc,CACnB;gBACE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC;gBAC7D,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC;gBAC7D,GAAG,CAAC,KAAK,KAAK,SAAS;oBACrB,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC;wBACE,KAAK,EACH,OAAO,KAAK,KAAK,QAAQ;4BACvB,CAAC,CAAC,KAAK;4BACP,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;qBACnG,CAAC;aACP,EACD,IAAI,CACL;YACD,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,SAAS;SAChB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC;QACvG,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,MAAM;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAsB,EAAE,KAAa;IAChE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;IAC9C,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAsB,EACtB,KAAa,EACb,YAAoB,kBAAkB,EACtC,SAAiB,IAAI,EACrB,UAAkB,IAAI;IAEtB,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC;IAC1F,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI;QAAE,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACrH,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;QACjC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,CACL,WAAW,KAAK,SAAS,EACzB,QAAQ,KAAK,sCAAsC,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,KAAK,QAAQ,CACxG,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,OAAO,CACL,WAAW,KAAK,SAAS,EACzB,iFAAiF,EACjF;gBACE,IAAI,EAAE,6DAA6D;aACpE,CACF,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QAC9G,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,MAAM,GAAG,QAAQ,CAAC;IACpB,CAAC;IACD,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI;QAC5B,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7F,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAClD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK;QAAE,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;IAC3D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,IAAY;IACzD,OAAO,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,IAAY;IAC3D,OAAO,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { Phoneme } from "../text/mora.ts";
2
+ import type { Articulation, PlannedSegment } from "./plan.ts";
3
+ import type { VoiceProfile } from "./voice.ts";
4
+ export interface PhoneDraft {
5
+ readonly phoneme: Phoneme;
6
+ readonly seconds: number;
7
+ readonly moraIndex: number | null;
8
+ readonly phraseIndex: number | null;
9
+ readonly noteId: string | null;
10
+ readonly sustainId: number | null;
11
+ readonly articulation: Articulation;
12
+ readonly gainDb: number;
13
+ readonly rdOffset: number;
14
+ readonly boundaryBefore: boolean;
15
+ readonly boundaryAfter: boolean;
16
+ readonly sustain: boolean;
17
+ readonly emphasis: number;
18
+ }
19
+ export interface CompiledSegments {
20
+ readonly segments: readonly PlannedSegment[];
21
+ readonly frames: number;
22
+ readonly boundaries: readonly number[];
23
+ }
24
+ export declare function compileSegments(drafts: readonly PhoneDraft[], voice: VoiceProfile, sampleRate: number): CompiledSegments;
25
+ export declare function phoneDraft(phoneme: Phoneme, seconds: number, partial?: Partial<PhoneDraft>): PhoneDraft;
26
+ export declare function isVowelOrDevoiced(phoneme: Phoneme): boolean;
27
+ //# sourceMappingURL=acoustics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acoustics.d.ts","sourceRoot":"","sources":["../../src/synth/acoustics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,KAAK,EAAE,YAAY,EAAY,cAAc,EAAE,MAAM,WAAW,CAAC;AA4BxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AA4nBD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,GACjB,gBAAgB,CAmClB;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,UAAU,CAiB3G;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAE3D"}