Magical8bitPlug2/Source/PulseVoice.cpp
Takeshi Yokemura 915f9eb5bf Custom Waveform
2021-08-15 20:41:01 +09:00

93 lines
2.6 KiB
C++

/*
==============================================================================
PulseVoice.cpp
Created: 11 Nov 2019 9:36:51pm
Author: 除村 武志
==============================================================================
*/
#include "PulseVoice.h"
//---------------------------------------------
//
// Pulse Voice
//
//---------------------------------------------
PulseVoice::PulseVoice (SettingRefs* sRefs) : TonalVoice (sRefs) {}
void PulseVoice::startNote (int midiNoteNumber, float velocity, SynthesiserSound*, int currentPitchBendPosition)
{
TonalVoice::startNote (midiNoteNumber, velocity, 0, currentPitchBendPosition);
currentDutySequenceFrame = 0;
currentDuty = (PulseDuty) ((int) (*settingRefs->duty));
}
float PulseVoice::voltageForAngle (double angle)
{
float rate = 1.0;
switch (currentDuty)
{
case kPulseDuty125:
rate = 0.25;
break;
case kPulseDuty250:
rate = 0.50;
break;
case kPulseDuty500:
rate = 1.00;
break;
default:
break;
}
return angle < rate * MathConstants<float>::pi ? -1.0 : 1.0;
}
void PulseVoice::advanceControlFrame()
{
TonalVoice::advanceControlFrame();
if (settingRefs->isDutySequenceEnabled())
{
//currentDutySequenceFrame = settingRefs->dutySequence.nextIndexOf(currentDutySequenceFrame);
//currentDuty = (PulseDuty)settingRefs->dutySequence.valueAt(currentDutySequenceFrame);
int currentDutySequenceFrameTmp = settingRefs->dutySequence.nextIndexOf(currentDutySequenceFrame);
if (currentDutySequenceFrameTmp != FrameSequence::SHOULD_RETIRE)
{
currentDutySequenceFrame = currentDutySequenceFrameTmp;
currentDuty = (PulseDuty)settingRefs->dutySequence.valueAt(currentDutySequenceFrame);
}
}
}
void PulseVoice::stopNote(float velocity, bool allowTailOff)
{
TonalVoice::stopNote(velocity, allowTailOff);
if (!allowTailOff)
{
return;
}
if (settingRefs->isDutySequenceEnabled())
{
if (settingRefs->dutySequence.hasRelease)
{
if (settingRefs->dutySequence.isInRelease(currentDutySequenceFrame)) {
// Already in release(Custom Env.)
return;
}
currentDutySequenceFrame = settingRefs->dutySequence.releaseSequenceStartIndex;
currentDuty = (PulseDuty)settingRefs->dutySequence.valueAt(currentDutySequenceFrame);
}
}
}