bbx_draw/lib.rs
1//! Audio visualization primitives for nannou sketches.
2//!
3//! `bbx_draw` provides visualizers that can be embedded in any nannou application,
4//! with lock-free communication between audio and visualization threads via
5//! `bbx_core::SpscRingBuffer`.
6//!
7//! # Visualizers
8//!
9//! - [`GraphTopologyVisualizer`](visualizers::GraphTopologyVisualizer) - DSP graph topology display
10//! - [`WaveformVisualizer`](visualizers::WaveformVisualizer) - Oscilloscope-style waveform
11//! - [`SpectrumAnalyzer`](visualizers::SpectrumAnalyzer) - FFT-based spectrum display
12//! - [`MidiActivityVisualizer`](visualizers::MidiActivityVisualizer) - MIDI note activity
13//!
14//! # Example
15//!
16//! ```ignore
17//! use bbx_draw::{Visualizer, visualizers::GraphTopologyVisualizer};
18//! use bbx_dsp::graph::GraphBuilder;
19//!
20//! // Capture topology from graph builder
21//! let mut builder = GraphBuilder::<f32>::new(44100.0, 512, 2);
22//! builder.add_oscillator(440.0, Waveform::Sine, None);
23//! let topology = builder.capture_topology();
24//!
25//! // Create visualizer
26//! let visualizer = GraphTopologyVisualizer::new(topology);
27//! ```
28
29pub mod bridge;
30pub mod color;
31pub mod config;
32pub mod sketch;
33pub mod visualizers;
34
35pub use bbx_dsp::{Frame, MAX_FRAME_SAMPLES};
36
37/// Type alias for `Frame` to avoid confusion with visual frames in nannou.
38pub type AudioFrame = Frame;
39pub use bridge::{
40 AudioBridgeConsumer, AudioBridgeProducer, MidiBridgeConsumer, MidiBridgeProducer, audio_bridge, midi_bridge,
41};
42use nannou::geom::Rect;
43pub use visualizers::{GraphTopologyVisualizer, MidiActivityVisualizer, SpectrumAnalyzer, WaveformVisualizer};
44
45/// Core trait for all visualizers.
46///
47/// Visualizers follow a two-phase update/draw pattern compatible with nannou's
48/// model-update-view architecture.
49pub trait Visualizer {
50 /// Update internal state (called each frame before drawing).
51 ///
52 /// This is where visualizers should consume data from their SPSC bridges
53 /// and update any internal buffers or state.
54 fn update(&mut self);
55
56 /// Draw the visualization within the given bounds.
57 ///
58 /// The `bounds` rectangle defines the area where the visualizer should render.
59 /// This allows multiple visualizers to be arranged in a layout.
60 fn draw(&self, draw: &nannou::Draw, bounds: Rect);
61}