Мир Автоматов (The World of Automatons)
Rill Patchbay — это не просто система управления. Это мир, в котором живут автоматы — загадочные существа, которые чувствуют окружающую среду и влияют на неё. Они общаются на языке сигналов, через сенсоры и серво воздействуют на Graph, который управляет звуком.
Примеры ниже используют аудио-сенсоры, но паттерн «автомат → сенсор → серво» применим к любой области: IoT-телеметрия, управление роботами, SCADA, визуализация CAN-шины. Единственное, что меняется — тип сенсора на входе.
Архитектура мира
┌─────────────────────────────────────────────────────┐
│ МИР АВТОМАТОВ │
│ (ваше приложение на Rill) │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ PATCHBAY │ │
│ │ ┌─────────────────────────────────────────┐ │ │
│ │ │ АВТОМАТЫ (разум) │ │ │
│ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ │ LFO │ │ ENV │ │ RANDOM │ │ │
│ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │
│ │ │ │ │ │ │ │
│ │ └───────┼─────────────┼─────────────┼───────┘ │ │
│ │ │ │ │ │ │
│ │ ▼ ▼ ▼ │ │
│ │ ┌─────────────────────────────────────────┐ │ │
│ │ │ СЕНСОРЫ (чувства) │ │ │
│ │ │ • Слышат звук (акустические) │ │ │
│ │ │ • Чувствуют прикосновения (физические) │ │ │
│ │ │ • Видят MIDI/CV │ │ │
│ │ └─────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ │ Сигналы │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────┐ │ │
│ │ │ СЕРВО (руки) │ │ │
│ │ │ Применяют сигналы к Graph │ │ │
│ │ └─────────────────────────────────────────┘ │ │
│ └──────────────────────┬──────────────────────────┘ │
│ │ Неблокирующие очереди │
│ ▼ (Command/Telemetry) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ AUDIOGRAPH │ │
│ │ (внутренняя схема устройства) │ │
│ │ │ │
│ │ Осцилляторы → Фильтры → Эффекты → Микшер │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
Автоматы — разум (Automaton)
Автоматы — это разумные существа, которые принимают решения и генерируют сигналы. Они могут быть простыми (LFO, огибающая) или сложными (логические схемы, математические преобразователи).
| Автомат | Описание | Как выглядит в коде |
|---|---|---|
| LFO | Пульсирует с заданной частотой | LfoAutomaton::new("vibrato", 5.0, 0.5, 0.0, LfoWaveform::Sine) |
| Envelope | Реагирует на события (нажатия) | EnvelopeAutomaton::adsr("amp", 0.01, 0.1, 0.7, 0.2) |
| Random Walk | Блуждает случайным образом | RandomAutomaton::walk("chaos", 10.0) |
| Sequencer | Проигрывает последовательность шагов | SequencerAutomaton::new("seq", steps) |
| Function | Произвольная функция времени | FunctionAutomaton::new("math", \|t\| (t * 0.5).sin()) |
| Cellular | Клеточный автомат (Game of Life, Rule 30) | CellularAutomaton::game_of_life("life", 16, 16) |
Сенсоры — чувства (Sensors)
Чтобы автоматы могли воспринимать мир, им нужны органы чувств. Сенсоры преобразуют внешние воздействия в сигналы, понятные автоматам.
Акустические сенсоры (слышат звук)
#![allow(unused)] fn main() { // Слышит высоту тона let pitch = AcousticSensor::new("pitch", Box::new(PitchDetector::new(44100.0))) .listening_to("osc1_out"); // Слышит громкость let envelope = AcousticSensor::new("envelope", Box::new(EnvelopeFollower::new(44100.0) .with_attack(0.01) .with_release(0.1))) .listening_to("vca_out"); }
Физические сенсоры (чувствуют прикосновения)
#![allow(unused)] fn main() { // Ручка на передней панели let cutoff = PhysicalSensor::knob("filter_cutoff") .with_range(20.0, 20000.0) .with_curve(KnobCurve::Logarithmic); // Кнопка let button = PhysicalSensor::button("arpeggio_on"); }
MIDI/CV/OSC сенсоры (видят внешний мир)
MIDI сенсоры (фича midi):
#![allow(unused)] fn main() { use rill_patchbay::{spawn_midi_sensor, MidiHub}; // Actor-model: поток опроса в отдельном OS-потоке, события → servo let sensor_ref = spawn_midi_sensor( "keyboard", Box::new(MidirBackend::new("rill-midi")?), &system, servo_ref, ); }
OSC сенсоры (фича osc):
#![allow(unused)] fn main() { use rill_patchbay::{spawn_osc_sensor, OscSensor}; use std::net::SocketAddr; // Actor-model: UDP-сокет, декодирование OSC → ControlEvent::Osc let sensor_ref = spawn_osc_sensor( "touchosc", SocketAddr::from(([0, 0, 0, 0], 9000)), &system, servo_ref, ); }
Серво — руки (Servo)
Серво — это исполнительные механизмы автоматов. Подчиняясь законам природы (неблокирующим очередям), они передают сигналы из мира автоматов в Graph, изменяя параметры звука.
#![allow(unused)] fn main() { let filter_servo = Servo::new( "filter_servo", lfo_automaton, filter_node_id, "cutoff", ParameterMapping::Linear, 20.0, 20000.0, ); }
Пространство автоматов (Patchbay)
Patchbay — это место, где живут все ваши автоматы, где расположены их чувства и руки.
#![allow(unused)] fn main() { use rill_patchbay::prelude::*; use rill_core::queues::MpscQueue; use std::sync::Arc; let cmd_queue = Arc::new(MpscQueue::with_capacity(1024)); let mut control = Engine::new(cmd_queue); control.add_lfo( "vibrato", 5.0, 0.5, 0.0, LfoWaveform::Sine, osc_node_id, "frequency", 400.0, 480.0, ); control.update(1.0 / 60.0); }
Либо через Manager с отдельным потоком обновления:
#![allow(unused)] fn main() { let mut manager = Manager::new( Config::default(), Arc::new(MpscQueue::with_capacity(1024)), ); manager.add_lfo_servo( "vibrato", 5.0, 0.5, 0.0, LfoWaveform::Sine, osc_node_id, "frequency", ParameterMapping::Linear, 400.0, 480.0, )?; manager.start()?; // Автоматы начинают жить своей жизнью }
Философия
Наши создания:
- Обладают разумом — автоматы принимают решения
- Имеют чувства — сенсоры воспринимают мир
- Могут действовать — серво изменяют звук
- Подчиняются законам природы — неблокирующие очереди связывают миры
- Живут в своем пространстве — Patchbay объединяет всё
Создавайте своих автоматов, наделяйте их чувствами, давайте им руки и стройте удивительные миры звука.
«В каждом автомате живёт частичка души своего создателя»