Skip to content

Commit

Permalink
Update Glitch Sprinkler (WIP)
Browse files Browse the repository at this point in the history
  • Loading branch information
ryukau committed Jul 2, 2024
1 parent a68e6d2 commit 1b9faed
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 55 deletions.
60 changes: 37 additions & 23 deletions GlitchSprinkler/source/dsp/dspcore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,7 @@ void DSPCore::setup(double sampleRate_)
using ID = ParameterID::ID; \
const auto &pv = param.value; \
\
isPolyphonic = pv[ID::polyphonic]->getInt(); \
\
auto newNoteOffState \
const auto newNoteOffState \
= pv[ID::release]->getInt() ? Voice::State::release : Voice::State::terminate; \
if (noteOffState != newNoteOffState) { \
for (auto &x : voices) { \
Expand All @@ -56,6 +54,14 @@ void DSPCore::setup(double sampleRate_)
} \
noteOffState = newNoteOffState; \
\
const auto newIsPolyphonic = pv[ID::polyphonic]->getInt() != 0; \
if (isPolyphonic != newIsPolyphonic) { \
for (size_t idx = 1; idx < voices.size(); ++idx) { \
voices[idx].state = noteOffState; \
} \
} \
isPolyphonic = newIsPolyphonic; \
\
const auto samplesPerBeat = (double(60) * sampleRate) / tempo; \
const auto arpeggioNotesPerBeat = pv[ID::arpeggioNotesPerBeat]->getInt() + 1; \
arpeggioDuration = int_fast32_t(samplesPerBeat / double(arpeggioNotesPerBeat)); \
Expand Down Expand Up @@ -144,7 +150,7 @@ std::array<double, 2> Voice::processFrame()
if (pv[ID::arpeggioSwitch]->getInt()) {
if (arpeggioTimer < arpeggioTie * core.arpeggioDuration) {
++arpeggioTimer;
} else if (state != State::release && state != State::terminate) {
} else if (state == State::active) {
scheduleUpdateNote = true;

arpeggioTimer = 0;
Expand Down Expand Up @@ -191,7 +197,7 @@ std::array<double, 2> Voice::processFrame()
phaseCounter = 0;
if (scheduleUpdateNote) {
scheduleUpdateNote = false;
if (state != State::release && state != State::terminate) updateNote();
if (state == State::active) updateNote();
}
}

Expand Down Expand Up @@ -281,21 +287,10 @@ void DSPCore::noteOn(NoteInfo &info)
}
}

