@devaloop/devalang 0.0.1-beta.2 → 0.1.1
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/README.md +177 -146
- package/out-tsc/api.d.ts +180 -0
- package/out-tsc/api.d.ts.map +1 -0
- package/out-tsc/api.js +286 -0
- package/out-tsc/api.js.map +1 -0
- package/out-tsc/bin/index.d.ts +12 -0
- package/out-tsc/bin/index.d.ts.map +1 -0
- package/out-tsc/bin/index.js +20 -54
- package/out-tsc/bin/index.js.map +1 -0
- package/out-tsc/examples/basic-usage.d.ts +8 -0
- package/out-tsc/examples/basic-usage.d.ts.map +1 -0
- package/out-tsc/examples/basic-usage.js +113 -0
- package/out-tsc/examples/basic-usage.js.map +1 -0
- package/out-tsc/index.d.ts +19 -5
- package/out-tsc/index.d.ts.map +1 -0
- package/out-tsc/index.js +24 -6
- package/out-tsc/index.js.map +1 -0
- package/out-tsc/scripts/copy-wasm-dts.d.ts +7 -0
- package/out-tsc/scripts/copy-wasm-dts.d.ts.map +1 -0
- package/out-tsc/scripts/copy-wasm-dts.js +36 -32
- package/out-tsc/scripts/copy-wasm-dts.js.map +1 -0
- package/out-tsc/scripts/postinstall.d.ts +1 -0
- package/out-tsc/scripts/postinstall.d.ts.map +1 -0
- package/out-tsc/scripts/postinstall.js +4 -1
- package/out-tsc/scripts/postinstall.js.map +1 -0
- package/out-tsc/scripts/version/bump.d.ts +5 -1
- package/out-tsc/scripts/version/bump.d.ts.map +1 -0
- package/out-tsc/scripts/version/bump.js +114 -44
- package/out-tsc/scripts/version/bump.js.map +1 -0
- package/out-tsc/scripts/version/fetch.d.ts +12 -1
- package/out-tsc/scripts/version/fetch.d.ts.map +1 -0
- package/out-tsc/scripts/version/fetch.js +68 -24
- package/out-tsc/scripts/version/fetch.js.map +1 -0
- package/out-tsc/scripts/version/index.d.ts +6 -0
- package/out-tsc/scripts/version/index.d.ts.map +1 -0
- package/out-tsc/scripts/version/index.js +44 -22
- package/out-tsc/scripts/version/index.js.map +1 -0
- package/out-tsc/scripts/version/sync.d.ts +5 -1
- package/out-tsc/scripts/version/sync.d.ts.map +1 -0
- package/out-tsc/scripts/version/sync.js +78 -29
- package/out-tsc/scripts/version/sync.js.map +1 -0
- package/out-tsc/types.d.ts +68 -0
- package/out-tsc/types.d.ts.map +1 -0
- package/out-tsc/{core/types/value.js → types.js} +4 -0
- package/out-tsc/types.js.map +1 -0
- package/out-tsc/wasm.d.ts +8 -0
- package/out-tsc/wasm.d.ts.map +1 -0
- package/out-tsc/{core/index.js → wasm.js} +9 -6
- package/out-tsc/wasm.js.map +1 -0
- package/package.json +50 -37
- package/.cargo/config.toml +0 -2
- package/.devalang +0 -9
- package/.github/workflows/ci.yml +0 -103
- package/Cargo.toml +0 -81
- package/docs/CHANGELOG.md +0 -581
- package/docs/CONTRIBUTING.md +0 -101
- package/docs/ROADMAP.md +0 -38
- package/docs/TODO.md +0 -71
- package/examples/automation.deva +0 -42
- package/examples/bank.deva +0 -7
- package/examples/bus.deva +0 -10
- package/examples/condition.deva +0 -20
- package/examples/duration.deva +0 -9
- package/examples/effect.deva +0 -2
- package/examples/events.deva +0 -12
- package/examples/filter.deva +0 -11
- package/examples/function.deva +0 -15
- package/examples/group.deva +0 -12
- package/examples/index.deva +0 -63
- package/examples/lfo.deva +0 -9
- package/examples/loop.deva +0 -10
- package/examples/pattern.deva +0 -8
- package/examples/plugin.deva +0 -16
- package/examples/samples/hat-808.wav +0 -0
- package/examples/samples/kick-808.wav +0 -0
- package/examples/synth.deva +0 -24
- package/examples/synth_types.deva +0 -17
- package/examples/variables.deva +0 -9
- package/out-tsc/core/functions/index.d.ts +0 -42
- package/out-tsc/core/functions/index.js +0 -87
- package/out-tsc/core/index.d.ts +0 -6
- package/out-tsc/core/types/index.d.ts +0 -4
- package/out-tsc/core/types/index.js +0 -20
- package/out-tsc/core/types/plugin.d.ts +0 -18
- package/out-tsc/core/types/plugin.js +0 -2
- package/out-tsc/core/types/result.d.ts +0 -27
- package/out-tsc/core/types/result.js +0 -2
- package/out-tsc/core/types/statement.d.ts +0 -106
- package/out-tsc/core/types/statement.js +0 -2
- package/out-tsc/core/types/value.d.ts +0 -43
- package/out-tsc/pkg/devalang_core.d.ts +0 -15
- package/out-tsc/pkg/devalang_core.js +0 -65
- package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +0 -34
- package/project-version.json +0 -6
- package/rust/cli/bank/api.rs +0 -122
- package/rust/cli/bank/commands.rs +0 -306
- package/rust/cli/bank/mod.rs +0 -29
- package/rust/cli/build/commands.rs +0 -153
- package/rust/cli/build/mod.rs +0 -2
- package/rust/cli/build/process.rs +0 -165
- package/rust/cli/check/mod.rs +0 -208
- package/rust/cli/discover/commands.rs +0 -253
- package/rust/cli/discover/config.rs +0 -111
- package/rust/cli/discover/fs.rs +0 -19
- package/rust/cli/discover/install.rs +0 -103
- package/rust/cli/discover/metadata.rs +0 -48
- package/rust/cli/discover/mod.rs +0 -5
- package/rust/cli/init/commands.rs +0 -88
- package/rust/cli/init/mod.rs +0 -1
- package/rust/cli/install/addon.rs +0 -118
- package/rust/cli/install/bank.rs +0 -72
- package/rust/cli/install/commands.rs +0 -35
- package/rust/cli/install/mod.rs +0 -4
- package/rust/cli/install/plugin.rs +0 -80
- package/rust/cli/login/commands.rs +0 -124
- package/rust/cli/login/mod.rs +0 -1
- package/rust/cli/mod.rs +0 -12
- package/rust/cli/parser.rs +0 -359
- package/rust/cli/play/commands.rs +0 -375
- package/rust/cli/play/io.rs +0 -17
- package/rust/cli/play/mod.rs +0 -5
- package/rust/cli/play/process.rs +0 -159
- package/rust/cli/play/realtime.rs +0 -91
- package/rust/cli/play/utils.rs +0 -23
- package/rust/cli/telemetry/commands.rs +0 -22
- package/rust/cli/telemetry/event_creator.rs +0 -80
- package/rust/cli/telemetry/mod.rs +0 -3
- package/rust/cli/telemetry/send.rs +0 -51
- package/rust/cli/template/commands.rs +0 -69
- package/rust/cli/template/mod.rs +0 -1
- package/rust/cli/update/commands.rs +0 -6
- package/rust/cli/update/mod.rs +0 -1
- package/rust/config/driver.rs +0 -112
- package/rust/config/mod.rs +0 -3
- package/rust/config/ops.rs +0 -26
- package/rust/config/settings.rs +0 -101
- package/rust/core/audio/engine/driver.rs +0 -220
- package/rust/core/audio/engine/export.rs +0 -169
- package/rust/core/audio/engine/helpers.rs +0 -178
- package/rust/core/audio/engine/mod.rs +0 -56
- package/rust/core/audio/engine/notes/dsp.rs +0 -85
- package/rust/core/audio/engine/notes/mod.rs +0 -44
- package/rust/core/audio/engine/notes/params.rs +0 -294
- package/rust/core/audio/engine/sample/insert.rs +0 -199
- package/rust/core/audio/engine/sample/mod.rs +0 -40
- package/rust/core/audio/engine/sample/padding.rs +0 -170
- package/rust/core/audio/evaluator/condition.rs +0 -61
- package/rust/core/audio/evaluator/mod.rs +0 -9
- package/rust/core/audio/evaluator/numeric.rs +0 -152
- package/rust/core/audio/evaluator/rhs.rs +0 -16
- package/rust/core/audio/evaluator/string_expr.rs +0 -94
- package/rust/core/audio/interpreter/driver.rs +0 -574
- package/rust/core/audio/interpreter/mod.rs +0 -2
- package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +0 -175
- package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +0 -384
- package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +0 -2
- package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +0 -316
- package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +0 -3
- package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +0 -192
- package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +0 -24
- package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +0 -116
- package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +0 -97
- package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +0 -100
- package/rust/core/audio/interpreter/statements/automate.rs +0 -16
- package/rust/core/audio/interpreter/statements/call.rs +0 -295
- package/rust/core/audio/interpreter/statements/condition.rs +0 -72
- package/rust/core/audio/interpreter/statements/function.rs +0 -24
- package/rust/core/audio/interpreter/statements/let_.rs +0 -36
- package/rust/core/audio/interpreter/statements/load.rs +0 -17
- package/rust/core/audio/interpreter/statements/loop_.rs +0 -115
- package/rust/core/audio/interpreter/statements/mod.rs +0 -12
- package/rust/core/audio/interpreter/statements/sleep.rs +0 -28
- package/rust/core/audio/interpreter/statements/spawn.rs +0 -253
- package/rust/core/audio/interpreter/statements/tempo.rs +0 -40
- package/rust/core/audio/interpreter/statements/trigger.rs +0 -239
- package/rust/core/audio/loader/mod.rs +0 -1
- package/rust/core/audio/loader/trigger.rs +0 -98
- package/rust/core/audio/mod.rs +0 -6
- package/rust/core/audio/player.rs +0 -70
- package/rust/core/audio/special/easing.rs +0 -189
- package/rust/core/audio/special/env.rs +0 -45
- package/rust/core/audio/special/math.rs +0 -134
- package/rust/core/audio/special/mod.rs +0 -9
- package/rust/core/audio/special/modulator.rs +0 -143
- package/rust/core/builder/mod.rs +0 -129
- package/rust/core/debugger/lexer.rs +0 -27
- package/rust/core/debugger/logs.rs +0 -52
- package/rust/core/debugger/mod.rs +0 -30
- package/rust/core/debugger/preprocessor.rs +0 -27
- package/rust/core/debugger/store.rs +0 -38
- package/rust/core/error/mod.rs +0 -269
- package/rust/core/lexer/driver.rs +0 -59
- package/rust/core/lexer/handler/arrow.rs +0 -82
- package/rust/core/lexer/handler/at.rs +0 -21
- package/rust/core/lexer/handler/brace.rs +0 -41
- package/rust/core/lexer/handler/colon.rs +0 -21
- package/rust/core/lexer/handler/comment.rs +0 -30
- package/rust/core/lexer/handler/dot.rs +0 -21
- package/rust/core/lexer/handler/driver.rs +0 -337
- package/rust/core/lexer/handler/identifier.rs +0 -47
- package/rust/core/lexer/handler/indent.rs +0 -66
- package/rust/core/lexer/handler/mod.rs +0 -15
- package/rust/core/lexer/handler/newline.rs +0 -23
- package/rust/core/lexer/handler/number.rs +0 -31
- package/rust/core/lexer/handler/operator.rs +0 -46
- package/rust/core/lexer/handler/parenthesis.rs +0 -41
- package/rust/core/lexer/handler/slash.rs +0 -21
- package/rust/core/lexer/handler/string.rs +0 -63
- package/rust/core/lexer/mod.rs +0 -3
- package/rust/core/lexer/token.rs +0 -91
- package/rust/core/mod.rs +0 -9
- package/rust/core/parser/driver/block.rs +0 -111
- package/rust/core/parser/driver/cursor.rs +0 -82
- package/rust/core/parser/driver/driver_impl.rs +0 -139
- package/rust/core/parser/driver/mod.rs +0 -6
- package/rust/core/parser/driver/parse_array.rs +0 -120
- package/rust/core/parser/driver/parse_map.rs +0 -223
- package/rust/core/parser/driver/parser.rs +0 -160
- package/rust/core/parser/handler/arrow_call.rs +0 -277
- package/rust/core/parser/handler/at.rs +0 -279
- package/rust/core/parser/handler/bank.rs +0 -104
- package/rust/core/parser/handler/condition.rs +0 -83
- package/rust/core/parser/handler/dot.rs +0 -148
- package/rust/core/parser/handler/identifier/automate.rs +0 -254
- package/rust/core/parser/handler/identifier/call.rs +0 -91
- package/rust/core/parser/handler/identifier/emit.rs +0 -70
- package/rust/core/parser/handler/identifier/function.rs +0 -113
- package/rust/core/parser/handler/identifier/group.rs +0 -89
- package/rust/core/parser/handler/identifier/let_.rs +0 -173
- package/rust/core/parser/handler/identifier/mod.rs +0 -55
- package/rust/core/parser/handler/identifier/on.rs +0 -107
- package/rust/core/parser/handler/identifier/print.rs +0 -49
- package/rust/core/parser/handler/identifier/sleep.rs +0 -96
- package/rust/core/parser/handler/identifier/spawn.rs +0 -91
- package/rust/core/parser/handler/identifier/synth.rs +0 -135
- package/rust/core/parser/handler/loop_.rs +0 -194
- package/rust/core/parser/handler/mod.rs +0 -9
- package/rust/core/parser/handler/pattern.rs +0 -74
- package/rust/core/parser/handler/tempo.rs +0 -105
- package/rust/core/parser/mod.rs +0 -3
- package/rust/core/parser/statement.rs +0 -10
- package/rust/core/plugin/loader.rs +0 -137
- package/rust/core/plugin/mod.rs +0 -2
- package/rust/core/plugin/runner/mod.rs +0 -11
- package/rust/core/plugin/runner/non_wasm.rs +0 -297
- package/rust/core/plugin/runner/wasm32.rs +0 -43
- package/rust/core/preprocessor/loader/inject.rs +0 -278
- package/rust/core/preprocessor/loader/loader_helpers.rs +0 -110
- package/rust/core/preprocessor/loader/mod.rs +0 -235
- package/rust/core/preprocessor/mod.rs +0 -4
- package/rust/core/preprocessor/module.rs +0 -55
- package/rust/core/preprocessor/processor/handlers.rs +0 -107
- package/rust/core/preprocessor/processor/mod.rs +0 -1
- package/rust/core/preprocessor/resolver/bank.rs +0 -49
- package/rust/core/preprocessor/resolver/call.rs +0 -124
- package/rust/core/preprocessor/resolver/condition.rs +0 -95
- package/rust/core/preprocessor/resolver/driver.rs +0 -324
- package/rust/core/preprocessor/resolver/function.rs +0 -69
- package/rust/core/preprocessor/resolver/group.rs +0 -122
- package/rust/core/preprocessor/resolver/let_.rs +0 -32
- package/rust/core/preprocessor/resolver/loop_.rs +0 -318
- package/rust/core/preprocessor/resolver/mod.rs +0 -16
- package/rust/core/preprocessor/resolver/pattern.rs +0 -83
- package/rust/core/preprocessor/resolver/spawn.rs +0 -99
- package/rust/core/preprocessor/resolver/synth.rs +0 -54
- package/rust/core/preprocessor/resolver/tempo.rs +0 -48
- package/rust/core/preprocessor/resolver/trigger.rs +0 -116
- package/rust/core/preprocessor/resolver/value.rs +0 -176
- package/rust/core/store/global.rs +0 -57
- package/rust/core/store/mod.rs +0 -1
- package/rust/lib.rs +0 -323
- package/rust/main.rs +0 -388
- package/rust/types/Cargo.toml +0 -11
- package/rust/types/src/addons.rs +0 -55
- package/rust/types/src/ast.rs +0 -202
- package/rust/types/src/config.rs +0 -84
- package/rust/types/src/lib.rs +0 -15
- package/rust/types/src/plugin.rs +0 -20
- package/rust/types/src/store.rs +0 -139
- package/rust/types/src/telemetry.rs +0 -85
- package/rust/utils/Cargo.toml +0 -26
- package/rust/utils/src/error.rs +0 -186
- package/rust/utils/src/file.rs +0 -94
- package/rust/utils/src/first_usage.rs +0 -97
- package/rust/utils/src/lib.rs +0 -9
- package/rust/utils/src/logger.rs +0 -200
- package/rust/utils/src/path.rs +0 -129
- package/rust/utils/src/signature.rs +0 -41
- package/rust/utils/src/spinner.rs +0 -20
- package/rust/utils/src/version.rs +0 -27
- package/rust/utils/src/watcher.rs +0 -46
- package/rust/web/api.rs +0 -5
- package/rust/web/cdn.rs +0 -34
- package/rust/web/mod.rs +0 -3
- package/rust/web/sso.rs +0 -5
- package/templates/minimal/.devalang +0 -5
- package/templates/minimal/README.md +0 -218
- package/templates/minimal/src/index.deva +0 -2
- package/templates/welcome/.devalang +0 -5
- package/templates/welcome/README.md +0 -218
- package/templates/welcome/samples/kick-808.wav +0 -0
- package/templates/welcome/src/index.deva +0 -61
- package/templates/welcome/src/variables.deva +0 -3
- package/tests/integration.rs +0 -21
- package/tests/rust/cli_check_build.rs +0 -21
- package/tests/rust/cli_help.rs +0 -12
- package/tests/rust/cli_template_list.rs +0 -10
- package/tests/rust/cli_version.rs +0 -11
- package/tests/typescript/index.spec.ts +0 -136
- package/tests/typescript/playhead.spec.ts +0 -36
- package/tests/typescript/render_e2e.spec.ts +0 -77
- package/tsconfig.json +0 -115
- package/typescript/bin/index.ts +0 -28
- package/typescript/core/functions/index.ts +0 -94
- package/typescript/core/index.ts +0 -6
- package/typescript/core/types/index.ts +0 -4
- package/typescript/core/types/plugin.ts +0 -19
- package/typescript/core/types/result.ts +0 -29
- package/typescript/core/types/statement.ts +0 -47
- package/typescript/core/types/value.ts +0 -29
- package/typescript/index.ts +0 -8
- package/typescript/pkg/devalang_core.d.ts +0 -4
- package/typescript/pkg/devalang_core.ts +0 -65
- package/typescript/scripts/copy-wasm-dts.ts +0 -41
- package/typescript/scripts/postinstall.ts +0 -85
- package/typescript/scripts/version/bump.ts +0 -44
- package/typescript/scripts/version/fetch.ts +0 -18
- package/typescript/scripts/version/index.ts +0 -25
- package/typescript/scripts/version/sync.ts +0 -24
package/README.md
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|

