@devaloop/devalang 0.0.1-beta.1 → 0.0.1-beta.2

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 (220) hide show
  1. package/.devalang +9 -10
  2. package/Cargo.toml +5 -4
  3. package/README.md +7 -5
  4. package/docs/CHANGELOG.md +42 -0
  5. package/docs/ROADMAP.md +5 -1
  6. package/docs/TODO.md +3 -14
  7. package/examples/bus.deva +10 -0
  8. package/examples/effect.deva +2 -0
  9. package/examples/filter.deva +11 -0
  10. package/examples/lfo.deva +9 -0
  11. package/examples/synth.deva +11 -1
  12. package/examples/synth_types.deva +17 -0
  13. package/out-tsc/core/functions/index.d.ts +5 -0
  14. package/out-tsc/core/functions/index.js +11 -0
  15. package/out-tsc/pkg/devalang_core.d.ts +2 -0
  16. package/out-tsc/pkg/devalang_core.js +17 -2
  17. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +8 -7
  18. package/package.json +1 -1
  19. package/project-version.json +3 -3
  20. package/rust/cli/bank/api.rs +122 -122
  21. package/rust/cli/bank/commands.rs +33 -2
  22. package/rust/cli/bank/mod.rs +29 -29
  23. package/rust/cli/build/commands.rs +53 -3
  24. package/rust/cli/build/mod.rs +2 -2
  25. package/rust/cli/build/process.rs +26 -7
  26. package/rust/cli/check/mod.rs +2 -2
  27. package/rust/cli/discover/commands.rs +253 -253
  28. package/rust/cli/discover/config.rs +111 -111
  29. package/rust/cli/discover/fs.rs +19 -19
  30. package/rust/cli/discover/install.rs +103 -103
  31. package/rust/cli/discover/metadata.rs +48 -48
  32. package/rust/cli/discover/mod.rs +5 -5
  33. package/rust/cli/install/addon.rs +118 -118
  34. package/rust/cli/install/bank.rs +22 -3
  35. package/rust/cli/install/commands.rs +35 -35
  36. package/rust/cli/install/mod.rs +4 -4
  37. package/rust/cli/install/plugin.rs +80 -61
  38. package/rust/cli/login/commands.rs +124 -124
  39. package/rust/cli/mod.rs +12 -12
  40. package/rust/cli/parser.rs +46 -1
  41. package/rust/cli/play/commands.rs +71 -20
  42. package/rust/cli/play/mod.rs +5 -5
  43. package/rust/cli/play/process.rs +14 -5
  44. package/rust/cli/play/realtime.rs +91 -91
  45. package/rust/cli/telemetry/commands.rs +22 -22
  46. package/rust/cli/telemetry/event_creator.rs +80 -80
  47. package/rust/cli/telemetry/mod.rs +3 -3
  48. package/rust/cli/telemetry/send.rs +51 -51
  49. package/rust/cli/template/commands.rs +69 -69
  50. package/rust/config/driver.rs +112 -103
  51. package/rust/config/mod.rs +3 -3
  52. package/rust/config/ops.rs +26 -26
  53. package/rust/config/settings.rs +101 -101
  54. package/rust/core/audio/engine/driver.rs +220 -0
  55. package/rust/core/audio/engine/export.rs +169 -0
  56. package/rust/core/audio/engine/helpers.rs +178 -170
  57. package/rust/core/audio/engine/mod.rs +51 -2
  58. package/rust/core/audio/engine/notes/dsp.rs +85 -0
  59. package/rust/core/audio/engine/notes/mod.rs +44 -0
  60. package/rust/core/audio/engine/notes/params.rs +294 -0
  61. package/rust/core/audio/engine/sample/insert.rs +199 -0
  62. package/rust/core/audio/engine/sample/mod.rs +40 -0
  63. package/rust/core/audio/engine/sample/padding.rs +170 -0
  64. package/rust/core/audio/evaluator/condition.rs +61 -0
  65. package/rust/core/audio/evaluator/mod.rs +9 -0
  66. package/rust/core/audio/{evaluator.rs → evaluator/numeric.rs} +1 -159
  67. package/rust/core/audio/evaluator/rhs.rs +16 -0
  68. package/rust/core/audio/evaluator/string_expr.rs +94 -0
  69. package/rust/core/audio/interpreter/driver.rs +55 -23
  70. package/rust/core/audio/interpreter/mod.rs +1 -13
  71. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +175 -0
  72. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +384 -0
  73. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +2 -0
  74. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +316 -0
  75. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -0
  76. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -0
  77. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -0
  78. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -0
  79. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -0
  80. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -0
  81. package/rust/core/audio/interpreter/{automate.rs → statements/automate.rs} +16 -18
  82. package/rust/core/audio/interpreter/{call.rs → statements/call.rs} +5 -4
  83. package/rust/core/audio/interpreter/{condition.rs → statements/condition.rs} +2 -1
  84. package/rust/core/audio/interpreter/{function.rs → statements/function.rs} +2 -4
  85. package/rust/core/audio/interpreter/{let_.rs → statements/let_.rs} +2 -4
  86. package/rust/core/audio/interpreter/{load.rs → statements/load.rs} +2 -4
  87. package/rust/core/audio/interpreter/{loop_.rs → statements/loop_.rs} +2 -1
  88. package/rust/core/audio/interpreter/statements/mod.rs +12 -0
  89. package/rust/core/audio/interpreter/{sleep.rs → statements/sleep.rs} +28 -28
  90. package/rust/core/audio/interpreter/{spawn.rs → statements/spawn.rs} +3 -2
  91. package/rust/core/audio/interpreter/{tempo.rs → statements/tempo.rs} +40 -40
  92. package/rust/core/audio/interpreter/{trigger.rs → statements/trigger.rs} +1 -1
  93. package/rust/core/audio/loader/trigger.rs +2 -1
  94. package/rust/core/audio/mod.rs +6 -7
  95. package/rust/core/audio/player.rs +70 -70
  96. package/rust/core/audio/special/easing.rs +189 -189
  97. package/rust/core/audio/special/env.rs +45 -45
  98. package/rust/core/audio/special/math.rs +134 -134
  99. package/rust/core/audio/special/mod.rs +9 -9
  100. package/rust/core/audio/special/modulator.rs +143 -143
  101. package/rust/core/builder/mod.rs +45 -2
  102. package/rust/core/debugger/lexer.rs +27 -27
  103. package/rust/core/debugger/{module.rs → logs.rs} +3 -6
  104. package/rust/core/debugger/mod.rs +30 -30
  105. package/rust/core/debugger/preprocessor.rs +27 -27
  106. package/rust/core/debugger/store.rs +2 -4
  107. package/rust/core/error/mod.rs +269 -269
  108. package/rust/core/lexer/driver.rs +59 -61
  109. package/rust/core/lexer/handler/arrow.rs +82 -82
  110. package/rust/core/lexer/handler/at.rs +21 -21
  111. package/rust/core/lexer/handler/brace.rs +41 -41
  112. package/rust/core/lexer/handler/colon.rs +21 -21
  113. package/rust/core/lexer/handler/comment.rs +30 -30
  114. package/rust/core/lexer/handler/dot.rs +21 -21
  115. package/rust/core/lexer/handler/driver.rs +337 -337
  116. package/rust/core/lexer/handler/identifier.rs +47 -47
  117. package/rust/core/lexer/handler/indent.rs +66 -66
  118. package/rust/core/lexer/handler/mod.rs +15 -15
  119. package/rust/core/lexer/handler/newline.rs +23 -23
  120. package/rust/core/lexer/handler/number.rs +31 -31
  121. package/rust/core/lexer/handler/operator.rs +46 -46
  122. package/rust/core/lexer/handler/parenthesis.rs +41 -41
  123. package/rust/core/lexer/handler/slash.rs +21 -21
  124. package/rust/core/lexer/handler/string.rs +63 -63
  125. package/rust/core/lexer/mod.rs +3 -3
  126. package/rust/core/mod.rs +0 -1
  127. package/rust/core/parser/driver/block.rs +111 -0
  128. package/rust/core/parser/driver/cursor.rs +82 -0
  129. package/rust/core/parser/driver/driver_impl.rs +139 -0
  130. package/rust/core/parser/driver/mod.rs +6 -0
  131. package/rust/core/parser/driver/parse_array.rs +120 -0
  132. package/rust/core/parser/driver/parse_map.rs +223 -0
  133. package/rust/core/parser/driver/parser.rs +160 -0
  134. package/rust/core/parser/handler/arrow_call.rs +28 -4
  135. package/rust/core/parser/handler/at.rs +279 -279
  136. package/rust/core/parser/handler/bank.rs +104 -104
  137. package/rust/core/parser/handler/condition.rs +83 -83
  138. package/rust/core/parser/handler/dot.rs +148 -148
  139. package/rust/core/parser/handler/identifier/automate.rs +254 -254
  140. package/rust/core/parser/handler/identifier/call.rs +91 -91
  141. package/rust/core/parser/handler/identifier/emit.rs +70 -70
  142. package/rust/core/parser/handler/identifier/function.rs +113 -113
  143. package/rust/core/parser/handler/identifier/group.rs +89 -89
  144. package/rust/core/parser/handler/identifier/let_.rs +173 -173
  145. package/rust/core/parser/handler/identifier/mod.rs +55 -55
  146. package/rust/core/parser/handler/identifier/on.rs +107 -107
  147. package/rust/core/parser/handler/identifier/print.rs +49 -49
  148. package/rust/core/parser/handler/identifier/sleep.rs +96 -43
  149. package/rust/core/parser/handler/identifier/spawn.rs +91 -91
  150. package/rust/core/parser/handler/identifier/synth.rs +135 -135
  151. package/rust/core/parser/handler/loop_.rs +194 -194
  152. package/rust/core/parser/handler/mod.rs +9 -9
  153. package/rust/core/parser/handler/pattern.rs +1 -1
  154. package/rust/core/parser/handler/tempo.rs +105 -57
  155. package/rust/core/parser/statement.rs +10 -11
  156. package/rust/core/plugin/loader.rs +1 -1
  157. package/rust/core/plugin/mod.rs +2 -2
  158. package/rust/core/plugin/runner/mod.rs +11 -0
  159. package/rust/core/plugin/{runner.rs → runner/non_wasm.rs} +297 -347
  160. package/rust/core/plugin/runner/wasm32.rs +43 -0
  161. package/rust/core/preprocessor/loader/inject.rs +278 -0
  162. package/rust/core/preprocessor/loader/loader_helpers.rs +110 -0
  163. package/rust/core/preprocessor/loader/mod.rs +235 -0
  164. package/rust/core/preprocessor/module.rs +2 -7
  165. package/rust/core/preprocessor/{processor.rs → processor/handlers.rs} +6 -13
  166. package/rust/core/preprocessor/processor/mod.rs +1 -0
  167. package/rust/core/preprocessor/resolver/bank.rs +49 -49
  168. package/rust/core/preprocessor/resolver/call.rs +124 -124
  169. package/rust/core/preprocessor/resolver/condition.rs +95 -95
  170. package/rust/core/preprocessor/resolver/driver.rs +324 -324
  171. package/rust/core/preprocessor/resolver/function.rs +2 -2
  172. package/rust/core/preprocessor/resolver/group.rs +46 -18
  173. package/rust/core/preprocessor/resolver/let_.rs +32 -32
  174. package/rust/core/preprocessor/resolver/loop_.rs +318 -318
  175. package/rust/core/preprocessor/resolver/mod.rs +16 -16
  176. package/rust/core/preprocessor/resolver/pattern.rs +83 -83
  177. package/rust/core/preprocessor/resolver/spawn.rs +99 -99
  178. package/rust/core/preprocessor/resolver/synth.rs +54 -54
  179. package/rust/core/preprocessor/resolver/tempo.rs +48 -48
  180. package/rust/core/preprocessor/resolver/trigger.rs +116 -116
  181. package/rust/core/preprocessor/resolver/value.rs +176 -176
  182. package/rust/core/store/global.rs +2 -6
  183. package/rust/core/store/mod.rs +1 -5
  184. package/rust/lib.rs +18 -3
  185. package/rust/main.rs +27 -3
  186. package/rust/types/Cargo.toml +1 -1
  187. package/rust/types/src/addons.rs +55 -55
  188. package/rust/types/src/config.rs +84 -74
  189. package/rust/types/src/lib.rs +15 -12
  190. package/rust/types/src/plugin.rs +20 -0
  191. package/rust/types/src/store.rs +139 -0
  192. package/rust/types/src/telemetry.rs +85 -85
  193. package/rust/utils/Cargo.toml +2 -2
  194. package/rust/utils/src/file.rs +94 -94
  195. package/rust/utils/src/first_usage.rs +97 -97
  196. package/rust/utils/src/lib.rs +9 -9
  197. package/rust/utils/src/logger.rs +200 -200
  198. package/rust/utils/src/path.rs +129 -88
  199. package/rust/utils/src/signature.rs +41 -41
  200. package/rust/utils/src/spinner.rs +20 -20
  201. package/rust/utils/src/version.rs +27 -27
  202. package/rust/utils/src/watcher.rs +46 -46
  203. package/rust/web/api.rs +5 -5
  204. package/rust/web/cdn.rs +34 -34
  205. package/rust/web/mod.rs +3 -3
  206. package/tests/integration.rs +21 -21
  207. package/typescript/core/functions/index.ts +11 -0
  208. package/typescript/pkg/devalang_core.ts +20 -4
  209. package/rust/core/audio/engine/sample.rs +0 -366
  210. package/rust/core/audio/engine/synth.rs +0 -325
  211. package/rust/core/audio/interpreter/arrow_call.rs +0 -311
  212. package/rust/core/audio/renderer.rs +0 -54
  213. package/rust/core/parser/driver.rs +0 -584
  214. package/rust/core/preprocessor/loader.rs +0 -637
  215. package/rust/core/store/export.rs +0 -28
  216. package/rust/core/store/function.rs +0 -40
  217. package/rust/core/store/import.rs +0 -28
  218. package/rust/core/store/variable.rs +0 -51
  219. package/rust/core/utils/mod.rs +0 -1
  220. package/rust/core/utils/path.rs +0 -37
