sfizz/sources/Voice.h
2019-08-23 15:46:02 +02:00

67 lines
No EOL
1.7 KiB
C++

#pragma once
#include "StereoBuffer.h"
#include "Globals.h"
#include "Region.h"
#include <atomic>
#include <memory>
namespace sfz
{
class Voice
{
public:
enum class TriggerType { NoteOn, NoteOff, CC };
void startVoice(Region* region, int channel, int number, uint8_t value, TriggerType triggerType)
{
this->triggerType = triggerType;
triggerNumber = number;
triggerChannel = channel;
triggerValue = value;
this->region = region;
}
void setFileData(std::unique_ptr<StereoBuffer<float>> file)
{
fileData = std::move(file);
dataReady.store(true);
}
bool isFree()
{
return (region == nullptr);
}
void registerNoteOn(int delay, int channel, int noteNumber, uint8_t velocity);
bool registerNoteOff(int delay, int channel, int noteNumber, uint8_t velocity);
bool registerCC(int delay, int channel, int ccNumber, uint8_t ccValue);
void registerPitchWheel(int delay, int channel, int pitch);
void registerAftertouch(int delay, int channel, uint8_t aftertouch);
void registerTempo(int delay, float secondsPerQuarter);
void prepareToPlay(int samplesPerBlock, double sampleRate);
void renderBlock(StereoBuffer<float>& buffer)
{
buffer.fill(0.0f);
}
void reset()
{
dataReady.store(false);
}
private:
Region* region;
TriggerType triggerType;
int triggerNumber;
int triggerChannel;
uint8_t triggerValue;
std::atomic<bool> dataReady;
std::unique_ptr<StereoBuffer<float>> fileData;
int samplesPerBlock { config::defaultSamplesPerBlock };
double sampleRate { config::defaultSampleRate };
};
}