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;
23
24pub use basic::*;
26pub use envelope::*;
27pub use fm::*;
28pub use lfo::*;
29pub use noise::*;
30
31pub trait Generator<T: Transcendental>: Algorithm<T> {
38 fn phase(&self) -> T;
40
41 fn set_phase(&mut self, phase: T);
43
44 fn reset_phase(&mut self) {
46 self.set_phase(T::ZERO);
47 }
48
49 fn frequency(&self) -> f32;
51
52 fn set_frequency(&mut self, freq: f32);
54
55 fn amplitude(&self) -> T;
57
58 fn set_amplitude(&mut self, amp: T);
60}
61
62pub trait SyncableGenerator<T: Transcendental>: Generator<T> {
67 fn sync(&mut self, reset: bool);
72
73 fn periods(&self) -> u32;
75}
76
77pub trait ModulatableGenerator<T: Transcendental>: Generator<T> {
82 fn modulate_frequency(&mut self, amount: T);
87
88 fn modulation_index(&self) -> T;
90
91 fn set_modulation_index(&mut self, index: T);
93}
94
95#[derive(Debug)]
101pub struct GeneratorComparison;
102
103impl GeneratorComparison {
104 pub fn harmonic_content() -> &'static str {
106 "Гармонический состав:\n\
107 ┌────────────┬─────────────────────────────────┐\n\
108 │ Генератор │ Спектр │\n\
109 ├────────────┼─────────────────────────────────┤\n\
110 │ Sine │ Одна гармоника (чистый тон) │\n\
111 │ Triangle │ Нечётные, быстрое затухание │\n\
112 │ Saw │ Все гармоники (1/n) │\n\
113 │ Square │ Нечётные гармоники (1/n) │\n\
114 │ Pulse │ Зависит от ширины импульса │\n\
115 │ White │ Равномерный по всем частотам │\n\
116 │ Pink │ Спад 3dB/октаву (1/f) │\n\
117 │ Brown │ Спад 6dB/октаву (1/f²) │\n\
118 └────────────┴─────────────────────────────────┘"
119 }
120
121 pub fn usage_guide() -> &'static str {
123 "Как выбрать генератор:\n\n\
124 🎵 **Субтрактивный синтез**:\n\
125 → Saw, Square, Pulse - богатый спектр для фильтрации\n\n\
126 🎵 **FM синтез**:\n\
127 → Sine - чистый тон для модуляции\n\n\
128 🎵 **Аддитивный синтез**:\n\
129 → Sine (множество) - построение сложных тембров\n\n\
130 🎵 **Шумовые эффекты**:\n\
131 → White - ветер, snare drum\n\
132 → Pink - естественные явления\n\
133 → Brown - гром, рокот\n\n\
134 🎵 **Огибающие**:\n\
135 → ADSR - амплитудные огибающие\n\
136 → AR - перкуссия\n\
137 → ASR - орга́нные звуки\n\n\
138 🎵 **Модуляция**:\n\
139 → LFO - вибрато, тремоло, фильтр-свип"
140 }
141
142 pub fn performance_guide() -> &'static str {
144 "Производительность (относительная):\n\
145 ⚡ **Sine** - 1x (самый быстрый)\n\
146 ⚡⚡ **Triangle, Square** - 1.5x\n\
147 ⚡⚡⚡ **Saw** - 2x (с анти-алиасингом)\n\
148 ⚡⚡⚡ **Noise** - 2x\n\
149 ⚡⚡⚡⚡ **Envelope** - 3x\n\
150 ⚡⚡⚡⚡ **FM Synth** - зависит от числа операторов"
151 }
152}
153
154#[cfg(test)]
159mod tests {
160 use super::*;
161
162 #[test]
163 fn test_generator_trait_bounds() {
164 fn assert_generator<T: Transcendental, G: Generator<T>>() {}
166 fn assert_syncable<T: Transcendental, G: SyncableGenerator<T>>() {}
167 fn assert_modulatable<T: Transcendental, G: ModulatableGenerator<T>>() {}
168
169 assert_generator::<f32, BasicOscillator<f32>>();
170 assert_generator::<f32, NoiseGenerator<f32>>();
171 assert_generator::<f32, EnvelopeGenerator<f32>>();
172 assert_generator::<f32, LFO<f32>>();
173 assert_generator::<f32, SimpleFmSynth<f32>>();
174
175 assert_syncable::<f32, BasicOscillator<f32>>();
176 assert_modulatable::<f32, BasicOscillator<f32>>();
177 }
178
179 #[test]
180 fn test_comparison_guides() {
181 assert!(!GeneratorComparison::harmonic_content().is_empty());
182 assert!(!GeneratorComparison::usage_guide().is_empty());
183 assert!(!GeneratorComparison::performance_guide().is_empty());
184 }
185}