@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
@@ -3,8 +3,9 @@ use devalang_types::{Duration, Value};
3
3
  use crate::core::{
4
4
  audio::{engine::AudioEngine, interpreter::driver::execute_audio_block},
5
5
  parser::statement::{Statement, StatementKind},
6
- store::{function::FunctionTable, global::GlobalStore, variable::VariableTable},
6
+ store::global::GlobalStore,
7
7
  };
8
+ use devalang_types::store::{FunctionTable, VariableTable};
8
9
 
9
10
  pub fn interprete_spawn_statement(
10
11
  stmt: &Statement,
@@ -70,7 +71,22 @@ pub fn interprete_spawn_statement(
70
71
 
71
72
  // Pattern case: allow spawning a pattern similar to call
72
73
  if let Some(pattern_stmt) = find_pattern(name, variable_table, global_store) {
73
- if let Value::String(pat) = &pattern_stmt.value {
74
+ // Support Value::String(pattern) or Value::Map({ pattern: "..", swing: .., humanize: .. })
75
+ let mut pat_opt: Option<String> = None;
76
+ let mut opts_map: Option<std::collections::HashMap<String, Value>> = None;
77
+
78
+ match &pattern_stmt.value {
79
+ Value::String(s) => pat_opt = Some(s.clone()),
80
+ Value::Map(m) => {
81
+ if let Some(Value::String(s)) = m.get("pattern") {
82
+ pat_opt = Some(s.clone());
83
+ }
84
+ opts_map = Some(m.clone());
85
+ }
86
+ _ => {}
87
+ }
88
+
89
+ if let Some(pat) = pat_opt {
74
90
  let mut target_entity = name.clone();
75
91
  if let StatementKind::Pattern { name: _n, target } = &pattern_stmt.kind {
76
92
  if let Some(t) = target {
@@ -79,7 +95,7 @@ pub fn interprete_spawn_statement(
79
95
  }
80
96
 
81
97
  let final_variable_table = if let Some(parent) = &variable_table.parent {
82
- crate::core::store::variable::VariableTable {
98
+ devalang_types::VariableTable {
83
99
  variables: parent.variables.clone(),
84
100
  parent: None,
85
101
  }
@@ -96,6 +112,18 @@ pub fn interprete_spawn_statement(
96
112
  let total_bar = 4.0 * base_duration;
97
113
  let step_duration = total_bar / step_count;
98
114
 
115
+ // extract optional swing/humanize from pattern_stmt.value
116
+ let mut swing: f32 = 0.0;
117
+ let mut humanize: f32 = 0.0;
118
+ if let Value::Map(m) = &pattern_stmt.value {
119
+ if let Some(Value::Number(s)) = m.get("swing") {
120
+ swing = *s;
121
+ }
122
+ if let Some(Value::Number(h)) = m.get("humanize") {
123
+ humanize = *h;
124
+ }
125
+ }
126
+
99
127
  let mut updated_max = max_end_time;
100
128
 
101
129
  for (i, ch) in pattern_str.chars().enumerate() {
@@ -103,7 +131,29 @@ pub fn interprete_spawn_statement(
103
131
  continue;
104
132
  }
105
133
 
106
- let event_time = cursor_time + (i as f32) * step_duration;
134
+ // Apply swing: shift every other step by +/- swing*step_duration
135
+ let mut event_time = cursor_time + (i as f32) * step_duration;
136
+ if swing.abs() > 0.0001 {
137
+ // swing applies to off-beats: shift odd steps forward, even steps back
138
+ if i % 2 == 1 {
139
+ event_time += swing * step_duration;
140
+ } else {
141
+ event_time -= swing * step_duration;
142
+ }
143
+ }
144
+
145
+ // Apply humanize: small random jitter in [-humanize*step_duration/2, +...]
146
+ if humanize.abs() > 0.0001 {
147
+ let jitter_range = humanize * step_duration;
148
+ // lightweight RNG using a simple hash to avoid adding rand dependency
149
+ let seed = (audio_engine.module_name.len() + i) as u64
150
+ + (event_time.to_bits() as u64);
151
+ let mut x = seed.wrapping_mul(0x9E3779B97F4A7C15).rotate_left(13);
152
+ x ^= x >> 7;
153
+ let r = (x as i64 % 1000) as f32 / 1000.0; // [0,1)
154
+ let jitter = (r * 2.0 - 1.0) * jitter_range / 2.0;
155
+ event_time += jitter;
156
+ }
107
157
 
108
158
  let mut trigger_val = Value::String(target_entity.clone());
109
159
  if let Some(val) = variable_table.variables.get(&target_entity) {
@@ -1,40 +1,40 @@
1
- use crate::core::parser::statement::{Statement, StatementKind};
2
- use devalang_types::Value;
3
- use devalang_utils::logger::{LogLevel, Logger};
4
-
5
- pub fn interprete_tempo_statement(stmt: &Statement) -> Option<(f32, f32)> {
6
- if let StatementKind::Tempo = &stmt.kind {
7
- match &stmt.value {
8
- Value::Number(bpm) => {
9
- let bpm = { *bpm };
10
- let duration = 60.0 / bpm;
11
-
12
- return Some((bpm, duration));
13
- }
14
-
15
- Value::String(bpm_str) => {
16
- if let Ok(bpm) = bpm_str.parse::<f32>() {
17
- let duration = 60.0 / bpm;
18
- return Some((bpm, duration));
19
- }
20
- }
21
-
22
- Value::Identifier(bpm_ident) => {
23
- if let Ok(bpm) = bpm_ident.parse::<f32>() {
24
- let duration = 60.0 / bpm;
25
- return Some((bpm, duration));
26
- }
27
- }
28
-
29
- _ => {
30
- let logger = Logger::new();
31
- logger.log_message(
32
- LogLevel::Warning,
33
- format!("Invalid tempo value: {:?}", stmt.value).as_str(),
34
- );
35
- }
36
- }
37
- }
38
-
39
- None
40
- }
1
+ use crate::core::parser::statement::{Statement, StatementKind};
2
+ use devalang_types::Value;
3
+ use devalang_utils::logger::{LogLevel, Logger};
4
+
5
+ pub fn interprete_tempo_statement(stmt: &Statement) -> Option<(f32, f32)> {
6
+ if let StatementKind::Tempo = &stmt.kind {
7
+ match &stmt.value {
8
+ Value::Number(bpm) => {
9
+ let bpm = { *bpm };
10
+ let duration = 60.0 / bpm;
11
+
12
+ return Some((bpm, duration));
13
+ }
14
+
15
+ Value::String(bpm_str) => {
16
+ if let Ok(bpm) = bpm_str.parse::<f32>() {
17
+ let duration = 60.0 / bpm;
18
+ return Some((bpm, duration));
19
+ }
20
+ }
21
+
22
+ Value::Identifier(bpm_ident) => {
23
+ if let Ok(bpm) = bpm_ident.parse::<f32>() {
24
+ let duration = 60.0 / bpm;
25
+ return Some((bpm, duration));
26
+ }
27
+ }
28
+
29
+ _ => {
30
+ let logger = Logger::new();
31
+ logger.log_message(
32
+ LogLevel::Warning,
33
+ format!("Invalid tempo value: {:?}", stmt.value).as_str(),
34
+ );
35
+ }
36
+ }
37
+ }
38
+
39
+ None
40
+ }