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.
- package/LICENSE +661 -0
- package/README.md +230 -0
- package/dist/__tests__/checker.test.d.ts +2 -0
- package/dist/__tests__/checker.test.d.ts.map +1 -0
- package/dist/__tests__/checker.test.js +316 -0
- package/dist/__tests__/checker.test.js.map +1 -0
- package/dist/__tests__/compiler.test.d.ts +2 -0
- package/dist/__tests__/compiler.test.d.ts.map +1 -0
- package/dist/__tests__/compiler.test.js +260 -0
- package/dist/__tests__/compiler.test.js.map +1 -0
- package/dist/__tests__/generators.test.d.ts +2 -0
- package/dist/__tests__/generators.test.d.ts.map +1 -0
- package/dist/__tests__/generators.test.js +283 -0
- package/dist/__tests__/generators.test.js.map +1 -0
- package/dist/__tests__/interpreter.test.d.ts +2 -0
- package/dist/__tests__/interpreter.test.d.ts.map +1 -0
- package/dist/__tests__/interpreter.test.js +298 -0
- package/dist/__tests__/interpreter.test.js.map +1 -0
- package/dist/__tests__/lexer.test.d.ts +2 -0
- package/dist/__tests__/lexer.test.d.ts.map +1 -0
- package/dist/__tests__/lexer.test.js +89 -0
- package/dist/__tests__/lexer.test.js.map +1 -0
- package/dist/__tests__/parser.test.d.ts +2 -0
- package/dist/__tests__/parser.test.d.ts.map +1 -0
- package/dist/__tests__/parser.test.js +116 -0
- package/dist/__tests__/parser.test.js.map +1 -0
- package/dist/checker/checker.d.ts +37 -0
- package/dist/checker/checker.d.ts.map +1 -0
- package/dist/checker/checker.js +428 -0
- package/dist/checker/checker.js.map +1 -0
- package/dist/checker/index.d.ts +3 -0
- package/dist/checker/index.d.ts.map +1 -0
- package/dist/checker/index.js +2 -0
- package/dist/checker/index.js.map +1 -0
- package/dist/cli/commands/build.d.ts +2 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +173 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/check.d.ts +2 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +79 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +187 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/fmt.d.ts +2 -0
- package/dist/cli/commands/fmt.d.ts.map +1 -0
- package/dist/cli/commands/fmt.js +73 -0
- package/dist/cli/commands/fmt.js.map +1 -0
- package/dist/cli/commands/import.d.ts +2 -0
- package/dist/cli/commands/import.d.ts.map +1 -0
- package/dist/cli/commands/import.js +99 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +514 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/play.d.ts +2 -0
- package/dist/cli/commands/play.d.ts.map +1 -0
- package/dist/cli/commands/play.js +216 -0
- package/dist/cli/commands/play.js.map +1 -0
- package/dist/cli/commands/record.d.ts +2 -0
- package/dist/cli/commands/record.d.ts.map +1 -0
- package/dist/cli/commands/record.js +393 -0
- package/dist/cli/commands/record.js.map +1 -0
- package/dist/cli/commands/render.d.ts +2 -0
- package/dist/cli/commands/render.d.ts.map +1 -0
- package/dist/cli/commands/render.js +278 -0
- package/dist/cli/commands/render.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +93 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/compiler/compiler.d.ts +12 -0
- package/dist/compiler/compiler.d.ts.map +1 -0
- package/dist/compiler/compiler.js +146 -0
- package/dist/compiler/compiler.js.map +1 -0
- package/dist/compiler/index.d.ts +2 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +2 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/config/config.d.ts +43 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +200 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/errors.d.ts +49 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +168 -0
- package/dist/errors.js.map +1 -0
- package/dist/formatter/formatter.d.ts +13 -0
- package/dist/formatter/formatter.d.ts.map +1 -0
- package/dist/formatter/formatter.js +242 -0
- package/dist/formatter/formatter.js.map +1 -0
- package/dist/formatter/index.d.ts +2 -0
- package/dist/formatter/index.d.ts.map +1 -0
- package/dist/formatter/index.js +2 -0
- package/dist/formatter/index.js.map +1 -0
- package/dist/generators/index.d.ts +5 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +5 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/midi.d.ts +3 -0
- package/dist/generators/midi.d.ts.map +1 -0
- package/dist/generators/midi.js +360 -0
- package/dist/generators/midi.js.map +1 -0
- package/dist/generators/musicxml.d.ts +3 -0
- package/dist/generators/musicxml.d.ts.map +1 -0
- package/dist/generators/musicxml.js +332 -0
- package/dist/generators/musicxml.js.map +1 -0
- package/dist/generators/tempo-midi.d.ts +3 -0
- package/dist/generators/tempo-midi.d.ts.map +1 -0
- package/dist/generators/tempo-midi.js +123 -0
- package/dist/generators/tempo-midi.js.map +1 -0
- package/dist/generators/vsqx.d.ts +3 -0
- package/dist/generators/vsqx.d.ts.map +1 -0
- package/dist/generators/vsqx.js +354 -0
- package/dist/generators/vsqx.js.map +1 -0
- package/dist/importers/index.d.ts +2 -0
- package/dist/importers/index.d.ts.map +1 -0
- package/dist/importers/index.js +3 -0
- package/dist/importers/index.js.map +1 -0
- package/dist/importers/musicxml.d.ts +4 -0
- package/dist/importers/musicxml.d.ts.map +1 -0
- package/dist/importers/musicxml.js +392 -0
- package/dist/importers/musicxml.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/interpreter/builtins/algorithmic.d.ts +12 -0
- package/dist/interpreter/builtins/algorithmic.d.ts.map +1 -0
- package/dist/interpreter/builtins/algorithmic.js +244 -0
- package/dist/interpreter/builtins/algorithmic.js.map +1 -0
- package/dist/interpreter/builtins/audio.d.ts +10 -0
- package/dist/interpreter/builtins/audio.d.ts.map +1 -0
- package/dist/interpreter/builtins/audio.js +169 -0
- package/dist/interpreter/builtins/audio.js.map +1 -0
- package/dist/interpreter/builtins/core.d.ts +15 -0
- package/dist/interpreter/builtins/core.d.ts.map +1 -0
- package/dist/interpreter/builtins/core.js +265 -0
- package/dist/interpreter/builtins/core.js.map +1 -0
- package/dist/interpreter/builtins/dynamics.d.ts +8 -0
- package/dist/interpreter/builtins/dynamics.d.ts.map +1 -0
- package/dist/interpreter/builtins/dynamics.js +86 -0
- package/dist/interpreter/builtins/dynamics.js.map +1 -0
- package/dist/interpreter/builtins/effects.d.ts +16 -0
- package/dist/interpreter/builtins/effects.d.ts.map +1 -0
- package/dist/interpreter/builtins/effects.js +220 -0
- package/dist/interpreter/builtins/effects.js.map +1 -0
- package/dist/interpreter/builtins/index.d.ts +16 -0
- package/dist/interpreter/builtins/index.d.ts.map +1 -0
- package/dist/interpreter/builtins/index.js +17 -0
- package/dist/interpreter/builtins/index.js.map +1 -0
- package/dist/interpreter/builtins/layout.d.ts +12 -0
- package/dist/interpreter/builtins/layout.d.ts.map +1 -0
- package/dist/interpreter/builtins/layout.js +175 -0
- package/dist/interpreter/builtins/layout.js.map +1 -0
- package/dist/interpreter/builtins/live.d.ts +11 -0
- package/dist/interpreter/builtins/live.d.ts.map +1 -0
- package/dist/interpreter/builtins/live.js +125 -0
- package/dist/interpreter/builtins/live.js.map +1 -0
- package/dist/interpreter/builtins/midi.d.ts +16 -0
- package/dist/interpreter/builtins/midi.d.ts.map +1 -0
- package/dist/interpreter/builtins/midi.js +320 -0
- package/dist/interpreter/builtins/midi.js.map +1 -0
- package/dist/interpreter/builtins/mixing.d.ts +6 -0
- package/dist/interpreter/builtins/mixing.d.ts.map +1 -0
- package/dist/interpreter/builtins/mixing.js +62 -0
- package/dist/interpreter/builtins/mixing.js.map +1 -0
- package/dist/interpreter/builtins/notation.d.ts +24 -0
- package/dist/interpreter/builtins/notation.d.ts.map +1 -0
- package/dist/interpreter/builtins/notation.js +251 -0
- package/dist/interpreter/builtins/notation.js.map +1 -0
- package/dist/interpreter/builtins/ornaments.d.ts +8 -0
- package/dist/interpreter/builtins/ornaments.d.ts.map +1 -0
- package/dist/interpreter/builtins/ornaments.js +155 -0
- package/dist/interpreter/builtins/ornaments.js.map +1 -0
- package/dist/interpreter/builtins/techniques.d.ts +11 -0
- package/dist/interpreter/builtins/techniques.d.ts.map +1 -0
- package/dist/interpreter/builtins/techniques.js +234 -0
- package/dist/interpreter/builtins/techniques.js.map +1 -0
- package/dist/interpreter/builtins/tuning.d.ts +7 -0
- package/dist/interpreter/builtins/tuning.d.ts.map +1 -0
- package/dist/interpreter/builtins/tuning.js +52 -0
- package/dist/interpreter/builtins/tuning.js.map +1 -0
- package/dist/interpreter/builtins/types.d.ts +27 -0
- package/dist/interpreter/builtins/types.d.ts.map +1 -0
- package/dist/interpreter/builtins/types.js +3 -0
- package/dist/interpreter/builtins/types.js.map +1 -0
- package/dist/interpreter/builtins/vocaloid.d.ts +10 -0
- package/dist/interpreter/builtins/vocaloid.d.ts.map +1 -0
- package/dist/interpreter/builtins/vocaloid.js +165 -0
- package/dist/interpreter/builtins/vocaloid.js.map +1 -0
- package/dist/interpreter/index.d.ts +4 -0
- package/dist/interpreter/index.d.ts.map +1 -0
- package/dist/interpreter/index.js +4 -0
- package/dist/interpreter/index.js.map +1 -0
- package/dist/interpreter/interpreter.d.ts +305 -0
- package/dist/interpreter/interpreter.d.ts.map +1 -0
- package/dist/interpreter/interpreter.js +8463 -0
- package/dist/interpreter/interpreter.js.map +1 -0
- package/dist/interpreter/runtime.d.ts +67 -0
- package/dist/interpreter/runtime.d.ts.map +1 -0
- package/dist/interpreter/runtime.js +88 -0
- package/dist/interpreter/runtime.js.map +1 -0
- package/dist/interpreter/scope.d.ts +21 -0
- package/dist/interpreter/scope.d.ts.map +1 -0
- package/dist/interpreter/scope.js +60 -0
- package/dist/interpreter/scope.js.map +1 -0
- package/dist/interpreter/trackState.d.ts +205 -0
- package/dist/interpreter/trackState.d.ts.map +1 -0
- package/dist/interpreter/trackState.js +12 -0
- package/dist/interpreter/trackState.js.map +1 -0
- package/dist/lexer/index.d.ts +2 -0
- package/dist/lexer/index.d.ts.map +1 -0
- package/dist/lexer/index.js +2 -0
- package/dist/lexer/index.js.map +1 -0
- package/dist/lexer/lexer.d.ts +30 -0
- package/dist/lexer/lexer.d.ts.map +1 -0
- package/dist/lexer/lexer.js +385 -0
- package/dist/lexer/lexer.js.map +1 -0
- package/dist/parser/index.d.ts +2 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +2 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/parser.d.ts +55 -0
- package/dist/parser/parser.d.ts.map +1 -0
- package/dist/parser/parser.js +896 -0
- package/dist/parser/parser.js.map +1 -0
- package/dist/types/ast.d.ts +220 -0
- package/dist/types/ast.d.ts.map +1 -0
- package/dist/types/ast.js +3 -0
- package/dist/types/ast.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/ir/advanced.d.ts +491 -0
- package/dist/types/ir/advanced.d.ts.map +1 -0
- package/dist/types/ir/advanced.js +3 -0
- package/dist/types/ir/advanced.js.map +1 -0
- package/dist/types/ir/algorithmic.d.ts +48 -0
- package/dist/types/ir/algorithmic.d.ts.map +1 -0
- package/dist/types/ir/algorithmic.js +3 -0
- package/dist/types/ir/algorithmic.js.map +1 -0
- package/dist/types/ir/analysis.d.ts +34 -0
- package/dist/types/ir/analysis.d.ts.map +1 -0
- package/dist/types/ir/analysis.js +3 -0
- package/dist/types/ir/analysis.js.map +1 -0
- package/dist/types/ir/audio.d.ts +249 -0
- package/dist/types/ir/audio.d.ts.map +1 -0
- package/dist/types/ir/audio.js +3 -0
- package/dist/types/ir/audio.js.map +1 -0
- package/dist/types/ir/automation.d.ts +46 -0
- package/dist/types/ir/automation.d.ts.map +1 -0
- package/dist/types/ir/automation.js +3 -0
- package/dist/types/ir/automation.js.map +1 -0
- package/dist/types/ir/collaboration.d.ts +20 -0
- package/dist/types/ir/collaboration.d.ts.map +1 -0
- package/dist/types/ir/collaboration.js +3 -0
- package/dist/types/ir/collaboration.js.map +1 -0
- package/dist/types/ir/core.d.ts +153 -0
- package/dist/types/ir/core.d.ts.map +1 -0
- package/dist/types/ir/core.js +3 -0
- package/dist/types/ir/core.js.map +1 -0
- package/dist/types/ir/effects.d.ts +169 -0
- package/dist/types/ir/effects.d.ts.map +1 -0
- package/dist/types/ir/effects.js +3 -0
- package/dist/types/ir/effects.js.map +1 -0
- package/dist/types/ir/extended.d.ts +104 -0
- package/dist/types/ir/extended.d.ts.map +1 -0
- package/dist/types/ir/extended.js +3 -0
- package/dist/types/ir/extended.js.map +1 -0
- package/dist/types/ir/index.d.ts +16 -0
- package/dist/types/ir/index.d.ts.map +1 -0
- package/dist/types/ir/index.js +17 -0
- package/dist/types/ir/index.js.map +1 -0
- package/dist/types/ir/mastering.d.ts +86 -0
- package/dist/types/ir/mastering.d.ts.map +1 -0
- package/dist/types/ir/mastering.js +3 -0
- package/dist/types/ir/mastering.js.map +1 -0
- package/dist/types/ir/midi.d.ts +79 -0
- package/dist/types/ir/midi.d.ts.map +1 -0
- package/dist/types/ir/midi.js +3 -0
- package/dist/types/ir/midi.js.map +1 -0
- package/dist/types/ir/notation.d.ts +963 -0
- package/dist/types/ir/notation.d.ts.map +1 -0
- package/dist/types/ir/notation.js +3 -0
- package/dist/types/ir/notation.js.map +1 -0
- package/dist/types/ir/recording.d.ts +48 -0
- package/dist/types/ir/recording.d.ts.map +1 -0
- package/dist/types/ir/recording.js +3 -0
- package/dist/types/ir/recording.js.map +1 -0
- package/dist/types/ir/sampling.d.ts +59 -0
- package/dist/types/ir/sampling.d.ts.map +1 -0
- package/dist/types/ir/sampling.js +3 -0
- package/dist/types/ir/sampling.js.map +1 -0
- package/dist/types/ir/sequencing.d.ts +118 -0
- package/dist/types/ir/sequencing.d.ts.map +1 -0
- package/dist/types/ir/sequencing.js +3 -0
- package/dist/types/ir/sequencing.js.map +1 -0
- package/dist/types/ir/sync.d.ts +39 -0
- package/dist/types/ir/sync.d.ts.map +1 -0
- package/dist/types/ir/sync.js +3 -0
- package/dist/types/ir/sync.js.map +1 -0
- package/dist/types/ir.d.ts +2 -0
- package/dist/types/ir.d.ts.map +1 -0
- package/dist/types/ir.js +3 -0
- package/dist/types/ir.js.map +1 -0
- package/dist/types/token.d.ts +72 -0
- package/dist/types/token.d.ts.map +1 -0
- package/dist/types/token.js +90 -0
- package/dist/types/token.js.map +1 -0
- package/dist/utils/stdlib.d.ts +18 -0
- package/dist/utils/stdlib.d.ts.map +1 -0
- package/dist/utils/stdlib.js +51 -0
- package/dist/utils/stdlib.js.map +1 -0
- package/lib/articulation.mf +46 -0
- package/lib/composition.mf +299 -0
- package/lib/curves.mf +183 -0
- package/lib/dynamics.mf +141 -0
- package/lib/expression.mf +221 -0
- package/lib/genres.mf +348 -0
- package/lib/notation.mf +224 -0
- package/lib/ornaments.mf +98 -0
- package/lib/patterns.mf +170 -0
- package/lib/rhythm.mf +269 -0
- package/lib/theory.mf +257 -0
- package/lib/utils.mf +140 -0
- 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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/compiler.test.ts"],"names":[],"mappings":""}
|