Refactor
parent
d21d16605c
commit
3601a6763e
|
@ -6,7 +6,7 @@ extern crate colour;
|
||||||
mod reskit;
|
mod reskit;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use clap::{App, Arg, SubCommand};
|
use clap::{App, Arg, SubCommand};
|
||||||
use reskit::soundtrack::DmfModule;
|
use reskit::soundtrack::dmf::DmfModule;
|
||||||
use reskit::utility;
|
use reskit::utility;
|
||||||
use reskit::tileset;
|
use reskit::tileset;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
use std::{error::Error, fs::File, io::Read, convert::TryInto, collections::HashMap};
|
use std::{error::Error, fs::File, io::Read, convert::TryInto, collections::HashMap};
|
||||||
use flate2::read::ZlibDecoder;
|
use flate2::read::ZlibDecoder;
|
||||||
use crate::reskit::utility::{Either, get_string, get_u8, skip, get_u32, get_i8, get_i32, get_u16, get_i16};
|
use crate::reskit::{utility::{Either, get_string, get_u8, skip, get_u32, get_i8, get_i32, get_u16, get_i16}, soundtrack::types::{SampleRate, SampleFormat, PsgEnvelope}};
|
||||||
|
|
||||||
|
use super::types::{Sample, Note, PsgSettings};
|
||||||
|
|
||||||
const DMF_MAGIC_NUMBER: &'static str = ".DelekDefleMask.";
|
const DMF_MAGIC_NUMBER: &'static str = ".DelekDefleMask.";
|
||||||
const DMF_SUPPORTED_VERSION: u8 = 0x18;
|
const DMF_SUPPORTED_VERSION: u8 = 0x18;
|
||||||
|
@ -39,21 +41,6 @@ pub struct FmSettings {
|
||||||
operators: [FmOperator; 4]
|
operators: [FmOperator; 4]
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct PsgEnvelope {
|
|
||||||
envelope: Either<Vec<u32>, Vec<i32>>,
|
|
||||||
loop_at: Option<usize>,
|
|
||||||
settings: HashMap<&'static str, bool>
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct PsgSettings {
|
|
||||||
volume: PsgEnvelope,
|
|
||||||
arpeggio: PsgEnvelope,
|
|
||||||
noise: PsgEnvelope,
|
|
||||||
wavetable: PsgEnvelope
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum InstrumentType {
|
pub enum InstrumentType {
|
||||||
Fm( FmSettings ),
|
Fm( FmSettings ),
|
||||||
|
@ -66,22 +53,6 @@ pub struct Instrument {
|
||||||
instrument_type: InstrumentType
|
instrument_type: InstrumentType
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum Note {
|
|
||||||
NoteOff,
|
|
||||||
CSharp( u16 ),
|
|
||||||
D( u16 ),
|
|
||||||
DSharp( u16 ),
|
|
||||||
E( u16 ),
|
|
||||||
F( u16 ),
|
|
||||||
FSharp( u16 ),
|
|
||||||
G( u16 ),
|
|
||||||
GSharp( u16 ),
|
|
||||||
A( u16 ),
|
|
||||||
ASharp( u16 ),
|
|
||||||
B( u16 ),
|
|
||||||
C( u16 )
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Effect {
|
pub struct Effect {
|
||||||
|
@ -97,31 +68,6 @@ pub struct PatternRow {
|
||||||
instrument_index: Option<u16>
|
instrument_index: Option<u16>
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum SampleRate {
|
|
||||||
Hz8000,
|
|
||||||
Hz11025,
|
|
||||||
Hz16000,
|
|
||||||
Hz22050,
|
|
||||||
Hz32000
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum SampleFormat {
|
|
||||||
Bits8,
|
|
||||||
Bits16
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct Sample {
|
|
||||||
name: String,
|
|
||||||
rate: SampleRate,
|
|
||||||
pitch: i8,
|
|
||||||
amp: u8,
|
|
||||||
bitrate: SampleFormat,
|
|
||||||
data: Vec<u16>
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct DmfModule {
|
pub struct DmfModule {
|
||||||
platform: u8,
|
platform: u8,
|
||||||
version: u8,
|
version: u8,
|
||||||
|
@ -652,74 +598,3 @@ impl DmfModule {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl Note {
|
|
||||||
|
|
||||||
pub fn get_freq( &self ) -> Option<f32> {
|
|
||||||
match self {
|
|
||||||
Note::NoteOff => None,
|
|
||||||
Note::CSharp( octave ) => match octave {
|
|
||||||
0 => Some( 17.32 ), 1 => Some( 34.65 ), 2 => Some( 69.30 ), 3 => Some( 138.59 ),
|
|
||||||
4 => Some( 277.18 ), 5 => Some( 554.37 ), 6 => Some( 1108.73 ), 7 => Some( 2217.46 ),
|
|
||||||
_ => None
|
|
||||||
},
|
|
||||||
Note::D( octave ) => match octave {
|
|
||||||
0 => Some( 18.35 ), 1 => Some( 36.71 ), 2 => Some( 73.42 ), 3 => Some( 146.83 ),
|
|
||||||
4 => Some( 293.66 ), 5 => Some( 587.33 ), 6 => Some( 1174.66 ), 7 => Some( 2349.32 ),
|
|
||||||
_ => None
|
|
||||||
},
|
|
||||||
Note::DSharp( octave ) => match octave {
|
|
||||||
0 => Some( 19.45 ), 1 => Some( 38.89 ), 2 => Some( 77.78 ), 3 => Some( 155.56 ),
|
|
||||||
4 => Some( 311.13 ), 5 => Some( 622.25 ), 6 => Some( 1244.51 ), 7 => Some( 2489.02 ),
|
|
||||||
_ => None
|
|
||||||
},
|
|
||||||
Note::E( octave ) => match octave {
|
|
||||||
0 => Some( 20.60 ), 1 => Some( 41.20 ), 2 => Some( 82.41 ), 3 => Some( 164.81 ),
|
|
||||||
4 => Some( 329.63 ), 5 => Some( 659.25 ), 6 => Some( 1318.51 ), 7 => Some( 2637.02 ),
|
|
||||||
_ => None
|
|
||||||
},
|
|
||||||
Note::F( octave ) => match octave {
|
|
||||||
0 => Some( 21.83 ), 1 => Some( 43.65 ), 2 => Some( 87.31 ), 3 => Some( 174.61 ),
|
|
||||||
4 => Some( 349.23 ), 5 => Some( 698.46 ), 6 => Some( 1396.91 ), 7 => Some( 2793.83 ),
|
|
||||||
_ => None
|
|
||||||
},
|
|
||||||
Note::FSharp( octave ) => match octave {
|
|
||||||
0 => Some( 23.12 ), 1 => Some( 46.25 ), 2 => Some( 92.50 ), 3 => Some( 185.00 ),
|
|
||||||
4 => Some( 369.99 ), 5 => Some( 739.99 ), 6 => Some( 1479.98 ), 7 => Some( 2959.96 ),
|
|
||||||
_ => None
|
|
||||||
},
|
|
||||||
Note::G( octave ) => match octave {
|
|
||||||
0 => Some( 24.50 ), 1 => Some( 49.00 ), 2 => Some( 98.00 ), 3 => Some( 196.00 ),
|
|
||||||
4 => Some( 392.00 ), 5 => Some( 783.99 ), 6 => Some( 1567.98 ), 7 => Some( 3135.96 ),
|
|
||||||
_ => None
|
|
||||||
},
|
|
||||||
Note::GSharp( octave ) => match octave {
|
|
||||||
0 => Some( 25.96 ), 1 => Some( 51.91 ), 2 => Some( 103.83 ), 3 => Some( 207.65 ),
|
|
||||||
4 => Some( 415.30 ), 5 => Some( 830.61 ), 6 => Some( 1661.22 ), 7 => Some( 3322.44 ),
|
|
||||||
_ => None
|
|
||||||
},
|
|
||||||
Note::A( octave ) => match octave {
|
|
||||||
0 => Some( 27.50 ), 1 => Some( 55.00 ), 2 => Some( 110.00 ), 3 => Some( 220.00 ),
|
|
||||||
4 => Some( 440.00 ), 5 => Some( 880.00 ), 6 => Some( 1760.00 ), 7 => Some( 3520.00 ),
|
|
||||||
_ => None
|
|
||||||
},
|
|
||||||
Note::ASharp( octave ) => match octave {
|
|
||||||
0 => Some( 29.14 ), 1 => Some( 58.27 ), 2 => Some( 116.54 ), 3 => Some( 233.08 ),
|
|
||||||
4 => Some( 466.16 ), 5 => Some( 932.33 ), 6 => Some( 1864.66 ), 7 => Some( 3729.31 ),
|
|
||||||
_ => None
|
|
||||||
},
|
|
||||||
Note::B( octave ) => match octave {
|
|
||||||
0 => Some( 30.87 ), 1 => Some( 61.74 ), 2 => Some( 123.47 ), 3 => Some( 246.94 ),
|
|
||||||
4 => Some( 493.88 ), 5 => Some( 987.77 ), 6 => Some( 1975.53 ), 7 => Some( 3951.07 ),
|
|
||||||
_ => None
|
|
||||||
},
|
|
||||||
Note::C( octave ) => match octave {
|
|
||||||
0 => Some( 16.35 ), 1 => Some( 32.70 ), 2 => Some( 65.41 ), 3 => Some( 130.81 ),
|
|
||||||
4 => Some( 261.63 ), 5 => Some( 523.25 ), 6 => Some( 1046.50 ), 7 => Some( 2093.00 ),
|
|
||||||
_ => None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
pub mod dmf;
|
||||||
|
pub mod types;
|
|
@ -0,0 +1,131 @@
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use crate::reskit::utility::Either;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct PsgEnvelope {
|
||||||
|
pub envelope: Either<Vec<u32>, Vec<i32>>,
|
||||||
|
pub loop_at: Option<usize>,
|
||||||
|
pub settings: HashMap<&'static str, bool>
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct PsgSettings {
|
||||||
|
pub volume: PsgEnvelope,
|
||||||
|
pub arpeggio: PsgEnvelope,
|
||||||
|
pub noise: PsgEnvelope,
|
||||||
|
pub wavetable: PsgEnvelope
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum SampleRate {
|
||||||
|
Hz8000,
|
||||||
|
Hz11025,
|
||||||
|
Hz16000,
|
||||||
|
Hz22050,
|
||||||
|
Hz32000
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum SampleFormat {
|
||||||
|
Bits8,
|
||||||
|
Bits16
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Sample {
|
||||||
|
pub name: String,
|
||||||
|
pub rate: SampleRate,
|
||||||
|
pub pitch: i8,
|
||||||
|
pub amp: u8,
|
||||||
|
pub bitrate: SampleFormat,
|
||||||
|
pub data: Vec<u16>
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum Note {
|
||||||
|
NoteOff,
|
||||||
|
CSharp( u16 ),
|
||||||
|
D( u16 ),
|
||||||
|
DSharp( u16 ),
|
||||||
|
E( u16 ),
|
||||||
|
F( u16 ),
|
||||||
|
FSharp( u16 ),
|
||||||
|
G( u16 ),
|
||||||
|
GSharp( u16 ),
|
||||||
|
A( u16 ),
|
||||||
|
ASharp( u16 ),
|
||||||
|
B( u16 ),
|
||||||
|
C( u16 )
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl Note {
|
||||||
|
|
||||||
|
pub fn get_freq( &self ) -> Option<f32> {
|
||||||
|
match self {
|
||||||
|
Note::NoteOff => None,
|
||||||
|
Note::CSharp( octave ) => match octave {
|
||||||
|
0 => Some( 17.32 ), 1 => Some( 34.65 ), 2 => Some( 69.30 ), 3 => Some( 138.59 ),
|
||||||
|
4 => Some( 277.18 ), 5 => Some( 554.37 ), 6 => Some( 1108.73 ), 7 => Some( 2217.46 ),
|
||||||
|
_ => None
|
||||||
|
},
|
||||||
|
Note::D( octave ) => match octave {
|
||||||
|
0 => Some( 18.35 ), 1 => Some( 36.71 ), 2 => Some( 73.42 ), 3 => Some( 146.83 ),
|
||||||
|
4 => Some( 293.66 ), 5 => Some( 587.33 ), 6 => Some( 1174.66 ), 7 => Some( 2349.32 ),
|
||||||
|
_ => None
|
||||||
|
},
|
||||||
|
Note::DSharp( octave ) => match octave {
|
||||||
|
0 => Some( 19.45 ), 1 => Some( 38.89 ), 2 => Some( 77.78 ), 3 => Some( 155.56 ),
|
||||||
|
4 => Some( 311.13 ), 5 => Some( 622.25 ), 6 => Some( 1244.51 ), 7 => Some( 2489.02 ),
|
||||||
|
_ => None
|
||||||
|
},
|
||||||
|
Note::E( octave ) => match octave {
|
||||||
|
0 => Some( 20.60 ), 1 => Some( 41.20 ), 2 => Some( 82.41 ), 3 => Some( 164.81 ),
|
||||||
|
4 => Some( 329.63 ), 5 => Some( 659.25 ), 6 => Some( 1318.51 ), 7 => Some( 2637.02 ),
|
||||||
|
_ => None
|
||||||
|
},
|
||||||
|
Note::F( octave ) => match octave {
|
||||||
|
0 => Some( 21.83 ), 1 => Some( 43.65 ), 2 => Some( 87.31 ), 3 => Some( 174.61 ),
|
||||||
|
4 => Some( 349.23 ), 5 => Some( 698.46 ), 6 => Some( 1396.91 ), 7 => Some( 2793.83 ),
|
||||||
|
_ => None
|
||||||
|
},
|
||||||
|
Note::FSharp( octave ) => match octave {
|
||||||
|
0 => Some( 23.12 ), 1 => Some( 46.25 ), 2 => Some( 92.50 ), 3 => Some( 185.00 ),
|
||||||
|
4 => Some( 369.99 ), 5 => Some( 739.99 ), 6 => Some( 1479.98 ), 7 => Some( 2959.96 ),
|
||||||
|
_ => None
|
||||||
|
},
|
||||||
|
Note::G( octave ) => match octave {
|
||||||
|
0 => Some( 24.50 ), 1 => Some( 49.00 ), 2 => Some( 98.00 ), 3 => Some( 196.00 ),
|
||||||
|
4 => Some( 392.00 ), 5 => Some( 783.99 ), 6 => Some( 1567.98 ), 7 => Some( 3135.96 ),
|
||||||
|
_ => None
|
||||||
|
},
|
||||||
|
Note::GSharp( octave ) => match octave {
|
||||||
|
0 => Some( 25.96 ), 1 => Some( 51.91 ), 2 => Some( 103.83 ), 3 => Some( 207.65 ),
|
||||||
|
4 => Some( 415.30 ), 5 => Some( 830.61 ), 6 => Some( 1661.22 ), 7 => Some( 3322.44 ),
|
||||||
|
_ => None
|
||||||
|
},
|
||||||
|
Note::A( octave ) => match octave {
|
||||||
|
0 => Some( 27.50 ), 1 => Some( 55.00 ), 2 => Some( 110.00 ), 3 => Some( 220.00 ),
|
||||||
|
4 => Some( 440.00 ), 5 => Some( 880.00 ), 6 => Some( 1760.00 ), 7 => Some( 3520.00 ),
|
||||||
|
_ => None
|
||||||
|
},
|
||||||
|
Note::ASharp( octave ) => match octave {
|
||||||
|
0 => Some( 29.14 ), 1 => Some( 58.27 ), 2 => Some( 116.54 ), 3 => Some( 233.08 ),
|
||||||
|
4 => Some( 466.16 ), 5 => Some( 932.33 ), 6 => Some( 1864.66 ), 7 => Some( 3729.31 ),
|
||||||
|
_ => None
|
||||||
|
},
|
||||||
|
Note::B( octave ) => match octave {
|
||||||
|
0 => Some( 30.87 ), 1 => Some( 61.74 ), 2 => Some( 123.47 ), 3 => Some( 246.94 ),
|
||||||
|
4 => Some( 493.88 ), 5 => Some( 987.77 ), 6 => Some( 1975.53 ), 7 => Some( 3951.07 ),
|
||||||
|
_ => None
|
||||||
|
},
|
||||||
|
Note::C( octave ) => match octave {
|
||||||
|
0 => Some( 16.35 ), 1 => Some( 32.70 ), 2 => Some( 65.41 ), 3 => Some( 130.81 ),
|
||||||
|
4 => Some( 261.63 ), 5 => Some( 523.25 ), 6 => Some( 1046.50 ), 7 => Some( 2093.00 ),
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue