@devaloop/devalang 0.0.1-beta.3 → 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 (345) hide show
  1. package/README.md +182 -152
  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 +42 -42
  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 -84
  55. package/docs/CHANGELOG.md +0 -622
  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/chain.deva +0 -19
  63. package/examples/condition.deva +0 -20
  64. package/examples/duration.deva +0 -9
  65. package/examples/effect.deva +0 -2
  66. package/examples/events.deva +0 -12
  67. package/examples/filter.deva +0 -11
  68. package/examples/function.deva +0 -15
  69. package/examples/group.deva +0 -12
  70. package/examples/index.deva +0 -63
  71. package/examples/lfo.deva +0 -9
  72. package/examples/loop.deva +0 -10
  73. package/examples/pattern.deva +0 -8
  74. package/examples/plugin.deva +0 -16
  75. package/examples/routing.deva +0 -23
  76. package/examples/samples/hat-808.wav +0 -0
  77. package/examples/samples/kick-808.wav +0 -0
  78. package/examples/synth.deva +0 -24
  79. package/examples/synth_types.deva +0 -17
  80. package/examples/variables.deva +0 -9
  81. package/out-tsc/bin/project-version.json +0 -6
  82. package/out-tsc/core/functions/index.d.ts +0 -42
  83. package/out-tsc/core/functions/index.js +0 -87
  84. package/out-tsc/core/index.d.ts +0 -6
  85. package/out-tsc/core/types/index.d.ts +0 -4
  86. package/out-tsc/core/types/index.js +0 -20
  87. package/out-tsc/core/types/plugin.d.ts +0 -18
  88. package/out-tsc/core/types/plugin.js +0 -2
  89. package/out-tsc/core/types/result.d.ts +0 -27
  90. package/out-tsc/core/types/result.js +0 -2
  91. package/out-tsc/core/types/statement.d.ts +0 -106
  92. package/out-tsc/core/types/statement.js +0 -2
  93. package/out-tsc/core/types/value.d.ts +0 -43
  94. package/out-tsc/pkg/devalang_core.d.ts +0 -15
  95. package/out-tsc/pkg/devalang_core.js +0 -65
  96. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +0 -34
  97. package/out-tsc/scripts/version/copy-to-binary.d.ts +0 -1
  98. package/out-tsc/scripts/version/copy-to-binary.js +0 -79
  99. package/project-version.json +0 -6
  100. package/rust/bindings/Cargo.toml +0 -9
  101. package/rust/bindings/src/lib.rs +0 -86
  102. package/rust/cli/addon/commands.rs +0 -35
  103. package/rust/cli/addon/download.rs +0 -234
  104. package/rust/cli/addon/install.rs +0 -33
  105. package/rust/cli/addon/list.rs +0 -224
  106. package/rust/cli/addon/metadata.rs +0 -124
  107. package/rust/cli/addon/mod.rs +0 -8
  108. package/rust/cli/addon/remove.rs +0 -271
  109. package/rust/cli/addon/update.rs +0 -305
  110. package/rust/cli/addon/utils.rs +0 -109
  111. package/rust/cli/build/commands.rs +0 -153
  112. package/rust/cli/build/mod.rs +0 -2
  113. package/rust/cli/build/process.rs +0 -165
  114. package/rust/cli/check/mod.rs +0 -208
  115. package/rust/cli/discover/commands.rs +0 -275
  116. package/rust/cli/discover/config.rs +0 -109
  117. package/rust/cli/discover/fs.rs +0 -19
  118. package/rust/cli/discover/install.rs +0 -214
  119. package/rust/cli/discover/metadata.rs +0 -48
  120. package/rust/cli/discover/mod.rs +0 -5
  121. package/rust/cli/init/commands.rs +0 -88
  122. package/rust/cli/init/mod.rs +0 -1
  123. package/rust/cli/login/commands.rs +0 -124
  124. package/rust/cli/login/mod.rs +0 -1
  125. package/rust/cli/me/commands.rs +0 -52
  126. package/rust/cli/me/mod.rs +0 -1
  127. package/rust/cli/mod.rs +0 -12
  128. package/rust/cli/parser.rs +0 -320
  129. package/rust/cli/play/commands.rs +0 -375
  130. package/rust/cli/play/io.rs +0 -17
  131. package/rust/cli/play/mod.rs +0 -5
  132. package/rust/cli/play/process.rs +0 -159
  133. package/rust/cli/play/realtime.rs +0 -91
  134. package/rust/cli/play/utils.rs +0 -23
  135. package/rust/cli/telemetry/commands.rs +0 -22
  136. package/rust/cli/telemetry/event_creator.rs +0 -80
  137. package/rust/cli/telemetry/mod.rs +0 -3
  138. package/rust/cli/telemetry/send.rs +0 -51
  139. package/rust/cli/template/commands.rs +0 -69
  140. package/rust/cli/template/mod.rs +0 -1
  141. package/rust/cli/update/commands.rs +0 -6
  142. package/rust/cli/update/mod.rs +0 -1
  143. package/rust/config/driver.rs +0 -112
  144. package/rust/config/mod.rs +0 -3
  145. package/rust/config/ops.rs +0 -26
  146. package/rust/config/settings.rs +0 -101
  147. package/rust/core/audio/engine/driver.rs +0 -237
  148. package/rust/core/audio/engine/export.rs +0 -169
  149. package/rust/core/audio/engine/helpers.rs +0 -178
  150. package/rust/core/audio/engine/mod.rs +0 -56
  151. package/rust/core/audio/engine/notes/dsp.rs +0 -88
  152. package/rust/core/audio/engine/notes/mod.rs +0 -53
  153. package/rust/core/audio/engine/notes/params.rs +0 -294
  154. package/rust/core/audio/engine/sample/insert.rs +0 -300
  155. package/rust/core/audio/engine/sample/mod.rs +0 -40
  156. package/rust/core/audio/engine/sample/padding.rs +0 -170
  157. package/rust/core/audio/evaluator/condition.rs +0 -61
  158. package/rust/core/audio/evaluator/mod.rs +0 -9
  159. package/rust/core/audio/evaluator/numeric.rs +0 -152
  160. package/rust/core/audio/evaluator/rhs.rs +0 -16
  161. package/rust/core/audio/evaluator/string_expr.rs +0 -94
  162. package/rust/core/audio/interpreter/driver.rs +0 -574
  163. package/rust/core/audio/interpreter/mod.rs +0 -2
  164. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +0 -179
  165. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +0 -398
  166. package/rust/core/audio/interpreter/statements/arrow_call/methods/effects.rs +0 -323
  167. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +0 -3
  168. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +0 -371
  169. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +0 -3
  170. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +0 -192
  171. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +0 -24
  172. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +0 -116
  173. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +0 -97
  174. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +0 -100
  175. package/rust/core/audio/interpreter/statements/automate.rs +0 -16
  176. package/rust/core/audio/interpreter/statements/call.rs +0 -325
  177. package/rust/core/audio/interpreter/statements/condition.rs +0 -72
  178. package/rust/core/audio/interpreter/statements/function.rs +0 -24
  179. package/rust/core/audio/interpreter/statements/let_.rs +0 -36
  180. package/rust/core/audio/interpreter/statements/load.rs +0 -17
  181. package/rust/core/audio/interpreter/statements/loop_.rs +0 -115
  182. package/rust/core/audio/interpreter/statements/mod.rs +0 -12
  183. package/rust/core/audio/interpreter/statements/sleep.rs +0 -28
  184. package/rust/core/audio/interpreter/statements/spawn.rs +0 -302
  185. package/rust/core/audio/interpreter/statements/tempo.rs +0 -40
  186. package/rust/core/audio/interpreter/statements/trigger.rs +0 -242
  187. package/rust/core/audio/loader/mod.rs +0 -1
  188. package/rust/core/audio/loader/trigger.rs +0 -98
  189. package/rust/core/audio/mod.rs +0 -6
  190. package/rust/core/audio/player.rs +0 -70
  191. package/rust/core/audio/special/easing.rs +0 -189
  192. package/rust/core/audio/special/env.rs +0 -45
  193. package/rust/core/audio/special/math.rs +0 -134
  194. package/rust/core/audio/special/mod.rs +0 -9
  195. package/rust/core/audio/special/modulator.rs +0 -143
  196. package/rust/core/builder/mod.rs +0 -129
  197. package/rust/core/debugger/lexer.rs +0 -27
  198. package/rust/core/debugger/logs.rs +0 -52
  199. package/rust/core/debugger/mod.rs +0 -30
  200. package/rust/core/debugger/preprocessor.rs +0 -27
  201. package/rust/core/debugger/store.rs +0 -38
  202. package/rust/core/error/mod.rs +0 -269
  203. package/rust/core/lexer/driver.rs +0 -59
  204. package/rust/core/lexer/handler/arrow.rs +0 -82
  205. package/rust/core/lexer/handler/at.rs +0 -21
  206. package/rust/core/lexer/handler/brace.rs +0 -41
  207. package/rust/core/lexer/handler/colon.rs +0 -21
  208. package/rust/core/lexer/handler/comment.rs +0 -30
  209. package/rust/core/lexer/handler/dot.rs +0 -21
  210. package/rust/core/lexer/handler/driver.rs +0 -337
  211. package/rust/core/lexer/handler/identifier.rs +0 -47
  212. package/rust/core/lexer/handler/indent.rs +0 -66
  213. package/rust/core/lexer/handler/mod.rs +0 -15
  214. package/rust/core/lexer/handler/newline.rs +0 -23
  215. package/rust/core/lexer/handler/number.rs +0 -31
  216. package/rust/core/lexer/handler/operator.rs +0 -46
  217. package/rust/core/lexer/handler/parenthesis.rs +0 -41
  218. package/rust/core/lexer/handler/slash.rs +0 -21
  219. package/rust/core/lexer/handler/string.rs +0 -63
  220. package/rust/core/lexer/mod.rs +0 -3
  221. package/rust/core/lexer/token.rs +0 -91
  222. package/rust/core/mod.rs +0 -9
  223. package/rust/core/parser/driver/block.rs +0 -111
  224. package/rust/core/parser/driver/cursor.rs +0 -82
  225. package/rust/core/parser/driver/driver_impl.rs +0 -159
  226. package/rust/core/parser/driver/mod.rs +0 -6
  227. package/rust/core/parser/driver/parse_array.rs +0 -120
  228. package/rust/core/parser/driver/parse_map.rs +0 -247
  229. package/rust/core/parser/driver/parser.rs +0 -160
  230. package/rust/core/parser/handler/arrow_call.rs +0 -328
  231. package/rust/core/parser/handler/at.rs +0 -279
  232. package/rust/core/parser/handler/bank.rs +0 -104
  233. package/rust/core/parser/handler/condition.rs +0 -83
  234. package/rust/core/parser/handler/dot.rs +0 -148
  235. package/rust/core/parser/handler/identifier/automate.rs +0 -254
  236. package/rust/core/parser/handler/identifier/call.rs +0 -91
  237. package/rust/core/parser/handler/identifier/emit.rs +0 -70
  238. package/rust/core/parser/handler/identifier/function.rs +0 -113
  239. package/rust/core/parser/handler/identifier/group.rs +0 -89
  240. package/rust/core/parser/handler/identifier/let_.rs +0 -173
  241. package/rust/core/parser/handler/identifier/mod.rs +0 -55
  242. package/rust/core/parser/handler/identifier/on.rs +0 -107
  243. package/rust/core/parser/handler/identifier/print.rs +0 -49
  244. package/rust/core/parser/handler/identifier/sleep.rs +0 -96
  245. package/rust/core/parser/handler/identifier/spawn.rs +0 -91
  246. package/rust/core/parser/handler/identifier/synth.rs +0 -171
  247. package/rust/core/parser/handler/loop_.rs +0 -194
  248. package/rust/core/parser/handler/mod.rs +0 -9
  249. package/rust/core/parser/handler/pattern.rs +0 -97
  250. package/rust/core/parser/handler/tempo.rs +0 -105
  251. package/rust/core/parser/mod.rs +0 -3
  252. package/rust/core/parser/statement.rs +0 -10
  253. package/rust/core/plugin/loader.rs +0 -137
  254. package/rust/core/plugin/mod.rs +0 -2
  255. package/rust/core/plugin/runner/mod.rs +0 -11
  256. package/rust/core/plugin/runner/non_wasm.rs +0 -481
  257. package/rust/core/plugin/runner/wasm32.rs +0 -44
  258. package/rust/core/preprocessor/loader/inject.rs +0 -313
  259. package/rust/core/preprocessor/loader/loader_helpers.rs +0 -110
  260. package/rust/core/preprocessor/loader/mod.rs +0 -235
  261. package/rust/core/preprocessor/mod.rs +0 -4
  262. package/rust/core/preprocessor/module.rs +0 -55
  263. package/rust/core/preprocessor/processor/handlers.rs +0 -107
  264. package/rust/core/preprocessor/processor/mod.rs +0 -1
  265. package/rust/core/preprocessor/resolver/bank.rs +0 -49
  266. package/rust/core/preprocessor/resolver/call.rs +0 -124
  267. package/rust/core/preprocessor/resolver/condition.rs +0 -95
  268. package/rust/core/preprocessor/resolver/driver.rs +0 -324
  269. package/rust/core/preprocessor/resolver/function.rs +0 -69
  270. package/rust/core/preprocessor/resolver/group.rs +0 -122
  271. package/rust/core/preprocessor/resolver/let_.rs +0 -32
  272. package/rust/core/preprocessor/resolver/loop_.rs +0 -318
  273. package/rust/core/preprocessor/resolver/mod.rs +0 -16
  274. package/rust/core/preprocessor/resolver/pattern.rs +0 -95
  275. package/rust/core/preprocessor/resolver/spawn.rs +0 -99
  276. package/rust/core/preprocessor/resolver/synth.rs +0 -54
  277. package/rust/core/preprocessor/resolver/tempo.rs +0 -48
  278. package/rust/core/preprocessor/resolver/trigger.rs +0 -116
  279. package/rust/core/preprocessor/resolver/value.rs +0 -176
  280. package/rust/core/store/global.rs +0 -57
  281. package/rust/core/store/mod.rs +0 -1
  282. package/rust/lib.rs +0 -323
  283. package/rust/macros/Cargo.toml +0 -14
  284. package/rust/macros/src/lib.rs +0 -52
  285. package/rust/main.rs +0 -557
  286. package/rust/types/Cargo.toml +0 -11
  287. package/rust/types/src/addons.rs +0 -57
  288. package/rust/types/src/ast.rs +0 -202
  289. package/rust/types/src/config.rs +0 -82
  290. package/rust/types/src/lib.rs +0 -15
  291. package/rust/types/src/plugin.rs +0 -20
  292. package/rust/types/src/store.rs +0 -139
  293. package/rust/types/src/telemetry.rs +0 -85
  294. package/rust/utils/Cargo.toml +0 -29
  295. package/rust/utils/src/error.rs +0 -186
  296. package/rust/utils/src/file.rs +0 -477
  297. package/rust/utils/src/first_usage.rs +0 -97
  298. package/rust/utils/src/lib.rs +0 -9
  299. package/rust/utils/src/logger.rs +0 -200
  300. package/rust/utils/src/path.rs +0 -158
  301. package/rust/utils/src/signature.rs +0 -41
  302. package/rust/utils/src/spinner.rs +0 -20
  303. package/rust/utils/src/version.rs +0 -58
  304. package/rust/utils/src/watcher.rs +0 -46
  305. package/rust/web/api.rs +0 -5
  306. package/rust/web/auth.rs +0 -5
  307. package/rust/web/cdn.rs +0 -34
  308. package/rust/web/forge.rs +0 -5
  309. package/rust/web/mod.rs +0 -5
  310. package/rust/web/sso.rs +0 -5
  311. package/templates/minimal/.devalang +0 -5
  312. package/templates/minimal/README.md +0 -218
  313. package/templates/minimal/src/index.deva +0 -2
  314. package/templates/welcome/.devalang +0 -5
  315. package/templates/welcome/README.md +0 -218
  316. package/templates/welcome/samples/kick-808.wav +0 -0
  317. package/templates/welcome/src/index.deva +0 -61
  318. package/templates/welcome/src/variables.deva +0 -3
  319. package/tests/integration.rs +0 -21
  320. package/tests/rust/cli_check_build.rs +0 -21
  321. package/tests/rust/cli_help.rs +0 -12
  322. package/tests/rust/cli_template_list.rs +0 -10
  323. package/tests/rust/cli_version.rs +0 -11
  324. package/tests/typescript/index.spec.ts +0 -136
  325. package/tests/typescript/playhead.spec.ts +0 -36
  326. package/tests/typescript/render_e2e.spec.ts +0 -77
  327. package/tsconfig.json +0 -115
  328. package/typescript/bin/index.ts +0 -28
  329. package/typescript/core/functions/index.ts +0 -94
  330. package/typescript/core/index.ts +0 -6
  331. package/typescript/core/types/index.ts +0 -4
  332. package/typescript/core/types/plugin.ts +0 -19
  333. package/typescript/core/types/result.ts +0 -29
  334. package/typescript/core/types/statement.ts +0 -47
  335. package/typescript/core/types/value.ts +0 -29
  336. package/typescript/index.ts +0 -8
  337. package/typescript/pkg/devalang_core.d.ts +0 -4
  338. package/typescript/pkg/devalang_core.ts +0 -65
  339. package/typescript/scripts/copy-wasm-dts.ts +0 -41
  340. package/typescript/scripts/postinstall.ts +0 -85
  341. package/typescript/scripts/version/bump.ts +0 -44
  342. package/typescript/scripts/version/copy-to-binary.ts +0 -82
  343. package/typescript/scripts/version/fetch.ts +0 -18
  344. package/typescript/scripts/version/index.ts +0 -25
  345. 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
- }