rill_core_dsp/generators/
mod.rs1use crate::algorithm::{Algorithm, AlgorithmCategory, AlgorithmMetadata};
15use rill_core::Transcendental;
16
17mod basic;
19mod envelope;
20mod fm;
21mod lfo;
22mod noise;
23mod reader;
24mod sample_player;
25mod wavetable;
26
27pub use basic::*;
29pub use envelope::*;
30pub use fm::*;
31pub use lfo::*;
32pub use noise::*;
33pub use reader::*;
34pub use sample_player::*;
35pub use wavetable::*;
36
37pub trait Generator<T: Transcendental>: Algorithm<T> {
44 fn phase(&self) -> T;
46
47 fn set_phase(&mut self, phase: T);
49
50 fn reset_phase(&mut self) {
52 self.set_phase(T::ZERO);
53 }
54
55 fn frequency(&self) -> f32;
57
58 fn set_frequency(&mut self, freq: f32);
60
61 fn amplitude(&self) -> T;
63
64 fn set_amplitude(&mut self, amp: T);
66}
67
68pub trait SyncableGenerator<T: Transcendental>: Generator<T> {
73 fn sync(&mut self, reset: bool);
78
79 fn periods(&self) -> u32;
81}
82
83pub trait ModulatableGenerator<T: Transcendental>: Generator<T> {
88 fn modulate_frequency(&mut self, amount: T);
93
94 fn modulation_index(&self) -> T;
96
97 fn set_modulation_index(&mut self, index: T);
99}
100
101#[derive(Debug)]
107pub struct GeneratorComparison;
108
109impl GeneratorComparison {
110 pub fn harmonic_content() -> &'static str {
112 "Гармонический состав:\n\
113 ┌────────────┬─────────────────────────────────┐\n\
114 │ Генератор │ Спектр │\n\
115 ├────────────┼─────────────────────────────────┤\n\
116 │ Sine │ Одна гармоника (чистый тон) │\n\
117 │ Triangle │ Нечётные, быстрое затухание │\n\
118 │ Saw │ Все гармоники (1/n) │\n\
119 │ Square │ Нечётные гармоники (1/n) │\n\
120 │ Pulse │ Зависит от ширины импульса │\n\
121 │ White │ Равномерный по всем частотам │\n\
122 │ Pink │ Спад 3dB/октаву (1/f) │\n\
123 │ Brown │ Спад 6dB/октаву (1/f²) │\n\
124 └────────────┴─────────────────────────────────┘"
125 }
126
127 pub fn usage_guide() -> &'static str {
129 "Как выбрать генератор:\n\n\
130 🎵 **Субтрактивный синтез**:\n\
131 → Saw, Square, Pulse - богатый спектр для фильтрации\n\n\
132 🎵 **FM синтез**:\n\
133 → Sine - чистый тон для модуляции\n\n\
134 🎵 **Аддитивный синтез**:\n\
135 → Sine (множество) - построение сложных тембров\n\n\
136 🎵 **Шумовые эффекты**:\n\
137 → White - ветер, snare drum\n\
138 → Pink - естественные явления\n\
139 → Brown - гром, рокот\n\n\
140 🎵 **Огибающие**:\n\
141 → ADSR - амплитудные огибающие\n\
142 → AR - перкуссия\n\
143 → ASR - орга́нные звуки\n\n\
144 🎵 **Модуляция**:\n\
145 → LFO - вибрато, тремоло, фильтр-свип"
146 }
147
148 pub fn performance_guide() -> &'static str {
150 "Производительность (относительная):\n\
151 ⚡ **Sine** - 1x (самый быстрый)\n\
152 ⚡⚡ **Triangle, Square** - 1.5x\n\
153 ⚡⚡⚡ **Saw** - 2x (с анти-алиасингом)\n\
154 ⚡⚡⚡ **Noise** - 2x\n\
155 ⚡⚡⚡⚡ **Envelope** - 3x\n\
156 ⚡⚡⚡⚡ **FM Synth** - зависит от числа операторов"
157 }
158}
159
160#[cfg(test)]
165mod tests {
166 use super::*;
167
168 #[test]
169 fn test_generator_trait_bounds() {
170 fn assert_generator<T: Transcendental, G: Generator<T>>() {}
172 fn assert_syncable<T: Transcendental, G: SyncableGenerator<T>>() {}
173 fn assert_modulatable<T: Transcendental, G: ModulatableGenerator<T>>() {}
174
175 assert_generator::<f32, BasicOscillator<f32>>();
176 assert_generator::<f32, NoiseGenerator<f32>>();
177 assert_generator::<f32, EnvelopeGenerator<f32>>();
178 assert_generator::<f32, LFO<f32>>();
179 assert_generator::<f32, SimpleFmSynth<f32>>();
180
181 assert_syncable::<f32, BasicOscillator<f32>>();
182 assert_modulatable::<f32, BasicOscillator<f32>>();
183 }
184
185 #[test]
186 fn test_comparison_guides() {
187 assert!(!GeneratorComparison::harmonic_content().is_empty());
188 assert!(!GeneratorComparison::usage_guide().is_empty());
189 assert!(!GeneratorComparison::performance_guide().is_empty());
190 }
191}