use alloc::format;
use alloc::{vec, vec::Vec};
use crate::import::import_memory::{ImportMemory, MemoryType};
use crate::prelude::*;
use super::instr_helper::InstrHelper;
use super::one_sid::OneSid;
use super::pattern_helper::PatternHelper;
use super::sound_fx::SoundFx;
#[derive(Debug)]
pub struct SidModule {
pub sid: OneSid,
pub pattern_helper: PatternHelper,
pub instruments: Vec<InstrRobSid>,
pub soundfx: Vec<SoundFx>,
}
impl SidModule {
pub fn to_modules(&self, original_instruments: bool) -> Vec<Module> {
let mut modules: Vec<Module> = vec![];
for song_number in 0..self.pattern_helper.songs.len() {
let mut module = Module::default();
module.name = format!("{} {}", self.sid.name, song_number);
module.comment = format!(
"{} - {} (song #{})",
self.sid.copyright, self.sid.author, song_number
);
module.profile = CompatibilityProfile::pt();
module.default_tempo = 1 + self.sid.resetspd;
let mut patterns = self.pattern_helper.get_patterns(song_number);
PatternHelper::split_large_patterns(&mut patterns);
let (patterns, pattern_order) = PatternHelper::cleanup_patterns(&patterns);
let pattern_order = vec![pattern_order];
let mut im = ImportMemory::default();
module.pattern = im.unpack_patterns(
FrequencyType::AmigaFrequencies,
MemoryType::Mod,
&pattern_order,
&patterns,
);
module.pattern_order = pattern_order;
let idst = InstrHelper::irss_to_instruments(&self.instruments, original_instruments);
module.instrument = idst;
modules.push(module);
}
modules
}
}
impl SidModule {
pub fn get_sid_commando() -> Self {
let sid = OneSid::get_sid_commando();
sid.to_sidmodule()
}
pub fn get_sid_crazy_comets() -> Self {
let sid = OneSid::get_sid_crazy_comets();
sid.to_sidmodule()
}
pub fn get_sid_last_v8() -> Self {
let sid = OneSid::get_sid_last_v8();
sid.to_sidmodule()
}
pub fn get_sid_monty_on_the_run() -> Self {
let sid = OneSid::get_sid_monty_on_the_run();
sid.to_sidmodule()
}
pub fn get_sid_thing_on_a_spring() -> Self {
let sid = OneSid::get_sid_thing_on_a_spring();
sid.to_sidmodule()
}
pub fn get_sid_zoid() -> Self {
let sid = OneSid::get_sid_zoid();
sid.to_sidmodule()
}
pub fn get_sid_ace_2() -> Self {
let sid = OneSid::get_sid_ace_2();
sid.to_sidmodule()
}
pub fn get_sid_delta() -> Self {
let sid = OneSid::get_sid_delta();
sid.to_sidmodule()
}
pub fn get_sid_human_race() -> Self {
let sid = OneSid::get_sid_human_race();
sid.to_sidmodule()
}
pub fn get_sid_international_karate() -> Self {
let sid = OneSid::get_sid_international_karate();
sid.to_sidmodule()
}
pub fn get_sid_lightforce() -> Self {
let sid = OneSid::get_sid_lightforce();
sid.to_sidmodule()
}
pub fn get_sid_sanxion_song_1() -> Self {
let sid = OneSid::get_sid_sanxion_song_1();
sid.to_sidmodule()
}
pub fn get_sid_sanxion_song_2() -> Self {
let sid = OneSid::get_sid_sanxion_song_2();
sid.to_sidmodule()
}
pub fn get_sid_spellbound() -> Self {
let sid = OneSid::get_sid_spellbound();
sid.to_sidmodule()
}
pub fn get_sid_thrust() -> Self {
let sid = OneSid::get_sid_thrust();
sid.to_sidmodule()
}
}