diff --git a/src/main.rs b/src/main.rs index 8eb5b56..c8c61c0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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(); } diff --git a/src/sampler.rs b/src/sampler.rs index 646d7ec..5c0daf1 100644 --- a/src/sampler.rs +++ b/src/sampler.rs @@ -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; } } diff --git a/src/tracker.rs b/src/tracker.rs index 95ecc41..a461b93 100644 --- a/src/tracker.rs +++ b/src/tracker.rs @@ -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();