inline double getPitchRatio(Tuning tuning, int semitone, double octave, double cent)
template<size_t length>
double getPitchRatioFromArray(
int semitone, double octave, double cent, const std::array<double, length> &tuningTable)
{
auto getTuning = [&](Tuning tuning) {
switch (tuning) {
default:
case Tuning::equalTemperament12:
return tuningRatioEt12;
case Tuning::equalTemperament5:
return tuningRatioEt5;
case Tuning::justIntonation5LimitMajor:
return tuningRatioJust5Major;
}
};
auto tuningTable = getTuning(tuning);

int size = int(tuningTable.size());
int index = semitone % size;
if (index < 0) index += size;
Expand All @@ -305,6 +300,24 @@ inline double getPitchRatio(Tuning tuning, int semitone, double octave, double c
return tuningTable[index] * std::exp2(octave + cent / double(1200));
}

inline double getPitchRatio(int semitone, double octave, double cent, Tuning tuning)
{
switch (tuning) {
default:
case Tuning::et12:
return getPitchRatioFromArray(semitone, octave, cent, tuningRatioEt12);
case Tuning::et5:
return getPitchRatioFromArray(semitone, octave, cent, tuningRatioEt5);
case Tuning::just5Major:
return getPitchRatioFromArray(semitone, octave, cent, tuningRatioJust5Major);
case Tuning::just5Minor:
return getPitchRatioFromArray(semitone, octave, cent, tuningRatioJust5Minor);
case Tuning::just7:
return getPitchRatioFromArray(semitone, octave, cent, tuningRatioJust7);
}
// Shouldn't reach here.
}

template<typename Rng, typename Scale, typename Tuning>
inline double getRandomPitch(Rng &rng, const Scale &scale, const Tuning &tuning)
{
Expand All @@ -319,8 +332,7 @@ void Voice::updateNote()

if (core.activeNote.empty()) return;

const auto useArpeggiator
= pv[ID::arpeggioSwitch]->getInt() && arpeggioLoopCounter >= 1;
const auto useArpeggiator = pv[ID::arpeggioSwitch]->getInt();

if (!core.isPolyphonic) {
std::uniform_int_distribution<size_t> indexDist{0, core.activeNote.size() - 1};
Expand All @@ -338,8 +350,8 @@ void Voice::updateNote()
= int(pv[ID::transposeSemitone]->getInt()) - transposeSemitoneOffset;
auto transposeCent = pv[ID::transposeCent]->getDouble();
auto transposeRatio = getPitchRatio(
static_cast<Tuning>(pv[ID::tuning]->getInt()), transposeSemitone + noteNumber - 69,
transposeOctave, transposeCent + noteCent);
transposeSemitone + noteNumber - 69, transposeOctave, transposeCent + noteCent,
static_cast<Tuning>(pv[ID::tuning]->getInt()));
auto freqHz = core.pitchModifier * transposeRatio * double(440);

if (useArpeggiator) {
Expand Down Expand Up @@ -432,10 +444,12 @@ void DSPCore::noteOff(int_fast32_t noteId)
});
if (itVoice != voices.end()) {
auto &voice = *itVoice;
voice.noteId = -1;
voice.state = noteOffState;
voice.resetArpeggio(pv[ID::seed]->getInt());
}
} else if (activeNote.empty()) {
voices[0].noteId = -1;
voices[0].state = noteOffState;
voices[0].resetArpeggio(pv[ID::seed]->getInt());
}
Expand Down
1 change: 0 additions & 1 deletion GlitchSprinkler/source/dsp/tuning.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ std::array<double, 12> tuningRatioJust5Minor{
double(5) / double(3), double(9) / double(5), double(15) / double(8),
};

// TODO: remove 1 element if possible.
std::array<double, 13> tuningRatioJust7{
double(1) / double(1), double(8) / double(7), double(7) / double(6),
double(6) / double(5), double(5) / double(4), double(4) / double(3),
Expand Down
30 changes: 17 additions & 13 deletions GlitchSprinkler/source/editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ void Editor::updateUI(Vst::ParamID id, ParamValue normalized)

using ID = Synth::ParameterID::ID;
if (id >= ID::polynomialPointX0 && id < ID::polynomialPointY0 + nPolyOscControl) {
polyXYPad->linkControlFromId(id);
if (polyXYPad != nullptr) polyXYPad->linkControlFromId(id);
}
}

Expand Down Expand Up @@ -142,17 +142,22 @@ bool Editor::prepareUI()
addOptionMenu(
mixLeft1, mixTop11, labelWidth, labelHeight, uiTextSize, ID::tuning,
{
"Equal Temperament 12", "Equal Temperament 5", "Just Intonation 5-limit Major",
"- Reserved 03 -", "- Reserved 04 -", "- Reserved 05 -",
"- Reserved 06 -", "- Reserved 07 -", "- Reserved 08 -",
"- Reserved 09 -", "- Reserved 10 -", "- Reserved 11 -",
"- Reserved 12 -", "- Reserved 13 -", "- Reserved 14 -",
"- Reserved 15 -", "- Reserved 16 -", "- Reserved 17 -",
"- Reserved 18 -", "- Reserved 19 -", "- Reserved 20 -",
"- Reserved 21 -", "- Reserved 22 -", "- Reserved 23 -",
"- Reserved 24 -", "- Reserved 25 -", "- Reserved 26 -",
"- Reserved 27 -", "- Reserved 28 -", "- Reserved 29 -",
"- Reserved 30 -", "- Reserved 31 -", "- Reserved 32 -",
"ET 12", "ET 5",
"Just 5 Major", "Just 5 Minor",
"Just 7", "- Reserved 05 -",
"- Reserved 06 -", "- Reserved 07 -",
"- Reserved 08 -", "- Reserved 09 -",
"- Reserved 10 -", "- Reserved 11 -",
"- Reserved 12 -", "- Reserved 13 -",
"- Reserved 14 -", "- Reserved 15 -",
"- Reserved 16 -", "- Reserved 17 -",
"- Reserved 18 -", "- Reserved 19 -",
"- Reserved 20 -", "- Reserved 21 -",
"- Reserved 22 -", "- Reserved 23 -",
"- Reserved 24 -", "- Reserved 25 -",
"- Reserved 26 -", "- Reserved 27 -",
"- Reserved 28 -", "- Reserved 29 -",
"- Reserved 30 -", "- Reserved 31 -",
});

