Skip to content

Commit cedf5ca

Browse files
author
Kevin J Walters
committed
Adding phosphor decay effect to audio scope.
Last four traces are now stored in traces drawn at trace_intensity. Gadgetoid#14
1 parent cf17cae commit cedf5ca

File tree

2 files changed

+50
-13
lines changed

2 files changed

+50
-13
lines changed

effect/effect.hpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88

99
#pragma once
1010

11-
#include <functional>
11+
#include <array>
1212
#include <cmath>
13-
#include <string>
1413
#include <cstdint>
1514
#include <cstddef>
15+
#include <functional>
16+
#include <string>
1617
#include "limits.h"
1718

1819

@@ -195,18 +196,29 @@ class EffectAudioscopeTuner : public EffectTuner {
195196
64, 64, 64,
196197
Display::WIDTH,
197198
Display::HEIGHT - font6.height,
198-
'r') { };
199+
'r'),
200+
// traces initialised in start()
201+
trace_intensity({8, 20, 51, 128}),
202+
trace_idx(0) { };
199203
virtual ~EffectAudioscopeTuner() { };
200204

201205
protected:
206+
void updateDisplay(void) override;
207+
void start(void) override;
208+
void init(void) override;
209+
210+
private:
202211
constexpr static int8_t Y_MID_POS = (Display::HEIGHT - 1) / 2;
203212
constexpr static float y_scale = float(Display::HEIGHT) / (1 - 2 * INT16_MIN);
213+
constexpr static int8_t OFF_SCREEN = INT8_MIN;
214+
constexpr static size_t TRACE_NUM = 4;
204215

205216
EffectText freq_text;
206-
207-
void updateDisplay(void) override;
208-
void start(void) override;
209-
void init(void) override;
217+
std::array<std::array<int8_t, Display::WIDTH>, TRACE_NUM> traces;
218+
std::array<uint8_t, TRACE_NUM> trace_intensity;
219+
size_t trace_idx; // indicates oldest trace
220+
221+
void drawTraces(void);
210222
};
211223

212224

effect/effect_audioscope_tuner.cpp

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,23 +95,48 @@ void EffectAudioscopeTuner::updateDisplay(void) {
9595
}
9696
}
9797

98-
// TODO add multiple fading passes
98+
auto &new_trace = traces[trace_idx];
9999
for (uint8_t x=0; x < Display::WIDTH; x++) {
100100
int32_t value = window(signal, 5, waveform_idx); // returns 0 beyond end of buffer
101101
int32_t y = Y_MID_POS - int32_t(roundf(value * y_scale));
102-
waveform_idx += 10;
103-
if (y >=0 && y < Display::HEIGHT) {
104-
display.set_pixel(x, y,
105-
0u, 128u, 0u);
102+
new_trace[x] = (y >=0 && y < Display::HEIGHT) ? y : OFF_SCREEN;
103+
waveform_idx += 1000 / Display::WIDTH; // TODO tune this based on sample rate
104+
}
105+
trace_idx = (trace_idx + 1) % traces.size();
106+
drawTraces();
107+
}
108+
109+
void EffectAudioscopeTuner::drawTraces(void) {
110+
size_t t_idx = trace_idx;
111+
uint8_t intensity_idx = 0;
112+
for (size_t idx=0; idx < traces.size(); idx++) {
113+
const auto &trace = traces[t_idx++];
114+
for (uint8_t x=0; x < Display::WIDTH; x++) {
115+
int32_t y = trace[x];
116+
if (y >=0 && y < Display::HEIGHT) {
117+
display.set_pixel(x, y,
118+
0u, trace_intensity[idx], 0u);
119+
}
120+
}
121+
if (t_idx >= traces.size()) {
122+
t_idx = 0; // wrap back to the start
106123
}
107-
}
124+
}
108125
}
109126

110127
void EffectAudioscopeTuner::start(void) {
111128
display.clear();
112129

113130
// default step is 1, other effects may have changed it
114131
tuner.setStep(4);
132+
133+
// For visual effect, initialise it falling towards 0 scope pos
134+
int8_t start_row = Y_MID_POS - ((Y_MID_POS + 1) / 2);
135+
for (auto &trace : traces) {
136+
for (auto &tx : trace) {
137+
tx = start_row;
138+
}
139+
}
115140
}
116141

117142
void EffectAudioscopeTuner::init(void) {

0 commit comments

Comments
 (0)