@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.
Files changed (277) hide show
  1. package/.cargo/config.toml +2 -0
  2. package/.devalang +10 -4
  3. package/.github/workflows/ci.yml +103 -0
  4. package/Cargo.toml +80 -48
  5. package/README.md +135 -158
  6. package/docs/CHANGELOG.md +413 -1
  7. package/docs/CONTRIBUTING.md +101 -0
  8. package/docs/ROADMAP.md +10 -7
  9. package/docs/TODO.md +21 -9
  10. package/examples/automation.deva +42 -0
  11. package/examples/bank.deva +7 -0
  12. package/examples/condition.deva +8 -12
  13. package/examples/duration.deva +9 -0
  14. package/examples/events.deva +12 -0
  15. package/examples/function.deva +15 -0
  16. package/examples/group.deva +3 -3
  17. package/examples/index.deva +57 -10
  18. package/examples/loop.deva +7 -12
  19. package/examples/pattern.deva +8 -0
  20. package/examples/plugin.deva +16 -0
  21. package/examples/synth.deva +14 -0
  22. package/examples/variables.deva +2 -2
  23. package/out-tsc/bin/index.d.ts +2 -0
  24. package/out-tsc/bin/index.js +51 -7
  25. package/out-tsc/core/functions/index.d.ts +37 -0
  26. package/out-tsc/core/functions/index.js +76 -0
  27. package/out-tsc/core/index.d.ts +6 -0
  28. package/out-tsc/core/index.js +22 -0
  29. package/out-tsc/core/types/index.d.ts +4 -0
  30. package/out-tsc/core/types/index.js +20 -0
  31. package/out-tsc/core/types/plugin.d.ts +18 -0
  32. package/out-tsc/core/types/plugin.js +2 -0
  33. package/out-tsc/core/types/result.d.ts +27 -0
  34. package/out-tsc/core/types/result.js +2 -0
  35. package/out-tsc/core/types/statement.d.ts +106 -0
  36. package/out-tsc/core/types/statement.js +2 -0
  37. package/out-tsc/core/types/value.d.ts +43 -0
  38. package/out-tsc/core/types/value.js +2 -0
  39. package/out-tsc/index.d.ts +7 -0
  40. package/out-tsc/index.js +42 -1
  41. package/out-tsc/pkg/devalang_core.d.ts +13 -0
  42. package/out-tsc/pkg/devalang_core.js +50 -0
  43. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +33 -0
  44. package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
  45. package/out-tsc/scripts/copy-wasm-dts.js +73 -0
  46. package/out-tsc/scripts/postinstall.d.ts +1 -0
  47. package/out-tsc/scripts/postinstall.js +83 -0
  48. package/out-tsc/scripts/version/bump.d.ts +1 -0
  49. package/out-tsc/scripts/version/fetch.d.ts +1 -0
  50. package/out-tsc/scripts/version/fetch.js +1 -5
  51. package/out-tsc/scripts/version/index.d.ts +1 -0
  52. package/out-tsc/scripts/version/sync.d.ts +1 -0
  53. package/package.json +28 -7
  54. package/project-version.json +4 -4
  55. package/rust/cli/bank/api.rs +122 -0
  56. package/rust/cli/bank/commands.rs +275 -0
  57. package/rust/cli/bank/mod.rs +29 -0
  58. package/rust/cli/build/commands.rs +103 -0
  59. package/rust/cli/build/mod.rs +2 -0
  60. package/rust/cli/build/process.rs +146 -0
  61. package/rust/cli/check/mod.rs +208 -0
  62. package/rust/cli/discover/commands.rs +253 -0
  63. package/rust/cli/discover/config.rs +111 -0
  64. package/rust/cli/discover/fs.rs +19 -0
  65. package/rust/cli/discover/install.rs +103 -0
  66. package/rust/cli/discover/metadata.rs +48 -0
  67. package/rust/cli/discover/mod.rs +5 -0
  68. package/rust/cli/{init.rs → init/commands.rs} +32 -23
  69. package/rust/cli/init/mod.rs +1 -0
  70. package/rust/cli/install/addon.rs +118 -0
  71. package/rust/cli/install/bank.rs +53 -0
  72. package/rust/cli/install/commands.rs +35 -0
  73. package/rust/cli/install/mod.rs +4 -0
  74. package/rust/cli/install/plugin.rs +61 -0
  75. package/rust/cli/login/commands.rs +124 -0
  76. package/rust/cli/login/mod.rs +1 -0
  77. package/rust/cli/mod.rs +12 -205
  78. package/rust/cli/parser.rs +314 -0
  79. package/rust/cli/play/commands.rs +324 -0
  80. package/rust/cli/play/io.rs +17 -0
  81. package/rust/cli/play/mod.rs +5 -0
  82. package/rust/cli/play/process.rs +150 -0
  83. package/rust/cli/play/realtime.rs +91 -0
  84. package/rust/cli/play/utils.rs +23 -0
  85. package/rust/cli/telemetry/commands.rs +22 -0
  86. package/rust/cli/telemetry/event_creator.rs +80 -0
  87. package/rust/cli/telemetry/mod.rs +3 -0
  88. package/rust/cli/telemetry/send.rs +51 -0
  89. package/rust/cli/{template.rs → template/commands.rs} +69 -57
  90. package/rust/cli/template/mod.rs +1 -0
  91. package/rust/cli/update/commands.rs +6 -0
  92. package/rust/cli/update/mod.rs +1 -0
  93. package/rust/config/driver.rs +103 -0
  94. package/rust/config/mod.rs +3 -16
  95. package/rust/config/ops.rs +26 -0
  96. package/rust/config/settings.rs +101 -0
  97. package/rust/core/audio/engine/helpers.rs +170 -0
  98. package/rust/core/audio/engine/mod.rs +7 -0
  99. package/rust/core/audio/engine/sample.rs +366 -0
  100. package/rust/core/audio/engine/synth.rs +325 -0
  101. package/rust/core/audio/evaluator.rs +310 -31
  102. package/rust/core/audio/interpreter/arrow_call.rs +311 -0
  103. package/rust/core/audio/interpreter/automate.rs +18 -0
  104. package/rust/core/audio/interpreter/call.rs +294 -42
  105. package/rust/core/audio/interpreter/condition.rs +71 -65
  106. package/rust/core/audio/interpreter/driver.rs +542 -204
  107. package/rust/core/audio/interpreter/function.rs +26 -0
  108. package/rust/core/audio/interpreter/let_.rs +38 -19
  109. package/rust/core/audio/interpreter/load.rs +19 -18
  110. package/rust/core/audio/interpreter/loop_.rs +114 -59
  111. package/rust/core/audio/interpreter/mod.rs +14 -11
  112. package/rust/core/audio/interpreter/sleep.rs +28 -36
  113. package/rust/core/audio/interpreter/spawn.rs +252 -65
  114. package/rust/core/audio/interpreter/tempo.rs +40 -16
  115. package/rust/core/audio/interpreter/trigger.rs +239 -69
  116. package/rust/core/audio/loader/mod.rs +1 -1
  117. package/rust/core/audio/loader/trigger.rs +97 -52
  118. package/rust/core/audio/mod.rs +7 -6
  119. package/rust/core/audio/player.rs +70 -54
  120. package/rust/core/audio/renderer.rs +54 -57
  121. package/rust/core/audio/special/easing.rs +189 -0
  122. package/rust/core/audio/special/env.rs +45 -0
  123. package/rust/core/audio/special/math.rs +134 -0
  124. package/rust/core/audio/special/mod.rs +9 -0
  125. package/rust/core/audio/special/modulator.rs +143 -0
  126. package/rust/core/builder/mod.rs +86 -80
  127. package/rust/core/debugger/lexer.rs +27 -27
  128. package/rust/core/debugger/mod.rs +30 -21
  129. package/rust/core/debugger/module.rs +55 -0
  130. package/rust/core/debugger/preprocessor.rs +27 -27
  131. package/rust/core/debugger/store.rs +40 -25
  132. package/rust/core/error/mod.rs +269 -60
  133. package/rust/core/lexer/driver.rs +61 -0
  134. package/rust/core/lexer/handler/arrow.rs +82 -0
  135. package/rust/core/lexer/handler/at.rs +21 -21
  136. package/rust/core/lexer/handler/brace.rs +41 -41
  137. package/rust/core/lexer/handler/colon.rs +21 -21
  138. package/rust/core/lexer/handler/comment.rs +30 -30
  139. package/rust/core/lexer/handler/dot.rs +21 -21
  140. package/rust/core/lexer/handler/driver.rs +337 -215
  141. package/rust/core/lexer/handler/identifier.rs +47 -40
  142. package/rust/core/lexer/handler/indent.rs +66 -52
  143. package/rust/core/lexer/handler/mod.rs +15 -13
  144. package/rust/core/lexer/handler/newline.rs +23 -23
  145. package/rust/core/lexer/handler/number.rs +31 -31
  146. package/rust/core/lexer/handler/operator.rs +46 -44
  147. package/rust/core/lexer/handler/parenthesis.rs +41 -0
  148. package/rust/core/lexer/handler/slash.rs +21 -0
  149. package/rust/core/lexer/handler/string.rs +63 -63
  150. package/rust/core/lexer/mod.rs +3 -30
  151. package/rust/core/lexer/token.rs +21 -12
  152. package/rust/core/mod.rs +10 -10
  153. package/rust/core/parser/driver.rs +584 -312
  154. package/rust/core/parser/handler/arrow_call.rs +253 -0
  155. package/rust/core/parser/handler/at.rs +279 -162
  156. package/rust/core/parser/handler/bank.rs +104 -41
  157. package/rust/core/parser/handler/condition.rs +83 -74
  158. package/rust/core/parser/handler/dot.rs +148 -112
  159. package/rust/core/parser/handler/identifier/automate.rs +254 -0
  160. package/rust/core/parser/handler/identifier/call.rs +91 -0
  161. package/rust/core/parser/handler/identifier/emit.rs +70 -0
  162. package/rust/core/parser/handler/identifier/function.rs +113 -0
  163. package/rust/core/parser/handler/identifier/group.rs +89 -0
  164. package/rust/core/parser/handler/identifier/let_.rs +173 -0
  165. package/rust/core/parser/handler/identifier/mod.rs +55 -0
  166. package/rust/core/parser/handler/identifier/on.rs +107 -0
  167. package/rust/core/parser/handler/identifier/print.rs +49 -0
  168. package/rust/core/parser/handler/identifier/sleep.rs +43 -0
  169. package/rust/core/parser/handler/identifier/spawn.rs +91 -0
  170. package/rust/core/parser/handler/identifier/synth.rs +135 -0
  171. package/rust/core/parser/handler/loop_.rs +194 -66
  172. package/rust/core/parser/handler/mod.rs +9 -7
  173. package/rust/core/parser/handler/pattern.rs +74 -0
  174. package/rust/core/parser/handler/tempo.rs +57 -47
  175. package/rust/core/parser/mod.rs +3 -4
  176. package/rust/core/parser/statement.rs +11 -88
  177. package/rust/core/plugin/loader.rs +137 -0
  178. package/rust/core/plugin/mod.rs +2 -0
  179. package/rust/core/plugin/runner.rs +347 -0
  180. package/rust/core/preprocessor/loader.rs +637 -179
  181. package/rust/core/preprocessor/mod.rs +4 -4
  182. package/rust/core/preprocessor/module.rs +60 -53
  183. package/rust/core/preprocessor/processor.rs +114 -67
  184. package/rust/core/preprocessor/resolver/bank.rs +49 -47
  185. package/rust/core/preprocessor/resolver/call.rs +124 -53
  186. package/rust/core/preprocessor/resolver/condition.rs +95 -66
  187. package/rust/core/preprocessor/resolver/driver.rs +324 -182
  188. package/rust/core/preprocessor/resolver/function.rs +69 -0
  189. package/rust/core/preprocessor/resolver/group.rs +94 -118
  190. package/rust/core/preprocessor/resolver/let_.rs +32 -0
  191. package/rust/core/preprocessor/resolver/loop_.rs +318 -145
  192. package/rust/core/preprocessor/resolver/mod.rs +16 -10
  193. package/rust/core/preprocessor/resolver/pattern.rs +83 -0
  194. package/rust/core/preprocessor/resolver/spawn.rs +99 -53
  195. package/rust/core/preprocessor/resolver/synth.rs +54 -0
  196. package/rust/core/preprocessor/resolver/tempo.rs +48 -49
  197. package/rust/core/preprocessor/resolver/trigger.rs +116 -111
  198. package/rust/core/preprocessor/resolver/value.rs +176 -0
  199. package/rust/core/store/export.rs +28 -28
  200. package/rust/core/store/function.rs +40 -0
  201. package/rust/core/store/global.rs +61 -39
  202. package/rust/core/store/import.rs +28 -28
  203. package/rust/core/store/mod.rs +5 -4
  204. package/rust/core/store/variable.rs +51 -28
  205. package/rust/core/utils/mod.rs +1 -2
  206. package/rust/core/utils/path.rs +37 -46
  207. package/rust/lib.rs +308 -117
  208. package/rust/main.rs +364 -65
  209. package/rust/types/Cargo.toml +11 -0
  210. package/rust/types/src/addons.rs +55 -0
  211. package/rust/types/src/ast.rs +202 -0
  212. package/rust/types/src/config.rs +74 -0
  213. package/rust/types/src/lib.rs +12 -0
  214. package/rust/types/src/telemetry.rs +85 -0
  215. package/rust/utils/Cargo.toml +26 -0
  216. package/rust/utils/src/error.rs +186 -0
  217. package/rust/utils/src/file.rs +94 -0
  218. package/rust/utils/src/first_usage.rs +97 -0
  219. package/rust/utils/{mod.rs → src/lib.rs} +9 -6
  220. package/rust/utils/{logger.rs → src/logger.rs} +200 -123
  221. package/rust/utils/src/path.rs +88 -0
  222. package/rust/utils/src/signature.rs +41 -0
  223. package/rust/utils/{spinner.rs → src/spinner.rs} +20 -21
  224. package/rust/utils/src/version.rs +27 -0
  225. package/rust/utils/{watcher.rs → src/watcher.rs} +46 -33
  226. package/rust/web/api.rs +5 -0
  227. package/rust/web/cdn.rs +34 -0
  228. package/rust/web/mod.rs +3 -0
  229. package/rust/web/sso.rs +5 -0
  230. package/templates/minimal/README.md +143 -127
  231. package/templates/welcome/README.md +143 -127
  232. package/templates/welcome/src/index.deva +56 -8
  233. package/templates/welcome/src/variables.deva +2 -4
  234. package/tests/integration.rs +21 -0
  235. package/tests/rust/cli_check_build.rs +21 -0
  236. package/tests/rust/cli_help.rs +12 -0
  237. package/tests/rust/cli_template_list.rs +10 -0
  238. package/tests/rust/cli_version.rs +11 -0
  239. package/tests/typescript/index.spec.ts +136 -0
  240. package/tests/typescript/playhead.spec.ts +36 -0
  241. package/tests/typescript/render_e2e.spec.ts +77 -0
  242. package/tsconfig.json +12 -10
  243. package/typescript/bin/index.ts +19 -5
  244. package/typescript/core/functions/index.ts +83 -0
  245. package/typescript/core/index.ts +6 -0
  246. package/typescript/core/types/index.ts +4 -0
  247. package/typescript/core/types/plugin.ts +19 -0
  248. package/typescript/core/types/result.ts +29 -0
  249. package/typescript/core/types/statement.ts +47 -0
  250. package/typescript/core/types/value.ts +29 -0
  251. package/typescript/index.ts +8 -1
  252. package/typescript/pkg/devalang_core.d.ts +4 -0
  253. package/typescript/pkg/devalang_core.ts +49 -0
  254. package/typescript/scripts/copy-wasm-dts.ts +41 -0
  255. package/typescript/scripts/postinstall.ts +85 -0
  256. package/typescript/scripts/version/bump.ts +0 -1
  257. package/typescript/scripts/version/fetch.ts +1 -6
  258. package/typescript/scripts/version/index.ts +0 -1
  259. package/docs/COMMANDS.md +0 -85
  260. package/docs/CONFIG.md +0 -30
  261. package/docs/SYNTAX.md +0 -210
  262. package/out-tsc/bin/devalang.exe +0 -0
  263. package/out-tsc/scripts/postbuild.js +0 -11
  264. package/rust/cli/build.rs +0 -137
  265. package/rust/cli/check.rs +0 -117
  266. package/rust/cli/play.rs +0 -193
  267. package/rust/config/loader.rs +0 -13
  268. package/rust/core/audio/engine.rs +0 -126
  269. package/rust/core/parser/handler/identifier.rs +0 -262
  270. package/rust/core/shared/duration.rs +0 -8
  271. package/rust/core/shared/mod.rs +0 -2
  272. package/rust/core/shared/value.rs +0 -18
  273. package/rust/core/utils/validation.rs +0 -35
  274. package/rust/utils/file.rs +0 -35
  275. package/rust/utils/signature.rs +0 -17
  276. package/rust/utils/version.rs +0 -15
  277. package/typescript/scripts/postbuild.ts +0 -8
