rill_patchbay/lib.rs
1//! # Rill Patchbay — Маршрутизация событий и автоматизация
2//!
3//! `rill-patchbay` является эволюцией `rill-automation` из версии 0.2.0,
4//! объединённой с функциональностью маппинга из `rill-control`.
5//!
6//! ## Основные компоненты
7//!
8//! - **Автоматы** — генеративные источники сигналов (LFO, огибающие, секвенсоры)
9//! - **Сервоприводы** (в модуле `control`) — связь автоматов с параметрами узлов
10//! - **Маппинги** — связь внешних событий (MIDI/OSC) с параметрами
11//! - **Сенсоры** — источники событий из внешнего мира
12//! - **Менеджер** — центральный координатор для двухпоточной архитектуры
13//!
14//! ## Архитектура
15//!
16//! ```text
17//! ┌─────────────────────────────────────────────────────────────┐
18//! │ ПОТОК УПРАВЛЕНИЯ │
19//! │ │
20//! │ ┌─────────────────────────────────────────────────────┐ │
21//! │ │ PatchbayManager │ │
22//! │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
23//! │ │ │ Automata │ │ Servos │ │ Mappings │ │ │
24//! │ │ └────────────┘ └────────────┘ └────────────┘ │ │
25//! │ │ │ │ │ │
26//! │ │ ▼ ▼ │ │
27//! │ │ ┌──────────────────────────┐ │ │
28//! │ │ │ RtQueue<ParameterCommand>│ │ │
29//! │ │ └──────────────────────────┘ │ │
30//! │ └─────────────────────────────────────────────────────┘ │
31//! │ │ │
32//! │ │ неблокирующая очередь │
33//! │ ▼ │
34//! │ ┌─────────────────────────────────────────────────────┐ │
35//! │ │ АУДИОПОТОК │ │
36//! │ │ (rill-graph / rill-io) │ │
37//! │ └─────────────────────────────────────────────────────┘ │
38//! └─────────────────────────────────────────────────────────────┘
39//! ```
40
41#![warn(missing_docs)]
42#![deny(unsafe_code)]
43#![allow(clippy::too_many_arguments)]
44
45// =============================================================================
46// Внешние зависимости
47// =============================================================================
48
49// Реэкспорты из rill-core
50pub use rill_core::prelude::*;
51pub use rill_core::queues::RtQueue;
52pub use rill_core::{NodeId, ParamValue, ParameterId, PortId};
53
54// =============================================================================
55// Публичные модули
56// =============================================================================
57
58/// Автоматы — генеративные источники управления
59pub mod automaton;
60
61/// Управление и маппинг событий
62pub mod control;
63
64/// Менеджер патчбэя — центральный координатор
65pub mod manager;
66
67/// Сенсоры — источники событий из внешнего мира
68pub mod sensor;
69
70/// Утилиты и вспомогательные функции
71pub mod utils;
72
73/// Реестр именованных функций для сериализации
74pub mod function_registry;
75
76/// Стратегии управления автоматами
77pub mod strategy;
78
79/// PortCombiner — комбинирование автомата и UI на порт
80pub mod port_combiner;
81
82/// Обёртка Automaton в green thread (tokio task)
83pub mod automaton_task;
84
85/// Референсный оркестратор — high-level API над green threads
86pub mod engine;
87
88/// Parameter-lock step sequencer
89pub mod sequencer;
90
91/// DOT patchbay visualization (Graphviz)
92#[cfg(feature = "serde")]
93pub mod dot;
94
95/// Сериализация конфигурации управления
96#[cfg(feature = "serde")]
97pub mod document;
98
99#[cfg(feature = "serde")]
100pub use document::PatchbayDocument;
101
102// =============================================================================
103// Реэкспорты для удобства
104// =============================================================================
105
106// Selective re-exports
107pub use automaton::{
108 EnvelopeAutomaton, EnvelopeStage, EnvelopeType, FunctionAutomaton, LfoAutomaton, LfoWaveform,
109 PlayMode, Range, SequencerAutomaton, StatefulFunctionAutomaton, Step, SyncMode,
110};
111pub use automaton_task::spawn_automaton_task;
112pub use control::{
113 midi_cc, osc_address, AnyServo, Automaton, BoxedServo, ControlEvent, EventPattern, Mapping,
114 NoAction, OscSurface, OscSurfaceEntry, ParameterMapping, PatchbayControl,
115 Servo, Target, Transform,
116};
117pub use engine::PatchbayEngine;
118pub use manager::PatchbayManager;
119pub use port_combiner::{spawn_combiner, PortCombinerHandle};
120pub use strategy::{ConflictStrategy, ControlStrategy, UiCommand};
121
122// Sequencer re-exports
123#[cfg(feature = "serde")]
124pub use sequencer::SequencerDocument;
125pub use sequencer::{
126 ParameterTarget, Pattern, SequenceStep, SequencerHandle, Snapshot, SnapshotSequencer,
127 StepPlayMode,
128};
129
130// =============================================================================
131// Прелюдия для удобного импорта
132// =============================================================================
133
134/// Прелюдия для удобного импорта основных типов
135pub mod prelude {
136 // Основные типы
137 pub use crate::automaton::*;
138 pub use crate::automaton_task::*;
139 pub use crate::control::*;
140 pub use crate::engine::*;
141 pub use crate::manager::*;
142 pub use crate::port_combiner::*;
143 pub use crate::sequencer::*;
144 pub use crate::strategy::*;
145 pub use crate::utils::*;
146
147 // Реэкспорты из rill-core
148 pub use rill_core::prelude::*;
149 pub use rill_core::queues::RtQueue;
150 pub use rill_core::{NodeId, ParameterId, PortId};
151}
152
153// =============================================================================
154// Тесты
155// =============================================================================
156
157#[cfg(test)]
158mod tests {
159 use super::*;
160
161 #[test]
162 fn test_basic_imports() {
163 // Просто проверяем, что всё импортируется
164 let _ = automaton::LfoWaveform::Sine;
165 let _ = control::Transform::Linear;
166 let _ = manager::PatchbayConfig::default();
167 }
168}