mod melody;
mod timer;
#[cfg(feature = "midly")]
pub use melody::MidiNoteData;
pub use melody::{MelLoop, MelSeq, Melody, Note, NoteEvent, NoteReader};
pub use timer::{Metronome, Timer};
use crate::prelude::*;
#[derive(Clone, Debug)]
pub struct Seq<S: SignalMut, F: map::Mut<S>> {
pub times: Vec<unt::Time>,
since: unt::Time,
index: usize,
sgn: S,
func: F,
}
impl<S: SignalMut, F: map::Mut<S>> Seq<S, F> {
pub const fn new(times: Vec<unt::Time>, sgn: S, func: F) -> Self {
Self {
times,
since: unt::Time::ZERO,
index: 0,
sgn,
func,
}
}
pub const fn since(&self) -> unt::Time {
self.since
}
pub const fn index(&self) -> usize {
self.index
}
pub fn len(&self) -> usize {
self.times.len()
}
pub fn is_empty(&self) -> bool {
self.times.is_empty()
}
pub fn current_time(&self) -> Option<unt::Time> {
self.times.get(self.index()).copied()
}
pub const fn sgn(&self) -> &S {
&self.sgn
}
pub fn sgn_mut(&mut self) -> &mut S {
&mut self.sgn
}
pub const fn func(&self) -> &F {
&self.func
}
pub fn func_mut(&mut self) -> &mut F {
&mut self.func
}
fn modify(&mut self) {
self.func.modify(&mut self.sgn);
}
pub fn skip(&mut self) -> bool {
let res = self.index < self.len();
if res {
self.since = unt::Time::ZERO;
self.modify();
self.index += 1;
}
res
}
fn read_event(&mut self) -> bool {
match self.current_time() {
Some(event_time) => {
let read = self.since() >= event_time;
if read {
self.since -= event_time;
self.modify();
self.index += 1;
}
read
}
None => false,
}
}
fn read_events(&mut self) {
while self.read_event() {}
}
pub fn total_time(&self) -> unt::Time {
self.times.iter().copied().sum()
}
}
impl<S: SignalMut, F: map::Mut<S>> Signal for Seq<S, F> {
type Sample = S::Sample;
fn get(&self) -> S::Sample {
self.sgn.get()
}
}
impl<S: SignalMut, F: map::Mut<S>> SignalMut for Seq<S, F> {
fn advance(&mut self) {
self.sgn.advance();
self.since.advance();
self.read_events();
}
fn retrigger(&mut self) {
self.sgn.retrigger();
self.index = 0;
self.since = unt::Time::ZERO;
}
}
#[derive(Clone, Debug)]
pub struct Loop<S: SignalMut, F: map::Mut<S>> {
seq: Seq<S, F>,
}
impl<S: SignalMut, F: map::Mut<S>> Loop<S, F> {
pub fn new_seq(seq: Seq<S, F>) -> Self {
assert!(!seq.is_empty());
Self { seq }
}
pub fn new(times: Vec<unt::Time>, sgn: S, func: F) -> Self {
Self::new_seq(Seq::new(times, sgn, func))
}
pub const fn since(&self) -> unt::Time {
self.seq.since
}
pub const fn index(&self) -> usize {
self.seq.index
}
pub fn len(&self) -> usize {
self.seq.times.len()
}
pub fn is_empty(&self) -> bool {
self.seq.times.is_empty()
}
pub fn current_time(&self) -> unt::Time {
self.seq.current_time().expect("loop can't be empty")
}
pub const fn sgn(&self) -> &S {
&self.seq.sgn
}
pub fn sgn_mut(&mut self) -> &mut S {
&mut self.seq.sgn
}
pub const fn func(&self) -> &F {
&self.seq.func
}
pub fn func_mut(&mut self) -> &mut F {
&mut self.seq.func
}
fn modify(&mut self) {
self.seq.modify();
}
pub fn skip(&mut self) {
self.seq.since = unt::Time::ZERO;
self.modify();
crate::mod_inc(self.len(), &mut self.seq.index);
}
pub fn total_time(&self) -> unt::Time {
self.seq.total_time()
}
}
impl<S: SignalMut, F: map::Mut<S>> Signal for Loop<S, F> {
type Sample = S::Sample;
fn get(&self) -> Self::Sample {
self.seq.sgn.get()
}
}
impl<S: SignalMut, F: map::Mut<S>> SignalMut for Loop<S, F> {
fn advance(&mut self) {
self.seq.advance();
if self.seq.index == self.len() {
self.seq.index = 0;
}
}
fn retrigger(&mut self) {
self.seq.retrigger();
}
}
#[derive(Clone, Debug)]
pub struct Arp {
pub notes: Vec<unt::Freq>,
pub index: usize,
}
impl Arp {
#[must_use]
pub const fn new(notes: Vec<unt::Freq>) -> Self {
Self { notes, index: 0 }
}
#[must_use]
pub fn current(&self) -> unt::Freq {
self.notes[self.index]
}
#[must_use]
pub fn len(&self) -> usize {
self.notes.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.notes.is_empty()
}
}
impl<S: Frequency> map::Mut<S> for Arp {
fn modify(&mut self, sgn: &mut S) {
*sgn.freq_mut() = self.current();
crate::mod_inc(self.len(), &mut self.index);
}
}
pub type Arpeggio<S> = Loop<S, Arp>;
impl<S: Frequency> Arpeggio<S> {
pub fn new_arp(times: Vec<unt::Time>, sgn: S, notes: Vec<unt::Freq>) -> Self {
Self::new(times, sgn, Arp::new(notes))
}
pub const fn arp(&self) -> &Arp {
self.func()
}
pub fn arp_mut(&mut self) -> &mut Arp {
self.func_mut()
}
pub fn notes(&self) -> &[unt::Freq] {
&self.arp().notes
}
pub fn notes_mut(&mut self) -> &mut [unt::Freq] {
&mut self.arp_mut().notes
}
}