@@ -0,0 +1,2 @@
1
+ [target.wasm32-unknown-unknown]
2
+ rustflags = ["--cfg", "getrandom_backend=\"wasm_js\""]
package/.devalang CHANGED
@@ -1,4 +1,10 @@
1
- [defaults]
2
- entry = "./examples"
3
- output = "./output"
4
- watch = false
1
+ [defaults]
2
+ entry = "./examples"
3
+ output = "./output"
4
+ watch = false
5
+ debug = true
6
+ compress = true
7
+
8
+ [[banks]]
9
+ path = "devalang://bank/devaloop.808"
10
+ version = "0.0.1"
@@ -0,0 +1,103 @@
1
+ name: CI & Release
2
+
3
+ permissions:
4
+ contents: write
5
+
6
+ on:
7
+ push:
8
+ tags:
9
+ - "v*"
10
+
11
+ jobs:
12
+ build:
13
+ name: Build binaries
14
+ runs-on: ${{ matrix.os }}
15
+ strategy:
16
+ matrix:
17
+ include:
18
+ - os: ubuntu-latest
19
+ target: x86_64-unknown-linux-gnu
20
+ bin_ext: ""
21
+ - os: macos-latest
22
+ target: x86_64-apple-darwin
23
+ bin_ext: ""
24
+ - os: windows-latest
25
+ target: x86_64-pc-windows-msvc
26
+ bin_ext: ".exe"
27
+
28
+ steps:
29
+ - name: Checkout sources
30
+ uses: actions/checkout@v4
31
+
32
+ - name: Install ALSA (Linux)
33
+ if: matrix.os == 'ubuntu-latest'
34
+ run: |
35
+ sudo apt-get update
36
+ sudo apt-get install -y libasound2-dev pkg-config
37
+
38
+ - name: Install Node.js
39
+ uses: actions/setup-node@v4
40
+ with:
41
+ node-version: 20
42
+
43
+ - name: Install Rust
44
+ uses: actions-rs/toolchain@v1
45
+ with:
46
+ toolchain: stable
47
+ override: true
48
+ target: ${{ matrix.target }}
49
+
50
+ - name: NPM Install
51
+ run: npm install
52
+
53
+ - name: Build TS
54
+ run: npx tsc
55
+
56
+ - name: Build release
57
+ run: cargo build --release --target ${{ matrix.target }}
58
+
59
+ - name: Ensure out-tsc/bin exists (Unix)
60
+ if: runner.os != 'Windows'
61
+ run: mkdir -p out-tsc/bin
62
+
63
+ - name: Ensure out-tsc/bin exists (Windows)
64
+ if: runner.os == 'Windows'
65
+ shell: pwsh
66
+ run: |
67
+ New-Item -ItemType Directory -Force out-tsc/bin | Out-Null
68
+
69
+ - name: Copy binary (Unix)
70
+ if: runner.os != 'Windows'
71
+ run: cp target/${{ matrix.target }}/release/devalang${{ matrix.bin_ext }} out-tsc/bin/devalang-${{ matrix.target }}${{ matrix.bin_ext }}
72
+
73
+ - name: Copy binary (Windows)
74
+ if: runner.os == 'Windows'
75
+ shell: pwsh
76
+ run: |
77
+ Copy-Item "target\${{ matrix.target }}\release\devalang${{ matrix.bin_ext }}" "out-tsc\bin\devalang-${{ matrix.target }}${{ matrix.bin_ext }}" -Force
78
+
79
+ - name: Upload artifact (CI)
80
+ uses: actions/upload-artifact@v4
81
+ with:
82
+ name: devalang-${{ matrix.target }}
83
+ path: out-tsc/bin/*
84
+
85
+ release:
86
+ name: Create GitHub Release
87
+ runs-on: ubuntu-latest
88
+ needs: build
89
+ steps:
90
+ - name: Download all build artifacts
91
+ uses: actions/download-artifact@v4
92
+ with:
93
+ path: dist
94
+ pattern: devalang-*
95
+ merge-multiple: true
96
+
97
+ - name: List files
98
+ run: ls -la dist
99
+
100
+ - name: Upload to GitHub Release
101
+ uses: softprops/action-gh-release@v2
102
+ with:
103
+ files: dist/*
package/Cargo.toml CHANGED
@@ -1,48 +1,80 @@
1
- [package]
2
- name = "devalang"
3
- version = "0.0.1-alpha.8"
4
- authors = ["Devaloop <contact@devaloop.com>"]
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
- license = "MIT"
7
- repository = "https://github.com/devaloop-labs/devalang"
8
- keywords = ["music", "dsl", "audio", "cli"]
9
- categories = ["command-line-utilities", "development-tools", "parser-implementations"]
10
- readme = "README.md"
11
- homepage = "https://devalang.com"
12
- documentation = "https://docs.devalang.com/"
13
- license-file = "LICENSE"
14
- edition = "2024"
15
-
16
- [[bin]]
17
- name = "devalang"
18
- path = "rust/main.rs"
19
- required-features = ["cli"]
20
-
21
- [lib]
22
- path = "rust/lib.rs"
23
- crate-type = ["cdylib"]
24
-
25
- [profile.release]
26
- opt-level = "s"
27
-
28
- [features]
29
- default = ["cli"]
30
- cli = ["crossterm", "indicatif", "inquire"]
31
-
32
- [dependencies]
33
- clap = { version = "4.5", features = ["derive"] }
34
- serde = { version = "1.0", features = ["derive"] }
35
- serde_json = "1.0"
36
- rodio = "0.17"
37
- hound = "3.4.0"
38
- toml = "0.8"
39
- notify = "6.1"
40
- fs_extra = "1.3"
41
- include_dir = "0.7"
42
- wasm-bindgen = "0.2"
43
- serde-wasm-bindgen = "0.4"
44
- nom_locate = "4.0.0"
45
- chrono = "0.4"
46
- crossterm = { version = "0.27", optional = true }
47
- indicatif = { version = "0.17", optional = true }
48
- inquire = { version = "0.7.5", optional = true }
1
+ [package]
2
+ name = "devalang"
3
+ version = "0.0.1-beta.1"
4
+ authors = ["Devaloop <contact@devaloop.com>"]
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
+ license = "MIT"
7
+ repository = "https://github.com/devaloop-labs/devalang"
8
+ keywords = ["music", "dsl", "audio", "cli"]
9
+ categories = ["command-line-utilities", "development-tools", "parser-implementations"]
10
+ readme = "README.md"
11
+ homepage = "https://devalang.com"
12
+ documentation = "https://docs.devalang.com/"
13
+ edition = "2024"
14
+
15
+ [[bin]]
16
+ name = "devalang"
17
+ path = "rust/main.rs"
18
+
19
+ [lib]
20
+ name = "devalang_core"
21
+ path = "rust/lib.rs"
22
+ crate-type = ["cdylib", "rlib"]
23
+
24
+ [profile.release]
25
+ opt-level = "s"
26
+
27
+ [features]
28
+ default = ["cli"]
29
+ cli = ["crossterm", "indicatif", "inquire", "zip", "reqwest", "flate2", "tokio"]
30
+
31
+ [dependencies]
32
+ devalang_types = { path = "rust/types", version = "0.0.2" }
33
+ clap = { version = "4.5", features = ["derive"] }
34
+ serde = { version = "1.0", features = ["derive"] }
35
+ serde_json = "1.0"
36
+ rodio = "0.17"
37
+ hound = "3.4.0"
38
+ toml = "0.8"
39
+ notify = "6.1"
40
+ fs_extra = "1.3"
41
+ include_dir = "0.7"
42
+ wasm-bindgen = "0.2"
43
+ serde-wasm-bindgen = "0.4"
44
+ nom_locate = "4.0.0"
45
+ chrono = "0.4"
46
+ crossterm = { version = "0.27", optional = true }
47
+ indicatif = { version = "0.17", optional = true }
48
+ inquire = { version = "0.7.5", optional = true }
49
+ js-sys = "0.3"
50
+ getrandom = { version = "0.3", features = ["wasm_js"] }
51
+ reqwest = { version = "0.12.22", optional = true, features = ["json"] }
52
+ flate2 = { version = "1.0", optional = true }
53
+ tokio = { version = "1", features = ["full"], optional = true }
54
+ zip = { version = "4.3.0", optional = true }
55
+ rayon = "1.10.0"
56
+ webbrowser = "0.8"
57
+ tiny_http = "0.9.0"
58
+ dirs = "5"
59
+ urlencoding = "2.1"
60
+ uuid = { version = "1.18.0", features = ["v4"] }
61
+ console_error_panic_hook = "0.1.7"
62
+
63
+ [dev-dependencies]
64
+ assert_cmd = "2"
65
+ predicates = "2"
66
+ tempfile = "3"
67
+
68
+ # For wasm32, enable wasm-friendly randomness backends and avoid
69
+ # pulling in native-only CLI dependencies.
70
+ [target.'cfg(target_arch = "wasm32")'.dependencies]
71
+ getrandom = { version = "0.3", features = ["wasm_js"] }
72
+ uuid = { version = "1.18.0", features = ["v4", "js", "rng-getrandom"] }
73
+ # Keep a lightweight linkage to the utils crate for wasm builds without
74
+ # enabling native CLI features.
75
+ devalang_utils = { path = "rust/utils", default-features = false, version = "0.0.1" }
76
+
77
+ # devalang_utils with CLI and wasmtime are only needed for native targets.
78
+ [target.'cfg(not(target_arch = "wasm32"))'.dependencies]
79
+ devalang_utils = { path = "rust/utils", features = ["cli"], version = "0.0.1" }
80
+ wasmtime = "19"
package/README.md CHANGED
@@ -1,231 +1,204 @@
1
1
  <div align="center">
2
- <img src="https://firebasestorage.googleapis.com/v0/b/devaloop-labs.firebasestorage.app/o/devalang-teal-logo.svg?alt=media&token=d2a5705a-1eba-4b49-88e6-895a761fb7f7" alt="Devalang Logo">
2
+ <img src="https://devalang.com/images/devalang-logo-min.png" alt="Devalang Logo" width="100" />
3
3
  </div>
4
4
 
5
5
  ![Rust](https://img.shields.io/badge/Made%20with-Rust-orange?logo=rust)
6
6
  ![TypeScript](https://img.shields.io/badge/Built%20with-TypeScript-blue?logo=typescript)
7
7
  ![Node.js](https://img.shields.io/badge/Node.js-18%2B-brightgreen?logo=node.js)
8
8
 
9
- ![Project Status](https://img.shields.io/badge/status-alpha-red)
10
- ![Version](https://img.shields.io/badge/version-0.0.1-blue)
9
+ ![Project Status](https://img.shields.io/badge/status-beta-blue)
10
+ ![Version](https://img.shields.io/npm/v/@devaloop/devalang)
11
11
  ![License: MIT](https://img.shields.io/badge/license-MIT-green)
12
- ![Platform](https://img.shields.io/badge/platform-Windows-blue)
12
+
13
+ ![Linux](https://img.shields.io/badge/linux-supported-blue?logo=linux)
14
+ ![macOS](https://img.shields.io/badge/macOS-supported-blue?logo=apple)
15
+ ![Windows](https://img.shields.io/badge/windows-supported-blue?logo=windows)
13
16
 
14
17
  ![npm](https://img.shields.io/npm/dt/@devaloop/devalang)
15
18
  ![crates](https://img.shields.io/crates/d/devalang)
16
19
 
17
- [![VSCode Extension](https://img.shields.io/visual-studio-marketplace/v/devaloop.devalang-vscode?label=VSCode%20Extension)](https://marketplace.visualstudio.com/items?itemName=devaloop.devalang-vscode)
18
-
19
- ## 🎼 Devalang, by **Devaloop Labs**
20
+ ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/devaloop-labs/devalang/.github/workflows/ci.yml)
20
21
 
21
- 🎶 Compose music with code structured, expressive, and fast.
22
+ # 🦊 Devalang (CORE)Compose music with code
22
23
 
23
24
  Devalang is a tiny domain-specific language (DSL) for music makers, sound designers, and audio hackers.
24
25
  Compose loops, control samples, render and play audio — all in clean, readable text.
25
26
 
26
- 🦊 Whether you're building a track, shaping textures, or performing live, Devalang helps you think in rhythms. It’s designed to be simple, expressive, and fast — because your ideas shouldn’t wait.
27
+ Whether you're building a track, shaping textures, or performing live, Devalang helps you think in rhythms. It’s designed to be simple, expressive, and fast — because your ideas shouldn’t wait.
27
28
 
28
29
  From studio sketches to live sets, Devalang gives you rhythmic control — with the elegance of code.
29
30
 
30
- > 🚧 **v0.0.1-alpha.8 Notice** 🚧
31
+ > **🚧 Notice 🚧**
31
32
  >
32
- > NEW: Devalang VSCode extension is now available !
33
- > [Get it here](https://marketplace.visualstudio.com/items?itemName=devaloop.devalang-vscode).
33
+ > Includes synthesis, playback, and rendering features, but is still in early development, and breaking changes may occur.
34
34
  >
35
- > NEW: Devalang supports conditional statements (`if`, `else`, `else if`) for more dynamic compositions !
35
+ > **NEW**: [Devaforge is now available for creating addons](https://github.com/devaloop-labs/devaforge).
36
36
  >
37
- > Currently, Devalang CLI is only available for **Windows**.
38
- > Linux and macOS binaries will be added in future releases via cross-platform builds.
39
-
40
- ---
37
+ > **NEW**: Now available for Windows, Linux, and macOS.
41
38
 
42
39
  ## 📚 Quick Access
43
40
 
44
- - [📖 Documentation](./docs/)
45
- - [💡 Examples](./examples/)
41
+ - [▶️ Playground](https://playground.devalang.com)
42
+ - [📖 Documentation](https://docs.devalang.com)
46
43
  - [🧩 VSCode Extension](https://marketplace.visualstudio.com/items?itemName=devaloop.devalang-vscode)
47
44
  - [🎨 Prettier Plugin](https://www.npmjs.com/package/@devaloop/prettier-plugin-devalang)
45
+ - [📜 Changelog](./docs/CHANGELOG.md)
46
+ - [💡 Examples](./examples/)
48
47
  - [🌐 Project Website](https://devalang.com)
48
+ - [📦 Devaforge on npm](https://www.npmjs.com/package/@devaloop/devaforge)
49
+ - [📦 Devalang on npm](https://www.npmjs.com/package/@devaloop/devalang)
49
50
 
50
- ## Why Devalang?
51
+ ## ⏱️ Try it now !
51
52
 
52
- - 🎹 Prototype audio ideas without opening a DAW
53
- - 💻 Integrate sound into code-based workflows
54
- - 🎛️ Control audio parameters through readable syntax
55
- - 🧪 Build musical logic with variables and conditions
53
+ ### Try Devalang in your browser
56
54
 
57
- > Producer, coder, or both Devalang gives you musical structure, instantly.
55
+ > [Have a look at the Playground to try Devalang directly in your browser](https://playground.devalang.com)
58
56
 
59
- ## 🚀 Features
57
+ ### Try Devalang in your terminal
60
58
 
61
- - 🎵 **Audio Engine**: Integrated audio playback and rendering
62
- - 🧩 **Module system** for importing and exporting variables between files
63
- - 📜 **Structured AST** generation for debugging and future compilation
64
- - 🔢 **Basic data types**: strings, numbers, booleans, maps, arrays
65
- - 👁️ **Watch mode** for `build`, `check` and `play` commands
66
- - 📂 **Project templates** for quick setup
67
- - 🎛️ **Custom samples**: easily load and trigger your own audio files
68
- - 🔄 **Looping and grouping**: create complex patterns with ease
69
-
70
- ## 📆 Installation
71
-
72
- ### For users
73
-
74
- > - ⚠️ Requires [Node.js 18+](https://nodejs.org/en/download)
75
-
76
- Install the package globally (NPM)
59
+ #### With Node.js
77
60
 
78
61
  ```bash
79
62
  npm install -g @devaloop/devalang@latest
80
63
  ```
81
64
 
82
- Usage without install (NPX)
83
-
84
- ```bash
85
- npx @devaloop/devalang@latest
86
- ```
87
-
88
- ### For contributors
89
-
90
- > - ⚠️ Requires [Node.js 18+](https://nodejs.org/en/download)
91
- > - ⚠️ Requires [Rust 1.70+](https://www.rust-lang.org/learn/get-started#installing-rust)
65
+ #### With Rust
92
66
 
93
67
  ```bash
94
- git clone https://github.com/devaloop-labs/devalang.git
95
-
96
- cd devalang
97
-
98
- npm install
68
+ cargo install devalang
99
69
  ```
100
70
 
101
- Development usage (you can customize arguments in package.json)
71
+ #### Initialize a new project
102
72
 
103
73
  ```bash
104
- # For syntax checking test
105
- npm run rust:dev:check
106
-
107
- # For building test
108
- npm run rust:dev:build
74
+ devalang init --name my-project --template minimal
109
75
  ```
110
76
 
111
- ## Usage
112
-
113
- NOTE: Commands are available via `devalang` or `npx @devaloop/devalang`.
77
+ #### Write your first script
114
78
 
115
- NOTE: Arguments can be passed to commands using `--<argument>` syntax. You can also use a configuration file to set default values for various settings, making it easier to manage your Devalang project.
79
+ Create a new Devalang file `src/index.deva` in the project directory:
116
80
 
117
- NOTE: Some commands require a mandatory `--entry` argument to specify the input folder, and a `--output` argument to specify the output folder. If not specified, they default to `./src` and `./output` respectively.
118
-
119
- For more examples, see [docs/COMMANDS.md](./docs/COMMANDS.md)
81
+ ```deva
82
+ # src/index.deva
120
83
 
121
- ### Initialize a new project
84
+ # BPM definition
85
+ bpm 125
122
86
 
123
- In the current directory
87
+ # Bank picking (make sure you've installed it)
88
+ bank devaloop.808 as my808Bank
124
89
 
125
- ```bash
126
- devalang init
127
- ```
90
+ # Pattern literal without options
91
+ pattern kickPattern with my808Bank.kick = "x--- x--- x--- x---"
128
92
 
129
- Or use optional arguments to specify a directory name and a template
130
-
131
- ```bash
132
- devalang init --name <project-name> --template <template-name>
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, target_freq: 659.25 })
140
+ myLead -> note(B3, { duration: 400, slide: true, target_amp: 0.3 })
141
+
142
+ # Spawning the group & the pattern to play them in parallel
143
+ spawn myGroup
144
+ spawn kickPattern
133
145
  ```
134
146
 
135
- ### Checking syntax only
136
-
137
- ```bash
138
- devalang check --watch
139
- ```
147
+ ### And the best part ? You can play it directly from the command line:
140
148
 
141
- ### Building output files
149
+ #### Play the script once
142
150
 
143
151
  ```bash
144
- devalang build --watch
152
+ devalang play
145
153
  ```
146
154
 
147
- ### Playing audio files (once by file change)
148
-
149
- ```bash
150
- devalang play --watch
151
- ```
152
-
153
- ### Playing audio files (continuous playback, even without file changes)
155
+ #### **LIVE mode** (repeat the playback + watch mode)
154
156
 
155
157
  ```bash
156
158
  devalang play --repeat
157
159
  ```
158
160
 
159
- ## ⚙️ Configuration
160
-
161
- You can use a configuration file to set default values for various settings, making it easier to manage your Devalang project.
162
-
163
- To do this, create a `.devalang` file in the root of your project directory.
164
-
165
- See [docs/CONFIG.md](./docs/CONFIG.md) for more information.
166
-
167
- ## 📄 Syntax example
168
-
169
- For more examples, see [docs/SYNTAX.md](./docs/SYNTAX.md)
170
-
171
- ```deva
172
- # index.deva
161
+ ### 🎉 You can now hear your Devalang code in action
173
162
 
174
- @import { globalBpm, globalBank, kickDuration } from "global.deva"
175
-
176
- @load "./examples/samples/kick-808.wav" as customKick
177
-
178
- bpm globalBpm
179
- # Will declare the tempo at the globalBpm variable beats per minute
180
-
181
- bank globalBank
182
- # Will declare a custom instrument bank using the globalBank variable
183
-
184
- # Loops
185
-
186
- loop 5:
187
- .customKick kickDuration {reverb=50, drive=25}
188
- # Will play 5 times a custom sample for 500ms with reverb and overdrive effects
189
-
190
- # Groups
191
-
192
- group myGroup:
193
- .customKick kickDuration {reverb=50, drive=25}
194
- # Will play the same sample in a group, allowing for more complex patterns
163
+ > For more examples, check out the [examples directory](./examples/)
195
164
 
196
- # Will be executed line by line (sequentially)
197
- call myGroup
165
+ ## Why Devalang ?
198
166
 
199
- # Will be executed in parallel (concurrently)
200
- # ⚠️ Note: `spawn` runs the entire group in parallel, but the group’s internal logic remains sequential unless it uses `spawn` internally.
201
- # spawn myGroup
202
- ```
203
-
204
- > 🧠 Note: `call` and `spawn` only work with `group` blocks. They do not apply to individual samples or other statements.
205
-
206
- ```deva
207
- # variables.deva
208
-
209
- let globalBpm = 120
210
- let globalBank = 808
211
- let kickDuration = 500
212
-
213
- @export { globalBpm, globalBank, kickDuration }
214
- ```
215
-
216
- ## 🧯 Known issues
217
-
218
- - No smart modules yet, all groups, variables, and samples must be explicitly imported where used
219
- - No support yet for `pattern`, `function`, ... statements
220
- - No support yet for cross-platform builds (Linux, macOS)
221
-
222
- ## 🧪 Roadmap Highlights
167
+ - 🎹 Prototype audio ideas without opening a DAW, even VSCode with our Playground
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
223
172
 
224
- For more info, see [docs/ROADMAP.md](./docs/ROADMAP.md)
173
+ ## 🚀 Features
225
174
 
226
- - Other statements (e.g `function`, `pattern`, ...)
227
- - Cross-platform support (Linux, macOS)
228
- - More built-in instruments (e.g. snare, hi-hat, etc.)
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.
178
+ - 🧩 **Language primitives** — synths, notes, ADSR, maps, arrays, loops, conditionals and functions for expressive musical logic.
179
+ - 🎛️ **Per-note automation & modulators** — `automate` maps, `$mod.*`, `$easing.*` and `$math.*` helpers for envelopes and LFOs.
180
+ - 🧩 **Module system & structured AST** — import/export variables, stable AST output for debugging and tooling.
181
+ - 🧰 **Plugins & Addons (WASM-ready)** — install plugins/banks, `@use` directive, and WASM plugin integration so plugins can render or process audio at runtime.
182
+ - 📦 **Addon manager & Devaforge** — CLI commands to discover/install banks, plugins and templates; `devaforge` helps create addons.
183
+ - ⚙️ **CLI tooling** — `build`, `check`, `play`, `install`, `init`, `discover`, `telemetry` and more with consistent flags (`--watch`, `--debug`, `--compress`).
184
+ - 📂 **Project templates & examples** — quick-start templates and many example projects in `examples/`.
185
+ - 🧑‍💻 **TypeScript API & WASM distribution** — Node-friendly package with TypeScript bindings and a WASM build for browser/Node usage.
186
+ - 🧰 **Editor & formatting support** — VSCode extension and Prettier plugin to edit Devalang with syntax and formatting support.
187
+ - 🎵 **Custom samples & banks** — drop samples into `.deva` and reference them from code; banks of sounds for fast composition.
188
+ - 🔄 **Looping, grouping & scheduling** — precise beat-tied scheduling primitives for complex rhythmic patterns.
189
+
190
+ ## 📄 Documentation
191
+
192
+ ### [Please refer to the online documentation](https://docs.devalang.com) for detailed information on syntax, features, and usage examples
193
+
194
+ ## 📰 What's new
195
+
196
+ - **Devaforge**: Introduced a new system for creating and managing addons, including a CLI for addon generation.
197
+ - **Documentation updates**: Improved documentation for clarity and completeness.
198
+ - **Discovering addons**: Introduced a new command to detect addons.
199
+ - **Public TypeScript API**: Added a public TypeScript API for easier integration.
200
+ - **Improved error messages**: Enhanced error messages for better debugging.
201
+ - **Bug fixes**: Various bug fixes and stability improvements.
229
202
 
230
203
  ## 🛡️ License
231
204
 
@@ -236,6 +209,10 @@ MIT — see [LICENSE](./LICENSE)
236
209
  Contributions, bug reports and suggestions are welcome !
237
210
  Feel free to open an issue or submit a pull request.
238
211
 
212
+ For more info, see [docs/CONTRIBUTING.md](./docs/CONTRIBUTING.md).
213
+
239
214
  ## 📢 Contact
240
215
 
216
+ Feel free to reach out for any inquiries or feedback.
217
+
241
218
  📧 [contact@devaloop.com](mailto:contact@devaloop.com)