Put verbose info behind one of the log levels

master
Ashley N. 2023-08-25 13:17:37 -04:00
parent 18e45bc59d
commit 8df69b7eae
2 changed files with 91 additions and 86 deletions

View File

@ -3,7 +3,7 @@ use flate2::read::ZlibDecoder;
use linked_hash_set::LinkedHashSet; use linked_hash_set::LinkedHashSet;
use samplerate::convert; use samplerate::convert;
use uuid::Uuid; 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}, 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}}}; 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}}};
const DMF_MAGIC_NUMBER: &'static str = ".DelekDefleMask."; const DMF_MAGIC_NUMBER: &'static str = ".DelekDefleMask.";
const DMF_SUPPORTED_VERSION: u8 = 27; const DMF_SUPPORTED_VERSION: u8 = 27;
@ -97,7 +97,7 @@ impl DmfModule {
return Err( format!( "invalid file: missing DMF header" ) )? return Err( format!( "invalid file: missing DMF header" ) )?
} }
println!( ".DelekDefleMask. DMF file" ); print_info( ".DelekDefleMask. DMF file" );
let version = get_u8( bytes.by_ref() )?; let version = get_u8( bytes.by_ref() )?;
if version != DMF_SUPPORTED_VERSION { if version != DMF_SUPPORTED_VERSION {
@ -106,16 +106,16 @@ impl DmfModule {
let platform = get_u8( bytes.by_ref() )?; let platform = get_u8( bytes.by_ref() )?;
match platform { match platform {
DMF_MD => println!( "Mode:\tSega Megadrive" ), DMF_MD => print_info( "Mode:\tSega Megadrive" ),
DMF_MD_ENHANCED_CH3 => return Err( "Extended Ch. 3 mode not yet supported (coming soon!) - if your sequence does not use Extended Ch. 3 mode, try re-exporting as standard mode." )?, DMF_MD_ENHANCED_CH3 => return Err( "Extended Ch. 3 mode not yet supported (coming soon!) - if your sequence does not use Extended Ch. 3 mode, try re-exporting as standard mode." )?,
_ => return Err( "invalid file: invalid console format" )? _ => return Err( "invalid file: invalid console format" )?
}; };
let song_name_len = get_u8( bytes.by_ref() )?; let song_name_len = get_u8( bytes.by_ref() )?;
println!( "Song name:\t{}", get_string( bytes.by_ref(), song_name_len.into() )? ); print_info( &format!( "Song name:\t{}", get_string( bytes.by_ref(), song_name_len.into() )? ) );
let song_author_len = get_u8( bytes.by_ref() )?; let song_author_len = get_u8( bytes.by_ref() )?;
println!( "Song author:\t{}", get_string( bytes.by_ref(), song_author_len.into() )? ); print_info( &format!( "Song author:\t{}", get_string( bytes.by_ref(), song_author_len.into() )? ) );
// Burn 2 bytes, don't care about the highlight patterns // Burn 2 bytes, don't care about the highlight patterns
skip( bytes.by_ref(), 2 ); skip( bytes.by_ref(), 2 );
@ -127,9 +127,9 @@ impl DmfModule {
let speed_a = get_u8( bytes.by_ref() )?; let speed_a = get_u8( bytes.by_ref() )?;
let speed_b = get_u8( bytes.by_ref() )?; let speed_b = get_u8( bytes.by_ref() )?;
println!( "Time base:\t{}", time_base ); print_info( &format!( "Time base:\t{}", time_base ) );
println!( "Ticks/Even:\t{}", speed_a ); print_info( &format!( "Ticks/Even:\t{}", speed_a ) );
println!( "Ticks/Odd:\t{}", speed_b ); print_info( &format!( "Ticks/Odd:\t{}", speed_b ) );
let frame_mode = match get_u8( bytes.by_ref() )? { let frame_mode = match get_u8( bytes.by_ref() )? {
0 => FrameMode::Pal, 0 => FrameMode::Pal,
@ -148,22 +148,22 @@ impl DmfModule {
frame_mode frame_mode
}; };
println!( "Frame mode:\t{:?}", frame_mode ); print_info( &format!( "Frame mode:\t{:?}", frame_mode ) );
let rows_per_pattern = get_u32( bytes.by_ref() )?; let rows_per_pattern = get_u32( bytes.by_ref() )?;
println!( "Rows/pattern:\t{}", rows_per_pattern ); print_info( &format!( "Rows/pattern:\t{}", rows_per_pattern ) );
let patterns_count = get_u8( bytes.by_ref() )?; let patterns_count = get_u8( bytes.by_ref() )?;
println!( "Patterns:\t{}", patterns_count ); print_info( &format!( "Patterns:\t{}\n", patterns_count ) );
println!( "\nPattern Matrix:" ); print_info( "Pattern Matrix:" );
let system_total_channels = if platform == DMF_MD { let system_total_channels = if platform == DMF_MD {
println!( "FM1 FM2 FM3 FM4 FM5 FM6 SN1 SN2 SN3 SN4" ); print_info( "FM1 FM2 FM3 FM4 FM5 FM6 SN1 SN2 SN3 SN4" );
10 10
} else { } else {
println!( "FM1 FM2 OP1 OP2 OP3 OP4 FM4 FM5 FM6 SN1 SN2 SN3 SN4" ); print_info( "FM1 FM2 OP1 OP2 OP3 OP4 FM4 FM5 FM6 SN1 SN2 SN3 SN4" );
13 13
}; };
@ -177,29 +177,30 @@ impl DmfModule {
} }
for pattern in &pattern_matrix { for pattern in &pattern_matrix {
let mut total_string: String = String::new();
for channel in pattern { for channel in pattern {
print!( "{:#04X?} ", channel ); total_string += &format!( "{:#04X?} ", channel );
} }
print!( "\n" ); print_info( &total_string );
} }
print!( "\n" ); print_info( "\n" );
let mut instruments: Vec<Instrument> = Vec::new(); let mut instruments: Vec<Instrument> = Vec::new();
let instrument_count = get_u8( bytes.by_ref() )?; let instrument_count = get_u8( bytes.by_ref() )?;
println!( "Instruments:\t{}", instrument_count ); print_info( &format!( "Instruments:\t{}", instrument_count ) );
for i in 0..instrument_count { for i in 0..instrument_count {
let name_len = get_u8( bytes.by_ref() )?; let name_len = get_u8( bytes.by_ref() )?;
let name = get_string( bytes.by_ref(), name_len.into() )?; let name = get_string( bytes.by_ref(), name_len.into() )?;
println!( "Instrument {}:\t{}", i, name ); print_info( &format!( "Instrument {}:\t{}", i, name ) );
let mode = get_u8( bytes.by_ref() )?; let mode = get_u8( bytes.by_ref() )?;
let instrument_type = match mode { let instrument_type = match mode {
0 => { 0 => {
println!( "Psg Instrument" ); print_info( "Psg Instrument" );
// Volume envelope // Volume envelope
let volume = { let volume = {
@ -221,8 +222,8 @@ impl DmfModule {
None None
}; };
println!( "Volume Envelope Size:\t{}", envelope.len() ); print_info( &format!( "Volume Envelope Size:\t{}", envelope.len() ) );
println!( "Loop at:\t{:?}", loop_at ); print_info( &format!( "Loop at:\t{:?}", loop_at ) );
PsgEnvelope { PsgEnvelope {
envelope, envelope,
@ -255,9 +256,9 @@ impl DmfModule {
( "arpeggio_macro_fixed", get_u8( bytes.by_ref() )? == 1 ) ( "arpeggio_macro_fixed", get_u8( bytes.by_ref() )? == 1 )
]); ]);
println!( "Arpeggio Envelope Size:\t{}", envelope.len() ); print_info( &format!( "Arpeggio Envelope Size:\t{}", envelope.len() ) );
println!( "Arpeggio Macro Fixed:\t{}", settings[ "arpeggio_macro_fixed" ] ); print_info( &format!( "Arpeggio Macro Fixed:\t{}", settings[ "arpeggio_macro_fixed" ] ) );
println!( "Loop at:\t{:?}", loop_at ); print_info( &format!( "Loop at:\t{:?}", loop_at ) );
PsgEnvelope { PsgEnvelope {
envelope, envelope,
@ -286,8 +287,8 @@ impl DmfModule {
None None
}; };
println!( "Noise Envelope Size:\t{}", envelope.len() ); print_info( &format!( "Noise Envelope Size:\t{}", envelope.len() ) );
println!( "Loop at:\t{:?}", loop_at ); print_info( &format!( "Loop at:\t{:?}", loop_at ) );
PsgEnvelope { PsgEnvelope {
envelope, envelope,
@ -316,8 +317,8 @@ impl DmfModule {
None None
}; };
println!( "WavTbl Envelope Size:\t{}\n", envelope.len() ); print_info( &format!( "WavTbl Envelope Size:\t{}\n", envelope.len() ) );
println!( "Loop at:\t{:?}", loop_at ); print_info( &format!( "Loop at:\t{:?}", loop_at ) );
PsgEnvelope { PsgEnvelope {
envelope, envelope,
@ -329,17 +330,17 @@ impl DmfModule {
InstrumentType::Psg( PsgSettings { volume, arpeggio, noise, wavetable } ) InstrumentType::Psg( PsgSettings { volume, arpeggio, noise, wavetable } )
}, },
1 => { 1 => {
println!( "Fm Instrument" ); print_info( "Fm Instrument" );
let alg = get_u8( bytes.by_ref() )?; let alg = get_u8( bytes.by_ref() )?;
let fb = get_u8( bytes.by_ref() )?; let fb = get_u8( bytes.by_ref() )?;
let fms = get_u8( bytes.by_ref() )?; let fms = get_u8( bytes.by_ref() )?;
let ams = get_u8( bytes.by_ref() )?; let ams = get_u8( bytes.by_ref() )?;
println!( "Alg:\t{}", alg ); print_info( &format!( "Alg:\t{}", alg ) );
println!( "Fb:\t{}", fb ); print_info( &format!( "Fb:\t{}", fb ) );
println!( "FMS:\t{}", fms ); print_info( &format!( "FMS:\t{}", fms ) );
println!( "AMS:\t{}", ams ); print_info( &format!( "AMS:\t{}", ams ) );
let mut operators: [FmOperator; 4] = [ let mut operators: [FmOperator; 4] = [
FmOperator::default(), FmOperator::default(),
@ -363,18 +364,18 @@ impl DmfModule {
operators[ 0 ].d2r = get_u8( bytes.by_ref() )?; operators[ 0 ].d2r = get_u8( bytes.by_ref() )?;
operators[ 0 ].ssg_mode = get_u8( bytes.by_ref() )?; operators[ 0 ].ssg_mode = get_u8( bytes.by_ref() )?;
println!( "Op 1 AM:\t{}", operators[ 0 ].am ); print_info( &format!( "Op 1 AM:\t{}", operators[ 0 ].am ) );
println!( "Op 1 AR:\t{}", operators[ 0 ].ar ); print_info( &format!( "Op 1 AR:\t{}", operators[ 0 ].ar ) );
println!( "Op 1 DR:\t{}", operators[ 0 ].dr ); print_info( &format!( "Op 1 DR:\t{}", operators[ 0 ].dr ) );
println!( "Op 1 MULT:\t{}", operators[ 0 ].mult ); print_info( &format!( "Op 1 MULT:\t{}", operators[ 0 ].mult ) );
println!( "Op 1 RR:\t{}", operators[ 0 ].rr ); print_info( &format!( "Op 1 RR:\t{}", operators[ 0 ].rr ) );
println!( "Op 1 SL:\t{}", operators[ 0 ].sl ); print_info( &format!( "Op 1 SL:\t{}", operators[ 0 ].sl ) );
println!( "Op 1 TL:\t{}", operators[ 0 ].tl ); print_info( &format!( "Op 1 TL:\t{}", operators[ 0 ].tl ) );
println!( "Op 1 DT2:\t{}", operators[ 0 ].dt2 ); print_info( &format!( "Op 1 DT2:\t{}", operators[ 0 ].dt2 ) );
println!( "Op 1 RS:\t{}", operators[ 0 ].rs ); print_info( &format!( "Op 1 RS:\t{}", operators[ 0 ].rs ) );
println!( "Op 1 DT:\t{}", operators[ 0 ].dt ); print_info( &format!( "Op 1 DT:\t{}", operators[ 0 ].dt ) );
println!( "Op 1 D2R:\t{}", operators[ 0 ].d2r ); print_info( &format!( "Op 1 D2R:\t{}", operators[ 0 ].d2r ) );
println!( "Op 1 SSG_MODE:\t{}\n", operators[ 0 ].ssg_mode ); print_info( &format!( "Op 1 SSG_MODE:\t{}\n", operators[ 0 ].ssg_mode ) );
} }
// Operator 3 // Operator 3
@ -392,18 +393,18 @@ impl DmfModule {
operators[ 1 ].d2r = get_u8( bytes.by_ref() )?; operators[ 1 ].d2r = get_u8( bytes.by_ref() )?;
operators[ 1 ].ssg_mode = get_u8( bytes.by_ref() )?; operators[ 1 ].ssg_mode = get_u8( bytes.by_ref() )?;
println!( "Op 3 AM:\t{}", operators[ 1 ].am ); print_info( &format!( "Op 3 AM:\t{}", operators[ 1 ].am ) );
println!( "Op 3 AR:\t{}", operators[ 1 ].ar ); print_info( &format!( "Op 3 AR:\t{}", operators[ 1 ].ar ) );
println!( "Op 3 DR:\t{}", operators[ 1 ].dr ); print_info( &format!( "Op 3 DR:\t{}", operators[ 1 ].dr ) );
println!( "Op 3 MULT:\t{}", operators[ 1 ].mult ); print_info( &format!( "Op 3 MULT:\t{}", operators[ 1 ].mult ) );
println!( "Op 3 RR:\t{}", operators[ 1 ].rr ); print_info( &format!( "Op 3 RR:\t{}", operators[ 1 ].rr ) );
println!( "Op 3 SL:\t{}", operators[ 1 ].sl ); print_info( &format!( "Op 3 SL:\t{}", operators[ 1 ].sl ) );
println!( "Op 3 TL:\t{}", operators[ 1 ].tl ); print_info( &format!( "Op 3 TL:\t{}", operators[ 1 ].tl ) );
println!( "Op 3 DT2:\t{}", operators[ 1 ].dt2 ); print_info( &format!( "Op 3 DT2:\t{}", operators[ 1 ].dt2 ) );
println!( "Op 3 RS:\t{}", operators[ 1 ].rs ); print_info( &format!( "Op 3 RS:\t{}", operators[ 1 ].rs ) );
println!( "Op 3 DT:\t{}", operators[ 1 ].dt ); print_info( &format!( "Op 3 DT:\t{}", operators[ 1 ].dt ) );
println!( "Op 3 D2R:\t{}", operators[ 1 ].d2r ); print_info( &format!( "Op 3 D2R:\t{}", operators[ 1 ].d2r ) );
println!( "Op 3 SSG_MODE:\t{}\n", operators[ 1 ].ssg_mode ); print_info( &format!( "Op 3 SSG_MODE:\t{}\n", operators[ 1 ].ssg_mode ) );
} }
// Operator 2 // Operator 2
@ -421,18 +422,18 @@ impl DmfModule {
operators[ 2 ].d2r = get_u8( bytes.by_ref() )?; operators[ 2 ].d2r = get_u8( bytes.by_ref() )?;
operators[ 2 ].ssg_mode = get_u8( bytes.by_ref() )?; operators[ 2 ].ssg_mode = get_u8( bytes.by_ref() )?;
println!( "Op 2 AM:\t{}", operators[ 2 ].am ); print_info( &format!( "Op 2 AM:\t{}", operators[ 2 ].am ) );
println!( "Op 2 AR:\t{}", operators[ 2 ].ar ); print_info( &format!( "Op 2 AR:\t{}", operators[ 2 ].ar ) );
println!( "Op 2 DR:\t{}", operators[ 2 ].dr ); print_info( &format!( "Op 2 DR:\t{}", operators[ 2 ].dr ) );
println!( "Op 2 MULT:\t{}", operators[ 2 ].mult ); print_info( &format!( "Op 2 MULT:\t{}", operators[ 2 ].mult ) );
println!( "Op 2 RR:\t{}", operators[ 2 ].rr ); print_info( &format!( "Op 2 RR:\t{}", operators[ 2 ].rr ) );
println!( "Op 2 SL:\t{}", operators[ 2 ].sl ); print_info( &format!( "Op 2 SL:\t{}", operators[ 2 ].sl ) );
println!( "Op 2 TL:\t{}", operators[ 2 ].tl ); print_info( &format!( "Op 2 TL:\t{}", operators[ 2 ].tl ) );
println!( "Op 2 DT2:\t{}", operators[ 2 ].dt2 ); print_info( &format!( "Op 2 DT2:\t{}", operators[ 2 ].dt2 ) );
println!( "Op 2 RS:\t{}", operators[ 2 ].rs ); print_info( &format!( "Op 2 RS:\t{}", operators[ 2 ].rs ) );
println!( "Op 2 DT:\t{}", operators[ 2 ].dt ); print_info( &format!( "Op 2 DT:\t{}", operators[ 2 ].dt ) );
println!( "Op 2 D2R:\t{}", operators[ 2 ].d2r ); print_info( &format!( "Op 2 D2R:\t{}", operators[ 2 ].d2r ) );
println!( "Op 2 SSG_MODE:\t{}\n", operators[ 2 ].ssg_mode ); print_info( &format!( "Op 2 SSG_MODE:\t{}\n", operators[ 2 ].ssg_mode ) );
} }
// Operator 4 // Operator 4
@ -450,18 +451,18 @@ impl DmfModule {
operators[ 3 ].d2r = get_u8( bytes.by_ref() )?; operators[ 3 ].d2r = get_u8( bytes.by_ref() )?;
operators[ 3 ].ssg_mode = get_u8( bytes.by_ref() )?; operators[ 3 ].ssg_mode = get_u8( bytes.by_ref() )?;
println!( "Op 4 AM:\t{}", operators[ 3 ].am ); print_info( &format!( "Op 4 AM:\t{}", operators[ 3 ].am ) );
println!( "Op 4 AR:\t{}", operators[ 3 ].ar ); print_info( &format!( "Op 4 AR:\t{}", operators[ 3 ].ar ) );
println!( "Op 4 DR:\t{}", operators[ 3 ].dr ); print_info( &format!( "Op 4 DR:\t{}", operators[ 3 ].dr ) );
println!( "Op 4 MULT:\t{}", operators[ 3 ].mult ); print_info( &format!( "Op 4 MULT:\t{}", operators[ 3 ].mult ) );
println!( "Op 4 RR:\t{}", operators[ 3 ].rr ); print_info( &format!( "Op 4 RR:\t{}", operators[ 3 ].rr ) );
println!( "Op 4 SL:\t{}", operators[ 3 ].sl ); print_info( &format!( "Op 4 SL:\t{}", operators[ 3 ].sl ) );
println!( "Op 4 TL:\t{}", operators[ 3 ].tl ); print_info( &format!( "Op 4 TL:\t{}", operators[ 3 ].tl ) );
println!( "Op 4 DT2:\t{}", operators[ 3 ].dt2 ); print_info( &format!( "Op 4 DT2:\t{}", operators[ 3 ].dt2 ) );
println!( "Op 4 RS:\t{}", operators[ 3 ].rs ); print_info( &format!( "Op 4 RS:\t{}", operators[ 3 ].rs ) );
println!( "Op 4 DT:\t{}", operators[ 3 ].dt ); print_info( &format!( "Op 4 DT:\t{}", operators[ 3 ].dt ) );
println!( "Op 4 D2R:\t{}", operators[ 3 ].d2r ); print_info( &format!( "Op 4 D2R:\t{}", operators[ 3 ].d2r ) );
println!( "Op 4 SSG_MODE:\t{}\n", operators[ 3 ].ssg_mode ); print_info( &format!( "Op 4 SSG_MODE:\t{}\n", operators[ 3 ].ssg_mode ) );
} }
InstrumentType::Fm( FmSettings { alg, fb, fms, ams, operators } ) InstrumentType::Fm( FmSettings { alg, fb, fms, ams, operators } )
@ -490,7 +491,7 @@ impl DmfModule {
for channel in 0..system_total_channels { for channel in 0..system_total_channels {
let mut channel_rows: Vec<PatternRow> = Vec::new(); let mut channel_rows: Vec<PatternRow> = Vec::new();
let num_effects = get_u8( bytes.by_ref() )?; let num_effects = get_u8( bytes.by_ref() )?;
println!( "Patterns for Ch. {}", channel ); print_info( &format!( "Patterns for Ch. {}", channel ) );
for _ in 0..patterns_count { for _ in 0..patterns_count {
for row_id in 0..rows_per_pattern { for row_id in 0..rows_per_pattern {
@ -606,7 +607,7 @@ impl DmfModule {
}; };
let pattern_row = PatternRow { note, volume, effects, instrument_index }; let pattern_row = PatternRow { note, volume, effects, instrument_index };
println!( "{}:\t{:?}", row_id, pattern_row ); print_info( &format!( "{}:\t{:?}", row_id, pattern_row ) );
channel_rows.push( pattern_row ); channel_rows.push( pattern_row );
} }
@ -615,7 +616,7 @@ impl DmfModule {
channel_patterns.push( channel_rows ); channel_patterns.push( channel_rows );
} }
println!( "PCM Samples:" ); print_info( "PCM Samples:" );
let mut samples: Vec<Sample> = Vec::new(); let mut samples: Vec<Sample> = Vec::new();
let num_samples = get_u8( bytes.by_ref() )?; let num_samples = get_u8( bytes.by_ref() )?;
for i in 0..num_samples { for i in 0..num_samples {
@ -646,7 +647,7 @@ impl DmfModule {
let mut sample = Sample { name, rate, pitch, amp, bitrate, data: Vec::new() }; let mut sample = Sample { name, rate, pitch, amp, bitrate, data: Vec::new() };
println!( "{}:\t{:?}", i, sample ); print_info( &format!( "{}:\t{:?}", i, sample ) );
for _ in 0..sample_size { for _ in 0..sample_size {
sample.data.push( get_i16( bytes.by_ref() )? ); sample.data.push( get_i16( bytes.by_ref() )? );

View File

@ -49,6 +49,10 @@ pub fn print_warning( message: &str ) {
yellow!( "warning: " ); println!( "{}", message ); yellow!( "warning: " ); println!( "{}", message );
} }
pub fn print_info( message: &str ) {
cyan!( "info: " ); println!( "{}", message );
}
pub fn get_string( bytes: &mut Iter<'_, u8>, take: usize ) -> Result<String, Box<dyn Error>> { pub fn get_string( bytes: &mut Iter<'_, u8>, take: usize ) -> Result<String, Box<dyn Error>> {
let took = bytes.take( take ); let took = bytes.take( take );
let took: Vec<u8> = took.cloned().collect(); let took: Vec<u8> = took.cloned().collect();