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() {
|
fn main() {
|
||||||
let mut tracker = Tracker::new(4, 64);
|
let mut tracker = Tracker::new(4, 64);
|
||||||
tracker.load_file("./3266CHIP.MOD");
|
tracker.load_file("./3266CHIP.MOD");
|
||||||
tracker.play();
|
tracker.play_sample(2, 8287.0);
|
||||||
|
//tracker.play();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ pub struct Sample {
|
|||||||
|
|
||||||
impl Sample {
|
impl Sample {
|
||||||
pub fn new(sample_rate: u32, sample: SampleInfo) -> Self {
|
pub fn new(sample_rate: u32, sample: SampleInfo) -> Self {
|
||||||
|
println!("Sample data len: {}", sample.data.len());
|
||||||
|
println!("Sample reported len: {}", sample.length);
|
||||||
Self {
|
Self {
|
||||||
num_sample: 0,
|
num_sample: 0,
|
||||||
_sample_rate: sample_rate,
|
_sample_rate: sample_rate,
|
||||||
@@ -18,8 +20,17 @@ impl Sample {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_sample_rate(&mut self, sample_rate: u32) {
|
fn get_finetune(&self) -> u8 {
|
||||||
self._sample_rate = sample_rate;
|
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;
|
self.num_sample = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ impl Tracker {
|
|||||||
let note = note.unwrap();
|
let note = note.unwrap();
|
||||||
let frequency = note.frequency;
|
let frequency = note.frequency;
|
||||||
let sample = note.sample;
|
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.sinks[track].append(
|
||||||
self.samples[sample as usize].clone()
|
self.samples[sample as usize].clone()
|
||||||
.take_duration(Duration::from_secs_f64(60.0/375.0))
|
.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) {
|
pub fn load_file(&mut self, file: &str) {
|
||||||
let mut reader = BufReader::new(File::open(file).unwrap());
|
let mut reader = BufReader::new(File::open(file).unwrap());
|
||||||
let mut module = ptmf::read_mod(&mut reader, false).unwrap();
|
let mut module = ptmf::read_mod(&mut reader, false).unwrap();
|
||||||
|
|||||||
Reference in New Issue
Block a user