@devaloop/devalang 0.0.1-alpha.9 → 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 (271) 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 -154
  6. package/docs/CHANGELOG.md +386 -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/duration.deva +9 -0
  13. package/examples/events.deva +12 -0
  14. package/examples/function.deva +15 -0
  15. package/examples/index.deva +57 -12
  16. package/examples/loop.deva +5 -12
  17. package/examples/pattern.deva +8 -0
  18. package/examples/plugin.deva +16 -0
  19. package/examples/variables.deva +1 -1
  20. package/out-tsc/bin/index.d.ts +2 -0
  21. package/out-tsc/bin/index.js +51 -7
  22. package/out-tsc/core/functions/index.d.ts +37 -0
  23. package/out-tsc/core/functions/index.js +76 -0
  24. package/out-tsc/core/index.d.ts +6 -0
  25. package/out-tsc/core/index.js +22 -0
  26. package/out-tsc/core/types/index.d.ts +4 -0
  27. package/out-tsc/core/types/index.js +20 -0
  28. package/out-tsc/core/types/plugin.d.ts +18 -0
  29. package/out-tsc/core/types/plugin.js +2 -0
  30. package/out-tsc/core/types/result.d.ts +27 -0
  31. package/out-tsc/core/types/result.js +2 -0
  32. package/out-tsc/core/types/statement.d.ts +106 -0
  33. package/out-tsc/core/types/statement.js +2 -0
  34. package/out-tsc/core/types/value.d.ts +43 -0
  35. package/out-tsc/core/types/value.js +2 -0
  36. package/out-tsc/index.d.ts +7 -0
  37. package/out-tsc/index.js +42 -1
  38. package/out-tsc/pkg/devalang_core.d.ts +13 -0
  39. package/out-tsc/pkg/devalang_core.js +50 -0
  40. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +33 -0
  41. package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
  42. package/out-tsc/scripts/copy-wasm-dts.js +73 -0
  43. package/out-tsc/scripts/postinstall.d.ts +1 -0
  44. package/out-tsc/scripts/postinstall.js +83 -0
  45. package/out-tsc/scripts/version/bump.d.ts +1 -0
  46. package/out-tsc/scripts/version/fetch.d.ts +1 -0
  47. package/out-tsc/scripts/version/index.d.ts +1 -0
  48. package/out-tsc/scripts/version/sync.d.ts +1 -0
  49. package/package.json +28 -7
  50. package/project-version.json +4 -4
  51. package/rust/cli/bank/api.rs +122 -0
  52. package/rust/cli/bank/commands.rs +275 -0
  53. package/rust/cli/bank/mod.rs +29 -0
  54. package/rust/cli/build/commands.rs +103 -0
  55. package/rust/cli/build/mod.rs +2 -0
  56. package/rust/cli/build/process.rs +146 -0
  57. package/rust/cli/check/mod.rs +208 -0
  58. package/rust/cli/discover/commands.rs +253 -0
  59. package/rust/cli/discover/config.rs +111 -0
  60. package/rust/cli/discover/fs.rs +19 -0
  61. package/rust/cli/discover/install.rs +103 -0
  62. package/rust/cli/discover/metadata.rs +48 -0
  63. package/rust/cli/discover/mod.rs +5 -0
  64. package/rust/cli/{init.rs → init/commands.rs} +32 -23
  65. package/rust/cli/init/mod.rs +1 -0
  66. package/rust/cli/install/addon.rs +118 -0
  67. package/rust/cli/install/bank.rs +53 -0
  68. package/rust/cli/install/commands.rs +35 -0
  69. package/rust/cli/install/mod.rs +4 -0
  70. package/rust/cli/install/plugin.rs +61 -0
  71. package/rust/cli/login/commands.rs +124 -0
  72. package/rust/cli/login/mod.rs +1 -0
  73. package/rust/cli/mod.rs +12 -205
  74. package/rust/cli/parser.rs +314 -0
  75. package/rust/cli/play/commands.rs +324 -0
  76. package/rust/cli/play/io.rs +17 -0
  77. package/rust/cli/play/mod.rs +5 -0
  78. package/rust/cli/play/process.rs +150 -0
  79. package/rust/cli/play/realtime.rs +91 -0
  80. package/rust/cli/play/utils.rs +23 -0
  81. package/rust/cli/telemetry/commands.rs +22 -0
  82. package/rust/cli/telemetry/event_creator.rs +80 -0
  83. package/rust/cli/telemetry/mod.rs +3 -0
  84. package/rust/cli/telemetry/send.rs +51 -0
  85. package/rust/cli/{template.rs → template/commands.rs} +69 -57
  86. package/rust/cli/template/mod.rs +1 -0
  87. package/rust/cli/update/commands.rs +6 -0
  88. package/rust/cli/update/mod.rs +1 -0
  89. package/rust/config/driver.rs +103 -0
  90. package/rust/config/mod.rs +3 -16
  91. package/rust/config/ops.rs +26 -0
  92. package/rust/config/settings.rs +101 -0
  93. package/rust/core/audio/engine/helpers.rs +170 -0
  94. package/rust/core/audio/engine/mod.rs +7 -0
  95. package/rust/core/audio/engine/sample.rs +366 -0
  96. package/rust/core/audio/engine/synth.rs +325 -0
  97. package/rust/core/audio/evaluator.rs +310 -31
  98. package/rust/core/audio/interpreter/arrow_call.rs +311 -129
  99. package/rust/core/audio/interpreter/automate.rs +18 -0
  100. package/rust/core/audio/interpreter/call.rs +294 -64
  101. package/rust/core/audio/interpreter/condition.rs +71 -69
  102. package/rust/core/audio/interpreter/driver.rs +542 -216
  103. package/rust/core/audio/interpreter/function.rs +26 -0
  104. package/rust/core/audio/interpreter/let_.rs +38 -19
  105. package/rust/core/audio/interpreter/load.rs +19 -18
  106. package/rust/core/audio/interpreter/loop_.rs +114 -67
  107. package/rust/core/audio/interpreter/mod.rs +14 -12
  108. package/rust/core/audio/interpreter/sleep.rs +28 -36
  109. package/rust/core/audio/interpreter/spawn.rs +252 -66
  110. package/rust/core/audio/interpreter/tempo.rs +40 -16
  111. package/rust/core/audio/interpreter/trigger.rs +239 -69
  112. package/rust/core/audio/loader/mod.rs +1 -1
  113. package/rust/core/audio/loader/trigger.rs +97 -52
  114. package/rust/core/audio/mod.rs +7 -6
  115. package/rust/core/audio/player.rs +70 -54
  116. package/rust/core/audio/renderer.rs +54 -54
  117. package/rust/core/audio/special/easing.rs +189 -0
  118. package/rust/core/audio/special/env.rs +45 -0
  119. package/rust/core/audio/special/math.rs +134 -0
  120. package/rust/core/audio/special/mod.rs +9 -0
  121. package/rust/core/audio/special/modulator.rs +143 -0
  122. package/rust/core/builder/mod.rs +86 -80
  123. package/rust/core/debugger/lexer.rs +27 -27
  124. package/rust/core/debugger/mod.rs +30 -21
  125. package/rust/core/debugger/module.rs +55 -0
  126. package/rust/core/debugger/preprocessor.rs +27 -27
  127. package/rust/core/debugger/store.rs +40 -25
  128. package/rust/core/error/mod.rs +269 -60
  129. package/rust/core/lexer/driver.rs +61 -0
  130. package/rust/core/lexer/handler/arrow.rs +82 -31
  131. package/rust/core/lexer/handler/at.rs +21 -21
  132. package/rust/core/lexer/handler/brace.rs +41 -41
  133. package/rust/core/lexer/handler/colon.rs +21 -21
  134. package/rust/core/lexer/handler/comment.rs +30 -30
  135. package/rust/core/lexer/handler/dot.rs +21 -21
  136. package/rust/core/lexer/handler/driver.rs +337 -226
  137. package/rust/core/lexer/handler/identifier.rs +47 -41
  138. package/rust/core/lexer/handler/indent.rs +66 -52
  139. package/rust/core/lexer/handler/mod.rs +15 -14
  140. package/rust/core/lexer/handler/newline.rs +23 -23
  141. package/rust/core/lexer/handler/number.rs +31 -31
  142. package/rust/core/lexer/handler/operator.rs +46 -44
  143. package/rust/core/lexer/handler/parenthesis.rs +41 -0
  144. package/rust/core/lexer/handler/slash.rs +21 -0
  145. package/rust/core/lexer/handler/string.rs +63 -63
  146. package/rust/core/lexer/mod.rs +3 -51
  147. package/rust/core/lexer/token.rs +17 -12
  148. package/rust/core/mod.rs +10 -10
  149. package/rust/core/parser/driver.rs +584 -331
  150. package/rust/core/parser/handler/arrow_call.rs +253 -126
  151. package/rust/core/parser/handler/at.rs +279 -162
  152. package/rust/core/parser/handler/bank.rs +104 -41
  153. package/rust/core/parser/handler/condition.rs +83 -74
  154. package/rust/core/parser/handler/dot.rs +148 -112
  155. package/rust/core/parser/handler/identifier/automate.rs +254 -0
  156. package/rust/core/parser/handler/identifier/call.rs +91 -41
  157. package/rust/core/parser/handler/identifier/emit.rs +70 -0
  158. package/rust/core/parser/handler/identifier/function.rs +113 -0
  159. package/rust/core/parser/handler/identifier/group.rs +89 -75
  160. package/rust/core/parser/handler/identifier/let_.rs +173 -133
  161. package/rust/core/parser/handler/identifier/mod.rs +55 -51
  162. package/rust/core/parser/handler/identifier/on.rs +107 -0
  163. package/rust/core/parser/handler/identifier/print.rs +49 -0
  164. package/rust/core/parser/handler/identifier/sleep.rs +43 -33
  165. package/rust/core/parser/handler/identifier/spawn.rs +91 -41
  166. package/rust/core/parser/handler/identifier/synth.rs +135 -65
  167. package/rust/core/parser/handler/loop_.rs +194 -72
  168. package/rust/core/parser/handler/mod.rs +9 -8
  169. package/rust/core/parser/handler/pattern.rs +74 -0
  170. package/rust/core/parser/handler/tempo.rs +57 -47
  171. package/rust/core/parser/mod.rs +3 -4
  172. package/rust/core/parser/statement.rs +11 -96
  173. package/rust/core/plugin/loader.rs +137 -0
  174. package/rust/core/plugin/mod.rs +2 -0
  175. package/rust/core/plugin/runner.rs +347 -0
  176. package/rust/core/preprocessor/loader.rs +637 -193
  177. package/rust/core/preprocessor/mod.rs +4 -4
  178. package/rust/core/preprocessor/module.rs +60 -50
  179. package/rust/core/preprocessor/processor.rs +114 -76
  180. package/rust/core/preprocessor/resolver/bank.rs +49 -47
  181. package/rust/core/preprocessor/resolver/call.rs +124 -123
  182. package/rust/core/preprocessor/resolver/condition.rs +95 -92
  183. package/rust/core/preprocessor/resolver/driver.rs +324 -227
  184. package/rust/core/preprocessor/resolver/function.rs +69 -0
  185. package/rust/core/preprocessor/resolver/group.rs +94 -61
  186. package/rust/core/preprocessor/resolver/let_.rs +32 -31
  187. package/rust/core/preprocessor/resolver/loop_.rs +318 -91
  188. package/rust/core/preprocessor/resolver/mod.rs +16 -14
  189. package/rust/core/preprocessor/resolver/pattern.rs +83 -0
  190. package/rust/core/preprocessor/resolver/spawn.rs +99 -58
  191. package/rust/core/preprocessor/resolver/synth.rs +54 -50
  192. package/rust/core/preprocessor/resolver/tempo.rs +48 -49
  193. package/rust/core/preprocessor/resolver/trigger.rs +116 -112
  194. package/rust/core/preprocessor/resolver/value.rs +176 -78
  195. package/rust/core/store/export.rs +28 -28
  196. package/rust/core/store/function.rs +40 -0
  197. package/rust/core/store/global.rs +61 -39
  198. package/rust/core/store/import.rs +28 -28
  199. package/rust/core/store/mod.rs +5 -4
  200. package/rust/core/store/variable.rs +51 -28
  201. package/rust/core/utils/mod.rs +1 -2
  202. package/rust/core/utils/path.rs +37 -31
  203. package/rust/lib.rs +308 -117
  204. package/rust/main.rs +364 -65
  205. package/rust/types/Cargo.toml +11 -0
  206. package/rust/types/src/addons.rs +55 -0
  207. package/rust/types/src/ast.rs +202 -0
  208. package/rust/types/src/config.rs +74 -0
  209. package/rust/types/src/lib.rs +12 -0
  210. package/rust/types/src/telemetry.rs +85 -0
  211. package/rust/utils/Cargo.toml +26 -0
  212. package/rust/utils/src/error.rs +186 -0
  213. package/rust/utils/src/file.rs +94 -0
  214. package/rust/utils/src/first_usage.rs +97 -0
  215. package/rust/utils/{mod.rs → src/lib.rs} +9 -6
  216. package/rust/utils/{logger.rs → src/logger.rs} +200 -123
  217. package/rust/utils/src/path.rs +88 -0
  218. package/rust/utils/src/signature.rs +41 -0
  219. package/rust/utils/{spinner.rs → src/spinner.rs} +20 -21
  220. package/rust/utils/src/version.rs +27 -0
  221. package/rust/utils/{watcher.rs → src/watcher.rs} +46 -33
  222. package/rust/web/api.rs +5 -0
  223. package/rust/web/cdn.rs +34 -0
  224. package/rust/web/mod.rs +3 -0
  225. package/rust/web/sso.rs +5 -0
  226. package/templates/minimal/README.md +143 -127
  227. package/templates/welcome/README.md +143 -127
  228. package/templates/welcome/src/index.deva +56 -8
  229. package/templates/welcome/src/variables.deva +2 -4
  230. package/tests/integration.rs +21 -0
  231. package/tests/rust/cli_check_build.rs +21 -0
  232. package/tests/rust/cli_help.rs +12 -0
  233. package/tests/rust/cli_template_list.rs +10 -0
  234. package/tests/rust/cli_version.rs +11 -0
  235. package/tests/typescript/index.spec.ts +136 -0
  236. package/tests/typescript/playhead.spec.ts +36 -0
  237. package/tests/typescript/render_e2e.spec.ts +77 -0
  238. package/tsconfig.json +12 -10
  239. package/typescript/bin/index.ts +19 -5
  240. package/typescript/core/functions/index.ts +83 -0
  241. package/typescript/core/index.ts +6 -0
  242. package/typescript/core/types/index.ts +4 -0
  243. package/typescript/core/types/plugin.ts +19 -0
  244. package/typescript/core/types/result.ts +29 -0
  245. package/typescript/core/types/statement.ts +47 -0
  246. package/typescript/core/types/value.ts +29 -0
  247. package/typescript/index.ts +8 -1
  248. package/typescript/pkg/devalang_core.d.ts +4 -0
  249. package/typescript/pkg/devalang_core.ts +49 -0
  250. package/typescript/scripts/copy-wasm-dts.ts +41 -0
  251. package/typescript/scripts/postinstall.ts +85 -0
  252. package/typescript/scripts/version/bump.ts +0 -1
  253. package/typescript/scripts/version/index.ts +0 -1
  254. package/docs/COMMANDS.md +0 -85
  255. package/docs/CONFIG.md +0 -30
  256. package/docs/SYNTAX.md +0 -210
  257. package/out-tsc/bin/devalang.exe +0 -0
  258. package/out-tsc/scripts/postbuild.js +0 -11
  259. package/rust/cli/build.rs +0 -137
  260. package/rust/cli/check.rs +0 -117
  261. package/rust/cli/play.rs +0 -193
  262. package/rust/config/loader.rs +0 -13
  263. package/rust/core/audio/engine.rs +0 -203
  264. package/rust/core/shared/duration.rs +0 -8
  265. package/rust/core/shared/mod.rs +0 -2
  266. package/rust/core/shared/value.rs +0 -18
  267. package/rust/core/utils/validation.rs +0 -37
  268. package/rust/utils/file.rs +0 -35
  269. package/rust/utils/signature.rs +0 -17
  270. package/rust/utils/version.rs +0 -15
  271. 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.9"
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,227 +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.9 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
- > Includes synthesis, playback, and rendering features, but is still in early development.
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)
65
+ #### With Rust
83
66
 
