VulcanoLE/src/VulcanoLE/Scripts/Random.cpp

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;
}
}