takomusic 1.2.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 (335) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +230 -0
  3. package/dist/__tests__/checker.test.d.ts +2 -0
  4. package/dist/__tests__/checker.test.d.ts.map +1 -0
  5. package/dist/__tests__/checker.test.js +316 -0
  6. package/dist/__tests__/checker.test.js.map +1 -0
  7. package/dist/__tests__/compiler.test.d.ts +2 -0
  8. package/dist/__tests__/compiler.test.d.ts.map +1 -0
  9. package/dist/__tests__/compiler.test.js +260 -0
  10. package/dist/__tests__/compiler.test.js.map +1 -0
  11. package/dist/__tests__/generators.test.d.ts +2 -0
  12. package/dist/__tests__/generators.test.d.ts.map +1 -0
  13. package/dist/__tests__/generators.test.js +283 -0
  14. package/dist/__tests__/generators.test.js.map +1 -0
  15. package/dist/__tests__/interpreter.test.d.ts +2 -0
  16. package/dist/__tests__/interpreter.test.d.ts.map +1 -0
  17. package/dist/__tests__/interpreter.test.js +298 -0
  18. package/dist/__tests__/interpreter.test.js.map +1 -0
  19. package/dist/__tests__/lexer.test.d.ts +2 -0
  20. package/dist/__tests__/lexer.test.d.ts.map +1 -0
  21. package/dist/__tests__/lexer.test.js +89 -0
  22. package/dist/__tests__/lexer.test.js.map +1 -0
  23. package/dist/__tests__/parser.test.d.ts +2 -0
  24. package/dist/__tests__/parser.test.d.ts.map +1 -0
  25. package/dist/__tests__/parser.test.js +116 -0
  26. package/dist/__tests__/parser.test.js.map +1 -0
  27. package/dist/checker/checker.d.ts +37 -0
  28. package/dist/checker/checker.d.ts.map +1 -0
  29. package/dist/checker/checker.js +428 -0
  30. package/dist/checker/checker.js.map +1 -0
  31. package/dist/checker/index.d.ts +3 -0
  32. package/dist/checker/index.d.ts.map +1 -0
  33. package/dist/checker/index.js +2 -0
  34. package/dist/checker/index.js.map +1 -0
  35. package/dist/cli/commands/build.d.ts +2 -0
  36. package/dist/cli/commands/build.d.ts.map +1 -0
  37. package/dist/cli/commands/build.js +173 -0
  38. package/dist/cli/commands/build.js.map +1 -0
  39. package/dist/cli/commands/check.d.ts +2 -0
  40. package/dist/cli/commands/check.d.ts.map +1 -0
  41. package/dist/cli/commands/check.js +79 -0
  42. package/dist/cli/commands/check.js.map +1 -0
  43. package/dist/cli/commands/doctor.d.ts +2 -0
  44. package/dist/cli/commands/doctor.d.ts.map +1 -0
  45. package/dist/cli/commands/doctor.js +187 -0
  46. package/dist/cli/commands/doctor.js.map +1 -0
  47. package/dist/cli/commands/fmt.d.ts +2 -0
  48. package/dist/cli/commands/fmt.d.ts.map +1 -0
  49. package/dist/cli/commands/fmt.js +73 -0
  50. package/dist/cli/commands/fmt.js.map +1 -0
  51. package/dist/cli/commands/import.d.ts +2 -0
  52. package/dist/cli/commands/import.d.ts.map +1 -0
  53. package/dist/cli/commands/import.js +99 -0
  54. package/dist/cli/commands/import.js.map +1 -0
  55. package/dist/cli/commands/init.d.ts +2 -0
  56. package/dist/cli/commands/init.d.ts.map +1 -0
  57. package/dist/cli/commands/init.js +514 -0
  58. package/dist/cli/commands/init.js.map +1 -0
  59. package/dist/cli/commands/play.d.ts +2 -0
  60. package/dist/cli/commands/play.d.ts.map +1 -0
  61. package/dist/cli/commands/play.js +216 -0
  62. package/dist/cli/commands/play.js.map +1 -0
  63. package/dist/cli/commands/record.d.ts +2 -0
  64. package/dist/cli/commands/record.d.ts.map +1 -0
  65. package/dist/cli/commands/record.js +393 -0
  66. package/dist/cli/commands/record.js.map +1 -0
  67. package/dist/cli/commands/render.d.ts +2 -0
  68. package/dist/cli/commands/render.d.ts.map +1 -0
  69. package/dist/cli/commands/render.js +278 -0
  70. package/dist/cli/commands/render.js.map +1 -0
  71. package/dist/cli/index.d.ts +3 -0
  72. package/dist/cli/index.d.ts.map +1 -0
  73. package/dist/cli/index.js +93 -0
  74. package/dist/cli/index.js.map +1 -0
  75. package/dist/compiler/compiler.d.ts +12 -0
  76. package/dist/compiler/compiler.d.ts.map +1 -0
  77. package/dist/compiler/compiler.js +146 -0
  78. package/dist/compiler/compiler.js.map +1 -0
  79. package/dist/compiler/index.d.ts +2 -0
  80. package/dist/compiler/index.d.ts.map +1 -0
  81. package/dist/compiler/index.js +2 -0
  82. package/dist/compiler/index.js.map +1 -0
  83. package/dist/config/config.d.ts +43 -0
  84. package/dist/config/config.d.ts.map +1 -0
  85. package/dist/config/config.js +200 -0
  86. package/dist/config/config.js.map +1 -0
  87. package/dist/config/index.d.ts +2 -0
  88. package/dist/config/index.d.ts.map +1 -0
  89. package/dist/config/index.js +2 -0
  90. package/dist/config/index.js.map +1 -0
  91. package/dist/errors.d.ts +49 -0
  92. package/dist/errors.d.ts.map +1 -0
  93. package/dist/errors.js +168 -0
  94. package/dist/errors.js.map +1 -0
  95. package/dist/formatter/formatter.d.ts +13 -0
  96. package/dist/formatter/formatter.d.ts.map +1 -0
  97. package/dist/formatter/formatter.js +242 -0
  98. package/dist/formatter/formatter.js.map +1 -0
  99. package/dist/formatter/index.d.ts +2 -0
  100. package/dist/formatter/index.d.ts.map +1 -0
  101. package/dist/formatter/index.js +2 -0
  102. package/dist/formatter/index.js.map +1 -0
  103. package/dist/generators/index.d.ts +5 -0
  104. package/dist/generators/index.d.ts.map +1 -0
  105. package/dist/generators/index.js +5 -0
  106. package/dist/generators/index.js.map +1 -0
  107. package/dist/generators/midi.d.ts +3 -0
  108. package/dist/generators/midi.d.ts.map +1 -0
  109. package/dist/generators/midi.js +360 -0
  110. package/dist/generators/midi.js.map +1 -0
  111. package/dist/generators/musicxml.d.ts +3 -0
  112. package/dist/generators/musicxml.d.ts.map +1 -0
  113. package/dist/generators/musicxml.js +332 -0
  114. package/dist/generators/musicxml.js.map +1 -0
  115. package/dist/generators/tempo-midi.d.ts +3 -0
  116. package/dist/generators/tempo-midi.d.ts.map +1 -0
  117. package/dist/generators/tempo-midi.js +123 -0
  118. package/dist/generators/tempo-midi.js.map +1 -0
  119. package/dist/generators/vsqx.d.ts +3 -0
  120. package/dist/generators/vsqx.d.ts.map +1 -0
  121. package/dist/generators/vsqx.js +354 -0
  122. package/dist/generators/vsqx.js.map +1 -0
  123. package/dist/importers/index.d.ts +2 -0
  124. package/dist/importers/index.d.ts.map +1 -0
  125. package/dist/importers/index.js +3 -0
  126. package/dist/importers/index.js.map +1 -0
  127. package/dist/importers/musicxml.d.ts +4 -0
  128. package/dist/importers/musicxml.d.ts.map +1 -0
  129. package/dist/importers/musicxml.js +392 -0
  130. package/dist/importers/musicxml.js.map +1 -0
  131. package/dist/index.d.ts +11 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +12 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/interpreter/builtins/algorithmic.d.ts +12 -0
  136. package/dist/interpreter/builtins/algorithmic.d.ts.map +1 -0
  137. package/dist/interpreter/builtins/algorithmic.js +244 -0
  138. package/dist/interpreter/builtins/algorithmic.js.map +1 -0
  139. package/dist/interpreter/builtins/audio.d.ts +10 -0
  140. package/dist/interpreter/builtins/audio.d.ts.map +1 -0
  141. package/dist/interpreter/builtins/audio.js +169 -0
  142. package/dist/interpreter/builtins/audio.js.map +1 -0
  143. package/dist/interpreter/builtins/core.d.ts +15 -0
  144. package/dist/interpreter/builtins/core.d.ts.map +1 -0
  145. package/dist/interpreter/builtins/core.js +265 -0
  146. package/dist/interpreter/builtins/core.js.map +1 -0
  147. package/dist/interpreter/builtins/dynamics.d.ts +8 -0
  148. package/dist/interpreter/builtins/dynamics.d.ts.map +1 -0
  149. package/dist/interpreter/builtins/dynamics.js +86 -0
  150. package/dist/interpreter/builtins/dynamics.js.map +1 -0
  151. package/dist/interpreter/builtins/effects.d.ts +16 -0
  152. package/dist/interpreter/builtins/effects.d.ts.map +1 -0
  153. package/dist/interpreter/builtins/effects.js +220 -0
  154. package/dist/interpreter/builtins/effects.js.map +1 -0
  155. package/dist/interpreter/builtins/index.d.ts +16 -0
  156. package/dist/interpreter/builtins/index.d.ts.map +1 -0
  157. package/dist/interpreter/builtins/index.js +17 -0
  158. package/dist/interpreter/builtins/index.js.map +1 -0
  159. package/dist/interpreter/builtins/layout.d.ts +12 -0
  160. package/dist/interpreter/builtins/layout.d.ts.map +1 -0
  161. package/dist/interpreter/builtins/layout.js +175 -0
  162. package/dist/interpreter/builtins/layout.js.map +1 -0
  163. package/dist/interpreter/builtins/live.d.ts +11 -0
  164. package/dist/interpreter/builtins/live.d.ts.map +1 -0
  165. package/dist/interpreter/builtins/live.js +125 -0
  166. package/dist/interpreter/builtins/live.js.map +1 -0
  167. package/dist/interpreter/builtins/midi.d.ts +16 -0
  168. package/dist/interpreter/builtins/midi.d.ts.map +1 -0
  169. package/dist/interpreter/builtins/midi.js +320 -0
  170. package/dist/interpreter/builtins/midi.js.map +1 -0
  171. package/dist/interpreter/builtins/mixing.d.ts +6 -0
  172. package/dist/interpreter/builtins/mixing.d.ts.map +1 -0
  173. package/dist/interpreter/builtins/mixing.js +62 -0
  174. package/dist/interpreter/builtins/mixing.js.map +1 -0
  175. package/dist/interpreter/builtins/notation.d.ts +24 -0
  176. package/dist/interpreter/builtins/notation.d.ts.map +1 -0
  177. package/dist/interpreter/builtins/notation.js +251 -0
  178. package/dist/interpreter/builtins/notation.js.map +1 -0
  179. package/dist/interpreter/builtins/ornaments.d.ts +8 -0
  180. package/dist/interpreter/builtins/ornaments.d.ts.map +1 -0
  181. package/dist/interpreter/builtins/ornaments.js +155 -0
  182. package/dist/interpreter/builtins/ornaments.js.map +1 -0
  183. package/dist/interpreter/builtins/techniques.d.ts +11 -0
  184. package/dist/interpreter/builtins/techniques.d.ts.map +1 -0
  185. package/dist/interpreter/builtins/techniques.js +234 -0
  186. package/dist/interpreter/builtins/techniques.js.map +1 -0
  187. package/dist/interpreter/builtins/tuning.d.ts +7 -0
  188. package/dist/interpreter/builtins/tuning.d.ts.map +1 -0
  189. package/dist/interpreter/builtins/tuning.js +52 -0
  190. package/dist/interpreter/builtins/tuning.js.map +1 -0
  191. package/dist/interpreter/builtins/types.d.ts +27 -0
  192. package/dist/interpreter/builtins/types.d.ts.map +1 -0
  193. package/dist/interpreter/builtins/types.js +3 -0
  194. package/dist/interpreter/builtins/types.js.map +1 -0
  195. package/dist/interpreter/builtins/vocaloid.d.ts +10 -0
  196. package/dist/interpreter/builtins/vocaloid.d.ts.map +1 -0
  197. package/dist/interpreter/builtins/vocaloid.js +165 -0
  198. package/dist/interpreter/builtins/vocaloid.js.map +1 -0
  199. package/dist/interpreter/index.d.ts +4 -0
  200. package/dist/interpreter/index.d.ts.map +1 -0
  201. package/dist/interpreter/index.js +4 -0
  202. package/dist/interpreter/index.js.map +1 -0
  203. package/dist/interpreter/interpreter.d.ts +305 -0
  204. package/dist/interpreter/interpreter.d.ts.map +1 -0
  205. package/dist/interpreter/interpreter.js +8463 -0
  206. package/dist/interpreter/interpreter.js.map +1 -0
  207. package/dist/interpreter/runtime.d.ts +67 -0
  208. package/dist/interpreter/runtime.d.ts.map +1 -0
  209. package/dist/interpreter/runtime.js +88 -0
  210. package/dist/interpreter/runtime.js.map +1 -0
  211. package/dist/interpreter/scope.d.ts +21 -0
  212. package/dist/interpreter/scope.d.ts.map +1 -0
  213. package/dist/interpreter/scope.js +60 -0
  214. package/dist/interpreter/scope.js.map +1 -0
  215. package/dist/interpreter/trackState.d.ts +205 -0
  216. package/dist/interpreter/trackState.d.ts.map +1 -0
  217. package/dist/interpreter/trackState.js +12 -0
  218. package/dist/interpreter/trackState.js.map +1 -0
  219. package/dist/lexer/index.d.ts +2 -0
  220. package/dist/lexer/index.d.ts.map +1 -0
  221. package/dist/lexer/index.js +2 -0
  222. package/dist/lexer/index.js.map +1 -0
  223. package/dist/lexer/lexer.d.ts +30 -0
  224. package/dist/lexer/lexer.d.ts.map +1 -0
  225. package/dist/lexer/lexer.js +385 -0
  226. package/dist/lexer/lexer.js.map +1 -0
  227. package/dist/parser/index.d.ts +2 -0
  228. package/dist/parser/index.d.ts.map +1 -0
  229. package/dist/parser/index.js +2 -0
  230. package/dist/parser/index.js.map +1 -0
  231. package/dist/parser/parser.d.ts +55 -0
  232. package/dist/parser/parser.d.ts.map +1 -0
  233. package/dist/parser/parser.js +896 -0
  234. package/dist/parser/parser.js.map +1 -0
  235. package/dist/types/ast.d.ts +220 -0
  236. package/dist/types/ast.d.ts.map +1 -0
  237. package/dist/types/ast.js +3 -0
  238. package/dist/types/ast.js.map +1 -0
  239. package/dist/types/index.d.ts +4 -0
  240. package/dist/types/index.d.ts.map +1 -0
  241. package/dist/types/index.js +4 -0
  242. package/dist/types/index.js.map +1 -0
  243. package/dist/types/ir/advanced.d.ts +491 -0
  244. package/dist/types/ir/advanced.d.ts.map +1 -0
  245. package/dist/types/ir/advanced.js +3 -0
  246. package/dist/types/ir/advanced.js.map +1 -0
  247. package/dist/types/ir/algorithmic.d.ts +48 -0
  248. package/dist/types/ir/algorithmic.d.ts.map +1 -0
  249. package/dist/types/ir/algorithmic.js +3 -0
  250. package/dist/types/ir/algorithmic.js.map +1 -0
  251. package/dist/types/ir/analysis.d.ts +34 -0
  252. package/dist/types/ir/analysis.d.ts.map +1 -0
  253. package/dist/types/ir/analysis.js +3 -0
  254. package/dist/types/ir/analysis.js.map +1 -0
  255. package/dist/types/ir/audio.d.ts +249 -0
  256. package/dist/types/ir/audio.d.ts.map +1 -0
  257. package/dist/types/ir/audio.js +3 -0
  258. package/dist/types/ir/audio.js.map +1 -0
  259. package/dist/types/ir/automation.d.ts +46 -0
  260. package/dist/types/ir/automation.d.ts.map +1 -0
  261. package/dist/types/ir/automation.js +3 -0
  262. package/dist/types/ir/automation.js.map +1 -0
  263. package/dist/types/ir/collaboration.d.ts +20 -0
  264. package/dist/types/ir/collaboration.d.ts.map +1 -0
  265. package/dist/types/ir/collaboration.js +3 -0
  266. package/dist/types/ir/collaboration.js.map +1 -0
  267. package/dist/types/ir/core.d.ts +153 -0
  268. package/dist/types/ir/core.d.ts.map +1 -0
  269. package/dist/types/ir/core.js +3 -0
  270. package/dist/types/ir/core.js.map +1 -0
  271. package/dist/types/ir/effects.d.ts +169 -0
  272. package/dist/types/ir/effects.d.ts.map +1 -0
  273. package/dist/types/ir/effects.js +3 -0
  274. package/dist/types/ir/effects.js.map +1 -0
  275. package/dist/types/ir/extended.d.ts +104 -0
  276. package/dist/types/ir/extended.d.ts.map +1 -0
  277. package/dist/types/ir/extended.js +3 -0
  278. package/dist/types/ir/extended.js.map +1 -0
  279. package/dist/types/ir/index.d.ts +16 -0
  280. package/dist/types/ir/index.d.ts.map +1 -0
  281. package/dist/types/ir/index.js +17 -0
  282. package/dist/types/ir/index.js.map +1 -0
  283. package/dist/types/ir/mastering.d.ts +86 -0
  284. package/dist/types/ir/mastering.d.ts.map +1 -0
  285. package/dist/types/ir/mastering.js +3 -0
  286. package/dist/types/ir/mastering.js.map +1 -0
  287. package/dist/types/ir/midi.d.ts +79 -0
  288. package/dist/types/ir/midi.d.ts.map +1 -0
  289. package/dist/types/ir/midi.js +3 -0
  290. package/dist/types/ir/midi.js.map +1 -0
  291. package/dist/types/ir/notation.d.ts +963 -0
  292. package/dist/types/ir/notation.d.ts.map +1 -0
  293. package/dist/types/ir/notation.js +3 -0
  294. package/dist/types/ir/notation.js.map +1 -0
  295. package/dist/types/ir/recording.d.ts +48 -0
  296. package/dist/types/ir/recording.d.ts.map +1 -0
  297. package/dist/types/ir/recording.js +3 -0
  298. package/dist/types/ir/recording.js.map +1 -0
  299. package/dist/types/ir/sampling.d.ts +59 -0
  300. package/dist/types/ir/sampling.d.ts.map +1 -0
  301. package/dist/types/ir/sampling.js +3 -0
  302. package/dist/types/ir/sampling.js.map +1 -0
  303. package/dist/types/ir/sequencing.d.ts +118 -0
  304. package/dist/types/ir/sequencing.d.ts.map +1 -0
  305. package/dist/types/ir/sequencing.js +3 -0
  306. package/dist/types/ir/sequencing.js.map +1 -0
  307. package/dist/types/ir/sync.d.ts +39 -0
  308. package/dist/types/ir/sync.d.ts.map +1 -0
  309. package/dist/types/ir/sync.js +3 -0
  310. package/dist/types/ir/sync.js.map +1 -0
  311. package/dist/types/ir.d.ts +2 -0
  312. package/dist/types/ir.d.ts.map +1 -0
  313. package/dist/types/ir.js +3 -0
  314. package/dist/types/ir.js.map +1 -0
  315. package/dist/types/token.d.ts +72 -0
  316. package/dist/types/token.d.ts.map +1 -0
  317. package/dist/types/token.js +90 -0
  318. package/dist/types/token.js.map +1 -0
  319. package/dist/utils/stdlib.d.ts +18 -0
  320. package/dist/utils/stdlib.d.ts.map +1 -0
  321. package/dist/utils/stdlib.js +51 -0
  322. package/dist/utils/stdlib.js.map +1 -0
  323. package/lib/articulation.mf +46 -0
  324. package/lib/composition.mf +299 -0
  325. package/lib/curves.mf +183 -0
  326. package/lib/dynamics.mf +141 -0
  327. package/lib/expression.mf +221 -0
  328. package/lib/genres.mf +348 -0
  329. package/lib/notation.mf +224 -0
  330. package/lib/ornaments.mf +98 -0
  331. package/lib/patterns.mf +170 -0
  332. package/lib/rhythm.mf +269 -0
  333. package/lib/theory.mf +257 -0
  334. package/lib/utils.mf +140 -0
  335. package/package.json +49 -0