package/.devalang CHANGED
@@ -1,10 +1,9 @@
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"
1
+ [defaults]
2
+ entry = "./examples"
3
+ output = "./output"
4
+ watch = false
5
+ debug = true
6
+ compress = true
7
+ audio_format = "wav16"
8
+ sample_rate = 44100
9
+ output_format = ["wav", "mid"]
package/Cargo.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "devalang"
3
- version = "0.0.1-beta.1"
3
+ version = "0.0.1-beta.2"
4
4
  authors = ["Devaloop <contact@devaloop.com>"]
5
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
6
  license = "MIT"
@@ -29,7 +29,7 @@ default = ["cli"]
29
29
  cli = ["crossterm", "indicatif", "inquire", "zip", "reqwest", "flate2", "tokio"]
30
30
 
31
31
  [dependencies]
32
- devalang_types = { path = "rust/types", version = "0.0.2" }
32
+ devalang_types = { path = "rust/types", version = "0.0.3" }
33
33
  clap = { version = "4.5", features = ["derive"] }
34
34
  serde = { version = "1.0", features = ["derive"] }
35
35
  serde_json = "1.0"
@@ -59,6 +59,7 @@ dirs = "5"
59
59
  urlencoding = "2.1"
60
60
  uuid = { version = "1.18.0", features = ["v4"] }
