diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index 71c0fb9..535f7e9 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -35,11 +35,12 @@ OscirenderAudioProcessor::OscirenderAudioProcessor() : CommonAudioProcessor(Buse auto multiplexEffect = std::make_shared( std::make_shared(), std::vector{ - new osci::EffectParameter("Multiplex Grid X", "Controls the horizontal grid size for the multiplex effect.", "multiplexGridX", VERSION_HINT, 1.0, 1.0, 8.0), - new osci::EffectParameter("Multiplex Grid Y", "Controls the vertical grid size for the multiplex effect.", "multiplexGridY", VERSION_HINT, 1.0, 1.0, 8.0), - new osci::EffectParameter("Multiplex Grid Z", "Controls the depth grid size for the multiplex effect.", "multiplexGridZ", VERSION_HINT, 1.0, 1.0, 8.0), - new osci::EffectParameter("Multiplex Smooth", "Controls the smoothness of transitions between grid sizes.", "multiplexSmooth", VERSION_HINT, 1.0, 0.0, 1.0), - new osci::EffectParameter("Grid Phase", "Controls the current phase of the grid animation.", "gridPhase", VERSION_HINT, 0.0, -1.0, 1.0), + new osci::EffectParameter("Multiplex X", "Controls the horizontal grid size for the multiplex effect.", "multiplexGridX", VERSION_HINT, 1.0, 1.0, 8.0), + new osci::EffectParameter("Multiplex Y", "Controls the vertical grid size for the multiplex effect.", "multiplexGridY", VERSION_HINT, 1.0, 1.0, 8.0), + new osci::EffectParameter("Multiplex Z", "Controls the depth grid size for the multiplex effect.", "multiplexGridZ", VERSION_HINT, 1.0, 1.0, 8.0), + new osci::EffectParameter("Multiplex Smooth", "Controls the smoothness of transitions between grid sizes.", "multiplexSmooth", VERSION_HINT, 0.0, 0.0, 1.0), + new osci::EffectParameter("Multiplex Phase", "Controls the current phase of the multiplex grid animation.", "gridPhase", VERSION_HINT, 0.0, 0.0, 1.0), + new osci::EffectParameter("Multiplex Delay", "Controls the delay of the audio samples used in the multiplex effect.", "gridDelay", VERSION_HINT, 0.0, 0.0, 1.0), }); // Set up the Grid Phase parameter with sawtooth LFO at 100Hz multiplexEffect->getParameter("gridPhase")->lfo->setUnnormalisedValueNotifyingHost((int)osci::LfoType::Sawtooth); diff --git a/Source/audio/MultiplexEffect.h b/Source/audio/MultiplexEffect.h index e4e8d30..3074981 100644 --- a/Source/audio/MultiplexEffect.h +++ b/Source/audio/MultiplexEffect.h @@ -5,13 +5,22 @@ class MultiplexEffect : public osci::EffectApplication { public: osci::Point apply(int index, osci::Point input, const std::vector>& values, double sampleRate) override { - jassert(values.size() >= 5); + jassert(values.size() >= 6); double gridX = values[0].load(); double gridY = values[1].load(); double gridZ = values[2].load(); double interpolation = values[3].load(); double phase = values[4].load(); + double gridDelay = values[5].load(); + + head++; + + if (head >= buffer.size()) { + head = 0; + } + + buffer[head] = input; osci::Point grid = osci::Point(gridX, gridY, gridZ); osci::Point gridFloor = osci::Point(std::floor(gridX), std::floor(gridY), std::floor(gridZ)); @@ -22,11 +31,18 @@ public: double totalPositions = gridFloor.x * gridFloor.y * gridFloor.z; double position = phase * totalPositions; + double delayPosition = static_cast(position) / totalPositions; + + int delayedIndex = head - static_cast(delayPosition * gridDelay * sampleRate); + if (delayedIndex < 0) { + delayedIndex += buffer.size(); + } + osci::Point delayedInput = buffer[delayedIndex % buffer.size()]; osci::Point nextGrid = gridFloor + 1.0; - osci::Point current = multiplex(input, position, gridFloor); - osci::Point next = multiplex(input, position, nextGrid); + osci::Point current = multiplex(delayedInput, position, gridFloor); + osci::Point next = multiplex(delayedInput, position, nextGrid); // Calculate interpolation factors osci::Point gridDiff = grid - gridFloor; @@ -62,4 +78,8 @@ private: return point; } + + const static int MAX_DELAY = 192000 * 10; + std::vector buffer = std::vector(MAX_DELAY); + int head = 0; };