84
67
  ```bash
85
- npx @devaloop/devalang@latest
68
+ cargo install devalang
86
69
  ```
87
70
 
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)
71
+ #### Initialize a new project
92
72
 
93
73
  ```bash
94
- git clone https://github.com/devaloop-labs/devalang.git
95
-
96
- cd devalang
97
-
98
- npm install
74
+ devalang init --name my-project --template minimal
99
75
  ```
100
76
 
101
- Development usage (you can customize arguments in package.json)
77
+ #### Write your first script
102
78
 
103
- ```bash
104
- # For syntax checking test
105
- npm run rust:dev:check
79
+ Create a new Devalang file `src/index.deva` in the project directory:
106
80
 
107
- # For building test
108
- npm run rust:dev:build
109
- ```
110
-
111
- ## ❔ Usage
112
-
113
- NOTE: Commands are available via `devalang` or `npx @devaloop/devalang`.
114
-
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.
116
-
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)
120
-
121
- ### Initialize a new project
81
+ ```deva
82
+ # src/index.deva
122
83
 
123
- In the current directory
84
+ # BPM definition
85
+ bpm 125
124
86
 
125
- ```bash
126
- devalang init
127
- ```
87
+ # Bank picking (make sure you've installed it)
88
+ bank devaloop.808 as my808Bank
128
89
 
129
- Or use optional arguments to specify a directory name and a template
90
+ # Pattern literal without options
91
+ pattern kickPattern with my808Bank.kick = "x--- x--- x--- x---"
130
92
 
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
147
+ ### And the best part ? You can play it directly from the command line:
136
148
 
137
- ```bash
138
- devalang check --watch
139
- ```
140
-
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
173
-
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
- loop 5:
185
- .customKick kickDuration {reverb=50, drive=25}
186
- # Will play 5 times a custom sample for 500ms with reverb and overdrive effects
187
-
188
- group myGroup:
189
- .customKick kickDuration {reverb=50, drive=25}
190
- # Will play the same sample in a group, allowing for more complex patterns
191
-
192
- call myGroup
193
- # Will be executed line by line (sequentially)
194
-
195
- # spawn myGroup
196
- # Will be executed in parallel (concurrently)
197
- # ⚠️ Note: `spawn` runs the entire group in parallel, but the group’s internal logic remains sequential unless it uses `spawn` internally.
198
- ```
199
-
200
- > 🧠 Note: `call` and `spawn` only work with `group` blocks. They do not apply to individual samples or other statements.
201
-
202
- ```deva
203
- # variables.deva
204
-
205
- let globalBpm = 120
206
- let globalBank = 808
207
- let kickDuration = 500
161
+ ### 🎉 You can now hear your Devalang code in action
208
162
 
209
- @export { globalBpm, globalBank, kickDuration }
210
- ```
211
-
212
- ## 🧯 Known issues
163
+ > For more examples, check out the [examples directory](./examples/)
213
164
 
214
- - No smart modules yet, all groups, variables, and samples must be explicitly imported where used
215
- - No support yet for `pattern`, `function`, ... statements
216
- - No support yet for cross-platform builds (Linux, macOS)
165
+ ## Why Devalang ?
217
166
 
218
- ## 🧪 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
219
172
 
220
- For more info, see [docs/ROADMAP.md](./docs/ROADMAP.md)
173
+ ## 🚀 Features
221
174
 
222
- - Other statements (e.g `function`, `pattern`, ...)
223
- - Cross-platform support (Linux, macOS)
224
- - 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.
225
202
 
226
203
  ## 🛡️ License
227
204
 
@@ -232,6 +209,10 @@ MIT — see [LICENSE](./LICENSE)
232
209
  Contributions, bug reports and suggestions are welcome !
233
210
  Feel free to open an issue or submit a pull request.
234
211
 
212
+ For more info, see [docs/CONTRIBUTING.md](./docs/CONTRIBUTING.md).
213
+
235
214
  ## 📢 Contact
236
215
 
216
+ Feel free to reach out for any inquiries or feedback.
217
+
237
218
  📧 [contact@devaloop.com](mailto:contact@devaloop.com)