@devaloop/devalang 0.0.1-beta.3 → 0.1.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 (346) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +251 -221
  3. package/out-tsc/api.d.ts +180 -0
  4. package/out-tsc/api.d.ts.map +1 -0
  5. package/out-tsc/api.js +286 -0
  6. package/out-tsc/api.js.map +1 -0
  7. package/out-tsc/bin/index.d.ts +12 -0
  8. package/out-tsc/bin/index.d.ts.map +1 -0
  9. package/out-tsc/bin/index.js +20 -54
  10. package/out-tsc/bin/index.js.map +1 -0
  11. package/out-tsc/examples/basic-usage.d.ts +8 -0
  12. package/out-tsc/examples/basic-usage.d.ts.map +1 -0
  13. package/out-tsc/examples/basic-usage.js +113 -0
  14. package/out-tsc/examples/basic-usage.js.map +1 -0
  15. package/out-tsc/index.d.ts +19 -5
  16. package/out-tsc/index.d.ts.map +1 -0
  17. package/out-tsc/index.js +24 -6
  18. package/out-tsc/index.js.map +1 -0
  19. package/out-tsc/scripts/copy-wasm-dts.d.ts +7 -0
  20. package/out-tsc/scripts/copy-wasm-dts.d.ts.map +1 -0
  21. package/out-tsc/scripts/copy-wasm-dts.js +36 -32
  22. package/out-tsc/scripts/copy-wasm-dts.js.map +1 -0
  23. package/out-tsc/scripts/postinstall.d.ts +1 -0
  24. package/out-tsc/scripts/postinstall.d.ts.map +1 -0
  25. package/out-tsc/scripts/postinstall.js +4 -1
  26. package/out-tsc/scripts/postinstall.js.map +1 -0
  27. package/out-tsc/scripts/version/bump.d.ts +5 -1
  28. package/out-tsc/scripts/version/bump.d.ts.map +1 -0
  29. package/out-tsc/scripts/version/bump.js +122 -44
  30. package/out-tsc/scripts/version/bump.js.map +1 -0
  31. package/out-tsc/scripts/version/fetch.d.ts +12 -1
  32. package/out-tsc/scripts/version/fetch.d.ts.map +1 -0
  33. package/out-tsc/scripts/version/fetch.js +68 -24
  34. package/out-tsc/scripts/version/fetch.js.map +1 -0
  35. package/out-tsc/scripts/version/index.d.ts +6 -0
  36. package/out-tsc/scripts/version/index.d.ts.map +1 -0
  37. package/out-tsc/scripts/version/index.js +44 -22
  38. package/out-tsc/scripts/version/index.js.map +1 -0
  39. package/out-tsc/scripts/version/sync.d.ts +5 -1
  40. package/out-tsc/scripts/version/sync.d.ts.map +1 -0
  41. package/out-tsc/scripts/version/sync.js +95 -29
  42. package/out-tsc/scripts/version/sync.js.map +1 -0
  43. package/out-tsc/types.d.ts +68 -0
  44. package/out-tsc/types.d.ts.map +1 -0
  45. package/out-tsc/{core/types/value.js → types.js} +4 -0
  46. package/out-tsc/types.js.map +1 -0
  47. package/out-tsc/wasm.d.ts +8 -0
  48. package/out-tsc/wasm.d.ts.map +1 -0
  49. package/out-tsc/{core/index.js → wasm.js} +9 -6
  50. package/out-tsc/wasm.js.map +1 -0
  51. package/package.json +42 -42
  52. package/.cargo/config.toml +0 -2
  53. package/.devalang +0 -9
  54. package/.github/workflows/ci.yml +0 -103
  55. package/Cargo.toml +0 -84
  56. package/docs/CHANGELOG.md +0 -622
  57. package/docs/CONTRIBUTING.md +0 -101
  58. package/docs/ROADMAP.md +0 -38
  59. package/docs/TODO.md +0 -71
  60. package/examples/automation.deva +0 -42
  61. package/examples/bank.deva +0 -7
  62. package/examples/bus.deva +0 -10
  63. package/examples/chain.deva +0 -19
  64. package/examples/condition.deva +0 -20
  65. package/examples/duration.deva +0 -9
  66. package/examples/effect.deva +0 -2
  67. package/examples/events.deva +0 -12
  68. package/examples/filter.deva +0 -11
  69. package/examples/function.deva +0 -15
  70. package/examples/group.deva +0 -12
  71. package/examples/index.deva +0 -63
  72. package/examples/lfo.deva +0 -9
  73. package/examples/loop.deva +0 -10
  74. package/examples/pattern.deva +0 -8
  75. package/examples/plugin.deva +0 -16
  76. package/examples/routing.deva +0 -23
  77. package/examples/samples/hat-808.wav +0 -0
  78. package/examples/samples/kick-808.wav +0 -0
  79. package/examples/synth.deva +0 -24
  80. package/examples/synth_types.deva +0 -17
  81. package/examples/variables.deva +0 -9
  82. package/out-tsc/bin/project-version.json +0 -6
  83. package/out-tsc/core/functions/index.d.ts +0 -42
  84. package/out-tsc/core/functions/index.js +0 -87
  85. package/out-tsc/core/index.d.ts +0 -6
  86. package/out-tsc/core/types/index.d.ts +0 -4
  87. package/out-tsc/core/types/index.js +0 -20
  88. package/out-tsc/core/types/plugin.d.ts +0 -18
  89. package/out-tsc/core/types/plugin.js +0 -2
  90. package/out-tsc/core/types/result.d.ts +0 -27
  91. package/out-tsc/core/types/result.js +0 -2
  92. package/out-tsc/core/types/statement.d.ts +0 -106
  93. package/out-tsc/core/types/statement.js +0 -2
  94. package/out-tsc/core/types/value.d.ts +0 -43
  95. package/out-tsc/pkg/devalang_core.d.ts +0 -15
  96. package/out-tsc/pkg/devalang_core.js +0 -65
  97. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +0 -34
  98. package/out-tsc/scripts/version/copy-to-binary.d.ts +0 -1
  99. package/out-tsc/scripts/version/copy-to-binary.js +0 -79
  100. package/project-version.json +0 -6
  101. package/rust/bindings/Cargo.toml +0 -9
  102. package/rust/bindings/src/lib.rs +0 -86
  103. package/rust/cli/addon/commands.rs +0 -35
  104. package/rust/cli/addon/download.rs +0 -234
  105. package/rust/cli/addon/install.rs +0 -33
  106. package/rust/cli/addon/list.rs +0 -224
  107. package/rust/cli/addon/metadata.rs +0 -124
  108. package/rust/cli/addon/mod.rs +0 -8
  109. package/rust/cli/addon/remove.rs +0 -271
  110. package/rust/cli/addon/update.rs +0 -305
  111. package/rust/cli/addon/utils.rs +0 -109
  112. package/rust/cli/build/commands.rs +0 -153
  113. package/rust/cli/build/mod.rs +0 -2
  114. package/rust/cli/build/process.rs +0 -165
  115. package/rust/cli/check/mod.rs +0 -208
  116. package/rust/cli/discover/commands.rs +0 -275
  117. package/rust/cli/discover/config.rs +0 -109
  118. package/rust/cli/discover/fs.rs +0 -19
  119. package/rust/cli/discover/install.rs +0 -214
  120. package/rust/cli/discover/metadata.rs +0 -48
  121. package/rust/cli/discover/mod.rs +0 -5
  122. package/rust/cli/init/commands.rs +0 -88
  123. package/rust/cli/init/mod.rs +0 -1
  124. package/rust/cli/login/commands.rs +0 -124
  125. package/rust/cli/login/mod.rs +0 -1
  126. package/rust/cli/me/commands.rs +0 -52
  127. package/rust/cli/me/mod.rs +0 -1
  128. package/rust/cli/mod.rs +0 -12
  129. package/rust/cli/parser.rs +0 -320
  130. package/rust/cli/play/commands.rs +0 -375
  131. package/rust/cli/play/io.rs +0 -17
  132. package/rust/cli/play/mod.rs +0 -5
  133. package/rust/cli/play/process.rs +0 -159
  134. package/rust/cli/play/realtime.rs +0 -91
  135. package/rust/cli/play/utils.rs +0 -23
  136. package/rust/cli/telemetry/commands.rs +0 -22
  137. package/rust/cli/telemetry/event_creator.rs +0 -80
  138. package/rust/cli/telemetry/mod.rs +0 -3
  139. package/rust/cli/telemetry/send.rs +0 -51
  140. package/rust/cli/template/commands.rs +0 -69
  141. package/rust/cli/template/mod.rs +0 -1
  142. package/rust/cli/update/commands.rs +0 -6
  143. package/rust/cli/update/mod.rs +0 -1
  144. package/rust/config/driver.rs +0 -112
  145. package/rust/config/mod.rs +0 -3
  146. package/rust/config/ops.rs +0 -26
  147. package/rust/config/settings.rs +0 -101
  148. package/rust/core/audio/engine/driver.rs +0 -237
  149. package/rust/core/audio/engine/export.rs +0 -169
  150. package/rust/core/audio/engine/helpers.rs +0 -178
  151. package/rust/core/audio/engine/mod.rs +0 -56
  152. package/rust/core/audio/engine/notes/dsp.rs +0 -88
  153. package/rust/core/audio/engine/notes/mod.rs +0 -53
  154. package/rust/core/audio/engine/notes/params.rs +0 -294
  155. package/rust/core/audio/engine/sample/insert.rs +0 -300
  156. package/rust/core/audio/engine/sample/mod.rs +0 -40
  157. package/rust/core/audio/engine/sample/padding.rs +0 -170
  158. package/rust/core/audio/evaluator/condition.rs +0 -61
  159. package/rust/core/audio/evaluator/mod.rs +0 -9
  160. package/rust/core/audio/evaluator/numeric.rs +0 -152
  161. package/rust/core/audio/evaluator/rhs.rs +0 -16
  162. package/rust/core/audio/evaluator/string_expr.rs +0 -94
  163. package/rust/core/audio/interpreter/driver.rs +0 -574
  164. package/rust/core/audio/interpreter/mod.rs +0 -2
  165. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +0 -179
  166. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +0 -398
  167. package/rust/core/audio/interpreter/statements/arrow_call/methods/effects.rs +0 -323
  168. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +0 -3
  169. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +0 -371
  170. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +0 -3
  171. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +0 -192
  172. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +0 -24
  173. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +0 -116
  174. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +0 -97
  175. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +0 -100
  176. package/rust/core/audio/interpreter/statements/automate.rs +0 -16
  177. package/rust/core/audio/interpreter/statements/call.rs +0 -325
  178. package/rust/core/audio/interpreter/statements/condition.rs +0 -72
  179. package/rust/core/audio/interpreter/statements/function.rs +0 -24
  180. package/rust/core/audio/interpreter/statements/let_.rs +0 -36
  181. package/rust/core/audio/interpreter/statements/load.rs +0 -17
  182. package/rust/core/audio/interpreter/statements/loop_.rs +0 -115
  183. package/rust/core/audio/interpreter/statements/mod.rs +0 -12
  184. package/rust/core/audio/interpreter/statements/sleep.rs +0 -28
  185. package/rust/core/audio/interpreter/statements/spawn.rs +0 -302
  186. package/rust/core/audio/interpreter/statements/tempo.rs +0 -40
  187. package/rust/core/audio/interpreter/statements/trigger.rs +0 -242
  188. package/rust/core/audio/loader/mod.rs +0 -1
  189. package/rust/core/audio/loader/trigger.rs +0 -98
  190. package/rust/core/audio/mod.rs +0 -6
  191. package/rust/core/audio/player.rs +0 -70
  192. package/rust/core/audio/special/easing.rs +0 -189
  193. package/rust/core/audio/special/env.rs +0 -45
  194. package/rust/core/audio/special/math.rs +0 -134
  195. package/rust/core/audio/special/mod.rs +0 -9
  196. package/rust/core/audio/special/modulator.rs +0 -143
  197. package/rust/core/builder/mod.rs +0 -129
  198. package/rust/core/debugger/lexer.rs +0 -27
  199. package/rust/core/debugger/logs.rs +0 -52
  200. package/rust/core/debugger/mod.rs +0 -30
  201. package/rust/core/debugger/preprocessor.rs +0 -27
  202. package/rust/core/debugger/store.rs +0 -38
  203. package/rust/core/error/mod.rs +0 -269
  204. package/rust/core/lexer/driver.rs +0 -59
  205. package/rust/core/lexer/handler/arrow.rs +0 -82
  206. package/rust/core/lexer/handler/at.rs +0 -21
  207. package/rust/core/lexer/handler/brace.rs +0 -41
  208. package/rust/core/lexer/handler/colon.rs +0 -21
  209. package/rust/core/lexer/handler/comment.rs +0 -30
  210. package/rust/core/lexer/handler/dot.rs +0 -21
  211. package/rust/core/lexer/handler/driver.rs +0 -337
  212. package/rust/core/lexer/handler/identifier.rs +0 -47
  213. package/rust/core/lexer/handler/indent.rs +0 -66
  214. package/rust/core/lexer/handler/mod.rs +0 -15
  215. package/rust/core/lexer/handler/newline.rs +0 -23
  216. package/rust/core/lexer/handler/number.rs +0 -31
  217. package/rust/core/lexer/handler/operator.rs +0 -46
  218. package/rust/core/lexer/handler/parenthesis.rs +0 -41
  219. package/rust/core/lexer/handler/slash.rs +0 -21
  220. package/rust/core/lexer/handler/string.rs +0 -63
  221. package/rust/core/lexer/mod.rs +0 -3
  222. package/rust/core/lexer/token.rs +0 -91
  223. package/rust/core/mod.rs +0 -9
  224. package/rust/core/parser/driver/block.rs +0 -111
  225. package/rust/core/parser/driver/cursor.rs +0 -82
  226. package/rust/core/parser/driver/driver_impl.rs +0 -159
  227. package/rust/core/parser/driver/mod.rs +0 -6
  228. package/rust/core/parser/driver/parse_array.rs +0 -120
  229. package/rust/core/parser/driver/parse_map.rs +0 -247
  230. package/rust/core/parser/driver/parser.rs +0 -160
  231. package/rust/core/parser/handler/arrow_call.rs +0 -328
  232. package/rust/core/parser/handler/at.rs +0 -279
  233. package/rust/core/parser/handler/bank.rs +0 -104
  234. package/rust/core/parser/handler/condition.rs +0 -83
  235. package/rust/core/parser/handler/dot.rs +0 -148
  236. package/rust/core/parser/handler/identifier/automate.rs +0 -254
  237. package/rust/core/parser/handler/identifier/call.rs +0 -91
  238. package/rust/core/parser/handler/identifier/emit.rs +0 -70
  239. package/rust/core/parser/handler/identifier/function.rs +0 -113
  240. package/rust/core/parser/handler/identifier/group.rs +0 -89
  241. package/rust/core/parser/handler/identifier/let_.rs +0 -173
  242. package/rust/core/parser/handler/identifier/mod.rs +0 -55
  243. package/rust/core/parser/handler/identifier/on.rs +0 -107
  244. package/rust/core/parser/handler/identifier/print.rs +0 -49
  245. package/rust/core/parser/handler/identifier/sleep.rs +0 -96
  246. package/rust/core/parser/handler/identifier/spawn.rs +0 -91
  247. package/rust/core/parser/handler/identifier/synth.rs +0 -171
  248. package/rust/core/parser/handler/loop_.rs +0 -194
  249. package/rust/core/parser/handler/mod.rs +0 -9
  250. package/rust/core/parser/handler/pattern.rs +0 -97
  251. package/rust/core/parser/handler/tempo.rs +0 -105
  252. package/rust/core/parser/mod.rs +0 -3
  253. package/rust/core/parser/statement.rs +0 -10
  254. package/rust/core/plugin/loader.rs +0 -137
  255. package/rust/core/plugin/mod.rs +0 -2
  256. package/rust/core/plugin/runner/mod.rs +0 -11
  257. package/rust/core/plugin/runner/non_wasm.rs +0 -481
  258. package/rust/core/plugin/runner/wasm32.rs +0 -44
  259. package/rust/core/preprocessor/loader/inject.rs +0 -313
  260. package/rust/core/preprocessor/loader/loader_helpers.rs +0 -110
  261. package/rust/core/preprocessor/loader/mod.rs +0 -235
  262. package/rust/core/preprocessor/mod.rs +0 -4
  263. package/rust/core/preprocessor/module.rs +0 -55
  264. package/rust/core/preprocessor/processor/handlers.rs +0 -107
  265. package/rust/core/preprocessor/processor/mod.rs +0 -1
  266. package/rust/core/preprocessor/resolver/bank.rs +0 -49
  267. package/rust/core/preprocessor/resolver/call.rs +0 -124
  268. package/rust/core/preprocessor/resolver/condition.rs +0 -95
  269. package/rust/core/preprocessor/resolver/driver.rs +0 -324
  270. package/rust/core/preprocessor/resolver/function.rs +0 -69
  271. package/rust/core/preprocessor/resolver/group.rs +0 -122
  272. package/rust/core/preprocessor/resolver/let_.rs +0 -32
  273. package/rust/core/preprocessor/resolver/loop_.rs +0 -318
  274. package/rust/core/preprocessor/resolver/mod.rs +0 -16
  275. package/rust/core/preprocessor/resolver/pattern.rs +0 -95
  276. package/rust/core/preprocessor/resolver/spawn.rs +0 -99
  277. package/rust/core/preprocessor/resolver/synth.rs +0 -54
  278. package/rust/core/preprocessor/resolver/tempo.rs +0 -48
  279. package/rust/core/preprocessor/resolver/trigger.rs +0 -116
  280. package/rust/core/preprocessor/resolver/value.rs +0 -176
  281. package/rust/core/store/global.rs +0 -57
  282. package/rust/core/store/mod.rs +0 -1
  283. package/rust/lib.rs +0 -323
  284. package/rust/macros/Cargo.toml +0 -14
  285. package/rust/macros/src/lib.rs +0 -52
  286. package/rust/main.rs +0 -557
  287. package/rust/types/Cargo.toml +0 -11
  288. package/rust/types/src/addons.rs +0 -57
  289. package/rust/types/src/ast.rs +0 -202
  290. package/rust/types/src/config.rs +0 -82
  291. package/rust/types/src/lib.rs +0 -15
  292. package/rust/types/src/plugin.rs +0 -20
  293. package/rust/types/src/store.rs +0 -139
  294. package/rust/types/src/telemetry.rs +0 -85
  295. package/rust/utils/Cargo.toml +0 -29
  296. package/rust/utils/src/error.rs +0 -186
  297. package/rust/utils/src/file.rs +0 -477
  298. package/rust/utils/src/first_usage.rs +0 -97
  299. package/rust/utils/src/lib.rs +0 -9
  300. package/rust/utils/src/logger.rs +0 -200
  301. package/rust/utils/src/path.rs +0 -158
  302. package/rust/utils/src/signature.rs +0 -41
  303. package/rust/utils/src/spinner.rs +0 -20
  304. package/rust/utils/src/version.rs +0 -58
  305. package/rust/utils/src/watcher.rs +0 -46
  306. package/rust/web/api.rs +0 -5
  307. package/rust/web/auth.rs +0 -5
  308. package/rust/web/cdn.rs +0 -34
  309. package/rust/web/forge.rs +0 -5
  310. package/rust/web/mod.rs +0 -5
  311. package/rust/web/sso.rs +0 -5
  312. package/templates/minimal/.devalang +0 -5
  313. package/templates/minimal/README.md +0 -218
  314. package/templates/minimal/src/index.deva +0 -2
  315. package/templates/welcome/.devalang +0 -5
  316. package/templates/welcome/README.md +0 -218
  317. package/templates/welcome/samples/kick-808.wav +0 -0
  318. package/templates/welcome/src/index.deva +0 -61
  319. package/templates/welcome/src/variables.deva +0 -3
  320. package/tests/integration.rs +0 -21
  321. package/tests/rust/cli_check_build.rs +0 -21
  322. package/tests/rust/cli_help.rs +0 -12
  323. package/tests/rust/cli_template_list.rs +0 -10
  324. package/tests/rust/cli_version.rs +0 -11
  325. package/tests/typescript/index.spec.ts +0 -136
  326. package/tests/typescript/playhead.spec.ts +0 -36
  327. package/tests/typescript/render_e2e.spec.ts +0 -77
  328. package/tsconfig.json +0 -115
  329. package/typescript/bin/index.ts +0 -28
  330. package/typescript/core/functions/index.ts +0 -94
  331. package/typescript/core/index.ts +0 -6
  332. package/typescript/core/types/index.ts +0 -4
  333. package/typescript/core/types/plugin.ts +0 -19
  334. package/typescript/core/types/result.ts +0 -29
  335. package/typescript/core/types/statement.ts +0 -47
  336. package/typescript/core/types/value.ts +0 -29
  337. package/typescript/index.ts +0 -8
  338. package/typescript/pkg/devalang_core.d.ts +0 -4
  339. package/typescript/pkg/devalang_core.ts +0 -65
  340. package/typescript/scripts/copy-wasm-dts.ts +0 -41
  341. package/typescript/scripts/postinstall.ts +0 -85
  342. package/typescript/scripts/version/bump.ts +0 -44
  343. package/typescript/scripts/version/copy-to-binary.ts +0 -82
  344. package/typescript/scripts/version/fetch.ts +0 -18
  345. package/typescript/scripts/version/index.ts +0 -25
  346. package/typescript/scripts/version/sync.ts +0 -24