61
61
  console_error_panic_hook = "0.1.7"
62
+ midly = "0.5.3"
62
63
 
63
64
  [dev-dependencies]
64
65
  assert_cmd = "2"
@@ -72,9 +73,9 @@ getrandom = { version = "0.3", features = ["wasm_js"] }
72
73
  uuid = { version = "1.18.0", features = ["v4", "js", "rng-getrandom"] }
73
74
  # Keep a lightweight linkage to the utils crate for wasm builds without
74
75
  # enabling native CLI features.
75
- devalang_utils = { path = "rust/utils", default-features = false, version = "0.0.1" }
76
+ devalang_utils = { path = "rust/utils", default-features = false, version = "0.0.2" }
76
77
 
77
78
  # devalang_utils with CLI and wasmtime are only needed for native targets.
78
79
  [target.'cfg(not(target_arch = "wasm32"))'.dependencies]
79
- devalang_utils = { path = "rust/utils", features = ["cli"], version = "0.0.1" }
80
+ devalang_utils = { path = "rust/utils", features = ["cli"], version = "0.0.2" }
80
81
  wasmtime = "19"
package/README.md CHANGED
@@ -65,7 +65,7 @@ npm install -g @devaloop/devalang@latest
65
65
  #### With Rust
66
66
 
67
67
  ```bash
68
- cargo install devalang
68
+ cargo install devalang --version <version>
69
69
  ```
