mindball/Source/PluginProcessor.h

78 lines
2.8 KiB
C
Raw Normal View History

2026-08-14 21:14:18 +02:00
#pragma once
#include "DelayEngine.h"
#include <JuceHeader.h>
namespace ParameterIDs
{
inline constexpr const char* feedback = "feedback";
inline constexpr const char* locut = "locut";
inline constexpr const char* hicut = "hicut";
inline constexpr const char* time = "time";
inline constexpr const char* timeSync = "timeSync";
inline constexpr const char* drywet = "drywet";
inline constexpr const char* sync = "sync";
inline constexpr const char* mode = "mode";
inline constexpr const char* doubleTap = "double";
inline constexpr const char* center = "center";
inline constexpr const char* autopan = "autopan";
inline constexpr const char* panDepth = "pandepth";
inline constexpr const char* bypass = "bypass";
}
class MindballAudioProcessor : public juce::AudioProcessor
{
public:
MindballAudioProcessor();
~MindballAudioProcessor() override = default;
juce::AudioProcessorValueTreeState apvts;
void prepareToPlay (double sampleRate, int samplesPerBlock) override;
void releaseResources() override;
bool isBusesLayoutSupported (const BusesLayout& layouts) const override;
void processBlock (juce::AudioBuffer<float>&, juce::MidiBuffer&) override;
juce::AudioProcessorEditor* createEditor() override;
bool hasEditor() const override;
const juce::String getName() const override;
bool acceptsMidi() const override;
bool producesMidi() const override;
double getTailLengthSeconds() const override;
int getNumPrograms() override;
int getCurrentProgram() override;
void setCurrentProgram (int index) override;
const juce::String getProgramName (int index) override;
void changeProgramName (int index, const juce::String& newName) override;
void getStateInformation (juce::MemoryBlock& destData) override;
void setStateInformation (const void* data, int sizeInBytes) override;
2026-08-15 13:54:42 +02:00
double getCurrentBpm() const;
2026-08-14 21:14:18 +02:00
float getDryMeterL() const { return dryMeterL.load (std::memory_order_relaxed); }
float getDryMeterR() const { return dryMeterR.load (std::memory_order_relaxed); }
float getWetMeterL() const { return wetMeterL.load (std::memory_order_relaxed); }
float getWetMeterR() const { return wetMeterR.load (std::memory_order_relaxed); }
private:
static juce::AudioProcessorValueTreeState::ParameterLayout createParameterLayout();
static constexpr double maxDelaySeconds = 16.0;
mindball::DelayEngine engine;
bool wasBypassed = false;
juce::AudioBuffer<float> wetScratch;
float meterDryL = 0.0f, meterDryR = 0.0f;
float meterWetL = 0.0f, meterWetR = 0.0f;
float meterDecay = 0.0f;
2026-08-15 13:54:42 +02:00
std::atomic<double> lastBpm { 120.0 };
2026-08-14 21:14:18 +02:00
std::atomic<float> dryMeterL { 0.0f }, dryMeterR { 0.0f };
std::atomic<float> wetMeterL { 0.0f }, wetMeterR { 0.0f };
};