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; }
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; }
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; }