transpose gadget; fixed Testron parameter stride (d'oh!)

portability/boost
zetaPRIME 2019-01-08 22:36:12 -05:00
parent 60310bf6f1
commit cc5ef1534d
5 changed files with 133 additions and 4 deletions

2
notes
View File

@ -91,7 +91,7 @@ TODO {
gadgets and bundled things {
(the simple things:)
- gain and panning gadget
note transpose
- note transpose
volume meter
Polyplexer (splits a single command input into several monophonic outputs and keeps track of individual notes between them)

View File

@ -79,7 +79,7 @@ void TestSynth::process() {
} else if (n < -1 && id == noteId) { // note off
tvol = 0.0;
}
mi += 5 + cp->data[mi+4];
mi += 5 + cp->data[mi+4]*2;
}
size_t ts = audioEngine->curTickSize();

View File

@ -0,0 +1,97 @@
#include "transpose.h"
using Xybrid::Gadgets::Transpose;
using namespace Xybrid::Data;
#include "data/porttypes.h"
#include "config/pluginregistry.h"
using namespace Xybrid::Config;
#include "audio/audioengine.h"
using namespace Xybrid::Audio;
#include "ui/patchboard/nodeobject.h"
#include "ui/gadgets/knobgadget.h"
using namespace Xybrid::UI;
#include <cmath>
#include <QCborMap>
namespace {
bool _ = PluginRegistry::enqueueRegistration([] {
auto i = std::make_shared<PluginInfo>();
i->id = "gadget:transpose";
i->displayName = "Transpose";
i->category = "Gadget";
//i->hidden = true;
i->createInstance = []{ return std::make_shared<Transpose>(); };
PluginRegistry::registerPlugin(i);
//inf = i;
});
}
Transpose::Transpose() {
}
void Transpose::init() {
addPort(Port::Input, Port::Command, 0);
addPort(Port::Output, Port::Command, 0);
}
void Transpose::process() {
int off = amount.load();
auto in = std::static_pointer_cast<CommandPort>(port(Port::Input, Port::Command, 0));
auto out = std::static_pointer_cast<CommandPort>(port(Port::Output, Port::Command, 0));
in->pull();
out->pull();
out->data = reinterpret_cast<uint8_t*>(audioEngine->tickAlloc(in->dataSize));
out->dataSize = in->dataSize;
memcpy(out->data, in->data, in->dataSize); // precopy
size_t mi = 0;
while (out->dataSize >= mi+5) {
int16_t& n = reinterpret_cast<int16_t&>(out->data[mi+2]);
if (n > -1) {
int nn = n;
nn += off;
if (nn < 0 || nn > 32767) nn = -1;
n = static_cast<int16_t>(nn);
}
mi += 5 + out->data[mi+4]*2;
}
}
void Transpose::saveData(QCborMap& m) {
m.insert(QString("amount"), QCborValue(amount));
}
void Transpose::loadData(QCborMap& m) {
amount = static_cast<int>(m.value("amount").toInteger(0));
}
void Transpose::onGadgetCreated() {
if (!obj) return;
//obj->showName = false;
//obj->canRename = false;
obj->showPluginName = false;
obj->setGadgetSize(12*2+32, 64);
{
auto k = new KnobGadget(obj->contents);
k->setPos(12, 16);
k->min = -24;
k->max = 24;
k->step = 1;
k->bind(amount);
k->setLabel("Transpose");
//k->fText = [](double d) { return QString("%1dB").arg(d); };
}
}

View File

@ -0,0 +1,30 @@
#pragma once
#include <atomic>
#include "data/node.h"
namespace Xybrid::Gadgets {
class Transpose : public Data::Node {
std::atomic<int> amount = 0;
public:
Transpose();
~Transpose() override = default;
void init() override;
//void reset() override;
void process() override;
//void onRename() override;
void saveData(QCborMap&) override;
void loadData(QCborMap&) override;
//void onUnparent(std::shared_ptr<Data::Graph>) override;
//void onParent(std::shared_ptr<Data::Graph>) override;
void onGadgetCreated() override;
//void drawCustomChrome(QPainter*, const QStyleOptionGraphicsItem*) override;
};
}

View File

@ -57,7 +57,8 @@ SOURCES += \
gadgets/testsynth.cpp \
util/keys.cpp \
ui/gadgets/knobgadget.cpp \
gadgets/gainbalance.cpp
gadgets/gainbalance.cpp \
gadgets/transpose.cpp
HEADERS += \
mainwindow.h \
@ -90,7 +91,8 @@ HEADERS += \
util/keys.h \
ui/gadgets/knobgadget.h \
gadgets/gainbalance.h \
util/pattern.h
util/pattern.h \
gadgets/transpose.h
FORMS += \
mainwindow.ui