#ifndef __Patch_h__
#define __Patch_h__
#include "device.h"
#include "basicmaths.h"
#include "Resource.h"
#include "FloatArray.h"
#include "PatchParameter.h"
#include "SmoothValue.h"
#include "AudioBuffer.h"
#include "OpenWareMidiControl.h"
#ifdef USE_MIDI_CALLBACK
#include "MidiMessage.h"
#endif
enum PatchChannelId {
LEFT_CHANNEL = 0,
RIGHT_CHANNEL = 1
};
class Patch {
public:
Patch();
virtual ~Patch();
static const float EXP;
static const float LIN;
static const float LOG;
static const uint16_t ON;
static const uint16_t OFF;
FloatParameter getParameter(const char* name, float defaultValue);
FloatParameter getFloatParameter(const char* name, float min, float max, float defaultValue=0.0f, float lambda=0.0f, float delta=0.0, float skew=LIN);
IntParameter getIntParameter(const char* name, int min, int max, int defaultValue=0, float lambda=0.0f, float delta=0.0, float skew=LIN);
void registerParameter(PatchParameterId pid, const char* name);
[[deprecated]]
void registerParameter(PatchParameterId pid, const char* name, const char* desc){
registerParameter(pid, name);
}
float getParameterValue(PatchParameterId pid);
void setParameterValue(PatchParameterId pid, float value);
bool isButtonPressed(PatchButtonId bid);
[[deprecated]]
int getSamplesSinceButtonPressed(PatchButtonId bid);
void setButton(PatchButtonId bid, uint16_t value, uint16_t samples=0);
int getBlockSize();
int getNumberOfChannels();
float getSampleRate();
float getBlockRate();
AudioBuffer* createMemoryBuffer(int channels, int samples);
float getElapsedBlockTime();
int getElapsedCycles();
[[deprecated]]
virtual void encoderChanged(PatchParameterId pid, int16_t delta, uint16_t samples){};
virtual void buttonChanged(PatchButtonId bid, uint16_t value, uint16_t samples){}
virtual void processAudio(AudioBuffer& audio) = 0;
#ifdef USE_MIDI_CALLBACK
virtual void processMidi(MidiMessage msg);
virtual void sendMidi(MidiMessage msg);
#endif
Resource* getResource(const char* name);
};
#endif