@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,170 +0,0 @@
1
- use devalang_types::Value;
2
- use std::collections::HashMap;
3
-
4
- pub fn pad_samples_impl(
5
- engine: &mut crate::core::audio::engine::driver::AudioEngine,
6
- samples: &[i16],
7
- time_secs: f32,
8
- effects_map: Option<HashMap<String, Value>>,
9
- ) {
10
- let sample_rate = engine.sample_rate as f32;
11
- let channels = engine.channels as usize;
12
-
13
- let offset = (time_secs * (sample_rate) * (channels as f32)) as usize;
14
- let total_samples = samples.len();
15
-
16
- let mut gain = 1.0;
17
- let mut pan = 0.0;
18
- let mut fade_in = 0.0;
19
- let mut fade_out = 0.0;
20
- let mut pitch = 1.0;
21
- let mut drive = 0.0;
22
- let mut reverb = 0.0;
23
- let mut delay = 0.0; // delay time in seconds
24
- let delay_feedback = 0.35; // default feedback
25
-
26
- if let Some(map) = &effects_map {
27
- for (key, val) in map {
28
- match (key.as_str(), val) {
29
- ("gain", Value::Number(v)) => {
30
- gain = *v;
31
- }
32
- ("pan", Value::Number(v)) => {
33
- pan = *v;
34
- }
35
- ("fadeIn", Value::Number(v)) => {
36
- fade_in = *v;
37
- }
38
- ("fadeOut", Value::Number(v)) => {
39
- fade_out = *v;
40
- }
41
- ("pitch", Value::Number(v)) => {
42
- pitch = *v;
43
- }
44
- ("drive", Value::Number(v)) => {
45
- drive = *v;
46
- }
47
- ("reverb", Value::Number(v)) => {
48
- reverb = *v;
49
- }
50
- ("delay", Value::Number(v)) => {
51
- delay = *v;
52
- }
53
- _ => eprintln!("⚠️ Unknown or invalid effect '{}'", key),
54
- }
55
- }
56
- }
57
-
58
- let fade_in_samples = (fade_in * (sample_rate)) as usize;
59
- let fade_out_samples = (fade_out * (sample_rate)) as usize;
60
-
61
- // If no fade specified, apply a tiny default fade (2 ms) when sample boundaries are non-zero
62
- let default_boundary_fade_ms = 1.0_f32; // 1 ms
63
- let default_fade_samples = (default_boundary_fade_ms * (sample_rate)) as usize;
64
- let mut effective_fade_in = fade_in_samples;
65
- let mut effective_fade_out = fade_out_samples;
66
- if effective_fade_in == 0 {
67
- if let Some(&first) = samples.first() {
68
- if first.abs() > 64 {
69
- // increased threshold to detect only strong abrupt starts
70
- effective_fade_in = default_fade_samples.max(1);
71
- }
72
- }
73
- }
74
- if effective_fade_out == 0 {
75
- if let Some(&last) = samples.last() {
76
- if last.abs() > 64 {
77
- // increased threshold to detect only strong abrupt ends
78
- effective_fade_out = default_fade_samples.max(1);
79
- }
80
- }
81
- }
82
-
83
- // Ensure fades do not exceed half the sample length to avoid silencing short samples
84
- if total_samples > 0 {
85
- let cap = total_samples / 2;
86
- if effective_fade_in > cap {
87
- effective_fade_in = cap.max(1);
88
- }
89
- if effective_fade_out > cap {
90
- effective_fade_out = cap.max(1);
91
- }
92
- }
93
-
94
- let delay_samples = if delay > 0.0 {
95
- (delay * (sample_rate)) as usize
96
- } else {
97
- 0
98
- };
99
- let mut delay_buffer: Vec<f32> = vec![0.0; total_samples + delay_samples];
100
-
101
- for i in 0..total_samples {
102
- let pitch_index = if pitch != 1.0 {
103
- ((i as f32) / pitch) as usize
104
- } else {
105
- i
106
- };
107
-
108
- let mut adjusted = if pitch_index < total_samples {
109
- samples[pitch_index] as f32
110
- } else {
111
- 0.0
112
- };
113
-
114
- adjusted *= gain;
115
-
116
- if effective_fade_in > 0 && i < effective_fade_in {
117
- if effective_fade_in == 1 {
118
- adjusted *= 0.0;
119
- } else {
120
- adjusted *= (i as f32) / (effective_fade_in as f32);
121
- }
122
- }
123
- if effective_fade_out > 0 && i >= total_samples.saturating_sub(effective_fade_out) {
124
- if effective_fade_out == 1 {
125
- adjusted *= 0.0;
126
- } else {
127
- adjusted *= ((total_samples - 1 - i) as f32) / ((effective_fade_out - 1) as f32);
128
- }
129
- }
130
-
131
- if drive > 0.0 {
132
- let normalized = adjusted / (i16::MAX as f32);
133
- let pre_gain = (10f32).powf(drive / 20.0);
134
- let driven = (normalized * pre_gain).tanh();
135
- adjusted = driven * (i16::MAX as f32);
136
- }
137
-
138
- if delay_samples > 0 && i >= delay_samples {
139
- let echo = delay_buffer[i - delay_samples] * delay_feedback;
140
- adjusted += echo;
141
- }
142
- if delay_samples > 0 {
143
- delay_buffer[i] = adjusted;
144
- }
145
-
146
- if reverb > 0.0 {
147
- let reverb_delay = (0.03 * (sample_rate)) as usize;
148
- if i >= reverb_delay {
149
- adjusted += (engine.buffer[offset + i - reverb_delay] as f32) * reverb;
150
- }
151
- }
152
-
153
- let adjusted_sample = adjusted.round().clamp(i16::MIN as f32, i16::MAX as f32) as i16;
154
-
155
- let (left_gain, right_gain) = crate::core::audio::engine::helpers::pan_gains(pan);
156
-
157
- let left = ((adjusted_sample as f32) * left_gain) as i16;
158
- let right = ((adjusted_sample as f32) * right_gain) as i16;
159
-
160
- // For interleaved buffer with `channels` channels, each frame has `channels` samples.
161
- // left channel at frame i is at offset + i * channels, right at +1.
162
- let left_pos = offset + i * channels;
163
- let right_pos = left_pos + 1;
164
-
165
- if right_pos < engine.buffer.len() {
166
- engine.buffer[left_pos] = engine.buffer[left_pos].saturating_add(left);
167
- engine.buffer[right_pos] = engine.buffer[right_pos].saturating_add(right);
168
- }
169
- }
170
- }
@@ -1,61 +0,0 @@
1
- use crate::core::audio::special::resolve_env_atom;
2
- use devalang_types::Value;
3
- use devalang_types::VariableTable;
4
-
5
- pub fn evaluate_condition_string(expr: &str, vars: &VariableTable) -> bool {
6
- let tokens: Vec<&str> = expr.split_whitespace().collect();
7
- if tokens.len() != 3 {
8
- return false;
9
- }
10
-
11
- let left = tokens[0];
12
- let op = tokens[1];
13
- let right = tokens[2];
14
-
15
- // Resolve left and right to numeric values where possible. Accept numbers, variables or env atoms.
16
- fn resolve_for_cond(s: &str, vars: &VariableTable) -> Option<f32> {
17
- if let Ok(n) = s.parse::<f32>() {
18
- return Some(n);
19
- }
20
- if let Some(Value::Number(n)) = vars.get(s) {
21
- return Some(*n);
22
- }
23
- if let Some(v) = resolve_env_atom(s, 120.0, 1.0) {
24
- return Some(v);
25
- }
26
- None
27
- }
28
-
29
- let left_val = match resolve_for_cond(left, vars) {
30
- Some(v) => v,
31
- None => {
32
- return false;
33
- }
34
- };
35
-
36
- let right_val = match resolve_for_cond(right, vars) {
37
- Some(v) => v,
38
- None => {
39
- return false;
40
- }
41
- };
42
-
43
- match op {
44
- ">" => left_val > right_val,
45
- "<" => left_val < right_val,
46
- ">=" => left_val >= right_val,
47
- "<=" => left_val <= right_val,
48
- "==" => {
49
- // relative epsilon for floating comparisons
50
- let diff = (left_val - right_val).abs();
51
- let largest = left_val.abs().max(right_val.abs()).max(1.0);
52
- diff <= f32::EPSILON * largest
53
- }
54
- "!=" => {
55
- let diff = (left_val - right_val).abs();
56
- let largest = left_val.abs().max(right_val.abs()).max(1.0);
57
- diff > f32::EPSILON * largest
58
- }
59
- _ => false,
60
- }
61
- }
@@ -1,9 +0,0 @@
1
- pub mod condition;
2
- pub mod numeric;
3
- pub mod rhs;
4
- pub mod string_expr;
5
-
6
- pub use condition::evaluate_condition_string;
7
- pub use numeric::evaluate_numeric_expression;
8
- pub use rhs::evaluate_rhs_into_value;
9
- pub use string_expr::evaluate_string_expression;
@@ -1,152 +0,0 @@
1
- use crate::core::audio::special::{
2
- find_and_eval_first_easing_call, find_and_eval_first_math_call, find_and_eval_first_mod_call,
3
- resolve_env_atom,
4
- };
5
- use devalang_types::Value;
6
- use devalang_types::VariableTable;
7
-
8
- // Very small expression evaluator for `$env.*`, `$math.*` and variables.
9
- // Supports: +, -, *, / and simple parentheses, left-to-right (no precedence), and $math.(sin|cos)(expr)
10
- pub fn evaluate_numeric_expression(
11
- expr: &str,
12
- vars: &VariableTable,
13
- env_bpm: f32,
14
- env_beat: f32,
15
- ) -> Option<f32> {
16
- let expr = expr.replace(" ", "");
17
-
18
- // Helper to resolve an atom to a number
19
- fn resolve_atom(atom: &str, vars: &VariableTable, bpm: f32, beat: f32) -> Option<f32> {
20
- if let Some(v) = resolve_env_atom(atom, bpm, beat) {
21
- return Some(v);
22
- }
23
- if let Ok(n) = atom.parse::<f32>() {
24
- return Some(n);
25
- }
26
- if let Some(Value::Number(n)) = vars.get(atom) {
27
- return Some(*n);
28
- }
29
- None
30
- }
31
-
32
- // Shunting-like, simplified: first evaluate any $math.func(...) calls anywhere in the expression,
33
- // then fold remaining parentheses and evaluate left-to-right.
34
- fn eval(expr: &str, vars: &VariableTable, bpm: f32, beat: f32) -> Option<f32> {
35
- // 1) Replace $math/$easing/$mod calls progressively with a max iteration guard
36
- let mut s = expr.to_string();
37
- let mut iterations = 0u32;
38
- const MAX_ITER: u32 = 64;
39
-
40
- // Evaluate modulators first (they may feed easing/math)
41
- while iterations < MAX_ITER {
42
- if let Some(next) =
43
- find_and_eval_first_mod_call(&s, evaluate_numeric_expression, vars, bpm, beat)
44
- {
45
- s = next;
46
- iterations += 1;
47
- continue;
48
- }
49
- break;
50
- }
51
-
52
- iterations = 0;
53
- while iterations < MAX_ITER {
54
- if let Some(next) =
55
- find_and_eval_first_easing_call(&s, evaluate_numeric_expression, vars, bpm, beat)
56
- {
57
- s = next;
58
- iterations += 1;
59
- continue;
60
- }
61
- break;
62
- }
63
-
64
- iterations = 0;
65
- while iterations < MAX_ITER {
66
- if let Some(next) =
67
- find_and_eval_first_math_call(&s, evaluate_numeric_expression, vars, bpm, beat)
68
- {
69
- s = next;
70
- iterations += 1;
71
- continue;
72
- }
73
- break;
74
- }
75
-
76
- // 2) Evaluate remaining (pure) parentheses starting from innermost
77
- if let Some(open) = s.rfind('(') {
78
- if let Some(close_rel) = s[open..].find(')') {
79
- // index relatif
80
- let close = open + close_rel;
81
- let inner = &s[open + 1..close];
82
- let val = eval(inner, vars, bpm, beat)?;
83
- let mut replaced = String::new();
84
- replaced.push_str(&s[..open]);
85
- replaced.push_str(&val.to_string());
86
- replaced.push_str(&s[close + 1..]);
87
- return eval(&replaced, vars, bpm, beat);
88
- }
89
- }
90
-
91
- // Tokenize by operators left-to-right
92
- let mut parts: Vec<String> = Vec::new();
93
- let mut cur = String::new();
94
- for ch in s.chars() {
95
- if "+-*/".contains(ch) {
96
- if !cur.is_empty() {
97
- parts.push(cur.clone());
98
- cur.clear();
99
- }
100
- parts.push(ch.to_string());
101
- } else {
102
- cur.push(ch);
103
- }
104
- }
105
- if !cur.is_empty() {
106
- parts.push(cur);
107
- }
108
- if parts.is_empty() {
109
- return None;
110
- }
111
-
112
- // Resolve atoms and compute
113
- let mut acc: Option<f32> = None;
114
- let mut op: Option<char> = None;
115
- for part in parts {
116
- if part.len() == 1 && "+-*/".contains(part.chars().next().unwrap()) {
117
- op = part.chars().next();
118
- continue;
119
- }
120
- let val = if let Some(v) = resolve_atom(&part, vars, bpm, beat) {
121
- v
122
- } else if part.starts_with("$env.") {
123
- // $env atom not handled by resolve_atom (when composed), try recursive eval
124
- eval(&part, vars, bpm, beat)?
125
- } else {
126
- return None;
127
- };
128
-
129
- acc = Some(match (acc, op) {
130
- (None, _) => val,
131
- (Some(a), Some('+')) => a + val,
132
- (Some(a), Some('-')) => a - val,
133
- (Some(a), Some('*')) => a * val,
134
- (Some(a), Some('/')) => {
135
- if val != 0.0 {
136
- a / val
137
- } else {
138
- return Some(f32::INFINITY);
139
- }
140
- }
141
- (Some(_), None) => val,
142
- _ => {
143
- return None;
144
- }
145
- });
146
- }
147
-
148
- acc
149
- }
150
-
151
- eval(&expr, vars, env_bpm, env_beat)
152
- }
@@ -1,16 +0,0 @@
1
- use crate::core::audio::evaluator::numeric::evaluate_numeric_expression;
2
- use devalang_types::Value;
3
- use devalang_types::VariableTable;
4
-
5
- pub fn evaluate_rhs_into_value(
6
- raw: &str,
7
- vars: &VariableTable,
8
- env_bpm: f32,
9
- env_beat: f32,
10
- ) -> Value {
11
- if let Some(num) = evaluate_numeric_expression(raw, vars, env_bpm, env_beat) {
12
- Value::Number(num)
13
- } else {
14
- Value::String(raw.to_string())
15
- }
16
- }
@@ -1,94 +0,0 @@
1
- use crate::core::audio::evaluator::numeric::evaluate_numeric_expression;
2
- use devalang_types::Value;
3
- use devalang_types::VariableTable;
4
-
5
- // Evaluate a simple string concatenation expression like: "hello " + name + "!" + $env.beat
6
- // - Splits on + outside quotes
7
- // - Terms can be string literals (double quotes), variables (Number/String/Boolean), or numeric env/math expressions
8
- // Returns None if parsing fails (fallback to raw print)
9
- pub fn evaluate_string_expression(
10
- expr: &str,
11
- vars: &VariableTable,
12
- env_bpm: f32,
13
- env_beat: f32,
14
- ) -> Option<String> {
15
- // Quick reject if no '+' present
16
- if !expr.contains('+') {
17
- return None;
18
- }
19
-
20
- // Split by '+' outside of quotes
21
- let mut parts: Vec<String> = Vec::new();
22
- let mut cur = String::new();
23
- let mut in_quotes = false;
24
- let mut escape = false;
25
- for ch in expr.chars() {
26
- if escape {
27
- cur.push(ch);
28
- escape = false;
29
- continue;
30
- }
31
- if ch == '\\' {
32
- // escape next char
33
- escape = true;
34
- continue;
35
- }
36
- if ch == '"' {
37
- in_quotes = !in_quotes;
38
- cur.push(ch);
39
- continue;
40
- }
41
- if ch == '+' && !in_quotes {
42
- parts.push(cur.to_string());
43
- cur.clear();
44
- continue;
45
- }
46
- cur.push(ch);
47
- }
48
- if !cur.is_empty() {
49
- parts.push(cur.to_string());
50
- }
51
- if parts.is_empty() {
52
- return None;
53
- }
54
-
55
- // Resolve each part into a string
56
- fn strip_quotes(s: &str) -> Option<String> {
57
- let st = s.trim();
58
- if st.len() >= 2 && st.starts_with('"') && st.ends_with('"') {
59
- Some(st[1..st.len() - 1].to_string())
60
- } else {
61
- None
62
- }
63
- }
64
-
65
- let mut out = String::new();
66
- for p in parts {
67
- if p.is_empty() {
68
- continue;
69
- }
70
- if let Some(lit) = strip_quotes(&p) {
71
- out.push_str(&lit);
72
- continue;
73
- }
74
- // Try variables first
75
- if let Some(val) = vars.get(&p) {
76
- match val {
77
- Value::String(s) => out.push_str(s),
78
- Value::Number(n) => out.push_str(&format!("{}", n)),
79
- Value::Boolean(b) => out.push_str(&format!("{}", b)),
80
- other => out.push_str(&format!("{:?}", other)),
81
- }
82
- continue;
83
- }
84
- // Try env/math/numeric expression for this term
85
- if let Some(n) = evaluate_numeric_expression(&p, vars, env_bpm, env_beat) {
86
- out.push_str(&format!("{}", n));
87
- continue;
88
- }
89
- // Bareword not resolved: include as-is (safe fallback)
90
- out.push_str(&p);
91
- }
92
-
93
- Some(out)
94
- }