@@ -0,0 +1,200 @@
1
+ // Configuration file parser for mfconfig.toml
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import TOML from 'toml';
5
+ const DEFAULT_CONFIG = {
6
+ project: {
7
+ entry: 'src/main.mf',
8
+ dist: 'dist',
9
+ out: 'out',
10
+ defaultProfile: 'cli',
11
+ },
12
+ profiles: {
13
+ miku: {
14
+ backend: 'miku-daw',
15
+ importStrategy: 'manual',
16
+ vsqxOut: 'dist/vocal.vsqx',
17
+ tempoMidOut: 'dist/tempo.mid',
18
+ renderOut: 'out/mix.wav',
19
+ },
20
+ cli: {
21
+ backend: 'headless',
22
+ musicxmlOut: 'dist/vocal.musicxml',
23
+ bandMidOut: 'dist/band.mid',
24
+ renderOut: 'out/mix.wav',
25
+ },
26
+ },
27
+ };
28
+ export function loadConfig(configPath) {
29
+ try {
30
+ const content = fs.readFileSync(configPath, 'utf-8');
31
+ const parsed = TOML.parse(content);
32
+ return mergeConfig(DEFAULT_CONFIG, parsed);
33
+ }
34
+ catch (err) {
35
+ if (err.code === 'ENOENT') {
36
+ throw new Error(`Config file not found: ${configPath}`);
37
+ }
38
+ if (err instanceof Error && err.message.includes('Syntax error')) {
39
+ throw new Error(`Invalid TOML syntax in ${configPath}: ${err.message}`);
40
+ }
41
+ throw err;
42
+ }
43
+ }
44
+ export function validateConfig(configPath) {
45
+ const errors = [];
46
+ const warnings = [];
47
+ const baseDir = path.dirname(configPath);
48
+ try {
49
+ const content = fs.readFileSync(configPath, 'utf-8');
50
+ const parsed = TOML.parse(content);
51
+ // Check for unknown top-level keys
52
+ const validTopKeys = ['project', 'profiles'];
53
+ for (const key of Object.keys(parsed)) {
54
+ if (!validTopKeys.includes(key)) {
55
+ warnings.push(`Unknown config key: "${key}". Valid keys are: ${validTopKeys.join(', ')}`);
56
+ }
57
+ }
58
+ // Validate [project] section
59
+ if (parsed.project) {
60
+ const validProjectKeys = ['entry', 'dist', 'out', 'default_profile', 'name', 'version'];
61
+ for (const key of Object.keys(parsed.project)) {
62
+ if (!validProjectKeys.includes(key)) {
63
+ warnings.push(`Unknown project key: "${key}". Valid keys are: ${validProjectKeys.join(', ')}`);
64
+ }
65
+ }
66
+ // Check entry file exists
67
+ if (parsed.project.entry) {
68
+ const entryPath = path.join(baseDir, parsed.project.entry);
69
+ if (!fs.existsSync(entryPath)) {
70
+ errors.push(`Entry file not found: ${parsed.project.entry}`);
71
+ }
72
+ }
73
+ }
74
+ else {
75
+ warnings.push('Missing [project] section, using defaults');
76
+ }
77
+ // Validate [profiles] section
78
+ if (parsed.profiles) {
79
+ const validProfileNames = ['cli', 'miku'];
80
+ for (const profileName of Object.keys(parsed.profiles)) {
81
+ if (!validProfileNames.includes(profileName)) {
82
+ warnings.push(`Unknown profile: "${profileName}". Valid profiles are: ${validProfileNames.join(', ')}`);
83
+ }
84
+ }
85
+ // Validate [profiles.cli]
86
+ if (parsed.profiles.cli) {
87
+ const validCliKeys = ['backend', 'vocal_cmd', 'midi_cmd', 'mix_cmd', 'musicxml_out', 'band_mid_out', 'render_out'];
88
+ for (const key of Object.keys(parsed.profiles.cli)) {
89
+ if (!validCliKeys.includes(key)) {
90
+ warnings.push(`Unknown profiles.cli key: "${key}". Valid keys are: ${validCliKeys.join(', ')}`);
91
+ }
92
+ }
93
+ // Check command arrays
94
+ for (const cmdKey of ['vocal_cmd', 'midi_cmd', 'mix_cmd']) {
95
+ const cmd = parsed.profiles.cli[cmdKey];
96
+ if (cmd && !Array.isArray(cmd)) {
97
+ errors.push(`profiles.cli.${cmdKey} must be an array of strings`);
98
+ }
99
+ }
100
+ }
101
+ // Validate [profiles.miku]
102
+ if (parsed.profiles.miku) {
103
+ const validMikuKeys = ['backend', 'import_strategy', 'daw_exe', 'daw_args', 'daw_project', 'vsqx_out', 'tempo_mid_out', 'render_out', 'engine'];
104
+ for (const key of Object.keys(parsed.profiles.miku)) {
105
+ if (!validMikuKeys.includes(key)) {
106
+ warnings.push(`Unknown profiles.miku key: "${key}". Valid keys are: ${validMikuKeys.join(', ')}`);
107
+ }
108
+ }
109
+ }
110
+ }
111
+ return {
112
+ valid: errors.length === 0,
113
+ errors,
114
+ warnings,
115
+ };
116
+ }
117
+ catch (err) {
118
+ if (err instanceof Error) {
119
+ errors.push(err.message);
120
+ }
121
+ return { valid: false, errors, warnings };
122
+ }
123
+ }
124
+ export function findConfigPath(startDir) {
125
+ let currentDir = startDir;
126
+ while (true) {
127
+ const configPath = path.join(currentDir, 'mfconfig.toml');
128
+ if (fs.existsSync(configPath)) {
129
+ return configPath;
130
+ }
131
+ const parentDir = path.dirname(currentDir);
132
+ if (parentDir === currentDir) {
133
+ return null;
134
+ }
135
+ currentDir = parentDir;
136
+ }
137
+ }
138
+ function mergeConfig(defaults, parsed) {
139
+ return {
140
+ project: {
141
+ entry: parsed.project?.entry ?? defaults.project.entry,
142
+ dist: parsed.project?.dist ?? defaults.project.dist,
143
+ out: parsed.project?.out ?? defaults.project.out,
144
+ defaultProfile: parsed.project?.default_profile ?? defaults.project.defaultProfile,
145
+ },
146
+ profiles: {
147
+ miku: parsed.profiles?.miku
148
+ ? {
149
+ backend: 'miku-daw',
150
+ importStrategy: parsed.profiles.miku.import_strategy ?? 'manual',
151
+ dawExe: parsed.profiles.miku.daw_exe,
152
+ dawArgs: parsed.profiles.miku.daw_args,
153
+ dawProject: parsed.profiles.miku.daw_project,
154
+ vsqxOut: parsed.profiles.miku.vsqx_out ?? defaults.profiles.miku.vsqxOut,
155
+ tempoMidOut: parsed.profiles.miku.tempo_mid_out ?? defaults.profiles.miku.tempoMidOut,
156
+ renderOut: parsed.profiles.miku.render_out ?? defaults.profiles.miku.renderOut,
157
+ }
158
+ : defaults.profiles.miku,
159
+ cli: parsed.profiles?.cli
160
+ ? {
161
+ backend: 'headless',
162
+ vocalCmd: parsed.profiles.cli.vocal_cmd,
163
+ midiCmd: parsed.profiles.cli.midi_cmd,
164
+ mixCmd: parsed.profiles.cli.mix_cmd,
165
+ musicxmlOut: parsed.profiles.cli.musicxml_out ?? defaults.profiles.cli.musicxmlOut,
166
+ bandMidOut: parsed.profiles.cli.band_mid_out ?? defaults.profiles.cli.bandMidOut,
167
+ renderOut: parsed.profiles.cli.render_out ?? defaults.profiles.cli.renderOut,
168
+ }
169
+ : defaults.profiles.cli,
170
+ },
171
+ };
172
+ }
173
+ export function generateDefaultConfig() {
174
+ return `[project]
175
+ entry = "src/main.mf"
176
+ dist = "dist"
177
+ out = "out"
178
+ default_profile = "cli"
179
+
180
+ [profiles.miku]
181
+ backend = "miku-daw"
182
+ import_strategy = "manual"
183
+ # daw_exe = "reaper"
184
+ # daw_args = ["-renderproject", "{project}"]
185
+ # daw_project = "reaper/song.rpp"
186
+ vsqx_out = "dist/vocal.vsqx"
187
+ tempo_mid_out= "dist/tempo.mid"
188
+ render_out = "out/mix.wav"
189
+
190
+ [profiles.cli]
191
+ backend = "headless"
192
+ # vocal_cmd = ["neutrino-run", "{musicxml}", "{vocal_wav}"]
193
+ # midi_cmd = ["fluidsynth-run", "{mid}", "{band_wav}"]
194
+ # mix_cmd = ["ffmpeg", "-i", "{vocal_wav}", "-i", "{band_wav}", "{mix_wav}"]
195
+ musicxml_out = "dist/vocal.musicxml"
196
+ band_mid_out = "dist/band.mid"
197
+ render_out = "out/mix.wav"
198
+ `;
199
+ }
200
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAwCxB,MAAM,cAAc,GAAa;IAC/B,OAAO,EAAE;QACP,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,KAAK;QACV,cAAc,EAAE,KAAK;KACtB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,OAAO,EAAE,UAAU;YACnB,cAAc,EAAE,QAAQ;YACxB,OAAO,EAAE,iBAAiB;YAC1B,WAAW,EAAE,gBAAgB;YAC7B,SAAS,EAAE,aAAa;SACzB;QACD,GAAG,EAAE;YACH,OAAO,EAAE,UAAU;YACnB,WAAW,EAAE,qBAAqB;YAClC,UAAU,EAAE,eAAe;YAC3B,SAAS,EAAE,aAAa;SACzB;KACF;CACF,CAAC;AAQF,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,WAAW,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnC,mCAAmC;QACnC,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC7C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,GAAG,sBAAsB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YACxF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,GAAG,sBAAsB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjG,CAAC;YACH,CAAC;YAED,0BAA0B;YAC1B,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACzB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC9B,MAAM,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC7D,CAAC;QAED,8BAA8B;QAC9B,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC1C,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC7C,QAAQ,CAAC,IAAI,CAAC,qBAAqB,WAAW,0BAA0B,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC1G,CAAC;YACH,CAAC;YAED,0BAA0B;YAC1B,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;gBACxB,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;gBACnH,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBAChC,QAAQ,CAAC,IAAI,CAAC,8BAA8B,GAAG,sBAAsB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAClG,CAAC;gBACH,CAAC;gBAED,uBAAuB;gBACvB,KAAK,MAAM,MAAM,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;oBAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACxC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC/B,MAAM,CAAC,IAAI,CAAC,gBAAgB,MAAM,8BAA8B,CAAC,CAAC;oBACpE,CAAC;gBACH,CAAC;YACH,CAAC;YAED,2BAA2B;YAC3B,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACzB,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;gBAChJ,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBACjC,QAAQ,CAAC,IAAI,CAAC,+BAA+B,GAAG,sBAAsB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACpG,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;YACN,QAAQ;SACT,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,IAAI,UAAU,GAAG,QAAQ,CAAC;IAE1B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,QAAkB,EAAE,MAAW;IAClD,OAAO;QACL,OAAO,EAAE;YACP,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK;YACtD,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI;YACnD,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG;YAChD,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,eAAe,IAAI,QAAQ,CAAC,OAAO,CAAC,cAAc;SACnF;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI;gBACzB,CAAC,CAAC;oBACE,OAAO,EAAE,UAAU;oBACnB,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,IAAI,QAAQ;oBAChE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO;oBACpC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ;oBACtC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW;oBAC5C,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAK,CAAC,OAAO;oBACzE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAK,CAAC,WAAW;oBACtF,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAK,CAAC,SAAS;iBAChF;gBACH,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI;YAC1B,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG;gBACvB,CAAC,CAAC;oBACE,OAAO,EAAE,UAAU;oBACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS;oBACvC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ;oBACrC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO;oBACnC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAI,CAAC,WAAW;oBACnF,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAI,CAAC,UAAU;oBACjF,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAI,CAAC,SAAS;iBAC9E;gBACH,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG;SAC1B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;CAwBR,CAAC;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './config.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './config.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { Position } from './types/token.js';
2
+ export declare class MFError extends Error {
3
+ code: string;
4
+ position?: Position | undefined;
5
+ filePath?: string | undefined;
6
+ suggestion?: string;
7
+ constructor(code: string, message: string, position?: Position | undefined, filePath?: string | undefined, suggestion?: string);
8
+ toString(): string;
9
+ }
10
+ export declare const ErrorCodes: {
11
+ readonly E001: "ppq not set";
12
+ readonly E010: "tempo at tick=0 not set";
13
+ readonly E011: "timeSig at tick=0 not set";
14
+ readonly E020: "timeSig must be at bar start";
15
+ readonly E050: "Global function called after track started";
16
+ readonly E101: "Dur to tick does not divide evenly";
17
+ readonly E102: "Time sub out of beat tick range";
18
+ readonly E110: "Pitch out of range 0..127";
19
+ readonly E120: "CC controller out of range 0..127";
20
+ readonly E121: "CC/control value out of range 0..127";
21
+ readonly E122: "Pitch bend value out of range -8192..8191";
22
+ readonly E123: "Tempo curve steps must be at least 2";
23
+ readonly E130: "Invalid clef type";
24
+ readonly E131: "Key signature fifths out of range -7..7";
25
+ readonly E132: "Invalid articulation type";
26
+ readonly E133: "Invalid barline style";
27
+ readonly E134: "Invalid vocal style";
28
+ readonly E200: "Vocal note overlap";
29
+ readonly E210: "Vocal lyric missing or empty";
30
+ readonly E300: "Top-level execution in imported module";
31
+ readonly E310: "Proc recursion detected";
32
+ readonly E400: "Undefined symbol";
33
+ readonly E401: "For loop iteration limit exceeded";
34
+ };
35
+ export declare const WarningCodes: {
36
+ readonly W100: "Note duration extremely short";
37
+ readonly W110: "Vocal pitch out of typical range";
38
+ readonly W200: "Too many tempo events";
39
+ };
40
+ export declare const ExitCodes: {
41
+ readonly SUCCESS: 0;
42
+ readonly STATIC_ERROR: 2;
43
+ readonly IO_ERROR: 3;
44
+ readonly EXTERNAL_TOOL_ERROR: 4;
45
+ readonly DEPENDENCY_MISSING: 5;
46
+ };
47
+ export declare function createError(code: keyof typeof ErrorCodes, details?: string, position?: Position, filePath?: string, suggestion?: string): MFError;
48
+ export declare function findSimilarSymbols(name: string, available: string[], maxDistance?: number): string[];
49
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,qBAAa,OAAQ,SAAQ,KAAK;IAIvB,IAAI,EAAE,MAAM;IAEZ,QAAQ,CAAC,EAAE,QAAQ;IACnB,QAAQ,CAAC,EAAE,MAAM;IANnB,UAAU,CAAC,EAAE,MAAM,CAAC;gBAGlB,IAAI,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACR,QAAQ,CAAC,EAAE,QAAQ,YAAA,EACnB,QAAQ,CAAC,EAAE,MAAM,YAAA,EACxB,UAAU,CAAC,EAAE,MAAM;IAOrB,QAAQ,IAAI,MAAM;CAanB;AAGD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;CAqCb,CAAC;AAEX,eAAO,MAAM,YAAY;;;;CAIf,CAAC;AAGX,eAAO,MAAM,SAAS;;;;;;CAMZ,CAAC;AAEX,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,OAAO,UAAU,EAC7B,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAST;AAuDD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,WAAW,SAAI,GAAG,MAAM,EAAE,CAc/F"}
package/dist/errors.js ADDED
@@ -0,0 +1,168 @@
1
+ // Error definitions for MFS language
2
+ export class MFError extends Error {
3
+ code;
4
+ position;
5
+ filePath;
6
+ suggestion;
7
+ constructor(code, message, position, filePath, suggestion) {
8
+ super(message);
9
+ this.code = code;
10
+ this.position = position;
11
+ this.filePath = filePath;
12
+ this.name = 'MFError';
13
+ this.suggestion = suggestion;
14
+ }
15
+ toString() {
16
+ const loc = this.position
17
+ ? `${this.filePath || 'unknown'}:${this.position.line}:${this.position.column}`
18
+ : '';
19
+ let result = `\n error[${this.code}]: ${this.message}`;
20
+ if (loc) {
21
+ result += `\n --> ${loc}`;
22
+ }
23
+ if (this.suggestion) {
24
+ result += `\n help: ${this.suggestion}`;
25
+ }
26
+ return result;
27
+ }
28
+ }
29
+ // Error codes as per spec
30
+ export const ErrorCodes = {
31
+ // General
32
+ E001: 'ppq not set',
33
+ E010: 'tempo at tick=0 not set',
34
+ E011: 'timeSig at tick=0 not set',
35
+ E020: 'timeSig must be at bar start',
36
+ E050: 'Global function called after track started',
37
+ // Time/Duration
38
+ E101: 'Dur to tick does not divide evenly',
39
+ E102: 'Time sub out of beat tick range',
40
+ E110: 'Pitch out of range 0..127',
41
+ // MIDI Control
42
+ E120: 'CC controller out of range 0..127',
43
+ E121: 'CC/control value out of range 0..127',
44
+ E122: 'Pitch bend value out of range -8192..8191',
45
+ E123: 'Tempo curve steps must be at least 2',
46
+ // Notation
47
+ E130: 'Invalid clef type',
48
+ E131: 'Key signature fifths out of range -7..7',
49
+ E132: 'Invalid articulation type',
50
+ E133: 'Invalid barline style',
51
+ E134: 'Invalid vocal style',
52
+ // Vocal
53
+ E200: 'Vocal note overlap',
54
+ E210: 'Vocal lyric missing or empty',
55
+ // Module
56
+ E300: 'Top-level execution in imported module',
57
+ E310: 'Proc recursion detected',
58
+ // Symbol/Syntax
59
+ E400: 'Undefined symbol',
60
+ E401: 'For loop iteration limit exceeded',
61
+ };
62
+ export const WarningCodes = {
63
+ W100: 'Note duration extremely short',
64
+ W110: 'Vocal pitch out of typical range',
65
+ W200: 'Too many tempo events',
66
+ };
67
+ // Exit codes as per spec
68
+ export const ExitCodes = {
69
+ SUCCESS: 0,
70
+ STATIC_ERROR: 2,
71
+ IO_ERROR: 3,
72
+ EXTERNAL_TOOL_ERROR: 4,
73
+ DEPENDENCY_MISSING: 5,
74
+ };
75
+ export function createError(code, details, position, filePath, suggestion) {
76
+ const message = details
77
+ ? `${ErrorCodes[code]}: ${details}`
78
+ : ErrorCodes[code];
79
+ // Add default suggestions for common errors
80
+ const defaultSuggestion = suggestion ?? getDefaultSuggestion(code, details);
81
+ return new MFError(code, message, position, filePath, defaultSuggestion);
82
+ }
83
+ function getDefaultSuggestion(code, details) {
84
+ switch (code) {
85
+ case 'E001':
86
+ return 'Add ppq(480) at the start of main()';
87
+ case 'E010':
88
+ return 'Add tempo(120) at the start of main()';
89
+ case 'E011':
90
+ return 'Add timeSig(4, 4) at the start of main()';
91
+ case 'E020':
92
+ return 'Time signature changes must occur at the start of a bar';
93
+ case 'E050':
94
+ return 'Move global functions (ppq, tempo, timeSig, title) before any track() blocks';
95
+ case 'E110':
96
+ return 'Valid MIDI pitch range is 0-127 (C-1 to G9). Try using a different octave.';
97
+ case 'E120':
98
+ return 'MIDI CC controller numbers must be between 0 and 127';
99
+ case 'E121':
100
+ return 'MIDI CC/control values must be between 0 and 127';
101
+ case 'E122':
102
+ return 'Pitch bend values must be between -8192 (full down) and 8191 (full up). 0 is center.';
103
+ case 'E123':
104
+ return 'tempoCurve() needs at least 2 steps to interpolate between tempos';
105
+ case 'E130':
106
+ return 'Valid clefs: treble, bass, alto, tenor, percussion, tab, treble8va, treble8vb, bass8va, bass8vb';
107
+ case 'E131':
108
+ return 'Key signature fifths range from -7 (7 flats) to 7 (7 sharps). 0 = C major/A minor';
109
+ case 'E132':
110
+ return 'Valid articulations: staccato, legato, accent, tenuto, marcato, staccatissimo, fermata, breath, caesura';
111
+ case 'E133':
112
+ return 'Valid barline styles: single, double, final, repeat-start, repeat-end, repeat-both, dashed, tick, short, none';
113
+ case 'E134':
114
+ return 'Valid vocal styles: soft, normal, power, falsetto, whisper, breathy, belt, head, chest';
115
+ case 'E200':
116
+ return 'Vocal notes cannot overlap. Use rest() or adjust timing with at()';
117
+ case 'E210':
118
+ return 'Vocal note() requires a lyric: note(C4, 1/4, "あ")';
119
+ case 'E300':
120
+ return 'Imported modules should only contain proc/const definitions, not executable code';
121
+ case 'E310':
122
+ return 'Procedures cannot call themselves directly or indirectly';
123
+ case 'E400':
124
+ if (details?.includes('main')) {
125
+ return 'Add "export proc main() { ... }" to define the entry point';
126
+ }
127
+ return undefined; // Will use symbol suggestion instead
128
+ case 'E401':
129
+ return 'For loop range bounds must be const values, not let variables';
130
+ default:
131
+ return undefined;
132
+ }
133
+ }
134
+ // Find similar symbol names using Levenshtein distance
135
+ export function findSimilarSymbols(name, available, maxDistance = 3) {
136
+ const results = [];
137
+ for (const sym of available) {
138
+ const dist = levenshteinDistance(name.toLowerCase(), sym.toLowerCase());
139
+ if (dist <= maxDistance) {
140
+ results.push({ name: sym, distance: dist });
141
+ }
142
+ }
143
+ return results
144
+ .sort((a, b) => a.distance - b.distance)
145
+ .slice(0, 3)
146
+ .map((r) => r.name);
147
+ }
148
+ function levenshteinDistance(a, b) {
149
+ const matrix = [];
150
+ for (let i = 0; i <= b.length; i++) {
151
+ matrix[i] = [i];
152
+ }
153
+ for (let j = 0; j <= a.length; j++) {
154
+ matrix[0][j] = j;
155
+ }
156
+ for (let i = 1; i <= b.length; i++) {
157
+ for (let j = 1; j <= a.length; j++) {
158
+ if (b[i - 1] === a[j - 1]) {
159
+ matrix[i][j] = matrix[i - 1][j - 1];
160
+ }
161
+ else {
162
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1);
163
+ }
164
+ }
165
+ }
166
+ return matrix[b.length][a.length];
167
+ }
168
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Program } from '../types/ast.js';
2
+ export declare class Formatter {
3
+ private indent;
4
+ private output;
5
+ format(program: Program): string;
6
+ private formatStatement;
7
+ private formatExport;
8
+ private formatProc;
9
+ private formatExpr;
10
+ private escapeString;
11
+ private line;
12
+ }
13
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/formatter/formatter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,OAAO,EAIR,MAAM,iBAAiB,CAAC;AAEzB,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAgB;IAE9B,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAsChC,OAAO,CAAC,eAAe;IAsHvB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,UAAU;IA2FlB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,IAAI;CAIb"}