sfizz/sources/Voice.h

105 lines
2.4 KiB
C
Raw Normal View History

2019-07-29 02:13:03 +02:00
#pragma once
#include "StereoBuffer.h"
2019-08-24 02:46:40 +02:00
#include "StereoSpan.h"
2019-08-23 01:27:39 +02:00
#include "Globals.h"
#include "Region.h"
#include <atomic>
#include <memory>
2019-07-29 02:13:03 +02:00
namespace sfz
{
class Voice
{
public:
2019-08-23 01:27:39 +02:00
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);
}
2019-08-23 01:27:39 +02:00
2019-08-23 14:16:33 +02:00
bool isFree()
{
return (region == nullptr);
}
2019-08-24 02:46:40 +02:00
void registerNoteOff(int delay [[maybe_unused]], int channel [[maybe_unused]], int noteNumber [[maybe_unused]], uint8_t velocity [[maybe_unused]])
{
}
void registerCC(int delay [[maybe_unused]], int channel [[maybe_unused]], int ccNumber [[maybe_unused]], uint8_t ccValue [[maybe_unused]])
{
}
2019-08-23 01:27:39 +02:00
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);
2019-08-24 02:46:40 +02:00
void renderBlock(StereoSpan<float> buffer)
2019-08-23 01:27:39 +02:00
{
buffer.fill(0.0f);
}
2019-08-23 20:48:44 +02:00
bool checkOffGroup(int delay [[maybe_unused]], uint32_t group) noexcept
{
if (region != nullptr && triggerType == TriggerType::NoteOn && region->offBy && *region->offBy == group )
{
// TODO: release
return true;
}
return false;
}
int getTriggerNumber() const
{
return triggerNumber;
}
int getTriggerChannel() const
{
return triggerNumber;
}
uint8_t getTriggerValue() const
{
return triggerNumber;
}
TriggerType getTriggerType() const
{
return triggerType;
}
2019-08-23 01:27:39 +02:00
void reset()
{
dataReady.store(false);
}
2019-07-29 02:13:03 +02:00
private:
2019-08-23 01:27:39 +02:00
Region* region;
TriggerType triggerType;
int triggerNumber;
int triggerChannel;
uint8_t triggerValue;
std::atomic<bool> dataReady;
std::unique_ptr<StereoBuffer<float>> fileData;
2019-08-23 01:27:39 +02:00
int samplesPerBlock { config::defaultSamplesPerBlock };
double sampleRate { config::defaultSampleRate };
2019-07-29 02:13:03 +02:00
};
2019-08-23 01:27:39 +02:00
2019-07-29 02:13:03 +02:00
}