@devaloop/devalang 0.0.1-alpha.8 → 0.0.1-beta.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/.cargo/config.toml +2 -0
- package/.devalang +10 -4
- package/.github/workflows/ci.yml +103 -0
- package/Cargo.toml +80 -48
- package/README.md +135 -158
- package/docs/CHANGELOG.md +413 -1
- package/docs/CONTRIBUTING.md +101 -0
- package/docs/ROADMAP.md +10 -7
- package/docs/TODO.md +21 -9
- package/examples/automation.deva +42 -0
- package/examples/bank.deva +7 -0
- package/examples/condition.deva +8 -12
- package/examples/duration.deva +9 -0
- package/examples/events.deva +12 -0
- package/examples/function.deva +15 -0
- package/examples/group.deva +3 -3
- package/examples/index.deva +57 -10
- package/examples/loop.deva +7 -12
- package/examples/pattern.deva +8 -0
- package/examples/plugin.deva +16 -0
- package/examples/synth.deva +14 -0
- package/examples/variables.deva +2 -2
- package/out-tsc/bin/index.d.ts +2 -0
- package/out-tsc/bin/index.js +51 -7
- package/out-tsc/core/functions/index.d.ts +37 -0
- package/out-tsc/core/functions/index.js +76 -0
- package/out-tsc/core/index.d.ts +6 -0
- package/out-tsc/core/index.js +22 -0
- package/out-tsc/core/types/index.d.ts +4 -0
- package/out-tsc/core/types/index.js +20 -0
- package/out-tsc/core/types/plugin.d.ts +18 -0
- package/out-tsc/core/types/plugin.js +2 -0
- package/out-tsc/core/types/result.d.ts +27 -0
- package/out-tsc/core/types/result.js +2 -0
- package/out-tsc/core/types/statement.d.ts +106 -0
- package/out-tsc/core/types/statement.js +2 -0
- package/out-tsc/core/types/value.d.ts +43 -0
- package/out-tsc/core/types/value.js +2 -0
- package/out-tsc/index.d.ts +7 -0
- package/out-tsc/index.js +42 -1
- package/out-tsc/pkg/devalang_core.d.ts +13 -0
- package/out-tsc/pkg/devalang_core.js +50 -0
- package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +33 -0
- package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
- package/out-tsc/scripts/copy-wasm-dts.js +73 -0
- package/out-tsc/scripts/postinstall.d.ts +1 -0
- package/out-tsc/scripts/postinstall.js +83 -0
- package/out-tsc/scripts/version/bump.d.ts +1 -0
- package/out-tsc/scripts/version/fetch.d.ts +1 -0
- package/out-tsc/scripts/version/fetch.js +1 -5
- package/out-tsc/scripts/version/index.d.ts +1 -0
- package/out-tsc/scripts/version/sync.d.ts +1 -0
- package/package.json +28 -7
- package/project-version.json +4 -4
- package/rust/cli/bank/api.rs +122 -0
- package/rust/cli/bank/commands.rs +275 -0
- package/rust/cli/bank/mod.rs +29 -0
- package/rust/cli/build/commands.rs +103 -0
- package/rust/cli/build/mod.rs +2 -0
- package/rust/cli/build/process.rs +146 -0
- package/rust/cli/check/mod.rs +208 -0
- package/rust/cli/discover/commands.rs +253 -0
- package/rust/cli/discover/config.rs +111 -0
- package/rust/cli/discover/fs.rs +19 -0
- package/rust/cli/discover/install.rs +103 -0
- package/rust/cli/discover/metadata.rs +48 -0
- package/rust/cli/discover/mod.rs +5 -0
- package/rust/cli/{init.rs → init/commands.rs} +32 -23
- package/rust/cli/init/mod.rs +1 -0
- package/rust/cli/install/addon.rs +118 -0
- package/rust/cli/install/bank.rs +53 -0
- package/rust/cli/install/commands.rs +35 -0
- package/rust/cli/install/mod.rs +4 -0
- package/rust/cli/install/plugin.rs +61 -0
- package/rust/cli/login/commands.rs +124 -0
- package/rust/cli/login/mod.rs +1 -0
- package/rust/cli/mod.rs +12 -205
- package/rust/cli/parser.rs +314 -0
- package/rust/cli/play/commands.rs +324 -0
- package/rust/cli/play/io.rs +17 -0
- package/rust/cli/play/mod.rs +5 -0
- package/rust/cli/play/process.rs +150 -0
- package/rust/cli/play/realtime.rs +91 -0
- package/rust/cli/play/utils.rs +23 -0
- package/rust/cli/telemetry/commands.rs +22 -0
- package/rust/cli/telemetry/event_creator.rs +80 -0
- package/rust/cli/telemetry/mod.rs +3 -0
- package/rust/cli/telemetry/send.rs +51 -0
- package/rust/cli/{template.rs → template/commands.rs} +69 -57
- package/rust/cli/template/mod.rs +1 -0
- package/rust/cli/update/commands.rs +6 -0
- package/rust/cli/update/mod.rs +1 -0
- package/rust/config/driver.rs +103 -0
- package/rust/config/mod.rs +3 -16
- package/rust/config/ops.rs +26 -0
- package/rust/config/settings.rs +101 -0
- package/rust/core/audio/engine/helpers.rs +170 -0
- package/rust/core/audio/engine/mod.rs +7 -0
- package/rust/core/audio/engine/sample.rs +366 -0
- package/rust/core/audio/engine/synth.rs +325 -0
- package/rust/core/audio/evaluator.rs +310 -31
- package/rust/core/audio/interpreter/arrow_call.rs +311 -0
- package/rust/core/audio/interpreter/automate.rs +18 -0
- package/rust/core/audio/interpreter/call.rs +294 -42
- package/rust/core/audio/interpreter/condition.rs +71 -65
- package/rust/core/audio/interpreter/driver.rs +542 -204
- package/rust/core/audio/interpreter/function.rs +26 -0
- package/rust/core/audio/interpreter/let_.rs +38 -19
- package/rust/core/audio/interpreter/load.rs +19 -18
- package/rust/core/audio/interpreter/loop_.rs +114 -59
- package/rust/core/audio/interpreter/mod.rs +14 -11
- package/rust/core/audio/interpreter/sleep.rs +28 -36
- package/rust/core/audio/interpreter/spawn.rs +252 -65
- package/rust/core/audio/interpreter/tempo.rs +40 -16
- package/rust/core/audio/interpreter/trigger.rs +239 -69
- package/rust/core/audio/loader/mod.rs +1 -1
- package/rust/core/audio/loader/trigger.rs +97 -52
- package/rust/core/audio/mod.rs +7 -6
- package/rust/core/audio/player.rs +70 -54
- package/rust/core/audio/renderer.rs +54 -57
- package/rust/core/audio/special/easing.rs +189 -0
- package/rust/core/audio/special/env.rs +45 -0
- package/rust/core/audio/special/math.rs +134 -0
- package/rust/core/audio/special/mod.rs +9 -0
- package/rust/core/audio/special/modulator.rs +143 -0
- package/rust/core/builder/mod.rs +86 -80
- package/rust/core/debugger/lexer.rs +27 -27
- package/rust/core/debugger/mod.rs +30 -21
- package/rust/core/debugger/module.rs +55 -0
- package/rust/core/debugger/preprocessor.rs +27 -27
- package/rust/core/debugger/store.rs +40 -25
- package/rust/core/error/mod.rs +269 -60
- package/rust/core/lexer/driver.rs +61 -0
- package/rust/core/lexer/handler/arrow.rs +82 -0
- 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 -215
- package/rust/core/lexer/handler/identifier.rs +47 -40
- package/rust/core/lexer/handler/indent.rs +66 -52
- package/rust/core/lexer/handler/mod.rs +15 -13
- 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 -44
- package/rust/core/lexer/handler/parenthesis.rs +41 -0
- package/rust/core/lexer/handler/slash.rs +21 -0
- package/rust/core/lexer/handler/string.rs +63 -63
- package/rust/core/lexer/mod.rs +3 -30
- package/rust/core/lexer/token.rs +21 -12
- package/rust/core/mod.rs +10 -10
- package/rust/core/parser/driver.rs +584 -312
- package/rust/core/parser/handler/arrow_call.rs +253 -0
- package/rust/core/parser/handler/at.rs +279 -162
- package/rust/core/parser/handler/bank.rs +104 -41
- package/rust/core/parser/handler/condition.rs +83 -74
- package/rust/core/parser/handler/dot.rs +148 -112
- package/rust/core/parser/handler/identifier/automate.rs +254 -0
- package/rust/core/parser/handler/identifier/call.rs +91 -0
- package/rust/core/parser/handler/identifier/emit.rs +70 -0
- package/rust/core/parser/handler/identifier/function.rs +113 -0
- package/rust/core/parser/handler/identifier/group.rs +89 -0
- package/rust/core/parser/handler/identifier/let_.rs +173 -0
- package/rust/core/parser/handler/identifier/mod.rs +55 -0
- package/rust/core/parser/handler/identifier/on.rs +107 -0
- package/rust/core/parser/handler/identifier/print.rs +49 -0
- package/rust/core/parser/handler/identifier/sleep.rs +43 -0
- package/rust/core/parser/handler/identifier/spawn.rs +91 -0
- package/rust/core/parser/handler/identifier/synth.rs +135 -0
- package/rust/core/parser/handler/loop_.rs +194 -66
- package/rust/core/parser/handler/mod.rs +9 -7
- package/rust/core/parser/handler/pattern.rs +74 -0
- package/rust/core/parser/handler/tempo.rs +57 -47
- package/rust/core/parser/mod.rs +3 -4
- package/rust/core/parser/statement.rs +11 -88
- package/rust/core/plugin/loader.rs +137 -0
- package/rust/core/plugin/mod.rs +2 -0
- package/rust/core/plugin/runner.rs +347 -0
- package/rust/core/preprocessor/loader.rs +637 -179
- package/rust/core/preprocessor/mod.rs +4 -4
- package/rust/core/preprocessor/module.rs +60 -53
- package/rust/core/preprocessor/processor.rs +114 -67
- package/rust/core/preprocessor/resolver/bank.rs +49 -47
- package/rust/core/preprocessor/resolver/call.rs +124 -53
- package/rust/core/preprocessor/resolver/condition.rs +95 -66
- package/rust/core/preprocessor/resolver/driver.rs +324 -182
- package/rust/core/preprocessor/resolver/function.rs +69 -0
- package/rust/core/preprocessor/resolver/group.rs +94 -118
- package/rust/core/preprocessor/resolver/let_.rs +32 -0
- package/rust/core/preprocessor/resolver/loop_.rs +318 -145
- package/rust/core/preprocessor/resolver/mod.rs +16 -10
- package/rust/core/preprocessor/resolver/pattern.rs +83 -0
- package/rust/core/preprocessor/resolver/spawn.rs +99 -53
- package/rust/core/preprocessor/resolver/synth.rs +54 -0
- package/rust/core/preprocessor/resolver/tempo.rs +48 -49
- package/rust/core/preprocessor/resolver/trigger.rs +116 -111
- package/rust/core/preprocessor/resolver/value.rs +176 -0
- package/rust/core/store/export.rs +28 -28
- package/rust/core/store/function.rs +40 -0
- package/rust/core/store/global.rs +61 -39
- package/rust/core/store/import.rs +28 -28
- package/rust/core/store/mod.rs +5 -4
- package/rust/core/store/variable.rs +51 -28
- package/rust/core/utils/mod.rs +1 -2
- package/rust/core/utils/path.rs +37 -46
- package/rust/lib.rs +308 -117
- package/rust/main.rs +364 -65
- package/rust/types/Cargo.toml +11 -0
- package/rust/types/src/addons.rs +55 -0
- package/rust/types/src/ast.rs +202 -0
- package/rust/types/src/config.rs +74 -0
- package/rust/types/src/lib.rs +12 -0
- package/rust/types/src/telemetry.rs +85 -0
- package/rust/utils/Cargo.toml +26 -0
- package/rust/utils/src/error.rs +186 -0
- package/rust/utils/src/file.rs +94 -0
- package/rust/utils/src/first_usage.rs +97 -0
- package/rust/utils/{mod.rs → src/lib.rs} +9 -6
- package/rust/utils/{logger.rs → src/logger.rs} +200 -123
- package/rust/utils/src/path.rs +88 -0
- package/rust/utils/src/signature.rs +41 -0
- package/rust/utils/{spinner.rs → src/spinner.rs} +20 -21
- package/rust/utils/src/version.rs +27 -0
- package/rust/utils/{watcher.rs → src/watcher.rs} +46 -33
- package/rust/web/api.rs +5 -0
- package/rust/web/cdn.rs +34 -0
- package/rust/web/mod.rs +3 -0
- package/rust/web/sso.rs +5 -0
- package/templates/minimal/README.md +143 -127
- package/templates/welcome/README.md +143 -127
- package/templates/welcome/src/index.deva +56 -8
- package/templates/welcome/src/variables.deva +2 -4
- package/tests/integration.rs +21 -0
- package/tests/rust/cli_check_build.rs +21 -0
- package/tests/rust/cli_help.rs +12 -0
- package/tests/rust/cli_template_list.rs +10 -0
- package/tests/rust/cli_version.rs +11 -0
- package/tests/typescript/index.spec.ts +136 -0
- package/tests/typescript/playhead.spec.ts +36 -0
- package/tests/typescript/render_e2e.spec.ts +77 -0
- package/tsconfig.json +12 -10
- package/typescript/bin/index.ts +19 -5
- package/typescript/core/functions/index.ts +83 -0
- package/typescript/core/index.ts +6 -0
- package/typescript/core/types/index.ts +4 -0
- package/typescript/core/types/plugin.ts +19 -0
- package/typescript/core/types/result.ts +29 -0
- package/typescript/core/types/statement.ts +47 -0
- package/typescript/core/types/value.ts +29 -0
- package/typescript/index.ts +8 -1
- package/typescript/pkg/devalang_core.d.ts +4 -0
- package/typescript/pkg/devalang_core.ts +49 -0
- package/typescript/scripts/copy-wasm-dts.ts +41 -0
- package/typescript/scripts/postinstall.ts +85 -0
- package/typescript/scripts/version/bump.ts +0 -1
- package/typescript/scripts/version/fetch.ts +1 -6
- package/typescript/scripts/version/index.ts +0 -1
- package/docs/COMMANDS.md +0 -85
- package/docs/CONFIG.md +0 -30
- package/docs/SYNTAX.md +0 -210
- package/out-tsc/bin/devalang.exe +0 -0
- package/out-tsc/scripts/postbuild.js +0 -11
- package/rust/cli/build.rs +0 -137
- package/rust/cli/check.rs +0 -117
- package/rust/cli/play.rs +0 -193
- package/rust/config/loader.rs +0 -13
- package/rust/core/audio/engine.rs +0 -126
- package/rust/core/parser/handler/identifier.rs +0 -262
- package/rust/core/shared/duration.rs +0 -8
- package/rust/core/shared/mod.rs +0 -2
- package/rust/core/shared/value.rs +0 -18
- package/rust/core/utils/validation.rs +0 -35
- package/rust/utils/file.rs +0 -35
- package/rust/utils/signature.rs +0 -17
- package/rust/utils/version.rs +0 -15
- package/typescript/scripts/postbuild.ts +0 -8
package/examples/condition.deva
CHANGED
|
@@ -1,24 +1,20 @@
|
|
|
1
1
|
# This file demonstrates the use of conditional blocks in Devalang.
|
|
2
2
|
|
|
3
|
-
@import {
|
|
3
|
+
@import { duration, default_bank, params, loopCount, tempo } from "./variables.deva"
|
|
4
|
+
@import { myGroup } from "./group.deva"
|
|
4
5
|
|
|
5
|
-
@load "./
|
|
6
|
-
@load "./
|
|
6
|
+
@load "./samples/kick-808.wav" as kickCustom
|
|
7
|
+
@load "./samples/hat-808.wav" as hatCustom
|
|
7
8
|
|
|
8
9
|
group conditionBlock:
|
|
9
10
|
if tempo > 120:
|
|
10
11
|
# Will be executed if the condition is true
|
|
11
|
-
.kickCustom
|
|
12
|
+
.kickCustom auto
|
|
12
13
|
else if tempo > 155:
|
|
13
14
|
# Will be executed if the condition is false
|
|
14
|
-
.hatCustom
|
|
15
|
+
.hatCustom auto
|
|
15
16
|
else:
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
# This will call myGroup sequentially (in the main thread)
|
|
19
|
-
call myGroup
|
|
20
|
-
|
|
21
|
-
# This will spawn a group in parallel to the main thread (kick + hat simultaneously)
|
|
22
|
-
# spawn myGroup
|
|
17
|
+
.kickCustom auto
|
|
18
|
+
.hatCustom auto
|
|
23
19
|
|
|
24
20
|
@export { conditionBlock }
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# This file demonstrates the use of main features in Devalang.
|
|
2
|
+
bpm 135
|
|
3
|
+
|
|
4
|
+
bank devaloop.808 as myBank
|
|
5
|
+
|
|
6
|
+
let entityTest1 = .myBank.kick auto
|
|
7
|
+
let entityTest2 = .myBank.clap auto
|
|
8
|
+
let entityTest3 = .myBank.snare auto
|
|
9
|
+
|
|
10
|
+
fn myFirstGroup(entity1, entity2, entity3):
|
|
11
|
+
.entity1
|
|
12
|
+
.entity2
|
|
13
|
+
.entity3
|
|
14
|
+
|
|
15
|
+
call myFirstGroup(entityTest1, entityTest2, entityTest3)
|
package/examples/group.deva
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# This file demonstrates the use of grouping in Devalang.
|
|
2
2
|
|
|
3
|
-
@import { duration, default_bank, params, loopCount, tempo } from "./
|
|
3
|
+
@import { duration, default_bank, params, loopCount, tempo } from "./variables.deva"
|
|
4
4
|
|
|
5
|
-
@load "./
|
|
6
|
-
@load "./
|
|
5
|
+
@load "./samples/kick-808.wav" as kickCustom
|
|
6
|
+
@load "./samples/hat-808.wav" as hatCustom
|
|
7
7
|
|
|
8
8
|
group myGroup:
|
|
9
9
|
.kickCustom duration params
|
package/examples/index.deva
CHANGED
|
@@ -1,16 +1,63 @@
|
|
|
1
|
-
# This file demonstrates
|
|
1
|
+
# This file demonstrates general use cases of Devalang.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
@import { myGroup } from "./examples/group.deva"
|
|
3
|
+
# BPM definition
|
|
4
|
+
bpm 125
|
|
6
5
|
|
|
6
|
+
# Bank picking (make sure you've installed it)
|
|
7
|
+
bank devaloop.808 as my808Bank
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
# Pattern literal without options
|
|
10
|
+
pattern kickPattern with my808Bank.kick = "x--- x--- x--- x---"
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
group myGroup:
|
|
13
|
+
# Rhythmic (each beat playing a kick)
|
|
14
|
+
# on beat:
|
|
15
|
+
# .my808Bank.kick 1/4
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
# Synth definition with ADSR
|
|
18
|
+
let myLead = synth sine {
|
|
19
|
+
attack: 0,
|
|
20
|
+
decay: 100,
|
|
21
|
+
sustain: 100,
|
|
22
|
+
release: 100
|
|
23
|
+
}
|
|
14
24
|
|
|
15
|
-
#
|
|
16
|
-
|
|
25
|
+
# Global automation
|
|
26
|
+
automate myLead:
|
|
27
|
+
param volume {
|
|
28
|
+
0% = 0.0
|
|
29
|
+
100% = 0.5
|
|
30
|
+
}
|
|
31
|
+
param pitch {
|
|
32
|
+
0% = -12.0
|
|
33
|
+
100% = 12.0
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# Notes in a loop with condition
|
|
37
|
+
for i in [1, 2, 3]:
|
|
38
|
+
if i == 3:
|
|
39
|
+
myLead -> note(C5, { duration: 200 })
|
|
40
|
+
print "Playing note C5 for " + i
|
|
41
|
+
|
|
42
|
+
# Pause runtime for 500ms
|
|
43
|
+
sleep 500
|
|
44
|
+
|
|
45
|
+
# Note with automation
|
|
46
|
+
myLead -> note(C4, {
|
|
47
|
+
duration: 400,
|
|
48
|
+
velocity: 0.8,
|
|
49
|
+
automate: {
|
|
50
|
+
pan: {
|
|
51
|
+
0%: -1.0,
|
|
52
|
+
100%: 0.0
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
# Notes with params
|
|
58
|
+
myLead -> note(G4, { duration: 600, glide: true, target_freq: 659.25 })
|
|
59
|
+
myLead -> note(B3, { duration: 400, slide: true, target_amp: 0.3 })
|
|
60
|
+
|
|
61
|
+
# Spawning the group & the pattern to play them in parallel
|
|
62
|
+
spawn myGroup
|
|
63
|
+
spawn kickPattern
|
package/examples/loop.deva
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
# This file demonstrates the use of
|
|
1
|
+
# This file demonstrates the use of loops in Devalang.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
group myLoop:
|
|
4
|
+
for i in [1, 2, 3]:
|
|
5
|
+
print "looping with for" + i
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
loop loopCount:
|
|
9
|
-
.kickCustom duration params
|
|
10
|
-
|
|
11
|
-
# Uncomment the next line (.hat) while executing "play" command
|
|
12
|
-
# with `--repeat` option to see magic happen !
|
|
13
|
-
|
|
14
|
-
.hatCustom duration params
|
|
7
|
+
loop 3:
|
|
8
|
+
print "looping with loop"
|
|
15
9
|
|
|
10
|
+
@export { myLoop }
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# This is an example of using a plugin in Devalang.
|
|
2
|
+
# Make sure you have the plugin installed in your Devaloop application. (devalang install plugin <author>.<plugin_name>)
|
|
3
|
+
|
|
4
|
+
@use devaloop.acid as acidPlugin
|
|
5
|
+
|
|
6
|
+
let acidSynth = synth acidPlugin.synth {
|
|
7
|
+
waveform: "saw",
|
|
8
|
+
accent: 0.1,
|
|
9
|
+
decay: 250
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
group mySynthGroup:
|
|
13
|
+
acidSynth -> note(C4, { duration: 600 })
|
|
14
|
+
acidSynth -> note(E4, { duration: 600 })
|
|
15
|
+
|
|
16
|
+
call mySynthGroup
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# This file defines a simple synth lead using Devalang's syntax.
|
|
2
|
+
|
|
3
|
+
group myLead:
|
|
4
|
+
let mySynth = synth sine
|
|
5
|
+
|
|
6
|
+
mySynth -> note(C4, { duration: 400 })
|
|
7
|
+
mySynth -> note(G4, { duration: 400 })
|
|
8
|
+
mySynth -> note(E4, { duration: 600 })
|
|
9
|
+
mySynth -> note(A4, { duration: 400 })
|
|
10
|
+
mySynth -> note(F4, { duration: 800 })
|
|
11
|
+
mySynth -> note(D4, { duration: 400 })
|
|
12
|
+
mySynth -> note(B3, { duration: 600 })
|
|
13
|
+
|
|
14
|
+
@export { myLead }
|
package/examples/variables.deva
CHANGED
package/out-tsc/bin/index.js
CHANGED
|
@@ -1,13 +1,57 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
-
var
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
6
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
37
|
const child_process_1 = require("child_process");
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
let binaryName;
|
|
40
|
+
switch (process.platform) {
|
|
41
|
+
case "win32":
|
|
42
|
+
binaryName = "devalang-x86_64-pc-windows-msvc.exe";
|
|
43
|
+
break;
|
|
44
|
+
case "darwin":
|
|
45
|
+
binaryName = "devalang-x86_64-apple-darwin";
|
|
46
|
+
break;
|
|
47
|
+
case "linux":
|
|
48
|
+
binaryName = "devalang-x86_64-unknown-linux-gnu";
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
console.error(`Unsupported platform: ${process.platform}`);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
const binaryPath = path.join(__dirname, binaryName);
|
|
11
55
|
const args = process.argv.slice(2);
|
|
12
56
|
const child = (0, child_process_1.spawn)(binaryPath, args, { stdio: "inherit" });
|
|
13
|
-
child.on("exit", (code) => process.exit(code));
|
|
57
|
+
child.on("exit", (code) => process.exit(code !== null && code !== void 0 ? code : 1));
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ParseResult } from "../types/result";
|
|
2
|
+
import { DebugResult } from "../types/result";
|
|
3
|
+
/**
|
|
4
|
+
* Parses the user code.
|
|
5
|
+
* @param entry_path The entry path for the code.
|
|
6
|
+
* @param source The source code to parse.
|
|
7
|
+
* @returns ParseResult | any
|
|
8
|
+
*/
|
|
9
|
+
export declare function parse(entry_path: string, source: string): ParseResult | any;
|
|
10
|
+
/**
|
|
11
|
+
* Renders the debug information for the user code.
|
|
12
|
+
* @param user_code The user-provided code to render debug information for.
|
|
13
|
+
* @returns DebugResult | any
|
|
14
|
+
*/
|
|
15
|
+
export declare function debug_render(user_code: string): DebugResult | any;
|
|
16
|
+
/**
|
|
17
|
+
* Renders audio from the user code.
|
|
18
|
+
* @param user_code The user-provided code to render audio from.
|
|
19
|
+
* @returns Float32Array
|
|
20
|
+
*/
|
|
21
|
+
export declare function render_audio(user_code: string): Float32Array;
|
|
22
|
+
/**
|
|
23
|
+
* Register a JS callback to receive playhead events { time, line, column } during playback.
|
|
24
|
+
* The callback will be called with a single object argument.
|
|
25
|
+
* @param cb The callback function to register.
|
|
26
|
+
* @returns void
|
|
27
|
+
*/
|
|
28
|
+
export declare function register_playhead_callback(cb: (ev: {
|
|
29
|
+
time: number;
|
|
30
|
+
line: number;
|
|
31
|
+
column: number;
|
|
32
|
+
}) => void): any;
|
|
33
|
+
/**
|
|
34
|
+
* Unregisters the JS callback for playhead events.
|
|
35
|
+
* @returns void
|
|
36
|
+
*/
|
|
37
|
+
export declare function unregister_playhead_callback(): any;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parse = parse;
|
|
4
|
+
exports.debug_render = debug_render;
|
|
5
|
+
exports.render_audio = render_audio;
|
|
6
|
+
exports.register_playhead_callback = register_playhead_callback;
|
|
7
|
+
exports.unregister_playhead_callback = unregister_playhead_callback;
|
|
8
|
+
let wasmPkg = undefined;
|
|
9
|
+
try {
|
|
10
|
+
// prefer runtime pkg generated by wasm-pack when available
|
|
11
|
+
// require at runtime so the package can be used even if wasm hasn't been built
|
|
12
|
+
// (this keeps tests and consumers robust).
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
14
|
+
wasmPkg = require("../../pkg/devalang_core");
|
|
15
|
+
}
|
|
16
|
+
catch (_e) {
|
|
17
|
+
wasmPkg = undefined;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parses the user code.
|
|
21
|
+
* @param entry_path The entry path for the code.
|
|
22
|
+
* @param source The source code to parse.
|
|
23
|
+
* @returns ParseResult | any
|
|
24
|
+
*/
|
|
25
|
+
function parse(entry_path, source) {
|
|
26
|
+
if (wasmPkg && typeof wasmPkg.parse === "function") {
|
|
27
|
+
return wasmPkg.parse(entry_path, source);
|
|
28
|
+
}
|
|
29
|
+
throw new Error("WASM binding 'parse' not available. Build the wasm package or use the JS runtime.");
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Renders the debug information for the user code.
|
|
33
|
+
* @param user_code The user-provided code to render debug information for.
|
|
34
|
+
* @returns DebugResult | any
|
|
35
|
+
*/
|
|
36
|
+
function debug_render(user_code) {
|
|
37
|
+
if (wasmPkg && typeof wasmPkg.debug_render === "function") {
|
|
38
|
+
return wasmPkg.debug_render(user_code);
|
|
39
|
+
}
|
|
40
|
+
throw new Error("WASM binding 'debug_render' not available. Build the wasm package or use the JS runtime.");
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Renders audio from the user code.
|
|
44
|
+
* @param user_code The user-provided code to render audio from.
|
|
45
|
+
* @returns Float32Array
|
|
46
|
+
*/
|
|
47
|
+
function render_audio(user_code) {
|
|
48
|
+
if (wasmPkg && typeof wasmPkg.render_audio === "function") {
|
|
49
|
+
return wasmPkg.render_audio(user_code);
|
|
50
|
+
}
|
|
51
|
+
// Fallback: indicate missing wasm with an empty buffer rather than breaking consumers.
|
|
52
|
+
return new Float32Array(0);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Register a JS callback to receive playhead events { time, line, column } during playback.
|
|
56
|
+
* The callback will be called with a single object argument.
|
|
57
|
+
* @param cb The callback function to register.
|
|
58
|
+
* @returns void
|
|
59
|
+
*/
|
|
60
|
+
function register_playhead_callback(cb) {
|
|
61
|
+
if (wasmPkg && typeof wasmPkg.register_playhead_callback === "function") {
|
|
62
|
+
return wasmPkg.register_playhead_callback(cb);
|
|
63
|
+
}
|
|
64
|
+
// no-op fallback
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Unregisters the JS callback for playhead events.
|
|
69
|
+
* @returns void
|
|
70
|
+
*/
|
|
71
|
+
function unregister_playhead_callback() {
|
|
72
|
+
if (wasmPkg && typeof wasmPkg.unregister_playhead_callback === "function") {
|
|
73
|
+
return wasmPkg.unregister_playhead_callback();
|
|
74
|
+
}
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
/**
|
|
18
|
+
* Core functionality for the Devalang language.
|
|
19
|
+
* This module exports all the core types and functions used in the language.
|
|
20
|
+
*/
|
|
21
|
+
__exportStar(require("./types/index"), exports);
|
|
22
|
+
__exportStar(require("./functions/index"), exports);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./result"), exports);
|
|
18
|
+
__exportStar(require("./statement"), exports);
|
|
19
|
+
__exportStar(require("./value"), exports);
|
|
20
|
+
__exportStar(require("./plugin"), exports);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a plugin export.
|
|
3
|
+
*/
|
|
4
|
+
export interface PluginExport {
|
|
5
|
+
name: string;
|
|
6
|
+
kind: string;
|
|
7
|
+
default?: any;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Represents a plugin.
|
|
11
|
+
*/
|
|
12
|
+
export interface PluginInfo {
|
|
13
|
+
author: string;
|
|
14
|
+
name: string;
|
|
15
|
+
version?: string;
|
|
16
|
+
description?: string;
|
|
17
|
+
exports: PluginExport[];
|
|
18
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents an error that occurred during parsing.
|
|
3
|
+
*/
|
|
4
|
+
export interface ErrorResult {
|
|
5
|
+
message: string;
|
|
6
|
+
line: number;
|
|
7
|
+
column: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Represents the result of parsing user code.
|
|
11
|
+
*/
|
|
12
|
+
export interface ParseResult {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
ast: string;
|
|
15
|
+
errors: ErrorResult[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Represents the result of debugging user code.
|
|
19
|
+
*/
|
|
20
|
+
export interface DebugResult {
|
|
21
|
+
samples_len: number;
|
|
22
|
+
any_nonzero: boolean;
|
|
23
|
+
ast: string;
|
|
24
|
+
note_count: number;
|
|
25
|
+
global_vars: string[];
|
|
26
|
+
statements_count: number;
|
|
27
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Value, Duration } from "./value";
|
|
2
|
+
/**
|
|
3
|
+
* Represents a statement kind in the code.
|
|
4
|
+
*/
|
|
5
|
+
export type StatementKind = {
|
|
6
|
+
kind: "Tempo";
|
|
7
|
+
} | {
|
|
8
|
+
kind: "Bank";
|
|
9
|
+
alias?: string;
|
|
10
|
+
} | {
|
|
11
|
+
kind: "Print";
|
|
12
|
+
} | {
|
|
13
|
+
kind: "Load";
|
|
14
|
+
source: string;
|
|
15
|
+
alias: string;
|
|
16
|
+
} | {
|
|
17
|
+
kind: "Use";
|
|
18
|
+
name: string;
|
|
19
|
+
alias?: string;
|
|
20
|
+
} | {
|
|
21
|
+
kind: "Let";
|
|
22
|
+
name: string;
|
|
23
|
+
} | {
|
|
24
|
+
kind: "Automate";
|
|
25
|
+
target: string;
|
|
26
|
+
} | {
|
|
27
|
+
kind: "ArrowCall";
|
|
28
|
+
target: string;
|
|
29
|
+
method: string;
|
|
30
|
+
args: Value[];
|
|
31
|
+
} | {
|
|
32
|
+
kind: "Function";
|
|
33
|
+
name: string;
|
|
34
|
+
parameters: string[];
|
|
35
|
+
body: Statement[];
|
|
36
|
+
} | {
|
|
37
|
+
kind: "Synth";
|
|
38
|
+
} | {
|
|
39
|
+
kind: "Trigger";
|
|
40
|
+
entity: string;
|
|
41
|
+
duration: Duration;
|
|
42
|
+
effects?: Value;
|
|
43
|
+
} | {
|
|
44
|
+
kind: "Sleep";
|
|
45
|
+
} | {
|
|
46
|
+
kind: "Call";
|
|
47
|
+
name: string;
|
|
48
|
+
args: Value[];
|
|
49
|
+
} | {
|
|
50
|
+
kind: "Spawn";
|
|
51
|
+
name: string;
|
|
52
|
+
args: Value[];
|
|
53
|
+
} | {
|
|
54
|
+
kind: "Loop";
|
|
55
|
+
} | {
|
|
56
|
+
kind: "Group";
|
|
57
|
+
} | {
|
|
58
|
+
kind: "Include";
|
|
59
|
+
path: string;
|
|
60
|
+
} | {
|
|
61
|
+
kind: "Export";
|
|
62
|
+
names: string[];
|
|
63
|
+
source: string;
|
|
64
|
+
} | {
|
|
65
|
+
kind: "Import";
|
|
66
|
+
names: string[];
|
|
67
|
+
source: string;
|
|
68
|
+
} | {
|
|
69
|
+
kind: "If";
|
|
70
|
+
} | {
|
|
71
|
+
kind: "Else";
|
|
72
|
+
} | {
|
|
73
|
+
kind: "ElseIf";
|
|
74
|
+
} | {
|
|
75
|
+
kind: "Comment";
|
|
76
|
+
} | {
|
|
77
|
+
kind: "Indent";
|
|
78
|
+
} | {
|
|
79
|
+
kind: "Dedent";
|
|
80
|
+
} | {
|
|
81
|
+
kind: "NewLine";
|
|
82
|
+
} | {
|
|
83
|
+
kind: "On";
|
|
84
|
+
event: string;
|
|
85
|
+
args?: Value[];
|
|
86
|
+
body: Statement[];
|
|
87
|
+
} | {
|
|
88
|
+
kind: "Emit";
|
|
89
|
+
event: string;
|
|
90
|
+
payload?: Value;
|
|
91
|
+
} | {
|
|
92
|
+
kind: "Unknown";
|
|
93
|
+
} | {
|
|
94
|
+
kind: "Error";
|
|
95
|
+
message: string;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Represents a statement in the code.
|
|
99
|
+
*/
|
|
100
|
+
export interface Statement {
|
|
101
|
+
kind: StatementKind;
|
|
102
|
+
value: Value;
|
|
103
|
+
indent: number;
|
|
104
|
+
line: number;
|
|
105
|
+
column: number;
|
|
106
|
+
}
|