aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
blob: 2906d61bd9fd6bd8e1e107aa99cffeedf1a3d8ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#![warn(missing_docs)]

//! A plugin which adds MIDI file and soundfont audio support to the [bevy](https://crates.io/crates/bevy) engine via [rustysynth](https://crates.io/crates/rustysynth).

use bevy::{audio::AddAudioSource, prelude::*};
use rustysynth::SoundFont;
use std::{
    io::Read,
    sync::{Arc, OnceLock},
};

mod assets;
pub use assets::*;

pub(crate) static SOUNDFONT: OnceLock<Arc<SoundFont>> = OnceLock::new();

/// This plugin configures the soundfont used for playback and registers MIDI assets.
#[derive(Default, Debug)]
pub struct RustySynthPlugin<R: Read + Send + Sync + Clone + 'static> {
    /// Reader for soundfont data. A default is not provided since soundfonts can be quite large.
    pub soundfont: R,
}

impl<R: Read + Send + Sync + Clone + 'static> Plugin for RustySynthPlugin<R> {
    fn build(&self, app: &mut App) {
        let _ = SOUNDFONT.set(Arc::new(
            SoundFont::new(&mut self.soundfont.clone()).unwrap(),
        ));
        app.add_audio_source::<MidiAudio>().init_asset::<MidiAudio>().init_asset_loader::<MidiAssetLoader>();
    }
}