addCheckbox(
Expand Down Expand Up @@ -270,7 +275,6 @@ bool Editor::prepareUI()
"- Reserved 20 -", "- Reserved 21 -", "- Reserved 22 -", "- Reserved 23 -",
"- Reserved 24 -", "- Reserved 25 -", "- Reserved 26 -", "- Reserved 27 -",
"- Reserved 28 -", "- Reserved 29 -", "- Reserved 30 -", "- Reserved 31 -",
"- Reserved 32 -",
});
addLabel(arpLeft0, arpTop9, labelWidth, labelHeight, uiTextSize, "Pitch Drift [cent]");
addTextKnob(
Expand Down
30 changes: 19 additions & 11 deletions GlitchSprinkler/source/gui/polynomialxypad.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -406,20 +406,28 @@ class PolynomialXYPad : public ArrayControl {
void linkControl(size_t index)
{
const auto indexX = index % nPolyOscControl;
polyXControl->setTag(id[indexX]);
polyXControl->setValueNormalized(value[indexX]);
polyXControl->invalid();
if (polyXControl != nullptr) {
polyXControl->setTag(id[indexX]);
polyXControl->setValueNormalized(value[indexX]);
polyXControl->invalid();
}

const auto indexY = indexX + nPolyOscControl;
polyYControl->setTag(id[indexY]);
polyYControl->setValueNormalized(value[indexY]);
polyYControl->invalid();
if (polyYControl != nullptr) {
const auto indexY = indexX + nPolyOscControl;
polyYControl->setTag(id[indexY]);
polyYControl->setValueNormalized(value[indexY]);
polyYControl->invalid();
}

polyXLabel->setText("X" + std::to_string(indexX));
polyXLabel->invalid();
if (polyXLabel != nullptr) {
polyXLabel->setText("X" + std::to_string(indexX));
polyXLabel->invalid();
}

polyYLabel->setText("Y" + std::to_string(indexX));
polyYLabel->invalid();
if (polyYLabel != nullptr) {
polyYLabel->setText("Y" + std::to_string(indexX));
polyYLabel->invalid();
}
}

void setMousePosition(CPoint &pos)
Expand Down
15 changes: 8 additions & 7 deletions GlitchSprinkler/source/parameter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
#include "../../common/value.hpp"
#endif

static constexpr size_t nPolyOscControl = 13;
static constexpr size_t nPolyOscControl = 11;

constexpr size_t nReservedParameter = 256;
constexpr size_t nReservedGuiParameter = 64;
Expand All @@ -43,12 +43,13 @@ namespace Steinberg {
namespace Synth {

enum Tuning {
equalTemperament12,
equalTemperament5,
equalTemperament10Major, // TODO
equalTemperament10Minor, // TODO
justIntonation5LimitMajor,
justIntonation5LimitMinor, // TODO
et12,
et5,
// et10Major, // TODO
// et10Minor, // TODO
just5Major,
just5Minor,
just7,

Tuning_ENUM_LENGTH,
};
Expand Down

0 comments on commit 1b9faed

Please sign in to comment.