70
70
 
71
71
  #### Initialize a new project
@@ -136,8 +136,8 @@ group myGroup:
136
136
  })
137
137
 
138
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 })
139
+ myLead -> note(G4, { duration: 600, glide: true })
140
+ myLead -> note(B3, { duration: 400, slide: true })
141
141
 
142
142
  # Spawning the group & the pattern to play them in parallel
143
143
  spawn myGroup
@@ -173,8 +173,7 @@ devalang play --repeat
173
173
  ## 🚀 Features
174
174
 
175
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.
176
+ - 🎵 **Audio Engine & Real-time runner** — low-latency playback, render-to-file, and a realtime runner used by `devalang play --repeat` for live feedback.
178
177
  - 🧩 **Language primitives** — synths, notes, ADSR, maps, arrays, loops, conditionals and functions for expressive musical logic.
179
178
  - 🎛️ **Per-note automation & modulators** — `automate` maps, `$mod.*`, `$easing.*` and `$math.*` helpers for envelopes and LFOs.
180
179
  - 🧩 **Module system & structured AST** — import/export variables, stable AST output for debugging and tooling.
@@ -193,11 +192,14 @@ devalang play --repeat
193
192
 
194
193
  ## 📰 What's new
195
194
 
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.
196
197
  - **Devaforge**: Introduced a new system for creating and managing addons, including a CLI for addon generation.
