Added support for the finetune part of the .MOD file format.

This commit is contained in:
2023-01-10 19:54:10 +01:00
parent 5f82b549dc
commit fdf416e3e8
3 changed files with 30 additions and 4 deletions

View File

@@ -12,5 +12,6 @@ use crate::tracker::Tracker;
fn main() {
let mut tracker = Tracker::new(4, 64);
tracker.load_file("./3266CHIP.MOD");
tracker.play();
tracker.play_sample(2, 8287.0);
//tracker.play();
}

View File

@@ -11,6 +11,8 @@ pub struct Sample {
impl Sample {
pub fn new(sample_rate: u32, sample: SampleInfo) -> Self {
println!("Sample data len: {}", sample.data.len());
println!("Sample reported len: {}", sample.length);
Self {
num_sample: 0,
_sample_rate: sample_rate,
@@ -18,8 +20,17 @@ impl Sample {
}
}
pub fn set_sample_rate(&mut self, sample_rate: u32) {
self._sample_rate = sample_rate;
fn get_finetune(&self) -> u8 {
if (self.sample.finetune&0b1000) != 0 {
self.sample.finetune|0b11110000
} else {
self.sample.finetune
}
}
/// Sets the sample rate while accounting for finetuning.
pub fn set_sample_rate(&mut self, sample_rate: f32) {
self._sample_rate = (sample_rate*(1.06_f32.powf((self.get_finetune() as i8 as f32)/8.0))) as u32;
self.num_sample = 0;
}
}

View File

@@ -53,7 +53,7 @@ impl Tracker {
let note = note.unwrap();
let frequency = note.frequency;
let sample = note.sample;
self.samples[sample as usize].set_sample_rate(frequency as u32);
self.samples[sample as usize].set_sample_rate(frequency);
self.sinks[track].append(
self.samples[sample as usize].clone()
.take_duration(Duration::from_secs_f64(60.0/375.0))
@@ -80,6 +80,20 @@ impl Tracker {
}
}
pub fn play_sample(&mut self, sample: u8, frequency: f32) {
self.sinks[0].pause();
self.samples[sample as usize].set_sample_rate(frequency);
self.sinks[0].append(
self.samples[sample as usize].clone()
//.take_duration(Duration::from_secs_f64(60.0/375.0))
.amplify(0.20)
);
self.sinks[0].play();
self.sinks[0].sleep_until_end();
}
pub fn load_file(&mut self, file: &str) {
let mut reader = BufReader::new(File::open(file).unwrap());
let mut module = ptmf::read_mod(&mut reader, false).unwrap();