|
|
7
|
-

|
|
8
8
|
|
|
9
|
-

|
|
10
10
|

|
|
11
11
|

|
|
12
12
|
|
|
@@ -17,204 +17,235 @@
|
|
|
17
17
|

|
|
18
18
|

|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
# 🦊 Devalang — Write music with code
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Devalang is a compact domain-specific language (DSL) for music makers, sound designers, and creative coders.
|
|
23
|
+
Compose loops, control samples, synthesize audio, and render your ideas — all in clean, readable text.
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
Compose loops, control samples, render and play audio — all in clean, readable text.
|
|
25
|
+
Whether you're prototyping a beat, building generative music, or performing live, Devalang gives you rhythmic precision with the elegance of code.
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
From studio sketches to live sets, Devalang puts musical ideas into motion.
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
> **🚧 Notice 🚧**
|
|
32
|
-
>
|
|
33
|
-
> Includes synthesis, playback, and rendering features, but is still in early development, and breaking changes may occur.
|
|
29
|
+
> **🚀 v0.1.0 - Complete Rewriting**
|
|
34
30
|
>
|
|
35
|
-
> **NEW**: [Devaforge is now available for creating addons](https://github.com/devaloop-labs/devaforge).
|
|
36
31
|
>
|
|
37
|
-
> **NEW**:
|
|
32
|
+
> **NEW**: [Devalang Playground V2.0 is now available](https://playground.devalang.com) — Try it in your browser!
|
|
33
|
+
|
|
34
|
+
---
|
|
38
35
|
|
|
39
36
|
## 📚 Quick Access
|
|
40
37
|
|
|
41
|
-
- [▶️ Playground](https://playground.devalang.com)
|
|
42
|
-
- [📖 Documentation](https://docs.devalang.com)
|
|
43
|
-
- [🧩 VSCode Extension](https://marketplace.visualstudio.com/items?itemName=devaloop.devalang-vscode)
|
|
44
|
-
- [
|
|
45
|
-
- [📜 Changelog](./docs/CHANGELOG.md)
|
|
38
|
+
- [▶️ Playground](https://playground.devalang.com) — Try Devalang in your browser
|
|
39
|
+
- [📖 Documentation](https://docs.devalang.com) — Complete language reference
|
|
40
|
+
- [🧩 VSCode Extension](https://marketplace.visualstudio.com/items?itemName=devaloop.devalang-vscode) — Syntax highlighting & snippets
|
|
41
|
+
- [📜 Changelog](./docs/CHANGELOG.md) — Version history
|
|
46
42
|
- [💡 Examples](./examples/)
|
|
47
|
-
- [🌐
|
|
48
|
-
- [📦
|
|
49
|
-
- [📦
|
|
43
|
+
- [🌐 Website](https://devalang.com) — Project homepage
|
|
44
|
+
- [📦 npm Package](https://www.npmjs.com/package/@devaloop/devalang)
|
|
45
|
+
- [📦 Rust Crate](https://crates.io/crates/devalang)
|
|
50
46
|
|
|
51
|
-
|
|
47
|
+
---
|
|
52
48
|
|
|
53
|
-
|
|
49
|
+
## ⚡ Quick Start
|
|
54
50
|
|
|
55
|
-
|
|
51
|
+
### Try in Your Browser
|
|
56
52
|
|
|
57
|
-
|
|
53
|
+
> **[Launch the Playground](https://playground.devalang.com)** to try Devalang without installing anything.
|
|
58
54
|
|
|
59
|
-
|
|
55
|
+
### Install via npm (Recommended)
|
|
60
56
|
|
|
61
57
|
```bash
|
|
62
|
-
npm install -g @devaloop/devalang
|
|
58
|
+
npm install -g @devaloop/devalang
|
|
63
59
|
```
|
|
64
60
|
|
|
65
|
-
|
|
61
|
+
### Install via Cargo (Rust)
|
|
66
62
|
|
|
67
63
|
```bash
|
|
68
|
-
cargo install devalang
|
|
64
|
+
cargo install devalang
|
|
69
65
|
```
|
|
70
66
|
|
|
71
|
-
|
|
67
|
+
### Create Your First Project
|
|
72
68
|
|
|
73
69
|
```bash
|
|
74
|
-
|
|
70
|
+
# Initialize a new project
|
|
71
|
+
devalang init my-project
|
|
72
|
+
|
|
73
|
+
# Navigate to the project
|
|
74
|
+
cd my-project
|
|
75
|
+
|
|
76
|
+
# Check syntax
|
|
77
|
+
devalang check --entry examples/index.deva
|
|
78
|
+
|
|
79
|
+
# Build audio files
|
|
80
|
+
devalang build --path examples/index.deva --formats wav mid
|
|
81
|
+
|
|
82
|
+
# Play audio (live mode)
|
|
83
|
+
devalang play --live --input examples/index.deva
|
|
75
84
|
```
|
|
76
85
|
|
|
77
|
-
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 🎵 Your First Devalang Script
|
|
78
89
|
|
|
79
|
-
Create a
|
|
90
|
+
Create a file `hello.deva`:
|
|
80
91
|
|
|
81
92
|
```deva
|
|
82
|
-
#
|
|
83
|
-
|
|
84
|
-
# BPM definition
|
|
85
|
-
bpm 125
|
|
86
|
-
|
|
87
|
-
# Bank picking (make sure you've installed it)
|
|
88
|
-
bank devaloop.808 as my808Bank
|
|
89
|
-
|
|
90
|
-
# Pattern literal without options
|
|
91
|
-
pattern kickPattern with my808Bank.kick = "x--- x--- x--- x---"
|
|
92
|
-
|
|
93
|
-
group myGroup:
|
|
94
|
-
# Rhythmic (each beat playing a kick)
|
|
95
|
-
# on beat:
|
|
96
|
-
# .my808Bank.kick 1/4
|
|
97
|
-
|
|
98
|
-
# Synth definition with ADSR
|
|
99
|
-
let myLead = synth sine {
|
|
100
|
-
attack: 0,
|
|
101
|
-
decay: 100,
|
|
102
|
-
sustain: 100,
|
|
103
|
-
release: 100
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
# Global automation
|
|
107
|
-
automate myLead:
|
|
108
|
-
param volume {
|
|
109
|
-
0% = 0.0
|
|
110
|
-
100% = 0.5
|
|
111
|
-
}
|
|
112
|
-
param pitch {
|
|
113
|
-
0% = -12.0
|
|
114
|
-
100% = 12.0
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
# Notes in a loop with condition
|
|
118
|
-
for i in [1, 2, 3]:
|
|
119
|
-
if i == 3:
|
|
120
|
-
myLead -> note(C5, { duration: 200 })
|
|
121
|
-
print "Playing note C5 for " + i
|
|
122
|
-
|
|
123
|
-
# Pause runtime for 500ms
|
|
124
|
-
sleep 500
|
|
125
|
-
|
|
126
|
-
# Note with automation
|
|
127
|
-
myLead -> note(C4, {
|
|
128
|
-
duration: 400,
|
|
129
|
-
velocity: 0.8,
|
|
130
|
-
automate: {
|
|
131
|
-
pan: {
|
|
132
|
-
0%: -1.0,
|
|
133
|
-
100%: 0.0
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
})
|
|
137
|
-
|
|
138
|
-
# Notes with params
|
|
139
|
-
myLead -> note(G4, { duration: 600, glide: true })
|
|
140
|
-
myLead -> note(B3, { duration: 400, slide: true })
|
|
141
|
-
|
|
142
|
-
# Spawning the group & the pattern to play them in parallel
|
|
143
|
-
spawn myGroup
|
|
144
|
-
spawn kickPattern
|
|
145
|
-
```
|
|
93
|
+
# Set the tempo
|
|
94
|
+
bpm 120
|
|
146
95
|
|
|
147
|
-
|
|
96
|
+
# Load a bank of sounds
|
|
97
|
+
bank devaloop.808 as drums
|
|
148
98
|
|
|
149
|
-
|
|
99
|
+
# Create a simple drum pattern
|
|
100
|
+
pattern kickPattern with drums.kick = "x--- x--- x--- x---"
|
|
101
|
+
pattern snarePattern with drums.snare = "---- x--- ---- x---"
|
|
102
|
+
pattern hihatPattern with drums.hihat = "x-x- x-x- x-x- x-x-"
|
|
150
103
|
|
|
151
|
-
|
|
152
|
-
|
|
104
|
+
# Play the patterns
|
|
105
|
+
call kickPattern
|
|
106
|
+
call snarePattern
|
|
107
|
+
call hihatPattern
|
|
153
108
|
```
|
|
154
109
|
|
|
155
|
-
|
|
110
|
+
### Build the audio
|
|
156
111
|
|
|
157
112
|
```bash
|
|
158
|
-
|
|
113
|
+
# Build to WAV
|
|
114
|
+
devalang build --path hello.deva --formats wav
|
|
115
|
+
|
|
116
|
+
# Output: ./output/audio/hello.wav
|
|
159
117
|
```
|
|
160
118
|
|
|
161
|
-
|
|
119
|
+
# Play the audio
|
|
162
120
|
|
|
163
|
-
|
|
121
|
+
```bash
|
|
122
|
+
# Play the audio file
|
|
123
|
+
devalang play --input hello.deva
|
|
164
124
|
|
|
165
|
-
|
|
125
|
+
# Play live (repeats and watch until stopped)
|
|
126
|
+
devalang play --live --input hello.deva
|
|
127
|
+
```
|
|
166
128
|
|
|
167
|
-
|
|
168
|
-
- 💻 Integrate sound into code-based workflows
|
|
169
|
-
- 🎛️ Control audio parameters through readable syntax
|
|
170
|
-
- 🧪 Build musical logic with variables and conditions
|
|
171
|
-
- 🔄 Create complex patterns with ease
|
|
129
|
+
---
|
|
172
130
|
|
|
173
131
|
## 🚀 Features
|
|
174
132
|
|
|
175
|
-
|
|
176
|
-
-
|
|
177
|
-
-
|
|
178
|
-
-
|
|
179
|
-
-
|
|
180
|
-
-
|
|
181
|
-
-
|
|
182
|
-
-
|
|
183
|
-
-
|
|
184
|
-
-
|
|
185
|
-
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
133
|
+
### 🎵 **Core Language**
|
|
134
|
+
- ✅ **Lexer & Parser** — Complete tokenization and AST generation
|
|
135
|
+
- ✅ **Patterns** — Rhythmic notation with swing, humanize, velocity
|
|
136
|
+
- ✅ **Synths** — Built-in synthesizers with ADSR envelopes
|
|
137
|
+
- ✅ **Filters** — Lowpass, highpass, bandpass audio filtering
|
|
138
|
+
- ✅ **Effects** — Reverb, delay, distortion, drive, chorus
|
|
139
|
+
- ✅ **Variables** — `let`, `const`, `var` with scoping
|
|
140
|
+
- ✅ **Groups & Spawn** — Organize and parallelize execution
|
|
141
|
+
- ✅ **Loops & Conditions** — `for`, `if`, `else` control flow
|
|
142
|
+
- ✅ **Triggers** — Conditional audio triggering
|
|
143
|
+
- ✅ **Events** — Event system with `on` and `emit`
|
|
144
|
+
|
|
145
|
+
### 🛠️ **CLI Tools**
|
|
146
|
+
- ✅ `devalang init` — Scaffold new projects (3 templates)
|
|
147
|
+
- ✅ `devalang build` — Compile to WAV/MIDI
|
|
148
|
+
- ✅ `devalang check` — Validate syntax
|
|
149
|
+
- ✅ `devalang play` — Audio playback
|
|
150
|
+
- ✅ `devalang addon` — Manage addons (install, list, discover)
|
|
151
|
+
- ✅ `devalang login/logout` — Authentication
|
|
152
|
+
- ✅ `devalang telemetry` — Privacy controls
|
|
153
|
+
|
|
154
|
+
### 🌐 **WASM API**
|
|
155
|
+
- ✅ `render_audio()` — Browser audio rendering
|
|
156
|
+
- ✅ `render_midi_array()` — MIDI export
|
|
157
|
+
- ✅ `debug_render()` — Debug information
|
|
158
|
+
- ✅ `parse()` — Parse Devalang code
|
|
159
|
+
- ✅ TypeScript types included
|
|
160
|
+
|
|
161
|
+
### 📦 **Output Formats**
|
|
162
|
+
- ✅ **WAV** — 16/24/32-bit audio export
|
|
163
|
+
- ✅ **MIDI** — Standard MIDI file export
|
|
164
|
+
- ⚠️ **MP3/FLAC** — Planned for v0.1.1
|
|
165
|
+
|
|
166
|
+
### 🎯 **Performance**
|
|
167
|
+
- ⚡ **Fast builds** — 7-10ms for typical projects
|
|
168
|
+
- ⚡ **Low latency** — Optimized audio engine
|
|
169
|
+
- ⚡ **Release builds** — 5-6x faster than debug
|
|
170
|
+
|
|
171
|
+
### 📚 **Learning Resources**
|
|
172
|
+
- ✅ **Online Docs** — Complete language reference
|
|
173
|
+
- ✅ **VSCode Extension** — Syntax highlighting
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 💡 Why Devalang?
|
|
178
|
+
|
|
179
|
+
- 🎹 **Prototype audio ideas** without opening a DAW
|
|
180
|
+
- 💻 **Integrate sound** into code-based workflows
|
|
181
|
+
- 🎛️ **Control audio parameters** with readable syntax
|
|
182
|
+
- 🧪 **Build musical logic** with variables and conditions
|
|
183
|
+
- 🔄 **Create patterns** with expressive notation
|
|
184
|
+
- 🎨 **Live code** with fast iteration cycles
|
|
185
|
+
- 📦 **Version control** your music with git
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 📖 Documentation
|
|
190
|
+
|
|
191
|
+
**[Visit docs.devalang.com](https://docs.devalang.com)** for:
|
|
192
|
+
- Complete syntax reference
|
|
193
|
+
- API documentation
|
|
194
|
+
- WASM integration guide
|
|
195
|
+
- CLI command reference
|
|
196
|
+
- Advanced tutorials
|
|
197
|
+
- Best practices
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 🔧 Development
|
|
202
|
+
|
|
203
|
+
### Build from Source
|
|
190
204
|
|
|
191
|
-
|
|
205
|
+
```bash
|
|
206
|
+
# Clone the repository
|
|
207
|
+
git clone https://github.com/devaloop-labs/devalang.git
|
|
208
|
+
cd devalang
|
|
192
209
|
|
|
193
|
-
|
|
210
|
+
# Build CLI (Rust)
|
|
211
|
+
cargo build --release --features cli
|
|
194
212
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
- **Devaforge**: Introduced a new system for creating and managing addons, including a CLI for addon generation.
|
|
198
|
-
- **Documentation updates**: Improved documentation for clarity and completeness.
|
|
199
|
-
- **Discovering addons**: Introduced a new command to detect addons.
|
|
200
|
-
- **Public TypeScript API**: Added a public TypeScript API for easier integration.
|
|
201
|
-
- **Improved error messages**: Enhanced error messages for better debugging.
|
|
202
|
-
- **Major refactor**: Significant codebase refactor for improved maintainability and performance.
|
|
203
|
-
- **Bug fixes**: Various bug fixes and stability improvements.
|
|
213
|
+
# Build WASM
|
|
214
|
+
cargo build --release --features wasm --lib
|
|
204
215
|
|
|
205
|
-
|
|
216
|
+
# Build TypeScript
|
|
217
|
+
npm install
|
|
218
|
+
npm run ts:build
|
|
206
219
|
|
|
207
|
-
|
|
220
|
+
# Run tests
|
|
221
|
+
cargo test --features cli
|
|
222
|
+
npm test
|
|
223
|
+
```
|
|
208
224
|
|
|
209
225
|
## 🤝 Contributing
|
|
210
226
|
|
|
211
|
-
|
|
212
|
-
|
|
227
|
+
We welcome contributions! See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.
|
|
228
|
+
|
|
229
|
+
### Ways to Contribute
|
|
213
230
|
|
|
214
|
-
|
|
231
|
+
- 🐛 **Report bugs** via [GitHub Issues](https://github.com/devaloop-labs/devalang/issues)
|
|
232
|
+
- 💡 **Suggest features** in discussions
|
|
233
|
+
- 📝 **Improve docs** with pull requests
|
|
234
|
+
- 🎵 **Share examples** of your creations
|
|
235
|
+
- 🧪 **Write tests** for new features
|
|
215
236
|
|
|
216
|
-
|
|
237
|
+
---
|
|
217
238
|
|
|
218
|
-
|
|
239
|
+
## 📜 License
|
|
219
240
|
|
|
220
|
-
|
|
241
|
+
MIT License — See [LICENSE](./LICENSE) for details.
|
|
242
|
+
|
|
243
|
+
Copyright (c) 2025 Devaloop
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
<div align="center">
|
|
248
|
+
<strong>Made with ❤️ by the Devaloop team</strong>
|
|
249
|
+
<br />
|
|
250
|
+
<sub>Star ⭐ the repo if you like it!</sub>
|
|
251
|
+
</div>
|
package/out-tsc/api.d.ts
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-level API wrapper for Devalang WASM functions
|
|
3
|
+
*
|
|
4
|
+
* This module provides TypeScript-friendly wrappers around the raw WASM bindings,
|
|
5
|
+
* with proper error handling and type conversions.
|
|
6
|
+
*/
|
|
7
|
+
import type { RenderOptions, MidiOptions, ParseResult, DebugRenderResult, CodeMetadata, RegisteredBank, DebugState } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Parse Devalang source code
|
|
10
|
+
*
|
|
11
|
+
* @param entryPath - Path to the source file (for error messages)
|
|
12
|
+
* @param source - Devalang source code
|
|
13
|
+
* @returns Parse result with statements or errors
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const result = await parse('test.deva', 'bpm 120\nsleep 1b');
|
|
18
|
+
* if (result.success) {
|
|
19
|
+
* console.log(`Parsed ${result.statements.length} statements`);
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function parse(entryPath: string, source: string): Promise<ParseResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Quick syntax check without full parsing
|
|
26
|
+
*
|
|
27
|
+
* @param source - Devalang source code
|
|
28
|
+
* @returns true if syntax is valid
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* if (await checkSyntax('bpm 120')) {
|
|
33
|
+
* console.log('Valid syntax!');
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function checkSyntax(source: string): Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Render audio from Devalang code
|
|
40
|
+
*
|
|
41
|
+
* @param code - Devalang source code
|
|
42
|
+
* @param options - Render options (sample rate, BPM)
|
|
43
|
+
* @returns Float32Array containing rendered audio samples
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* const audio = await renderAudio('bpm 120\nlet s = synth sine {}\ns -> note(A4, { duration: 500 })', {
|
|
48
|
+
* sampleRate: 44100,
|
|
49
|
+
* bpm: 120
|
|
50
|
+
* });
|
|
51
|
+
* console.log(`Rendered ${audio.length} samples`);
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare function renderAudio(code: string, options?: RenderOptions): Promise<Float32Array>;
|
|
55
|
+
/**
|
|
56
|
+
* Render audio with debug information
|
|
57
|
+
*
|
|
58
|
+
* @param code - Devalang source code
|
|
59
|
+
* @param options - Render options
|
|
60
|
+
* @returns Debug render result with audio and metadata
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```typescript
|
|
64
|
+
* const result = await debugRender('bpm 120\nlet s = synth sine {}\ns -> note(C4, { duration: 500 })');
|
|
65
|
+
* console.log(`Duration: ${result.duration}s, Events: ${result.eventCount}`);
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export declare function debugRender(code: string, options?: RenderOptions): Promise<DebugRenderResult>;
|
|
69
|
+
/**
|
|
70
|
+
* Render WAV file preview as bytes
|
|
71
|
+
*
|
|
72
|
+
* @param code - Devalang source code
|
|
73
|
+
* @param options - Render options
|
|
74
|
+
* @returns Uint8Array containing WAV file bytes
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* const wavBytes = await renderWavPreview('bpm 120\nsleep 1b');
|
|
79
|
+
* // Save to file or send to browser for download
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export declare function renderWavPreview(code: string, options?: RenderOptions): Promise<Uint8Array>;
|
|
83
|
+
/**
|
|
84
|
+
* Render MIDI file as bytes
|
|
85
|
+
*
|
|
86
|
+
* @param code - Devalang source code
|
|
87
|
+
* @param options - MIDI options
|
|
88
|
+
* @returns Uint8Array containing MIDI file bytes
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* const midiBytes = await renderMidi('bpm 120\nlet s = synth sine {}\ns -> note(C4, { duration: 1000 })');
|
|
93
|
+
* // Save as .mid file
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export declare function renderMidi(code: string, options?: MidiOptions): Promise<Uint8Array>;
|
|
97
|
+
/**
|
|
98
|
+
* Get code metadata without rendering
|
|
99
|
+
*
|
|
100
|
+
* @param code - Devalang source code
|
|
101
|
+
* @param options - Options
|
|
102
|
+
* @returns Metadata about the code
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* const meta = await getCodeMetadata('bpm 140\nsleep 1b\nsleep 1b');
|
|
107
|
+
* console.log(`${meta.statementCount} statements at ${meta.bpm} BPM`);
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export declare function getCodeMetadata(code: string, options?: RenderOptions): Promise<CodeMetadata>;
|
|
111
|
+
/**
|
|
112
|
+
* Register an audio sample with PCM data
|
|
113
|
+
*
|
|
114
|
+
* @param uri - Sample URI (e.g., "devalang://bank/kick.wav")
|
|
115
|
+
* @param pcm - PCM audio data as Float32Array
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```typescript
|
|
119
|
+
* const pcm = new Float32Array([0.5, -0.5, 0.25, -0.25]);
|
|
120
|
+
* await registerSample('devalang://bank/test.wav', pcm);
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
export declare function registerSample(uri: string, pcm: Float32Array): Promise<boolean>;
|
|
124
|
+
/**
|
|
125
|
+
* Register an audio bank addon
|
|
126
|
+
*
|
|
127
|
+
* @param path - Addon path (e.g., "devalang://bank/publisher.name?triggers=kick:audio/kick.wav")
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```typescript
|
|
131
|
+
* await registerAddon('devalang://bank/devaloop.808?triggers=kick:audio/kick.wav,snare:audio/snare.wav');
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
export declare function registerAddon(path: string): Promise<void>;
|
|
135
|
+
/**
|
|
136
|
+
* List all registered banks
|
|
137
|
+
*
|
|
138
|
+
* @returns Array of registered banks
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* ```typescript
|
|
142
|
+
* const banks = await listRegisteredBanks();
|
|
143
|
+
* banks.forEach(bank => console.log(`${bank.alias}: ${bank.fullName}`));
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
export declare function listRegisteredBanks(): Promise<RegisteredBank[]>;
|
|
147
|
+
/**
|
|
148
|
+
* Get sample load events log
|
|
149
|
+
*
|
|
150
|
+
* @param clear - Whether to clear the log after reading
|
|
151
|
+
* @returns Array of log messages
|
|
152
|
+
*/
|
|
153
|
+
export declare function getSampleLoadEvents(clear?: boolean): Promise<string[]>;
|
|
154
|
+
/**
|
|
155
|
+
* Get playback debug log
|
|
156
|
+
*
|
|
157
|
+
* @param clear - Whether to clear the log after reading
|
|
158
|
+
* @returns Array of debug messages
|
|
159
|
+
*/
|
|
160
|
+
export declare function getPlaybackDebug(clear?: boolean): Promise<string[]>;
|
|
161
|
+
/**
|
|
162
|
+
* Get debug state
|
|
163
|
+
*
|
|
164
|
+
* @returns Current debug state
|
|
165
|
+
*/
|
|
166
|
+
export declare function getDebugState(): Promise<DebugState>;
|
|
167
|
+
/**
|
|
168
|
+
* Enable or disable debug error logging
|
|
169
|
+
*
|
|
170
|
+
* @param enable - Whether to enable debug errors
|
|
171
|
+
*/
|
|
172
|
+
export declare function setDebugErrors(enable: boolean): Promise<void>;
|
|
173
|
+
/**
|
|
174
|
+
* Get last errors
|
|
175
|
+
*
|
|
176
|
+
* @param clear - Whether to clear errors after reading
|
|
177
|
+
* @returns Array of error messages
|
|
178
|
+
*/
|
|
179
|
+
export declare function getLastErrors(clear?: boolean): Promise<string[]>;
|
|
180
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/typescript/api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,UAAU,EACX,MAAM,YAAY,CAAC;AA2BpB;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAGnF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGlE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAO9F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAOnG;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAOjG;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CASzF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAOlG;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAGrF;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/D;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAGrE;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGnF;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGhF;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CAGzD;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAGnE;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAG7E"}
|