@devaloop/devalang 0.0.1-beta.2 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/README.md +177 -146
  2. package/out-tsc/api.d.ts +180 -0
  3. package/out-tsc/api.d.ts.map +1 -0
  4. package/out-tsc/api.js +286 -0
  5. package/out-tsc/api.js.map +1 -0
  6. package/out-tsc/bin/index.d.ts +12 -0
  7. package/out-tsc/bin/index.d.ts.map +1 -0
  8. package/out-tsc/bin/index.js +20 -54
  9. package/out-tsc/bin/index.js.map +1 -0
  10. package/out-tsc/examples/basic-usage.d.ts +8 -0
  11. package/out-tsc/examples/basic-usage.d.ts.map +1 -0
  12. package/out-tsc/examples/basic-usage.js +113 -0
  13. package/out-tsc/examples/basic-usage.js.map +1 -0
  14. package/out-tsc/index.d.ts +19 -5
  15. package/out-tsc/index.d.ts.map +1 -0
  16. package/out-tsc/index.js +24 -6
  17. package/out-tsc/index.js.map +1 -0
  18. package/out-tsc/scripts/copy-wasm-dts.d.ts +7 -0
  19. package/out-tsc/scripts/copy-wasm-dts.d.ts.map +1 -0
  20. package/out-tsc/scripts/copy-wasm-dts.js +36 -32
  21. package/out-tsc/scripts/copy-wasm-dts.js.map +1 -0
  22. package/out-tsc/scripts/postinstall.d.ts +1 -0
  23. package/out-tsc/scripts/postinstall.d.ts.map +1 -0
  24. package/out-tsc/scripts/postinstall.js +4 -1
  25. package/out-tsc/scripts/postinstall.js.map +1 -0
  26. package/out-tsc/scripts/version/bump.d.ts +5 -1
  27. package/out-tsc/scripts/version/bump.d.ts.map +1 -0
  28. package/out-tsc/scripts/version/bump.js +114 -44
  29. package/out-tsc/scripts/version/bump.js.map +1 -0
  30. package/out-tsc/scripts/version/fetch.d.ts +12 -1
  31. package/out-tsc/scripts/version/fetch.d.ts.map +1 -0
  32. package/out-tsc/scripts/version/fetch.js +68 -24
  33. package/out-tsc/scripts/version/fetch.js.map +1 -0
  34. package/out-tsc/scripts/version/index.d.ts +6 -0
  35. package/out-tsc/scripts/version/index.d.ts.map +1 -0
  36. package/out-tsc/scripts/version/index.js +44 -22
  37. package/out-tsc/scripts/version/index.js.map +1 -0
  38. package/out-tsc/scripts/version/sync.d.ts +5 -1
  39. package/out-tsc/scripts/version/sync.d.ts.map +1 -0
  40. package/out-tsc/scripts/version/sync.js +78 -29
  41. package/out-tsc/scripts/version/sync.js.map +1 -0
  42. package/out-tsc/types.d.ts +68 -0
  43. package/out-tsc/types.d.ts.map +1 -0
  44. package/out-tsc/{core/types/value.js → types.js} +4 -0
  45. package/out-tsc/types.js.map +1 -0
  46. package/out-tsc/wasm.d.ts +8 -0
  47. package/out-tsc/wasm.d.ts.map +1 -0
  48. package/out-tsc/{core/index.js → wasm.js} +9 -6
  49. package/out-tsc/wasm.js.map +1 -0
  50. package/package.json +50 -37
  51. package/.cargo/config.toml +0 -2
  52. package/.devalang +0 -9
  53. package/.github/workflows/ci.yml +0 -103
  54. package/Cargo.toml +0 -81
  55. package/docs/CHANGELOG.md +0 -581
  56. package/docs/CONTRIBUTING.md +0 -101
  57. package/docs/ROADMAP.md +0 -38
  58. package/docs/TODO.md +0 -71
  59. package/examples/automation.deva +0 -42
  60. package/examples/bank.deva +0 -7
  61. package/examples/bus.deva +0 -10
  62. package/examples/condition.deva +0 -20
  63. package/examples/duration.deva +0 -9
  64. package/examples/effect.deva +0 -2
  65. package/examples/events.deva +0 -12
  66. package/examples/filter.deva +0 -11
  67. package/examples/function.deva +0 -15
  68. package/examples/group.deva +0 -12
  69. package/examples/index.deva +0 -63
  70. package/examples/lfo.deva +0 -9
  71. package/examples/loop.deva +0 -10
  72. package/examples/pattern.deva +0 -8
  73. package/examples/plugin.deva +0 -16
  74. package/examples/samples/hat-808.wav +0 -0
  75. package/examples/samples/kick-808.wav +0 -0
  76. package/examples/synth.deva +0 -24
  77. package/examples/synth_types.deva +0 -17
  78. package/examples/variables.deva +0 -9
  79. package/out-tsc/core/functions/index.d.ts +0 -42
  80. package/out-tsc/core/functions/index.js +0 -87
  81. package/out-tsc/core/index.d.ts +0 -6
  82. package/out-tsc/core/types/index.d.ts +0 -4
  83. package/out-tsc/core/types/index.js +0 -20
  84. package/out-tsc/core/types/plugin.d.ts +0 -18
  85. package/out-tsc/core/types/plugin.js +0 -2
  86. package/out-tsc/core/types/result.d.ts +0 -27
  87. package/out-tsc/core/types/result.js +0 -2
  88. package/out-tsc/core/types/statement.d.ts +0 -106
  89. package/out-tsc/core/types/statement.js +0 -2
  90. package/out-tsc/core/types/value.d.ts +0 -43
  91. package/out-tsc/pkg/devalang_core.d.ts +0 -15
  92. package/out-tsc/pkg/devalang_core.js +0 -65
  93. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +0 -34
  94. package/project-version.json +0 -6
  95. package/rust/cli/bank/api.rs +0 -122
  96. package/rust/cli/bank/commands.rs +0 -306
  97. package/rust/cli/bank/mod.rs +0 -29
  98. package/rust/cli/build/commands.rs +0 -153
  99. package/rust/cli/build/mod.rs +0 -2
  100. package/rust/cli/build/process.rs +0 -165
  101. package/rust/cli/check/mod.rs +0 -208
  102. package/rust/cli/discover/commands.rs +0 -253
  103. package/rust/cli/discover/config.rs +0 -111
  104. package/rust/cli/discover/fs.rs +0 -19
  105. package/rust/cli/discover/install.rs +0 -103
  106. package/rust/cli/discover/metadata.rs +0 -48
  107. package/rust/cli/discover/mod.rs +0 -5
  108. package/rust/cli/init/commands.rs +0 -88
  109. package/rust/cli/init/mod.rs +0 -1
  110. package/rust/cli/install/addon.rs +0 -118
  111. package/rust/cli/install/bank.rs +0 -72
  112. package/rust/cli/install/commands.rs +0 -35
  113. package/rust/cli/install/mod.rs +0 -4
  114. package/rust/cli/install/plugin.rs +0 -80
  115. package/rust/cli/login/commands.rs +0 -124
  116. package/rust/cli/login/mod.rs +0 -1
  117. package/rust/cli/mod.rs +0 -12
  118. package/rust/cli/parser.rs +0 -359
  119. package/rust/cli/play/commands.rs +0 -375
  120. package/rust/cli/play/io.rs +0 -17
  121. package/rust/cli/play/mod.rs +0 -5
  122. package/rust/cli/play/process.rs +0 -159
  123. package/rust/cli/play/realtime.rs +0 -91
  124. package/rust/cli/play/utils.rs +0 -23
  125. package/rust/cli/telemetry/commands.rs +0 -22
  126. package/rust/cli/telemetry/event_creator.rs +0 -80
  127. package/rust/cli/telemetry/mod.rs +0 -3
  128. package/rust/cli/telemetry/send.rs +0 -51
  129. package/rust/cli/template/commands.rs +0 -69
  130. package/rust/cli/template/mod.rs +0 -1
  131. package/rust/cli/update/commands.rs +0 -6
  132. package/rust/cli/update/mod.rs +0 -1
  133. package/rust/config/driver.rs +0 -112
  134. package/rust/config/mod.rs +0 -3
  135. package/rust/config/ops.rs +0 -26
  136. package/rust/config/settings.rs +0 -101
  137. package/rust/core/audio/engine/driver.rs +0 -220
  138. package/rust/core/audio/engine/export.rs +0 -169
  139. package/rust/core/audio/engine/helpers.rs +0 -178
  140. package/rust/core/audio/engine/mod.rs +0 -56
  141. package/rust/core/audio/engine/notes/dsp.rs +0 -85
  142. package/rust/core/audio/engine/notes/mod.rs +0 -44
  143. package/rust/core/audio/engine/notes/params.rs +0 -294
  144. package/rust/core/audio/engine/sample/insert.rs +0 -199
  145. package/rust/core/audio/engine/sample/mod.rs +0 -40
  146. package/rust/core/audio/engine/sample/padding.rs +0 -170
  147. package/rust/core/audio/evaluator/condition.rs +0 -61
  148. package/rust/core/audio/evaluator/mod.rs +0 -9
  149. package/rust/core/audio/evaluator/numeric.rs +0 -152
  150. package/rust/core/audio/evaluator/rhs.rs +0 -16
  151. package/rust/core/audio/evaluator/string_expr.rs +0 -94
  152. package/rust/core/audio/interpreter/driver.rs +0 -574
  153. package/rust/core/audio/interpreter/mod.rs +0 -2
  154. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +0 -175
  155. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +0 -384
  156. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +0 -2
  157. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +0 -316
  158. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +0 -3
  159. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +0 -192
  160. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +0 -24
  161. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +0 -116
  162. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +0 -97
  163. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +0 -100
  164. package/rust/core/audio/interpreter/statements/automate.rs +0 -16
  165. package/rust/core/audio/interpreter/statements/call.rs +0 -295
  166. package/rust/core/audio/interpreter/statements/condition.rs +0 -72
  167. package/rust/core/audio/interpreter/statements/function.rs +0 -24
  168. package/rust/core/audio/interpreter/statements/let_.rs +0 -36
  169. package/rust/core/audio/interpreter/statements/load.rs +0 -17
  170. package/rust/core/audio/interpreter/statements/loop_.rs +0 -115
  171. package/rust/core/audio/interpreter/statements/mod.rs +0 -12
  172. package/rust/core/audio/interpreter/statements/sleep.rs +0 -28
  173. package/rust/core/audio/interpreter/statements/spawn.rs +0 -253
  174. package/rust/core/audio/interpreter/statements/tempo.rs +0 -40
  175. package/rust/core/audio/interpreter/statements/trigger.rs +0 -239
  176. package/rust/core/audio/loader/mod.rs +0 -1
  177. package/rust/core/audio/loader/trigger.rs +0 -98
  178. package/rust/core/audio/mod.rs +0 -6
  179. package/rust/core/audio/player.rs +0 -70
  180. package/rust/core/audio/special/easing.rs +0 -189
  181. package/rust/core/audio/special/env.rs +0 -45
  182. package/rust/core/audio/special/math.rs +0 -134
  183. package/rust/core/audio/special/mod.rs +0 -9
  184. package/rust/core/audio/special/modulator.rs +0 -143
  185. package/rust/core/builder/mod.rs +0 -129
  186. package/rust/core/debugger/lexer.rs +0 -27
  187. package/rust/core/debugger/logs.rs +0 -52
  188. package/rust/core/debugger/mod.rs +0 -30
  189. package/rust/core/debugger/preprocessor.rs +0 -27
  190. package/rust/core/debugger/store.rs +0 -38
  191. package/rust/core/error/mod.rs +0 -269
  192. package/rust/core/lexer/driver.rs +0 -59
  193. package/rust/core/lexer/handler/arrow.rs +0 -82
  194. package/rust/core/lexer/handler/at.rs +0 -21
  195. package/rust/core/lexer/handler/brace.rs +0 -41
  196. package/rust/core/lexer/handler/colon.rs +0 -21
  197. package/rust/core/lexer/handler/comment.rs +0 -30
  198. package/rust/core/lexer/handler/dot.rs +0 -21
  199. package/rust/core/lexer/handler/driver.rs +0 -337
  200. package/rust/core/lexer/handler/identifier.rs +0 -47
  201. package/rust/core/lexer/handler/indent.rs +0 -66
  202. package/rust/core/lexer/handler/mod.rs +0 -15
  203. package/rust/core/lexer/handler/newline.rs +0 -23
  204. package/rust/core/lexer/handler/number.rs +0 -31
  205. package/rust/core/lexer/handler/operator.rs +0 -46
  206. package/rust/core/lexer/handler/parenthesis.rs +0 -41
  207. package/rust/core/lexer/handler/slash.rs +0 -21
  208. package/rust/core/lexer/handler/string.rs +0 -63
  209. package/rust/core/lexer/mod.rs +0 -3
  210. package/rust/core/lexer/token.rs +0 -91
  211. package/rust/core/mod.rs +0 -9
  212. package/rust/core/parser/driver/block.rs +0 -111
  213. package/rust/core/parser/driver/cursor.rs +0 -82
  214. package/rust/core/parser/driver/driver_impl.rs +0 -139
  215. package/rust/core/parser/driver/mod.rs +0 -6
  216. package/rust/core/parser/driver/parse_array.rs +0 -120
  217. package/rust/core/parser/driver/parse_map.rs +0 -223
  218. package/rust/core/parser/driver/parser.rs +0 -160
  219. package/rust/core/parser/handler/arrow_call.rs +0 -277
  220. package/rust/core/parser/handler/at.rs +0 -279
  221. package/rust/core/parser/handler/bank.rs +0 -104
  222. package/rust/core/parser/handler/condition.rs +0 -83
  223. package/rust/core/parser/handler/dot.rs +0 -148
  224. package/rust/core/parser/handler/identifier/automate.rs +0 -254
  225. package/rust/core/parser/handler/identifier/call.rs +0 -91
  226. package/rust/core/parser/handler/identifier/emit.rs +0 -70
  227. package/rust/core/parser/handler/identifier/function.rs +0 -113
  228. package/rust/core/parser/handler/identifier/group.rs +0 -89
  229. package/rust/core/parser/handler/identifier/let_.rs +0 -173
  230. package/rust/core/parser/handler/identifier/mod.rs +0 -55
  231. package/rust/core/parser/handler/identifier/on.rs +0 -107
  232. package/rust/core/parser/handler/identifier/print.rs +0 -49
  233. package/rust/core/parser/handler/identifier/sleep.rs +0 -96
  234. package/rust/core/parser/handler/identifier/spawn.rs +0 -91
  235. package/rust/core/parser/handler/identifier/synth.rs +0 -135
  236. package/rust/core/parser/handler/loop_.rs +0 -194
  237. package/rust/core/parser/handler/mod.rs +0 -9
  238. package/rust/core/parser/handler/pattern.rs +0 -74
  239. package/rust/core/parser/handler/tempo.rs +0 -105
  240. package/rust/core/parser/mod.rs +0 -3
  241. package/rust/core/parser/statement.rs +0 -10
  242. package/rust/core/plugin/loader.rs +0 -137
  243. package/rust/core/plugin/mod.rs +0 -2
  244. package/rust/core/plugin/runner/mod.rs +0 -11
  245. package/rust/core/plugin/runner/non_wasm.rs +0 -297
  246. package/rust/core/plugin/runner/wasm32.rs +0 -43
  247. package/rust/core/preprocessor/loader/inject.rs +0 -278
  248. package/rust/core/preprocessor/loader/loader_helpers.rs +0 -110
  249. package/rust/core/preprocessor/loader/mod.rs +0 -235
  250. package/rust/core/preprocessor/mod.rs +0 -4
  251. package/rust/core/preprocessor/module.rs +0 -55
  252. package/rust/core/preprocessor/processor/handlers.rs +0 -107
  253. package/rust/core/preprocessor/processor/mod.rs +0 -1
  254. package/rust/core/preprocessor/resolver/bank.rs +0 -49
  255. package/rust/core/preprocessor/resolver/call.rs +0 -124
  256. package/rust/core/preprocessor/resolver/condition.rs +0 -95
  257. package/rust/core/preprocessor/resolver/driver.rs +0 -324
  258. package/rust/core/preprocessor/resolver/function.rs +0 -69
  259. package/rust/core/preprocessor/resolver/group.rs +0 -122
  260. package/rust/core/preprocessor/resolver/let_.rs +0 -32
  261. package/rust/core/preprocessor/resolver/loop_.rs +0 -318
  262. package/rust/core/preprocessor/resolver/mod.rs +0 -16
  263. package/rust/core/preprocessor/resolver/pattern.rs +0 -83
  264. package/rust/core/preprocessor/resolver/spawn.rs +0 -99
  265. package/rust/core/preprocessor/resolver/synth.rs +0 -54
  266. package/rust/core/preprocessor/resolver/tempo.rs +0 -48
  267. package/rust/core/preprocessor/resolver/trigger.rs +0 -116
  268. package/rust/core/preprocessor/resolver/value.rs +0 -176
  269. package/rust/core/store/global.rs +0 -57
  270. package/rust/core/store/mod.rs +0 -1
  271. package/rust/lib.rs +0 -323
  272. package/rust/main.rs +0 -388
  273. package/rust/types/Cargo.toml +0 -11
  274. package/rust/types/src/addons.rs +0 -55
  275. package/rust/types/src/ast.rs +0 -202
  276. package/rust/types/src/config.rs +0 -84
  277. package/rust/types/src/lib.rs +0 -15
  278. package/rust/types/src/plugin.rs +0 -20
  279. package/rust/types/src/store.rs +0 -139
  280. package/rust/types/src/telemetry.rs +0 -85
  281. package/rust/utils/Cargo.toml +0 -26
  282. package/rust/utils/src/error.rs +0 -186
  283. package/rust/utils/src/file.rs +0 -94
  284. package/rust/utils/src/first_usage.rs +0 -97
  285. package/rust/utils/src/lib.rs +0 -9
  286. package/rust/utils/src/logger.rs +0 -200
  287. package/rust/utils/src/path.rs +0 -129
  288. package/rust/utils/src/signature.rs +0 -41
  289. package/rust/utils/src/spinner.rs +0 -20
  290. package/rust/utils/src/version.rs +0 -27
  291. package/rust/utils/src/watcher.rs +0 -46
  292. package/rust/web/api.rs +0 -5
  293. package/rust/web/cdn.rs +0 -34
  294. package/rust/web/mod.rs +0 -3
  295. package/rust/web/sso.rs +0 -5
  296. package/templates/minimal/.devalang +0 -5
  297. package/templates/minimal/README.md +0 -218
  298. package/templates/minimal/src/index.deva +0 -2
  299. package/templates/welcome/.devalang +0 -5
  300. package/templates/welcome/README.md +0 -218
  301. package/templates/welcome/samples/kick-808.wav +0 -0
  302. package/templates/welcome/src/index.deva +0 -61
  303. package/templates/welcome/src/variables.deva +0 -3
  304. package/tests/integration.rs +0 -21
  305. package/tests/rust/cli_check_build.rs +0 -21
  306. package/tests/rust/cli_help.rs +0 -12
  307. package/tests/rust/cli_template_list.rs +0 -10
  308. package/tests/rust/cli_version.rs +0 -11
  309. package/tests/typescript/index.spec.ts +0 -136
  310. package/tests/typescript/playhead.spec.ts +0 -36
  311. package/tests/typescript/render_e2e.spec.ts +0 -77
  312. package/tsconfig.json +0 -115
  313. package/typescript/bin/index.ts +0 -28
  314. package/typescript/core/functions/index.ts +0 -94
  315. package/typescript/core/index.ts +0 -6
  316. package/typescript/core/types/index.ts +0 -4
  317. package/typescript/core/types/plugin.ts +0 -19
  318. package/typescript/core/types/result.ts +0 -29
  319. package/typescript/core/types/statement.ts +0 -47
  320. package/typescript/core/types/value.ts +0 -29
  321. package/typescript/index.ts +0 -8
  322. package/typescript/pkg/devalang_core.d.ts +0 -4
  323. package/typescript/pkg/devalang_core.ts +0 -65
  324. package/typescript/scripts/copy-wasm-dts.ts +0 -41
  325. package/typescript/scripts/postinstall.ts +0 -85
  326. package/typescript/scripts/version/bump.ts +0 -44
  327. package/typescript/scripts/version/fetch.ts +0 -18
  328. package/typescript/scripts/version/index.ts +0 -25
  329. package/typescript/scripts/version/sync.ts +0 -24
