Beispiel #1
0
char* PadresGetEnvelopeState(TrackEnvelope* envelope)
{
	//! \note GetSetObjectState() does not work for take envelopes
	// While loop shamelessly stolen from SWS! :)
	if(!envelope)
		return NULL;

	char* envState = NULL;
	int iEnvStateMaxSize = 65536;
	int iEnvStateSize = 256;
	while(true)
	{
		envState = (char*)realloc(envState, iEnvStateSize);
		envState[0] = 0;
		bool bRes = GetSetEnvelopeState(envelope, envState, iEnvStateSize);
		if(bRes && (strlen(envState)!=iEnvStateSize-1))
			break;
		if (!bRes || (iEnvStateSize>=iEnvStateMaxSize))
		{
			free(envState);
			return NULL;
		}
		iEnvStateSize *= 2;
	}
	return envState;

}
Beispiel #2
0
EnvelopeProcessor::ErrorCode EnvelopeProcessor::processTakeEnv(MediaItem_Take* take, double dStartPos, double dEndPos, TakeEnvType tTakeEnvType, EnvModType envModType, double dStrength, double dOffset)
{
	double dValMin = 0.0;
	double dValMax = 1.0;
	bool bNeedUpdate = false;
	switch(tTakeEnvType)
	{
		case eTAKEENV_VOLUME :
			dValMax = 2.0;
			bNeedUpdate = ShowTakeEnvVol(take);
		break;
		case eTAKEENV_PAN :
			dValMin = -1.0;
			bNeedUpdate = ShowTakeEnvPan(take);
		break;
		case eTAKEENV_MUTE :
			bNeedUpdate = ShowTakeEnvMute(take);
		break;
		case eTAKEENV_PITCH :
			dValMax = (double)GetPitchTakeEnvRangeFromPrefs();
			dValMin = dValMax * (-1);
			bNeedUpdate = ShowTakeEnvPitch(take);
		break;
		default:
		break;
	}

	if(bNeedUpdate)
		UpdateTimeline();

	TrackEnvelope* envelope = SWS_GetTakeEnvelopeByName(take, GetTakeEnvelopeStr(tTakeEnvType));
	if(!envelope)
		return eERRORCODE_NOENVELOPE;

	char* envState = PadresGetEnvelopeState(envelope);
	string newState;
	ErrorCode res = processPoints(envState, newState, dStartPos, dEndPos, dValMin, dValMax, envModType, dStrength, dOffset);
	free(envState);

	if(!newState.size() || !GetSetEnvelopeState(envelope, (char*)newState.c_str(), (int)newState.size()))
		res = eERRORCODE_UNKNOWN;

/*JFB
	Undo_OnStateChangeEx("Take Envelope LFO", UNDO_STATE_ALL, -1);
*/
	return res;
}
Beispiel #3
0
EnvelopeProcessor::ErrorCode EnvelopeProcessor::generateTakeLfo(MediaItem_Take* take, double dStartPos, double dEndPos, TakeEnvType tTakeEnvType, LfoWaveParams &waveParams, double dPrecision)
{
	double dValMin = 0.0;
	double dValMax = 1.0;
	bool bNeedUpdate = false;
	switch(tTakeEnvType)
	{
		case eTAKEENV_VOLUME :
			dValMax = 2.0;
			bNeedUpdate = ShowTakeEnvVol(take);
		break;
		case eTAKEENV_PAN :
			dValMin = -1.0;
			bNeedUpdate = ShowTakeEnvPan(take);
		break;
		case eTAKEENV_MUTE :
			bNeedUpdate = ShowTakeEnvMute(take);
		break;
		case eTAKEENV_PITCH:
			dValMax = (double)GetPitchTakeEnvRangeFromPrefs();
			dValMin = dValMax * (-1);
			bNeedUpdate = ShowTakeEnvPitch(take);
		break;
		default:
		break;
	}

	if(bNeedUpdate)
		UpdateTimeline();

	TrackEnvelope* envelope = SWS_GetTakeEnvelopeByName(take, GetTakeEnvelopeStr(tTakeEnvType));
	if(!envelope)
		return eERRORCODE_NOENVELOPE;

	//if(dStartPos==dEndPos)
	//	return eERRORCODE_NULLTIMESELECTION;

	string newState;
	char* envState = PadresGetEnvelopeState(envelope);
	if(!envState)
		return eERRORCODE_NOOBJSTATE;
	double dTmp[2];
	int iTmp;
	char* token = strtok(envState, "\n");
	while(token != NULL)
	{
		// Position, value, shape
		if(sscanf(token, "PT %lf %lf %d\n", &dTmp[0], &dTmp[1], &iTmp) == 3)
		{
			if(dTmp[0]>=dEndPos)
				break;
			if(dTmp[0]>dStartPos)
			{
				token = strtok(NULL, "\n");
				continue;
			}
		}

		if(!strcmp(token, ">"))
			break;

		newState.append(token);
		newState.append("\n");
		token = strtok(NULL, "\n");
	}

	writeLfoPoints(newState, dStartPos, dEndPos, dValMin, dValMax, waveParams, dPrecision);

	newState.append(token);
	newState.append("\n");
	token = strtok(NULL, "\n");
	while(token != NULL)
	{
		newState.append(token);
		newState.append("\n");
		token = strtok(NULL, "\n");
	}



//
//ShowConsoleMsg(envState);

/*
//double dCursorPos = GetCursorPositionEx(0);
	Main_OnCommandEx(ID_GOTO_SELITEM_END, 0, 0);
	double dEndTime = GetCursorPositionEx(0);
	Main_OnCommandEx(ID_GOTO_SELITEM_START, 0, 0);
	double dStartTime = GetCursorPositionEx(0);
//SetEditCurPos2(0, dCursorPos, true, false);

	if (dStartTime==dEndTime)
		return eERRORCODE_NULLTIMESELECTION;

	double dLength = dEndTime - dStartTime;
*/

// Doesn't work when item is looped
//PCM_source* source = GetMediaItemTake_Source(take);
//double dLength = source->GetLength();
//if(dLength <= 0.0)
//	return eERRORCODE_NULLTIMESELECTION;

/*
	string newState;
	newState.append("<TRACK_ENVELOPE_UNKNOWN\n");
	newState.append("ACT 1\n");
	newState.append("VIS 1 1 1.000000\n");
	newState.append("LANEHEIGHT 0 0\n");
	newState.append("ARM 1\n");
	newState.append("DEFSHAPE 0\n");
	//writeLfoPoints(newState, 0.0, dLength, dValMin, dValMax, dFreq, dStrength, dOffset, dDelay, tWaveShape, dPrecision);
writeLfoPoints(newState, dStartPos, dEndPos, dValMin, dValMax, dFreq, dStrength, dOffset, dDelay, tWaveShape, dPrecision);
	newState.append(">\n");
*/
	free(envState);
	if(!newState.size() || !GetSetEnvelopeState(envelope, (char*)newState.c_str(), (int)newState.size()))
		return eERRORCODE_UNKNOWN;

/* JFB commented: "recursive" undo point, enabled at top level
	Undo_OnStateChangeEx("Take Envelope LFO", UNDO_STATE_ALL, -1);
*/
	return eERRORCODE_OK;
}