@devaloop/devalang 0.0.1-beta.2 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/README.md +177 -146
  2. package/out-tsc/api.d.ts +180 -0
  3. package/out-tsc/api.d.ts.map +1 -0
  4. package/out-tsc/api.js +286 -0
  5. package/out-tsc/api.js.map +1 -0
  6. package/out-tsc/bin/index.d.ts +12 -0
  7. package/out-tsc/bin/index.d.ts.map +1 -0
  8. package/out-tsc/bin/index.js +20 -54
  9. package/out-tsc/bin/index.js.map +1 -0
  10. package/out-tsc/examples/basic-usage.d.ts +8 -0
  11. package/out-tsc/examples/basic-usage.d.ts.map +1 -0
  12. package/out-tsc/examples/basic-usage.js +113 -0
  13. package/out-tsc/examples/basic-usage.js.map +1 -0
  14. package/out-tsc/index.d.ts +19 -5
  15. package/out-tsc/index.d.ts.map +1 -0
  16. package/out-tsc/index.js +24 -6
  17. package/out-tsc/index.js.map +1 -0
  18. package/out-tsc/scripts/copy-wasm-dts.d.ts +7 -0
  19. package/out-tsc/scripts/copy-wasm-dts.d.ts.map +1 -0
  20. package/out-tsc/scripts/copy-wasm-dts.js +36 -32
  21. package/out-tsc/scripts/copy-wasm-dts.js.map +1 -0
  22. package/out-tsc/scripts/postinstall.d.ts +1 -0
  23. package/out-tsc/scripts/postinstall.d.ts.map +1 -0
  24. package/out-tsc/scripts/postinstall.js +4 -1
  25. package/out-tsc/scripts/postinstall.js.map +1 -0
  26. package/out-tsc/scripts/version/bump.d.ts +5 -1
  27. package/out-tsc/scripts/version/bump.d.ts.map +1 -0
  28. package/out-tsc/scripts/version/bump.js +114 -44
  29. package/out-tsc/scripts/version/bump.js.map +1 -0
  30. package/out-tsc/scripts/version/fetch.d.ts +12 -1
  31. package/out-tsc/scripts/version/fetch.d.ts.map +1 -0
  32. package/out-tsc/scripts/version/fetch.js +68 -24
  33. package/out-tsc/scripts/version/fetch.js.map +1 -0
  34. package/out-tsc/scripts/version/index.d.ts +6 -0
  35. package/out-tsc/scripts/version/index.d.ts.map +1 -0
  36. package/out-tsc/scripts/version/index.js +44 -22
  37. package/out-tsc/scripts/version/index.js.map +1 -0
  38. package/out-tsc/scripts/version/sync.d.ts +5 -1
  39. package/out-tsc/scripts/version/sync.d.ts.map +1 -0
  40. package/out-tsc/scripts/version/sync.js +78 -29
  41. package/out-tsc/scripts/version/sync.js.map +1 -0
  42. package/out-tsc/types.d.ts +68 -0
  43. package/out-tsc/types.d.ts.map +1 -0
  44. package/out-tsc/{core/types/value.js → types.js} +4 -0
  45. package/out-tsc/types.js.map +1 -0
  46. package/out-tsc/wasm.d.ts +8 -0
  47. package/out-tsc/wasm.d.ts.map +1 -0
  48. package/out-tsc/{core/index.js → wasm.js} +9 -6
  49. package/out-tsc/wasm.js.map +1 -0
  50. package/package.json +50 -37
  51. package/.cargo/config.toml +0 -2
  52. package/.devalang +0 -9
  53. package/.github/workflows/ci.yml +0 -103
  54. package/Cargo.toml +0 -81
  55. package/docs/CHANGELOG.md +0 -581
  56. package/docs/CONTRIBUTING.md +0 -101
  57. package/docs/ROADMAP.md +0 -38
  58. package/docs/TODO.md +0 -71
  59. package/examples/automation.deva +0 -42
  60. package/examples/bank.deva +0 -7
  61. package/examples/bus.deva +0 -10
  62. package/examples/condition.deva +0 -20
  63. package/examples/duration.deva +0 -9
  64. package/examples/effect.deva +0 -2
  65. package/examples/events.deva +0 -12
  66. package/examples/filter.deva +0 -11
  67. package/examples/function.deva +0 -15
  68. package/examples/group.deva +0 -12
  69. package/examples/index.deva +0 -63
  70. package/examples/lfo.deva +0 -9
  71. package/examples/loop.deva +0 -10
  72. package/examples/pattern.deva +0 -8
  73. package/examples/plugin.deva +0 -16
  74. package/examples/samples/hat-808.wav +0 -0
  75. package/examples/samples/kick-808.wav +0 -0
  76. package/examples/synth.deva +0 -24
  77. package/examples/synth_types.deva +0 -17
  78. package/examples/variables.deva +0 -9
  79. package/out-tsc/core/functions/index.d.ts +0 -42
  80. package/out-tsc/core/functions/index.js +0 -87
  81. package/out-tsc/core/index.d.ts +0 -6
  82. package/out-tsc/core/types/index.d.ts +0 -4
  83. package/out-tsc/core/types/index.js +0 -20
  84. package/out-tsc/core/types/plugin.d.ts +0 -18
  85. package/out-tsc/core/types/plugin.js +0 -2
  86. package/out-tsc/core/types/result.d.ts +0 -27
  87. package/out-tsc/core/types/result.js +0 -2
  88. package/out-tsc/core/types/statement.d.ts +0 -106
  89. package/out-tsc/core/types/statement.js +0 -2
  90. package/out-tsc/core/types/value.d.ts +0 -43
  91. package/out-tsc/pkg/devalang_core.d.ts +0 -15
  92. package/out-tsc/pkg/devalang_core.js +0 -65
  93. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +0 -34
  94. package/project-version.json +0 -6
  95. package/rust/cli/bank/api.rs +0 -122
  96. package/rust/cli/bank/commands.rs +0 -306
  97. package/rust/cli/bank/mod.rs +0 -29
  98. package/rust/cli/build/commands.rs +0 -153
  99. package/rust/cli/build/mod.rs +0 -2
  100. package/rust/cli/build/process.rs +0 -165
  101. package/rust/cli/check/mod.rs +0 -208
  102. package/rust/cli/discover/commands.rs +0 -253
  103. package/rust/cli/discover/config.rs +0 -111
  104. package/rust/cli/discover/fs.rs +0 -19
  105. package/rust/cli/discover/install.rs +0 -103
  106. package/rust/cli/discover/metadata.rs +0 -48
  107. package/rust/cli/discover/mod.rs +0 -5
  108. package/rust/cli/init/commands.rs +0 -88
  109. package/rust/cli/init/mod.rs +0 -1
  110. package/rust/cli/install/addon.rs +0 -118
  111. package/rust/cli/install/bank.rs +0 -72
  112. package/rust/cli/install/commands.rs +0 -35
  113. package/rust/cli/install/mod.rs +0 -4
  114. package/rust/cli/install/plugin.rs +0 -80
  115. package/rust/cli/login/commands.rs +0 -124
  116. package/rust/cli/login/mod.rs +0 -1
  117. package/rust/cli/mod.rs +0 -12
  118. package/rust/cli/parser.rs +0 -359
  119. package/rust/cli/play/commands.rs +0 -375
  120. package/rust/cli/play/io.rs +0 -17
  121. package/rust/cli/play/mod.rs +0 -5
  122. package/rust/cli/play/process.rs +0 -159
  123. package/rust/cli/play/realtime.rs +0 -91
  124. package/rust/cli/play/utils.rs +0 -23
  125. package/rust/cli/telemetry/commands.rs +0 -22
  126. package/rust/cli/telemetry/event_creator.rs +0 -80
  127. package/rust/cli/telemetry/mod.rs +0 -3
  128. package/rust/cli/telemetry/send.rs +0 -51
  129. package/rust/cli/template/commands.rs +0 -69
  130. package/rust/cli/template/mod.rs +0 -1
  131. package/rust/cli/update/commands.rs +0 -6
  132. package/rust/cli/update/mod.rs +0 -1
  133. package/rust/config/driver.rs +0 -112
  134. package/rust/config/mod.rs +0 -3
  135. package/rust/config/ops.rs +0 -26
  136. package/rust/config/settings.rs +0 -101
  137. package/rust/core/audio/engine/driver.rs +0 -220
  138. package/rust/core/audio/engine/export.rs +0 -169
  139. package/rust/core/audio/engine/helpers.rs +0 -178
  140. package/rust/core/audio/engine/mod.rs +0 -56
  141. package/rust/core/audio/engine/notes/dsp.rs +0 -85
  142. package/rust/core/audio/engine/notes/mod.rs +0 -44
  143. package/rust/core/audio/engine/notes/params.rs +0 -294
  144. package/rust/core/audio/engine/sample/insert.rs +0 -199
  145. package/rust/core/audio/engine/sample/mod.rs +0 -40
  146. package/rust/core/audio/engine/sample/padding.rs +0 -170
  147. package/rust/core/audio/evaluator/condition.rs +0 -61
  148. package/rust/core/audio/evaluator/mod.rs +0 -9
  149. package/rust/core/audio/evaluator/numeric.rs +0 -152
  150. package/rust/core/audio/evaluator/rhs.rs +0 -16
  151. package/rust/core/audio/evaluator/string_expr.rs +0 -94
  152. package/rust/core/audio/interpreter/driver.rs +0 -574
  153. package/rust/core/audio/interpreter/mod.rs +0 -2
  154. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +0 -175
  155. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +0 -384
  156. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +0 -2
  157. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +0 -316
  158. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +0 -3
  159. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +0 -192
  160. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +0 -24
  161. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +0 -116
  162. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +0 -97
  163. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +0 -100
  164. package/rust/core/audio/interpreter/statements/automate.rs +0 -16
  165. package/rust/core/audio/interpreter/statements/call.rs +0 -295
  166. package/rust/core/audio/interpreter/statements/condition.rs +0 -72
  167. package/rust/core/audio/interpreter/statements/function.rs +0 -24
  168. package/rust/core/audio/interpreter/statements/let_.rs +0 -36
  169. package/rust/core/audio/interpreter/statements/load.rs +0 -17
  170. package/rust/core/audio/interpreter/statements/loop_.rs +0 -115
  171. package/rust/core/audio/interpreter/statements/mod.rs +0 -12
  172. package/rust/core/audio/interpreter/statements/sleep.rs +0 -28
  173. package/rust/core/audio/interpreter/statements/spawn.rs +0 -253
  174. package/rust/core/audio/interpreter/statements/tempo.rs +0 -40
  175. package/rust/core/audio/interpreter/statements/trigger.rs +0 -239
  176. package/rust/core/audio/loader/mod.rs +0 -1
  177. package/rust/core/audio/loader/trigger.rs +0 -98
  178. package/rust/core/audio/mod.rs +0 -6
  179. package/rust/core/audio/player.rs +0 -70
  180. package/rust/core/audio/special/easing.rs +0 -189
  181. package/rust/core/audio/special/env.rs +0 -45
  182. package/rust/core/audio/special/math.rs +0 -134
  183. package/rust/core/audio/special/mod.rs +0 -9
  184. package/rust/core/audio/special/modulator.rs +0 -143
  185. package/rust/core/builder/mod.rs +0 -129
  186. package/rust/core/debugger/lexer.rs +0 -27
  187. package/rust/core/debugger/logs.rs +0 -52
  188. package/rust/core/debugger/mod.rs +0 -30
  189. package/rust/core/debugger/preprocessor.rs +0 -27
  190. package/rust/core/debugger/store.rs +0 -38
  191. package/rust/core/error/mod.rs +0 -269
  192. package/rust/core/lexer/driver.rs +0 -59
  193. package/rust/core/lexer/handler/arrow.rs +0 -82
  194. package/rust/core/lexer/handler/at.rs +0 -21
  195. package/rust/core/lexer/handler/brace.rs +0 -41
  196. package/rust/core/lexer/handler/colon.rs +0 -21
  197. package/rust/core/lexer/handler/comment.rs +0 -30
  198. package/rust/core/lexer/handler/dot.rs +0 -21
  199. package/rust/core/lexer/handler/driver.rs +0 -337
  200. package/rust/core/lexer/handler/identifier.rs +0 -47
  201. package/rust/core/lexer/handler/indent.rs +0 -66
  202. package/rust/core/lexer/handler/mod.rs +0 -15
  203. package/rust/core/lexer/handler/newline.rs +0 -23
  204. package/rust/core/lexer/handler/number.rs +0 -31
  205. package/rust/core/lexer/handler/operator.rs +0 -46
  206. package/rust/core/lexer/handler/parenthesis.rs +0 -41
  207. package/rust/core/lexer/handler/slash.rs +0 -21
  208. package/rust/core/lexer/handler/string.rs +0 -63
  209. package/rust/core/lexer/mod.rs +0 -3
  210. package/rust/core/lexer/token.rs +0 -91
  211. package/rust/core/mod.rs +0 -9
  212. package/rust/core/parser/driver/block.rs +0 -111
  213. package/rust/core/parser/driver/cursor.rs +0 -82
  214. package/rust/core/parser/driver/driver_impl.rs +0 -139
  215. package/rust/core/parser/driver/mod.rs +0 -6
  216. package/rust/core/parser/driver/parse_array.rs +0 -120
  217. package/rust/core/parser/driver/parse_map.rs +0 -223
  218. package/rust/core/parser/driver/parser.rs +0 -160
  219. package/rust/core/parser/handler/arrow_call.rs +0 -277
  220. package/rust/core/parser/handler/at.rs +0 -279
  221. package/rust/core/parser/handler/bank.rs +0 -104
  222. package/rust/core/parser/handler/condition.rs +0 -83
  223. package/rust/core/parser/handler/dot.rs +0 -148
  224. package/rust/core/parser/handler/identifier/automate.rs +0 -254
  225. package/rust/core/parser/handler/identifier/call.rs +0 -91
  226. package/rust/core/parser/handler/identifier/emit.rs +0 -70
  227. package/rust/core/parser/handler/identifier/function.rs +0 -113
  228. package/rust/core/parser/handler/identifier/group.rs +0 -89
  229. package/rust/core/parser/handler/identifier/let_.rs +0 -173
  230. package/rust/core/parser/handler/identifier/mod.rs +0 -55
  231. package/rust/core/parser/handler/identifier/on.rs +0 -107
  232. package/rust/core/parser/handler/identifier/print.rs +0 -49
  233. package/rust/core/parser/handler/identifier/sleep.rs +0 -96
  234. package/rust/core/parser/handler/identifier/spawn.rs +0 -91
  235. package/rust/core/parser/handler/identifier/synth.rs +0 -135
  236. package/rust/core/parser/handler/loop_.rs +0 -194
  237. package/rust/core/parser/handler/mod.rs +0 -9
  238. package/rust/core/parser/handler/pattern.rs +0 -74
  239. package/rust/core/parser/handler/tempo.rs +0 -105
  240. package/rust/core/parser/mod.rs +0 -3
  241. package/rust/core/parser/statement.rs +0 -10
  242. package/rust/core/plugin/loader.rs +0 -137
  243. package/rust/core/plugin/mod.rs +0 -2
  244. package/rust/core/plugin/runner/mod.rs +0 -11
  245. package/rust/core/plugin/runner/non_wasm.rs +0 -297
  246. package/rust/core/plugin/runner/wasm32.rs +0 -43
  247. package/rust/core/preprocessor/loader/inject.rs +0 -278
  248. package/rust/core/preprocessor/loader/loader_helpers.rs +0 -110
  249. package/rust/core/preprocessor/loader/mod.rs +0 -235
  250. package/rust/core/preprocessor/mod.rs +0 -4
  251. package/rust/core/preprocessor/module.rs +0 -55
  252. package/rust/core/preprocessor/processor/handlers.rs +0 -107
  253. package/rust/core/preprocessor/processor/mod.rs +0 -1
  254. package/rust/core/preprocessor/resolver/bank.rs +0 -49
  255. package/rust/core/preprocessor/resolver/call.rs +0 -124
  256. package/rust/core/preprocessor/resolver/condition.rs +0 -95
  257. package/rust/core/preprocessor/resolver/driver.rs +0 -324
  258. package/rust/core/preprocessor/resolver/function.rs +0 -69
  259. package/rust/core/preprocessor/resolver/group.rs +0 -122
  260. package/rust/core/preprocessor/resolver/let_.rs +0 -32
  261. package/rust/core/preprocessor/resolver/loop_.rs +0 -318
  262. package/rust/core/preprocessor/resolver/mod.rs +0 -16
  263. package/rust/core/preprocessor/resolver/pattern.rs +0 -83
  264. package/rust/core/preprocessor/resolver/spawn.rs +0 -99
  265. package/rust/core/preprocessor/resolver/synth.rs +0 -54
  266. package/rust/core/preprocessor/resolver/tempo.rs +0 -48
  267. package/rust/core/preprocessor/resolver/trigger.rs +0 -116
  268. package/rust/core/preprocessor/resolver/value.rs +0 -176
  269. package/rust/core/store/global.rs +0 -57
  270. package/rust/core/store/mod.rs +0 -1
  271. package/rust/lib.rs +0 -323
  272. package/rust/main.rs +0 -388
  273. package/rust/types/Cargo.toml +0 -11
  274. package/rust/types/src/addons.rs +0 -55
  275. package/rust/types/src/ast.rs +0 -202
  276. package/rust/types/src/config.rs +0 -84
  277. package/rust/types/src/lib.rs +0 -15
  278. package/rust/types/src/plugin.rs +0 -20
  279. package/rust/types/src/store.rs +0 -139
  280. package/rust/types/src/telemetry.rs +0 -85
  281. package/rust/utils/Cargo.toml +0 -26
  282. package/rust/utils/src/error.rs +0 -186
  283. package/rust/utils/src/file.rs +0 -94
  284. package/rust/utils/src/first_usage.rs +0 -97
  285. package/rust/utils/src/lib.rs +0 -9
  286. package/rust/utils/src/logger.rs +0 -200
  287. package/rust/utils/src/path.rs +0 -129
  288. package/rust/utils/src/signature.rs +0 -41
  289. package/rust/utils/src/spinner.rs +0 -20
  290. package/rust/utils/src/version.rs +0 -27
  291. package/rust/utils/src/watcher.rs +0 -46
  292. package/rust/web/api.rs +0 -5
  293. package/rust/web/cdn.rs +0 -34
  294. package/rust/web/mod.rs +0 -3
  295. package/rust/web/sso.rs +0 -5
  296. package/templates/minimal/.devalang +0 -5
  297. package/templates/minimal/README.md +0 -218
  298. package/templates/minimal/src/index.deva +0 -2
  299. package/templates/welcome/.devalang +0 -5
  300. package/templates/welcome/README.md +0 -218
  301. package/templates/welcome/samples/kick-808.wav +0 -0
  302. package/templates/welcome/src/index.deva +0 -61
  303. package/templates/welcome/src/variables.deva +0 -3
  304. package/tests/integration.rs +0 -21
  305. package/tests/rust/cli_check_build.rs +0 -21
  306. package/tests/rust/cli_help.rs +0 -12
  307. package/tests/rust/cli_template_list.rs +0 -10
  308. package/tests/rust/cli_version.rs +0 -11
  309. package/tests/typescript/index.spec.ts +0 -136
  310. package/tests/typescript/playhead.spec.ts +0 -36
  311. package/tests/typescript/render_e2e.spec.ts +0 -77
  312. package/tsconfig.json +0 -115
  313. package/typescript/bin/index.ts +0 -28
  314. package/typescript/core/functions/index.ts +0 -94
  315. package/typescript/core/index.ts +0 -6
  316. package/typescript/core/types/index.ts +0 -4
  317. package/typescript/core/types/plugin.ts +0 -19
  318. package/typescript/core/types/result.ts +0 -29
  319. package/typescript/core/types/statement.ts +0 -47
  320. package/typescript/core/types/value.ts +0 -29
  321. package/typescript/index.ts +0 -8
  322. package/typescript/pkg/devalang_core.d.ts +0 -4
  323. package/typescript/pkg/devalang_core.ts +0 -65
  324. package/typescript/scripts/copy-wasm-dts.ts +0 -41
  325. package/typescript/scripts/postinstall.ts +0 -85
  326. package/typescript/scripts/version/bump.ts +0 -44
  327. package/typescript/scripts/version/fetch.ts +0 -18
  328. package/typescript/scripts/version/index.ts +0 -25
  329. package/typescript/scripts/version/sync.ts +0 -24
