devalang_core/core/audio/engine/
mod.rs

1pub mod driver;
2pub mod export;
3pub mod helpers;
4pub mod notes;
5pub mod sample;
6
7pub use driver::AudioEngine;
8
9pub use driver::CHANNELS;
10pub use driver::MidiNoteEvent;
11pub use driver::SAMPLE_RATE;
12pub use helpers::*;
13
14use crate::core::audio::interpreter::driver::run_audio_program;
15use crate::core::parser::statement::Statement;
16use crate::core::store::global::GlobalStore;
17use devalang_types::{FunctionTable, VariableTable};
18use std::collections::HashMap;
19
20/// Render audio for a set of parsed modules.
21///
22/// For each entry in `modules` (module path -> statements), create an
23/// AudioEngine, setup empty module-local VariableTable and FunctionTable,
24/// invoke the interpreter driver to schedule audio into the engine, and
25/// return a map of module name -> AudioEngine.
26pub fn render_audio_with_modules(
27    modules: HashMap<String, Vec<Statement>>,
28    _output_dir: &str,
29    global_store: &mut GlobalStore,
30) -> HashMap<String, AudioEngine> {
31    let mut result: HashMap<String, AudioEngine> = HashMap::new();
32
33    for (module_name, statements) in modules.into_iter() {
34        // Create engine named after module (used for diagnostics)
35        let mut engine = AudioEngine::new(module_name.clone());
36
37        // Create empty module-local tables; interpreter expects these as starting context
38        let module_vars = VariableTable::new();
39        let module_funcs = FunctionTable::new();
40
41        // Run interpreter which will populate the engine.buffer and midi events
42        let (_max_end_time, _cursor_time) = run_audio_program(
43            &statements,
44            &mut engine,
45            module_name.clone(),
46            module_name.clone(),
47            module_vars,
48            module_funcs,
49            global_store,
50        );
51
52        result.insert(module_name, engine);
53    }
54
55    result
56}