示例#1
0
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);
}
示例#2
0
double WaveformGeneratorSquare(double t, double dFreq, double dDelay)
{
	 bool bFlipFlop;
	 return WaveformGeneratorSquare(t, dFreq, dDelay, bFlipFlop);
}