package/README.md CHANGED
@@ -4,9 +4,9 @@
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
- ![Node.js](https://img.shields.io/badge/Node.js-18%2B-brightgreen?logo=node.js)
7
+ ![Node.js](https://img.shields.io/badge/Node.js-16%2B-brightgreen?logo=node.js)
8
8
 
9
- ![Project Status](https://img.shields.io/badge/status-beta-blue)
9
+ ![Project Status](https://img.shields.io/badge/status-preview-blue)
10
10
  ![Version](https://img.shields.io/npm/v/@devaloop/devalang)
11
11
  ![License: MIT](https://img.shields.io/badge/license-MIT-green)
12
12
 
@@ -17,204 +17,235 @@
17
17
  ![npm](https://img.shields.io/npm/dt/@devaloop/devalang)
18
18
  ![crates](https://img.shields.io/crates/d/devalang)
19
19
 
20
- ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/devaloop-labs/devalang/.github/workflows/ci.yml)
20
+ # 🦊 Devalang — Write music with code
21
21
 
22
- # 🦊 Devalang (CORE) Compose music with code
22
+ Devalang is a compact domain-specific language (DSL) for music makers, sound designers, and creative coders.
23
+ Compose loops, control samples, synthesize audio, and render your ideas — all in clean, readable text.
23
24
 
24
- Devalang is a tiny domain-specific language (DSL) for music makers, sound designers, and audio hackers.
25
- Compose loops, control samples, render and play audio — all in clean, readable text.
25
+ Whether you're prototyping a beat, building generative music, or performing live, Devalang gives you rhythmic precision with the elegance of code.
26
26
 
27
- 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
+ From studio sketches to live sets, Devalang puts musical ideas into motion.
28
28
 
29
- From studio sketches to live sets, Devalang gives you rhythmic control — with the elegance of code.
30
-
31
- > **🚧 Notice 🚧**
32
- >
33
- > Includes synthesis, playback, and rendering features, but is still in early development, and breaking changes may occur.
29
+ > **🚀 v0.1.0 - Complete Rewriting**
34
30
  >
35
- > **NEW**: [Devaforge is now available for creating addons](https://github.com/devaloop-labs/devaforge).
36
31
  >
37
- > **NEW**: Now available for Windows, Linux, and macOS.
32
+ > **NEW**: [Devalang Playground V2.0 is now available](https://playground.devalang.com) Try it in your browser!
33
+
34
+ ---
38
35
 
39
36
  ## 📚 Quick Access
40
37
 
41
- - [▶️ Playground](https://playground.devalang.com)
42
- - [📖 Documentation](https://docs.devalang.com)
43
- - [🧩 VSCode Extension](https://marketplace.visualstudio.com/items?itemName=devaloop.devalang-vscode)
44
- - [🎨 Prettier Plugin](https://www.npmjs.com/package/@devaloop/prettier-plugin-devalang)
45
- - [📜 Changelog](./docs/CHANGELOG.md)
38
+ - [▶️ Playground](https://playground.devalang.com) — Try Devalang in your browser
39
+ - [📖 Documentation](https://docs.devalang.com) — Complete language reference
40
+ - [🧩 VSCode Extension](https://marketplace.visualstudio.com/items?itemName=devaloop.devalang-vscode) — Syntax highlighting & snippets
41
+ - [📜 Changelog](./docs/CHANGELOG.md) — Version history
46
42
  - [💡 Examples](./examples/)
47
- - [🌐 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)
43
+ - [🌐 Website](https://devalang.com) — Project homepage
44
+ - [📦 npm Package](https://www.npmjs.com/package/@devaloop/devalang)
45
+ - [📦 Rust Crate](https://crates.io/crates/devalang)
50
46
 
51
- ## ⏱️ Try it now !
47
+ ---
52
48
 
53
- ### Try Devalang in your browser
49
+ ## Quick Start
54
50
 
55
- > [Have a look at the Playground to try Devalang directly in your browser](https://playground.devalang.com)
51
+ ### Try in Your Browser
56
52
 
57
- ### Try Devalang in your terminal
53
+ > **[Launch the Playground](https://playground.devalang.com)** to try Devalang without installing anything.
58
54
 
59
- #### With Node.js
55
+ ### Install via npm (Recommended)
60
56
 
61
57
  ```bash
62
- npm install -g @devaloop/devalang@latest
58
+ npm install -g @devaloop/devalang
63
59
  ```
64
60
 
65
- #### With Rust
61
+ ### Install via Cargo (Rust)
66
62
 
67
63
  ```bash
68
- cargo install devalang --version <version>
64
+ cargo install devalang
69
65
  ```
70
66
 
71
- #### Initialize a new project
67
+ ### Create Your First Project
72
68
 
73
69
  ```bash
74
- devalang init --name my-project --template minimal
70
+ # Initialize a new project
71
+ devalang init my-project
72
+
73
+ # Navigate to the project
74
+ cd my-project
75
+
76
+ # Check syntax
77
+ devalang check --entry examples/index.deva
78
+
79
+ # Build audio files
80
+ devalang build --path examples/index.deva --formats wav mid
81
+
82
+ # Play audio (live mode)
83
+ devalang play --live --input examples/index.deva
75
84
  ```
76
85
 
77
- #### Write your first script
86
+ ---
87
+
88
+ ## 🎵 Your First Devalang Script
78
89
 
79
- Create a new Devalang file `src/index.deva` in the project directory:
90
+ Create a file `hello.deva`:
80
91
 
81
92
  ```deva
82
- # src/index.deva
83
-
84
- # BPM definition
85
- bpm 125
86
-
87
- # Bank picking (make sure you've installed it)
88
- bank devaloop.808 as my808Bank
89
-
90
- # Pattern literal without options
91
- pattern kickPattern with my808Bank.kick = "x--- x--- x--- x---"
92
-
93
- group myGroup:
94
- # Rhythmic (each beat playing a kick)
95
- # on beat:
96
- # .my808Bank.kick 1/4
97
-
98
- # Synth definition with ADSR
99
- let myLead = synth sine {
100
- attack: 0,
101
- decay: 100,
102
- sustain: 100,
103
- release: 100
104
- }
105
-
106
- # Global automation
107
- automate myLead:
108
- param volume {
109
- 0% = 0.0
110
- 100% = 0.5
111
- }
112
- param pitch {
113
- 0% = -12.0
114
- 100% = 12.0
115
- }
116
-
117
- # Notes in a loop with condition
118
- for i in [1, 2, 3]:
119
- if i == 3:
120
- myLead -> note(C5, { duration: 200 })
121
- print "Playing note C5 for " + i
122
-
123
- # Pause runtime for 500ms
124
- sleep 500
125
-
126
- # Note with automation
127
- myLead -> note(C4, {
128
- duration: 400,
129
- velocity: 0.8,
130
- automate: {
131
- pan: {
132
- 0%: -1.0,
133
- 100%: 0.0
134
- }
135
- }
136
- })
137
-
138
- # Notes with params
139
- myLead -> note(G4, { duration: 600, glide: true })
140
- myLead -> note(B3, { duration: 400, slide: true })
141
-
142
- # Spawning the group & the pattern to play them in parallel
143
- spawn myGroup
144
- spawn kickPattern
145
- ```
93
+ # Set the tempo
94
+ bpm 120
146
95
 
147
- ### And the best part ? You can play it directly from the command line:
96
+ # Load a bank of sounds
97
+ bank devaloop.808 as drums
148
98
 
149
- #### Play the script once
99
+ # Create a simple drum pattern
100
+ pattern kickPattern with drums.kick = "x--- x--- x--- x---"
101
+ pattern snarePattern with drums.snare = "---- x--- ---- x---"
102
+ pattern hihatPattern with drums.hihat = "x-x- x-x- x-x- x-x-"
150
103
 
151
- ```bash
152
- devalang play
104
+ # Play the patterns
105
+ call kickPattern
106
+ call snarePattern
107
+ call hihatPattern
153
108
  ```
154
109
 
155
- #### **LIVE mode** (repeat the playback + watch mode)
110
+ ### Build the audio
156
111
 
157
112
  ```bash
158
- devalang play --repeat
113
+ # Build to WAV
114
+ devalang build --path hello.deva --formats wav
115
+
116
+ # Output: ./output/audio/hello.wav
159
117
  ```
160
118
 
161
- ### 🎉 You can now hear your Devalang code in action
119
+ # Play the audio
162
120
 
163
- > For more examples, check out the [examples directory](./examples/)
121
+ ```bash
122
+ # Play the audio file
123
+ devalang play --input hello.deva
164
124
 
165
- ## Why Devalang ?
125
+ # Play live (repeats and watch until stopped)
126
+ devalang play --live --input hello.deva
127
+ ```
166
128
 
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
129
+ ---
172
130
 
173
131
  ## 🚀 Features
174
132
 
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 --repeat` for live feedback.
177
- - 🧩 **Language primitives** — synths, notes, ADSR, maps, arrays, loops, conditionals and functions for expressive musical logic.
178
- - 🎛️ **Per-note automation & modulators** — `automate` maps, `$mod.*`, `$easing.*` and `$math.*` helpers for envelopes and LFOs.
179
- - 🧩 **Module system & structured AST** — import/export variables, stable AST output for debugging and tooling.
180
- - 🧰 **Plugins & Addons (WASM-ready)** — install plugins/banks, `@use` directive, and WASM plugin integration so plugins can render or process audio at runtime.
181
- - 📦 **Addon manager & Devaforge** — CLI commands to discover/install banks, plugins and templates; `devaforge` helps create addons.
182
- - ⚙️ **CLI tooling** — `build`, `check`, `play`, `install`, `init`, `discover`, `telemetry` and more with consistent flags (`--watch`, `--debug`, `--compress`).
183
- - 📂 **Project templates & examples** — quick-start templates and many example projects in `examples/`.
184
- - 🧑‍💻 **TypeScript API & WASM distribution** — Node-friendly package with TypeScript bindings and a WASM build for browser/Node usage.
185
- - 🧰 **Editor & formatting support** — VSCode extension and Prettier plugin to edit Devalang with syntax and formatting support.
186
- - 🎵 **Custom samples & banks** — drop samples into `.deva` and reference them from code; banks of sounds for fast composition.
187
- - 🔄 **Looping, grouping & scheduling** — precise beat-tied scheduling primitives for complex rhythmic patterns.
188
-
189
- ## 📄 Documentation
133
+ ### 🎵 **Core Language**
134
+ - **Lexer & Parser** — Complete tokenization and AST generation
135
+ - **Patterns** — Rhythmic notation with swing, humanize, velocity
136
+ - **Synths** — Built-in synthesizers with ADSR envelopes
137
+ - **Filters** — Lowpass, highpass, bandpass audio filtering
138
+ - **Effects** — Reverb, delay, distortion, drive, chorus
139
+ - **Variables** — `let`, `const`, `var` with scoping
140
+ - **Groups & Spawn** — Organize and parallelize execution
141
+ - **Loops & Conditions** — `for`, `if`, `else` control flow
142
+ - **Triggers** — Conditional audio triggering
143
+ - **Events** — Event system with `on` and `emit`
144
+
145
+ ### 🛠️ **CLI Tools**
146
+ - ✅ `devalang init` — Scaffold new projects (3 templates)
147
+ - `devalang build` — Compile to WAV/MIDI
148
+ - ✅ `devalang check` — Validate syntax
149
+ - ✅ `devalang play` — Audio playback
150
+ - ✅ `devalang addon` — Manage addons (install, list, discover)
151
+ - ✅ `devalang login/logout` — Authentication
152
+ - ✅ `devalang telemetry` — Privacy controls
153
+
154
+ ### 🌐 **WASM API**
155
+ - ✅ `render_audio()` — Browser audio rendering
156
+ - ✅ `render_midi_array()` — MIDI export
157
+ - ✅ `debug_render()` — Debug information
158
+ - ✅ `parse()` — Parse Devalang code
159
+ - ✅ TypeScript types included
160
+
161
+ ### 📦 **Output Formats**
162
+ - ✅ **WAV** — 16/24/32-bit audio export
163
+ - ✅ **MIDI** — Standard MIDI file export
164
+ - ⚠️ **MP3/FLAC** — Planned for v0.1.1
165
+
166
+ ### 🎯 **Performance**
167
+ - ⚡ **Fast builds** — 7-10ms for typical projects
168
+ - ⚡ **Low latency** — Optimized audio engine
169
+ - ⚡ **Release builds** — 5-6x faster than debug
170
+
171
+ ### 📚 **Learning Resources**
172
+ - ✅ **Online Docs** — Complete language reference
173
+ - ✅ **VSCode Extension** — Syntax highlighting
174
+
175
+ ---
176
+
177
+ ## 💡 Why Devalang?
178
+
179
+ - 🎹 **Prototype audio ideas** without opening a DAW
180
+ - 💻 **Integrate sound** into code-based workflows
181
+ - 🎛️ **Control audio parameters** with readable syntax
182
+ - 🧪 **Build musical logic** with variables and conditions
183
+ - 🔄 **Create patterns** with expressive notation
184
+ - 🎨 **Live code** with fast iteration cycles
185
+ - 📦 **Version control** your music with git
186
+
187
+ ---
188
+
189
+ ## 📖 Documentation
190
+
191
+ **[Visit docs.devalang.com](https://docs.devalang.com)** for:
192
+ - Complete syntax reference
193
+ - API documentation
194
+ - WASM integration guide
195
+ - CLI command reference
196
+ - Advanced tutorials
197
+ - Best practices
198
+
199
+ ---
200
+
201
+ ## 🔧 Development
202
+
203
+ ### Build from Source
190
204
 
191
- ### [Please refer to the online documentation](https://docs.devalang.com) for detailed information on syntax, features, and usage examples
205
+ ```bash
206
+ # Clone the repository
207
+ git clone https://github.com/devaloop-labs/devalang.git
208
+ cd devalang
192
209
 
193
- ## 📰 What's new
210
+ # Build CLI (Rust)
211
+ cargo build --release --features cli
194
212
 
195
- - **MIDI export**: Added the ability to export MIDI files from Devalang scripts.
196
- - **Synthesizer improvements**: Enhanced the built-in synthesizer with new types and modulation options.
197
- - **Devaforge**: Introduced a new system for creating and managing addons, including a CLI for addon generation.
198
- - **Documentation updates**: Improved documentation for clarity and completeness.
199
- - **Discovering addons**: Introduced a new command to detect addons.
200
- - **Public TypeScript API**: Added a public TypeScript API for easier integration.
201
- - **Improved error messages**: Enhanced error messages for better debugging.
202
- - **Major refactor**: Significant codebase refactor for improved maintainability and performance.
203
- - **Bug fixes**: Various bug fixes and stability improvements.
213
+ # Build WASM
214
+ cargo build --release --features wasm --lib
204
215
 
205
- ## 🛡️ License
216
+ # Build TypeScript
217
+ npm install
218
+ npm run ts:build
206
219
 
207
- MIT see [LICENSE](./LICENSE)
220
+ # Run tests
221
+ cargo test --features cli
222
+ npm test
223
+ ```
208
224
 
209
225
  ## 🤝 Contributing
210
226
 
211
- Contributions, bug reports and suggestions are welcome !
212
- Feel free to open an issue or submit a pull request.
227
+ We welcome contributions! See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.
228
+
229
+ ### Ways to Contribute
213
230
 
214
- For more info, see [docs/CONTRIBUTING.md](./docs/CONTRIBUTING.md).
231
+ - 🐛 **Report bugs** via [GitHub Issues](https://github.com/devaloop-labs/devalang/issues)
232
+ - 💡 **Suggest features** in discussions
233
+ - 📝 **Improve docs** with pull requests
234
+ - 🎵 **Share examples** of your creations
235
+ - 🧪 **Write tests** for new features
215
236
 
216
- ## 📢 Contact
237
+ ---
217
238
 
218
- Feel free to reach out for any inquiries or feedback.
239
+ ## 📜 License
219
240
 
220
- 📧 [contact@devaloop.com](mailto:contact@devaloop.com)
241
+ MIT License — See [LICENSE](./LICENSE) for details.
242
+
243
+ Copyright (c) 2025 Devaloop
244
+
245
+ ---
246
+
247
+ <div align="center">
248
+ <strong>Made with ❤️ by the Devaloop team</strong>
249
+ <br />
250
+ <sub>Star ⭐ the repo if you like it!</sub>
251
+ </div>
@@ -0,0 +1,180 @@
1
+ /**
2
+ * High-level API wrapper for Devalang WASM functions
3
+ *
4
+ * This module provides TypeScript-friendly wrappers around the raw WASM bindings,
5
+ * with proper error handling and type conversions.
6
+ */
7
+ import type { RenderOptions, MidiOptions, ParseResult, DebugRenderResult, CodeMetadata, RegisteredBank, DebugState } from './types.js';
8
+ /**
9
+ * Parse Devalang source code
10
+ *
11
+ * @param entryPath - Path to the source file (for error messages)
12
+ * @param source - Devalang source code
13
+ * @returns Parse result with statements or errors
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const result = await parse('test.deva', 'bpm 120\nsleep 1b');
18
+ * if (result.success) {
19
+ * console.log(`Parsed ${result.statements.length} statements`);
20
+ * }
21
+ * ```
22
+ */
23
+ export declare function parse(entryPath: string, source: string): Promise<ParseResult>;
24
+ /**
25
+ * Quick syntax check without full parsing
26
+ *
27
+ * @param source - Devalang source code
28
+ * @returns true if syntax is valid
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * if (await checkSyntax('bpm 120')) {
33
+ * console.log('Valid syntax!');
34
+ * }
35
+ * ```
36
+ */
37
+ export declare function checkSyntax(source: string): Promise<boolean>;
38
+ /**
39
+ * Render audio from Devalang code
40
+ *
41
+ * @param code - Devalang source code
42
+ * @param options - Render options (sample rate, BPM)
43
+ * @returns Float32Array containing rendered audio samples
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * const audio = await renderAudio('bpm 120\nlet s = synth sine {}\ns -> note(A4, { duration: 500 })', {
48
+ * sampleRate: 44100,
49
+ * bpm: 120
50
+ * });
51
+ * console.log(`Rendered ${audio.length} samples`);
52
+ * ```
53
+ */
54
+ export declare function renderAudio(code: string, options?: RenderOptions): Promise<Float32Array>;
55
+ /**
56
+ * Render audio with debug information
57
+ *
58
+ * @param code - Devalang source code
59
+ * @param options - Render options
60
+ * @returns Debug render result with audio and metadata
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * const result = await debugRender('bpm 120\nlet s = synth sine {}\ns -> note(C4, { duration: 500 })');
65
+ * console.log(`Duration: ${result.duration}s, Events: ${result.eventCount}`);
66
+ * ```
67
+ */
68
+ export declare function debugRender(code: string, options?: RenderOptions): Promise<DebugRenderResult>;
69
+ /**
70
+ * Render WAV file preview as bytes
71
+ *
72
+ * @param code - Devalang source code
73
+ * @param options - Render options
74
+ * @returns Uint8Array containing WAV file bytes
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * const wavBytes = await renderWavPreview('bpm 120\nsleep 1b');
79
+ * // Save to file or send to browser for download
80
+ * ```
81
+ */
82
+ export declare function renderWavPreview(code: string, options?: RenderOptions): Promise<Uint8Array>;
83
+ /**
84
+ * Render MIDI file as bytes
85
+ *
86
+ * @param code - Devalang source code
87
+ * @param options - MIDI options
88
+ * @returns Uint8Array containing MIDI file bytes
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * const midiBytes = await renderMidi('bpm 120\nlet s = synth sine {}\ns -> note(C4, { duration: 1000 })');
93
+ * // Save as .mid file
94
+ * ```
95
+ */
96
+ export declare function renderMidi(code: string, options?: MidiOptions): Promise<Uint8Array>;
97
+ /**
98
+ * Get code metadata without rendering
99
+ *
100
+ * @param code - Devalang source code
101
+ * @param options - Options
102
+ * @returns Metadata about the code
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * const meta = await getCodeMetadata('bpm 140\nsleep 1b\nsleep 1b');
107
+ * console.log(`${meta.statementCount} statements at ${meta.bpm} BPM`);
108
+ * ```
109
+ */
110
+ export declare function getCodeMetadata(code: string, options?: RenderOptions): Promise<CodeMetadata>;
111
+ /**
112
+ * Register an audio sample with PCM data
113
+ *
114
+ * @param uri - Sample URI (e.g., "devalang://bank/kick.wav")
115
+ * @param pcm - PCM audio data as Float32Array
116
+ *
117
+ * @example
118
+ * ```typescript
119
+ * const pcm = new Float32Array([0.5, -0.5, 0.25, -0.25]);
120
+ * await registerSample('devalang://bank/test.wav', pcm);
121
+ * ```
122
+ */
123
+ export declare function registerSample(uri: string, pcm: Float32Array): Promise<boolean>;
124
+ /**
125
+ * Register an audio bank addon
126
+ *
127
+ * @param path - Addon path (e.g., "devalang://bank/publisher.name?triggers=kick:audio/kick.wav")
128
+ *
129
+ * @example
130
+ * ```typescript
131
+ * await registerAddon('devalang://bank/devaloop.808?triggers=kick:audio/kick.wav,snare:audio/snare.wav');
132
+ * ```
133
+ */
134
+ export declare function registerAddon(path: string): Promise<void>;
135
+ /**
136
+ * List all registered banks
137
+ *
138
+ * @returns Array of registered banks
139
+ *
140
+ * @example
141
+ * ```typescript
142
+ * const banks = await listRegisteredBanks();
143
+ * banks.forEach(bank => console.log(`${bank.alias}: ${bank.fullName}`));
144
+ * ```
145
+ */
146
+ export declare function listRegisteredBanks(): Promise<RegisteredBank[]>;
147
+ /**
148
+ * Get sample load events log
149
+ *
150
+ * @param clear - Whether to clear the log after reading
151
+ * @returns Array of log messages
152
+ */
153
+ export declare function getSampleLoadEvents(clear?: boolean): Promise<string[]>;
154
+ /**
155
+ * Get playback debug log
156
+ *
157
+ * @param clear - Whether to clear the log after reading
158
+ * @returns Array of debug messages
159
+ */
160
+ export declare function getPlaybackDebug(clear?: boolean): Promise<string[]>;
161
+ /**
162
+ * Get debug state
163
+ *
164
+ * @returns Current debug state
165
+ */
166
+ export declare function getDebugState(): Promise<DebugState>;
167
+ /**
168
+ * Enable or disable debug error logging
169
+ *
170
+ * @param enable - Whether to enable debug errors
171
+ */
172
+ export declare function setDebugErrors(enable: boolean): Promise<void>;
173
+ /**
174
+ * Get last errors
175
+ *
176
+ * @param clear - Whether to clear errors after reading
177
+ * @returns Array of error messages
178
+ */
179
+ export declare function getLastErrors(clear?: boolean): Promise<string[]>;
180
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/typescript/api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,UAAU,EACX,MAAM,YAAY,CAAC;AA2BpB;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAGnF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGlE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAO9F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAOnG;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAOjG;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CASzF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAOlG;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAGrF;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/D;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAGrE;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGnF;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGhF;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CAGzD;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAGnE;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAG7E"}