Added support for the finetune part of the .MOD file format.
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user