rill-core-dsp 0.3.0

Core DSP abstractions and algorithms for Rill
Documentation
//! Трейты для генераторов (источников сигнала)

use crate::algorithm::Algorithm;
use rill_core::time::ClockTick;
use rill_core::traits::ActionContext;
use rill_core::Transcendental;

/// Базовый трейт для генераторов
pub trait Generator<T: Transcendental>: Algorithm<T> {
    /// Генерировать следующий семпл
    fn generate(&mut self) -> T {
        let mut output = [T::ZERO];
        let tick = ClockTick::default();
        let ctx = ActionContext::new(&tick);
        let _ = self.process(None, &mut output, &ctx);
        output[0]
    }

    /// Генерировать блок семплов (по умолчанию использует process)
    fn generate_block(&mut self, output: &mut [T]) {
        let tick = ClockTick::default();
        let ctx = ActionContext::new(&tick);
        let _ = self.process(None, output, &ctx);
    }

    /// Генерировать блок с использованием векторного eDSL (опционально)
    fn generate_block_vector(&mut self, output: &mut [T]) {
        self.generate_block(output);
    }

    /// Сбросить фазу
    fn reset_phase(&mut self);

    /// Текущая фаза (0.0 - 1.0)
    fn phase(&self) -> f32;
}

/// Генератор с изменяемой частотой
pub trait FrequencySource<T: Transcendental>: Generator<T> {
    /// Установить частоту в Hz
    fn set_frequency(&mut self, freq: f32);

    /// Получить текущую частоту
    fn frequency(&self) -> f32;

    /// Установить частоту в MIDI нотах
    fn set_midi_note(&mut self, note: u8) {
        let freq = 440.0 * 2.0_f32.powf((note as f32 - 69.0) / 12.0);
        self.set_frequency(freq);
    }
}

/// Генератор с изменяемой амплитудой
pub trait AmplitudeSource<T: Transcendental>: Generator<T> {
    /// Установить амплитуду (0.0-1.0)
    fn set_amplitude(&mut self, amp: T);

    /// Получить текущую амплитуду
    fn amplitude(&self) -> T;

    /// Установить амплитуду в dB
    fn set_amplitude_db(&mut self, db: f32) {
        self.set_amplitude(T::from_f32(10.0_f32.powf(db / 20.0)));
    }
}

/// Генератор с изменяемой формой волны
pub trait WaveformSource<T: Transcendental>: Generator<T> {
    /// Тип波形
    type Waveform;

    /// Установить форму волны
    fn set_waveform(&mut self, wf: Self::Waveform);

    /// Получить текущую форму волны
    fn waveform(&self) -> Self::Waveform;
}

/// Шумовой генератор
pub trait NoiseSource<T: Transcendental>: Generator<T> {
    /// Тип шума
    type NoiseType;

    /// Установить тип шума
    fn set_noise_type(&mut self, nt: Self::NoiseType);

    /// Получить тип шума
    fn noise_type(&self) -> Self::NoiseType;
}