197
198
  - **Documentation updates**: Improved documentation for clarity and completeness.
198
199
  - **Discovering addons**: Introduced a new command to detect addons.
199
200
  - **Public TypeScript API**: Added a public TypeScript API for easier integration.
200
201
  - **Improved error messages**: Enhanced error messages for better debugging.
202
+ - **Major refactor**: Significant codebase refactor for improved maintainability and performance.
201
203
  - **Bug fixes**: Various bug fixes and stability improvements.
202
204
 
203
205
  ## 🛡️ License
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,48 @@
4
4
 
5
5
  # Changelog
6
6
 
7
+ ## Version 0.0.1-beta.2 (2025-09-07)
8
+
9
+ ### 🛠️ MIDI & format
10
+
11
+ - Added support for `mid` export in `build` command.
12
+ - Example: `devalang build --output-format mid,wav`
13
+ - Added support for `wav16` and `wav32` audio formats in `play` command.
14
+ - Example: `devalang play --audio-format <wav16 | wav32>`
15
+ - Added support for `sample_rate` parameter in `play` and `build` commands.
16
+ - Example: `devalang play --sample-rate <44100 | 48000 | 96000>`
17
+ - Example: `devalang build --sample-rate <44100 | 48000 | 96000>`
18
+
19
+ ### ✨ Language Features
20
+
21
+ - `synth` enhancements:
22
+ - Types:
23
+ - Added `pad` type for lush, evolving sounds.
24
+ - Added `pluck` type for sharp, percussive tones.
25
+ - Added `arp` type for arpeggiated sequences.
26
+ - Added `sub` type for deep bass sounds.
27
+ - LFOs:
28
+ - Added `lfo` parameter to `synth` for low-frequency oscillation modulation.
29
+ - LFO supports `rate`, `depth`, and `target` parameters.
30
+ - Filters:
31
+ - Added `filters` parameter to `synth` for applying filters.
32
+ - `arrow_call` enhancements:
33
+ - Added support for `chord` method to play multiple notes simultaneously.
34
+
35
+ ### 🧠 Architecture & Refactor
36
+
37
+ - Modularized some core components to improve maintainability and readability.
38
+
39
+ ### 📚 Examples
40
+
41
+ - Added `examples/filter.deva` to showcase filter usage in synths.
42
+ - Added `examples/lfo.deva` to illustrate LFO modulation in synths.
43
+ - Added `examples/synth_types.deva` to demonstrate various synth types.
44
+
45
+ ### 📦 WASM
46
+
47
+ - Added `collect_playhead_events` function to the WASM module to collect playhead events during audio rendering.
48
+
7
49
  ## Version 0.0.1-beta.1 (2025-09-02)
8
50
 
9
51
  > First beta of Devalang 0.0.1. Focus on stability, language surface freeze, and developer experience. No breaking changes expected compared to alpha.18; experimental features are gated and may change.
package/docs/ROADMAP.md CHANGED
@@ -9,6 +9,7 @@ Devalang is a work in progress. Here’s what we’re planning next:
9
9
  ## Completed
10
10
 
11
11
  - ✅ **Audio engine**: Integrate the audio engine for sound playback.