@@ -1,98 +0,0 @@
1
- use crate::core::parser::statement::StatementKind;
2
- use devalang_types::store::VariableTable;
3
- use devalang_types::{Duration, Value};
4
-
5
- pub fn load_trigger(
6
- trigger: &Value,
7
- duration: &Duration,
8
- _effects: &Option<Value>,
9
- base_duration: f32,
10
- variable_table: VariableTable,
11
- ) -> (String, f32) {
12
- let mut trigger_path = String::new();
13
- let mut duration_as_secs = 0.0;
14
-
15
- match trigger {
16
- Value::String(src) => {
17
- trigger_path = src.to_string();
18
- }
19
- Value::Identifier(src) => {
20
- trigger_path = src.to_string();
21
- }
22
-
23
- Value::Map(map) => {
24
- if let Some(Value::String(src)) = map.get("entity") {
25
- trigger_path = format!("devalang://bank/{}", src);
26
- } else if let Some(Value::Identifier(src)) = map.get("entity") {
27
- trigger_path = format!("devalang://bank/{}", src);
28
- } else {
29
- eprintln!(
30
- "❌ Trigger map must contain an 'entity' key with a string or identifier value."
31
- );
32
- }
33
- }
34
- Value::Sample(src) => {
35
- trigger_path = src.to_string();
36
- }
37
- Value::Statement(stmt) => {
38
- if let StatementKind::Trigger {
39
- entity,
40
- duration: _,
41
- effects: _,
42
- } = &stmt.kind
43
- {
44
- trigger_path = entity.clone();
45
- } else {
46
- eprintln!(
47
- "❌ Trigger statement must be of type 'Trigger', found: {:?}",
48
- stmt.kind
49
- );
50
- }
51
- }
52
- _ => {
53
- eprintln!(
54
- "❌ Invalid trigger type. Expected a string or identifier variable, found: {:?}",
55
- trigger
56
- );
57
- }
58
- }
59
-
60
- match duration {
61
- Duration::Identifier(duration_identifier) => {
62
- if duration_identifier == "auto" {
63
- duration_as_secs = base_duration;
64
- } else if let Some(Value::Number(num)) = variable_table.get(duration_identifier) {
65
- duration_as_secs = *num;
66
- } else if let Some(Value::String(num_str)) = variable_table.get(duration_identifier) {
67
- duration_as_secs = num_str.parse::<f32>().unwrap_or(base_duration);
68
- } else if let Some(Value::Identifier(num_str)) = variable_table.get(duration_identifier)
69
- {
70
- duration_as_secs = num_str.parse::<f32>().unwrap_or(base_duration);
71
- } else {
72
- eprintln!("❌ Invalid duration identifier: {}", duration_identifier);
73
- }
74
- }
75
-
76
- Duration::Number(num) => {
77
- duration_as_secs = *num;
78
- }
79
-
80
- Duration::Auto => {
81
- duration_as_secs = base_duration;
82
- }
83
-
84
- Duration::Beat(beat_str) => {
85
- let parts: Vec<&str> = beat_str.split('/').collect();
86
-
87
- if parts.len() == 2 {
88
- let numerator: f32 = parts[0].parse().unwrap_or(1.0);
89
- let denominator: f32 = parts[1].parse().unwrap_or(1.0);
90
- duration_as_secs = (numerator / denominator) * base_duration;
91
- } else {
92
- eprintln!("❌ Invalid beat duration format: {}", beat_str);
93
- }
94
- }
95
- }
96
-
97
- (trigger_path, duration_as_secs)
98
- }
@@ -1,6 +0,0 @@
1
- pub mod engine;
2
- pub mod evaluator;
3
- pub mod interpreter;
4
- pub mod loader;
5
- pub mod player;
6
- pub mod special;
@@ -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
- }