Example #1
0
void RMSNormalizeAll(double dTargetDb, double dWindowSize)
{
	WDL_TypedBuf<MediaItem*> items;
	SWS_GetSelectedMediaItems(&items);
	double dMaxRMS = -DBL_MAX;
	ANALYZE_PCM a;
	memset(&a, 0, sizeof(a));
	a.dWindowSize = dWindowSize;

	for (int i = 0; i < items.GetSize(); i++)
	{
		MediaItem* mi = items.Get()[i];
		MediaItem_Take* take = GetMediaItemTake(mi, -1);
		if (take && AnalyzeItem(mi, &a) && a.dRMS != 0.0 && a.dRMS > dMaxRMS)
			dMaxRMS = a.dRMS;
	}

	if (dMaxRMS > -DBL_MAX)
	{
		for (int i = 0; i < items.GetSize(); i++)
		{
			MediaItem* mi = items.Get()[i];
			MediaItem_Take* take = GetMediaItemTake(mi, -1);
			if (take)
			{
				double dVol = *(double*)GetSetMediaItemTakeInfo(take, "D_VOL", NULL);
				dVol *= DB2VAL(dTargetDb) / dMaxRMS;
				GetSetMediaItemTakeInfo(take, "D_VOL", &dVol);
			}
		}
		UpdateTimeline();
		Undo_OnStateChangeEx(__LOCALIZE("Normalize items to RMS","sws_undo"), UNDO_STATE_ITEMS, -1);
	}
}
Example #2
0
void OrganizeByVol(COMMAND_T* ct)
{
	for (int iTrack = 1; iTrack <= GetNumTracks(); iTrack++)
	{
		WDL_TypedBuf<MediaItem*> items;
		SWS_GetSelectedMediaItemsOnTrack(&items, CSurf_TrackFromID(iTrack, false));
		if (items.GetSize() > 1)
		{
			double dStart = *(double*)GetSetMediaItemInfo(items.Get()[0], "D_POSITION", NULL);
			double* pVol = new double[items.GetSize()];
			ANALYZE_PCM a;
			memset(&a, 0, sizeof(a));
			if (ct->user == 2)
			{	// Windowed mode, set the window size
				char str[100];
				GetPrivateProfileString(SWS_INI, SWS_RMS_KEY, "-20,0.1", str, 100, get_ini_file());
				char* pWindow = strchr(str, ',');
				a.dWindowSize = pWindow ? atof(pWindow+1) : 0.1;
			}
			for (int i = 0; i < items.GetSize(); i++)
			{
				pVol[i] = -1.0;
				if (AnalyzeItem(items.Get()[i], &a))
					pVol[i] = ct->user ? a.dRMS : a.dPeakVal;
			}
			// Sort and arrange items from min to max RMS
			while (true)
			{
				int iItem = -1;
				double dMinVol = 1e99;
				for (int i = 0; i < items.GetSize(); i++)
					if (pVol[i] >= 0.0 && pVol[i] < dMinVol)
					{
						dMinVol = pVol[i];
						iItem = i;
					}
				if (iItem == -1)
					break;
				pVol[iItem] = -1.0;
				GetSetMediaItemInfo(items.Get()[iItem], "D_POSITION", &dStart);
				dStart += *(double*)GetSetMediaItemInfo(items.Get()[iItem], "D_LENGTH", NULL);
			}
			delete [] pVol;
			UpdateTimeline();
			Undo_OnStateChangeEx(SWS_CMD_SHORTNAME(ct), UNDO_STATE_ITEMS, -1);
		}
	}
}
Example #3
0
void DoAnalyzeItem(COMMAND_T*)
{
	WDL_TypedBuf<MediaItem*> items;
	SWS_GetSelectedMediaItems(&items);
	bool bDidWork = false;
	for (int i = 0; i < items.GetSize(); i++)
	{
		MediaItem* mi = items.Get()[i];
		int iChannels = ((PCM_source*)mi)->GetNumChannels();
		if (iChannels)
		{
			bDidWork = true;
			ANALYZE_PCM a;
			memset(&a, 0, sizeof(a));
			a.iChannels = iChannels;
			a.dPeakVals = new double[iChannels];
			a.dRMSs     = new double[iChannels];

			if (AnalyzeItem(mi, &a))
			{
				WDL_String str;
				str.Set(__LOCALIZE("Peak level:","sws_analysis"));
				for (int i = 0; i < iChannels; i++) {
					str.Append(" ");
					str.AppendFormatted(50, __LOCALIZE_VERFMT("Channel %d = %.2f dB","sws_analysis"), i+1, VAL2DB(a.dPeakVals[i]));
				}
				str.Append("\n");
				str.Append(__LOCALIZE("RMS level:","sws_analysis"));
				for (int i = 0; i < iChannels; i++) {
					str.Append(" ");
					str.AppendFormatted(50, __LOCALIZE_VERFMT("Channel %d = %.2f dB","sws_analysis"), i+1, VAL2DB(a.dRMSs[i]));
				}
				MessageBox(g_hwndParent, str.Get(), __LOCALIZE("Item analysis","sws_analysis"), MB_OK);
			}
			delete [] a.dPeakVals;
			delete [] a.dRMSs;
		}
	}
	if (!bDidWork)
	{
		MessageBox(NULL, __LOCALIZE("No items selected to analyze.","sws_analysis"), __LOCALIZE("SWS - Error","sws_analysis"), MB_OK);
		return;
	}
}
Example #4
0
void FindItemPeak(COMMAND_T*)
{
	// Just use the first item
	MediaItem* mi = GetSelectedMediaItem(NULL, 0);
	if (mi)
	{
		ANALYZE_PCM a;
		memset(&a, 0, sizeof(a));
		if (AnalyzeItem(mi, &a))
		{
			double dSrate = ((PCM_source*)mi)->GetSampleRate();
			double dPos = *(double*)GetSetMediaItemInfo(mi, "D_POSITION", NULL);
			dPos += a.peakSample / dSrate;
			SetEditCurPos(dPos, true, false);
		}
	}
	else
		MessageBox(NULL, __LOCALIZE("No items selected to analyze.","sws_analysis"), __LOCALIZE("SWS - Error","sws_analysis"), MB_OK);
}
Example #5
0
//=============================================================================
bool CRpgLdb::Init(const char* szDir)
{
	int type;
	std::string strFile;
	if(strlen(szDir)){
		rootFolder_ = szDir;
		strFile += szDir;
		strFile += "/";
	}
	strFile += "RPG_RT.ldb";

	bInit = false;

	// セーブデータじゃない
	if(!OpenFile(strFile.c_str()))		return false;


	// データを読み込む
	while(!IsEof()){
		type = ReadBerNumber();
		sueLib::smart_buffer buf = ReadData();

		switch(type){
		case 11:	// 主人公
			AnalyzePlayer(buf);
			break;
		case 12:	// 特殊技能
			AnalyzeSkill(buf);
			break;
		case 13:	// アイテム
			AnalyzeItem(buf);
			break;
		case 14:	// 敵キャラ
			AnalyzeEnemy(buf);
			break;
		case 15:	// 敵グループ
			AnalyzeEnemyGroup(buf);
			break;
		case 16:	// 地形
			AnalyzeTerrain(buf);
			break;
		case 17:	// 属性
			AnalyzeAttribute(buf);
			break;
		case 18:	// 状態
			AnalyzeCondition(buf);
			break;
		case 19:	// 戦闘アニメ
			AnalyzeBattleAnime(buf);
			break;
		case 20:	// チップセット
			AnalyzeChipSet(buf);
			break;
		case 21:	// 用語
			AnalyzeTerm(buf);
			break;
		case 22:	// システム
			AnalyzeSystem(buf);
			break;
		case 23:	// スイッチ
			AnalyzeSwitch(buf);
			break;
		case 24:	// 変数
			AnalyzeVariable(buf);
			break;
		case 25:	// コモンイベント
			AnalyzeCommonEvent(buf);
			break;
		}
	}

	bInit = true;
	return true;
}