12
+ - ✅ **MIDI export**: Implement MIDI export functionality to save compositions as MIDI files.
12
13
  - ✅ **Basic syntax**: Implement the core syntax for Devalang, including data types and basic statements.
13
14
  - ✅ **Watch mode**: Add a watch mode to automatically rebuild on file changes.
14
15
  - ✅ **Module system**: Add support for importing and exporting variables between files using `@import` and `@export`.
@@ -27,8 +28,11 @@ Devalang is a work in progress. Here’s what we’re planning next:
27
28
 
28
29
  - ⏳ **Addon generator**: Implement addon generation for creating reusable plugins, banks and presets.
29
30
  - ⏳ **Testing**: Expand test coverage for all features.
30
- - ⏳ **Other statements**: Implement `pattern`, and other control structures.
31
31
 
32
32
  ## Planned
33
33
 
34
+ - ⏳ **MIDI mapping**: Implement MIDI mapping for external control.
35
+ - ⏳ **GUI**: Develop a graphical user interface for easier interaction.
36
+ - ⏳ **Mixing & Routing**: Implement mixing and routing capabilities for advanced audio control.
37
+ - ⏳ **Effect chains**: Implement effect chains for applying multiple effects to a single note or group.
34
38
  - ⏳ **Smart modules**: Let Devalang detect and use groups, samples, and variables without needing to import them manually.
package/docs/TODO.md CHANGED
@@ -41,9 +41,8 @@ This is a list of tasks and features to be implemented in Devalang. Note that th
41
41
  - [x] @import
42
42
  - [x] @export
43
43
  - [x] @load
44
- - [ ] @include
45
44
  - [x] function
46
- - [ ] pattern
45
+ - [x] pattern
47
46
  - [x] group
48
47
  - [x] call
49
48
  - [x] spawn
@@ -58,8 +57,8 @@ This is a list of tasks and features to be implemented in Devalang. Note that th
58
57
 
59
58
  ## Triggers
60
59
 
61
- - [x] Built-in triggers
62
60
  - [x] Custom triggers
61
+ - [x] Event triggers
63
62
 
64
63
  ## Banks
65
64
 
@@ -69,14 +68,4 @@ This is a list of tasks and features to be implemented in Devalang. Note that th
69
68
  ## Plugins
70
69
 
71
70
  - [x] Implement plugin system (e.g. install, remove, list)
72
- - [ ] Create example plugins
73
-
74
- ## Addon generator
75
-
76
- - [x] Implement addon generator
77
- - [ ] Create example addons
78
-
79
- ## Other TODOs
80
-
81
- - [ ] Comment all core components
82
- - [ ] Add unit tests for all core components
71
+ - [ ] Create example plugins
@@ -0,0 +1,10 @@
1
+ # NOTE Planned for future release
2
+
3
+ # let sidechainBus = bus {
4
+ # fx: [
5
+ # { type: "compressor", threshold: -20, ratio: 8, attack: 5, release: 100,
6
+ # sidechain: myKick }
7
+ # ]
8
+ # }
9
+ # route myLead -> sidechainBus -> masterBus
10
+ # route myKick -> myBass -> masterBus
@@ -0,0 +1,2 @@
1
+ # NOTE Planned for future release
2
+ # myChord -> note(C4) -> arp({ pattern: "up", rate: 1/8 }) -> slide({ duration: 2000 }) -> echo({ delay: 250, feedback: 0.5 }) -> reverb({ room_size: 0.8 })
@@ -0,0 +1,11 @@
1
+ let myFilteredSynth = synth sine {
2
+ filters: [
3
+ { type: "lowpass", cutoff: 800.0, resonance: 1.0 },
4
+ { type: "bandpass", cutoff: 400.0, resonance: 1.0 },
5
+ { type: "highpass", cutoff: 200.0, resonance: 1.0 }
6
+ ],
7
+ }
8
+
9
+ myFilteredSynth -> note(C4, { duration: 500 })
10
+ myFilteredSynth -> note(E4, { duration: 500 })
11
+ myFilteredSynth -> note(G4, { duration: 500 })
@@ -0,0 +1,9 @@
1
+ let myLFOSynth = synth sine {
2
+ lfo: {
3
+ rate: 1/4,
4
+ depth: 0.5,
5
+ target: "cutoff"
6
+ }
7
+ }
8
+
9
+ myLFOSynth -> note(C4, { duration: 500 })
@@ -11,4 +11,14 @@ group myLead:
11
11
  mySynth -> note(D4, { duration: 400 })
