18个版本 (9个稳定版)
2.4.0 | 2024年1月24日 |
---|---|
2.2.0 | 2023年5月22日 |
2.0.0 | 2023年3月22日 |
1.3.1 | 2022年10月22日 |
0.2.0 | 2021年10月30日 |
#63 in 音频
在 2 组件 中使用
115KB
2K SLoC
augmented-dsp-filters
机械式移植Vinnie Falco的 https://github.com/vinniefalco/DSPFilters/。
仅移植RBJ滤波器。不支持内省,实现方式也相当不同(因为Rust更倾向于组合而非多重继承)。
测试很少,请小心使用扬声器。
依赖于 audio-processor-traits
。导出 FilterProcessor
,可用于通用滤波需求。
查看此存储库中的 synth
以获取一个不错的示例。
低通滤波器示例
use audio_processor_traits::{
AudioBuffer, AudioProcessor, AudioProcessorSettings
};
use augmented_dsp_filters::rbj::{FilterProcessor, FilterType};
pub struct YourProcessor {
filter: FilterProcessor<f32>, // <- f32 may be f64 if you wish
}
impl YourProcessor {
fn new() -> Self {
Self {
filter: FilterProcessor::new(FilterType::LowPass),
}
}
fn set_cutoff(&mut self, midi_value_between_0_and_127: f32) {
let cutoff_ratio = midi_value_between_0_and_127 / 127.0;
let cutoff_freq_hz = 22000.0 * cutoff_ratio;
self.filter.set_cutoff(cutoff_freq_hz);
}
fn set_q(&mut self, q: f32) {
self.filter.set_q(q);
}
}
impl AudioProcessor for YourProcessor {
type SampleType = f32;
fn prepare(&mut self, settings: AudioProcessorSettings) {
self.filter.prepare(settings);
}
fn process<BufferType: AudioBuffer<SampleType = Self::SampleType>>(
&mut self,
data: &mut BufferType,
) {
self.filter.process(data);
}
}
多线程
滤波器修改函数会重新计算滤波器的系数。这应该在音频线程上运行。
为了与MIDI集成,请参阅 synth
;这不会成为问题,因为 AudioProcessor
(独立)将在音频线程上接收MIDI。
为了与GUI线程集成,最好的做法可能是让音频线程从原子存储中读取参数,并在它们更改时更新滤波器(参见此存储库中的 audio-parameter-store
)。
许可证
与原始内容一样,使用MIT许可证。
依赖关系
~0.9–3MB
~61K SLoC