83 lines
2.6 KiB
C++
83 lines
2.6 KiB
C++
#include <VulcanoLE/Scripts/Random.h>
|
|
#include <VUtils/Logging.h>
|
|
#include <VUtils/Math.h>
|
|
|
|
namespace VIZ {
|
|
Random::Random(AudioGrabber *pGrabber, Vulcan121 *vulcan) : VIZ(pGrabber, vulcan) {
|
|
}
|
|
void Random::onSetup() {
|
|
keyboard->sendToLEDs({ 0, 0, 0, 0 });
|
|
if (map == nullptr) {
|
|
map = Vulcan121::createEmptyLEDMap();
|
|
for (auto &color : map->key) {
|
|
color.r = 255;
|
|
color.b = 155;
|
|
color.a = 0;
|
|
}
|
|
}
|
|
grabber->requestMode = AudioGrabber::ReqMode::FFT;
|
|
usleep(100000);
|
|
}
|
|
void Random::onTick(float delta) {
|
|
deltaElapsed += delta;
|
|
auto fftData = grabber->fft.getData()->leftChannel;
|
|
auto val = 0.0;
|
|
for (int i = 1; i < 4; ++i) {
|
|
auto avg = fftData[i];
|
|
if (avg > val)
|
|
val = avg;
|
|
}
|
|
val = VUtils::Math::clamp(val, 1,255);
|
|
if (deltaElapsed >= deltaNeeded) {
|
|
deltaElapsed -= deltaNeeded;
|
|
if (emptyTicks && ticks < 10) {
|
|
ticks++;
|
|
} else {
|
|
ticks = 0;
|
|
emptyTicks = false;
|
|
auto *kRow = keyboard->getRow(row);
|
|
columnCount += isReverse ? -1 : 1;
|
|
if (!isReverse && columnCount > kRow->count) {
|
|
row++;
|
|
if (row >= keyboardData.num_rows) {
|
|
emptyTicks = true;
|
|
isReverse = true;
|
|
row = keyboardData.num_rows-1;
|
|
} else {
|
|
columnCount = 0;
|
|
}
|
|
} else if (isReverse && columnCount < 0) {
|
|
row--;
|
|
if (row < 0) {
|
|
emptyTicks = true;
|
|
isReverse = false;
|
|
row = 0;
|
|
} else {
|
|
columnCount = kRow->count;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (auto &color : map->key)
|
|
color.a = 0;
|
|
for (int i = 0; i <= row; ++i) {
|
|
auto *kRow = keyboard->getRow(i);
|
|
if (kRow) {
|
|
for (int j = 0; j < kRow->count; ++j) {
|
|
auto intVal = (int16_t) val;
|
|
if (i == row && j > columnCount)
|
|
intVal = 0;
|
|
map->key[kRow->index[j]].a = intVal;
|
|
}
|
|
}
|
|
}
|
|
keyboard->sendLedMap(map, false);
|
|
}
|
|
const char *Random::name() {
|
|
return "Random";
|
|
}
|
|
|
|
Random::~Random() {
|
|
delete map;
|
|
}
|
|
} |