amm_sdk 0.4.0

Abstract Music Manipulation (AMM) Rust SDK
Documentation
mod timeslice;

pub use timeslice::{PartTimeslice, Timeslice, TimesliceContent, TimesliceContext, TimeslicePhraseDetails};

pub(crate) fn place_and_merge_part_timeslice(
  part_name: &str,
  timeslices: &mut Vec<(f64, PartTimeslice)>,
  slice: Timeslice,
  mut index: usize,
  curr_time: f64,
) -> (usize, f64) {
  let beat_base_note = crate::note::Duration::new(crate::note::DurationType::TwoThousandFortyEighth, 0);
  let slice_duration = slice.get_beats(&beat_base_note);
  if let Some(slice_details) = timeslices.get_mut(index) {
    let (mut slice_time, mut existing_slice) = (slice_details.0, &mut slice_details.1);
    while curr_time > slice_time && curr_time - slice_time > 0.000_001 {
      index += 1;
      (slice_time, existing_slice) = if let Some((start_time, slice)) = timeslices.get_mut(index) {
        (*start_time, slice)
      } else {
        timeslices.push((curr_time, PartTimeslice::default()));
        let (start_time, slice) = unsafe { timeslices.last_mut().unwrap_unchecked() };
        (*start_time, slice)
      };
    }
    if (slice_time - curr_time).abs() < 0.000_001 {
      existing_slice.add_timeslice(part_name, slice);
    } else {
      timeslices.insert(index, (curr_time, PartTimeslice::from(part_name, slice)));
    }
  } else {
    timeslices.push((curr_time, PartTimeslice::from(part_name, slice)));
  }
  (index + 1, curr_time + slice_duration)
}