@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
@@ -1,5 +1,5 @@
1
- pub mod commands;
2
- pub mod io;
3
- pub mod process;
4
- pub mod realtime;
5
- pub mod utils;
1
+ pub mod commands;
2
+ pub mod io;
3
+ pub mod process;
4
+ pub mod realtime;
5
+ pub mod utils;
@@ -1,150 +1,159 @@
1
- use crate::{
2
- config::driver::ProjectConfig,
3
- core::{
4
- builder::Builder,
5
- debugger::{
6
- lexer::write_lexer_log_file,
7
- module::{write_module_function_log_file, write_module_variable_log_file},
8
- preprocessor::write_preprocessor_log_file,
9
- store::{write_function_log_file, write_variables_log_file},
10
- },
11
- preprocessor::loader::ModuleLoader,
12
- store::global::GlobalStore,
13
- utils::path::normalize_path,
14
- },
15
- };
16
- use devalang_utils::{
17
- logger::{LogLevel, Logger},
18
- spinner::start_spinner,
19
- };
20
-
21
- pub fn process_play(
22
- _config: &Option<ProjectConfig>,
23
- entry_file: &str,
24
- output: &str,
25
- debug: bool,
26
- ) -> Result<
27
- (
28
- f32,
29
- Vec<crate::core::parser::statement::Statement>,
30
- crate::core::store::variable::VariableTable,
31
- crate::core::store::function::FunctionTable,
32
- crate::core::store::global::GlobalStore,
33
- ),
34
- String,
35
- > {
36
- let spinner = start_spinner("Building...");
37
-
38
- let normalized_entry = normalize_path(entry_file);
39
- let normalized_output_dir = normalize_path(output);
40
-
41
- let duration = std::time::Instant::now();
42
- let mut global_store = GlobalStore::new();
43
- let loader = ModuleLoader::new(&normalized_entry, &normalized_output_dir);
44
- let (modules_tokens, modules_statements) = loader.load_all_modules(&mut global_store);
45
-
46
- // Try to detect initial BPM from statements (fallback to 120.0)
47
- let mut detected_bpm: f32 = 120.0;
48
- let mut entry_statements: Vec<crate::core::parser::statement::Statement> = Vec::new();
49
- // Prefer the entry module if present
50
- if let Some(entry_stmts) = modules_statements.get(&normalized_entry) {
51
- entry_statements = entry_stmts.clone();
52
- for stmt in entry_stmts {
53
- if let crate::core::parser::statement::StatementKind::Tempo = &stmt.kind {
54
- use devalang_types::Value;
55
- if let Value::Number(n) = &stmt.value {
56
- detected_bpm = *n;
57
- break;
58
- }
59
- }
60
- }
61
- }
62
- // If still default, scan other modules for a tempo directive
63
- if (detected_bpm - 120.0).abs() < f32::EPSILON {
64
- 'outer: for (_name, stmts) in modules_statements.iter() {
65
- for stmt in stmts {
66
- if let crate::core::parser::statement::StatementKind::Tempo = &stmt.kind {
67
- use devalang_types::Value;
68
- if let Value::Number(n) = &stmt.value {
69
- detected_bpm = *n;
70
- break 'outer;
71
- }
72
- }
73
- }
74
- }
75
- }
76
-
77
- // SECTION Write logs
78
- if debug {
79
- for (module_path, module) in global_store.modules.clone() {
80
- write_module_variable_log_file(
81
- &normalized_output_dir,
82
- &module_path,
83
- &module.variable_table,
84
- );
85
- write_module_function_log_file(
86
- &normalized_output_dir,
87
- &module_path,
88
- &module.function_table,
89
- );
90
- }
91
-
92
- write_lexer_log_file(
93
- &normalized_output_dir,
94
- "lexer_tokens.log",
95
- modules_tokens.clone(),
96
- );
97
- write_preprocessor_log_file(
98
- &normalized_output_dir,
99
- "resolved_statements.log",
100
- modules_statements.clone(),
101
- );
102
- write_variables_log_file(
103
- &normalized_output_dir,
104
- "global_variables.log",
105
- global_store.variables.clone(),
106
- );
107
- write_function_log_file(
108
- &normalized_output_dir,
109
- "global_functions.log",
110
- global_store.functions.clone(),
111
- );
112
- }
113
-
114
- // SECTION Detect errors before building (like build.rs)
115
- let all_errors = crate::core::error::collect_all_errors_with_modules(&modules_statements);
116
- let (warnings, criticals) = crate::core::error::partition_errors(all_errors);
117
- crate::core::error::log_errors_with_stack("Play", &warnings, &criticals);
118
- if !criticals.is_empty() {
119
- spinner.finish_and_clear();
120
- return Err(format!(
121
- "play failed with {} critical error(s): {}",
122
- criticals.len(),
123
- criticals[0].message
124
- ));
125
- }
126
-
127
- // SECTION Building AST and Audio
128
- let builder = Builder::new();
129
- builder.build_ast(&modules_statements, output, false);
130
- builder.build_audio(&modules_statements, output, &mut global_store);
131
-
132
- // SECTION Logging
133
- let logger = Logger::new();
134
- let success_message = format!(
135
- "Build completed successfully in {:.2?}. Output files written to: '{}'",
136
- duration.elapsed(),
137
- normalized_output_dir
138
- );
139
-
140
- spinner.finish_and_clear();
141
- logger.log_message(LogLevel::Success, &success_message);
142
-
143
- Ok((
144
- detected_bpm,
145
- entry_statements,
146
- global_store.variables.clone(),
147
- global_store.functions.clone(),
148
- global_store,
149
- ))
150
- }
1
+ use crate::{
2
+ config::driver::ProjectConfig,
3
+ core::{
4
+ builder::Builder,
5
+ debugger::{
6
+ lexer::write_lexer_log_file,
7
+ logs::{write_module_function_log_file, write_module_variable_log_file},
8
+ preprocessor::write_preprocessor_log_file,
9
+ store::{write_function_log_file, write_variables_log_file},
10
+ },
11
+ preprocessor::loader::ModuleLoader,
12
+ store::global::GlobalStore,
13
+ },
14
+ };
15
+ use devalang_utils::path::normalize_path;
16
+ use devalang_utils::{
17
+ logger::{LogLevel, Logger},
18
+ spinner::start_spinner,
19
+ };
20
+
21
+ pub fn process_play(
22
+ _config: &Option<ProjectConfig>,
23
+ entry_file: &str,
24
+ output: &str,
25
+ audio_format: crate::cli::parser::AudioFormat,
26
+ sample_rate: u32,
27
+ debug: bool,
28
+ ) -> Result<
29
+ (
30
+ f32,
31
+ Vec<crate::core::parser::statement::Statement>,
32
+ devalang_types::VariableTable,
33
+ devalang_types::FunctionTable,
34
+ crate::core::store::global::GlobalStore,
35
+ ),
36
+ String,
37
+ > {
38
+ let spinner = start_spinner("Building...");
39
+
40
+ let normalized_entry = normalize_path(entry_file);
41
+ let normalized_output_dir = normalize_path(output);
42
+
43
+ let duration = std::time::Instant::now();
44
+ let mut global_store = GlobalStore::new();
45
+ let loader = ModuleLoader::new(&normalized_entry, &normalized_output_dir);
46
+ let (modules_tokens, modules_statements) = loader.load_all_modules(&mut global_store);
47
+
48
+ // Try to detect initial BPM from statements (fallback to 120.0)
49
+ let mut detected_bpm: f32 = 120.0;
50
+ let mut entry_statements: Vec<crate::core::parser::statement::Statement> = Vec::new();
51
+ // Prefer the entry module if present
52
+ if let Some(entry_stmts) = modules_statements.get(&normalized_entry) {
53
+ entry_statements = entry_stmts.clone();
54
+ for stmt in entry_stmts {
55
+ if let crate::core::parser::statement::StatementKind::Tempo = &stmt.kind {
56
+ use devalang_types::Value;
57
+ if let Value::Number(n) = &stmt.value {
58
+ detected_bpm = *n;
59
+ break;
60
+ }
61
+ }
62
+ }
63
+ }
64
+ // If still default, scan other modules for a tempo directive
65
+ if (detected_bpm - 120.0).abs() < f32::EPSILON {
66
+ 'outer: for (_name, stmts) in modules_statements.iter() {
67
+ for stmt in stmts {
68
+ if let crate::core::parser::statement::StatementKind::Tempo = &stmt.kind {
69
+ use devalang_types::Value;
70
+ if let Value::Number(n) = &stmt.value {
71
+ detected_bpm = *n;
72
+ break 'outer;
73
+ }
74
+ }
75
+ }
76
+ }
77
+ }
78
+
79
+ // SECTION Write logs
80
+ if debug {
81
+ for (module_path, module) in global_store.modules.clone() {
82
+ write_module_variable_log_file(
83
+ &normalized_output_dir,
84
+ &module_path,
85
+ &module.variable_table,
86
+ );
87
+ write_module_function_log_file(
88
+ &normalized_output_dir,
89
+ &module_path,
90
+ &module.function_table,
91
+ );
92
+ }
93
+
94
+ write_lexer_log_file(
95
+ &normalized_output_dir,
96
+ "lexer_tokens.log",
97
+ modules_tokens.clone(),
98
+ );
99
+ write_preprocessor_log_file(
100
+ &normalized_output_dir,
101
+ "resolved_statements.log",
102
+ modules_statements.clone(),
103
+ );
104
+ write_variables_log_file(
105
+ &normalized_output_dir,
106
+ "global_variables.log",
107
+ global_store.variables.clone(),
108
+ );
109
+ write_function_log_file(
110
+ &normalized_output_dir,
111
+ "global_functions.log",
112
+ global_store.functions.clone(),
113
+ );
114
+ }
115
+
116
+ // SECTION Detect errors before building (like build.rs)
117
+ let all_errors = crate::core::error::collect_all_errors_with_modules(&modules_statements);
118
+ let (warnings, criticals) = crate::core::error::partition_errors(all_errors);
119
+ crate::core::error::log_errors_with_stack("Play", &warnings, &criticals);
120
+ if !criticals.is_empty() {
121
+ spinner.finish_and_clear();
122
+ return Err(format!(
123
+ "play failed with {} critical error(s): {}",
124
+ criticals.len(),
125
+ criticals[0].message
126
+ ));
127
+ }
128
+
129
+ // SECTION Building AST and Audio
130
+ let builder = Builder::new();
131
+ builder.build_ast(&modules_statements, output, false);
132
+ let audio_format_str = format!("{:?}", audio_format);
133
+ builder.build_audio(
134
+ &modules_statements,
135
+ output,
136
+ &mut global_store,
137
+ Some(audio_format_str),
138
+ Some(sample_rate),
139
+ );
140
+
141
+ // SECTION Logging
142
+ let logger = Logger::new();
143
+ let success_message = format!(
144
+ "Build completed successfully in {:.2?}. Output files written to: '{}'",
145
+ duration.elapsed(),
146
+ normalized_output_dir
147
+ );
148
+
149
+ spinner.finish_and_clear();
150
+ logger.log_message(LogLevel::Success, &success_message);
151
+
152
+ Ok((
153
+ detected_bpm,
154
+ entry_statements,
155
+ global_store.variables.clone(),
156
+ global_store.functions.clone(),
157
+ global_store,
158
+ ))
159
+ }
@@ -1,91 +1,91 @@
1
- use std::sync::Arc;
2
- use std::sync::atomic::{AtomicBool, Ordering};
3
- use std::time::Duration;
4
-
5
- use devalang_types::Value;
6
-
7
- pub struct RtRunner {
8
- pub stop: Arc<AtomicBool>,
9
- pub handle: std::thread::JoinHandle<()>,
10
- }
11
-
12
- pub struct RtContext {
13
- pub bpm: f32,
14
- pub entry_stmts: Vec<crate::core::parser::statement::Statement>,
15
- pub variables: crate::core::store::variable::VariableTable,
16
- pub functions: crate::core::store::function::FunctionTable,
17
- pub global_store: crate::core::store::global::GlobalStore,
18
- }
19
-
20
- pub fn start_realtime_runner(ctx: RtContext, total_secs: f32) -> RtRunner {
21
- use crate::core::audio::engine::AudioEngine;
22
- use crate::core::audio::interpreter::driver::execute_audio_block;
23
- use crate::core::parser::statement::StatementKind;
24
- use devalang_utils::logger::Logger;
25
-
26
- let stop = Arc::new(AtomicBool::new(false));
27
- let stop_clone = stop.clone();
28
-
29
- let handle = std::thread::spawn(move || {
30
- let _logger = Logger::new();
31
- let bpm = if ctx.bpm > 0.0 { ctx.bpm } else { 120.0 };
32
- let beat_secs = 60.0f32 / bpm;
33
- let mut elapsed = 0.0f32;
34
-
35
- let mut variables = ctx.variables.clone();
36
- variables.set("__rt".to_string(), Value::Boolean(true));
37
- let functions = ctx.functions.clone();
38
- let _global_store = ctx.global_store.clone();
39
- let mut audio_engine = AudioEngine::new("rt".to_string());
40
-
41
- let i: usize = 0;
42
- let mut _current_loop: Option<()> = None; // simplified state
43
- let mut _beat_index: u64 = 0;
44
- while elapsed + 1e-3 < total_secs && i < ctx.entry_stmts.len() {
45
- if stop_clone.load(Ordering::Relaxed) {
46
- break;
47
- }
48
-
49
- std::thread::sleep(Duration::from_secs_f32(beat_secs));
50
- elapsed += beat_secs;
51
- _beat_index += 1;
52
- if stop_clone.load(Ordering::Relaxed) {
53
- break;
54
- }
55
-
56
- // Only fire periodic handlers when not in a loop - simplified
57
- if let Some(handlers) = ctx.global_store.get_event_handlers("beat") {
58
- for h in handlers {
59
- if let StatementKind::On { body, .. } = &h.kind {
60
- let _ = execute_audio_block(
61
- &mut audio_engine,
62
- &ctx.global_store,
63
- variables.clone(),
64
- functions.clone(),
65
- body,
66
- bpm,
67
- 60.0 / bpm,
68
- 0.0,
69
- 0.0,
70
- );
71
- }
72
- }
73
- }
74
- }
75
- });
76
-
77
- RtRunner { stop, handle }
78
- }
79
-
80
- pub fn stop_realtime_runner(runner_opt: &mut Option<RtRunner>) {
81
- if let Some(r) = runner_opt.take() {
82
- r.stop.store(true, Ordering::Relaxed);
83
- let _ = r.handle.join();
84
- }
85
- }
86
-
87
- pub fn join_realtime_runner(runner_opt: &mut Option<RtRunner>) {
88
- if let Some(r) = runner_opt.take() {
89
- let _ = r.handle.join();
90
- }
91
- }
1
+ use std::sync::Arc;
2
+ use std::sync::atomic::{AtomicBool, Ordering};
3
+ use std::time::Duration;
4
+
5
+ use devalang_types::Value;
6
+
7
+ pub struct RtRunner {
8
+ pub stop: Arc<AtomicBool>,
9
+ pub handle: std::thread::JoinHandle<()>,
10
+ }
11
+
12
+ pub struct RtContext {
13
+ pub bpm: f32,
14
+ pub entry_stmts: Vec<crate::core::parser::statement::Statement>,
15
+ pub variables: devalang_types::store::VariableTable,
16
+ pub functions: devalang_types::store::FunctionTable,
17
+ pub global_store: crate::core::store::global::GlobalStore,
18
+ }
19
+
20
+ pub fn start_realtime_runner(ctx: RtContext, total_secs: f32) -> RtRunner {
21
+ use crate::core::audio::engine::AudioEngine;
22
+ use crate::core::audio::interpreter::driver::execute_audio_block;
23
+ use crate::core::parser::statement::StatementKind;
24
+ use devalang_utils::logger::Logger;
25
+
26
+ let stop = Arc::new(AtomicBool::new(false));
27
+ let stop_clone = stop.clone();
28
+
29
+ let handle = std::thread::spawn(move || {
30
+ let _logger = Logger::new();
31
+ let bpm = if ctx.bpm > 0.0 { ctx.bpm } else { 120.0 };
32
+ let beat_secs = 60.0f32 / bpm;
33
+ let mut elapsed = 0.0f32;
34
+
35
+ let mut variables = ctx.variables.clone();
36
+ variables.set("__rt".to_string(), Value::Boolean(true));
37
+ let functions = ctx.functions.clone();
38
+ let _global_store = ctx.global_store.clone();
39
+ let mut audio_engine = AudioEngine::new("rt".to_string());
40
+
41
+ let i: usize = 0;
42
+ let mut _current_loop: Option<()> = None; // simplified state
43
+ let mut _beat_index: u64 = 0;
44
+ while elapsed + 1e-3 < total_secs && i < ctx.entry_stmts.len() {
45
+ if stop_clone.load(Ordering::Relaxed) {
46
+ break;
47
+ }
48
+
49
+ std::thread::sleep(Duration::from_secs_f32(beat_secs));
50
+ elapsed += beat_secs;
51
+ _beat_index += 1;
52
+ if stop_clone.load(Ordering::Relaxed) {
53
+ break;
54
+ }
55
+
56
+ // Only fire periodic handlers when not in a loop - simplified
57
+ if let Some(handlers) = ctx.global_store.get_event_handlers("beat") {
58
+ for h in handlers {
59
+ if let StatementKind::On { body, .. } = &h.kind {
60
+ let _ = execute_audio_block(
61
+ &mut audio_engine,
62
+ &ctx.global_store,
63
+ variables.clone(),
64
+ functions.clone(),
65
+ body,
66
+ bpm,
67
+ 60.0 / bpm,
68
+ 0.0,
69
+ 0.0,
70
+ );
71
+ }
72
+ }
73
+ }
74
+ }
75
+ });
76
+
77
+ RtRunner { stop, handle }
78
+ }
79
+
80
+ pub fn stop_realtime_runner(runner_opt: &mut Option<RtRunner>) {
81
+ if let Some(r) = runner_opt.take() {
82
+ r.stop.store(true, Ordering::Relaxed);
83
+ let _ = r.handle.join();
84
+ }
85
+ }
86
+
87
+ pub fn join_realtime_runner(runner_opt: &mut Option<RtRunner>) {
88
+ if let Some(r) = runner_opt.take() {
89
+ let _ = r.handle.join();
90
+ }
91
+ }
@@ -1,22 +1,22 @@
1
- use crate::config::settings::set_user_config_value;
2
- use devalang_utils::logger::{LogLevel, Logger};
3
-
4
- #[cfg(feature = "cli")]
5
- pub async fn handle_telemetry_enable_command() -> Result<(), String> {
6
- set_user_config_value("telemetry", serde_json::Value::Bool(true));
7
-
8
- let logger = Logger::new();
9
- logger.log_message(LogLevel::Info, "Telemetry has been enabled.");
10
-
11
- Ok(())
12
- }
13
-
14
- #[cfg(feature = "cli")]
15
- pub async fn handle_telemetry_disable_command() -> Result<(), String> {
16
- set_user_config_value("telemetry", serde_json::Value::Bool(false));
17
-
18
- let logger = Logger::new();
19
- logger.log_message(LogLevel::Info, "Telemetry has been disabled.");
20
-
21
- Ok(())
22
- }
1
+ use crate::config::settings::set_user_config_value;
2
+ use devalang_utils::logger::{LogLevel, Logger};
3
+
4
+ #[cfg(feature = "cli")]
5
+ pub async fn handle_telemetry_enable_command() -> Result<(), String> {
6
+ set_user_config_value("telemetry", serde_json::Value::Bool(true));
7
+
8
+ let logger = Logger::new();
9
+ logger.log_message(LogLevel::Info, "Telemetry has been enabled.");
10
+
11
+ Ok(())
12
+ }
13
+
14
+ #[cfg(feature = "cli")]
15
+ pub async fn handle_telemetry_disable_command() -> Result<(), String> {
16
+ set_user_config_value("telemetry", serde_json::Value::Bool(false));
17
+
18
+ let logger = Logger::new();
19
+ logger.log_message(LogLevel::Info, "Telemetry has been disabled.");
20
+
21
+ Ok(())
22
+ }