13
13
#include < QPainter>
14
14
#include < QEvent>
15
15
#include < QDebug>
16
+ #include < differentiator.h>
17
+
16
18
#include < cmath>
17
19
18
20
ScopeWidget::ScopeWidget (QWidget *parent) : QWidget(parent), pixmap(640 , 640 )
@@ -53,9 +55,6 @@ ScopeWidget::ScopeWidget(QWidget *parent) : QWidget(parent), pixmap(640, 640)
53
55
mainLayout->addLayout (screenLayout);
54
56
setLayout (mainLayout);
55
57
56
- setBrightness (66.0 );
57
- setFocus (50.0 );
58
- setPersistence (32 );
59
58
plotTimer.start ();
60
59
}
61
60
@@ -145,6 +144,7 @@ void ScopeWidget::setBackgroundColor(const QColor &value)
145
144
146
145
void ScopeWidget::setPhosporColors (const QVector<QColor>& colors)
147
146
{
147
+ // qDebug() << __func__;
148
148
if (!colors.isEmpty ()) {
149
149
phosphorColor = colors.at (0 );
150
150
if (colors.count () > 1 ) {
@@ -162,21 +162,25 @@ double ScopeWidget::getPersistence() const
162
162
return persistence;
163
163
}
164
164
165
- void ScopeWidget::setPersistence (double value )
165
+ void ScopeWidget::setPersistence (double time_ms )
166
166
{
167
- persistence = value;
168
- // define fraction of original brightness (10%)
169
- constexpr double decayTarget = 0.1 ;
167
+ // qDebug() << QStringLiteral("setting persistence to %1").arg(time_ms);
168
+ persistence = time_ms;
169
+
170
+ // define fraction of original brightness
171
+ constexpr double decayTarget = 0.2 ;
172
+
170
173
// set minimum darkening amount threshold. (If the darkening amount is too low, traces will never completely disappear)
171
174
constexpr int minDarkenAlpha = 32 ;
175
+
172
176
darkenAlpha = 0 ;
173
177
darkenNthFrame = 0 ;
174
178
do {
175
- ++darkenNthFrame;
176
- double n = std::max (0.01 , value / plotTimer.interval ()) / darkenNthFrame; // number of frames to reach decayTarget (can't be zero)
179
+ ++darkenNthFrame; // for really long persistence, darkening operation may need to occur less often than once per frame
180
+ double n = std::max (1.0 , time_ms / plotTimer.interval ()) / darkenNthFrame; // number of frames to reach decayTarget (can't be zero)
177
181
darkenAlpha = std::min (std::max (1 , static_cast <int >(255 * (1.0 - std::pow (decayTarget, (1.0 / n))))), 255 );
178
-
179
182
} while (darkenAlpha < minDarkenAlpha);
183
+
180
184
darkencolor.setAlpha (darkenAlpha);
181
185
darkenCooldownCounter = darkenNthFrame;
182
186
}
@@ -228,6 +232,8 @@ void ScopeWidget::setTotalFrames(const int64_t &value)
228
232
229
233
void ScopeWidget::render ()
230
234
{
235
+ static Differentiator<double > d;
236
+
231
237
const int64_t toFrame = qMin (totalFrames - 1 , startFrame + static_cast <int64_t >(elapsedTimer.elapsed () * framesPerMillisecond));
232
238
const int64_t framesRead = sndfile->readf (inputBuffer.data (), qMin (maxFramesToRead, toFrame - currentFrame));
233
239
@@ -260,29 +266,31 @@ void ScopeWidget::render()
260
266
break ;
261
267
case MidSide:
262
268
{
263
- constexpr double rsqrt2 = 0.707 ; // 1 / sqrt(2)
269
+ constexpr double rsqrt2 = 0.707 ;
264
270
pt = {(1.0 + rsqrt2*(ch0val - ch1val)) * cx,
265
271
(1.0 - rsqrt2*(ch0val + ch1val)) * cy};
266
272
painter.drawPoint (pt);
267
273
break ;
268
274
}
269
275
case Single:
270
276
{
271
- constexpr double thresh = 100.0 / 32767 ;
272
- static const double sweepAdvance = 0.02 * cx / framesPerMillisecond;
277
+ constexpr double thresh = 0.01 ;
278
+ static const double sweepAdvance = 0.1 * cx / framesPerMillisecond;
273
279
static bool triggered = false ;
274
- static double x = 0 ;
275
- static QPointF lastPoint;
280
+ static double x = 0.0 ;
281
+ static QPointF lastPoint{x, cy};
282
+
283
+ double slope = d.get (ch0val);
284
+ triggered = triggered || (std::abs (ch0val) < thresh && slope > 0 );
276
285
277
- if (triggered || (triggered == (ch0val >= 0.0 && ch0val < thresh)) ) {
278
- pt = {x , cy *(1.0 - ch0val)};
286
+ if (triggered) {
287
+ pt = {x, cy * (1.0 - ch0val)};
279
288
painter.drawLine (lastPoint, pt);
280
289
lastPoint = pt;
281
290
x += sweepAdvance;
282
- if (x >= 2.0 * cx) {
291
+ if (x >= 2.0 * cx) { // sweep completed
283
292
triggered = false ;
284
- x = 0 ;
285
- lastPoint = {x, cy};
293
+ lastPoint = {x = 0.0 , cy};
286
294
}
287
295
}
288
296
}
0 commit comments