@@ -1,70 +0,0 @@
1
- use rodio::{Decoder, OutputStream, OutputStreamHandle, Sink, Source};
2
- use std::{fs::File, io::BufReader};
3
-
4
- pub struct AudioPlayer {
5
- _stream: OutputStream,
6
- handle: OutputStreamHandle,
7
- sink: Sink,
8
- last_path: Option<String>,
9
- }
10
-
11
- impl Default for AudioPlayer {
12
- fn default() -> Self {
13
- Self::new()
14
- }
15
- }
16
-
17
- impl AudioPlayer {
18
- pub fn new() -> Self {
19
- let (stream, handle) = OutputStream::try_default().unwrap();
20
- let sink = Sink::try_new(&handle).unwrap();
21
-
22
- Self {
23
- _stream: stream,
24
- handle,
25
- sink,
26
- last_path: None,
27
- }
28
- }
29
-
30
- fn load_source(&self, path: &str) -> Option<impl Source<Item = f32> + Send + 'static> {
31
- if let Ok(file) = File::open(path) {
32
- let reader = BufReader::new(file);
33
- match Decoder::new(reader) {
34
- Ok(decoder) => Some(decoder.convert_samples()),
35
- Err(e) => {
36
- eprintln!("❌ Failed to decode audio file '{}': {}", path, e);
37
- None
38
- }
39
- }
40
- } else {
41
- eprintln!("❌ Could not open audio file: {}", path);
42
- None
43
- }
44
- }
45
-
46
- pub fn play_file_once(&mut self, path: &str) {
47
- self.sink.stop();
48
- self.sink = Sink::try_new(&self.handle).unwrap();
49
- self.sink.set_volume(1.0);
50
-
51
- if let Some(source) = self.load_source(path) {
52
- self.sink.append(source);
53
- self.last_path = Some(path.to_string());
54
- } else {
55
- eprintln!("⚠️ Skipping playback: failed to load '{}'", path);
56
- }
57
- }
58
-
59
- pub fn replay_last(&mut self) {
60
- if let Some(path) = self.last_path.clone() {
61
- self.play_file_once(&path);
62
- } else {
63
- eprintln!("⚠️ No previous audio to replay.");
64
- }
65
- }
66
-
67
- pub fn wait_until_end(&self) {
68
- self.sink.sleep_until_end();
69
- }
70
- }
@@ -1,189 +0,0 @@
1
- use devalang_types::VariableTable;
2
-
3
- // Basic easing functions operating on t in [0,1]
4
- fn easing_value(func: &str, t: f32) -> Option<f32> {
5
- let x = t.clamp(0.0, 1.0);
6
- match func {
7
- "linear" => Some(x),
8
- "easeInQuad" => Some(x * x),
9
- "easeOutQuad" => Some(x * (2.0 - x)),
10
- "easeInOutQuad" => {
11
- if x < 0.5 {
12
- Some(2.0 * x * x)
13
- } else {
14
- Some(-1.0 + (4.0 - 2.0 * x) * x)
15
- }
16
- }
17
- // Cubic
18
- "easeInCubic" => Some(x * x * x),
19
- "easeOutCubic" => Some(1.0 - (1.0 - x).powi(3)),
20
- "easeInOutCubic" => {
21
- if x < 0.5 {
22
- Some(4.0 * x * x * x)
23
- } else {
24
- Some(1.0 - (-2.0 * x + 2.0).powi(3) / 2.0)
25
- }
26
- }
27
- // Quartic
28
- "easeInQuart" => Some(x.powi(4)),
29
- "easeOutQuart" => Some(1.0 - (1.0 - x).powi(4)),
30
- "easeInOutQuart" => {
31
- if x < 0.5 {
32
- Some(8.0 * x.powi(4))
33
- } else {
34
- Some(1.0 - (-2.0 * x + 2.0).powi(4) / 2.0)
35
- }
36
- }
37
- // Exponential
38
- "easeInExpo" => Some(if x <= 0.0 {
39
- 0.0
40
- } else {
41
- 2.0_f32.powf(10.0 * x - 10.0)
42
- }),
43
- "easeOutExpo" => Some(if x >= 1.0 {
44
- 1.0
45
- } else {
46
- 1.0 - 2.0_f32.powf(-10.0 * x)
47
- }),
48
- "easeInOutExpo" => Some(if x <= 0.0 {
49
- 0.0
50
- } else if x >= 1.0 {
51
- 1.0
52
- } else if x < 0.5 {
53
- 2.0_f32.powf(20.0 * x - 10.0) / 2.0
54
- } else {
55
- (2.0 - 2.0_f32.powf(-20.0 * x + 10.0)) / 2.0
56
- }),
57
- // Back (overshoot c ~ 1.70158)
58
- "easeInBack" => {
59
- let c = 1.70158;
60
- Some((c + 1.0) * x * x * x - c * x * x)
61
- }
62
- "easeOutBack" => {
63
- let c = 1.70158;
64
- let y = 1.0 - x;
65
- Some(1.0 - ((c + 1.0) * y * y * y - c * y * y))
66
- }
67
- "easeInOutBack" => {
68
- let c1 = 1.70158;
69
- let c2 = c1 * 1.525;
70
- let x2 = x * 2.0;
71
- if x2 < 1.0 {
72
- Some((x2 * x2 * ((c2 + 1.0) * x2 - c2)) / 2.0)
73
- } else {
74
- let x2 = x2 - 2.0;
75
- Some((x2 * x2 * ((c2 + 1.0) * x2 + c2)) / 2.0 + 1.0)
76
- }
77
- }
78
- // Elastic
79
- "easeInElastic" => {
80
- if x == 0.0 {
81
- Some(0.0)
82
- } else if x == 1.0 {
83
- Some(1.0)
84
- } else {
85
- let c = 2.0 * std::f32::consts::PI / 3.0;
86
- Some(-(2.0_f32.powf(10.0 * x - 10.0)) * ((x * 10.0 - 10.75) * c).sin())
87
- }
88
- }
89
- "easeOutElastic" => {
90
- if x == 0.0 {
91
- Some(0.0)
92
- } else if x == 1.0 {
93
- Some(1.0)
94
- } else {
95
- let c = 2.0 * std::f32::consts::PI / 3.0;
96
- Some(2.0_f32.powf(-10.0 * x) * ((x * 10.0 - 0.75) * c).sin() + 1.0)
97
- }
98
- }
99
- "easeInOutElastic" => {
100
- if x == 0.0 {
101
- Some(0.0)
102
- } else if x == 1.0 {
103
- Some(1.0)
104
- } else {
105
- let c = 2.0 * std::f32::consts::PI / 4.5;
106
- if x < 0.5 {
107
- Some(-(2.0_f32.powf(20.0 * x - 10.0)) * ((20.0 * x - 11.125) * c).sin() / 2.0)
108
- } else {
109
- Some(
110
- 2.0_f32.powf(-20.0 * x + 10.0) * ((20.0 * x - 11.125) * c).sin() / 2.0
111
- + 1.0,
112
- )
113
- }
114
- }
115
- }
116
- // Bounce helpers
117
- "easeInBounce" => Some(1.0 - bounce_out(1.0 - x)),
118
- "easeOutBounce" => Some(bounce_out(x)),
119
- "easeInOutBounce" => Some(if x < 0.5 {
120
- (1.0 - bounce_out(1.0 - 2.0 * x)) / 2.0
121
- } else {
122
- (1.0 + bounce_out(2.0 * x - 1.0)) / 2.0
123
- }),
124
- _ => None,
125
- }
126
- }
127
-
128
- fn bounce_out(x: f32) -> f32 {
129
- let n1 = 7.5625;
130
- let d1 = 2.75;
131
- if x < 1.0 / d1 {
132
- n1 * x * x
133
- } else if x < 2.0 / d1 {
134
- let x = x - 1.5 / d1;
135
- n1 * x * x + 0.75
136
- } else if x < 2.5 / d1 {
137
- let x = x - 2.25 / d1;
138
- n1 * x * x + 0.9375
139
- } else {
140
- let x = x - 2.625 / d1;
141
- n1 * x * x + 0.984375
142
- }
143
- }
144
-
145
- // Find and evaluate the first $easing.<fn>(...) occurrence in the string.
146
- // Accepts a single argument expression producing t in [0,1].
147
- pub fn find_and_eval_first_easing_call<EvalFn>(
148
- s: &str,
149
- eval: EvalFn,
150
- vars: &VariableTable,
151
- bpm: f32,
152
- beat: f32,
153
- ) -> Option<String>
154
- where
155
- EvalFn: Fn(&str, &VariableTable, f32, f32) -> Option<f32>,
156
- {
157
- let start = s.find("$easing.")?;
158
- let open_rel = s[start..].find('(')?;
159
- let open = start + open_rel;
160
- let func = &s[start + 9..open];
161
-
162
- // Find matching close parenthesis
163
- let mut depth: i32 = 0;
164
- let mut close_abs: Option<usize> = None;
165
- for (i, ch) in s[open..].char_indices() {
166
- match ch {
167
- '(' => depth += 1,
168
- ')' => {
169
- depth -= 1;
170
- if depth == 0 {
171
- close_abs = Some(open + i);
172
- break;
173
- }
174
- }
175
- _ => {}
176
- }
177
- }
178
- let close = close_abs?;
179
-
180
- let inner = &s[open + 1..close];
181
- let t = eval(inner, vars, bpm, beat)?;
182
- let result = easing_value(func, t)?;
183
-
184
- let mut replaced = String::new();
185
- replaced.push_str(&s[..start]);
186
- replaced.push_str(&result.to_string());
187
- replaced.push_str(&s[close + 1..]);
188
- Some(replaced)
189
- }
@@ -1,45 +0,0 @@
1
- use devalang_types::Value;
2
-
3
- use devalang_types::VariableTable;
4
- use std::sync::OnceLock;
5
- use std::time::{SystemTime, UNIX_EPOCH};
6
-
7
- static SESSION_SEED: OnceLock<f32> = OnceLock::new();
8
-
9
- pub fn get_session_seed() -> f32 {
10
- *SESSION_SEED.get_or_init(|| {
11
- let now = SystemTime::now()
12
- .duration_since(UNIX_EPOCH)
13
- .unwrap_or_default();
14
- // Build a stable 0..1 seed from nanos
15
- let nanos = now.subsec_nanos();
16
- ((nanos as f32) / 1_000_000_000.0).clamp(0.0, 1.0)
17
- })
18
- }
19
-
20
- // Resolve special environment variables like $env.bpm, $env.beat, $env.position
21
- // For now, $env.position is treated as an alias of beat.
22
- pub fn resolve_env_atom(atom: &str, bpm: f32, beat: f32) -> Option<f32> {
23
- match atom {
24
- "$env.bpm" => Some(bpm),
25
- "$env.beat" => Some(beat),
26
- "$env.position" => Some(beat),
27
- // Optional seed for deterministic randomness
28
- "$env.seed" => Some(get_session_seed()),
29
- _ => None,
30
- }
31
- }
32
-
33
- // Utility: resolve an identifier or numeric literal to f32 using the variable table
34
- pub fn resolve_atom_or_var(atom: &str, vars: &VariableTable, bpm: f32, beat: f32) -> Option<f32> {
35
- if let Some(v) = resolve_env_atom(atom, bpm, beat) {
36
- return Some(v);
37
- }
38
- if let Ok(n) = atom.parse::<f32>() {
39
- return Some(n);
40
- }
41
- if let Some(Value::Number(n)) = vars.get(atom) {
42
- return Some(*n);
43
- }
44
- None
45
- }
@@ -1,134 +0,0 @@
1
- use devalang_types::VariableTable;
2
- use devalang_utils::logger::{LogLevel, Logger};
3
-
4
- // Parse comma-separated arguments at top level (no nested parentheses split)
5
- fn parse_top_level_args(s: &str) -> Vec<&str> {
6
- let mut args = Vec::new();
7
- let mut depth = 0i32;
8
- let mut start = 0usize;
9
- for (i, ch) in s.char_indices() {
10
- match ch {
11
- '(' => depth += 1,
12
- ')' => depth -= 1,
13
- ',' if depth == 0 => {
14
- args.push(s[start..i].trim());
15
- start = i + 1;
16
- }
17
- _ => {}
18
- }
19
- }
20
- let last = s[start..].trim();
21
- if !last.is_empty() {
22
- args.push(last);
23
- }
24
- args
25
- }
26
-
27
- fn eval_math_func(func: &str, args: &[f32], fallback_seed: f32) -> Option<f32> {
28
- match func {
29
- "sin" => args.first().copied().map(f32::sin),
30
- "cos" => args.first().copied().map(f32::cos),
31
- "random" => {
32
- // deterministic pseudo-random based on provided seed or a fallback session seed
33
- let seed = args.first().copied().unwrap_or(fallback_seed);
34
- let x = (seed * 12.9898).sin() * 43_758.547;
35
- Some((x.fract() * 2.0 - 1.0).clamp(-1.0, 1.0))
36
- }
37
- "lerp" => {
38
- if args.len() >= 3 {
39
- Some(args[0] + (args[1] - args[0]) * args[2])
40
- } else {
41
- None
42
- }
43
- }
44
- _ => None,
45
- }
46
- }
47
-
48
- // Find and evaluate the first $math.<fn>(...) occurrence in the string, replacing it with a number.
49
- // Supports multi-argument functions by splitting on top-level commas.
50
- pub fn find_and_eval_first_math_call<EvalFn>(
51
- s: &str,
52
- eval: EvalFn,
53
- vars: &VariableTable,
54
- bpm: f32,
55
- beat: f32,
56
- ) -> Option<String>
57
- where
58
- EvalFn: Fn(&str, &VariableTable, f32, f32) -> Option<f32>,
59
- {
60
- let logger = Logger::new();
61
-
62
- let start = s.find("$math.")?;
63
- let open_rel = match s[start..].find('(') {
64
- Some(i) => i,
65
- None => {
66
- logger.log_message(
67
- LogLevel::Error,
68
- &format!("Malformed $math call: missing '(' in '{}'", s),
69
- );
70
- return None;
71
- }
72
- };
73
- let open = start + open_rel;
74
- if open <= start + 6 {
75
- logger.log_message(
76
- LogLevel::Error,
77
- &format!("Malformed $math call: missing function name in '{}'", s),
78
- );
79
- return None;
80
- }
81
- let func = &s[start + 6..open];
82
-
83
- // Find matching close parenthesis, handling nesting
84
- let mut depth: i32 = 0;
85
- let mut close_abs: Option<usize> = None;
86
- for (i, ch) in s[open..].char_indices() {
87
- match ch {
88
- '(' => depth += 1,
89
- ')' => {
90
- depth -= 1;
91
- if depth == 0 {
92
- close_abs = Some(open + i);
93
- break;
94
- }
95
- }
96
- _ => {}
97
- }
98
- }
99
- let close = match close_abs {
100
- Some(c) => c,
101
- None => {
102
- logger.log_message(
103
- LogLevel::Error,
104
- &format!("Malformed $math call: missing closing ')' in '{}'", s),
105
- );
106
- return None;
107
- }
108
- };
109
-
110
- let inner = &s[open + 1..close];
111
- let raw_args = parse_top_level_args(inner);
112
- let mut args: Vec<f32> = Vec::with_capacity(raw_args.len());
113
- for a in raw_args {
114
- if let Some(v) = eval(a, vars, bpm, beat) {
115
- args.push(v);
116
- } else {
117
- logger.log_message(
118
- LogLevel::Error,
119
- &format!("Failed to evaluate argument '{}' for $math.{}", a, func),
120
- );
121
- return None;
122
- }
123
- }
124
-
125
- // If no explicit seed is provided, use $env.seed via fallback
126
- let fallback_seed = eval("$env.seed", vars, bpm, beat).unwrap_or(0.0);
127
- let result = eval_math_func(func, &args, fallback_seed)?;
128
-
129
- let mut replaced = String::new();
130
- replaced.push_str(&s[..start]);
131
- replaced.push_str(&result.to_string());
132
- replaced.push_str(&s[close + 1..]);
133
- Some(replaced)
134
- }
@@ -1,9 +0,0 @@
1
- pub mod easing;
2
- pub mod env;
3
- pub mod math;
4
- pub mod modulator;
5
-
6
- pub use easing::find_and_eval_first_easing_call;
7
- pub use env::resolve_env_atom;
8
- pub use math::find_and_eval_first_math_call;
9
- pub use modulator::find_and_eval_first_mod_call;
@@ -1,143 +0,0 @@
1
- use devalang_types::VariableTable;
2
-
3
- fn lfo_sine(rate_per_beat: f32, beat: f32) -> f32 {
4
- // Output in [-1,1]
5
- (2.0 * std::f32::consts::PI * rate_per_beat * beat).sin()
6
- }
7
-
8
- fn lfo_triangle(rate_per_beat: f32, beat: f32) -> f32 {
9
- // Triangle in [-1,1]
10
- let phase = (rate_per_beat * beat).fract();
11
- // Map [0,1]->[-1,1] tri
12
- 4.0 * (phase - 0.5).abs() - 1.0
13
- }
14
-
15
- fn adsr_envelope_value_t(attack: f32, decay: f32, sustain: f32, release: f32, t: f32) -> f32 {
16
- let a = attack.max(0.0);
17
- let d = decay.max(0.0);
18
- let r = release.max(0.0);
19
- let s = sustain.clamp(0.0, 1.0);
20
-
21
- // Normalize phases so that the whole ADSR spans t in [0,1]
22
- let total = (a + d + r).max(1e-6);
23
- let ap = a / total;
24
- let dp = d / total;
25
- let rp = r / total;
26
-
27
- if t < ap {
28
- // attack (0->1)
29
- if ap > 0.0 { t / ap } else { 1.0 }
30
- } else if t < ap + dp {
31
- // decay (1->sustain)
32
- let u = (t - ap) / dp.max(1e-6);
33
- 1.0 - (1.0 - s) * u
34
- } else if t < 1.0 - rp {
35
- // sustain
36
- s
37
- } else {
38
- // release (sustain->0)
39
- let u = (t - (1.0 - rp)) / rp.max(1e-6);
40
- s * (1.0 - u)
41
- }
42
- }
43
-
44
- fn eval_mod_func(func: &str, args: &[f32], beat: f32) -> Option<f32> {
45
- match func {
46
- "lfo.sine" => {
47
- let rate = args.first().copied().unwrap_or(1.0);
48
- Some(lfo_sine(rate, beat))
49
- }
50
- "lfo.tri" | "lfo.triangle" => {
51
- let rate = args.first().copied().unwrap_or(1.0);
52
- Some(lfo_triangle(rate, beat))
53
- }
54
- // ADSR envelope normalized over t in [0,1]
55
- // $mod.envelope(attack, decay, sustain, release, t)
56
- "envelope" | "mod.envelope" => {
57
- if args.len() >= 5 {
58
- Some(adsr_envelope_value_t(
59
- args[0],
60
- args[1],
61
- args[2],
62
- args[3],
63
- args[4].clamp(0.0, 1.0),
64
- ))
65
- } else {
66
- None
67
- }
68
- }
69
- _ => None,
70
- }
71
- }
72
-
73
- fn parse_top_level_args(s: &str) -> Vec<&str> {
74
- let mut args = Vec::new();
75
- let mut depth = 0i32;
76
- let mut start = 0usize;
77
- for (i, ch) in s.char_indices() {
78
- match ch {
79
- '(' => depth += 1,
80
- ')' => depth -= 1,
81
- ',' if depth == 0 => {
82
- args.push(s[start..i].trim());
83
- start = i + 1;
84
- }
85
- _ => {}
86
- }
87
- }
88
- let last = s[start..].trim();
89
- if !last.is_empty() {
90
- args.push(last);
91
- }
92
- args
93
- }
94
-
95
- // Find and evaluate the first $mod.<fn>(...) occurrence in the string.
96
- pub fn find_and_eval_first_mod_call<EvalFn>(
97
- s: &str,
98
- eval: EvalFn,
99
- vars: &VariableTable,
100
- bpm: f32,
101
- beat: f32,
102
- ) -> Option<String>
103
- where
104
- EvalFn: Fn(&str, &VariableTable, f32, f32) -> Option<f32>,
105
- {
106
- let start = s.find("$mod.")?;
107
- let open_rel = s[start..].find('(')?;
108
- let open = start + open_rel;
109
- let func = &s[start + 5..open];
110
-
111
- // matching close
112
- let mut depth: i32 = 0;
113
- let mut close_abs: Option<usize> = None;
114
- for (i, ch) in s[open..].char_indices() {
115
- match ch {
116
- '(' => depth += 1,
117
- ')' => {
118
- depth -= 1;
119
- if depth == 0 {
120
- close_abs = Some(open + i);
121
- break;
122
- }
123
- }
124
- _ => {}
125
- }
126
- }
127
- let close = close_abs?;
128
-
129
- let inner = &s[open + 1..close];
130
- let raw_args = parse_top_level_args(inner);
131
- let mut args: Vec<f32> = Vec::with_capacity(raw_args.len());
132
- for a in raw_args {
133
- args.push(eval(a, vars, bpm, beat)?);
134
- }
135
-
136
- let result = eval_mod_func(func, &args, beat)?;
137
-
138
- let mut replaced = String::new();
139
- replaced.push_str(&s[..start]);
140
- replaced.push_str(&result.to_string());
141
- replaced.push_str(&s[close + 1..]);
142
- Some(replaced)
143
- }