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); } }
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); } } }
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; } }
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); }
//============================================================================= 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; }