void EnvelopeProcessor::writeLfoPoints(string &envState, double dStartTime, double dEndTime, double dValMin, double dValMax, LfoWaveParams &waveParams, double dPrecision, LfoWaveParams* freqModulator) { double dFreq, dDelay; getFreqDelay(waveParams, dFreq, dDelay); double dMagnitude = waveParams.strength * (1.0 - fabs(waveParams.offset)); double dOff = 0.5*(dValMax+dValMin); double dScale = dValMax - dOff; double dSamplerate; double dValue = 0.0; char buffer[BUFFER_SIZE]; EnvShape tEnvShape = eENVSHAPE_LINEAR; switch(waveParams.shape) { case eWAVSHAPE_TRIANGLE : case eWAVSHAPE_SAWUP : case eWAVSHAPE_SAWDOWN : tEnvShape = eENVSHAPE_LINEAR; break; case eWAVSHAPE_SQUARE : case eWAVSHAPE_RANDOM : tEnvShape = eENVSHAPE_SQUARE; break; case eWAVSHAPE_SINE : case eWAVSHAPE_TRIANGLE_BEZIER : case eWAVSHAPE_RANDOM_BEZIER : case eWAVSHAPE_SAWUP_BEZIER : case eWAVSHAPE_SAWDOWN_BEZIER : tEnvShape = eENVSHAPE_BEZIER; break; default: return; break; } double dPhase = 0.001*dDelay*dFreq; dPhase = dPhase - (int)(dPhase); if(dPhase<0.0) dPhase += 1.0; double dDelaySec = dPhase/dFreq; double dCarrierStart, dCarrierEnd; bool bFlipFlop; double dFlipFlop; double dLength = dEndTime - dStartTime; switch(waveParams.shape) { case eWAVSHAPE_SINE : dSamplerate = dPrecision/dFreq; dCarrierStart = WaveformGeneratorSin(0.0, dFreq, dDelaySec); dCarrierEnd = WaveformGeneratorSin(dLength, dFreq, dDelaySec); break; case eWAVSHAPE_TRIANGLE : case eWAVSHAPE_TRIANGLE_BEZIER : dSamplerate = 0.5/dFreq; dCarrierEnd = WaveformGeneratorTriangle(dLength, dFreq, dDelaySec, bFlipFlop); dCarrierStart = WaveformGeneratorTriangle(0.0, dFreq, dDelaySec, bFlipFlop); dFlipFlop = 2.0*bFlipFlop - 1.0; break; case eWAVSHAPE_SQUARE : dSamplerate = 0.5/dFreq; dCarrierEnd = WaveformGeneratorSquare(dLength, dFreq, dDelaySec, bFlipFlop); dCarrierStart = WaveformGeneratorSquare(0.0, dFreq, dDelaySec, bFlipFlop); dFlipFlop = -2.0*bFlipFlop + 1.0; break; case eWAVSHAPE_RANDOM : case eWAVSHAPE_RANDOM_BEZIER : dSamplerate = 1.0/dFreq; dCarrierStart = WaveformGeneratorRandom(0.0, dFreq, dDelaySec); dCarrierEnd = WaveformGeneratorRandom(dLength, dFreq, dDelaySec); break; case eWAVSHAPE_SAWUP : case eWAVSHAPE_SAWUP_BEZIER : dSamplerate = 1.0/dFreq; dCarrierStart = WaveformGeneratorSawUp(0.0, dFreq, dDelaySec); dCarrierEnd = WaveformGeneratorSawUp(dLength, dFreq, dDelaySec); dFlipFlop = 1.0; break; case eWAVSHAPE_SAWDOWN : case eWAVSHAPE_SAWDOWN_BEZIER : dSamplerate = 1.0/dFreq; dCarrierStart = WaveformGeneratorSawDown(0.0, dFreq, dDelaySec); dCarrierEnd = WaveformGeneratorSawDown(dLength, dFreq, dDelaySec); dFlipFlop = -1.0; break; default: return; break; } double dValueStart = waveParams.offset + dMagnitude*dCarrierStart; dValueStart = dScale*dValueStart + dOff; double dValueEnd = waveParams.offset + dMagnitude*dCarrierEnd; dValueEnd = dScale*dValueEnd + dOff; sprintf(buffer, "PT %lf %lf %d\n", dStartTime, dValueStart, tEnvShape); envState.append(buffer); //double dFreqMod = dFreq; //freqModulator = new LfoWaveParams(); //freqModulator->freqHz = dFreq/100.0; //freqModulator->strength = 0.6; switch(waveParams.shape) { case eWAVSHAPE_SINE : { for(double t = -dDelaySec; t<dLength; t += dSamplerate) { if(t>0.0) { //if(freqModulator) //{ // double dFreqCarrier = WaveformGeneratorSawUp(t, freqModulator->freqHz, 1000.0*freqModulator->delayMsec); // dFreqMod = dFreq*(1.0 + freqModulator->strength * dFreqCarrier); // // Watch out for NaNs !!! //// dSamplerate = dPrecision/dFreqMod; // dSamplerate = 0.01; //} dValue = waveParams.offset + dMagnitude*WaveformGeneratorSin(t, dFreq, dDelaySec); //dValue = waveParams.offset + dMagnitude*WaveformGeneratorSin(t, dFreqMod, dDelaySec); dValue = dScale*dValue + dOff; sprintf(buffer, "PT %lf %lf %d\n", t+dStartTime, dValue, tEnvShape); envState.append(buffer); } } } break; case eWAVSHAPE_TRIANGLE : case eWAVSHAPE_TRIANGLE_BEZIER : case eWAVSHAPE_SQUARE : { //for(double t = dStartTime-dDelaySec; t < dEndTime; t += dSamplerate) for(double t = -dDelaySec; t<dLength; t += dSamplerate) { //if(t<=dStartTime) //continue; if(t>0.0) { dValue = waveParams.offset + dMagnitude*dFlipFlop; dValue = dScale*dValue + dOff; sprintf(buffer, "PT %lf %lf %d\n", t+dStartTime, dValue, tEnvShape); envState.append(buffer); dFlipFlop = -dFlipFlop; } } } break; case eWAVSHAPE_SAWUP : case eWAVSHAPE_SAWDOWN : case eWAVSHAPE_SAWUP_BEZIER : case eWAVSHAPE_SAWDOWN_BEZIER : { for(double t = -dDelaySec; t<dLength; t += dSamplerate) { if(t>0.0) { for(int i=0; i<2; i++) { dValue = waveParams.offset + dMagnitude*dFlipFlop; dValue = dScale*dValue + dOff; sprintf(buffer, "PT %lf %lf %d\n", t+dStartTime, dValue, tEnvShape); envState.append(buffer); dFlipFlop = -dFlipFlop; } } } if(fabs(dCarrierEnd) > 0.99) { dValue = waveParams.offset + dMagnitude*dFlipFlop; dValueEnd = dScale*dValue + dOff; } } break; case eWAVSHAPE_RANDOM : case eWAVSHAPE_RANDOM_BEZIER : { for(double t = -dDelaySec; t<dLength; t += dSamplerate) { if(t>0.0) { dValue = waveParams.offset + dMagnitude*WaveformGeneratorRandom(t, dFreq, dDelaySec); dValue = dScale*dValue + dOff; sprintf(buffer, "PT %lf %lf %d\n", t+dStartTime, dValue, tEnvShape); envState.append(buffer); } } } break; default : break; } sprintf(buffer, "PT %lf %lf %d\n", dEndTime, dValueEnd, tEnvShape); envState.append(buffer); }
double WaveformGeneratorSquare(double t, double dFreq, double dDelay) { bool bFlipFlop; return WaveformGeneratorSquare(t, dFreq, dDelay, bFlipFlop); }