/* ============================================================================== 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::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); } } }