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

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 (207) hide show
  1. package/.devalang +9 -10
  2. package/Cargo.toml +84 -80
  3. package/README.md +10 -7
  4. package/docs/CHANGELOG.md +83 -0
  5. package/docs/ROADMAP.md +6 -2
  6. package/docs/TODO.md +3 -14
  7. package/examples/bus.deva +10 -0
  8. package/examples/chain.deva +19 -0
  9. package/examples/effect.deva +2 -0
  10. package/examples/filter.deva +11 -0
  11. package/examples/lfo.deva +9 -0
  12. package/examples/plugin.deva +10 -10
  13. package/examples/routing.deva +23 -0
  14. package/examples/synth.deva +11 -1
  15. package/examples/synth_types.deva +17 -0
  16. package/out-tsc/bin/project-version.json +6 -0
  17. package/out-tsc/core/functions/index.d.ts +5 -0
  18. package/out-tsc/core/functions/index.js +11 -0
  19. package/out-tsc/pkg/devalang_core.d.ts +2 -0
  20. package/out-tsc/pkg/devalang_core.js +17 -2
  21. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +1 -0
  22. package/out-tsc/scripts/version/copy-to-binary.d.ts +1 -0
  23. package/out-tsc/scripts/version/copy-to-binary.js +79 -0
  24. package/package.json +23 -10
  25. package/project-version.json +3 -3
  26. package/rust/bindings/Cargo.toml +9 -0
  27. package/rust/bindings/src/lib.rs +86 -0
  28. package/rust/cli/addon/commands.rs +35 -0
  29. package/rust/cli/addon/download.rs +234 -0
  30. package/rust/cli/addon/install.rs +33 -0
  31. package/rust/cli/addon/list.rs +224 -0
  32. package/rust/cli/addon/metadata.rs +124 -0
  33. package/rust/cli/addon/mod.rs +8 -0
  34. package/rust/cli/addon/remove.rs +271 -0
  35. package/rust/cli/addon/update.rs +305 -0
  36. package/rust/cli/{install/addon.rs → addon/utils.rs} +34 -43
  37. package/rust/cli/build/commands.rs +153 -103
  38. package/rust/cli/build/mod.rs +2 -2
  39. package/rust/cli/build/process.rs +165 -146
  40. package/rust/cli/check/mod.rs +208 -208
  41. package/rust/cli/discover/commands.rs +53 -31
  42. package/rust/cli/discover/config.rs +2 -4
  43. package/rust/cli/discover/install.rs +139 -28
  44. package/rust/cli/discover/metadata.rs +3 -3
  45. package/rust/cli/login/commands.rs +124 -124
  46. package/rust/cli/me/commands.rs +52 -0
  47. package/rust/cli/me/mod.rs +1 -0
  48. package/rust/cli/mod.rs +2 -2
  49. package/rust/cli/parser.rs +76 -70
  50. package/rust/cli/play/commands.rs +375 -324
  51. package/rust/cli/play/mod.rs +5 -5
  52. package/rust/cli/play/process.rs +159 -150
  53. package/rust/cli/play/realtime.rs +91 -91
  54. package/rust/cli/telemetry/commands.rs +22 -22
  55. package/rust/cli/telemetry/event_creator.rs +80 -80
  56. package/rust/cli/telemetry/mod.rs +3 -3
  57. package/rust/cli/telemetry/send.rs +51 -51
  58. package/rust/cli/template/commands.rs +69 -69
  59. package/rust/config/driver.rs +112 -103
  60. package/rust/config/mod.rs +3 -3
  61. package/rust/config/ops.rs +26 -26
  62. package/rust/config/settings.rs +101 -101
  63. package/rust/core/audio/engine/driver.rs +237 -0
  64. package/rust/core/audio/engine/export.rs +169 -0
  65. package/rust/core/audio/engine/helpers.rs +178 -170
  66. package/rust/core/audio/engine/mod.rs +56 -7
  67. package/rust/core/audio/engine/notes/dsp.rs +88 -0
  68. package/rust/core/audio/engine/notes/mod.rs +53 -0
  69. package/rust/core/audio/engine/notes/params.rs +294 -0
  70. package/rust/core/audio/engine/sample/insert.rs +300 -0
  71. package/rust/core/audio/engine/sample/mod.rs +40 -0
  72. package/rust/core/audio/engine/sample/padding.rs +170 -0
  73. package/rust/core/audio/evaluator/condition.rs +61 -0
  74. package/rust/core/audio/evaluator/mod.rs +9 -0
  75. package/rust/core/audio/{evaluator.rs → evaluator/numeric.rs} +152 -310
  76. package/rust/core/audio/evaluator/rhs.rs +16 -0
  77. package/rust/core/audio/evaluator/string_expr.rs +94 -0
  78. package/rust/core/audio/interpreter/driver.rs +574 -542
  79. package/rust/core/audio/interpreter/mod.rs +2 -14
  80. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +179 -0
  81. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +398 -0
  82. package/rust/core/audio/interpreter/statements/arrow_call/methods/effects.rs +323 -0
  83. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +3 -0
  84. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +371 -0
  85. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -0
  86. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -0
  87. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -0
  88. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -0
  89. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -0
  90. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -0
  91. package/rust/core/audio/interpreter/{automate.rs → statements/automate.rs} +2 -4
  92. package/rust/core/audio/interpreter/{call.rs → statements/call.rs} +36 -5
  93. package/rust/core/audio/interpreter/{condition.rs → statements/condition.rs} +72 -71
  94. package/rust/core/audio/interpreter/{function.rs → statements/function.rs} +24 -26
  95. package/rust/core/audio/interpreter/{let_.rs → statements/let_.rs} +36 -38
  96. package/rust/core/audio/interpreter/{load.rs → statements/load.rs} +17 -19
  97. package/rust/core/audio/interpreter/{loop_.rs → statements/loop_.rs} +115 -114
  98. package/rust/core/audio/interpreter/statements/mod.rs +12 -0
  99. package/rust/core/audio/interpreter/{sleep.rs → statements/sleep.rs} +28 -28
  100. package/rust/core/audio/interpreter/{spawn.rs → statements/spawn.rs} +54 -4
  101. package/rust/core/audio/interpreter/{tempo.rs → statements/tempo.rs} +40 -40
  102. package/rust/core/audio/interpreter/{trigger.rs → statements/trigger.rs} +242 -239
  103. package/rust/core/audio/loader/trigger.rs +98 -97
  104. package/rust/core/audio/mod.rs +6 -7
  105. package/rust/core/audio/special/easing.rs +189 -189
  106. package/rust/core/audio/special/env.rs +45 -45
  107. package/rust/core/audio/special/math.rs +134 -134
  108. package/rust/core/audio/special/modulator.rs +143 -143
  109. package/rust/core/builder/mod.rs +129 -86
  110. package/rust/core/debugger/{module.rs → logs.rs} +52 -55
  111. package/rust/core/debugger/mod.rs +30 -30
  112. package/rust/core/debugger/store.rs +38 -40
  113. package/rust/core/error/mod.rs +269 -269
  114. package/rust/core/lexer/driver.rs +2 -4
  115. package/rust/core/mod.rs +9 -10
  116. package/rust/core/parser/driver/block.rs +111 -0
  117. package/rust/core/parser/driver/cursor.rs +82 -0
  118. package/rust/core/parser/driver/driver_impl.rs +159 -0
  119. package/rust/core/parser/driver/mod.rs +6 -0
  120. package/rust/core/parser/driver/parse_array.rs +120 -0
  121. package/rust/core/parser/driver/parse_map.rs +247 -0
  122. package/rust/core/parser/driver/parser.rs +160 -0
  123. package/rust/core/parser/handler/arrow_call.rs +90 -15
  124. package/rust/core/parser/handler/at.rs +279 -279
  125. package/rust/core/parser/handler/bank.rs +104 -104
  126. package/rust/core/parser/handler/condition.rs +83 -83
  127. package/rust/core/parser/handler/dot.rs +148 -148
  128. package/rust/core/parser/handler/identifier/automate.rs +254 -254
  129. package/rust/core/parser/handler/identifier/call.rs +91 -91
  130. package/rust/core/parser/handler/identifier/emit.rs +70 -70
  131. package/rust/core/parser/handler/identifier/function.rs +113 -113
  132. package/rust/core/parser/handler/identifier/group.rs +89 -89
  133. package/rust/core/parser/handler/identifier/let_.rs +173 -173
  134. package/rust/core/parser/handler/identifier/mod.rs +55 -55
  135. package/rust/core/parser/handler/identifier/on.rs +107 -107
  136. package/rust/core/parser/handler/identifier/print.rs +49 -49
  137. package/rust/core/parser/handler/identifier/sleep.rs +96 -43
  138. package/rust/core/parser/handler/identifier/spawn.rs +91 -91
  139. package/rust/core/parser/handler/identifier/synth.rs +39 -3
  140. package/rust/core/parser/handler/loop_.rs +194 -194
  141. package/rust/core/parser/handler/pattern.rs +25 -2
  142. package/rust/core/parser/handler/tempo.rs +105 -57
  143. package/rust/core/parser/statement.rs +10 -11
  144. package/rust/core/plugin/loader.rs +137 -137
  145. package/rust/core/plugin/runner/mod.rs +11 -0
  146. package/rust/core/plugin/{runner.rs → runner/non_wasm.rs} +206 -72
  147. package/rust/core/plugin/runner/wasm32.rs +44 -0
  148. package/rust/core/preprocessor/loader/inject.rs +313 -0
  149. package/rust/core/preprocessor/loader/loader_helpers.rs +110 -0
  150. package/rust/core/preprocessor/loader/mod.rs +235 -0
  151. package/rust/core/preprocessor/module.rs +55 -60
  152. package/rust/core/preprocessor/{processor.rs → processor/handlers.rs} +107 -114
  153. package/rust/core/preprocessor/processor/mod.rs +1 -0
  154. package/rust/core/preprocessor/resolver/function.rs +69 -69
  155. package/rust/core/preprocessor/resolver/group.rs +122 -94
  156. package/rust/core/preprocessor/resolver/pattern.rs +14 -2
  157. package/rust/core/store/global.rs +57 -61
  158. package/rust/core/store/mod.rs +1 -5
  159. package/rust/lib.rs +323 -308
  160. package/rust/macros/Cargo.toml +14 -0
  161. package/rust/macros/src/lib.rs +52 -0
  162. package/rust/main.rs +336 -143
  163. package/rust/types/Cargo.toml +1 -1
  164. package/rust/types/src/addons.rs +57 -55
  165. package/rust/types/src/config.rs +82 -74
  166. package/rust/types/src/lib.rs +15 -12
  167. package/rust/types/src/plugin.rs +20 -0
  168. package/rust/types/src/store.rs +139 -0
  169. package/rust/types/src/telemetry.rs +85 -85
  170. package/rust/utils/Cargo.toml +5 -2
  171. package/rust/utils/src/file.rs +477 -94
  172. package/rust/utils/src/first_usage.rs +97 -97
  173. package/rust/utils/src/lib.rs +9 -9
  174. package/rust/utils/src/logger.rs +200 -200
  175. package/rust/utils/src/path.rs +158 -88
  176. package/rust/utils/src/signature.rs +41 -41
  177. package/rust/utils/src/spinner.rs +20 -20
  178. package/rust/utils/src/version.rs +58 -27
  179. package/rust/utils/src/watcher.rs +46 -46
  180. package/rust/web/api.rs +5 -5
  181. package/rust/web/auth.rs +5 -0
  182. package/rust/web/cdn.rs +34 -34
  183. package/rust/web/forge.rs +5 -0
  184. package/rust/web/mod.rs +2 -0
  185. package/tests/integration.rs +21 -21
  186. package/typescript/core/functions/index.ts +11 -0
  187. package/typescript/pkg/devalang_core.ts +20 -4
  188. package/typescript/scripts/version/copy-to-binary.ts +82 -0
  189. package/rust/cli/bank/api.rs +0 -122
  190. package/rust/cli/bank/commands.rs +0 -275
  191. package/rust/cli/bank/mod.rs +0 -29
  192. package/rust/cli/install/bank.rs +0 -53
  193. package/rust/cli/install/commands.rs +0 -35
  194. package/rust/cli/install/mod.rs +0 -4
  195. package/rust/cli/install/plugin.rs +0 -61
  196. package/rust/core/audio/engine/sample.rs +0 -366
  197. package/rust/core/audio/engine/synth.rs +0 -325
  198. package/rust/core/audio/interpreter/arrow_call.rs +0 -311
  199. package/rust/core/audio/renderer.rs +0 -54
  200. package/rust/core/parser/driver.rs +0 -584
  201. package/rust/core/preprocessor/loader.rs +0 -637
  202. package/rust/core/store/export.rs +0 -28
  203. package/rust/core/store/function.rs +0 -40
  204. package/rust/core/store/import.rs +0 -28
  205. package/rust/core/store/variable.rs +0 -51
  206. package/rust/core/utils/mod.rs +0 -1
  207. package/rust/core/utils/path.rs +0 -37
@@ -0,0 +1,170 @@
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
+ }
@@ -0,0 +1,61 @@
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
+ }
@@ -0,0 +1,9 @@
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;