@devaloop/devalang 0.0.1-beta.1 → 0.0.1-beta.2
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/.devalang +9 -10
- package/Cargo.toml +5 -4
- package/README.md +7 -5
- package/docs/CHANGELOG.md +42 -0
- package/docs/ROADMAP.md +5 -1
- package/docs/TODO.md +3 -14
- package/examples/bus.deva +10 -0
- package/examples/effect.deva +2 -0
- package/examples/filter.deva +11 -0
- package/examples/lfo.deva +9 -0
- package/examples/synth.deva +11 -1
- package/examples/synth_types.deva +17 -0
- package/out-tsc/core/functions/index.d.ts +5 -0
- package/out-tsc/core/functions/index.js +11 -0
- package/out-tsc/pkg/devalang_core.d.ts +2 -0
- package/out-tsc/pkg/devalang_core.js +17 -2
- package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +8 -7
- package/package.json +1 -1
- package/project-version.json +3 -3
- package/rust/cli/bank/api.rs +122 -122
- package/rust/cli/bank/commands.rs +33 -2
- package/rust/cli/bank/mod.rs +29 -29
- package/rust/cli/build/commands.rs +53 -3
- package/rust/cli/build/mod.rs +2 -2
- package/rust/cli/build/process.rs +26 -7
- package/rust/cli/check/mod.rs +2 -2
- package/rust/cli/discover/commands.rs +253 -253
- package/rust/cli/discover/config.rs +111 -111
- package/rust/cli/discover/fs.rs +19 -19
- package/rust/cli/discover/install.rs +103 -103
- package/rust/cli/discover/metadata.rs +48 -48
- package/rust/cli/discover/mod.rs +5 -5
- package/rust/cli/install/addon.rs +118 -118
- package/rust/cli/install/bank.rs +22 -3
- package/rust/cli/install/commands.rs +35 -35
- package/rust/cli/install/mod.rs +4 -4
- package/rust/cli/install/plugin.rs +80 -61
- package/rust/cli/login/commands.rs +124 -124
- package/rust/cli/mod.rs +12 -12
- package/rust/cli/parser.rs +46 -1
- package/rust/cli/play/commands.rs +71 -20
- package/rust/cli/play/mod.rs +5 -5
- package/rust/cli/play/process.rs +14 -5
- package/rust/cli/play/realtime.rs +91 -91
- package/rust/cli/telemetry/commands.rs +22 -22
- package/rust/cli/telemetry/event_creator.rs +80 -80
- package/rust/cli/telemetry/mod.rs +3 -3
- package/rust/cli/telemetry/send.rs +51 -51
- package/rust/cli/template/commands.rs +69 -69
- package/rust/config/driver.rs +112 -103
- package/rust/config/mod.rs +3 -3
- package/rust/config/ops.rs +26 -26
- package/rust/config/settings.rs +101 -101
- package/rust/core/audio/engine/driver.rs +220 -0
- package/rust/core/audio/engine/export.rs +169 -0
- package/rust/core/audio/engine/helpers.rs +178 -170
- package/rust/core/audio/engine/mod.rs +51 -2
- package/rust/core/audio/engine/notes/dsp.rs +85 -0
- package/rust/core/audio/engine/notes/mod.rs +44 -0
- package/rust/core/audio/engine/notes/params.rs +294 -0
- package/rust/core/audio/engine/sample/insert.rs +199 -0
- package/rust/core/audio/engine/sample/mod.rs +40 -0
- package/rust/core/audio/engine/sample/padding.rs +170 -0
- package/rust/core/audio/evaluator/condition.rs +61 -0
- package/rust/core/audio/evaluator/mod.rs +9 -0
- package/rust/core/audio/{evaluator.rs → evaluator/numeric.rs} +1 -159
- package/rust/core/audio/evaluator/rhs.rs +16 -0
- package/rust/core/audio/evaluator/string_expr.rs +94 -0
- package/rust/core/audio/interpreter/driver.rs +55 -23
- package/rust/core/audio/interpreter/mod.rs +1 -13
- package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +175 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +384 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +2 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +316 -0
- package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -0
- package/rust/core/audio/interpreter/{automate.rs → statements/automate.rs} +16 -18
- package/rust/core/audio/interpreter/{call.rs → statements/call.rs} +5 -4
- package/rust/core/audio/interpreter/{condition.rs → statements/condition.rs} +2 -1
- package/rust/core/audio/interpreter/{function.rs → statements/function.rs} +2 -4
- package/rust/core/audio/interpreter/{let_.rs → statements/let_.rs} +2 -4
- package/rust/core/audio/interpreter/{load.rs → statements/load.rs} +2 -4
- package/rust/core/audio/interpreter/{loop_.rs → statements/loop_.rs} +2 -1
- package/rust/core/audio/interpreter/statements/mod.rs +12 -0
- package/rust/core/audio/interpreter/{sleep.rs → statements/sleep.rs} +28 -28
- package/rust/core/audio/interpreter/{spawn.rs → statements/spawn.rs} +3 -2
- package/rust/core/audio/interpreter/{tempo.rs → statements/tempo.rs} +40 -40
- package/rust/core/audio/interpreter/{trigger.rs → statements/trigger.rs} +1 -1
- package/rust/core/audio/loader/trigger.rs +2 -1
- package/rust/core/audio/mod.rs +6 -7
- package/rust/core/audio/player.rs +70 -70
- package/rust/core/audio/special/easing.rs +189 -189
- package/rust/core/audio/special/env.rs +45 -45
- package/rust/core/audio/special/math.rs +134 -134
- package/rust/core/audio/special/mod.rs +9 -9
- package/rust/core/audio/special/modulator.rs +143 -143
- package/rust/core/builder/mod.rs +45 -2
- package/rust/core/debugger/lexer.rs +27 -27
- package/rust/core/debugger/{module.rs → logs.rs} +3 -6
- package/rust/core/debugger/mod.rs +30 -30
- package/rust/core/debugger/preprocessor.rs +27 -27
- package/rust/core/debugger/store.rs +2 -4
- package/rust/core/error/mod.rs +269 -269
- package/rust/core/lexer/driver.rs +59 -61
- package/rust/core/lexer/handler/arrow.rs +82 -82
- package/rust/core/lexer/handler/at.rs +21 -21
- package/rust/core/lexer/handler/brace.rs +41 -41
- package/rust/core/lexer/handler/colon.rs +21 -21
- package/rust/core/lexer/handler/comment.rs +30 -30
- package/rust/core/lexer/handler/dot.rs +21 -21
- package/rust/core/lexer/handler/driver.rs +337 -337
- package/rust/core/lexer/handler/identifier.rs +47 -47
- package/rust/core/lexer/handler/indent.rs +66 -66
- package/rust/core/lexer/handler/mod.rs +15 -15
- package/rust/core/lexer/handler/newline.rs +23 -23
- package/rust/core/lexer/handler/number.rs +31 -31
- package/rust/core/lexer/handler/operator.rs +46 -46
- package/rust/core/lexer/handler/parenthesis.rs +41 -41
- package/rust/core/lexer/handler/slash.rs +21 -21
- package/rust/core/lexer/handler/string.rs +63 -63
- package/rust/core/lexer/mod.rs +3 -3
- package/rust/core/mod.rs +0 -1
- package/rust/core/parser/driver/block.rs +111 -0
- package/rust/core/parser/driver/cursor.rs +82 -0
- package/rust/core/parser/driver/driver_impl.rs +139 -0
- package/rust/core/parser/driver/mod.rs +6 -0
- package/rust/core/parser/driver/parse_array.rs +120 -0
- package/rust/core/parser/driver/parse_map.rs +223 -0
- package/rust/core/parser/driver/parser.rs +160 -0
- package/rust/core/parser/handler/arrow_call.rs +28 -4
- package/rust/core/parser/handler/at.rs +279 -279
- package/rust/core/parser/handler/bank.rs +104 -104
- package/rust/core/parser/handler/condition.rs +83 -83
- package/rust/core/parser/handler/dot.rs +148 -148
- package/rust/core/parser/handler/identifier/automate.rs +254 -254
- package/rust/core/parser/handler/identifier/call.rs +91 -91
- package/rust/core/parser/handler/identifier/emit.rs +70 -70
- package/rust/core/parser/handler/identifier/function.rs +113 -113
- package/rust/core/parser/handler/identifier/group.rs +89 -89
- package/rust/core/parser/handler/identifier/let_.rs +173 -173
- package/rust/core/parser/handler/identifier/mod.rs +55 -55
- package/rust/core/parser/handler/identifier/on.rs +107 -107
- package/rust/core/parser/handler/identifier/print.rs +49 -49
- package/rust/core/parser/handler/identifier/sleep.rs +96 -43
- package/rust/core/parser/handler/identifier/spawn.rs +91 -91
- package/rust/core/parser/handler/identifier/synth.rs +135 -135
- package/rust/core/parser/handler/loop_.rs +194 -194
- package/rust/core/parser/handler/mod.rs +9 -9
- package/rust/core/parser/handler/pattern.rs +1 -1
- package/rust/core/parser/handler/tempo.rs +105 -57
- package/rust/core/parser/statement.rs +10 -11
- package/rust/core/plugin/loader.rs +1 -1
- package/rust/core/plugin/mod.rs +2 -2
- package/rust/core/plugin/runner/mod.rs +11 -0
- package/rust/core/plugin/{runner.rs → runner/non_wasm.rs} +297 -347
- package/rust/core/plugin/runner/wasm32.rs +43 -0
- package/rust/core/preprocessor/loader/inject.rs +278 -0
- package/rust/core/preprocessor/loader/loader_helpers.rs +110 -0
- package/rust/core/preprocessor/loader/mod.rs +235 -0
- package/rust/core/preprocessor/module.rs +2 -7
- package/rust/core/preprocessor/{processor.rs → processor/handlers.rs} +6 -13
- package/rust/core/preprocessor/processor/mod.rs +1 -0
- package/rust/core/preprocessor/resolver/bank.rs +49 -49
- package/rust/core/preprocessor/resolver/call.rs +124 -124
- package/rust/core/preprocessor/resolver/condition.rs +95 -95
- package/rust/core/preprocessor/resolver/driver.rs +324 -324
- package/rust/core/preprocessor/resolver/function.rs +2 -2
- package/rust/core/preprocessor/resolver/group.rs +46 -18
- package/rust/core/preprocessor/resolver/let_.rs +32 -32
- package/rust/core/preprocessor/resolver/loop_.rs +318 -318
- package/rust/core/preprocessor/resolver/mod.rs +16 -16
- package/rust/core/preprocessor/resolver/pattern.rs +83 -83
- package/rust/core/preprocessor/resolver/spawn.rs +99 -99
- package/rust/core/preprocessor/resolver/synth.rs +54 -54
- package/rust/core/preprocessor/resolver/tempo.rs +48 -48
- package/rust/core/preprocessor/resolver/trigger.rs +116 -116
- package/rust/core/preprocessor/resolver/value.rs +176 -176
- package/rust/core/store/global.rs +2 -6
- package/rust/core/store/mod.rs +1 -5
- package/rust/lib.rs +18 -3
- package/rust/main.rs +27 -3
- package/rust/types/Cargo.toml +1 -1
- package/rust/types/src/addons.rs +55 -55
- package/rust/types/src/config.rs +84 -74
- package/rust/types/src/lib.rs +15 -12
- package/rust/types/src/plugin.rs +20 -0
- package/rust/types/src/store.rs +139 -0
- package/rust/types/src/telemetry.rs +85 -85
- package/rust/utils/Cargo.toml +2 -2
- package/rust/utils/src/file.rs +94 -94
- package/rust/utils/src/first_usage.rs +97 -97
- package/rust/utils/src/lib.rs +9 -9
- package/rust/utils/src/logger.rs +200 -200
- package/rust/utils/src/path.rs +129 -88
- package/rust/utils/src/signature.rs +41 -41
- package/rust/utils/src/spinner.rs +20 -20
- package/rust/utils/src/version.rs +27 -27
- package/rust/utils/src/watcher.rs +46 -46
- package/rust/web/api.rs +5 -5
- package/rust/web/cdn.rs +34 -34
- package/rust/web/mod.rs +3 -3
- package/tests/integration.rs +21 -21
- package/typescript/core/functions/index.ts +11 -0
- package/typescript/pkg/devalang_core.ts +20 -4
- package/rust/core/audio/engine/sample.rs +0 -366
- package/rust/core/audio/engine/synth.rs +0 -325
- package/rust/core/audio/interpreter/arrow_call.rs +0 -311
- package/rust/core/audio/renderer.rs +0 -54
- package/rust/core/parser/driver.rs +0 -584
- package/rust/core/preprocessor/loader.rs +0 -637
- package/rust/core/store/export.rs +0 -28
- package/rust/core/store/function.rs +0 -40
- package/rust/core/store/import.rs +0 -28
- package/rust/core/store/variable.rs +0 -51
- package/rust/core/utils/mod.rs +0 -1
- package/rust/core/utils/path.rs +0 -37
package/.devalang
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
[defaults]
|
|
2
|
-
entry = "./examples"
|
|
3
|
-
output = "./output"
|
|
4
|
-
watch = false
|
|
5
|
-
debug = true
|
|
6
|
-
compress = true
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
version = "0.0.1"
|
|
1
|
+
[defaults]
|
|
2
|
+
entry = "./examples"
|
|
3
|
+
output = "./output"
|
|
4
|
+
watch = false
|
|
5
|
+
debug = true
|
|
6
|
+
compress = true
|
|
7
|
+
audio_format = "wav16"
|
|
8
|
+
sample_rate = 44100
|
|
9
|
+
output_format = ["wav", "mid"]
|
package/Cargo.toml
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "devalang"
|
|
3
|
-
version = "0.0.1-beta.
|
|
3
|
+
version = "0.0.1-beta.2"
|
|
4
4
|
authors = ["Devaloop <contact@devaloop.com>"]
|
|
5
5
|
description = "Write music like code. Devalang is a domain-specific language (DSL) for sound designers and music hackers. Compose, automate, and control sound — in plain text."
|
|
6
6
|
license = "MIT"
|
|
@@ -29,7 +29,7 @@ default = ["cli"]
|
|
|
29
29
|
cli = ["crossterm", "indicatif", "inquire", "zip", "reqwest", "flate2", "tokio"]
|
|
30
30
|
|
|
31
31
|
[dependencies]
|
|
32
|
-
devalang_types = { path = "rust/types", version = "0.0.
|
|
32
|
+
devalang_types = { path = "rust/types", version = "0.0.3" }
|
|
33
33
|
clap = { version = "4.5", features = ["derive"] }
|
|
34
34
|
serde = { version = "1.0", features = ["derive"] }
|
|
35
35
|
serde_json = "1.0"
|
|
@@ -59,6 +59,7 @@ dirs = "5"
|
|
|
59
59
|
urlencoding = "2.1"
|
|
60
60
|
uuid = { version = "1.18.0", features = ["v4"] }
|
|
61
61
|
console_error_panic_hook = "0.1.7"
|
|
62
|
+
midly = "0.5.3"
|
|
62
63
|
|
|
63
64
|
[dev-dependencies]
|
|
64
65
|
assert_cmd = "2"
|
|
@@ -72,9 +73,9 @@ getrandom = { version = "0.3", features = ["wasm_js"] }
|
|
|
72
73
|
uuid = { version = "1.18.0", features = ["v4", "js", "rng-getrandom"] }
|
|
73
74
|
# Keep a lightweight linkage to the utils crate for wasm builds without
|
|
74
75
|
# enabling native CLI features.
|
|
75
|
-
devalang_utils = { path = "rust/utils", default-features = false, version = "0.0.
|
|
76
|
+
devalang_utils = { path = "rust/utils", default-features = false, version = "0.0.2" }
|
|
76
77
|
|
|
77
78
|
# devalang_utils with CLI and wasmtime are only needed for native targets.
|
|
78
79
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
|
79
|
-
devalang_utils = { path = "rust/utils", features = ["cli"], version = "0.0.
|
|
80
|
+
devalang_utils = { path = "rust/utils", features = ["cli"], version = "0.0.2" }
|
|
80
81
|
wasmtime = "19"
|
package/README.md
CHANGED
|
@@ -65,7 +65,7 @@ npm install -g @devaloop/devalang@latest
|
|
|
65
65
|
#### With Rust
|
|
66
66
|
|
|
67
67
|
```bash
|
|
68
|
-
cargo install devalang
|
|
68
|
+
cargo install devalang --version <version>
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
#### Initialize a new project
|
|
@@ -136,8 +136,8 @@ group myGroup:
|
|
|
136
136
|
})
|
|
137
137
|
|
|
138
138
|
# Notes with params
|
|
139
|
-
myLead -> note(G4, { duration: 600, glide: true
|
|
140
|
-
myLead -> note(B3, { duration: 400, slide: true
|
|
139
|
+
myLead -> note(G4, { duration: 600, glide: true })
|
|
140
|
+
myLead -> note(B3, { duration: 400, slide: true })
|
|
141
141
|
|
|
142
142
|
# Spawning the group & the pattern to play them in parallel
|
|
143
143
|
spawn myGroup
|
|
@@ -173,8 +173,7 @@ devalang play --repeat
|
|
|
173
173
|
## 🚀 Features
|
|
174
174
|
|
|
175
175
|
- ⚡ **Fast Build & Hot Reload** — optimized build process for quicker iteration.
|
|
176
|
-
- 🎵 **Audio Engine & Real-time runner** — low-latency playback, render-to-file, and a realtime runner used by `devalang play` for live feedback.
|
|
177
|
-
- ▶️ **Live mode (watch + repeat)** — edit and hear changes instantly with `devalang play --repeat` and watch mode.
|
|
176
|
+
- 🎵 **Audio Engine & Real-time runner** — low-latency playback, render-to-file, and a realtime runner used by `devalang play --repeat` for live feedback.
|
|
178
177
|
- 🧩 **Language primitives** — synths, notes, ADSR, maps, arrays, loops, conditionals and functions for expressive musical logic.
|
|
179
178
|
- 🎛️ **Per-note automation & modulators** — `automate` maps, `$mod.*`, `$easing.*` and `$math.*` helpers for envelopes and LFOs.
|
|
180
179
|
- 🧩 **Module system & structured AST** — import/export variables, stable AST output for debugging and tooling.
|
|
@@ -193,11 +192,14 @@ devalang play --repeat
|
|
|
193
192
|
|
|
194
193
|
## 📰 What's new
|
|
195
194
|
|
|
195
|
+
- **MIDI export**: Added the ability to export MIDI files from Devalang scripts.
|
|
196
|
+
- **Synthesizer improvements**: Enhanced the built-in synthesizer with new types and modulation options.
|
|
196
197
|
- **Devaforge**: Introduced a new system for creating and managing addons, including a CLI for addon generation.
|
|
197
198
|
- **Documentation updates**: Improved documentation for clarity and completeness.
|
|
198
199
|
- **Discovering addons**: Introduced a new command to detect addons.
|
|
199
200
|
- **Public TypeScript API**: Added a public TypeScript API for easier integration.
|
|
200
201
|
- **Improved error messages**: Enhanced error messages for better debugging.
|
|
202
|
+
- **Major refactor**: Significant codebase refactor for improved maintainability and performance.
|
|
201
203
|
- **Bug fixes**: Various bug fixes and stability improvements.
|
|
202
204
|
|
|
203
205
|
## 🛡️ License
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,48 @@
|
|
|
4
4
|
|
|
5
5
|
# Changelog
|
|
6
6
|
|
|
7
|
+
## Version 0.0.1-beta.2 (2025-09-07)
|
|
8
|
+
|
|
9
|
+
### 🛠️ MIDI & format
|
|
10
|
+
|
|
11
|
+
- Added support for `mid` export in `build` command.
|
|
12
|
+
- Example: `devalang build --output-format mid,wav`
|
|
13
|
+
- Added support for `wav16` and `wav32` audio formats in `play` command.
|
|
14
|
+
- Example: `devalang play --audio-format <wav16 | wav32>`
|
|
15
|
+
- Added support for `sample_rate` parameter in `play` and `build` commands.
|
|
16
|
+
- Example: `devalang play --sample-rate <44100 | 48000 | 96000>`
|
|
17
|
+
- Example: `devalang build --sample-rate <44100 | 48000 | 96000>`
|
|
18
|
+
|
|
19
|
+
### ✨ Language Features
|
|
20
|
+
|
|
21
|
+
- `synth` enhancements:
|
|
22
|
+
- Types:
|
|
23
|
+
- Added `pad` type for lush, evolving sounds.
|
|
24
|
+
- Added `pluck` type for sharp, percussive tones.
|
|
25
|
+
- Added `arp` type for arpeggiated sequences.
|
|
26
|
+
- Added `sub` type for deep bass sounds.
|
|
27
|
+
- LFOs:
|
|
28
|
+
- Added `lfo` parameter to `synth` for low-frequency oscillation modulation.
|
|
29
|
+
- LFO supports `rate`, `depth`, and `target` parameters.
|
|
30
|
+
- Filters:
|
|
31
|
+
- Added `filters` parameter to `synth` for applying filters.
|
|
32
|
+
- `arrow_call` enhancements:
|
|
33
|
+
- Added support for `chord` method to play multiple notes simultaneously.
|
|
34
|
+
|
|
35
|
+
### 🧠 Architecture & Refactor
|
|
36
|
+
|
|
37
|
+
- Modularized some core components to improve maintainability and readability.
|
|
38
|
+
|
|
39
|
+
### 📚 Examples
|
|
40
|
+
|
|
41
|
+
- Added `examples/filter.deva` to showcase filter usage in synths.
|
|
42
|
+
- Added `examples/lfo.deva` to illustrate LFO modulation in synths.
|
|
43
|
+
- Added `examples/synth_types.deva` to demonstrate various synth types.
|
|
44
|
+
|
|
45
|
+
### 📦 WASM
|
|
46
|
+
|
|
47
|
+
- Added `collect_playhead_events` function to the WASM module to collect playhead events during audio rendering.
|
|
48
|
+
|
|
7
49
|
## Version 0.0.1-beta.1 (2025-09-02)
|
|
8
50
|
|
|
9
51
|
> First beta of Devalang 0.0.1. Focus on stability, language surface freeze, and developer experience. No breaking changes expected compared to alpha.18; experimental features are gated and may change.
|
package/docs/ROADMAP.md
CHANGED
|
@@ -9,6 +9,7 @@ Devalang is a work in progress. Here’s what we’re planning next:
|
|
|
9
9
|
## Completed
|
|
10
10
|
|
|
11
11
|
- ✅ **Audio engine**: Integrate the audio engine for sound playback.
|
|
12
|
+
- ✅ **MIDI export**: Implement MIDI export functionality to save compositions as MIDI files.
|
|
12
13
|
- ✅ **Basic syntax**: Implement the core syntax for Devalang, including data types and basic statements.
|
|
13
14
|
- ✅ **Watch mode**: Add a watch mode to automatically rebuild on file changes.
|
|
14
15
|
- ✅ **Module system**: Add support for importing and exporting variables between files using `@import` and `@export`.
|
|
@@ -27,8 +28,11 @@ Devalang is a work in progress. Here’s what we’re planning next:
|
|
|
27
28
|
|
|
28
29
|
- ⏳ **Addon generator**: Implement addon generation for creating reusable plugins, banks and presets.
|
|
29
30
|
- ⏳ **Testing**: Expand test coverage for all features.
|
|
30
|
-
- ⏳ **Other statements**: Implement `pattern`, and other control structures.
|
|
31
31
|
|
|
32
32
|
## Planned
|
|
33
33
|
|
|
34
|
+
- ⏳ **MIDI mapping**: Implement MIDI mapping for external control.
|
|
35
|
+
- ⏳ **GUI**: Develop a graphical user interface for easier interaction.
|
|
36
|
+
- ⏳ **Mixing & Routing**: Implement mixing and routing capabilities for advanced audio control.
|
|
37
|
+
- ⏳ **Effect chains**: Implement effect chains for applying multiple effects to a single note or group.
|
|
34
38
|
- ⏳ **Smart modules**: Let Devalang detect and use groups, samples, and variables without needing to import them manually.
|
package/docs/TODO.md
CHANGED
|
@@ -41,9 +41,8 @@ This is a list of tasks and features to be implemented in Devalang. Note that th
|
|
|
41
41
|
- [x] @import
|
|
42
42
|
- [x] @export
|
|
43
43
|
- [x] @load
|
|
44
|
-
- [ ] @include
|
|
45
44
|
- [x] function
|
|
46
|
-
- [
|
|
45
|
+
- [x] pattern
|
|
47
46
|
- [x] group
|
|
48
47
|
- [x] call
|
|
49
48
|
- [x] spawn
|
|
@@ -58,8 +57,8 @@ This is a list of tasks and features to be implemented in Devalang. Note that th
|
|
|
58
57
|
|
|
59
58
|
## Triggers
|
|
60
59
|
|
|
61
|
-
- [x] Built-in triggers
|
|
62
60
|
- [x] Custom triggers
|
|
61
|
+
- [x] Event triggers
|
|
63
62
|
|
|
64
63
|
## Banks
|
|
65
64
|
|
|
@@ -69,14 +68,4 @@ This is a list of tasks and features to be implemented in Devalang. Note that th
|
|
|
69
68
|
## Plugins
|
|
70
69
|
|
|
71
70
|
- [x] Implement plugin system (e.g. install, remove, list)
|
|
72
|
-
- [ ] Create example plugins
|
|
73
|
-
|
|
74
|
-
## Addon generator
|
|
75
|
-
|
|
76
|
-
- [x] Implement addon generator
|
|
77
|
-
- [ ] Create example addons
|
|
78
|
-
|
|
79
|
-
## Other TODOs
|
|
80
|
-
|
|
81
|
-
- [ ] Comment all core components
|
|
82
|
-
- [ ] Add unit tests for all core components
|
|
71
|
+
- [ ] Create example plugins
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# NOTE Planned for future release
|
|
2
|
+
|
|
3
|
+
# let sidechainBus = bus {
|
|
4
|
+
# fx: [
|
|
5
|
+
# { type: "compressor", threshold: -20, ratio: 8, attack: 5, release: 100,
|
|
6
|
+
# sidechain: myKick }
|
|
7
|
+
# ]
|
|
8
|
+
# }
|
|
9
|
+
# route myLead -> sidechainBus -> masterBus
|
|
10
|
+
# route myKick -> myBass -> masterBus
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
let myFilteredSynth = synth sine {
|
|
2
|
+
filters: [
|
|
3
|
+
{ type: "lowpass", cutoff: 800.0, resonance: 1.0 },
|
|
4
|
+
{ type: "bandpass", cutoff: 400.0, resonance: 1.0 },
|
|
5
|
+
{ type: "highpass", cutoff: 200.0, resonance: 1.0 }
|
|
6
|
+
],
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
myFilteredSynth -> note(C4, { duration: 500 })
|
|
10
|
+
myFilteredSynth -> note(E4, { duration: 500 })
|
|
11
|
+
myFilteredSynth -> note(G4, { duration: 500 })
|
package/examples/synth.deva
CHANGED
|
@@ -11,4 +11,14 @@ group myLead:
|
|
|
11
11
|
mySynth -> note(D4, { duration: 400 })
|
|
12
12
|
mySynth -> note(B3, { duration: 600 })
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
group myChords:
|
|
15
|
+
let chordSynth = synth square
|
|
16
|
+
|
|
17
|
+
chordSynth -> chord(Cmaj, { duration: 1600 })
|
|
18
|
+
chordSynth -> chord(Fmaj, { duration: 1600 })
|
|
19
|
+
chordSynth -> chord(Gmaj, { duration: 1600 })
|
|
20
|
+
chordSynth -> chord(Am, { duration: 1600 })
|
|
21
|
+
|
|
22
|
+
# Play both groups together
|
|
23
|
+
spawn myLead
|
|
24
|
+
spawn myChords
|
|
@@ -30,6 +30,11 @@ export declare function register_playhead_callback(cb: (ev: {
|
|
|
30
30
|
line: number;
|
|
31
31
|
column: number;
|
|
32
32
|
}) => void): any;
|
|
33
|
+
/**
|
|
34
|
+
* Collects playhead events that have been recorded during playback.
|
|
35
|
+
* @returns Array of playhead events { time, line, column }.
|
|
36
|
+
*/
|
|
37
|
+
export declare function collect_playhead_events(): any;
|
|
33
38
|
/**
|
|
34
39
|
* Unregisters the JS callback for playhead events.
|
|
35
40
|
* @returns void
|
|
@@ -4,6 +4,7 @@ exports.parse = parse;
|
|
|
4
4
|
exports.debug_render = debug_render;
|
|
5
5
|
exports.render_audio = render_audio;
|
|
6
6
|
exports.register_playhead_callback = register_playhead_callback;
|
|
7
|
+
exports.collect_playhead_events = collect_playhead_events;
|
|
7
8
|
exports.unregister_playhead_callback = unregister_playhead_callback;
|
|
8
9
|
let wasmPkg = undefined;
|
|
9
10
|
try {
|
|
@@ -64,6 +65,16 @@ function register_playhead_callback(cb) {
|
|
|
64
65
|
// no-op fallback
|
|
65
66
|
return;
|
|
66
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Collects playhead events that have been recorded during playback.
|
|
70
|
+
* @returns Array of playhead events { time, line, column }.
|
|
71
|
+
*/
|
|
72
|
+
function collect_playhead_events() {
|
|
73
|
+
if (wasmPkg && typeof wasmPkg.collect_playhead_events === "function") {
|
|
74
|
+
return wasmPkg.collect_playhead_events();
|
|
75
|
+
}
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
67
78
|
/**
|
|
68
79
|
* Unregisters the JS callback for playhead events.
|
|
69
80
|
* @returns void
|
|
@@ -2,12 +2,14 @@ export declare function parse(...args: any[]): any;
|
|
|
2
2
|
export declare function debug_render(...args: any[]): any;
|
|
3
3
|
export declare function render_audio(...args: any[]): any;
|
|
4
4
|
export declare function register_playhead_callback(cb?: any): any;
|
|
5
|
+
export declare function collect_playhead_events(): any;
|
|
5
6
|
export declare function unregister_playhead_callback(): any;
|
|
6
7
|
declare const pkg: {
|
|
7
8
|
parse: typeof parse;
|
|
8
9
|
debug_render: typeof debug_render;
|
|
9
10
|
render_audio: typeof render_audio;
|
|
10
11
|
register_playhead_callback: typeof register_playhead_callback;
|
|
12
|
+
collect_playhead_events: typeof collect_playhead_events;
|
|
11
13
|
unregister_playhead_callback: typeof unregister_playhead_callback;
|
|
12
14
|
};
|
|
13
15
|
export default pkg;
|
|
@@ -4,6 +4,7 @@ exports.parse = parse;
|
|
|
4
4
|
exports.debug_render = debug_render;
|
|
5
5
|
exports.render_audio = render_audio;
|
|
6
6
|
exports.register_playhead_callback = register_playhead_callback;
|
|
7
|
+
exports.collect_playhead_events = collect_playhead_events;
|
|
7
8
|
exports.unregister_playhead_callback = unregister_playhead_callback;
|
|
8
9
|
/**
|
|
9
10
|
* Shim TypeScript source that re-exports the runtime wasm-pack package when
|
|
@@ -41,10 +42,24 @@ function register_playhead_callback(cb) {
|
|
|
41
42
|
return runtimePkg.register_playhead_callback(cb);
|
|
42
43
|
return;
|
|
43
44
|
}
|
|
45
|
+
function collect_playhead_events() {
|
|
46
|
+
if (runtimePkg && typeof runtimePkg.collect_playhead_events === "function") {
|
|
47
|
+
return runtimePkg.collect_playhead_events();
|
|
48
|
+
}
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
44
51
|
function unregister_playhead_callback() {
|
|
45
|
-
if (runtimePkg &&
|
|
52
|
+
if (runtimePkg &&
|
|
53
|
+
typeof runtimePkg.unregister_playhead_callback === "function")
|
|
46
54
|
return runtimePkg.unregister_playhead_callback();
|
|
47
55
|
return;
|
|
48
56
|
}
|
|
49
|
-
const pkg = {
|
|
57
|
+
const pkg = {
|
|
58
|
+
parse,
|
|
59
|
+
debug_render,
|
|
60
|
+
render_audio,
|
|
61
|
+
register_playhead_callback,
|
|
62
|
+
collect_playhead_events,
|
|
63
|
+
unregister_playhead_callback,
|
|
64
|
+
};
|
|
50
65
|
exports.default = pkg;
|
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
/* tslint:disable */
|
|
2
2
|
/* eslint-disable */
|
|
3
3
|
export const memory: WebAssembly.Memory;
|
|
4
|
-
export const debug_render: (a: number, b: number) => [number, number, number];
|
|
5
4
|
export const parse: (a: number, b: number, c: number, d: number) => [number, number, number];
|
|
6
|
-
export const
|
|
5
|
+
export const debug_render: (a: number, b: number) => [number, number, number];
|
|
7
6
|
export const render_audio: (a: number, b: number) => [number, number, number];
|
|
7
|
+
export const register_playhead_callback: (a: any) => void;
|
|
8
|
+
export const collect_playhead_events: () => [number, number, number];
|
|
8
9
|
export const unregister_playhead_callback: () => void;
|
|
10
|
+
export const rust_lzma_wasm_shim_malloc: (a: number) => number;
|
|
9
11
|
export const rust_lzma_wasm_shim_calloc: (a: number, b: number) => number;
|
|
10
12
|
export const rust_lzma_wasm_shim_free: (a: number) => void;
|
|
11
|
-
export const rust_lzma_wasm_shim_malloc: (a: number) => number;
|
|
12
|
-
export const rust_lzma_wasm_shim_memchr: (a: number, b: number, c: number) => number;
|
|
13
13
|
export const rust_lzma_wasm_shim_memcmp: (a: number, b: number, c: number) => number;
|
|
14
14
|
export const rust_lzma_wasm_shim_memcpy: (a: number, b: number, c: number) => number;
|
|
15
15
|
export const rust_lzma_wasm_shim_memmove: (a: number, b: number, c: number) => number;
|
|
16
16
|
export const rust_lzma_wasm_shim_memset: (a: number, b: number, c: number) => number;
|
|
17
17
|
export const rust_lzma_wasm_shim_strlen: (a: number) => number;
|
|
18
|
-
export const
|
|
19
|
-
export const
|
|
18
|
+
export const rust_lzma_wasm_shim_memchr: (a: number, b: number, c: number) => number;
|
|
19
|
+
export const rust_zstd_wasm_shim_qsort: (a: number, b: number, c: number, d: number) => void;
|
|
20
20
|
export const rust_zstd_wasm_shim_malloc: (a: number) => number;
|
|
21
21
|
export const rust_zstd_wasm_shim_memcmp: (a: number, b: number, c: number) => number;
|
|
22
|
+
export const rust_zstd_wasm_shim_calloc: (a: number, b: number) => number;
|
|
23
|
+
export const rust_zstd_wasm_shim_free: (a: number) => void;
|
|
22
24
|
export const rust_zstd_wasm_shim_memcpy: (a: number, b: number, c: number) => number;
|
|
23
25
|
export const rust_zstd_wasm_shim_memmove: (a: number, b: number, c: number) => number;
|
|
24
26
|
export const rust_zstd_wasm_shim_memset: (a: number, b: number, c: number) => number;
|
|
25
|
-
export const rust_zstd_wasm_shim_qsort: (a: number, b: number, c: number, d: number) => void;
|
|
26
27
|
export const __wbindgen_malloc: (a: number, b: number) => number;
|
|
27
28
|
export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
|
|
28
29
|
export const __wbindgen_exn_store: (a: number) => void;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devaloop/devalang",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.0.1-beta.
|
|
4
|
+
"version": "0.0.1-beta.2",
|
|
5
5
|
"description": "Write music like code. Devalang is a domain-specific language (DSL) for sound designers and music hackers. Compose, automate, and control sound — in plain text.",
|
|
6
6
|
"main": "out-tsc/index.js",
|
|
7
7
|
"bin": {
|
package/project-version.json
CHANGED