wip: f64 timebase (sloooo)

This commit is contained in:
🪞👃🪞 2024-07-01 17:48:16 +03:00
parent c4d8692b71
commit 4055662bbd
12 changed files with 206 additions and 142 deletions

View file

@ -1,25 +1,21 @@
use crate::core::*;
pub type PhraseData = BTreeMap<u32, Vec<MidiMessage>>;
pub type PhraseData = BTreeMap<usize, Vec<MidiMessage>>;
pub type MIDIChunk = [Option<Vec<Vec<u8>>>];
pub type MIDIMessage = Vec<u8>;
pub type MIDIChunk = [Option<Vec<MIDIMessage>>];
pub struct Phrase {
pub name: String,
pub length: u32,
pub length: usize,
pub notes: PhraseData,
}
impl Phrase {
pub fn new (name: &str, length: u32, notes: Option<PhraseData>) -> Self {
pub fn new (name: &str, length: usize, notes: Option<PhraseData>) -> Self {
Self { name: name.to_string(), length, notes: notes.unwrap_or(BTreeMap::new()) }
}
pub fn frames (&self, timebase: &Arc<Timebase>) -> usize {
timebase.pulses_frames(self.length as usize)
}
pub fn frame_to_pulse (&self, timebase: &Arc<Timebase>, frame: usize) -> usize {
timebase.frames_pulses(frame) % self.length as usize
}
/** Write a chunk of MIDI events to an output port. */
pub fn chunk_out (
&self,
@ -29,9 +25,13 @@ impl Phrase {
frame0: usize,
frames: usize,
) {
let ticks = timebase.frames_to_ticks(frame0, frame0 + frames, self.frames(timebase));
let ticks = timebase.frames_to_ticks(
frame0 as f64,
(frame0 + frames) as f64,
timebase.pulses_frames(self.length as f64)
);
for (time, tick) in ticks.iter() {
let events = self.notes.get(&(*tick as u32));
let events = self.notes.get(&(*tick as usize));
if events.is_none() {
continue
}
@ -67,7 +67,7 @@ impl Phrase {
) {
for RawMidi { time, bytes } in input {
let time = time as usize;
let pulse = timebase.frames_pulses(frame0 + time) as u32;
let pulse = timebase.frames_pulses((frame0 + time) as f64) as usize;
if let LiveEvent::Midi { message, .. } = LiveEvent::parse(bytes).unwrap() {
if let MidiMessage::NoteOn { key, vel: _ } = message {
notes_on[key.as_int() as usize] = true;