12
12
  mySynth -> note(B3, { duration: 600 })
13
13
 
14
- @export { myLead }
14
+ group myChords:
15
+ let chordSynth = synth square
16
+
17
+ chordSynth -> chord(Cmaj, { duration: 1600 })
18
+ chordSynth -> chord(Fmaj, { duration: 1600 })
19
+ chordSynth -> chord(Gmaj, { duration: 1600 })
20
+ chordSynth -> chord(Am, { duration: 1600 })
21
+
22
+ # Play both groups together
23
+ spawn myLead
24
+ spawn myChords
@@ -0,0 +1,17 @@
1
+ let myPad = synth sine {
2
+ type: "pad"
3
+ }
4
+
5
+ let myPluck = synth sine {
6
+ type: "pluck"
7
+ }
8
+
9
+ let myArp = synth sine {
10
+ type: "arp",
11
+ rate: 16,
12
+ step: 2
13
+ }
14
+
15
+ let mySub = synth sine {
16
+ type: "sub",
17
+ }
@@ -30,6 +30,11 @@ export declare function register_playhead_callback(cb: (ev: {
30
30
  line: number;
31
31
  column: number;
32
32
  }) => void): any;
33
+ /**
34
+ * Collects playhead events that have been recorded during playback.
35
+ * @returns Array of playhead events { time, line, column }.
36
+ */
37
+ export declare function collect_playhead_events(): any;
33
38
  /**
34
39
  * Unregisters the JS callback for playhead events.
35
40
  * @returns void
@@ -4,6 +4,7 @@ exports.parse = parse;
4
4
  exports.debug_render = debug_render;
5
5
  exports.render_audio = render_audio;
6
6
  exports.register_playhead_callback = register_playhead_callback;
7
+ exports.collect_playhead_events = collect_playhead_events;
7
8
  exports.unregister_playhead_callback = unregister_playhead_callback;
8
9
  let wasmPkg = undefined;
9
10
  try {
@@ -64,6 +65,16 @@ function register_playhead_callback(cb) {
64
65
  // no-op fallback
65
66
  return;
66
67
  }
68
+ /**
69
+ * Collects playhead events that have been recorded during playback.
70
+ * @returns Array of playhead events { time, line, column }.
71
+ */
72
+ function collect_playhead_events() {
73
+ if (wasmPkg && typeof wasmPkg.collect_playhead_events === "function") {
74
+ return wasmPkg.collect_playhead_events();
75
+ }
76
+ return [];
77
+ }
67
78
  /**
68
79
  * Unregisters the JS callback for playhead events.
69
80
  * @returns void
@@ -2,12 +2,14 @@ export declare function parse(...args: any[]): any;
2
2
  export declare function debug_render(...args: any[]): any;
3
3
  export declare function render_audio(...args: any[]): any;
4
4
  export declare function register_playhead_callback(cb?: any): any;
5
+ export declare function collect_playhead_events(): any;
5
6
  export declare function unregister_playhead_callback(): any;
6
7
  declare const pkg: {
7
8
  parse: typeof parse;
8
9
  debug_render: typeof debug_render;
9
10
  render_audio: typeof render_audio;
10
11
  register_playhead_callback: typeof register_playhead_callback;
12
+ collect_playhead_events: typeof collect_playhead_events;
11
13
  unregister_playhead_callback: typeof unregister_playhead_callback;
12
14
  };
13
15
  export default pkg;
@@ -4,6 +4,7 @@ exports.parse = parse;
4
4
  exports.debug_render = debug_render;
5
5
  exports.render_audio = render_audio;
6
6
  exports.register_playhead_callback = register_playhead_callback;
7
+ exports.collect_playhead_events = collect_playhead_events;
7
8
  exports.unregister_playhead_callback = unregister_playhead_callback;
8
9
  /**
9
10
  * Shim TypeScript source that re-exports the runtime wasm-pack package when
@@ -41,10 +42,24 @@ function register_playhead_callback(cb) {
41
42
  return runtimePkg.register_playhead_callback(cb);
42
43
  return;
43
44
  }
45
+ function collect_playhead_events() {
46
+ if (runtimePkg && typeof runtimePkg.collect_playhead_events === "function") {
47
+ return runtimePkg.collect_playhead_events();
48
+ }
49
+ return [];
50
+ }
44
51
  function unregister_playhead_callback() {
45
- if (runtimePkg && typeof runtimePkg.unregister_playhead_callback === "function")
52
+ if (runtimePkg &&
53
+ typeof runtimePkg.unregister_playhead_callback === "function")
46
54
  return runtimePkg.unregister_playhead_callback();
47
55
  return;
48
56
  }
49
- const pkg = { parse, debug_render, render_audio, register_playhead_callback, unregister_playhead_callback };
57
+ const pkg = {
58
+ parse,
59
+ debug_render,
60
+ render_audio,
61
+ register_playhead_callback,
62
+ collect_playhead_events,
63
+ unregister_playhead_callback,
64
+ };
50
65
  exports.default = pkg;
@@ -1,28 +1,29 @@
1
1
  /* tslint:disable */
