summaryrefslogtreecommitdiff
path: root/gtk2_ardour/plugin_eq_gui.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2018-10-25 04:25:15 +0200
committerRobin Gareus <robin@gareus.org>2018-10-25 04:25:15 +0200
commitb68b4d10a2f5a9d630b6ad22674f5fdf39a67aae (patch)
treec8f0f2e097241efc1bdf0a1e4715e0530c3a9672 /gtk2_ardour/plugin_eq_gui.cc
parent5599cdb911a9bbbd3f3f82a5d71ac7a850cb2d08 (diff)
Plugin analysis numerics
Show vertical marker-line (freq) and precise numeric data of the transfer function (dB, deg).
Diffstat (limited to 'gtk2_ardour/plugin_eq_gui.cc')
-rw-r--r--gtk2_ardour/plugin_eq_gui.cc66
1 files changed, 46 insertions, 20 deletions
diff --git a/gtk2_ardour/plugin_eq_gui.cc b/gtk2_ardour/plugin_eq_gui.cc
index f40b22eddb..e4e3c758fe 100644
--- a/gtk2_ardour/plugin_eq_gui.cc
+++ b/gtk2_ardour/plugin_eq_gui.cc
@@ -63,6 +63,7 @@ PluginEqGui::PluginEqGui(boost::shared_ptr<ARDOUR::PluginInsert> pluginInsert)
, _signal_input_fft(0)
, _signal_output_fft(0)
, _plugin_insert(pluginInsert)
+ , _pointer_in_area_xpos(-1)
{
_signal_analysis_running = false;
_samplerate = ARDOUR_UI::instance()->the_session()->sample_rate();
@@ -84,7 +85,6 @@ PluginEqGui::PluginEqGui(boost::shared_ptr<ARDOUR::PluginInsert> pluginInsert)
_analysis_area->signal_size_allocate().connect( sigc::mem_fun (*this, &PluginEqGui::resize_analysis_area));
_analysis_area->signal_motion_notify_event().connect( sigc::mem_fun (*this, &PluginEqGui::analysis_area_mouseover));
_analysis_area->signal_leave_notify_event().connect( sigc::mem_fun (*this, &PluginEqGui::analysis_area_mouseexit));
- _analysis_area->signal_button_press_event().connect( sigc::mem_fun (*this, &PluginEqGui::analysis_area_mousedown));
// dB selection
dBScaleModel = Gtk::ListStore::create(dBColumns);
@@ -160,6 +160,12 @@ PluginEqGui::~PluginEqGui()
// all gui objects are *manage'd by the inherited Table object
}
+static inline float
+power_to_dB(float a)
+{
+ return 10.0 * log10f(a);
+}
+
void
PluginEqGui::start_listening ()
{
@@ -448,10 +454,16 @@ PluginEqGui::run_impulse_analysis()
}
void
-PluginEqGui::update_pointer_info(float x, float y)
+PluginEqGui::update_pointer_info(float x)
{
- const int freq = std::max(1, (int) roundf((powf(10, x / _analysis_width * _log_max) - 1) * _samplerate / 2.0 / _log_coeff));
- const float dB = _max_dB - y / _analysis_height * ( _max_dB - _min_dB );
+ /* find the bin corresponding to x (see plot_impulse_amplitude) */
+ int i = roundf ((powf (10, _log_max * x / _analysis_width) - 1.0) * _impulse_fft->bins() / _log_coeff);
+ float dB = power_to_dB (_impulse_fft->power_at_bin (i));
+ /* calc freq corresponding to bin */
+ const int freq = std::max (1, (int) roundf((float)i / (float)_impulse_fft->bins() * _samplerate / 2.f));
+
+ _pointer_in_area_freq = round (_analysis_width * log10f(1.0 + (float)i / (float)_impulse_fft->bins() * _log_coeff) / _log_max);
+
std::stringstream ss;
ss << std::fixed;
if (freq >= 10000) {
@@ -461,15 +473,23 @@ PluginEqGui::update_pointer_info(float x, float y)
} else {
ss << std::setprecision (0) << freq << "Hz";
}
- ss << " " << std::setw(5) << std::setprecision (1) << std::showpos << dB;
+ ss << " " << std::setw(6) << std::setprecision (1) << std::showpos << dB;
ss << std::setw(0) << "dB";
+
+ if (_phase_button->get_active()) {
+ float phase = 180. * _impulse_fft->phase_at_bin (i) / M_PI;
+ ss << " " << std::setw(6) << std::setprecision (1) << std::showpos << phase;
+ ss << std::setw(0) << "\u00B0";
+ }
_pointer_info->set_text(ss.str());
}
bool
PluginEqGui::analysis_area_mouseover(GdkEventMotion *event)
{
- update_pointer_info(event->x, event->y);
+ update_pointer_info(event->x);
+ _pointer_in_area_xpos = event->x;
+ _analysis_area->queue_draw();
return true;
}
@@ -477,18 +497,12 @@ bool
PluginEqGui::analysis_area_mouseexit(GdkEventCrossing *)
{
_pointer_info->set_text("");
+ _pointer_in_area_xpos = -1;
+ _analysis_area->queue_draw();
return true;
}
bool
-PluginEqGui::analysis_area_mousedown(GdkEventButton *event)
-{
- update_pointer_info(event->x, event->y);
- return true;
-}
-
-
-bool
PluginEqGui::expose_analysis_area(GdkEventExpose *)
{
redraw_analysis_area();
@@ -535,15 +549,33 @@ PluginEqGui::redraw_analysis_area()
cairo_set_source_surface(cr, _analysis_scale_surface, 0.0, 0.0);
cairo_paint(cr);
+ cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
+
if (_phase_button->get_active()) {
plot_impulse_phase(_analysis_area, cr);
}
+
plot_impulse_amplitude(_analysis_area, cr);
+ if (_pointer_in_area_xpos >= 0) {
+ update_pointer_info (_pointer_in_area_xpos);
+ }
+
if (_signal_button->get_active()) {
plot_signal_amplitude_difference(_analysis_area, cr);
}
+ if (_pointer_in_area_xpos >= 0 && _pointer_in_area_freq > 0) {
+ const double dashed[] = {0.0, 2.0};
+ cairo_set_dash (cr, dashed, 2, 0);
+ cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
+ cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+ cairo_set_line_width (cr, 1.0);
+ cairo_move_to (cr, _pointer_in_area_freq - .5, -.5);
+ cairo_line_to (cr, _pointer_in_area_freq - .5, _analysis_height - .5);
+ cairo_stroke(cr);
+ }
+
cairo_destroy(cr);
}
@@ -747,12 +779,6 @@ PluginEqGui::draw_scales_power(Gtk::Widget */*w*/, cairo_t *cr)
}
-inline float
-power_to_dB(float a)
-{
- return 10.0 * log10f(a);
-}
-
void
PluginEqGui::plot_impulse_amplitude(Gtk::Widget *w, cairo_t *cr)
{