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
package/README.md ADDED
@@ -0,0 +1,230 @@
1
+ # TakoMusic
2
+
3
+ A domain-specific language (DSL) for music composition that generates VSQX, MusicXML, and MIDI files.
4
+
5
+ ## Features
6
+
7
+ - **MFS Language**: Write music using a simple, readable syntax
8
+ - **Multi-format Export**: Generate VSQX (Vocaloid), MusicXML (notation), and MIDI (instruments)
9
+ - **Advanced MIDI**: CC, pitch bend, aftertouch, NRPN, SysEx, MPE support
10
+ - **Extended Notation**: Tuplets, grace notes, articulations, dynamics, ornaments
11
+ - **Vocaloid Support**: Full parameter control, vibrato, growl, cross-synthesis
12
+ - **Algorithmic Composition**: Euclidean rhythms, Markov chains, pattern generation
13
+ - **Module System**: Organize code with imports/exports
14
+ - **CLI Tools**: Build, check, format, play, import, record, and render
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ npm install
20
+ npm run build
21
+ ```
22
+
23
+ ## Quick Start
24
+
25
+ ### 1. Create a new project
26
+
27
+ ```bash
28
+ mf init myproject # Default template
29
+ mf init myproject -t piano # Piano template
30
+ mf init --list # List all templates
31
+ ```
32
+
33
+ ### 2. Edit src/main.mf
34
+
35
+ ```mfs
36
+ export proc main() {
37
+ title("My First Song");
38
+ ppq(480);
39
+ timeSig(4, 4);
40
+ tempo(120);
41
+
42
+ track(midi, piano, { ch: 1, program: 0 }) {
43
+ at(1:1);
44
+ chord([C4, E4, G4], 1n);
45
+ }
46
+
47
+ track(midi, drums, { ch: 10, vel: 100 }) {
48
+ at(1:1);
49
+ drum(kick, 4n); drum(hhc, 4n);
50
+ drum(snare, 4n); drum(hhc, 4n);
51
+ }
52
+ }
53
+ ```
54
+
55
+ ### 3. Build and play
56
+
57
+ ```bash
58
+ mf check # Check for errors
59
+ mf build # Generate MIDI, MusicXML, VSQX
60
+ mf play # Live preview with FluidSynth
61
+ mf render -p cli # Render audio
62
+ ```
63
+
64
+ ## CLI Commands
65
+
66
+ | Command | Description |
67
+ |---------|-------------|
68
+ | `mf init [dir]` | Initialize new project |
69
+ | `mf build` | Compile to IR and output formats |
70
+ | `mf check` | Static analysis |
71
+ | `mf fmt` | Format source files |
72
+ | `mf play [file]` | Live preview with FluidSynth |
73
+ | `mf import <file>` | Import MusicXML to MFS |
74
+ | `mf record` | Record MIDI input |
75
+ | `mf render -p <profile>` | Render audio |
76
+ | `mf doctor` | Check dependencies |
77
+
78
+ **Available Templates:** `default`, `piano`, `orchestral`, `edm`, `chiptune`, `jazz`, `vocaloid`, `minimal`
79
+
80
+ ## Documentation
81
+
82
+ - **[Language Specification](docs/LANGUAGE.md)** - Complete language syntax, types, and operators
83
+
84
+ - **[Builtin Functions](docs/BUILTINS.md)** - Low-level runtime functions (IR operations, MIDI control)
85
+ - **[Standard Library](docs/STDLIB.md)** - High-level music functions (theory, patterns, dynamics, etc.)
86
+
87
+ ## Language Basics
88
+
89
+ ### Pitch & Duration Literals
90
+
91
+ **Pitches:**
92
+ - Natural: `C4`, `D4`, `E4`, `F4`, `G4`, `A4`, `B4`
93
+ - Sharp: `C#4`, `D#4`, `F#4`, `G#4`, `A#4`
94
+ - Flat: `Db4`, `Eb4`, `Gb4`, `Ab4`, `Bb4`
95
+
96
+ **Durations:**
97
+ - `1n` = whole, `2n` = half, `4n` = quarter
98
+ - `8n` = eighth, `16n` = sixteenth, `32n` = thirty-second
99
+ - `4n.` = dotted quarter, `8n.` = dotted eighth
100
+ - `480t` = 480 ticks
101
+
102
+ **Time:**
103
+ - `1:1` = bar 1, beat 1
104
+ - `2:3` = bar 2, beat 3
105
+ - `1:1:240` = bar 1, beat 1, tick 240
106
+
107
+ **Drum Names:** `kick`, `snare`, `hhc`, `hho`, `tom1`, `crash`, `ride`
108
+
109
+ ### Control Structures
110
+
111
+ ```mfs
112
+ // Procedures
113
+ proc myPattern() {
114
+ note(C4, 4n);
115
+ }
116
+
117
+ // Loops
118
+ for (i in 1..=4) {
119
+ myPattern();
120
+ }
121
+
122
+ // Conditionals
123
+ if (x > 0) {
124
+ note(C4, 4n);
125
+ } else {
126
+ rest(4n);
127
+ }
128
+ ```
129
+
130
+ ### Modules
131
+
132
+ ```mfs
133
+ // phrases/drums.mf
134
+ export proc BEAT_8() {
135
+ drum(kick, 8n);
136
+ drum(hhc, 8n);
137
+ }
138
+
139
+ // main.mf
140
+ import { BEAT_8 } from "./phrases/drums.mf";
141
+
142
+ export proc main() {
143
+ track(midi, drums, { ch: 10 }) {
144
+ for (bar in 1..=4) {
145
+ BEAT_8();
146
+ }
147
+ }
148
+ }
149
+ ```
150
+
151
+ ### Standard Library Import
152
+
153
+ ```mfs
154
+ import { major, minor } from "std:theory";
155
+ import { euclidean } from "std:patterns";
156
+ import { crescendo } from "std:dynamics";
157
+ ```
158
+
159
+ ## Configuration (mfconfig.toml)
160
+
161
+ ```toml
162
+ [project]
163
+ name = "my-song"
164
+ version = "1.0.0"
165
+ entry = "src/main.mf"
166
+ dist = "dist"
167
+ out = "out"
168
+
169
+ [profiles.cli]
170
+ backend = "headless"
171
+ musicxml_out = "dist/vocal.musicxml"
172
+ band_mid_out = "dist/band.mid"
173
+ render_out = "out/mix.mp3"
174
+ vocal_cmd = ["neutrino", "{musicxml}", "{vocal_wav}"]
175
+ midi_cmd = ["fluidsynth", "-ni", "soundfont.sf2", "{mid}", "-F", "{band_wav}"]
176
+ mix_cmd = ["ffmpeg", "-i", "{vocal_wav}", "-i", "{band_wav}", "-y", "{mix_wav}"]
177
+ ```
178
+
179
+ ## External Tools
180
+
181
+ ### FluidSynth (Live Preview & MIDI Rendering)
182
+
183
+ ```bash
184
+ # Windows
185
+ winget install FluidSynth.FluidSynth
186
+
187
+ # macOS
188
+ brew install fluid-synth
189
+
190
+ # Linux
191
+ apt install fluidsynth
192
+ ```
193
+
194
+ ### NEUTRINO (Vocal Synthesis)
195
+
196
+ 1. Download from official site
197
+ 2. Set `NEUTRINO_DIR` environment variable
198
+ 3. Configure `vocal_cmd` in mfconfig.toml
199
+
200
+ ### FFmpeg (Audio Mixing)
201
+
202
+ ```bash
203
+ # Windows
204
+ winget install FFmpeg
205
+
206
+ # macOS
207
+ brew install ffmpeg
208
+
209
+ # Linux
210
+ apt install ffmpeg
211
+ ```
212
+
213
+ ## Error Codes
214
+
215
+ | Code | Description |
216
+ |------|-------------|
217
+ | E050 | Global function called after track started |
218
+ | E110 | Pitch out of range (0-127) |
219
+ | E200 | Vocal note overlap |
220
+ | E210 | Invalid/empty lyric in vocal track |
221
+ | E220 | drum() used in vocal track |
222
+ | E221 | chord() used in vocal track |
223
+ | E300 | Top-level execution in imported module |
224
+ | E310 | Recursion detected |
225
+ | E400 | Import not found / undefined symbol / no main() |
226
+ | E401 | For range bounds must be compile-time constants |
227
+
228
+ ## License
229
+
230
+ AGPL-3.0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=checker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checker.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/checker.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,316 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { Lexer } from '../lexer/index.js';
3
+ import { Parser } from '../parser/index.js';
4
+ import { Checker } from '../checker/checker.js';
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import * as os from 'os';
8
+ describe('Checker', () => {
9
+ function check(source, filePath = 'test.mf') {
10
+ const lexer = new Lexer(source, filePath);
11
+ const tokens = lexer.tokenize();
12
+ const parser = new Parser(tokens, filePath);
13
+ const program = parser.parse();
14
+ const checker = new Checker(path.dirname(filePath));
15
+ return checker.check(program, filePath);
16
+ }
17
+ it('should pass valid program', () => {
18
+ const source = `
19
+ export proc main() {
20
+ ppq(480);
21
+ timeSig(4, 4);
22
+ tempo(120);
23
+
24
+ track(midi, t1, { ch: 1 }) {
25
+ at(1:1);
26
+ note(C4, 1/4);
27
+ }
28
+ }
29
+ `;
30
+ const diagnostics = check(source);
31
+ const errors = diagnostics.filter(d => d.severity === 'error');
32
+ expect(errors.length).toBe(0);
33
+ });
34
+ it('should detect E400 (no main)', () => {
35
+ const source = `
36
+ proc foo() {
37
+ ppq(480);
38
+ }
39
+ `;
40
+ const diagnostics = check(source);
41
+ expect(diagnostics.some(d => d.code === 'E400' && d.message.includes('main'))).toBe(true);
42
+ });
43
+ it('should detect E400 (undefined symbol)', () => {
44
+ const source = `
45
+ export proc main() {
46
+ ppq(480);
47
+ timeSig(4, 4);
48
+ tempo(120);
49
+ const x = undefinedVar;
50
+ }
51
+ `;
52
+ const diagnostics = check(source);
53
+ expect(diagnostics.some(d => d.code === 'E400' && d.message.includes('undefinedVar'))).toBe(true);
54
+ });
55
+ it('should detect E050 (global after track)', () => {
56
+ const source = `
57
+ export proc main() {
58
+ ppq(480);
59
+ timeSig(4, 4);
60
+ tempo(120);
61
+
62
+ track(midi, t1, { ch: 1 }) { }
63
+ tempo(140);
64
+ }
65
+ `;
66
+ const diagnostics = check(source);
67
+ expect(diagnostics.some(d => d.code === 'E050')).toBe(true);
68
+ });
69
+ it('should detect E310 (direct recursion)', () => {
70
+ const source = `
71
+ proc foo() {
72
+ foo();
73
+ }
74
+
75
+ export proc main() {
76
+ ppq(480);
77
+ timeSig(4, 4);
78
+ tempo(120);
79
+ foo();
80
+ }
81
+ `;
82
+ const diagnostics = check(source);
83
+ expect(diagnostics.some(d => d.code === 'E310')).toBe(true);
84
+ });
85
+ it('should detect E310 (indirect recursion)', () => {
86
+ const source = `
87
+ proc foo() {
88
+ bar();
89
+ }
90
+
91
+ proc bar() {
92
+ foo();
93
+ }
94
+
95
+ export proc main() {
96
+ ppq(480);
97
+ timeSig(4, 4);
98
+ tempo(120);
99
+ foo();
100
+ }
101
+ `;
102
+ const diagnostics = check(source);
103
+ expect(diagnostics.some(d => d.code === 'E310')).toBe(true);
104
+ });
105
+ it('should detect E401 (for range not constant with let)', () => {
106
+ const source = `
107
+ export proc main() {
108
+ ppq(480);
109
+ timeSig(4, 4);
110
+ tempo(120);
111
+ let n = 4;
112
+ for (i in 1..=n) {
113
+ const x = i;
114
+ }
115
+ }
116
+ `;
117
+ const diagnostics = check(source);
118
+ expect(diagnostics.some(d => d.code === 'E401')).toBe(true);
119
+ });
120
+ it('should allow for range with const', () => {
121
+ const source = `
122
+ export proc main() {
123
+ ppq(480);
124
+ timeSig(4, 4);
125
+ tempo(120);
126
+ const n = 4;
127
+ for (i in 1..=n) {
128
+ const x = i;
129
+ }
130
+ }
131
+ `;
132
+ const diagnostics = check(source);
133
+ const errors = diagnostics.filter(d => d.severity === 'error');
134
+ expect(errors.length).toBe(0);
135
+ });
136
+ it('should detect E110 (pitch out of range)', () => {
137
+ const source = `
138
+ export proc main() {
139
+ ppq(480);
140
+ timeSig(4, 4);
141
+ tempo(120);
142
+ track(midi, t1, { ch: 1 }) {
143
+ note(C10, 1/4);
144
+ }
145
+ }
146
+ `;
147
+ const diagnostics = check(source);
148
+ expect(diagnostics.some(d => d.code === 'E110')).toBe(true);
149
+ });
150
+ it('should warn W110 (vocal pitch out of typical range)', () => {
151
+ const source = `
152
+ export proc main() {
153
+ ppq(480);
154
+ timeSig(4, 4);
155
+ tempo(120);
156
+ track(vocal, v1, {}) {
157
+ note(C2, 1/4, "あ");
158
+ }
159
+ }
160
+ `;
161
+ const diagnostics = check(source);
162
+ expect(diagnostics.some(d => d.code === 'W110')).toBe(true);
163
+ });
164
+ it('should warn W100 (extremely short note)', () => {
165
+ const source = `
166
+ export proc main() {
167
+ ppq(480);
168
+ timeSig(4, 4);
169
+ tempo(120);
170
+ track(midi, t1, { ch: 1 }) {
171
+ note(C4, 1/128);
172
+ }
173
+ }
174
+ `;
175
+ const diagnostics = check(source);
176
+ expect(diagnostics.some(d => d.code === 'W100')).toBe(true);
177
+ });
178
+ it('should warn W200 (too many tempo events)', () => {
179
+ let tempoLines = '';
180
+ for (let i = 0; i < 130; i++) {
181
+ tempoLines += `tempo(${120 + i});\n`;
182
+ }
183
+ const source = `
184
+ export proc main() {
185
+ ppq(480);
186
+ timeSig(4, 4);
187
+ ${tempoLines}
188
+ }
189
+ `;
190
+ const diagnostics = check(source);
191
+ expect(diagnostics.some(d => d.code === 'W200')).toBe(true);
192
+ });
193
+ it('should detect E300 (top-level execution in import)', () => {
194
+ // Create a temp file for the import
195
+ const tmpDir = os.tmpdir();
196
+ const libPath = path.join(tmpDir, 'test_lib.mf');
197
+ const mainPath = path.join(tmpDir, 'test_main.mf');
198
+ fs.writeFileSync(libPath, `
199
+ note(C4, 1/4, "あ");
200
+ export proc FOO() { }
201
+ `);
202
+ const mainSource = `
203
+ import { FOO } from "./test_lib.mf";
204
+ export proc main() {
205
+ ppq(480);
206
+ timeSig(4, 4);
207
+ tempo(120);
208
+ FOO();
209
+ }
210
+ `;
211
+ fs.writeFileSync(mainPath, mainSource);
212
+ const lexer = new Lexer(mainSource, mainPath);
213
+ const tokens = lexer.tokenize();
214
+ const parser = new Parser(tokens, mainPath);
215
+ const program = parser.parse();
216
+ const checker = new Checker(tmpDir);
217
+ const diagnostics = checker.check(program, mainPath);
218
+ // Cleanup
219
+ fs.unlinkSync(libPath);
220
+ fs.unlinkSync(mainPath);
221
+ expect(diagnostics.some(d => d.code === 'E300')).toBe(true);
222
+ });
223
+ it('should allow drum names without E400', () => {
224
+ const source = `
225
+ export proc main() {
226
+ ppq(480);
227
+ timeSig(4, 4);
228
+ tempo(120);
229
+ track(midi, drums, { ch: 10 }) {
230
+ drum(kick, 1/4);
231
+ drum(snare, 1/4);
232
+ drum(hhc, 1/4);
233
+ }
234
+ }
235
+ `;
236
+ const diagnostics = check(source);
237
+ const errors = diagnostics.filter(d => d.severity === 'error');
238
+ expect(errors.length).toBe(0);
239
+ });
240
+ it('should detect E210 (vocal note missing lyric)', () => {
241
+ const source = `
242
+ export proc main() {
243
+ ppq(480);
244
+ timeSig(4, 4);
245
+ tempo(120);
246
+ track(vocal, v1, {}) {
247
+ note(C4, 1/4);
248
+ }
249
+ }
250
+ `;
251
+ const diagnostics = check(source);
252
+ expect(diagnostics.some(d => d.code === 'E210')).toBe(true);
253
+ });
254
+ it('should detect E210 (vocal note empty lyric)', () => {
255
+ const source = `
256
+ export proc main() {
257
+ ppq(480);
258
+ timeSig(4, 4);
259
+ tempo(120);
260
+ track(vocal, v1, {}) {
261
+ note(C4, 1/4, "");
262
+ }
263
+ }
264
+ `;
265
+ const diagnostics = check(source);
266
+ expect(diagnostics.some(d => d.code === 'E210')).toBe(true);
267
+ });
268
+ it('should detect E220 (drum in vocal track)', () => {
269
+ const source = `
270
+ export proc main() {
271
+ ppq(480);
272
+ timeSig(4, 4);
273
+ tempo(120);
274
+ track(vocal, v1, {}) {
275
+ drum(kick, 1/4);
276
+ }
277
+ }
278
+ `;
279
+ const diagnostics = check(source);
280
+ expect(diagnostics.some(d => d.code === 'E220')).toBe(true);
281
+ });
282
+ it('should detect E221 (chord in vocal track)', () => {
283
+ const source = `
284
+ export proc main() {
285
+ ppq(480);
286
+ timeSig(4, 4);
287
+ tempo(120);
288
+ track(vocal, v1, {}) {
289
+ chord([C4, E4, G4], 1/4);
290
+ }
291
+ }
292
+ `;
293
+ const diagnostics = check(source);
294
+ expect(diagnostics.some(d => d.code === 'E221')).toBe(true);
295
+ });
296
+ it('should pass valid vocal track', () => {
297
+ const source = `
298
+ export proc main() {
299
+ ppq(480);
300
+ timeSig(4, 4);
301
+ tempo(120);
302
+ track(vocal, v1, {}) {
303
+ at(1:1);
304
+ note(C4, 1/4, "あ");
305
+ note(D4, 1/4, "い");
306
+ rest(1/4);
307
+ note(E4, 1/4, "う");
308
+ }
309
+ }
310
+ `;
311
+ const diagnostics = check(source);
312
+ const errors = diagnostics.filter(d => d.severity === 'error');
313
+ expect(errors.length).toBe(0);
314
+ });
315
+ });
316
+ //# sourceMappingURL=checker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checker.test.js","sourceRoot":"","sources":["../../src/__tests__/checker.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compiler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/compiler.test.ts"],"names":[],"mappings":""}