2
2
  /* eslint-disable */
3
3
  export const memory: WebAssembly.Memory;
4
- export const debug_render: (a: number, b: number) => [number, number, number];
5
4
  export const parse: (a: number, b: number, c: number, d: number) => [number, number, number];
6
- export const register_playhead_callback: (a: any) => void;
5
+ export const debug_render: (a: number, b: number) => [number, number, number];
7
6
  export const render_audio: (a: number, b: number) => [number, number, number];
7
+ export const register_playhead_callback: (a: any) => void;
8
+ export const collect_playhead_events: () => [number, number, number];
8
9
  export const unregister_playhead_callback: () => void;
10
+ export const rust_lzma_wasm_shim_malloc: (a: number) => number;
9
11
  export const rust_lzma_wasm_shim_calloc: (a: number, b: number) => number;
10
12
  export const rust_lzma_wasm_shim_free: (a: number) => void;
11
- export const rust_lzma_wasm_shim_malloc: (a: number) => number;
12
- export const rust_lzma_wasm_shim_memchr: (a: number, b: number, c: number) => number;
13
13
  export const rust_lzma_wasm_shim_memcmp: (a: number, b: number, c: number) => number;
14
14
  export const rust_lzma_wasm_shim_memcpy: (a: number, b: number, c: number) => number;
15
15
  export const rust_lzma_wasm_shim_memmove: (a: number, b: number, c: number) => number;
16
16
  export const rust_lzma_wasm_shim_memset: (a: number, b: number, c: number) => number;
17
17
  export const rust_lzma_wasm_shim_strlen: (a: number) => number;
18
- export const rust_zstd_wasm_shim_calloc: (a: number, b: number) => number;
19
- export const rust_zstd_wasm_shim_free: (a: number) => void;
18
+ export const rust_lzma_wasm_shim_memchr: (a: number, b: number, c: number) => number;
19
+ export const rust_zstd_wasm_shim_qsort: (a: number, b: number, c: number, d: number) => void;
20
20
  export const rust_zstd_wasm_shim_malloc: (a: number) => number;
21
21
  export const rust_zstd_wasm_shim_memcmp: (a: number, b: number, c: number) => number;
22
+ export const rust_zstd_wasm_shim_calloc: (a: number, b: number) => number;
23
+ export const rust_zstd_wasm_shim_free: (a: number) => void;
22
24
  export const rust_zstd_wasm_shim_memcpy: (a: number, b: number, c: number) => number;
23
25
  export const rust_zstd_wasm_shim_memmove: (a: number, b: number, c: number) => number;
24
26
  export const rust_zstd_wasm_shim_memset: (a: number, b: number, c: number) => number;
25
- export const rust_zstd_wasm_shim_qsort: (a: number, b: number, c: number, d: number) => void;
26
27
  export const __wbindgen_malloc: (a: number, b: number) => number;
27
28
  export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
28
29
  export const __wbindgen_exn_store: (a: number) => void;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@devaloop/devalang",
3
3
  "private": false,
4
- "version": "0.0.1-beta.1",
4
+ "version": "0.0.1-beta.2",
5
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
6
  "main": "out-tsc/index.js",
7
7
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.0.1-beta.1",
2
+ "version": "0.0.1-beta.2",
3
3
  "channel": "beta",
4
- "lastCommit": "888ed3a754f3bc95362eb9742c2ed8873b3cfd5f",
5
- "build": 0
4
+ "lastCommit": "024b7abee45bdc5e034a4efd4a3f60dbd958eec0",
5
+ "build": 1
6
6
  }