Refactor instruments into generic types list
parent
bf9343686a
commit
71c95cb205
|
@ -3,7 +3,7 @@ use flate2::read::ZlibDecoder;
|
|||
use linked_hash_set::LinkedHashSet;
|
||||
use samplerate::convert;
|
||||
use uuid::Uuid;
|
||||
use crate::reskit::{utility::{get_string, get_u8, skip, get_u32, get_i8, get_i32, get_u16, get_i16, Ring, print_warning, print_info}, soundtrack::{types::{SampleFormat, PsgEnvelope, Note, Sample, PsgSettings, PatternRow, Effect, DcsgChannelMode, NoiseType, Channel}, engines::echo::{EchoFormat, EchoEvent, ESF_FM_1, ESF_FM_2, ESF_FM_3, ESF_FM_4, ESF_FM_5, ESF_PSG_1, ESF_FM_6, ESF_PSG_2, ESF_PSG_3, ESF_PSG_4, get_events_for_row, compact_delays}}};
|
||||
use crate::reskit::{utility::{get_string, get_u8, skip, get_u32, get_i8, get_i32, get_u16, get_i16, Ring, print_warning, print_info}, soundtrack::{types::{SampleFormat, PsgEnvelope, Note, Sample, PsgSettings, PatternRow, Effect, DcsgChannelMode, NoiseType, Channel, Instrument, InstrumentType, Fm2612Operator, Fm2612Settings}, engines::echo::{EchoFormat, EchoEvent, ESF_FM_1, ESF_FM_2, ESF_FM_3, ESF_FM_4, ESF_FM_5, ESF_PSG_1, ESF_FM_6, ESF_PSG_2, ESF_PSG_3, ESF_PSG_4, get_events_for_row, compact_delays}}};
|
||||
|
||||
const DMF_MAGIC_NUMBER: &'static str = ".DelekDefleMask.";
|
||||
const DMF_SUPPORTED_VERSION: u8 = 27;
|
||||
|
@ -29,43 +29,6 @@ pub enum FrameMode {
|
|||
Custom( u8, u8, u8 )
|
||||
}
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
pub struct FmOperator {
|
||||
am: u8,
|
||||
ar: u8,
|
||||
dr: u8,
|
||||
mult: u8,
|
||||
rr: u8,
|
||||
sl: u8,
|
||||
tl: u8,
|
||||
dt2: u8,
|
||||
rs: u8,
|
||||
dt: i8,
|
||||
d2r: u8,
|
||||
ssg_mode: u8
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct FmSettings {
|
||||
alg: u8,
|
||||
fb: u8,
|
||||
fms: u8,
|
||||
ams: u8,
|
||||
operators: [FmOperator; 4]
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum InstrumentType {
|
||||
Fm( FmSettings ),
|
||||
Psg( PsgSettings )
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Instrument {
|
||||
name: String,
|
||||
instrument_type: InstrumentType
|
||||
}
|
||||
|
||||
pub struct DmfModule {
|
||||
platform: u8,
|
||||
version: u8,
|
||||
|
@ -327,7 +290,7 @@ impl DmfModule {
|
|||
}
|
||||
};
|
||||
|
||||
InstrumentType::Psg( PsgSettings { volume, arpeggio, noise, wavetable } )
|
||||
InstrumentType::PsgDcsg( PsgSettings { volume, arpeggio, noise, wavetable } )
|
||||
},
|
||||
1 => {
|
||||
print_info( "Fm Instrument" );
|
||||
|
@ -342,11 +305,11 @@ impl DmfModule {
|
|||
print_info( &format!( "FMS:\t{}", fms ) );
|
||||
print_info( &format!( "AMS:\t{}", ams ) );
|
||||
|
||||
let mut operators: [FmOperator; 4] = [
|
||||
FmOperator::default(),
|
||||
FmOperator::default(),
|
||||
FmOperator::default(),
|
||||
FmOperator::default()
|
||||
let mut operators: [Fm2612Operator; 4] = [
|
||||
Fm2612Operator::default(),
|
||||
Fm2612Operator::default(),
|
||||
Fm2612Operator::default(),
|
||||
Fm2612Operator::default()
|
||||
];
|
||||
|
||||
// Operator 1
|
||||
|
@ -465,12 +428,12 @@ impl DmfModule {
|
|||
print_info( &format!( "Op 4 SSG_MODE:\t{}\n", operators[ 3 ].ssg_mode ) );
|
||||
}
|
||||
|
||||
InstrumentType::Fm( FmSettings { alg, fb, fms, ams, operators } )
|
||||
InstrumentType::Fm2612( Fm2612Settings { alg, fb, fms, ams, operators } )
|
||||
},
|
||||
_ => return Err( format!( "invalid file: invalid instrument mode {}", mode ) )?
|
||||
};
|
||||
|
||||
instruments.push( Instrument { name, instrument_type } );
|
||||
instruments.push( Instrument { index: i as usize, name, instrument_type } );
|
||||
}
|
||||
|
||||
// Version 27 of DMF specifies "1 wavetable of 0 bytes" for sega megadrive
|
||||
|
@ -672,7 +635,7 @@ impl EchoFormat for DmfModule {
|
|||
let mut eefs: HashMap<String, Vec<u8>> = HashMap::new();
|
||||
|
||||
for instrument in &self.instruments {
|
||||
if let InstrumentType::Psg( settings ) = &instrument.instrument_type {
|
||||
if let InstrumentType::PsgDcsg( settings ) = &instrument.instrument_type {
|
||||
// Echo uses volume and arpeggio envelopes
|
||||
// Noise envelopes are usable but cannot be articulated in an instrument.
|
||||
// For use of the noise envelope, use ESF $0Bnn/$3Bnn and $3Ann in the stream.
|
||||
|
@ -801,7 +764,7 @@ impl EchoFormat for DmfModule {
|
|||
let mut eifs: HashMap<String, Vec<u8>> = HashMap::new();
|
||||
|
||||
for instrument in &self.instruments {
|
||||
if let InstrumentType::Fm( settings ) = &instrument.instrument_type {
|
||||
if let InstrumentType::Fm2612( settings ) = &instrument.instrument_type {
|
||||
// Create feedback + algorithm byte
|
||||
let alg_fb: u8 = ( settings.fb << 3 ) | settings.alg;
|
||||
|
||||
|
|
|
@ -17,6 +17,44 @@ pub struct PsgSettings {
|
|||
pub wavetable: PsgEnvelope< u32 >
|
||||
}
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
pub struct Fm2612Operator {
|
||||
pub am: u8,
|
||||
pub ar: u8,
|
||||
pub dr: u8,
|
||||
pub mult: u8,
|
||||
pub rr: u8,
|
||||
pub sl: u8,
|
||||
pub tl: u8,
|
||||
pub dt2: u8,
|
||||
pub rs: u8,
|
||||
pub dt: i8,
|
||||
pub d2r: u8,
|
||||
pub ssg_mode: u8
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Fm2612Settings {
|
||||
pub alg: u8,
|
||||
pub fb: u8,
|
||||
pub fms: u8,
|
||||
pub ams: u8,
|
||||
pub operators: [Fm2612Operator; 4]
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum InstrumentType {
|
||||
Fm2612( Fm2612Settings ),
|
||||
PsgDcsg( PsgSettings )
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Instrument {
|
||||
pub index: usize,
|
||||
pub name: String,
|
||||
pub instrument_type: InstrumentType
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum SampleFormat {
|
||||
Bits8,
|
||||
|
|
Loading…
Reference in New Issue