use serde::{Deserialize, Serialize};
use crate::module::{ModuleFormat, PanResetPolicy, PlaybackQuirks};
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)]
pub struct CompatibilityProfile {
pub format: ModuleFormat,
pub quirks: PlaybackQuirks,
}
impl Default for CompatibilityProfile {
fn default() -> Self {
Self::modern()
}
}
impl CompatibilityProfile {
pub fn ft2() -> Self {
Self {
format: ModuleFormat::Xm,
quirks: PlaybackQuirks {
ft2_pitch_slide_overflow: true,
ft2_arpeggio_lut: true,
ft2_arpeggio_note_clamp: true,
keyoff_cuts_without_vol_env: true,
k00_eats_note: true,
volcol_b_advances_vibrato: true,
e60_leaks_to_next_pattern: true,
pan_reset_policy: PanResetPolicy::Always,
..PlaybackQuirks::default()
},
}
}
pub fn it214() -> Self {
Self {
format: ModuleFormat::It,
quirks: PlaybackQuirks {
tremor_state_persists: true,
pan_reset_policy: PanResetPolicy::OnInstrumentChange,
it_vibrato_ticks_at_row_zero: true,
..PlaybackQuirks::default()
},
}
}
pub fn it215() -> Self {
Self::it214()
}
pub fn st3() -> Self {
Self {
format: ModuleFormat::S3m,
quirks: PlaybackQuirks {
allow_zero_period: true,
pattern_loop_resumes: true,
tremor_state_persists: true,
pan_reset_policy: PanResetPolicy::Never,
..PlaybackQuirks::default()
},
}
}
pub fn pt() -> Self {
Self {
format: ModuleFormat::Mod,
quirks: PlaybackQuirks::default(),
}
}
pub fn modern() -> Self {
Self {
format: ModuleFormat::Unknown,
quirks: PlaybackQuirks::default(),
}
}
}