use serde::{Deserialize, Serialize};
use crate::core::fixed::units::Finetune;
#[derive(Default, Serialize, Deserialize, Copy, Clone, Debug)]
pub struct MdiOpl {
pub ksl: u8,
pub multiple: u8,
pub feedback: u8,
pub attack: u8,
pub sustain: u8,
pub eg: bool,
pub decay: u8,
pub release: u8,
pub total_level: u8,
pub am: bool,
pub vib: bool,
pub ksr: bool,
pub con: bool,
}
#[derive(Default, Serialize, Deserialize, Copy, Clone, Debug)]
pub struct MdiInstr {
pub modulator: MdiOpl,
pub carrier: MdiOpl,
pub modulator_wave_select: u8,
pub carrier_wave_select: u8,
}
#[derive(Default, Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Eq)]
pub enum OplRhythm {
#[default]
Melodic,
BassDrum,
Snare,
TomTom,
Cymbal,
HiHat,
}
#[derive(Default, Serialize, Deserialize, Copy, Clone, Debug)]
pub struct InstrOpl {
pub element: MdiInstr,
pub volume: u8,
pub relative_pitch: i8,
pub finetune: Finetune,
pub rhythm: OplRhythm,
}