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