midi meter updates..
authorRobin Gareus <robin@gareus.org>
Thu, 4 Jul 2013 22:43:31 +0000 (00:43 +0200)
committerRobin Gareus <robin@gareus.org>
Wed, 10 Jul 2013 13:27:08 +0000 (15:27 +0200)
gtk2_ardour/level_meter.cc
libs/ardour/meter.cc

index a25efcc7c7c7581971b63e6b9015ea048417fcb4..0e73d86e9ee4918f8fcb78b9ed0f74bc42ed03a2 100644 (file)
@@ -96,10 +96,16 @@ LevelMeter::update_meters ()
                return 0.0f;
        }
 
+       int32_t nmidi = _meter->input_streams().n_midi();
+
        for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) {
                if ((*i).packed) {
                        peak = _meter->peak_power (n);
-                       (*i).meter->set (log_meter (peak));
+                       if (n < nmidi) {
+                               (*i).meter->set (peak);
+                       } else {
+                               (*i).meter->set (log_meter (peak));
+                       }
                        mpeak = _meter->max_peak_power(n);
                        if (mpeak > max_peak) {
                                max_peak = mpeak;
index 4d096aae89118c23f2254776c838e6788f24f007..80257f37b5d1e5dac468a05016bcd15c328c947c 100644 (file)
@@ -68,7 +68,7 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
                for (MidiBuffer::iterator e = buf.begin(); e != buf.end(); ++e) {
                        const Evoral::MIDIEvent<framepos_t> ev(*e, false);
                        if (ev.is_note_on()) {
-                               const float this_vel = log(ev.buffer()[2] / 127.0 * (M_E*M_E-M_E) + M_E) - 1.0;
+                               const float this_vel = ev.buffer()[2] / 127.0;
                                if (this_vel > val) {
                                        val = this_vel;
                                }
@@ -189,6 +189,7 @@ PeakMeter::meter ()
        assert(_visible_peak_power.size() == _peak_power.size());
 
        const size_t limit = min (_peak_power.size(), (size_t) current_meters.n_total ());
+       const size_t n_midi  = min (_peak_power.size(), (size_t) current_meters.n_midi());
 
        for (size_t n = 0; n < limit; ++n) {
 
@@ -197,6 +198,24 @@ PeakMeter::meter ()
                float new_peak = _peak_power[n]; /* XXX we should use atomic exchange from here ... */
                _peak_power[n] = 0;              /* ... to here */
 
+               if (n < n_midi) {
+                       _max_peak_power[n] = -INFINITY; // std::max (fast_coefficient_to_dB(new_peak), _max_peak_power[n]); // XXX
+                       if (Config->get_meter_falloff() == 0.0f || new_peak > _visible_peak_power[n]) {
+                       } else {
+                               /* empirical WRT to falloff times , 0.01f ^= 100 Hz update rate */
+#if 1
+                               new_peak = _visible_peak_power[n] - _visible_peak_power[n] * Config->get_meter_falloff() * 0.01f * 0.05f;
+#else
+                               new_peak = _visible_peak_power[n] - sqrt(_visible_peak_power[n] * Config->get_meter_falloff() * 0.01f * 0.0002f);
+#endif
+                               if (new_peak < (1.0 / 512.0)) new_peak = 0;
+                       }
+                       _visible_peak_power[n] = new_peak;
+                       continue;
+               }
+
+               /* AUDIO */
+
                /* compute new visible value using falloff */
 
                if (new_peak > 0.0) {