0dBFS peak meter GUI
This commit is contained in:
parent
75087f5c62
commit
517211681e
@ -150,6 +150,8 @@ LevelMeterBase::update_meters ()
|
|||||||
const float peak = _meter->meter_level (n, meter_type);
|
const float peak = _meter->meter_level (n, meter_type);
|
||||||
if (meter_type == MeterPeak) {
|
if (meter_type == MeterPeak) {
|
||||||
(*i).meter->set (log_meter (peak));
|
(*i).meter->set (log_meter (peak));
|
||||||
|
} else if (meter_type == MeterPeak0dB) {
|
||||||
|
(*i).meter->set (log_meter0dB (peak));
|
||||||
} else if (meter_type == MeterIEC1NOR) {
|
} else if (meter_type == MeterIEC1NOR) {
|
||||||
(*i).meter->set (meter_deflect_nordic (peak + meter_lineup(0)));
|
(*i).meter->set (meter_deflect_nordic (peak + meter_lineup(0)));
|
||||||
} else if (meter_type == MeterIEC1DIN) {
|
} else if (meter_type == MeterIEC1DIN) {
|
||||||
@ -374,6 +376,25 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
|
|||||||
c[0] = c[2] = c[3] = c[4] = c[5] = c[1];
|
c[0] = c[2] = c[3] = c[4] = c[5] = c[1];
|
||||||
c[7] = c[8] = c[9] = c[6];
|
c[7] = c[8] = c[9] = c[6];
|
||||||
break;
|
break;
|
||||||
|
case MeterPeak0dB:
|
||||||
|
stp[1] = 115.0 * log_meter0dB(-10);
|
||||||
|
stp[2] = 115.0 * log_meter0dB(-3);
|
||||||
|
stp[3] = 115.0 * log_meter0dB(0);
|
||||||
|
switch (ARDOUR_UI::config()->get_meter_line_up_level()) {
|
||||||
|
case MeteringLineUp24:
|
||||||
|
stp[0] = 115.0 * log_meter0dB(-24);
|
||||||
|
break;
|
||||||
|
case MeteringLineUp20:
|
||||||
|
stp[0] = 115.0 * log_meter0dB(-20);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case MeteringLineUp18:
|
||||||
|
stp[0] = 115.0 * log_meter0dB(-18);
|
||||||
|
break;
|
||||||
|
case MeteringLineUp15:
|
||||||
|
stp[0] = 115.0 * log_meter0dB(-15);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default: // PEAK, RMS
|
default: // PEAK, RMS
|
||||||
stp[1] = 77.5; // 115 * log_meter(-10)
|
stp[1] = 77.5; // 115 * log_meter(-10)
|
||||||
stp[2] = 92.5; // 115 * log_meter(-3)
|
stp[2] = 92.5; // 115 * log_meter(-3)
|
||||||
|
@ -75,6 +75,31 @@ log_meter (float db)
|
|||||||
return def/115.0f;
|
return def/115.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline float
|
||||||
|
log_meter0dB (float db)
|
||||||
|
{
|
||||||
|
gfloat def = 0.0f; /* Meter deflection %age */
|
||||||
|
|
||||||
|
if (db < -70.0f) {
|
||||||
|
def = 0.0f;
|
||||||
|
} else if (db < -60.0f) {
|
||||||
|
def = (db + 70.0f) * 0.25f;
|
||||||
|
} else if (db < -50.0f) {
|
||||||
|
def = (db + 60.0f) * 0.5f + 2.5f;
|
||||||
|
} else if (db < -40.0f) {
|
||||||
|
def = (db + 50.0f) * 0.75f + 7.5f;
|
||||||
|
} else if (db < -30.0f) {
|
||||||
|
def = (db + 40.0f) * 1.5f + 15.0f;
|
||||||
|
} else if (db < -20.0f) {
|
||||||
|
def = (db + 30.0f) * 2.0f + 30.0f;
|
||||||
|
} else if (db < 0.0f) {
|
||||||
|
def = (db + 20.0f) * 2.5f + 50.0f;
|
||||||
|
} else {
|
||||||
|
def = 100.0f;
|
||||||
|
}
|
||||||
|
return def/100.0f;
|
||||||
|
}
|
||||||
|
|
||||||
static inline float
|
static inline float
|
||||||
meter_deflect_ppm (float db)
|
meter_deflect_ppm (float db)
|
||||||
{
|
{
|
||||||
|
@ -81,6 +81,9 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt)
|
|||||||
case MeterPeak:
|
case MeterPeak:
|
||||||
return _("Peak");
|
return _("Peak");
|
||||||
break;
|
break;
|
||||||
|
case MeterPeak0dB:
|
||||||
|
return _("Peak 0dB");
|
||||||
|
break;
|
||||||
case MeterKrms:
|
case MeterKrms:
|
||||||
return _("RMS + Peak");
|
return _("RMS + Peak");
|
||||||
break;
|
break;
|
||||||
@ -109,6 +112,7 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt)
|
|||||||
return _("VU");
|
return _("VU");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
assert(0);
|
||||||
return _("???");
|
return _("???");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -141,6 +145,17 @@ static inline float mtr_col_and_fract(
|
|||||||
cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
|
cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case MeterPeak0dB:
|
||||||
|
fraction = log_meter0dB (val);
|
||||||
|
if (val >= 0 || val == -9) {
|
||||||
|
cairo_set_source_rgb (cr,
|
||||||
|
UINT_RGBA_R_FLT(peakcolor),
|
||||||
|
UINT_RGBA_G_FLT(peakcolor),
|
||||||
|
UINT_RGBA_B_FLT(peakcolor));
|
||||||
|
} else {
|
||||||
|
cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
|
||||||
|
}
|
||||||
|
break;
|
||||||
case MeterIEC2BBC:
|
case MeterIEC2BBC:
|
||||||
case MeterIEC2EBU:
|
case MeterIEC2EBU:
|
||||||
fraction = meter_deflect_ppm(val);
|
fraction = meter_deflect_ppm(val);
|
||||||
@ -491,6 +506,14 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
points.insert (std::pair<float,float>( 0, 1.0));
|
||||||
|
points.insert (std::pair<float,float>( 1, 0.5));
|
||||||
|
points.insert (std::pair<float,float>( 2, 0.5));
|
||||||
|
points.insert (std::pair<float,float>( 3, 1.0));
|
||||||
|
points.insert (std::pair<float,float>( 4, 0.5));
|
||||||
|
points.insert (std::pair<float,float>( 5, 0.5));
|
||||||
|
// no break
|
||||||
|
case MeterPeak0dB:
|
||||||
points.insert (std::pair<float,float>(-60, 0.5));
|
points.insert (std::pair<float,float>(-60, 0.5));
|
||||||
points.insert (std::pair<float,float>(-50, 1.0));
|
points.insert (std::pair<float,float>(-50, 1.0));
|
||||||
points.insert (std::pair<float,float>(-40, 1.0));
|
points.insert (std::pair<float,float>(-40, 1.0));
|
||||||
@ -523,13 +546,6 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
|
|||||||
points.insert (std::pair<float,float>( -3, 1.0));
|
points.insert (std::pair<float,float>( -3, 1.0));
|
||||||
points.insert (std::pair<float,float>( -2, 0.5));
|
points.insert (std::pair<float,float>( -2, 0.5));
|
||||||
points.insert (std::pair<float,float>( -1, 0.5));
|
points.insert (std::pair<float,float>( -1, 0.5));
|
||||||
|
|
||||||
points.insert (std::pair<float,float>( 0, 1.0));
|
|
||||||
points.insert (std::pair<float,float>( 1, 0.5));
|
|
||||||
points.insert (std::pair<float,float>( 2, 0.5));
|
|
||||||
points.insert (std::pair<float,float>( 3, 1.0));
|
|
||||||
points.insert (std::pair<float,float>( 4, 0.5));
|
|
||||||
points.insert (std::pair<float,float>( 5, 0.5));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -678,6 +694,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
|
|||||||
switch (*i) {
|
switch (*i) {
|
||||||
case DataType::AUDIO:
|
case DataType::AUDIO:
|
||||||
layout->set_attributes (audio_font_attributes);
|
layout->set_attributes (audio_font_attributes);
|
||||||
|
if (type == MeterPeak0dB) {
|
||||||
|
overlay_midi = 4;
|
||||||
|
}
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case MeterK12:
|
case MeterK12:
|
||||||
overlay_midi = 0;
|
overlay_midi = 0;
|
||||||
@ -725,6 +744,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
|
|||||||
default:
|
default:
|
||||||
case MeterPeak:
|
case MeterPeak:
|
||||||
case MeterKrms:
|
case MeterKrms:
|
||||||
|
points.insert (std::pair<float,string>( 3.0f, "+3"));
|
||||||
|
// no break
|
||||||
|
case MeterPeak0dB:
|
||||||
points.insert (std::pair<float,string>(-50.0f, "-50"));
|
points.insert (std::pair<float,string>(-50.0f, "-50"));
|
||||||
points.insert (std::pair<float,string>(-40.0f, "-40"));
|
points.insert (std::pair<float,string>(-40.0f, "-40"));
|
||||||
points.insert (std::pair<float,string>(-30.0f, "-30"));
|
points.insert (std::pair<float,string>(-30.0f, "-30"));
|
||||||
@ -742,7 +764,6 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
|
|||||||
points.insert (std::pair<float,string>( -5.0f, "-5"));
|
points.insert (std::pair<float,string>( -5.0f, "-5"));
|
||||||
points.insert (std::pair<float,string>( -3.0f, "-3"));
|
points.insert (std::pair<float,string>( -3.0f, "-3"));
|
||||||
points.insert (std::pair<float,string>( 0.0f, "+0"));
|
points.insert (std::pair<float,string>( 0.0f, "+0"));
|
||||||
points.insert (std::pair<float,string>( 3.0f, "+3"));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MeterIEC2EBU:
|
case MeterIEC2EBU:
|
||||||
@ -832,6 +853,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
|
|||||||
points.insert (std::pair<float,string>( 96, "96"));
|
points.insert (std::pair<float,string>( 96, "96"));
|
||||||
points.insert (std::pair<float,string>(100, "100"));
|
points.insert (std::pair<float,string>(100, "100"));
|
||||||
points.insert (std::pair<float,string>(112, "112"));
|
points.insert (std::pair<float,string>(112, "112"));
|
||||||
|
points.insert (std::pair<float,string>(127, "127"));
|
||||||
} else {
|
} else {
|
||||||
switch (overlay_midi) {
|
switch (overlay_midi) {
|
||||||
case 1:
|
case 1:
|
||||||
@ -859,6 +881,13 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
|
|||||||
points.insert (std::pair<float,string>( 72, "72"));
|
points.insert (std::pair<float,string>( 72, "72"));
|
||||||
points.insert (std::pair<float,string>(112, "112"));
|
points.insert (std::pair<float,string>(112, "112"));
|
||||||
points.insert (std::pair<float,string>(127, "127"));
|
points.insert (std::pair<float,string>(127, "127"));
|
||||||
|
case 4:
|
||||||
|
/* labels that don't overlay with 0dBFS*/
|
||||||
|
points.insert (std::pair<float,string>( 0, "0"));
|
||||||
|
points.insert (std::pair<float,string>( 16, "16"));
|
||||||
|
points.insert (std::pair<float,string>( 48, "48"));
|
||||||
|
points.insert (std::pair<float,string>( 84, "84"));
|
||||||
|
points.insert (std::pair<float,string>(100, "100"));
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -947,6 +976,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
case MeterPeak:
|
case MeterPeak:
|
||||||
|
case MeterPeak0dB:
|
||||||
case MeterKrms:
|
case MeterKrms:
|
||||||
layout->set_text("dBFS");
|
layout->set_text("dBFS");
|
||||||
break;
|
break;
|
||||||
|
@ -842,6 +842,7 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev)
|
|||||||
|
|
||||||
_suspend_menu_callbacks = true;
|
_suspend_menu_callbacks = true;
|
||||||
add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak);
|
add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak);
|
||||||
|
add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterPeak0dB), MeterPeak0dB);
|
||||||
add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms);
|
add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms);
|
||||||
add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN);
|
add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN);
|
||||||
add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR);
|
add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR);
|
||||||
|
@ -2304,6 +2304,7 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev)
|
|||||||
items.push_back (SeparatorElem());
|
items.push_back (SeparatorElem());
|
||||||
|
|
||||||
add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterPeak), MeterPeak);
|
add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterPeak), MeterPeak);
|
||||||
|
add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterPeak0dB), MeterPeak0dB);
|
||||||
add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterKrms), MeterKrms);
|
add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterKrms), MeterKrms);
|
||||||
add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN);
|
add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN);
|
||||||
add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR);
|
add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR);
|
||||||
|
Loading…
Reference in New Issue
Block a user