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