master
Ashley N. 2023-08-14 20:46:03 -04:00
parent d21d16605c
commit 3601a6763e
4 changed files with 138 additions and 130 deletions

View File

@ -6,7 +6,7 @@ extern crate colour;
mod reskit;
use std::error::Error;
use clap::{App, Arg, SubCommand};
use reskit::soundtrack::DmfModule;
use reskit::soundtrack::dmf::DmfModule;
use reskit::utility;
use reskit::tileset;

View File

@ -1,6 +1,8 @@
use std::{error::Error, fs::File, io::Read, convert::TryInto, collections::HashMap};
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_SUPPORTED_VERSION: u8 = 0x18;
@ -39,21 +41,6 @@ pub struct FmSettings {
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)]
pub enum InstrumentType {
Fm( FmSettings ),
@ -66,22 +53,6 @@ pub struct Instrument {
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)]
pub struct Effect {
@ -97,31 +68,6 @@ pub struct PatternRow {
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 {
platform: 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
}
}
}
}

View File

@ -0,0 +1,2 @@
pub mod dmf;
pub mod types;

View File

@ -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
}
}
}
}