Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
visualizers.hpp
Go to the documentation of this file.
1#pragma once
2
3// Spectral and multi-channel meter visualizers. These are the widgets whose
4// declarations need pulp/signal types (SpectrogramBuffer, ColorMapper,
5// MultiChannelBallistics), so they live here rather than in widgets.hpp — only
6// a TU that actually paints one pays for the core/signal headers. Their
7// implementations are in core/view/src/widgets/visualizers.cpp.
8//
9// widgets.hpp includes this header, so existing consumers keep compiling
10// unchanged; new code that only needs a visualizer should include this header
11// directly.
12
15#include <pulp/view/view.hpp>
16
17namespace pulp::view {
18
19// ── SpectrogramView ──────────────────────────────────────────────────────────
20// Scrolling time-frequency display. Each STFT frame becomes a column of
21// colored pixels, scrolling left as new frames arrive.
22
23class SpectrogramView : public View {
24 public:
25 SpectrogramView() = default;
26
28 void push_spectrum(const float* magnitudes_db, int num_bins);
29
32 signal::ColorRamp ramp = signal::ColorRamp::inferno, float min_db = -80.0f,
33 float max_db = 0.0f);
34
36 mapper_.set_ramp(ramp);
37 }
38 void set_range(float min_db, float max_db) {
39 min_db_ = min_db;
40 max_db_ = max_db;
41 }
42
43 int history_columns() const {
44 return buffer_.width();
45 }
46 int freq_rows() const {
47 return buffer_.height();
48 }
49
50 void paint(canvas::Canvas& canvas) override;
51
52 private:
55 float min_db_ = -80.0f;
56 float max_db_ = 0.0f;
57 bool configured_ = false;
58};
59
60// ── MultiMeter ──────────────────────────────────────────────────────────────
61// Multi-channel level meter with configurable layout. Supports arbitrary
62// channel counts (mono through ambisonic). Uses MultiChannelBallistics
63// for smooth display.
64
65class MultiMeter : public View {
66 public:
67 enum class Layout { vertical, horizontal };
69
73
83 [[nodiscard]] bool update(const signal::MultiChannelMeterData& data, float dt);
84
86 layout_ = l;
87 }
88 Layout layout() const {
89 return layout_;
90 }
91
93 display_style_ = s;
94 }
96 return display_style_;
97 }
98
99 void set_channel_count(int count);
100 int channel_count() const {
101 return ballistics_.num_channels;
102 }
103
106 return ballistics_;
107 }
108
109 void paint(canvas::Canvas& canvas) override;
110
111 private:
112 Layout layout_ = Layout::vertical;
113 DisplayStyle display_style_ = DisplayStyle::continuous;
115};
116
117// ── CorrelationMeter ────────────────────────────────────────────────────────
118// Stereo correlation display (-1 to +1). Shows phase relationship between
119// left and right channels.
120
121class CorrelationMeter : public View {
122 public:
126
133 [[nodiscard]] bool update(float correlation, float dt);
134
135 float display_correlation() const {
136 return display_correlation_;
137 }
138
139 void paint(canvas::Canvas& canvas) override;
140
141 private:
142 float display_correlation_ = 0.0f;
143 float smoothing_coeff_ = 0.1f; // Exponential smoothing
144};
145
146} // namespace pulp::view
Definition canvas.hpp:240
Maps a normalized value [0,1] to a color using a predefined ramp.
Definition spectrogram.hpp:27
Scrolling spectrogram buffer that accumulates STFT frames as rows.
Definition spectrogram.hpp:205
void paint(canvas::Canvas &canvas) override
CorrelationMeter()
Definition visualizers.hpp:123
float display_correlation() const
Definition visualizers.hpp:135
bool update(float correlation, float dt)
Update with new correlation value (-1 to +1).
MultiMeter()
Definition visualizers.hpp:70
void set_channel_count(int count)
Layout layout() const
Definition visualizers.hpp:88
int channel_count() const
Definition visualizers.hpp:100
const signal::MultiChannelBallistics & ballistics() const
Access ballistics for testing.
Definition visualizers.hpp:105
DisplayStyle display_style() const
Definition visualizers.hpp:95
void paint(canvas::Canvas &canvas) override
DisplayStyle
Definition visualizers.hpp:68
@ segmented
Definition visualizers.hpp:68
@ continuous
Definition visualizers.hpp:68
bool update(const signal::MultiChannelMeterData &data, float dt)
Update from multi-channel meter data.
void set_display_style(DisplayStyle s)
Definition visualizers.hpp:92
Layout
Definition visualizers.hpp:67
@ horizontal
Definition visualizers.hpp:67
@ vertical
Definition visualizers.hpp:67
void set_layout(Layout l)
Definition visualizers.hpp:85
void paint(canvas::Canvas &canvas) override
void configure(int history_columns, int freq_rows, signal::ColorRamp ramp=signal::ColorRamp::inferno, float min_db=-80.0f, float max_db=0.0f)
Configure display dimensions and color mapping.
void set_range(float min_db, float max_db)
Definition visualizers.hpp:38
int freq_rows() const
Definition visualizers.hpp:46
void push_spectrum(const float *magnitudes_db, int num_bins)
Push a new STFT frame (dB magnitudes) for display.
int history_columns() const
Definition visualizers.hpp:43
void set_color_ramp(signal::ColorRamp ramp)
Definition visualizers.hpp:35
@ meter
Definition view.hpp:989
void set_access_role(AccessRole role)
Definition view.hpp:995
Multi-channel metering: sample peak, RMS, K-weighted momentary and gated integrated loudness,...
Definition affine_transform.hpp:24
ColorRamp
Predefined color ramp types for spectrogram rendering.
Definition spectrogram.hpp:21
@ inferno
Definition spectrogram.hpp:21
Hover-cursor tracking for platform window hosts.
Definition fwd.hpp:27
@ s
Definition input_events.hpp:41
@ l
Definition input_events.hpp:40
Color ramp mapping and frequency axis utilities for spectrogram display.
Configurable ballistics for multi-channel meter display (UI thread).
Definition multi_channel_meter.hpp:145
Complete metering snapshot for all channels, published lock-free.
Definition multi_channel_meter.hpp:130