From: <sag...@us...> - 2009-07-26 21:59:51
|
Revision: 304 http://modplug.svn.sourceforge.net/modplug/?rev=304&view=rev Author: saga-games Date: 2009-07-26 21:59:23 +0000 (Sun, 26 Jul 2009) Log Message: ----------- [Fix] Wav Export / Channel Manager / Pattern Editor: Pattern names with leading space char are now accepted [Fix] MOD/XM Saver: F20 won't turn into G20 [Ref] Code refactoring: Added "CLAMP" macro - similar to Limit(), but returns a value. Changed many routines in sndmix, snd_fx and mod loaders to use CLAMP. [Fix] General tab / Main bar / Loaders / Conversion: Fixed arbitrary speed limits (64 on general tab, 127 on main bar). Added speedMin and speedMax to ModSpecs as they are different for MOD/XM and S3M/IT/MPTM. [Imp] Default dirs: Don't overwrite working directory when updating the default directory [Ref] S3M Loader: Less arbitrary value limits, code refactoring [Fix] IT / XM Compatiblity: Tempo slides won't exceed 255 BPM in compatible mode. [Fix] XM Compatiblity: In compatible mode, old retrigger routines are used again (as MPT's default retrigger algorithm actually represents FT2's retrigger algorithm). Additionally, a retrigger bug from FT2 is emulated (retrigger with vxx on the same channel would always reset the retriggered note's volume) [Fix] IT Compatibility: Allow OpenMPT's new volume colum commands (offset etc.) to be used together with Retrigger in compatible mode again Modified Paths: -------------- trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainbar.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/misc_util.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/mod_specifications.h Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp =================================================================== --- trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp 2009-07-26 21:59:23 UTC (rev 304) @@ -775,7 +775,7 @@ ii = pattern[i]; - if(m_pSndFile->ChnSettings[ii].szName[0] > 0x20) + if(m_pSndFile->ChnSettings[ii].szName[0] >= 0x20) wsprintf(s, "%d: %s", (ii+1), m_pSndFile->ChnSettings[ii].szName); else wsprintf(s, "Channel %d", ii+1); Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2009-07-26 21:59:23 UTC (rev 304) @@ -7,11 +7,12 @@ #include "ctrl_gen.h" #include "view_gen.h" #include "math.h" +#include "misc_util.h" // -> CODE#0015 // -> DESC="channels management dlg" #include "Ctrl_pat.h" -#include ".\ctrl_gen.h" +#include "ctrl_gen.h" // -! NEW_FEATURE#0015 BEGIN_MESSAGE_MAP(CCtrlGeneral, CModControlDlg) @@ -91,9 +92,8 @@ // -> CODE#0016 // -> DESC="default tempo update" // m_SpinTempo.SetRange(32, 255); // 255 bpm max - //m_SpinTempo.SetRange(32, 512); - m_SpinTempo.SetRange(specs.tempoMin, specs.tempoMax); - m_SpinSpeed.SetRange(1, 64); + m_SpinTempo.SetRange((short)specs.tempoMin, (short)specs.tempoMax); + m_SpinSpeed.SetRange((short)specs.speedMin, (short)specs.speedMax); // -! BEHAVIOUR_CHANGE#0016 m_SpinGlobalVol.SetRange(0, 128); m_SpinSamplePA.SetRange(0, 2000); @@ -341,9 +341,8 @@ m_EditTempo.GetWindowText(s, sizeof(s)); if (s[0]) { - UINT n = atoi(s); - CModSpecifications specs = m_pSndFile->GetModSpecifications(); - if ((n >= specs.tempoMin) && (n <= specs.tempoMax) && (n != m_pSndFile->m_nDefaultTempo)) + UINT n = CLAMP(atoi(s), m_pSndFile->GetModSpecifications().tempoMin, m_pSndFile->GetModSpecifications().tempoMax); + if (n != m_pSndFile->m_nDefaultTempo) { m_bEditsLocked=true; m_EditTempo.SetModify(FALSE); @@ -368,8 +367,8 @@ m_EditSpeed.GetWindowText(s, sizeof(s)); if (s[0]) { - UINT n = atoi(s); - if ((n >= 1) && (n <= 64) && (n != m_pSndFile->m_nDefaultSpeed)) { + UINT n = CLAMP(atoi(s), m_pSndFile->GetModSpecifications().speedMin, m_pSndFile->GetModSpecifications().speedMax); + if (n != m_pSndFile->m_nDefaultSpeed) { m_bEditsLocked=true; m_EditSpeed.SetModify(FALSE); m_pSndFile->m_nDefaultSpeed = n; @@ -390,8 +389,8 @@ if ((m_pSndFile) && (m_pModDoc) && (m_bInitialized)) { m_EditVSTiVol.GetWindowText(s, sizeof(s)); if (s[0]) { - int n = atoi(s); - if ((n >= 0) && (n <= 2000) && (n != m_pSndFile->m_nVSTiVolume)) { + int n = CLAMP(atoi(s), 0, 2000); + if (n != m_pSndFile->m_nVSTiVolume) { m_bEditsLocked=true; m_pSndFile->m_nVSTiVolume = n; m_pSndFile->RecalculateGainForAllPlugs(); @@ -411,8 +410,8 @@ if ((m_pSndFile) && (m_pModDoc) && (m_bInitialized)) { m_EditSamplePA.GetWindowText(s, sizeof(s)); if (s[0]) { - int n = atoi(s); - if ((n >= 0) && (n <= 2000) && (n != m_pSndFile->m_nSamplePreAmp)) { + int n = CLAMP(atoi(s), 0, 2000); + if (n != m_pSndFile->m_nSamplePreAmp) { m_bEditsLocked=true; m_pSndFile->m_nSamplePreAmp = n; m_pModDoc->SetModified(); @@ -433,21 +432,17 @@ m_EditGlobalVol.GetWindowText(s, sizeof(s)); if (s[0]) { - UINT n = atoi(s); - if (n <= 128) - { - UINT n0 = m_pSndFile->m_nDefaultGlobalVolume / 2; - if (n != n0) - { - m_bEditsLocked=true; - m_EditGlobalVol.SetModify(FALSE); - m_pSndFile->m_nDefaultGlobalVolume = n << 1; - m_pSndFile->m_nGlobalVolume = n << 1; - m_pModDoc->SetModified(); - m_pModDoc->UpdateAllViews(NULL, HINT_MODGENERAL, this); - UpdateView(HINT_MODGENERAL, NULL); - m_bEditsLocked=false; - } + UINT n = CLAMP(atoi(s), 0, 128); + if (n != (m_pSndFile->m_nDefaultGlobalVolume >> 1)) + { + m_bEditsLocked=true; + m_EditGlobalVol.SetModify(FALSE); + m_pSndFile->m_nDefaultGlobalVolume = n << 1; + m_pSndFile->m_nGlobalVolume = n << 1; + m_pModDoc->SetModified(); + m_pModDoc->UpdateAllViews(NULL, HINT_MODGENERAL, this); + UpdateView(HINT_MODGENERAL, NULL); + m_bEditsLocked=false; } } } @@ -463,17 +458,16 @@ m_EditRestartPos.GetWindowText(s, sizeof(s)); if (s[0]) { - UINT n = atoi(s); - if(n < m_pSndFile->Order.size()) + UINT n = CLAMP(atoi(s), 0, m_pSndFile->Order.size()); + for (ORDERINDEX i = 0; i <= n; i++) + if (m_pSndFile->Order[i] == m_pSndFile->Order.GetInvalidPatIndex()) return; + + if (n != m_pSndFile->m_nRestartPos) { - for (ORDERINDEX i=0; i<=n; i++) if (m_pSndFile->Order[i] == m_pSndFile->Order.GetInvalidPatIndex()) return; - if (n != m_pSndFile->m_nRestartPos) - { - m_EditRestartPos.SetModify(FALSE); - m_pSndFile->m_nRestartPos = n; - m_pModDoc->SetModified(); - m_pModDoc->UpdateAllViews(NULL, HINT_MODGENERAL, this); - } + m_EditRestartPos.SetModify(FALSE); + m_pSndFile->m_nRestartPos = n; + m_pModDoc->SetModified(); + m_pModDoc->UpdateAllViews(NULL, HINT_MODGENERAL, this); } } } @@ -490,25 +484,6 @@ //---------------------------------- { m_pModDoc->SongProperties(); - /* - CModTypeDlg dlg(m_pSndFile, this); - if (dlg.DoModal() == IDOK) - { - BOOL bShowLog = FALSE; - m_pModDoc->ClearLog(); - if(dlg.m_nType) { - if (!m_pModDoc->ChangeModType(dlg.m_nType)) return; - bShowLog = TRUE; - } - if ((dlg.m_nChannels >= 4) && (dlg.m_nChannels != m_pSndFile->m_nChannels)) { - if(m_pModDoc->ChangeNumChannels(dlg.m_nChannels)) bShowLog = TRUE; - if(CChannelManagerDlg::sharedInstance(FALSE) && CChannelManagerDlg::sharedInstance()->IsDisplayed()) - CChannelManagerDlg::sharedInstance()->Update(); - } - if (bShowLog) m_pModDoc->ShowLog("Conversion Status", this); - m_pModDoc->SetModified(); - } - */ } @@ -732,13 +707,10 @@ for (int ry=rect.bottom-1; ry>rect.top; ry-=2) { int y0 = rect.bottom - ry; - int n = (y0 * NUM_VUMETER_PENS) / cy; - if (n < 0) n = 0; - if (n >= NUM_VUMETER_PENS) n = NUM_VUMETER_PENS-1; + int n = CLAMP((y0 * NUM_VUMETER_PENS) / cy, 0, NUM_VUMETER_PENS - 1); if (vu < y0) - { n += NUM_VUMETER_PENS; - } + SelectObject(hdc, CMainFrame::gpenVuMeter[n]); MoveToEx(hdc, rect.left, ry, NULL); LineTo(hdc, rect.right, ry); Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-07-26 21:59:23 UTC (rev 304) @@ -479,7 +479,7 @@ const char *pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]? "[Channel %d]" : "Channel %d"; // const char *pszfmt = pModDoc->IsChannelRecord(ncolhdr) ? "Channel %d " : "Channel %d"; // -! NEW_FEATURE#0012 - if ((pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) && ((BYTE)pSndFile->ChnSettings[ncolhdr].szName[0] > 0x20)) + if ((pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) && ((BYTE)pSndFile->ChnSettings[ncolhdr].szName[0] >= 0x20)) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"%d: [%s]":"%d: %s"; else if (m_nDetailLevel < 2) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"[Ch%d]":"Ch%d"; else if (m_nDetailLevel < 3) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"[Chn %d]":"Chn %d"; Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-07-26 21:59:23 UTC (rev 304) @@ -3053,8 +3053,8 @@ _tcscpy(directories[dir], szPath); - // When updating default directory, also update the working directory. - if(szPath[0] && directories == m_szDefaultDirectory) + // When updating default directory, also update the working directory (if it hasn't been set yet). + if(szPath[0] && directories == m_szDefaultDirectory && !m_szWorkingDirectory[dir][0]) SetWorkingDirectory(szPath, dir); } Modified: trunk/OpenMPT/mptrack/Mainbar.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mainbar.cpp 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/mptrack/Mainbar.cpp 2009-07-26 21:59:23 UTC (rev 304) @@ -495,9 +495,9 @@ if ((n = (short int)m_SpinTempo.GetPos()) != 0) { if (n < 0) - pSndFile->SetTempo(nCurrentTempo - 1, true); + pSndFile->SetTempo(max(nCurrentTempo - 1, pSndFile->GetModSpecifications().tempoMin), true); else - pSndFile->SetTempo(nCurrentTempo + 1, true); + pSndFile->SetTempo(min(nCurrentTempo + 1, pSndFile->GetModSpecifications().tempoMax), true); m_SpinTempo.SetPos(0); } @@ -505,16 +505,10 @@ { if (n < 0) { - if (nCurrentSpeed > 1) - { - pSndFile->m_nMusicSpeed = nCurrentSpeed - 1; - } + pSndFile->m_nMusicSpeed = max(nCurrentSpeed - 1, pSndFile->GetModSpecifications().speedMin); } else { - if (nCurrentSpeed < 0x7F) - { - pSndFile->m_nMusicSpeed = nCurrentSpeed + 1; - } + pSndFile->m_nMusicSpeed = min(nCurrentSpeed + 1, pSndFile->GetModSpecifications().speedMax); } m_SpinSpeed.SetPos(0); } Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-26 21:59:23 UTC (rev 304) @@ -1448,7 +1448,7 @@ // Channel mode if(wsdlg.m_bChannelMode){ // Add channel number & name (if available) to path string - if(m_SndFile.ChnSettings[i].szName[0] > 0x20) + if(m_SndFile.ChnSettings[i].szName[0] >= 0x20) wsprintf(channel, "-%03d_%s.wav", i+1,m_SndFile.ChnSettings[i].szName); else wsprintf(channel, "-%03d.wav", i+1); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-07-26 21:59:23 UTC (rev 304) @@ -8,6 +8,7 @@ #include "dlg_misc.h" #include "dlsbank.h" #include "modsmp_ctrl.h" +#include "misc_util.h" #pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data" @@ -419,6 +420,11 @@ } //end rewbs.cutomKeys + // Check mod specifications + const CModSpecifications& specs = m_SndFile.GetModSpecifications(); + m_SndFile.m_nDefaultTempo = CLAMP(m_SndFile.m_nDefaultTempo, specs.tempoMin, specs.tempoMax); + m_SndFile.m_nDefaultSpeed = CLAMP(m_SndFile.m_nDefaultSpeed, specs.speedMin, specs.speedMax); + SetModified(); ClearUndo(); UpdateAllViews(NULL, HINT_MODTYPE); Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-26 21:59:23 UTC (rev 304) @@ -571,7 +571,7 @@ CDialog::OnInitDialog(); for (UINT n = 0; n < m_nChannels; n++) { - if(m_pSndFile->ChnSettings[n].szName[0] > 0x20) + if(m_pSndFile->ChnSettings[n].szName[0] >= 0x20) wsprintf(label, "Channel %d: %s", (n + 1), m_pSndFile->ChnSettings[n].szName); else wsprintf(label, "Channel %d", n + 1); @@ -1635,11 +1635,13 @@ char cNewEditOption = GetEditMode(); if(cNewEditOption != 3 && m_nEditOption == 3) { + // switch to "add silenece" m_nLength = GetDlgItemInt(IDC_EDIT_ADDSILENCE); SetDlgItemInt(IDC_EDIT_ADDSILENCE, m_nSamples); } else if(cNewEditOption == 3 && m_nEditOption != 3) { + // "switch to "resize" m_nSamples = GetDlgItemInt(IDC_EDIT_ADDSILENCE); SetDlgItemInt(IDC_EDIT_ADDSILENCE, m_nLength); } Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2009-07-26 21:59:23 UTC (rev 304) @@ -356,7 +356,7 @@ public: UINT m_nSamples; UINT m_nLength; - char m_nEditOption; //0 = add at beginning, 1 = add at end, 2 = resize + char m_nEditOption; // 1 = add at beginning, 2 = add at end, 3 = resize public: CAddSilenceDlg(CWnd *parent, UINT nSamples = 32, UINT nOrigLength = 1024):CDialog(IDD_ADDSILENCE, parent) { m_nSamples = nSamples; m_nLength = nOrigLength; m_nEditOption = 2; } Modified: trunk/OpenMPT/mptrack/misc_util.h =================================================================== --- trunk/OpenMPT/mptrack/misc_util.h 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/mptrack/misc_util.h 2009-07-26 21:59:23 UTC (rev 304) @@ -72,4 +72,10 @@ } +// Like Limit, but returns value +#ifndef CLAMP +#define CLAMP(number, low, high) min(high, max(low, number)) #endif + + +#endif Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-07-26 21:59:23 UTC (rev 304) @@ -13,6 +13,53 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// +// Deutsch (Deutschland) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_MODLOADING_WARNINGS DIALOGEX 0, 0, 316, 178 +STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "module.it - Warnings" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,258,156,50,14 + EDITTEXT IDC_EDIT_MODLOADING_WARNINGS,6,18,300,132,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY + LTEXT "The following problems have been encountered when loading this module:",IDC_STATIC,6,6,237,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_MODLOADING_WARNINGS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 309 + TOPMARGIN, 7 + BOTTOMMARGIN, 171 + END +END +#endif // APSTUDIO_INVOKED + +#endif // Deutsch (Deutschland) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// // Englisch (USA) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) @@ -493,14 +540,14 @@ CTEXT "Not saved with song!",IDC_STATIC,262,73,60,17 CONTROL "",IDC_VUMETER_LEFT,"Static",SS_BLACKRECT | SS_SUNKEN,325,1,15,91 CONTROL "",IDC_VUMETER_RIGHT,"Static",SS_BLACKRECT | SS_SUNKEN,343,1,15,91 - GROUPBOX "Player Settings (not saved in song!)",IDC_STATIC,414,31,147,63,NOT WS_VISIBLE - CONTROL "Bass Expansion",IDC_CHECK_BASS,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,420,43,65,10 - CONTROL "Reverb",IDC_CHECK_REVERB,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,420,55,46,10 - CONTROL "Surround",IDC_CHECK_SURROUND,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,420,67,48,10 - COMBOBOX IDC_COMBO_RESAMPLING,490,76,67,74,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_TABSTOP - LTEXT "Resampling:",IDC_STATIC,491,67,43,8,NOT WS_VISIBLE - CONTROL "Graphic EQ",IDC_CHECK_EQ,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,420,79,58,10 - CONTROL "AGC",IDC_CHECK_AGC,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,491,43,31,10 + GROUPBOX "Player Settings (not saved in song!)",IDC_STATIC,366,6,150,66,NOT WS_VISIBLE + CONTROL "Bass Expansion",IDC_CHECK_BASS,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,372,18,65,10 + CONTROL "Reverb",IDC_CHECK_REVERB,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,372,30,46,10 + CONTROL "Surround",IDC_CHECK_SURROUND,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,372,42,48,10 + COMBOBOX IDC_COMBO_RESAMPLING,444,54,67,74,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_TABSTOP + LTEXT "Resampling:",IDC_STATIC,444,42,43,8,NOT WS_VISIBLE + CONTROL "Graphic EQ",IDC_CHECK_EQ,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,372,54,58,10 + CONTROL "AGC",IDC_CHECK_AGC,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,444,18,31,10 END IDD_CONTROL_COMMENTS DIALOGEX 0, 0, 435, 119 @@ -2312,10 +2359,9 @@ LTEXT "Static",IDC_TUNINGTYPE_DESC,109,134,179,20,0,WS_EX_STATICEDGE END -IDD_CHANNELMANAGER DIALOGEX 0, 0, 523, 231 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_TOOLWINDOW -CAPTION "Channel manager" +IDD_CHANNELMANAGER DIALOGEX 0, 0, 524, 231 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Channel Manager" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN CONTROL "",IDC_TAB1,"SysTabControl32",TCS_MULTILINE,0,0,523,18,WS_EX_CLIENTEDGE @@ -2422,6 +2468,11 @@ BOTTOMMARGIN, 236 END + IDD_CHANNELMANAGER, DIALOG + BEGIN + RIGHTMARGIN, 523 + END + IDD_DEFAULTPLUGINEDITOR, DIALOG BEGIN LEFTMARGIN, 7 Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/mptrack/resource.h 2009-07-26 21:59:23 UTC (rev 304) @@ -106,6 +106,8 @@ #define IDD_MIDIPARAMCONTROL 515 #define IDD_MSGBOX_HIDABLE 516 #define IDD_ADDSILENCE 517 +#define IDD_DIALOG4 518 +#define IDD_MODLOADING_WARNINGS 518 #define IDC_BUTTON1 1001 #define IDC_BUTTON2 1002 #define IDC_BUTTON3 1003 @@ -875,6 +877,7 @@ #define IDC_RADIO_ADDSILENCE_END 2381 #define IDC_SPIN_ADDSILENCE 2382 #define IDC_RADIO_RESIZETO 2384 +#define IDC_EDIT_MODLOADING_WARNINGS 2385 #define ID_FILE_NEWMOD 32771 #define ID_FILE_NEWXM 32772 #define ID_FILE_NEWS3M 32773 @@ -1112,9 +1115,9 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 518 +#define _APS_NEXT_RESOURCE_VALUE 519 #define _APS_NEXT_COMMAND_VALUE 59227 -#define _APS_NEXT_CONTROL_VALUE 2385 +#define _APS_NEXT_CONTROL_VALUE 2386 #define _APS_NEXT_SYMED_VALUE 901 #endif #endif Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2009-07-26 21:59:23 UTC (rev 304) @@ -116,7 +116,7 @@ case CMD_PATTERNBREAK: command = 0x0D; param = ((param / 10) << 4) | (param % 10); break; case CMD_MODCMDEX: command = 0x0E; break; case CMD_SPEED: command = 0x0F; if (param > 0x20) param = 0x20; break; - case CMD_TEMPO: if (param > 0x20) { command = 0x0F; break; } + case CMD_TEMPO: if (param >= 0x20) { command = 0x0F; break; } case CMD_GLOBALVOLUME: command = 'G' - 55; break; case CMD_GLOBALVOLSLIDE: command = 'H' - 55; break; case CMD_KEYOFF: command = 'K' - 55; break; Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-26 21:59:23 UTC (rev 304) @@ -11,6 +11,7 @@ #include "stdafx.h" #include "sndfile.h" #include "../mptrack/moddoc.h" +#include "../mptrack/misc_util.h" #pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data" @@ -266,12 +267,10 @@ memcpy(m_szNames[0], psfh.name, 28); // Speed m_nDefaultSpeed = psfh.speed; - if (m_nDefaultSpeed < 1) m_nDefaultSpeed = 6; - if (m_nDefaultSpeed > 0x1F) m_nDefaultSpeed = 0x1F; + if (!m_nDefaultSpeed) m_nDefaultSpeed = 6; // Tempo m_nDefaultTempo = psfh.tempo; - if (m_nDefaultTempo < 40) m_nDefaultTempo = 40; - if (m_nDefaultTempo > 240) m_nDefaultTempo = 240; + m_nDefaultTempo = CLAMP(m_nDefaultTempo, 32, 255); // Global Volume m_nDefaultGlobalVolume = psfh.globalvol << 2; if ((!m_nDefaultGlobalVolume) || (m_nDefaultGlobalVolume > 256)) m_nDefaultGlobalVolume = 256; @@ -296,8 +295,7 @@ if ((psfh.cwtv < 0x1320) || (psfh.flags & 0x40)) m_dwSongFlags |= SONG_FASTVOLSLIDES; // Reading pattern order UINT iord = psfh.ordnum; - if (iord<1) iord = 1; - if (iord > MAX_ORDERS) iord = MAX_ORDERS; + iord = CLAMP(iord, 1, MAX_ORDERS); if (iord) { Order.ReadAsByte(lpStream+dwMemPos, iord, dwMemLength-dwMemPos); @@ -343,27 +341,19 @@ lstrcpy(m_szNames[iSmp], (LPCSTR)&s[0x30]); if ((s[0]==1) && (s[0x4E]=='R') && (s[0x4F]=='S')) { - UINT j = LittleEndian(*((LPDWORD)(s+0x10))); - if (j > MAX_SAMPLE_LENGTH) j = MAX_SAMPLE_LENGTH; - if (j < 4) j = 0; - Ins[iSmp].nLength = j; - j = LittleEndian(*((LPDWORD)(s+0x14))); - if (j >= Ins[iSmp].nLength) j = Ins[iSmp].nLength - 1; - Ins[iSmp].nLoopStart = j; - j = LittleEndian(*((LPDWORD)(s+0x18))); - if (j > MAX_SAMPLE_LENGTH) j = MAX_SAMPLE_LENGTH; - if (j < 4) j = 0; - if (j > Ins[iSmp].nLength) j = Ins[iSmp].nLength; - Ins[iSmp].nLoopEnd = j; - j = s[0x1C]; - if (j > 64) j = 64; - Ins[iSmp].nVolume = j << 2; + Ins[iSmp].nLength = CLAMP(LittleEndian(*((LPDWORD)(s + 0x10))), 4, MAX_SAMPLE_LENGTH); + Ins[iSmp].nLoopStart = CLAMP(LittleEndian(*((LPDWORD)(s + 0x14))), 0, Ins[iSmp].nLength - 1); + Ins[iSmp].nLoopEnd = CLAMP(LittleEndian(*((LPDWORD)(s+0x18))), 4, Ins[iSmp].nLength); + Ins[iSmp].nVolume = CLAMP(s[0x1C], 0, 64) << 2; Ins[iSmp].nGlobalVol = 64; - if (s[0x1F]&1) Ins[iSmp].uFlags |= CHN_LOOP; - j = LittleEndian(*((LPDWORD)(s+0x20))); - if (!j) j = 8363; - if (j < 1024) j = 1024; - Ins[iSmp].nC4Speed = j; + if (s[0x1F] & 1) Ins[iSmp].uFlags |= CHN_LOOP; + + UINT c4speed; + c4speed = LittleEndian(*((LPDWORD)(s+0x20))); + if (!c4speed) c4speed = 8363; + if (c4speed < 1024) c4speed = 1024; + Ins[iSmp].nC4Speed = c4speed; + insfile[iSmp] = ((DWORD)LittleEndianW(*((LPWORD)(s+0x0E)))) << 4; insfile[iSmp] += ((DWORD)(BYTE)s[0x0D]) << 20; if (insfile[iSmp] > dwMemLength) insfile[iSmp] &= 0xFFFF; @@ -528,9 +518,9 @@ header[0x2E] = 'R'; header[0x2F] = 'M'; header[0x30] = m_nDefaultGlobalVolume >> 2; - header[0x31] = m_nDefaultSpeed; - header[0x32] = m_nDefaultTempo; - header[0x33] = min(max(0x20, m_nSamplePreAmp), 0x7F); // Stereo + header[0x31] = CLAMP(m_nDefaultSpeed, 1, 255); + header[0x32] = CLAMP(m_nDefaultTempo, 32, 255); + header[0x33] = CLAMP(m_nSamplePreAmp, 0x10, 0x7F); // Stereo header[0x35] = 0xFC; for (i=0; i<32; i++) { Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-07-26 21:59:23 UTC (rev 304) @@ -9,6 +9,7 @@ #include "stdafx.h" #include "sndfile.h" #include "../mptrack/version.h" +#include "../mptrack/misc_util.h" //////////////////////////////////////////////////////// // FastTracker II XM file support @@ -84,7 +85,7 @@ XMSAMPLESTRUCT xmss; DWORD dwMemPos, dwHdrSize; WORD norders=0, restartpos=0, channels=0, patterns=0, instruments=0; - WORD xmflags=0, deftempo=125, defspeed=6; + WORD xmflags=0; BYTE InstUsed[256]; // -> CODE#0006 // -> DESC="misc quantity changes" @@ -100,7 +101,7 @@ m_nChannels = 0; if ((!lpStream) || (dwMemLength < 0x200)) return FALSE; if (_strnicmp((LPCSTR)lpStream, "Extended Module", 15)) return FALSE; - memcpy(m_szNames[0], lpStream+17, 20); + memcpy(m_szNames[0], lpStream + 17, 20); dwHdrSize = LittleEndian(*((DWORD *)(lpStream+60))); norders = LittleEndianW(*((WORD *)(lpStream+64))); if ((!norders) || (norders > MAX_ORDERS)) return FALSE; @@ -116,23 +117,19 @@ m_nMaxPeriod = 54784; m_nChannels = channels; if (restartpos < norders) m_nRestartPos = restartpos; - patterns = LittleEndianW(*((WORD *)(lpStream+70))); - if (patterns > 256) patterns = 256; + patterns = CLAMP(LittleEndianW(*((WORD *)(lpStream+70))), 0, 256); instruments = LittleEndianW(*((WORD *)(lpStream+72))); if (instruments >= MAX_INSTRUMENTS) instruments = MAX_INSTRUMENTS-1; m_nInstruments = instruments; m_nSamples = 0; - memcpy(&xmflags, lpStream+74, 2); + memcpy(&xmflags, lpStream + 74, 2); xmflags = LittleEndianW(xmflags); if (xmflags & 1) m_dwSongFlags |= SONG_LINEARSLIDES; if (xmflags & 0x1000) m_dwSongFlags |= SONG_EXFILTERRANGE; - defspeed = LittleEndianW(*((WORD *)(lpStream+76))); - deftempo = LittleEndianW(*((WORD *)(lpStream+78))); + m_nDefaultSpeed = CLAMP(LittleEndianW(*((WORD *)(lpStream+76))), 1, 31); // -> CODE#0016 // -> DESC="default tempo update" -// if ((deftempo >= 32) && (deftempo < 256)) m_nDefaultTempo = deftempo; - if ((deftempo >= 32) && (deftempo <= 512)) m_nDefaultTempo = deftempo; - if ((defspeed > 0) && (defspeed < 40)) m_nDefaultSpeed = defspeed; + m_nDefaultTempo = CLAMP(LittleEndianW(*((WORD *)(lpStream+78))), 32, 512); // -! BEHAVIOUR_CHANGE#0016 Order.ReadAsByte(lpStream+80, norders, dwMemLength-80); memset(InstUsed, 0, sizeof(InstUsed)); Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-26 21:59:23 UTC (rev 304) @@ -14,6 +14,7 @@ #include "../mptrack/mptrack.h" #include "../mptrack/moddoc.h" #include "../mptrack/MainFrm.h" +#include "../mptrack/misc_util.h" // -! NEW_FEATURE#0022 #pragma warning(disable:4244) @@ -111,6 +112,7 @@ nCurrentPattern = nNextPattern = 0; nPattern = Order[0]; nRow = nNextRow = 0; + for (;;) { UINT nSpeedCount = 0; @@ -243,16 +245,17 @@ if ((param & 0xF0) == 0x10) { nMusicTempo += (param & 0x0F) * (nMusicSpeed-1); //rewbs.tempoSlideFix -// -> CODE#0010 -// -> DESC="add extended parameter mechanism to pattern effects" -// if (nMusicTempo > 255) nMusicTempo = 255; - if (nMusicTempo > 512) nMusicTempo = 512; -// -! NEW_FEATURE#0010 } else { nMusicTempo -= (param & 0x0F) * (nMusicSpeed-1); //rewbs.tempoSlideFix - if (nMusicTempo < 32) nMusicTempo = 32; } +// -> CODE#0010 +// -> DESC="add extended parameter mechanism to pattern effects" + if(GetModFlag(MSF_COMPATIBLE_PLAY)) + nMusicTempo = CLAMP(nMusicTempo, 32, 255); + else + nMusicTempo = CLAMP(nMusicTempo, GetModSpecifications().tempoMin, GetModSpecifications().tempoMax); +// -! NEW_FEATURE#0010 break; // Pattern Delay case CMD_S3MCMDEX: @@ -344,8 +347,7 @@ if (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; nGlbVol -= param * nMusicSpeed; } - if (nGlbVol < 0) nGlbVol = 0; - if (nGlbVol > 256) nGlbVol = 256; + nGlbVol = CLAMP(nGlbVol, 0, 256); break; case CMD_CHANNELVOLUME: if (param <= 64) chnvols[nChn] = param; @@ -367,7 +369,7 @@ param = (param & 0x0F) * nMusicSpeed; param = (chnvols[nChn] > param) ? chnvols[nChn] - param : 0; } else param = ((param & 0xF0) >> 4) * nMusicSpeed + chnvols[nChn]; - if (param > 64) param = 64; + param = min(param, 64); chnvols[nChn] = param; break; } @@ -667,9 +669,8 @@ } } - if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2|MOD_TYPE_MED)) note += pChn->nTranspose; - if (note < 1) note = 1; - if (note > 132) note = 132; + if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2|MOD_TYPE_MED)) note += pChn->nTranspose; + note = CLAMP(note, 1, 132); pChn->nNote = note; pChn->m_CalculateFreq = true; @@ -745,9 +746,9 @@ pChn->nLeftVU = pChn->nRightVU = 0xFF; pChn->dwFlags &= ~CHN_FILTER; pChn->dwFlags |= CHN_FASTVOLRAMP; - if(!GetModFlag(MSF_COMPATIBLE_PLAY)) + if(!GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) { - //IT compatibility 15. Retrigger (Tremor doesn't store anything here, so we just don't reset this as well) + //IT compatibility 15. Retrigger will not be reset (Tremor doesn't store anything here, so we just don't reset this as well) pChn->nRetrigCount = 0; pChn->nTremorCount = 0; } @@ -1565,25 +1566,30 @@ if (!(param & 0x0F)) param |= pChn->nRetrigParam & 0x0F; param |= 0x100; // increment retrig count on first row } - if(!GetModFlag(MSF_COMPATIBLE_PLAY)) + if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) { + //IT compatibility 15. Retrigger + if (volcmd == VOLCMD_OFFSET) + RetrigNote(nChn, pChn->nRetrigParam, vol << 3); + else if (volcmd == VOLCMD_VELOCITY) + RetrigNote(nChn, pChn->nRetrigParam, 48 - (vol << 3)); + else + RetrigNote(nChn, pChn->nRetrigParam); + } + else + { + //MPT Retrig if (param) pChn->nRetrigParam = (BYTE)(param & 0xFF); else param = pChn->nRetrigParam; //rewbs.volOffset //RetrigNote(nChn, param); if (volcmd == VOLCMD_OFFSET) - RetrigNote(nChn, param, vol<<3); + RetrigNote(nChn, param, vol << 3); else if (volcmd == VOLCMD_VELOCITY) - RetrigNote(nChn, param, 48-(vol << 3)); + RetrigNote(nChn, param, 48 - (vol << 3)); else RetrigNote(nChn, param); //end rewbs.volOffset: } - else - { - //IT compatibility 15. Retrigger - if (param) pChn->nRetrigParam = (BYTE)(param & 0xFF); - RetrigNote(nChn, pChn->nRetrigParam); - } break; // Tremor @@ -2277,8 +2283,7 @@ else newvolume += (int)((param & 0xF0) >> 2); if (m_nType & MOD_TYPE_MOD) pChn->dwFlags |= CHN_FASTVOLRAMP; } - if (newvolume < 0) newvolume = 0; - if (newvolume > 256) newvolume = 256; + newvolume = CLAMP(newvolume, 0, 256); pChn->nVolume = newvolume; } @@ -2324,8 +2329,7 @@ if (nPanSlide) { nPanSlide += pChn->nPan; - if (nPanSlide < 0) nPanSlide = 0; - if (nPanSlide > 256) nPanSlide = 256; + nPanSlide = CLAMP(nPanSlide, 0, 256); pChn->nPan = nPanSlide; pChn->nRestorePanOnNewNote = 0; } @@ -2390,8 +2394,7 @@ if (nChnSlide) { nChnSlide += pChn->nGlobalVol; - if (nChnSlide < 0) nChnSlide = 0; - if (nChnSlide > 64) nChnSlide = 64; + nChnSlide = CLAMP(nChnSlide, 0, 64); pChn->nGlobalVol = nChnSlide; } } @@ -3046,12 +3049,18 @@ if (dv) { int vol = pChn->nVolume; - if (retrigTable1[dv]) - vol = (vol * retrigTable1[dv]) >> 4; - else - vol += ((int)retrigTable2[dv]) << 2; - if (vol < 0) vol = 0; - if (vol > 256) vol = 256; + + // FT2 compatibility: Retrig + volume will not change volume of retrigged notes + if(!(m_nType & MOD_TYPE_XM) || !(pChn->nRowVolCmd == VOLCMD_VOLUME) || !GetModFlag(MSF_COMPATIBLE_PLAY)) + { + if (retrigTable1[dv]) + vol = (vol * retrigTable1[dv]) >> 4; + else + vol += ((int)retrigTable2[dv]) << 2; + } + + vol = CLAMP(vol, 0, 256); + pChn->nVolume = vol; pChn->dwFlags |= CHN_FASTVOLRAMP; } @@ -3236,7 +3245,7 @@ void CSoundFile::SetTempo(UINT param, bool setAsNonModcommand) -//----------------------------------- +//------------------------------------------------------------ { const CModSpecifications& specs = GetModSpecifications(); if(setAsNonModcommand) @@ -3258,18 +3267,17 @@ else if (param < 0x20 && m_nTickCount) //rewbs.tempoSlideFix: only slide if (T0x or T1x) and tick is not 0 { if ((param & 0xF0) == 0x10) - { m_nMusicTempo += (param & 0x0F); //rewbs.tempoSlideFix: no *2 - // -> CODE#0016 - // -> DESC="default tempo update" - // if (m_nMusicTempo > 255) m_nMusicTempo = 255; - if (m_nMusicTempo > specs.tempoMax) m_nMusicTempo = specs.tempoMax; - // -! BEHAVIOUR_CHANGE#0016 - } else - { + else m_nMusicTempo -= (param & 0x0F); //rewbs.tempoSlideFix: no *2 - if ((LONG)m_nMusicTempo < specs.tempoMin) m_nMusicTempo = specs.tempoMin; - } + + // -> CODE#0016 + // -> DESC="default tempo update" + if(GetModFlag(MSF_COMPATIBLE_PLAY)) + m_nMusicTempo = CLAMP(m_nMusicTempo, 32, 255); + else + m_nMusicTempo = CLAMP(m_nMusicTempo, specs.tempoMin, specs.tempoMax); + // -! BEHAVIOUR_CHANGE#0016 } } } @@ -3339,8 +3347,7 @@ { if (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) nGlbSlide *= 2; nGlbSlide += m_nGlobalVolume; - if (nGlbSlide < 0) nGlbSlide = 0; - if (nGlbSlide > 256) nGlbSlide = 256; + nGlbSlide = CLAMP(nGlbSlide, 0, 256); m_nGlobalVolume = nGlbSlide; } } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-26 21:59:23 UTC (rev 304) @@ -637,7 +637,7 @@ Chn[ich].nVolume = 256; Chn[ich].nCutOff = 0x7F; //IT compatibility 15. Retrigger - if(GetModFlag(MSF_COMPATIBLE_PLAY)) + if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) { Chn[ich].nRetrigParam = 1; Chn[ich].nRetrigCount = 0; @@ -1188,7 +1188,7 @@ Chn[j].nPatternLoopCount = 0; Chn[j].nPatternLoop = 0; //IT compatibility 15. Retrigger - if(GetModFlag(MSF_COMPATIBLE_PLAY)) + if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) { Chn[j].nRetrigCount = 0; Chn[j].nRetrigParam = 1; @@ -1454,7 +1454,7 @@ Chn[i].nFadeOutVol = 0; Chn[i].dwFlags |= CHN_KEYOFF|CHN_NOTEFADE; //IT compatibility 15. Retrigger - if(GetModFlag(MSF_COMPATIBLE_PLAY)) + if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) { Chn[i].nRetrigParam = 1; Chn[i].nRetrigCount = 0; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-07-26 21:59:23 UTC (rev 304) @@ -14,6 +14,7 @@ #include "../mptrack/mptrack.h" #include "../mptrack/moddoc.h" #include "../mptrack/MainFrm.h" +#include "../mptrack/misc_util.h" // -! NEW_FEATURE#0022 #include "sndfile.h" #include "midi.h" @@ -954,8 +955,7 @@ } } - if (vol < 0) vol = 0; - if (vol > 256) vol = 256; + vol = CLAMP(vol, 0, 256); // Tremolo if (pChn->dwFlags & CHN_TREMOLO) @@ -994,7 +994,7 @@ { if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) { - // Original IT behaviour + // IT compatibility 12: Tremor if(pChn->nTremorOn) pChn->nTremorOn--; if(!pChn->nTremorOn) { @@ -1040,10 +1040,8 @@ pChn->dwFlags |= CHN_FASTVOLRAMP; } - // Clip volume - if (vol < 0) vol = 0; - if (vol > 0x100) vol = 0x100; - vol <<= 6; + // Clip volume and multiply + vol = CLAMP(vol, 0, 256) << 6; // Process Envelopes if (pChn->pHeader) @@ -1073,10 +1071,7 @@ int relativeVolumeChange = (envvol-envValueAtReleaseNode)*2; envvol = envValueAtReleaseJump + relativeVolumeChange; } - if (envvol < 0) envvol = 0; - if (envvol > 512) - envvol = 512; - vol = (vol * envvol) >> 8; + vol = (vol * CLAMP(envvol, 0, 512)) >> 8; } // Panning Envelope if ((pChn->dwFlags & CHN_PANENV) && (penv->nPanEnv)) @@ -1111,8 +1106,8 @@ { envpan += ((envpos - x1) * (y2 - envpan)) / (x2 - x1); } - if (envpan < 0) envpan = 0; - if (envpan > 64) envpan = 64; + + envpan = CLAMP(envpan, 0, 64); int pan = pChn->nPan; if (pan >= 128) { @@ -1121,9 +1116,8 @@ { pan += ((envpan - 32) * (pan)) / 32; } - if (pan < 0) pan = 0; - if (pan > 256) pan = 256; - pChn->nRealPan = pan; + + pChn->nRealPan = CLAMP(pan, 0, 256); } // FadeOut volume if (pChn->dwFlags & CHN_NOTEFADE) @@ -1144,9 +1138,7 @@ if ((penv->nPPS) && (pChn->nRealPan) && (pChn->nNote)) { int pandelta = (int)pChn->nRealPan + (int)((int)(pChn->nNote - penv->nPPC - 1) * (int)penv->nPPS) / (int)8; - if (pandelta < 0) pandelta = 0; - if (pandelta > 256) pandelta = 256; - pChn->nRealPan = pandelta; + pChn->nRealPan = CLAMP(pandelta, 0, 256); } } else { @@ -1227,11 +1219,9 @@ } } + // Preserve Amiga freq limits if (m_dwSongFlags & SONG_AMIGALIMITS) - { - if (period < 113*4) period = 113*4; - if (period > 856*4) period = 856*4; - } + period = CLAMP(period, 113 * 4, 856 * 4); // Pitch/Filter Envelope if ((pChn->pHeader) && (pChn->dwFlags & CHN_PITCHENV) && (pChn->pHeader->nPitchEnv)) @@ -1269,8 +1259,7 @@ int envpitchdest = (((int)penv->PitchEnv[pt]) - 32) * 8; envpitch += ((envpos - x1) * (envpitchdest - envpitch)) / (x2 - x1); } - if (envpitch < -256) envpitch = -256; - if (envpitch > 256) envpitch = 256; + envpitch = CLAMP(envpitch, -256, 256); // Filter Envelope: controls cutoff frequency if (penv->dwFlags & ENV_FILTER) { @@ -1397,9 +1386,8 @@ pChn->nPanbrelloPos += pChn->nPanbrelloSpeed; pdelta = ((pdelta * (int)pChn->nPanbrelloDepth) + 2) >> 3; pdelta += pChn->nRealPan; - if (pdelta < 0) pdelta = 0; - if (pdelta > 256) pdelta = 256; - pChn->nRealPan = pdelta; + + pChn->nRealPan = CLAMP(pdelta, 0, 256); } int nPeriodFrac = 0; // Instrument Auto-Vibrato @@ -1691,8 +1679,7 @@ pan *= (int)m_nStereoSeparation; pan /= 128; pan += 128; - if (pan < 0) pan = 0; - if (pan > 256) pan = 256; + pan = CLAMP(pan, 0, 256); #ifndef FASTSOUNDLIB if (gdwSoundSetup & SNDMIX_REVERSESTEREO) pan = 256 - pan; #endif Modified: trunk/OpenMPT/soundlib/mod_specifications.h =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.h 2009-07-25 15:39:19 UTC (rev 303) +++ trunk/OpenMPT/soundlib/mod_specifications.h 2009-07-26 21:59:23 UTC (rev 304) @@ -31,6 +31,8 @@ INSTRUMENTINDEX instrumentsMax; BYTE defaultMixLevels; BYTE MIDIMappingDirectivesMax; + UINT speedMin; + UINT speedMax; }; @@ -61,7 +63,9 @@ 4000, //SamplesMax 256, //instrumentMax mixLevels_117RC3, //defaultMixLevels - 200 //Max MIDI mapping directives + 200, //Max MIDI mapping directives + 1, //Min Speed + 255, //Max Speed }; @@ -80,7 +84,7 @@ 4, //Channel min 4, //Channel max 32, //Min tempo - 256, //Max tempo + 255, //Max tempo 64, //Min pattern rows 64, //Max pattern rows 20, //Max mod name length @@ -88,6 +92,8 @@ 0, //instrumentMax mixLevels_original, //defaultMixLevels 0, //Max MIDI mapping directives + 1, //Min Speed + 31, //Max Speed }; // MOD with MPT extensions. @@ -104,14 +110,16 @@ 4, //Channel min 32, //Channel max 32, //Min tempo - 256, //Max tempo + 255, //Max tempo 64, //Min pattern rows 64, //Max pattern rows 20, //Max mod name length 31, //SamplesMax 0, //instrumentMax mixLevels_original, //defaultMixLevels - 0 //Max MIDI mapping directives + 0, //Max MIDI mapping directives + 1, //Min Speed + 31, //Max Speed }; const CModSpecifications xm = @@ -127,14 +135,16 @@ 4, //Channel min 32, //Channel max 32, //Min tempo - 256, //Max tempo + 255, //Max tempo 4, //Min pattern rows 256, //Max pattern rows 20, //Max mod name length 31, //SamplesMax 200, //instrumentMax mixLevels_original, //defaultMixLevels - 0 //Max MIDI mapping directives + 0, //Max MIDI mapping directives + 1, //Min Speed + 31, //Max Speed }; // XM with MPT extensions @@ -147,7 +157,7 @@ false, //No notecut. true, //Has noteoff. 240, //Pattern max. - 256, //Order max. + 255, //Order max. 4, //Channel min 127, //Channel max 32, //Min tempo @@ -158,7 +168,9 @@ 4000, //SamplesMax 256, //instrumentMax mixLevels_117RC3, //defaultMixLevels - 200 //Max MIDI mapping directives + 200, //Max MIDI mapping directives + 1, //Min Speed + 31, //Max Speed }; const CModSpecifications s3m = @@ -174,14 +186,16 @@ 4, //Channel min 32, //Channel max 32, //Min tempo - 256, //Max tempo + 255, //Max tempo 64, //Min pattern rows 64, //Max pattern rows 27, //Max mod name length 99, //SamplesMax 0, //instrumentMax mixLevels_original, //defaultMixLevels - 0 //Max MIDI mapping directives + 0, //Max MIDI mapping directives + 1, //Min Speed + 255, //Max Speed }; // S3M with MPT extensions @@ -198,14 +212,16 @@ 4, //Channel min 32, //Channel max 32, //Min tempo - 256, //Max tempo + 255, //Max tempo 64, //Min pattern rows 64, //Max pattern rows 27, //Max mod name length 99, //SamplesMax 0, //instrumentMax mixLevels_original, //defaultMixLevels - 0 //Max MIDI mapping directives + 0, //Max MIDI mapping directives + 1, //Min Speed + 255, //Max Speed }; const CModSpecifications it = @@ -221,14 +237,16 @@ 4, //Channel min 64, //Channel max 32, //Min tempo - 256, //Max tempo + 255, //Max tempo 4, //Min pattern rows 256, //Max pattern rows 25, //Max mod name length 256, //SamplesMax 200, //instrumentMax mixLevels_original, //defaultMixLevels - 0 //Max MIDI mapping directives + 0, //Max MIDI mapping directives + 1, //Min Speed + 255, //Max Speed }; const CModSpecifications itEx = @@ -251,7 +269,9 @@ 4000, //SamplesMax 256, //instrumentMax mixLevels_117RC3, //defaultMixLevels - 200 //Max MIDI mapping directives + 200, //Max MIDI mapping directives + 1, //Min Speed + 255, //Max Speed }; } //namespace ModSpecs This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-27 17:28:07
|
Revision: 306 http://modplug.svn.sourceforge.net/modplug/?rev=306&view=rev Author: saga-games Date: 2009-07-27 17:27:59 +0000 (Mon, 27 Jul 2009) Log Message: ----------- [Imp] Autosave: If a module has not been changed since the last autosave, it will not be autosaved. [Imp] Directory handling: Setting the default directory won't update the working directory now ONLY if it has not changed. [Fix] MP3 / Wav export: Default directories should now *really* work [Fix] XM loader: Various changes to make XMs that have been compressed with BoobieSqueezer load correctly. Should not break anything, but I call it "experimental". Modified Paths: -------------- trunk/OpenMPT/mptrack/AutoSaver.cpp trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/mptrack/AutoSaver.cpp =================================================================== --- trunk/OpenMPT/mptrack/AutoSaver.cpp 2009-07-26 23:50:13 UTC (rev 305) +++ trunk/OpenMPT/mptrack/AutoSaver.cpp 2009-07-27 17:27:59 UTC (rev 306) @@ -72,12 +72,12 @@ while (posDocument) { //for all open documents pModDoc = (CModDoc*)(pDocTemplate->GetNextDoc(posDocument)); - if (pModDoc && pModDoc->IsModified()) { + if (pModDoc && pModDoc->ModifiedSinceLastAutosave()) { if (SaveSingleFile(pModDoc)) { CleanUpBackups(pModDoc); } else { m_bEnabled=false; - AfxMessageBox("Warning: autosave failed and has been disabled. Please:\r\n\r\n- Review your autosave paths\r\n- Check available diskspace & filesystem access rights\r\n- If you are using the ITP format, ensure all instruments exist as independant .iti files"); + AfxMessageBox("Warning: Autosave failed and has been disabled. Please:\n- Review your autosave paths\n- Check available diskspace & filesystem access rights\n- If you are using the ITP format, ensure all instruments exist as independant .iti files"); success = false; } } Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2009-07-26 23:50:13 UTC (rev 305) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2009-07-27 17:27:59 UTC (rev 306) @@ -341,7 +341,8 @@ m_EditTempo.GetWindowText(s, sizeof(s)); if (s[0]) { - UINT n = CLAMP(atoi(s), m_pSndFile->GetModSpecifications().tempoMin, m_pSndFile->GetModSpecifications().tempoMax); + UINT n = atoi(s); + n = CLAMP(n, m_pSndFile->GetModSpecifications().tempoMin, m_pSndFile->GetModSpecifications().tempoMax); if (n != m_pSndFile->m_nDefaultTempo) { m_bEditsLocked=true; @@ -367,7 +368,8 @@ m_EditSpeed.GetWindowText(s, sizeof(s)); if (s[0]) { - UINT n = CLAMP(atoi(s), m_pSndFile->GetModSpecifications().speedMin, m_pSndFile->GetModSpecifications().speedMax); + UINT n = atoi(s); + n = CLAMP(n, m_pSndFile->GetModSpecifications().speedMin, m_pSndFile->GetModSpecifications().speedMax); if (n != m_pSndFile->m_nDefaultSpeed) { m_bEditsLocked=true; m_EditSpeed.SetModify(FALSE); @@ -389,7 +391,8 @@ if ((m_pSndFile) && (m_pModDoc) && (m_bInitialized)) { m_EditVSTiVol.GetWindowText(s, sizeof(s)); if (s[0]) { - int n = CLAMP(atoi(s), 0, 2000); + int n = atoi(s); + n = CLAMP(n, 0, 2000); if (n != m_pSndFile->m_nVSTiVolume) { m_bEditsLocked=true; m_pSndFile->m_nVSTiVolume = n; @@ -410,7 +413,8 @@ if ((m_pSndFile) && (m_pModDoc) && (m_bInitialized)) { m_EditSamplePA.GetWindowText(s, sizeof(s)); if (s[0]) { - int n = CLAMP(atoi(s), 0, 2000); + int n = atoi(s); + n = CLAMP(n, 0, 2000); if (n != m_pSndFile->m_nSamplePreAmp) { m_bEditsLocked=true; m_pSndFile->m_nSamplePreAmp = n; @@ -432,7 +436,8 @@ m_EditGlobalVol.GetWindowText(s, sizeof(s)); if (s[0]) { - UINT n = CLAMP(atoi(s), 0, 128); + UINT n = atoi(s); + n = CLAMP(n, 0, 128); if (n != (m_pSndFile->m_nDefaultGlobalVolume >> 1)) { m_bEditsLocked=true; @@ -458,7 +463,8 @@ m_EditRestartPos.GetWindowText(s, sizeof(s)); if (s[0]) { - UINT n = CLAMP(atoi(s), 0, m_pSndFile->Order.size()); + UINT n = atoi(s); + n = CLAMP(n, 0, m_pSndFile->Order.size()); for (ORDERINDEX i = 0; i <= n; i++) if (m_pSndFile->Order[i] == m_pSndFile->Order.GetInvalidPatIndex()) return; Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-07-26 23:50:13 UTC (rev 305) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-07-27 17:27:59 UTC (rev 306) @@ -3051,11 +3051,17 @@ _tcscpy(szPath, szFilenameFrom); } + TCHAR szOldDir[sizeof(directories[dir])]; // for comparison + _tcscpy(szOldDir, directories[dir]); + _tcscpy(directories[dir], szPath); - // When updating default directory, also update the working directory (if it hasn't been set yet). - if(szPath[0] && directories == m_szDefaultDirectory && !m_szWorkingDirectory[dir][0]) - SetWorkingDirectory(szPath, dir); + // When updating default directory, also update the working directory. + if(szPath[0] && directories == m_szDefaultDirectory) + { + if(_tcscmp(szOldDir, szPath) != 0) // update only if default directory has changed + SetWorkingDirectory(szPath, dir); + } } void CMainFrame::SetDefaultDirectory(const LPCTSTR szFilenameFrom, Directory dir, bool bStripFilename) Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-26 23:50:13 UTC (rev 305) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-27 17:27:59 UTC (rev 306) @@ -1363,15 +1363,12 @@ void CModDoc::OnFileWaveConvert() //------------------------------- { - CHAR path[_MAX_PATH]="", drive[_MAX_DRIVE]=""; - CHAR s[_MAX_PATH], fname[_MAX_FNAME]=""; + TCHAR fname[_MAX_FNAME]=""; CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); if ((!pMainFrm) || (!m_SndFile.GetType())) return; - _splitpath(GetPathName(), drive, path, fname, NULL); - strcpy(s, fname); - strcat(s, ".wav"); - CFileDialog dlg(FALSE, "wav", s, + _splitpath(GetPathName(), NULL, NULL, fname, NULL); + CFileDialog dlg(FALSE, "wav", fname, OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN, "Wave Files (*.wav)|*.wav||", pMainFrm); dlg.m_ofn.lpstrInitialDir = CMainFrame::GetWorkingDirectory(DIR_EXPORT); @@ -1383,6 +1380,7 @@ // will set default dir here because there's no setup option for export dir yet (feel free to add one...) pMainFrm->SetDefaultDirectory(dlg.GetPathName(), DIR_EXPORT, true); + TCHAR s[_MAX_PATH]; strcpy(s, dlg.GetPathName()); // Saving as wave file @@ -1492,16 +1490,12 @@ void CModDoc::OnFileMP3Convert() //------------------------------ { - CHAR path[_MAX_PATH]="", drive[_MAX_DRIVE]=""; - CHAR s[_MAX_PATH], fname[_MAX_FNAME]="", fext[_MAX_EXT] = ""; + TCHAR sFName[_MAX_FNAME] = ""; CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); if ((!pMainFrm) || (!m_SndFile.GetType())) return; - _splitpath(GetPathName(), drive, path, fname, NULL); - strcpy(s, drive); - strcat(s, path); - strcat(s, fname); - CFileDialog dlg(FALSE, "mp3", s, + _splitpath(GetPathName(), NULL, NULL, sFName, NULL); + CFileDialog dlg(FALSE, "mp3", sFName, OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN, "MPEG Layer III Files (*.mp3)|*.mp3|Layer3 Wave Files (*.wav)|*.wav||", pMainFrm); dlg.m_ofn.nFilterIndex = 0; @@ -1516,6 +1510,7 @@ // will set default dir here because there's no setup option for export dir yet (feel free to add one...) pMainFrm->SetDefaultDirectory(dlg.GetPathName(), DIR_EXPORT, true); + TCHAR s[_MAX_PATH], fext[_MAX_EXT]; strcpy(s, dlg.GetPathName()); _splitpath(s, NULL, NULL, NULL, fext); if (strlen(fext) <= 1) Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2009-07-26 23:50:13 UTC (rev 305) +++ trunk/OpenMPT/mptrack/Moddoc.h 2009-07-27 17:27:59 UTC (rev 306) @@ -125,6 +125,8 @@ DWORD m_dwNotifyType; PATTERNUNDOBUFFER PatternUndo[MAX_UNDO_LEVEL]; + bool bModifiedAutosave; // Modified since last autosave? + bool m_ShowSavedialog; // -> CODE#0015 @@ -142,7 +144,8 @@ void InitPlayer(); CSoundFile *GetSoundFile() { return &m_SndFile; } void SetPause(BOOL bPause) { m_bPaused = bPause; } - void SetModified(BOOL bModified=TRUE) { SetModifiedFlag(bModified); } + void SetModified(BOOL bModified=TRUE) { SetModifiedFlag(bModified); bModifiedAutosave = bModified; } + BOOL ModifiedSinceLastAutosave() { bool bRetval = bModifiedAutosave; bModifiedAutosave = false; return bRetval; } // return "IsModified" value and reset it until the next SetModified() (as this is only used for polling) void SetShowSaveDialog(bool b) {m_ShowSavedialog = b;} void PostMessageToAllViews(UINT uMsg, WPARAM wParam=0, LPARAM lParam=0); void SendMessageToActiveViews(UINT uMsg, WPARAM wParam=0, LPARAM lParam=0); Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-07-26 23:50:13 UTC (rev 305) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-07-27 17:27:59 UTC (rev 306) @@ -42,8 +42,7 @@ DWORD size; CHAR name[22]; BYTE type; - BYTE samples; - BYTE samplesh; + WORD samples; } XMINSTRUMENTHEADER; @@ -97,9 +96,11 @@ UINT unused_samples; bool bMadeWithModPlug = false; + // set this here already because XMs compressed with BoobieSqueezer will exit the function early + SetModFlag(MSF_COMPATIBLE_PLAY, true); m_nChannels = 0; - if ((!lpStream) || (dwMemLength < 0x200)) return FALSE; + if ((!lpStream) || (dwMemLength < 0xAA)) return FALSE; // the smallest XM I know is 174 Bytes if (_strnicmp((LPCSTR)lpStream, "Extended Module", 15)) return FALSE; memcpy(m_szNames[0], lpStream + 17, 20); dwHdrSize = LittleEndian(*((DWORD *)(lpStream+60))); @@ -298,8 +299,11 @@ UINT samplemap[32]; WORD nsamples; - if (dwMemPos + sizeof(XMINSTRUMENTHEADER) >= dwMemLength) return TRUE; - pih = (XMINSTRUMENTHEADER *)(lpStream+dwMemPos); + if (dwMemPos + sizeof(DWORD) >= dwMemLength) return TRUE; + DWORD ihsize = LittleEndian(*((DWORD *)(lpStream + dwMemPos))); + if (dwMemPos + ihsize >= dwMemLength) return TRUE; + + pih = (XMINSTRUMENTHEADER *)(lpStream + dwMemPos); if (dwMemPos + LittleEndian(pih->size) > dwMemLength) return TRUE; if ((Headers[iIns] = new INSTRUMENTHEADER) == NULL) continue; memset(Headers[iIns], 0, sizeof(INSTRUMENTHEADER)); @@ -308,14 +312,29 @@ Headers[iIns]->nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE; memcpy(Headers[iIns]->name, pih->name, 22); + if ((nsamples = pih->samples) > 0) { - if (dwMemPos + sizeof(XMSAMPLEHEADER) > dwMemLength) return TRUE; - memcpy(&xmsh, lpStream+dwMemPos+sizeof(XMINSTRUMENTHEADER), sizeof(XMSAMPLEHEADER)); + if (dwMemPos + sizeof(XMINSTRUMENTHEADER) + sizeof(DWORD) >= dwMemLength) return TRUE; + DWORD shsize = LittleEndian(*((DWORD *)(lpStream + dwMemPos + sizeof(XMINSTRUMENTHEADER)))); + + memset(&xmsh, 0, sizeof(XMSAMPLEHEADER)); + + // *very* dirty, but it works! + DWORD dwReadLength = sizeof(XMSAMPLEHEADER); + if(ihsize == 38 && (int)(shsize - ihsize) >= 0) // BoobieSqueezer compressed - ihsize = 38, shsize = 40 + dwReadLength = shsize - ihsize; + + if (dwMemPos + sizeof(XMINSTRUMENTHEADER) + dwReadLength >= dwMemLength || shsize > sizeof(XMSAMPLEHEADER)) + return TRUE; + else + memcpy(&xmsh, lpStream + dwMemPos + sizeof(XMINSTRUMENTHEADER), dwReadLength); + xmsh.shsize = LittleEndian(xmsh.shsize); + for (int i = 0; i < 24; ++i) { - xmsh.venv[i] = LittleEndianW(xmsh.venv[i]); - xmsh.penv[i] = LittleEndianW(xmsh.penv[i]); + xmsh.venv[i] = LittleEndianW(xmsh.venv[i]); + xmsh.penv[i] = LittleEndianW(xmsh.penv[i]); } xmsh.volfade = LittleEndianW(xmsh.volfade); xmsh.res = LittleEndianW(xmsh.res); @@ -609,8 +628,7 @@ bMadeWithModPlug = true; } - if(bMadeWithModPlug == false) - SetModFlag(MSF_COMPATIBLE_PLAY, true); + SetModFlag(MSF_COMPATIBLE_PLAY, !bMadeWithModPlug); // -> CODE#0027 // -> DESC="per-instrument volume ramping setup (refered as attack)" @@ -618,14 +636,14 @@ // Leave if no extra instrument settings are available (end of file reached) if(dwMemPos >= dwMemLength) return TRUE; - bool bInterpretMptMade = false; + bool bInterpretOpenMPTMade = false; // specific for OpenMPT 1.17+ (bMadeWithModPlug is also for MPT 1.16) LPCBYTE ptr = lpStream + dwMemPos; if(m_nInstruments) - ptr = LoadExtendedInstrumentProperties(ptr, lpStream+dwMemLength, &bInterpretMptMade); + ptr = LoadExtendedInstrumentProperties(ptr, lpStream+dwMemLength, &bInterpretOpenMPTMade); - LoadExtendedSongProperties(GetType(), ptr, lpStream, dwMemLength, &bInterpretMptMade); + LoadExtendedSongProperties(GetType(), ptr, lpStream, dwMemLength, &bInterpretOpenMPTMade); - if(bInterpretMptMade && m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 17, 2, 50)) + if(bInterpretOpenMPTMade && m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 17, 2, 50)) SetModFlag(MSF_MIDICC_BUGEMULATION, true); return TRUE; @@ -652,7 +670,7 @@ fwrite("Extended Module: ", 17, 1, f); fwrite(m_szNames[0], 20, 1, f); s[0] = 0x1A; - lstrcpy((LPSTR)&s[1], (nPacking) ? "MOD Plugin packed " : "FastTracker v2.00 "); + lstrcpy((LPSTR)&s[1], (nPacking) ? "MOD Plugin packed " : "Open ModPlugTracker "); s[21] = 0x04; s[22] = 0x01; fwrite(&s[0], 23, 1, f); Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-26 23:50:13 UTC (rev 305) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-27 17:27:59 UTC (rev 306) @@ -1965,7 +1965,7 @@ UINT CSoundFile::ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR lpMemFile, DWORD dwMemLength, const WORD format) //----------------------------------------------------------------------------------------------------------------------- { - if ((!pIns) || (pIns->nLength < 4) || (!lpMemFile)) return 0; + if ((!pIns) || (pIns->nLength < 2) || (!lpMemFile)) return 0; if(pIns->nLength > MAX_SAMPLE_LENGTH) pIns->nLength = MAX_SAMPLE_LENGTH; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-27 21:02:47
|
Revision: 307 http://modplug.svn.sourceforge.net/modplug/?rev=307&view=rev Author: saga-games Date: 2009-07-27 21:02:38 +0000 (Mon, 27 Jul 2009) Log Message: ----------- [Imp] Mod Specs: It is now possible to have modules with 1-3 channels, as this only seems to cause trouble with MOD files (so they still have 4 channels minimum of course). Adjusted some of the module readers for that reason. [Imp] IT Loading: Setting the "last saved with" version to 1.16 (instead of "created with") if module seems to be made with the old MPT [Imp] XM Loading: Doing the same for XM files now [Imp] XM Loading: Less hacky implementation of the instrument loader. Still works correctly with "normal" XM modules and BoobieSqueezed XMs. [Imp] XM Saving: Setting "Open ModPlug Tracker" in the "made with" field (as any other tracker put their signature in here as well) Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/soundlib/LOAD_AMF.CPP trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/LOAD_DMF.CPP trunk/OpenMPT/soundlib/LOAD_DSM.CPP trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/mod_specifications.h Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2009-07-27 17:27:59 UTC (rev 306) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2009-07-27 21:02:38 UTC (rev 307) @@ -235,7 +235,7 @@ // -! NEW_FEATURE#0023 } - wsprintf(s, "%s, %d channels", pszModType, m_pSndFile->m_nChannels); + wsprintf(s, "%s, %d channel%s", pszModType, m_pSndFile->m_nChannels, (m_pSndFile->m_nChannels != 1) ? "s" : ""); m_EditModType.SetWindowText(s); } if (dwHint & HINT_MPTSETUP) Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-27 17:27:59 UTC (rev 306) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-27 21:02:38 UTC (rev 307) @@ -3349,10 +3349,13 @@ if (!ChangeModType(dlg.m_nType)) return; bShowLog = TRUE; } - if ((dlg.m_nChannels >= 4) && (dlg.m_nChannels != GetSoundFile()->m_nChannels)) + + UINT nNewChannels = CLAMP(dlg.m_nChannels, m_SndFile.GetModSpecifications().channelsMin, m_SndFile.GetModSpecifications().channelsMax); + + if (nNewChannels != GetSoundFile()->m_nChannels) { const bool showCancelInRemoveDlg = m_SndFile.GetModSpecifications().channelsMax >= m_SndFile.GetNumChannels(); - if(ChangeNumChannels(dlg.m_nChannels, showCancelInRemoveDlg)) bShowLog = TRUE; + if(ChangeNumChannels(nNewChannels, showCancelInRemoveDlg)) bShowLog = TRUE; } if (bShowLog) ShowLog("Conversion Status", CMainFrame::GetMainFrame()); Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-07-27 17:27:59 UTC (rev 306) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-07-27 21:02:38 UTC (rev 307) @@ -2516,7 +2516,7 @@ CSoundFile* pSndFile; if (pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return; - if(pSndFile->m_nChannels <= 4) + if(pSndFile->m_nChannels <= pSndFile->GetModSpecifications().channelsMin) { CMainFrame::GetMainFrame()->MessageBox("No channel removed - channel number already at minimum.", "Remove channel", MB_OK | MB_ICONINFORMATION); return; Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-27 17:27:59 UTC (rev 306) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-27 21:02:38 UTC (rev 307) @@ -229,7 +229,7 @@ m_ChannelsBox.ResetContent(); for (CHANNELINDEX i=minChans; i<=maxChans; i++) { - wsprintf(s, "%d Channels", i); + wsprintf(s, "%d Channel%s", i, (i != 1) ? "s" : ""); m_ChannelsBox.SetItemData(m_ChannelsBox.AddString(s), i); } if(currChanSel > maxChans) @@ -581,7 +581,7 @@ } if (m_nRemove > 0) { - wsprintf(label, "Select %d channels to remove:", m_nRemove); + wsprintf(label, "Select %d channel%s to remove:", m_nRemove, (m_nRemove != 1) ? "s" : ""); } else { wsprintf(label, "Select channels to remove (the minimum number of remaining channels is %d)", m_pSndFile->GetModSpecifications().channelsMin); } Modified: trunk/OpenMPT/soundlib/LOAD_AMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2009-07-27 17:27:59 UTC (rev 306) +++ trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2009-07-27 21:02:38 UTC (rev 307) @@ -268,7 +268,7 @@ || (pfh->version < 10) || (pfh->version > 14) || (!LittleEndianW(pfh->numtracks)) || (!pfh->numorders) || (pfh->numorders > MAX_PATTERNS) || (!pfh->numsamples) || (pfh->numsamples > MAX_SAMPLES) - || (pfh->numchannels < 4) || (pfh->numchannels > 32)) + || (pfh->numchannels < 1) || (pfh->numchannels > 32)) return FALSE; memcpy(m_szNames[0], pfh->title, 31); dwMemPos = sizeof(AMFFILEHEADER); Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2009-07-27 17:27:59 UTC (rev 306) +++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2009-07-27 21:02:38 UTC (rev 307) @@ -116,7 +116,7 @@ nPatterns = BigEndianW(pfh->patterns); m_nType = MOD_TYPE_DBM; m_nChannels = BigEndianW(pfh->channels); - if (m_nChannels < 4) m_nChannels = 4; + if (m_nChannels < 1) m_nChannels = 1; if (m_nChannels > 64) m_nChannels = 64; memcpy(m_szNames[0], (pfh->songname[0]) ? pfh->songname : pfh->songname2, 32); m_szNames[0][31] = 0; Modified: trunk/OpenMPT/soundlib/LOAD_DMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2009-07-27 17:27:59 UTC (rev 306) +++ trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2009-07-27 21:02:38 UTC (rev 307) @@ -164,7 +164,7 @@ m_nChannels = patt->tracks; if (m_nChannels < patt->firstpatinfo) m_nChannels = patt->firstpatinfo; if (m_nChannels > 32) m_nChannels = 32; - if (m_nChannels < 4) m_nChannels = 4; + if (m_nChannels < 1) m_nChannels = 1; for (UINT npat=0; npat<numpat; npat++) { DMFTRACK *pt = (DMFTRACK *)(lpStream+dwPos); Modified: trunk/OpenMPT/soundlib/LOAD_DSM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2009-07-27 17:27:59 UTC (rev 306) +++ trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2009-07-27 21:02:38 UTC (rev 307) @@ -101,7 +101,7 @@ dwMemPos = sizeof(DSMFILEHEADER) + pfh->song_len; m_nType = MOD_TYPE_DSM; m_nChannels = psong->numtrk; - if (m_nChannels < 4) m_nChannels = 4; + if (m_nChannels < 1) m_nChannels = 1; if (m_nChannels > 16) m_nChannels = 16; m_nSamples = psong->numsmp; if (m_nSamples > MAX_SAMPLES) m_nSamples = MAX_SAMPLES; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-07-27 17:27:59 UTC (rev 306) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-07-27 21:02:38 UTC (rev 307) @@ -963,7 +963,7 @@ //TODO: Check whether above interpretation is reasonable especially for //values 0x217 and 0x200 which are the values used in 1.16. if(pifh->cwtv == 0x217 && pifh->cmwt == 0x200) - m_dwCreatedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 0, 0); + m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 0, 0); } } Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-27 17:27:59 UTC (rev 306) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-27 21:02:38 UTC (rev 307) @@ -291,7 +291,7 @@ ChnSettings[ich].dwFlags = 0; } } - if (m_nChannels < 4) m_nChannels = 4; + if (m_nChannels < 1) m_nChannels = 1; if ((psfh.cwtv < 0x1320) || (psfh.flags & 0x40)) m_dwSongFlags |= SONG_FASTVOLSLIDES; // Reading pattern order UINT iord = psfh.ordnum; Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-07-27 17:27:59 UTC (rev 306) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-07-27 21:02:38 UTC (rev 307) @@ -39,16 +39,16 @@ typedef struct tagXMINSTRUMENTHEADER { - DWORD size; + DWORD size; // size of XMINSTRUMENTHEADER + XMSAMPLEHEADER CHAR name[22]; - BYTE type; + BYTE type; // should always be 0 WORD samples; } XMINSTRUMENTHEADER; typedef struct tagXMSAMPLEHEADER { - DWORD shsize; + DWORD shsize; // size of XMSAMPLESTRUCT BYTE snum[96]; WORD venv[24]; WORD penv[24]; @@ -315,21 +315,18 @@ if ((nsamples = pih->samples) > 0) { - if (dwMemPos + sizeof(XMINSTRUMENTHEADER) + sizeof(DWORD) >= dwMemLength) return TRUE; - DWORD shsize = LittleEndian(*((DWORD *)(lpStream + dwMemPos + sizeof(XMINSTRUMENTHEADER)))); + /* we have sample, so let's read the rest of this instrument + the header that is being read here is not the sample header, though, + it's rather the instrument settings. */ + if (dwMemPos + ihsize >= dwMemLength) + return TRUE; + memset(&xmsh, 0, sizeof(XMSAMPLEHEADER)); - - // *very* dirty, but it works! - DWORD dwReadLength = sizeof(XMSAMPLEHEADER); - if(ihsize == 38 && (int)(shsize - ihsize) >= 0) // BoobieSqueezer compressed - ihsize = 38, shsize = 40 - dwReadLength = shsize - ihsize; + memcpy(&xmsh, + lpStream + dwMemPos + sizeof(XMINSTRUMENTHEADER), + min(ihsize - sizeof(XMINSTRUMENTHEADER), sizeof(XMSAMPLEHEADER))); - if (dwMemPos + sizeof(XMINSTRUMENTHEADER) + dwReadLength >= dwMemLength || shsize > sizeof(XMSAMPLEHEADER)) - return TRUE; - else - memcpy(&xmsh, lpStream + dwMemPos + sizeof(XMINSTRUMENTHEADER), dwReadLength); - xmsh.shsize = LittleEndian(xmsh.shsize); for (int i = 0; i < 24; ++i) { @@ -628,7 +625,11 @@ bMadeWithModPlug = true; } - SetModFlag(MSF_COMPATIBLE_PLAY, !bMadeWithModPlug); + if(bMadeWithModPlug) + { + SetModFlag(MSF_COMPATIBLE_PLAY, false); + m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 0, 0); + } // -> CODE#0027 // -> DESC="per-instrument volume ramping setup (refered as attack)" @@ -670,7 +671,7 @@ fwrite("Extended Module: ", 17, 1, f); fwrite(m_szNames[0], 20, 1, f); s[0] = 0x1A; - lstrcpy((LPSTR)&s[1], (nPacking) ? "MOD Plugin packed " : "Open ModPlugTracker "); + lstrcpy((LPSTR)&s[1], (nPacking) ? "MOD Plugin packed " : "Open ModPlug Tracker"); s[21] = 0x04; s[22] = 0x01; fwrite(&s[0], 23, 1, f); Modified: trunk/OpenMPT/soundlib/mod_specifications.h =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.h 2009-07-27 17:27:59 UTC (rev 306) +++ trunk/OpenMPT/soundlib/mod_specifications.h 2009-07-27 21:02:38 UTC (rev 307) @@ -9,15 +9,15 @@ struct CModSpecifications //======================= { - // Return true iff format supports given note. + // Return true if format supports given note. bool HasNote(MODCOMMAND::NOTE note) const; //NOTE: If changing order, update all initializations below. char fileExtension[6]; // File extension without dot. MODCOMMAND::NOTE noteMin; // Minimum note index (index starts from 1) MODCOMMAND::NOTE noteMax; // Maximum note index (index starts from 1) - bool hasNoteCut; // True iff format has notecut. - bool hasNoteOff; // True iff format has noteoff. + bool hasNoteCut; // True if format has notecut. + bool hasNoteOff; // True if format has noteoff. PATTERNINDEX patternsMax; ORDERINDEX ordersMax; CHANNELINDEX channelsMin; // Minimum number of editable channels in pattern. @@ -53,7 +53,7 @@ true, //Has noteoff. 4000, //Pattern max. 4000, //Order max. - 4, //Channel min + 1, //Channel min 127, //Channel max 32, //Min tempo 512, //Max tempo @@ -132,7 +132,7 @@ true, //Has noteoff. 64, //Pattern max. 128, //Order max. - 4, //Channel min + 1, //Channel min 32, //Channel max 32, //Min tempo 255, //Max tempo @@ -158,7 +158,7 @@ true, //Has noteoff. 240, //Pattern max. 256, //Order max. - 4, //Channel min + 1, //Channel min 127, //Channel max 32, //Min tempo 512, //Max tempo @@ -183,7 +183,7 @@ false, //No noteoff. 240, //Pattern max. 256, //Order max. - 4, //Channel min + 1, //Channel min 32, //Channel max 32, //Min tempo 255, //Max tempo @@ -209,7 +209,7 @@ false, //No noteoff. 240, //Pattern max. 256, //Order max. - 4, //Channel min + 1, //Channel min 32, //Channel max 32, //Min tempo 255, //Max tempo @@ -234,7 +234,7 @@ true, //Has noteoff. 240, //Pattern max. 200, //Order max. - 4, //Channel min + 1, //Channel min 64, //Channel max 32, //Min tempo 255, //Max tempo @@ -259,7 +259,7 @@ true, //Has noteoff. 240, //Pattern max. 256, //Order max. - 4, //Channel min + 1, //Channel min 127, //Channel max 32, //Min tempo 512, //Max tempo This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-29 14:08:48
|
Revision: 309 http://modplug.svn.sourceforge.net/modplug/?rev=309&view=rev Author: saga-games Date: 2009-07-29 12:20:51 +0000 (Wed, 29 Jul 2009) Log Message: ----------- [Imp] Sample editor: If sample length is 0, the "add silence / resize sample" dialog will switch into "resize" mode automatically (not a real difference, but looks cleaner) [Imp] Format conversion: \xx is converted to Zxx when converting to / saving S3M files or "compatible" IT files [Imp] S3M Loader: Recognize OpenMPT version in S3M header Modified Paths: -------------- trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-07-28 13:34:18 UTC (rev 308) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-07-29 12:20:51 UTC (rev 309) @@ -380,6 +380,7 @@ { case CMD_PANNING8: m->param = (m->param + 1) >> 1; + break; case CMD_S3MCMDEX: if(m->param == 0x91) { @@ -387,6 +388,10 @@ m->command = CMD_PANNING8; m->param = 0xA4; } + break; + case CMD_SMOOTHMIDI: + m->command = CMD_MIDI; + break; default: break; } Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2009-07-28 13:34:18 UTC (rev 308) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2009-07-29 12:20:51 UTC (rev 309) @@ -354,12 +354,26 @@ DECLARE_MESSAGE_MAP() public: - UINT m_nSamples; - UINT m_nLength; - char m_nEditOption; // 1 = add at beginning, 2 = add at end, 3 = resize + UINT m_nSamples; // Add x samples (also containes the return value in all cases) + UINT m_nLength; // Set size to x samples (init value: current sample size) + char m_nEditOption; // 1 = add at beginning, 2 = add at end, 3 = resize public: - CAddSilenceDlg(CWnd *parent, UINT nSamples = 32, UINT nOrigLength = 1024):CDialog(IDD_ADDSILENCE, parent) { m_nSamples = nSamples; m_nLength = nOrigLength; m_nEditOption = 2; } + CAddSilenceDlg(CWnd *parent, UINT nSamples = 32, UINT nOrigLength = 64) : CDialog(IDD_ADDSILENCE, parent) + { + m_nSamples = nSamples; + if(nOrigLength > 0) + { + m_nLength = nOrigLength; + m_nEditOption = 2; + } + else + { + m_nLength = 64; + m_nEditOption = 3; + } + } + virtual BOOL OnInitDialog(); virtual void OnOK(); }; Modified: trunk/OpenMPT/soundlib/Fastmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp 2009-07-28 13:34:18 UTC (rev 308) +++ trunk/OpenMPT/soundlib/Fastmix.cpp 2009-07-29 12:20:51 UTC (rev 309) @@ -1478,6 +1478,8 @@ LONG nDeltaLo = 0x10000 - (pChn->nPosLo & 0xffff); pChn->nPos = pChn->nLength - nDeltaHi - (nDeltaLo>>16); pChn->nPosLo = nDeltaLo & 0xffff; + // Impulse Tracker's software mixer would put a -2 (instead of -1) in the following line (doesn't happen on a GUS) + // TODO: How can we add IT compatibility here without slowing down the mixing routines? if ((pChn->nPos <= pChn->nLoopStart) || (pChn->nPos >= pChn->nLength)) pChn->nPos = pChn->nLength-1; } else { Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-07-28 13:34:18 UTC (rev 308) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-07-29 12:20:51 UTC (rev 309) @@ -2858,7 +2858,7 @@ if (vol != 0xFF) b |= 4; if (command) { - S3MSaveConvert(&command, ¶m, TRUE); + S3MSaveConvert(&command, ¶m, true, true); if (command) b |= 8; } // Packing information Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-28 13:34:18 UTC (rev 308) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-29 12:20:51 UTC (rev 309) @@ -12,9 +12,7 @@ #include "sndfile.h" #include "../mptrack/moddoc.h" #include "../mptrack/misc_util.h" -#ifndef MODPLUG_NO_FILESAVE #include "../mptrack/version.h" -#endif #pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data" @@ -154,8 +152,8 @@ } -void CSoundFile::S3MSaveConvert(UINT *pcmd, UINT *pprm, BOOL bIT) const -//--------------------------------------------------------------------- +void CSoundFile::S3MSaveConvert(UINT *pcmd, UINT *pprm, BOOL bIT, BOOL bCompatible) const +//--------------------------------------------------------------------------------------- { UINT command = *pcmd; UINT param = *pprm; @@ -186,20 +184,25 @@ case CMD_GLOBALVOLSLIDE: command = 'W'; break; case CMD_PANNING8: command = 'X'; - if ((bIT) && (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) && (m_nType != MOD_TYPE_XM)) + if (bIT && !(m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM))) { if (param == 0xA4) { command = 'S'; param = 0x91; } else if (param <= 0x80) { param <<= 1; if (param > 255) param = 255; } else command = param = 0; } else - if ((!bIT) && ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) || (m_nType == MOD_TYPE_XM))) + if (!bIT && (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM))) { param >>= 1; } break; case CMD_PANBRELLO: command = 'Y'; break; case CMD_MIDI: command = 'Z'; break; - case CMD_SMOOTHMIDI: command = '\\'; break; //rewbs.smoothVST + case CMD_SMOOTHMIDI: //rewbs.smoothVST + if(bCompatible) + command = 'Z'; + else + command = '\\'; + break; case CMD_VELOCITY: command = ':'; break; //rewbs.velocity case CMD_XFINEPORTAUPDOWN: if (param & 0x0F) switch(param & 0xF0) @@ -262,6 +265,9 @@ psfh.scrm = LittleEndian(psfh.scrm); psfh.special = LittleEndianW(psfh.special); + if((psfh.cwtv & 0xF000) == 0x5000) // OpenMPT Version number (Major.Minor) + m_dwLastSavedWithVersion = (psfh.cwtv & 0x0FFF) << 16; + if ((!lpStream) || (dwMemLength <= sizeof(S3MFILEHEADER)+sizeof(S3MSAMPLESTRUCT)+64)) return FALSE; if (psfh.scrm != 0x4D524353) return FALSE; dwMemPos = 0x60; @@ -362,7 +368,6 @@ if (insfile[iSmp] > dwMemLength) insfile[iSmp] &= 0xFFFF; if ((Ins[iSmp].nLoopStart >= Ins[iSmp].nLoopEnd) || (Ins[iSmp].nLoopEnd - Ins[iSmp].nLoopStart < 1)) Ins[iSmp].nLoopStart = Ins[iSmp].nLoopEnd = 0; - UINT iLooplength = Ins[iSmp].nLoopEnd - Ins[iSmp].nLoopStart; Ins[iSmp].nPan = 0x80; //ASSERT(iLooplength == 0 || iLooplength > 4); } @@ -515,10 +520,10 @@ // Version info following: ST3.20 = 0x1320 // Most significant nibble: 1 = ST3, 2 = Orpheus, 3 = IT, 4 = Schism, 5 = MPT - // Following: One nibble = Major version, one byte = Minor version + // Following: One nibble = Major version, one byte = Minor version (hex) MptVersion::VersionNum vVersion = MptVersion::num; header[0x28] = (BYTE)((vVersion >> 16) & 0xFF); // the "17" in OpenMPT 1.17 - header[0x29] = 0x50 | (BYTE)((vVersion >> 24) & 0x0F); // the "1" in OpenMPT 1.17 + OpenMPT Identifier 5 (works only for versions up to 15.255 :)) + header[0x29] = 0x50 | (BYTE)((vVersion >> 24) & 0x0F); // the "1" in OpenMPT 1.17 + OpenMPT Identifier 5 (works only for versions up to 15.99 :)) header[0x2A] = 0x02; // Version = 1 => Signed samples header[0x2B] = 0x00; header[0x2C] = 'S'; @@ -606,7 +611,7 @@ if (volcmd == VOLCMD_PANNING) { vol |= 0x80; b |= 0x40; } if (command) { - S3MSaveConvert(&command, ¶m, FALSE); + S3MSaveConvert(&command, ¶m, false, true); if (command) b |= 0x80; } if (b & 0xE0) Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-07-28 13:34:18 UTC (rev 308) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-07-29 12:20:51 UTC (rev 309) @@ -1055,7 +1055,7 @@ UINT GetSaveFormats() const; void ConvertModCommand(MODCOMMAND *) const; void S3MConvert(MODCOMMAND *m, BOOL bIT) const; - void S3MSaveConvert(UINT *pcmd, UINT *pprm, BOOL bIT) const; + void S3MSaveConvert(UINT *pcmd, UINT *pprm, BOOL bIT, BOOL bCompatible = false) const; WORD ModSaveCommand(const MODCOMMAND *m, BOOL bXM) const; public: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-07-29 22:18:31
|
Revision: 310 http://modplug.svn.sourceforge.net/modplug/?rev=310&view=rev Author: saga-games Date: 2009-07-29 22:18:17 +0000 (Wed, 29 Jul 2009) Log Message: ----------- [Ref] VS2008 decided once again to completely rewrite mptrack.rc [Ref] Renamed the midi setup dialog resource so it fits in the current scheme [Fix] Playback: Process pattern break commands on last pattern properly [Imp] Playback: Added option to not reset all channels and variables when looping a module. This might become a song-specific variable, though. Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Moptions.cpp trunk/OpenMPT/mptrack/Mpdlgs.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-07-29 12:20:51 UTC (rev 309) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-07-29 22:18:17 UTC (rev 310) @@ -429,6 +429,8 @@ m_dwPatternSetup = GetPrivateProfileDWord("Pattern Editor", "PatternSetup", m_dwPatternSetup, iniFile); if(gcsPreviousVersion != "" && MptVersion::ToNum(gcsPreviousVersion) < MAKE_VERSION_NUMERIC(1,17,02,50)) m_dwPatternSetup |= PATTERN_NOTEFADE; + if(gcsPreviousVersion != "" && MptVersion::ToNum(gcsPreviousVersion) < MAKE_VERSION_NUMERIC(1,17,03,01)) + m_dwPatternSetup |= PATTERN_RESETCHANNELS; m_nRowSpacing = GetPrivateProfileDWord("Pattern Editor", "RowSpacing", 16, iniFile); m_nRowSpacing2 = GetPrivateProfileDWord("Pattern Editor", "RowSpacing2", 4, iniFile); @@ -563,6 +565,7 @@ RegQueryValueEx(key, "MidiDevice", NULL, &dwREG_DWORD, (LPBYTE)&m_nMidiDevice, &dwDWORDSize); RegQueryValueEx(key, "PatternSetup", NULL, &dwREG_DWORD, (LPBYTE)&m_dwPatternSetup, &dwDWORDSize); m_dwPatternSetup |= PATTERN_NOTEFADE; // Set flag to maintain old behaviour(was changed in 1.17.02.50). + m_dwPatternSetup |= PATTERN_RESETCHANNELS; // Set flag to reset channels on loop was changed in 1.17.03.01). RegQueryValueEx(key, "RowSpacing", NULL, &dwREG_DWORD, (LPBYTE)&m_nRowSpacing, &dwDWORDSize); RegQueryValueEx(key, "RowSpacing2", NULL, &dwREG_DWORD, (LPBYTE)&m_nRowSpacing2, &dwDWORDSize); RegQueryValueEx(key, "LoopSong", NULL, &dwREG_DWORD, (LPBYTE)&gbLoopSong, &dwDWORDSize); Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2009-07-29 12:20:51 UTC (rev 309) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-07-29 22:18:17 UTC (rev 310) @@ -169,30 +169,30 @@ #define NUM_VUMETER_PENS 32 // Pattern Setup (contains also non-pattern related settings) -#define PATTERN_PLAYNEWNOTE 0x01 -#define PATTERN_LARGECOMMENTS 0x02 -#define PATTERN_STDHIGHLIGHT 0x04 -#define PATTERN_SMALLFONT 0x08 -#define PATTERN_CENTERROW 0x10 -#define PATTERN_WRAP 0x20 -#define PATTERN_EFFECTHILIGHT 0x40 -#define PATTERN_HEXDISPLAY 0x80 -#define PATTERN_FLATBUTTONS 0x100 -#define PATTERN_CREATEBACKUP 0x200 -#define PATTERN_SINGLEEXPAND 0x400 -#define PATTERN_AUTOSPACEBAR 0x800 -#define PATTERN_NOEXTRALOUD 0x1000 -#define PATTERN_DRAGNDROPEDIT 0x2000 -#define PATTERN_2NDHIGHLIGHT 0x4000 -#define PATTERN_MUTECHNMODE 0x8000 -#define PATTERN_SHOWPREVIOUS 0x10000 -#define PATTERN_CONTSCROLL 0x20000 -#define PATTERN_KBDNOTEOFF 0x40000 -#define PATTERN_FOLLOWSONGOFF 0x80000 //rewbs.noFollow +#define PATTERN_PLAYNEWNOTE 0x01 +#define PATTERN_LARGECOMMENTS 0x02 +#define PATTERN_STDHIGHLIGHT 0x04 +#define PATTERN_SMALLFONT 0x08 +#define PATTERN_CENTERROW 0x10 +#define PATTERN_WRAP 0x20 +#define PATTERN_EFFECTHILIGHT 0x40 +#define PATTERN_HEXDISPLAY 0x80 +#define PATTERN_FLATBUTTONS 0x100 +#define PATTERN_CREATEBACKUP 0x200 +#define PATTERN_SINGLEEXPAND 0x400 +#define PATTERN_AUTOSPACEBAR 0x800 +#define PATTERN_NOEXTRALOUD 0x1000 +#define PATTERN_DRAGNDROPEDIT 0x2000 +#define PATTERN_2NDHIGHLIGHT 0x4000 +#define PATTERN_MUTECHNMODE 0x8000 +#define PATTERN_SHOWPREVIOUS 0x10000 +#define PATTERN_CONTSCROLL 0x20000 +#define PATTERN_KBDNOTEOFF 0x40000 +#define PATTERN_FOLLOWSONGOFF 0x80000 //rewbs.noFollow // -> CODE#0017 // -> DESC="midi in record mode setup option" -#define PATTERN_MIDIRECORD 0x100000 +#define PATTERN_MIDIRECORD 0x100000 // -! BEHAVIOUR_CHANGE#0017 // -> CODE#0022 @@ -201,14 +201,15 @@ // rewbs: this options is now available under song settings. It is therefore saved with the song. // -! NEW_FEATURE#0022 -#define PATTERN_HILITETIMESIGS 0x400000 +#define PATTERN_HILITETIMESIGS 0x400000 -#define PATTERN_OLDCTXMENUSTYLE 0x800000 -#define PATTERN_SYNCMUTE 0x1000000 -#define PATTERN_AUTODELAY 0x2000000 -#define PATTERN_NOTEFADE 0x4000000 -#define PATTERN_ECHOPASTE 0x8000000 +#define PATTERN_OLDCTXMENUSTYLE 0x800000 +#define PATTERN_SYNCMUTE 0x1000000 +#define PATTERN_AUTODELAY 0x2000000 +#define PATTERN_NOTEFADE 0x4000000 +#define PATTERN_ECHOPASTE 0x8000000 #define PATTERN_POSITIONAWARETIMER 0x10000000 +#define PATTERN_RESETCHANNELS 0x20000000 // Keyboard Setup Modified: trunk/OpenMPT/mptrack/Moptions.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moptions.cpp 2009-07-29 12:20:51 UTC (rev 309) +++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-07-29 22:18:17 UTC (rev 310) @@ -607,6 +607,7 @@ OPTGEN_PATNOTEFADE, OPTGEN_ECHOPASTE, OPTGEN_POSITIONAWARETIMER, + OPTGEN_RESETCHANNELS, OPTGEN_MAXOPTIONS }; @@ -645,6 +646,7 @@ {"Note fade on key up", "Enable to fade/stop notes on key up in pattern tab." }, {"Echo paste mode", "Wrap pasted pattern data into next pattern. This is useful for creating echo channels."}, {"Position aware timer", "If enabled, timer will show the playback position time if possible instead of running timer."}, + {"Reset channels on loop", "If enabled, channels will be reset to their initial state when song looping is enabled.\nNote: This does not affect manual song loops (i.e. triggered by pattern commands)"}, }; @@ -709,6 +711,7 @@ case OPTGEN_PATNOTEFADE: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_NOTEFADE); break; case OPTGEN_ECHOPASTE: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_ECHOPASTE); break; case OPTGEN_POSITIONAWARETIMER: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_POSITIONAWARETIMER); break; + case OPTGEN_RESETCHANNELS: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_RESETCHANNELS); break; } m_CheckList.SetCheck(i, (bCheck) ? TRUE : FALSE); } @@ -777,6 +780,7 @@ case OPTGEN_PATNOTEFADE: mask = PATTERN_NOTEFADE; break; case OPTGEN_ECHOPASTE: mask = PATTERN_ECHOPASTE; break; case OPTGEN_POSITIONAWARETIMER: mask = PATTERN_POSITIONAWARETIMER; break; + case OPTGEN_RESETCHANNELS: mask = PATTERN_RESETCHANNELS; break; } if (bCheck) CMainFrame::m_dwPatternSetup |= mask; else CMainFrame::m_dwPatternSetup &= ~mask; Modified: trunk/OpenMPT/mptrack/Mpdlgs.h =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.h 2009-07-29 12:20:51 UTC (rev 309) +++ trunk/OpenMPT/mptrack/Mpdlgs.h 2009-07-29 22:18:17 UTC (rev 310) @@ -158,7 +158,7 @@ CSpinButtonCtrl m_SpinSpd, m_SpinPat; public: - CMidiSetupDlg(DWORD d, LONG n):CPropertyPage(IDD_MIDISETUP) + CMidiSetupDlg(DWORD d, LONG n):CPropertyPage(IDD_OPTIONS_MIDI) { m_dwMidiSetup = d; m_nMidiDevice = n; } protected: Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-07-29 12:20:51 UTC (rev 309) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-07-29 22:18:17 UTC (rev 310) @@ -68,218 +68,8 @@ #pragma code_page(1252) #endif //_WIN32 -#ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 9, 1\r\n" - "#pragma code_page(1252)\r\n" - "#endif\r\n" - "#include ""res\\mptrack.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDR_MAINFRAME ICON "res\\mptrack.ico" -IDR_MODULETYPE ICON "res\\moddoc.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_MPTRACK BITMAP "res\\mptrack.bmp" -IDB_IMAGELIST BITMAP "res\\img_list.bmp" -IDB_PATTERNS BITMAP "res\\patterns.bmp" -IDB_PATTERNVIEW BITMAP "res\\view_pat.bmp" -IDB_COLORSETUP BITMAP "res\\colors.bmp" -IDB_VUMETERS BITMAP "res\\vumeters.bmp" -IDB_ENVTOOLBAR BITMAP "res\\envbar.bmp" -IDB_SMPTOOLBAR BITMAP "res\\smptoolb.bmp" -IDB_VISNODE BITMAP "res\\bitmap1.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MAINFRAME MENU -BEGIN - POPUP "&File" - BEGIN - POPUP "&New\tCtrl+N" - BEGIN - MENUITEM "&IT", ID_FILE_NEWIT - MENUITEM "&XM", ID_FILE_NEWXM - MENUITEM "&S3M", ID_FILE_NEWS3M - MENUITEM "M&OD", ID_FILE_NEWMOD - MENUITEM "IT &Project", ID_NEW_ITPROJECT - MENUITEM "&MPTM (experimental)", ID_NEW_MPT - END - MENUITEM "&Open...\tCtrl+O", 57601 - MENUITEM "&Close", ID_FILE_CLOSE - MENUITEM "&Save\tCtrl+S", ID_FILE_SAVE - MENUITEM "Save &As...", ID_FILE_SAVE_AS - MENUITEM "Save as &Wave...", ID_FILE_SAVEASWAVE - MENUITEM "Save as M&P3...", ID_FILE_SAVEASMP3 - MENUITEM "Export as M&IDI...", ID_FILE_SAVEMIDI - MENUITEM "Export &unraped...", ID_FILE_SAVECOMPAT - MENUITEM SEPARATOR - MENUITEM "Import &MIDI Library...", ID_IMPORT_MIDILIB - MENUITEM "Add Sound &Bank...", ID_ADD_SOUNDBANK - MENUITEM SEPARATOR - MENUITEM "Recent File", ID_FILE_MRU_FILE1, GRAYED - MENUITEM SEPARATOR - MENUITEM "E&xit", ID_APP_EXIT - END - POPUP "P&layer" - BEGIN - MENUITEM "&Play\tF5", ID_PLAYER_PLAY - MENUITEM "P&lay from start\tF6", ID_PLAYER_PLAYFROMSTART - MENUITEM "&Stop\tESC", ID_PLAYER_STOP - MENUITEM "P&ause\tF8", ID_PLAYER_PAUSE - MENUITEM "&MIDI Record\tF9", ID_MIDI_RECORD - MENUITEM SEPARATOR - MENUITEM "&Estimate song length", ID_ESTIMATESONGLENGTH - MENUITEM "Approx. real &BPM", ID_APPROX_BPM - END - POPUP "&Edit" - BEGIN - MENUITEM "&Undo\tCtrl+Z", ID_EDIT_UNDO - MENUITEM SEPARATOR - MENUITEM "Cu&t\tCtrl+X", ID_EDIT_CUT - MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY - MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE - MENUITEM "&Mix Paste\tCtrl+M", ID_EDIT_PASTE_SPECIAL - MENUITEM "Select &All\tCtrl+5", ID_EDIT_SELECT_ALL - MENUITEM SEPARATOR - POPUP "C&leanup" - BEGIN - MENUITEM "&Rearrange Patterns", ID_CLEANUP_REARRANGE - MENUITEM "&Cleanup Instruments", ID_CLEANUP_INSTRUMENTS - MENUITEM "Clean&up Samples", ID_CLEANUP_SAMPLES - MENUITEM "Cleanup Pa&tterns", ID_CLEANUP_PATTERNS - MENUITEM "Cleanup S&ong", ID_CLEANUP_SONG - MENUITEM "Remove &All Instruments", ID_INSTRUMENTS_REMOVEALL - MENUITEM "Cleanup &Plugins", ID_CLEANUP_PLUGS - MENUITEM "Co&mpo Cleanup", ID_CLEANUP_COMPO - END - MENUITEM SEPARATOR - MENUITEM "&Find\tCtrl+F", ID_EDIT_FIND - MENUITEM "Find Next\tF3", ID_EDIT_FINDNEXT - MENUITEM "Go to...", ID_EDIT_GOTO_MENU - END - POPUP "&View" - BEGIN - MENUITEM "&Globals\tAlt+G", ID_VIEW_GLOBALS - MENUITEM "&Patterns\tAlt+P", ID_VIEW_PATTERNS - MENUITEM "&Samples\tAlt+S", ID_VIEW_SAMPLES - MENUITEM "&Instruments\tAlt+N", ID_VIEW_INSTRUMENTS - MENUITEM "&Comments\tShift+F9", ID_VIEW_COMMENTS - MENUITEM SEPARATOR - POPUP "&Toolbars" - BEGIN - MENUITEM "&Main", ID_VIEW_TOOLBAR - MENUITEM "&Tree", IDD_TREEVIEW - END - MENUITEM SEPARATOR - MENUITEM "Set&up...", ID_VIEW_OPTIONS - MENUITEM "Add &Plugin...", ID_PLUGIN_SETUP - MENUITEM "Channel &Manager...", ID_CHANNEL_MANAGER - MENUITEM "Song Properties...", ID_VIEW_SONGPROPERTIES - MENUITEM "MIDI mapping...", ID_VIEW_MIDIMAPPING - END - POPUP "&Window" - BEGIN - MENUITEM "&New Window", ID_WINDOW_NEW - MENUITEM SEPARATOR - MENUITEM "&Cascade", ID_WINDOW_CASCADE - MENUITEM "&Tile Horizontal", ID_WINDOW_TILE_HORZ - MENUITEM "Tile &Vertical", ID_WINDOW_TILE_VERT - MENUITEM "&Arrange Icons", ID_WINDOW_ARRANGE - MENUITEM "S&plit", ID_WINDOW_SPLIT - END - POPUP "&Help" - BEGIN - MENUITEM "&Contents", ID_HELP_FINDER - MENUITEM "&Search...", ID_HELP_SEARCH - MENUITEM "&Report a bug", ID_REPORT_BUG - MENUITEM SEPARATOR - POPUP "&Internet" - BEGIN - MENUITEM "Modplug Central &Forums", ID_NETLINK_FORUMS - MENUITEM "OpenMPT Wiki", ID_NETLINK_OPENMPTWIKI - MENUITEM "OpenMPT Wiki (German)", ID_NETLINK_OPENMPTWIKI_GERMAN - MENUITEM "MPT-FR", ID_NETLINK_MPTFR - MENUITEM "&Kvr Audio (plugins)", ID_NETLINK_PLUGINS - MENUITEM "The Mod Archive", ID_NETLINK_MODARCHIVE - END - MENUITEM SEPARATOR - MENUITEM "&About OpenMPT...", ID_APP_ABOUT - END -END - -IDR_TOOLBARS MENU -BEGIN - POPUP "&ToolBars" - BEGIN - MENUITEM "&Main", ID_VIEW_TOOLBAR - MENUITEM "&Tree", IDD_TREEVIEW - END -END - -IDR_ENVELOPES MENU -BEGIN - POPUP "&Envelope" - BEGIN - MENUITEM "&Loop", ID_ENVELOPE_SETLOOP - MENUITEM "&Sustain", ID_ENVELOPE_SUSTAIN - MENUITEM "C&arry envelope", ID_ENVELOPE_CARRY - MENUITEM "&Insert Point", ID_ENVELOPE_INSERTPOINT - MENUITEM "&Remove Point", ID_ENVELOPE_REMOVEPOINT - MENUITEM "&Toggle Release Node", ID_ENVELOPE_TOGGLERELEASENODE - MENUITEM SEPARATOR - MENUITEM "&Copy envelope", ID_EDIT_COPY - MENUITEM "&Paste envelope", ID_EDIT_PASTE - MENUITEM SEPARATOR - MENUITEM "Scale points...", ID_ENVELOPE_SCALEPOINTS - END -END - - -///////////////////////////////////////////////////////////////////////////// -// // Dialog // @@ -451,7 +241,7 @@ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,75,136,10 END -IDD_MIDISETUP DIALOGEX 0, 0, 272, 281 +IDD_OPTIONS_MIDI DIALOGEX 0, 0, 272, 281 STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "MIDI" FONT 8, "MS Sans Serif", 0, 0, 0x0 @@ -1610,7 +1400,7 @@ BOTTOMMARGIN, 151 END - IDD_MIDISETUP, DIALOG + IDD_OPTIONS_MIDI, DIALOG BEGIN RIGHTMARGIN, 240 BOTTOMMARGIN, 278 @@ -1853,8 +1643,218 @@ #endif // APSTUDIO_INVOKED +#ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "#define _AFX_NO_OLE_RESOURCES\r\n" + "#define _AFX_NO_TRACKER_RESOURCES\r\n" + "#define _AFX_NO_PROPERTY_RESOURCES\r\n" + "\r\n" + "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" + "#ifdef _WIN32\r\n" + "LANGUAGE 9, 1\r\n" + "#pragma code_page(1252)\r\n" + "#endif\r\n" + "#include ""res\\mptrack.rc2"" // non-Microsoft Visual C++ edited resources\r\n" + "#include ""afxres.rc"" // Standard components\r\n" + "#endif\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDR_MAINFRAME ICON "res\\mptrack.ico" +IDR_MODULETYPE ICON "res\\moddoc.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_MPTRACK BITMAP "res\\mptrack.bmp" +IDB_IMAGELIST BITMAP "res\\img_list.bmp" +IDB_PATTERNS BITMAP "res\\patterns.bmp" +IDB_PATTERNVIEW BITMAP "res\\view_pat.bmp" +IDB_COLORSETUP BITMAP "res\\colors.bmp" +IDB_VUMETERS BITMAP "res\\vumeters.bmp" +IDB_ENVTOOLBAR BITMAP "res\\envbar.bmp" +IDB_SMPTOOLBAR BITMAP "res\\smptoolb.bmp" +IDB_VISNODE BITMAP "res\\bitmap1.bmp" + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_MAINFRAME MENU +BEGIN + POPUP "&File" + BEGIN + POPUP "&New\tCtrl+N" + BEGIN + MENUITEM "&IT", ID_FILE_NEWIT + MENUITEM "&XM", ID_FILE_NEWXM + MENUITEM "&S3M", ID_FILE_NEWS3M + MENUITEM "M&OD", ID_FILE_NEWMOD + MENUITEM "IT &Project", ID_NEW_ITPROJECT + MENUITEM "&MPTM (experimental)", ID_NEW_MPT + END + MENUITEM "&Open...\tCtrl+O", 57601 + MENUITEM "&Close", ID_FILE_CLOSE + MENUITEM "&Save\tCtrl+S", ID_FILE_SAVE + MENUITEM "Save &As...", ID_FILE_SAVE_AS + MENUITEM "Save as &Wave...", ID_FILE_SAVEASWAVE + MENUITEM "Save as M&P3...", ID_FILE_SAVEASMP3 + MENUITEM "Export as M&IDI...", ID_FILE_SAVEMIDI + MENUITEM "Export &unraped...", ID_FILE_SAVECOMPAT + MENUITEM SEPARATOR + MENUITEM "Import &MIDI Library...", ID_IMPORT_MIDILIB + MENUITEM "Add Sound &Bank...", ID_ADD_SOUNDBANK + MENUITEM SEPARATOR + MENUITEM "Recent File", ID_FILE_MRU_FILE1, GRAYED + MENUITEM SEPARATOR + MENUITEM "E&xit", ID_APP_EXIT + END + POPUP "P&layer" + BEGIN + MENUITEM "&Play\tF5", ID_PLAYER_PLAY + MENUITEM "P&lay from start\tF6", ID_PLAYER_PLAYFROMSTART + MENUITEM "&Stop\tESC", ID_PLAYER_STOP + MENUITEM "P&ause\tF8", ID_PLAYER_PAUSE + MENUITEM "&MIDI Record\tF9", ID_MIDI_RECORD + MENUITEM SEPARATOR + MENUITEM "&Estimate song length", ID_ESTIMATESONGLENGTH + MENUITEM "Approx. real &BPM", ID_APPROX_BPM + END + POPUP "&Edit" + BEGIN + MENUITEM "&Undo\tCtrl+Z", ID_EDIT_UNDO + MENUITEM SEPARATOR + MENUITEM "Cu&t\tCtrl+X", ID_EDIT_CUT + MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY + MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE + MENUITEM "&Mix Paste\tCtrl+M", ID_EDIT_PASTE_SPECIAL + MENUITEM "Select &All\tCtrl+5", ID_EDIT_SELECT_ALL + MENUITEM SEPARATOR + POPUP "C&leanup" + BEGIN + MENUITEM "&Rearrange Patterns", ID_CLEANUP_REARRANGE + MENUITEM "&Cleanup Instruments", ID_CLEANUP_INSTRUMENTS + MENUITEM "Clean&up Samples", ID_CLEANUP_SAMPLES + MENUITEM "Cleanup Pa&tterns", ID_CLEANUP_PATTERNS + MENUITEM "Cleanup S&ong", ID_CLEANUP_SONG + MENUITEM "Remove &All Instruments", ID_INSTRUMENTS_REMOVEALL + MENUITEM "Cleanup &Plugins", ID_CLEANUP_PLUGS + MENUITEM "Co&mpo Cleanup", ID_CLEANUP_COMPO + END + MENUITEM SEPARATOR + MENUITEM "&Find\tCtrl+F", ID_EDIT_FIND + MENUITEM "Find Next\tF3", ID_EDIT_FINDNEXT + MENUITEM "Go to...", ID_EDIT_GOTO_MENU + END + POPUP "&View" + BEGIN + MENUITEM "&Globals\tAlt+G", ID_VIEW_GLOBALS + MENUITEM "&Patterns\tAlt+P", ID_VIEW_PATTERNS + MENUITEM "&Samples\tAlt+S", ID_VIEW_SAMPLES + MENUITEM "&Instruments\tAlt+N", ID_VIEW_INSTRUMENTS + MENUITEM "&Comments\tShift+F9", ID_VIEW_COMMENTS + MENUITEM SEPARATOR + POPUP "&Toolbars" + BEGIN + MENUITEM "&Main", ID_VIEW_TOOLBAR + MENUITEM "&Tree", IDD_TREEVIEW + END + MENUITEM SEPARATOR + MENUITEM "Set&up...", ID_VIEW_OPTIONS + MENUITEM "Add &Plugin...", ID_PLUGIN_SETUP + MENUITEM "Channel &Manager...", ID_CHANNEL_MANAGER + MENUITEM "Song Properties...", ID_VIEW_SONGPROPERTIES + MENUITEM "MIDI mapping...", ID_VIEW_MIDIMAPPING + END + POPUP "&Window" + BEGIN + MENUITEM "&New Window", ID_WINDOW_NEW + MENUITEM SEPARATOR + MENUITEM "&Cascade", ID_WINDOW_CASCADE + MENUITEM "&Tile Horizontal", ID_WINDOW_TILE_HORZ + MENUITEM "Tile &Vertical", ID_WINDOW_TILE_VERT + MENUITEM "&Arrange Icons", ID_WINDOW_ARRANGE + MENUITEM "S&plit", ID_WINDOW_SPLIT + END + POPUP "&Help" + BEGIN + MENUITEM "&Contents", ID_HELP_FINDER + MENUITEM "&Search...", ID_HELP_SEARCH + MENUITEM "&Report a bug", ID_REPORT_BUG + MENUITEM SEPARATOR + POPUP "&Internet" + BEGIN + MENUITEM "Modplug Central &Forums", ID_NETLINK_FORUMS + MENUITEM "OpenMPT Wiki", ID_NETLINK_OPENMPTWIKI + MENUITEM "OpenMPT Wiki (German)", ID_NETLINK_OPENMPTWIKI_GERMAN + MENUITEM "MPT-FR", ID_NETLINK_MPTFR + MENUITEM "&Kvr Audio (plugins)", ID_NETLINK_PLUGINS + MENUITEM "The Mod Archive", ID_NETLINK_MODARCHIVE + END + MENUITEM SEPARATOR + MENUITEM "&About OpenMPT...", ID_APP_ABOUT + END +END + +IDR_TOOLBARS MENU +BEGIN + POPUP "&ToolBars" + BEGIN + MENUITEM "&Main", ID_VIEW_TOOLBAR + MENUITEM "&Tree", IDD_TREEVIEW + END +END + +IDR_ENVELOPES MENU +BEGIN + POPUP "&Envelope" + BEGIN + MENUITEM "&Loop", ID_ENVELOPE_SETLOOP + MENUITEM "&Sustain", ID_ENVELOPE_SUSTAIN + MENUITEM "C&arry envelope", ID_ENVELOPE_CARRY + MENUITEM "&Insert Point", ID_ENVELOPE_INSERTPOINT + MENUITEM "&Remove Point", ID_ENVELOPE_REMOVEPOINT + MENUITEM "&Toggle Release Node", ID_ENVELOPE_TOGGLERELEASENODE + MENUITEM SEPARATOR + MENUITEM "&Copy envelope", ID_EDIT_COPY + MENUITEM "&Paste envelope", ID_EDIT_PASTE + MENUITEM SEPARATOR + MENUITEM "Scale points...", ID_ENVELOPE_SCALEPOINTS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// // Cursor // @@ -2218,55 +2218,6 @@ ///////////////////////////////////////////////////////////////////////////// // -// Bitmap -// - -IDB_SPLASHNOFOLDFIN BITMAP "res\\splashno.bmp" -IDB_MAINBAR BITMAP "res\\MAINBAR.BMP" - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_VSTMENU MENU -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&Load Preset...", ID_PRESET_LOAD - MENUITEM "&Save Preset As...", ID_PRESET_SAVE - MENUITEM SEPARATOR - MENUITEM "&Randomize Params", ID_PRESET_RANDOM - END - POPUP "&Info" - BEGIN - MENUITEM "I&nputs", ID_INFO_INPUTS36015 - MENUITEM "Ou&tputs", ID_INFO_OUPUTS - MENUITEM "&Macros", ID_INFO_MACROS36017 - END - POPUP "&Options" - BEGIN - MENUITEM "&Bypass", ID_PLUG_BYPASS - MENUITEM "Record &Params", ID_PLUG_RECORDAUTOMATION - END -END - -IDR_PLUGINMENU MENU -BEGIN - POPUP "File" - BEGIN - MENUITEM "Open", ID_FILE_OPENPRESET - MENUITEM "Save", ID_FILE_SAVEPRESET - END - POPUP "Factory preset" - BEGIN - MENUITEM SEPARATOR - END -END - - -///////////////////////////////////////////////////////////////////////////// -// // Dialog // @@ -2510,6 +2461,55 @@ ///////////////////////////////////////////////////////////////////////////// // +// Bitmap +// + +IDB_SPLASHNOFOLDFIN BITMAP "res\\splashno.bmp" +IDB_MAINBAR BITMAP "res\\MAINBAR.BMP" + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_VSTMENU MENU +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Load Preset...", ID_PRESET_LOAD + MENUITEM "&Save Preset As...", ID_PRESET_SAVE + MENUITEM SEPARATOR + MENUITEM "&Randomize Params", ID_PRESET_RANDOM + END + POPUP "&Info" + BEGIN + MENUITEM "I&nputs", ID_INFO_INPUTS36015 + MENUITEM "Ou&tputs", ID_INFO_OUPUTS + MENUITEM "&Macros", ID_INFO_MACROS36017 + END + POPUP "&Options" + BEGIN + MENUITEM "&Bypass", ID_PLUG_BYPASS + MENUITEM "Record &Params", ID_PLUG_RECORDAUTOMATION + END +END + +IDR_PLUGINMENU MENU +BEGIN + POPUP "File" + BEGIN + MENUITEM "Open", ID_FILE_OPENPRESET + MENUITEM "Save", ID_FILE_SAVEPRESET + END + POPUP "Factory preset" + BEGIN + MENUITEM SEPARATOR + END +END + + +///////////////////////////////////////////////////////////////////////////// +// // Dialog Info // Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2009-07-29 12:20:51 UTC (rev 309) +++ trunk/OpenMPT/mptrack/resource.h 2009-07-29 22:18:17 UTC (rev 310) @@ -10,7 +10,7 @@ #define IDD_PROGRESS 106 #define IDD_OPTIONS_KEYBOARD 108 #define IDD_OPTIONS_COLORS 109 -#define IDD_MIDISETUP 111 +#define IDD_OPTIONS_MIDI 111 #define IDD_OPTIONS_PATTERN 112 #define IDD_LOADRAWSAMPLE 113 #define IDD_CONTROL_GLOBALS 114 @@ -106,7 +106,6 @@ #define IDD_MIDIPARAMCONTROL 515 #define IDD_MSGBOX_HIDABLE 516 #define IDD_ADDSILENCE 517 -#define IDD_DIALOG4 518 #define IDD_MODLOADING_WARNINGS 518 #define IDC_BUTTON1 1001 #define IDC_BUTTON2 1002 Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-29 12:20:51 UTC (rev 309) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-29 22:18:17 UTC (rev 310) @@ -1846,6 +1846,8 @@ BOOL bNoLoop = FALSE; if (nPosJump < 0) nPosJump = m_nCurrentPattern+1; if (nBreakRow < 0) nBreakRow = 0; + + if(nBreakRow >= 0) m_bPatternBreak = true; // Modplug Tracker & ModPlugin allow backward jumps #ifndef FASTSOUNDLIB if ((nPosJump < (int)m_nCurrentPattern) Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-07-29 12:20:51 UTC (rev 309) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-07-29 22:18:17 UTC (rev 310) @@ -883,6 +883,7 @@ BYTE m_nMixLevels; UINT m_nMusicSpeed, m_nMusicTempo; UINT m_nNextRow, m_nRow; + BOOL m_bPatternBreak; // Will be set if "break to row" happened UINT m_nPattern,m_nCurrentPattern,m_nNextPattern,m_nRestartPos, m_nSeqOverride; //NOTE: m_nCurrentPattern and m_nNextPattern refer to order index - not pattern index. bool m_bPatternTransitionOccurred; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-07-29 12:20:51 UTC (rev 309) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-07-29 22:18:17 UTC (rev 310) @@ -643,9 +643,16 @@ { if (!m_nRepeatCount) return FALSE; - if (!m_nRestartPos) + + if(CMainFrame::GetMainFrame()) { + // If channel resetting is disabled, we will emulate a pattern break + if(!(CMainFrame::GetMainFrame()->m_dwPatternSetup & PATTERN_RESETCHANNELS)) + m_bPatternBreak = true; + } + if (!m_nRestartPos && !m_bPatternBreak) + { //rewbs.instroVSTi: stop all VSTi at end of song, if looping. StopAllVsti(); m_nMusicSpeed = m_nDefaultSpeed; @@ -683,7 +690,8 @@ //Handle Repeat position if (m_nRepeatCount > 0) m_nRepeatCount--; m_nCurrentPattern = m_nRestartPos; - m_nRow = 0; + //m_nRow = 0; + m_bPatternBreak = false; //If restart pos points to +++, move along while (Order[m_nCurrentPattern] == Order.GetIgnoreIndex()) { m_nCurrentPattern++; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-08-03 19:20:40
|
Revision: 312 http://modplug.svn.sourceforge.net/modplug/?rev=312&view=rev Author: saga-games Date: 2009-08-03 19:20:23 +0000 (Mon, 03 Aug 2009) Log Message: ----------- [Imp] Instrument editor: Added "Map all notes to <note name>" to instrument mapping context menu [Fix] Instrument editor: Playing correct note in the instrument mapping control (notable difference when editing the scale from bottom to top) [Fix] IT Compatibility: Tremor also works properly with "old effects" on [Fix] IT Compatibility: Fixed retrigger for Qxx when not being triggered together with a note [Fix] XM Saver: Always save with a channel number that's a multiple of two so FT2 will load the file correctly [Imp] VST loading: Included pelya's fix for VSTs that share the same UID (fixes problems with JS Plugins series) [Ref] Making use of the SONG_FIRSTTICK flag where possible Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-07-31 12:56:26 UTC (rev 311) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-03 19:20:23 UTC (rev 312) @@ -31,7 +31,8 @@ ON_WM_LBUTTONDOWN() ON_WM_RBUTTONDOWN() ON_WM_LBUTTONDBLCLK() - ON_COMMAND(ID_NOTEMAP_COPY, OnMapCopy) + ON_COMMAND(ID_NOTEMAP_COPY_NOTE, OnMapCopyNote) + ON_COMMAND(ID_NOTEMAP_COPY_SMP, OnMapCopySample) ON_COMMAND(ID_NOTEMAP_RESET, OnMapReset) ON_COMMAND(ID_INSTRUMENT_SAMPLEMAP, OnEditSampleMap) ON_COMMAND(ID_INSTRUMENT_DUPLICATE, OnInstrumentDuplicate) @@ -318,7 +319,9 @@ AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); } wsprintf(s, "Map all notes to sample %d", penv->Keyboard[m_nNote]); - AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_COPY, s); + AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_COPY_SMP, s); + wsprintf(s, "Map all notes to %s", GetNoteStr(penv->NoteMap[m_nNote])); + AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_COPY_NOTE, s); AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_RESET, "Reset note mapping"); AppendMenu(hMenu, MF_STRING, ID_INSTRUMENT_DUPLICATE, "Duplicate Instrument\tShift+New"); SetMenuDefaultItem(hMenu, ID_INSTRUMENT_SAMPLEMAP, FALSE); @@ -332,8 +335,8 @@ } -void CNoteMapWnd::OnMapCopy() -//--------------------------- +void CNoteMapWnd::OnMapCopyNote() +//------------------------------- { if (m_pModDoc) { @@ -345,6 +348,34 @@ if (penv) { BOOL bModified = FALSE; + UINT n = penv->NoteMap[m_nNote]; + for (UINT i=0; i<NOTE_MAX; i++) if (penv->NoteMap[i] != n) + { + penv->NoteMap[i] = n; + bModified = TRUE; + } + if (bModified) + { + m_pModDoc->SetModified(); + InvalidateRect(NULL, FALSE); + } + } + } +} + +void CNoteMapWnd::OnMapCopySample() +//------------------------------------- +{ + if (m_pModDoc) + { + CSoundFile *pSndFile; + INSTRUMENTHEADER *penv; + + pSndFile = m_pModDoc->GetSoundFile(); + penv = pSndFile->Headers[m_nInstrument]; + if (penv) + { + BOOL bModified = FALSE; UINT n = penv->Keyboard[m_nNote]; for (UINT i=0; i<NOTE_MAX; i++) if (penv->Keyboard[i] != n) { @@ -467,8 +498,8 @@ } if (bOk) { + PlayNote(m_nNote + 1); //SetCurrentNote(m_nNote+1); - PlayNote(m_nNote); } } Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h 2009-07-31 12:56:26 UTC (rev 311) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2009-08-03 19:20:23 UTC (rev 312) @@ -47,7 +47,8 @@ afx_msg void OnKillFocus(CWnd *pNewWnd); afx_msg BOOL OnEraseBkGnd(CDC *) { return TRUE; } afx_msg void OnPaint(); - afx_msg void OnMapCopy(); + afx_msg void OnMapCopySample(); + afx_msg void OnMapCopyNote(); afx_msg void OnMapReset(); afx_msg void OnEditSample(UINT nID); afx_msg void OnEditSampleMap(); Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2009-07-31 12:56:26 UTC (rev 311) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2009-08-03 19:20:23 UTC (rev 312) @@ -14,6 +14,7 @@ #include "defaultvsteditor.h" //rewbs.defaultPlugGUI #include "midi.h" #include "version.h" +#include "Unzip32.h" //For CRC calculation (to detect plugins with same UID) #ifndef NO_VST @@ -33,7 +34,28 @@ AEffect *DmoToVst(PVSTPLUGINLIB pLib); +class CalculateCRC32: public CZipArchive // Make Plugin ID unique for sure +{ + public: + DWORD calculate( BYTE *s, int len ) + { + CZipArchive::crc32val = 0xFFFFFFFFL; + CZipArchive::UpdateCRC( s, len ); + return CZipArchive::crc32val; + }; + DWORD calculateFilename( const char * s ) + { + char fn[_MAX_PATH]; + strncpy( fn, s, sizeof(fn) ); + fn[sizeof(fn)-1] = 0; + int f; + for( f=0; fn[f] != 0; f++ ) fn[f] = toupper( fn[f] ); + return calculate( (BYTE *)fn, f ); + }; +}; +CalculateCRC32 CRC32; + long VSTCALLBACK CVstPluginManager::MasterCallBack(AEffect *effect, long opcode, long index, long value, void *ptr, float opt) //---------------------------------------------------------------------------------------------------------------------------- { @@ -230,6 +252,10 @@ flagKey.Format("%s.Flags", IDs); int infoex = CMainFrame::GetPrivateProfileLong(cacheSection, flagKey, 0, cacheFile); if (infoex&1) p->bIsInstrument = TRUE; + if( p->dwPluginId1 == kEffectMagic ) + { + p->dwPluginId1 = CRC32.calculateFilename( p->szLibraryName ); // Make Plugin ID unique for sure (for VSTs with same UID) + }; #ifdef VST_LOG Log("Plugin \"%s\" found in PluginCache\n", p->szLibraryName); #endif @@ -295,7 +321,8 @@ && (pEffect->dispatcher)) { pEffect->dispatcher(pEffect, effOpen, 0,0,0,0); - p->dwPluginId1 = pEffect->magic; + //p->dwPluginId1 = pEffect->magic; + p->dwPluginId1 = CRC32.calculateFilename( p->szLibraryName ); // Make Plugin ID unique for sure p->dwPluginId2 = pEffect->uniqueID; if ((pEffect->flags & effFlagsIsSynth) || (!pEffect->numInputs)) p->bIsInstrument = TRUE; #ifdef VST_LOG Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2009-07-31 12:56:26 UTC (rev 311) +++ trunk/OpenMPT/mptrack/resource.h 2009-08-03 19:20:23 UTC (rev 312) @@ -940,7 +940,7 @@ #define ID_SAMPLE_SETLOOPEND 32831 #define ID_SAMPLE_SETSUSTAINSTART 32832 #define ID_SAMPLE_SETSUSTAINEND 32833 -#define ID_NOTEMAP_COPY 32834 +#define ID_NOTEMAP_COPY_SMP 32834 #define ID_NOTEMAP_RESET 32835 #define ID_PATTERN_INTERPOLATE_VOLUME 32836 #define ID_PATTERN_INTERPOLATE_EFFECT 32837 @@ -1108,6 +1108,7 @@ #define ID_SAMPLE_DRAW 59224 #define ID_SAMPLE_ADDSILENCE 59225 #define ID_ECHOPASTE 59226 +#define ID_NOTEMAP_COPY_NOTE 59227 // Next default values for new objects // @@ -1115,7 +1116,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 519 -#define _APS_NEXT_COMMAND_VALUE 59227 +#define _APS_NEXT_COMMAND_VALUE 59228 #define _APS_NEXT_CONTROL_VALUE 2386 #define _APS_NEXT_SYMED_VALUE 901 #endif Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-07-31 12:56:26 UTC (rev 311) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-08-03 19:20:23 UTC (rev 312) @@ -656,6 +656,17 @@ BOOL CSoundFile::SaveXM(LPCSTR lpszFileName, UINT nPacking) //--------------------------------------------------------- { + #define ASSERT_CAN_WRITE(x) \ + if(len > s.size() - x) /*Buffer running out? Make it larger.*/ \ + s.resize(s.size() + 10*1024, 0); \ + \ + if(len > uint16_max - (UINT)x) /*Reaching the limits of file format?*/ \ + { \ + CString str; str.Format("%s (%s %u)", str_tooMuchPatternData, str_pattern, i); \ + MessageBox(0, str, str_MBtitle, MB_ICONWARNING); \ + break; \ + } + //BYTE s[64*64*5]; vector<BYTE> s(64*64*5, 0); XMFILEHEADER header; @@ -665,6 +676,7 @@ BYTE xmph[9]; FILE *f; int i; + BOOL bAddChannel; // avoid odd channel count for FT2 compatibility if ((!m_nChannels) || (!lpszFileName)) return FALSE; if ((f = fopen(lpszFileName, "wb")) == NULL) return FALSE; @@ -680,7 +692,9 @@ header.size = sizeof(XMFILEHEADER); header.norder = 0; header.restartpos = m_nRestartPos; - header.channels = m_nChannels; + header.channels = (m_nChannels + 1) & 0xFE; // avoid odd channel count for FT2 compatibility + if(m_nChannels & 1) bAddChannel = true; + header.patterns = 0; /*for (i=0; i<MAX_ORDERS; i++) { header.norder++; @@ -767,15 +781,14 @@ if (b & 8) s[len++] = command; if (b & 16) s[len++] = param; } - if(len > s.size() - 5) //Buffer running out? Make it larger. - s.resize(s.size() + 10*1024, 0); - if(len > uint16_max - 5u) //Reaching the limits of file format? + if(bAddChannel && !(j % m_nChannels)) { - CString str; str.Format("%s (%s %u)", str_tooMuchPatternData, str_pattern, i); - MessageBox(0, str, str_MBtitle, MB_ICONWARNING); - break; + ASSERT_CAN_WRITE(1); + s[len++] = 0x80; } + + ASSERT_CAN_WRITE(5); } xmph[7] = (BYTE)(len & 0xFF); xmph[8] = (BYTE)(len >> 8); Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-31 12:56:26 UTC (rev 311) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-08-03 19:20:23 UTC (rev 312) @@ -1195,7 +1195,7 @@ continue; } } else - if (!m_nTickCount) + if(m_dwSongFlags & SONG_FIRSTTICK) { // Pattern Loop ? if ((((param & 0xF0) == 0x60) && (cmd == CMD_MODCMDEX)) @@ -1467,7 +1467,7 @@ // -> NEW_FEATURE#0010 // Set Volume case CMD_VOLUME: - if (!m_nTickCount) + if(m_dwSongFlags & SONG_FIRSTTICK) { pChn->nVolume = (param < 64) ? param*4 : 256; pChn->dwFlags |= CHN_FASTVOLRAMP; @@ -1515,13 +1515,12 @@ // Set Speed case CMD_SPEED: - if (!m_nTickCount) SetSpeed(param); + if(m_dwSongFlags & SONG_FIRSTTICK) + SetSpeed(param); break; // Set Tempo case CMD_TEMPO: - //if (!m_nTickCount) //commented out for rewbs.tempoSlideFix - //{ // -> CODE#0010 // -> DESC="add extended parameter mechanism to pattern effects" m = NULL; @@ -1552,7 +1551,8 @@ // Arpeggio case CMD_ARPEGGIO: - if ((m_nTickCount) || (!pChn->nPeriod) || (!pChn->nNote)) break; + // IT compatibility 01. Don't ignore Arpeggio if no note is playing + if ((m_nTickCount) || (((!pChn->nPeriod) || !pChn->nNote) && !((m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)))) break; if ((!param) && (!(m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)))) break; pChn->nCommand = CMD_ARPEGGIO; if (param) pChn->nArpeggio = param; @@ -1597,14 +1597,33 @@ // Tremor case CMD_TREMOR: - if (m_nTickCount) break; + if (!(m_dwSongFlags & SONG_FIRSTTICK)) break; + + if((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + { + // IT compatibility 12. / 13. Tremor (using modified DUMB's Tremor logic here because of old effects - http://dumb.sf.net/) + + if (param && !(m_dwSongFlags & SONG_ITOLDEFFECTS)) { + // Old effects have different length interpretation (+1 for both on and off) + if (param & 0xf0) param -= 0x10; + if (param & 0x0f) param -= 0x01; + } + pChn->nTremorCount |= 128; // set on/off flag + + } + else + { + // XM Tremor. Logic is being processed in sndmix.cpp + } + pChn->nCommand = CMD_TREMOR; if (param) pChn->nTremorParam = param; + break; // Set Global Volume case CMD_GLOBALVOLUME: - if (m_nTickCount) break; + if (!(m_dwSongFlags & SONG_FIRSTTICK)) break; if (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; if(GetModFlag(MSF_COMPATIBLE_PLAY)) @@ -1631,7 +1650,7 @@ // Set 8-bit Panning case CMD_PANNING8: - if (m_nTickCount) break; + if (!(m_dwSongFlags & SONG_FIRSTTICK)) break; if (!(m_dwSongFlags & SONG_SURROUNDPAN)) pChn->dwFlags &= ~CHN_SURROUND; if (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_XM|MOD_TYPE_MT2)) { @@ -1704,7 +1723,8 @@ else { // This is how it's NOT supposed to sound... - if (!m_nTickCount) KeyOff(nChn); + if(m_dwSongFlags & SONG_FIRSTTICK) + KeyOff(nChn); } break; @@ -1745,7 +1765,7 @@ // Set Envelope Position case CMD_SETENVPOSITION: - if (!m_nTickCount) + if(m_dwSongFlags & SONG_FIRSTTICK) { pChn->nVolEnvPosition = param; @@ -1831,7 +1851,7 @@ } // Navigation Effects - if (!m_nTickCount) + if(m_dwSongFlags & SONG_FIRSTTICK) { // Pattern Loop if (nPatLoopRow >= 0) @@ -2435,10 +2455,9 @@ // E7x: Set Tremolo WaveForm case 0x70: pChn->nTremoloType = param & 0x07; break; // E8x: Set 4-bit Panning - //case 0x80: if (!m_nTickCount) { pChn->nPan = (param << 4) + 8; pChn->dwFlags |= CHN_FASTVOLRAMP; } break; - case 0x80: if (!m_nTickCount) + case 0x80: if(m_dwSongFlags & SONG_FIRSTTICK) { - //IT compatibility (Panning always resets surround state) + //IT compatibility 20. (Panning always resets surround state) if( TypeIsIT_MPT_XM() == false || GetModFlag(MSF_COMPATIBLE_PLAY) ) { if (!(m_dwSongFlags & SONG_SURROUNDPAN)) pChn->dwFlags &= ~CHN_SURROUND; @@ -2520,8 +2539,7 @@ } break; // S8x: Set 4-bit Panning - //case 0x80: if (!m_nTickCount) { pChn->nPan = (param << 4) + 8; pChn->dwFlags |= CHN_FASTVOLRAMP; } break; - case 0x80: if (!m_nTickCount) + case 0x80: if(m_dwSongFlags & SONG_FIRSTTICK) { if( TypeIsIT_MPT_XM() == false || GetModFlag(MSF_COMPATIBLE_PLAY) ) { @@ -2537,7 +2555,7 @@ // S9x: Sound Control case 0x90: ExtendedChannelEffect(pChn, param & 0x0F); break; // SAx: Set 64k Offset - case 0xA0: if (!m_nTickCount) + case 0xA0: if(m_dwSongFlags & SONG_FIRSTTICK) { pChn->nOldHiOffset = param; if ((pChn->nRowNote) && (pChn->nRowNote < 0x80)) @@ -2794,7 +2812,7 @@ if (dwMacro != 0x30463046 && dwMacro != 0x31463046) { // we don't cater for external devices at tick resolution. - if (!m_nTickCount) { + if(m_dwSongFlags & SONG_FIRSTTICK) { ProcessMidiMacro(nChn, pszMidiMacro, param); } return; @@ -3014,7 +3032,7 @@ if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) { //IT compatibility 15. Retrigger - if (!m_nTickCount && pChn->nRowNote) + if ((m_dwSongFlags & SONG_FIRSTTICK) && pChn->nRowNote) { pChn->nRetrigCount = param & 0xf; } @@ -3264,7 +3282,7 @@ } else { - if (param >= 0x20 && !m_nTickCount) //rewbs.tempoSlideFix: only set if not (T0x or T1x) and tick is 0 + if (param >= 0x20 && (m_dwSongFlags & SONG_FIRSTTICK)) //rewbs.tempoSlideFix: only set if not (T0x or T1x) and tick is 0 { m_nMusicTempo = param; } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-31 12:56:26 UTC (rev 311) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-03 19:20:23 UTC (rev 312) @@ -639,8 +639,7 @@ //IT compatibility 15. Retrigger if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) { - Chn[ich].nRetrigParam = 1; - Chn[ich].nRetrigCount = 0; + Chn[ich].nRetrigParam = Chn[ich].nRetrigCount = 1; } } // Checking instruments @@ -1193,7 +1192,7 @@ Chn[j].nRetrigCount = 0; Chn[j].nRetrigParam = 1; } - Chn[j].nTremorCount = Chn[j].nTremorOn = Chn[j].nTremorOff = 0; + Chn[j].nTremorCount = 0; } if (!nPos) { @@ -1459,7 +1458,7 @@ Chn[i].nRetrigParam = 1; Chn[i].nRetrigCount = 0; } - Chn[i].nTremorCount = Chn[i].nTremorOn = Chn[i].nTremorOff = 0; + Chn[i].nTremorCount = 0; } if(resetMask & 4) Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-07-31 12:56:26 UTC (rev 311) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-08-03 19:20:23 UTC (rev 312) @@ -546,7 +546,7 @@ BYTE nOldOffset, nOldHiOffset; BYTE nCutOff, nResonance; BYTE nRetrigCount, nRetrigParam; - BYTE nTremorCount, nTremorParam, nTremorOn, nTremorOff; + BYTE nTremorCount, nTremorParam; BYTE nPatternLoop, nPatternLoopCount; BYTE nRowNote, nRowInstr; BYTE nRowVolCmd, nRowVolume; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-07-31 12:56:26 UTC (rev 311) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-08-03 19:20:23 UTC (rev 312) @@ -1000,33 +1000,21 @@ // Tremor if(pChn->nCommand == CMD_TREMOR) { - if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) + if((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) { - // IT compatibility 12: Tremor - if(pChn->nTremorOn) - pChn->nTremorOn--; - if(!pChn->nTremorOn) { - if(pChn->nTremorOff) - { - vol = 0; - pChn->nTremorOff--; - } + // IT compatibility 12. / 13.: Tremor + + if ((pChn->nTremorCount & 128) && pChn->nLength) { + if (pChn->nTremorCount == 128) + pChn->nTremorCount = (pChn->nTremorParam >> 4) | 192; + else if (pChn->nTremorCount == 192) + pChn->nTremorCount = (pChn->nTremorParam & 0xf) | 128; else - { - pChn->nTremorOn = pChn->nTremorParam >> 4; - pChn->nTremorOff = pChn->nTremorParam & 0x0F; - if(m_dwSongFlags & SONG_ITOLDEFFECTS) - { - pChn->nTremorOn++; - pChn->nTremorOff++; - } - else - { - if (!pChn->nTremorOn) pChn->nTremorOn = 1; - if (!pChn->nTremorOff) pChn->nTremorOff = 1; - } - } + pChn->nTremorCount--; } + + if ((pChn->nTremorCount & 192) == 128) + vol = 0; } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rel...@us...> - 2009-08-04 17:49:04
|
Revision: 313 http://modplug.svn.sourceforge.net/modplug/?rev=313&view=rev Author: relabsoluness Date: 2009-08-04 17:48:52 +0000 (Tue, 04 Aug 2009) Log Message: ----------- [Ref] Minor tweaks (removed some compiler warnings, use of note constants) Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-03 19:20:23 UTC (rev 312) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-04 17:48:52 UTC (rev 313) @@ -531,7 +531,7 @@ } if (c == ' ') { - if (m_nNote < 119) m_nNote++; + if (m_nNote < NOTE_MAX - 1) m_nNote++; InvalidateRect(NULL, FALSE); PlayNote(m_nNote); } @@ -582,7 +582,7 @@ { case VK_RIGHT: if (!m_bIns) { m_bIns = TRUE; bRedraw = TRUE; } else - if (m_nNote < 119) { m_nNote++; m_bIns = FALSE; bRedraw = TRUE; } + if (m_nNote < NOTE_MAX - 1) { m_nNote++; m_bIns = FALSE; bRedraw = TRUE; } break; case VK_LEFT: if (m_bIns) { m_bIns = FALSE; bRedraw = TRUE; } else @@ -592,7 +592,7 @@ if (m_nNote > 0) { m_nNote--; bRedraw = TRUE; } break; case VK_DOWN: - if (m_nNote < 119) { m_nNote++; bRedraw = TRUE; } + if (m_nNote < NOTE_MAX - 1) { m_nNote++; bRedraw = TRUE; } break; case VK_PRIOR: if (m_nNote > 3) { m_nNote-=3; bRedraw = TRUE; } else @@ -600,7 +600,7 @@ break; case VK_NEXT: if (m_nNote+3 < NOTE_MAX) { m_nNote+=3; bRedraw = TRUE; } else - if (m_nNote < 119) { m_nNote = 119; bRedraw = TRUE; } + if (m_nNote < NOTE_MAX - 1) { m_nNote = NOTE_MAX - 1; bRedraw = TRUE; } break; case VK_TAB: return true; @@ -2130,7 +2130,7 @@ if ((!IsLocked()) && (penv)) { int n = m_ComboPPC.GetCurSel(); - if ((n >= 0) && (n <= 119)) { + if ((n >= 0) && (n <= NOTE_MAX - 1)) { if (penv->nPPC != n) { m_pModDoc->SetModified(); penv->nPPC = n; Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2009-08-03 19:20:23 UTC (rev 312) +++ trunk/OpenMPT/mptrack/Moddoc.h 2009-08-04 17:48:52 UTC (rev 313) @@ -144,7 +144,7 @@ void InitPlayer(); CSoundFile *GetSoundFile() { return &m_SndFile; } void SetPause(BOOL bPause) { m_bPaused = bPause; } - void SetModified(BOOL bModified=TRUE) { SetModifiedFlag(bModified); bModifiedAutosave = bModified; } + void SetModified(BOOL bModified=TRUE) { SetModifiedFlag(bModified); bModifiedAutosave = (bModified != FALSE); } BOOL ModifiedSinceLastAutosave() { bool bRetval = bModifiedAutosave; bModifiedAutosave = false; return bRetval; } // return "IsModified" value and reset it until the next SetModified() (as this is only used for polling) void SetShowSaveDialog(bool b) {m_ShowSavedialog = b;} void PostMessageToAllViews(UINT uMsg, WPARAM wParam=0, LPARAM lParam=0); Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-03 19:20:23 UTC (rev 312) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-04 17:48:52 UTC (rev 313) @@ -705,7 +705,7 @@ // Load plugins only when m_pModDoc != 0. (can be == 0 for example when examining module samples in treeview. CString sNotFound; - BOOL bSearchIDs[MAX_MIXPLUGINS] = {false}; + bool bSearchIDs[MAX_MIXPLUGINS] = {false}; UINT iShowNotFound = 0; if (gpMixPluginCreateProc && GetpModDoc()) Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-08-03 19:20:23 UTC (rev 312) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-08-04 17:48:52 UTC (rev 313) @@ -488,6 +488,7 @@ // -------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------- +#pragma warning(disable : 4324) //structure was padded due to __declspec(align()) // Channel Struct typedef struct __declspec(align(32)) _MODCHANNEL @@ -1266,6 +1267,9 @@ long GetSampleOffset(); }; +#pragma warning(default : 4324) //structure was padded due to __declspec(align()) + + inline uint32 MODINSTRUMENT::GetSampleRate(const MODTYPE type) const //------------------------------------------------------------------ { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-08-05 16:13:22
|
Revision: 314 http://modplug.svn.sourceforge.net/modplug/?rev=314&view=rev Author: saga-games Date: 2009-08-05 16:13:09 +0000 (Wed, 05 Aug 2009) Log Message: ----------- [Imp] Instrument Editor: Sample map shows tuning-specific notename on context menu [Ref] New function IsCompatibleMode to replace the tedious procedure of first checking the mod type and then whether the compatibility flag is being set. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-04 17:48:52 UTC (rev 313) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-05 16:13:09 UTC (rev 314) @@ -320,7 +320,7 @@ } wsprintf(s, "Map all notes to sample %d", penv->Keyboard[m_nNote]); AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_COPY_SMP, s); - wsprintf(s, "Map all notes to %s", GetNoteStr(penv->NoteMap[m_nNote])); + wsprintf(s, "Map all notes to %s", pSndFile->GetNoteName(penv->NoteMap[m_nNote], m_nInstrument).c_str()); AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_COPY_NOTE, s); AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_RESET, "Reset note mapping"); AppendMenu(hMenu, MF_STRING, ID_INSTRUMENT_DUPLICATE, "Duplicate Instrument\tShift+New"); Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-08-04 17:48:52 UTC (rev 313) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-08-05 16:13:09 UTC (rev 314) @@ -2690,7 +2690,7 @@ case 0xC0: // note cut case 0xD0: // note delay //IT compatibility 22. SD0 == SD1, SC0 == SC1 - if(((param & 0x0F) == 1) || ((param & 0x0F) == 0 && (m_SndFile.GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT)) && m_SndFile.GetModFlag(MSF_COMPATIBLE_PLAY))) + if(((param & 0x0F) == 1) || ((param & 0x0F) == 0 && m_SndFile.IsCompatibleMode(MOD_TYPE_IT))) strcpy(s, "1 frame"); else strcat(s, " frames"); Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2009-08-04 17:48:52 UTC (rev 313) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2009-08-05 16:13:09 UTC (rev 314) @@ -2432,6 +2432,9 @@ return; } + BeginWaitCursor(); + BEGIN_CRITICAL(); + if(dlg.m_nEditOption == 3) { // resize @@ -2443,8 +2446,12 @@ ctrlSmp::InsertSilence(pSndFile->Ins[m_nSample], dlg.m_nSamples, (dlg.m_nEditOption == 2) ? pSndFile->Ins[m_nSample].nLength : 0, pSndFile); } + END_CRITICAL(); + EndWaitCursor(); + if(nOldLength != pSndFile->Ins[m_nSample].nLength) { + SetCurSel(0, 0); pModDoc->SetModified(); pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEINFO | HINT_SAMPLEDATA, NULL); } Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-08-04 17:48:52 UTC (rev 313) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-08-05 16:13:09 UTC (rev 314) @@ -251,7 +251,7 @@ } // -> CODE#0010 // -> DESC="add extended parameter mechanism to pattern effects" - if(GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT | MOD_TYPE_XM)) nMusicTempo = CLAMP(nMusicTempo, 32, 255); else nMusicTempo = CLAMP(nMusicTempo, GetModSpecifications().tempoMin, GetModSpecifications().tempoMax); @@ -299,7 +299,7 @@ // Global Volume case CMD_GLOBALVOLUME: if (!(m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) param <<= 1; - if(GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT | MOD_TYPE_XM)) { //IT compatibility 16. Both FT2 and IT ignore out-of-range values if (param <= 128) @@ -313,7 +313,7 @@ break; // Global Volume Slide case CMD_GLOBALVOLSLIDE: - if(GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT | MOD_TYPE_XM)) { //IT compatibility 16. Global volume slide params are stored per channel (FT2/IT) if (param) pChn->nOldGlobalVolSlide = param; else param = pChn->nOldGlobalVolSlide; @@ -437,7 +437,7 @@ MODINSTRUMENT *psmp = &Ins[instr]; UINT note = pChn->nNewNote; - if(note == 0 && TypeIsIT_MPT() && GetModFlag(MSF_COMPATIBLE_PLAY)) return; + if(note == 0 && IsCompatibleMode(MOD_TYPE_IT)) return; if ((penv) && (note) && (note <= 128)) { @@ -518,7 +518,7 @@ if ((!bPorta) || (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) || (m_dwSongFlags & SONG_ITCOMPATMODE) || (!pChn->nLength) || ((pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol)) //IT compatibility tentative fix: Reset envelopes when instrument changes. - || (TypeIsIT_MPT() && GetModFlag(MSF_COMPATIBLE_PLAY) && bInstrumentChanged)) + || (IsCompatibleMode(MOD_TYPE_IT) && bInstrumentChanged)) { pChn->dwFlags |= CHN_FASTVOLRAMP; if ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!bInstrumentChanged) && (penv) && (!(pChn->dwFlags & (CHN_KEYOFF|CHN_NOTEFADE)))) @@ -553,9 +553,9 @@ { pChn->dwFlags &= ~(CHN_KEYOFF|CHN_NOTEFADE|CHN_VOLENV|CHN_PANENV|CHN_PITCHENV); - //IT compatibility tentative fix: Don't anymore change bidi loop direction when + //IT compatibility tentative fix: Don't change bidi loop direction when //no sample nor instrument is changed. - if(TypeIsIT_MPT() && GetModFlag(MSF_COMPATIBLE_PLAY) && psmp == pChn->pInstrument && !bInstrumentChanged) + if(IsCompatibleMode(MOD_TYPE_IT) && psmp == pChn->pInstrument && !bInstrumentChanged) pChn->dwFlags = (pChn->dwFlags & (0xFFFFFF00 | CHN_PINGPONGFLAG)) | (psmp->uFlags & 0xFF); else pChn->dwFlags = (pChn->dwFlags & 0xFFFFFF00) | (psmp->uFlags & 0xFF); @@ -642,7 +642,7 @@ } //IT compatibility tentative fix: Clear channel note memory. - if(TypeIsIT_MPT() && GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT)) { pChn->nNote = 0; pChn->nNewNote = 0; @@ -746,7 +746,7 @@ pChn->nLeftVU = pChn->nRightVU = 0xFF; pChn->dwFlags &= ~CHN_FILTER; pChn->dwFlags |= CHN_FASTVOLRAMP; - if(!GetModFlag(MSF_COMPATIBLE_PLAY) || !(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) + if(!IsCompatibleMode(MOD_TYPE_IT)) { //IT compatibility 15. Retrigger will not be reset (Tremor doesn't store anything here, so we just don't reset this as well) pChn->nRetrigCount = 0; @@ -1170,15 +1170,15 @@ if(nStartTick == 0) { //IT compatibility 22. SD0 == SD1 - if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) + if(IsCompatibleMode(MOD_TYPE_IT)) nStartTick = 1; //ST3 ignores notes with SD0 completely - else if(m_nType & MOD_TYPE_S3M) + else if(GetType() & MOD_TYPE_S3M) nStartTick = m_nMusicSpeed; } //IT compatibility 08. Handling of out-of-range delay command. - if(nStartTick >= m_nMusicSpeed && GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) + if(nStartTick >= m_nMusicSpeed && IsCompatibleMode(MOD_TYPE_IT)) { if(instr) { @@ -1217,10 +1217,10 @@ { UINT note = pChn->nRowNote; if (instr) pChn->nNewIns = instr; - if (m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM|MOD_TYPE_MT2)) + if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) { // XM: FT2 ignores a note next to a K00 effect, and a fade-out seems to be done when no volume envelope is present (not exactly the Kxx behaviour) - if(cmd == CMD_KEYOFF && param == 0 && GetModFlag(MSF_COMPATIBLE_PLAY)) + if(cmd == CMD_KEYOFF && param == 0 && IsCompatibleMode(MOD_TYPE_XM)) { note = instr = 0; } @@ -1236,7 +1236,7 @@ if ((!note) && (instr)) //Case: instrument with no note data. { //IT compatibility: Instrument with no note. - if(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT)) { if(m_nInstruments) { @@ -1352,7 +1352,7 @@ pChn->dwFlags |= CHN_FASTVOLRAMP; pChn->nRestorePanOnNewNote = 0; //IT compatibility 20. Set pan overrides random pan - if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) + if(IsCompatibleMode(MOD_TYPE_IT)) pChn->nPanSwing = 0; } @@ -1429,7 +1429,7 @@ case VOLCMD_PORTAUP: //IT compatibility (one of the first - link effect memory) - if((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT)) PortamentoUp(pChn, vol << 2, true); else PortamentoUp(pChn, vol << 2, false); @@ -1437,7 +1437,7 @@ case VOLCMD_PORTADOWN: //IT compatibility (one of the first - link effect memory) - if((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT)) PortamentoDown(pChn, vol << 2, true); else PortamentoDown(pChn, vol << 2, false); @@ -1552,7 +1552,7 @@ // Arpeggio case CMD_ARPEGGIO: // IT compatibility 01. Don't ignore Arpeggio if no note is playing - if ((m_nTickCount) || (((!pChn->nPeriod) || !pChn->nNote) && !((m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)))) break; + if ((m_nTickCount) || (((!pChn->nPeriod) || !pChn->nNote) && !IsCompatibleMode(MOD_TYPE_IT | MOD_TYPE_S3M))) break; if ((!param) && (!(m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)))) break; pChn->nCommand = CMD_ARPEGGIO; if (param) pChn->nArpeggio = param; @@ -1566,7 +1566,7 @@ if (!(param & 0x0F)) param |= pChn->nRetrigParam & 0x0F; param |= 0x100; // increment retrig count on first row } - if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) + if(IsCompatibleMode(MOD_TYPE_IT)) { // IT compatibility 15. Retrigger if (param) @@ -1599,7 +1599,7 @@ case CMD_TREMOR: if (!(m_dwSongFlags & SONG_FIRSTTICK)) break; - if((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT)) { // IT compatibility 12. / 13. Tremor (using modified DUMB's Tremor logic here because of old effects - http://dumb.sf.net/) @@ -1626,7 +1626,7 @@ if (!(m_dwSongFlags & SONG_FIRSTTICK)) break; if (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; - if(GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT | MOD_TYPE_XM)) { //IT compatibility 16. Both FT2 and IT ignore out-of-range values if (param <= 128) @@ -1642,7 +1642,7 @@ // Global Volume Slide case CMD_GLOBALVOLSLIDE: //IT compatibility 16. Saving last global volume slide param per channel (FT2/IT) - if(GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT | MOD_TYPE_XM)) GlobalVolSlide(param, &pChn->nOldGlobalVolSlide); else GlobalVolSlide(param, &m_nOldGlbVolSlide); @@ -1668,7 +1668,7 @@ pChn->dwFlags |= CHN_FASTVOLRAMP; pChn->nRestorePanOnNewNote = 0; //IT compatibility 20. Set pan overrides random pan - if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) + if(IsCompatibleMode(MOD_TYPE_IT)) pChn->nPanSwing = 0; break; @@ -1699,7 +1699,7 @@ // Key Off case CMD_KEYOFF: - if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) + if(IsCompatibleMode(MOD_TYPE_XM)) { // This is how it's supposed to sound... (in FT2) if (m_nTickCount == param) @@ -1769,7 +1769,7 @@ { pChn->nVolEnvPosition = param; - if(!GetModFlag(MSF_COMPATIBLE_PLAY) || !(m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) + if(!IsCompatibleMode(MOD_TYPE_XM)) { // FT2 only sets the position of the Volume envelope pChn->nPanEnvPosition = param; @@ -1897,7 +1897,7 @@ //end rewbs.fix && ((nPosJump != (int)m_nCurrentPattern) || (nBreakRow != (int)m_nRow))) { - if (nPosJump != (int)m_nCurrentPattern && !((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY))) + if (nPosJump != (int)m_nCurrentPattern && !IsCompatibleMode(MOD_TYPE_IT)) { for (UINT i=0; i<m_nChannels; i++) Chn[i].nPatternLoopCount = 0; } @@ -2143,7 +2143,7 @@ pChn->dwFlags |= CHN_PORTAMENTO; //IT compatibility 03 - if(!(m_dwSongFlags & SONG_ITCOMPATMODE) && (GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + if(!(m_dwSongFlags & SONG_ITCOMPATMODE) && IsCompatibleMode(MOD_TYPE_IT)) { if(param == 0) param = pChn->nOldPortaUpDown; pChn->nOldPortaUpDown = param; @@ -2229,7 +2229,7 @@ } //IT compatibility 23. Portamento with no note - if(pChn->nPeriod == pChn->nPortamentoDest && ((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) && GetModFlag(MSF_COMPATIBLE_PLAY)) + if(pChn->nPeriod == pChn->nPortamentoDest && IsCompatibleMode(MOD_TYPE_IT)) pChn->nPortamentoDest = 0; } @@ -2458,7 +2458,7 @@ case 0x80: if(m_dwSongFlags & SONG_FIRSTTICK) { //IT compatibility 20. (Panning always resets surround state) - if( TypeIsIT_MPT_XM() == false || GetModFlag(MSF_COMPATIBLE_PLAY) ) + if(IsCompatibleMode(MOD_TYPE_S3M | MOD_TYPE_MOD | MOD_TYPE_IT | MOD_TYPE_XM)) { if (!(m_dwSongFlags & SONG_SURROUNDPAN)) pChn->dwFlags &= ~CHN_SURROUND; } @@ -2541,14 +2541,14 @@ // S8x: Set 4-bit Panning case 0x80: if(m_dwSongFlags & SONG_FIRSTTICK) { - if( TypeIsIT_MPT_XM() == false || GetModFlag(MSF_COMPATIBLE_PLAY) ) + if(IsCompatibleMode(MOD_TYPE_S3M | MOD_TYPE_MOD | MOD_TYPE_IT | MOD_TYPE_XM)) { if (!(m_dwSongFlags & SONG_SURROUNDPAN)) pChn->dwFlags &= ~CHN_SURROUND; } pChn->nPan = (param << 4) + 8; pChn->dwFlags |= CHN_FASTVOLRAMP; //IT compatibility 20. Set pan overrides random pan - if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) + if(IsCompatibleMode(MOD_TYPE_IT)) pChn->nPanSwing = 0; } break; @@ -3029,7 +3029,7 @@ UINT nRetrigCount = pChn->nRetrigCount; BOOL bDoRetrig = FALSE; - if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) + if(IsCompatibleMode(MOD_TYPE_IT)) { //IT compatibility 15. Retrigger if ((m_dwSongFlags & SONG_FIRSTTICK) && pChn->nRowNote) @@ -3074,7 +3074,7 @@ int vol = pChn->nVolume; // FT2 compatibility: Retrig + volume will not change volume of retrigged notes - if(!(m_nType & MOD_TYPE_XM) || !(pChn->nRowVolCmd == VOLCMD_VOLUME) || !GetModFlag(MSF_COMPATIBLE_PLAY)) + if(!IsCompatibleMode(MOD_TYPE_XM) || !(pChn->nRowVolCmd == VOLCMD_VOLUME)) { if (retrigTable1[dv]) vol = (vol * retrigTable1[dv]) >> 4; @@ -3110,7 +3110,7 @@ SampleOffset(nChn, offset, false); } } - if(!GetModFlag(MSF_COMPATIBLE_PLAY) || !(m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) + if(!IsCompatibleMode(MOD_TYPE_IT)) pChn->nRetrigCount = (BYTE)nRetrigCount; } @@ -3164,7 +3164,7 @@ if(nTick == 0) { //IT compatibility 22. SC0 == SC1 - if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) + if(IsCompatibleMode(MOD_TYPE_IT)) nTick = 1; // ST3 doesn't cut notes with SC0 else if(m_nType & MOD_TYPE_S3M) @@ -3296,7 +3296,7 @@ // -> CODE#0016 // -> DESC="default tempo update" - if(GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT | MOD_TYPE_XM)) m_nMusicTempo = CLAMP(m_nMusicTempo, 32, 255); else m_nMusicTempo = CLAMP(m_nMusicTempo, specs.tempoMin, specs.tempoMax); @@ -3317,7 +3317,7 @@ if(!pChn->nPatternLoopCount) { //IT compatibility 10. Pattern loops (+ same fix for XM and MOD files) - if((GetType() & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) || (GetType() & (MOD_TYPE_MOD))) + if(IsCompatibleMode(MOD_TYPE_MOD | MOD_TYPE_IT | MOD_TYPE_XM)) pChn->nPatternLoop = m_nRow+1; return -1; @@ -3327,7 +3327,7 @@ MODCHANNEL *p = Chn; //IT compatibility 10. Pattern loops (+ same fix for XM and MOD files) - if(!((GetType() & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) || (GetType() & (MOD_TYPE_MOD)))) + if(!IsCompatibleMode(MOD_TYPE_MOD | MOD_TYPE_IT | MOD_TYPE_XM)) { for (UINT i=0; i<m_nChannels; i++, p++) if (p != pChn) { Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-04 17:48:52 UTC (rev 313) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-05 16:13:09 UTC (rev 314) @@ -637,7 +637,7 @@ Chn[ich].nVolume = 256; Chn[ich].nCutOff = 0x7F; //IT compatibility 15. Retrigger - if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) + if(IsCompatibleMode(MOD_TYPE_IT)) { Chn[ich].nRetrigParam = Chn[ich].nRetrigCount = 1; } @@ -1187,7 +1187,7 @@ Chn[j].nPatternLoopCount = 0; Chn[j].nPatternLoop = 0; //IT compatibility 15. Retrigger - if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) + if(IsCompatibleMode(MOD_TYPE_IT)) { Chn[j].nRetrigCount = 0; Chn[j].nRetrigParam = 1; @@ -1453,7 +1453,7 @@ Chn[i].nFadeOutVol = 0; Chn[i].dwFlags |= CHN_KEYOFF|CHN_NOTEFADE; //IT compatibility 15. Retrigger - if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) + if(IsCompatibleMode(MOD_TYPE_IT)) { Chn[i].nRetrigParam = 1; Chn[i].nRetrigCount = 0; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-08-04 17:48:52 UTC (rev 313) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-08-05 16:13:09 UTC (rev 314) @@ -809,6 +809,15 @@ void SetModFlags(const uint16 v) {m_ModFlags = v;} bool GetModFlag(BYTE i) const {return ((m_ModFlags & (1<<i)) != 0);} void SetModFlag(BYTE i, bool val) {if(i < 8*sizeof(m_ModFlags)) {m_ModFlags = (val) ? m_ModFlags |= (1 << i) : m_ModFlags &= ~(1 << i);}} + + // Is compatible mode for a specific tracker turned on? + // Hint 1: No need to poll for MOD_TYPE_MPT, as it will automatically be linked with MOD_TYPE_IT + // Hint 2: Always returns true for MOD / S3M format (if that is the format of the current file) + bool IsCompatibleMode(MODTYPE type) { + if(GetType() & type & (MOD_TYPE_MOD | MOD_TYPE_S3M)) + return true; // those formats don't have flags so we will always return true + return ((GetType() & ((type & MOD_TYPE_IT) ? type | MOD_TYPE_MPT : type)) && GetModFlag(MSF_COMPATIBLE_PLAY)) ? true : false; + } //Tuning--> public: Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-08-04 17:48:52 UTC (rev 313) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-08-05 16:13:09 UTC (rev 314) @@ -982,7 +982,7 @@ break; case 3: //IT compatibility 19. Use random values - if((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT)) vol += (((rand() & 0xFF) - 0x7F) * (int)pChn->nTremoloDepth) >> tremattn; else vol += (ModRandomTable[trempos] * (int)pChn->nTremoloDepth) >> tremattn; @@ -1000,7 +1000,7 @@ // Tremor if(pChn->nCommand == CMD_TREMOR) { - if((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT)) { // IT compatibility 12. / 13.: Tremor @@ -1192,7 +1192,7 @@ else { //IT playback compatibility 01 & 02 - if(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT)) { if(pChn->nArpeggio >> 4 != 0 || (pChn->nArpeggio & 0x0F) != 0) { @@ -1301,7 +1301,7 @@ switch (pChn->nVibratoType & 0x03) { case 1: - if(GetModFlag(MSF_COMPATIBLE_PLAY) == true) + if(IsCompatibleMode(MOD_TYPE_S3M | MOD_TYPE_MOD | MOD_TYPE_IT | MOD_TYPE_XM)) vdelta = -ModRampDownTable[(vibpos+16) % 64]; else vdelta = ModRampDownTable[vibpos]; @@ -1311,7 +1311,7 @@ break; case 3: //IT compatibility 19. Use random values - if((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT)) vdelta = (rand() & 0xFF) - 0x7F; else vdelta = ModRandomTable[vibpos]; @@ -1371,7 +1371,7 @@ break; case 3: //IT compatibility 19. Use random values - if((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + if(IsCompatibleMode(MOD_TYPE_IT)) pdelta = (rand() & 0xFF) - 0x7F; else pdelta = ModRandomTable[panpos]; @@ -1603,7 +1603,7 @@ { UINT pitchloopend = penv->PitchPoints[penv->nPitchLoopEnd]; //IT compatibility 24. Short envelope loops - if (m_nType != MOD_TYPE_XM && GetModFlag(MSF_COMPATIBLE_PLAY)) pitchloopend++; + if (IsCompatibleMode(MOD_TYPE_IT)) pitchloopend++; if (pChn->nPitchEnvPosition == pitchloopend) pChn->nPitchEnvPosition = penv->PitchPoints[penv->nPitchLoopStart]; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-08-05 22:07:06
|
Revision: 315 http://modplug.svn.sourceforge.net/modplug/?rev=315&view=rev Author: saga-games Date: 2009-08-05 22:06:42 +0000 (Wed, 05 Aug 2009) Log Message: ----------- [Fix] IT Compatibility: OpenMPT was loading the volume column command hx (vibrato depth) as ux (vibrato speed) and also saving it like this. In the pattern editor, ux was allowed, hx was not but it should be the other way around. Now, hx is always used but ux is still loaded correctly for old modules made with MPT/OpenMPT. [Fix] Module Creation / Loading: Sane default volume settings for MOD / S3M files again(128 global volume, 48 sample volume) [Imp] Module Conversion: Full volume column conversion, resetting default global volume / tempo / speed for MOD files [Ref] Module Conversion: Moved all pattern conversion into one block to avoid too much redundancy [Ref] Module Creation: Moved default sample variables to ctrlSmp, minor code rewriting [Imp] Pattern Editor: Proper display of Pxy effect in the note editor window Modified Paths: -------------- trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/modcommand.h trunk/OpenMPT/soundlib/modsmp_ctrl.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.h Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-08-05 16:13:09 UTC (rev 314) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-08-05 22:06:42 UTC (rev 315) @@ -909,7 +909,7 @@ tx_col = MODCOLOR_PANNING; break; case VOLCMD_VIBRATOSPEED: - case VOLCMD_VIBRATO: + case VOLCMD_VIBRATODEPTH: case VOLCMD_TONEPORTAMENTO: case VOLCMD_PORTAUP: case VOLCMD_PORTADOWN: Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-08-05 16:13:09 UTC (rev 314) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-08-05 22:06:42 UTC (rev 315) @@ -13,6 +13,7 @@ #include "mod2midi.h" #include "vstplug.h" #include "version.h" +#include "modsmp_ctrl.h" #ifdef _DEBUG #define new DEBUG_NEW @@ -617,20 +618,43 @@ // New module ? if (!m_SndFile.m_nChannels) { -// -> CODE#0006 -// -> DESC="misc quantity changes" -// m_SndFile.m_nChannels = (m_SndFile.m_nType & MOD_TYPE_MOD) ? 8 : 16; - m_SndFile.m_nChannels = (m_SndFile.m_nType & MOD_TYPE_MOD) ? 8 : 32; -// -! BEHAVIOUR_CHANGE#0006 - if (m_SndFile.Order[0] >= m_SndFile.Patterns.Size()) m_SndFile.Order[0] = 0; + switch(GetModType()) + { + case MOD_TYPE_MOD: + m_SndFile.m_nChannels = 8; + break; + case MOD_TYPE_S3M: + m_SndFile.m_nChannels = 16; + break; + default: + m_SndFile.m_nChannels = 32; + break; + } + + if (m_SndFile.Order[0] >= m_SndFile.Patterns.Size()) + m_SndFile.Order[0] = 0; + if (!m_SndFile.Patterns[0]) { m_SndFile.Patterns.Insert(0, 64); } + strcpy(m_SndFile.m_szNames[0], "untitled"); + m_SndFile.m_nMusicTempo = m_SndFile.m_nDefaultTempo = 125; m_SndFile.m_nMusicSpeed = m_SndFile.m_nDefaultSpeed = 6; - m_SndFile.m_nGlobalVolume = m_SndFile.m_nDefaultGlobalVolume = 128; + + if(m_SndFile.m_nMixLevels == mixLevels_original) + { + m_SndFile.m_nGlobalVolume = m_SndFile.m_nDefaultGlobalVolume = 256; + m_SndFile.m_nSamplePreAmp = m_SndFile.m_nVSTiVolume = 48; + } + else + { + m_SndFile.m_nGlobalVolume = m_SndFile.m_nDefaultGlobalVolume = 128; + m_SndFile.m_nSamplePreAmp = m_SndFile.m_nVSTiVolume = 128; + } + for (UINT init=0; init<MAX_BASECHANNELS; init++) { m_SndFile.ChnSettings[init].dwFlags = 0; @@ -646,10 +670,9 @@ { strcpy(m_SndFile.m_szNames[1], "untitled"); m_SndFile.m_nSamples = 1; - m_SndFile.Ins[1].nVolume = 256; - m_SndFile.Ins[1].nGlobalVol = 64; - m_SndFile.Ins[1].nPan = 128; - m_SndFile.Ins[1].nC4Speed = 8363; + + ctrlSmp::ResetSamples(m_SndFile, ctrlSmp::SmpResetInit); + if ((!m_SndFile.m_nInstruments) && (m_SndFile.m_nType & MOD_TYPE_XM)) { m_SndFile.m_nInstruments = 1; @@ -2341,6 +2364,7 @@ case CMD_VIBRATOVOL: case CMD_GLOBALVOLSLIDE: case CMD_CHANNELVOLSLIDE: + case CMD_PANNINGSLIDE: nmax = (nType & MOD_TYPE_S3MITMPT) ? 58 : 30; break; case CMD_PANNING8: @@ -2376,6 +2400,7 @@ case CMD_VIBRATOVOL: case CMD_GLOBALVOLSLIDE: case CMD_CHANNELVOLSLIDE: + case CMD_PANNINGSLIDE: if (m_SndFile.m_nType & MOD_TYPE_S3MITMPT) { if (!param) pos = 29; else @@ -2413,6 +2438,7 @@ case CMD_VIBRATOVOL: case CMD_GLOBALVOLSLIDE: case CMD_CHANNELVOLSLIDE: + case CMD_PANNINGSLIDE: if (m_SndFile.m_nType & MOD_TYPE_S3MITMPT) { if (pos < 15) param = 15-pos; else @@ -2439,6 +2465,9 @@ if ((!pszName) || (ndx >= MAX_FXINFO) || (!gFXInfo[ndx].pszName)) return FALSE; wsprintf(pszName, "%s: ", gFXInfo[ndx].pszName); s[0] = 0; + + string sPlusChar = "+", sMinusChar = "-"; + switch(gFXInfo[ndx].dwEffect) { case CMD_ARPEGGIO: @@ -2522,24 +2551,39 @@ case CMD_VIBRATOVOL: case CMD_GLOBALVOLSLIDE: case CMD_CHANNELVOLSLIDE: + case CMD_PANNINGSLIDE: + if(gFXInfo[ndx].dwEffect == CMD_PANNINGSLIDE) + { + if(m_SndFile.m_nType & MOD_TYPE_XM) + { + sPlusChar = "-> "; + sMinusChar = "<- "; + } + else + { + sPlusChar = "<- "; + sMinusChar = "-> "; + } + } + if (!param) { wsprintf(s, "continue"); } else if ((m_SndFile.m_nType & MOD_TYPE_S3MITMPT) && ((param & 0x0F) == 0x0F) && (param & 0xF0)) { - wsprintf(s, "fine +%d", param >> 4); + wsprintf(s, "fine %s%d", sPlusChar.c_str(), param >> 4); } else if ((m_SndFile.m_nType & MOD_TYPE_S3MITMPT) && ((param & 0xF0) == 0xF0) && (param & 0x0F)) { - wsprintf(s, "fine -%d", param & 0x0F); + wsprintf(s, "fine %s%d", sMinusChar.c_str(), param & 0x0F); } else if (param & 0x0F) { - wsprintf(s, "-%d", param & 0x0F); + wsprintf(s, "%s%d", sMinusChar.c_str(), param & 0x0F); } else { - wsprintf(s, "+%d", param >> 4); + wsprintf(s, "%s%d", sPlusChar.c_str(), param >> 4); } break; @@ -2775,19 +2819,19 @@ { {VOLCMD_VOLUME, MOD_TYPE_NOMOD, "v: Set Volume"}, {VOLCMD_PANNING, MOD_TYPE_NOMOD, "p: Set Panning"}, - {VOLCMD_VOLSLIDEUP, MOD_TYPE_XMITMPT, "c: Volume slide up"}, - {VOLCMD_VOLSLIDEDOWN, MOD_TYPE_XMITMPT, "d: Volume slide down"}, - {VOLCMD_FINEVOLUP, MOD_TYPE_XMITMPT, "a: Fine volume up"}, - {VOLCMD_FINEVOLDOWN, MOD_TYPE_XMITMPT, "b: Fine volume down"}, - {VOLCMD_VIBRATOSPEED, MOD_TYPE_XMITMPT, "u: Vibrato speed"}, - {VOLCMD_VIBRATO, MOD_TYPE_XM, "h: Vibrato depth"}, + {VOLCMD_VOLSLIDEUP, MOD_TYPE_XMITMPT, "c: Volume slide up"}, + {VOLCMD_VOLSLIDEDOWN, MOD_TYPE_XMITMPT, "d: Volume slide down"}, + {VOLCMD_FINEVOLUP, MOD_TYPE_XMITMPT, "a: Fine volume up"}, + {VOLCMD_FINEVOLDOWN, MOD_TYPE_XMITMPT, "b: Fine volume down"}, + {VOLCMD_VIBRATOSPEED, MOD_TYPE_XM, "u: Vibrato speed"}, + {VOLCMD_VIBRATODEPTH, MOD_TYPE_XMITMPT, "h: Vibrato depth"}, {VOLCMD_PANSLIDELEFT, MOD_TYPE_XM, "l: Pan slide left"}, {VOLCMD_PANSLIDERIGHT, MOD_TYPE_XM, "r: Pan slide right"}, - {VOLCMD_TONEPORTAMENTO, MOD_TYPE_XMITMPT, "g: Tone portamento"}, + {VOLCMD_TONEPORTAMENTO, MOD_TYPE_XMITMPT, "g: Tone portamento"}, {VOLCMD_PORTAUP, MOD_TYPE_ITMPT, "f: Portamento up"}, {VOLCMD_PORTADOWN, MOD_TYPE_ITMPT, "e: Portamento down"}, {VOLCMD_VELOCITY, MOD_TYPE_ITMPT, ":: velocity"}, //rewbs.velocity - {VOLCMD_OFFSET, MOD_TYPE_ITMPT, "o: offset"}, //rewbs.volOff + {VOLCMD_OFFSET, MOD_TYPE_ITMPT, "o: offset"}, //rewbs.volOff }; Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-05 16:13:09 UTC (rev 314) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-05 22:06:42 UTC (rev 315) @@ -154,15 +154,22 @@ EndWaitCursor(); } //End if (((m_SndFile.m_nInstruments) || (b64)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_S3M))) BeginWaitCursor(); - // Adjust pattern data - if(oldTypeIsMOD_XM && newTypeIsS3M_IT_MPT) + + + ///////////////////////////// + // Converting pattern data + + for (UINT nPat=0; nPat<m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) { - for (UINT nPat=0; nPat<m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) + MODCOMMAND *m = m_SndFile.Patterns[nPat]; + for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--) { - MODCOMMAND *m = m_SndFile.Patterns[nPat]; - for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--) + + ///////////////////////////////////////// + // Convert MOD / XM to S3M / IT / MPTM + if(oldTypeIsMOD_XM && newTypeIsS3M_IT_MPT) { - if (m->command) switch(m->command) + switch(m->command) { case CMD_MODCMDEX: m->command = CMD_S3MCMDEX; @@ -217,18 +224,17 @@ m->param = 0xD0 | (m->param & 0x0F); } break; + default: + break; } - } - } - } else - if (oldTypeIsS3M_IT_MPT && newTypeIsMOD_XM) - { - for (UINT nPat=0; nPat<m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) - { - MODCOMMAND *m = m_SndFile.Patterns[nPat]; - for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len--; m++) + } // End if(oldTypeIsMOD_XM && newTypeIsS3M_IT_MPT) + + + ///////////////////////////////////////// + // Convert S3M / IT / MPTM to MOD / XM + else if (oldTypeIsS3M_IT_MPT && newTypeIsMOD_XM) { - if (m->command) switch(m->command) + switch(m->command) { case CMD_S3MCMDEX: m->command = CMD_MODCMDEX; @@ -288,18 +294,263 @@ if (m->param > spdmax) m->param = spdmax; } break; + default: + break; } - } + } // End if (oldTypeIsS3M_IT_MPT && newTypeIsMOD_XM) + + /////////////////////// + // Convert S3M to IT + if (oldTypeIsS3M && newTypeIsIT_MPT) + { + switch(m->command) + { + case CMD_PANNING8: + if(m->param == 0xA4) + { + // surround remap + m->command = CMD_S3MCMDEX; + m->param = 0x91; + } + else + { + m->param = min(m->param << 1, 0xFF); + } + break; + default: + break; + } + } // End if (oldTypeIsS3M && newTypeIsIT_MPT) + + /////////////////////// + // Convert IT to S3M + else if (oldTypeIsIT_MPT && newTypeIsS3M) + { + switch(m->command) + { + case CMD_PANNING8: + m->param = (m->param + 1) >> 1; + break; + case CMD_S3MCMDEX: + if(m->param == 0x91) + { + // surround remap (this is the "official" command) + m->command = CMD_PANNING8; + m->param = 0xA4; + } + break; + case CMD_SMOOTHMIDI: + m->command = CMD_MIDI; + break; + default: + break; + } + } // End if (oldTypeIsIT_MPT && newTypeIsS3M) + + /////////////////////////////////////////////////// + // Convert anything to MOD - remove volume column + if (newTypeIsMOD) + { + if(!m->command) switch(m->volcmd) + { + case VOLCMD_VOLUME: + m->command = CMD_VOLUME; + m->param = m->vol; + break; + case VOLCMD_PANNING: + m->command = CMD_PANNING8; + m->param = CLAMP(m->vol << 2, 0, 0xFF); + break; + case VOLCMD_VOLSLIDEDOWN: + m->command = CMD_VOLUMESLIDE; + m->param = m->vol; + break; + case VOLCMD_VOLSLIDEUP: + m->command = CMD_VOLUMESLIDE; + m->param = m->vol << 4; + break; + case VOLCMD_FINEVOLDOWN: + m->command = CMD_MODCMDEX; + m->param = 0xB0 | m->vol; + break; + case VOLCMD_FINEVOLUP: + m->command = CMD_MODCMDEX; + m->param = 0xA0 | m->vol; + break; + case VOLCMD_PORTADOWN: + m->command = CMD_PORTAMENTODOWN; + m->param = m->vol << 2; + break; + case VOLCMD_PORTAUP: + m->command = CMD_PORTAMENTOUP; + m->param = m->vol << 2; + break; + case VOLCMD_TONEPORTAMENTO: + m->command = CMD_TONEPORTAMENTO; + m->param = m->vol << 2; + break; + case VOLCMD_VIBRATODEPTH: + m->command = CMD_VIBRATO; + m->param = m->vol; + break; + case VOLCMD_VIBRATOSPEED: + m->command = CMD_VIBRATO; + m->param = m->vol << 4; + break; + // OpenMPT-specific commands + case VOLCMD_OFFSET: + m->command = CMD_OFFSET; + m->param = m->vol << 3; + break; + case VOLCMD_VELOCITY: + m->command = CMD_VOLUME; + m->param = m->vol * 7; + break; + default: + break; + } + m->volcmd = CMD_NONE; + } // End if (newTypeIsMOD) + + /////////////////////////////////////////////////// + // Convert anything to S3M - adjust volume column + if (newTypeIsS3M) + { + if(!m->command) switch(m->volcmd) + { + case VOLCMD_VOLSLIDEDOWN: + m->command = CMD_VOLUMESLIDE; + m->param = m->vol; + m->volcmd = CMD_NONE; + break; + case VOLCMD_VOLSLIDEUP: + m->command = CMD_VOLUMESLIDE; + m->param = m->vol << 4; + m->volcmd = CMD_NONE; + break; + case VOLCMD_FINEVOLDOWN: + m->command = CMD_VOLUMESLIDE; + m->param = 0xF0 | m->vol; + m->volcmd = CMD_NONE; + break; + case VOLCMD_FINEVOLUP: + m->command = CMD_VOLUMESLIDE; + m->param = (m->vol << 4) | 0x0F; + m->volcmd = CMD_NONE; + break; + case VOLCMD_PORTADOWN: + m->command = CMD_PORTAMENTODOWN; + m->param = m->vol << 2; + m->volcmd = CMD_NONE; + break; + case VOLCMD_PORTAUP: + m->command = CMD_PORTAMENTOUP; + m->param = m->vol << 2; + m->volcmd = CMD_NONE; + break; + case VOLCMD_TONEPORTAMENTO: + m->command = CMD_TONEPORTAMENTO; + m->param = m->vol << 2; + m->volcmd = CMD_NONE; + break; + case VOLCMD_VIBRATODEPTH: + m->command = CMD_VIBRATO; + m->param = m->vol; + m->volcmd = CMD_NONE; + break; + case VOLCMD_VIBRATOSPEED: + m->command = CMD_VIBRATO; + m->param = m->vol << 4; + m->volcmd = CMD_NONE; + break; + case VOLCMD_PANSLIDELEFT: + m->command = CMD_PANNINGSLIDE; + m->param = m->vol << 4; + m->volcmd = CMD_NONE; + break; + case VOLCMD_PANSLIDERIGHT: + m->command = CMD_PANNINGSLIDE; + m->param = m->vol; + m->volcmd = CMD_NONE; + break; + // OpenMPT-specific commands + case VOLCMD_OFFSET: + m->command = CMD_OFFSET; + m->param = m->vol << 3; + m->volcmd = CMD_NONE; + break; + case VOLCMD_VELOCITY: + m->volcmd = CMD_VOLUME; + m->vol *= 7; + break; + default: + break; + } + } // End if (newTypeIsS3M) + + /////////////////////////////////////////////////// + // Convert anything to XM - adjust volume column + if (newTypeIsXM) + { + if(!m->command) switch(m->volcmd) + { + case VOLCMD_PORTADOWN: + m->command = CMD_PORTAMENTODOWN; + m->param = m->vol << 2; + m->volcmd = CMD_NONE; + break; + case VOLCMD_PORTAUP: + m->command = CMD_PORTAMENTOUP; + m->param = m->vol << 2; + m->volcmd = CMD_NONE; + break; + // OpenMPT-specific commands + case VOLCMD_OFFSET: + m->command = CMD_OFFSET; + m->param = m->vol << 3; + m->volcmd = CMD_NONE; + break; + case VOLCMD_VELOCITY: + m->volcmd = CMD_VOLUME; + m->vol *= 7; + break; + default: + break; + } + } // End if (newTypeIsXM) + + /////////////////////////////////////////////////// + // Convert anything to IT - adjust volume column + if (newTypeIsIT_MPT) + { + if(!m->command) switch(m->volcmd) + { + case VOLCMD_PANSLIDELEFT: + m->command = CMD_PANNINGSLIDE; + m->param = m->vol << 4; + m->volcmd = CMD_NONE; + break; + case VOLCMD_PANSLIDERIGHT: + m->command = CMD_PANNINGSLIDE; + m->param = m->vol; + m->volcmd = CMD_NONE; + break; + case VOLCMD_VIBRATOSPEED: + m->command = CMD_VIBRATO; + m->param = m->vol << 4; + m->volcmd = CMD_NONE; + break; + default: + break; + } + } // End if (newTypeIsIT) } } - // Convert XM to MOD - if (oldTypeIsXM && newTypeIsMOD) - { - } else - // Convert MOD to XM - if (oldTypeIsMOD && newTypeIsXM) - { - } else + + //////////////////////////////////////////////// + // Converting instrument / sample / etc. data + + // Convert MOD/XM to S3M/IT/MPT if (oldTypeIsMOD_XM && newTypeIsS3M_IT_MPT) { @@ -311,6 +562,7 @@ } if (oldTypeIsXM && newTypeIsIT_MPT) m_SndFile.m_dwSongFlags |= SONG_ITCOMPATMODE; } else + // Convert S3M/IT/MPT to XM if (oldTypeIsS3M_IT_MPT && newTypeIsXM) { @@ -338,71 +590,24 @@ penv->nIFR &= 0x7F; } } - if (bBrokenNoteMap) AddToLog("WARNING: Note Mapping will be lost when saving as XM\n"); - } else - // Convert S3M to IT - if (oldTypeIsS3M && newTypeIsIT_MPT) + if (bBrokenNoteMap) AddToLog("WARNING: Note Mapping will be lost when saving as XM.\n"); + } + + if(newTypeIsMOD) { - for (UINT nPat=0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) - { - MODCOMMAND *m = m_SndFile.Patterns[nPat]; - for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len--; m++) - { - switch(m->command) - { - case CMD_PANNING8: - if(m->param == 0xA4) - { - // surround remap - m->command = CMD_S3MCMDEX; - m->param = 0x91; - } - else - { - m->param = min(m->param << 1, 0xFF); - } - break; - default: - break; - } - } - } - } else - // Convert IT to S3M - if (oldTypeIsIT_MPT && newTypeIsS3M) - { - for (UINT nPat=0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) - { - MODCOMMAND *m = m_SndFile.Patterns[nPat]; - for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len--; m++) - { - switch(m->command) - { - case CMD_PANNING8: - m->param = (m->param + 1) >> 1; - break; - case CMD_S3MCMDEX: - if(m->param == 0x91) - { - // surround remap (this is the "official" command) - m->command = CMD_PANNING8; - m->param = 0xA4; - } - break; - case CMD_SMOOTHMIDI: - m->command = CMD_MIDI; - break; - default: - break; - } - } - } + // Not supported in MOD format + m_SndFile.m_nDefaultSpeed = 6; + m_SndFile.m_nDefaultTempo = 125; + m_SndFile.m_nDefaultGlobalVolume = 256; + m_SndFile.m_nSamplePreAmp = 48; + m_SndFile.m_nVSTiVolume = 48; + AddToLog("WARNING: Default speed, tempo and global volume will be lost.\n"); } // Too many samples? if (newTypeIsMOD && (m_SndFile.m_nSamples > 31)) { - AddToLog("WARNING: Samples above 31 will be lost when saving this file as MOD!\n"); + AddToLog("WARNING: Samples above 31 will be lost when saving as MOD!\n"); } BEGIN_CRITICAL(); m_SndFile.ChangeModTypeTo(nNewType); @@ -432,7 +637,7 @@ SetModified(); ClearUndo(); - UpdateAllViews(NULL, HINT_MODTYPE); + UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODGENERAL); EndWaitCursor(); return TRUE; } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-08-05 16:13:09 UTC (rev 314) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-08-05 22:06:42 UTC (rev 315) @@ -3690,8 +3690,8 @@ case kcSetVolumeVolSlideDown: volcmd = VOLCMD_VOLSLIDEDOWN; break; case kcSetVolumeFineVolUp: volcmd = VOLCMD_FINEVOLUP; break; case kcSetVolumeFineVolDown: volcmd = VOLCMD_FINEVOLDOWN; break; - case kcSetVolumeVibratoSpd: volcmd = VOLCMD_VIBRATOSPEED; break; - case kcSetVolumeVibrato: volcmd = VOLCMD_VIBRATO; break; + case kcSetVolumeVibratoSpd: if (pSndFile->m_nType & MOD_TYPE_XM) volcmd = VOLCMD_VIBRATOSPEED; break; + case kcSetVolumeVibrato: volcmd = VOLCMD_VIBRATODEPTH; break; case kcSetVolumeXMPanLeft: if (pSndFile->m_nType & MOD_TYPE_XM) volcmd = VOLCMD_PANSLIDELEFT; break; case kcSetVolumeXMPanRight: if (pSndFile->m_nType & MOD_TYPE_XM) volcmd = VOLCMD_PANSLIDERIGHT; break; case kcSetVolumePortamento: volcmd = VOLCMD_TONEPORTAMENTO; break; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-05 16:13:09 UTC (rev 314) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-05 22:06:42 UTC (rev 315) @@ -1445,8 +1445,13 @@ if (vol < 125) { m[ch].volcmd = VOLCMD_PORTAUP; m[ch].vol = vol - 115; } else // 193-202: Portamento To if ((vol >= 193) && (vol <= 202)) { m[ch].volcmd = VOLCMD_TONEPORTAMENTO; m[ch].vol = vol - 193; } else - // 203-212: Vibrato - if ((vol >= 203) && (vol <= 212)) { m[ch].volcmd = VOLCMD_VIBRATOSPEED; m[ch].vol = vol - 203; } else + // 203-212: Vibrato depth + if ((vol >= 203) && (vol <= 212)) { + m[ch].volcmd = VOLCMD_VIBRATODEPTH; m[ch].vol = vol - 203; + // Old versions of ModPlug seemed to save this as vibrato speed instead so let's fix that + if(m_dwLastSavedWithVersion <= MAKE_VERSION_NUMERIC(1, 17, 02, 54) && interpretModplugmade) + m[ch].volcmd = VOLCMD_VIBRATOSPEED; + } else // 213-222: Velocity //rewbs.velocity if ((vol >= 213) && (vol <= 222)) { m[ch].volcmd = VOLCMD_VELOCITY; m[ch].vol = vol - 213; } else //rewbs.velocity // 223-232: Offset //rewbs.VolOffset @@ -2215,8 +2220,8 @@ case VOLCMD_VOLSLIDEDOWN: vol = 95 + ConvertVolParam(m->vol); break; case VOLCMD_FINEVOLUP: vol = 65 + ConvertVolParam(m->vol); break; case VOLCMD_FINEVOLDOWN: vol = 75 + ConvertVolParam(m->vol); break; - case VOLCMD_VIBRATO: vol = 203; break; - case VOLCMD_VIBRATOSPEED: vol = 203 + ConvertVolParam(m->vol); break; + case VOLCMD_VIBRATODEPTH: vol = 203 + ConvertVolParam(m->vol); break; + case VOLCMD_VIBRATOSPEED: vol = 0xFF /*203 + ConvertVolParam(m->vol)*/; break; // not supported! case VOLCMD_TONEPORTAMENTO: vol = 193 + ConvertVolParam(m->vol); break; case VOLCMD_PORTADOWN: vol = 105 + ConvertVolParam(m->vol); break; case VOLCMD_PORTAUP: vol = 115 + ConvertVolParam(m->vol); break; @@ -2845,8 +2850,8 @@ case VOLCMD_VOLSLIDEDOWN: vol = 95 + ConvertVolParam(m->vol); break; case VOLCMD_FINEVOLUP: vol = 65 + ConvertVolParam(m->vol); break; case VOLCMD_FINEVOLDOWN: vol = 75 + ConvertVolParam(m->vol); break; - case VOLCMD_VIBRATO: vol = 203; break; - case VOLCMD_VIBRATOSPEED: vol = 203 + ConvertVolParam(m->vol); break; + case VOLCMD_VIBRATODEPTH: vol = 203 + ConvertVolParam(m->vol); break; + case VOLCMD_VIBRATOSPEED: vol = 0xFF; break; case VOLCMD_TONEPORTAMENTO: vol = 193 + ConvertVolParam(m->vol); break; case VOLCMD_PORTADOWN: vol = 105 + ConvertVolParam(m->vol); break; case VOLCMD_PORTAUP: vol = 115 + ConvertVolParam(m->vol); break; Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-08-05 16:13:09 UTC (rev 314) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-08-05 22:06:42 UTC (rev 315) @@ -252,7 +252,7 @@ // A0-AF: Set Vibrato Speed case 0xA0: p->volcmd = VOLCMD_VIBRATOSPEED; break; // B0-BF: Vibrato - case 0xB0: p->volcmd = VOLCMD_VIBRATO; break; + case 0xB0: p->volcmd = VOLCMD_VIBRATODEPTH; break; // C0-CF: Set Panning case 0xC0: p->volcmd = VOLCMD_PANNING; p->vol = (vol << 2) + 2; break; // D0-DF: Panning Slide Left @@ -752,7 +752,7 @@ case VOLCMD_FINEVOLDOWN: vol = 0x80 + (p->vol & 0x0F); break; case VOLCMD_FINEVOLUP: vol = 0x90 + (p->vol & 0x0F); break; case VOLCMD_VIBRATOSPEED: vol = 0xA0 + (p->vol & 0x0F); break; - case VOLCMD_VIBRATO: vol = 0xB0 + (p->vol & 0x0F); break; + case VOLCMD_VIBRATODEPTH: vol = 0xB0 + (p->vol & 0x0F); break; case VOLCMD_PANNING: vol = 0xC0 + (p->vol >> 2); if (vol > 0xCF) vol = 0xCF; break; case VOLCMD_PANSLIDELEFT: vol = 0xD0 + (p->vol & 0x0F); break; case VOLCMD_PANSLIDERIGHT: vol = 0xE0 + (p->vol & 0x0F); break; Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-08-05 16:13:09 UTC (rev 314) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-08-05 22:06:42 UTC (rev 315) @@ -1415,7 +1415,7 @@ Vibrato(pChn, vol << 4); break; - case VOLCMD_VIBRATO: + case VOLCMD_VIBRATODEPTH: Vibrato(pChn, vol); break; Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-05 16:13:09 UTC (rev 314) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-05 22:06:42 UTC (rev 315) @@ -496,8 +496,8 @@ m_nRestartPos = 0; m_nMinPeriod = 16; m_nMaxPeriod = 32767; - m_nSamplePreAmp = 128; - m_nVSTiVolume = 128; + m_nSamplePreAmp = 48; + m_nVSTiVolume = 48; m_nPatternNames = 0; m_nMaxOrderPosition = 0; m_lpszPatternNames = NULL; Modified: trunk/OpenMPT/soundlib/modcommand.h =================================================================== --- trunk/OpenMPT/soundlib/modcommand.h 2009-08-05 16:13:09 UTC (rev 314) +++ trunk/OpenMPT/soundlib/modcommand.h 2009-08-05 22:06:42 UTC (rev 315) @@ -77,7 +77,7 @@ #define VOLCMD_FINEVOLUP 5 #define VOLCMD_FINEVOLDOWN 6 #define VOLCMD_VIBRATOSPEED 7 -#define VOLCMD_VIBRATO 8 +#define VOLCMD_VIBRATODEPTH 8 #define VOLCMD_PANSLIDELEFT 9 #define VOLCMD_PANSLIDERIGHT 10 #define VOLCMD_TONEPORTAMENTO 11 Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-08-05 16:13:09 UTC (rev 314) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-08-05 22:06:42 UTC (rev 315) @@ -198,8 +198,12 @@ const UINT nSamples = rSndFile.GetNumSamples(); for(UINT i = 1; i <= nSamples; i++) { - if(resetflag == SmpResetCompo) + switch(resetflag) { + case SmpResetInit: + rSndFile.Ins[i].nC4Speed = 8363; + // note: break is left out intentionally. keep this order or c&p the stuff from below if you change anything! + case SmpResetCompo: rSndFile.Ins[i].nPan = 128; rSndFile.Ins[i].nGlobalVol = 64; rSndFile.Ins[i].nVolume = 256; @@ -208,6 +212,9 @@ rSndFile.Ins[i].nVibSweep = 0; rSndFile.Ins[i].nVibType = 0; rSndFile.Ins[i].uFlags &= ~CHN_PANNING; + break; + default: + break; } } } Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.h =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-08-05 16:13:09 UTC (rev 314) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-08-05 22:06:42 UTC (rev 315) @@ -14,7 +14,8 @@ enum ResetFlag { - SmpResetCompo = 1 + SmpResetCompo = 1, + SmpResetInit = 2, }; // Insert silence to given location. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-08-06 22:31:07
|
Revision: 316 http://modplug.svn.sourceforge.net/modplug/?rev=316&view=rev Author: saga-games Date: 2009-08-06 22:30:56 +0000 (Thu, 06 Aug 2009) Log Message: ----------- [Imp] IT Loading / Saving: The IT header has a place for row highlighting. Use this instead of custom MPT tags. [Imp] Mod conversion: Proper conversion of Pxy effect [Fix] IT Loading: It is now possible to load IT files that have no samples. Modified Paths: -------------- trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/soundlib/IT_DEFS.H trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_xm.cpp Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-05 22:06:42 UTC (rev 315) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-06 22:30:56 UTC (rev 316) @@ -224,6 +224,9 @@ m->param = 0xD0 | (m->param & 0x0F); } break; + case CMD_PANNINGSLIDE: + // swap L/R + m->param = ((m->param & 0x0F) << 4) | (m->param >> 4); default: break; } @@ -294,6 +297,12 @@ if (m->param > spdmax) m->param = spdmax; } break; + case CMD_PANNINGSLIDE: + // swap L/R + m->param = ((m->param & 0x0F) << 4) | (m->param >> 4); + // remove fine slides + if((m->param > 0xF0) || ((m->param & 0x0F) == 0x0F && m->param != 0x0F)) + m->command = CMD_NONE; default: break; } Modified: trunk/OpenMPT/soundlib/IT_DEFS.H =================================================================== --- trunk/OpenMPT/soundlib/IT_DEFS.H 2009-08-05 22:06:42 UTC (rev 315) +++ trunk/OpenMPT/soundlib/IT_DEFS.H 2009-08-06 22:30:56 UTC (rev 316) @@ -7,7 +7,8 @@ { DWORD id; // 0x4D504D49 CHAR songname[26]; - WORD reserved1; // 0x1004 + CHAR highlight_minor; + CHAR highlight_major; WORD ordnum; WORD insnum; WORD smpnum; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-05 22:06:42 UTC (rev 315) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-06 22:30:56 UTC (rev 316) @@ -930,7 +930,7 @@ if ((!lpStream) || (dwMemLength < 0xC0)) return FALSE; if ((pifh->id != 0x4D504D49 && pifh->id != 0x2e6D7074) || (pifh->insnum > 0xFF) - || (!pifh->smpnum) || (pifh->smpnum >= MAX_SAMPLES) || (!pifh->ordnum)) return FALSE; + || (pifh->smpnum >= MAX_SAMPLES) || (!pifh->ordnum)) return FALSE; if (dwMemPos + pifh->ordnum + pifh->insnum*4 + pifh->smpnum*4 + pifh->patnum*4 > dwMemLength) return FALSE; @@ -963,12 +963,18 @@ //TODO: Check whether above interpretation is reasonable especially for //values 0x217 and 0x200 which are the values used in 1.16. if(pifh->cwtv == 0x217 && pifh->cmwt == 0x200) - m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 0, 0); + m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 00, 00); } } if(GetType() == MOD_TYPE_IT) mptStartPos = dwMemLength; + if(pifh->cwtv >= 0x213 && !(interpretModplugmade && m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 17, 03, 00))) + { + m_nRowsPerBeat = pifh->highlight_minor; + m_nRowsPerMeasure = pifh->highlight_major; + } + if (pifh->flags & 0x08) m_dwSongFlags |= SONG_LINEARSLIDES; if (pifh->flags & 0x10) m_dwSongFlags |= SONG_ITOLDEFFECTS; if (pifh->flags & 0x20) m_dwSongFlags |= SONG_ITCOMPATMODE; @@ -1233,8 +1239,7 @@ // -! NEW_FEATURE#0027 // Reading Samples - m_nSamples = pifh->smpnum; - if (m_nSamples >= MAX_SAMPLES) m_nSamples = MAX_SAMPLES-1; + m_nSamples = CLAMP(pifh->smpnum, 1, MAX_SAMPLES - 1); for (UINT nsmp=0; nsmp<pifh->smpnum; nsmp++) if ((smppos[nsmp]) && (smppos[nsmp] <= dwMemLength - sizeof(ITSAMPLESTRUCT))) { lastSampleSize = 0; //ensure lastsamplesize = 0 if last sample is empty, else we'll skip the MPTX stuff. @@ -1311,8 +1316,11 @@ // -> DESC="per-instrument volume ramping setup (refered as attack)" // Compute extra instruments settings position - ITSAMPLESTRUCT *pis = (ITSAMPLESTRUCT *)(lpStream+smppos[pifh->smpnum-1]); - dwMemPos = pis->samplepointer + lastSampleSize; + if(pifh->smpnum) + { + ITSAMPLESTRUCT *pis = (ITSAMPLESTRUCT *)(lpStream+smppos[pifh->smpnum-1]); + dwMemPos = pis->samplepointer + lastSampleSize; + } // Load instrument and song extensions. if(mptStartPos >= dwMemPos) @@ -1830,7 +1838,8 @@ header.id = 0x4D504D49; lstrcpyn(header.songname, m_szNames[0], 26); - header.reserved1 = 0x1004; + header.highlight_minor = (BYTE)(m_nRowsPerBeat & 0xFF); + header.highlight_major = (BYTE)(m_nRowsPerMeasure & 0xFF); header.ordnum = 0; //while ((header.ordnum < MAX_ORDERS) /*&& (Order[header.ordnum] < 0xFF)*/) header.ordnum++; //rewbs.AllowSaveHiddenPatterns //if (header.ordnum < MAX_ORDERS) Order[header.ordnum++] = 0xFF; @@ -2498,7 +2507,8 @@ header.id = 0x4D504D49; lstrcpyn(header.songname, m_szNames[0], 26); - header.reserved1 = 0x1004; + header.highlight_minor = (BYTE)(m_nRowsPerBeat & 0xFF); + header.highlight_major = (BYTE)(m_nRowsPerMeasure & 0xFF); header.ordnum = 0; header.ordnum=MAX_ORDERS; while (header.ordnum>0 && Order[header.ordnum-1]==0xFF) { @@ -2851,7 +2861,10 @@ case VOLCMD_FINEVOLUP: vol = 65 + ConvertVolParam(m->vol); break; case VOLCMD_FINEVOLDOWN: vol = 75 + ConvertVolParam(m->vol); break; case VOLCMD_VIBRATODEPTH: vol = 203 + ConvertVolParam(m->vol); break; - case VOLCMD_VIBRATOSPEED: vol = 0xFF; break; + case VOLCMD_VIBRATOSPEED: if(command == CMD_NONE) { // illegal command -> move if possible + command = CMD_VIBRATO; param = ConvertVolParam(m->vol) << 4; vol = 0xFF; + } else { vol = 203;} + break; case VOLCMD_TONEPORTAMENTO: vol = 193 + ConvertVolParam(m->vol); break; case VOLCMD_PORTADOWN: vol = 105 + ConvertVolParam(m->vol); break; case VOLCMD_PORTAUP: vol = 115 + ConvertVolParam(m->vol); break; @@ -3539,17 +3552,24 @@ fwrite(&size, 1, sizeof(__int16), f); fwrite(&m_nDefaultTempo, 1, size, f); //write m_nDefaultTempo - code = 'RPB.'; //write m_nRowsPerBeat - fwrite(&code, 1, sizeof(__int32), f); - size = sizeof(m_nRowsPerBeat); - fwrite(&size, 1, sizeof(__int16), f); - fwrite(&m_nRowsPerBeat, 1, size, f); + // Only write highlighting information if necessary for IT format + if(GetType() & MOD_TYPE_XM || m_nRowsPerBeat > 0xFF) + { + code = 'RPB.'; //write m_nRowsPerBeat + fwrite(&code, 1, sizeof(__int32), f); + size = sizeof(m_nRowsPerBeat); + fwrite(&size, 1, sizeof(__int16), f); + fwrite(&m_nRowsPerBeat, 1, size, f); + } - code = 'RPM.'; //write m_nRowsPerMeasure - fwrite(&code, 1, sizeof(__int32), f); - size = sizeof(m_nRowsPerMeasure); - fwrite(&size, 1, sizeof(__int16), f); - fwrite(&m_nRowsPerMeasure, 1, size, f); + if(GetType() & MOD_TYPE_XM || m_nRowsPerMeasure > 0xFF) + { + code = 'RPM.'; //write m_nRowsPerMeasure + fwrite(&code, 1, sizeof(__int32), f); + size = sizeof(m_nRowsPerMeasure); + fwrite(&size, 1, sizeof(__int16), f); + fwrite(&m_nRowsPerMeasure, 1, size, f); + } code = 'C...'; //write m_nChannels fwrite(&code, 1, sizeof(__int32), f); Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-08-05 22:06:42 UTC (rev 315) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-08-06 22:30:56 UTC (rev 316) @@ -628,7 +628,7 @@ if(bMadeWithModPlug) { SetModFlag(MSF_COMPATIBLE_PLAY, false); - m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 0, 0); + m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 00, 00); } // -> CODE#0027 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-08-08 21:26:22
|
Revision: 317 http://modplug.svn.sourceforge.net/modplug/?rev=317&view=rev Author: saga-games Date: 2009-08-08 21:26:10 +0000 (Sat, 08 Aug 2009) Log Message: ----------- [New] IT "Note Fade" command: This existed in IT's player routines already, but there was no way to actually use it in the editor. Triggering an invalid note would cause a note fade, so this is a new note type. Still needs to be mapped correctly on the keymaps. [Imp] Updated DE_jojo.mkb keymap ("Note Fade", "Remove DC Offset", "Invert Sample" and "Sign / Unsign Sample" shortcuts added) [Imp] Pattern editor: Added "~~" to drawable letters (for Note Fade) [Imp] Write ID3v2.4 instead of ID3v1 tags. Includes various changes to length limits, genre limitations and what's written in the tags. [Imp] Slight redesign of the WAV / MP3 export dialogs. [Ref] Tagging code (ID3, RIFF tags) has been moved to a seperate class (+ file), so adding different types of tags should be easier in the future. [Fix] General tab: VSTi / Sample volume sliders only go up to 255 instead of 256. Maybe this should be adjusted for every modtype in the future. [Fix] Find / Replace: Notes that cannot be used in the given format are not shown in the dropdown combo. [Fix] MOD Compatibility: 8-Bit Panning is not 7-Bit panning (using 800...8FF instead of 800...880 - fixes f.e. DOPE.MOD) [Imp] Note Properties: 8-Bit Panning slider also has the "Surround" state in S3M format now. [Imp] Format conversion: Even better conversion of various pattern effects, including 8-Bit Panning, Arpeggio (XM swaps the two parameters) including Surround, Note Cut/Off/Fade conversion, MOD retrigger, XM->IT volume column limitations, illegal notes) [Ref] Added IT_DEFS.H, tagging.cpp and tagging.h to the project files [Fix] Removed pelya's VST UID fix for now as it breaks loading of effect presets. It can be enabled by using the constant VST_USE_ALTERNATIVE_MAGIC. Adding a *third* ID for every plugin might be a better idea. [Fix] IT Loading: Proper adjustment of sample pre-amp [Fix] IT Loading/Saving: Changed the row highlight variables from signed to unsigned [Fix] IT Project files: The last commit broke IT Project files as row highlight was missing. [Fix] IT Compatibility: Changes various version numbers and settings in compatibility export to better match Impulse Tracker made IT files. [Fix] IT / S3M Saving: Ignore new MPT effects in compatibility export (always for S3M files) [Fix] XM Saving: The odd channel bugfix broke modules with an even channel count. [Imp] Pattern Editor: Shrinking patterns is now also possible with patterns < 32 rows. [Fix] FT2 Compatibility: Arpeggio was played wrong (0xy should play base note - y - x, not base note - x - y) [Ref] Using "Tracker" constants instead of "Format" constant for IsCompatibleMode() for more clarity. [Ref] Exchanged BOOL/TRUE/FALSE by bool/true/false in some places. Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/Ctrl_gen.h trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/PatternRandomizerGUI.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/mod2wave.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/res/view_pat.bmp trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb trunk/OpenMPT/soundlib/IT_DEFS.H trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/mod_specifications.cpp trunk/OpenMPT/soundlib/mod_specifications.h trunk/OpenMPT/soundlib/modcommand.h trunk/OpenMPT/soundlib/pattern.cpp Added Paths: ----------- trunk/OpenMPT/mptrack/tagging.cpp trunk/OpenMPT/mptrack/tagging.h Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2009-08-08 21:26:10 UTC (rev 317) @@ -1055,12 +1055,12 @@ commands[kcNoteCut].UID = 1200; commands[kcNoteCut].isHidden = false; commands[kcNoteCut].isDummy = false; - commands[kcNoteCut].Message = "Note cut"; + commands[kcNoteCut].Message = "Note Cut"; commands[kcNoteOff].UID = 1201; commands[kcNoteOff].isHidden = false; commands[kcNoteOff].isDummy = false; - commands[kcNoteOff].Message = "Note off"; + commands[kcNoteOff].Message = "Note Off"; commands[kcSetIns0].UID = 1202; commands[kcSetIns0].isHidden = false; @@ -2052,12 +2052,12 @@ commands[kcNoteCutOld].UID = 1667; commands[kcNoteCutOld].isHidden = false; commands[kcNoteCutOld].isDummy = false; - commands[kcNoteCutOld].Message = "Note cut (don't remember instrument)"; + commands[kcNoteCutOld].Message = "Note Cut (don't remember instrument)"; commands[kcNoteOffOld].UID = 1668; commands[kcNoteOffOld].isHidden = false; commands[kcNoteOffOld].isDummy = false; - commands[kcNoteOffOld].Message = "Note off (don't remember instrument)"; + commands[kcNoteOffOld].Message = "Note Off (don't remember instrument)"; commands[kcViewAddPlugin].UID = 1669; commands[kcViewAddPlugin].Message = "View Plugin Manager"; @@ -2333,6 +2333,16 @@ commands[kcSampleRemoveDCOffset].isHidden = false; commands[kcSampleRemoveDCOffset].isDummy = false; + commands[kcNoteFade].UID = 1791; + commands[kcNoteFade].Message = "Note Fade"; + commands[kcNoteFade].isHidden = false; + commands[kcNoteFade].isDummy = false; + + commands[kcNoteFadeOld].UID = 1792; + commands[kcNoteFadeOld].Message = "Note Fade (don't remember instrument)"; + commands[kcNoteFadeOld].isHidden = false; + commands[kcNoteFadeOld].isDummy = false; + #ifdef _DEBUG for (int i=0; i<kcNumCommands; i++) { if (commands[i].UID != 0) { // ignore unset UIDs Modified: trunk/OpenMPT/mptrack/CommandSet.h =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/CommandSet.h 2009-08-08 21:26:10 UTC (rev 317) @@ -431,8 +431,10 @@ kcChordModifier=kcStartNoteMisc, kcNoteCut, kcNoteOff, + kcNoteFade, kcNoteCutOld, kcNoteOffOld, + kcNoteFadeOld, kcNotePC, kcNotePCS, kcEndNoteMisc=kcNotePCS, Modified: trunk/OpenMPT/mptrack/Ctrl_gen.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.h 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/Ctrl_gen.h 2009-08-08 21:26:10 UTC (rev 317) @@ -22,8 +22,8 @@ enum { MAX_SLIDER_GLOBAL_VOL=256, - MAX_SLIDER_VSTI_VOL=256, - MAX_SLIDER_SAMPLE_VOL=256 + MAX_SLIDER_VSTI_VOL=255, + MAX_SLIDER_SAMPLE_VOL=255 }; Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-08-08 21:26:10 UTC (rev 317) @@ -337,7 +337,11 @@ { m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 16*COLUMN_HEIGHT); } else + if(note >= NOTE_FADE) { + m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 17*COLUMN_HEIGHT); + } else + { if(pTuning) { // Drawing custom note names string noteStr = pTuning->GetNoteName(note-NOTE_MIDDLEC); Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2009-08-08 21:26:10 UTC (rev 317) @@ -7,45 +7,6 @@ #include "vstplug.h" #include "mod2wave.h" -#define NUM_GENRES 128 - -static LPCSTR gpszGenreNames[NUM_GENRES] = -{ - "Blues", "Classic Rock", "Country", "Dance", - "Disco", "Funk", "Grunge", "Hip Hop", - "Jazz", "Metal", "New_Age", "Oldies", - "Other", "Pop", "Rhythm n Blues", "Rap", - "Reggae", "Rock", "Techno", "Industrial", - "Alternative", "Ska", "Death Metal", "Pranks", - "Soundtrack", "Euro Techno", "Ambient", "Trip_Hop", - "Vocal", "Jazz Funk", "Fusion", "Trance", - "Classical", "Instrumental", "Acid", "House", - "Game", "Sound Clip", "Gospel", "Noise", - "Alternative Rock", "Bass", "Soul", "Punk", - "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", - "Ethnic", "Gothic", "Darkwave", "Techno Industrial", - "Electronic", "Pop Folk", "Eurodance", "Dream", - "Southern Rock", "Comedy", "Cult", "Gangsta", - "Top 40", "Christian Rap", "Pop Funk", "Jungle", - "Native_American", "Cabaret", "New_Wave", "Psychadelic", - "Rave", "ShowTunes", "Trailer", "Lo Fi", - "Tribal", "Acid Punk", "Acid Jazz", "Polka", - "Retro", "Musical", "Rock n Roll", "Hard_Rock", - "Folk", "Folk Rock", "National Folk", "Swing", - "Fast Fusion", "Bebob", "Latin", "Revival", - "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock", - "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", - "Big Band", "Chorus", "Easy Listening", "Acoustic", - "Humour", "Speech", "Chanson", "Opera", - "Chamber Music", "Sonata", "Symphony", "Booty_Bass", - "Primus", "Porn Groove", "Satire", "Slow Jam", - "Club", "Tango", "Samba", "Folklore", - "Ballad", "Power Ballad", "Rhytmic Soul", "Freestyle", - "Duet", "Punk Rock", "Drum Solo", "Acapella", - "Euro House", "Dance Hall", "Goa", "Drum n Bass", -}; - - extern UINT nMixingRates[NUMMIXRATE]; extern LPCSTR gszChnCfgNames[3]; @@ -346,7 +307,7 @@ DDX_Control(pDX, IDC_COMBO2, m_CbnDriver); DDX_Control(pDX, IDC_COMBO3, m_CbnGenre); DDX_Control(pDX, IDC_EDIT3, m_EditAuthor); - DDX_Control(pDX, IDC_EDIT4, m_EditCopyright); + DDX_Control(pDX, IDC_EDIT4, m_EditURL); DDX_Control(pDX, IDC_EDIT5, m_EditAlbum); DDX_Control(pDX, IDC_EDIT6, m_EditYear); //}}AFX_DATA_MAP @@ -386,10 +347,10 @@ { m_CbnGenre.SetItemData(m_CbnGenre.AddString(gpszGenreNames[iGnr]), iGnr); } - UINT nSel = m_CbnGenre.AddString("Unspecified"); - m_CbnGenre.SetItemData(nSel, 0xff); - m_CbnGenre.SetCurSel(nSel); - m_EditYear.SetWindowText("2000"); + + m_EditYear.SetLimitText(4); + CTime tTime = CTime::GetCurrentTime(); + m_EditYear.SetWindowText(tTime.Format("%Y")); UpdateDialog(); return TRUE; } @@ -538,35 +499,56 @@ void CLayer3Convert::OnOK() //------------------------- { - CHAR s[40]; + CHAR sText[256] = {0}; if (m_dwFileLimit) m_dwFileLimit = GetDlgItemInt(IDC_EDIT1, NULL, FALSE); if (m_dwSongLimit) m_dwSongLimit = GetDlgItemInt(IDC_EDIT2, NULL, FALSE); m_nFormatIndex = m_CbnFormat.GetItemData(m_CbnFormat.GetCurSel()); m_nDriverIndex = m_CbnDriver.GetItemData(m_CbnDriver.GetCurSel()); m_bSaveInfoField = IsDlgButtonChecked(IDC_CHECK3); - memset(&m_id3tag, 0, sizeof(m_id3tag)); - m_id3tag.tag[0] = 'T'; m_id3tag.tag[1] = 'A'; m_id3tag.tag[2] = 'G'; - memset(s, 0, sizeof(s)); m_pSndFile->GetTitle(s); s[30] = 0; - memcpy(m_id3tag.title, s, 30); - memset(s, 0, sizeof(s)); m_EditAuthor.GetWindowText(s, 31); - memcpy(m_id3tag.artist, s, 30); - memset(s, 0, sizeof(s)); m_EditCopyright.GetWindowText(s, 31); - memcpy(m_id3tag.comments, s, 30); - memset(s, 0, sizeof(s)); m_EditAlbum.GetWindowText(s, 31); - memcpy(m_id3tag.album, s, 30); - strcpy(s, "2000"); - m_EditYear.GetWindowText(s, 5); - if (!s[0]) strcpy(s, "2000"); - memcpy(m_id3tag.year, s, 4); - m_id3tag.genre = (BYTE)m_CbnGenre.GetItemData(m_CbnGenre.GetCurSel()); - for (UINT i=0; i<30; i++) + + m_FileTags.title = m_pSndFile->GetTitle(); + + m_EditAuthor.GetWindowText(sText, sizeof(sText)); + m_FileTags.artist = sText; + + m_EditURL.GetWindowText(sText, sizeof(sText)); + m_FileTags.url = sText; + + m_EditAlbum.GetWindowText(sText, sizeof(sText)); + m_FileTags.album = sText; + + m_EditYear.GetWindowText(sText, min(5, sizeof(sText))); + m_FileTags.year = sText; + if(m_FileTags.year == "0") + m_FileTags.year = ""; + + m_CbnGenre.GetWindowText(sText, sizeof(sText)); + m_FileTags.genre = sText; + + if (m_pSndFile->m_lpszSongComments) { - if (m_id3tag.title[i] == 0) m_id3tag.title[i] = ' '; - if (m_id3tag.artist[i] == 0) m_id3tag.artist[i] = ' '; - if (m_id3tag.album[i] == 0) m_id3tag.album[i] = ' '; - if (m_id3tag.comments[i] == 0) m_id3tag.comments[i] = ' '; + m_FileTags.comments = m_pSndFile->m_lpszSongComments; + // convert \r to \n, remove bad characters + for(UINT i = 0; i < m_FileTags.comments.length(); i++) + { + if(m_FileTags.comments.substr(i, 1) == "\r") + m_FileTags.comments.replace(i, 1, "\n"); + if(m_FileTags.comments.substr(i, 1) < " " && m_FileTags.comments.substr(i, 1) != "\n") + m_FileTags.comments.replace(i, 1, " "); + } + + /*UINT spos; + while((spos = m_FileTags.comments.find("\r")) != string::npos) + { + m_FileTags.comments.replace(spos, 1, "\n"); + }*/ } + else + { + m_FileTags.comments = ""; + } + CDialog::OnOK(); } @@ -830,7 +812,7 @@ END_MESSAGE_MAP() -CDoAcmConvert::CDoAcmConvert(CSoundFile *sndfile, LPCSTR fname, PWAVEFORMATEX pwfx, HACMDRIVERID hadid, PTAGID3INFO pTag, CWnd *parent): +CDoAcmConvert::CDoAcmConvert(CSoundFile *sndfile, LPCSTR fname, PWAVEFORMATEX pwfx, HACMDRIVERID hadid, CFileTagging *pTag, CWnd *parent): CDialog(IDD_PROGRESS, parent) //-------------------------------------------------------------------------------------------------------------------------------------- { @@ -841,10 +823,9 @@ m_pwfx = pwfx; m_hadid = hadid; m_bSaveInfoField = FALSE; - memset(&m_id3tag, 0, sizeof(m_id3tag)); if (pTag) { - m_id3tag = *pTag; + m_FileTags = *pTag; m_bSaveInfoField = TRUE; } } @@ -940,6 +921,12 @@ data_ofs = ftell(f); fwrite(&wdh, 1, sizeof(wdh), f); wfh.filesize += sizeof(wdh); + } else + if(!bSaveWave && m_bSaveInfoField) + { + // Write ID3v2.4 Tags + m_FileTags.WriteID3v2Tags(f); + } oldsndcfg = CSoundFile::gdwSoundSetup; oldrepeat = m_pSndFile->GetRepeatCount(); @@ -1034,85 +1021,7 @@ { if (m_bSaveInfoField) { - WAVEFILEHEADER list; - DWORD info_ofs, end_ofs; - DWORD zero = 0; - - info_ofs = ftell(f); - if (info_ofs & 1) - { - wdh.length++; - fwrite(&zero, 1, 1, f); - info_ofs++; - } - list.id_RIFF = IFFID_LIST; - list.id_WAVE = IFFID_INFO; - list.filesize = 4; - fwrite(&list, 1, sizeof(list), f); - // ICMT - if (m_pSndFile->m_lpszSongComments) - { - CHAR *pszComments = NULL; - UINT szlen = m_pSndFile->GetSongComments(NULL, 8192, 80); - if (szlen > 1) pszComments = new CHAR[szlen+1]; - if (pszComments) - { - szlen = m_pSndFile->GetSongComments(pszComments, szlen, 80); - pszComments[szlen] = 0; - chunk.id_data = IFFID_ICMT; - chunk.length = strlen(pszComments)+1; - fwrite(&chunk, 1, sizeof(chunk), f); - fwrite(pszComments, 1, chunk.length, f); - list.filesize += chunk.length + sizeof(chunk); - if (chunk.length & 1) - { - fwrite(&zero, 1, 1, f); - list.filesize++; - } - delete[] pszComments; - } - } - for (UINT iCmt=0; iCmt<=6; iCmt++) - { - s[0] = 0; - switch(iCmt) - { - // INAM - case 0: memcpy(s, m_id3tag.title, 30); s[30] = 0; chunk.id_data = IFFID_INAM; break; - // IART - case 1: memcpy(s, m_id3tag.artist, 30); s[30] = 0; chunk.id_data = IFFID_IART; break; - // IPRD - case 2: memcpy(s, m_id3tag.album, 30); s[30] = 0; chunk.id_data = IFFID_IPRD; break; - // ICOP - case 3: memcpy(s, m_id3tag.comments, 30); s[30] = 0; chunk.id_data = IFFID_ICOP; break; - // IGNR - case 4: if (m_id3tag.genre < NUM_GENRES) strcpy(s, gpszGenreNames[m_id3tag.genre]); chunk.id_data = IFFID_IGNR; break; - // ISFT - case 5: strcpy(s, "OpenMPT"); chunk.id_data = IFFID_ISFT; break; - // ICRD - case 6: memcpy(s, m_id3tag.year, 4); s[4] = 0; strcat(s, "-01-01"); if (s[0] <= '0') s[0] = 0; chunk.id_data = IFFID_ICRD; break; - } - int l = strlen(s); - while ((l > 0) && (s[l-1] == ' ')) s[--l] = 0; - if (s[0]) - { - chunk.length = strlen(s)+1; - fwrite(&chunk, 1, sizeof(chunk), f); - fwrite(s, 1, chunk.length, f); - list.filesize += chunk.length + sizeof(chunk); - if (chunk.length & 1) - { - fwrite(&zero, 1, 1, f); - list.filesize++; - } - } - } - // Update INFO size - end_ofs = ftell(f); - fseek(f, info_ofs, SEEK_SET); - fwrite(&list, 1, sizeof(list), f); - fseek(f, end_ofs, SEEK_SET); - wfh.filesize += list.filesize + 8; + m_FileTags.WriteWaveTags(&wdh, &wfh, f); } wfh.filesize += wdh.length; fseek(f, 0, SEEK_SET); @@ -1123,10 +1032,6 @@ fwrite(&wdh, 1, sizeof(wdh), f); } } else - if (m_bSaveInfoField) - { - fwrite(&m_id3tag, 1, sizeof(m_id3tag), f); - } fclose(f); if (!m_bAbort) retval = IDOK; OnError: Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-08-08 21:26:10 UTC (rev 317) @@ -1557,7 +1557,7 @@ m_SndFile.m_dwSongFlags &= ~SONG_PATTERNLOOP; // Saving file - PTAGID3INFO pTag = (wsdlg.m_bSaveInfoField) ? &wsdlg.m_id3tag : NULL; + CFileTagging *pTag = (wsdlg.m_bSaveInfoField) ? &wsdlg.m_FileTags : NULL; CDoAcmConvert dwcdlg(&m_SndFile, s, &wfx.wfx, hadid, pTag, pMainFrm); dwcdlg.m_dwFileLimit = wsdlg.m_dwFileLimit; dwcdlg.m_dwSongLimit = wsdlg.m_dwSongLimit; @@ -2368,7 +2368,8 @@ nmax = (nType & MOD_TYPE_S3MITMPT) ? 58 : 30; break; case CMD_PANNING8: - if (nType & (MOD_TYPE_MOD|MOD_TYPE_S3M)) nmax = 0x80; + if (nType & (MOD_TYPE_S3M)) nmax = 0x81; + else nmax = 0xFF; break; case CMD_GLOBALVOLUME: nmax = (nType & MOD_TYPE_IT | MOD_TYPE_MPT) ? 128 : 64; @@ -2418,6 +2419,14 @@ else pos = (param >> 4) + 15; } break; + case CMD_PANNING8: + if(m_SndFile.m_nType & MOD_TYPE_S3M) + { + pos = CLAMP(param, 0, 0x80); + if(param == 0xA4) + pos = 0x81; + } + break; } return pos; } @@ -2452,6 +2461,10 @@ param = (pos - 15) << 4; } break; + case CMD_PANNING8: + if(m_SndFile.m_nType & MOD_TYPE_S3M) + param = (pos <= 0x80) ? pos : 0xA4; + break; } return param; } @@ -2514,13 +2527,21 @@ case CMD_TEMPO: if (param < 0x10) - wsprintf(s, "-%dbpm (slower)", param & 0x0F); + wsprintf(s, "-%d bpm (slower)", param & 0x0F); else if (param < 0x20) - wsprintf(s, "+%dbpm (faster)", param & 0x0F); + wsprintf(s, "+%d bpm (faster)", param & 0x0F); else - wsprintf(s, "%dbpm", param); + wsprintf(s, "%d bpm", param); break; + case CMD_PANNING8: + wsprintf(s, "%d", param); + if(m_SndFile.m_nType & MOD_TYPE_S3M) + { + if(param == 0xA4) + strcpy(s, "Surround"); + } + break; case CMD_RETRIG: switch(param >> 4) { @@ -2734,7 +2755,7 @@ case 0xC0: // note cut case 0xD0: // note delay //IT compatibility 22. SD0 == SD1, SC0 == SC1 - if(((param & 0x0F) == 1) || ((param & 0x0F) == 0 && m_SndFile.IsCompatibleMode(MOD_TYPE_IT))) + if(((param & 0x0F) == 1) || ((param & 0x0F) == 0 && m_SndFile.IsCompatibleMode(TRK_IMPULSETRACKER))) strcpy(s, "1 frame"); else strcat(s, " frames"); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-08 21:26:10 UTC (rev 317) @@ -165,6 +165,29 @@ for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--) { + ////////////////////////// + // Convert 8-bit Panning + if(m->command == CMD_PANNING8) + { + if(newTypeIsS3M) + { + m->param = (m->param + 1) >> 1; + } + else if(oldTypeIsS3M) + { + if(m->param == 0xA4) + { + // surround remap + m->command = (newTypeIsIT_MPT) ? CMD_S3MCMDEX : CMD_XFINEPORTAUPDOWN; + m->param = 0x91; + } + else + { + m->param = min(m->param << 1, 0xFF); + } + } + } + ///////////////////////////////////////// // Convert MOD / XM to S3M / IT / MPTM if(oldTypeIsMOD_XM && newTypeIsS3M_IT_MPT) @@ -211,7 +234,15 @@ case 0x60: case 0x70: case 0x90: - case 0xA0: m->command = CMD_S3MCMDEX; break; + case 0xA0: + m->command = CMD_S3MCMDEX; + // surround remap (this is the "official" command) + if(newTypeIsS3M && m->param == 0x91) + { + m->command = CMD_PANNING8; + m->param = 0xA4; + } + break; } break; case CMD_KEYOFF: @@ -237,6 +268,9 @@ // Convert S3M / IT / MPTM to MOD / XM else if (oldTypeIsS3M_IT_MPT && newTypeIsMOD_XM) { + if(m->note == NOTE_NOTECUT || m->note == NOTE_FADE) + m->note = NOTE_KEYOFF; + switch(m->command) { case CMD_S3MCMDEX: @@ -308,38 +342,16 @@ } } // End if (oldTypeIsS3M_IT_MPT && newTypeIsMOD_XM) - /////////////////////// - // Convert S3M to IT - if (oldTypeIsS3M && newTypeIsIT_MPT) - { - switch(m->command) - { - case CMD_PANNING8: - if(m->param == 0xA4) - { - // surround remap - m->command = CMD_S3MCMDEX; - m->param = 0x91; - } - else - { - m->param = min(m->param << 1, 0xFF); - } - break; - default: - break; - } - } // End if (oldTypeIsS3M && newTypeIsIT_MPT) /////////////////////// // Convert IT to S3M else if (oldTypeIsIT_MPT && newTypeIsS3M) { + if(m->note == NOTE_KEYOFF || m->note == NOTE_FADE) + m->note = NOTE_NOTECUT; + switch(m->command) { - case CMD_PANNING8: - m->param = (m->param + 1) >> 1; - break; case CMD_S3MCMDEX: if(m->param == 0x91) { @@ -356,12 +368,30 @@ } } // End if (oldTypeIsIT_MPT && newTypeIsS3M) - /////////////////////////////////////////////////// - // Convert anything to MOD - remove volume column + + //////////////////////// + // Convert XM arpeggio + if(m->command == CMD_ARPEGGIO && (newTypeIsXM || oldTypeIsXM)) + { + // swap notes + m->param = ((m->param & 0x0F) << 4) | ((m->param & 0xF0) >> 4); + } + + + ////////////////////////////////////////////////////////////////// + // Convert anything to MOD - remove volume column, adjust retrig if (newTypeIsMOD) { - if(!m->command) switch(m->volcmd) + if(m->command) switch(m->command) { + case CMD_RETRIG: + m->command = CMD_MODCMDEX; + m->param = 0x90 | (m->param & 0x0F); + break; + } + + else switch(m->volcmd) + { case VOLCMD_VOLUME: m->command = CMD_VOLUME; m->param = m->vol; @@ -497,7 +527,7 @@ } } // End if (newTypeIsS3M) - /////////////////////////////////////////////////// + ////////////////////////////////////////////////// // Convert anything to XM - adjust volume column if (newTypeIsXM) { @@ -534,6 +564,19 @@ { if(!m->command) switch(m->volcmd) { + case VOLCMD_VOLSLIDEDOWN: + case VOLCMD_VOLSLIDEUP: + case VOLCMD_FINEVOLDOWN: + case VOLCMD_FINEVOLUP: + case VOLCMD_PORTADOWN: + case VOLCMD_PORTAUP: + case VOLCMD_TONEPORTAMENTO: + case VOLCMD_VIBRATODEPTH: + // OpenMPT-specific commands + case VOLCMD_OFFSET: + case VOLCMD_VELOCITY: + m->vol = min(m->vol, 9); + break; case VOLCMD_PANSLIDELEFT: m->command = CMD_PANNINGSLIDE; m->param = m->vol << 4; @@ -553,6 +596,9 @@ break; } } // End if (newTypeIsIT) + + if(!m_SndFile.GetModSpecifications().HasNote(m->note)) + m->note = 0; } } @@ -1884,6 +1930,7 @@ case 0: p[1] = p[2] = p[3] = '.'; break; case NOTE_KEYOFF: p[1] = p[2] = p[3] = '='; break; case NOTE_NOTECUT: p[1] = p[2] = p[3] = '^'; break; + case NOTE_FADE: p[1] = p[2] = p[3] = '~'; break; case NOTE_PC: p[1] = 'P'; p[2] = 'C'; p[3] = ' '; break; case NOTE_PCS: p[1] = 'P'; p[2] = 'C'; p[3] = 'S'; break; default: @@ -2055,6 +2102,7 @@ m[col].note = 0; if (s[0] == '=') m[col].note = NOTE_KEYOFF; else if (s[0] == '^') m[col].note = NOTE_NOTECUT; else + if (s[0] == '~') m[col].note = NOTE_FADE; else if (s[0] == 'P') { if(s[2] == 'S') Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-08-08 21:26:10 UTC (rev 317) @@ -243,7 +243,7 @@ "\n" " For more detailed list of changes, see history.txt."; - CMainFrame::GetMainFrame()->MessageBox(firstOpenMessage, "OpenMPT v." MPT_VERSION_STR, MB_ICONINFORMATION); + CMainFrame::GetMainFrame()->MessageBox(firstOpenMessage, "OpenMPT " MPT_VERSION_STR, MB_ICONINFORMATION); */ } @@ -1655,7 +1655,7 @@ m_bmp.LoadBitmap(MAKEINTRESOURCE(IDB_MPTRACK)); wsprintf(s, "Build Date: %s", gszBuildDate); SetDlgItemText(IDC_EDIT2, s); - SetDlgItemText(IDC_EDIT3, CString("OpenMPT, version ") + MptVersion::str + " (development build)"); + SetDlgItemText(IDC_EDIT3, CString("OpenMPT ") + MptVersion::str + " (development build)"); m_heContact.SetWindowText( "Contact / Discussion:\r\n\ @@ -1690,9 +1690,11 @@ "http://www.un4seen.com/mo3.html|" "coda for sample drawing code|" "http://coda.s3m.us/|" + "Storlek for all the IT compatibility hints and testcases|" + "http://schismtracker.org/|" "Pel K. Txnder for the scrolling credits control :)|" "http://tinyurl.com/4yze8|" - "The people at Modplug forums for crucial contribution|" + "|The people at Modplug forums for crucial contribution|" "in the form of ideas, testing and support; thanks|" "particularly to:|" "LPChip, Ganja, Diamond, Nofold, Goor00, Georg|" Modified: trunk/OpenMPT/mptrack/Mptrack.h =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/Mptrack.h 2009-08-08 21:26:10 UTC (rev 317) @@ -405,7 +405,7 @@ extern const BYTE gEffectColors[MAX_EFFECTS]; extern const LPCSTR szNoteNames[12]; extern const LPCTSTR szDefaultNoteNames[NOTE_MAX]; -const LPCTSTR szSpecialNoteNames[NOTE_MAX_SPECIAL-NOTE_MIN_SPECIAL + 1] = {TEXT("PCs"), TEXT("PC"), TEXT("^^"), TEXT("==")}; +const LPCTSTR szSpecialNoteNames[NOTE_MAX_SPECIAL-NOTE_MIN_SPECIAL + 1] = {TEXT("~~"), TEXT("PCs"), TEXT("PC"), TEXT("^^"), TEXT("==")}; const LPCTSTR szSpecialNoteShortDesc[NOTE_MAX_SPECIAL-NOTE_MIN_SPECIAL + 1] = {TEXT("Param control(smooth)"), TEXT("Param control"), TEXT("Note Cut"), TEXT("Note Off")}; // Make sure that special note arrays include string for every note. Modified: trunk/OpenMPT/mptrack/PatternRandomizerGUI.cpp =================================================================== --- trunk/OpenMPT/mptrack/PatternRandomizerGUI.cpp 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/PatternRandomizerGUI.cpp 2009-08-08 21:26:10 UTC (rev 317) @@ -81,7 +81,7 @@ bool CPatternRandomizerGUI::isVisible() { //---------------------------------- - return IsWindowVisible(); + return (bool)IsWindowVisible(); } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-08-08 21:26:10 UTC (rev 317) @@ -3548,6 +3548,8 @@ case kcNoteCutOld: TempEnterNote(NOTE_NOTECUT, true); return wParam; case kcNoteOff: TempEnterNote(NOTE_KEYOFF, false); return wParam; case kcNoteOffOld: TempEnterNote(NOTE_KEYOFF, true); return wParam; + case kcNoteFade: TempEnterNote(NOTE_FADE, false); return wParam; + case kcNoteFadeOld: TempEnterNote(NOTE_FADE, true); return wParam; case kcNotePC: TempEnterNote(NOTE_PC); return wParam; case kcNotePCS: TempEnterNote(NOTE_PCS); return wParam; Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2009-08-08 21:26:10 UTC (rev 317) @@ -14,7 +14,9 @@ #include "defaultvsteditor.h" //rewbs.defaultPlugGUI #include "midi.h" #include "version.h" +#ifdef VST_USE_ALTERNATIVE_MAGIC //Pelya's plugin ID fix. Breaks fx presets, so let's avoid it for now. #include "Unzip32.h" //For CRC calculation (to detect plugins with same UID) +#endif #ifndef NO_VST @@ -34,6 +36,7 @@ AEffect *DmoToVst(PVSTPLUGINLIB pLib); +#ifdef VST_USE_ALTERNATIVE_MAGIC class CalculateCRC32: public CZipArchive // Make Plugin ID unique for sure { public: @@ -55,6 +58,7 @@ }; CalculateCRC32 CRC32; +#endif long VSTCALLBACK CVstPluginManager::MasterCallBack(AEffect *effect, long opcode, long index, long value, void *ptr, float opt) //---------------------------------------------------------------------------------------------------------------------------- @@ -252,10 +256,12 @@ flagKey.Format("%s.Flags", IDs); int infoex = CMainFrame::GetPrivateProfileLong(cacheSection, flagKey, 0, cacheFile); if (infoex&1) p->bIsInstrument = TRUE; + #ifdef VST_USE_ALTERNATIVE_MAGIC if( p->dwPluginId1 == kEffectMagic ) { p->dwPluginId1 = CRC32.calculateFilename( p->szLibraryName ); // Make Plugin ID unique for sure (for VSTs with same UID) }; + #endif #ifdef VST_LOG Log("Plugin \"%s\" found in PluginCache\n", p->szLibraryName); #endif @@ -321,8 +327,11 @@ && (pEffect->dispatcher)) { pEffect->dispatcher(pEffect, effOpen, 0,0,0,0); - //p->dwPluginId1 = pEffect->magic; + #ifdef VST_USE_ALTERNATIVE_MAGIC p->dwPluginId1 = CRC32.calculateFilename( p->szLibraryName ); // Make Plugin ID unique for sure + #else + p->dwPluginId1 = pEffect->magic; + #endif p->dwPluginId2 = pEffect->uniqueID; if ((pEffect->flags & effFlagsIsSynth) || (!pEffect->numInputs)) p->bIsInstrument = TRUE; #ifdef VST_LOG Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-08-08 21:26:10 UTC (rev 317) @@ -675,7 +675,7 @@ { combo->SetItemData(combo->AddString("any"), findAny); } - AppendNotesToControlEx(*combo); + AppendNotesToControlEx(*combo, pSndFile); UINT ncount = combo->GetCount(); for (UINT i=0; i<ncount; i++) if (m_nNote == combo->GetItemData(i)) @@ -1241,6 +1241,7 @@ } } } + } // Instrument if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO2)) != NULL) @@ -1794,12 +1795,12 @@ m_CbnZxxPreset.SetCurSel(0); UpdateDialog(); - int offsetx=100, offsety=30, separatorx=4, separatory=2, + int offsetx=108, offsety=30, separatorx=4, separatory=2, height=18, widthMacro=30, widthVal=55, widthType=135, widthBtn=60; for (UINT m=0; m<NMACROS; m++) { - m_EditMacro[m].Create("", BS_FLAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP /*| WS_BORDER*/, + m_EditMacro[m].Create("", /*BS_FLAT |*/ WS_CHILD | WS_VISIBLE | WS_TABSTOP /*| WS_BORDER*/, CRect(offsetx, offsety+m*(separatory+height), offsetx+widthMacro, offsety+m*(separatory+height)+height), this, ID_PLUGSELECT+NMACROS+m); m_EditMacro[m].SetFont(GetFont()); Modified: trunk/OpenMPT/mptrack/mod2wave.h =================================================================== --- trunk/OpenMPT/mptrack/mod2wave.h 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/mod2wave.h 2009-08-08 21:26:10 UTC (rev 317) @@ -1,17 +1,7 @@ #ifndef _MOD2WAVE_H_ #define _MOD2WAVE_H_ +#include "tagging.h" -typedef struct _TAGID3INFO -{ - CHAR tag[3]; - CHAR title[30]; - CHAR artist[30]; - CHAR album[30]; - CHAR year[4]; - CHAR comments[30]; - BYTE genre; -} TAGID3INFO, *PTAGID3INFO; - /////////////////////////////////////////////////////////////////////////////////////////////////// // Direct To Disk Recording @@ -86,12 +76,12 @@ enum { MAX_DRIVERS=32 }; DWORD m_dwFileLimit, m_dwSongLimit; BOOL m_bSaveInfoField; - TAGID3INFO m_id3tag; + CFileTagging m_FileTags; protected: CSoundFile *m_pSndFile; CComboBox m_CbnFormat, m_CbnDriver, m_CbnGenre; - CEdit m_EditAuthor, m_EditCopyright, m_EditAlbum, m_EditYear; + CEdit m_EditAuthor, m_EditURL, m_EditAlbum, m_EditYear; UINT m_nFormatIndex, m_nDriverIndex, m_nNumFormats, m_nNumDrivers; MPEGLAYER3WAVEFORMAT Formats[MAX_FORMATS]; HACMDRIVERID Drivers[MAX_DRIVERS]; @@ -131,15 +121,15 @@ BOOL m_bAbort, m_bSaveInfoField; PWAVEFORMATEX m_pwfx; HACMDRIVERID m_hadid; - TAGID3INFO m_id3tag; + CFileTagging m_FileTags; public: - CDoAcmConvert(CSoundFile *sndfile, LPCSTR fname, PWAVEFORMATEX pwfx, HACMDRIVERID hadid, PTAGID3INFO pInfo, CWnd *parent=NULL); + CDoAcmConvert(CSoundFile *sndfile, LPCSTR fname, PWAVEFORMATEX pwfx, HACMDRIVERID hadid, CFileTagging *pInfo, CWnd *parent=NULL); BOOL OnInitDialog(); void OnCancel() { m_bAbort = TRUE; } afx_msg void OnButton1(); DECLARE_MESSAGE_MAP() + }; - #endif // _MOD2WAVE_H_ Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-08-08 21:26:10 UTC (rev 317) @@ -132,32 +132,33 @@ PUSHBUTTON "Default Settings",IDC_BUTTON_DEFAULT_RESAMPLING,186,180,66,12 END -IDD_WAVECONVERT DIALOGEX 0, 0, 211, 166 +IDD_WAVECONVERT DIALOGEX 0, 0, 262, 197 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Wave Convert" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - DEFPUSHBUTTON "OK",IDOK,155,8,50,14 - PUSHBUTTON "Cancel",IDCANCEL,155,28,50,14 - GROUPBOX "",IDC_STATIC,4,4,146,157 - CONTROL "Limit file size to: (KBytes)",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,13,111,10 - EDITTEXT IDC_EDIT1,21,24,50,12,ES_AUTOHSCROLL - CONTROL "Limit song length to: (seconds)",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,40,111,10 - EDITTEXT IDC_EDIT2,21,51,50,12,ES_AUTOHSCROLL - LTEXT "Play:",IDC_STATIC,10,67,37,8 - CONTROL "Entire song",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,15,78,104,10 - CONTROL "From position",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,15,91,58,10 - CONTROL "Normalize Output",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,76,133,73,10 - COMBOBOX IDC_COMBO1,10,106,54,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_COMBO2,70,106,73,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "High quality resampling",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,76,122,104,10 - EDITTEXT IDC_EDIT3,75,90,19,12,ES_AUTOHSCROLL | ES_NUMBER - CTEXT "to",IDC_STATIC,99,91,8,8 - EDITTEXT IDC_EDIT4,109,90,19,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Channel mode",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,82,66,60,12 - DEFPUSHBUTTON "Change Player Options",IDC_PLAYEROPTIONS,10,124,81,14,BS_CENTER + DEFPUSHBUTTON "OK",IDOK,204,12,50,14 + PUSHBUTTON "Cancel",IDCANCEL,204,30,50,14 + GROUPBOX "Render",IDC_STATIC,6,6,192,90 + COMBOBOX IDC_COMBO1,18,18,54,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO2,78,18,73,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "Change Player Options",IDC_PLAYEROPTIONS,18,36,81,14,BS_CENTER + CONTROL "Channel mode (one file per channel)",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,54,168,8 + CONTROL "Normalize Output",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,66,73,10 + CONTROL "High quality resampling",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,102,66,84,10 CONTROL "Slow render (for Kontakt+DFD)",IDC_GIVEPLUGSIDLETIME, - "Button",BS_AUTOCHECKBOX | BS_LEFT | BS_MULTILINE | WS_TABSTOP,10,142,133,17 + "Button",BS_AUTOCHECKBOX | BS_LEFT | BS_MULTILINE | WS_TABSTOP,18,78,133,8 + GROUPBOX "Limit",IDC_STATIC,6,102,192,90 + CONTROL "Limit file size to: (KBytes)",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,114,111,11 + EDITTEXT IDC_EDIT1,138,114,50,12,ES_AUTOHSCROLL + CONTROL "Limit song length to: (seconds)",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,134,111,10 + EDITTEXT IDC_EDIT2,138,133,50,12,ES_AUTOHSCROLL + LTEXT "Play:",IDC_STATIC,18,150,37,8 + CONTROL "Entire song",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,18,162,104,10 + CONTROL "From position",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,18,175,58,10 + EDITTEXT IDC_EDIT3,78,174,19,12,ES_AUTOHSCROLL | ES_NUMBER + CTEXT "to",IDC_STATIC,102,176,8,8 + EDITTEXT IDC_EDIT4,114,174,19,12,ES_AUTOHSCROLL | ES_NUMBER END IDD_PROGRESS DIALOG 0, 0, 186, 55 @@ -1004,34 +1005,34 @@ LTEXT "Note: you need to enable multichannel-record in order to enter chords.",IDC_STATIC,4,136,237,10 END -IDD_LAYER3CONVERT DIALOGEX 0, 0, 220, 250 +IDD_LAYER3CONVERT DIALOGEX 0, 0, 280, 202 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "MPEG Layer3 Convert" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - GROUPBOX "",IDC_STATIC,6,6,150,132 - DEFPUSHBUTTON "OK",IDOK,162,12,50,14 - PUSHBUTTON "Cancel",IDCANCEL,162,30,50,14 - LTEXT "Encoder:",IDC_STATIC,12,18,109,8 - COMBOBOX IDC_COMBO2,12,30,131,97,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Format:",IDC_STATIC,12,48,109,8 - COMBOBOX IDC_COMBO1,12,60,131,97,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Limit file size to: (KBytes)",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,78,111,10 - EDITTEXT IDC_EDIT1,24,90,50,12,ES_AUTOHSCROLL - CONTROL "Limit song length to: (seconds)",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,108,111,10 - EDITTEXT IDC_EDIT2,24,120,50,12,ES_AUTOHSCROLL - GROUPBOX "",IDC_STATIC,6,144,210,102 - CONTROL "Include Song Information",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,156,132,10 - RTEXT "Author:",IDC_STATIC,12,176,36,8 - EDITTEXT IDC_EDIT3,54,174,150,12,ES_AUTOHSCROLL - RTEXT "Comment:",IDC_STATIC,12,194,36,8 - EDITTEXT IDC_EDIT4,54,192,150,12,ES_AUTOHSCROLL - RTEXT "Album:",IDC_STATIC,12,210,36,8 - EDITTEXT IDC_EDIT5,54,208,150,12,ES_AUTOHSCROLL - RTEXT "Genre:",IDC_STATIC,12,230,35,8 - COMBOBOX IDC_COMBO3,54,228,92,64,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP - RTEXT "Year:",IDC_STATIC,150,230,18,8 - EDITTEXT IDC_EDIT6,174,228,31,12,ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "",IDC_STATIC,6,6,210,84 + DEFPUSHBUTTON "OK",IDOK,222,12,50,14 + PUSHBUTTON "Cancel",IDCANCEL,222,30,50,14 + LTEXT "Encoder:",IDC_STATIC,18,20,42,8 + COMBOBOX IDC_COMBO2,60,18,144,97,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Format:",IDC_STATIC,18,38,42,8 + COMBOBOX IDC_COMBO1,60,36,144,97,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Limit file size to: (KBytes)",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,55,111,10 + EDITTEXT IDC_EDIT1,150,54,48,12,ES_AUTOHSCROLL + CONTROL "Limit song length to: (seconds)",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,73,111,10 + EDITTEXT IDC_EDIT2,150,72,48,12,ES_AUTOHSCROLL + GROUPBOX "",IDC_STATIC,6,96,210,102 + CONTROL "Include Song Information",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,108,132,10 + LTEXT "Author:",IDC_STATIC,18,128,30,8 + EDITTEXT IDC_EDIT3,54,126,150,12,ES_AUTOHSCROLL + LTEXT "Album:",IDC_STATIC,18,146,30,8 + EDITTEXT IDC_EDIT5,54,144,150,12,ES_AUTOHSCROLL + LTEXT "URL:",IDC_STATIC,18,164,30,8 + EDITTEXT IDC_EDIT4,54,162,150,12,ES_AUTOHSCROLL + LTEXT "Genre:",IDC_STATIC,18,182,29,8 + COMBOBOX IDC_COMBO3,54,180,92,64,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + RTEXT "Year:",IDC_STATIC,150,182,18,8 + EDITTEXT IDC_EDIT6,174,180,31,12,ES_AUTOHSCROLL | ES_NUMBER END IDD_SPLASHSCREEN DIALOG 0, 0, 188, 95 @@ -1331,9 +1332,9 @@ CONTROL "",IDC_SPIN_ADDSILENCE,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,60,18,11,14 LTEXT "samples",IDC_STATIC,78,21,35,8 CONTROL "Add a beginning of sample",IDC_RADIO_ADDSILENCE_BEGIN, - "Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,12,36,102,12 - CONTROL "Add at end of sample",IDC_RADIO_ADDSILENCE_END,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,48,102,12 - CONTROL "Resize to",IDC_RADIO_RESIZETO,"Button",BS_AUTORADIOBUTTON,12,60,102,12 + "Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,12,36,102,8 + CONTROL "Add at end of sample",IDC_RADIO_ADDSILENCE_END,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,48,102,8 + CONTROL "Resize to",IDC_RADIO_RESIZETO,"Button",BS_AUTORADIOBUTTON,12,60,102,8 END IDD_PATTERNRANDOMIZER_EFFECT DIALOGEX 0, 0, 235, 172 @@ -1384,7 +1385,8 @@ IDD_WAVECONVERT, DIALOG BEGIN - BOTTOMMARGIN, 163 + RIGHTMARGIN, 211 + BOTTOMMARGIN, 194 END IDD_OPTIONS_KEYBOARD, DIALOG @@ -1529,8 +1531,8 @@ IDD_LAYER3CONVERT, DIALOG BEGIN - RIGHTMARGIN, 214 - BOTTOMMARGIN, 246 + RIGHTMARGIN, 274 + BOTTOMMARGIN, 198 END IDD_MOD2MIDI, DIALOG @@ -2326,18 +2328,18 @@ PUSHBUTTON "Restore",IDC_BUTTON8,480,2,42,11,0,WS_EX_STATICEDGE END -IDD_DEFAULTPLUGINEDITOR DIALOGEX 0, 0, 151, 242 +IDD_DEFAULTPLUGINEDITOR DIALOGEX 0, 0, 151, 241 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_TOOLWINDOW | WS_EX_CLIENTEDGE +EXSTYLE WS_EX_TOOLWINDOW CAPTION "Editor" -FONT 8, "MS Sans Serif", 400, 0, 0x0 +FONT 8, "MS Shell Dlg", 400, 0, 0x0 BEGIN LISTBOX IDC_PARAMLIST,7,17,100,194,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP CONTROL "",IDC_PARAMVALUESLIDE,"msctls_trackbar32",TBS_VERT | TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,115,18,18,177 EDITTEXT IDC_PARAMVALUETEXT,109,197,25,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER LTEXT "Static",IDC_PARAMLABEL,112,8,32,8 LTEXT "Parameters:",IDC_STATIC,7,7,38,8 - LTEXT "\x89",IDC_PARAMLABEL2,136,200,8,8 + LTEXT "\x89",IDC_PARAMLABEL2,136,200,14,8 END IDD_MOVEFXSLOT DIALOGEX 0, 0, 133, 78 @@ -2429,7 +2431,7 @@ LEFTMARGIN, 7 RIGHTMARGIN, 144 TOPMARGIN, 7 - BOTTOMMARGIN, 235 + BOTTOMMARGIN, 234 END IDD_MOVEFXSLOT, DIALOG Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2009-08-08 21:26:10 UTC (rev 317) @@ -352,16 +352,16 @@ RelativePath=".\mod2midi.cpp"> </File> <File - RelativePath=".\mod2wave.cpp"> + RelativePath=".\Mod2wave.cpp"> </File> <File RelativePath="..\soundlib\mod_specifications.cpp"> </File> <File - RelativePath=".\moddoc.cpp"> + RelativePath=".\Moddoc.cpp"> </File> <File - RelativePath=".\modedit.cpp"> + RelativePath=".\Modedit.cpp"> </File> <File RelativePath="..\soundlib\modsmp_ctrl.cpp"> @@ -475,6 +475,12 @@ RelativePath="..\soundlib\Tables.cpp"> </File> <File + RelativePath=".\tagging.cpp"> + </File> + <File + RelativePath=".\tagging.h"> + </File> + <File RelativePath=".\view_com.cpp"> </File> <File @@ -744,6 +750,9 @@ RelativePath="InputHandler.h"> </File> <File + RelativePath="..\soundlib\IT_DEFS.H"> + </File> + <File RelativePath=".\KeyboardSettings.h"> </File> <File Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2009-08-08 21:26:10 UTC (rev 317) @@ -473,7 +473,7 @@ > </File> <File - RelativePath=".\mod2wave.cpp" + RelativePath=".\Mod2wave.cpp" > </File> <File @@ -481,11 +481,11 @@ > </File> <File - RelativePath=".\moddoc.cpp" + RelativePath=".\Moddoc.cpp" > </File> <File - RelativePath=".\modedit.cpp" + RelativePath=".\Modedit.cpp" > </File> <File @@ -637,6 +637,14 @@ > </File> <File + RelativePath=".\tagging.cpp" + > + </File> + <File + RelativePath=".\tagging.h" + > + </File> + <File RelativePath=".\view_com.cpp" > </File> @@ -991,6 +999,10 @@ > </File> <File + RelativePath="..\soundlib\IT_DEFS.H" + > + </File> + <File RelativePath=".\KeyboardSettings.h" > </File> Modified: trunk/OpenMPT/mptrack/res/view_pat.bmp =================================================================== (Binary files differ) Added: trunk/OpenMPT/mptrack/tagging.cpp =================================================================== --- trunk/OpenMPT/mptrack/tagging.cpp (rev 0) +++ trunk/OpenMPT/mptrack/tagging.cpp 2009-08-08 21:26:10 UTC (rev 317) @@ -0,0 +1,189 @@ +/* + * Purpose: File tagging (ID3v2, RIFF + more in the future) + * Authors: OpenMPT Devs +*/ + +#include "stdafx.h" +#include "mptrack.h" +#include "tagging.h" +#include "version.h" +#include "sndfile.h" + +/////////////////////////////////////////////////// +// CFileTagging - helper class for writing tags + +CFileTagging::CFileTagging() +{ + encoder = "OpenMPT " MPT_VERSION_STR; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// ID3v2.4 Tags + +// Convert Integer to Synchsafe Integer (see ID3v2.4 specs) +// Basically, it's a BigEndian integer, but the MSB of all bytes is 0. +// Thus, a 32-bit integer turns into a 28-bit integer. +UINT32 CFileTagging::intToSynchsafe(UINT32 in) +{ + in = LittleEndian(in); + UINT32 out = 0; + do { + out <<= 8; + out |= (in & 0x7F); + } while(in >>= 7); + return BigEndian(out); +} + +// Write Tags +void CFileTagging::WriteID3v2Tags(FILE *f) +{ + if(!f) return; + + TAGID3v2HEADER tHeader; + UINT fOffset = ftell(f); + + totalID3v2Size = 0; + + // Correct header will be written later (tag size missing) + tHeader.signature[0] = 'I'; + tHeader.signature[1] = 'D'; + tHeader.signature[2] = '3'; + tHeader.version[0] = 0x04; // Version 2.4.0 + tHeader.version[1] = 0x00; // Dito + tHeader.flags = 0x00; // No flags + fwrite(&tHeader, 1, sizeof(tHeader), f); + + // Write TIT2 (Title), TCOM / TPE1 (Composer), TALB (Album), TCON (Genre), TYER (Date), WXXX (URL), COMM (Comment), TENC (Encoder) + WriteID3v2Frame("TIT2", title, f); + WriteID3v2Frame("TPE1", artist, f); + WriteID3v2Frame("TCOM", artist, f); + WriteID3v2Frame("TALB", album, f); + WriteID3v2Frame("TCON", genre, f); + WriteID3v2Frame("TYER", year, f); + WriteID3v2Frame("WXXX", url, f); + WriteID3v2Frame("COMM", comments, f); + WriteID3v2Frame("TENC", encoder, f); + + // Write Padding + for(UINT i = 0; i < ID3v2_PADDING; i++) + { + fputc(0, f); + } + totalID3v2Size += ID3v2_PADDING; + + // Write correct header (update tag size) + tHeader.size = intToSynchsafe(totalID3v2Size); + fseek(f, fOffset, SEEK_SET); + fwrite(&tHeader, 1, sizeof(tHeader), f); + fseek(f, totalID3v2Size, SEEK_CUR); + +} + +// Write a ID3v2 frame +void CFileTagging::WriteID3v2Frame(char cFrameID[4], string sFramecontent, FILE *f) +{ + if(!strcmp(cFrameID, "") || sFramecontent.empty() || !f) return; + + if(!strcmp(cFrameID, "COMM")) + { + // English language for comments - no description following (hence the text ending nullchar(s)) + // HALP this is really lame, how is it done properly so the nullchar is not lost? + string sInfo; + sInfo = "eng"; // See http://en.wikipedia.org/wiki/ISO-639-2 + sInfo += ID3v2_TEXTENDING; + sFramecontent = sInfo + sFramecontent; + } + sFramecontent = ID3v2_CHARSET + sFramecontent; + + TAGID3v2FRAME tFrame; + + memcpy(&tFrame.frameid, cFrameID, 4); // ID + tFrame.size = intToSynchsafe(sFramecontent.size()); // Text size + tFrame.flags = 0x0000; // No flags + fwrite(&tFrame, 1, sizeof(tFrame), f); + fwrite(sFramecontent.c_str(), 1, sFramecontent.size(), f); + + totalID3v2Size += (sizeof(tFrame) + sFramecontent.size()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// RIFF (WAVE) Tags + +// Write RIFF tags +void CFileTagging::WriteWaveTags(WAVEDATAHEADER *wdh, WAVEFILEHEADER *wfh, FILE *f) +{ + if(!f || !wdh || !wfh) return; + + WAVEFILEHEADER list; + WAVEDATAHEADER chunk; + CHAR s[256]; + DWORD info_ofs, end_ofs; + DWORD zero = 0; + + info_ofs = ftell(f); + if (info_ofs & 1) + { + wdh->length++; + fwrite(&zero, 1, 1, f); + info_ofs++; + } + list.id_RIFF = IFFID_LIST; + list.id_WAVE = IFFID_INFO; + list.filesize = 4; + fwrite(&list, 1, sizeof(list), f); + // ICMT + if (!comments.empty()) + { + chunk.id_data = IFFID_ICMT; + chunk.length = strlen(comments.c_str()) + 1; + fwrite(&chunk, 1, sizeof(chunk), f); + fwrite(comments.c_str(), 1, chunk.length, f); + list.filesize += chunk.length + sizeof(chunk); + if (chunk.length & 1) + { + fwrite(&zero, 1, 1, f); + list.filesize++; + } + } + for (UINT iCmt=0; iCmt<=6; iCmt++) + { + s[0] = 0; + switch(iCmt) + { + // INAM + case 0: memcpy(s, title.c_str(), 255); s[255] = 0; chunk.id_data = IFFID_INAM; break; + // IART + case 1: memcpy(s, artist.c_str(), 255); s[255] = 0; chunk.id_data = IFFID_IART; break; + // IPRD + case 2: memcpy(s, album.c_str(), 255); s[255] = 0; chunk.id_data = IFFID_IPRD; break; + // ICOP + case 3: memcpy(s, url.c_str(), 255); s[255] = 0; chunk.id_data = IFFID_ICOP; break; + // IGNR + case 4: memcpy(s, genre.c_str(), 255); s[255] = 0; chunk.id_data = IFFID_IGNR; break; + // ISFT + case 5: memcpy(s, encoder.c_str(), 255); s[255] = 0; chunk.id_data = IFFID_ISFT; break; + // ICRD + case 6: memcpy(s, year.c_str(), 4); s[4] = 0; strcat(s, "-01-01"); if (s[0] <= '0') s[0] = 0; chunk.id_data = IFFID_ICRD; break; + } + int l = strlen(s); + while ((l > 0) && (s[l-1] == ' ')) s[--l] = 0; + if (s[0]) + { + chunk.length = strlen(s)+1; + fwrite(&chunk, 1, sizeof(chunk), f); + fwrite(s, 1, chunk.length, f); + list.filesize += chunk.length + sizeof(chunk); + if (chunk.length & 1) + { + fwrite(&zero, 1, 1, f); + list.filesize++; + } + } + } + // Update INFO size + end_ofs = ftell(f); + fseek(f, info_ofs, SEEK_SET); + fwrite(&list, 1, sizeof(list), f); + fseek(f, end_ofs, SEEK_SET); + wfh->filesize += list.filesize + 8; +} Added: trunk/OpenMPT/mptrack/tagging.h =================================================================== --- trunk/OpenMPT/mptrack/tagging.h (rev 0) +++ trunk/OpenMPT/mptrack/tagging.h 2009-08-08 21:26:10 UTC (rev 317) @@ -0,0 +1,112 @@ +#pragma once +// ID3v2.4 / etc. tagging class (for mp3 / wav / etc. support) + +#pragma pack(1) + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// ID3v1 Genres + +#define NUM_GENRES 148 + +static LPCSTR gpszGenreNames[NUM_GENRES] = +{ + "Blues", "Classic Rock", "Country", "Dance", + "Disco", "Funk", "Grunge", "Hip Hop", + "Jazz", "Metal", "New_Age", "Oldies", + "Other", "Pop", "Rhythm n Blues", "Rap", + "Reggae", "Rock", "Techno", "Industrial", + "Alternative", "Ska", "Death Metal", "Pranks", + "Soundtrack", "Euro Techno", "Ambient", "Trip_Hop", + "Vocal", "Jazz Funk", "Fusion", "Trance", + "Classical", "Instrumental", "Acid", "House", + "Game", "Sound Clip", "Gospel", "Noise", + "Alternative Rock", "Bass", "Soul", "Punk", + "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", + "Ethnic", "Gothic", "Darkwave", "Techno Industrial", + "Electronic", "Pop Folk", "Eurodance", "Dream", + "Southern Rock", "Comedy", "Cult", "Gangsta", + "Top 40", "Christian Rap", "Pop Funk", "Jungle", + "Native_American", "Cabaret", "New_Wave", "Psychadelic", + "Rave", "ShowTunes", "Trailer", "Lo Fi", + "Tribal", "Acid Punk", "Acid Jazz", "Polka", + "Retro", "Musical", "Rock n Roll", "Hard_Rock", + "Folk", "Folk Rock", "National Folk", "Swing", + "Fast Fusion", "Bebob", "Latin", "Revival", + "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock", + "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", + "Big Band", "Chorus", "Easy Listening", "Acoustic", + "Humour", "Speech", "Chanson", "Opera", + "Chamber Music", "Sonata", "Symphony", "Booty_Bass", + "Primus", "Porn Groove", "Satire", "Slow Jam", + "Club", "Tango", "Samba", "Folklore", + "Ballad", "Power Ballad", "Rhytmic Soul", "Freestyle", + "Duet", "Punk Rock", "Drum Solo", "Acapella", + "Euro House", "Dance Hall", "Goa", "Drum n Bass", + "Club-House", "Hardcore", "Terror", "Indie", + "BritPop", "Negerpunk", "Polsk Punk", "Beat", + "Christian Gangsta", "Heavy Metal", "Black Metal", "Crossover", + "Contemporary Christian","Christian Rock", "Merengue", "Salsa", + "Thrash Metal", "Anime", "JPop", "SynthPop", +}; + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// ID3v2.4 Tags + +typedef struct _TAGID3v2HEADER +{ + BYTE signature[3]; + BYTE version[2]; + BYTE flags; + UINT32 size; + // Total: 10 bytes +} TAGID3v2HEADER; + +typedef struct _TAGID3v2FRAME +{ + UINT32 frameid; + UINT32 size; + UINT16 flags; + // Total: 10 bytes +} TAGID3v2FRAME; + +// we will add some padding bytes to our id3v2 tag (extending tags will be easier this way) +#define ID3v2_PADDING 512 + +// charset... choose text ending accordingly. +// $00 = ISO-8859-1. Terminated with $00. +// $01 = UTF-16. Terminated with $00 00. +// $02 = UTF-16BE. Terminated with $00 00. +// $03 = UTF-8. Terminated with $00. +#ifdef UNICODE +#define ID3v2_CHARSET '\3' +#define ID3v2_TEXTENDING '\0' +#else +#define ID3v2_CHARSET '\0' +#define ID3v2_TEXTENDING '\0' +#endif + +//================ +class CFileTagging +//================ +{ +public: + // Write Tags + void WriteID3v2Tags(FILE *f); + void WriteWaveTags(WAVEDATAHEADER *wdh, WAVEFILEHEADER *wfh, FILE *f); + + // Tag data + string title, artist, album, year, comments, genre, url, encoder; + + CFileTagging(); + + +private: + // Convert Integer to Synchsafe Integer (see ID3v2.4 specs) + UINT32 intToSynchsafe(UINT32 in); + // Write a frame + void WriteID3v2Frame(char cFrameID[4], string sFramecontent, FILE *f); + // Size of our tag + UINT32 totalID3v2Size; +}; + +#pragma pack() Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb =================================================================== --- trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb 2009-08-08 21:26:10 UTC (rev 317) @@ -6,7 +6,7 @@ //----( Global Context (0) )------------ 0:1347:2:78:1 //File/New: Ctrl+N (KeyDown) 0:1346:2:79:1 //File/Open: Ctrl+O (KeyDown) -0:1348:2:87:1 //File/Close: Ctrl+W (KeyDown) +0:1348:2:87:5 //File/Close: Ctrl+W (KeyDown|KeyHold) 0:1349:2:83:1 //File/Save: Ctrl+S (KeyDown) 0:1693:0:166:1 //Previous Document: (KeyDown) 0:1694:0:167:1 //Next Document: (KeyDown) @@ -108,9 +108,9 @@ 3:1070:0:85:1 //Base octave F#: U (KeyDown) 3:1071:0:73:1 //Base octave G: I (KeyDown) 3:1072:0:79:1 //Base octave G#: O (KeyDown) -3:1073:0:80:1 //Base octave +1 A: P (KeyDown) -3:1074:0:186:1 //Base octave +1 A#: \xFC (KeyDown) -3:1075:0:187:1 //Base octave +1 B: + (KeyDown) +3:1073:0:80:1 //Base octave A: P (KeyDown) +3:1074:0:186:1 //Base octave A#: \xFC (KeyDown) +3:1075:0:187:1 //Base octave B: + (KeyDown) 3:1076:0:65:1 //Base octave +1 C: A (KeyDown) 3:1077:0:83:1 //Base octave +1 C#: S (KeyDown) 3:1078:0:68:1 //Base octave +1 D: D (KeyDown) @@ -120,9 +120,9 @@ 3:1082:0:74:1 //Base octave +1 F#: J (KeyDown) 3:1083:0:75:1 //Base octave +1 G: K (KeyDown) 3:1084:0:76:1 //Base octave +1 G#: L (KeyDown) -3:1085:0:192:1 //Base octave +2 A: \xF6 (KeyDown) -3:1086:0:222:1 //Base octave +2 A#: \xE4 (KeyDown) -3:1087:0:191:1 //Base octave +2 B: # (KeyDown) +3:1085:0:192:1 //Base octave +1 A: \xF6 (KeyDown) +3:1086:0:222:1 //Base octave +1 A#: \xE4 (KeyDown) +3:1087:0:191:1 //Base octave +1 B: # (KeyDown) 3:1088:0:89:1 //Base octave +2 C: Y (KeyDown) 3:1089:0:88:1 //Base octave +2 C#: X (KeyDown) 3:1090:0:67:1 //Base octave +2 D: C (KeyDown) @@ -132,7 +132,7 @@ 3:1094:0:77:1 //Base octave +2 F#: M (KeyDown) 3:1095:0:188:1 //Base octave +2 G: , (KeyDown) 3:1096:0:190:1 //Base octave +2 G#: . (KeyDown) -3:1097:0:189:1 //Base octave +3 A: - (KeyDown) +3:1097:0:189:1 //Base octave +2 A: - (KeyDown) 3:1212:0:48:1 //Set octave 0: 0 (KeyDown) 3:1212:0:96:1 //Set octave 0: 0 (ZEHNERTASTATUR) (KeyDown) 3:1213:0:49:1 //Set octave 1: 1 (KeyDown) @@ -154,8 +154,9 @@ 3:1221:0:57:1 //Set octave 9: 9 (KeyDown) 3:1221:0:105:1 //Set octave 9: 9 (ZEHNERTASTATUR) (KeyDown) 3:1316:1:16:1 //Chord Modifier: Shift+UMSCHALT (KeyDown) -3:1200:0:220:1 //Note cut: ZIRKUMFLEX (KeyDown) -3:1201:0:221:1 //Note off: AKUT (KeyDown) +3:1200:0:220:1 //Note Cut: ZIRKUMFLEX (KeyDown) +3:1201:0:221:1 //Note Off: AKUT (KeyDown) +3:1791:0:219:1 //Note Fade: \xDF (KeyDown) //----( Pattern Context [bottom] - Ins Col (4) )------------ 4:1202:0:96:1 //Set instrument digit 0: 0 (ZEHNERTASTATUR) (KeyDown) @@ -258,6 +259,9 @@ 8:1382:0:46:1 //Delete sample selection: ENTF (KeyDown) 8:1386:0:107:1 //Zoom Out: + (ZEHNERTASTATUR) (KeyDown) 8:1387:0:109:1 //Zoom In: - (ZEHNERTASTATUR) (KeyDown) +8:1784:2:73:1 //Invert sample phase: Ctrl+I (KeyDown) +8:1785:2:85:1 //Signed/Unsigned conversion: Ctrl+U (KeyDown) +8:1790:2:68:1 //Remove DC Offset: Ctrl+D (KeyDown) //----( Instrument Context [bottom] (9) )------------ Modified: trunk/OpenMPT/soundlib/IT_DEFS.H =================================================================== --- trunk/OpenMPT/soundlib/IT_DEFS.H 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/soundlib/IT_DEFS.H 2009-08-08 21:26:10 UTC (rev 317) @@ -7,8 +7,8 @@ { DWORD id; // 0x4D504D49 CHAR songname[26]; - CHAR highlight_minor; - CHAR highlight_major; + BYTE highlight_minor; + BYTE highlight_major; WORD ordnum; WORD insnum; WORD smpnum; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-06 22:30:56 UTC (rev 316) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-08 21:26:10 UTC (rev 317) @@ -990,13 +990,12 @@ if (m_nDefaultGlobalVolume > 256) m_nDefaultGlobalVolume = 256; } if (pifh->speed) m_nDefaultSpeed = pifh->speed; - if (pifh->tempo) m_nDefaultTempo = pifh->tempo; - if(m_nDefaultTempo < 32) m_nDefaultTempo = 32; // tempo 31 is possible. due to conflicts with the rest of the engine, let's just clamp it to 32. + m_nDefaultTempo = max(32, pifh->tempo); // tempo 31 is possible. due to conflicts with the rest of the engine, let's just clamp it to 32. + m_nSamplePreAmp = min(pifh->mv, 128); + /*if (m_nSamplePreAmp<... [truncated message content] |
From: <sag...@us...> - 2009-08-09 23:08:05
|
Revision: 318 http://modplug.svn.sourceforge.net/modplug/?rev=318&view=rev Author: saga-games Date: 2009-08-09 23:07:50 +0000 (Sun, 09 Aug 2009) Log Message: ----------- [New] Rearrange samples is back! And this time, it's even fully functional! [New] Started support for Image Orpheus modules. Does not work yet. [New] XM Compatibility Export [Fix] Fixed crash in instrument view that occured if RowsPerBeat was 0 [Imp] XM Compatibility: Using MilkyTracker's arpeggio logic for better XM arpeggio compatibility - still not perfect! [Imp] Compatibility: Updated several mod specifications [Imp] Pattern Editor: Showing descriptions of "special" notes in the statusbar, like it's done for effects [Imp] Module Conversion: Convert E9x to Q8x as Q0x actually means "continue" and note "no change" for the volume change [Imp] Module Creation: MOD files have 4 channels by default. [Imp] IT Loading: Detect more version of MPT that did stupid things [Imp] IT Compatibility Export: Save with custom "tracker version" header field (same as for S3M). [Ref] Renamed nC4Speed to nC5Speed as that's what it actually is. [Ref] Added "hasComments" to mod specifications [Ref] Usage of "NOTE_NONE" constant instead of "0" in many places [Ref] Shuffled around Parameter Control and Note Fade commands [Ref] More replacement of BOOL/TRUE/FALSE by bool/true/false [Ref] Using song flag for "break to row occured" instead of a seperate boolean variable Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_com.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Mpt_midi.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/mptrack/view_com.cpp trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/LOAD_AMF.CPP trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/LOAD_DMF.CPP trunk/OpenMPT/soundlib/LOAD_DSM.CPP trunk/OpenMPT/soundlib/Load_669.cpp trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_far.cpp trunk/OpenMPT/soundlib/Load_gdm.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Load_mo3.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Load_mtm.cpp trunk/OpenMPT/soundlib/Load_okt.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/Load_ptm.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_stm.cpp trunk/OpenMPT/soundlib/Load_ult.cpp trunk/OpenMPT/soundlib/Load_umx.cpp trunk/OpenMPT/soundlib/Load_wav.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/mod_specifications.h trunk/OpenMPT/soundlib/modcommand.h trunk/OpenMPT/soundlib/modsmp_ctrl.cpp Added Paths: ----------- trunk/OpenMPT/soundlib/Load_imf.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_com.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/Ctrl_com.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -139,7 +139,7 @@ } if (dwHint & HINT_MODTYPE) { - m_EditComments.SetReadOnly((m_pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_S3M)) ? TRUE : FALSE); + m_EditComments.SetReadOnly(!m_pSndFile->GetModSpecifications().hasComments); } m_EditComments.SetRedraw(TRUE); Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -646,9 +646,9 @@ int transp = 0; if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { - wsprintf(s, "%lu", pins->nC4Speed); + wsprintf(s, "%lu", pins->nC5Speed); m_EditFineTune.SetWindowText(s); - transp = CSoundFile::FrequencyToTranspose(pins->nC4Speed) >> 7; + transp = CSoundFile::FrequencyToTranspose(pins->nC5Speed) >> 7; } else { SetDlgItemInt(IDC_EDIT5, (int)pins->nFineTune); @@ -736,7 +736,7 @@ pins->nVolume = 256; pins->nPan = 128; pins->name[0] = 0; - if (!pins->nC4Speed) pins->nC4Speed = 22050; + if (!pins->nC5Speed) pins->nC5Speed = 22050; if (dlg.m_nFormat & 1) { pins->nLength >>= 1; @@ -1493,7 +1493,7 @@ { if(!(m_pSndFile->m_nType & MOD_TYPE_MOD)) { - if (pins->nC4Speed < 200000) pins->nC4Speed *= 2; + if (pins->nC5Speed < 200000) pins->nC5Speed *= 2; if (pins->RelativeTone < 84) pins->RelativeTone += 12; } } @@ -1619,7 +1619,7 @@ { if(!(m_pSndFile->m_nType & MOD_TYPE_MOD)) { - if (pins->nC4Speed > 2000) pins->nC4Speed /= 2; + if (pins->nC5Speed > 2000) pins->nC5Speed /= 2; if (pins->RelativeTone > -84) pins->RelativeTone -= 12; } } @@ -1720,7 +1720,7 @@ UpdateData(TRUE); //Calculate/verify samplerate at C4. - long lSampleRate = pins->nC4Speed; + long lSampleRate = pins->nC5Speed; if(m_pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) lSampleRate = (double)CSoundFile::TransposeToFrequency(pins->RelativeTone, pins->nFineTune); if(lSampleRate <= 0) @@ -2161,7 +2161,7 @@ while(fft > MAX_BUFFER_LENGTH) fft >>= 1; // Get original sample rate - long lSampleRate = pins->nC4Speed; + long lSampleRate = pins->nC5Speed; if(m_pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) lSampleRate = CSoundFile::TransposeToFrequency(pins->RelativeTone, pins->nFineTune); if(lSampleRate <= 0) lSampleRate = 8363; @@ -2643,9 +2643,9 @@ int n = GetDlgItemInt(IDC_EDIT5); if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M|MOD_TYPE_MPT)) { - if ((n >= 2000) && (n <= 256000) && (n != (int)m_pSndFile->Ins[m_nSample].nC4Speed)) + if ((n >= 2000) && (n <= 256000) && (n != (int)m_pSndFile->Ins[m_nSample].nC5Speed)) { - m_pSndFile->Ins[m_nSample].nC4Speed = n; + m_pSndFile->Ins[m_nSample].nC5Speed = n; int transp = CSoundFile::FrequencyToTranspose(n) >> 7; int basenote = 60 - transp; if (basenote < BASENOTE_MIN) basenote = BASENOTE_MIN; @@ -2677,12 +2677,12 @@ int n = 60 - (m_CbnBaseNote.GetCurSel() + BASENOTE_MIN); if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M|MOD_TYPE_MPT)) { - LONG ft = CSoundFile::FrequencyToTranspose(m_pSndFile->Ins[m_nSample].nC4Speed) & 0x7f; + LONG ft = CSoundFile::FrequencyToTranspose(m_pSndFile->Ins[m_nSample].nC5Speed) & 0x7f; n = CSoundFile::TransposeToFrequency(n, ft); - if ((n >= 500) && (n <= 256000) && (n != (int)m_pSndFile->Ins[m_nSample].nC4Speed)) + if ((n >= 500) && (n <= 256000) && (n != (int)m_pSndFile->Ins[m_nSample].nC5Speed)) { CHAR s[32]; - m_pSndFile->Ins[m_nSample].nC4Speed = n; + m_pSndFile->Ins[m_nSample].nC5Speed = n; wsprintf(s, "%lu", n); LockControls(); m_EditFineTune.SetWindowText(s); @@ -3121,19 +3121,19 @@ { if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { - LONG d = pins->nC4Speed; + LONG d = pins->nC5Speed; if (d < 1) d = 8363; d += (pos * 25); if (d > 96000) d = 96000; if (d < 2000) d = 2000; - pins->nC4Speed = d; - int transp = CSoundFile::FrequencyToTranspose(pins->nC4Speed) >> 7; + pins->nC5Speed = d; + int transp = CSoundFile::FrequencyToTranspose(pins->nC5Speed) >> 7; int basenote = 60 - transp; if (basenote < BASENOTE_MIN) basenote = BASENOTE_MIN; if (basenote >= BASENOTE_MAX) basenote = BASENOTE_MAX-1; basenote -= BASENOTE_MIN; if (basenote != m_CbnBaseNote.GetCurSel()) m_CbnBaseNote.SetCurSel(basenote); - wsprintf(s, "%lu", pins->nC4Speed); + wsprintf(s, "%lu", pins->nC5Speed); m_EditFineTune.SetWindowText(s); } else { Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -325,23 +325,23 @@ { m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 13*COLUMN_HEIGHT); } else - if (note >= NOTE_KEYOFF) + if (note == NOTE_KEYOFF) { m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 14*COLUMN_HEIGHT); } else - if(note >= NOTE_PC) + if(note == NOTE_FADE) { + m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 17*COLUMN_HEIGHT); + } else + if(note == NOTE_PC) + { m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 15*COLUMN_HEIGHT); } else - if(note >= NOTE_PCS) + if(note == NOTE_PCS) { m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 16*COLUMN_HEIGHT); } else - if(note >= NOTE_FADE) { - m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 17*COLUMN_HEIGHT); - } else - { if(pTuning) { // Drawing custom note names string noteStr = pTuning->GetNoteName(note-NOTE_MIDDLEC); @@ -1466,11 +1466,17 @@ // Ignore update if using PC or PCs notes because instrument, volcol and effect values // have different meaning. - if(m->note != NOTE_PC && m->note != NOTE_PCS) + if((m->note != NOTE_PC && m->note != NOTE_PCS) || GetColTypeFromCursor(m_dwCursor) == 0) { switch (GetColTypeFromCursor(m_dwCursor)) { + case 0: + // display note + if(m->note >= NOTE_MIN_SPECIAL) + strcpy(s, szSpecialNoteShortDesc[m->note - NOTE_MIN_SPECIAL]); + break; case 1: + // display instrument if (m->instr) { CHAR sztmp[128] = ""; @@ -1508,10 +1514,12 @@ } break; case 2: + // display volume command if (!pModDoc->GetVolCmdInfo(pModDoc->GetIndexFromVolCmd(m->volcmd), s)) s[0] = 0; break; case 3: case 4: + // display effect command if (!pModDoc->GetEffectName(s, m->command, m->param, FALSE, nChn)) s[0] = 0; break; } Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -72,6 +72,7 @@ ON_UPDATE_COMMAND_UI(ID_INSERT_INSTRUMENT, OnUpdateXMITMPTOnly) ON_UPDATE_COMMAND_UI(ID_INSTRUMENTS_REMOVEALL, OnUpdateInstrumentOnly) ON_UPDATE_COMMAND_UI(ID_CLEANUP_INSTRUMENTS, OnUpdateInstrumentOnly) + ON_UPDATE_COMMAND_UI(ID_REARRANGE_SAMPLES, OnUpdateSampleCount) ON_UPDATE_COMMAND_UI(ID_VIEW_INSTRUMENTS, OnUpdateXMITMPTOnly) ON_UPDATE_COMMAND_UI(ID_VIEW_COMMENTS, OnUpdateXMITMPTOnly) ON_UPDATE_COMMAND_UI(ID_VIEW_MIDIMAPPING, OnUpdateHasMIDIMappings) @@ -506,6 +507,7 @@ strcpy(fext, ".s3m"); break; case MOD_TYPE_XM: + MsgBoxHidable(XMCompatibilityExportTip); lpszDefExt = "xm"; lpszFilter = FileFilterXM; strcpy(fext, ".xm"); @@ -621,7 +623,7 @@ switch(GetModType()) { case MOD_TYPE_MOD: - m_SndFile.m_nChannels = 8; + m_SndFile.m_nChannels = 4; break; case MOD_TYPE_S3M: m_SndFile.m_nChannels = 16; @@ -851,7 +853,7 @@ pChn->pInstrument = pins; pChn->pSample = pins->pSample; pChn->nFineTune = pins->nFineTune; - pChn->nC4Speed = pins->nC4Speed; + pChn->nC5Speed = pins->nC5Speed; pChn->nPos = pChn->nPosLo = pChn->nLength = 0; pChn->nLoopStart = pins->nLoopStart; pChn->nLoopEnd = pins->nLoopEnd; @@ -1622,7 +1624,7 @@ if( AfxMessageBox(GetStrI18N(TEXT( "Compared to regular MOD save, compatibility export makes " "small adjustments to the save file in order to make the file compatible with " - "ProTracker. Note that this feature is not complete and the " + "ProTracker and other Amiga-based trackers. Note that this feature is not complete and the " "file is not guaranteed to be free of MPT-specific features.\n\n " "Important: beginning of some samples may be adjusted in the process. Proceed?")), MB_ICONINFORMATION|MB_YESNO) != IDYES ) @@ -1633,6 +1635,11 @@ pattern = FileFilterIT; ::MessageBox(NULL,"Warning: the exported file will not contain any of MPT's file-format hacks.", "Compatibility export warning.",MB_ICONINFORMATION | MB_OK); break; + case MOD_TYPE_XM: + ext = ModSpecs::xm.fileExtension; + pattern = FileFilterXM; + ::MessageBox(NULL,"Warning: the exported file will not contain any of MPT's file-format hacks.", "Compatibility export warning.",MB_ICONINFORMATION | MB_OK); + break; default: ::MessageBox(NULL,"Compatibility export is currently only available for MOD and IT modules.", "Can't do compatibility export.",MB_ICONINFORMATION | MB_OK); return; @@ -1662,7 +1669,7 @@ m_ShowSavedialog = true; // ...and force save dialog to appear when saving. break; case MOD_TYPE_XM: - m_SndFile.SaveCompatXM(dlg.GetPathName()); + m_SndFile.SaveXM(dlg.GetPathName(), 0, true); break; case MOD_TYPE_IT: m_SndFile.SaveCompatIT(dlg.GetPathName()); @@ -1927,6 +1934,12 @@ if (p) p->Enable((m_SndFile.m_nInstruments) ? TRUE : FALSE); } +void CModDoc::OnUpdateSampleCount(CCmdUI *p) +//------------------------------------------ +{ + if (p) p->Enable((m_SndFile.m_nSamples > 1) ? TRUE : FALSE); +} + void CModDoc::OnUpdateHasMIDIMappings(CCmdUI *p) //---------------------------------------------- { Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/Moddoc.h 2009-08-09 23:07:50 UTC (rev 318) @@ -186,6 +186,7 @@ public: BOOL ChangeModType(UINT nNewType); BOOL ChangeNumChannels(UINT nNewChannels, const bool showCancelInRemoveDlg = true); + BOOL ConvertInstrumentsToSamples();; BOOL RemoveUnusedSamples(); BOOL RemoveUnusedInstruments(); @@ -193,7 +194,9 @@ BOOL RemoveUnusedPlugs(); UINT RemovePlugs(const bool (&keepMask)[MAX_MIXPLUGINS]); BOOL RemoveUnusedPatterns(BOOL bRemove=TRUE); + void RearrangeSampleList(); BOOL CompoCleanup(); + LONG InsertPattern(LONG nOrd=-1, UINT nRows=64); LONG InsertSample(BOOL bLimit=FALSE); LONG InsertInstrument(LONG lSample=0, LONG lDuplicate=0); @@ -205,11 +208,6 @@ UINT PlayNote(UINT note, UINT nins, UINT nsmp, BOOL bpause, LONG nVol=-1, LONG loopstart=0, LONG loopend=0, int nCurrentChn=-1, const uint32 nStartPos = uint32_max); //rewbs.vstiLive: added current chan param BOOL NoteOff(UINT note, BOOL bFade=FALSE, UINT nins=-1, UINT nCurrentChn=-1); //rewbs.vstiLive: add params -// -> CODE#0020 -// -> DESC="rearrange sample list" - void RearrangeSampleList(void); -// -! NEW_FEATURE#0020 - BOOL IsNotePlaying(UINT note, UINT nsmp=0, UINT nins=0); BOOL MuteChannel(UINT nChn, BOOL bMute); BOOL MuteSample(UINT nSample, BOOL bMute); @@ -339,6 +337,7 @@ afx_msg void OnUpdateXMITMPTOnly(CCmdUI *p); afx_msg void OnUpdateHasMIDIMappings(CCmdUI *p); afx_msg void OnUpdateInstrumentOnly(CCmdUI *pCmdUI); + afx_msg void OnUpdateSampleCount(CCmdUI *pCmdUI); afx_msg void OnUpdateMP3Encode(CCmdUI *pCmdUI); afx_msg void OnPatternRestart(); //rewbs.customKeys afx_msg void OnPatternPlay(); //rewbs.customKeys Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -205,7 +205,7 @@ case 0x50: m->param = (m->param & 0x0F) | 0x20; break; case 0x60: m->param = (m->param & 0x0F) | 0xB0; break; case 0x70: m->param = (m->param & 0x0F) | 0x40; break; - case 0x90: m->command = CMD_RETRIG; m->param &= 0x0F; break; + case 0x90: m->command = CMD_RETRIG; m->param = 0x80 | (m->param & 0x0F); break; case 0xA0: if (m->param & 0x0F) { m->command = CMD_VOLUMESLIDE; m->param = (m->param << 4) | 0x0F; } else m->command = 0; break; case 0xB0: if (m->param & 0x0F) { m->command = CMD_VOLUMESLIDE; m->param |= 0xF0; } else m->command = 0; break; } @@ -598,7 +598,7 @@ } // End if (newTypeIsIT) if(!m_SndFile.GetModSpecifications().HasNote(m->note)) - m->note = 0; + m->note = NOTE_NONE; } } @@ -611,7 +611,7 @@ { for (UINT i=1; i<=m_SndFile.m_nSamples; i++) { - m_SndFile.Ins[i].nC4Speed = CSoundFile::TransposeToFrequency(m_SndFile.Ins[i].RelativeTone, m_SndFile.Ins[i].nFineTune); + m_SndFile.Ins[i].nC5Speed = CSoundFile::TransposeToFrequency(m_SndFile.Ins[i].RelativeTone, m_SndFile.Ins[i].nFineTune); m_SndFile.Ins[i].RelativeTone = 0; m_SndFile.Ins[i].nFineTune = 0; } @@ -1558,7 +1558,7 @@ pins->nVolume = 256; pins->nGlobalVol = 64; pins->nPan = 128; - pins->nC4Speed = 8363; + pins->nC5Speed = 8363; pins->RelativeTone = 0; pins->nFineTune = 0; pins->nVibType = 0; @@ -1751,57 +1751,78 @@ } -// -> CODE#0020 -// -> DESC="rearrange sample list" -void CModDoc::RearrangeSampleList(void) -//------------------------------------- +void CModDoc::RearrangeSampleList() +//--------------------------------- { - MessageBox(NULL, "Rearrange samplelist didn't work properly and has been disabled.", NULL, MB_ICONINFORMATION); - /* - BEGIN_CRITICAL(); - UINT i,j,k,n,l,c; + if(m_SndFile.m_nSamples < 2) + return; - for(n = 1 ; n <= m_SndFile.m_nSamples ; n++){ + UINT nRemap = 0; // remap count + UINT nSampleMap[MAX_SAMPLES + 1]; // map old => new + for(UINT i = 0; i <= MAX_SAMPLES; i++) + nSampleMap[i] = i; + + // First, find out which sample slots are unused and create the new sample map + for(UINT i = 1 ; i <= m_SndFile.m_nSamples; i++) { + if(!m_SndFile.Ins[i].pSample) + { + // Move all following samples + nRemap++; + nSampleMap[i] = 0; + for(UINT j = i + 1; j <= m_SndFile.m_nSamples; j++) + nSampleMap[j]--; + } + } - if(!m_SndFile.Ins[n].pSample){ - - k = 1; + if(!nRemap) + return; - while(n+k <= m_SndFile.m_nSamples && !m_SndFile.Ins[n+k].pSample) k++; - if(n+k >= m_SndFile.m_nSamples) break; + BEGIN_CRITICAL(); - c = k; - l = 0; + // Now, move everything around + for(UINT i = 1; i <= m_SndFile.m_nSamples; i++) + { + if(nSampleMap[i] != i) + { + // This gotta be moved - while(n+k <= m_SndFile.m_nSamples && m_SndFile.Ins[n+k].pSample){ + m_SndFile.MoveSample(i, nSampleMap[i]); + m_SndFile.Ins[i].pSample = nullptr; + strcpy(m_SndFile.m_szNames[nSampleMap[i]], m_SndFile.m_szNames[i]); + m_SndFile.m_szNames[i][0] = '\0'; - m_SndFile.MoveSample(n+k,n+l); - strcpy(m_SndFile.m_szNames[n+l], m_SndFile.m_szNames[n+k]); - m_SndFile.m_szNames[n+k][0] = '\0'; - - for(i=1; i<=m_SndFile.m_nInstruments; i++){ - if(m_SndFile.Headers[i]){ - INSTRUMENTHEADER *p = m_SndFile.Headers[i]; - for(j=0; j<128; j++) if(p->Keyboard[j] == n+k) p->Keyboard[j] = n+l; - } + // Also update instrument mapping + for(UINT iInstr = 1; iInstr <= m_SndFile.m_nInstruments; iInstr++){ + if(m_SndFile.Headers[iInstr]){ + INSTRUMENTHEADER *p = m_SndFile.Headers[iInstr]; + for(WORD iNote =0; iNote < 128; iNote++) + if(p->Keyboard[iNote] == i) p->Keyboard[iNote] = nSampleMap[i]; } + } + } + } - k++; - l++; + // Go through the patterns and remap samples (if module is in sample mode) + if(!m_SndFile.m_nInstruments) + { + for (UINT nPat=0; nPat<m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) + { + MODCOMMAND *m = m_SndFile.Patterns[nPat]; + for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--) + { + m->instr = nSampleMap[m->instr]; } - - n += l; - m_SndFile.m_nSamples -= c; } } + m_SndFile.m_nSamples -= nRemap; + END_CRITICAL(); SetModified(); - UpdateAllViews(NULL, HINT_SMPNAMES); - */ + UpdateAllViews(NULL, HINT_MODTYPE); + } -// -! NEW_FEATURE#0020 BOOL CModDoc::RemoveInstrument(UINT n) @@ -2099,7 +2120,7 @@ if (s[0] > ' ' && (!mix || ((!ITStyleMix && origModCmd.note==0) || (ITStyleMix && origModCmd.note==0 && origModCmd.instr==0 && origModCmd.volcmd==0)))) { - m[col].note = 0; + m[col].note = NOTE_NONE; if (s[0] == '=') m[col].note = NOTE_KEYOFF; else if (s[0] == '^') m[col].note = NOTE_NOTECUT; else if (s[0] == '~') m[col].note = NOTE_FADE; else Modified: trunk/OpenMPT/mptrack/Mpt_midi.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpt_midi.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/Mpt_midi.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -50,7 +50,7 @@ if (note < 0x80) { note += nTranspose*12; - if (note < 0) note = 0; + if (note < 0) note = NOTE_NONE; if (note > NOTE_MAX - 1) note = NOTE_MAX - 1; // -> CODE#0011 Modified: trunk/OpenMPT/mptrack/Mptrack.h =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/Mptrack.h 2009-08-09 23:07:50 UTC (rev 318) @@ -398,15 +398,15 @@ /////////////////////////////////////////////////// // Tables -#define MAX_EFFECTS 35 //rewbs.smoothVST & rewbs.velocity: increased from 32. Wonder what this will break... +#define MAX_EFFECTS 37 //rewbs.smoothVST & rewbs.velocity: increased from 32. Wonder what this will break... //+1 for eric's multiplier #define MAX_VOLCMDS 16 //rewbs.voloff & rewbs.velocity: increased from 14 extern const BYTE gEffectColors[MAX_EFFECTS]; extern const LPCSTR szNoteNames[12]; extern const LPCTSTR szDefaultNoteNames[NOTE_MAX]; -const LPCTSTR szSpecialNoteNames[NOTE_MAX_SPECIAL-NOTE_MIN_SPECIAL + 1] = {TEXT("~~"), TEXT("PCs"), TEXT("PC"), TEXT("^^"), TEXT("==")}; -const LPCTSTR szSpecialNoteShortDesc[NOTE_MAX_SPECIAL-NOTE_MIN_SPECIAL + 1] = {TEXT("Param control(smooth)"), TEXT("Param control"), TEXT("Note Cut"), TEXT("Note Off")}; +const LPCTSTR szSpecialNoteNames[NOTE_MAX_SPECIAL - NOTE_MIN_SPECIAL + 1] = {TEXT("PCs"), TEXT("PC"), TEXT("~~"), TEXT("^^"), TEXT("==")}; +const LPCTSTR szSpecialNoteShortDesc[NOTE_MAX_SPECIAL - NOTE_MIN_SPECIAL + 1] = {TEXT("Param Control (Smooth)"), TEXT("Param Control"), TEXT("Note Fade"), TEXT("Note Cut"), TEXT("Note Off")}; // Make sure that special note arrays include string for every note. STATIC_ASSERT(NOTE_MAX_SPECIAL - NOTE_MIN_SPECIAL + 1 == ARRAYELEMCOUNT(szSpecialNoteNames)); Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -1214,9 +1214,9 @@ nPrevTick=nTick; nRow=nTick/speed; - if (nRow % CMainFrame::m_nRowSpacing == 0) + if (nRow % max(1, CMainFrame::m_nRowSpacing) == 0) m_dcGrid.SelectObject(CMainFrame::penGray80); - else if (nRow % CMainFrame::m_nRowSpacing2 == 0) + else if (nRow % max(1, CMainFrame::m_nRowSpacing2) == 0) m_dcGrid.SelectObject(CMainFrame::penGray55); else m_dcGrid.SelectObject(CMainFrame::penGray33); Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -891,7 +891,7 @@ } else { - m->note = 0; + m->note = NOTE_NONE; if (ITStyle) m->instr = 0; } @@ -4420,7 +4420,7 @@ switch(field) { - case 0: if(p->note == NOTE_PC || p->note == NOTE_PCS) p->Clear(); else {p->note = 0; if (ITStyle) p->instr = 0;} break; //Note + case 0: if(p->note == NOTE_PC || p->note == NOTE_PCS) p->Clear(); else {p->note = NOTE_NONE; if (ITStyle) p->instr = 0;} break; //Note case 1: p->instr = 0; break; //instr case 2: p->vol = 0; p->volcmd = 0; break; //Vol case 3: p->command = 0; break; //Effect Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -273,7 +273,7 @@ if (pModDoc) { CSoundFile *pSndFile = pModDoc->GetSoundFile(); - LONG lSampleRate = pSndFile->Ins[m_nSample].nC4Speed; + LONG lSampleRate = pSndFile->Ins[m_nSample].nC5Speed; if (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) { lSampleRate = CSoundFile::TransposeToFrequency(pSndFile->Ins[m_nSample].RelativeTone, pSndFile->Ins[m_nSample].nFineTune); @@ -1793,7 +1793,7 @@ pfmt->id_fmt = IFFID_fmt; pfmt->hdrlen = 16; pfmt->format = 1; - pfmt->freqHz = pins->nC4Speed; + pfmt->freqHz = pins->nC5Speed; if (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) { pfmt->freqHz = CSoundFile::TransposeToFrequency(pins->RelativeTone, pins->nFineTune); @@ -1817,7 +1817,7 @@ psh->smpl_id = 0x6C706D73; psh->smpl_len = sizeof(WAVESMPLHEADER) - 8; psh->dwSamplePeriod = 22675; - if (pins->nC4Speed > 256) psh->dwSamplePeriod = 1000000000 / pins->nC4Speed; + if (pins->nC5Speed > 256) psh->dwSamplePeriod = 1000000000 / pins->nC5Speed; psh->dwBaseNote = 60; if (pins->uFlags & (CHN_LOOP|CHN_SUSTAINLOOP)) { Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -2459,10 +2459,10 @@ chord = m_CbnShortcut.GetCurSel(); if (chord >= 0) chord = m_CbnShortcut.GetItemData(chord); if ((chord < 0) || (chord >= 3*12)) chord = 0; - UINT cnote = 0; - pChords[chord].notes[0] = 0; - pChords[chord].notes[1] = 0; - pChords[chord].notes[2] = 0; + UINT cnote = NOTE_NONE; + pChords[chord].notes[0] = NOTE_NONE; + pChords[chord].notes[1] = NOTE_NONE; + pChords[chord].notes[2] = NOTE_NONE; for (UINT i=0; i<2*12; i++) if (i != (UINT)(pChords[chord].key % 12)) { UINT n = m_Keyboard.GetFlags(i); @@ -2851,7 +2851,8 @@ { {TEXT("Tip: To create ProTracker compatible MOD-files, try compatibility export from File-menu."), 1, true}, {TEXT("Tip: To create IT-files without MPT-specific extensions included, try compatibility export from File-menu."), 1 << 1, true}, - {TEXT("Press OK to apply signed/unsigned conversion\n (note: this often significantly increases volume level)"), 1 << 2, false} + {TEXT("Press OK to apply signed/unsigned conversion\n (note: this often significantly increases volume level)"), 1 << 2, false}, + {TEXT("Tip: To create XM-files without MPT-specific extensions included, try compatibility export from File-menu."), 1 << 1, true}, }; STATIC_ASSERT(ARRAYELEMCOUNT(HidableMessages) == enMsgBoxHidableMessage_count); Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2009-08-09 23:07:50 UTC (rev 318) @@ -556,6 +556,7 @@ ModCompatibilityExportTip = 0, ItCompatibilityExportTip = 1, ConfirmSignUnsignWhenPlaying = 2, + XMCompatibilityExportTip = 3, enMsgBoxHidableMessage_count }; Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-08-09 23:07:50 UTC (rev 318) @@ -1764,6 +1764,7 @@ POPUP "C&leanup" BEGIN MENUITEM "&Rearrange Patterns", ID_CLEANUP_REARRANGE + MENUITEM "Rearrange Samples", ID_REARRANGE_SAMPLES MENUITEM "&Cleanup Instruments", ID_CLEANUP_INSTRUMENTS MENUITEM "Clean&up Samples", ID_CLEANUP_SAMPLES MENUITEM "Cleanup Pa&tterns", ID_CLEANUP_PATTERNS Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2009-08-09 23:07:50 UTC (rev 318) @@ -280,6 +280,9 @@ RelativePath="..\soundlib\Load_gdm.cpp"> </File> <File + RelativePath="..\soundlib\Load_imf.cpp"> + </File> + <File RelativePath="..\soundlib\Load_it.cpp"> </File> <File Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2009-08-09 23:07:50 UTC (rev 318) @@ -377,6 +377,10 @@ > </File> <File + RelativePath="..\soundlib\Load_imf.cpp" + > + </File> + <File RelativePath="..\soundlib\Load_it.cpp" > </File> Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/resource.h 2009-08-09 23:07:50 UTC (rev 318) @@ -1109,6 +1109,7 @@ #define ID_SAMPLE_ADDSILENCE 59225 #define ID_ECHOPASTE 59226 #define ID_NOTEMAP_COPY_NOTE 59227 +#define ID_CLEANUP_REARRANGESAMPLES 59228 // Next default values for new objects // @@ -1116,7 +1117,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 519 -#define _APS_NEXT_COMMAND_VALUE 59228 +#define _APS_NEXT_COMMAND_VALUE 59229 #define _APS_NEXT_CONTROL_VALUE 2386 #define _APS_NEXT_SYMED_VALUE 901 #endif Modified: trunk/OpenMPT/mptrack/view_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/view_com.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/mptrack/view_com.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -276,8 +276,8 @@ { wsprintf(s, "%d Hz", pSndFile->GetFreqFromPeriod( - pSndFile->GetPeriodFromNote(NOTE_MIDDLEC, pins->nFineTune, pins->nC4Speed), - pins->nC4Speed)); + pSndFile->GetPeriodFromNote(NOTE_MIDDLEC, pins->nFineTune, pins->nC5Speed), + pins->nC5Speed)); } break; case SMPLIST_FILENAME: Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp =================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -1496,7 +1496,7 @@ psmp->uFlags = CHN_16BIT; psmp->nLoopStart = pins->Regions[nRgn].ulLoopStart; psmp->nLoopEnd = pins->Regions[nRgn].ulLoopEnd; - psmp->nC4Speed = p->dwSampleRate; + psmp->nC5Speed = p->dwSampleRate; psmp->nGlobalVol = 64; psmp->nVolume = 256; psmp->nPan = 128; @@ -1564,15 +1564,15 @@ sFineTune += psmp->nFineTune; } #ifdef DLSINSTR_LOG - Log("WSMP: usUnityNote=%d.%d, %dHz (transp=%d)\n", usUnityNote, sFineTune, psmp->nC4Speed, transpose); + Log("WSMP: usUnityNote=%d.%d, %dHz (transp=%d)\n", usUnityNote, sFineTune, psmp->nC5Speed, transpose); #endif if (usUnityNote > 0x7F) usUnityNote = 60; int nBaseTune = DlsFreqToTranspose( - psmp->nC4Speed, + psmp->nC5Speed, sFineTune+(60 + transpose - usUnityNote)*100); psmp->nFineTune = (CHAR)(nBaseTune & 0x7F); psmp->RelativeTone = (CHAR)(nBaseTune >> 7); - psmp->nC4Speed = CSoundFile::TransposeToFrequency(psmp->RelativeTone, psmp->nFineTune); + psmp->nC5Speed = CSoundFile::TransposeToFrequency(psmp->RelativeTone, psmp->nFineTune); if (lVolume > 256) lVolume = 256; if (lVolume < 16) lVolume = 16; psmp->nGlobalVol = (BYTE)(lVolume / 4); // 0-64 Modified: trunk/OpenMPT/soundlib/LOAD_AMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2009-08-09 23:07:50 UTC (rev 318) @@ -167,13 +167,13 @@ -BOOL CSoundFile::ReadAMF(LPCBYTE lpStream, const DWORD dwMemLength) +bool CSoundFile::ReadAMF(LPCBYTE lpStream, const DWORD dwMemLength) //----------------------------------------------------------- { const AMFFILEHEADER *pfh = (AMFFILEHEADER *)lpStream; DWORD dwMemPos; - if ((!lpStream) || (dwMemLength < 2048)) return FALSE; + if ((!lpStream) || (dwMemLength < 2048)) return false; if ((!strncmp((LPCSTR)lpStream, "ASYLUM Music Format V1.0", 25)) && (dwMemLength > 4096)) { UINT numorders, numpats, numsamples; @@ -184,7 +184,7 @@ numsamples = 64; dwMemPos += 6; if ((!numpats) || (numpats > MAX_PATTERNS) || (!numorders) - || (numpats*64*32 + 294 + 37*64 >= dwMemLength)) return FALSE; + || (numpats*64*32 + 294 + 37*64 >= dwMemLength)) return false; m_nType = MOD_TYPE_AMF0; m_nChannels = 8; m_nInstruments = 0; @@ -226,7 +226,7 @@ const UCHAR *pin = lpStream + dwMemPos; for (UINT i=0; i<8*64; i++) { - p->note = 0; + p->note = NOTE_NONE; if (pin[0]) { p->note = pin[0] + 13; @@ -253,11 +253,11 @@ MODINSTRUMENT *psmp = &Ins[iData+1]; if (psmp->nLength) { - if(dwMemPos > dwMemLength) return FALSE; + if(dwMemPos > dwMemLength) return false; dwMemPos += ReadSample(psmp, RS_PCM8S, (LPCSTR)(lpStream+dwMemPos), dwMemLength - dwMemPos); } } - return TRUE; + return true; } //////////////////////////// // DSM/AMF @@ -269,7 +269,7 @@ || (!pfh->numorders) || (pfh->numorders > MAX_PATTERNS) || (!pfh->numsamples) || (pfh->numsamples > MAX_SAMPLES) || (pfh->numchannels < 1) || (pfh->numchannels > 32)) - return FALSE; + return false; memcpy(m_szNames[0], pfh->title, 31); dwMemPos = sizeof(AMFFILEHEADER); m_nType = MOD_TYPE_AMF; @@ -323,7 +323,7 @@ dwMemPos += m_nChannels * sizeof(USHORT); } } - if (dwMemPos + m_nSamples * (sizeof(AMFSAMPLE)+8) > dwMemLength) return TRUE; + if (dwMemPos + m_nSamples * (sizeof(AMFSAMPLE)+8) > dwMemLength) return true; // Read Samples UINT maxsampleseekpos = 0; for (UINT iIns=0; iIns<m_nSamples; iIns++) @@ -335,7 +335,7 @@ memcpy(m_szNames[iIns+1], psh->samplename, 31); memcpy(pins->name, psh->filename, 13); pins->nLength = LittleEndian(psh->length); - pins->nC4Speed = LittleEndianW(psh->c2spd); + pins->nC5Speed = LittleEndianW(psh->c2spd); pins->nGlobalVol = 64; pins->nVolume = psh->volume * 4; if (pfh->version >= 11) @@ -415,7 +415,7 @@ break; } } - return TRUE; + return true; } Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2009-08-09 23:07:50 UTC (rev 318) @@ -97,7 +97,7 @@ #pragma pack() -BOOL CSoundFile::ReadDBM(const BYTE *lpStream, DWORD dwMemLength) +bool CSoundFile::ReadDBM(const BYTE *lpStream, DWORD dwMemLength) //--------------------------------------------------------------- { const DBMFILEHEADER *pfh = (DBMFILEHEADER *)lpStream; @@ -107,10 +107,10 @@ if ((!lpStream) || (dwMemLength <= sizeof(DBMFILEHEADER)) || (!pfh->channels) || (pfh->dbm_id != DBM_FILE_MAGIC) || (!pfh->songs) || (pfh->song_id != DBM_ID_SONG) || (pfh->name_id != DBM_ID_NAME) || (pfh->name_len != DBM_NAMELEN) - || (pfh->info_id != DBM_ID_INFO) || (pfh->info_len != DBM_INFOLEN)) return FALSE; + || (pfh->info_id != DBM_ID_INFO) || (pfh->info_len != DBM_INFOLEN)) return false; dwMemPos = sizeof(DBMFILEHEADER); nOrders = BigEndianW(pfh->orders); - if (dwMemPos + 2 * nOrders + 8*3 >= dwMemLength) return FALSE; + if (dwMemPos + 2 * nOrders + 8*3 >= dwMemLength) return false; nInstruments = BigEndianW(pfh->instruments); nSamples = BigEndianW(pfh->samples); nPatterns = BigEndianW(pfh->patterns); @@ -181,8 +181,8 @@ psmp->nVolume = BigEndianW(pih->volume) * 4; if ((!psmp->nVolume) || (psmp->nVolume > 256)) psmp->nVolume = 256; psmp->nGlobalVol = 64; - psmp->nC4Speed = BigEndian(pih->finetune); - int f2t = FrequencyToTranspose(psmp->nC4Speed); + psmp->nC5Speed = BigEndian(pih->finetune); + int f2t = FrequencyToTranspose(psmp->nC5Speed); psmp->RelativeTone = f2t >> 7; psmp->nFineTune = f2t & 0x7F; if ((pih->looplen) && (sflags & 3)) @@ -366,6 +366,6 @@ } } } - return TRUE; + return true; } Modified: trunk/OpenMPT/soundlib/LOAD_DMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2009-08-09 23:07:50 UTC (rev 318) @@ -86,7 +86,7 @@ #endif -BOOL CSoundFile::ReadDMF(const BYTE *lpStream, DWORD dwMemLength) +bool CSoundFile::ReadDMF(const BYTE *lpStream, DWORD dwMemLength) //--------------------------------------------------------------- { const DMFHEADER *pfh = (DMFHEADER *)lpStream; @@ -96,8 +96,8 @@ BYTE infobyte[32]; BYTE smplflags[MAX_SAMPLES]; - if ((!lpStream) || (dwMemLength < 1024)) return FALSE; - if ((pfh->id != 0x464d4444) || (!pfh->version) || (pfh->version & 0xF0)) return FALSE; + if ((!lpStream) || (dwMemLength < 1024)) return false; + if ((pfh->id != 0x464d4444) || (!pfh->version) || (pfh->version & 0xF0)) return false; dwMemPos = 66; memcpy(m_szNames[0], pfh->songname, 30); m_szNames[0][30] = 0; @@ -402,7 +402,7 @@ psmp->nLength = psh->len; psmp->nLoopStart = psh->loopstart; psmp->nLoopEnd = psh->loopend; - psmp->nC4Speed = psh->c3speed; + psmp->nC5Speed = psh->c3speed; psmp->nGlobalVol = 64; psmp->nVolume = (psh->volume) ? ((WORD)psh->volume)+1 : (WORD)256; psmp->uFlags = (psh->flags & 2) ? CHN_16BIT : 0; @@ -476,11 +476,11 @@ if (!m_nSamples) { m_nType = MOD_TYPE_NONE; - return FALSE; + return false; } m_nChannels = 4; } - return TRUE; + return true; } Modified: trunk/OpenMPT/soundlib/LOAD_DSM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2009-08-09 23:07:50 UTC (rev 318) @@ -85,7 +85,7 @@ #pragma pack() -BOOL CSoundFile::ReadDSM(LPCBYTE lpStream, DWORD dwMemLength) +bool CSoundFile::ReadDSM(LPCBYTE lpStream, DWORD dwMemLength) //----------------------------------------------------------- { DSMFILEHEADER *pfh = (DSMFILEHEADER *)lpStream; @@ -96,7 +96,7 @@ if ((!lpStream) || (dwMemLength < 1024) || (pfh->id_RIFF != DSMID_RIFF) || (pfh->riff_len + 8 > dwMemLength) || (pfh->riff_len < 1024) || (pfh->id_DSMF != DSMID_DSMF) || (pfh->id_SONG != DSMID_SONG) - || (pfh->song_len > dwMemLength)) return FALSE; + || (pfh->song_len > dwMemLength)) return false; psong = (DSMSONG *)(lpStream + sizeof(DSMFILEHEADER)); dwMemPos = sizeof(DSMFILEHEADER) + pfh->song_len; m_nType = MOD_TYPE_DSM; @@ -219,7 +219,7 @@ MODINSTRUMENT *psmp = &Ins[nSmp]; memcpy(psmp->name, pins->filename, 13); psmp->nGlobalVol = 64; - psmp->nC4Speed = pins->c2spd; + psmp->nC5Speed = pins->c2spd; psmp->uFlags = (WORD)((pins->flags & 1) ? CHN_LOOP : 0); psmp->nLength = pins->length; psmp->nLoopStart = pins->loopstart; @@ -234,6 +234,6 @@ break; } } - return TRUE; + return true; } Modified: trunk/OpenMPT/soundlib/Load_669.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_669.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/soundlib/Load_669.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -39,7 +39,7 @@ } SAMPLE669; -BOOL CSoundFile::Read669(const BYTE *lpStream, DWORD dwMemLength) +bool CSoundFile::Read669(const BYTE *lpStream, DWORD dwMemLength) //--------------------------------------------------------------- { BOOL b669Ext; @@ -47,19 +47,19 @@ const SAMPLE669 *psmp = (const SAMPLE669 *)(lpStream + 0x1F1); DWORD dwMemPos = 0; - if ((!lpStream) || (dwMemLength < sizeof(FILEHEADER669))) return FALSE; - if ((LittleEndianW(pfh->sig) != 0x6669) && (LittleEndianW(pfh->sig) != 0x4E4A)) return FALSE; + if ((!lpStream) || (dwMemLength < sizeof(FILEHEADER669))) return false; + if ((LittleEndianW(pfh->sig) != 0x6669) && (LittleEndianW(pfh->sig) != 0x4E4A)) return false; b669Ext = (LittleEndianW(pfh->sig) == 0x4E4A) ? TRUE : FALSE; if ((!pfh->samples) || (pfh->samples > 64) || (pfh->restartpos >= 128) - || (!pfh->patterns) || (pfh->patterns > 128)) return FALSE; + || (!pfh->patterns) || (pfh->patterns > 128)) return false; DWORD dontfuckwithme = 0x1F1 + pfh->samples * sizeof(SAMPLE669) + pfh->patterns * 0x600; - if (dontfuckwithme > dwMemLength) return FALSE; + if (dontfuckwithme > dwMemLength) return false; for (UINT ichk=0; ichk<pfh->samples; ichk++) { DWORD len = LittleEndian(*((DWORD *)(&psmp[ichk].length))); dontfuckwithme += len; } - if (dontfuckwithme > dwMemLength) return FALSE; + if (dontfuckwithme > dwMemLength) return false; // That should be enough checking: this must be a 669 module. m_nType = MOD_TYPE_669; m_dwSongFlags |= SONG_LINEARSLIDES; @@ -183,7 +183,7 @@ if (len > 4) ReadSample(&Ins[n], RS_PCM8U, (LPSTR)(lpStream+dwMemPos), dwMemLength - dwMemPos); dwMemPos += len; } - return TRUE; + return true; } Modified: trunk/OpenMPT/soundlib/Load_ams.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/soundlib/Load_ams.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -45,7 +45,7 @@ -BOOL CSoundFile::ReadAMS(LPCBYTE lpStream, DWORD dwMemLength) +bool CSoundFile::ReadAMS(LPCBYTE lpStream, DWORD dwMemLength) //----------------------------------------------------------- { BYTE pkinf[MAX_SAMPLES]; @@ -53,7 +53,7 @@ DWORD dwMemPos; UINT tmp, tmp2; - if ((!lpStream) || (dwMemLength < 1024)) return FALSE; + if ((!lpStream) || (dwMemLength < 1024)) return false; if ((pfh->verhi != 0x01) || (strncmp(pfh->szHeader, "Extreme", 7)) || (!pfh->patterns) || (!pfh->orders) || (!pfh->samples) || (pfh->samples > MAX_SAMPLES) || (pfh->patterns > MAX_PATTERNS) || (pfh->orders > MAX_ORDERS)) @@ -61,7 +61,7 @@ return ReadAMS2(lpStream, dwMemLength); } dwMemPos = sizeof(AMSFILEHEADER) + pfh->extra; - if (dwMemPos + pfh->samples * sizeof(AMSSAMPLEHEADER) + 256 >= dwMemLength) return FALSE; + if (dwMemPos + pfh->samples * sizeof(AMSSAMPLEHEADER) + 256 >= dwMemLength) return false; m_nType = MOD_TYPE_AMS; m_nInstruments = 0; m_nChannels = (pfh->chncfg & 0x1F) + 1; @@ -75,7 +75,7 @@ pins->nLoopEnd = psh->loopend; pins->nGlobalVol = 64; pins->nVolume = psh->volume << 1; - pins->nC4Speed = psh->samplerate; + pins->nC5Speed = psh->samplerate; pins->nPan = (psh->finetune_and_pan & 0xF0); if (pins->nPan < 0x80) pins->nPan += 0x10; pins->nFineTune = MOD2XMFineTune(psh->finetune_and_pan & 0x0F); @@ -85,7 +85,7 @@ } // Read Song Name tmp = lpStream[dwMemPos++]; - if (dwMemPos + tmp + 1 >= dwMemLength) return TRUE; + if (dwMemPos + tmp + 1 >= dwMemLength) return true; tmp2 = (tmp < 32) ? tmp : 31; if (tmp2) memcpy(m_szNames[0], lpStream+dwMemPos, tmp2); m_szNames[0][tmp2] = 0; @@ -93,7 +93,7 @@ // Read sample names for (UINT sNam=1; sNam<=m_nSamples; sNam++) { - if (dwMemPos + 32 >= dwMemLength) return TRUE; + if (dwMemPos + 32 >= dwMemLength) return true; tmp = lpStream[dwMemPos++]; tmp2 = (tmp < 32) ? tmp : 31; if (tmp2) memcpy(m_szNames[sNam], lpStream+dwMemPos, tmp2); @@ -102,18 +102,18 @@ // Skip Channel names for (UINT cNam=0; cNam<m_nChannels; cNam++) { - if (dwMemPos + 32 >= dwMemLength) return TRUE; + if (dwMemPos + 32 >= dwMemLength) return true; tmp = lpStream[dwMemPos++]; dwMemPos += tmp; } // Read Pattern Names m_lpszPatternNames = new char[pfh->patterns * 32]; - if (!m_lpszPatternNames) return TRUE; + if (!m_lpszPatternNames) return true; m_nPatternNames = pfh->patterns; memset(m_lpszPatternNames, 0, m_nPatternNames * 32); for (UINT pNam=0; pNam < m_nPatternNames; pNam++) { - if (dwMemPos + 32 >= dwMemLength) return TRUE; + if (dwMemPos + 32 >= dwMemLength) return true; tmp = lpStream[dwMemPos++]; tmp2 = (tmp < 32) ? tmp : 31; if (tmp2) memcpy(m_lpszPatternNames+pNam*32, lpStream+dwMemPos, tmp2); @@ -122,11 +122,11 @@ // Read Song Comments tmp = *((WORD *)(lpStream+dwMemPos)); dwMemPos += 2; - if (dwMemPos + tmp >= dwMemLength) return TRUE; + if (dwMemPos + tmp >= dwMemLength) return true; if (tmp) { m_lpszSongComments = new char[tmp+1]; - if (!m_lpszSongComments) return TRUE; + if (!m_lpszSongComments) return true; memset(m_lpszSongComments, 0, tmp+1); memcpy(m_lpszSongComments, lpStream + dwMemPos, tmp); dwMemPos += tmp; @@ -140,13 +140,13 @@ // Read Patterns for (UINT iPat=0; iPat<pfh->patterns; iPat++) { - if (dwMemPos + 4 >= dwMemLength) return TRUE; + if (dwMemPos + 4 >= dwMemLength) return true; UINT len = *((DWORD *)(lpStream + dwMemPos)); dwMemPos += 4; - if ((len >= dwMemLength) || (dwMemPos + len > dwMemLength)) return TRUE; + if ((len >= dwMemLength) || (dwMemPos + len > dwMemLength)) return true; Patterns.Insert(iPat, 64); MODCOMMAND* m = Patterns[iPat]; - if (!m) return TRUE; + if (!m) return true; const BYTE *p = lpStream + dwMemPos; UINT row = 0, i = 0; while ((row < PatternSize[iPat]) && (i+2 < len)) @@ -240,11 +240,11 @@ // Read Samples for (UINT iSmp=1; iSmp<=m_nSamples; iSmp++) if (Ins[iSmp].nLength) { - if (dwMemPos >= dwMemLength - 9) return TRUE; + if (dwMemPos >= dwMemLength - 9) return true; UINT flags = (Ins[iSmp].uFlags & CHN_16BIT) ? RS_AMS16 : RS_AMS8; dwMemPos += ReadSample(&Ins[iSmp], flags, (LPSTR)(lpStream+dwMemPos), dwMemLength-dwMemPos); } - return TRUE; + return true; } @@ -299,7 +299,7 @@ DWORD loopend; WORD frequency; BYTE finetune; - WORD c4speed; + WORD nC5Speed; CHAR transpose; BYTE volume; BYTE flags; @@ -309,7 +309,7 @@ #pragma pack() -BOOL CSoundFile::ReadAMS2(LPCBYTE lpStream, DWORD dwMemLength) +bool CSoundFile::ReadAMS2(LPCBYTE lpStream, DWORD dwMemLength) //------------------------------------------------------------ { const AMS2FILEHEADER *pfh = (AMS2FILEHEADER *)lpStream; @@ -416,7 +416,7 @@ psmp->nLength = pams->length; psmp->nLoopStart = pams->loopstart; psmp->nLoopEnd = pams->loopend; - psmp->nC4Speed = pams->c4speed; + psmp->nC5Speed = pams->nC5Speed; psmp->RelativeTone = pams->transpose; psmp->nVolume = pams->volume / 2; packedsamples[smpmap[ismp]] = pams->flags; Modified: trunk/OpenMPT/soundlib/Load_far.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_far.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/soundlib/Load_far.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -58,11 +58,11 @@ #pragma pack() -BOOL CSoundFile::ReadFAR(const BYTE *lpStream, DWORD dwMemLength) +bool CSoundFile::ReadFAR(const BYTE *lpStream, DWORD dwMemLength) //--------------------------------------------------------------- { if(dwMemLength < sizeof(FARHEADER1)) - return FALSE; + return false; FARHEADER1 farHeader; memcpy(&farHeader, lpStream, sizeof(FARHEADER1)); @@ -73,10 +73,10 @@ BYTE samplemap[8]; if ((!lpStream) || (dwMemLength < 1024) || (LittleEndian(pmh1->id) != FARFILEMAGIC) - || (pmh1->magic2[0] != 13) || (pmh1->magic2[1] != 10) || (pmh1->magic2[2] != 26)) return FALSE; + || (pmh1->magic2[0] != 13) || (pmh1->magic2[1] != 10) || (pmh1->magic2[2] != 26)) return false; headerlen = LittleEndianW(pmh1->headerlen); pmh1->stlen = LittleEndianW( pmh1->stlen ); /* inplace byteswap -- Toad */ - if ((headerlen >= dwMemLength) || (dwMemPos + pmh1->stlen + sizeof(FARHEADER2) >= dwMemLength)) return FALSE; + if ((headerlen >= dwMemLength) || (dwMemPos + pmh1->stlen + sizeof(FARHEADER2) >= dwMemLength)) return false; // Globals m_nType = MOD_TYPE_FAR; m_nChannels = 16; @@ -108,12 +108,12 @@ dwMemPos += pmh1->stlen; } // Reading orders - if (sizeof(FARHEADER2) > dwMemLength - dwMemPos) return TRUE; + if (sizeof(FARHEADER2) > dwMemLength - dwMemPos) return true; FARHEADER2 farHeader2; memcpy(&farHeader2, lpStream + dwMemPos, sizeof(FARHEADER2)); pmh2 = &farHeader2; dwMemPos += sizeof(FARHEADER2); - if (dwMemPos >= dwMemLength) return TRUE; + if (dwMemPos >= dwMemLength) return true; for (UINT iorder=0; iorder<MAX_ORDERS; iorder++) { Order[iorder] = (iorder <= pmh2->snglen) ? pmh2->orders[iorder] : Order.GetInvalidPatIndex(); @@ -121,7 +121,7 @@ m_nRestartPos = pmh2->loopto; // Reading Patterns dwMemPos += headerlen - (869 + pmh1->stlen); - if (dwMemPos >= dwMemLength) return TRUE; + if (dwMemPos >= dwMemLength) return true; // byteswap pattern data. for(uint16 psfix = 0; psfix < 256; psfix++) @@ -139,7 +139,7 @@ dwMemPos += patlen; continue; } - if (dwMemPos + patlen >= dwMemLength) return TRUE; + if (dwMemPos + patlen >= dwMemLength) return true; UINT rows = (patlen - 2) >> 6; if (!rows) { @@ -148,7 +148,7 @@ } if (rows > 256) rows = 256; if (rows < 16) rows = 16; - if(Patterns.Insert(ipat, rows)) return TRUE; + if(Patterns.Insert(ipat, rows)) return true; MODCOMMAND *m = Patterns[ipat]; UINT patbrk = lpStream[dwMemPos]; const BYTE *p = lpStream + dwMemPos + 2; @@ -239,13 +239,13 @@ dwMemPos += patlen; } // Reading samples - if (dwMemPos + 8 >= dwMemLength) return TRUE; + if (dwMemPos + 8 >= dwMemLength) return true; memcpy(samplemap, lpStream+dwMemPos, 8); dwMemPos += 8; MODINSTRUMENT *pins = &Ins[1]; for (UINT ismp=0; ismp<64; ismp++, pins++) if (samplemap[ismp >> 3] & (1 << (ismp & 7))) { - if (dwMemPos + sizeof(FARSAMPLE) > dwMemLength) return TRUE; + if (dwMemPos + sizeof(FARSAMPLE) > dwMemLength) return true; const FARSAMPLE *pfs = reinterpret_cast<const FARSAMPLE*>(lpStream + dwMemPos); dwMemPos += sizeof(FARSAMPLE); m_nSamples = ismp + 1; @@ -255,7 +255,7 @@ pins->nLoopStart = LittleEndian(pfs->reppos) ; pins->nLoopEnd = LittleEndian(pfs->repend) ; pins->nFineTune = 0; - pins->nC4Speed = 8363*2; + pins->nC5Speed = 8363*2; pins->nGlobalVol = 64; pins->nVolume = pfs->volume << 4; pins->uFlags = 0; @@ -274,6 +274,6 @@ } dwMemPos += length; } - return TRUE; + return true; } Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-08-08 21:26:10 UTC (rev 317) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -10,7 +10,7 @@ * Hint 1: Most (all?) of the unsupported features were not supported in 2GDM / BWSB either. * Hint 2: Files will be played like their original formats would be played in MPT, so no * BWSB quirks including crashes and freezes are supported. :-P -*/ + */ #include "stdafx.h" #include "sndfile.h" @@ -66,17 +66,17 @@ BYTE Pan; // default pan } GDMSAMPLEHEADER, *PGDMSAMPLEHEADER; -BOOL CSoundFile::ReadGDM(const LPCBYTE lpStream, const DWORD dwMemLength) +bool CSoundFile::ReadGDM(const LPCBYTE lpStream, const DWORD dwMemLength) //----------------------------------------------------------- { - if ((!lpStream) || (dwMemLength < sizeof(GDMHEADER))) return FALSE; + if ((!lpStream) || (dwMemLength < sizeof(GDMHEADER))) return false; const PGDMHEADER pHeader = (PGDMHEADER)lpStream; // is it a valid GDM file? if( (LittleEndian(pHeader->ID) != 0xFE4D4447) || //GDM\xFE (pHeader->DOSEOF[0] != 13 || pHeader->DOSEOF[1] != 10 || pHeader->DOSEOF[2] != 26) || //CR+LF+EOF - (LittleEndian(pHeader->ID2) != 0x53464D47)) return FALSE; //GMFS + (LittleEndian(pHeader->ID2) != 0x53464D47)) return false; //GMFS // song name memset(m_szNames, 0, sizeof(m_szNames)); @@ -87,7 +87,7 @@ if(pHeader->FormMajorVer != 1 || pHeader->FormMinorVer != 0) { ::MessageBox(0, TEXT("GDM file seems to be valid, but this format version is currently not supported."), TEXT("OpenMPT GDM import"), MB_ICONERROR); - return FALSE; + return false; } // interesting question: Is TrackID, TrackMajorVer, TrackMinorVer relevant? The only TrackID should be 0 - 2GDM.exe, so the answer would be no. @@ -149,7 +149,7 @@ break; default: ::MessageBox(0, TEXT("GDM file seems to be valid, but the original format is currently not supported.\nThis should not happen."), TEXT("OpenMPT GDM import"), MB_ICONERROR); - return FALSE; + return false; break; } UINT32 iSampleOffset = LittleEndian(pHeader->SamOffset), @@ -169,7 +169,7 @@ || dwMemLength < iMTOffset || dwMemLength - iMTOffset < iMTLength || dwMemLength < iSSOffset || dwMemLength - iSSOffset < iSSLength || dwMemLength < iTGOffset || dwMemLength - iTGOffset < iTGLength) - return FALSE; + return false; // read orders Order.ReadAsByte(lpStream + iOrdOffset, pHeader->NOO + 1, dwMemLength - iOrdOffset); @@ -189,7 +189,7 @@ SetNullTerminator(m_szNames[iSmp]); memcpy(Ins[iSmp].name, pSample->FileName, 12); - Ins[iSmp].nC4Speed = LittleEndianW(pSample->C4Hertz); + Ins[iSmp].nC5Speed = LittleEndianW(pSample->C4Hertz); Ins[iSmp].nGlobalVol = 256; // not supported in this format Ins[iSmp].nLength = min(LittleEndian(pSample->Length), MAX_SAMPLE_LENGTH); // in bytes Ins[iSmp].nLoopStart = min(LittleEndian(pSample->LoopBegin), Ins[iSmp].nLength); // in samples @@ -322,7 +322,7 @@ bNote = (bNote & 0x7F) - 1; // this format doesn't have note cuts if(bNote < 0xF0) bNote = (bNote & 0x0F) + 12 * (bNote >> 4) + 13; - if(bNote == 0xFF) bNote = 0; + if(bNote == 0xFF) bNote = NOTE_NONE; m->note = bNote; m->instr = bSample; @@ -550,6 +550,6 @@ ::MessageBox(0, s, TEXT("OpenMPT GDM import"), MB_ICONWARNING); } - return TRUE; + return true; } Added: trunk/OpenMPT/soundlib/Load_imf.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp (rev 0) +++ trunk/OpenMPT/soundlib/Load_imf.cpp 2009-08-09 23:07:50 UTC (rev 318) @@ -0,0 +1,532 @@ +/* + * Purpose: Load IMF (Imago Orpheus) modules + * Authors: Storlek (http://schismtracker.org/) + * Johannes Schultz (OpenMPT Port) + * + * Thanks to Storlek for allowing me to use this code! + */ + +#include "stdafx.h" +#include "sndfile.h" + +#pragma pack(1) + +struct imf_channel { + char name[12]; // Channelname (ASCIIZ-String, max 11 chars) + BYTE chorus; // Default chorus + BYTE reverb; // Default reverb + BYTE panning; // Pan positions 00-FF + BYTE status; // Channel status: 0 = enabled, 1 = mute, 2 = disabled (ignore effects!) +}; + +struct imf_header { + char title[32]; // Songname (ASCIIZ-String, max. 31 chars) + UINT16 ordnum; // Number of orders saved + UINT16 patnum; // Number of patterns saved + UINT16 insnum; // Number of instruments saved + UINT16 flags; // Module flags (&1 => linear) + BYTE unused1[8]; + BYTE tempo; // Default tempo (Axx, 1..255) + BYTE bpm; // Default beats per minute (BPM) (Txx, 32..255) + BYTE master; // Default mastervolume (Vxx, 0..64) + BYTE amp; // Amplification factor (mixing volume, 4..127) + BYTE unused2[8]; + char im10[4]; // 'IM10' + struct imf_channel channels[32]; // Channel settings + BYTE orderlist[256]; // Order list (0xff = +++; blank out anything beyond ordnum) +}; + +enum { + IMF_ENV_VOL = 0, + IMF_ENV_PAN = 1, + IMF_ENV_FILTER = 2, +}; + +struct imf_env { + BYTE points; // Number of envelope points + BYTE sustain; // Envelope sustain point + BYTE loop_start; // Envelope loop start point + BYTE loop_end; // Envelope loop end point + BYTE flags; // Envelope flags + BYTE unused[3]; +}; + +struct imf_envnodes { + UINT16 tick; + UINT16 value; +}; + +struct imf_instrument { + char name[32]; // Inst. name (ASCIIZ-String, max. 31 chars) + BYTE map[120]; // Multisample settings + BYTE unused[8]; + struct imf_envnodes nodes[3][16]; + struct imf_env env[3]; + UINT16 fadeout; // Fadeout rate (0...0FFFH) + UINT16 smpnum; // Number of samples in instrument + char ii10[4]; // 'II10' +}; + +struct imf_sample { + char name[13]; // Sample filename (12345678.ABC) */ + BYTE unused1[3]; + UINT32 length; // Length + UINT32 loop_start; // Loop start + UINT32 loop_end; // Loop end + UINT32 C5Speed; // Samplerate + BYTE volume; // Default volume (0..64) + BYTE panning; // Default pan (00h = Left / 80h = Middle) + BYTE unused2[14]; + BYTE flags; // Sample flags + BYTE unused3[5]; + UINT16 ems; // Reserved for internal usage + UINT32 dram; // Reserved for internal usage + char is10[4]; // 'IS10' +}; +#pragma pack() + + +static BYTE imf_efftrans[] = { + CMD_NONE, + CMD_SPEED, // 0x01 1xx Set Tempo + CMD_TEMPO, // 0x02 2xx Set BPM + CMD_TONEPORTAMENTO, // 0x03 3xx Tone Portamento (*) + CMD_TONEPORTAVOL, // 0x04 4xy Tone Portamento + Volume Slide (*) + CMD_VIBRATO, // 0x05 5xy Vibrato (*) + CMD_VIBRATOVOL, // 0x06 6xy Vibrato + Volume Slide (*) + CMD_FINEVIBRATO, // 0x07 7xy Fine Vibrato (*) + CMD_TREMOLO, // 0x08 8xy Tremolo (*) + CMD_ARPEGGIO, // 0x09 9xy Arpeggio (*) + CMD_PANNING8, // 0x0A Axx Set Pan Position + CMD_PANNINGSLIDE, // 0x0B Bxy Pan Slide (*) + CMD_VOLUME, // 0x0C Cxx Set Volume + CMD_VOLUMESLIDE, // 0x0D Dxy Volume Slide (*) + CMD_VOLUMESLIDE, // 0x0E Exy Fine Volume Slide (*) + CMD_S3MCMDEX, // 0x0F Fxx Set Finetune + CMD_NOTESLIDEUP, // 0x10 Gxy Note Slide Up (*) + CMD_NOTESLIDEDOWN, // 0x11 Hxy Note Slide Down (*) + CMD_PORTAMENTOUP, // 0x12 Ixx Slide Up (*) + CMD_PORTAMENTODOWN, // 0x13 Jxx Slide Down (*) + CMD_PORTAMENTOUP, // 0x14 Kxx Fine Slide Up (*) + CMD_PORTAMENTODOWN, // 0x15 Lxx Fine Slide Down (*) + CMD_MIDI, // 0x16 Mxx Set Filter Cutoff - XXX + CMD_NONE, // 0x17 Nxy Filter Slide + Resonance - XXX + CMD_OFFSET, // 0x18 Oxx Set Sample Offset (*) + CMD_NONE, // 0x19 Pxx Set Fine Sample Offset - XXX + CMD_KEYOFF, // 0x1A Qxx Key Off + CMD_RETRIG, // 0x1B Rxy Retrig (*) + CMD_TREMOR, // 0x1C Sxy Tremor (*) + CMD_POSITIONJUMP, // 0x1D Txx Position Jump + CMD_PATTERNBREAK, // 0x1E Uxx Pattern Break + CMD_GLOBALVOLUME, // 0x1F Vxx Set Mastervolume + CMD_GLOBALVOLSLIDE, // 0x20 Wxy Mastervolume Slide (*) + CMD_S3MCMDEX, // 0x21 Xxx Extended Effect + // X1x Set Filter + // X3x Glissando + // X5x Vibrato Waveform + // X8x Tremolo Waveform + // XAx Pattern Loop + // XBx Pattern Delay + // XCx Note Cut + // XDx Note Delay + // XEx Ignore Envelope + // XFx Invert Loop + CMD_NONE, // 0x22 Yxx Chorus - XXX + CMD_NONE, // 0x23 Zxx Reverb - XXX +}; + +static void import_imf_effect(MODCOMMAND *note) +{ + BYTE n; + // fix some of them + switch (note->command) { + case 0xe: // fine volslide + // hackaround to get almost-right behavior for fine slides (i think!) + if (note->param == 0) + /* nothing */; + else if (note->param == 0xf0) + note->param = 0xef; + else if (note->param == 0x0f) + note->param = 0xfe; + else if (note->param & 0xf0) + note->param |= 0xf; + else + note->param |= 0xf0; + break; + case 0xf: // set finetune + // we don't implement this, but let's at least import the value + note->param = 0x20 | min(note->param >> 4, 0xf); + break; + case 0x14: // fine slide up + case 0x15: // fine slide down + // this is about as close as we can do... + if (note->param >> 4) + note->param = 0xf0 | m... [truncated message content] |
From: <sag...@us...> - 2009-08-10 16:08:36
|
Revision: 319 http://modplug.svn.sourceforge.net/modplug/?rev=319&view=rev Author: saga-games Date: 2009-08-10 16:08:26 +0000 (Mon, 10 Aug 2009) Log Message: ----------- [Fix] IT Compatiblity Export doesn't screw up patterns anymore if the module has more than 64 channels [Fix] S3M Loading: Don't read S3M "saved with" version before the file is actually verified to be a S3M file [Imp] XM Compatibility Export cuts off channels > 32 [Imp] XM Saving: When channel count is odd, the empty channel is now always the last one [Imp] IT Loading: Reading our custom tracker version now as well. [Imp] Got rid of the string lameness in the ID3 tagger Modified Paths: -------------- trunk/OpenMPT/mptrack/tagging.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_xm.cpp Modified: trunk/OpenMPT/mptrack/tagging.cpp =================================================================== --- trunk/OpenMPT/mptrack/tagging.cpp 2009-08-09 23:07:50 UTC (rev 318) +++ trunk/OpenMPT/mptrack/tagging.cpp 2009-08-10 16:08:26 UTC (rev 319) @@ -87,11 +87,8 @@ if(!strcmp(cFrameID, "COMM")) { // English language for comments - no description following (hence the text ending nullchar(s)) - // HALP this is really lame, how is it done properly so the nullchar is not lost? - string sInfo; - sInfo = "eng"; // See http://en.wikipedia.org/wiki/ISO-639-2 - sInfo += ID3v2_TEXTENDING; - sFramecontent = sInfo + sFramecontent; + // For language IDs, see http://en.wikipedia.org/wiki/ISO-639-2 + sFramecontent = "eng" + (ID3v2_TEXTENDING + sFramecontent); } sFramecontent = ID3v2_CHARSET + sFramecontent; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-09 23:07:50 UTC (rev 318) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-10 16:08:26 UTC (rev 319) @@ -984,6 +984,12 @@ } } + if((pifh->cwtv & 0xF000) == 0x5000) // OpenMPT Version number (Major.Minor) + { + m_dwLastSavedWithVersion = (pifh->cwtv & 0x0FFF) << 16; + interpretModplugmade = true; + } + if (pifh->flags & 0x08) m_dwSongFlags |= SONG_LINEARSLIDES; if (pifh->flags & 0x10) m_dwSongFlags |= SONG_ITOLDEFFECTS; if (pifh->flags & 0x20) m_dwSongFlags |= SONG_ITCOMPATMODE; @@ -2854,8 +2860,9 @@ for (UINT row=0; row<PatternSize[npat]; row++) { len = 0; - for (UINT ch=0; ch<nChannels; ch++, m++) + for (UINT ch = 0; ch < m_nChannels; ch++, m++) { + if(ch >= nChannels) continue; BYTE b = 0; UINT command = m->command; UINT param = m->param; Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-08-09 23:07:50 UTC (rev 318) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-08-10 16:08:26 UTC (rev 319) @@ -273,11 +273,12 @@ psfh.scrm = LittleEndian(psfh.scrm); psfh.special = LittleEndianW(psfh.special); + if ((!lpStream) || (dwMemLength <= sizeof(S3MFILEHEADER)+sizeof(S3MSAMPLESTRUCT)+64)) return false; + if (psfh.scrm != 0x4D524353) return false; + if((psfh.cwtv & 0xF000) == 0x5000) // OpenMPT Version number (Major.Minor) m_dwLastSavedWithVersion = (psfh.cwtv & 0x0FFF) << 16; - if ((!lpStream) || (dwMemLength <= sizeof(S3MFILEHEADER)+sizeof(S3MSAMPLESTRUCT)+64)) return false; - if (psfh.scrm != 0x4D524353) return false; dwMemPos = 0x60; m_nType = MOD_TYPE_S3M; memset(m_szNames,0,sizeof(m_szNames)); Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-08-09 23:07:50 UTC (rev 318) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-08-10 16:08:26 UTC (rev 319) @@ -694,8 +694,11 @@ header.size = sizeof(XMFILEHEADER); header.norder = 0; header.restartpos = m_nRestartPos; + header.channels = (m_nChannels + 1) & 0xFFFE; // avoid odd channel count for FT2 compatibility if(m_nChannels & 1) bAddChannel = true; + if(bCompatibilityExport && header.channels > 32) + header.channels = 32; header.patterns = 0; /*for (i=0; i<MAX_ORDERS; i++) { @@ -740,14 +743,17 @@ xmph[0] = 9; xmph[5] = (BYTE)(PatternSize[i] & 0xFF); xmph[6] = (BYTE)(PatternSize[i] >> 8); - for (UINT j=m_nChannels*PatternSize[i]; j; j--,p++) + for (UINT j = m_nChannels * PatternSize[i]; j > 0; j--, p++) { + // Don't write more than 32 channels + if(bCompatibilityExport && m_nChannels - ((j - 1) % m_nChannels) > 32) continue; + UINT note = p->note; UINT param = ModSaveCommand(p, true, bCompatibilityExport); UINT command = param >> 8; param &= 0xFF; if (note >= 0xFE) note = 97; else - if ((note <= 12) || (note > 96+12)) note = NOTE_NONE; else + if ((note <= 12) || (note > 96+12)) note = 0; else note -= 12; UINT vol = 0; if (p->volcmd) @@ -791,13 +797,14 @@ if (b & 16) s[len++] = param; } - if(bAddChannel && !(j % m_nChannels)) + if(bAddChannel && (j % m_nChannels == 1 || m_nChannels == 1)) { ASSERT_CAN_WRITE(1); s[len++] = 0x80; } ASSERT_CAN_WRITE(5); + } xmph[7] = (BYTE)(len & 0xFF); xmph[8] = (BYTE)(len >> 8); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-08-12 21:17:48
|
Revision: 320 http://modplug.svn.sourceforge.net/modplug/?rev=320&view=rev Author: saga-games Date: 2009-08-12 21:17:36 +0000 (Wed, 12 Aug 2009) Log Message: ----------- [Fix] Pattern Editor: Show "offset" and "velocity" volume commands in default color instead of "pitch" color [Fix] Menus: Added the correct shortcut keys again and replaced the last(?) remaining "Midi" labels by "MIDI" [Imp] Keymaps: Added parameter control to DE_jojo.mkb [Fix] S3M Saver: Set the stereo flag Modified Paths: -------------- trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/InputHandler.cpp trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb trunk/OpenMPT/soundlib/Load_s3m.cpp Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-08-10 16:08:26 UTC (rev 319) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-08-12 21:17:36 UTC (rev 320) @@ -569,9 +569,9 @@ const ORDERINDEX startOrder = static_cast<ORDERINDEX>(SendCtrlMessage(CTRLMSG_GETCURRENTORDER)); if(startOrder > 0) { - ORDERINDEX prevOrder = startOrder - 1; + ORDERINDEX prevOrder; + prevOrder = pSndFile->Order.GetPreviousOrderIgnoringSkips(startOrder); //Skip +++ items - while(prevOrder > 0 && pSndFile->Order[prevOrder] == pSndFile->Order.GetIgnoreIndex()) --prevOrder; if(startOrder < pSndFile->Order.size() && pSndFile->Order[startOrder] == m_nPattern) { @@ -617,11 +617,10 @@ UINT nNextPat = m_nPattern; BOOL bNextPatFound = FALSE; const ORDERINDEX startOrder= static_cast<ORDERINDEX>(SendCtrlMessage(CTRLMSG_GETCURRENTORDER)); - ORDERINDEX nNextOrder = 1 + startOrder; - + ORDERINDEX nNextOrder; + nNextOrder = pSndFile->Order.GetNextOrderIgnoringSkips(startOrder); //Ignore skip items(+++) from sequence. const ORDERINDEX ordCount = pSndFile->Order.GetCount(); - while(nNextOrder < ordCount && pSndFile->Order[nNextOrder] == pSndFile->Order.GetIgnoreIndex()) nNextOrder++; if ((nNextOrder < ordCount) && (pSndFile->Order[startOrder] == m_nPattern)) { @@ -917,9 +916,11 @@ case VOLCMD_TONEPORTAMENTO: case VOLCMD_PORTAUP: case VOLCMD_PORTADOWN: + tx_col = MODCOLOR_PITCH; + break; case VOLCMD_VELOCITY: //rewbs.velocity case VOLCMD_OFFSET: //rewbs.volOff - tx_col = MODCOLOR_PITCH; + // default color break; } } Modified: trunk/OpenMPT/mptrack/InputHandler.cpp =================================================================== --- trunk/OpenMPT/mptrack/InputHandler.cpp 2009-08-10 16:08:26 UTC (rev 319) +++ trunk/OpenMPT/mptrack/InputHandler.cpp 2009-08-12 21:17:36 UTC (rev 320) @@ -387,57 +387,57 @@ switch(id) { - case FILENEW: s="New\t"; c=kcFileNew; break; - case ID_FILE_OPEN: s="Open...\t"; c=kcFileOpen; break; - case ID_FILE_CLOSE: s="Close\t"; c=kcFileClose; break; - case ID_FILE_SAVE: s="Save\t"; c=kcFileSave; break; - case ID_FILE_SAVE_AS: s="Save As...\t"; c=kcFileSaveAs; break; - case ID_FILE_SAVEASWAVE: s="Save as Wave...\t"; c=kcFileSaveAsWave; break; - case ID_FILE_SAVEASMP3: s="Save as MP3...\t"; c=kcFileSaveAsMP3; break; - case ID_FILE_SAVEMIDI: s="Export as Midi...\t"; c=kcFileSaveMidi; break; - case ID_FILE_SAVECOMPAT: s="Compatibility Export...\t"; c=kcFileExportCompat; break; - case ID_IMPORT_MIDILIB: s="Import MIDI Library...\t"; c=kcFileImportMidiLib; break; - case ID_ADD_SOUNDBANK: s="Add Sound Bank...\t"; c=kcFileAddSoundBank; break; + case FILENEW: s="&New\t"; c=kcFileNew; break; + case ID_FILE_OPEN: s="&Open...\t"; c=kcFileOpen; break; + case ID_FILE_CLOSE: s="&Close\t"; c=kcFileClose; break; + case ID_FILE_SAVE: s="&Save\t"; c=kcFileSave; break; + case ID_FILE_SAVE_AS: s="Save &As...\t"; c=kcFileSaveAs; break; + case ID_FILE_SAVEASWAVE: s="Save as &Wave...\t"; c=kcFileSaveAsWave; break; + case ID_FILE_SAVEASMP3: s="Save as M&P3...\t"; c=kcFileSaveAsMP3; break; + case ID_FILE_SAVEMIDI: s="Export as M&IDI...\t"; c=kcFileSaveMidi; break; + case ID_FILE_SAVECOMPAT: s="Compatibility &Export...\t"; c=kcFileExportCompat; break; + case ID_IMPORT_MIDILIB: s="Import &MIDI Library...\t"; c=kcFileImportMidiLib; break; + case ID_ADD_SOUNDBANK: s="Add Sound &Bank...\t"; c=kcFileAddSoundBank; break; - case ID_PLAYER_PLAY: s="Pause/Resume\t"; c= kcPlayPauseSong; break; - case ID_PLAYER_PLAYFROMSTART: s="Play from start\t"; c=kcPlaySongFromStart; break; - case ID_PLAYER_STOP: s="Stop\t"; c=kcStopSong; break; - case ID_PLAYER_PAUSE: s="Pause\t"; c=kcPauseSong; break; - case ID_MIDI_RECORD: s="Midi Record\t"; c=kcMidiRecord; break; - case ID_ESTIMATESONGLENGTH: s="Estimate Song Length\t"; c=kcEstimateSongLength; break; - case ID_APPROX_BPM: s="Approx. real BPM\t"; c=kcApproxRealBPM; break; + case ID_PLAYER_PLAY: s="Pause/&Resume\t"; c= kcPlayPauseSong; break; + case ID_PLAYER_PLAYFROMSTART: s="&Play from start\t"; c=kcPlaySongFromStart; break; + case ID_PLAYER_STOP: s="&Stop\t"; c=kcStopSong; break; + case ID_PLAYER_PAUSE: s="P&ause\t"; c=kcPauseSong; break; + case ID_MIDI_RECORD: s="&MIDI Record\t"; c=kcMidiRecord; break; + case ID_ESTIMATESONGLENGTH: s="&Estimate Song Length\t"; c=kcEstimateSongLength; break; + case ID_APPROX_BPM: s="Approx. real &BPM\t"; c=kcApproxRealBPM; break; - case ID_EDIT_UNDO: s="Undo\t"; c=kcEditUndo; break; - case ID_EDIT_CUT: s="Cut\t"; c=kcEditCut; break; - case ID_EDIT_COPY: s="Copy\t"; c=kcEditCopy; break; - case ID_EDIT_PASTE: s="Paste\t"; c=kcEditPaste; break; - case ID_EDIT_PASTE_SPECIAL: s="Mix Paste\t"; c=kcEditMixPaste; break; - case ID_EDIT_SELECT_ALL: s="Select All\t"; c=kcEditSelectAll; break; - case ID_EDIT_FIND: s="Find\t"; c=kcEditFind; break; - case ID_EDIT_FINDNEXT: s="Find Next\t"; c=kcEditFindNext; break; + case ID_EDIT_UNDO: s="&Undo\t"; c=kcEditUndo; break; + case ID_EDIT_CUT: s="Cu&t\t"; c=kcEditCut; break; + case ID_EDIT_COPY: s="&Copy\t"; c=kcEditCopy; break; + case ID_EDIT_PASTE: s="&Paste\t"; c=kcEditPaste; break; + case ID_EDIT_PASTE_SPECIAL: s="&Mix Paste\t"; c=kcEditMixPaste; break; + case ID_EDIT_SELECT_ALL: s="&Select All\t"; c=kcEditSelectAll; break; + case ID_EDIT_FIND: s="&Find\t"; c=kcEditFind; break; + case ID_EDIT_FINDNEXT: s="Find &Next\t"; c=kcEditFindNext; break; - case ID_VIEW_GLOBALS: s="General\t"; c=kcViewGeneral; break; - case ID_VIEW_SAMPLES: s="Samples\t"; c=kcViewSamples; break; - case ID_VIEW_PATTERNS: s="Patterns\t"; c=kcViewPattern; break; - case ID_VIEW_INSTRUMENTS: s="Instruments\t"; c=kcViewInstruments; break; - case ID_VIEW_COMMENTS: s="Comments\t"; c=kcViewComments; break; - case ID_VIEW_GRAPH: s="Graph\t"; c=kcViewGraph; break; //rewbs.graph - case MAINVIEW: s="Main\t"; c=kcViewMain; break; - case IDD_TREEVIEW: s="Tree\t"; c=kcViewTree; break; - case ID_VIEW_OPTIONS: s="Setup...\t"; c=kcViewOptions; break; - case ID_HELP: s="Contents (todo)"; c=kcHelp; break; - case ID_PLUGIN_SETUP: s="Plugin Manager...\t"; c=kcViewAddPlugin; break; - case ID_CHANNEL_MANAGER: s="Channel Manager...\t"; c=kcViewChannelManager; break; - case ID_VIEW_SONGPROPERTIES:s="Song Properties...\t"; c=kcViewSongProperties; break; //rewbs.graph - case ID_VIEW_MIDIMAPPING: s="MIDI mapping...\t"; c = kcViewMIDImapping; break; + case ID_VIEW_GLOBALS: s="&General\t"; c=kcViewGeneral; break; + case ID_VIEW_SAMPLES: s="&Samples\t"; c=kcViewSamples; break; + case ID_VIEW_PATTERNS: s="&Patterns\t"; c=kcViewPattern; break; + case ID_VIEW_INSTRUMENTS: s="&Instruments\t"; c=kcViewInstruments; break; + case ID_VIEW_COMMENTS: s="&Comments\t"; c=kcViewComments; break; + case ID_VIEW_GRAPH: s="G&raph\t"; c=kcViewGraph; break; //rewbs.graph + case MAINVIEW: s="&Main\t"; c=kcViewMain; break; + case IDD_TREEVIEW: s="&Tree\t"; c=kcViewTree; break; + case ID_VIEW_OPTIONS: s="S&etup...\t"; c=kcViewOptions; break; + case ID_HELP: s="C&ontents (todo)"; c=kcHelp; break; + case ID_PLUGIN_SETUP: s="Pl&ugin Manager...\t"; c=kcViewAddPlugin; break; + case ID_CHANNEL_MANAGER: s="Ch&annel Manager...\t"; c=kcViewChannelManager; break; + case ID_VIEW_SONGPROPERTIES:s="Song P&roperties...\t"; c=kcViewSongProperties; break; //rewbs.graph + case ID_VIEW_MIDIMAPPING: s="&MIDI mapping...\t"; c = kcViewMIDImapping; break; - -/* - case ID_WINDOW_NEW: s="New Window\t"; c=kcWindowNew; break; - case ID_WINDOW_CASCADE: s="Cascade\t"; c=kcWindowCascade; break; - case ID_WINDOW_TILE_HORZ: s="Tile Horizontal\t"; c=kcWindowTileHorz; break; - case ID_WINDOW_TILE_VERT: s="Tile Vertical\t"; c=kcWindowTileVert; break; -*/ + + /* + case ID_WINDOW_NEW: s="&New Window\t"; c=kcWindowNew; break; + case ID_WINDOW_CASCADE: s="&Cascade\t"; c=kcWindowCascade; break; + case ID_WINDOW_TILE_HORZ: s="Tile &Horizontal\t"; c=kcWindowTileHorz; break; + case ID_WINDOW_TILE_VERT: s="Tile &Vertical\t"; c=kcWindowTileVert; break; + */ default: return "Unknown Item."; } Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb =================================================================== --- trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb 2009-08-10 16:08:26 UTC (rev 319) +++ trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb 2009-08-12 21:17:36 UTC (rev 320) @@ -157,6 +157,8 @@ 3:1200:0:220:1 //Note Cut: ZIRKUMFLEX (KeyDown) 3:1201:0:221:1 //Note Off: AKUT (KeyDown) 3:1791:0:219:1 //Note Fade: \xDF (KeyDown) +3:1788:0:226:1 //Parameter control(MPTm only): < (KeyDown) +3:1789:1:226:1 //Parameter control(smooth)(MPTm only): Shift+< (KeyDown) //----( Pattern Context [bottom] - Ins Col (4) )------------ 4:1202:0:96:1 //Set instrument digit 0: 0 (ZEHNERTASTATUR) (KeyDown) Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-08-10 16:08:26 UTC (rev 319) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-08-12 21:17:36 UTC (rev 320) @@ -292,7 +292,7 @@ // Global Volume m_nDefaultGlobalVolume = psfh.globalvol << 2; if ((!m_nDefaultGlobalVolume) || (m_nDefaultGlobalVolume > 256)) m_nDefaultGlobalVolume = 256; - m_nSamplePreAmp = psfh.mastervol & 0x7F; + m_nSamplePreAmp = psfh.mastervol & 0x7F; // Bit 8 = Stereo (we always use stereo) // Channels m_nChannels = 4; for (UINT ich=0; ich<32; ich++) @@ -542,7 +542,8 @@ header[0x30] = m_nDefaultGlobalVolume >> 2; header[0x31] = CLAMP(m_nDefaultSpeed, 1, 255); header[0x32] = CLAMP(m_nDefaultTempo, 32, 255); - header[0x33] = CLAMP(m_nSamplePreAmp, 0x10, 0x7F); // Stereo + header[0x33] = CLAMP(m_nSamplePreAmp, 0x10, 0x7F) | 0x80; // Bit 8 = Stereo + header[0x34] = 0x10; // 16 Channels for UltraClick removal header[0x35] = 0xFC; for (i=0; i<32; i++) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-08-13 22:23:22
|
Revision: 321 http://modplug.svn.sourceforge.net/modplug/?rev=321&view=rev Author: saga-games Date: 2009-08-13 22:23:15 +0000 (Thu, 13 Aug 2009) Log Message: ----------- [Fix] IT Compatibility: Multisample instruments change with no entry in the instrument column (fixes spx-shuttledeparture.it) (test me) [Imp] Modtype Dialog: Added suffixes IT and S3M to some mod flags for more clarity [Imp] Instrument / Sample list: Double click will switch to instrument / sample Modified Paths: -------------- trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/view_com.cpp trunk/OpenMPT/mptrack/view_com.h trunk/OpenMPT/soundlib/Snd_fx.cpp Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-08-12 21:17:36 UTC (rev 320) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-08-13 22:23:15 UTC (rev 321) @@ -559,10 +559,10 @@ CONTROL "Embed instrument parameters in ITP",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,36,126,8 GROUPBOX "Playback",IDC_FRAME_MODFLAGS,6,60,246,54 CONTROL "Linear Frequency Slides",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,72,91,10 - CONTROL "Fast Volume Slides",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,84,75,10 + CONTROL "Fast Volume Slides (S3M)",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,84,96,10 CONTROL "Extended filter range",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,96,81,10 - CONTROL "IT Old Effects",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,72,76,10 - CONTROL "IT Compatible Gxx",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,84,76,10 + CONTROL "Old Effects (IT)",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,72,66,10 + CONTROL "Compatible Gxx (IT)",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,84,84,10 GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_FRAME_MPTEXT,6,120,246,84 RTEXT "Mix Levels:",IDC_TEXT_MIXMODE,18,134,81,8 COMBOBOX IDC_COMBO_MIXLEVELS,108,132,84,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP Modified: trunk/OpenMPT/mptrack/view_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/view_com.cpp 2009-08-12 21:17:36 UTC (rev 320) +++ trunk/OpenMPT/mptrack/view_com.cpp 2009-08-13 22:23:15 UTC (rev 321) @@ -84,7 +84,8 @@ ON_COMMAND(IDC_LIST_SAMPLES, OnShowSamples) ON_COMMAND(IDC_LIST_INSTRUMENTS, OnShowInstruments) ON_COMMAND(IDC_LIST_PATTERNS, OnShowPatterns) - ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_DETAILS, OnEndLabelEdit) + ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_DETAILS, OnEndLabelEdit) + ON_NOTIFY(NM_DBLCLK, IDC_LIST_DETAILS, OnDblClickListItem) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -565,8 +566,31 @@ } } +void CViewComments::OnDblClickListItem(NMHDR *, LRESULT *) +//-------------------------------------------------------- +{ + // Double click -> switch to instrument or sample tab + int nItem = m_ItemList.GetSelectionMark(); + if(nItem == -1) return; + CModDoc *pModDoc = GetDocument(); + if(!pModDoc) return; + nItem++; + switch(m_nListId) + { + case IDC_LIST_SAMPLES: + pModDoc->ViewSample(nItem); + break; + case IDC_LIST_INSTRUMENTS: + pModDoc->ViewInstrument(nItem); + break; + case IDC_LIST_PATTERNS: + pModDoc->ViewPattern(nItem, 0); + break; + } +} + LRESULT CViewComments::OnModViewMsg(WPARAM wParam, LPARAM lParam) //----------------------------------------------------------------- { Modified: trunk/OpenMPT/mptrack/view_com.h =================================================================== --- trunk/OpenMPT/mptrack/view_com.h 2009-08-12 21:17:36 UTC (rev 320) +++ trunk/OpenMPT/mptrack/view_com.h 2009-08-13 22:23:15 UTC (rev 321) @@ -43,6 +43,7 @@ afx_msg void OnShowInstruments(); afx_msg void OnShowPatterns(); afx_msg VOID OnEndLabelEdit(LPNMHDR pnmhdr, LRESULT *pLResult); + afx_msg void OnDblClickListItem(NMHDR *, LRESULT *); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-08-12 21:17:36 UTC (rev 320) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-08-13 22:23:15 UTC (rev 321) @@ -674,6 +674,8 @@ pChn->nFineTune = pins->nFineTune; } } + // IT Compatibility: Update multisample instruments frequency even if instrument is not specified + if(!bPorta && pins && IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nC5Speed = pins->nC5Speed; if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2|MOD_TYPE_MED)) note += pChn->nTranspose; note = CLAMP(note, 1, 132); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rel...@us...> - 2009-08-15 12:36:32
|
Revision: 323 http://modplug.svn.sourceforge.net/modplug/?rev=323&view=rev Author: relabsoluness Date: 2009-08-15 12:36:22 +0000 (Sat, 15 Aug 2009) Log Message: ----------- [New] MPTM: Parameter control notes will now be saved to file. [Test] Added test to parameter control note read/write. [Ref] Internal: Rewriting of serialization_utils. [Ref] Various smaller changes. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Mpt_midi.cpp trunk/OpenMPT/mptrack/TuningDialog.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/misc_util.h trunk/OpenMPT/mptrack/serialization_utils.cpp trunk/OpenMPT/mptrack/serialization_utils.h trunk/OpenMPT/mptrack/tagging.h trunk/OpenMPT/mptrack/test/test.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/OrderToPatternTable.cpp trunk/OpenMPT/soundlib/OrderToPatternTable.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/midi.h trunk/OpenMPT/soundlib/modcommand.h trunk/OpenMPT/soundlib/pattern.cpp trunk/OpenMPT/soundlib/pattern.h trunk/OpenMPT/soundlib/patternContainer.cpp trunk/OpenMPT/soundlib/patternContainer.h trunk/OpenMPT/soundlib/tuning.cpp trunk/OpenMPT/soundlib/tuning.h trunk/OpenMPT/soundlib/tuningCollection.cpp trunk/OpenMPT/soundlib/tuningbase.cpp trunk/OpenMPT/soundlib/tuningbase.h trunk/OpenMPT/soundlib/tuningcollection.h Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-14 09:57:35 UTC (rev 322) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-15 12:36:22 UTC (rev 323) @@ -9,15 +9,9 @@ #include "dlg_misc.h" #include "tuningDialog.h" #include "misc_util.h" -#include <vector> -#include <string> -using std::string; -using std::vector; #pragma warning(disable:4244) //conversion from 'type1' to 'type2', possible loss of data -const pair<string, WORD> CCtrlInstruments::s_TuningNotFound("Tuning was not found. Setting to default tuning", 7); - ///////////////////////////////////////////////////////////////////////// // CNoteMapWnd @@ -2652,9 +2646,9 @@ } } - string str = s_TuningNotFound.first; - str.insert(s_TuningNotFound.second, m_pSndFile->Headers[m_nInstrument]->pTuning->GetName()); - MessageBox(str.c_str()); + CString str; + str.Format(TEXT("Tuning %s was not found. Setting to default tuning."), m_pSndFile->Headers[m_nInstrument]->pTuning->GetName().c_str()); + MessageBox(str); BEGIN_CRITICAL(); penv->SetTuning(penv->s_DefaultTuning); END_CRITICAL(); Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h 2009-08-14 09:57:35 UTC (rev 322) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2009-08-15 12:36:22 UTC (rev 323) @@ -5,9 +5,7 @@ class CNoteMapWnd; class CCtrlInstruments; -using std::pair; - //=============================== class CNoteMapWnd: public CStatic //=============================== @@ -85,8 +83,6 @@ CComboBox m_ComboTuning; void UpdateTuningComboBox(); void BuildTuningComboBox(); - static const pair<string, WORD> s_TuningNotFound; - //first <-> string, second <-> place where to put tuning name. //Pitch/Tempo lock CEdit m_EditPitchTempoLock; Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-08-14 09:57:35 UTC (rev 322) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-08-15 12:36:22 UTC (rev 323) @@ -2492,7 +2492,7 @@ wsprintf(pszName, "%s: ", gFXInfo[ndx].pszName); s[0] = 0; - string sPlusChar = "+", sMinusChar = "-"; + std::string sPlusChar = "+", sMinusChar = "-"; switch(gFXInfo[ndx].dwEffect) { Modified: trunk/OpenMPT/mptrack/Mpt_midi.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpt_midi.cpp 2009-08-14 09:57:35 UTC (rev 322) +++ trunk/OpenMPT/mptrack/Mpt_midi.cpp 2009-08-15 12:36:22 UTC (rev 323) @@ -212,7 +212,7 @@ } -bool CMIDIMapper::Unserialize(const BYTE* ptr, const size_t size) +bool CMIDIMapper::Deserialize(const BYTE* ptr, const size_t size) //---------------------------------------------------------------------------- { m_Directives.clear(); Modified: trunk/OpenMPT/mptrack/TuningDialog.cpp =================================================================== --- trunk/OpenMPT/mptrack/TuningDialog.cpp 2009-08-14 09:57:35 UTC (rev 322) +++ trunk/OpenMPT/mptrack/TuningDialog.cpp 2009-08-15 12:36:22 UTC (rev 323) @@ -678,8 +678,8 @@ if(ext == CTuning::s_FileExtension) { ifstream fin(dlg.GetPathName(), ios::binary); - CTuning* pT = CTuningRTI::UnserializeOLD(fin); - if(pT == 0) {fin.clear(); fin.seekg(0); pT = CTuning::Unserialize(fin);} + CTuning* pT = CTuningRTI::DeserializeOLD(fin); + if(pT == 0) {fin.clear(); fin.seekg(0); pT = CTuningRTI::Deserialize(fin);} fin.close(); if(pT) { @@ -700,7 +700,7 @@ //directly replace some collection. CTuningCollection* pNewTCol = new CTuningCollection; pNewTCol->SetSavefilePath(static_cast<LPCTSTR>(dlg.GetPathName())); - failure = pNewTCol->Unserialize(); + failure = pNewTCol->Deserialize(); if(failure) { delete pNewTCol; pNewTCol = 0; Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2009-08-14 09:57:35 UTC (rev 322) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-08-15 12:36:22 UTC (rev 323) @@ -2368,7 +2368,7 @@ const size_t sizeofS = sizeof(s) / sizeof(s[0]); if (note >= 0xFE) { - pModDoc->NoteOff(0, (note == 0xFE) ? TRUE : FALSE, m_nInstrument); + pModDoc->NoteOff(0, (note == NOTE_NOTECUT) ? TRUE : FALSE, m_nInstrument); pMainFrm->SetInfoText(""); } else if (m_nInstrument && !m_baPlayingNote[note]) @@ -2394,7 +2394,7 @@ s[0] = 0; if ((note) && (note <= NOTE_MAX)) { - const string temp = pModDoc->GetSoundFile()->GetNoteName(note, m_nInstrument); + const std::string temp = pModDoc->GetSoundFile()->GetNoteName(note, m_nInstrument); if(temp.size() >= sizeofS) wsprintf(s, "%s", "..."); else Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-08-14 09:57:35 UTC (rev 322) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-08-15 12:36:22 UTC (rev 323) @@ -2755,7 +2755,7 @@ UINT nSample = m_CbnSample.GetItemData(m_CbnSample.GetCurSel()); UINT nBaseOctave = m_SbOctave.GetPos() & 7; - const string temp = m_pSndFile->GetNoteName(lParam+1+12*nBaseOctave, m_nInstrument).c_str(); + const std::string temp = m_pSndFile->GetNoteName(lParam+1+12*nBaseOctave, m_nInstrument).c_str(); if(temp.size() >= sizeofS) wsprintf(s, "%s", "..."); else Modified: trunk/OpenMPT/mptrack/misc_util.h =================================================================== --- trunk/OpenMPT/mptrack/misc_util.h 2009-08-14 09:57:35 UTC (rev 322) +++ trunk/OpenMPT/mptrack/misc_util.h 2009-08-15 12:36:22 UTC (rev 323) @@ -3,6 +3,7 @@ #include <sstream> #include <string> +#include <limits> #define ARRAYELEMCOUNT(x) (sizeof(x)/sizeof(x[0])) Modified: trunk/OpenMPT/mptrack/serialization_utils.cpp =================================================================== --- trunk/OpenMPT/mptrack/serialization_utils.cpp 2009-08-14 09:57:35 UTC (rev 322) +++ trunk/OpenMPT/mptrack/serialization_utils.cpp 2009-08-15 12:36:22 UTC (rev 323) @@ -1,918 +1,890 @@ #include "stdafx.h" #include "serialization_utils.h" #include <algorithm> -#include <ctime> -#include <list> -using std::list; -using namespace srlztn; +namespace srlztn +{ +// Indexing starts from 0. +inline bool Testbit(uint8 val, uint8 bitindex) {return ((val & (1 << bitindex)) != 0);} +inline void Setbit(uint8& val, uint8 bitindex, bool newval) +//---------------------------------------------------------- +{ + if(newval) val |= (1 << bitindex); + else val &= ~(1 << bitindex); +} -uint8 WriteAdaptive1234(OUTSTREAM& oStrm, const uint32 num) + +bool IsPrintableId(const void* pvId, const size_t nLength) +//-------------------------------------------------------- +{ + const char* pId = static_cast<const char*>(pvId); + for(size_t i = 0; i < nLength; i++) + { + if (pId[i] <= 0 || isprint(pId[i]) == 0) + return false; + } + return true; +} + + +uint8 GetByteReq1248(const uint64 size) +//------------------------------------- +{ + if((size >> 6) == 0) return 1; + if((size >> (1*8+6)) == 0) return 2; + if((size >> (3*8+6)) == 0) return 4; + return 8; +} + + +uint8 GetByteReq1234(const uint32 num) +//------------------------------------ +{ + if((num >> 6) == 0) return 1; + if((num >> (1*8+6)) == 0) return 2; + if((num >> (2*8+6)) == 0) return 3; + return 4; +} + + +void WriteAdaptive12(OutStream& oStrm, const uint16 num) //------------------------------------------------------ { - const uint8 bc = GetNeededBytecount1234(num); - const uint32 sizeInstruction = (num << 2) | (bc - 1); + if(num >> 7 == 0) + Binarywrite<uint16>(oStrm, num << 1, 1); + else + Binarywrite<uint16>(oStrm, (num << 1) | 1); +} + + +void WriteAdaptive1234(OutStream& oStrm, const uint32 num) +//-------------------------------------------------------- +{ + const uint8 bc = GetByteReq1234(num); + const uint32 sizeInstruction = (num << 2) | (bc - 1); Binarywrite<uint32>(oStrm, sizeInstruction, bc); - return bc; } -uint8 WriteAdaptive1248(OUTSTREAM& oStrm, const uint64& num) -//------------------------------------------------------ + +//Format: First bit tells whether the size indicator is 1 or 2 bytes. +void WriteAdaptive12String(OutStream& oStrm, const std::string& str) +//------------------------------------------------------------------ { - const uint8 bc = GetNeededBytecount1248(num); - const uint64 sizeInstruction = (num << 2) | Log2(bc); + uint16 s = static_cast<uint16>(str.size()); + LimitMax(s, uint16(uint16_max / 2)); + WriteAdaptive12(oStrm, s); + oStrm.write(str.c_str(), s); +} + + +// Works only for arguments 1,2,4,8 +uint8 Log2(const uint8& val) +//-------------------------- +{ + if(val == 1) return 0; + else if(val == 2) return 1; + else if(val == 4) return 2; + else return 3; +} + +void WriteAdaptive1248(OutStream& oStrm, const uint64& num) +//--------------------------------------------------------- +{ + const uint8 bc = GetByteReq1248(num); + const uint64 sizeInstruction = (num << 2) | Log2(bc); Binarywrite<uint64>(oStrm, sizeInstruction, bc); - return bc; } +void ReadAdaptive12(InStream& iStrm, uint16& val) +//----------------------------------------------- +{ + Binaryread<uint16>(iStrm, val, 1); + if(val & 1) iStrm.read(reinterpret_cast<char*>(&val) + 1, 1); + val >>= 1; +} -uint8 ReadAdaptive1234(INSTREAM& iStrm, uint32& val) -//------------------------------------------------ + +void ReadAdaptive1234(InStream& iStrm, uint32& val) +//------------------------------------------------- { - val = 0; Binaryread<uint32>(iStrm, val, 1); const uint8 bc = 1 + static_cast<uint8>(val & 3); if(bc > 1) iStrm.read(reinterpret_cast<char*>(&val)+1, bc-1); val >>= 2; - return bc; } -uint8 ReadAdaptive1248(INSTREAM& iStrm, uint64& val) -//------------------------------------------------ +const uint8 pow2xTable[] = {1, 2, 4, 8, 16, 32, 64, 128}; + +// Returns 2^n. n must be within {0,...,7}. +inline uint8 Pow2xSmall(const uint8& exp) {ASSERT(exp <= 7); return pow2xTable[exp];} + +void ReadAdaptive1248(InStream& iStrm, uint64& val) +//------------------------------------------------- { - val = 0; Binaryread<uint64>(iStrm, val, 1); const uint8 bc = Pow2xSmall(static_cast<uint8>(val & 3)); if(bc > 1) iStrm.read(reinterpret_cast<char*>(&val)+1, bc-1); val >>= 2; - return bc; } -//SNR <-> Serialization Note Read -const CReadNotification SNR_BADGIVEN_STREAM(1 | SNT_FAILURE, "Bad stream given for reading"); -const CReadNotification SNR_BADSTREAM_AFTER_MAPHEADERSEEK(1<<1 | SNT_FAILURE, "Stream was bad after seeking map"); -const CReadNotification SNR_BAD_MAPBEGINPOS(1<<2 | SNT_FAILURE, "Bad map begin position"); -const CReadNotification SNR_NO_READING_ALLOWED_BY_INSTRUCTIONS(1<<3 | SNT_FAILURE, "Instructions do not allow reading"); -const CReadNotification SNR_FRAMEWORKID_MISMATCH(1<<4 | SNT_FAILURE, "FrameworkID mismatch"); -const CReadNotification SNR_FAULTY_HEADERSIZEINDICATOR(1<<5 | SNT_FAILURE, "Faulty headersize indicator"); -const CReadNotification SNR_BADSTREAM_AT_MAP_READ(1<<6 | SNT_FAILURE, "Bad stream when reading map"); -const CReadNotification SNR_MAPINFO_SIZE_ERROR(1<<7 | SNT_WARNING, "Read entrycount != mapcontainer size"); -const CReadNotification SNR_ZEROENTRYCOUNT(1<<8 | SNT_NOTE, "Entrycount is informed to be zero"); -const CReadNotification SNR_INSUFFICIENT_STREAM_OFFTYPE(1<<9 | SNT_FAILURE, "Map contains larger position than what OFFTYPE can handle"); -const CReadNotification SNR_OBJECTCLASS_IDMISMATCH(1<<10 | SNT_FAILURE, "Objectclass ID mismatch"); -const CReadNotification SNR_NO_ENTRYIDS_WITH_CUSTOMID_DEFINED(1<<11 | SNT_NOTE, "CustomID headerdata entry exists, but instructs to use no entryIDs"); -const CReadNotification SNR_IGNORED_HEADERDATA(1<<12 | SNT_NOTE, "Ignored headerdata"); -const CReadNotification SNR_LOADING_OBJECT_WITH_LARGER_VERSION(1<<13 | SNT_NOTE, "Object version > Instruction version"); -const CReadNotification SNR_UNKNOWN_DATAENTRY(1<<14 | SNT_NOTE, "Unknown dataentry"); -const CReadNotification SNR_TOO_MANY_ENTRIES_TO_READ(1 << 15 | SNT_FAILURE, "Object informs to contain more entries than is allowed to be read."); -const CReadNotification SNR_READ_TERMINATED_AFTER_READING_VERSIONNUMERIC(1 << 16 | SNT_NOTE, "Reading terminated after reading versionnumeric."); -const CReadNotification SNR_READ_TERMINATED_AFTER_READING_VERSIONSTRING(1 << 17 | SNT_NOTE, "Reading terminated after reading versionstring."); +void WriteItemString(OutStream& oStrm, const std::string& str) +//------------------------------------------------------------ +{ + uint32 id = (std::min)(str.size(), (uint32_max >> 4)) << 4; + id |= 12; // 12 == 1100b + Binarywrite<uint32>(oStrm, id); + id >>= 4; + if(id > 0) + oStrm.write(str.c_str(), id); +} -const CWriteNotification SNW_BADGIVEN_STREAM(1 | SNT_FAILURE, "Bad stream given for writing"); -const CWriteNotification SNW_DATASIZETYPE_OVERFLOW(1<<1 | SNT_FAILURE, "Datasize for a entry is larger than what can be handled by datasizetype."); -//1 << 2 unused -const CWriteNotification SNW_WRITING_NOT_ALLOWED(1 << 3 | SNT_FAILURE, "Instructions do not allow writing"); -const CWriteNotification SNW_INSUFFICIENT_FIXEDSIZE(1<<4 | SNT_FAILURE, "An entry data was longer than fixedsize parameter"); -const CWriteNotification SNW_WRITECOUNT_STREAMPOSINCREMENT_INCONSISTENCY(1<<5 | SNT_FAILURE, "Streamer informed it wrote number of bytes which was different from streamsize increment"); -const CWriteNotification SNW_CHANGING_IDSIZE_WITH_FIXED_IDSIZESETTING(1<<6 | SNT_FAILURE, "IDsize changes while it should be fixed"); -const CWriteNotification SNW_BADSTREAM_AT_END(1<<7 | SNT_FAILURE, "Stream was bad at the end."); -const CWriteNotification SNW_ZERO_IDINSTRUCTION_BYTE(1<<8 | SNT_WARNING, "Custom ID instruction byte is zero"); +void ReadItemString(InStream& iStrm, std::string& str, const DataSize) +//-------------------------------------------------------------------- +{ + // bits 0,1: Bytes per char type: 1,2,3,4. + // bits 2,3: Bytes in size indicator, 1,2,3,4 + uint32 id = 0; + Binaryread(iStrm, id, 1); + const uint8 nSizeBytes = (id & 12) >> 2; // 12 == 1100b + if (nSizeBytes > 0) + iStrm.read(reinterpret_cast<char*>(&id) + 1, min(3, nSizeBytes)); + // Limit to 1 MB. + str.resize(min(id >> 4, 1000000)); + for(size_t i = 0; i < str.size(); i++) + iStrm.read(&str[i], 1); + id = (id >> 4) - str.size(); + if(id > 0) + iStrm.ignore(id); +} -const char CSSBSerialization::s_EntryID[3] = {'2','2','8'}; -const uint8 CSSBSerialization::s_DefaultFlagbyte = 0; -int32 CSSBSerialization::s_DefaultReadLogMask = static_cast<int32>(uint32_max); //Enable all notes -int32 CSSBSerialization::s_DefaultWriteLogMask = static_cast<int32>(uint32_max); //Enable all notes -const ABCSerializationStreamer::READINFO ABCSerializationStreamer::s_InfoNoReadimplementation(SNT_WARNING, "No readmethod implementation"); -const ABCSerializationStreamer::WRITEINFO ABCSerializationStreamer::s_InfoNoWriteimplementation(SNT_WARNING, "No writemethod implementation"); - -string CSerializationNotification::ToString() const -//------------------------------------------------- +String IdToString(const void* const pvId, const size_t nLength) +//------------------------------------------------------------- { - string str; - str.reserve(50); - if(ID & SNT_PROGRESS) str += "Progress: "; - if(ID & SNT_FAILURE) str += "Error: "; - if(ID & SNT_NOTE) str += "Note: "; - if(ID & SNT_WARNING) str += "Warning: "; - if(str.size() == 0) str += "Unknown: "; - str += "ID " + Stringify(ID) + "; "; - str += description; + const char* pId = static_cast<const char*>(pvId); + if (nLength == 0) + return ""; + String str; + if (IsPrintableId(pId, nLength)) + std::copy(pId, pId + nLength, std::back_inserter<String>(str)); + else if (nLength <= 4) // Interpret ID as integer value. + { + int32 val = 0; + memcpy(&val, pId, nLength); + char buf[36]; + _itoa(val, buf, 10); + str = buf; + } return str; } +const char Ssb::s_EntryID[3] = {'2','2','8'}; +int32 Ssb::s_DefaultReadLogMask = SNT_DEFAULT_MASK; +int32 Ssb::s_DefaultWriteLogMask = SNT_DEFAULT_MASK; +Ssb::fpLogFunc_t Ssb::s_DefaultLogFunc = nullptr; -bool CSSBSerialization::AddReadNote(const CReadNotification& note, const bool addToLog) -//------------------------------------------------------------------------------------- +const TCHAR tstrWriteHeader[] = TEXT("Write header with ID = %s\n"); +const TCHAR tstrWriteProgress[] = TEXT("Wrote entry: {num, id, rpos, size} = {%u, %s, %u, %u}\n"); +const TCHAR tstrWritingMap[] = TEXT("Writing map to rpos: %u\n"); +const TCHAR tstrMapEntryWrite[] = TEXT("Writing map entry: id=%s, rpos=%u, size=%u\n"); +const TCHAR strWriteNote[] = TEXT("Write note: "); +const TCHAR tstrEndOfStream[] = TEXT("End of stream(rpos): %u\n"); + +const TCHAR tstrReadingHeader[] = TEXT("Read header with expected ID = %s\n"); +const TCHAR strNoMapInFile[] = TEXT("No map in the file.\n"); +const TCHAR strIdMismatch[] = TEXT("ID mismatch, terminating read.\n"); +const TCHAR strIdMatch[] = TEXT("ID match, continuing reading.\n"); +const TCHAR tstrReadingMap[] = TEXT("Reading map from rpos: %u\n"); +const TCHAR tstrEndOfMap[] = TEXT("End of map(rpos): %u\n"); +const TCHAR tstrReadProgress[] = TEXT("Read entry: {num, id, rpos, size, desc} = {%u, %s, %u, %s, %s}\n"); +const TCHAR tstrNoEntryFound[] = TEXT("No entry with id %s found.\n"); +const TCHAR tstrCantFindSubEntry[] = TEXT("Unable to find subentry with id=%s\n"); +const TCHAR strReadNote[] = TEXT("Read note: "); + + +#define SSB_INITIALIZATION_LIST \ + m_Readlogmask(s_DefaultReadLogMask), \ + m_Writelogmask(s_DefaultWriteLogMask), \ + m_fpLogFunc(s_DefaultLogFunc), \ + m_nCounter(0), \ + m_nNextReadHint(0), \ + m_nReadVersion(0), \ + m_nFixedEntrySize(0), \ + m_nIdbytes(IdSizeVariable), \ + m_nReadEntrycount(0), \ + m_nMaxReadEntryCount(16000), \ + m_pSubEntry(nullptr), \ + m_rposMapBegin(0), \ + m_posStart(0), \ + m_posSubEntryStart(0), \ + m_posDataBegin(0), \ + m_posMapStart(0), \ + m_rposEndofHdrData(0), \ + m_posMapEnd(0), \ + m_posEntrycount(0), \ + m_posMapPosField(0), \ + m_nMapReserveSize(0), \ + m_Flags(s_DefaultFlags), \ + m_Status(SNT_NONE) + + +Ssb::Ssb(InStream* pIstrm, OutStream* pOstrm) : + m_pOstrm(pOstrm), + m_pIstrm(pIstrm), + SSB_INITIALIZATION_LIST +//----------------------------------------------- +{} + +Ssb::Ssb(IoStream& ioStrm) : + m_pOstrm(&ioStrm), + m_pIstrm(&ioStrm), + SSB_INITIALIZATION_LIST +//------------------------------ +{} + +Ssb::Ssb(OutStream& oStrm) : + m_pOstrm(&oStrm), + m_pIstrm(nullptr), + SSB_INITIALIZATION_LIST +//------------------------------ +{} + + +Ssb::Ssb(InStream& iStrm) : + m_pIstrm(&iStrm), + m_pOstrm(nullptr), + SSB_INITIALIZATION_LIST +//------------------------------ +{} + +#undef SSB_INITIALIZATION_LIST + +void Ssb::AddNote(const SsbStatus s, const SsbStatus mask, const TCHAR* sz) +//------------------------------------------------------------------------- { - m_Readnotes.ID |= note.ID; - if(addToLog && (note & m_Readlogmask)) - { - AddToLog(note.ToString().c_str()); - } - return (note & SNT_FAILURE) ? true : false; + m_Status |= s; + if ((s & mask) != 0 && m_fpLogFunc) + m_fpLogFunc("%s: 0x%x\n", sz, s); } +void Ssb::AddWriteNote(const SsbStatus s) {AddNote(s, m_Writelogmask, strWriteNote);} +void Ssb::AddReadNote(const SsbStatus s) {AddNote(s, m_Readlogmask, strReadNote);} -bool CSSBSerialization::AddReadNote(const CReadNotification& note, const CMappinginfo* pMi) -//---------------------------------------------------------------------------------------- + +void Ssb::AddReadNote(const ReadEntry* const pRe, const NumType nNum) +//------------------------------------------------------------------- { - if(note == SNR_UNKNOWN_DATAENTRY) + m_Status |= SNT_PROGRESS; + + if ((m_Readlogmask & SNT_PROGRESS) != 0 && m_fpLogFunc) { - m_Readnotes.ID |= note.ID; - if(note.ID & m_Readlogmask) - { - string logmsg = "Note: Unknown dataentry found; "; + TCHAR buffer[256]; + wsprintf(buffer, + tstrReadProgress, + nNum, + (pRe && pRe->nIdLength < 30 && m_Idarray.size() > 0) ? IdToString(&m_Idarray[pRe->nIdpos], pRe->nIdLength).c_str() : "", + (pRe) ? pRe->rposStart : 0, + (pRe && pRe->nSize != invalidDatasize) ? Stringify(pRe->nSize).c_str() : "", + ""); + m_fpLogFunc(buffer); + } +} - if(pMi == 0) - logmsg += "No map entry found."; - else - { - //Adding ID only if it does not contain null-character. - if(std::find(pMi->id.begin(), pMi->id.end(), 0) == pMi->id.end()) - { - logmsg += "id = "; - const size_t s = logmsg.length(); - logmsg.resize(s + pMi->id.size(), '.'); - std::copy(pMi->id.begin(), pMi->id.end(), logmsg.begin()+s); - } - if(pMi->description.length() > 0) - logmsg += "; entry description: " + pMi->description; - else - logmsg += "; there's no description for the entry"; - - AddToLog(logmsg.c_str()); - } - } - return false; - } - else +// Called after writing an entry. +void Ssb::AddWriteNote(const void* pId, const size_t nIdSize, const NumType nEntryNum, const DataSize nBytecount, const RposType rposStart) +//---------------------------------------------------------------------------- +{ + m_Status |= SNT_PROGRESS; + if ((m_Writelogmask & SNT_PROGRESS) != 0 && m_fpLogFunc) { - CReadNotification n = note; - if(pMi) + if (nIdSize < 30) { - n.description += string("; ") + pMi->ToString(); + TCHAR buffer[256]; + wsprintf(buffer, tstrWriteProgress, nEntryNum, IdToString(pId, nIdSize).c_str(), rposStart, nBytecount); + m_fpLogFunc(buffer); } - return AddReadNote(n); } +} + +void Ssb::ResetReadstatus() +//------------------------- +{ + m_Status = SNT_NONE; + m_Idarray.reserve(32); + m_Idarray.push_back(0); } -bool CSSBSerialization::AddWriteNote(const CWriteNotification& note, const bool addToLog) -//------------------------------------------------ +void Ssb::WriteMapItem( const void* pId, + const size_t nIdSize, + const RposType& rposDataStart, + const DataSize& nDatasize, + const TCHAR* pszDesc) +//---------------------------------------------- { - m_Writenotes.ID |= note.ID; - if(addToLog && (note & m_Writelogmask)) + if (m_fpLogFunc) + m_fpLogFunc(tstrMapEntryWrite, + (nIdSize > 0) ? IdToString(pId, nIdSize).c_str() : "", + rposDataStart, + nDatasize); + + if(m_nIdbytes > 0) { - AddToLog(note.ToString().c_str()); + if (m_nIdbytes != IdSizeVariable && nIdSize != m_nIdbytes) + { AddWriteNote(SNW_CHANGING_IDSIZE_WITH_FIXED_IDSIZESETTING); return; } + + if (m_nIdbytes == IdSizeVariable) //Variablesize ID? + WriteAdaptive12(m_MapStream, static_cast<uint16>(nIdSize)); + + if(nIdSize > 0) + m_MapStream.write(reinterpret_cast<const char*>(pId), static_cast<Streamsize>(nIdSize)); } - return (note & SNT_FAILURE) ? true : false; + if (GetFlag(RwfWMapStartPosEntry)) //Startpos + WriteAdaptive1248(m_MapStream, rposDataStart); + if (GetFlag(RwfWMapSizeEntry)) //Entrysize + WriteAdaptive1248(m_MapStream, nDatasize); + if (GetFlag(RwfWMapDescEntry)) //Entry descriptions + WriteAdaptive12String(m_MapStream, String(pszDesc)); } -void CSSBSerialization::ResetReadstatus() -//--------------------------------------- + +void Ssb::ReserveMapSize(uint32 nSize) +//------------------------------------ { - m_Readnotes.ID = 0; - m_Readnotes.description.clear(); + OutStream& oStrm = *m_pOstrm; + m_nMapReserveSize = nSize; + if (nSize > 0) + { + m_posMapStart = oStrm.tellp(); + for(size_t i = 0; i < m_nMapReserveSize; i++) + oStrm.put(0); + } } -void CSSBSerialization::ResetWritestatus() -//---------------------------------------- + +void Ssb::SetIdSize(uint16 nSize) +//------------------------------- { - m_Writenotes.ID = 0; - m_Writenotes.description.clear(); + if (nSize == IdSizeVariable || nSize > IdSizeMaxFixedSize) + m_nIdbytes = IdSizeVariable; + else + m_nIdbytes = nSize; } - -const CWriteNotification& CSSBSerialization::Serialize(OUTSTREAM& oStrm) -//------------------------------------------------- +void Ssb::CreateWriteSubEntry() +//----------------------------- { - ResetWritestatus(); + m_posSubEntryStart = m_pOstrm->tellp(); + delete m_pSubEntry; + m_pSubEntry = new Ssb(*m_pOstrm); + m_pSubEntry->m_fpLogFunc = m_fpLogFunc; +} - if(!m_pSi->AllowWriting()) + +Ssb* Ssb::CreateReadSubEntry(const void* pId, const size_t nLength) +//----------------------------------------------------------------- +{ + const ReadEntry* pE = Find(pId, nLength); + if (pE && pE->rposStart != 0) { - AddWriteNote(SNW_WRITING_NOT_ALLOWED); - return m_Writenotes; + m_nCounter++; + delete m_pSubEntry; + m_pSubEntry = new Ssb(*m_pIstrm); + m_pSubEntry->m_fpLogFunc = m_fpLogFunc; + m_pIstrm->seekg(m_posStart + Postype(pE->rposStart)); + return m_pSubEntry; } + else if (m_fpLogFunc) + m_fpLogFunc(tstrCantFindSubEntry, IdToString(pId, nLength).c_str()); - if(!oStrm.good() && AddWriteNote(SNW_BADGIVEN_STREAM)) - return m_Writenotes; + return nullptr; +} - const POSTYPE startpos = oStrm.tellp(); - //Framework identifier. - oStrm.write(s_EntryID, sizeof(s_EntryID)); - - //Objectclass('filetype') identifier +void Ssb::IncrementWriteCounter() +//------------------------------- +{ + m_nCounter++; + if (m_nCounter >= (uint16_max >> 2)) { - uint8 idsize = static_cast<uint8>(m_pSi->GetObjectClassID().size()); - Binarywrite<uint8>(oStrm, idsize); - if(idsize > 0) oStrm.write(&m_pSi->GetObjectClassID()[0], idsize); + FinishWrite(); + AddWriteNote(SNW_MAX_WRITE_COUNT_REACHED); } +} - //Forming header. - uint8 header = 0; - //0,1 : Bytes per IDtype, 0,1,2,4 - header = (m_pSi->GetBytecount_ID() != 4) ? (m_pSi->GetBytecount_ID() & 3) : 3; +void Ssb::ReleaseWriteSubEntry(const void* pId, const size_t nIdLength) +//--------------------------------------------------------------------- +{ + if ((m_pSubEntry->m_Status & SNT_FAILURE) != 0) + m_Status |= SNW_SUBENTRY_FAILURE; - //2 : Startpos in map? - Setbit(header, 2, m_pSi->GetIncludeStartposInMap()); + delete m_pSubEntry; m_pSubEntry = nullptr; + WriteMapItem(pId, nIdLength, m_posSubEntryStart - m_posStart, m_pOstrm->tellp() - m_posSubEntryStart, ""); + IncrementWriteCounter(); +} - //3 : Datasize in map? - Setbit(header, 3, m_pSi->GetIncludeDatasizeEntryInMap()); - //4 : Has version numeric field? - Setbit(header, 4, m_pSi->GetUseVersion()); +void Ssb::BeginWrite(const void* pId, const size_t nIdSize, const uint64& nVersion) +//--------------------------------------------------------------------------------- +{ + OutStream& oStrm = *m_pOstrm; - //5 : Has version string field? - Setbit(header, 5, m_pSi->GetUseVersionstring()); + if (m_fpLogFunc) + m_fpLogFunc(tstrWriteHeader, IdToString(pId, nIdSize).c_str()); - //6 : Bytes per descriptioncharacter(1,2) - Setbit(header, 6, m_pSi->GetUseTwobyteDescriptionChar()); + ResetWritestatus(); - //7 : Entrydescriptions in map? - Setbit(header, 7, m_pSi->GetIncludeEntrydescriptionsInMap()); + if(!oStrm.good()) + { AddWriteNote(SNRW_BADGIVEN_STREAM); return; } - uint16 IDbytecount = m_pSi->GetBytecount_ID(); + // Start bytes. + oStrm.write(s_EntryID, sizeof(s_EntryID)); - //Writing header + m_posStart = oStrm.tellp() - Offtype(sizeof(s_EntryID)); + + // Object ID. + { + uint8 idsize = static_cast<uint8>(nIdSize); + Binarywrite<uint8>(oStrm, idsize); + if(idsize > 0) oStrm.write(reinterpret_cast<const char*>(pId), nIdSize); + } + + // Form header. + uint8 header = 0; + + SetFlag(RwfWMapStartPosEntry, GetFlag(RwfWMapStartPosEntry) && m_nFixedEntrySize == 0); + SetFlag(RwfWMapSizeEntry, GetFlag(RwfWMapSizeEntry) && m_nFixedEntrySize == 0); + + header = (m_nIdbytes != 4) ? (m_nIdbytes & 3) : 3; //0,1 : Bytes per IDtype, 0,1,2,4 + Setbit(header, 2, GetFlag(RwfWMapStartPosEntry)); //2 : Startpos in map? + Setbit(header, 3, GetFlag(RwfWMapSizeEntry)); //3 : Datasize in map? + Setbit(header, 4, GetFlag(RwfWVersionNum)); //4 : Version numeric field? + Setbit(header, 7, GetFlag(RwfWMapDescEntry)); //7 : Entrydescriptions in map? + + // Write header Binarywrite<uint8>(oStrm, header); - //Various flags to modify default settings(with default settings its not needed). + // Additional options. uint8 tempU8 = 0; - Setbit(tempU8, 0, m_pSi->GetCustomIDInstructionbyte() != 0); - Setbit(tempU8, 1, m_pSi->GetHasFixedsizeentries() != 0); - Setbit(tempU8, 2, m_pSi->GetObjectDescription().size() != 0); - Setbit(tempU8, 3, m_pSi->GetUseTimestamp()); - Setbit(tempU8, 4, m_pSi->GetIgnoreLeadingNullInIDComparison()); - + Setbit(tempU8, 0, (m_nIdbytes == IdSizeVariable) || (m_nIdbytes == 3) || (m_nIdbytes > 4)); + Setbit(tempU8, 1, m_nFixedEntrySize != 0); + const uint8 flags = tempU8; if(flags != s_DefaultFlagbyte) { WriteAdaptive1234(oStrm, 2); //Headersize - now it is 2. - Binarywrite<uint8>(oStrm, HEADERID_FLAGBYTE); + Binarywrite<uint8>(oStrm, HeaderId_FlagByte); Binarywrite<uint8>(oStrm, flags); } else WriteAdaptive1234(oStrm, 0); - //Version(numeric)? - if(Testbit(header, 4)) - WriteAdaptive1248(oStrm, m_pSi->GetInstructionVersion()); + if(Testbit(header, 4)) // Version(numeric)? + WriteAdaptive1248(oStrm, nVersion); - //Version(string)? - if(Testbit(header, 5)) + if(Testbit(flags, 0)) // Custom IDbytecount? { - Binarywrite<size_t>(oStrm, m_pSi->GetVersionString().size(), 1); - oStrm.write(m_pSi->GetVersionString().c_str(), static_cast<uint8>(m_pSi->GetVersionString().size())); + uint8 n = (m_nIdbytes == IdSizeVariable) ? 1 : static_cast<uint8>((m_nIdbytes << 1)); + Binarywrite<uint8>(oStrm, n); } - //Custom IDbytecount? - if(Testbit(flags, 0)) - { - Binarywrite<uint8>(oStrm, m_pSi->GetCustomIDInstructionbyte()); - IDbytecount = m_pSi->GetCustomIDInstructionbyte() >> 1; - if(IDbytecount == 0) - { - if(m_pSi->GetCustomIDInstructionbyte() & 1) IDbytecount = uint16_max; //Variablesize ID. - else AddWriteNote(SNW_ZERO_IDINSTRUCTION_BYTE); - } - } + if(Testbit(flags, 1)) // Fixedsize entries? + WriteAdaptive1234(oStrm, m_nFixedEntrySize); - //Fixedsize entries - const uint32 fixedsizeentries = m_pSi->GetHasFixedsizeentries(); - if(Testbit(flags, 1)) - WriteAdaptive1234(oStrm, m_pSi->GetHasFixedsizeentries()); + //Entrycount. Reserve two bytes(max uint16_max / 4 entries), actual value is written after writing data. + m_posEntrycount = oStrm.tellp(); + Binarywrite<uint16>(oStrm, 0); - //Object description? - if(Testbit(flags, 2)) - WriteAdaptive12String(oStrm, m_pSi->GetObjectDescription()); + SetFlag(RwfRwHasMap, (m_nIdbytes != 0 || GetFlag(RwfWMapStartPosEntry) || GetFlag(RwfWMapSizeEntry) || GetFlag(RwfWMapDescEntry))); - //Timestamp? - if(Testbit(flags, 3)) - Binarywrite<uint64>(oStrm, time(0), 5); + m_posMapPosField = oStrm.tellp(); + if (GetFlag(RwfRwHasMap)) //Mapping begin pos(reserve space - actual value is written after writing data) + Binarywrite<uint64>(oStrm, 0); +} - const bool hasDatastartposEntryInMap = m_pSi->GetIncludeStartposInMap() && fixedsizeentries == 0; - const bool hasDatasizeEntryInMap = m_pSi->GetIncludeDatasizeEntryInMap() && fixedsizeentries == 0; +Ssb::ReadRv Ssb::OnReadEntry(const ReadEntry* pE, const void* pId, const size_t nIdSize, const Postype& posReadBegin) +//------------------------------------------------------------------------------------------------------------------- +{ + if (pE != nullptr) + AddReadNote(pE, m_nCounter); + else if (GetFlag(RwfRMapHasId) == false) // Not ID's in map. + { + ReadEntry e; + e.rposStart = posReadBegin - m_posStart; + e.nSize = m_pIstrm->tellg() - posReadBegin; + AddReadNote(&e, m_nCounter); + } + else // Entry not found. + { + if (m_fpLogFunc) + m_fpLogFunc(tstrNoEntryFound, IdToString(pId, nIdSize).c_str()); + return EntryNotFound; + } + m_nCounter++; + return EntryRead; +} - //Entrycount - WriteAdaptive1248(oStrm, m_pSi->GetEntrycount()); +void Ssb::OnWroteItem(const void* pId, const size_t nIdSize, const Postype& posBeforeWrite) +//----------------------------------------------------------------------------------------- +{ + RposType nEntrySize = m_pOstrm->tellp() - posBeforeWrite; - //Mapping begin pos(reserve space - actual value is written after writing data) - const POSTYPE mappingpositionindicatorfieldpos = oStrm.tellp(); + if(GetFlag(RwfRMapHasSize) && nEntrySize > (uint64_max >> 2)) + { AddWriteNote(SNW_DATASIZETYPE_OVERFLOW); return; } - //Writing always 4 bytes even though the size is adaptive(changing this requires modifications elsewhere - //as well.) - Binarywrite<uint32>(oStrm, OFFTYPE_MAX); - - const bool hasMap = (IDbytecount != 0 || hasDatastartposEntryInMap || hasDatasizeEntryInMap || m_pSi->GetIncludeEntrydescriptionsInMap()); - - std::vector<CMappinginfo> mappings; - if(hasMap) - mappings.resize(m_pSi->GetEntrycount(), CMappinginfo()); - - //Writing data - size_t counter = 0; - const CSerializationentry* pEntry = 0; - while(m_pSi->SetNextentry(pEntry)) + // Handle fixed size entries: + if (m_nFixedEntrySize > 0) { - const POSTYPE entrystartposInStream = oStrm.tellp(); - const POSTYPE entrystartposInObject = oStrm.tellp() - startpos; - OFFTYPE bytecount = pEntry->Write(oStrm); - const uint64 datasize = bytecount; - if(static_cast<uint64>(oStrm.tellp()-entrystartposInStream) != bytecount && AddWriteNote(SNW_WRITECOUNT_STREAMPOSINCREMENT_INCONSISTENCY)) - return m_Writenotes; - - if(pEntry->GetStreamer().GetLastWriteinfo().description.size()) - AddWriteNote(pEntry->GetStreamer().GetLastWriteinfo()); - - if(hasDatasizeEntryInMap && datasize > (uint32_max >> 2) && AddWriteNote(SNW_DATASIZETYPE_OVERFLOW)) - return m_Writenotes; - - if(fixedsizeentries) + if(nEntrySize <= m_nFixedEntrySize) { - if(static_cast<uint32>(bytecount) <= fixedsizeentries) - { - char fillc = 0; - for(uint32 i = 0; i<fixedsizeentries-bytecount; i++) - oStrm.write(&fillc, 1); - } - else - if(AddWriteNote(SNW_INSUFFICIENT_FIXEDSIZE)) - return m_Writenotes; + for(uint32 i = 0; i<m_nFixedEntrySize-nEntrySize; i++) + m_pOstrm->put(0); + nEntrySize = m_nFixedEntrySize; } - if(!hasMap) - continue; - - mappings[counter] = CMappinginfo(pEntry->GetID(), entrystartposInObject, datasize, pEntry->GetDescription()); - - counter++; + else + { AddWriteNote(SNW_INSUFFICIENT_FIXEDSIZE); return; } } + if (GetFlag(RwfRwHasMap)) + WriteMapItem(pId, nIdSize, posBeforeWrite - m_posStart, nEntrySize, ""); - //Mapping data - const uint64 mapstartposRelative = oStrm.tellp() - startpos; - if(hasMap) //Write map - { - vector<CMappinginfo>::const_iterator mapiter = mappings.begin(); - vector<CMappinginfo>::const_iterator mapiterEnd = mappings.end(); - for(mapiter; mapiter != mapiterEnd; mapiter++) - { - if((m_pSi->GetCustomIDInstructionbyte() & 3) == 0 && mapiter->id.size() != IDbytecount - && AddWriteNote(SNW_CHANGING_IDSIZE_WITH_FIXED_IDSIZESETTING)) - return m_Writenotes; + if (m_fpLogFunc != nullptr) + AddWriteNote(pId, nIdSize, m_nCounter, nEntrySize, posBeforeWrite - m_posStart); + IncrementWriteCounter(); +} - if(IDbytecount > 0) - { - if((m_pSi->GetCustomIDInstructionbyte() & 1) != 0) //Variablesize ID? - WriteAdaptive12(oStrm, static_cast<uint16>(mapiter->id.size())); - if(mapiter->id.size() > 0) - oStrm.write(&mapiter->id[0], static_cast<STREAMSIZE>(mapiter->id.size())); - } +void Ssb::CompareId(InStream& iStrm, const void* pId, const size_t nIdlength) +//--------------------------------------------------------------------------- +{ + uint8 tempU8 = 0; + Binaryread<uint8>(iStrm, tempU8); + char buffer[256]; + if(tempU8) + iStrm.read(buffer, tempU8); - if(hasDatastartposEntryInMap) //Startpos - WriteAdaptive1248(oStrm, mapiter->startpos); - if(hasDatasizeEntryInMap) //Entrysize - WriteAdaptive1248(oStrm, mapiter->entrysize); + if (tempU8 == nIdlength && nIdlength > 0 && memcmp(buffer, pId, nIdlength) == 0) + return; // Match. + else if (GetFlag(RwfRPartialIdMatch) && tempU8 > nIdlength && nIdlength > 0 + && memcmp(buffer, pId, nIdlength) == 0 && buffer[nIdlength] == 0) + return; // Partial match. - if(Testbit(header, 7)) //Entry descriptions? - { - WriteAdaptive12String(oStrm, mapiter->description); - } - } - } - //Writing mappingstartposition. - const POSTYPE endposStrm = oStrm.tellp(); - oStrm.seekp(mappingpositionindicatorfieldpos); - Binarywrite<uint64>(oStrm, mapstartposRelative << 2 | 2, 4); - oStrm.seekp(endposStrm); //Setting endpos to end of stream. - if(oStrm.fail()) AddWriteNote(SNW_BADSTREAM_AT_END); - return m_Writenotes; + AddReadNote(SNR_OBJECTCLASS_IDMISMATCH); } -const CReadNotification& CSSBSerialization::Unserialize(INSTREAM& iStrm) -//------------------------------------------------- + +void Ssb::BeginRead(const void* pId, const size_t nLength, const uint64& nVersion) +//--------------------------------------------------------------------------------- { - ResetReadstatus(); + InStream& iStrm = *m_pIstrm; - if(!m_pSi->AllowReading()) - {AddReadNote(SNR_NO_READING_ALLOWED_BY_INSTRUCTIONS); return m_Readnotes;} + if (m_fpLogFunc) + m_fpLogFunc(tstrReadingHeader, IdToString(pId, nLength).c_str()); - if(!iStrm.good() && AddReadNote(SNR_BADGIVEN_STREAM)) - return m_Readnotes; + ResetReadstatus(); - const POSTYPE startpos = iStrm.tellg(); + if (!iStrm.good()) + { AddReadNote(SNRW_BADGIVEN_STREAM); return; } - //Framework entryidentifier. + m_posStart = iStrm.tellg(); + + // Start bytes. { - char temp[sizeof(s_EntryID)]; - Binaryread<char[sizeof(s_EntryID)]>(iStrm, temp); - if(memcmp(temp, s_EntryID, sizeof(s_EntryID)) && AddReadNote(SNR_FRAMEWORKID_MISMATCH)) - return m_Readnotes; + char temp[sizeof(s_EntryID)]; + Binaryread<char[sizeof(s_EntryID)]>(iStrm, temp); + if (memcmp(temp, s_EntryID, sizeof(s_EntryID))) + { + AddReadNote(SNR_STARTBYTE_MISMATCH); + return; + } } - - //Filetype identifier + + // Compare IDs. + CompareId(iStrm, pId, nLength); + if ((m_Status & SNT_FAILURE) != 0) { - uint8 tempU8 = 0; - Binaryread<uint8>(iStrm, tempU8); - vector<char> buf(tempU8, 0); - if(tempU8) iStrm.read(&buf[0], tempU8); - if(m_pSi->CompareObjectClassID(buf) && AddReadNote(SNR_OBJECTCLASS_IDMISMATCH)) - return m_Readnotes; + if (m_fpLogFunc) + m_fpLogFunc(strIdMismatch); + return; } - //Header + if (m_fpLogFunc) + m_fpLogFunc(strIdMatch); + + // Header uint8 tempU8; Binaryread<uint8>(iStrm, tempU8); const uint8 header = tempU8; - const uint8 bytesPerID = ((header & 3) == 3) ? 4 : (header & 3); - const bool hasVersionnumeric = Testbit(header, 4); - const bool hasVersionstring = Testbit(header, 5); - const uint8 bytesPerDescchar = 1 + Testbit(header, 6); + m_nIdbytes = ((header & 3) == 3) ? 4 : (header & 3); + if (Testbit(header, 6)) + SetFlag(RwfRTwoBytesDescChar, true); - //Read headerdata size + // Read headerdata size uint32 tempU32 = 0; ReadAdaptive1234(iStrm, tempU32); const uint32 headerdatasize = tempU32; - //If headerdatasize != 0, read known headerdata and ignore rest. + // If headerdatasize != 0, read known headerdata and ignore rest. uint8 flagbyte = s_DefaultFlagbyte; - if(headerdatasize > 0) + if(headerdatasize >= 2) { - uint32 headerbytesread = 0; - while(headerbytesread < headerdatasize) - { - headerbytesread += Binaryread<uint8>(iStrm, tempU8); - if(tempU8 == HEADERID_FLAGBYTE) - { - headerbytesread += Binaryread<uint8>(iStrm, tempU8); - flagbyte = tempU8; - continue; - } + Binaryread<uint8>(iStrm, tempU8); + if(tempU8 == HeaderId_FlagByte) + Binaryread<uint8>(iStrm, flagbyte); - iStrm.ignore(headerdatasize - headerbytesread); - headerbytesread = headerdatasize; - AddReadNote(SNR_IGNORED_HEADERDATA); - break; - } - if(headerdatasize != headerbytesread && AddReadNote(SNR_FAULTY_HEADERSIZEINDICATOR)) - return m_Readnotes; + iStrm.ignore( (tempU8 == HeaderId_FlagByte) ? headerdatasize - 2 : headerdatasize - 1); } uint64 tempU64 = 0; - //Read version numeric if available. - if(hasVersionnumeric) + // Read version numeric if available. + if (Testbit(header, 4)) { ReadAdaptive1248(iStrm, tempU64); - if(m_pSi->SetReadVersion(tempU64)) - { - AddReadNote(SNR_READ_TERMINATED_AFTER_READING_VERSIONNUMERIC); - return m_Readnotes; - } - if(tempU64 > m_pSi->GetInstructionVersion()) + m_nReadVersion = tempU64; + if(tempU64 > nVersion) AddReadNote(SNR_LOADING_OBJECT_WITH_LARGER_VERSION); } - //Read version string if available. - if(hasVersionstring) + if (Testbit(header, 5)) { Binaryread<uint8>(iStrm, tempU8); - string temp; - ReadBytes(iStrm, temp, tempU8); - if(m_pSi->SetVersionstring(temp)) - { - AddReadNote(SNR_READ_TERMINATED_AFTER_READING_VERSIONSTRING); - return m_Readnotes; - } + iStrm.ignore(tempU8); } - std::pair<bool, uint8> IDsize(0,bytesPerID); //First: Variable ID size?, second value is the size of fixed size ID - ignored if first entry is true. - if(Testbit(flagbyte, 0)) //Custom ID? + if(Testbit(flagbyte, 0)) // Custom ID? { Binaryread<uint8>(iStrm, tempU8); - IDsize.first = (tempU8 & 1) != 0; - IDsize.second = tempU8 >> 1; - if(IDsize.first == 0 && IDsize.second == 0) + if ((tempU8 & 1) != 0) + m_nIdbytes = IdSizeVariable; + else + m_nIdbytes = (tempU8 >> 1); + if(m_nIdbytes == 0) AddReadNote(SNR_NO_ENTRYIDS_WITH_CUSTOMID_DEFINED); } - uint32 fixedsizeentries = 0; //If != 0, means that corresponding fixed size entries expected. - if(Testbit(flagbyte, 1)) //Fixedsize entries? - ReadAdaptive1234(iStrm, fixedsizeentries); + m_nFixedEntrySize = 0; + if(Testbit(flagbyte, 1)) // Fixedsize entries? + ReadAdaptive1234(iStrm, m_nFixedEntrySize); + SetFlag(RwfRMapHasStartpos, Testbit(header, 2)); + SetFlag(RwfRMapHasSize, Testbit(header, 3)); + SetFlag(RwfRMapHasId, (m_nIdbytes > 0)); + SetFlag(RwfRMapHasDesc, Testbit(header, 7)); + SetFlag(RwfRwHasMap, GetFlag(RwfRMapHasId) || GetFlag(RwfRMapHasStartpos) || GetFlag(RwfRMapHasSize) || GetFlag(RwfRMapHasDesc)); + + if (GetFlag(RwfRwHasMap) == false && m_fpLogFunc) + m_fpLogFunc(strNoMapInFile); - if(Testbit(flagbyte, 2)) //Object description? + if (Testbit(flagbyte, 2)) // Object description? { uint16 size = 0; ReadAdaptive12(iStrm, size); - if(bytesPerDescchar == 1) - { - string temp; - ReadBytes(iStrm, temp, size); - m_pSi->SetObjectDescription(temp); - } - else - { - iStrm.ignore(size * bytesPerDescchar); - } + iStrm.ignore(size * (GetFlag(RwfRTwoBytesDescChar)) ? 2 : 1); } - if(Testbit(flagbyte, 3)) //Simple timestamp - { - Binaryread<uint64>(iStrm, tempU64, 5); - m_pSi->SetTimestamp(tempU64); - } + if(Testbit(flagbyte, 3)) + iStrm.ignore(8); - //Read entrycount + // Read entrycount ReadAdaptive1248(iStrm, tempU64); - const uint64 entrycount = tempU64; - if(entrycount == 0) + if(tempU64 > m_nMaxReadEntryCount) + { AddReadNote(SNR_TOO_MANY_ENTRIES_TO_READ); return; } + + m_nReadEntrycount = static_cast<NumType>(tempU64); + if(m_nReadEntrycount == 0) AddReadNote(SNR_ZEROENTRYCOUNT); - if(entrycount > m_pSi->GetMaxReadEntrycount()) + // Read map rpos if map exists. + if (GetFlag(RwfRwHasMap)) { - AddReadNote(SNR_TOO_MANY_ENTRIES_TO_READ); - return m_Readnotes; + ReadAdaptive1248(iStrm, tempU64); + if(tempU64 > Offtype_max) + { AddReadNote(SNR_INSUFFICIENT_STREAM_OFFTYPE); return; } } + m_rposEndofHdrData = iStrm.tellg() - m_posStart; + m_rposMapBegin = (GetFlag(RwfRwHasMap)) ? static_cast<RposType>(tempU64) : m_rposEndofHdrData; - //Read map position start - ReadAdaptive1248(iStrm, tempU64); - if(tempU64 > OFFTYPE_MAX && AddReadNote(SNR_INSUFFICIENT_STREAM_OFFTYPE)) - return m_Readnotes; - const uint64 mapbeginpos = tempU64; - if(mapbeginpos < iStrm.tellg() - startpos && AddReadNote(SNR_BAD_MAPBEGINPOS)) - return m_Readnotes; + if (GetFlag(RwfRwHasMap) == false) + m_posMapEnd = m_posStart + m_rposEndofHdrData; - const POSTYPE databeginpos = iStrm.tellg(); + SetFlag(RwfRHeaderIsRead, true); +} - std::list<CMappinginfo> mapinfos; - const bool hasStartposInMap = Testbit(header, 2) && fixedsizeentries == 0; - const bool hasSizedataInMap = Testbit(header, 3) && fixedsizeentries == 0; - const bool hasIDsInMap = (IDsize.first == true || IDsize.second != 0); - const bool hasEntrydescriptionsInMap = Testbit(header, 7); - const bool hasMap = hasIDsInMap || hasStartposInMap || hasSizedataInMap || hasEntrydescriptionsInMap; - - //Goto map if it exists - if(hasMap) +void Ssb::CacheMap() +//------------------ +{ + InStream& iStrm = *m_pIstrm; + if(GetFlag(RwfRwHasMap) || m_nFixedEntrySize > 0) { - Seekg(iStrm, startpos, mapbeginpos); + iStrm.seekg(m_posStart + m_rposMapBegin); - if(iStrm.fail() && AddReadNote(SNR_BADSTREAM_AFTER_MAPHEADERSEEK)) - return m_Readnotes; + if(iStrm.fail()) + { AddReadNote(SNR_BADSTREAM_AFTER_MAPHEADERSEEK); return; } + if (m_fpLogFunc) + m_fpLogFunc(tstrReadingMap, m_rposMapBegin); + + mapData.resize(m_nReadEntrycount); + m_Idarray.reserve(m_nReadEntrycount * 4); + //Read map - for(uint64 i = 0; i<entrycount; i++) + for(NumType i = 0; i<m_nReadEntrycount; i++) { - if(iStrm.fail() && AddReadNote(SNR_BADSTREAM_AT_MAP_READ)) - return m_Readnotes; + if(iStrm.fail()) + { AddReadNote(SNR_BADSTREAM_AT_MAP_READ); return; } - CMappinginfo mi; - if(IDsize.first == true) //Variablesize ID + // Read ID. + uint16 nIdsize = m_nIdbytes; + if(nIdsize == IdSizeVariable) //Variablesize ID + ReadAdaptive12(iStrm, nIdsize); + const size_t nOldEnd = m_Idarray.size(); + if(nIdsize > 0) { - uint16 idsize; - ReadAdaptive12(iStrm, idsize); - mi.id.resize(idsize); - iStrm.read(&mi.id[0], idsize); + m_Idarray.resize(nOldEnd + nIdsize); + iStrm.read(&m_Idarray[nOldEnd], nIdsize); } - else //Fixed size ID, or not id at all. - { - if(IDsize.second != 0) - { - mi.id.resize(IDsize.second); - iStrm.read(&mi.id[0], IDsize.second); - } - } + mapData[i].nIdLength = nIdsize; + mapData[i].nIdpos = nOldEnd; - if(hasStartposInMap) + // Read position. + if(GetFlag(RwfRMapHasStartpos)) { + uint64 tempU64; ReadAdaptive1248(iStrm, tempU64); - mi.startpos = tempU64; - if(mi.startpos > OFFTYPE_MAX && AddReadNote(SNR_INSUFFICIENT_STREAM_OFFTYPE)) - return m_Readnotes; - + if(tempU64 > Offtype_max) + { AddReadNote(SNR_INSUFFICIENT_STREAM_OFFTYPE); return; } + mapData[i].rposStart = static_cast<RposType>(tempU64); } - if(hasSizedataInMap) //Using datasize field in map? + + // Read entry size. + if (m_nFixedEntrySize > 0) + mapData[i].nSize = m_nFixedEntrySize; + else if(GetFlag(RwfRMapHasSize)) // Map has datasize field. { + uint64 tempU64; ReadAdaptive1248(iStrm, tempU64); - mi.entrysize = tempU64; + if(tempU64 > Offtype_max) + { AddReadNote(SNR_INSUFFICIENT_STREAM_OFFTYPE); return; } + mapData[i].nSize = static_cast<DataSize>(tempU64); } + // If there's no entry startpos in map, count start pos from datasizes. + // Here readentry.rposStart is set to relative position from databegin. + if (mapData[i].nSize != invalidDatasize && GetFlag(RwfRMapHasStartpos) == false) + mapData[i].rposStart = (i > 0) ? mapData[i-1].rposStart + mapData[i-1].nSize : 0; - if(hasEntrydescriptionsInMap) //Map has entrydescriptions? + if(GetFlag(RwfRMapHasDesc)) //Map has entrydescriptions? { uint16 size = 0; ReadAdaptive12(iStrm, size); - - if(bytesPerDescchar != 1) - { - iStrm.ignore(size * bytesPerDescchar); //Ignoring. - mi.description = "Note: Entrydescription had twobytecharacters - ignored."; - } + if(GetFlag(RwfRTwoBytesDescChar)) + iStrm.ignore(size * 2); else - { - string temp; - ReadBytes(iStrm, temp, size); - mi.description = temp; - } + iStrm.ignore(size); } - - mapinfos.push_back(mi); } + m_posMapEnd = iStrm.tellg(); + if (m_fpLogFunc) + m_fpLogFunc(tstrEndOfMap, m_posMapEnd - m_posStart); } - if(hasMap && mapinfos.size() != entrycount && AddReadNote(SNR_MAPINFO_SIZE_ERROR)) - return m_Readnotes; - const uint64 mapendposRelative = (hasMap) ? iStrm.tellg()-startpos : mapbeginpos; - //If no map exists, tells the position of first byte after the data(i.e. outside - //the object). + SetFlag(RwfRMapCached, true); + m_posDataBegin = (m_rposMapBegin == m_rposEndofHdrData) ? m_posMapEnd : m_posStart + Postype(m_rposEndofHdrData); + m_pIstrm->seekg(m_posDataBegin); - //Goto data and read it - list<CMappinginfo>::iterator iter = mapinfos.begin(); - const list<CMappinginfo>::iterator iterend = mapinfos.end(); - iStrm.seekg(databeginpos); - const bool ignoreleadingnullsInIDComparison = Testbit(flagbyte, 4); - for(uint32 counter = 0; counter < entrycount; counter++) + // If there are no positions in the map but there are entry sizes, rposStart will + // be relative to data start. Now that posDataBegin is known, make them relative to + // startpos. + if (GetFlag(RwfRMapHasStartpos) == false && (GetFlag(RwfRMapHasSize) || m_nFixedEntrySize > 0)) { - POSTYPE dataitemStartposStrm = iStrm.tellg(); - if(!hasStartposInMap && !hasSizedataInMap && fixedsizeentries == 0) //No dataposition hints in map - trying plain 'in order'-read. - { - const CSerializationentry* pE = m_pSi->Read(iStrm, invalidDatasize, hasMap ? iter->id : vector<char>(), ignoreleadingnullsInIDComparison, hasIDsInMap, counter); - if(pE && pE->GetReadnote().size() > 0 && m_Readlogmask & SNT_NOTE) AddToLog(pE->GetReadnote().c_str()); - if(pE) - AddReadNote(pE->GetStreamer().GetLastReadinfo(), (hasMap) ? &(*iter) : 0); - else - AddReadNote(SNR_UNKNOWN_DATAENTRY, (hasMap) ? &(*iter) : 0); - - if(hasMap) iter++; - continue; - } - - uint64 datasize = invalidDatasize; - if(fixedsizeentries > 0) - { - Seekg(iStrm, startpos + databeginpos, counter * fixedsizeentries); - datasize = fixedsizeentries; - } - else - { - if(hasMap && iter->startpos != 0) Seekg(iStrm, startpos, iter->startpos); - if(hasMap) datasize = iter->entrysize; - } - - const CSerializationentry* pE = 0; - if(!hasMap) - { - pE = m_pSi->Read(iStrm, datasize, vector<char>(), ignoreleadingnullsInIDComparison, hasIDsInMap, counter); - } - else - { - pE = m_pSi->Read(iStrm, datasize, iter->id, ignoreleadingnullsInIDComparison, hasIDsInMap, counter); - } - - if(pE && pE->GetReadnote().size() > 0 && m_Readlogmask & SNT_NOTE) AddToLog(("Entry note: " + pE->GetReadnote()).c_str()); - if(pE) AddReadNote(pE->GetStreamer().GetLastReadinfo(), (hasMap) ? &(*iter) : 0); - else AddReadNote(SNR_UNKNOWN_DATAENTRY, (hasMap) ? &(*iter) : 0); - - iStrm.clear(); - - if(!hasStartposInMap && hasSizedataInMap) - Seekg(iStrm, dataitemStartposStrm, iter->entrysize); - - if(hasMap) iter++; - - + for(size_t i = 0; i < m_nReadEntrycount; i++) + mapData[i].rposStart += (m_posDataBegin - m_posStart); } - Seekg(iStrm, startpos, mapendposRelative); //Returning stream to the end of the objectstream. - return m_Readnotes; } -void CSSBSerialization::AddToLog(const char* str) -//------------------------------------------- -{ - if(m_pLogstring) *m_pLogstring += str + string("\n"); -} - -void CSSBSerialization::Seekg(INSTREAM& iStrm, const POSTYPE& startpos, int64 offset) -//-------------------------------------------------------------------------------------------------- +const ReadEntry* Ssb::Find(const void* pId, const size_t nIdLength) +//----------------------------------------------------------------- { - int64 curoff = startpos - iStrm.tellg() + offset; - if(curoff <= OFFTYPE_MAX && curoff >= OFFTYPE_MIN) - { - iStrm.seekg(static_cast<OFFTYPE>(curoff), CURPOS); - } - else - { - if(offset >= 0) - { - while(offset > OFFTYPE_MAX) {iStrm.seekg(OFFTYPE_MAX, CURPOS); offset -= OFFTYPE_MAX;} - iStrm.seekg(static_cast<OFFTYPE>(offset), CURPOS); - } - else - { - while(offset < OFFTYPE_MIN) {iStrm.seekg(OFFTYPE_MIN, CURPOS); offset -= OFFTYPE_MIN;} - iStrm.seekg(static_cast<OFFTYPE>(offset), CURPOS); - } - } -} + m_pIstrm->clear(); + if (GetFlag(RwfRMapCached) == false) + CacheMap(); + + if (m_nFixedEntrySize > 0 && GetFlag(RwfRMapHasStartpos) == false && GetFlag(RwfRMapHasSize) == false) + m_pIstrm->seekg(m_posDataBegin + Postype(m_nFixedEntrySize * m_nCounter)); - - -ABCSerializationInstructions::ABCSerializationInstructions(const char* objectClassID, - const size_t size, const uint64 version, const uint8 flags) : - m_CustomIDInstructionbyte(0), - m_BytesPerIDtype(1), - m_IncludeEntrydescriptionsInMap(true), - m_Usetimestamp(false), - m_UseVersion(true), - m_StartposInMap(false), - m_IncludeDatasizeentryInMap(true), - m_IgnoreLeadingNulls(false), - m_VersionRead(0), - m_VersionInstruction(version), - m_Fixedsizeentries(0), - m_Flags(flags), - m_Timestamp(0), - m_MaxReadCount(1000) -//------------------------------------------------------------------ -{ - m_ObjectClassID.resize(size); - std::copy(objectClassID, objectClassID+size, m_ObjectClassID.begin()); -} - - -ABCSerializationInstructions::~ABCSerializationInstructions() {} -//------------------------------------------------------------------ - - - -const srlztn::CSerializationentry* ABCSerializationInstructions::Read(INSTREAM& iStrm, - const uint64 size, const vector<char>& id, - const bool ignoreLeadingnulls, const bool mapHasIDs, - const uint64 entrycounter) -//--------------------------------------------------------------- -{ - CSerializationentry* p = 0; - for(size_t i = 0; SetNextentry(p); i++) + if (GetFlag(RwfRMapHasId) == true) { - if(!mapHasIDs) //Trying reading in order if no map ids. + const size_t nEntries = mapData.size(); + for(size_t i0 = 0; i0 < nEntries; i0++) { - if(i == entrycounter) + const size_t i = (i0 + m_nNextReadHint) % nEntries; + if (mapData[i].nIdLength == nIdLength && mapData[i].nIdpos < m_Idarray.size() && + memcmp(&m_Idarray[mapData[i].nIdpos], pId, mapData[i].nIdLength) == 0) { - p->Read(iStrm, size); - return p; + m_nNextReadHint = (i + 1) % nEntries; + if (mapData[i].rposStart != 0) + m_pIstrm->seekg(m_posStart + Postype(mapData[i].rposStart)); + return &mapData[i]; } - else continue; } - - if(!ignoreLeadingnulls) - { - if(p->GetID() == id) - { - p->Read(iStrm, size); - return p; - } - } - else //Ignore leading nulls when comparing. - { - const vector<char>& largerID = (p->GetID().size() > id.size()) ? p->GetID() : id; - const vector<char>& smallerID = (p->GetID().size() > id.size()) ? id : p->GetID(); - bool gotonext = false; - for(size_t j = smallerID.size(); j<largerID.size(); j++) - { - if(largerID[j] != 0) - {gotonext = true; break;} - } - if(gotonext) continue; - for(size_t j = 0; j<smallerID.size(); j++) - { - if(largerID[j] != smallerID[j]) - {gotonext = true; break;} - } - if(gotonext) continue; - p->Read(iStrm, size); - return p; - } } - return 0; + return nullptr; } -void ABCSerializationInstructions::AddEntry(CSerializationentry entry) -//---------------------------------------------------------- + +void Ssb::FinishWrite() +//--------------------- { - if(AreWriteInstructions() && entry.GetDescription().size() > 0) SetWritepropIncludeEntrydescriptionsInMap(true); - CSerializationentry* p = 0; - SetNextentry(p); - if(p == 0) //First entry? - { - if(m_Flags & OUTFLAG) - { - SetWritePropIDtypebytes((entry.GetID().size() > uint8_max) ? 255 : static_cast<uint8>(entry.GetID().size())); - if(entry.GetDescription().size() == 0) SetWritepropIncludeEntrydescriptionsInMap(false); - } - ProAddEntry(entry); - return; - } + OutStream& oStrm = *m_pOstrm; + const Postype posDataEnd = oStrm.tellp(); + if (m_posMapStart != Postype(0) && ((uint32)m_MapStream.pcount() > m_nMapReserveSize)) + { AddWriteNote(SNW_INSUFFICIENT_MAPSIZE); return; } + + if (m_posMapStart < 1) + m_posMapStart = oStrm.tellp(); + else + oStrm.seekp(m_posMapStart); - if(m_Flags & OUTFLAG) - { - uint16 maxIDbytes = static_cast<uint16>(p->m_Id.size()); + if (m_fpLogFunc) + m_fpLogFunc(tstrWritingMap, uint32(m_posMapStart - m_posStart)); - bool bytecountvaries = false; - while(SetNextentry(p)) - { - if(!bytecountvaries && p->m_Id.size() != maxIDbytes) - { - bytecountvaries = true; - } - maxIDbytes = max(maxIDbytes, static_cast<uint16>(p->m_Id.size())); - } - if(entry.GetID().size() != maxIDbytes) - { - if(entry.GetID().size() > maxIDbytes) maxIDbytes = static_cast<uint16>(entry.GetID().size()); - bytecountvaries = true; - } - if(bytecountvaries) - { - m_CustomIDInstructionbyte = 0; - if(maxIDbytes <= (uint16_max >> 1)) - m_CustomIDInstructionbyte = 1; - else - return; //Should never reach here - } - else - SetWritePropIDtypebytes((maxIDbytes > uint8_max) ? 255 : static_cast<uint8>(maxIDbytes)); - } - ProAddEntry(entry); -} + if(GetFlag(RwfRwHasMap)) //Write map + oStrm.write(m_MapStream.str(), m_MapStream.pcount()); + const Postype posMapEnd = oStrm.tellp(); + + // Write entry count. + oStrm.seekp(m_posEntrycount); + Binarywrite<size_t>(oStrm, (m_nCounter << 2) | 1, 2); - - - - -void ABCSerializationInstructions::SetWritePropIDtypebytes(const uint8 bc) -//------------------------------------------------------------- -{ - m_BytesPerIDtype = bc; - if(m_BytesPerIDtype > 2 && m_BytesPerIDtype != 4) //Using custom IDbytecount. - { - if(bc >> 7 != 0) m_CustomIDInstructionbyte = 1; //Too large fixed size ID - setting variable IDsize - else m_CustomIDInstructionbyte = bc << 1; + if (GetFlag(RwfRwHasMap)) + { // Write map start position. + oStrm.seekp(m_posMapPosField); + const uint64 rposMap = m_posMapStart - m_posStart; + Binarywrite<uint64>(oStrm, rposMap << 2 | 3); } -} + // Seek to end. + oStrm.seekp(max(posMapEnd, posDataEnd)); -CSerializationInstructions::CSerializationInstructions(const string& objectClass, - const uint64 version, const uint8 flags, const size_t entrycounthint) - : ABCSerializationInstructions(objectClass.c_str(), objectClass.size(), version, flags) -//----------------------------------------------------------------------------------------- -{ - m_Entries.reserve(entrycounthint); + if (m_fpLogFunc) + m_fpLogFunc(tstrEndOfStream, uint32(oStrm.tellp() - m_posStart)); } +} // namespace srlztn - - - -CSerializationentry* CSerializationInstructions::SetNextentry(CSerializationentry*& p) -//--------------------------------------------------------------------- -{ - if(m_Entries.size() == 0) return 0; - if(p == 0) return p = &m_Entries[0]; - - if(static_cast<size_t>(++p - &m_Entries[0]) < m_Entries.size()) - return p; - else - return 0; -} - - -const CSerial... [truncated message content] |
From: <sag...@us...> - 2009-08-15 15:39:50
|
Revision: 325 http://modplug.svn.sourceforge.net/modplug/?rev=325&view=rev Author: saga-games Date: 2009-08-15 15:39:31 +0000 (Sat, 15 Aug 2009) Log Message: ----------- [Ref] Code cleanup: Sample-related objects and variables are now called "samples" and not "instruments": - MODINSTRUMENT -> MODSAMPLE - MODSAMPLE's "name" char array actually contains the filename of the sample. - MODCHANNEL's pInstrument -> pModSample - Sample pointers pins -> pSmp - Ins[] -> Samples[] - A few more... Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/mptrack/view_com.cpp trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/Dlsbank.h trunk/OpenMPT/soundlib/LOAD_AMF.CPP trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/LOAD_DMF.CPP trunk/OpenMPT/soundlib/LOAD_DSM.CPP trunk/OpenMPT/soundlib/Load_669.cpp trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_far.cpp trunk/OpenMPT/soundlib/Load_gdm.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Load_mtm.cpp trunk/OpenMPT/soundlib/Load_okt.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/Load_ptm.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_stm.cpp trunk/OpenMPT/soundlib/Load_ult.cpp trunk/OpenMPT/soundlib/Load_wav.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.h Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-15 15:09:25 UTC (rev 324) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-15 15:39:31 UTC (rev 325) @@ -1793,7 +1793,7 @@ for(BYTE i = 0; i<ARRAYELEMCOUNT(penv->Keyboard); i++) { const SAMPLEINDEX smp = penv->Keyboard[i]; - if(smp <= m_pSndFile->GetNumSamples() && m_pSndFile->Ins[smp].uFlags & CHN_PANNING) + if(smp <= m_pSndFile->GetNumSamples() && m_pSndFile->Samples[smp].uFlags & CHN_PANNING) { smpPanningInUse = true; break; @@ -1812,7 +1812,7 @@ { const SAMPLEINDEX smp = penv->Keyboard[i]; if(smp <= m_pSndFile->GetNumSamples()) - m_pSndFile->Ins[smp].uFlags &= ~CHN_PANNING; + m_pSndFile->Samples[smp].uFlags &= ~CHN_PANNING; } m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_SAMPLEINFO | HINT_MODTYPE); Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-08-15 15:09:25 UTC (rev 324) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-08-15 15:39:31 UTC (rev 325) @@ -329,8 +329,8 @@ } else { UINT nmax = m_pSndFile->m_nSamples; - while ((nmax > 1) && (m_pSndFile->Ins[nmax].pSample == NULL) && (!m_pSndFile->m_szNames[nmax][0])) nmax--; - for (UINT i=1; i<=nmax; i++) if ((m_pSndFile->m_szNames[i][0]) || (m_pSndFile->Ins[i].pSample)) { + while ((nmax > 1) && (m_pSndFile->Samples[nmax].pSample == NULL) && (!m_pSndFile->m_szNames[nmax][0])) nmax--; + for (UINT i=1; i<=nmax; i++) if ((m_pSndFile->m_szNames[i][0]) || (m_pSndFile->Samples[i].pSample)) { wsprintf(s, "%02d: %s", i, m_pSndFile->m_szNames[i]); UINT n = m_CbnInstrument.AddString(s); if (n == m_nInstrument) nPos = n; Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-08-15 15:09:25 UTC (rev 324) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-08-15 15:39:31 UTC (rev 325) @@ -516,8 +516,8 @@ case IDC_COMBO_BASENOTE: if ((m_pSndFile) && (m_pSndFile->m_nType & MOD_TYPE_XM) && (m_nSample)) { - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; - UINT nFreqHz = CSoundFile::TransposeToFrequency(pins->RelativeTone, pins->nFineTune); + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; + UINT nFreqHz = CSoundFile::TransposeToFrequency(pSmp->RelativeTone, pSmp->nFineTune); wsprintf(pszText, "%ldHz", nFreqHz); return TRUE; } @@ -613,46 +613,46 @@ // Updating Values if (dwHintMask & (HINT_MODTYPE|HINT_SAMPLEINFO)) { - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; CHAR s[128]; DWORD d; // Length / Type - wsprintf(s, "%d-bit %s, len: %d", (pins->uFlags & CHN_16BIT) ? 16 : 8, (pins->uFlags & CHN_STEREO) ? "stereo" : "mono", pins->nLength); + wsprintf(s, "%d-bit %s, len: %d", (pSmp->uFlags & CHN_16BIT) ? 16 : 8, (pSmp->uFlags & CHN_STEREO) ? "stereo" : "mono", pSmp->nLength); SetDlgItemText(IDC_TEXT5, s); // Name memcpy(s, m_pSndFile->m_szNames[m_nSample], 32); s[31] = 0; SetDlgItemText(IDC_SAMPLE_NAME, s); // File Name - memcpy(s, pins->name, 22); + memcpy(s, pSmp->filename, 22); s[21] = 0; if (m_pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) s[0] = 0; SetDlgItemText(IDC_SAMPLE_FILENAME, s); // Volume - SetDlgItemInt(IDC_EDIT7, pins->nVolume >> 2); + SetDlgItemInt(IDC_EDIT7, pSmp->nVolume >> 2); // Global Volume - SetDlgItemInt(IDC_EDIT8, pins->nGlobalVol); + SetDlgItemInt(IDC_EDIT8, pSmp->nGlobalVol); // Panning - CheckDlgButton(IDC_CHECK1, (pins->uFlags & CHN_PANNING) ? MF_CHECKED : MF_UNCHECKED); + CheckDlgButton(IDC_CHECK1, (pSmp->uFlags & CHN_PANNING) ? MF_CHECKED : MF_UNCHECKED); //rewbs.fix36944 if (m_pSndFile->m_nType == MOD_TYPE_XM) { - SetDlgItemInt(IDC_EDIT9, pins->nPan); //displayed panning with XM is 0-256, just like MPT's internal engine + SetDlgItemInt(IDC_EDIT9, pSmp->nPan); //displayed panning with XM is 0-256, just like MPT's internal engine } else { - SetDlgItemInt(IDC_EDIT9, pins->nPan>>2); //displayed panning with anything but XM is 0-64 so we divide by 4 + SetDlgItemInt(IDC_EDIT9, pSmp->nPan>>2); //displayed panning with anything but XM is 0-64 so we divide by 4 } //end rewbs.fix36944 // FineTune / C-4 Speed / BaseNote int transp = 0; if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { - wsprintf(s, "%lu", pins->nC5Speed); + wsprintf(s, "%lu", pSmp->nC5Speed); m_EditFineTune.SetWindowText(s); - transp = CSoundFile::FrequencyToTranspose(pins->nC5Speed) >> 7; + transp = CSoundFile::FrequencyToTranspose(pSmp->nC5Speed) >> 7; } else { - SetDlgItemInt(IDC_EDIT5, (int)pins->nFineTune); - transp = (int)pins->RelativeTone; + SetDlgItemInt(IDC_EDIT5, (int)pSmp->nFineTune); + transp = (int)pSmp->RelativeTone; } int basenote = 60 - transp; if (basenote < BASENOTE_MIN) basenote = BASENOTE_MIN; @@ -660,25 +660,25 @@ basenote -= BASENOTE_MIN; if (basenote != m_CbnBaseNote.GetCurSel()) m_CbnBaseNote.SetCurSel(basenote); // AutoVibrato - m_ComboAutoVib.SetCurSel(pins->nVibType); - SetDlgItemInt(IDC_EDIT14, (UINT)pins->nVibSweep); - SetDlgItemInt(IDC_EDIT15, (UINT)pins->nVibDepth); - SetDlgItemInt(IDC_EDIT16, (UINT)pins->nVibRate); + m_ComboAutoVib.SetCurSel(pSmp->nVibType); + SetDlgItemInt(IDC_EDIT14, (UINT)pSmp->nVibSweep); + SetDlgItemInt(IDC_EDIT15, (UINT)pSmp->nVibDepth); + SetDlgItemInt(IDC_EDIT16, (UINT)pSmp->nVibRate); // Loop d = 0; - if (pins->uFlags & CHN_LOOP) d = (pins->uFlags & CHN_PINGPONGLOOP) ? 2 : 1; + if (pSmp->uFlags & CHN_LOOP) d = (pSmp->uFlags & CHN_PINGPONGLOOP) ? 2 : 1; m_ComboLoopType.SetCurSel(d); - wsprintf(s, "%lu", pins->nLoopStart); + wsprintf(s, "%lu", pSmp->nLoopStart); m_EditLoopStart.SetWindowText(s); - wsprintf(s, "%lu", pins->nLoopEnd); + wsprintf(s, "%lu", pSmp->nLoopEnd); m_EditLoopEnd.SetWindowText(s); // Sustain Loop d = 0; - if (pins->uFlags & CHN_SUSTAINLOOP) d = (pins->uFlags & CHN_PINGPONGSUSTAIN) ? 2 : 1; + if (pSmp->uFlags & CHN_SUSTAINLOOP) d = (pSmp->uFlags & CHN_PINGPONGSUSTAIN) ? 2 : 1; m_ComboSustainType.SetCurSel(d); - wsprintf(s, "%lu", pins->nSustainStart); + wsprintf(s, "%lu", pSmp->nSustainStart); m_EditSustainStart.SetWindowText(s); - wsprintf(s, "%lu", pins->nSustainEnd); + wsprintf(s, "%lu", pSmp->nSustainEnd); m_EditSustainEnd.SetWindowText(s); } if (!m_bInitialized) @@ -727,20 +727,20 @@ { BeginWaitCursor(); UINT flags = 0; - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; BEGIN_CRITICAL(); m_pSndFile->DestroySample(m_nSample); - pins->nLength = len; - pins->uFlags = RS_PCM8S; - pins->nGlobalVol = 64; - pins->nVolume = 256; - pins->nPan = 128; - pins->name[0] = 0; - if (!pins->nC5Speed) pins->nC5Speed = 22050; + pSmp->nLength = len; + pSmp->uFlags = RS_PCM8S; + pSmp->nGlobalVol = 64; + pSmp->nVolume = 256; + pSmp->nPan = 128; + pSmp->filename[0] = 0; + if (!pSmp->nC5Speed) pSmp->nC5Speed = 22050; if (dlg.m_nFormat & 1) { - pins->nLength >>= 1; - pins->uFlags |= CHN_16BIT; + pSmp->nLength >>= 1; + pSmp->uFlags |= CHN_16BIT; flags = RS_PCM16S; } if (!(dlg.m_nFormat & 2)) @@ -750,18 +750,18 @@ // Interleaved Stereo Sample if (dlg.m_nFormat & 4) { - pins->uFlags |= CHN_STEREO; - pins->nLength >>= 1; + pSmp->uFlags |= CHN_STEREO; + pSmp->nLength >>= 1; flags |= 0x40|RSF_STEREO; } LPSTR p16 = (LPSTR)lpFile; DWORD l16 = len; - if ((pins->uFlags & CHN_16BIT) && (len & 1)) + if ((pSmp->uFlags & CHN_16BIT) && (len & 1)) { p16++; l16--; } - if (m_pSndFile->ReadSample(pins, flags, p16, l16)) + if (m_pSndFile->ReadSample(pSmp, flags, p16, l16)) { bOk = TRUE; } @@ -774,9 +774,9 @@ EndWaitCursor(); if (bOk) { - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; CMainFrame::SetWorkingDirectory(lpszFileName, DIR_SAMPLES, true); - if (!pins->name[0]) + if (!pSmp->filename[0]) { CHAR szFullFilename[_MAX_PATH]; _splitpath(lpszFileName, 0, 0, szName, szExt); @@ -797,12 +797,12 @@ if (strlen(szFullFilename) < 9) strcat(szFullFilename, szExt); } szFullFilename[21] = 0; - memcpy(pins->name, szFullFilename, 22); + memcpy(pSmp->filename, szFullFilename, 22); } - if ((m_pSndFile->m_nType & MOD_TYPE_XM) && (!(pins->uFlags & CHN_PANNING))) + if ((m_pSndFile->m_nType & MOD_TYPE_XM) && (!(pSmp->uFlags & CHN_PANNING))) { - pins->nPan = 128; - pins->uFlags |= CHN_PANNING; + pSmp->nPan = 128; + pSmp->uFlags |= CHN_PANNING; } // 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h] m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA | HINT_SAMPLEINFO | HINT_SMPNAMES, NULL); @@ -823,11 +823,11 @@ BEGIN_CRITICAL(); m_pSndFile->DestroySample(m_nSample); m_pSndFile->ReadSampleFromSong(m_nSample, pSndFile, nSample); - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; - if ((m_pSndFile->m_nType & MOD_TYPE_XM) && (!(pins->uFlags & CHN_PANNING))) + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; + if ((m_pSndFile->m_nType & MOD_TYPE_XM) && (!(pSmp->uFlags & CHN_PANNING))) { - pins->nPan = 128; - pins->uFlags |= CHN_PANNING; + pSmp->nPan = 128; + pSmp->uFlags |= CHN_PANNING; } END_CRITICAL(); // 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h] @@ -978,14 +978,14 @@ if(!bBatchSave) { // save this sample - if ((!m_nSample) || (!m_pSndFile->Ins[m_nSample].pSample)) + if ((!m_nSample) || (!m_pSndFile->Samples[m_nSample].pSample)) { SwitchToView(); return; } if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { - memcpy(szFileName, m_pSndFile->Ins[m_nSample].name, 22); + memcpy(szFileName, m_pSndFile->Samples[m_nSample].filename, 22); szFileName[22] = 0; } else { @@ -1038,7 +1038,7 @@ for(UINT iSmp = iMinSmp; iSmp <= iMaxSmp; iSmp++) { - if (m_pSndFile->Ins[iSmp].pSample) + if (m_pSndFile->Samples[iSmp].pSample) { if(bBatchSave) { @@ -1046,7 +1046,7 @@ sSampleNumber.Format(sNumberFormat, iSmp); sSampleName = (m_pSndFile->m_szNames[iSmp]) ? m_pSndFile->m_szNames[iSmp] : "untitled"; - sSampleFilename = (m_pSndFile->Ins[iSmp].name[0]) ? m_pSndFile->Ins[iSmp].name : m_pSndFile->m_szNames[iSmp]; + sSampleFilename = (m_pSndFile->Samples[iSmp].filename[0]) ? m_pSndFile->Samples[iSmp].filename : m_pSndFile->m_szNames[iSmp]; for(UINT i = 0; i < sForbiddenChars.GetLength(); i++) { sSampleName.Remove(sForbiddenChars.GetAt(i)); @@ -1129,29 +1129,29 @@ for(UINT iSmp = iMinSample; iSmp <= iMaxSample; iSmp++) { - if (m_pSndFile->Ins[iSmp].pSample) + if (m_pSndFile->Samples[iSmp].pSample) { BOOL bOk = FALSE; - MODINSTRUMENT *pins = &m_pSndFile->Ins[iSmp]; + MODSAMPLE *pSmp = &m_pSndFile->Samples[iSmp]; if(iMinSample != iMaxSample) { //if more than one sample is selected, always amplify the whole sample. iStart = 0; - iEnd = pins->nLength; + iEnd = pSmp->nLength; } else { //one sample: correct the boundaries, if needed - if (iEnd > pins->nLength) iEnd = pins->nLength; + if (iEnd > pSmp->nLength) iEnd = pSmp->nLength; if (iStart > iEnd) iStart = iEnd; if (iStart == iEnd) { iStart = 0; - iEnd = pins->nLength; + iEnd = pSmp->nLength; } } - if (pins->uFlags & CHN_STEREO) { iStart *= 2; iEnd *= 2; } + if (pSmp->uFlags & CHN_STEREO) { iStart *= 2; iEnd *= 2; } - if (pins->uFlags & CHN_16BIT) + if (pSmp->uFlags & CHN_16BIT) { - signed short *p = (signed short *)pins->pSample; + signed short *p = (signed short *)pSmp->pSample; int max = 1; for (UINT i = iStart; i < iEnd; i++) { @@ -1170,7 +1170,7 @@ } } else { - signed char *p = (signed char *)pins->pSample; + signed char *p = (signed char *)pSmp->pSample; int max = 1; for (UINT i = iStart; i < iEnd; i++) { @@ -1211,29 +1211,29 @@ { SAMPLEVIEWSTATE viewstate; DWORD dwStart, dwEnd; - MODINSTRUMENT *pins; + MODSAMPLE *pSmp; memset(&viewstate, 0, sizeof(viewstate)); SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate); - if ((!m_pModDoc) || (!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) return; + if ((!m_pModDoc) || (!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return; BeginWaitCursor(); - pins = &m_pSndFile->Ins[m_nSample]; + pSmp = &m_pSndFile->Samples[m_nSample]; dwStart = viewstate.dwBeginSel; dwEnd = viewstate.dwEndSel; - if (dwEnd > pins->nLength) dwEnd = pins->nLength; + if (dwEnd > pSmp->nLength) dwEnd = pSmp->nLength; if (dwStart > dwEnd) dwStart = dwEnd; if (dwStart >= dwEnd) { dwStart = 0; - dwEnd = pins->nLength; + dwEnd = pSmp->nLength; } - if (pins->uFlags & CHN_STEREO) { dwStart *= 2; dwEnd *= 2; } + if (pSmp->uFlags & CHN_STEREO) { dwStart *= 2; dwEnd *= 2; } UINT len = dwEnd - dwStart; if ((bFadeIn) && (bFadeOut)) lAmp *= 4; - if (pins->uFlags & CHN_16BIT) + if (pSmp->uFlags & CHN_16BIT) { - signed short *p = ((signed short *)pins->pSample) + dwStart; + signed short *p = ((signed short *)pSmp->pSample) + dwStart; for (UINT i=0; i<len; i++) { @@ -1246,7 +1246,7 @@ } } else { - signed char *p = ((signed char *)pins->pSample) + dwStart; + signed char *p = ((signed char *)pSmp->pSample) + dwStart; for (UINT i=0; i<len; i++) { @@ -1298,20 +1298,20 @@ { UINT iStart, iEnd; - if( m_pSndFile->Ins[iSmp].pSample == nullptr ) + if( m_pSndFile->Samples[iSmp].pSample == nullptr ) continue; if (iMinSample != iMaxSample) { iStart = 0; - iEnd = m_pSndFile->Ins[iSmp].nLength; + iEnd = m_pSndFile->Samples[iSmp].nLength; } else { iStart = viewstate.dwBeginSel; iEnd = viewstate.dwEndSel; } - const float fOffset = ctrlSmp::RemoveDCOffset(m_pSndFile->Ins[iSmp], iStart, iEnd, m_pSndFile->GetType(), m_pSndFile); + const float fOffset = ctrlSmp::RemoveDCOffset(m_pSndFile->Samples[iSmp], iStart, iEnd, m_pSndFile->GetType(), m_pSndFile); if(fOffset == 0.0f) // No offset removed. continue; @@ -1371,38 +1371,38 @@ //----------------------------- { SAMPLEVIEWSTATE viewstate; - MODINSTRUMENT *pins; + MODSAMPLE *pSmp; DWORD dwStart, dwEnd, dwNewLen; UINT smplsize, newsmplsize; PVOID pOriginal, pNewSample; SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate); - if ((!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) return; + if ((!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return; BeginWaitCursor(); - pins = &m_pSndFile->Ins[m_nSample]; + pSmp = &m_pSndFile->Samples[m_nSample]; dwStart = viewstate.dwBeginSel; dwEnd = viewstate.dwEndSel; - if (dwEnd > pins->nLength) dwEnd = pins->nLength; + if (dwEnd > pSmp->nLength) dwEnd = pSmp->nLength; if (dwStart >= dwEnd) { dwStart = 0; - dwEnd = pins->nLength; + dwEnd = pSmp->nLength; } - smplsize = (pins->uFlags & CHN_16BIT) ? 2 : 1; - if (pins->uFlags & CHN_STEREO) smplsize *= 2; - newsmplsize = (pins->uFlags & CHN_STEREO) ? 4 : 2; - pOriginal = pins->pSample; - dwNewLen = pins->nLength + (dwEnd-dwStart); + smplsize = (pSmp->uFlags & CHN_16BIT) ? 2 : 1; + if (pSmp->uFlags & CHN_STEREO) smplsize *= 2; + newsmplsize = (pSmp->uFlags & CHN_STEREO) ? 4 : 2; + pOriginal = pSmp->pSample; + dwNewLen = pSmp->nLength + (dwEnd-dwStart); pNewSample = NULL; if (dwNewLen+4 <= MAX_SAMPLE_LENGTH) pNewSample = CSoundFile::AllocateSample((dwNewLen+4)*newsmplsize); if (pNewSample) { - UINT nCh = (pins->uFlags & CHN_STEREO) ? 2 : 1; + UINT nCh = (pSmp->uFlags & CHN_STEREO) ? 2 : 1; for (UINT iCh=0; iCh<nCh; iCh++) { int len = dwEnd-dwStart; - int maxndx = pins->nLength; - if (pins->uFlags & CHN_16BIT) + int maxndx = pSmp->nLength; + if (pSmp->uFlags & CHN_16BIT) { signed short *psrc = ((signed short *)pOriginal)+iCh; signed short *pdest = ((signed short *)pNewSample)+dwStart*nCh+iCh; @@ -1446,10 +1446,10 @@ } } } - if (pins->uFlags & CHN_16BIT) + if (pSmp->uFlags & CHN_16BIT) { if (dwStart > 0) memcpy(pNewSample, pOriginal, dwStart*smplsize); - if (dwEnd < pins->nLength) memcpy(((LPSTR)pNewSample)+(dwStart+(dwEnd-dwStart)*2)*smplsize, ((LPSTR)pOriginal)+(dwEnd*smplsize), (pins->nLength-dwEnd)*smplsize); + if (dwEnd < pSmp->nLength) memcpy(((LPSTR)pNewSample)+(dwStart+(dwEnd-dwStart)*2)*smplsize, ((LPSTR)pOriginal)+(dwEnd*smplsize), (pSmp->nLength-dwEnd)*smplsize); } else { if (dwStart > 0) @@ -1459,23 +1459,23 @@ ((signed short *)pNewSample)[i] = (signed short)(((signed char *)pOriginal)[i] << 8); } } - if (dwEnd < pins->nLength) + if (dwEnd < pSmp->nLength) { signed short *pdest = ((signed short *)pNewSample) + (dwEnd-dwStart)*nCh; - for (UINT i=dwEnd*nCh; i<pins->nLength*nCh; i++) + for (UINT i=dwEnd*nCh; i<pSmp->nLength*nCh; i++) { pdest[i] = (signed short)(((signed char *)pOriginal)[i] << 8); } } } - if (pins->nLoopStart >= dwEnd) pins->nLoopStart += (dwEnd-dwStart); else - if (pins->nLoopStart > dwStart) pins->nLoopStart += (pins->nLoopStart - dwStart); - if (pins->nLoopEnd >= dwEnd) pins->nLoopEnd += (dwEnd-dwStart); else - if (pins->nLoopEnd > dwStart) pins->nLoopEnd += (pins->nLoopEnd - dwStart); - if (pins->nSustainStart >= dwEnd) pins->nSustainStart += (dwEnd-dwStart); else - if (pins->nSustainStart > dwStart) pins->nSustainStart += (pins->nSustainStart - dwStart); - if (pins->nSustainEnd >= dwEnd) pins->nSustainEnd += (dwEnd-dwStart); else - if (pins->nSustainEnd > dwStart) pins->nSustainEnd += (pins->nSustainEnd - dwStart); + if (pSmp->nLoopStart >= dwEnd) pSmp->nLoopStart += (dwEnd-dwStart); else + if (pSmp->nLoopStart > dwStart) pSmp->nLoopStart += (pSmp->nLoopStart - dwStart); + if (pSmp->nLoopEnd >= dwEnd) pSmp->nLoopEnd += (dwEnd-dwStart); else + if (pSmp->nLoopEnd > dwStart) pSmp->nLoopEnd += (pSmp->nLoopEnd - dwStart); + if (pSmp->nSustainStart >= dwEnd) pSmp->nSustainStart += (dwEnd-dwStart); else + if (pSmp->nSustainStart > dwStart) pSmp->nSustainStart += (pSmp->nSustainStart - dwStart); + if (pSmp->nSustainEnd >= dwEnd) pSmp->nSustainEnd += (dwEnd-dwStart); else + if (pSmp->nSustainEnd > dwStart) pSmp->nSustainEnd += (pSmp->nSustainEnd - dwStart); BEGIN_CRITICAL(); for (UINT iFix=0; iFix<MAX_CHANNELS; iFix++) { @@ -1486,15 +1486,15 @@ m_pSndFile->Chn[iFix].dwFlags |= CHN_16BIT; } } - pins->uFlags |= CHN_16BIT; - pins->pSample = (LPSTR)pNewSample; - pins->nLength = dwNewLen; + pSmp->uFlags |= CHN_16BIT; + pSmp->pSample = (LPSTR)pNewSample; + pSmp->nLength = dwNewLen; if (viewstate.dwEndSel <= viewstate.dwBeginSel) { if(!(m_pSndFile->m_nType & MOD_TYPE_MOD)) { - if (pins->nC5Speed < 200000) pins->nC5Speed *= 2; - if (pins->RelativeTone < 84) pins->RelativeTone += 12; + if (pSmp->nC5Speed < 200000) pSmp->nC5Speed *= 2; + if (pSmp->RelativeTone < 84) pSmp->RelativeTone += 12; } } CSoundFile::FreeSample(pOriginal); @@ -1519,39 +1519,39 @@ //------------------------------- { SAMPLEVIEWSTATE viewstate; - MODINSTRUMENT *pins; + MODSAMPLE *pSmp; DWORD dwStart, dwEnd, dwRemove, dwNewLen; UINT smplsize; PVOID pOriginal, pNewSample; SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate); - if ((!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) return; + if ((!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return; BeginWaitCursor(); - pins = &m_pSndFile->Ins[m_nSample]; + pSmp = &m_pSndFile->Samples[m_nSample]; dwStart = viewstate.dwBeginSel; dwEnd = viewstate.dwEndSel; - if (dwEnd > pins->nLength) dwEnd = pins->nLength; + if (dwEnd > pSmp->nLength) dwEnd = pSmp->nLength; if (dwStart >= dwEnd) { dwStart = 0; - dwEnd = pins->nLength; + dwEnd = pSmp->nLength; } - smplsize = (pins->uFlags & CHN_16BIT) ? 2 : 1; - if (pins->uFlags & CHN_STEREO) smplsize *= 2; - pOriginal = pins->pSample; + smplsize = (pSmp->uFlags & CHN_16BIT) ? 2 : 1; + if (pSmp->uFlags & CHN_STEREO) smplsize *= 2; + pOriginal = pSmp->pSample; dwRemove = (dwEnd-dwStart+1)>>1; - dwNewLen = pins->nLength - dwRemove; + dwNewLen = pSmp->nLength - dwRemove; dwEnd = dwStart+dwRemove*2; pNewSample = NULL; if ((dwNewLen > 32) && (dwRemove)) pNewSample = CSoundFile::AllocateSample((dwNewLen+4)*smplsize); if (pNewSample) { - UINT nCh = (pins->uFlags & CHN_STEREO) ? 2 : 1; + UINT nCh = (pSmp->uFlags & CHN_STEREO) ? 2 : 1; for (UINT iCh=0; iCh<nCh; iCh++) { int len = dwRemove; - int maxndx = pins->nLength; - if (pins->uFlags & CHN_16BIT) + int maxndx = pSmp->nLength; + if (pSmp->uFlags & CHN_16BIT) { signed short *psrc = ((signed short *)pOriginal)+iCh; signed short *pdest = ((signed short *)pNewSample)+dwStart*nCh+iCh; @@ -1594,17 +1594,17 @@ } } if (dwStart > 0) memcpy(pNewSample, pOriginal, dwStart*smplsize); - if (dwEnd < pins->nLength) memcpy(((LPSTR)pNewSample)+(dwStart+dwRemove)*smplsize, ((LPSTR)pOriginal)+((dwStart+dwRemove*2)*smplsize), (pins->nLength-dwEnd)*smplsize); - if (pins->nLoopStart >= dwEnd) pins->nLoopStart -= dwRemove; else - if (pins->nLoopStart > dwStart) pins->nLoopStart -= (pins->nLoopStart - dwStart)/2; - if (pins->nLoopEnd >= dwEnd) pins->nLoopEnd -= dwRemove; else - if (pins->nLoopEnd > dwStart) pins->nLoopEnd -= (pins->nLoopEnd - dwStart)/2; - if (pins->nLoopEnd > dwNewLen) pins->nLoopEnd = dwNewLen; - if (pins->nSustainStart >= dwEnd) pins->nSustainStart -= dwRemove; else - if (pins->nSustainStart > dwStart) pins->nSustainStart -= (pins->nSustainStart - dwStart)/2; - if (pins->nSustainEnd >= dwEnd) pins->nSustainEnd -= dwRemove; else - if (pins->nSustainEnd > dwStart) pins->nSustainEnd -= (pins->nSustainEnd - dwStart)/2; - if (pins->nSustainEnd > dwNewLen) pins->nSustainEnd = dwNewLen; + if (dwEnd < pSmp->nLength) memcpy(((LPSTR)pNewSample)+(dwStart+dwRemove)*smplsize, ((LPSTR)pOriginal)+((dwStart+dwRemove*2)*smplsize), (pSmp->nLength-dwEnd)*smplsize); + if (pSmp->nLoopStart >= dwEnd) pSmp->nLoopStart -= dwRemove; else + if (pSmp->nLoopStart > dwStart) pSmp->nLoopStart -= (pSmp->nLoopStart - dwStart)/2; + if (pSmp->nLoopEnd >= dwEnd) pSmp->nLoopEnd -= dwRemove; else + if (pSmp->nLoopEnd > dwStart) pSmp->nLoopEnd -= (pSmp->nLoopEnd - dwStart)/2; + if (pSmp->nLoopEnd > dwNewLen) pSmp->nLoopEnd = dwNewLen; + if (pSmp->nSustainStart >= dwEnd) pSmp->nSustainStart -= dwRemove; else + if (pSmp->nSustainStart > dwStart) pSmp->nSustainStart -= (pSmp->nSustainStart - dwStart)/2; + if (pSmp->nSustainEnd >= dwEnd) pSmp->nSustainEnd -= dwRemove; else + if (pSmp->nSustainEnd > dwStart) pSmp->nSustainEnd -= (pSmp->nSustainEnd - dwStart)/2; + if (pSmp->nSustainEnd > dwNewLen) pSmp->nSustainEnd = dwNewLen; BEGIN_CRITICAL(); for (UINT iFix=0; iFix<MAX_CHANNELS; iFix++) { @@ -1619,12 +1619,12 @@ { if(!(m_pSndFile->m_nType & MOD_TYPE_MOD)) { - if (pins->nC5Speed > 2000) pins->nC5Speed /= 2; - if (pins->RelativeTone > -84) pins->RelativeTone -= 12; + if (pSmp->nC5Speed > 2000) pSmp->nC5Speed /= 2; + if (pSmp->RelativeTone > -84) pSmp->RelativeTone -= 12; } } - pins->nLength = dwNewLen; - pins->pSample = (LPSTR)pNewSample; + pSmp->nLength = dwNewLen; + pSmp->pSample = (LPSTR)pNewSample; CSoundFile::FreeSample(pOriginal); END_CRITICAL(); m_pModDoc->AdjustEndOfSample(m_nSample); @@ -1711,23 +1711,23 @@ void CCtrlSamples::OnEstimateSampleSize() { - if((!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) return; - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; - if(!pins) return; + if((!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return; + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; + if(!pSmp) return; //rewbs.timeStretchMods //Ensure m_dTimeStretchRatio is up-to-date with textbox content UpdateData(TRUE); //Calculate/verify samplerate at C4. - long lSampleRate = pins->nC5Speed; + long lSampleRate = pSmp->nC5Speed; if(m_pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) - lSampleRate = (double)CSoundFile::TransposeToFrequency(pins->RelativeTone, pins->nFineTune); + lSampleRate = (double)CSoundFile::TransposeToFrequency(pSmp->RelativeTone, pSmp->nFineTune); if(lSampleRate <= 0) lSampleRate = 8363.0; //Open dialog - CPSRatioCalc dlg(pins->nLength, lSampleRate, + CPSRatioCalc dlg(pSmp->nLength, lSampleRate, m_pSndFile->m_nMusicSpeed, m_pSndFile->m_nMusicTempo, m_pSndFile->m_nRowsPerBeat, m_pSndFile->m_nTempoMode, m_dTimeStretchRatio, this); @@ -1745,18 +1745,18 @@ // Error management int errorcode = -1; - if((!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) goto error; - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; - if(!pins || pins->nLength == 0) goto error; + if((!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) goto error; + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; + if(!pSmp || pSmp->nLength == 0) goto error; // Preview management if(IsDlgButtonChecked(IDC_CHECK2)){ // Free previous undo buffer if(pSampleUndoBuffer) CSoundFile::FreeSample(pSampleUndoBuffer); // Allocate sample undo buffer - BYTE smpsize = (pins->uFlags & CHN_16BIT) ? 2 : 1; - UINT nChn = (pins->uFlags & CHN_STEREO) ? 2 : 1; - UndoBufferSize = pins->nLength * nChn * smpsize; + BYTE smpsize = (pSmp->uFlags & CHN_16BIT) ? 2 : 1; + UINT nChn = (pSmp->uFlags & CHN_STEREO) ? 2 : 1; + UndoBufferSize = pSmp->nLength * nChn * smpsize; pSampleUndoBuffer = CSoundFile::AllocateSample(UndoBufferSize); // Not enough memory... if(pSampleUndoBuffer == NULL){ @@ -1765,7 +1765,7 @@ goto error; } // Copy sample to sample undo buffer - memcpy(pSampleUndoBuffer,pins->pSample,UndoBufferSize); + memcpy(pSampleUndoBuffer,pSmp->pSample,UndoBufferSize); } // Time stretching @@ -1777,10 +1777,10 @@ //Update loop points only if no error occured. if(errorcode == 0) { - pins->nLoopStart *= m_dTimeStretchRatio/100.0; - pins->nLoopEnd *= m_dTimeStretchRatio/100.0; - pins->nSustainStart *= m_dTimeStretchRatio/100.0; - pins->nSustainEnd *= m_dTimeStretchRatio/100.0; + pSmp->nLoopStart *= m_dTimeStretchRatio/100.0; + pSmp->nLoopEnd *= m_dTimeStretchRatio/100.0; + pSmp->nSustainStart *= m_dTimeStretchRatio/100.0; + pSmp->nSustainEnd *= m_dTimeStretchRatio/100.0; } //end rewbs.timeStretchMods @@ -1881,14 +1881,14 @@ void CCtrlSamples::OnPitchShiftTimeStretchCancel() { - if((!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) return; - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; - if(!pins) return; + if((!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return; + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; + if(!pSmp) return; // Save processed sample buffer pointer - PVOID oldbuffer = pins->pSample; - BYTE smpsize = (pins->uFlags & CHN_16BIT) ? 2 : 1; - UINT nChn = (pins->uFlags & CHN_STEREO) ? 2 : 1; + PVOID oldbuffer = pSmp->pSample; + BYTE smpsize = (pSmp->uFlags & CHN_16BIT) ? 2 : 1; + UINT nChn = (pSmp->uFlags & CHN_STEREO) ? 2 : 1; // Restore undo buffer pointer & update song data BEGIN_CRITICAL(); @@ -1899,18 +1899,18 @@ m_pSndFile->Chn[i].nLength = 0; } } - pins->pSample = (LPSTR)pSampleUndoBuffer; - pins->nLength = UndoBufferSize / (smpsize * nChn); + pSmp->pSample = (LPSTR)pSampleUndoBuffer; + pSmp->nLength = UndoBufferSize / (smpsize * nChn); //rewbs.timeStretchMods // Restore loop points, if they were time stretched: // Note: m_dTimeStretchRatio will not have changed since we disable // GUI controls until preview is accepted/restored. if(IsDlgButtonChecked(IDC_CHECK3)) { - pins->nLoopStart /= m_dTimeStretchRatio/100.0; - pins->nLoopEnd /= m_dTimeStretchRatio/100.0; - pins->nSustainStart /= m_dTimeStretchRatio/100.0; - pins->nSustainEnd /= m_dTimeStretchRatio/100.0; + pSmp->nLoopStart /= m_dTimeStretchRatio/100.0; + pSmp->nLoopEnd /= m_dTimeStretchRatio/100.0; + pSmp->nSustainStart /= m_dTimeStretchRatio/100.0; + pSmp->nSustainEnd /= m_dTimeStretchRatio/100.0; } //end rewbs.timeStretchMods @@ -1931,11 +1931,11 @@ int CCtrlSamples::TimeStretch(double ratio) //----------------------------------------- { - if((!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) return -1; - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; - if(!pins) return -1; + if((!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return -1; + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; + if(!pSmp) return -1; - const uint32 nSampleRate = pins->GetSampleRate(m_pSndFile->GetType()); + const uint32 nSampleRate = pSmp->GetSampleRate(m_pSndFile->GetType()); // SoundTouch(v1.4.0) documentation says that sample rates 8000-48000 are supported. // Check whether sample rate is within that range, and if not, @@ -1951,13 +1951,13 @@ // Stretching is implemented only for 16-bit samples. Return with // error if trying to use wtih non 16-bit samples. - if(pins->GetElementarySampleSize() != 2) + if(pSmp->GetElementarySampleSize() != 2) return 4; // SoundTouch(1.3.1) seems to crash with short samples. Don't know what // the actual limit or whether it depends on sample rate, // but simply set some semiarbitrary threshold here. - if(pins->nLength < 256) + if(pSmp->nLength < 256) return 6; // Refuse processing when ratio is negative, equal to zero or equal to 1.0 @@ -1980,14 +1980,14 @@ } // Get number of channels & sample size - const BYTE smpsize = pins->GetElementarySampleSize(); - const UINT nChn = pins->GetNumChannels(); + const BYTE smpsize = pSmp->GetElementarySampleSize(); + const UINT nChn = pSmp->GetNumChannels(); // Allocate new sample. Returned sample may not be exactly the size what ratio would suggest // so allocate a bit more(1.03*). - const DWORD nNewSampleLength = (DWORD)(1.03 * ratio * (double)pins->nLength); - //const DWORD nNewSampleLength = (DWORD)(0.5 + ratio * (double)pins->nLength); - PVOID pSample = pins->pSample; + const DWORD nNewSampleLength = (DWORD)(1.03 * ratio * (double)pSmp->nLength); + //const DWORD nNewSampleLength = (DWORD)(0.5 + ratio * (double)pSmp->nLength); + PVOID pSample = pSmp->pSample; PVOID pNewSample = CSoundFile::AllocateSample(nNewSampleLength * nChn * smpsize); if(pNewSample == NULL) { @@ -2064,14 +2064,14 @@ UINT nLengthCounter = 0; // Process sample in steps. - while(pos < pins->nLength) + while(pos < pSmp->nLength) { // Current chunk size limit test - if(len >= pins->nLength - pos) len = pins->nLength - pos; + if(len >= pSmp->nLength - pos) len = pSmp->nLength - pos; // Show progress bar using process button painting & text label CHAR progress[16]; - float percent = 100.0f * (pos + len) / pins->nLength; + float percent = 100.0f * (pos + len) / pSmp->nLength; progressBarRECT.right = processButtonRect.left + (int)percent * (processButtonRect.right - processButtonRect.left) / 100; wsprintf(progress,"%d%%",(UINT)percent); @@ -2084,7 +2084,7 @@ ::GdiFlush(); // Send sampledata for processing. - pSoundTouch->putSamples(reinterpret_cast<int16*>(pins->pSample + pos * smpsize * nChn), len); + pSoundTouch->putSamples(reinterpret_cast<int16*>(pSmp->pSample + pos * smpsize * nChn), len); // Receive some processed samples (it's not guaranteed that there is any available). nLengthCounter += pSoundTouch->receiveSamples(reinterpret_cast<int16*>(pNewSample) + nChn * nLengthCounter, nNewSampleLength - nLengthCounter); @@ -2112,9 +2112,9 @@ m_pSndFile->Chn[i].nLength = 0; } } - pins->pSample = (LPSTR)pNewSample; + pSmp->pSample = (LPSTR)pNewSample; CSoundFile::FreeSample(pSample); - pins->nLength = min(nLengthCounter, nNewSampleLength); + pSmp->nLength = min(nLengthCounter, nNewSampleLength); END_CRITICAL(); // Free progress bar brushes @@ -2134,22 +2134,22 @@ int CCtrlSamples::PitchShift(float pitch) //--------------------------------------- { - if((!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) return -1; + if((!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return -1; if(pitch < 0.5f) return 1 + (1<<8); if(pitch > 2.0f) return 1 + (2<<8); // Get sample struct pointer - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; - if(!pins) return 2; + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; + if(!pSmp) return 2; // PitchShift seems to work only with 16-bit samples. Return with // error if trying to use non 16-bit samples. - if(pins->GetElementarySampleSize() != 2) + if(pSmp->GetElementarySampleSize() != 2) return 4; // Get number of channels & sample size - BYTE smpsize = (pins->uFlags & CHN_16BIT) ? 2 : 1; - UINT nChn = (pins->uFlags & CHN_STEREO) ? 2 : 1; + BYTE smpsize = (pSmp->uFlags & CHN_16BIT) ? 2 : 1; + UINT nChn = (pSmp->uFlags & CHN_STEREO) ? 2 : 1; // Get selected oversampling - quality - (also refered as FFT overlapping) factor CComboBox *combo = (CComboBox *)GetDlgItem(IDC_COMBO5); @@ -2161,8 +2161,8 @@ while(fft > MAX_BUFFER_LENGTH) fft >>= 1; // Get original sample rate - long lSampleRate = pins->nC5Speed; - if(m_pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) lSampleRate = CSoundFile::TransposeToFrequency(pins->RelativeTone, pins->nFineTune); + long lSampleRate = pSmp->nC5Speed; + if(m_pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) lSampleRate = CSoundFile::TransposeToFrequency(pSmp->RelativeTone, pSmp->nFineTune); if(lSampleRate <= 0) lSampleRate = 8363; // Deduce max sample value (float conversion step) @@ -2202,10 +2202,10 @@ // Process sample buffer using MAX_BUFFER_LENGTH (max) sized chunk steps (in order to allow // the processing of BIG samples...) - while(pos < pins->nLength){ + while(pos < pSmp->nLength){ // Current chunk size limit test - if(pos + len >= pins->nLength) len = pins->nLength - pos; + if(pos + len >= pSmp->nLength) len = pSmp->nLength - pos; // TRICK : output buffer offset management // as the pitch-shifter adds some blank signal in head of output buffer (matching FFT @@ -2216,14 +2216,14 @@ // FFT data computed during the previous steps resulting in a correct and consistent // signal output). bool bufstart = ( pos == 0 ); - bool bufend = ( pos + MAX_BUFFER_LENGTH >= pins->nLength ); + bool bufend = ( pos + MAX_BUFFER_LENGTH >= pSmp->nLength ); UINT startoffset = ( bufstart ? fft : 0 ); UINT inneroffset = ( bufstart ? 0 : fft ); UINT finaloffset = ( bufend ? fft : 0 ); // Show progress bar using process button painting & text label CHAR progress[16]; - float percent = (float)i * 50.0f + (100.0f / nChn) * (pos + len) / pins->nLength; + float percent = (float)i * 50.0f + (100.0f / nChn) * (pos + len) / pSmp->nLength; progressBarRECT.right = processButtonRect.left + (int)percent * (processButtonRect.right - processButtonRect.left) / 100; wsprintf(progress,"%d%%",(UINT)percent); @@ -2242,7 +2242,7 @@ } // Convert current channel's data chunk to float - BYTE * ptr = (BYTE *)pins->pSample + pos * smpsize * nChn + i * smpsize; + BYTE * ptr = (BYTE *)pSmp->pSample + pos * smpsize * nChn + i * smpsize; for(UINT j = 0 ; j < len ; j++){ switch(smpsize){ @@ -2263,7 +2263,7 @@ smbPitchShift(pitch, len + finaloffset, fft, ovs, (float)lSampleRate, buffer, outbuf, false); // Restore pitched-shifted float sample into original sample buffer - ptr = (BYTE *)pins->pSample + (pos - inneroffset) * smpsize * nChn + i * smpsize; + ptr = (BYTE *)pSmp->pSample + (pos - inneroffset) * smpsize * nChn + i * smpsize; for(UINT j = startoffset ; j < len + finaloffset ; j++){ // Just perform a little bit of clipping... @@ -2308,26 +2308,26 @@ //---------------------------- { SAMPLEVIEWSTATE viewstate; - MODINSTRUMENT *pins; + MODSAMPLE *pSmp; DWORD dwBeginSel, dwEndSel; LPVOID pSample; UINT rlen, smplsize; memset(&viewstate, 0, sizeof(viewstate)); SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate); - if ((!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) return; + if ((!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return; BeginWaitCursor(); dwBeginSel = viewstate.dwBeginSel; dwEndSel = viewstate.dwEndSel; - pins = &m_pSndFile->Ins[m_nSample]; - rlen = pins->nLength; - pSample = pins->pSample; - smplsize = (pins->uFlags & CHN_16BIT) ? 2 : 1; - if (pins->uFlags & CHN_STEREO) smplsize *= 2; + pSmp = &m_pSndFile->Samples[m_nSample]; + rlen = pSmp->nLength; + pSample = pSmp->pSample; + smplsize = (pSmp->uFlags & CHN_16BIT) ? 2 : 1; + if (pSmp->uFlags & CHN_STEREO) smplsize *= 2; if ((dwEndSel > dwBeginSel) && (dwEndSel <= rlen)) { rlen = dwEndSel - dwBeginSel; - pSample = ((LPBYTE)pins->pSample) + dwBeginSel * smplsize; + pSample = ((LPBYTE)pSmp->pSample) + dwBeginSel * smplsize; } if (rlen >= 2) { @@ -2393,34 +2393,34 @@ // purpose: sign/unsign a sample ("distortion") SAMPLEVIEWSTATE viewstate; DWORD dwStart, dwEnd; - MODINSTRUMENT *pins; + MODSAMPLE *pSmp; memset(&viewstate, 0, sizeof(viewstate)); SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate); - if ((!m_pModDoc) || (!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) return; + if ((!m_pModDoc) || (!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return; if(m_pModDoc->IsNotePlaying(0, m_nSample, 0) == TRUE) MsgBoxHidable(ConfirmSignUnsignWhenPlaying); BeginWaitCursor(); - pins = &m_pSndFile->Ins[m_nSample]; + pSmp = &m_pSndFile->Samples[m_nSample]; dwStart = viewstate.dwBeginSel; dwEnd = viewstate.dwEndSel; - if (dwEnd > pins->nLength) dwEnd = pins->nLength; + if (dwEnd > pSmp->nLength) dwEnd = pSmp->nLength; if (dwStart > dwEnd) dwStart = dwEnd; if (dwStart >= dwEnd) { dwStart = 0; - dwEnd = pins->nLength; + dwEnd = pSmp->nLength; } - if (pins->uFlags & CHN_STEREO) { dwStart *= 2; dwEnd *= 2; } + if (pSmp->uFlags & CHN_STEREO) { dwStart *= 2; dwEnd *= 2; } UINT len = dwEnd - dwStart; - if (pins->uFlags & CHN_16BIT) + if (pSmp->uFlags & CHN_16BIT) { - signed short *p = ((signed short *)pins->pSample) + dwStart; + signed short *p = ((signed short *)pSmp->pSample) + dwStart; for (UINT i=0; i<len; ++i) p[i] += 0x8000; //unsign } else { - signed char *p = ((signed char *)pins->pSample) + dwStart; + signed char *p = ((signed char *)pSmp->pSample) + dwStart; for (UINT i=0; i<len; ++i) p[i] += 0x80; //unsign } @@ -2436,30 +2436,30 @@ //---------------------------- { SAMPLEVIEWSTATE viewstate; - MODINSTRUMENT *pins; + MODSAMPLE *pSmp; DWORD dwBeginSel, dwEndSel; memset(&viewstate, 0, sizeof(viewstate)); SendViewMessage(VIEWMSG_SAVESTATE, (LPARAM)&viewstate); - if ((!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) return; + if ((!m_pSndFile) || (!m_pSndFile->Samples[m_nSample].pSample)) return; BeginWaitCursor(); dwBeginSel = viewstate.dwBeginSel; dwEndSel = viewstate.dwEndSel; - pins = &m_pSndFile->Ins[m_nSample]; - if (dwEndSel > pins->nLength) dwEndSel = pins->nLength; + pSmp = &m_pSndFile->Samples[m_nSample]; + if (dwEndSel > pSmp->nLength) dwEndSel = pSmp->nLength; if (dwEndSel > dwBeginSel+1) { int len = dwEndSel - dwBeginSel; - if (pins->uFlags & CHN_STEREO) + if (pSmp->uFlags & CHN_STEREO) { - int smplsize = (pins->uFlags & CHN_16BIT) ? 4 : 2; - signed char *p = ((signed char *)pins->pSample) + dwBeginSel*smplsize; + int smplsize = (pSmp->uFlags & CHN_16BIT) ? 4 : 2; + signed char *p = ((signed char *)pSmp->pSample) + dwBeginSel*smplsize; memset(p, 0, len*smplsize); } else - if (pins->uFlags & CHN_16BIT) + if (pSmp->uFlags & CHN_16BIT) { - short int *p = ((short int *)pins->pSample) + dwBeginSel; - int dest = (dwEndSel < pins->nLength) ? p[len-1] : 0; + short int *p = ((short int *)pSmp->pSample) + dwBeginSel; + int dest = (dwEndSel < pSmp->nLength) ? p[len-1] : 0; int base = (dwBeginSel) ? p[0] : 0; int delta = dest - base; for (int i=0; i<len; i++) @@ -2469,8 +2469,8 @@ } } else { - signed char *p = ((signed char *)pins->pSample) + dwBeginSel; - int dest = (dwEndSel < pins->nLength) ? p[len-1] : 0; + signed char *p = ((signed char *)pSmp->pSample) + dwBeginSel; + int dest = (dwEndSel < pSmp->nLength) ? p[len-1] : 0; int base = (dwBeginSel) ? p[0] : 0; int delta = dest - base; for (int i=0; i<len; i++) @@ -2546,9 +2546,9 @@ m_EditFileName.GetWindowText(s, sizeof(s)); s[21] = 0; for (UINT i=strlen(s); i<22; i++) s[i] = 0; - if (strncmp(s, m_pSndFile->Ins[m_nSample].name, 22)) + if (strncmp(s, m_pSndFile->Samples[m_nSample].filename, 22)) { - memcpy(m_pSndFile->Ins[m_nSample].name, s, 22); + memcpy(m_pSndFile->Samples[m_nSample].filename, s, 22); // 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h] m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEINFO, this); if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); @@ -2564,9 +2564,9 @@ if (nVol < 0) nVol = 0; if (nVol > 64) nVol = 64; nVol <<= 2; - if (nVol != m_pSndFile->Ins[m_nSample].nVolume) + if (nVol != m_pSndFile->Samples[m_nSample].nVolume) { - m_pSndFile->Ins[m_nSample].nVolume = nVol; + m_pSndFile->Samples[m_nSample].nVolume = nVol; m_pModDoc->SetModified(); } } @@ -2579,9 +2579,9 @@ int nVol = GetDlgItemInt(IDC_EDIT8); if (nVol < 0) nVol = 0; if (nVol > 64) nVol = 64; - if (nVol != m_pSndFile->Ins[m_nSample].nGlobalVol) + if (nVol != m_pSndFile->Samples[m_nSample].nGlobalVol) { - m_pSndFile->Ins[m_nSample].nGlobalVol = nVol; + m_pSndFile->Samples[m_nSample].nGlobalVol = nVol; m_pModDoc->SetModified(); } } @@ -2598,16 +2598,16 @@ } if (b) { - if (!(m_pSndFile->Ins[m_nSample].uFlags & CHN_PANNING)) + if (!(m_pSndFile->Samples[m_nSample].uFlags & CHN_PANNING)) { - m_pSndFile->Ins[m_nSample].uFlags |= CHN_PANNING; + m_pSndFile->Samples[m_nSample].uFlags |= CHN_PANNING; m_pModDoc->SetModified(); } } else { - if (m_pSndFile->Ins[m_nSample].uFlags & CHN_PANNING) + if (m_pSndFile->Samples[m_nSample].uFlags & CHN_PANNING) { - m_pSndFile->Ins[m_nSample].uFlags &= ~CHN_PANNING; + m_pSndFile->Samples[m_nSample].uFlags &= ~CHN_PANNING; m_pModDoc->SetModified(); } } @@ -2628,9 +2628,9 @@ nPan = nPan << 2; // so we x4 to get MPT's internal 0-256 range. } //end rewbs.fix36944 - if (nPan != m_pSndFile->Ins[m_nSample].nPan) + if (nPan != m_pSndFile->Samples[m_nSample].nPan) { - m_pSndFile->Ins[m_nSample].nPan = nPan; + m_pSndFile->Samples[m_nSample].nPan = nPan; if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); } } @@ -2643,9 +2643,9 @@ int n = GetDlgItemInt(IDC_EDIT5); if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M|MOD_TYPE_MPT)) { - if ((n >= 2000) && (n <= 256000) && (n != (int)m_pSndFile->Ins[m_nSample].nC5Speed)) + if ((n >= 2000) && (n <= 256000) && (n != (int)m_pSndFile->Samples[m_nSample].nC5Speed)) { - m_pSndFile->Ins[m_nSample].nC5Speed = n; + m_pSndFile->Samples[m_nSample].nC5Speed = n; int transp = CSoundFile::FrequencyToTranspose(n) >> 7; int basenote = 60 - transp; if (basenote < BASENOTE_MIN) basenote = BASENOTE_MIN; @@ -2662,7 +2662,7 @@ } else { if ((n >= -128) && (n <= 127)) { - m_pSndFile->Ins[m_nSample].nFineTune = n; + m_pSndFile->Samples[m_nSample].nFineTune = n; m_pModDoc->SetModified(); } @@ -2677,12 +2677,12 @@ int n = 60 - (m_CbnBaseNote.GetCurSel() + BASENOTE_MIN); if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M|MOD_TYPE_MPT)) { - LONG ft = CSoundFile::FrequencyToTranspose(m_pSndFile->Ins[m_nSample].nC5Speed) & 0x7f; + LONG ft = CSoundFile::FrequencyToTranspose(m_pSndFile->Samples[m_nSample].nC5Speed) & 0x7f; n = CSoundFile::TransposeToFrequency(n, ft); - if ((n >= 500) && (n <= 256000) && (n != (int)m_pSndFile->Ins[m_nSample].nC5Speed)) + if ((n >= 500) && (n <= 256000) && (n != (int)m_pSndFile->Samples[m_nSample].nC5Speed)) { CHAR s[32]; - m_pSndFile->Ins[m_nSample].nC5Speed = n; + m_pSndFile->Samples[m_nSample].nC5Speed = n; wsprintf(s, "%lu", n); LockControls(); m_EditFineTune.SetWindowText(s); @@ -2692,7 +2692,7 @@ } else { if ((n >= -128) && (n < 128)) { - m_pSndFile->Ins[m_nSample].RelativeTone = n; + m_pSndFile->Samples[m_nSample].RelativeTone = n; m_pModDoc->SetModified(); } } @@ -2704,7 +2704,7 @@ { if (IsLocked()) return; int n = m_ComboAutoVib.GetCurSel(); - if (n >= 0) m_pSndFile->Ins[m_nSample].nVibType = (BYTE)n; + if (n >= 0) m_pSndFile->Samples[m_nSample].nVibType = (BYTE)n; m_pModDoc->SetModified(); } @@ -2717,7 +2717,7 @@ m_SpinVibDepth.GetRange(lmin, lmax); int n = GetDlgItemInt(IDC_EDIT15); if ((n >= lmin) && (n <= lmax)) { - m_pSndFile->Ins[m_nSample].nVibDepth = n; + m_pSndFile->Samples[m_nSample].nVibDepth = n; m_pModDoc->SetModified(); } } @@ -2731,7 +2731,7 @@ m_SpinVibSweep.GetRange(lmin, lmax); int n = GetDlgItemInt(IDC_EDIT14); if ((n >= lmin) && (n <= lmax)) { - m_pSndFile->Ins[m_nSample].nVibSweep = n; + m_pSndFile->Samples[m_nSample].nVibSweep = n; m_pModDoc->SetModified(); } } @@ -2745,7 +2745,7 @@ m_SpinVibRate.GetRange(lmin, lmax); int n = GetDlgItemInt(IDC_EDIT16); if ((n >= lmin) && (n <= lmax)) { - m_pSndFile->Ins[m_nSample].nVibRate = n; + m_pSndFile->Samples[m_nSample].nVibRate = n; m_pModDoc->SetModified(); } } @@ -2756,18 +2756,18 @@ { if ((IsLocked()) || (!m_pSndFile)) return; int n = m_ComboLoopType.GetCurSel(); - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; switch(n) { case 0: // Off - pins->uFlags &= ~(CHN_LOOP|CHN_PINGPONGLOOP|CHN_PINGPONGFLAG); + pSmp->uFlags &= ~(CHN_LOOP|CHN_PINGPONGLOOP|CHN_PINGPONGFLAG); break; case 1: // On - pins->uFlags &= ~CHN_PINGPONGLOOP; - pins->uFlags |= CHN_LOOP; + pSmp->uFlags &= ~CHN_PINGPONGLOOP; + pSmp->uFlags |= CHN_LOOP; break; case 2: // PingPong - pins->uFlags |= CHN_LOOP|CHN_PINGPONGLOOP; + pSmp->uFlags |= CHN_LOOP|CHN_PINGPONGLOOP; break; } m_pModDoc->AdjustEndOfSample(m_nSample); @@ -2779,12 +2779,12 @@ //-------------------------------------- { if ((IsLocked()) || (!m_pSndFile)) return; - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; LONG n = GetDlgItemInt(IDC_EDIT1); - if ((n >= 0) && (n < (LONG)pins->nLength) && ((n < (LONG)pins->nLoopEnd) || (!(pins->uFlags & CHN_LOOP)))) + if ((n >= 0) && (n < (LONG)pSmp->nLength) && ((n < (LONG)pSmp->nLoopEnd) || (!(pSmp->uFlags & CHN_LOOP)))) { - pins->nLoopStart = n; - if(pins->uFlags & CHN_LOOP) + pSmp->nLoopStart = n; + if(pSmp->uFlags & CHN_LOOP) { /* only update sample buffer if the loop is actually enabled (resets sound without any reason otherwise) - bug report 1874 */ @@ -2801,12 +2801,12 @@ //------------------------------------ { if ((IsLocked()) || (!m_pSndFile)) return; - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; LONG n = GetDlgItemInt(IDC_EDIT2); - if ((n >= 0) && (n <= (LONG)pins->nLength) && ((n > (LONG)pins->nLoopStart) || (!(pins->uFlags & CHN_LOOP)))) + if ((n >= 0) && (n <= (LONG)pSmp->nLength) && ((n > (LONG)pSmp->nLoopStart) || (!(pSmp->uFlags & CHN_LOOP)))) { - pins->nLoopEnd = n; - if(pins->uFlags & CHN_LOOP) + pSmp->nLoopEnd = n; + if(pSmp->uFlags & CHN_LOOP) { /* only update sample buffer if the loop is actually enabled (resets sound without any reason otherwise) - bug report 1874 */ @@ -2824,18 +2824,18 @@ { if ((IsLocked()) || (!m_pSndFile)) return; int n = m_ComboSustainType.GetCurSel(); - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; switch(n) { case 0: // Off - pins->uFlags &= ~(CHN_SUSTAINLOOP|CHN_PINGPONGSUSTAIN|CHN_PINGPONGFLAG); + pSmp->uFlags &= ~(CHN_SUSTAINLOOP|CHN_PINGPONGSUSTAIN|CHN_PINGPONGFLAG); break; case 1: // On - pins->uFlags &= ~CHN_PINGPONGSUSTAIN; - pins->uFlags |= CHN_SUSTAINLOOP; + pSmp->uFlags &= ~CHN_PINGPONGSUSTAIN; + pSmp->uFlags |= CHN_SUSTAINLOOP; break; case 2: // PingPong - pins->uFlags |= CHN_SUSTAINLOOP|CHN_PINGPONGSUSTAIN; + pSmp->uFlags |= CHN_SUSTAINLOOP|CHN_PINGPONGSUSTAIN; break; } m_pModDoc->SetModified(); @@ -2846,12 +2846,12 @@ //---------------------------------------- { if ((IsLocked()) || (!m_pSndFile)) return; - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; LONG n = GetDlgItemInt(IDC_EDIT3); - if ((n >= 0) && (n <= (LONG)pins->nLength) - && ((n < (LONG)pins->nSustainEnd) || (!(pins->uFlags & CHN_SUSTAINLOOP)))) + if ((n >= 0) && (n <= (LONG)pSmp->nLength) + && ((n < (LONG)pSmp->nSustainEnd) || (!(pSmp->uFlags & CHN_SUSTAINLOOP)))) { - pins->nSustainStart = n; + pSmp->nSustainStart = n; // 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h] m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, this); m_pModDoc->SetModified(); @@ -2863,12 +2863,12 @@ //-------------------------------------- { if ((IsLocked()) || (!m_pSndFile)) return; - MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; + MODSAMPLE *pSmp = &m_pSndFile->Samples[m_nSample]; LONG n = GetDlgItemInt(IDC_EDIT4); - if ((n >= 0) && (n <= (LONG)pins->nLength) - && ((n > (LONG)pins->nSustainStart) || (!(pins->uFlags & CHN_SUSTAINLOOP)))) + if ((n >= 0) && (n <= (LONG)pSmp->nLength) + && ((n > (LONG)pSmp->nSustainStart) || (!(pSmp->uFlags & CHN_SUSTAINLOOP)))) { - pins->nSustainEnd = n; + pSmp->nSustainEnd = n; // 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h] m_pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEDATA, this); m_pModDoc->SetModified(); @@ -2927,57 +2927,57 @@ CHAR s[256]; if ((IsLocked()) || (!m_pSndFile)) return; UINT nsample = m_nSample, pinc = 1; - MODINSTRUMENT *pins = &m_pSndFile->Ins[nsample]; - LPSTR pSample = pins->pSample; + MODSAMPLE *pSmp = &m_pSndFile->Samples[nsample]; + LPSTR pSample = pSmp->pSample; short int pos; BOOL bRedraw = FALSE; LockControls(); - if ((!pins->nLength) || (!pSample)) goto NoSample; - if (pins->uFlags & CHN_16BIT) + if ((!pSmp->nLength) || (!pSample)) goto NoSample; + if (pSmp->uFlags & CHN_16BIT) { pSample++; pinc *= 2; } - if (pins->uFlags & CHN_STEREO) pinc *= 2; + if (pSmp->uFlags & CHN_STEREO) pinc *= 2; // Loop Start if ((pos = (short int)m_SpinLoopStart.GetPos()) != 0) { BOOL bOk = FALSE; - LPSTR p = pSample+pins->nLoopStart*pinc; - int find0 = (int)pSample[pins->nLoopEnd*pinc-pinc]; - int find1 = (int)pSample[pins->nLoopEnd*pinc]; + LPSTR p = pSample+pSmp->nLoopStart*pinc; + int find0 = (int)pSample[pSmp->nLoopEnd*pinc-pinc]; + int find1 = (int)pSample[pSmp->nLoopEnd*pinc]; // Find Next LoopStart Point if (pos > 0) { - for (UINT i=pins->nLoopStart+1; i+16<pins->nLoopEnd; i++) + for (UINT i=pSmp->nLoopStart+1; i+16<pSmp->nLoopEnd; i++) { p += pinc; - bOk = (pins->uFlags & CHN_PINGPONGLOOP) ? MPT_BidiStartCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); + bOk = (pSmp->uFlags & CHN_PINGPONGLOOP) ? MPT_BidiStartCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); if (bOk) { - pins->nLoopStart = i; + pSmp->nLoopStart = i; break; } } } else // Find Prev LoopStart Point { - for (UINT i=pins->nLoopStart; i; ) + for (UINT i=pSmp->nLoopStart; i; ) { i--; p -= pinc; - bOk = (pins->uFlags & CHN_PINGPONGLOOP) ? MPT_BidiStartCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); + bOk = (pSmp->uFlags & CHN_PINGPONGLOOP) ? MPT_BidiStartCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); if (bOk) { - pins->nLoopStart = i; + pSmp->nLoopStart = i; break; } } } if (bOk) { - wsprintf(s, "%u", pins->nLoopStart); + wsprintf(s, "%u", pSmp->nLoopStart); m_EditLoopStart.SetWindowText(s); m_pModDoc->AdjustEndOfSample(m_nSample); bRedraw = TRUE; @@ -2986,42 +2986,42 @@ } // Loop End pos = (short int)m_SpinLoopEnd.GetPos(); - if ((pos) && (pins->nLoopEnd)) + if ((pos) && (pSmp->nLoopEnd)) { BOOL bOk = FALSE; - LPSTR p = pSample+pins->nLoopEnd*pinc; - int find0 = (int)pSample[pins->nLoopStart*pinc]; - int find1 = (int)pSample[pins->nLoopStart*pinc+pinc]; + LPSTR p = pSample+pSmp->nLoopEnd*pinc; + int find0 = (int)pSample[pSmp->nLoopStart*pinc]; + int find1 = (int)pSample[pSmp->nLoopStart*pinc+pinc]; // Find Next LoopEnd Point if (pos > 0) { - for (UINT i=pins->nLoopEnd+1; i<=pins->nLength; i++, p+=pinc) + for (UINT i=pSmp->nLoopEnd+1; i<=pSmp->nLength; i++, p+=pinc) { - bOk = (pins->uFlags & CHN_PINGPONGLOOP) ? MPT_BidiEndCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); + bOk = (pSmp->uFlags & CHN_PINGPONGLOOP) ? MPT_BidiEndCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); if (bOk) { - pins->nLoopEnd = i; + pSmp->nLoopEnd = i; break; } } } else // Find Prev LoopEnd Point { - for (UINT i=pins->nLoopEnd; i>pins->nLoopStart+16; ) + for (UINT i=pSmp->nLoopEnd; i>pSmp->nLoopStart+16; ) { i--; p -= pinc; - bOk = (pins->uFlags & CHN_PINGPONGLOOP) ? MPT_BidiEndCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); + bOk = (pSmp->uFlags & CHN_PINGPONGLOOP) ? MPT_BidiEndCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); if (bOk) { - pins->nLoopEnd = i; + pSmp->nLoopEnd = i; break; } } } if (bOk) { - wsprintf(s, "%u", pins->nLoopEnd); + wsprintf(s, "%u", pSmp->nLoopEnd); m_EditLoopEnd.SetWindowText(s); m_pModDoc->AdjustEndOfSample(m_nSample); bRedraw = TRUE; @@ -3030,43 +3030,43 @@ } // Sustain Loop Start pos = (short int)m_SpinSustainStart.GetPos(); - if ((pos) && (pins->nSustainEnd)) + if ((pos) && (pSmp->nSustainEnd)) { BOOL bOk = FALSE; - LPSTR p = pSample+pins->nSustainStart*pinc; - int find0 = (int)pSample[pins->nSustainEnd*pinc-pinc]; - int find1 = (int)pSample[pins->nSustainEnd*pinc]; + LPSTR p = pSample+pSmp->nSustainStart*pinc; + int find0 = (int)pSample[pSmp->nSustainEnd*pinc-pinc]; + int find1 = (int)pSample[pSmp->nSustainEnd*pinc]; // Find Next Sustain LoopStart Point if (pos > 0) { - for (UINT i=pins->nSustainStart+1; i+16<pins->nSustainEnd; i++) + for (UINT i=pSmp->nSustainStart+1; i+16<pSmp->nSustainEnd; i++) { p += pinc; - bOk = (pins->uFlags & CHN_PINGPONGSUSTAIN) ? MPT_BidiStartCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); + bOk = (pSmp->uFlags & CHN_PINGPONGSUSTAIN) ? MPT_BidiStartCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); if (bOk) { - pins->nSustainStart = i; + pSmp->nSustainStart = i; break; } } } else // Find Prev Sustain LoopStart Point { - for (UINT i=pins->nSustainStart; i; ) + for (UINT i=pSmp->nSustainStart; i; ) { i--; p -= pinc; - bOk = (pins->uFlags & CHN_PINGPONGSUSTAIN) ? MPT_BidiStartCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); + bOk = (pSmp->uFlags & CHN_PINGPONGSUSTAIN) ? MPT_BidiStartCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); if (bOk) { - pins->nSustainStart = i; + pSmp->nSustainStart = i; break; } } } if (bOk) { - wsprintf(s, "%u", pins->nSustainStart); + wsprintf(s, "%u", pSmp->nSustainStart); m_EditSustainStart.SetWindowText(s); bRedraw = TRUE; } @@ -3077,39 +3077,39 @@ if (pos) { BOOL bOk = FALSE; - LPSTR p = pSample+pins->nSustainEnd*pinc; - int find0 = (int)pSample[pins->nSustainStart*pinc]; - int find1 = (int)pSample[pins->nSustainStart*pinc+pinc]; + LPSTR p = pSample+pSmp->nSustainEnd*pinc; + int find0 = (int)pSample[pSmp->nSustainStart*pinc]; + int find1 = (int)pSample[pSmp->nSustainStart*pinc+pinc]; // Find Next LoopEnd Point if (pos > 0) { - for (UINT i=pins->nSustainEnd+1; i+1<pins->nLength; i++, p+=pinc) + for (UINT i=pSmp->nSustainEnd+1; i+1<pSmp->nLength; i++, p+=pinc) { - bOk = (pins->uFlags & CHN_PINGPONGSUSTAIN) ? MPT_BidiEndCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); + bOk = (pSmp->uFlags & CHN_PINGPONGSUSTAIN) ? MPT_BidiEndCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); if (bOk) { - pins->nSustainEnd = i; + pSmp->nSustainEnd = i; break; } } } else // Find Prev LoopEnd Point { - for (UINT i=pins->nSustainEnd; i>pins->nSustainStart+16; ) + for (UINT i=pSmp->nSustainEnd; i>pSmp->nSustainStart+16; ) { i--; p -= pinc; - bOk = (pins->uFlags & CHN_PINGPONGSUSTAIN) ? MPT_BidiEndCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); + bOk = (pSmp->uFlags & CHN_PINGPONGSUSTAIN) ? MPT_BidiEndCheck(p[0], p[pinc], p[pinc*2]) : MPT_LoopCheck(find0, find1, p[0], p[pinc]); if (bOk) { - pins->nSustainEnd = i; + pSmp->nSustainEnd = i; break; } } } if (bOk) { - wsprintf(s, "%u", pins->nSustainEnd); + wsprintf(s, "%u", pSmp->nSustainEnd); m_EditSustainEnd.SetWindowText(s); bRedraw = TRUE; } @@ -3121,26 +3121,26 @@ { if (m_pSndFile->m_nType & (M... [truncated message content] |
From: <sag...@us...> - 2009-08-15 19:28:34
|
Revision: 326 http://modplug.svn.sourceforge.net/modplug/?rev=326&view=rev Author: saga-games Date: 2009-08-15 19:28:24 +0000 (Sat, 15 Aug 2009) Log Message: ----------- [Ref] Code cleanup, part two: Instrument-related objects and variables are now called "instruments" instead of "headers": - INSTRUMENTHEADER -> MODINSTRUMENT - MODCHANNEL's pHeader -> pModInstrument - Sample pointers penv -> pEnv for better readability - Headers[] -> Instruments[] - DLS Instrument pointers renamed from pIns to pDlsIns to avoid confusion. - A few more... Modified Paths: -------------- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/mptrack/view_com.cpp trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/Dlsbank.h trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2009-08-15 15:39:31 UTC (rev 325) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2009-08-15 19:28:24 UTC (rev 326) @@ -480,7 +480,7 @@ if (nIns==0 && (inputPlugs.GetSize() || inputChannels.GetSize())) { m_pInputMenu->AppendMenu(MF_SEPARATOR); } - name.Format("Ins%02d: %s", inputInstruments[nIns], pSndFile->Headers[inputInstruments[nIns]]->name); + name.Format("Ins%02d: %s", inputInstruments[nIns], pSndFile->Instruments[inputInstruments[nIns]]->name); if (inputInstruments[nIns]==m_nInstrument) checked=true; m_pInputMenu->AppendMenu(MF_STRING|(checked?MF_CHECKED:0), ID_SELECTINST+inputInstruments[nIns], name); } @@ -644,8 +644,8 @@ { CSoundFile* pSndFile = m_pVstPlugin->GetSoundFile(); - if (instrument>=0 && instrument<MAX_INSTRUMENTS && pSndFile->Headers[instrument]) { - return (pSndFile->Headers[instrument]->nMixPlug) == (m_pVstPlugin->m_nSlot+1); + if (instrument>=0 && instrument<MAX_INSTRUMENTS && pSndFile->Instruments[instrument]) { + return (pSndFile->Instruments[instrument]->nMixPlug) == (m_pVstPlugin->m_nSlot+1); } return false; } Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-15 15:39:31 UTC (rev 325) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-15 19:28:24 UTC (rev 326) @@ -145,7 +145,7 @@ { BOOL bFocus = (::GetFocus() == m_hWnd) ? TRUE : FALSE; CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; + MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; CHAR s[64]; CRect rect; @@ -169,9 +169,9 @@ rect.left = rect.right; rect.right = m_cxFont*2-1; strcpy(s, "..."); - if ((penv) && (nPos >= 0) && (nPos < NOTE_MAX) && (penv->NoteMap[nPos])) + if ((pIns) && (nPos >= 0) && (nPos < NOTE_MAX) && (pIns->NoteMap[nPos])) { - UINT n = penv->NoteMap[nPos]; + UINT n = pIns->NoteMap[nPos]; if (n == NOTE_KEYOFF) strcpy(s, "==="); else if (n == NOTE_NOTECUT) strcpy(s, "^^^"); else if (n <= NOTE_MAX) @@ -195,9 +195,9 @@ rect.left = rcClient.left + m_cxFont*2+3; rect.right = rcClient.right; strcpy(s, " .."); - if ((penv) && (nPos >= 0) && (nPos < NOTE_MAX) && (penv->Keyboard[nPos])) + if ((pIns) && (nPos >= 0) && (nPos < NOTE_MAX) && (pIns->Keyboard[nPos])) { - wsprintf(s, "%3d", penv->Keyboard[nPos]); + wsprintf(s, "%3d", pIns->Keyboard[nPos]); } FillRect(hdc, &rect, (bHighLight) ? CMainFrame::brushHighLight : CMainFrame::brushWindow); if ((nPos == (int)m_nNote) && (m_bIns)) @@ -277,11 +277,11 @@ { CHAR s[64]; CSoundFile *pSndFile; - INSTRUMENTHEADER *penv; + MODINSTRUMENT *pIns; pSndFile = m_pModDoc->GetSoundFile(); - penv = pSndFile->Headers[m_nInstrument]; - if (penv) + pIns = pSndFile->Instruments[m_nInstrument]; + if (pIns) { HMENU hMenu = ::CreatePopupMenu(); HMENU hSubMenu = ::CreatePopupMenu(); @@ -295,7 +295,7 @@ memset(smpused, 0, sizeof(smpused)); for (UINT i=1; i<NOTE_MAX; i++) { - UINT nsmp = penv->Keyboard[i]; + UINT nsmp = pIns->Keyboard[i]; if (nsmp < MAX_SAMPLES) smpused[nsmp>>3] |= 1 << (nsmp & 7); } for (UINT j=1; j<MAX_SAMPLES; j++) @@ -312,9 +312,9 @@ AppendMenu(hMenu, MF_POPUP, (UINT)hSubMenu, "Edit Sample"); AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); } - wsprintf(s, "Map all notes to sample %d", penv->Keyboard[m_nNote]); + wsprintf(s, "Map all notes to sample %d", pIns->Keyboard[m_nNote]); AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_COPY_SMP, s); - wsprintf(s, "Map all notes to %s", pSndFile->GetNoteName(penv->NoteMap[m_nNote], m_nInstrument).c_str()); + wsprintf(s, "Map all notes to %s", pSndFile->GetNoteName(pIns->NoteMap[m_nNote], m_nInstrument).c_str()); AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_COPY_NOTE, s); AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_RESET, "Reset note mapping"); AppendMenu(hMenu, MF_STRING, ID_INSTRUMENT_DUPLICATE, "Duplicate Instrument\tShift+New"); @@ -335,17 +335,17 @@ if (m_pModDoc) { CSoundFile *pSndFile; - INSTRUMENTHEADER *penv; + MODINSTRUMENT *pIns; pSndFile = m_pModDoc->GetSoundFile(); - penv = pSndFile->Headers[m_nInstrument]; - if (penv) + pIns = pSndFile->Instruments[m_nInstrument]; + if (pIns) { BOOL bModified = FALSE; - UINT n = penv->NoteMap[m_nNote]; - for (UINT i=0; i<NOTE_MAX; i++) if (penv->NoteMap[i] != n) + UINT n = pIns->NoteMap[m_nNote]; + for (UINT i=0; i<NOTE_MAX; i++) if (pIns->NoteMap[i] != n) { - penv->NoteMap[i] = n; + pIns->NoteMap[i] = n; bModified = TRUE; } if (bModified) @@ -363,17 +363,17 @@ if (m_pModDoc) { CSoundFile *pSndFile; - INSTRUMENTHEADER *penv; + MODINSTRUMENT *pIns; pSndFile = m_pModDoc->GetSoundFile(); - penv = pSndFile->Headers[m_nInstrument]; - if (penv) + pIns = pSndFile->Instruments[m_nInstrument]; + if (pIns) { BOOL bModified = FALSE; - UINT n = penv->Keyboard[m_nNote]; - for (UINT i=0; i<NOTE_MAX; i++) if (penv->Keyboard[i] != n) + UINT n = pIns->Keyboard[m_nNote]; + for (UINT i=0; i<NOTE_MAX; i++) if (pIns->Keyboard[i] != n) { - penv->Keyboard[i] = n; + pIns->Keyboard[i] = n; bModified = TRUE; } if (bModified) @@ -392,16 +392,16 @@ if (m_pModDoc) { CSoundFile *pSndFile; - INSTRUMENTHEADER *penv; + MODINSTRUMENT *pIns; pSndFile = m_pModDoc->GetSoundFile(); - penv = pSndFile->Headers[m_nInstrument]; - if (penv) + pIns = pSndFile->Instruments[m_nInstrument]; + if (pIns) { BOOL bModified = FALSE; - for (UINT i=0; i<NOTE_MAX; i++) if (penv->NoteMap[i] != i+1) + for (UINT i=0; i<NOTE_MAX; i++) if (pIns->NoteMap[i] != i+1) { - penv->NoteMap[i] = i+1; + pIns->NoteMap[i] = i+1; bModified = TRUE; } if (bModified) @@ -472,21 +472,21 @@ //------------------------------------ { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; - if ((penv) && (m_nNote < NOTE_MAX)) + MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + if ((pIns) && (m_nNote < NOTE_MAX)) { if (!m_bIns && (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) { - UINT n = penv->NoteMap[m_nNote]; + UINT n = pIns->NoteMap[m_nNote]; BOOL bOk = FALSE; if ((note > 0) && (note <= NOTE_MAX)) { n = note; bOk = TRUE; } - if (n != penv->NoteMap[m_nNote]) + if (n != pIns->NoteMap[m_nNote]) { - penv->NoteMap[m_nNote] = n; + pIns->NoteMap[m_nNote] = n; m_pModDoc->SetModified(); InvalidateRect(NULL, FALSE); } @@ -504,21 +504,21 @@ //------------------------------------ { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; - if ((penv) && (m_nNote < NOTE_MAX)) { + MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + if ((pIns) && (m_nNote < NOTE_MAX)) { if ((m_bIns) && (((c >= '0') && (c <= '9')) || (c == ' '))) { //in sample # column UINT n = m_nOldIns; if (c != ' ') { - n = (10*penv->Keyboard[m_nNote] + (c - '0')) % 10000; + n = (10*pIns->Keyboard[m_nNote] + (c - '0')) % 10000; if ((n >= MAX_SAMPLES) || ((pSndFile->m_nSamples < 1000) && (n >= 1000))) n = (n % 1000); if ((n >= MAX_SAMPLES) || ((pSndFile->m_nSamples < 100) && (n >= 100))) n = (n % 100); else if ((n > 31) && (pSndFile->m_nSamples < 32) && (n % 10)) n = (n % 10); } - if (n != penv->Keyboard[m_nNote]) { - penv->Keyboard[m_nNote] = n; + if (n != pIns->Keyboard[m_nNote]) { + pIns->Keyboard[m_nNote] = n; m_pModDoc->SetModified(); InvalidateRect(NULL, FALSE); PlayNote(m_nNote+1); @@ -534,7 +534,7 @@ else if ((!m_bIns) && (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) { //in note column - UINT n = penv->NoteMap[m_nNote]; + UINT n = pIns->NoteMap[m_nNote]; if ((c >= '0') && (c <= '9')) { if (n) { @@ -546,8 +546,8 @@ n = (m_nOldNote) ? m_nOldNote : m_nNote+1; } - if (n != penv->NoteMap[m_nNote]) { - penv->NoteMap[m_nNote] = n; + if (n != pIns->NoteMap[m_nNote]) { + pIns->NoteMap[m_nNote] = n; m_pModDoc->SetModified(); InvalidateRect(NULL, FALSE); } @@ -601,9 +601,9 @@ case VK_RETURN: if (m_pModDoc) { - INSTRUMENTHEADER *penv = m_pModDoc->GetSoundFile()->Headers[m_nInstrument]; - if (m_bIns) m_nOldIns = penv->Keyboard[m_nNote]; - else m_nOldNote = penv->NoteMap[m_nNote]; + MODINSTRUMENT *pIns = m_pModDoc->GetSoundFile()->Instruments[m_nInstrument]; + if (m_bIns) m_nOldIns = pIns->Keyboard[m_nNote]; + else m_nOldNote = pIns->NoteMap[m_nNote]; } return true; } @@ -953,8 +953,8 @@ m_CbnMixPlug.SetItemData(m_CbnMixPlug.AddString(s), plug); } - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((penv) && (penv->nMixPlug < MAX_MIXPLUGINS)) m_CbnMixPlug.SetCurSel(penv->nMixPlug); + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((pIns) && (pIns->nMixPlug < MAX_MIXPLUGINS)) m_CbnMixPlug.SetCurSel(pIns->nMixPlug); //end rewbs.instroVSTi SetCurrentInstrument((lParam > 0) ? lParam : m_nInstrument); @@ -1103,44 +1103,44 @@ if (dwHintMask & (HINT_INSTRUMENT|HINT_MODTYPE)) { CHAR s[128]; - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if (penv) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if (pIns) { - memcpy(s, penv->name, 32); + memcpy(s, pIns->name, 32); s[32] = 0; m_EditName.SetWindowText(s); - memcpy(s, penv->filename, 12); + memcpy(s, pIns->filename, 12); s[12] = 0; m_EditFileName.SetWindowText(s); // Fade Out Volume - SetDlgItemInt(IDC_EDIT7, penv->nFadeOut); + SetDlgItemInt(IDC_EDIT7, pIns->nFadeOut); // Global Volume - SetDlgItemInt(IDC_EDIT8, penv->nGlobalVol); + SetDlgItemInt(IDC_EDIT8, pIns->nGlobalVol); // Panning - SetDlgItemInt(IDC_EDIT9, penv->nPan); - m_CheckPanning.SetCheck((penv->dwFlags & ENV_SETPANNING) ? TRUE : FALSE); + SetDlgItemInt(IDC_EDIT9, pIns->nPan); + m_CheckPanning.SetCheck((pIns->dwFlags & ENV_SETPANNING) ? TRUE : FALSE); // Midi - if (penv->nMidiProgram>0 && penv->nMidiProgram<=128) - SetDlgItemInt(IDC_EDIT10, penv->nMidiProgram); + if (pIns->nMidiProgram>0 && pIns->nMidiProgram<=128) + SetDlgItemInt(IDC_EDIT10, pIns->nMidiProgram); else SetDlgItemText(IDC_EDIT10, "---"); - if (penv->wMidiBank && penv->wMidiBank<=128) - SetDlgItemInt(IDC_EDIT11, penv->wMidiBank); + if (pIns->wMidiBank && pIns->wMidiBank<=128) + SetDlgItemInt(IDC_EDIT11, pIns->wMidiBank); else SetDlgItemText(IDC_EDIT11, "---"); //rewbs.instroVSTi //was: - //if (penv->nMidiChannel < 17) m_CbnMidiCh.SetCurSel(penv->nMidiChannel); else - //if (penv->nMidiChannel & 0x80) m_CbnMidiCh.SetCurSel((penv->nMidiChannel&0x7f)+16); else + //if (pIns->nMidiChannel < 17) m_CbnMidiCh.SetCurSel(pIns->nMidiChannel); else + //if (pIns->nMidiChannel & 0x80) m_CbnMidiCh.SetCurSel((pIns->nMidiChannel&0x7f)+16); else // m_CbnMidiCh.SetCurSel(0); //now: - if (penv->nMidiChannel < 17) { - m_CbnMidiCh.SetCurSel(penv->nMidiChannel); + if (pIns->nMidiChannel < 17) { + m_CbnMidiCh.SetCurSel(pIns->nMidiChannel); } else { m_CbnMidiCh.SetCurSel(0); } - if (penv->nMixPlug < MAX_MIXPLUGINS) { - m_CbnMixPlug.SetCurSel(penv->nMixPlug); + if (pIns->nMixPlug < MAX_MIXPLUGINS) { + m_CbnMixPlug.SetCurSel(pIns->nMixPlug); } else { m_CbnMixPlug.SetCurSel(0); } @@ -1148,51 +1148,51 @@ //end rewbs.instroVSTi for(int nRes = 0; nRes<m_CbnResampling.GetCount(); nRes++) { DWORD v = m_CbnResampling.GetItemData(nRes); - if (penv->nResampling == v) { + if (pIns->nResampling == v) { m_CbnResampling.SetCurSel(nRes); break; } } for(int nFltMode = 0; nFltMode<m_CbnFilterMode.GetCount(); nFltMode++) { DWORD v = m_CbnFilterMode.GetItemData(nFltMode); - if (penv->nFilterMode == v) { + if (pIns->nFilterMode == v) { m_CbnFilterMode.SetCurSel(nFltMode); break; } } // NNA, DCT, DCA - m_ComboNNA.SetCurSel(penv->nNNA); - m_ComboDCT.SetCurSel(penv->nDCT); - m_ComboDCA.SetCurSel(penv->nDNA); + m_ComboNNA.SetCurSel(pIns->nNNA); + m_ComboDCT.SetCurSel(pIns->nDCT); + m_ComboDCA.SetCurSel(pIns->nDNA); // Pitch/Pan Separation - m_ComboPPC.SetCurSel(penv->nPPC); - SetDlgItemInt(IDC_EDIT15, penv->nPPS); + m_ComboPPC.SetCurSel(pIns->nPPC); + SetDlgItemInt(IDC_EDIT15, pIns->nPPS); // Filter if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) { - m_CheckCutOff.SetCheck((penv->nIFC & 0x80) ? TRUE : FALSE); - m_CheckResonance.SetCheck((penv->nIFR & 0x80) ? TRUE : FALSE); - //m_CheckHighpass.SetCheck(penv->nFilterMode); - m_SliderVolSwing.SetPos(penv->nVolSwing); - m_SliderPanSwing.SetPos(penv->nPanSwing); - m_SliderResSwing.SetPos(penv->nResSwing); - m_SliderCutSwing.SetPos(penv->nCutSwing); - m_SliderCutOff.SetPos(penv->nIFC & 0x7F); - m_SliderResonance.SetPos(penv->nIFR & 0x7F); + m_CheckCutOff.SetCheck((pIns->nIFC & 0x80) ? TRUE : FALSE); + m_CheckResonance.SetCheck((pIns->nIFR & 0x80) ? TRUE : FALSE); + //m_CheckHighpass.SetCheck(pIns->nFilterMode); + m_SliderVolSwing.SetPos(pIns->nVolSwing); + m_SliderPanSwing.SetPos(pIns->nPanSwing); + m_SliderResSwing.SetPos(pIns->nResSwing); + m_SliderCutSwing.SetPos(pIns->nCutSwing); + m_SliderCutOff.SetPos(pIns->nIFC & 0x7F); + m_SliderResonance.SetPos(pIns->nIFR & 0x7F); UpdateFilterText(); } // -> CODE#0027 // -> DESC="per-instrument volume ramping setup (refered as attack)" // Volume ramping (attack) - int n = penv->nVolRamp; //? MAX_ATTACK_LENGTH - penv->nVolRamp : 0; + int n = pIns->nVolRamp; //? MAX_ATTACK_LENGTH - pIns->nVolRamp : 0; m_SliderAttack.SetPos(n); if(n == 0) SetDlgItemText(IDC_EDIT2,"default"); else SetDlgItemInt(IDC_EDIT2,n); // -! NEW_FEATURE#0027 UpdateTuningComboBox(); - if(penv->wPitchToTempoLock > 0) //Current instrument uses pitchTempoLock. + if(pIns->wPitchToTempoLock > 0) //Current instrument uses pitchTempoLock. CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_CHECKED); else CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); @@ -1243,12 +1243,12 @@ if ((m_nInstrument) && (m_pModDoc)) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; - if (penv) + MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + if (pIns) { CHAR s[64]; - if (penv->nIFC&0x80 && penv->nIFC<0xFF) { - wsprintf(s, "%d Hz", pSndFile->CutOffToFrequency(penv->nIFC & 0x7F)); + if (pIns->nIFC&0x80 && pIns->nIFC<0xFF) { + wsprintf(s, "%d Hz", pSndFile->CutOffToFrequency(pIns->nIFC & 0x7F)); } else { wsprintf(s, "Off"); } @@ -1308,25 +1308,25 @@ EndWaitCursor(); if (bOk) { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if (penv) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if (pIns) { TCHAR szName[_MAX_FNAME], szExt[_MAX_EXT]; _tsplitpath(lpszFileName, nullptr, nullptr, szName, szExt); CMainFrame::SetWorkingDirectory(lpszFileName, DIR_INSTRUMENTS, true); - if (!penv->name[0]) + if (!pIns->name[0]) { szName[31] = 0; - memset(penv->name, 0, 32); - strcpy(penv->name, szName); + memset(pIns->name, 0, 32); + strcpy(pIns->name, szName); } - if (!penv->filename[0]) + if (!pIns->filename[0]) { strcat(szName, szExt); szName[11] = 0; - strcpy(penv->filename, szName); - penv->filename[11] = 0; + strcpy(pIns->filename, szName); + pIns->filename[11] = 0; } SetCurrentInstrument(m_nInstrument); if (m_pModDoc) @@ -1394,7 +1394,7 @@ //Note: pszText seems to point to char array of length 256 (Noverber 2006). //Note2: If there's problems in getting tooltips showing for certain tools, // setting the tab order may have effect. - const bool hasInstrument = (m_pSndFile) && (m_pSndFile->Headers[m_nInstrument]); + const bool hasInstrument = (m_pSndFile) && (m_pSndFile->Instruments[m_nInstrument]); if(!hasInstrument) return FALSE; if ((pszText) && (uId)) { @@ -1402,8 +1402,8 @@ { case IDC_EDIT1: { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - wsprintf(pszText, "Z%02X", penv->nIFC & 0x7f); + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + wsprintf(pszText, "Z%02X", pIns->nIFC & 0x7f); return TRUE; break; } @@ -1424,7 +1424,7 @@ case IDC_PLUGIN_VELOCITYSTYLE: case IDC_PLUGIN_VOLUMESTYLE: - if(m_pSndFile->Headers[m_nInstrument]->nMixPlug < 1) return FALSE; + if(m_pSndFile->Instruments[m_nInstrument]->nMixPlug < 1) return FALSE; if(m_pSndFile->GetModFlag(MSF_MIDICC_BUGEMULATION)) { m_CbnPluginVelocityHandling.EnableWindow(FALSE); @@ -1595,16 +1595,16 @@ //--------------------------------------- { CHAR szFileName[_MAX_PATH] = "", drive[_MAX_DRIVE], path[_MAX_PATH], ext[_MAX_EXT]; - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; - if (!penv) return; - if (penv->filename[0]) + if (!pIns) return; + if (pIns->filename[0]) { - memcpy(szFileName, penv->filename, 12); + memcpy(szFileName, pIns->filename, 12); szFileName[12] = 0; } else { - memcpy(szFileName, penv->name, 22); + memcpy(szFileName, pIns->name, 22); szFileName[22] = 0; } // -> CODE#0019 @@ -1691,14 +1691,14 @@ s[0] = 0; m_EditName.GetWindowText(s, sizeof(s)); for (UINT i=strlen(s); i<=32; i++) s[i] = 0; - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((penv) && (strncmp(s, penv->name, 32))) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((pIns) && (strncmp(s, pIns->name, 32))) { // -> CODE#0023 // -> DESC="IT project files (.itp)" m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; // -! NEW_FEATURE#0023 - memcpy(penv->name, s, 32); + memcpy(pIns->name, s, 32); m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_INSNAMES, this); } @@ -1715,10 +1715,10 @@ s[0] = 0; m_EditFileName.GetWindowText(s, sizeof(s)); for (UINT i=strlen(s); i<=12; i++) s[i] = 0; - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((penv) && (strncmp(s, penv->filename, 12))) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((pIns) && (strncmp(s, pIns->filename, 12))) { - memcpy(penv->filename, s, 12); + memcpy(pIns->filename, s, 12); m_pModDoc->SetModified(); // -> CODE#0023 // -> DESC="IT project files (.itp)" @@ -1733,15 +1733,15 @@ void CCtrlInstruments::OnFadeOutVolChanged() //------------------------------------------ { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { int nVol = GetDlgItemInt(IDC_EDIT7); if (nVol < 0) nVol = 0; if (nVol > 16384) nVol = 16384; - if (nVol != (int)penv->nFadeOut) + if (nVol != (int)pIns->nFadeOut) { - penv->nFadeOut = nVol; + pIns->nFadeOut = nVol; m_pModDoc->SetModified(); // -> CODE#0023 // -> DESC="IT project files (.itp)" @@ -1756,15 +1756,15 @@ void CCtrlInstruments::OnGlobalVolChanged() //----------------------------------------- { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { int nVol = GetDlgItemInt(IDC_EDIT8); if (nVol < 0) nVol = 0; if (nVol > 64) nVol = 64; - if (nVol != (int)penv->nGlobalVol) + if (nVol != (int)pIns->nGlobalVol) { - penv->nGlobalVol = nVol; + pIns->nGlobalVol = nVol; if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) m_pModDoc->SetModified(); // -> CODE#0023 // -> DESC="IT project files (.itp)" @@ -1779,20 +1779,20 @@ void CCtrlInstruments::OnSetPanningChanged() //------------------------------------------ { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { const BOOL b = m_CheckPanning.GetCheck(); - if (b) penv->dwFlags |= ENV_SETPANNING; - else penv->dwFlags &= ~ENV_SETPANNING; + if (b) pIns->dwFlags |= ENV_SETPANNING; + else pIns->dwFlags &= ~ENV_SETPANNING; if(b && m_pSndFile->GetType() & MOD_TYPE_IT|MOD_TYPE_MPT) { bool smpPanningInUse = false; - for(BYTE i = 0; i<ARRAYELEMCOUNT(penv->Keyboard); i++) + for(BYTE i = 0; i<ARRAYELEMCOUNT(pIns->Keyboard); i++) { - const SAMPLEINDEX smp = penv->Keyboard[i]; + const SAMPLEINDEX smp = pIns->Keyboard[i]; if(smp <= m_pSndFile->GetNumSamples() && m_pSndFile->Samples[smp].uFlags & CHN_PANNING) { smpPanningInUse = true; @@ -1808,9 +1808,9 @@ "", MB_YESNO) == IDYES) { - for(BYTE i = 0; i<ARRAYELEMCOUNT(penv->Keyboard); i++) + for(BYTE i = 0; i<ARRAYELEMCOUNT(pIns->Keyboard); i++) { - const SAMPLEINDEX smp = penv->Keyboard[i]; + const SAMPLEINDEX smp = pIns->Keyboard[i]; if(smp <= m_pSndFile->GetNumSamples()) m_pSndFile->Samples[smp].uFlags &= ~CHN_PANNING; } @@ -1833,15 +1833,15 @@ void CCtrlInstruments::OnPanningChanged() //--------------------------------------- { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { int nPan = GetDlgItemInt(IDC_EDIT9); if (nPan < 0) nPan = 0; if (nPan > 256) nPan = 256; - if (nPan != (int)penv->nPan) + if (nPan != (int)pIns->nPan) { - penv->nPan = nPan; + pIns->nPan = nPan; if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) m_pModDoc->SetModified(); // -> CODE#0023 // -> DESC="IT project files (.itp)" @@ -1856,12 +1856,12 @@ void CCtrlInstruments::OnNNAChanged() //----------------------------------- { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { - if (penv->nNNA != m_ComboNNA.GetCurSel()) { + if (pIns->nNNA != m_ComboNNA.GetCurSel()) { m_pModDoc->SetModified(); - penv->nNNA = m_ComboNNA.GetCurSel(); + pIns->nNNA = m_ComboNNA.GetCurSel(); } // -> CODE#0023 @@ -1877,11 +1877,11 @@ void CCtrlInstruments::OnDCTChanged() //----------------------------------- { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { - if (penv->nDCT != m_ComboDCT.GetCurSel()) { - penv->nDCT = m_ComboDCT.GetCurSel(); + if (pIns->nDCT != m_ComboDCT.GetCurSel()) { + pIns->nDCT = m_ComboDCT.GetCurSel(); m_pModDoc->SetModified(); } // -> CODE#0023 @@ -1897,11 +1897,11 @@ void CCtrlInstruments::OnDCAChanged() //----------------------------------- { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { - if (penv->nDNA != m_ComboDCA.GetCurSel()) { - penv->nDNA = m_ComboDCA.GetCurSel(); + if (pIns->nDNA != m_ComboDCA.GetCurSel()) { + pIns->nDNA = m_ComboDCA.GetCurSel(); m_pModDoc->SetModified(); } // -> CODE#0023 @@ -1916,13 +1916,13 @@ void CCtrlInstruments::OnMPRChanged() //----------------------------------- { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { int n = GetDlgItemInt(IDC_EDIT10); if ((n >= 0) && (n <= 255)) { - if (penv->nMidiProgram != n) { - penv->nMidiProgram = n; + if (pIns->nMidiProgram != n) { + pIns->nMidiProgram = n; m_pModDoc->SetModified(); } } @@ -1947,14 +1947,14 @@ void CCtrlInstruments::OnMBKChanged() //----------------------------------- { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { WORD w = GetDlgItemInt(IDC_EDIT11); if ((w >= 0) && (w <= 255)) { - if (penv->wMidiBank != w) { + if (pIns->wMidiBank != w) { m_pModDoc->SetModified(); - penv->wMidiBank = w; + pIns->wMidiBank = w; } } //rewbs.MidiBank: we will not set the midi bank/program if it is 0 @@ -1975,12 +1975,12 @@ void CCtrlInstruments::OnMCHChanged() //----------------------------------- { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { int n = m_CbnMidiCh.GetItemData(m_CbnMidiCh.GetCurSel()); - if (penv->nMidiChannel != (BYTE)(n & 0xff)) { - penv->nMidiChannel = (BYTE)(n & 0xff); + if (pIns->nMidiChannel != (BYTE)(n & 0xff)) { + pIns->nMidiChannel = (BYTE)(n & 0xff); m_pModDoc->SetModified(); m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; m_pModDoc->UpdateAllViews(NULL, HINT_INSNAMES, this); @@ -1991,12 +1991,12 @@ void CCtrlInstruments::OnResamplingChanged() //------------------------------------------ { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { int n = m_CbnResampling.GetItemData(m_CbnResampling.GetCurSel()); - if (penv->nResampling != (BYTE)(n & 0xff)) { - penv->nResampling = (BYTE)(n & 0xff); + if (pIns->nResampling != (BYTE)(n & 0xff)) { + pIns->nResampling = (BYTE)(n & 0xff); m_pModDoc->SetModified(); m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; m_pModDoc->UpdateAllViews(NULL, HINT_INSNAMES, this); @@ -2009,10 +2009,10 @@ void CCtrlInstruments::OnMixPlugChanged() //--------------------------------------- { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; BYTE nPlug = static_cast<BYTE>(m_CbnMixPlug.GetItemData(m_CbnMixPlug.GetCurSel()) & 0xff); - if (penv) + if (pIns) { if(nPlug < 1 || m_pSndFile->GetModFlag(MSF_MIDICC_BUGEMULATION)) { @@ -2027,27 +2027,27 @@ if (nPlug>=0 && nPlug<MAX_MIXPLUGINS+1) { - if ((!IsLocked()) && penv->nMixPlug != nPlug) { + if ((!IsLocked()) && pIns->nMixPlug != nPlug) { m_pModDoc->SetModified(); - penv->nMixPlug = nPlug; + pIns->nMixPlug = nPlug; } - m_CbnPluginVelocityHandling.SetCurSel(penv->nPluginVelocityHandling); - m_CbnPluginVolumeHandling.SetCurSel(penv->nPluginVolumeHandling); + m_CbnPluginVelocityHandling.SetCurSel(pIns->nPluginVelocityHandling); + m_CbnPluginVolumeHandling.SetCurSel(pIns->nPluginVolumeHandling); m_pModDoc->UpdateAllViews(NULL, HINT_MIXPLUGINS, this); m_pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_INSNAMES, this); - if (penv->nMixPlug) //if we have not just set to no plugin + if (pIns->nMixPlug) //if we have not just set to no plugin { - PSNDMIXPLUGIN pPlug = &(m_pSndFile->m_MixPlugins[penv->nMixPlug-1]); + PSNDMIXPLUGIN pPlug = &(m_pSndFile->m_MixPlugins[pIns->nMixPlug-1]); if (pPlug && pPlug->pMixPlugin) { ::EnableWindow(::GetDlgItem(m_hWnd, IDC_INSVIEWPLG), true); // if this plug can recieve MIDI events and we have no MIDI channel // selected for this instrument, automatically select MIDI channel 1. - if (pPlug->pMixPlugin->isInstrument() && penv->nMidiChannel==0) { - penv->nMidiChannel=1; + if (pPlug->pMixPlugin->isInstrument() && pIns->nMidiChannel==0) { + pIns->nMidiChannel=1; m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; UpdateView((m_nInstrument << HINT_SHIFT_INS) | HINT_INSTRUMENT, NULL); } @@ -2067,13 +2067,13 @@ void CCtrlInstruments::OnPPSChanged() //----------------------------------- { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { int n = GetDlgItemInt(IDC_EDIT15); if ((n >= -32) && (n <= 32)) { - if (penv->nPPS != (signed char)n) { - penv->nPPS = (signed char)n; + if (pIns->nPPS != (signed char)n) { + pIns->nPPS = (signed char)n; m_pModDoc->SetModified(); } } @@ -2090,8 +2090,8 @@ // -> DESC="per-instrument volume ramping setup (refered as attack)" void CCtrlInstruments::OnAttackChanged() { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if(!IsLocked() && penv){ + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if(!IsLocked() && pIns){ int n = GetDlgItemInt(IDC_EDIT2); if(n < 0) n = 0; if(n > MAX_ATTACK_VALUE) n = MAX_ATTACK_VALUE; @@ -2099,13 +2099,13 @@ // -> CODE#0023 // -> DESC="IT project files (.itp)" - if(penv->nVolRamp != newRamp){ + if(pIns->nVolRamp != newRamp){ m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; m_pModDoc->UpdateAllViews(NULL, HINT_INSNAMES, this); } // -! NEW_FEATURE#0023 - penv->nVolRamp = newRamp; + pIns->nVolRamp = newRamp; m_SliderAttack.SetPos(n); if( CSpinButtonCtrl *spin = (CSpinButtonCtrl *)GetDlgItem(IDC_SPIN1) ) spin->SetPos(n); LockControls(); @@ -2120,14 +2120,14 @@ void CCtrlInstruments::OnPPCChanged() //----------------------------------- { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { int n = m_ComboPPC.GetCurSel(); if ((n >= 0) && (n <= NOTE_MAX - 1)) { - if (penv->nPPC != n) { + if (pIns->nPPC != n) { m_pModDoc->SetModified(); - penv->nPPC = n; + pIns->nPPC = n; } } // -> CODE#0023 @@ -2147,23 +2147,23 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; - if (penv) + MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + if (pIns) { if (bCutOff) { - penv->nIFC |= 0x80; + pIns->nIFC |= 0x80; } else { - penv->nIFC &= 0x7F; + pIns->nIFC &= 0x7F; } for (UINT i=0; i<MAX_CHANNELS; i++) { - if (pSndFile->Chn[i].pHeader == penv) + if (pSndFile->Chn[i].pModInstrument == pIns) { if (bCutOff) { - pSndFile->Chn[i].nCutOff = penv->nIFC & 0x7f; + pSndFile->Chn[i].nCutOff = pIns->nIFC & 0x7f; } else { pSndFile->Chn[i].nCutOff = 0x7f; @@ -2190,23 +2190,23 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; - if (penv) + MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + if (pIns) { if (bReso) { - penv->nIFR |= 0x80; + pIns->nIFR |= 0x80; } else { - penv->nIFR &= 0x7F; + pIns->nIFR &= 0x7F; } for (UINT i=0; i<MAX_CHANNELS; i++) { - if (pSndFile->Chn[i].pHeader == penv) + if (pSndFile->Chn[i].pModInstrument == pIns) { if (bReso) { - pSndFile->Chn[i].nResonance = penv->nIFC & 0x7f; + pSndFile->Chn[i].nResonance = pIns->nIFC & 0x7f; } else { pSndFile->Chn[i].nResonance = 0; @@ -2227,8 +2227,8 @@ void CCtrlInstruments::OnFilterModeChanged() //------------------------------------------ { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { int instFiltermode = m_CbnFilterMode.GetItemData(m_CbnFilterMode.GetCurSel()); if (!m_pModDoc) { @@ -2236,11 +2236,11 @@ } CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; + MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (penv) { + if (pIns) { - penv->nFilterMode = instFiltermode; + pIns->nFilterMode = instFiltermode; // Translate from mode as stored in instrument to mode as understood by player. // (The reason for the translation is that the player treats 0 as lowpass, @@ -2256,7 +2256,7 @@ //Update channel settings where this instrument is active, if required. if (instFiltermode != FLTMODE_UNCHANGED) { for (UINT i=0; i<MAX_CHANNELS; i++) { - if (pSndFile->Chn[i].pHeader == penv) { + if (pSndFile->Chn[i].pModInstrument == pIns) { pSndFile->Chn[i].nFilterMode = instFiltermode; } } @@ -2278,18 +2278,18 @@ } CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; + MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (penv) { + if (pIns) { if (bHighpass) { - penv->nFilterMode = FLTMODE_HIGHPASS; + pIns->nFilterMode = FLTMODE_HIGHPASS; } else { - penv->nFilterMode = 0; + pIns->nFilterMode = 0; } for (UINT i=0; i<MAX_CHANNELS; i++) { - if (pSndFile->Chn[i].pHeader == penv) { - pSndFile->Chn[i].nFilterMode = penv->nFilterMode; + if (pSndFile->Chn[i].pModInstrument == pIns) { + pSndFile->Chn[i].nFilterMode = pIns->nFilterMode; } } } @@ -2316,9 +2316,9 @@ if ((m_nInstrument) && (m_pModDoc) && (!IsLocked()) && (nCode != SB_ENDSCROLL)) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; + MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (penv) + if (pIns) { //Various optimisations by rewbs CSliderCtrl* pSlider = (CSliderCtrl*) pSB; @@ -2333,10 +2333,10 @@ int newRamp = n; //? MAX_ATTACK_LENGTH - n : 0; // -> CODE#0023 // -> DESC="IT project files (.itp)" - if(penv->nVolRamp != newRamp){ + if(pIns->nVolRamp != newRamp){ m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; m_pModDoc->UpdateAllViews(NULL, HINT_INSNAMES, this); - penv->nVolRamp = newRamp; + pIns->nVolRamp = newRamp; SetDlgItemInt(IDC_EDIT2,n); m_pModDoc->SetModified(); } @@ -2347,13 +2347,13 @@ else if (pSlider==&m_SliderVolSwing) { n = m_SliderVolSwing.GetPos(); - if ((n >= 0) && (n <= 64) && (n != (int)penv->nVolSwing)) + if ((n >= 0) && (n <= 64) && (n != (int)pIns->nVolSwing)) { // -> CODE#0023 // -> DESC="IT project files (.itp)" m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; // -! NEW_FEATURE#0023 - penv->nVolSwing = (BYTE)n; + pIns->nVolSwing = (BYTE)n; m_pModDoc->SetModified(); } } @@ -2361,13 +2361,13 @@ else if (pSlider==&m_SliderPanSwing) { n = m_SliderPanSwing.GetPos(); - if ((n >= 0) && (n <= 64) && (n != (int)penv->nPanSwing)) + if ((n >= 0) && (n <= 64) && (n != (int)pIns->nPanSwing)) { // -> CODE#0023 // -> DESC="IT project files (.itp)" m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; // -! NEW_FEATURE#0023 - penv->nPanSwing = (BYTE)n; + pIns->nPanSwing = (BYTE)n; m_pModDoc->SetModified(); } } @@ -2375,10 +2375,10 @@ else if (pSlider==&m_SliderCutSwing) { n = m_SliderCutSwing.GetPos(); - if ((n >= 0) && (n <= 64) && (n != (int)penv->nCutSwing)) + if ((n >= 0) && (n <= 64) && (n != (int)pIns->nCutSwing)) { m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; - penv->nCutSwing = (BYTE)n; + pIns->nCutSwing = (BYTE)n; m_pModDoc->SetModified(); } } @@ -2386,10 +2386,10 @@ else if (pSlider==&m_SliderResSwing) { n = m_SliderResSwing.GetPos(); - if ((n >= 0) && (n <= 64) && (n != (int)penv->nResSwing)) + if ((n >= 0) && (n <= 64) && (n != (int)pIns->nResSwing)) { m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; - penv->nResSwing = (BYTE)n; + pIns->nResSwing = (BYTE)n; m_pModDoc->SetModified(); } } @@ -2397,14 +2397,14 @@ else if (pSlider==&m_SliderCutOff) { n = m_SliderCutOff.GetPos(); - if ((n >= 0) && (n < 0x80) && (n != (int)(penv->nIFC & 0x7F))) + if ((n >= 0) && (n < 0x80) && (n != (int)(pIns->nIFC & 0x7F))) { // -> CODE#0023 // -> DESC="IT project files (.itp)" m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; // -! NEW_FEATURE#0023 - penv->nIFC &= 0x80; - penv->nIFC |= (BYTE)n; + pIns->nIFC &= 0x80; + pIns->nIFC |= (BYTE)n; m_pModDoc->SetModified(); UpdateFilterText(); filterChanger = true; @@ -2414,14 +2414,14 @@ { // Filter Resonance n = m_SliderResonance.GetPos(); - if ((n >= 0) && (n < 0x80) && (n != (int)(penv->nIFR & 0x7F))) + if ((n >= 0) && (n < 0x80) && (n != (int)(pIns->nIFR & 0x7F))) { // -> CODE#0023 // -> DESC="IT project files (.itp)" m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; // -! NEW_FEATURE#0023 - penv->nIFR &= 0x80; - penv->nIFR |= (BYTE)n; + pIns->nIFR &= 0x80; + pIns->nIFR |= (BYTE)n; m_pModDoc->SetModified(); filterChanger = true; } @@ -2432,10 +2432,10 @@ { for (UINT i=0; i<MAX_CHANNELS; i++) { - if (pSndFile->Chn[i].pHeader == penv) + if (pSndFile->Chn[i].pModInstrument == pIns) { - if (penv->nIFC & 0x80) pSndFile->Chn[i].nCutOff = penv->nIFC & 0x7F; - if (penv->nIFR & 0x80) pSndFile->Chn[i].nResonance = penv->nIFR & 0x7F; + if (pIns->nIFC & 0x80) pSndFile->Chn[i].nCutOff = pIns->nIFC & 0x7F; + if (pIns->nIFR & 0x80) pSndFile->Chn[i].nResonance = pIns->nIFR & 0x7F; } } } @@ -2460,8 +2460,8 @@ if ((m_nInstrument) && (m_pModDoc)) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; - if (penv) + MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + if (pIns) { CSampleMapDlg dlg(pSndFile, m_nInstrument, this); if (dlg.DoModal() == IDOK) @@ -2536,7 +2536,7 @@ { if (IsLocked() || m_pModDoc == NULL || m_pSndFile == NULL) return; - INSTRUMENTHEADER* pInstH = m_pSndFile->Headers[m_nInstrument]; + MODINSTRUMENT* pInstH = m_pSndFile->Instruments[m_nInstrument]; if(pInstH == 0) return; @@ -2610,10 +2610,10 @@ { if (m_pModDoc == 0 || m_pSndFile == 0 || m_nInstrument > m_pSndFile->GetNumInstruments() - || m_pSndFile->Headers[m_nInstrument] == NULL) return; + || m_pSndFile->Instruments[m_nInstrument] == NULL) return; - INSTRUMENTHEADER* const penv = m_pSndFile->Headers[m_nInstrument]; - if(penv->pTuning == NULL) + MODINSTRUMENT* const pIns = m_pSndFile->Instruments[m_nInstrument]; + if(pIns->pTuning == NULL) { m_ComboTuning.SetCurSel(0); return; @@ -2621,7 +2621,7 @@ for(size_t i = 0; i < CSoundFile::GetStandardTunings().GetNumTunings(); i++) { - if(penv->pTuning == &CSoundFile::GetStandardTunings().GetTuning(i)) + if(pIns->pTuning == &CSoundFile::GetStandardTunings().GetTuning(i)) { m_ComboTuning.SetCurSel(i+1); return; @@ -2630,7 +2630,7 @@ for(size_t i = 0; i < CSoundFile::GetLocalTunings().GetNumTunings(); i++) { - if(penv->pTuning == &CSoundFile::GetLocalTunings().GetTuning(i)) + if(pIns->pTuning == &CSoundFile::GetLocalTunings().GetTuning(i)) { m_ComboTuning.SetCurSel(i+CSoundFile::GetStandardTunings().GetNumTunings()+1); return; @@ -2639,7 +2639,7 @@ for(size_t i = 0; i < m_pSndFile->GetTuneSpecificTunings().GetNumTunings(); i++) { - if(penv->pTuning == &m_pSndFile->GetTuneSpecificTunings().GetTuning(i)) + if(pIns->pTuning == &m_pSndFile->GetTuneSpecificTunings().GetTuning(i)) { m_ComboTuning.SetCurSel(i+CSoundFile::GetStandardTunings().GetNumTunings() + CSoundFile::GetLocalTunings().GetNumTunings()+1); return; @@ -2647,10 +2647,10 @@ } CString str; - str.Format(TEXT("Tuning %s was not found. Setting to default tuning."), m_pSndFile->Headers[m_nInstrument]->pTuning->GetName().c_str()); + str.Format(TEXT("Tuning %s was not found. Setting to default tuning."), m_pSndFile->Instruments[m_nInstrument]->pTuning->GetName().c_str()); MessageBox(str); BEGIN_CRITICAL(); - penv->SetTuning(penv->s_DefaultTuning); + pIns->SetTuning(pIns->s_DefaultTuning); END_CRITICAL(); m_pModDoc->SetModified(); UpdateView((m_nInstrument << HINT_SHIFT_INS) | HINT_INSTRUMENT); @@ -2659,7 +2659,7 @@ void CCtrlInstruments::OnEnChangeEditPitchtempolock() //---------------------------------------------------- { - if(IsLocked() || !m_pModDoc || !m_pSndFile || !m_nInstrument || !m_pSndFile->Headers[m_nInstrument]) return; + if(IsLocked() || !m_pModDoc || !m_pSndFile || !m_nInstrument || !m_pSndFile->Instruments[m_nInstrument]) return; const TEMPO MINTEMPO = m_pSndFile->GetModSpecifications().tempoMin; const TEMPO MAXTEMPO = m_pSndFile->GetModSpecifications().tempoMax; @@ -2672,7 +2672,7 @@ ptlTempo = MAXTEMPO; BEGIN_CRITICAL(); - m_pSndFile->Headers[m_nInstrument]->wPitchToTempoLock = ptlTempo; + m_pSndFile->Instruments[m_nInstrument]->wPitchToTempoLock = ptlTempo; END_CRITICAL(); m_pModDoc->SetModified(); } @@ -2681,13 +2681,13 @@ void CCtrlInstruments::OnPluginVelocityHandlingChanged() //------------------------------------------------ { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { BYTE n = static_cast<BYTE>(m_CbnPluginVelocityHandling.GetCurSel()); - if(n != penv->nPluginVelocityHandling) + if(n != pIns->nPluginVelocityHandling) { - penv->nPluginVelocityHandling = n; + pIns->nPluginVelocityHandling = n; m_pModDoc->SetModified(); m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; m_pModDoc->UpdateAllViews(NULL, HINT_INSNAMES, this); @@ -2699,13 +2699,13 @@ void CCtrlInstruments::OnPluginVolumeHandlingChanged() //---------------------------------------------- { - INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; - if ((!IsLocked()) && (penv)) + MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; + if ((!IsLocked()) && (pIns)) { BYTE n = static_cast<BYTE>(m_CbnPluginVolumeHandling.GetCurSel()); - if(n != penv->nPluginVolumeHandling) + if(n != pIns->nPluginVolumeHandling) { - penv->nPluginVolumeHandling = n; + pIns->nPluginVolumeHandling = n; m_pModDoc->SetModified(); m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; m_pModDoc->UpdateAllViews(NULL, HINT_INSNAMES, this); @@ -2717,19 +2717,19 @@ void CCtrlInstruments::OnBnClickedCheckPitchtempolock() //----------------------------------------------------- { - if(!m_pSndFile || !m_nInstrument || !m_pSndFile->Headers[m_nInstrument]) + if(!m_pSndFile || !m_nInstrument || !m_pSndFile->Instruments[m_nInstrument]) return; if(IsDlgButtonChecked(IDC_CHECK_PITCHTEMPOLOCK)) { - INSTRUMENTHEADER* penv = m_pSndFile->Headers[m_nInstrument]; - if(!penv) + MODINSTRUMENT* pIns = m_pSndFile->Instruments[m_nInstrument]; + if(!pIns) return; //Checking what value to put for the wPitchToTempoLock. m_EditPitchTempoLock.EnableWindow(); - WORD ptl = penv->wPitchToTempoLock; + WORD ptl = pIns->wPitchToTempoLock; if(ptl == 0) { if(m_EditPitchTempoLock.GetWindowTextLength() > 0) @@ -2747,11 +2747,11 @@ else { m_EditPitchTempoLock.EnableWindow(FALSE); - if(m_pSndFile && m_nInstrument && m_pSndFile->Headers[m_nInstrument] && - m_pSndFile->Headers[m_nInstrument]->wPitchToTempoLock > 0) + if(m_pSndFile && m_nInstrument && m_pSndFile->Instruments[m_nInstrument] && + m_pSndFile->Instruments[m_nInstrument]->wPitchToTempoLock > 0) { BEGIN_CRITICAL(); - m_pSndFile->Headers[m_nInstrument]->wPitchToTempoLock = 0; + m_pSndFile->Instruments[m_nInstrument]->wPitchToTempoLock = 0; END_CRITICAL(); m_pModDoc->SetModified(); } Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-08-15 15:39:31 UTC (rev 325) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-08-15 19:28:24 UTC (rev 326) @@ -314,7 +314,7 @@ m_CbnSplitInstrument.SetItemData(m_CbnSplitInstrument.AddString(" None"), 0); if (m_pSndFile->m_nInstruments) { for (UINT i=1; i<=m_pSndFile->m_nInstruments; i++) { - if (m_pSndFile->Headers[i] == NULL) { + if (m_pSndFile->Instruments[i] == NULL) { continue; } @@ -1203,7 +1203,7 @@ { if ((m_nInstrument) && (m_pModDoc)) { - UINT nPlug = m_pSndFile->Headers[(split?m_nSplitInstrument:m_nInstrument)]->nMixPlug; + UINT nPlug = m_pSndFile->Instruments[(split?m_nSplitInstrument:m_nInstrument)]->nMixPlug; if (nPlug) //if not no plugin { PSNDMIXPLUGIN pPlug = &(m_pSndFile->m_MixPlugins[nPlug-1]); @@ -1224,9 +1224,9 @@ bool CCtrlPatterns::HasValidPlug(UINT instr) //------------------------------------------ { - if ((instr) && (instr<MAX_INSTRUMENTS) && (m_pSndFile) && m_pSndFile->Headers[instr]) + if ((instr) && (instr<MAX_INSTRUMENTS) && (m_pSndFile) && m_pSndFile->Instruments[instr]) { - UINT nPlug = m_pSndFile->Headers[instr]->nMixPlug; + UINT nPlug = m_pSndFile->Instruments[instr]->nMixPlug; if (nPlug) //if not no plugin { PSNDMIXPLUGIN pPlug = &(m_pSndFile->m_MixPlugins[nPlug-1]); Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-08-15 15:39:31 UTC (rev 325) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-08-15 19:28:24 UTC (rev 326) @@ -855,8 +855,8 @@ } // Drawing note m_Dib.SetTextColor(tx_col, bk_col); - if(pSndFile->m_nType == MOD_TYPE_MPT && m->instr < MAX_INSTRUMENTS && pSndFile->Headers[m->instr]) - DrawNote(xbmp+x, 0, m->note, pSndFile->Headers[m->instr]->pTuning); + if(pSndFile->m_nType == MOD_TYPE_MPT && m->instr < MAX_INSTRUMENTS && pSndFile->Instruments[m->instr]) + DrawNote(xbmp+x, 0, m->note, pSndFile->Instruments[m->instr]->pTuning); else //Original DrawNote(xbmp+x, 0, m->note); } @@ -1483,14 +1483,14 @@ CHAR sztmp[128] = ""; if (pSndFile->m_nInstruments) { - if ((m->instr <= pSndFile->m_nInstruments) && (pSndFile->Headers[m->instr])) + if ((m->instr <= pSndFile->m_nInstruments) && (pSndFile->Instruments[m->instr])) { - INSTRUMENTHEADER *penv = pSndFile->Headers[m->instr]; - memcpy(sztmp, penv->name, 32); + MODINSTRUMENT *pIns = pSndFile->Instruments[m->instr]; + memcpy(sztmp, pIns->name, 32); sztmp[32] = 0; if ((m->note) && (m->note <= NOTE_MAX)) { - UINT nsmp = penv->Keyboard[m->note-1]; + UINT nsmp = pIns->Keyboard[m->note-1]; if ((nsmp) && (nsmp <= pSndFile->m_nSamples)) { CHAR sztmp2[64] = ""; Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-08-15 15:39:31 UTC (rev 325) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-08-15 19:28:24 UTC (rev 326) @@ -1575,7 +1575,7 @@ MODCHANNEL *pChn = &m_pSndFile->Chn[k]; p->dwPos[k] = 0; if ((nIns) && (nIns <= m_pSndFile->m_nInstruments) && (pChn->nLength) - && (pChn->pHeader) && (pChn->pHeader == m_pSndFile->Headers[nIns]) + && (pChn->pModInstrument) && (pChn->pModInstrument == m_pSndFile->Instruments[nIns]) && ((!(pChn->dwFlags & CHN_NOTEFADE)) || (pChn->nFadeOutVol))) { if (m_dwNotifyType & MPTNOTIFY_PITCHENV) Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-08-15 15:39:31 UTC (rev 325) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-08-15 19:28:24 UTC (rev 326) @@ -209,25 +209,25 @@ BeginWaitCursor(); LPMIDILIBSTRUCT lpMidiLib = CTrackApp::GetMidiLibrary(); // Scan Instruments - if (lpMidiLib) for (UINT nIns=1; nIns<=m_SndFile.m_nInstruments; nIns++) if (m_SndFile.Headers[nIns]) + if (lpMidiLib) for (UINT nIns=1; nIns<=m_SndFile.m_nInstruments; nIns++) if (m_SndFile.Instruments[nIns]) { LPCSTR pszMidiMapName; - INSTRUMENTHEADER *penv = m_SndFile.Headers[nIns]; + MODINSTRUMENT *pIns = m_SndFile.Instruments[nIns]; UINT nMidiCode; BOOL bEmbedded = FALSE; - if (penv->nMidiChannel == 10) - nMidiCode = 0x80 | (penv->nMidiDrumKey & 0x7F); + if (pIns->nMidiChannel == 10) + nMidiCode = 0x80 | (pIns->nMidiDrumKey & 0x7F); else - nMidiCode = penv->nMidiProgram & 0x7F; + nMidiCode = pIns->nMidiProgram & 0x7F; pszMidiMapName = lpMidiLib->MidiMap[nMidiCode]; if (pEmbeddedBank) { UINT nDlsIns = 0, nDrumRgn = 0; - UINT nProgram = penv->nMidiProgram; + UINT nProgram = pIns->nMidiProgram; UINT dwKey = (nMidiCode < 128) ? 0xFF : (nMidiCode & 0x7F); if ((pEmbeddedBank->FindInstrument( (nMidiCode >= 128), - (penv->wMidiBank & 0x3FFF), + (pIns->wMidiBank & 0x3FFF), nProgram, dwKey, &nDlsIns)) || (pEmbeddedBank->FindInstrument( (nMidiCode >= 128), 0xFFFF, (nMidiCode >= 128) ? 0xFF : nProgram, @@ -238,7 +238,7 @@ { if ((dwKey >= 24) && (dwKey < 100)) { - lstrcpyn(penv->name, szMidiPercussionNames[dwKey-24], sizeof(penv->name)); + lstrcpyn(pIns->name, szMidiPercussionNames[dwKey-24], sizeof(pIns->name)); } bEmbedded = TRUE; } @@ -264,10 +264,10 @@ if (pDLSBank) { UINT nDlsIns = 0, nDrumRgn = 0; - UINT nProgram = penv->nMidiProgram; + UINT nProgram = pIns->nMidiProgram; UINT dwKey = (nMidiCode < 128) ? 0xFF : (nMidiCode & 0x7F); if ((pDLSBank->FindInstrument( (nMidiCode >= 128), - (penv->wMidiBank & 0x3FFF), + (pIns->wMidiBank & 0x3FFF), nProgram, dwKey, &nDlsIns)) || (pDLSBank->FindInstrument( (nMidiCode >= 128), 0xFFFF, (nMidiCode >= 128) ? 0xFF : nProgram, @@ -277,7 +277,7 @@ pDLSBank->ExtractInstrument(&m_SndFile, nIns, nDlsIns, nDrumRgn); if ((dwKey >= 24) && (dwKey < 24+61)) { - lstrcpyn(penv->name, szMidiPercussionNames[dwKey-24], sizeof(penv->name)); + lstrcpyn(pIns->name, szMidiPercussionNames[dwKey-24], sizeof(pIns->name)); } } } @@ -297,18 +297,18 @@ m_SndFile.ReadInstrumentFromFile(nIns, lpFile, len); _splitpath(pszMidiMapName, NULL, NULL, szName, szExt); strncat(szName, szExt, sizeof(szName)); - penv = m_SndFile.Headers[nIns]; - if (!penv->filename[0]) lstrcpyn(penv->filename, szName, sizeof(penv->filename)); - if (!penv->name[0]) + pIns = m_SndFile.Instruments[nIns]; + if (!pIns->filename[0]) lstrcpyn(pIns->filename, szName, sizeof(pIns->filename)); + if (!pIns->name[0]) { if (nMidiCode < 128) { - lstrcpyn(penv->name, szMidiProgramNames[nMidiCode], sizeof(penv->name)); + lstrcpyn(pIns->name, szMidiProgramNames[nMidiCode], sizeof(pIns->name)); } else { UINT nKey = nMidiCode & 0x7F; if (nKey >= 24) - lstrcpyn(penv->name, szMidiPercussionNames[nKey-24], sizeof(penv->name)); + lstrcpyn(pIns->name, szMidiPercussionNames[nKey-24], sizeof(pIns->name)); } } } @@ -678,8 +678,8 @@ if ((!m_SndFile.m_nInstruments) && (m_SndFile.m_nType & MOD_TYPE_XM)) { m_SndFile.m_nInstruments = 1; - m_SndFile.Headers[1] = new INSTRUMENTHEADER; - InitializeInstrument(m_SndFile.Headers[1], 1); + m_SndFile.Instruments[1] = new MODINSTRUMENT; + InitializeInstrument(m_SndFile.Instruments[1], 1); } if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT|MOD_TYPE_XM)) { @@ -849,7 +849,7 @@ else if ((nsmp) && (nsmp < MAX_SAMPLES)) { //Or set sample MODSAMPLE *pSmp = &m_SndFile.Samples[nsmp]; pChn->pCurrentSample = pSmp->pSample; - pChn->pHeader = NULL; + pChn->pModInstrument = NULL; pChn->pModSample = pSmp; pChn->pSample = pSmp->pSample; pChn->nFineTune = pSmp->nFineTune; @@ -914,22 +914,22 @@ //rewbs.vstiLive if (nins <= m_SndFile.m_nInstruments) { - INSTRUMENTHEADER *penv = m_SndFile.Headers[nins]; - if (penv && penv->nMidiChannel > 0 && penv->nMidiChannel < 17) // instro sends to a midi chan + MODINSTRUMENT *pIns = m_SndFile.Instruments[nins]; + if (pIns && pIns->nMidiChannel > 0 && pIns->nMidiChannel < 17) // instro sends to a midi chan { // UINT nPlugin = m_SndFile.GetBestPlugin(nChn, PRIORITISE_INSTRUMENT, EVEN_IF_MUTED); UINT nPlugin = 0; - if (pChn->pHeader) - nPlugin = pChn->pHeader->nMixPlug; // first try intrument VST + if (pChn->pModInstrument) + nPlugin = pChn->pModInstrument->nMixPlug; // first try intrument VST if ((!nPlugin) || (nPlugin > MAX_MIXPLUGINS) && (nCurrentChn >=0)) nPlugin = m_SndFile.ChnSettings[nCurrentChn].nMixPlugin; // Then try Channel VST if ((nPlugin) && (nPlugin <= MAX_MIXPLUGINS)) { IMixPlugin *pPlugin = m_SndFile.m_MixPlugins[nPlugin-1].pMixPlugin; - if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note, pChn->nVolume, MAX_BASECHANNELS); - //if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note, pChn->GetVSTVolume(), MAX_BASECHANNELS); + if (pPlugin) pPlugin->MidiCommand(pIns->nMidiChannel, pIns->nMidiProgram, pIns->wMidiBank, note, pChn->nVolume, MAX_BASECHANNELS); + //if (pPlugin) pPlugin->MidiCommand(pIns->nMidiChannel, pIns->nMidiProgram, pIns->wMidiBank, note, pChn->GetVSTVolume(), MAX_BASECHANNELS); } } } @@ -963,11 +963,11 @@ //rewbs.vstiLive if (nins>0 && nins<=m_SndFile.m_nInstruments) { - INSTRUMENTHEADER *penv = m_SndFile.Headers[nins]; - if (penv && penv->nMidiChannel > 0 && penv->nMidiChannel < 17) // instro sends to a midi chan + MODINSTRUMENT *pIns = m_SndFile.Instruments[nins]; + if (pIns && pIns->nMidiChannel > 0 && pIns->nMidiChannel < 17) // instro sends to a midi chan { - UINT nPlugin = penv->nMixPlug; // First try intrument VST + UINT nPlugin = pIns->nMixPlug; // First try intrument VST if (((!nPlugin) || (nPlugin > MAX_MIXPLUGINS)) && //no good plug yet (nCurrentChn<MAX_CHANNELS)) // chan OK nPlugin = m_SndFile.ChnSettings[nCurrentChn].nMixPlugin;// Then try Channel VST @@ -975,7 +975,7 @@ if ((nPlugin) && (nPlugin <= MAX_MIXPLUGINS)) { IMixPlugin *pPlugin = m_SndFile.m_MixPlugins[nPlugin-1].pMixPlugin; - if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note+NOTE_KEYOFF, 0, MAX_BASECHANNELS); + if (pPlugin) pPlugin->MidiCommand(pIns->nMidiChannel, pIns->nMidiProgram, pIns->wMidiBank, note+NOTE_KEYOFF, 0, MAX_BASECHANNELS); } } @@ -1011,7 +1011,7 @@ if ((pChn->nLength) && (!(pChn->dwFlags & (CHN_NOTEFADE|CHN_KEYOFF|CHN_MUTE))) && ((note == pChn->nNewNote) || (!note)) && ((pChn->pModSample == &m_SndFile.Samples[nsmp]) || (!nsmp)) - && ((pChn->pHeader == m_SndFile.Headers[nins]) || (!nins))) return TRUE; + && ((pChn->pModInstrument == m_SndFile.Instruments[nins]) || (!nins))) return TRUE; } return FALSE; } @@ -1040,9 +1040,9 @@ UINT nPlug = m_SndFile.GetBestPlugin(nChn, PRIORITISE_INSTRUMENT, EVEN_IF_MUTED); if ((nPlug) && (nPlug<=MAX_MIXPLUGINS)) { CVstPlugin *pPlug = (CVstPlugin*)m_SndFile.m_MixPlugins[nPlug-1].pMixPlugin; - INSTRUMENTHEADER* penv = m_SndFile.Chn[nChn].pHeader; - if (pPlug && penv) { - pPlug->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, NOTE_KEYOFF, 0, nChn); + MODINSTRUMENT* pIns = m_SndFile.Chn[nChn].pModInstrument; + if (pPlug && pIns) { + pPlug->MidiCommand(pIns->nMidiChannel, pIns->nMidiProgram, pIns->wMidiBank, NOTE_KEYOFF, 0, nChn); } } } else { @@ -1189,9 +1189,9 @@ BOOL CModDoc::MuteInstrument(UINT nInstr, BOOL bMute) //--------------------------------------------------- { - if ((nInstr < 1) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Headers[nInstr])) return FALSE; - if (bMute) m_SndFile.Headers[nInstr]->dwFlags |= ENV_MUTE; - else m_SndFile.Headers[nInstr]->dwFlags &= ~ENV_MUTE; + if ((nInstr < 1) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nInstr])) return FALSE; + if (bMute) m_SndFile.Instruments[nInstr]->dwFlags |= ENV_MUTE; + else m_SndFile.Instruments[nInstr]->dwFlags &= ~ENV_MUTE; return TRUE; } @@ -1267,8 +1267,8 @@ BOOL CModDoc::IsInstrumentMuted(UINT nInstr) const //------------------------------------------------ { - if ((!nInstr) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Headers[nInstr])) return FALSE; - return (m_SndFile.Headers[nInstr]->dwFlags & ENV_MUTE) ? TRUE : FALSE; + if ((!nInstr) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nInstr])) return FALSE; + return (m_SndFile.Instruments[nInstr]->dwFlags & ENV_MUTE) ? TRUE : FALSE; } @@ -1293,14 +1293,14 @@ BOOL CModDoc::IsChildSample(UINT nIns, UINT nSmp) const //----------------------------------------------------- { - INSTRUMENTHEADER *penv; + MODINSTRUMENT *pIns; if ((nIns < 1) || (nIns > m_SndFile.m_nInstruments)) return FALSE; - penv = m_SndFile.Headers[nIns]; - if (penv) + pIns = m_SndFile.Instruments[nIns]; + if (pIns) { for (UINT i=0; i<NOTE_MAX; i++) { - if (penv->Keyboard[i] == nSmp) return TRUE; + if (pIns->Keyboard[i] == nSmp) return TRUE; } } return FALSE; @@ -1313,12 +1313,12 @@ if ((!m_SndFile.m_nInstruments) || (!nSmp)) return 0; for (UINT i=1; i<=m_SndFile.m_nInstruments; i++) { - INSTRUMENTHEADER *penv = m_SndFile.Headers[i]; - if (penv) + ... [truncated message content] |
From: <rel...@us...> - 2009-08-16 11:46:45
|
Revision: 327 http://modplug.svn.sourceforge.net/modplug/?rev=327&view=rev Author: relabsoluness Date: 2009-08-16 11:46:32 +0000 (Sun, 16 Aug 2009) Log Message: ----------- [Fix] Sample tab: Fix to crash that occurred when resizing sample while it was playing. [Fix] Instrument tab: Fix to crash that occurred when multiple windows had instrument tab of the same document open. [Fix] Tuning: Default tuning file should now load correctly (broken in rev. 323). [Ref] S3M load: Check parameters before reading. [Ref] Internal: Changes to get rid of some compiler warnings and disabled some warnings (see Stdafx.h). Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h trunk/OpenMPT/mptrack/Stdafx.h trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/serialization_utils.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.h Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-15 19:28:24 UTC (rev 326) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-16 11:46:32 UTC (rev 327) @@ -1295,7 +1295,7 @@ // -> DESC="IT project files (.itp)" int n = strlen(lpszFileName); if(n >= _MAX_PATH) n = _MAX_PATH-1; - strncpy(&m_pSndFile->m_szInstrumentPath[m_nInstrument-1][0],lpszFileName,n); + strncpy(m_pSndFile->m_szInstrumentPath[m_nInstrument-1],lpszFileName,n); m_pSndFile->m_szInstrumentPath[m_nInstrument-1][n] = '\0'; m_pSndFile->instrumentModified[m_nInstrument-1] = FALSE; // -! NEW_FEATURE#0023 @@ -1643,7 +1643,7 @@ // -> DESC="IT project files (.itp)" int n = strlen(dlg.GetPathName()); if(n > _MAX_PATH) n = _MAX_PATH; - strncpy(&m_pSndFile->m_szInstrumentPath[m_nInstrument-1][0],dlg.GetPathName(),n); + strncpy(m_pSndFile->m_szInstrumentPath[m_nInstrument-1],dlg.GetPathName(),n); m_pSndFile->instrumentModified[m_nInstrument-1] = FALSE; // -! NEW_FEATURE#0023 @@ -2030,13 +2030,12 @@ if ((!IsLocked()) && pIns->nMixPlug != nPlug) { m_pModDoc->SetModified(); pIns->nMixPlug = nPlug; + m_pModDoc->UpdateAllViews(NULL, HINT_MIXPLUGINS, this); + m_pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_INSNAMES, this); } m_CbnPluginVelocityHandling.SetCurSel(pIns->nPluginVelocityHandling); m_CbnPluginVolumeHandling.SetCurSel(pIns->nPluginVolumeHandling); - m_pModDoc->UpdateAllViews(NULL, HINT_MIXPLUGINS, this); - m_pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_INSNAMES, this); - if (pIns->nMixPlug) //if we have not just set to no plugin { PSNDMIXPLUGIN pPlug = &(m_pSndFile->m_MixPlugins[pIns->nMixPlug-1]); @@ -2653,7 +2652,6 @@ pIns->SetTuning(pIns->s_DefaultTuning); END_CRITICAL(); m_pModDoc->SetModified(); - UpdateView((m_nInstrument << HINT_SHIFT_INS) | HINT_INSTRUMENT); } void CCtrlInstruments::OnEnChangeEditPitchtempolock() Modified: trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp =================================================================== --- trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp 2009-08-15 19:28:24 UTC (rev 326) +++ trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp 2009-08-16 11:46:32 UTC (rev 327) @@ -9,7 +9,7 @@ // CScaleEnvPointsDlg dialog IMPLEMENT_DYNAMIC(CScaleEnvPointsDlg, CDialog) -CScaleEnvPointsDlg::CScaleEnvPointsDlg(CWnd* pParent, MODINSTRUMENT* pInst, BYTE env) +CScaleEnvPointsDlg::CScaleEnvPointsDlg(CWnd* pParent, MODINSTRUMENT* pInst, UINT env) : CDialog(CScaleEnvPointsDlg::IDD, pParent), m_pInstrument(pInst), m_Env(env) Modified: trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h =================================================================== --- trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h 2009-08-15 19:28:24 UTC (rev 326) +++ trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h 2009-08-16 11:46:32 UTC (rev 327) @@ -11,7 +11,7 @@ DECLARE_DYNAMIC(CScaleEnvPointsDlg) public: - CScaleEnvPointsDlg(CWnd* pParent, MODINSTRUMENT* pInst, BYTE env); // standard constructor + CScaleEnvPointsDlg(CWnd* pParent, MODINSTRUMENT* pInst, UINT env); // standard constructor virtual ~CScaleEnvPointsDlg(); // Dialog Data @@ -24,7 +24,7 @@ private: MODINSTRUMENT* m_pInstrument; - BYTE m_Env; //To tell which envelope to process. + UINT m_Env; //To tell which envelope to process. CEdit m_EditFactor; protected: virtual void OnOK(); Modified: trunk/OpenMPT/mptrack/Stdafx.h =================================================================== --- trunk/OpenMPT/mptrack/Stdafx.h 2009-08-15 19:28:24 UTC (rev 326) +++ trunk/OpenMPT/mptrack/Stdafx.h 2009-08-16 11:46:32 UTC (rev 327) @@ -29,7 +29,7 @@ #define MMNODRV #define MMNOMCI -//#define _CRT_SECURE_NO_WARNINGS // Define to disable the "This function or variable may be unsafe" warnings. +#define _CRT_SECURE_NO_WARNINGS // Define to disable the "This function or variable may be unsafe" warnings. #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1 Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2009-08-15 19:28:24 UTC (rev 326) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-08-16 11:46:32 UTC (rev 327) @@ -2606,7 +2606,7 @@ dlg.m_ofn.nMaxFile = _MAX_PATH; if(dlg.DoModal() == IDOK){ - strcpy(&pSndFile->m_szInstrumentPath[dwItem-1][0],pszFileNames); + strcpy(pSndFile->m_szInstrumentPath[dwItem-1], pszFileNames); OnRefreshTree(); } @@ -2642,7 +2642,7 @@ dlg.m_ofn.lpstrFile = pszFileNames; dlg.m_ofn.nMaxFile = _MAX_PATH; - if(dlg.DoModal() == IDOK) strcpy(&pSndFile->m_szInstrumentPath[dwItem-1][0],pszFileNames); + if(dlg.DoModal() == IDOK) strcpy(pSndFile->m_szInstrumentPath[dwItem-1], pszFileNames); dlg.m_ofn.lpstrFile = NULL; dlg.m_ofn.nMaxFile = 0; Modified: trunk/OpenMPT/mptrack/serialization_utils.cpp =================================================================== --- trunk/OpenMPT/mptrack/serialization_utils.cpp 2009-08-15 19:28:24 UTC (rev 326) +++ trunk/OpenMPT/mptrack/serialization_utils.cpp 2009-08-16 11:46:32 UTC (rev 327) @@ -696,7 +696,7 @@ } if(Testbit(flagbyte, 3)) - iStrm.ignore(8); + iStrm.ignore(5); // Read entrycount ReadAdaptive1248(iStrm, tempU64); Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-08-15 19:28:24 UTC (rev 326) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-08-16 11:46:32 UTC (rev 327) @@ -255,6 +255,8 @@ bool CSoundFile::ReadS3M(const BYTE *lpStream, DWORD dwMemLength) //--------------------------------------------------------------- { + if ((!lpStream) || (dwMemLength <= sizeof(S3MFILEHEADER)+sizeof(S3MSAMPLESTRUCT)+64)) return false; + UINT insnum,patnum,nins,npat; DWORD insfile[128]; WORD ptr[256]; @@ -273,7 +275,6 @@ psfh.scrm = LittleEndian(psfh.scrm); psfh.special = LittleEndianW(psfh.special); - if ((!lpStream) || (dwMemLength <= sizeof(S3MFILEHEADER)+sizeof(S3MSAMPLESTRUCT)+64)) return false; if (psfh.scrm != 0x4D524353) return false; if((psfh.cwtv & 0xF000) == 0x5000) // OpenMPT Version number (Major.Minor) Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-08-15 19:28:24 UTC (rev 326) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-08-16 11:46:32 UTC (rev 327) @@ -11,15 +11,17 @@ namespace ctrlSmp { -void ReplaceSample(MODSAMPLE& smp, const LPSTR pNewSample, const SmpLength nNewLength) -//---------------------------------------------------------------------------------------- +void ReplaceSample(MODSAMPLE& smp, const LPSTR pNewSample, const SmpLength nNewLength, CSoundFile* pSndFile) +//---------------------------------------------------------------------------------------------------------- { LPSTR const pOldSmp = smp.pSample; BEGIN_CRITICAL(); + if (pSndFile != nullptr) + ctrlChn::ReplaceSample(pSndFile->Chn, pOldSmp, pNewSample, nNewLength); smp.pSample = pNewSample; smp.nLength = nNewLength; - END_CRITICAL(); - CSoundFile::FreeSample(pOldSmp); + CSoundFile::FreeSample(pOldSmp); + END_CRITICAL(); } @@ -60,7 +62,7 @@ AfxMessageBox(TEXT("Unsupported start position in InsertSilence.")); } - ReplaceSample(smp, pNewSmp, nNewLength); + ReplaceSample(smp, pNewSmp, nNewLength, pSndFile); AdjustEndOfSample(smp, pSndFile); return smp.nLength; @@ -88,7 +90,7 @@ // Copy over old data and replace sample by the new one memcpy(pNewSmp, smp.pSample, nNewSmpBytes); - ReplaceSample(smp, pNewSmp, nNewLength); + ReplaceSample(smp, pNewSmp, nNewLength, pSndFile); // Adjust loops if(smp.nLoopStart > nNewLength) @@ -340,3 +342,32 @@ } // namespace ctrlSmp + + + +namespace ctrlChn +{ + +void ReplaceSample( MODCHANNEL (&Chn)[MAX_CHANNELS], + LPCSTR pOldSample, + LPSTR pNewSample, + const ctrlSmp::SmpLength nNewLength, + DWORD orFlags /* = 0*/, + DWORD andFlags /* = MAXDWORD*/) +{ + for (CHANNELINDEX i = 0; i < MAX_CHANNELS; i++) + { + if (Chn[i].pSample == pOldSample) + { + Chn[i].pSample = pNewSample; + Chn[i].pCurrentSample = pNewSample; + if (Chn[i].nPos > nNewLength) + Chn[i].nPos = 0; + Chn[i].nLength = nNewLength; + Chn[i].dwFlags |= orFlags; + Chn[i].dwFlags &= andFlags; + } + } +} + +} // namespace ctrlChn Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.h =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-08-15 19:28:24 UTC (rev 326) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-08-16 11:46:32 UTC (rev 327) @@ -21,15 +21,16 @@ // Insert silence to given location. // Note: Is currently implemented only for inserting silence to the beginning and to the end of the sample. // Return: Length of the new sample. -SmpLength InsertSilence(MODSAMPLE& smp, const SmpLength nSilenceLength, const SmpLength nStartFrom, CSoundFile* pSndFile = nullptr); +SmpLength InsertSilence(MODSAMPLE& smp, const SmpLength nSilenceLength, const SmpLength nStartFrom, CSoundFile* pSndFile); // Change sample size. // Note: If resized sample is bigger, silence will be added to the sample's tail. // Return: Length of the new sample. -SmpLength ResizeSample(MODSAMPLE& smp, const SmpLength nNewLength, CSoundFile* pSndFile = nullptr); +SmpLength ResizeSample(MODSAMPLE& smp, const SmpLength nNewLength, CSoundFile* pSndFile); // Replaces sample in 'smp' with given sample and frees the old sample. -void ReplaceSample(MODSAMPLE& smp, const LPSTR pNewSample, const SmpLength nNewLength); +// If valid CSoundFile pointer is given, the sample will be replaced also from the sounds channels. +void ReplaceSample(MODSAMPLE& smp, const LPSTR pNewSample, const SmpLength nNewLength, CSoundFile* pSndFile); bool AdjustEndOfSample(MODSAMPLE& smp, CSoundFile* pSndFile = 0); @@ -53,4 +54,17 @@ } // Namespace ctrlSmp +namespace ctrlChn +{ + +// Replaces sample from sound channels by given sample. +void ReplaceSample( MODCHANNEL (&Chn)[MAX_CHANNELS], + LPCSTR pOldSample, + LPSTR pNewSample, + const ctrlSmp::SmpLength nNewLength, + DWORD orFlags = 0, + DWORD andFlags = MAXDWORD); + +} // namespace ctrlChn + #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-08-16 11:55:18
|
Revision: 328 http://modplug.svn.sourceforge.net/modplug/?rev=328&view=rev Author: saga-games Date: 2009-08-16 11:55:06 +0000 (Sun, 16 Aug 2009) Log Message: ----------- [Fix] VST Editor: Patches are now saved in the folder specified by the user in the "save as" dialog (not the working directory) [Ref] Refactoring, part 3: The three envelopes are now sub-structs of MODINSTRUMENT to reduce redundancy. Based on the new structs, more parts of the code could be optimized. Modified Paths: -------------- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2009-08-16 11:46:32 UTC (rev 327) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2009-08-16 11:55:06 UTC (rev 328) @@ -113,8 +113,8 @@ if (m_pVstPlugin) { CFileDialog dlg(TRUE, "fxp", NULL, - OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_ENABLESIZING | OFN_NOREADONLYRETURN, - "VST Program (*.fxp)|*.fxp||", theApp.m_pMainWnd); + OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_ENABLESIZING | OFN_NOREADONLYRETURN, + "VST Program (*.fxp)|*.fxp||", theApp.m_pMainWnd); const LPCTSTR pszWdir = CMainFrame::GetWorkingDirectory(DIR_PLUGINPRESETS); if(pszWdir[0]) dlg.m_ofn.lpstrInitialDir = pszWdir; @@ -122,10 +122,11 @@ if (!(dlg.DoModal() == IDOK)) return; - CMainFrame::SetWorkingDirectory(dlg.GetFileName(), DIR_PLUGINPRESETS, true); + CString sFile = dlg.GetPathName(); + CMainFrame::SetWorkingDirectory(sFile, DIR_PLUGINPRESETS, true); //TODO: exception handling to distinguish errors at this level. - if (!(m_pVstPlugin->LoadProgram(dlg.GetFileName()))) + if (!(m_pVstPlugin->LoadProgram(sFile))) ::AfxMessageBox("Error loading preset. Are you sure it is for this plugin?"); } } @@ -136,17 +137,18 @@ if (m_pVstPlugin) { CFileDialog dlg(FALSE, "fxp", NULL, - OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_ENABLESIZING | OFN_NOREADONLYRETURN, - "VST Program (*.fxp)|*.fxp||", theApp.m_pMainWnd); + OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_ENABLESIZING | OFN_NOREADONLYRETURN, + "VST Program (*.fxp)|*.fxp||", theApp.m_pMainWnd); const LPCTSTR pszWdir = CMainFrame::GetWorkingDirectory(DIR_PLUGINPRESETS); if(pszWdir[0]) dlg.m_ofn.lpstrInitialDir = pszWdir; if (!(dlg.DoModal() == IDOK)) return; - CMainFrame::SetWorkingDirectory(dlg.GetFileName(), DIR_PLUGINPRESETS, true); + CString sFile = dlg.GetPathName(); + CMainFrame::SetWorkingDirectory(sFile, DIR_PLUGINPRESETS, true); //TODO: exception handling - if (!(m_pVstPlugin->SaveProgram(dlg.GetFileName()))) + if (!(m_pVstPlugin->SaveProgram(sFile))) ::AfxMessageBox("Error saving preset."); } return; Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-16 11:46:32 UTC (rev 327) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-16 11:55:06 UTC (rev 328) @@ -2323,45 +2323,45 @@ switch(nEnv) { case ENV_PANNING: - pPoints = pIns->PanPoints; - pValues = pIns->PanEnv; - nPoints = pIns->nPanEnv; + pPoints = pIns->PanEnv.Ticks; + pValues = pIns->PanEnv.Values; + nPoints = pIns->PanEnv.nNodes; bLoop = (pIns->dwFlags & ENV_PANLOOP) ? TRUE : FALSE; bSus = (pIns->dwFlags & ENV_PANSUSTAIN) ? TRUE : FALSE; bCarry = (pIns->dwFlags & ENV_PANCARRY) ? TRUE : FALSE; - susBegin = pIns->nPanSustainBegin; - susEnd = pIns->nPanSustainEnd; - loopBegin = pIns->nPanLoopStart; - loopEnd = pIns->nPanLoopEnd; - releaseNode = pIns->nPanEnvReleaseNode; + susBegin = pIns->PanEnv.nSustainStart; + susEnd = pIns->PanEnv.nSustainEnd; + loopBegin = pIns->PanEnv.nLoopStart; + loopEnd = pIns->PanEnv.nLoopEnd; + releaseNode = pIns->PanEnv.nReleaseNode; break; case ENV_PITCH: - pPoints = pIns->PitchPoints; - pValues = pIns->PitchEnv; - nPoints = pIns->nPitchEnv; + pPoints = pIns->PitchEnv.Ticks; + pValues = pIns->PitchEnv.Values; + nPoints = pIns->PitchEnv.nNodes; bLoop = (pIns->dwFlags & ENV_PITCHLOOP) ? TRUE : FALSE; bSus = (pIns->dwFlags & ENV_PITCHSUSTAIN) ? TRUE : FALSE; bCarry = (pIns->dwFlags & ENV_PITCHCARRY) ? TRUE : FALSE; - susBegin = pIns->nPitchSustainBegin; - susEnd = pIns->nPitchSustainEnd; - loopBegin = pIns->nPitchLoopStart; - loopEnd = pIns->nPitchLoopEnd; - releaseNode = pIns->nPitchEnvReleaseNode; + susBegin = pIns->PitchEnv.nSustainStart; + susEnd = pIns->PitchEnv.nSustainEnd; + loopBegin = pIns->PitchEnv.nLoopStart; + loopEnd = pIns->PitchEnv.nLoopEnd; + releaseNode = pIns->PitchEnv.nReleaseNode; break; default: - pPoints = pIns->VolPoints; - pValues = pIns->VolEnv; - nPoints = pIns->nVolEnv; + pPoints = pIns->VolEnv.Ticks; + pValues = pIns->VolEnv.Values; + nPoints = pIns->VolEnv.nNodes; bLoop = (pIns->dwFlags & ENV_VOLLOOP) ? TRUE : FALSE; bSus = (pIns->dwFlags & ENV_VOLSUSTAIN) ? TRUE : FALSE; bCarry = (pIns->dwFlags & ENV_VOLCARRY) ? TRUE : FALSE; - susBegin = pIns->nVolSustainBegin; - susEnd = pIns->nVolSustainEnd; - loopBegin = pIns->nVolLoopStart; - loopEnd = pIns->nVolLoopEnd; - releaseNode = pIns->nVolEnvReleaseNode; + susBegin = pIns->VolEnv.nSustainStart; + susEnd = pIns->VolEnv.nSustainEnd; + loopBegin = pIns->VolEnv.nLoopStart; + loopEnd = pIns->VolEnv.nLoopEnd; + releaseNode = pIns->VolEnv.nReleaseNode; break; } strcpy(s, pszEnvHdr); @@ -2440,48 +2440,48 @@ switch(nEnv) { case ENV_PANNING: - pPoints = pIns->PanPoints; - pValues = pIns->PanEnv; - pIns->nPanEnv = nPoints; + pPoints = pIns->PanEnv.Ticks; + pValues = pIns->PanEnv.Values; + pIns->PanEnv.nNodes = nPoints; pIns->dwFlags &= ~(ENV_PANLOOP|ENV_PANSUSTAIN|ENV_PANCARRY); if (bLoop) pIns->dwFlags |= ENV_PANLOOP; if (bSus) pIns->dwFlags |= ENV_PANSUSTAIN; if (bCarry) pIns->dwFlags |= ENV_PANCARRY; - pIns->nPanSustainBegin = susBegin; - pIns->nPanSustainEnd = susEnd; - pIns->nPanLoopStart = loopBegin; - pIns->nPanLoopEnd = loopEnd; - pIns->nPanEnvReleaseNode = releaseNode; + pIns->PanEnv.nSustainStart = susBegin; + pIns->PanEnv.nSustainEnd = susEnd; + pIns->PanEnv.nLoopStart = loopBegin; + pIns->PanEnv.nLoopEnd = loopEnd; + pIns->PanEnv.nReleaseNode = releaseNode; break; case ENV_PITCH: - pPoints = pIns->PitchPoints; - pValues = pIns->PitchEnv; - pIns->nPitchEnv = nPoints; + pPoints = pIns->PitchEnv.Ticks; + pValues = pIns->PitchEnv.Values; + pIns->PitchEnv.nNodes = nPoints; pIns->dwFlags &= ~(ENV_PITCHLOOP|ENV_PITCHSUSTAIN|ENV_PITCHCARRY); if (bLoop) pIns->dwFlags |= ENV_PITCHLOOP; if (bSus) pIns->dwFlags |= ENV_PITCHSUSTAIN; if (bCarry) pIns->dwFlags |= ENV_PITCHCARRY; - pIns->nPitchSustainBegin = susBegin; - pIns->nPitchSustainEnd = susEnd; - pIns->nPitchLoopStart = loopBegin; - pIns->nPitchLoopEnd = loopEnd; - pIns->nPitchEnvReleaseNode = releaseNode; + pIns->PitchEnv.nSustainStart = susBegin; + pIns->PitchEnv.nSustainEnd = susEnd; + pIns->PitchEnv.nLoopStart = loopBegin; + pIns->PitchEnv.nLoopEnd = loopEnd; + pIns->PitchEnv.nReleaseNode = releaseNode; break; default: - pPoints = pIns->VolPoints; - pValues = pIns->VolEnv; - pIns->nVolEnv = nPoints; + pPoints = pIns->VolEnv.Ticks; + pValues = pIns->VolEnv.Values; + pIns->VolEnv.nNodes = nPoints; pIns->dwFlags &= ~(ENV_VOLLOOP|ENV_VOLSUSTAIN|ENV_VOLCARRY); if (bLoop) pIns->dwFlags |= ENV_VOLLOOP; if (bSus) pIns->dwFlags |= ENV_VOLSUSTAIN; if (bCarry) pIns->dwFlags |= ENV_VOLCARRY; - pIns->nVolSustainBegin = susBegin; - pIns->nVolSustainEnd = susEnd; - pIns->nVolLoopStart = loopBegin; - pIns->nVolLoopEnd = loopEnd; - pIns->nVolEnvReleaseNode = releaseNode; + pIns->VolEnv.nSustainStart = susBegin; + pIns->VolEnv.nSustainEnd = susEnd; + pIns->VolEnv.nLoopStart = loopBegin; + pIns->VolEnv.nLoopEnd = loopEnd; + pIns->VolEnv.nReleaseNode = releaseNode; break; } int oldn = 0; @@ -2510,15 +2510,15 @@ switch(nEnv) { case ENV_PANNING: - pIns->nPanEnvReleaseNode = r; + pIns->PanEnv.nReleaseNode = r; break; case ENV_PITCH: - pIns->nPitchEnvReleaseNode = r; + pIns->PitchEnv.nReleaseNode = r; break; default: - pIns->nVolEnvReleaseNode = r; + pIns->VolEnv.nReleaseNode = r; break; } } Modified: trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp =================================================================== --- trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp 2009-08-16 11:46:32 UTC (rev 327) +++ trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp 2009-08-16 11:55:06 UTC (rev 328) @@ -50,18 +50,18 @@ switch(m_Env) { case ENV_VOLUME: - array = &m_pInstrument->VolPoints; - arraySize = &m_pInstrument->nVolEnv; + array = &m_pInstrument->VolEnv.Ticks; + arraySize = &m_pInstrument->VolEnv.nNodes; break; case ENV_PANNING: - array = &m_pInstrument->PanPoints; - arraySize = &m_pInstrument->nPanEnv; + array = &m_pInstrument->PanEnv.Ticks; + arraySize = &m_pInstrument->PanEnv.nNodes; break; case ENV_PITCH: - array = &m_pInstrument->PitchPoints; - arraySize = &m_pInstrument->nPitchEnv; + array = &m_pInstrument->PitchEnv.Ticks; + arraySize = &m_pInstrument->PitchEnv.nNodes; break; } Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2009-08-16 11:46:32 UTC (rev 327) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-08-16 11:55:06 UTC (rev 328) @@ -225,13 +225,13 @@ switch(m_nEnv) { case ENV_VOLUME: - if (nPoint < (int)pIns->nVolEnv) return pIns->VolPoints[nPoint]; + if (nPoint < (int)pIns->VolEnv.nNodes) return pIns->VolEnv.Ticks[nPoint]; break; case ENV_PANNING: - if (nPoint < (int)pIns->nPanEnv) return pIns->PanPoints[nPoint]; + if (nPoint < (int)pIns->PanEnv.nNodes) return pIns->PanEnv.Ticks[nPoint]; break; case ENV_PITCH: - if (nPoint < (int)pIns->nPitchEnv) return pIns->PitchPoints[nPoint]; + if (nPoint < (int)pIns->PitchEnv.nNodes) return pIns->PitchEnv.Ticks[nPoint]; break; } } @@ -253,13 +253,13 @@ switch(m_nEnv) { case ENV_VOLUME: - if (nPoint < (int)pIns->nVolEnv) return pIns->VolEnv[nPoint]; + if (nPoint < (int)pIns->VolEnv.nNodes) return pIns->VolEnv.Values[nPoint]; break; case ENV_PANNING: - if (nPoint < (int)pIns->nPanEnv) return pIns->PanEnv[nPoint]; + if (nPoint < (int)pIns->PanEnv.nNodes) return pIns->PanEnv.Values[nPoint]; break; case ENV_PITCH: - if (nPoint < (int)pIns->nPitchEnv) return pIns->PitchEnv[nPoint]; + if (nPoint < (int)pIns->PitchEnv.nNodes) return pIns->PitchEnv.Values[nPoint]; break; } } @@ -285,19 +285,19 @@ switch(m_nEnv) { case ENV_VOLUME: - maxpoints = pIns->nVolEnv; - pPoints = pIns->VolPoints; - pData = pIns->VolEnv; + maxpoints = pIns->VolEnv.nNodes; + pPoints = pIns->VolEnv.Ticks; + pData = pIns->VolEnv.Values; break; case ENV_PANNING: - maxpoints = pIns->nPanEnv; - pPoints = pIns->PanPoints; - pData = pIns->PanEnv; + maxpoints = pIns->PanEnv.nNodes; + pPoints = pIns->PanEnv.Ticks; + pData = pIns->PanEnv.Values; break; case ENV_PITCH: - maxpoints = pIns->nPitchEnv; - pPoints = pIns->PitchPoints; - pData = pIns->PitchEnv; + maxpoints = pIns->PitchEnv.nNodes; + pPoints = pIns->PitchEnv.Ticks; + pData = pIns->PitchEnv.Values; break; } if (!nPoint) nTick = 0; @@ -345,13 +345,13 @@ switch(m_nEnv) { case ENV_VOLUME: - if (pIns->nVolEnv) return pIns->nVolEnv; + if (pIns->VolEnv.nNodes) return pIns->VolEnv.nNodes; break; case ENV_PANNING: - if (pIns->nPanEnv) return pIns->nPanEnv; + if (pIns->PanEnv.nNodes) return pIns->PanEnv.nNodes; break; case ENV_PITCH: - if (pIns->nPitchEnv) return pIns->nPitchEnv; + if (pIns->PitchEnv.nNodes) return pIns->PitchEnv.nNodes; break; } } @@ -465,9 +465,9 @@ { switch(m_nEnv) { - case ENV_VOLUME: return pIns->nVolLoopStart; - case ENV_PANNING: return pIns->nPanLoopStart; - case ENV_PITCH: return pIns->nPitchLoopStart; + case ENV_VOLUME: return pIns->VolEnv.nLoopStart; + case ENV_PANNING: return pIns->PanEnv.nLoopStart; + case ENV_PITCH: return pIns->PitchEnv.nLoopStart; } } } @@ -487,9 +487,9 @@ { switch(m_nEnv) { - case ENV_VOLUME: return pIns->nVolLoopEnd; - case ENV_PANNING: return pIns->nPanLoopEnd; - case ENV_PITCH: return pIns->nPitchLoopEnd; + case ENV_VOLUME: return pIns->VolEnv.nLoopEnd; + case ENV_PANNING: return pIns->PanEnv.nLoopEnd; + case ENV_PITCH: return pIns->PitchEnv.nLoopEnd; } } } @@ -509,9 +509,9 @@ { switch(m_nEnv) { - case ENV_VOLUME: return pIns->nVolSustainBegin; - case ENV_PANNING: return pIns->nPanSustainBegin; - case ENV_PITCH: return pIns->nPitchSustainBegin; + case ENV_VOLUME: return pIns->VolEnv.nSustainStart; + case ENV_PANNING: return pIns->PanEnv.nSustainStart; + case ENV_PITCH: return pIns->PitchEnv.nSustainStart; } } } @@ -531,9 +531,9 @@ { switch(m_nEnv) { - case ENV_VOLUME: return pIns->nVolSustainEnd; - case ENV_PANNING: return pIns->nPanSustainEnd; - case ENV_PITCH: return pIns->nPitchSustainEnd; + case ENV_VOLUME: return pIns->VolEnv.nSustainEnd; + case ENV_PANNING: return pIns->PanEnv.nSustainEnd; + case ENV_PITCH: return pIns->PitchEnv.nSustainEnd; } } } @@ -610,26 +610,26 @@ switch(m_nEnv) { case ENV_VOLUME: - if (nPoint != pIns->nVolLoopStart) + if (nPoint != pIns->VolEnv.nLoopStart) { - pIns->nVolLoopStart = (BYTE)nPoint; - if (pIns->nVolLoopEnd < nPoint) pIns->nVolLoopEnd = (BYTE)nPoint; + pIns->VolEnv.nLoopStart = (BYTE)nPoint; + if (pIns->VolEnv.nLoopEnd < nPoint) pIns->VolEnv.nLoopEnd = (BYTE)nPoint; return TRUE; } break; case ENV_PANNING: - if (nPoint != pIns->nPanLoopStart) + if (nPoint != pIns->PanEnv.nLoopStart) { - pIns->nPanLoopStart = (BYTE)nPoint; - if (pIns->nPanLoopEnd < nPoint) pIns->nPanLoopEnd = (BYTE)nPoint; + pIns->PanEnv.nLoopStart = (BYTE)nPoint; + if (pIns->PanEnv.nLoopEnd < nPoint) pIns->PanEnv.nLoopEnd = (BYTE)nPoint; return TRUE; } break; case ENV_PITCH: - if (nPoint != pIns->nPitchLoopStart) + if (nPoint != pIns->PitchEnv.nLoopStart) { - pIns->nPitchLoopStart = (BYTE)nPoint; - if (pIns->nPitchLoopEnd < nPoint) pIns->nPitchLoopEnd = (BYTE)nPoint; + pIns->PitchEnv.nLoopStart = (BYTE)nPoint; + if (pIns->PitchEnv.nLoopEnd < nPoint) pIns->PitchEnv.nLoopEnd = (BYTE)nPoint; return TRUE; } break; @@ -653,26 +653,26 @@ switch(m_nEnv) { case ENV_VOLUME: - if (nPoint != pIns->nVolLoopEnd) + if (nPoint != pIns->VolEnv.nLoopEnd) { - pIns->nVolLoopEnd = (BYTE)nPoint; - if (pIns->nVolLoopStart > nPoint) pIns->nVolLoopStart = (BYTE)nPoint; + pIns->VolEnv.nLoopEnd = (BYTE)nPoint; + if (pIns->VolEnv.nLoopStart > nPoint) pIns->VolEnv.nLoopStart = (BYTE)nPoint; return TRUE; } break; case ENV_PANNING: - if (nPoint != pIns->nPanLoopEnd) + if (nPoint != pIns->PanEnv.nLoopEnd) { - pIns->nPanLoopEnd = (BYTE)nPoint; - if (pIns->nPanLoopStart > nPoint) pIns->nPanLoopStart = (BYTE)nPoint; + pIns->PanEnv.nLoopEnd = (BYTE)nPoint; + if (pIns->PanEnv.nLoopStart > nPoint) pIns->PanEnv.nLoopStart = (BYTE)nPoint; return TRUE; } break; case ENV_PITCH: - if (nPoint != pIns->nPitchLoopEnd) + if (nPoint != pIns->PitchEnv.nLoopEnd) { - pIns->nPitchLoopEnd = (BYTE)nPoint; - if (pIns->nPitchLoopStart > nPoint) pIns->nPitchLoopStart = (BYTE)nPoint; + pIns->PitchEnv.nLoopEnd = (BYTE)nPoint; + if (pIns->PitchEnv.nLoopStart > nPoint) pIns->PitchEnv.nLoopStart = (BYTE)nPoint; return TRUE; } break; @@ -696,26 +696,26 @@ switch(m_nEnv) { case ENV_VOLUME: - if (nPoint != pIns->nVolSustainBegin) + if (nPoint != pIns->VolEnv.nSustainStart) { - pIns->nVolSustainBegin = (BYTE)nPoint; - if ((pIns->nVolSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->nVolSustainEnd = (BYTE)nPoint; + pIns->VolEnv.nSustainStart = (BYTE)nPoint; + if ((pIns->VolEnv.nSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->VolEnv.nSustainEnd = (BYTE)nPoint; return TRUE; } break; case ENV_PANNING: - if (nPoint != pIns->nPanSustainBegin) + if (nPoint != pIns->PanEnv.nSustainStart) { - pIns->nPanSustainBegin = (BYTE)nPoint; - if ((pIns->nPanSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->nPanSustainEnd = (BYTE)nPoint; + pIns->PanEnv.nSustainStart = (BYTE)nPoint; + if ((pIns->PanEnv.nSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->PanEnv.nSustainEnd = (BYTE)nPoint; return TRUE; } break; case ENV_PITCH: - if (nPoint != pIns->nPitchSustainBegin) + if (nPoint != pIns->PitchEnv.nSustainStart) { - pIns->nPitchSustainBegin = (BYTE)nPoint; - if ((pIns->nPitchSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->nPitchSustainEnd = (BYTE)nPoint; + pIns->PitchEnv.nSustainStart = (BYTE)nPoint; + if ((pIns->PitchEnv.nSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->PitchEnv.nSustainEnd = (BYTE)nPoint; return TRUE; } break; @@ -739,26 +739,26 @@ switch(m_nEnv) { case ENV_VOLUME: - if (nPoint != pIns->nVolSustainEnd) + if (nPoint != pIns->VolEnv.nSustainEnd) { - pIns->nVolSustainEnd = (BYTE)nPoint; - if ((pIns->nVolSustainBegin > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->nVolSustainBegin = (BYTE)nPoint; + pIns->VolEnv.nSustainEnd = (BYTE)nPoint; + if ((pIns->VolEnv.nSustainStart > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->VolEnv.nSustainStart = (BYTE)nPoint; return TRUE; } break; case ENV_PANNING: - if (nPoint != pIns->nPanSustainEnd) + if (nPoint != pIns->PanEnv.nSustainEnd) { - pIns->nPanSustainEnd = (BYTE)nPoint; - if ((pIns->nPanSustainBegin > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->nPanSustainBegin = (BYTE)nPoint; + pIns->PanEnv.nSustainEnd = (BYTE)nPoint; + if ((pIns->PanEnv.nSustainStart > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->PanEnv.nSustainStart = (BYTE)nPoint; return TRUE; } break; case ENV_PITCH: - if (nPoint != pIns->nPitchSustainEnd) + if (nPoint != pIns->PitchEnv.nSustainEnd) { - pIns->nPitchSustainEnd = (BYTE)nPoint; - if ((pIns->nPitchSustainBegin > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->nPitchSustainBegin = (BYTE)nPoint; + pIns->PitchEnv.nSustainEnd = (BYTE)nPoint; + if ((pIns->PitchEnv.nSustainStart > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->PitchEnv.nSustainStart = (BYTE)nPoint; return TRUE; } break; @@ -899,13 +899,13 @@ if (bEnable) { pIns->dwFlags |= ENV_VOLUME; - if (!pIns->nVolEnv) + if (!pIns->VolEnv.nNodes) { - pIns->VolEnv[0] = 64; - pIns->VolEnv[1] = 64; - pIns->VolPoints[0] = 0; - pIns->VolPoints[1] = 10; - pIns->nVolEnv = 2; + pIns->VolEnv.Values[0] = 64; + pIns->VolEnv.Values[1] = 64; + pIns->VolEnv.Ticks[0] = 0; + pIns->VolEnv.Ticks[1] = 10; + pIns->VolEnv.nNodes = 2; InvalidateRect(NULL, FALSE); } } else @@ -932,13 +932,13 @@ if (bEnable) { pIns->dwFlags |= ENV_PANNING; - if (!pIns->nPanEnv) + if (!pIns->PanEnv.nNodes) { - pIns->PanEnv[0] = 32; - pIns->PanEnv[1] = 32; - pIns->PanPoints[0] = 0; - pIns->PanPoints[1] = 10; - pIns->nPanEnv = 2; + pIns->PanEnv.Values[0] = 32; + pIns->PanEnv.Values[1] = 32; + pIns->PanEnv.Ticks[0] = 0; + pIns->PanEnv.Ticks[1] = 10; + pIns->PanEnv.nNodes = 2; InvalidateRect(NULL, FALSE); } } else @@ -966,13 +966,13 @@ { pIns->dwFlags |= ENV_PITCH; pIns->dwFlags &= ~ENV_FILTER; - if (!pIns->nPitchEnv) + if (!pIns->PitchEnv.nNodes) { - pIns->PitchEnv[0] = 32; - pIns->PitchEnv[1] = 32; - pIns->PitchPoints[0] = 0; - pIns->PitchPoints[1] = 10; - pIns->nPitchEnv = 2; + pIns->PitchEnv.Values[0] = 32; + pIns->PitchEnv.Values[1] = 32; + pIns->PitchEnv.Ticks[0] = 0; + pIns->PitchEnv.Ticks[1] = 10; + pIns->PitchEnv.nNodes = 2; InvalidateRect(NULL, FALSE); } } else @@ -999,13 +999,13 @@ if ((bEnable) && (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) { pIns->dwFlags |= (ENV_PITCH|ENV_FILTER); - if (!pIns->nPitchEnv) + if (!pIns->PitchEnv.nNodes) { - pIns->PitchEnv[0] = 64; - pIns->PitchEnv[1] = 64; - pIns->PitchPoints[0] = 0; - pIns->PitchPoints[1] = 10; - pIns->nPitchEnv = 2; + pIns->PitchEnv.Values[0] = 64; + pIns->PitchEnv.Values[1] = 64; + pIns->PitchEnv.Ticks[0] = 0; + pIns->PitchEnv.Ticks[1] = 10; + pIns->PitchEnv.nNodes = 2; InvalidateRect(NULL, FALSE); } } else @@ -1360,11 +1360,11 @@ if (pIns) { switch(m_nEnv) { case ENV_VOLUME: - return pIns->nVolEnvReleaseNode; + return pIns->VolEnv.nReleaseNode; case ENV_PANNING: - return pIns->nPanEnvReleaseNode; + return pIns->PanEnv.nReleaseNode; case ENV_PITCH: - return pIns->nPitchEnvReleaseNode; + return pIns->PitchEnv.nReleaseNode; default: return ENV_RELEASE_NODE_UNSET; } @@ -1383,11 +1383,11 @@ if (pIns) { switch(m_nEnv) { case ENV_VOLUME: - return pIns->VolEnv[EnvGetReleaseNode()]; + return pIns->VolEnv.Values[EnvGetReleaseNode()]; case ENV_PANNING: - return pIns->PanEnv[EnvGetReleaseNode()]; + return pIns->PanEnv.Values[EnvGetReleaseNode()]; case ENV_PITCH: - return pIns->PitchEnv[EnvGetReleaseNode()]; + return pIns->PitchEnv.Values[EnvGetReleaseNode()]; default: return 0; } @@ -1406,11 +1406,11 @@ if (pIns) { switch(m_nEnv) { case ENV_VOLUME: - return pIns->VolPoints[EnvGetReleaseNode()]; + return pIns->VolEnv.Ticks[EnvGetReleaseNode()]; case ENV_PANNING: - return pIns->PanPoints[EnvGetReleaseNode()]; + return pIns->PanEnv.Ticks[EnvGetReleaseNode()]; case ENV_PITCH: - return pIns->PitchPoints[EnvGetReleaseNode()]; + return pIns->PitchEnv.Ticks[EnvGetReleaseNode()]; default: return 0; } @@ -2056,24 +2056,24 @@ MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; switch(m_nEnv) { case ENV_VOLUME: - if (pIns->nVolEnvReleaseNode == node) { - pIns->nVolEnvReleaseNode = ENV_RELEASE_NODE_UNSET; + if (pIns->VolEnv.nReleaseNode == node) { + pIns->VolEnv.nReleaseNode = ENV_RELEASE_NODE_UNSET; } else { - pIns->nVolEnvReleaseNode = node; + pIns->VolEnv.nReleaseNode = node; } break; case ENV_PANNING: - if (pIns->nPanEnvReleaseNode == node) { - pIns->nPanEnvReleaseNode = ENV_RELEASE_NODE_UNSET; + if (pIns->PanEnv.nReleaseNode == node) { + pIns->PanEnv.nReleaseNode = ENV_RELEASE_NODE_UNSET; } else { - pIns->nPanEnvReleaseNode = node; + pIns->PanEnv.nReleaseNode = node; } break; case ENV_PITCH: - if (pIns->nPitchEnvReleaseNode == node) { - pIns->nPitchEnvReleaseNode = ENV_RELEASE_NODE_UNSET; + if (pIns->PitchEnv.nReleaseNode == node) { + pIns->PitchEnv.nReleaseNode = ENV_RELEASE_NODE_UNSET; } else { - pIns->nPitchEnvReleaseNode = node; + pIns->PitchEnv.nReleaseNode = node; } break; } @@ -2159,59 +2159,59 @@ switch(m_nEnv) { case ENV_VOLUME: - if (pIns->nVolEnv > 1) + if (pIns->VolEnv.nNodes > 1) { - pIns->nVolEnv--; - for (UINT i=nPoint; i<pIns->nVolEnv; i++) + pIns->VolEnv.nNodes--; + for (UINT i=nPoint; i<pIns->VolEnv.nNodes; i++) { - pIns->VolPoints[i] = pIns->VolPoints[i+1]; - pIns->VolEnv[i] = pIns->VolEnv[i+1]; + pIns->VolEnv.Ticks[i] = pIns->VolEnv.Ticks[i+1]; + pIns->VolEnv.Values[i] = pIns->VolEnv.Values[i+1]; } - if (nPoint >= pIns->nVolEnv) nPoint = pIns->nVolEnv-1; - if (pIns->nVolLoopStart > nPoint) pIns->nVolLoopStart--; - if (pIns->nVolLoopEnd > nPoint) pIns->nVolLoopEnd--; - if (pIns->nVolSustainBegin > nPoint) pIns->nVolSustainBegin--; - if (pIns->nVolSustainEnd > nPoint) pIns->nVolSustainEnd--; - if (pIns->nVolEnvReleaseNode>nPoint && pIns->nVolEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->nVolEnvReleaseNode--; - pIns->VolPoints[0] = 0; + if (nPoint >= pIns->VolEnv.nNodes) nPoint = pIns->VolEnv.nNodes-1; + if (pIns->VolEnv.nLoopStart > nPoint) pIns->VolEnv.nLoopStart--; + if (pIns->VolEnv.nLoopEnd > nPoint) pIns->VolEnv.nLoopEnd--; + if (pIns->VolEnv.nSustainStart > nPoint) pIns->VolEnv.nSustainStart--; + if (pIns->VolEnv.nSustainEnd > nPoint) pIns->VolEnv.nSustainEnd--; + if (pIns->VolEnv.nReleaseNode>nPoint && pIns->VolEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->VolEnv.nReleaseNode--; + pIns->VolEnv.Ticks[0] = 0; bOk = TRUE; } break; case ENV_PANNING: - if (pIns->nPanEnv > 1) + if (pIns->PanEnv.nNodes > 1) { - pIns->nPanEnv--; - for (UINT i=nPoint; i<pIns->nPanEnv; i++) + pIns->PanEnv.nNodes--; + for (UINT i=nPoint; i<pIns->PanEnv.nNodes; i++) { - pIns->PanPoints[i] = pIns->PanPoints[i+1]; - pIns->PanEnv[i] = pIns->PanEnv[i+1]; + pIns->PanEnv.Ticks[i] = pIns->PanEnv.Ticks[i+1]; + pIns->PanEnv.Values[i] = pIns->PanEnv.Values[i+1]; } - if (nPoint >= pIns->nPanEnv) nPoint = pIns->nPanEnv-1; - if (pIns->nPanLoopStart > nPoint) pIns->nPanLoopStart--; - if (pIns->nPanLoopEnd > nPoint) pIns->nPanLoopEnd--; - if (pIns->nPanSustainBegin > nPoint) pIns->nPanSustainBegin--; - if (pIns->nPanSustainEnd > nPoint) pIns->nPanSustainEnd--; - if (pIns->nPanEnvReleaseNode>nPoint && pIns->nPanEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->nPanEnvReleaseNode--; - pIns->PanPoints[0] = 0; + if (nPoint >= pIns->PanEnv.nNodes) nPoint = pIns->PanEnv.nNodes-1; + if (pIns->PanEnv.nLoopStart > nPoint) pIns->PanEnv.nLoopStart--; + if (pIns->PanEnv.nLoopEnd > nPoint) pIns->PanEnv.nLoopEnd--; + if (pIns->PanEnv.nSustainStart > nPoint) pIns->PanEnv.nSustainStart--; + if (pIns->PanEnv.nSustainEnd > nPoint) pIns->PanEnv.nSustainEnd--; + if (pIns->PanEnv.nReleaseNode>nPoint && pIns->PanEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->PanEnv.nReleaseNode--; + pIns->PanEnv.Ticks[0] = 0; bOk = TRUE; } break; case ENV_PITCH: - if (pIns->nPitchEnv > 1) + if (pIns->PitchEnv.nNodes > 1) { - pIns->nPitchEnv--; - for (UINT i=nPoint; i<pIns->nPitchEnv; i++) + pIns->PitchEnv.nNodes--; + for (UINT i=nPoint; i<pIns->PitchEnv.nNodes; i++) { - pIns->PitchPoints[i] = pIns->PitchPoints[i+1]; - pIns->PitchEnv[i] = pIns->PitchEnv[i+1]; + pIns->PitchEnv.Ticks[i] = pIns->PitchEnv.Ticks[i+1]; + pIns->PitchEnv.Values[i] = pIns->PitchEnv.Values[i+1]; } - if (nPoint >= pIns->nPitchEnv) nPoint = pIns->nPitchEnv-1; - if (pIns->nPitchLoopStart > nPoint) pIns->nPitchLoopStart--; - if (pIns->nPitchLoopEnd > nPoint) pIns->nPitchLoopEnd--; - if (pIns->nPitchSustainBegin > nPoint) pIns->nPitchSustainBegin--; - if (pIns->nPitchSustainEnd > nPoint) pIns->nPitchSustainEnd--; - if (pIns->nPitchEnvReleaseNode>nPoint && pIns->nPitchEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->nPitchEnvReleaseNode--; - pIns->PitchPoints[0] = 0; + if (nPoint >= pIns->PitchEnv.nNodes) nPoint = pIns->PitchEnv.nNodes-1; + if (pIns->PitchEnv.nLoopStart > nPoint) pIns->PitchEnv.nLoopStart--; + if (pIns->PitchEnv.nLoopEnd > nPoint) pIns->PitchEnv.nLoopEnd--; + if (pIns->PitchEnv.nSustainStart > nPoint) pIns->PitchEnv.nSustainStart--; + if (pIns->PitchEnv.nSustainEnd > nPoint) pIns->PitchEnv.nSustainEnd--; + if (pIns->PitchEnv.nReleaseNode>nPoint && pIns->PitchEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->PitchEnv.nReleaseNode--; + pIns->PitchEnv.Ticks[0] = 0; bOk = TRUE; } break; @@ -2247,83 +2247,83 @@ if (nTick >= 0) switch(m_nEnv) { case ENV_VOLUME: - if (pIns->nVolEnv < maxpoints) + if (pIns->VolEnv.nNodes < maxpoints) { - if (!pIns->nVolEnv) + if (!pIns->VolEnv.nNodes) { - pIns->VolPoints[0] = 0; - pIns->VolEnv[0] = 64; - pIns->nVolEnv = 1; + pIns->VolEnv.Ticks[0] = 0; + pIns->VolEnv.Values[0] = 64; + pIns->VolEnv.nNodes = 1; } UINT i = 0; - for (i=0; i<pIns->nVolEnv; i++) if (nTick <= pIns->VolPoints[i]) break; - for (UINT j=pIns->nVolEnv; j>i; j--) + for (i=0; i<pIns->VolEnv.nNodes; i++) if (nTick <= pIns->VolEnv.Ticks[i]) break; + for (UINT j=pIns->VolEnv.nNodes; j>i; j--) { - pIns->VolPoints[j] = pIns->VolPoints[j-1]; - pIns->VolEnv[j] = pIns->VolEnv[j-1]; + pIns->VolEnv.Ticks[j] = pIns->VolEnv.Ticks[j-1]; + pIns->VolEnv.Values[j] = pIns->VolEnv.Values[j-1]; } - pIns->VolPoints[i] = (WORD)nTick; - pIns->VolEnv[i] = (BYTE)nValue; - pIns->nVolEnv++; - if (pIns->nVolLoopStart >= i) pIns->nVolLoopStart++; - if (pIns->nVolLoopEnd >= i) pIns->nVolLoopEnd++; - if (pIns->nVolSustainBegin >= i) pIns->nVolSustainBegin++; - if (pIns->nVolSustainEnd >= i) pIns->nVolSustainEnd++; - if (pIns->nVolEnvReleaseNode>=i && pIns->nVolEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->nVolEnvReleaseNode++; + pIns->VolEnv.Ticks[i] = (WORD)nTick; + pIns->VolEnv.Values[i] = (BYTE)nValue; + pIns->VolEnv.nNodes++; + if (pIns->VolEnv.nLoopStart >= i) pIns->VolEnv.nLoopStart++; + if (pIns->VolEnv.nLoopEnd >= i) pIns->VolEnv.nLoopEnd++; + if (pIns->VolEnv.nSustainStart >= i) pIns->VolEnv.nSustainStart++; + if (pIns->VolEnv.nSustainEnd >= i) pIns->VolEnv.nSustainEnd++; + if (pIns->VolEnv.nReleaseNode>=i && pIns->VolEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->VolEnv.nReleaseNode++; bOk = TRUE; } break; case ENV_PANNING: - if (pIns->nPanEnv < maxpoints) + if (pIns->PanEnv.nNodes < maxpoints) { - if (!pIns->nPanEnv) + if (!pIns->PanEnv.nNodes) { - pIns->PanPoints[0] = 0; - pIns->PanEnv[0] = 32; - pIns->nPanEnv = 1; + pIns->PanEnv.Ticks[0] = 0; + pIns->PanEnv.Values[0] = 32; + pIns->PanEnv.nNodes = 1; } UINT i = 0; - for (i=0; i<pIns->nPanEnv; i++) if (nTick <= pIns->PanPoints[i]) break; - for (UINT j=pIns->nPanEnv; j>i; j--) + for (i=0; i<pIns->PanEnv.nNodes; i++) if (nTick <= pIns->PanEnv.Ticks[i]) break; + for (UINT j=pIns->PanEnv.nNodes; j>i; j--) { - pIns->PanPoints[j] = pIns->PanPoints[j-1]; - pIns->PanEnv[j] = pIns->PanEnv[j-1]; + pIns->PanEnv.Ticks[j] = pIns->PanEnv.Ticks[j-1]; + pIns->PanEnv.Values[j] = pIns->PanEnv.Values[j-1]; } - pIns->PanPoints[i] = (WORD)nTick; - pIns->PanEnv[i] =(BYTE)nValue; - pIns->nPanEnv++; - if (pIns->nPanLoopStart >= i) pIns->nPanLoopStart++; - if (pIns->nPanLoopEnd >= i) pIns->nPanLoopEnd++; - if (pIns->nPanSustainBegin >= i) pIns->nPanSustainBegin++; - if (pIns->nPanSustainEnd >= i) pIns->nPanSustainEnd++; - if (pIns->nPanEnvReleaseNode>=i && pIns->nPanEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->nPanEnvReleaseNode++; + pIns->PanEnv.Ticks[i] = (WORD)nTick; + pIns->PanEnv.Values[i] =(BYTE)nValue; + pIns->PanEnv.nNodes++; + if (pIns->PanEnv.nLoopStart >= i) pIns->PanEnv.nLoopStart++; + if (pIns->PanEnv.nLoopEnd >= i) pIns->PanEnv.nLoopEnd++; + if (pIns->PanEnv.nSustainStart >= i) pIns->PanEnv.nSustainStart++; + if (pIns->PanEnv.nSustainEnd >= i) pIns->PanEnv.nSustainEnd++; + if (pIns->PanEnv.nReleaseNode>=i && pIns->PanEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->PanEnv.nReleaseNode++; bOk = TRUE; } break; case ENV_PITCH: - if (pIns->nPitchEnv < maxpoints) + if (pIns->PitchEnv.nNodes < maxpoints) { - if (!pIns->nPitchEnv) + if (!pIns->PitchEnv.nNodes) { - pIns->PitchPoints[0] = 0; - pIns->PitchEnv[0] = 32; - pIns->nPitchEnv = 1; + pIns->PitchEnv.Ticks[0] = 0; + pIns->PitchEnv.Values[0] = 32; + pIns->PitchEnv.nNodes = 1; } UINT i = 0; - for (i=0; i<pIns->nPitchEnv; i++) if (nTick <= pIns->PitchPoints[i]) break; - for (UINT j=pIns->nPitchEnv; j>i; j--) + for (i=0; i<pIns->PitchEnv.nNodes; i++) if (nTick <= pIns->PitchEnv.Ticks[i]) break; + for (UINT j=pIns->PitchEnv.nNodes; j>i; j--) { - pIns->PitchPoints[j] = pIns->PitchPoints[j-1]; - pIns->PitchEnv[j] = pIns->PitchEnv[j-1]; + pIns->PitchEnv.Ticks[j] = pIns->PitchEnv.Ticks[j-1]; + pIns->PitchEnv.Values[j] = pIns->PitchEnv.Values[j-1]; } - pIns->PitchPoints[i] = (WORD)nTick; - pIns->PitchEnv[i] = (BYTE)nValue; - pIns->nPitchEnv++; - if (pIns->nPitchLoopStart >= i) pIns->nPitchLoopStart++; - if (pIns->nPitchLoopEnd >= i) pIns->nPitchLoopEnd++; - if (pIns->nPitchSustainBegin >= i) pIns->nPitchSustainBegin++; - if (pIns->nPitchSustainEnd >= i) pIns->nPitchSustainEnd++; - if (pIns->nPitchEnvReleaseNode>=i && pIns->nPitchEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->nPitchEnvReleaseNode++; + pIns->PitchEnv.Ticks[i] = (WORD)nTick; + pIns->PitchEnv.Values[i] = (BYTE)nValue; + pIns->PitchEnv.nNodes++; + if (pIns->PitchEnv.nLoopStart >= i) pIns->PitchEnv.nLoopStart++; + if (pIns->PitchEnv.nLoopEnd >= i) pIns->PitchEnv.nLoopEnd++; + if (pIns->PitchEnv.nSustainStart >= i) pIns->PitchEnv.nSustainStart++; + if (pIns->PitchEnv.nSustainEnd >= i) pIns->PitchEnv.nSustainEnd++; + if (pIns->PitchEnv.nReleaseNode>=i && pIns->PitchEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->PitchEnv.nReleaseNode++; bOk = TRUE; } break; Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp =================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp 2009-08-16 11:46:32 UTC (rev 327) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2009-08-16 11:55:06 UTC (rev 328) @@ -1703,9 +1703,9 @@ pIns->nDNA = DNA_NOTEFADE; pIns->nResampling = SRCMODE_DEFAULT; pIns->nFilterMode = FLTMODE_UNCHANGED; - pIns->nPanEnvReleaseNode=ENV_RELEASE_NODE_UNSET; - pIns->nPitchEnvReleaseNode=ENV_RELEASE_NODE_UNSET; - pIns->nVolEnvReleaseNode=ENV_RELEASE_NODE_UNSET; + pIns->PanEnv.nReleaseNode=ENV_RELEASE_NODE_UNSET; + pIns->PitchEnv.nReleaseNode=ENV_RELEASE_NODE_UNSET; + pIns->VolEnv.nReleaseNode=ENV_RELEASE_NODE_UNSET; pSndFile->Instruments[nInstr] = pIns; nSample = 1; UINT nLoadedSmp = 0; @@ -1776,17 +1776,17 @@ // Delay section // -> DLS level 2 // Attack section - pIns->VolPoints[nPoint] = 0; + pIns->VolEnv.Ticks[nPoint] = 0; if (part->wVolAttack) { - pIns->VolEnv[nPoint] = (BYTE)(64/(part->wVolAttack/2+2)+8);// /----- - pIns->VolPoints[nPoint+1] = part->wVolAttack; // | + pIns->VolEnv.Values[nPoint] = (BYTE)(64/(part->wVolAttack/2+2)+8);// /----- + pIns->VolEnv.Ticks[nPoint+1] = part->wVolAttack; // | } else { - pIns->VolEnv[nPoint] = 64; // |----- - pIns->VolPoints[nPoint+1] = 1; // | + pIns->VolEnv.Values[nPoint] = 64; // |----- + pIns->VolEnv.Ticks[nPoint+1] = 1; // | } - pIns->VolEnv[nPoint+1] = 64; + pIns->VolEnv.Values[nPoint+1] = 64; nPoint += 2; // Hold section // -> DLS Level 2 @@ -1795,7 +1795,7 @@ { if (part->nVolSustainLevel < 128) { - LONG lStartTime = pIns->VolPoints[nPoint-1]; + LONG lStartTime = pIns->VolEnv.Ticks[nPoint-1]; LONG lSusLevel = - DLS32BitRelativeLinearToGain(part->nVolSustainLevel << 9) / 65536; LONG lDecayTime = 1; if (lSusLevel > 0) @@ -1812,10 +1812,10 @@ if ((ltime > 1) && (ltime < lDecayTime)) { ltime += lStartTime; - if (ltime > pIns->VolPoints[nPoint-1]) + if (ltime > pIns->VolEnv.Ticks[nPoint-1]) { - pIns->VolPoints[nPoint] = (WORD)ltime; - pIns->VolEnv[nPoint] = (BYTE)(lFactor / 2); + pIns->VolEnv.Ticks[nPoint] = (WORD)ltime; + pIns->VolEnv.Values[nPoint] = (BYTE)(lFactor / 2); nPoint++; } } @@ -1823,10 +1823,10 @@ } } - if (lStartTime + lDecayTime > (LONG)pIns->VolPoints[nPoint-1]) + if (lStartTime + lDecayTime > (LONG)pIns->VolEnv.Ticks[nPoint-1]) { - pIns->VolEnv[nPoint] = (BYTE)((part->nVolSustainLevel+1) / 2); - pIns->VolPoints[nPoint] = (WORD)(lStartTime+lDecayTime); + pIns->VolEnv.Values[nPoint] = (BYTE)((part->nVolSustainLevel+1) / 2); + pIns->VolEnv.Ticks[nPoint] = (WORD)(lStartTime+lDecayTime); nPoint++; } } @@ -1834,17 +1834,17 @@ } else { pIns->dwFlags |= ENV_VOLSUSTAIN; - pIns->VolPoints[nPoint] = (WORD)(pIns->VolPoints[nPoint-1]+1); - pIns->VolEnv[nPoint] = pIns->VolEnv[nPoint-1]; + pIns->VolEnv.Ticks[nPoint] = (WORD)(pIns->VolEnv.Ticks[nPoint-1]+1); + pIns->VolEnv.Values[nPoint] = pIns->VolEnv.Values[nPoint-1]; nPoint++; } - pIns->nVolSustainBegin = pIns->nVolSustainEnd = (BYTE)(nPoint - 1); + pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = (BYTE)(nPoint - 1); // Release section - if ((part->wVolRelease) && (pIns->VolEnv[nPoint-1] > 1)) + if ((part->wVolRelease) && (pIns->VolEnv.Values[nPoint-1] > 1)) { LONG lReleaseTime = part->wVolRelease; - LONG lStartTime = pIns->VolPoints[nPoint-1]; - LONG lStartFactor = pIns->VolEnv[nPoint-1]; + LONG lStartTime = pIns->VolEnv.Ticks[nPoint-1]; + LONG lStartFactor = pIns->VolEnv.Values[nPoint-1]; LONG lSusLevel = - DLS32BitRelativeLinearToGain(lStartFactor << 10) / 65536; LONG lDecayEndTime = (lReleaseTime * lSusLevel) / 960; lReleaseTime -= lDecayEndTime; @@ -1859,26 +1859,26 @@ if ((ltime > 1) && (ltime < lReleaseTime)) { ltime += lStartTime; - if (ltime > pIns->VolPoints[nPoint-1]) + if (ltime > pIns->VolEnv.Ticks[nPoint-1]) { - pIns->VolPoints[nPoint] = (WORD)ltime; - pIns->VolEnv[nPoint] = (BYTE)lFactor; + pIns->VolEnv.Ticks[nPoint] = (WORD)ltime; + pIns->VolEnv.Values[nPoint] = (BYTE)lFactor; nPoint++; } } } } if (lReleaseTime < 1) lReleaseTime = 1; - pIns->VolPoints[nPoint] = (WORD)(lStartTime + lReleaseTime); - pIns->VolEnv[nPoint] = 0; + pIns->VolEnv.Ticks[nPoint] = (WORD)(lStartTime + lReleaseTime); + pIns->VolEnv.Values[nPoint] = 0; nPoint++; } else { - pIns->VolPoints[nPoint] = (BYTE)(pIns->VolPoints[nPoint-1] + 1); - pIns->VolEnv[nPoint] = 0; + pIns->VolEnv.Ticks[nPoint] = (BYTE)(pIns->VolEnv.Ticks[nPoint-1] + 1); + pIns->VolEnv.Values[nPoint] = 0; nPoint++; } - pIns->nVolEnv = (BYTE)nPoint; + pIns->VolEnv.nNodes = (BYTE)nPoint; } } if (pDlsIns->ulBank & F_INSTRUMENT_DRUMS) @@ -1888,15 +1888,15 @@ if (!(pIns->dwFlags & ENV_VOLUME)) { pIns->dwFlags |= ENV_VOLUME; - pIns->VolPoints[0] = 0; - pIns->VolEnv[0] = 64; - pIns->VolPoints[1] = 5; - pIns->VolEnv[1] = 64; - pIns->VolPoints[2] = 10; - pIns->VolEnv[2] = 32; - pIns->VolPoints[3] = 20; // 1 second max. for drums - pIns->VolEnv[3] = 0; - pIns->nVolEnv = 4; + pIns->VolEnv.Ticks[0] = 0; + pIns->VolEnv.Values[0] = 64; + pIns->VolEnv.Ticks[1] = 5; + pIns->VolEnv.Values[1] = 64; + pIns->VolEnv.Ticks[2] = 10; + pIns->VolEnv.Values[2] = 32; + pIns->VolEnv.Ticks[3] = 20; // 1 second max. for drums + pIns->VolEnv.Values[3] = 0; + pIns->VolEnv.nNodes = 4; } } return TRUE; Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2009-08-16 11:46:32 UTC (rev 327) +++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2009-08-16 11:55:06 UTC (rev 328) @@ -219,15 +219,15 @@ if (peh->flags & 1) pIns->dwFlags |= ENV_VOLUME; if (peh->flags & 2) pIns->dwFlags |= ENV_VOLSUSTAIN; if (peh->flags & 4) pIns->dwFlags |= ENV_VOLLOOP; - pIns->nVolEnv = peh->numpoints + 1; - if (pIns->nVolEnv > MAX_ENVPOINTS) pIns->nVolEnv = MAX_ENVPOINTS; - pIns->nVolLoopStart = peh->loopbegin; - pIns->nVolLoopEnd = peh->loopend; - pIns->nVolSustainBegin = pIns->nVolSustainEnd = peh->sustain1; - for (UINT i=0; i<pIns->nVolEnv; i++) + pIns->VolEnv.nNodes = peh->numpoints + 1; + if (pIns->VolEnv.nNodes > MAX_ENVPOINTS) pIns->VolEnv.nNodes = MAX_ENVPOINTS; + pIns->VolEnv.nLoopStart = peh->loopbegin; + pIns->VolEnv.nLoopEnd = peh->loopend; + pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = peh->sustain1; + for (UINT i=0; i<pIns->VolEnv.nNodes; i++) { - pIns->VolPoints[i] = BigEndianW(peh->volenv[i*2]); - pIns->VolEnv[i] = (BYTE)BigEndianW(peh->volenv[i*2+1]); + pIns->VolEnv.Ticks[i] = BigEndianW(peh->volenv[i*2]); + pIns->VolEnv.Values[i] = (BYTE)BigEndianW(peh->volenv[i*2+1]); } } chunk_pos += sizeof(DBMENVELOPE); Modified: trunk/OpenMPT/soundlib/Load_ams.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp 2009-08-16 11:46:32 UTC (rev 327) +++ trunk/OpenMPT/soundlib/Load_ams.cpp 2009-08-16 11:55:06 UTC (rev 328) @@ -381,15 +381,15 @@ // Volume Envelope { UINT pos = 0; - pIns->nVolEnv = (volenv->points > 16) ? 16 : volenv->points; - pIns->nVolSustainBegin = pIns->nVolSustainEnd = volenv->sustain; - pIns->nVolLoopStart = volenv->loopbegin; - pIns->nVolLoopEnd = volenv->loopend; - for (UINT i=0; i<pIns->nVolEnv; i++) + pIns->VolEnv.nNodes = (volenv->points > 16) ? 16 : volenv->points; + pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = volenv->sustain; + pIns->VolEnv.nLoopStart = volenv->loopbegin; + pIns->VolEnv.nLoopEnd = volenv->loopend; + for (UINT i=0; i<pIns->VolEnv.nNodes; i++) { - pIns->VolEnv[i] = (BYTE)((volenv->info[i*3+2] & 0x7F) >> 1); + pIns->VolEnv.Values[i] = (BYTE)((volenv->info[i*3+2] & 0x7F) >> 1); pos += volenv->info[i*3] + ((volenv->info[i*3+1] & 1) << 8); - pIns->VolPoints[i] = (WORD)pos; + pIns->VolEnv.Ticks[i] = (WORD)pos; } } pIns->nFadeOut = (((lpStream[dwMemPos+2] & 0x0F) << 8) | (lpStream[dwMemPos+1])) << 3; Modified: trunk/OpenMPT/soundlib/Load_imf.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp 2009-08-16 11:46:32 UTC (rev 327) +++ trunk/OpenMPT/soundlib/Load_imf.cpp 2009-08-16 11:55:06 UTC (rev 328) @@ -389,6 +389,8 @@ if (memcmp(hdr.im10, "IM10", 4) != 0) return false; + ChangeModTypeTo(MOD_TYPE_IT); + // song name memset(m_szNames, 0, sizeof(m_szNames)); memcpy(m_szNames[0], hdr.title, 25); @@ -402,7 +404,6 @@ m_nDefaultTempo = hdr.bpm; m_nDefaultGlobalVolume = hdr.master << 1; m_nSamplePreAmp = hdr.amp; - m_nVSTiVolume = 48; // not supported for (n = 0; n < 32; n++) { Chn[n].nPan = hdr.channels[n].panning * 64 / 255; @@ -489,7 +490,9 @@ for (s = 0; s < imfins.smpnum; s++) { IMFSAMPLE imfsmp; UINT32 blen; - slurp_read(fp, &imfsmp, sizeof(imfsmp)); + if(dwMemPos + sizeof(IMFSAMPLE) > dwMemLength) break; + memset(imfsmp, 0, sizeof(IMFSAMPLE)); + memcpy(imfsmp, lpStream + dwMemPos, sizeof(IMFSAMPLE)); if (memcmp(imfsmp.is10, "IS10", 4) != 0) { //printf("is10 says %02x %02x %02x %02x!\n", @@ -528,6 +531,7 @@ } pSample++; + dwMemPos += sizeof(IMFSAMPLE); } firstsample += imfins.smpnum; } Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-16 11:46:32 UTC (rev 327) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-16 11:55:06 UTC (rev 328) @@ -243,19 +243,19 @@ if (pis->flags & 0x01) pIns->dwFlags |= ENV_VOLUME; if (pis->flags & 0x02) pIns->dwFlags |= ENV_VOLLOOP; if (pis->flags & 0x04) pIns->dwFlags |= ENV_VOLSUSTAIN; - pIns->nVolLoopStart = pis->vls; - pIns->nVolLoopEnd = pis->vle; - pIns->nVolSustainBegin = pis->sls; - pIns->nVolSustainEnd = pis->sle; - pIns->nVolEnv = 25; + pIns->VolEnv.nLoopStart = pis->vls; + pIns->VolEnv.nLoopEnd = pis->vle; + pIns->VolEnv.nSustainStart = pis->sls; + pIns->VolEnv.nSustainEnd = pis->sle; + pIns->VolEnv.nNodes = 25; for (UINT ev=0; ev<25; ev++) { - if ((pIns->VolPoints[ev] = pis->nodes[ev*2]) == 0xFF) + if ((pIns->VolEnv.Ticks[ev] = pis->nodes[ev*2]) == 0xFF) { - pIns->nVolEnv = ev; + pIns->VolEnv.nNodes = ev; break; } - pIns->VolEnv[ev] = pis->nodes[ev*2+1]; + pIns->VolEnv.Values[ev] = pis->nodes[ev*2+1]; } pIns->nNNA = pis->nna; pIns->nDCT = pis->dnc; @@ -348,44 +348,44 @@ if (pis->volenv.flags & 2) pIns->dwFlags |= ENV_VOLLOOP; if (pis->volenv.flags & 4) pIns->dwFlags |= ENV_VOLSUSTAIN; if (pis->volenv.flags & 8) pIns->dwFlags |= ENV_VOLCARRY; - pIns->nVolEnv = pis->volenv.num; - if (pIns->nVolEnv > 25) pIns->nVolEnv = 25; - pIns->nVolLoopStart = pis->volenv.lpb; - pIns->nVolLoopEnd = pis->volenv.lpe; - pIns->nVolSustainBegin = pis->volenv.slb; - pIns->nVolSustainEnd = pis->volenv.sle; + pIns->VolEnv.nNodes = pis->volenv.num; + if (pIns->VolEnv.nNodes > 25) pIns->VolEnv.nNodes = 25; + pIns->VolEnv.nLoopStart = pis->volenv.lpb; + pIns->VolEnv.nLoopEnd = pis->volenv.lpe; + pIns->VolEnv.nSustainStart = pis->volenv.slb; + pIns->VolEnv.nSustainEnd = pis->volenv.sle; // Panning Envelope if (pis->panenv.flags & 1) pIns->dwFlags |= ENV_PANNING; if (pis->panenv.flags & 2) pIns->dwFlags |= ENV_PANLOOP; if (pis->panenv.flags & 4) pIns->dwFlags |= ENV_PANSUSTAIN; if (pis->panenv.flags & 8) pIns->dwFlags |= ENV_PANCARRY; - pIns->nPanEnv = pis->panenv.num; - if (pIns->nPanEnv > 25) pIns->nPanEnv = 25; - pIns->nPanLoopStart = pis->panenv.lpb; - pIns->nPanLoopEnd = pis->panenv.lpe; - pIns->nPanSustainBegin = pis->panenv.slb; - pIns->nPanSustainEnd = pis->panenv.sle; + pIns->PanEnv.nNodes = pis->panenv.num; + if (pIns->PanEnv.nNodes > 25) pIns->PanEnv.nNodes = 25; + pIns->PanEnv.nLoopStart = pis->panenv.lpb; + pIns->PanEnv.nLoopEnd = pis->panenv.lpe; + pIns->PanEnv.nSustainStart = pis->panenv.slb; + pIns->PanEnv.nSustainEnd = pis->panenv.sle; // Pitch Envelope if (pis->pitchenv.flags & 1) pIns->dwFlags |= ENV_PITCH; if (pis->pitchenv.flags & 2) pIns->dwFlags |= ENV_PITCHLOOP; if (pis->pitchenv.flags & 4) pIns->dwFlags |= ENV_PITCHSUSTAIN; if (pis->pitchenv.flags & 8) pIns->dwFlags |= ENV_PITCHCARRY; if (pis->pitchenv.flags & 0x80) pIns->dwFlags |= ENV_FILTER; - pIns->nPitchEnv = pis->pitchenv.num; - if (pIns->nPitchEnv > 25) pIns->nPitchEnv = 25; - pIns->nPitchLoopStart = pis->pitchenv.lpb; - pIns->nPitchLoopEnd = pis->pitchenv.lpe; - pIns->nPitchSustainBegin = pis->pitchenv.slb; - pIns->nPitchSustainEnd = pis->pitchenv.sle; + pIns->PitchEnv.nNodes = pis->pitchenv.num; + if (pIns->PitchEnv.nNodes > 25) pIns->PitchEnv.nNodes = 25; + pIns->PitchEnv.nLoopStart = pis->pitchenv.lpb; + pIns->PitchEnv.nLoopEnd = pis->pitchenv.lpe; + pIns->PitchEnv.nSustainStart = pis->pitchenv.slb; + pIns->PitchEnv.nSustainEnd = pis->pitchenv.sle; // Envelopes Data for (UINT ev=0; ev<25; ev++) { - pIns->VolEnv[ev] = pis->volenv.data[ev*3]; - pIns->VolPoints[ev] = (pis->volenv.data[ev*3+2] << 8) | (pis->volenv.data[ev*3+1]); - pIns->PanEnv[ev] = pis->panenv.data[ev*3] + 32; - pIns->PanPoints[ev] = (pis->panenv.data[ev*3+2] << 8) | (pis->panenv.data[ev*3+1]); - pIns->PitchEnv[ev] = pis->pitchenv.data[ev*3] + 32; - pIns->PitchPoints[ev] = (pis->pitchenv.data[ev*3+2] << 8) | (pis->pitchenv.data[ev*3+1]); + pIns->VolEnv.Values[ev] = pis->volenv.data[ev*3]; + pIns->VolEnv.Ticks[ev] = (pis->volenv.data[ev*3+2] << 8) | (pis->volenv.data[ev*3+1]); + pIns->PanEnv.Values[ev] = pis->panenv.data[ev*3] + 32; + pIns->PanEnv.Ticks[ev] = (pis->panenv.data[ev*3+2] << 8) | (pis->panenv.data[ev*3+1]); + pIns->PitchEnv.Values[ev] = pis->pitchenv.data[ev*3] + 32; + pIns->PitchEnv.Ticks[ev] = (pis->pitchenv.data[ev*3+2] << 8) | (pis->pitchenv.data[ev*3+1]); } pIns->nNNA = pis->nna; pIns->nDCT = pis->dct; @@ -403,8 +403,8 @@ if (pIns->nPan > 256) pIns->nPan = 128; if (pis->dfp < 0x80) pIns->dwFlags |= ENV_SETPANNING; } - if ((pIns->nVolLoopStart >= 25) || (pIns->nVolLoopEnd >= 25)) pIns->dwFlags &= ~ENV_VOLLOOP; - if ((pIns->nVolSustainBegin >= 25) || (pIns->nVolSustainEnd >= 25)) pIns->dwFlags &= ~ENV_VOLSUSTAIN; + if ((pIns->VolEnv.nLoopStart >= 25) || (pIns->VolEnv.nLoopEnd >= 25)) pIns->dwFlags &= ~ENV_VOLLOOP; + if ((pIns->VolEnv.nSustainStart >= 25) || (pIns->VolEnv.nSustainEnd >= 25)) pIns->dwFlags &= ~ENV_VOLSUSTAIN; return returnVal; //return offset } @@ -2030,44 +2030,44 @@ if (pIns->dwFlags & ENV_VOLLOOP) iti.volenv.flags |= 0x02; if (pIns->dwFlags & ENV_VOLSUSTAIN) iti.volenv.flags |= 0x04; if (pIns->dwFlags & ENV_VOLCARRY) iti.volenv.flags |= 0x08; - iti.volenv.num = (BYTE)pIns->nVolEnv; - iti.volenv.lpb = (BYTE)pIns->nVolLoopStart; - iti.volenv.lpe = (BYTE)pIns->nVolLoopEnd; - iti.volenv.slb = pIns->nVolSustainBegin; - iti.volenv.sle = pIns->nVolSustainEnd; + iti.volenv.num = (BYTE)pIns->VolEnv.nNodes; + iti.volenv.lpb = (BYTE)pIns->VolEnv.nLoopStart; + iti.volenv.lpe = (BYTE)pIns->VolEnv.nLoopEnd; + iti.volenv.slb = pIns->VolEnv.nSustainStart; + iti.volenv.sle = pIns->VolEnv.nSustainEnd; // Writing Panning envelope if (pIns->dwFlags & ENV_PANNING) iti.panenv.flags |= 0x01; if (pIns->dwFlags & ENV_PANLOOP) iti.panenv.flags |= 0x02; if (pIns->dwFlags & ENV_PANSUSTAIN) iti.panenv.flags |= 0x04; if (pIns->dwFlags & ENV_PANCARRY) iti.panenv.flags |= 0x08; - iti.panenv.num = (BYTE)pIns->nPanEnv; - iti.panenv.lpb = (BYTE)pIns->nPanLoopStart; - iti.panenv.lpe = (BYTE)pIns->nPanLoopEnd; - iti.panenv.slb = pIns->nPanSustainBegin; - iti.panenv.sle = pIns->nPanSustainEnd; + iti.panenv.num = (BYTE)pIns->PanEnv.nNodes; + iti.panenv.lpb = (BYTE)pIns->PanEnv.nLoopStart; + iti.panenv.lpe = (BYTE)pIns->PanEnv.nLoopEnd; + iti.panenv.slb = pIns->PanEnv.nSustainStart; + iti.panenv.sle = pIns->PanEnv.nSustainEnd; // Writing Pitch Envelope if (pIns->dwFlags & ENV_PITCH) iti.pitchenv.flags |= 0x01; if (pIns->dwFlags & ENV_PITCHLOOP) iti.pitchenv.flags |= 0x02; if (pIns->dwFlags & ENV_PITCHSUSTAIN) iti.pitchenv.flags |= 0x04; if (pIns->dwFlags & ENV_PITCHCARRY) iti.pitchenv.flags |= 0x08; if (pIns->dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80; - iti.pitchenv.num = (BYTE)pIns->nPitchEnv; - iti.pitchenv.lpb = (BYTE)pIns->nPitchLoopStart; - iti.pitchenv.lpe = (BYTE)pIns->nPitchLoopEnd; - iti.pitchenv.slb = (BYTE)pIns->nPitchSustainBegin; - iti.pitchenv.sle = (BYTE)pIns->nPitchSustainEnd; + iti.pitchenv.num = (BYTE)pIns->PitchEnv.nNodes; + iti.pitchenv.lpb = (BYTE)pIns->PitchEnv.nLoopStart; + iti.pitchenv.lpe = (BYTE)pIns->PitchEnv.nLoopEnd; + iti.pitchenv.slb = (BYTE)pIns->PitchEnv.nSustainStart; + iti.pitchenv.sle = (BYTE)pIns->PitchEnv.nSustainEnd; // Writing Envelopes data for (UINT ev=0; ev<25; ev++) { - iti.volenv.data[ev*3] = pIns->VolEnv[ev]; - iti.volenv.data[ev*3+1] = pIns->VolPoints[ev] & 0xFF; - iti.volenv.data[ev*3+2] = pIns->VolPoints[ev] >> 8; - iti.panenv.data[ev*3] = pIns->PanEnv[ev] - 32; - iti.panenv.data[ev*3+1] = pIns->PanPoints[ev] & 0xFF; - iti.panenv.data[ev*3+2] = pIns->PanPoints[ev] >> 8; - iti.pitchenv.data[ev*3] = pIns->PitchEnv[ev] - 32; - iti.pitchenv.data[ev*3+1] = pIns->PitchPoints[ev] & 0xFF; - iti.pitchenv.data[ev*3+2] = pIns->PitchPoints[ev] >> 8; + iti.volenv.data[ev*3] = pIns->VolEnv.Values[ev]; + iti.volenv.data[ev*3+1] = pIns->VolEnv.Ticks[ev] & 0xFF; + iti.volenv.data[ev*3+2] = pIns->VolEnv.Ticks[ev] >> 8; + iti.panenv.data[ev*3] = pIns->PanEnv.Values[ev] - 32; + iti.panenv.data[ev*3+1] = pIns->PanEnv.Ticks[ev] & 0xFF; + iti.panenv.data[ev*3+2] = pIns->PanEnv.Ticks[ev] >> 8; + iti.pitchenv.data[ev*3] = pIns->PitchEnv.Values[ev] - 32; + iti.pitchenv.data[ev*3+1] = pIns->PitchEnv.Ticks[ev] & 0xFF; + iti.pitchenv.data[ev*3+2] = pIns->PitchEnv.Ticks[ev] >> 8; } } else // Save Empty Instrument @@ -2675,44 +2675,44 @@ if (pIns->dwFlags & ENV_VOLLOOP) iti.volenv.flags |= 0x02; if (pIns->dwFlags & ENV_VOLSUSTAIN) iti.volenv.flags |= 0x04; if (pIns->dwFlags & ENV_VOLCARRY) iti.volenv.flags |= 0x08; - iti.volenv.num = (BYTE)pIns->nVolEnv; - iti.volenv.lpb = (BYTE)pIns->nVolLoopStart; - iti.volenv.lpe = (BYTE)pIns->nVolLoopEnd; - iti.volenv.slb = pIns->nVolSustainBegin; - iti.volenv.sle = pIns->nVolSustainEnd; + iti.volenv.num = (BYTE)pIns->VolEnv.nNodes; + iti.volenv.lpb = (BYTE)pIns->VolEnv.nLoopStart; + iti.volenv.lpe = (BYTE)pIns->VolEnv.nLoopEnd; + iti.volenv.slb = pIns->VolEnv.nSustainStart; + iti.volenv.sle = pIns->VolEnv.nSustainEnd; // Writing Panning envelope if (pIns->dwFlags & ENV_PANNING) iti.panenv.flags |= 0x01; if (pIns->dwFlags & ENV_PANLOOP) iti.panenv.flags |= 0x02; if (pIns->dwFlags & ENV_PANSUSTAIN) iti.panenv.flags |= 0x04; if (pIns->dwFlags & ENV_PANCARRY) iti.panenv.flags |= 0x08; - iti.panenv.num = (BYTE)pIns->nPanEnv; - iti.panenv.lpb = (BYTE)pIns->nPanLoopStart; - iti.panenv.lpe = (BYTE)pIns->nPanLoopEnd; - iti.panenv.slb = pIns->nPanSustainBegin; - iti.panenv.sle = pIns->nPanSustainEnd; + iti.panenv.num = (BYTE)pIns->PanEnv.nNodes; + iti.panenv.lpb = (BYTE)pIns->PanEnv.nLoopStart; + iti.panenv.lpe = (BYTE)pIns->PanEnv.nLoopEnd; + iti.panenv.slb = pIns->PanEnv.nSustainStart; + iti.panenv.sle = pIns->PanEnv.nSustainEnd; // Writing Pitch Envelope if (pIns->dwFlags & ENV_PITCH) iti.pitchenv.flags |= 0x01; if (pIns->dwFlags & ENV_PITCHLOOP) iti.pitchenv.flags |= 0x02; if (pIns->dwFlags & ENV_PITCHSUSTAIN) iti.pitchenv.flags |= 0x04; if (pIns->dwFlags & ENV_PITCHCARRY) iti.pitchenv.flags |= 0x08; if (pIns->dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80; - iti.pitchenv.num = (BYTE)pIns->nPitchEnv; - iti.pitchenv.lpb = (BYTE)pIns->nPitchLoopStart; - iti.pitchenv.lpe = (BYTE)pIns->nPitchLoopEnd; - iti.pitchenv.slb = (BYTE)pIns->nPitchSustainBegin; - iti.pitchenv.sle = (BYTE)pIns->nPitchSustainEnd; + iti.pitchenv.num = (BYTE)pIns->PitchEnv.nNodes; + iti.pitchenv.lpb = (BYTE)pIns->PitchEnv.nLoopStart; + iti.pitchenv.lpe = (BYTE)pIns->PitchEnv.nLoopEnd; + iti.pitchenv.slb = (BYTE)pIns->PitchEnv.nSustainStart; + iti.pitchenv.sle = (BYTE)pIns->PitchEnv.nSustainEnd; // Writing Envelopes data for (UINT ev=0; ev<25; ev++) { - iti.volenv.data[ev*3] = pIns->VolEnv[ev]; - iti.volenv.data[ev*3+1] = pIns->VolPoints[ev] & 0xFF; - iti.volenv.data[ev*3+2] = pIns->VolPoints[ev] >> 8; - iti.panenv.data[ev*3] = pIns->PanEnv[ev] - 32; - iti.panenv.data[ev*3+1] = pIns->PanPoints[ev] & 0xFF; - iti.panenv.data[ev*3+2] = pIns->PanPoints[ev] >> 8; - iti.pitchenv.data[ev*3] = pIns->PitchEnv[ev] - 32; - iti.pitchenv.data[ev*3+1] = pIns->PitchPoints[ev] & 0xFF; - iti.pitchenv.data[ev*3+2] = pIns->PitchPoints[ev] >> 8; + iti.volenv.data[ev*3] = pIns->VolEnv.Values[ev]; + iti.volenv.data[ev*3+1] = pIns->VolEnv.Ticks[ev] & 0xFF; + iti.volenv.data[ev*3+2] = pIns->VolEnv.Ticks[ev] >> 8; + iti.panenv.data[ev*3] = pIns->PanEnv.Values[ev] - 32; + iti.panenv.data[ev*3+1] = pIns->PanEnv.Ticks[ev] & 0xFF; + iti.panenv.data[ev*3+2] = pIns->PanEnv.Ticks[ev] >> 8; + iti.pitchenv.data[ev*3] = pIns->PitchEnv.Values[ev] - 32; + iti.pitchenv.data[ev*3+1] = pIns->PitchEnv.Ticks[ev] & 0xFF; + iti.pitchenv.data[ev*3+2] = pIns->PitchEnv.Ticks[ev] >> 8; } } else // Save Empty Instrument @@ -3494,9 +3494,9 @@ WriteInstrumentPropertyForAllInstruments('CS..', sizeof(m_defaultInstrument.nCutSwing), f, instruments, nInstruments); WriteInstrumentPropertyForAllInstruments('RS..', sizeof(m_defaultInstrument.nResSwing), f, instruments, nInstruments); WriteInstrumentPropertyForAllInstruments('FM..', sizeof(m_defaultInstrument.nFilterMode), f, instruments, nInstruments); - WriteInstrumentPropertyForAllInstruments('PERN', sizeof(m_defaultInstrument.nPitchEnvReleaseNode ), f, instruments, nInstruments); - WriteInstrumentPropertyForAllInstruments('AERN', sizeof(m_defaultInstrument.nPanEnvReleaseNode), f, instruments, nInstruments); - WriteInstrumentPropertyForAllInstruments('VERN', sizeof(m_defaultInstrument.nVolEnvReleaseNode), f, instruments, nInstruments); + WriteInstrumentPropertyForAllInstruments('PERN', sizeof(m_defaultInstrument.PitchEnv.nReleaseNode ), f, instruments, nInstruments); + WriteInstrumentPropertyForAllInstruments('AERN', sizeof(m_defaultInstrument.PanEnv.nReleaseNode), f, instruments, nInstruments); + WriteInstrumentPropertyForAllInstruments('VERN', sizeof(m_defaultInstrument.VolEnv.nReleaseNode), f, instruments, nInstruments); WriteInstrumentPropertyForAllInstruments('PTTL', sizeof(m_defaultInstrument.wPitchToTempoLock), f, instruments, nInstruments); WriteInstrumentPropertyForAllInstruments('PVEH', sizeof(m_defaultInstrument.nPluginVelocityHandling), f, instruments, nInstruments); WriteInstrumentPropertyForAllInstruments('PVOH', sizeof(m_defaultInstrument.nPluginVolumeHandling), f, instruments, nInstruments); Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mdl.cpp 2009-08-16 11:46:32 UTC (rev 327) +++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2009-08-16 11:55:06 UTC (rev 328) @@ -497,23 +497,23 @@ for (UINT nve=0; nve<nvolenv; nve++, pve+=33) if (pve[0]+1 == insvolenv[iIns]) { WORD vtick = 1; - pIns->nVolEnv = 15; + pIns->VolEnv.nNodes = 15; for (UINT iv=0; iv<15; iv++) { if (iv) vtick += pve[iv*2+1]; - pIns->VolPoints[iv] = vtick; - pIns->VolEnv[iv] = pve[iv*2+2]; + pIns->VolEnv.Ticks[iv] = vtick; + pIns->VolEnv.Values[iv] = pve[iv*2+2]; if (!pve[iv*2+1]) { - pIns->nVolEnv = iv+1; + pIns->VolEnv.nNodes = iv+1; break; } } - pIns->nVolSustainBegin = pIns->nVolSustainEnd = pve[31] & 0x0F; + pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = pve[31] & 0x0F; if (pve[31] & 0x10) pIns->dwFlags |= ENV_VOLSUSTAIN; if (pve[31] & 0x20) pIns->dwFlags |= ENV_VOLLOOP; - pIns->nVolLoopStart = pve[32] & 0x0F; - pIns->nVolLoopEnd = pve[32] >> 4; + pIns->VolEnv.nLoopStart = pve[32] & 0x0F; + pIns->VolEnv.nLoopEnd = pve[32] >> 4; } } // Setup panning envelope @@ -523,22 +523,22 @@ for (UINT npe=0; npe<npanenv; npe++, ppe+=33) if (ppe[0]+1 == inspanenv[iIns]) { WORD vtick = 1; - pIns->nPanEnv = 15; + pIns->PanEnv.nNodes = 15; for (UINT iv=0; iv<15; iv++) { if (iv) vtick += ppe[iv*2+1]; - pIns->PanPoints[iv] = vtick; - pIns->PanEnv[iv] = ppe[iv*2+2]; + pIns->PanEnv.Ticks[iv] = vtick; + pIns->PanEnv.Values[iv] = ppe[iv*2+2]; if (!ppe[iv*2+1]) { - pIns->nPanEnv = iv+1; + pIns->PanEnv.nNodes = iv+1; break; } } if (ppe[31] & 0x10) pIns->dwFlags |= ENV_PANSUSTAIN; if (ppe[31] & 0x20) pIns->dwFlags |= ENV_PANLOOP; - pIns->nPa... [truncated message content] |
From: <sag...@us...> - 2009-08-16 16:59:06
|
Revision: 329 http://modplug.svn.sourceforge.net/modplug/?rev=329&view=rev Author: saga-games Date: 2009-08-16 16:58:51 +0000 (Sun, 16 Aug 2009) Log Message: ----------- [Imp] Mod Conversion: Try to use fix commands that don't have cache (00 value) in XM (Arpeggio) and MOD format (Arpeggio and a few others) by using the previous value [New] OpenMPT can now import IMF (Imago Orpheus) modules [Ref] Minor modifications in the GDM and MO3 loaders Modified Paths: -------------- trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/soundlib/Load_gdm.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Load_mo3.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-16 11:55:06 UTC (rev 328) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-16 16:58:51 UTC (rev 329) @@ -162,8 +162,11 @@ for (UINT nPat=0; nPat<m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) { MODCOMMAND *m = m_SndFile.Patterns[nPat]; + BYTE cEffectMemory[MAX_CHANNELS][MAX_EFFECTS] = {0}; // for -> MOD/XM conversion + UINT nChannel = m_SndFile.m_nChannels - 1; for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--) { + nChannel = (nChannel + 1) % m_SndFile.m_nChannels; // 0...Channels - 1 ////////////////////////// // Convert 8-bit Panning @@ -286,6 +289,13 @@ switch(m->command) { + case CMD_ARPEGGIO: + // No effect memory in XM / MOD + if(m->param == 0) + m->param = cEffectMemory[nChannel][CMD_ARPEGGIO]; + else + cEffectMemory[nChannel][CMD_ARPEGGIO] = m->param; + break; case CMD_S3MCMDEX: m->command = CMD_MODCMDEX; switch(m->param & 0xF0) @@ -391,8 +401,8 @@ } - ////////////////////////////////////////////////////////////////// - // Convert anything to MOD - remove volume column, adjust retrig + ///////////////////////////////////////////////////////////////////////////////// + // Convert anything to MOD - remove volume column, adjust retrig, effect memory if (newTypeIsMOD) { if(m->command) switch(m->command) @@ -401,6 +411,17 @@ m->command = CMD_MODCMDEX; m->param = 0x90 | (m->param & 0x0F); break; + case CMD_PORTAMENTOUP: + case CMD_PORTAMENTODOWN: + case CMD_TONEPORTAVOL: + case CMD_VIBRATOVOL: + case CMD_VOLUMESLIDE: + // ProTracker doesn't have effect memory for these commands, so let's try to fix them + if(m->param == 0) + m->param = cEffectMemory[nChannel][m->command]; + else + cEffectMemory[nChannel][m->command] = m->param; + break; } else switch(m->volcmd) Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-08-16 11:55:06 UTC (rev 328) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-08-16 16:58:51 UTC (rev 329) @@ -1252,13 +1252,11 @@ OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_FORCESHOWHIDDEN | OFN_ALLOWMULTISELECT, // -> CODE#0023 // -> DESC="IT project files (.itp)" -// "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.bak;*.umx;*.amf;*.psm;*.mt2|" -// "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.bak;*.umx;*.amf;*.psm;*.mt2;*.gdm|" #ifndef NO_MO3_SUPPORT - "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2;*.gdm;*.mo3|" + "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2;*.gdm;*.imf;*.mo3|" "Compressed Modules (*.mdz;*.s3z;*.xmz;*.itz;*.mo3)|*.mdz;*.s3z;*.xmz;*.itz;*.mdr;*.zip;*.rar;*.lha;*.mo3|" #else - "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2;*.gdm|" + "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2;*.gdm;*.imf|" "Compressed Modules (*.mdz;*.s3z;*.xmz;*.itz)|*.mdz;*.s3z;*.xmz;*.itz;*.mdr;*.zip;*.rar;*.lha|" #endif // -! NEW_FEATURE#0023 @@ -1271,7 +1269,7 @@ "Impulse Tracker Projects (*.itp)|*.itp;*.itpz|" // -! NEW_FEATURE#0023 "OpenMPT Modules (*.mptm)|*.mptm;*.mptmz|" - "Other Modules (mtm,okt,mdl,669,far,...)|*.mtm;*.669;*.ult;*.wow;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.med;*.ams;*.dbm;*.dsm;*.umx;*.amf;*.psm;*.mt2;*.gdm|" + "Other Modules (mtm,okt,mdl,669,far,...)|*.mtm;*.669;*.ult;*.wow;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.med;*.ams;*.dbm;*.dsm;*.umx;*.amf;*.psm;*.mt2;*.gdm;*.imf|" "Wave Files (*.wav)|*.wav|" "Midi Files (*.mid,*.rmi)|*.mid;*.rmi;*.smf|" "All Files (*.*)|*.*||", Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-08-16 11:55:06 UTC (rev 328) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-08-16 16:58:51 UTC (rev 329) @@ -66,6 +66,8 @@ BYTE Pan; // default pan } GDMSAMPLEHEADER, *PGDMSAMPLEHEADER; +#pragma pack() + bool CSoundFile::ReadGDM(const LPCBYTE lpStream, const DWORD dwMemLength) //----------------------------------------------------------- { Modified: trunk/OpenMPT/soundlib/Load_imf.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp 2009-08-16 11:55:06 UTC (rev 328) +++ trunk/OpenMPT/soundlib/Load_imf.cpp 2009-08-16 16:58:51 UTC (rev 329) @@ -1,6 +1,6 @@ /* * Purpose: Load IMF (Imago Orpheus) modules - * Authors: Storlek (http://schismtracker.org/) + * Authors: Storlek (Original author - http://schismtracker.org/) * Johannes Schultz (OpenMPT Port) * * Thanks to Storlek for allowing me to use this code! @@ -12,7 +12,7 @@ #pragma pack(1) struct IMFCHANNEL { - char name[12]; // Channelname (ASCIIZ-String, max 11 chars) + char name[12]; // Channel name (ASCIIZ-String, max 11 chars) BYTE chorus; // Default chorus BYTE reverb; // Default reverb BYTE panning; // Pan positions 00-FF @@ -20,20 +20,20 @@ }; struct IMFHEADER { - char title[32]; // Songname (ASCIIZ-String, max. 31 chars) - UINT16 ordnum; // Number of orders saved - UINT16 patnum; // Number of patterns saved - UINT16 insnum; // Number of instruments saved - UINT16 flags; // Module flags (&1 => linear) + char title[32]; // Songname (ASCIIZ-String, max. 31 chars) + UINT16 ordnum; // Number of orders saved + UINT16 patnum; // Number of patterns saved + UINT16 insnum; // Number of instruments saved + UINT16 flags; // Module flags (&1 => linear) BYTE unused1[8]; - BYTE tempo; // Default tempo (Axx, 1..255) - BYTE bpm; // Default beats per minute (BPM) (Txx, 32..255) - BYTE master; // Default mastervolume (Vxx, 0..64) - BYTE amp; // Amplification factor (mixing volume, 4..127) + BYTE tempo; // Default tempo (Axx, 1..255) + BYTE bpm; // Default beats per minute (BPM) (Txx, 32..255) + BYTE master; // Default mastervolume (Vxx, 0..64) + BYTE amp; // Amplification factor (mixing volume, 4..127) BYTE unused2[8]; - char im10[4]; // 'IM10' - struct IMFCHANNEL channels[32]; // Channel settings - BYTE orderlist[256]; // Order list (0xff = +++; blank out anything beyond ordnum) + char im10[4]; // 'IM10' + IMFCHANNEL channels[32]; // Channel settings + BYTE orderlist[256]; // Order list (0xff = +++; blank out anything beyond ordnum) }; enum { @@ -60,22 +60,22 @@ char name[32]; // Inst. name (ASCIIZ-String, max. 31 chars) BYTE map[120]; // Multisample settings BYTE unused[8]; - struct IMFENVNODES nodes[3][16]; - struct IMFENVELOPE env[3]; + IMFENVNODES nodes[3][16]; + IMFENVELOPE env[3]; UINT16 fadeout; // Fadeout rate (0...0FFFH) UINT16 smpnum; // Number of samples in instrument char ii10[4]; // 'II10' }; struct IMFSAMPLE { - char filename[13]; // Sample filename (12345678.ABC) */ + char filename[13]; // Sample filename (12345678.ABC) */ BYTE unused1[3]; UINT32 length; // Length UINT32 loop_start; // Loop start UINT32 loop_end; // Loop end UINT32 C5Speed; // Samplerate - BYTE volume; // Default volume (0..64) - BYTE panning; // Default pan (00h = Left / 80h = Middle) + BYTE volume; // Default volume (0...64) + BYTE panning; // Default pan (0...255) BYTE unused2[14]; BYTE flags; // Sample flags BYTE unused3[5]; @@ -85,54 +85,53 @@ }; #pragma pack() - static BYTE imf_efftrans[] = { CMD_NONE, - CMD_SPEED, // 0x01 1xx Set Tempo - CMD_TEMPO, // 0x02 2xx Set BPM + CMD_SPEED, // 0x01 1xx Set Tempo + CMD_TEMPO, // 0x02 2xx Set BPM CMD_TONEPORTAMENTO, // 0x03 3xx Tone Portamento - CMD_TONEPORTAVOL, // 0x04 4xy Tone Portamento + Volume Slide - CMD_VIBRATO, // 0x05 5xy Vibrato - CMD_VIBRATOVOL, // 0x06 6xy Vibrato + Volume Slide - CMD_FINEVIBRATO, // 0x07 7xy Fine Vibrato - CMD_TREMOLO, // 0x08 8xy Tremolo - CMD_ARPEGGIO, // 0x09 9xy Arpeggio - CMD_PANNING8, // 0x0A Axx Set Pan Position - CMD_PANNINGSLIDE, // 0x0B Bxy Pan Slide - CMD_VOLUME, // 0x0C Cxx Set Volume - CMD_VOLUMESLIDE, // 0x0D Dxy Volume Slide - CMD_VOLUMESLIDE, // 0x0E Exy Fine Volume Slide - CMD_S3MCMDEX, // 0x0F Fxx Set Finetune - CMD_NOTESLIDEUP, // 0x10 Gxy Note Slide Up - CMD_NOTESLIDEDOWN, // 0x11 Hxy Note Slide Down - CMD_PORTAMENTOUP, // 0x12 Ixx Slide Up - CMD_PORTAMENTODOWN, // 0x13 Jxx Slide Down - CMD_PORTAMENTOUP, // 0x14 Kxx Fine Slide Up - CMD_PORTAMENTODOWN, // 0x15 Lxx Fine Slide Down - CMD_MIDI, // 0x16 Mxx Set Filter Cutoff - XXX - CMD_NONE, // 0x17 Nxy Filter Slide + Resonance - XXX - CMD_OFFSET, // 0x18 Oxx Set Sample Offset - CMD_NONE, // 0x19 Pxx Set Fine Sample Offset - XXX - CMD_KEYOFF, // 0x1A Qxx Key Off - CMD_RETRIG, // 0x1B Rxy Retrig - CMD_TREMOR, // 0x1C Sxy Tremor - CMD_POSITIONJUMP, // 0x1D Txx Position Jump - CMD_PATTERNBREAK, // 0x1E Uxx Pattern Break - CMD_GLOBALVOLUME, // 0x1F Vxx Set Mastervolume - CMD_GLOBALVOLSLIDE, // 0x20 Wxy Mastervolume Slide - CMD_S3MCMDEX, // 0x21 Xxx Extended Effect - // X1x Set Filter - // X3x Glissando - // X5x Vibrato Waveform - // X8x Tremolo Waveform - // XAx Pattern Loop - // XBx Pattern Delay - // XCx Note Cut - // XDx Note Delay - // XEx Ignore Envelope - // XFx Invert Loop - CMD_NONE, // 0x22 Yxx Chorus - XXX - CMD_NONE, // 0x23 Zxx Reverb - XXX + CMD_TONEPORTAVOL, // 0x04 4xy Tone Portamento + Volume Slide + CMD_VIBRATO, // 0x05 5xy Vibrato + CMD_VIBRATOVOL, // 0x06 6xy Vibrato + Volume Slide + CMD_FINEVIBRATO, // 0x07 7xy Fine Vibrato + CMD_TREMOLO, // 0x08 8xy Tremolo + CMD_ARPEGGIO, // 0x09 9xy Arpeggio + CMD_PANNING8, // 0x0A Axx Set Pan Position + CMD_PANNINGSLIDE, // 0x0B Bxy Pan Slide + CMD_VOLUME, // 0x0C Cxx Set Volume + CMD_VOLUMESLIDE, // 0x0D Dxy Volume Slide + CMD_VOLUMESLIDE, // 0x0E Exy Fine Volume Slide + CMD_S3MCMDEX, // 0x0F Fxx Set Finetune + CMD_NOTESLIDEUP, // 0x10 Gxy Note Slide Up + CMD_NOTESLIDEDOWN, // 0x11 Hxy Note Slide Down + CMD_PORTAMENTOUP, // 0x12 Ixx Slide Up + CMD_PORTAMENTODOWN, // 0x13 Jxx Slide Down + CMD_PORTAMENTOUP, // 0x14 Kxx Fine Slide Up + CMD_PORTAMENTODOWN, // 0x15 Lxx Fine Slide Down + CMD_MIDI, // 0x16 Mxx Set Filter Cutoff - XXX + CMD_NONE, // 0x17 Nxy Filter Slide + Resonance - XXX + CMD_OFFSET, // 0x18 Oxx Set Sample Offset + CMD_NONE, // 0x19 Pxx Set Fine Sample Offset - XXX + CMD_KEYOFF, // 0x1A Qxx Key Off + CMD_RETRIG, // 0x1B Rxy Retrig + CMD_TREMOR, // 0x1C Sxy Tremor + CMD_POSITIONJUMP, // 0x1D Txx Position Jump + CMD_PATTERNBREAK, // 0x1E Uxx Pattern Break + CMD_GLOBALVOLUME, // 0x1F Vxx Set Mastervolume + CMD_GLOBALVOLSLIDE, // 0x20 Wxy Mastervolume Slide + CMD_S3MCMDEX, // 0x21 Xxx Extended Effect + // X1x Set Filter + // X3x Glissando + // X5x Vibrato Waveform + // X8x Tremolo Waveform + // XAx Pattern Loop + // XBx Pattern Delay + // XCx Note Cut + // XDx Note Delay + // XEx Ignore Envelope + // XFx Invert Loop + CMD_NONE, // 0x22 Yxx Chorus - XXX + CMD_NONE, // 0x23 Zxx Reverb - XXX }; static void import_imf_effect(MODCOMMAND *note) @@ -225,115 +224,6 @@ } } -#ifdef _IMF_SUPPORT_FINISHED_ - -static void load_imf_pattern(CSoundFile *csf, int pat, UINT32 ignore_channels, slurp_t *fp) -{ - UINT16 length, nrows; - BYTE mask, channel; - int row, startpos; - unsigned int lostfx = 0; - MODCOMMAND *row_data, *note, junk_note; - - startpos = slurp_tell(fp); - - slurp_read(fp, &length, 2); - length = LittleEndianW(length); - slurp_read(fp, &nrows, 2); - nrows = LittleEndianW(nrows); - - csf->Patterns.Insert(pat, nrows); - //row_data = Patterns[pat] = csf_allocate_pattern(nrows, 64); - //PatternSize[pat] = PatternAllocSize[pat] = nrows; - row_data = csf->Patterns[pat]; - - row = 0; - while (row < nrows) { - mask = slurp_getc(fp); - if (mask == 0) { - row++; - row_data += MAX_CHANNELS; - continue; - } - - channel = mask & 0x1f; - - if (ignore_channels & (1 << channel)) { - /* should do this better, i.e. not go through the whole process of deciding - what to do with the effects since they're just being thrown out */ - //printf("disabled channel %d contains data\n", channel + 1); - note = &junk_note; - } else { - note = row_data + channel; - } - - if (mask & 0x20) { - /* read note/instrument */ - note->note = slurp_getc(fp); - note->instr = slurp_getc(fp); - if (note->note == 160) { - note->note = NOTE_KEYOFF; /* ??? */ - } else if (note->note == 255) { - note->note = NOTE_NONE; /* ??? */ - } else { - note->note = (note->note >> 4) * 12 + (note->note & 0xf) + 12 + 1; - if (note->note > NOTE_MAX) { - //printf("%d.%d.%d: funny note 0x%02x\n", - // pat, row, channel, fp->data[fp->pos - 1]); - note->note = NOTE_NONE; - } - } - } - if ((mask & 0xc0) == 0xc0) { - BYTE e1c, e1d, e2c, e2d; - - /* read both effects and figure out what to do with them */ - e1c = slurp_getc(fp); - e1d = slurp_getc(fp); - e2c = slurp_getc(fp); - e2d = slurp_getc(fp); - if (e1c == 0xc) { - note->vol = min(e1d, 0x40); - note->volcmd = VOLCMD_VOLUME; - note->command = e2c; - note->param = e2d; - } else if (e2c == 0xc) { - note->vol = min(e2d, 0x40); - note->volcmd = VOLCMD_VOLUME; - note->command = e1c; - note->param = e1d; - } else if (e1c == 0xa) { - note->vol = e1d * 64 / 255; - note->volcmd = VOLCMD_PANNING; - note->command = e2c; - note->param = e2d; - } else if (e2c == 0xa) { - note->vol = e2d * 64 / 255; - note->volcmd = VOLCMD_PANNING; - note->command = e1c; - note->param = e1d; - } else { - /* check if one of the effects is a 'global' effect - -- if so, put it in some unused channel instead. - otherwise pick the most important effect. */ - lostfx++; - note->command = e2c; - note->param = e2d; - } - } else if (mask & 0xc0) { - /* there's one effect, just stick it in the effect column */ - note->command = slurp_getc(fp); - note->param = slurp_getc(fp); - } - if (note->command) - import_imf_effect(note); - } - - /*if (lostfx) - log_appendf(2, "Pattern %d: %d effect%s skipped!\n", pat, lostfx, lostfx == 1 ? "" : "s");*/ -} - - static unsigned int envflags[3][3] = { {ENV_VOLUME, ENV_VOLSUSTAIN, ENV_VOLLOOP}, {ENV_PANNING, ENV_PANSUSTAIN, ENV_PANLOOP}, @@ -342,21 +232,23 @@ static void load_imf_envelope(MODINSTRUMENT *ins, INSTRUMENTENVELOPE *env, IMFINSTRUMENT *imfins, int e) { - int n, t, v; - int min = 0; // minimum tick value for next node - int shift = (e == IMF_ENV_VOL ? 0 : 2); + UINT n; + UINT min = 0; // minimum tick value for next node + int shift = (e == IMF_ENV_VOL) ? 0 : 2; env->nNodes = CLAMP(imfins->env[e].points, 2, 25); env->nLoopStart = imfins->env[e].loop_start; env->nLoopEnd = imfins->env[e].loop_end; env->nSustainStart = env->nSustainEnd = imfins->env[e].sustain; + env->nReleaseNode = ENV_RELEASE_NODE_UNSET; for (n = 0; n < env->nNodes; n++) { - t = LittleEndianW(imfins->nodes[e][n].tick); - v = LittleEndianW(imfins->nodes[e][n].value) >> shift; - env->Ticks[n] = max(min, t); - env->Values[n] = v = min(v, 64); - min = t + 1; + UINT16 nTick, nValue; + nTick = LittleEndianW(imfins->nodes[e][n].tick); + nValue = LittleEndianW(imfins->nodes[e][n].value) >> shift; + env->Ticks[n] = (WORD)max(min, nTick); + env->Values[n] = (BYTE)min(nValue, 64); + min = nTick + 1; } // this would be less retarded if the envelopes all had their own flags... if (imfins->env[e].flags & 1) @@ -367,20 +259,22 @@ ins->dwFlags |= envflags[e][2]; } -//int fmt_imf_load_song(CSoundFile *song, slurp_t *fp, UNUSED unsigned int lflags) bool CSoundFile::ReadIMF(const LPCBYTE lpStream, const DWORD dwMemLength) { - DWORD dwMemPos; + #define ASSERT_CAN_READ(x) \ + if( dwMemPos > dwMemLength || x > dwMemLength - dwMemPos ) return false; + + DWORD dwMemPos = 0; IMFHEADER hdr; - int n, s; MODSAMPLE *pSample = Samples + 1; - int firstsample = 1; // first pSample for the current instrument - UINT32 ignore_channels = 0; /* bit set for each channel that's completely disabled */ + WORD firstsample = 1; // first pSample for the current instrument + UINT32 ignore_channels = 0; // bit set for each channel that's completely disabled - //slurp_read(fp, &hdr, sizeof(hdr)); - if(sizeof(IMFHEADER) > dwMemLength) return false; - memset(hdr, 0, sizeof(IMFHEADER)); - memcpy(hdr, lpStream, sizeof(IMFHEADER)) + ASSERT_CAN_READ(sizeof(IMFHEADER)); + memset(&hdr, 0, sizeof(IMFHEADER)); + memcpy(&hdr, lpStream, sizeof(IMFHEADER)); + dwMemPos = sizeof(IMFHEADER); + hdr.ordnum = LittleEndianW(hdr.ordnum); hdr.patnum = LittleEndianW(hdr.patnum); hdr.insnum = LittleEndianW(hdr.insnum); @@ -390,56 +284,177 @@ return false; ChangeModTypeTo(MOD_TYPE_IT); + SetModFlag(MSF_COMPATIBLE_PLAY, true); // song name memset(m_szNames, 0, sizeof(m_szNames)); - memcpy(m_szNames[0], hdr.title, 25); - m_szNames[0][25] = 0; + memcpy(m_szNames[0], hdr.title, 31); + m_szNames[0][31] = 0; SetNullTerminator(m_szNames[0]); if (hdr.flags & 1) m_dwSongFlags |= SONG_LINEARSLIDES; - //m_dwSongFlags |= SONG_INSTRUMENTMODE; m_nDefaultSpeed = hdr.tempo; m_nDefaultTempo = hdr.bpm; - m_nDefaultGlobalVolume = hdr.master << 1; - m_nSamplePreAmp = hdr.amp; + m_nDefaultGlobalVolume = CLAMP(hdr.master, 0, 64) << 2; + m_nSamplePreAmp = CLAMP(hdr.amp, 4, 127); + + m_nSamples = 0; // Will be incremented later + m_nInstruments = 0; - for (n = 0; n < 32; n++) { - Chn[n].nPan = hdr.channels[n].panning * 64 / 255; - Chn[n].nPan *= 4; //mphack - /* TODO: reverb/chorus??? */ - switch (hdr.channels[n].status) { - case 0: /* enabled; don't worry about it */ + m_nChannels = 32; + for (CHANNELINDEX nChn = 0; nChn < 32; nChn++) { + ChnSettings[nChn].nPan = hdr.channels[nChn].panning * 64 / 255; + ChnSettings[nChn].nPan *= 4; + + memcpy(&ChnSettings[nChn].szName[0], hdr.channels[nChn].name, 12); + SetNullTerminator(ChnSettings[nChn].szName); + + // TODO: reverb/chorus? + switch (hdr.channels[nChn].status) { + case 0: // enabled; don't worry about it break; - case 1: /* mute */ - Chn[n].dwFlags |= CHN_MUTE; + case 1: // mute + ChnSettings[nChn].dwFlags |= CHN_MUTE; break; - case 2: /* disabled */ - Chn[n].dwFlags |= CHN_MUTE; - ignore_channels |= (1 << n); + case 2: // disabled + ChnSettings[nChn].dwFlags |= CHN_MUTE; + ignore_channels |= (1 << nChn); break; - default: /* uhhhh.... freak out */ + default: // uhhhh.... freak out //fprintf(stderr, "imf: channel %d has unknown status %d\n", n, hdr.channels[n].status); return false; } } - for (; n < MAX_CHANNELS; n++) - Chn[n].dwFlags |= CHN_MUTE; - for (n = 0; n < hdr.ordnum; n++) - Order[n] = ((hdr.orderlist[n] == 0xff) ? Order.GetIgnoreIndex() : hdr.orderlist[n]); + for (ORDERINDEX nOrd = 0; nOrd < hdr.ordnum; nOrd++) + Order[nOrd] = ((hdr.orderlist[nOrd] == 0xff) ? Order.GetIgnoreIndex() : hdr.orderlist[nOrd]); - for (n = 0; n < hdr.patnum; n++) - load_imf_pattern(this, n, ignore_channels, fp); - - dwMemPos = sizeof(IMFHEADER); + // read patterns + for (PATTERNINDEX nPat = 0; nPat < hdr.patnum; nPat++) + { + UINT16 length, nrows; + BYTE mask, channel; + int row; + unsigned int lostfx = 0; + MODCOMMAND *row_data, *note, junk_note; - for (n = 0; n < hdr.insnum; n++) { - // read the ins header - struct IMFINSTRUMENT imfins; + ASSERT_CAN_READ(4); + length = LittleEndianW(*((UINT16 *)(lpStream + dwMemPos))); + nrows = LittleEndianW(*((UINT16 *)(lpStream + dwMemPos + 2))); + dwMemPos += 4; + + if(Patterns.Insert(nPat, nrows)) + { + CString s; + s.Format(TEXT("Allocating patterns failed starting from pattern %u"), nPat); + MessageBox(NULL, s, TEXT("OpenMPT IMF import"), MB_ICONERROR); + break; + } + row_data = Patterns[nPat]; + + row = 0; + while (row < nrows) { + ASSERT_CAN_READ(1); + mask = *((BYTE *)(lpStream + dwMemPos)); + dwMemPos += 1; + if (mask == 0) { + row++; + row_data += 32; + continue; + } + + channel = mask & 0x1f; + + if (ignore_channels & (1 << channel)) { + /* should do this better, i.e. not go through the whole process of deciding + what to do with the effects since they're just being thrown out */ + //printf("disabled channel %d contains data\n", channel + 1); + note = &junk_note; + } else { + note = row_data + channel; + } + + if (mask & 0x20) { + // read note/instrument + ASSERT_CAN_READ(2); + note->note = *((BYTE *)(lpStream + dwMemPos)); + note->instr = *((BYTE *)(lpStream + dwMemPos + 1)); + dwMemPos += 2; + + if (note->note == 160) { + note->note = NOTE_KEYOFF; /* ??? */ + } else if (note->note == 255) { + note->note = NOTE_NONE; /* ??? */ + } else { + note->note = (note->note >> 4) * 12 + (note->note & 0xf) + 12 + 1; + if (note->note > NOTE_MAX) { + /*printf("%d.%d.%d: funny note 0x%02x\n", + nPat, row, channel, fp->data[fp->pos - 1]);*/ + note->note = NOTE_NONE; + } + } + } + if ((mask & 0xc0) == 0xc0) { + BYTE e1c, e1d, e2c, e2d; + + // read both effects and figure out what to do with them + ASSERT_CAN_READ(4); + e1c = *((BYTE *)(lpStream + dwMemPos)); + e1d = *((BYTE *)(lpStream + dwMemPos + 1)); + e2c = *((BYTE *)(lpStream + dwMemPos + 2)); + e2d = *((BYTE *)(lpStream + dwMemPos + 3)); + dwMemPos += 4; + + if (e1c == 0xc) { + note->vol = min(e1d, 0x40); + note->volcmd = VOLCMD_VOLUME; + note->command = e2c; + note->param = e2d; + } else if (e2c == 0xc) { + note->vol = min(e2d, 0x40); + note->volcmd = VOLCMD_VOLUME; + note->command = e1c; + note->param = e1d; + } else if (e1c == 0xa) { + note->vol = e1d * 64 / 255; + note->volcmd = VOLCMD_PANNING; + note->command = e2c; + note->param = e2d; + } else if (e2c == 0xa) { + note->vol = e2d * 64 / 255; + note->volcmd = VOLCMD_PANNING; + note->command = e1c; + note->param = e1d; + } else { + /* check if one of the effects is a 'global' effect + -- if so, put it in some unused channel instead. + otherwise pick the most important effect. */ + lostfx++; + note->command = e2c; + note->param = e2d; + } + } else if (mask & 0xc0) { + // there's one effect, just stick it in the effect column + ASSERT_CAN_READ(2); + note->command = *((BYTE *)(lpStream + dwMemPos)); + note->param = *((BYTE *)(lpStream + dwMemPos + 1)); + dwMemPos += 2; + } + if (note->command) + import_imf_effect(note); + } + } + + // read instruments + for (INSTRUMENTINDEX nIns = 0; nIns < hdr.insnum; nIns++) { + IMFINSTRUMENT imfins; MODINSTRUMENT *ins; - slurp_read(fp, &imfins, sizeof(imfins)); + ASSERT_CAN_READ(sizeof(IMFINSTRUMENT)); + memset(&imfins, 0, sizeof(IMFINSTRUMENT)); + memcpy(&imfins, lpStream + dwMemPos, sizeof(IMFINSTRUMENT)); + dwMemPos += sizeof(IMFINSTRUMENT); + m_nInstruments++; imfins.smpnum = LittleEndianW(imfins.smpnum); imfins.fadeout = LittleEndianW(imfins.fadeout); @@ -452,16 +467,16 @@ ins = new MODINSTRUMENT; if (!ins) continue; - Instruments[n + 1] = ins; + Instruments[nIns + 1] = ins; memset(ins, 0, sizeof(MODINSTRUMENT)); strncpy(ins->name, imfins.name, 25); ins->name[25] = 0; if (imfins.smpnum) { - for (s = 0; s < 120; s++) { - ins->NoteMap[s] = s + 1; - ins->Keyboard[s] = firstsample + imfins.map[s]; + for (BYTE cNote = 0; cNote < 120; cNote++) { + ins->NoteMap[cNote] = cNote + 1; + ins->Keyboard[cNote] = firstsample + imfins.map[cNote]; } } @@ -487,13 +502,16 @@ if (!(ins->dwFlags & ENV_VOLUME) && !ins->nFadeOut) ins->nFadeOut = 8192; - for (s = 0; s < imfins.smpnum; s++) { + // read this instrument's samples + for (SAMPLEINDEX nSmp = 0; nSmp < imfins.smpnum; nSmp++) { IMFSAMPLE imfsmp; UINT32 blen; - if(dwMemPos + sizeof(IMFSAMPLE) > dwMemLength) break; - memset(imfsmp, 0, sizeof(IMFSAMPLE)); - memcpy(imfsmp, lpStream + dwMemPos, sizeof(IMFSAMPLE)); - + ASSERT_CAN_READ(sizeof(IMFSAMPLE)); + memset(&imfsmp, 0, sizeof(IMFSAMPLE)); + memcpy(&imfsmp, lpStream + dwMemPos, sizeof(IMFSAMPLE)); + dwMemPos += sizeof(IMFSAMPLE); + m_nSamples++; + if (memcmp(imfsmp.is10, "IS10", 4) != 0) { //printf("is10 says %02x %02x %02x %02x!\n", // imfsmp.is10[0], imfsmp.is10[1], imfsmp.is10[2], imfsmp.is10[3]); @@ -502,13 +520,14 @@ strncpy(pSample->filename, imfsmp.filename, 12); pSample->filename[12] = 0; - strcpy(m_szNames[s + 1], pSample->filename); + strcpy(m_szNames[nSmp + 1], pSample->filename); blen = pSample->nLength = LittleEndian(imfsmp.length); pSample->nLoopStart = LittleEndian(imfsmp.loop_start); pSample->nLoopEnd = LittleEndian(imfsmp.loop_end); pSample->nC5Speed = LittleEndian(imfsmp.C5Speed); - pSample->nVolume = imfsmp.volume * 4; //mphack - pSample->nPan = imfsmp.panning; //mphack (IT uses 0-64, IMF uses the full 0-255) + pSample->nVolume = imfsmp.volume * 4; + pSample->nGlobalVol = 256; + pSample->nPan = imfsmp.panning; if (imfsmp.flags & 1) pSample->uFlags |= CHN_LOOP; if (imfsmp.flags & 2) @@ -522,20 +541,17 @@ if (imfsmp.flags & 8) pSample->uFlags |= CHN_PANNING; - if (!blen) { - /* leave it blank */ - /*} else if (lflags & LOAD_NOSAMPLES) { - slurp_seek(fp, blen, SEEK_CUR);*/ - } else { - ReadSample(pSample, (imfsmp.flags & 4) ? RS_PCM8U : RS_PCM16U, reinterpret_cast<LPCSTR>(lpStream + iSampleOffset), blen); + if(blen) + { + ASSERT_CAN_READ(blen); + ReadSample(pSample, (imfsmp.flags & 4) ? RS_PCM16S : RS_PCM8S, reinterpret_cast<LPCSTR>(lpStream + dwMemPos), blen); } + dwMemPos += blen; pSample++; - dwMemPos += sizeof(IMFSAMPLE); } firstsample += imfins.smpnum; } return true; -} -#endif \ No newline at end of file +} \ No newline at end of file Modified: trunk/OpenMPT/soundlib/Load_mo3.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mo3.cpp 2009-08-16 11:55:06 UTC (rev 328) +++ trunk/OpenMPT/soundlib/Load_mo3.cpp 2009-08-16 16:58:51 UTC (rev 329) @@ -23,11 +23,15 @@ //----------------------------------------------------------- { // no valid MO3 file (magic bytes: "MO3") - if(dwMemLength < 3 || lpStream[0] != 'M' || lpStream[1] != 'O' || lpStream[2] != '3') + if(dwMemLength < 4 || lpStream[0] != 'M' || lpStream[1] != 'O' || lpStream[2] != '3') return false; #ifdef NO_MO3_SUPPORT - UNREFERENCED_PARAMETER(dwMemLength); + /* As of August 2009, the format revision is 5; Versions > 31 are unlikely to exist in the next few years, + so we will just ignore those if there's no UNMO3 library to tell us if the file is valid or not + (avoid messagebox with .MOD files that have a song name starting with "MO3" */ + if(lpStream[3] > 31) return false; + AfxMessageBox(GetStrI18N(__TEXT("The file appears to be a MO3 file, but this OpenMPT build does not support loading MO3 files."))); return false; #else Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-16 11:55:06 UTC (rev 328) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-16 16:58:51 UTC (rev 329) @@ -593,8 +593,9 @@ #endif // MODPLUG_TRACKER #endif #endif // MODPLUG_BASIC_SUPPORT + && (!ReadGDM(lpStream, dwMemLength)) + && (!ReadIMF(lpStream, dwMemLength)) && (!ReadMO3(lpStream, dwMemLength)) - && (!ReadGDM(lpStream, dwMemLength)) && (!ReadMod(lpStream, dwMemLength))) m_nType = MOD_TYPE_NONE; #ifdef ZIPPED_MOD_SUPPORT if ((!m_lpszSongComments) && (archive.GetComments(FALSE))) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-08-16 22:47:11
|
Revision: 330 http://modplug.svn.sourceforge.net/modplug/?rev=330&view=rev Author: saga-games Date: 2009-08-16 22:47:01 +0000 (Sun, 16 Aug 2009) Log Message: ----------- [Fix] Rearrange Samples: Empty samples were overwriting the mod title [Fix] Mod Conversion: Resetting the effect memory array proplery (nope, this was note a char array :) [Imp] IMF Loading: Remove the last disabled channels and a little bit of refactoring [Ref] Some more usage of the *INDEX datatypes Modified Paths: -------------- trunk/OpenMPT/mptrack/Childfrm.h trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/soundlib/Load_imf.cpp Modified: trunk/OpenMPT/mptrack/Childfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Childfrm.h 2009-08-16 16:58:51 UTC (rev 329) +++ trunk/OpenMPT/mptrack/Childfrm.h 2009-08-16 22:47:01 UTC (rev 330) @@ -26,13 +26,13 @@ typedef struct PATTERNVIEWSTATE { DWORD cbStruct; - UINT nPattern; - UINT nRow; + PATTERNINDEX nPattern; + ROWINDEX nRow; UINT nCursor; DWORD dwBeginSel; DWORD dwEndSel; UINT nDetailLevel; - UINT nOrder; //rewbs.playSongFromCursor + ORDERINDEX nOrder; //rewbs.playSongFromCursor } PATTERNVIEWSTATE; typedef struct SAMPLEVIEWSTATE Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2009-08-16 16:58:51 UTC (rev 329) +++ trunk/OpenMPT/mptrack/Moddoc.h 2009-08-16 22:47:01 UTC (rev 330) @@ -197,7 +197,7 @@ void RearrangeSampleList(); BOOL CompoCleanup(); - LONG InsertPattern(LONG nOrd=-1, UINT nRows=64); + LONG InsertPattern(ORDERINDEX nOrd = -1, ROWINDEX nRows = 64); LONG InsertSample(BOOL bLimit=FALSE); LONG InsertInstrument(LONG lSample=0, LONG lDuplicate=0); void InitializeInstrument(MODINSTRUMENT *pIns, UINT nsample=0); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-16 16:58:51 UTC (rev 329) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-16 22:47:01 UTC (rev 330) @@ -162,8 +162,12 @@ for (UINT nPat=0; nPat<m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) { MODCOMMAND *m = m_SndFile.Patterns[nPat]; - BYTE cEffectMemory[MAX_CHANNELS][MAX_EFFECTS] = {0}; // for -> MOD/XM conversion + + // This is used for -> MOD/XM conversion + BYTE cEffectMemory[MAX_CHANNELS][MAX_EFFECTS]; + memset(&cEffectMemory, 0, sizeof(BYTE) * MAX_CHANNELS * MAX_EFFECTS); UINT nChannel = m_SndFile.m_nChannels - 1; + for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--) { nChannel = (nChannel + 1) % m_SndFile.m_nChannels; // 0...Channels - 1 @@ -1529,7 +1533,7 @@ } -LONG CModDoc::InsertPattern(LONG nOrd, UINT nRows) +LONG CModDoc::InsertPattern(ORDERINDEX nOrd, ROWINDEX nRows) //------------------------------------------------ { const int i = m_SndFile.Patterns.Insert(nRows); @@ -1816,16 +1820,15 @@ // Now, move everything around for(UINT i = 1; i <= m_SndFile.m_nSamples; i++) { - if(nSampleMap[i] != i) + if(nSampleMap[i] && nSampleMap[i] != i) { // This gotta be moved - m_SndFile.MoveSample(i, nSampleMap[i]); m_SndFile.Samples[i].pSample = nullptr; strcpy(m_SndFile.m_szNames[nSampleMap[i]], m_SndFile.m_szNames[i]); m_SndFile.m_szNames[i][0] = '\0'; - // Also update instrument mapping + // Also update instrument mapping (if module is in instrument mode) for(UINT iInstr = 1; iInstr <= m_SndFile.m_nInstruments; iInstr++){ if(m_SndFile.Instruments[iInstr]){ MODINSTRUMENT *p = m_SndFile.Instruments[iInstr]; @@ -1839,12 +1842,12 @@ // Go through the patterns and remap samples (if module is in sample mode) if(!m_SndFile.m_nInstruments) { - for (UINT nPat=0; nPat<m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) + for (UINT nPat=0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) { MODCOMMAND *m = m_SndFile.Patterns[nPat]; for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--) { - m->instr = nSampleMap[m->instr]; + if(nSampleMap[m->instr]) m->instr = nSampleMap[m->instr]; } } } Modified: trunk/OpenMPT/soundlib/Load_imf.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp 2009-08-16 16:58:51 UTC (rev 329) +++ trunk/OpenMPT/soundlib/Load_imf.cpp 2009-08-16 22:47:01 UTC (rev 330) @@ -1,7 +1,7 @@ /* * Purpose: Load IMF (Imago Orpheus) modules * Authors: Storlek (Original author - http://schismtracker.org/) - * Johannes Schultz (OpenMPT Port) + * Johannes Schultz (OpenMPT Port, tweaks) * * Thanks to Storlek for allowing me to use this code! */ @@ -232,7 +232,6 @@ static void load_imf_envelope(MODINSTRUMENT *ins, INSTRUMENTENVELOPE *env, IMFINSTRUMENT *imfins, int e) { - UINT n; UINT min = 0; // minimum tick value for next node int shift = (e == IMF_ENV_VOL) ? 0 : 2; @@ -242,7 +241,7 @@ env->nSustainStart = env->nSustainEnd = imfins->env[e].sustain; env->nReleaseNode = ENV_RELEASE_NODE_UNSET; - for (n = 0; n < env->nNodes; n++) { + for (UINT n = 0; n < env->nNodes; n++) { UINT16 nTick, nValue; nTick = LittleEndianW(imfins->nodes[e][n].tick); nValue = LittleEndianW(imfins->nodes[e][n].value) >> shift; @@ -302,7 +301,7 @@ m_nSamples = 0; // Will be incremented later m_nInstruments = 0; - m_nChannels = 32; + m_nChannels = 0; for (CHANNELINDEX nChn = 0; nChn < 32; nChn++) { ChnSettings[nChn].nPan = hdr.channels[nChn].panning * 64 / 255; ChnSettings[nChn].nPan *= 4; @@ -313,9 +312,11 @@ // TODO: reverb/chorus? switch (hdr.channels[nChn].status) { case 0: // enabled; don't worry about it + m_nChannels = nChn + 1; break; case 1: // mute ChnSettings[nChn].dwFlags |= CHN_MUTE; + m_nChannels = nChn + 1; break; case 2: // disabled ChnSettings[nChn].dwFlags |= CHN_MUTE; @@ -326,6 +327,7 @@ return false; } } + if(!m_nChannels) return false; for (ORDERINDEX nOrd = 0; nOrd < hdr.ordnum; nOrd++) Order[nOrd] = ((hdr.orderlist[nOrd] == 0xff) ? Order.GetIgnoreIndex() : hdr.orderlist[nOrd]); @@ -360,7 +362,7 @@ dwMemPos += 1; if (mask == 0) { row++; - row_data += 32; + row_data += m_nChannels; continue; } @@ -449,7 +451,7 @@ // read instruments for (INSTRUMENTINDEX nIns = 0; nIns < hdr.insnum; nIns++) { IMFINSTRUMENT imfins; - MODINSTRUMENT *ins; + MODINSTRUMENT *pIns; ASSERT_CAN_READ(sizeof(IMFINSTRUMENT)); memset(&imfins, 0, sizeof(IMFINSTRUMENT)); memcpy(&imfins, lpStream + dwMemPos, sizeof(IMFINSTRUMENT)); @@ -465,42 +467,33 @@ return false; } - ins = new MODINSTRUMENT; - if (!ins) continue; - Instruments[nIns + 1] = ins; - memset(ins, 0, sizeof(MODINSTRUMENT)); + pIns = new MODINSTRUMENT; + if (!pIns) continue; + Instruments[nIns + 1] = pIns; + memset(pIns, 0, sizeof(MODINSTRUMENT)); + pIns->nPPC = 5 * 12; + SetDefaultInstrumentValues(pIns); - strncpy(ins->name, imfins.name, 25); - ins->name[25] = 0; + strncpy(pIns->name, imfins.name, 31); + pIns->name[31] = 0; if (imfins.smpnum) { for (BYTE cNote = 0; cNote < 120; cNote++) { - ins->NoteMap[cNote] = cNote + 1; - ins->Keyboard[cNote] = firstsample + imfins.map[cNote]; + pIns->NoteMap[cNote] = cNote + 1; + pIns->Keyboard[cNote] = firstsample + imfins.map[cNote]; } } - /* Fadeout: - IT1 - 64 - IT2 - 256 - FT2 - 4095 - IMF - 4095 - MPT - god knows what, all the loaders are inconsistent - Schism - 128 presented (!); 8192? internal + pIns->nFadeOut = imfins.fadeout; + pIns->nGlobalVol = 128; - IMF and XM have the same range and modplug's XM loader doesn't do any bit shifting with it, - so I'll do the same here for now. I suppose I should get this nonsense straightened - out at some point, though. */ - ins->nFadeOut = imfins.fadeout; - ins->nGlobalVol = 128; + load_imf_envelope(pIns, &pIns->VolEnv, &imfins, IMF_ENV_VOL); + load_imf_envelope(pIns, &pIns->PanEnv, &imfins, IMF_ENV_PAN); + load_imf_envelope(pIns, &pIns->PitchEnv, &imfins, IMF_ENV_FILTER); - load_imf_envelope(ins, &ins->VolEnv, &imfins, IMF_ENV_VOL); - load_imf_envelope(ins, &ins->PanEnv, &imfins, IMF_ENV_PAN); - load_imf_envelope(ins, &ins->PitchEnv, &imfins, IMF_ENV_FILTER); - // hack to get === to stop notes (from modplug's xm loader) - if (!(ins->dwFlags & ENV_VOLUME) && !ins->nFadeOut) - ins->nFadeOut = 8192; + if (!(pIns->dwFlags & ENV_VOLUME) && !pIns->nFadeOut) + pIns->nFadeOut = 8192; // read this instrument's samples for (SAMPLEINDEX nSmp = 0; nSmp < imfins.smpnum; nSmp++) { @@ -520,7 +513,7 @@ strncpy(pSample->filename, imfsmp.filename, 12); pSample->filename[12] = 0; - strcpy(m_szNames[nSmp + 1], pSample->filename); + strcpy(m_szNames[m_nSamples], pSample->filename); blen = pSample->nLength = LittleEndian(imfsmp.length); pSample->nLoopStart = LittleEndian(imfsmp.loop_start); pSample->nLoopEnd = LittleEndian(imfsmp.loop_end); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2009-08-18 18:41:23
|
Revision: 331 http://modplug.svn.sourceforge.net/modplug/?rev=331&view=rev Author: saga-games Date: 2009-08-18 18:41:12 +0000 (Tue, 18 Aug 2009) Log Message: ----------- [New] Pattern editor: Multiple orders can be selected in the pattern sequence. At the moment, it is possible to insert, delete, duplicate and dragondrop multiple orders. [Ref] Redesigned a few functions and stuff to make this new feature work; Replace UINT/DWORD/whatever by ORDERINDEX/PATTERNINDEX and BOOL by bool where appropriate [Fix] Moving orders (when duplicating them) should be aware of the max. possible order now. [Fix] 669 Loader: Small modification so corehop.669 can be loaded; Note: Loader is still buggy like hell [Imp] Added tests for bitshifting version numbers Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/test/test.cpp trunk/OpenMPT/mptrack/typedefs.h trunk/OpenMPT/soundlib/Load_669.cpp trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-08-16 22:47:01 UTC (rev 330) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-08-18 18:41:12 UTC (rev 331) @@ -408,7 +408,7 @@ case CTRLMSG_SETCURRENTORDER: //Set orderlist selection and refresh GUI if change successful - m_OrderList.SetCurSel(lParam, FALSE); + m_OrderList.SetCurSel((ORDERINDEX)lParam, FALSE); break; case CTRLMSG_FORCEREFRESH: @@ -417,7 +417,7 @@ break; case CTRLMSG_GETCURRENTORDER: - return m_OrderList.GetCurSel(); + return m_OrderList.GetCurSel(true).nOrdLo; case CTRLMSG_SETCURRENTINSTRUMENT: case CTRLMSG_PAT_SETINSTRUMENT: @@ -472,11 +472,11 @@ break; case CTRLMSG_PREVORDER: - m_OrderList.SetCurSel(m_OrderList.GetCurSel()-1, TRUE); + m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).nOrdLo - 1, TRUE); break; case CTRLMSG_NEXTORDER: - m_OrderList.SetCurSel(m_OrderList.GetCurSel()+1, TRUE); + m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).nOrdLo + 1, TRUE); break; //rewbs.customKeys @@ -582,7 +582,7 @@ { if (pSndFile) { - for (UINT i=0; i<pSndFile->Order.size(); i++) + for (ORDERINDEX i=0; i<pSndFile->Order.size(); i++) { if (pSndFile->Order[i] == (UINT)lParam) { @@ -599,7 +599,7 @@ if (pSndFile) { lParam &= 0x7FFF; - m_OrderList.SetCurSel(lParam); + m_OrderList.SetCurSel((ORDERINDEX)lParam); SetCurrentPattern(pSndFile->Order[lParam]); } } @@ -652,7 +652,7 @@ void CCtrlPatterns::OnSequencePrev() //---------------------------------- { - m_OrderList.SetCurSel(m_OrderList.GetCurSel()-1); + m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).nOrdLo - 1); m_OrderList.SetFocus(); } @@ -660,7 +660,7 @@ void CCtrlPatterns::OnSequenceNext() //---------------------------------- { - m_OrderList.SetCurSel(m_OrderList.GetCurSel()+1); + m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).nOrdLo + 1); m_OrderList.SetFocus(); } @@ -844,18 +844,18 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - UINT nCurOrd = m_OrderList.GetCurSel(); - UINT pat = pSndFile->Order[nCurOrd]; - UINT rows = 64; + ORDERINDEX nCurOrd = m_OrderList.GetCurSel(true).nOrdLo; + PATTERNINDEX pat = pSndFile->Order[nCurOrd]; + ROWINDEX rows = 64; if ((pat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[pat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) { rows = pSndFile->PatternSize[pat]; if (rows < 32) rows = 32; } - LONG nNewPat = m_pModDoc->InsertPattern(nCurOrd+1, rows); + PATTERNINDEX nNewPat = m_pModDoc->InsertPattern(nCurOrd + 1, rows); if ((nNewPat >= 0) && (nNewPat < pSndFile->Patterns.Size())) { - m_OrderList.SetCurSel(nCurOrd+1); + m_OrderList.SetCurSel(nCurOrd + 1); m_OrderList.InvalidateRect(NULL, FALSE); SetCurrentPattern(nNewPat); m_pModDoc->SetModified(); @@ -869,35 +869,67 @@ void CCtrlPatterns::OnPatternDuplicate() //-------------------------------------- { + // duplicates one or more patterns. if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - UINT nCurOrd = m_OrderList.GetCurSel(); - UINT nCurPat = pSndFile->Order[nCurOrd]; - UINT rows = 64; - if (nCurPat < pSndFile->Patterns.Size()) + ORD_SELECTION selection = m_OrderList.GetCurSel(false); + ORDERINDEX nInsertCount = selection.nOrdHi - selection.nOrdLo; + ORDERINDEX nInsertWhere = selection.nOrdLo + nInsertCount + 1; + bool bSuccess = false; + // has this pattern been duplicated already? (for multiselect) + PATTERNINDEX pReplaceIndex[MAX_PATTERNS]; // TODO I think this is a bit much... + memset(&pReplaceIndex, PATTERNINDEX_INVALID, sizeof(PATTERNINDEX) * MAX_PATTERNS); + + for(ORDERINDEX i = 0; i <= nInsertCount; i++) { - if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) + PATTERNINDEX nCurPat = pSndFile->Order[selection.nOrdLo + i]; + ROWINDEX rows = 64; + if (nCurPat < pSndFile->Patterns.Size() && pReplaceIndex[nCurPat] == PATTERNINDEX_INVALID) { - rows = pSndFile->PatternSize[nCurPat]; - if (rows < pSndFile->GetModSpecifications().patternRowsMin) rows = pSndFile->GetModSpecifications().patternRowsMin; + if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) + { + rows = pSndFile->PatternSize[nCurPat]; + if (rows < pSndFile->GetModSpecifications().patternRowsMin) rows = pSndFile->GetModSpecifications().patternRowsMin; + } + PATTERNINDEX nNewPat = m_pModDoc->InsertPattern(nInsertWhere + i, rows); + if ((nNewPat >= 0) && (nNewPat < pSndFile->Patterns.Size())) + { + MODCOMMAND *pSrc = pSndFile->Patterns[nCurPat]; + MODCOMMAND *pDest = pSndFile->Patterns[nNewPat]; + UINT n = pSndFile->PatternSize[nCurPat]; + if (pSndFile->PatternSize[nNewPat] < n) n = pSndFile->PatternSize[nNewPat]; + n *= pSndFile->m_nChannels; + if (n) memcpy(pDest, pSrc, n * sizeof(MODCOMMAND)); + bSuccess = true; + pReplaceIndex[nCurPat] = nNewPat; // mark as duplicated + } + else + { + break; + } } - LONG nNewPat = m_pModDoc->InsertPattern(nCurOrd+1, rows); - if ((nNewPat >= 0) && (nNewPat < pSndFile->Patterns.Size())) + else { - MODCOMMAND *pSrc = pSndFile->Patterns[nCurPat]; - MODCOMMAND *pDest = pSndFile->Patterns[nNewPat]; - UINT n = pSndFile->PatternSize[nCurPat]; - if (pSndFile->PatternSize[nNewPat] < n) n = pSndFile->PatternSize[nNewPat]; - n *= pSndFile->m_nChannels; - if (n) memcpy(pDest, pSrc, n * sizeof(MODCOMMAND)); - m_OrderList.SetCurSel(nCurOrd+1); - m_OrderList.InvalidateRect(NULL, FALSE); - SetCurrentPattern(nNewPat); - m_pModDoc->SetModified(); - m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE|HINT_PATNAMES, this); + // invalid pattern, or it has been duplicated before (multiselect) + for (int j = pSndFile->Order.size() - 1; j > selection.nOrdLo + i + nInsertCount + 1; j--) pSndFile->Order[j] = pSndFile->Order[j - 1]; + PATTERNINDEX nNewPat; + if(nCurPat < pSndFile->Patterns.Size() && pReplaceIndex[nCurPat] != PATTERNINDEX_INVALID) + nNewPat = pReplaceIndex[nCurPat]; // take care of patterns that have been duplicated before + else + nNewPat= pSndFile->Order[selection.nOrdLo + i]; + pSndFile->Order[selection.nOrdLo + i + nInsertCount + 1] = nNewPat; } } + if(bSuccess) + { + m_OrderList.InvalidateRect(NULL, FALSE); + m_OrderList.SetCurSel(nInsertWhere); + SetCurrentPattern(pSndFile->Order[nInsertWhere]); + m_pModDoc->SetModified(); + m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE|HINT_PATNAMES, this); + if(selection.nOrdHi != selection.nOrdLo) m_OrderList.m_nScrollPos2nd = nInsertWhere + nInsertCount; + } } SwitchToView(); } Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-08-16 22:47:01 UTC (rev 330) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-08-18 18:41:12 UTC (rev 331) @@ -5,6 +5,12 @@ class COrderList; class CCtrlPatterns; +struct ORD_SELECTION +{ + ORDERINDEX nOrdLo; + ORDERINDEX nOrdHi; +}; + //=========================== class COrderList: public CWnd //=========================== @@ -13,14 +19,17 @@ protected: HFONT m_hFont; COLORREF colorText, colorTextSel; - //m_nXScroll : The order at the beginning of shown orderlist? - //m_nScrollPos: The same as order? - int m_cxFont, m_cyFont, m_nXScroll, m_nScrollPos, m_nDropPos; + int m_cxFont, m_cyFont; + //m_nXScroll : The order at the beginning of shown orderlist + //m_nScrollPos: The same as order + //m_nScrollPos2nd: 2nd selection point if multiple orders are selected + // (not neccessarily the higher order - GetCurSel() is taking care of that.) + ORDERINDEX m_nXScroll, m_nScrollPos, m_nScrollPos2nd, m_nDropPos; + bool m_bScrolling, m_bDragging, m_bShift; + ORDERINDEX m_nDragOrder; //To tell how many orders('orderboxes') to show at least //on both sides of current order(when updating orderslist position). BYTE m_nOrderlistMargins; - UINT m_nDragOrder; - BOOL m_bScrolling, m_bDragging, m_bShift; CModDoc *m_pModDoc; CCtrlPatterns *m_pParent; @@ -33,9 +42,9 @@ public: BOOL Init(const CRect&, CCtrlPatterns *pParent, CModDoc *, HFONT hFont); void InvalidateSelection() const; - int GetCurSel() const { return m_nScrollPos; } UINT GetCurrentPattern() const; - BOOL SetCurSel(int sel, BOOL bEdit=TRUE); + ORD_SELECTION GetCurSel(bool bIgnoreSelection) const; + bool SetCurSel(ORDERINDEX sel, bool bEdit = true, bool bShiftClick = false); BOOL ProcessKeyDown(UINT nChar); BOOL ProcessChar(UINT nChar); BOOL UpdateScrollInfo(); Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-08-16 22:47:01 UTC (rev 330) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-08-18 18:41:12 UTC (rev 331) @@ -5,7 +5,6 @@ #include "globals.h" #include "ctrl_pat.h" #include "view_pat.h" -#include ".\ctrl_pat.h" ////////////////////////////////////////////////////////////// // CPatEdit @@ -75,14 +74,15 @@ //---------------------- { m_hFont = NULL; - m_pParent = NULL; + m_pParent = nullptr; m_cxFont = m_cyFont = 0; - m_pModDoc = NULL; + m_pModDoc = nullptr; m_nScrollPos = m_nXScroll = 0; + m_nScrollPos2nd = ORDERINDEX_INVALID; m_nOrderlistMargins = s_nDefaultMargins; - m_bScrolling = FALSE; - m_bDragging = FALSE; - m_bShift = FALSE; + m_bScrolling = false; + m_bDragging = false; + m_bShift = false; } @@ -159,11 +159,27 @@ void COrderList::InvalidateSelection() const //------------------------------------------ { + ORDERINDEX nOrdLo = m_nScrollPos, nCount = 1; + static ORDERINDEX m_nScrollPos2Old = m_nScrollPos2nd; + if(m_nScrollPos2Old != ORDERINDEX_INVALID) + { + // there were multiple orders selected - remove them all + ORDERINDEX nOrdHi = m_nScrollPos; + if(m_nScrollPos2Old < m_nScrollPos) + { + nOrdLo = m_nScrollPos2Old; + } else + { + nOrdHi = m_nScrollPos2Old; + } + nCount = nOrdHi - nOrdLo + 1; + } + m_nScrollPos2Old = m_nScrollPos2nd; CRect rcClient, rect; GetClientRect(&rcClient); - rect.left = rcClient.left + (m_nScrollPos - m_nXScroll) * m_cxFont; + rect.left = rcClient.left + (nOrdLo - m_nXScroll) * m_cxFont; rect.top = rcClient.top; - rect.right = rect.left + m_cxFont; + rect.right = rect.left + m_cxFont * nCount; rect.bottom = rcClient.bottom; if (rect.right > rcClient.right) rect.right = rcClient.right; if (rect.left < rcClient.left) rect.left = rcClient.left; @@ -186,34 +202,51 @@ } -BOOL COrderList::SetCurSel(int sel, BOOL bEdit) -//--------------------------------------------- +ORD_SELECTION COrderList::GetCurSel(bool bIgnoreSelection) const +//-------------------------------------------------------------- { + // returns the currently selected order(s) + ORD_SELECTION result; + result.nOrdLo = result.nOrdHi = m_nScrollPos; + // bIgnoreSelection: true if only first selection marker is important. + if(!bIgnoreSelection && m_nScrollPos2nd != ORDERINDEX_INVALID) { + if(m_nScrollPos2nd < m_nScrollPos) // ord2 < ord1 + result.nOrdLo = m_nScrollPos2nd; + else + result.nOrdHi = m_nScrollPos2nd; + } + return result; +} + +bool COrderList::SetCurSel(ORDERINDEX sel, bool bEdit, bool bShiftClick) +//---------------------------------------------------------------------- +{ CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); + ORDERINDEX *nOrder = (bShiftClick) ? &m_nScrollPos2nd : &m_nScrollPos; - if ((sel < 0) || (sel >= int(pSndFile->Order.size())) || (!m_pParent) || (!pMainFrm)) return FALSE; - if (sel == m_nScrollPos) return TRUE; + if ((sel < 0) || (sel >= int(pSndFile->Order.size())) || (!m_pParent) || (!pMainFrm)) return false; + if (sel == *nOrder) return true; const BYTE nShownLength = GetLength(); InvalidateSelection(); - m_nScrollPos = sel; + *nOrder = sel; if (!m_bScrolling) { const BYTE nMargins = GetMargins(GetMarginsMax(nShownLength)); - if ((m_nScrollPos < m_nXScroll + nMargins) || (!m_cxFont) || (!m_cyFont)) + if ((*nOrder < m_nXScroll + nMargins) || (!m_cxFont) || (!m_cyFont)) { // Must move first shown sequence item to left in order to show // the new active order. - m_nXScroll = max(0, m_nScrollPos - nMargins); + m_nXScroll = max(0, *nOrder - nMargins); SetScrollPos(SB_HORZ, m_nXScroll); InvalidateRect(NULL, FALSE); } else { - int maxsel = nShownLength; + ORDERINDEX maxsel = nShownLength; if (maxsel) maxsel--; - if (m_nScrollPos - m_nXScroll >= maxsel - nMargins) + if (*nOrder - m_nXScroll >= maxsel - nMargins) { // Must move first shown sequence item to right in order to show // the new active order. - m_nXScroll = m_nScrollPos - (maxsel - nMargins); + m_nXScroll = *nOrder - (maxsel - nMargins); SetScrollPos(SB_HORZ, m_nXScroll); InvalidateRect(NULL, FALSE); } @@ -223,7 +256,7 @@ if ((m_pParent) && (m_pModDoc) && (bEdit)) { UINT n = pSndFile->Order[m_nScrollPos]; - if ((n < pSndFile->Patterns.Size()) && (pSndFile->Patterns[n])) + if ((n < pSndFile->Patterns.Size()) && (pSndFile->Patterns[n]) && !bShiftClick) { BOOL bIsPlaying = (pMainFrm->GetModPlaying() == m_pModDoc); if ((bIsPlaying) && (pSndFile->m_dwSongFlags & SONG_PATTERNLOOP)) @@ -251,7 +284,8 @@ } } UpdateInfoText(); - return TRUE; + if(m_nScrollPos == m_nScrollPos2nd) m_nScrollPos2nd = ORDERINDEX_INVALID; + return true; } @@ -273,15 +307,15 @@ switch(nChar) { case VK_UP: - case VK_LEFT: SetCurSel(m_nScrollPos-1); break; + case VK_LEFT: SetCurSel(m_nScrollPos - 1); break; case VK_DOWN: - case VK_RIGHT: SetCurSel(m_nScrollPos+1); break; + case VK_RIGHT: SetCurSel(m_nScrollPos + 1); break; case VK_HOME: SetCurSel(0); break; case VK_END: if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - int i = 0; + ORDERINDEX i = 0; const int nSeqLength = pSndFile->Order.size(); for (i=0; i+1 < nSeqLength; i++) if (pSndFile->Order[i+1] == pSndFile->Order.GetInvalidPatIndex()) break; SetCurSel(i); @@ -492,12 +526,14 @@ CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); GetClientRect(&rcClient); rect = rcClient; - int nIndex = m_nXScroll; + ORDERINDEX nIndex = m_nXScroll; + ORD_SELECTION selection = GetCurSel(false); + //Scrolling the shown orders(the showns rectangles)? while (rect.left < rcClient.right) { - BOOL bHighLight = ((bFocus) && (nIndex == m_nScrollPos)) ? TRUE : FALSE; - int nOrder = ((nIndex >= 0) && (nIndex < int(pSndFile->Order.size()))) ? pSndFile->Order[nIndex] : -1; + bool bHighLight = ((bFocus) && (nIndex >= selection.nOrdLo && nIndex <= selection.nOrdHi)) ? true : false; + ORDERINDEX nOrder = ((nIndex >= 0) && (nIndex < int(pSndFile->Order.size()))) ? pSndFile->Order[nIndex] : -1; if ((rect.right = rect.left + m_cxFont) > rcClient.right) rect.right = rcClient.right; rect.right--; if (bHighLight) { @@ -586,10 +622,12 @@ if (ih->CtrlPressed()) { + // queue pattern + //m_nScrollPos2nd = ORDERINDEX_INVALID; if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - int nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont; + ORDERINDEX nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont; if ((nOrder >= 0) && (nOrder < int(pSndFile->Order.size()))) { if (pSndFile->m_nSeqOverride == static_cast<UINT>(nOrder)+1) { @@ -602,12 +640,22 @@ } } else { + // mark pattern (+skip to) const int oldXScroll = m_nXScroll; - SetCurSel(m_nXScroll + (pt.x - rect.left) / m_cxFont); - m_bDragging = IsOrderInMargins(m_nScrollPos, oldXScroll) ? FALSE : TRUE; - if(m_bDragging == TRUE) + + ORDERINDEX nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont; + ORD_SELECTION selection = GetCurSel(false); + + // check if cursor is in selection - if it is, only react on MouseUp as the user might want to drag those orders + if(m_nScrollPos2nd == ORDERINDEX_INVALID || nOrder < selection.nOrdLo || nOrder > selection.nOrdHi) { - m_nDragOrder = GetCurSel(); + m_nScrollPos2nd = ORDERINDEX_INVALID; + SetCurSel(nOrder, true, ih->ShiftPressed()); + } + m_bDragging = IsOrderInMargins(m_nScrollPos, oldXScroll) ? false : true; + if(m_bDragging == true) + { + m_nDragOrder = GetCurSel(true).nOrdLo; m_nDropPos = m_nDragOrder; SetCapture(); } @@ -622,25 +670,68 @@ void COrderList::OnLButtonUp(UINT nFlags, CPoint pt) //-------------------------------------------------- { + CRect rect; + GetClientRect(&rect); + if (m_bDragging) { - CRect rect; - - m_bDragging = FALSE; + m_bDragging = false; ReleaseCapture(); - GetClientRect(&rect); if (rect.PtInRect(pt)) { int n = m_nXScroll + (pt.x - rect.left) / m_cxFont; if ((n >= 0) && (n == m_nDropPos) && (m_pModDoc)) { - if (m_nDragOrder == (UINT)m_nDropPos) return; - if (m_pModDoc->MoveOrder(m_nDragOrder, m_nDropPos, TRUE, m_bShift)) + // drag multiple orders (not quite as easy...) + ORD_SELECTION selection = GetCurSel(false); + // move how many orders from where? + ORDERINDEX nMoveCount = (selection.nOrdHi - selection.nOrdLo), nMovePos = selection.nOrdLo; + // drop before or after the selection + bool bMoveBack = !(m_nDragOrder < (UINT)m_nDropPos); + // don't do anything if drop position is inside the selection + if(m_nDropPos >= selection.nOrdLo && m_nDropPos <= selection.nOrdHi) return; + // drag or order or multiple orders? + bool bMultiSelection = (selection.nOrdLo != selection.nOrdHi); + + for(int i = 0; i <= nMoveCount; i++) { - SetCurSel(((m_nDragOrder < (UINT)m_nDropPos) && (!m_bShift)) ? m_nDropPos-1 : m_nDropPos); - m_pModDoc->SetModified(); + if(!m_pModDoc->MoveOrder(nMovePos, m_nDropPos, true, m_bShift)) return; + if((bMoveBack ^ m_bShift) == true && bMultiSelection) + { + nMovePos++; + m_nDropPos++; + } + if(bMoveBack && m_bShift && bMultiSelection) { + nMovePos += 2; + m_nDropPos++; + } } + if(bMultiSelection) + { + // adjust selection + m_nScrollPos2nd = m_nDropPos - 1; + m_nDropPos -= nMoveCount + (bMoveBack ? 0 : 1); + SetCurSel((bMoveBack && (!m_bShift)) ? m_nDropPos - 1 : m_nDropPos); + } else + { + SetCurSel(((m_nDragOrder < (UINT)m_nDropPos) && (!m_bShift)) ? m_nDropPos - 1 : m_nDropPos); + } + m_pModDoc->SetModified(); } + else + { + ORDERINDEX nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont; + ORD_SELECTION selection = GetCurSel(false); + + // this should actually have equal signs but that breaks multiselect: nOrder >= selection.nOrdLo && nOrder <= section.nOrdHi + if (pt.y < rect.bottom && m_nScrollPos2nd != ORDERINDEX_INVALID && nOrder > selection.nOrdLo && nOrder < selection.nOrdHi) + { + // Remove selection if we didn't drag anything but multiselect was active + m_nScrollPos2nd = ORDERINDEX_INVALID; + SetFocus(); + SetCurSel(m_nXScroll + (pt.x - rect.left) / m_cxFont); + } + } } InvalidateRect(NULL, FALSE); } else @@ -658,11 +749,12 @@ CRect rect; GetClientRect(&rect); - int n = -1; + ORDERINDEX n = ORDERINDEX_INVALID; if (rect.PtInRect(pt)) { + CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); n = m_nXScroll + (pt.x - rect.left) / m_cxFont; - if ((n < 0) || (n >= int(m_pModDoc->GetSoundFile()->Order.size()))) n = -1; + if (n >= int(pSndFile->Order.size()) || n >= pSndFile->GetModSpecifications().ordersMax) n = ORDERINDEX_INVALID; } if (n != (int)m_nDropPos) { @@ -673,7 +765,7 @@ SetCursor(CMainFrame::curDragging); } else { - m_nDropPos = -1; + m_nDropPos = ORDERINDEX_INVALID; SetCursor(CMainFrame::curNoDrop); } } @@ -691,39 +783,59 @@ GetClientRect(&rect); if (m_bDragging) { - m_nDropPos = -1; + m_nDropPos = ORDERINDEX_INVALID; OnLButtonUp(nFlags, pt); } - if (pt.y < rect.bottom) + if (pt.y >= rect.bottom) return; + + CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); + + bool bMultiSelection = (m_nScrollPos2nd != ORDERINDEX_INVALID); + + if(!bMultiSelection) SetCurSel(m_nXScroll + (pt.x - rect.left) / m_cxFont); + SetFocus(); + HMENU hMenu = ::CreatePopupMenu(); + if(!hMenu) return; + + // check if at least one pattern in the current selection exists + bool bPatternExists = false; + ORD_SELECTION selection = GetCurSel(false); + for(ORDERINDEX nOrd = selection.nOrdLo; nOrd <= selection.nOrdHi; nOrd++) { - SetCurSel(m_nXScroll + (pt.x - rect.left) / m_cxFont); - SetFocus(); - HMENU hMenu = ::CreatePopupMenu(); - - UINT nCurrentPattern = GetCurrentPattern(); - bool patternExists = (nCurrentPattern < m_pModDoc->GetSoundFile()->Patterns.Size() - && m_pModDoc->GetSoundFile()->Patterns[nCurrentPattern] != NULL); - DWORD greyed = patternExists?FALSE:MF_GRAYED; + bPatternExists = ((pSndFile->Order[nOrd] < pSndFile->Patterns.Size()) + && (pSndFile->Patterns[pSndFile->Order[nOrd]] != nullptr)); + if(bPatternExists) break; + } - if (hMenu) + DWORD greyed = bPatternExists ? 0 : MF_GRAYED; + + if(bMultiSelection) + { + // several patterns are selected. + AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Patterns\tIns"); + AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Patterns\tDel"); + AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); + AppendMenu(hMenu, MF_STRING | greyed, ID_ORDERLIST_COPY, "&Duplicate Patterns"); + } + else + { + // only one pattern is selected + AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Pattern\tIns"); + AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Pattern\tDel"); + AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); + AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_NEW, "Create &New Pattern"); + AppendMenu(hMenu, MF_STRING | greyed, ID_ORDERLIST_COPY, "&Duplicate Pattern"); + AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERNCOPY, "&Copy Pattern"); + AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERNPASTE, "P&aste Pattern"); + if ((m_pModDoc) && (m_pModDoc->GetSoundFile()->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) { - AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Pattern\tIns"); - AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Pattern\tDel"); AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); - AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_NEW, "Create &New Pattern"); - AppendMenu(hMenu, MF_STRING|greyed, ID_ORDERLIST_COPY, "&Duplicate Pattern"); - AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERNCOPY, "&Copy Pattern"); - AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERNPASTE, "P&aste Pattern"); - if ((m_pModDoc) && (m_pModDoc->GetSoundFile()->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) - { - AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); - AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERN_PROPERTIES, "&Properties..."); - } - ClientToScreen(&pt); - ::TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, pt.x, pt.y, 0, m_hWnd, NULL); - ::DestroyMenu(hMenu); + AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERN_PROPERTIES, "&Properties..."); } } + ClientToScreen(&pt); + ::TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, m_hWnd, NULL); + ::DestroyMenu(hMenu); } @@ -732,6 +844,8 @@ { if ((m_pModDoc) && (m_pParent)) { + m_nScrollPos2nd = ORDERINDEX_INVALID; + SetFocus(); CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); m_pParent->SetCurrentPattern(pSndFile->Order[m_nScrollPos]); } @@ -741,11 +855,11 @@ void COrderList::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar*) //-------------------------------------------------------------- { - UINT nNewPos = m_nXScroll; + ORDERINDEX nNewPos = m_nXScroll; UINT smin, smax; GetScrollRange(SB_HORZ, (LPINT)&smin, (LPINT)&smax); - m_bScrolling = TRUE; + m_bScrolling = true; switch(nSBCode) { case SB_LEFT: nNewPos = 0; break; @@ -755,7 +869,7 @@ case SB_PAGERIGHT: if (nNewPos+4 < smax) nNewPos += 4; else nNewPos = smax; break; case SB_THUMBTRACK: case SB_THUMBPOSITION: nNewPos = nPos; if (nNewPos & 0xFFFF8000) nNewPos = smin; break; - case SB_ENDSCROLL: m_bScrolling = FALSE; break; + case SB_ENDSCROLL: m_bScrolling = false; break; } if (nNewPos > smax) nNewPos = smax; if (nNewPos != (UINT)m_nXScroll) @@ -770,12 +884,13 @@ void COrderList::OnSize(UINT nType, int cx, int cy) //------------------------------------------------- { - int smin, smax, nPos; + ORDERINDEX nPos; + int smin, smax; CWnd::OnSize(nType, cx, cy); UpdateScrollInfo(); GetScrollRange(SB_HORZ, &smin, &smax); - nPos = (short int)GetScrollPos(SB_HORZ); + nPos = (ORDERINDEX)GetScrollPos(SB_HORZ); if (nPos > smax) nPos = smax; if (m_nXScroll != nPos) { @@ -789,17 +904,34 @@ void COrderList::OnInsertOrder() //------------------------------ { + // insert the same order(s) after the currently selected order(s) if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - //Checking whether there is some pattern at the end of orderlist. - if(pSndFile->Order[pSndFile->Order.size()-1] < pSndFile->Patterns.Size()) + ORD_SELECTION selection = GetCurSel(false); + ORDERINDEX nInsertCount = selection.nOrdHi - selection.nOrdLo, nInsertEnd = selection.nOrdHi; + + for(int i = 0; i <= nInsertCount; i++) { - if(pSndFile->Order.size() < pSndFile->GetModSpecifications().ordersMax) - pSndFile->Order.push_back(pSndFile->Order.GetInvalidPatIndex()); + + //Checking whether there is some pattern at the end of orderlist. + if(pSndFile->Order[pSndFile->Order.size() - 1] < pSndFile->Patterns.Size()) + { + if(pSndFile->Order.size() < pSndFile->GetModSpecifications().ordersMax) + pSndFile->Order.push_back(pSndFile->Order.GetInvalidPatIndex()); + } + + for (int i=pSndFile->Order.size() - 1; i>nInsertEnd; i--) pSndFile->Order[i] = pSndFile->Order[i - 1]; } - for (int i=pSndFile->Order.size()-1; i>m_nScrollPos; i--) pSndFile->Order[i] = pSndFile->Order[i-1]; + // now that there is enough space in the order list, overwrite the orders + for(ORDERINDEX i = 0; i <= nInsertCount; i++) + { + if(nInsertEnd + i + 1 < pSndFile->GetModSpecifications().ordersMax) + pSndFile->Order[nInsertEnd + i + 1] = pSndFile->Order[nInsertEnd - nInsertCount + i]; + } + m_nScrollPos = nInsertEnd + 1; + m_nScrollPos2nd = m_nScrollPos + nInsertCount; InvalidateRect(NULL, FALSE); m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); @@ -814,14 +946,22 @@ { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - m_pModDoc->RemoveOrder(m_nScrollPos); + ORD_SELECTION selection = GetCurSel(false); + // remove selection + m_nScrollPos2nd = ORDERINDEX_INVALID; + + for(int i = 0; i <= (selection.nOrdHi - selection.nOrdLo); i++) + { + m_pModDoc->RemoveOrder(selection.nOrdLo); + } InvalidateRect(NULL, FALSE); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); - UINT nNewOrd = pSndFile->Order[m_nScrollPos]; - if ((nNewOrd < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nNewOrd]) && (m_pParent)) + SetCurSel(selection.nOrdLo); + PATTERNINDEX nNewPat = pSndFile->Order[selection.nOrdLo]; + if ((nNewPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nNewPat] != nullptr) && (m_pParent)) { - m_pParent->SetCurrentPattern(nNewOrd); + m_pParent->SetCurrentPattern(nNewPat); } } } @@ -938,7 +1078,7 @@ InvalidateRect(NULL, FALSE); m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); - SetCurSel(posdest, TRUE); + SetCurSel(posdest, true); } return bCanDrop; } Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2009-08-16 22:47:01 UTC (rev 330) +++ trunk/OpenMPT/mptrack/Moddoc.h 2009-08-18 18:41:12 UTC (rev 331) @@ -197,14 +197,14 @@ void RearrangeSampleList(); BOOL CompoCleanup(); - LONG InsertPattern(ORDERINDEX nOrd = -1, ROWINDEX nRows = 64); - LONG InsertSample(BOOL bLimit=FALSE); - LONG InsertInstrument(LONG lSample=0, LONG lDuplicate=0); + PATTERNINDEX InsertPattern(ORDERINDEX nOrd = -1, ROWINDEX nRows = 64); + SAMPLEINDEX InsertSample(bool bLimit = false); + INSTRUMENTINDEX InsertInstrument(LONG lSample=0, LONG lDuplicate=0); void InitializeInstrument(MODINSTRUMENT *pIns, UINT nsample=0); - BOOL RemoveOrder(UINT n); - BOOL RemovePattern(UINT n); - BOOL RemoveSample(UINT n); - BOOL RemoveInstrument(UINT n); + bool RemoveOrder(ORDERINDEX n); + bool RemovePattern(PATTERNINDEX n); + bool RemoveSample(SAMPLEINDEX n); + bool RemoveInstrument(INSTRUMENTINDEX n); UINT PlayNote(UINT note, UINT nins, UINT nsmp, BOOL bpause, LONG nVol=-1, LONG loopstart=0, LONG loopend=0, int nCurrentChn=-1, const uint32 nStartPos = uint32_max); //rewbs.vstiLive: added current chan param BOOL NoteOff(UINT note, BOOL bFade=FALSE, UINT nins=-1, UINT nCurrentChn=-1); //rewbs.vstiLive: add params @@ -240,7 +240,7 @@ BOOL IsChildSample(UINT nIns, UINT nSmp) const; UINT FindSampleParent(UINT nSmp) const; UINT FindInstrumentChild(UINT nIns) const; - BOOL MoveOrder(UINT nSourceNdx, UINT nDestNdx, BOOL bUpdate=TRUE, BOOL bCopy=FALSE); + bool MoveOrder(UINT nSourceNdx, UINT nDestNdx, bool bUpdate = true, bool bCopy = false); BOOL ExpandPattern(PATTERNINDEX nPattern); BOOL ShrinkPattern(PATTERNINDEX nPattern); BOOL CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-16 22:47:01 UTC (rev 330) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-18 18:41:12 UTC (rev 331) @@ -1046,6 +1046,81 @@ } + + +void CModDoc::RearrangeSampleList() +//--------------------------------- +{ + if(m_SndFile.m_nSamples < 2) + return; + + UINT nRemap = 0; // remap count + UINT nSampleMap[MAX_SAMPLES + 1]; // map old => new + for(UINT i = 0; i <= MAX_SAMPLES; i++) + nSampleMap[i] = i; + + // First, find out which sample slots are unused and create the new sample map + for(UINT i = 1 ; i <= m_SndFile.m_nSamples; i++) { + if(!m_SndFile.Samples[i].pSample) + { + // Move all following samples + nRemap++; + nSampleMap[i] = 0; + for(UINT j = i + 1; j <= m_SndFile.m_nSamples; j++) + nSampleMap[j]--; + } + } + + if(!nRemap) + return; + + BEGIN_CRITICAL(); + + // Now, move everything around + for(UINT i = 1; i <= m_SndFile.m_nSamples; i++) + { + if(nSampleMap[i] && nSampleMap[i] != i) + { + // This gotta be moved + m_SndFile.MoveSample(i, nSampleMap[i]); + m_SndFile.Samples[i].pSample = nullptr; + strcpy(m_SndFile.m_szNames[nSampleMap[i]], m_SndFile.m_szNames[i]); + m_SndFile.m_szNames[i][0] = '\0'; + + // Also update instrument mapping (if module is in instrument mode) + for(UINT iInstr = 1; iInstr <= m_SndFile.m_nInstruments; iInstr++){ + if(m_SndFile.Instruments[iInstr]){ + MODINSTRUMENT *p = m_SndFile.Instruments[iInstr]; + for(WORD iNote =0; iNote < 128; iNote++) + if(p->Keyboard[iNote] == i) p->Keyboard[iNote] = nSampleMap[i]; + } + } + } + } + + // Go through the patterns and remap samples (if module is in sample mode) + if(!m_SndFile.m_nInstruments) + { + for (UINT nPat=0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) + { + MODCOMMAND *m = m_SndFile.Patterns[nPat]; + for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--) + { + if(nSampleMap[m->instr]) m->instr = nSampleMap[m->instr]; + } + } + } + + m_SndFile.m_nSamples -= nRemap; + + END_CRITICAL(); + + SetModified(); + UpdateAllViews(NULL, HINT_MODTYPE); + +} + + BOOL CModDoc::ConvertInstrumentsToSamples() //----------------------------------------- { @@ -1533,8 +1608,8 @@ } -LONG CModDoc::InsertPattern(ORDERINDEX nOrd, ROWINDEX nRows) -//------------------------------------------------ +PATTERNINDEX CModDoc::InsertPattern(ORDERINDEX nOrd, ROWINDEX nRows) +//------------------------------------------------------------------ { const int i = m_SndFile.Patterns.Insert(nRows); if(i < 0) @@ -1573,8 +1648,8 @@ } -LONG CModDoc::InsertSample(BOOL bLimit) -//------------------------------------- +SAMPLEINDEX CModDoc::InsertSample(bool bLimit) +//-------------------------------------------- { UINT i = 1; for (i=1; i<=m_SndFile.m_nSamples; i++) @@ -1611,7 +1686,7 @@ } -LONG CModDoc::InsertInstrument(LONG lSample, LONG lDuplicate) +INSTRUMENTINDEX CModDoc::InsertInstrument(LONG lSample, LONG lDuplicate) //----------------------------------------------------------- { MODINSTRUMENT *pDup = NULL; @@ -1733,44 +1808,44 @@ } -BOOL CModDoc::RemoveOrder(UINT n) +bool CModDoc::RemoveOrder(ORDERINDEX n) //------------------------------- { if (n < m_SndFile.Order.size()) { BEGIN_CRITICAL(); - for (UINT i=n; i<m_SndFile.Order.size()-1; i++) + for (ORDERINDEX i=n; i<m_SndFile.Order.size()-1; i++) { m_SndFile.Order[i] = m_SndFile.Order[i+1]; } m_SndFile.Order[m_SndFile.Order.size()-1] = m_SndFile.Order.GetInvalidPatIndex(); END_CRITICAL(); SetModified(); - return TRUE; + return true; } - return FALSE; + return false; } -BOOL CModDoc::RemovePattern(UINT n) +bool CModDoc::RemovePattern(PATTERNINDEX n) //--------------------------------- { if ((n < m_SndFile.Patterns.Size()) && (m_SndFile.Patterns[n])) { BEGIN_CRITICAL(); LPVOID p = m_SndFile.Patterns[n]; - m_SndFile.Patterns[n] = NULL; + m_SndFile.Patterns[n] = nullptr; m_SndFile.SetPatternName(n, ""); CSoundFile::FreePattern(p); END_CRITICAL(); SetModified(); - return TRUE; + return true; } - return FALSE; + return false; } -BOOL CModDoc::RemoveSample(UINT n) +bool CModDoc::RemoveSample(SAMPLEINDEX n) //-------------------------------- { if ((n) && (n <= m_SndFile.m_nSamples)) @@ -1783,86 +1858,13 @@ && (!m_SndFile.Samples[m_SndFile.m_nSamples].pSample)) m_SndFile.m_nSamples--; END_CRITICAL(); SetModified(); - return TRUE; + return true; } - return FALSE; + return false; } -void CModDoc::RearrangeSampleList() -//--------------------------------- -{ - if(m_SndFile.m_nSamples < 2) - return; - - UINT nRemap = 0; // remap count - UINT nSampleMap[MAX_SAMPLES + 1]; // map old => new - for(UINT i = 0; i <= MAX_SAMPLES; i++) - nSampleMap[i] = i; - - // First, find out which sample slots are unused and create the new sample map - for(UINT i = 1 ; i <= m_SndFile.m_nSamples; i++) { - if(!m_SndFile.Samples[i].pSample) - { - // Move all following samples - nRemap++; - nSampleMap[i] = 0; - for(UINT j = i + 1; j <= m_SndFile.m_nSamples; j++) - nSampleMap[j]--; - } - } - - if(!nRemap) - return; - - BEGIN_CRITICAL(); - - // Now, move everything around - for(UINT i = 1; i <= m_SndFile.m_nSamples; i++) - { - if(nSampleMap[i] && nSampleMap[i] != i) - { - // This gotta be moved - m_SndFile.MoveSample(i, nSampleMap[i]); - m_SndFile.Samples[i].pSample = nullptr; - strcpy(m_SndFile.m_szNames[nSampleMap[i]], m_SndFile.m_szNames[i]); - m_SndFile.m_szNames[i][0] = '\0'; - - // Also update instrument mapping (if module is in instrument mode) - for(UINT iInstr = 1; iInstr <= m_SndFile.m_nInstruments; iInstr++){ - if(m_SndFile.Instruments[iInstr]){ - MODINSTRUMENT *p = m_SndFile.Instruments[iInstr]; - for(WORD iNote =0; iNote < 128; iNote++) - if(p->Keyboard[iNote] == i) p->Keyboard[iNote] = nSampleMap[i]; - } - } - } - } - - // Go through the patterns and remap samples (if module is in sample mode) - if(!m_SndFile.m_nInstruments) - { - for (UINT nPat=0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) - { - MODCOMMAND *m = m_SndFile.Patterns[nPat]; - for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--) - { - if(nSampleMap[m->instr]) m->instr = nSampleMap[m->instr]; - } - } - } - - m_SndFile.m_nSamples -= nRemap; - - END_CRITICAL(); - - SetModified(); - UpdateAllViews(NULL, HINT_MODTYPE); - -} - - -BOOL CModDoc::RemoveInstrument(UINT n) +bool CModDoc::RemoveInstrument(INSTRUMENTINDEX n) //------------------------------------ { if ((n) && (n <= m_SndFile.m_nInstruments) && (m_SndFile.Instruments[n])) @@ -1875,31 +1877,32 @@ if (!bIns) m_SndFile.m_nInstruments = 0; END_CRITICAL(); SetModified(); - return TRUE; + return true; } - return FALSE; + return false; } -BOOL CModDoc::MoveOrder(UINT nSourceNdx, UINT nDestNdx, BOOL bUpdate, BOOL bCopy) +bool CModDoc::MoveOrder(UINT nSourceNdx, UINT nDestNdx, bool bUpdate, bool bCopy) //------------------------------------------------------------------------------- { - if ((nSourceNdx >= m_SndFile.Order.size()) || (nDestNdx >= m_SndFile.Order.size())) return FALSE; - UINT n = m_SndFile.Order[nSourceNdx]; + if ((nSourceNdx >= m_SndFile.Order.size()) || (nDestNdx >= m_SndFile.Order.size())) return false; + if (nDestNdx >= m_SndFile.GetModSpecifications().ordersMax) return false; + ORDERINDEX n = m_SndFile.Order[nSourceNdx]; // Delete source if (!bCopy) { - for (UINT i=nSourceNdx; i<m_SndFile.Order.size()-1; i++) m_SndFile.Order[i] = m_SndFile.Order[i+1]; + for (ORDERINDEX i = nSourceNdx; i < m_SndFile.Order.size() - 1; i++) m_SndFile.Order[i] = m_SndFile.Order[i+1]; if (nSourceNdx < nDestNdx) nDestNdx--; } // Insert at dest - for (UINT j=m_SndFile.Order.size()-1; j>nDestNdx; j--) m_SndFile.Order[j] = m_SndFile.Order[j-1]; + for (ORDERINDEX j = m_SndFile.Order.size() - 1; j > nDestNdx; j--) m_SndFile.Order[j] = m_SndFile.Order[j-1]; m_SndFile.Order[nDestNdx] = n; if (bUpdate) { UpdateAllViews(NULL, HINT_MODSEQUENCE, NULL); } - return TRUE; + return true; } Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2009-08-16 22:47:01 UTC (rev 330) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-08-18 18:41:12 UTC (rev 331) @@ -1870,7 +1870,7 @@ { if (bDoDrop) { - if (dwItemDrag != dwItemDrop) pModDoc->MoveOrder(dwItemDrag, dwItemDrop, TRUE); + if (dwItemDrag != dwItemDrop) pModDoc->MoveOrder(dwItemDrag, dwItemDrop, true); } return TRUE; } Modified: trunk/OpenMPT/mptrack/test/test.cpp =================================================================== --- trunk/OpenMPT/mptrack/test/test.cpp 2009-08-16 22:47:01 UTC (rev 330) +++ trunk/OpenMPT/mptrack/test/test.cpp 2009-08-18 18:41:12 UTC (rev 331) @@ -95,6 +95,9 @@ STATIC_ASSERT( MAKE_VERSION_NUMERIC(1,17,2,28) == 18285096 ); STATIC_ASSERT( MAKE_VERSION_NUMERIC(1,17,02,48) == 18285128 ); STATIC_ASSERT( MAKE_VERSION_NUMERIC(01,17,02,52) == 18285138 ); + // Ensure that bit-shifting works (used in some mod loaders for example) + STATIC_ASSERT( MAKE_VERSION_NUMERIC(01,17,00,00) == 0x0117 << 16 ); + STATIC_ASSERT( MAKE_VERSION_NUMERIC(01,17,03,00) >> 8 == 0x011703 ); } //Verify that the version obtained from the executable file is the same as Modified: trunk/OpenMPT/mptrack/typedefs.h =================================================================== --- trunk/OpenMPT/mptrack/typedefs.h 2009-08-16 22:47:01 UTC (rev 330) +++ trunk/OpenMPT/mptrack/typedefs.h 2009-08-18 18:41:12 UTC (rev 331) @@ -36,7 +36,10 @@ typedef uint16 CHANNELINDEX; typedef uint16 ORDERINDEX; const ORDERINDEX ORDERINDEX_MAX = uint16_max; + const ORDERINDEX ORDERINDEX_INVALID = ORDERINDEX_MAX; typedef uint16 PATTERNINDEX; + const PATTERNINDEX PATTERNINDEX_MAX = uint16_max; + const PATTERNINDEX PATTERNINDEX_INVALID = PATTERNINDEX_MAX; typedef uint8 PLUGINDEX; typedef uint16 TEMPO; typedef uint16 SAMPLEINDEX; Modified: trunk/OpenMPT/soundlib/Load_669.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_669.cpp 2009-08-16 22:47:01 UTC (rev 330) +++ trunk/OpenMPT/soundlib/Load_669.cpp 2009-08-18 18:41:12 UTC (rev 331) @@ -59,7 +59,7 @@ DWORD len = LittleEndian(*((DWORD *)(&psmp[ichk].length))); dontfuckwithme += len; } - if (dontfuckwithme > dwMemLength) return false; + if (dontfuckwithme - 0x1F1 > dwMemLength) return false; // That should be enough checking: this must be a 669 module. m_nType = MOD_TYPE_669; m_dwSongFlags |= SONG_LINEARSLIDES; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-08-16 22:47:01 UTC (rev 330) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-08-18 18:41:12 UTC (rev 331) @@ -855,9 +855,7 @@ //if(!(pChn->dwFlags & CHN_MUTE)) //removed by rewbs: fix http://www.modplug.com/forum/viewtopic.php?t=3358 nchn32++; } - if(nchn32 < 1) nchn32 = 1; - if(nchn32 > 31) nchn32 = 31; - + nchn32 = CLAMP(nchn32, 1, 31); DWORD mastervol; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rel...@us...> - 2009-08-18 20:38:58
|
Revision: 332 http://modplug.svn.sourceforge.net/modplug/?rev=332&view=rev Author: relabsoluness Date: 2009-08-18 20:38:41 +0000 (Tue, 18 Aug 2009) Log Message: ----------- [Mod] Default keybindings and tunings are now loaded from resources. [Ref] Some related tweaks and renaming. Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/InputHandler.cpp trunk/OpenMPT/mptrack/Stdafx.h trunk/OpenMPT/mptrack/misc_util.cpp trunk/OpenMPT/mptrack/misc_util.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h Added Paths: ----------- trunk/OpenMPT/mptrack/res/built-inTunings.tc trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb Removed Paths: ------------- trunk/OpenMPT/mptrack/bin/tunings/ trunk/OpenMPT/packageTemplate/default.mkb trunk/OpenMPT/packageTemplate/tunings/ Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2009-08-18 20:38:41 UTC (rev 332) @@ -2,8 +2,10 @@ #include "stdafx.h" #include ".\commandset.h" +#include "resource.h" #include <stdio.h> #include <stdlib.h> +#include <fstream> #define ENABLE_LOGGING 0 @@ -3074,7 +3076,7 @@ if( (outStream = fopen( fileName, "w" )) == NULL ) { - ::MessageBox(NULL, "Can't open file for writing.", "", MB_ICONEXCLAMATION|MB_OK); + AfxMessageBox(IDS_CANT_OPEN_FILE_FOR_WRITING, MB_ICONEXCLAMATION|MB_OK); return false; } fprintf(outStream, "//-------- OpenMPT key binding definition file -------\n"); @@ -3111,10 +3113,9 @@ return true; } -bool CCommandSet::LoadFile(CString fileName) + +bool CCommandSet::LoadFile(std::istream& iStrm, LPCTSTR szFilename) { - - FILE *inStream; KeyCombination kc; CommandID cmd=kcNumCommands; char s[1024]; @@ -3124,17 +3125,8 @@ int l=0; pTempCS = new CCommandSet(); - - - if( (inStream = fopen( fileName, "r" )) == NULL ) - { - ::MessageBox(NULL, "Can't open file keyboard config file " + fileName + " for reading.", "", MB_ICONEXCLAMATION|MB_OK); - delete pTempCS; - return false; - } - int errorCount=0; - while(fgets(s,1024,inStream)) + while(iStrm.getline(s, sizeof(s))) { //::MessageBox(NULL, s, "", MB_ICONEXCLAMATION|MB_OK); curLine = s; @@ -3189,7 +3181,7 @@ errorCount++; CString err; if (errorCount<10) { - err.Format("Line %d in key binding file %s was not understood.", l, fileName); + err.Format("Line %d in key binding file %s was not understood.", l, szFilename); if(s_bShowErrorOnUnknownKeybinding) ::MessageBox(NULL, err, "", MB_ICONEXCLAMATION|MB_OK); Log(err); } else if (errorCount==10) { @@ -3214,6 +3206,19 @@ return true; } +bool CCommandSet::LoadFile(CString fileName) +{ + std::ifstream fin(fileName); + if (fin.fail()) + { + CString strMsg; + AfxFormatString1(strMsg, IDS_CANT_OPEN_KEYBINDING_FILE, fileName); + AfxMessageBox(strMsg, MB_ICONEXCLAMATION|MB_OK); + return false; + } + else + return LoadFile(fin, fileName); +} //Could do better search algo but this is not perf critical. Modified: trunk/OpenMPT/mptrack/CommandSet.h =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/mptrack/CommandSet.h 2009-08-18 20:38:41 UTC (rev 332) @@ -1101,6 +1101,7 @@ void GenKeyMap(KeyMap &km); // Generate a keymap from this command set bool SaveFile(CString FileName, bool debug); bool LoadFile(CString FileName); + bool LoadFile(std::istream& iStrm, LPCTSTR szFilename); static DWORD GetKeymapLabel(InputTargetContext ctx, UINT mod, UINT code, KeyEventType ke); Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-18 20:38:41 UTC (rev 332) @@ -2553,11 +2553,11 @@ sel -= 1; CTuningCollection* tc = 0; - if(sel < CSoundFile::GetStandardTunings().GetNumTunings()) - tc = &CSoundFile::GetStandardTunings(); + if(sel < CSoundFile::GetBuiltInTunings().GetNumTunings()) + tc = &CSoundFile::GetBuiltInTunings(); else { - sel -= CSoundFile::GetStandardTunings().GetNumTunings(); + sel -= CSoundFile::GetBuiltInTunings().GetNumTunings(); if(sel < CSoundFile::GetLocalTunings().GetNumTunings()) tc = &CSoundFile::GetLocalTunings(); else @@ -2581,7 +2581,7 @@ //Case: Chosen tuning editor to be displayed. //Creating vector for the CTuningDialog. vector<CTuningCollection*> v; - v.push_back(&m_pSndFile->GetStandardTunings()); + v.push_back(&m_pSndFile->GetBuiltInTunings()); v.push_back(&m_pSndFile->GetLocalTunings()); v.push_back(&m_pSndFile->GetTuneSpecificTunings()); CTuningDialog td(this, v, pInstH->pTuning); @@ -2618,9 +2618,9 @@ return; } - for(size_t i = 0; i < CSoundFile::GetStandardTunings().GetNumTunings(); i++) + for(size_t i = 0; i < CSoundFile::GetBuiltInTunings().GetNumTunings(); i++) { - if(pIns->pTuning == &CSoundFile::GetStandardTunings().GetTuning(i)) + if(pIns->pTuning == &CSoundFile::GetBuiltInTunings().GetTuning(i)) { m_ComboTuning.SetCurSel(i+1); return; @@ -2631,7 +2631,7 @@ { if(pIns->pTuning == &CSoundFile::GetLocalTunings().GetTuning(i)) { - m_ComboTuning.SetCurSel(i+CSoundFile::GetStandardTunings().GetNumTunings()+1); + m_ComboTuning.SetCurSel(i+CSoundFile::GetBuiltInTunings().GetNumTunings()+1); return; } } @@ -2640,7 +2640,7 @@ { if(pIns->pTuning == &m_pSndFile->GetTuneSpecificTunings().GetTuning(i)) { - m_ComboTuning.SetCurSel(i+CSoundFile::GetStandardTunings().GetNumTunings() + CSoundFile::GetLocalTunings().GetNumTunings()+1); + m_ComboTuning.SetCurSel(i+CSoundFile::GetBuiltInTunings().GetNumTunings() + CSoundFile::GetLocalTunings().GetNumTunings()+1); return; } } @@ -2792,9 +2792,9 @@ m_ComboTuning.DeleteString(0); m_ComboTuning.AddString("OMPT IT behavior"); //<-> Instrument pTuning pointer == NULL - for(size_t i = 0; i<CSoundFile::GetStandardTunings().GetNumTunings(); i++) + for(size_t i = 0; i<CSoundFile::GetBuiltInTunings().GetNumTunings(); i++) { - m_ComboTuning.AddString(CSoundFile::GetStandardTunings().GetTuning(i).GetName().c_str()); + m_ComboTuning.AddString(CSoundFile::GetBuiltInTunings().GetTuning(i).GetName().c_str()); } for(size_t i = 0; i<CSoundFile::GetLocalTunings().GetNumTunings(); i++) { Modified: trunk/OpenMPT/mptrack/InputHandler.cpp =================================================================== --- trunk/OpenMPT/mptrack/InputHandler.cpp 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/mptrack/InputHandler.cpp 2009-08-18 20:38:41 UTC (rev 332) @@ -8,6 +8,8 @@ #include "mainfrm.h" #include <direct.h> #include ".\inputhandler.h" +#include <strstream> +#include <Shlwapi.h> #define TRANSITIONBIT 0x8000 #define REPEATBIT 0x4000 @@ -21,17 +23,43 @@ activeCommandSet = new CCommandSet(); CCommandSet::s_bShowErrorOnUnknownKeybinding = (CMainFrame::GetMainFrame()->GetPrivateProfileLong("Misc", "ShowErrorOnUnknownKeybinding", 1, theApp.GetConfigFileName()) != 0); - CString workingDir; - char wd[255]; - _getdcwd(_getdrive(), wd, 255); - workingDir = wd; - if (!CMainFrame::m_szKbdFile[0]) { - strcpy(CMainFrame::m_szKbdFile, workingDir + "\\default.mkb"); - } - if (!(activeCommandSet->LoadFile(CMainFrame::m_szKbdFile))) { - if (!(activeCommandSet->LoadFile(workingDir + "\\default.mkb"))) { - AfxMessageBox("Warning! OpenMPT has not been able to locate a keymap file. Please locate one in the settings.\r\nUntil you do so, the keyboard will not work in OpenMPT."); + CString sDefaultPath = CMainFrame::m_csExecutableDirectoryPath + TEXT("Keybindings.mkb"); + if (sDefaultPath.GetLength() > MAX_PATH - 1) + sDefaultPath = ""; + + const bool bNoExistingKbdFileSetting = (CMainFrame::m_szKbdFile[0] == 0); + + // 1. Try to load keybindings from the path saved in the settings. + // 2. If the setting doesn't exist or the loading fails, try to load from default location. + // 3. If neither one of these worked, load default keybindings from resources. + // 4. If there were no keybinging setting already, create a keybinding file to default location + // and set it's path to settings. + + if (bNoExistingKbdFileSetting || !(activeCommandSet->LoadFile(CMainFrame::m_szKbdFile))) + { + if (bNoExistingKbdFileSetting) + _tcscpy(CMainFrame::m_szKbdFile, sDefaultPath); + bool bSuccess = false; + if (PathFileExists(sDefaultPath) == TRUE) + bSuccess = activeCommandSet->LoadFile(sDefaultPath); + if (bSuccess == false) + { + // Load keybindings from resources. + Log("Loading keybindings from resources\n"); + const char* pData = nullptr; + HGLOBAL hglob = nullptr; + size_t nSize = 0; + if (LoadResource(MAKEINTRESOURCE(IDR_DEFAULT_KEYBINDINGS), TEXT("KEYBINDINGS"), pData, nSize, hglob) != nullptr) + { + std::istrstream iStrm(pData, nSize); + bSuccess = activeCommandSet->LoadFile(iStrm, TEXT("\"executable resource\"")); + FreeResource(hglob); + if (bSuccess && bNoExistingKbdFileSetting) + activeCommandSet->SaveFile(CMainFrame::m_szKbdFile, false); + } } + if (bSuccess == false) + AfxMessageBox(IDS_UNABLE_TO_LOAD_KEYBINDINGS, MB_ICONERROR); } //Get Keymap @@ -148,7 +176,7 @@ inp[0].type = inp[1].type = INPUT_KEYBOARD; inp[0].ki.time = inp[1].ki.time = 0; inp[0].ki.dwExtraInfo = inp[0].ki.dwExtraInfo = 0; - inp[0].ki.wVk = inp[1].ki.wVk = nChar; + inp[0].ki.wVk = inp[1].ki.wVk = static_cast<WORD>(nChar); inp[0].ki.wScan = inp[1].ki.wScan = 0; inp[0].ki.dwFlags = KEYEVENTF_KEYUP; inp[1].ki.dwFlags = 0; @@ -339,12 +367,12 @@ bool CInputHandler::CtrlPressed(void) { - return (modifierMask & HOTKEYF_CONTROL); + return ((modifierMask & HOTKEYF_CONTROL) != 0); } bool CInputHandler::AltPressed(void) { - return (modifierMask & HOTKEYF_ALT); + return ((modifierMask & HOTKEYF_ALT) != 0); } void CInputHandler::Bypass(bool b) Modified: trunk/OpenMPT/mptrack/Stdafx.h =================================================================== --- trunk/OpenMPT/mptrack/Stdafx.h 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/mptrack/Stdafx.h 2009-08-18 20:38:41 UTC (rev 332) @@ -50,6 +50,10 @@ //#include <afxdhtml.h> #pragma warning(default:4201) +#include <string> +#include <fstream> +#include <strstream> + #ifndef OFN_FORCESHOWHIDDEN #define OFN_FORCESHOWHIDDEN 0x10000000 #endif Modified: trunk/OpenMPT/mptrack/misc_util.cpp =================================================================== --- trunk/OpenMPT/mptrack/misc_util.cpp 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/mptrack/misc_util.cpp 2009-08-18 20:38:41 UTC (rev 332) @@ -1,3 +1,31 @@ #include "stdafx.h" #include "misc_util.h" +/* + * Loads resource. + * lpName and lpType: parameters passed to FindResource(). + * pData: Pointer to loaded resource data, nullptr if load not successful. + * nSize: Size of the data in bytes, zero if load not succesfull. + * hglob: HGLOBAL returned by LoadResource-function. + * Return: pData. + */ +LPCCH LoadResource(LPCTSTR lpName, LPCTSTR lpType, LPCCH& pData, size_t& nSize, HGLOBAL& hglob) +//--------------------------------------------------------------------------------------------- +{ + pData = nullptr; + nSize = 0; + hglob = nullptr; + HINSTANCE hInstance = AfxGetInstanceHandle(); + HRSRC hrsrc = FindResource(hInstance, lpName, lpType); + if (hrsrc != NULL) + { + hglob = LoadResource(hInstance, hrsrc); + if (hglob != NULL) + { + pData = reinterpret_cast<const char*>(LockResource(hglob)); + nSize = SizeofResource(hInstance, hrsrc); + } + } + return pData; +} + Modified: trunk/OpenMPT/mptrack/misc_util.h =================================================================== --- trunk/OpenMPT/mptrack/misc_util.h 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/mptrack/misc_util.h 2009-08-18 20:38:41 UTC (rev 332) @@ -78,5 +78,7 @@ #define CLAMP(number, low, high) min(high, max(low, number)) #endif + +LPCCH LoadResource(LPCTSTR lpName, LPCTSTR lpType, LPCCH& pData, size_t& nSize, HGLOBAL& hglob); #endif Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-08-18 20:38:41 UTC (rev 332) @@ -13,7 +13,7 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// Deutsch (Deutschland) resources +// German (Germany) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) #ifdef _WIN32 @@ -55,12 +55,12 @@ END #endif // APSTUDIO_INVOKED -#endif // Deutsch (Deutschland) resources +#endif // German (Germany) resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// -// Englisch (USA) resources +// English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 @@ -2204,14 +2204,19 @@ IDS_UNSUPPORTED_TUNING_DnD "For the time being Drag and Drop is only supported for tuning instances." IDS_OPERATION_FAIL "Operation failed." + IDS_CANT_OPEN_KEYBINDING_FILE + "Can't open keybindings file %1 for reading. Default keybindings will be used." + IDS_UNABLE_TO_LOAD_KEYBINDINGS + "Loading keybindings failed. The keyboard won't work properly." + IDS_CANT_OPEN_FILE_FOR_WRITING "Can't open file for writing." END -#endif // Englisch (USA) resources +#endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// -// Englisch (GB) resources +// English (U.K.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) #ifdef _WIN32 @@ -2565,11 +2570,25 @@ // 1 RT_MANIFEST "res\\rt_manif.bin" -#endif // Englisch (GB) resources + ///////////////////////////////////////////////////////////////////////////// +// +// KEYBINDINGS +// +IDR_DEFAULT_KEYBINDINGS KEYBINDINGS "res\\defaultKeybindings.mkb" +///////////////////////////////////////////////////////////////////////////// +// +// TUNING +// +IDR_BUILTIN_TUNINGS TUNING "res\\built-inTunings.tc" +#endif // English (U.K.) resources +///////////////////////////////////////////////////////////////////////////// + + + #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2009-08-18 20:38:41 UTC (rev 332) @@ -638,9 +638,15 @@ RelativePath="res\bitmap1.bmp"> </File> <File + RelativePath=".\res\built-inTunings.tc"> + </File> + <File RelativePath=".\res\colors.bmp"> </File> <File + RelativePath=".\res\defaultKeyBindings.mkb"> + </File> + <File RelativePath=".\res\dragging.cur"> </File> <File Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2009-08-18 20:38:41 UTC (rev 332) @@ -1236,6 +1236,14 @@ </File> </Filter> <File + RelativePath=".\res\built-inTunings.tc" + > + </File> + <File + RelativePath=".\res\defaultKeybindings.mkb" + > + </File> + <File RelativePath=".\mptrack.reg" > </File> Added: trunk/OpenMPT/mptrack/res/built-inTunings.tc =================================================================== (Binary files differ) Property changes on: trunk/OpenMPT/mptrack/res/built-inTunings.tc ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb =================================================================== --- trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb (rev 0) +++ trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb 2009-08-18 20:38:41 UTC (rev 332) @@ -0,0 +1,280 @@ +//-------- OpenMPT key binding definition file ------- +//-Format is: - +//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments - +//---------------------------------------------------------------------- + +//----( Global Context (0) )------------ +0:1347:2:78:1 //File/New: Ctrl+N (KeyDown) +0:1346:2:79:1 //File/Open: Ctrl+O (KeyDown) +0:1349:2:83:1 //File/Save: Ctrl+S (KeyDown) +0:1030:0:116:1 //Play song/Pause song: F5 (KeyDown) +0:1031:0:119:1 //Pause song: F8 (KeyDown) +0:1375:0:27:1 //Stop Song: ESC (KeyDown) +0:1029:0:117:1 //Play song from start: F6 (KeyDown) +0:1027:0:118:5 //Play pattern from start: F7 (KeyDown|KeyHold) +0:1026:2:118:5 //Play pattern from cursor: Ctrl+F7 (KeyDown|KeyHold) +0:1376:0:120:1 //Toggle Midi Record: F9 (KeyDown) +0:1359:2:90:1 //Undo: Ctrl+Z (KeyDown) +0:1360:2:88:1 //Cut: Ctrl+X (KeyDown) +0:1361:2:67:1 //Copy: Ctrl+C (KeyDown) +0:1361:2:45:1 //Copy: Ctrl+INSERT (KeyDown) +0:1362:2:86:1 //Paste: Ctrl+V (KeyDown) +0:1362:1:45:1 //Paste: Shift+INSERT (KeyDown) +0:1364:2:53:1 //SelectAll: Ctrl+5 (KeyDown) +0:1365:2:70:1 //Find: Ctrl+F (KeyDown) +0:1366:0:114:1 //Find Next: F3 (KeyDown) +0:1021:4:71:1 //View General: Alt+G (KeyDown) +0:1022:4:80:1 //View Pattern: Alt+P (KeyDown) +0:1023:4:83:1 //View Samples: Alt+S (KeyDown) +0:1024:4:78:1 //View Instruments: Alt+N (KeyDown) +0:1025:1:120:1 //View Comments: Shift+F9 (KeyDown) +0:1368:2:113:1 //Toggle Tree View: Ctrl+F2 (KeyDown) +0:1369:2:112:1 //View Options: Ctrl+F1 (KeyDown) +0:1370:0:112:1 //Help (to do): F1 (KeyDown) +0:1032:2:111:5 //Previous instrument: Ctrl+NUM DIVIDE (KeyDown|KeyHold) +0:1032:2:38:5 //Previous instrument: Ctrl+UP (KeyDown|KeyHold) +0:1033:2:106:5 //Next instrument: Ctrl+NUMMULT (KeyDown|KeyHold) +0:1033:2:40:5 //Next instrument: Ctrl+DOWN (KeyDown|KeyHold) +0:1036:0:111:1 //Previous octave: NUM DIVIDE (KeyDown) +0:1037:0:106:1 //Next octave: NUMMULT (KeyDown) +0:1034:2:37:5 //Previous order: Ctrl+LEFT (KeyDown|KeyHold) +0:1035:2:39:5 //Next order: Ctrl+RIGHT (KeyDown|KeyHold) + +//----( General Context [bottom] (1) )------------ + +//----( Pattern Context [bottom] (2) )------------ +2:1017:0:34:5 //Jump down by measure: PGDOWN (KeyDown|KeyHold) +2:1018:0:33:5 //Jump up by measure: PGUP (KeyDown|KeyHold) +2:1338:4:34:5 //Jump down by beat: Alt+PGDOWN (KeyDown|KeyHold) +2:1339:4:33:5 //Jump up by beat: Alt+PGUP (KeyDown|KeyHold) +2:1340:6:34:5 //Snap down to beat: Ctrl+Alt+PGDOWN (KeyDown|KeyHold) +2:1341:6:33:5 //Snap up to beat: Ctrl+Alt+PGUP (KeyDown|KeyHold) +2:1038:0:40:5 //Navigate down by 1 row: DOWN (KeyDown|KeyHold) +2:1039:0:38:5 //Navigate up by 1 row: UP (KeyDown|KeyHold) +2:1691:4:40:5 //Navigate down by spacing: Alt+DOWN (KeyDown|KeyHold) +2:1692:4:38:5 //Navigate up by spacing: Alt+UP (KeyDown|KeyHold) +2:1040:0:37:5 //Navigate left: LEFT (KeyDown|KeyHold) +2:1041:0:39:5 //Navigate right: RIGHT (KeyDown|KeyHold) +2:1042:0:9:5 //Navigate to next channel: TAB (KeyDown|KeyHold) +2:1043:1:9:5 //Navigate to previous channel: Shift+TAB (KeyDown|KeyHold) +2:1044:0:36:1 //Go to first channel: HOME (KeyDown) +2:1045:2:36:1 //Go to first row: Ctrl+HOME (KeyDown) +2:1046:6:36:1 //Go to first row of first channel: Ctrl+Alt+HOME (KeyDown) +2:1047:0:35:1 //Go to last channel: END (KeyDown) +2:1048:2:35:1 //Go to last row: Ctrl+END (KeyDown) +2:1049:6:35:1 //Go to last row of last channel: Ctrl+Alt+END (KeyDown) +2:1050:1:16:1 //Selection key: Shift (KeyDown) +2:1051:2:17:1 //Copy select key: Ctrl (KeyDown) +2:1011:2:76:1 //Select channel / Select all: Ctrl+L (KeyDown) +2:1663:0:122:1 //Toggle follow song: F11 (KeyDown) +2:1003:0:13:5 //Quick copy: ENTER (KeyDown|KeyHold) +2:1004:0:32:5 //Quick paste: SPACE (KeyDown|KeyHold) +2:1001:2:32:1 //Enable recording: Ctrl+SPACE (KeyDown) +2:1002:2:13:5 //Play row: Ctrl+ENTER (KeyDown|KeyHold) +2:1317:4:18:1 //Set row jump on note entry: Alt (KeyDown) +2:1685:2:9:1 //Switch to order list: Ctrl+TAB (KeyDown) +2:1662:6:80:1 //Toggle channel's plugin editor: Ctrl+Alt+P (KeyDown) +2:1062:0:93:1 //Show note properties: Application (KeyDown) +2:1005:0:121:5 //Mute current channel: F10 (KeyDown|KeyHold) +2:1006:2:121:5 //Solo current channel: Ctrl+F10 (KeyDown|KeyHold) +2:1007:2:81:5 //Transpose +1: Ctrl+Q (KeyDown|KeyHold) +2:1008:2:65:5 //Transpose -1: Ctrl+A (KeyDown|KeyHold) +2:1009:3:81:5 //Transpose +12: Shift+Ctrl+Q (KeyDown|KeyHold) +2:1010:3:65:5 //Transpose -12: Shift+Ctrl+A (KeyDown|KeyHold) +2:1012:2:77:1 //Amplify selection: Ctrl+M (KeyDown) +2:1014:2:74:1 //Interpolate volume: Ctrl+J (KeyDown) +2:1015:2:75:1 //Interpolate effect: Ctrl+K (KeyDown) +2:1016:4:66:1 //Open effect visualizer: Alt+B (KeyDown) +2:1766:2:71:1 //Go to row/channel/...: Ctrl+G (KeyDown) +2:1013:2:73:1 //Apply current instrument: Ctrl+I (KeyDown) +2:1660:4:69:5 //Grow selection: Alt+E (KeyDown|KeyHold) +2:1661:4:68:5 //Shrink selection: Alt+D (KeyDown|KeyHold) +2:1058:0:46:1 //Clear field: DELETE (KeyDown) +2:1664:1:190:1 //Clear field (IT Style): Shift+. (KeyDown) +2:1059:2:46:1 //Clear row and step: Ctrl+DELETE (KeyDown) +2:1665:1:46:5 //Clear field and step (IT Style): Shift+DELETE (KeyDown|KeyHold) +2:1061:0:8:5 //Delete rows: BACKSPACE (KeyDown|KeyHold) +2:1377:2:8:5 //Delete all rows: Ctrl+BACKSPACE (KeyDown|KeyHold) +2:1378:0:45:1 //Insert Row: INSERT (KeyDown) +2:1379:2:45:1 //Insert All Rows: Ctrl+INSERT (KeyDown) +2:1055:0:109:5 //Previous pattern: NUM SUB (KeyDown|KeyHold) +2:1054:0:107:5 //Next pattern: NUM PLUS (KeyDown|KeyHold) + +//----( Pattern Context [bottom] - Note Col (3) )------------ +3:1064:0:81:1 //Base octave C: Q (KeyDown) +3:1065:0:87:1 //Base octave C#: W (KeyDown) +3:1066:0:69:1 //Base octave D: E (KeyDown) +3:1067:0:82:1 //Base octave D#: R (KeyDown) +3:1068:0:84:1 //Base octave E: T (KeyDown) +3:1069:0:89:1 //Base octave F: Y (KeyDown) +3:1070:0:85:1 //Base octave F#: U (KeyDown) +3:1071:0:73:1 //Base octave G: I (KeyDown) +3:1072:0:79:1 //Base octave G#: O (KeyDown) +3:1073:0:80:1 //Base octave +1 A: P (KeyDown) +3:1074:0:219:1 //Base octave +1 A#: [ (KeyDown) +3:1075:0:221:1 //Base octave +1 B: ] (KeyDown) +3:1076:0:65:1 //Base octave +1 C: A (KeyDown) +3:1077:0:83:1 //Base octave +1 C#: S (KeyDown) +3:1078:0:68:1 //Base octave +1 D: D (KeyDown) +3:1079:0:70:1 //Base octave +1 D#: F (KeyDown) +3:1080:0:71:1 //Base octave +1 E: G (KeyDown) +3:1081:0:72:1 //Base octave +1 F: H (KeyDown) +3:1082:0:74:1 //Base octave +1 F#: J (KeyDown) +3:1083:0:75:1 //Base octave +1 G: K (KeyDown) +3:1084:0:76:1 //Base octave +1 G#: L (KeyDown) +3:1085:0:186:1 //Base octave +2 A: ; (KeyDown) +3:1086:0:222:1 //Base octave +2 A#: # (KeyDown) +3:1087:0:220:1 //Base octave +2 B: \ (KeyDown) +3:1088:0:90:1 //Base octave +2 C: Z (KeyDown) +3:1089:0:88:1 //Base octave +2 C#: X (KeyDown) +3:1090:0:67:1 //Base octave +2 D: C (KeyDown) +3:1091:0:86:1 //Base octave +2 D#: V (KeyDown) +3:1092:0:66:1 //Base octave +2 E: B (KeyDown) +3:1093:0:78:1 //Base octave +2 F: N (KeyDown) +3:1094:0:77:1 //Base octave +2 F#: M (KeyDown) +3:1095:0:188:1 //Base octave +2 G: , (KeyDown) +3:1096:0:190:1 //Base octave +2 G#: . (KeyDown) +3:1097:0:191:1 //Base octave +3 A: / (KeyDown) +3:1212:0:48:1 //Set octave 0: 0 (KeyDown) +3:1212:0:96:1 //Set octave 0: NUM 0 (KeyDown) +3:1213:0:49:1 //Set octave 1: 1 (KeyDown) +3:1213:0:97:1 //Set octave 1: NUM 1 (KeyDown) +3:1214:0:50:1 //Set octave 2: 2 (KeyDown) +3:1214:0:98:1 //Set octave 2: NUM 2 (KeyDown) +3:1215:0:51:1 //Set octave 3: 3 (KeyDown) +3:1215:0:99:1 //Set octave 3: NUM 3 (KeyDown) +3:1216:0:52:1 //Set octave 4: 4 (KeyDown) +3:1216:0:100:1 //Set octave 4: NUM 4 (KeyDown) +3:1217:0:53:1 //Set octave 5: 5 (KeyDown) +3:1217:0:101:1 //Set octave 5: NUM 5 (KeyDown) +3:1218:0:54:1 //Set octave 6: 6 (KeyDown) +3:1218:0:102:1 //Set octave 6: NUM 6 (KeyDown) +3:1219:0:55:1 //Set octave 7: 7 (KeyDown) +3:1219:0:103:1 //Set octave 7: NUM 7 (KeyDown) +3:1220:0:56:1 //Set octave 8: 8 (KeyDown) +3:1220:0:104:1 //Set octave 8: NUM 8 (KeyDown) +3:1221:0:57:1 //Set octave 9: 9 (KeyDown) +3:1221:0:105:1 //Set octave 9: NUM 9 (KeyDown) +3:1316:1:16:1 //Chord Modifier: Shift (KeyDown) +3:1200:0:192:1 //Note cut: ' (KeyDown) +3:1201:0:187:1 //Note off: = (KeyDown) + +//----( Pattern Context [bottom] - Ins Col (4) )------------ +4:1202:0:96:1 //Set instrument digit 0: NUM 0 (KeyDown) +4:1202:0:48:1 //Set instrument digit 0: 0 (KeyDown) +4:1203:0:97:1 //Set instrument digit 1: NUM 1 (KeyDown) +4:1203:0:49:1 //Set instrument digit 1: 1 (KeyDown) +4:1204:0:98:1 //Set instrument digit 2: NUM 2 (KeyDown) +4:1204:0:50:1 //Set instrument digit 2: 2 (KeyDown) +4:1205:0:99:1 //Set instrument digit 3: NUM 3 (KeyDown) +4:1205:0:51:1 //Set instrument digit 3: 3 (KeyDown) +4:1206:0:100:1 //Set instrument digit 4: NUM 4 (KeyDown) +4:1206:0:52:1 //Set instrument digit 4: 4 (KeyDown) +4:1207:0:101:1 //Set instrument digit 5: NUM 5 (KeyDown) +4:1207:0:53:1 //Set instrument digit 5: 5 (KeyDown) +4:1208:0:102:1 //Set instrument digit 6: NUM 6 (KeyDown) +4:1208:0:54:1 //Set instrument digit 6: 6 (KeyDown) +4:1209:0:103:1 //Set instrument digit 7: NUM 7 (KeyDown) +4:1209:0:55:1 //Set instrument digit 7: 7 (KeyDown) +4:1210:0:56:1 //Set instrument digit 8: 8 (KeyDown) +4:1211:0:105:1 //Set instrument digit 9: NUM 9 (KeyDown) +4:1211:0:57:1 //Set instrument digit 9: 9 (KeyDown) + +//----( Pattern Context [bottom] - Vol Col (5) )------------ +5:1222:0:48:1 //Set volume digit 0: 0 (KeyDown) +5:1222:0:96:1 //Set volume digit 0: NUM 0 (KeyDown) +5:1223:0:49:1 //Set volume digit 1: 1 (KeyDown) +5:1223:0:97:1 //Set volume digit 1: NUM 1 (KeyDown) +5:1224:0:50:1 //Set volume digit 2: 2 (KeyDown) +5:1224:0:98:1 //Set volume digit 2: NUM 2 (KeyDown) +5:1225:0:51:1 //Set volume digit 3: 3 (KeyDown) +5:1225:0:99:1 //Set volume digit 3: NUM 3 (KeyDown) +5:1226:0:52:1 //Set volume digit 4: 4 (KeyDown) +5:1226:0:100:1 //Set volume digit 4: NUM 4 (KeyDown) +5:1227:0:53:1 //Set volume digit 5: 5 (KeyDown) +5:1227:0:101:1 //Set volume digit 5: NUM 5 (KeyDown) +5:1228:0:54:1 //Set volume digit 6: 6 (KeyDown) +5:1228:0:102:1 //Set volume digit 6: NUM 6 (KeyDown) +5:1229:0:55:1 //Set volume digit 7: 7 (KeyDown) +5:1229:0:103:1 //Set volume digit 7: NUM 7 (KeyDown) +5:1230:0:56:1 //Set volume digit 8: 8 (KeyDown) +5:1231:0:57:1 //Set volume digit 9: 9 (KeyDown) +5:1231:0:105:1 //Set volume digit 9: NUM 9 (KeyDown) +5:1232:0:86:1 //Vol command - volume: V (KeyDown) +5:1233:0:80:1 //Vol command - pan: P (KeyDown) +5:1234:0:67:1 //Vol command - vol slide up: C (KeyDown) +5:1235:0:68:1 //Vol command - vol slide down: D (KeyDown) +5:1236:0:65:1 //Vol command - vol fine slide up: A (KeyDown) +5:1237:0:66:1 //Vol command - vol fine slide down: B (KeyDown) +5:1238:0:85:1 //Vol command - vibrato speed: U (KeyDown) +5:1239:0:72:1 //Vol command - vibrato: H (KeyDown) +5:1240:0:76:1 //Vol command - XM pan left: L (KeyDown) +5:1241:0:82:1 //Vol command - XM pan right: R (KeyDown) +5:1242:0:71:1 //Vol command - Portamento: G (KeyDown) +5:1243:0:70:1 //Vol command - Portamento Up: F (KeyDown) +5:1244:0:69:1 //Vol command - Portamento Down: E (KeyDown) +5:1245:1:186:1 //Vol command - Velocity: Shift+; (KeyDown) +5:1246:0:79:1 //Vol command - Offset: O (KeyDown) + +//----( Pattern Context [bottom] - FX Col (6) )------------ +6:1294:0:220:1 //FX midi macro slide: \ (KeyDown) +6:1295:1:186:1 //FX pseudo-velocity (experimental): Shift+; (KeyDown) + +//----( Pattern Context [bottom] - Param Col (7) )------------ +7:1247:0:48:1 //FX Param digit 0: 0 (KeyDown) +7:1247:0:96:1 //FX Param digit 0: NUM 0 (KeyDown) +7:1248:0:49:1 //FX Param digit 1: 1 (KeyDown) +7:1248:0:97:1 //FX Param digit 1: NUM 1 (KeyDown) +7:1249:0:50:1 //FX Param digit 2: 2 (KeyDown) +7:1249:0:98:1 //FX Param digit 2: NUM 2 (KeyDown) +7:1250:0:51:1 //FX Param digit 3: 3 (KeyDown) +7:1250:0:99:1 //FX Param digit 3: NUM 3 (KeyDown) +7:1251:0:52:1 //FX Param digit 4: 4 (KeyDown) +7:1251:0:100:1 //FX Param digit 4: NUM 4 (KeyDown) +7:1252:0:53:1 //FX Param digit 5: 5 (KeyDown) +7:1252:0:101:1 //FX Param digit 5: NUM 5 (KeyDown) +7:1253:0:54:1 //FX Param digit 6: 6 (KeyDown) +7:1253:0:102:1 //FX Param digit 6: NUM 6 (KeyDown) +7:1254:0:55:1 //FX Param digit 7: 7 (KeyDown) +7:1254:0:103:1 //FX Param digit 7: NUM 7 (KeyDown) +7:1255:0:56:1 //FX Param digit 8: 8 (KeyDown) +7:1255:0:104:1 //FX Param digit 8: NUM 8 (KeyDown) +7:1256:0:57:1 //FX Param digit 9: 9 (KeyDown) +7:1256:0:105:1 //FX Param digit 9: NUM 9 (KeyDown) +7:1257:0:65:1 //FX Param digit A: A (KeyDown) +7:1258:0:66:1 //FX Param digit B: B (KeyDown) +7:1259:0:67:1 //FX Param digit C: C (KeyDown) +7:1260:0:68:1 //FX Param digit D: D (KeyDown) +7:1261:0:69:1 //FX Param digit E: E (KeyDown) +7:1262:0:70:1 //FX Param digit F: F (KeyDown) + +//----( Sample Context [bottom] (8) )------------ +8:1380:2:84:1 //Trim sample around loop points: Ctrl+T (KeyDown) +8:1383:0:8:1 //Silence sample selection: BACKSPACE (KeyDown) +8:1385:3:65:1 //Amplify Sample: Shift+Ctrl+A (KeyDown) +8:1381:3:82:1 //Reverse sample: Shift+Ctrl+R (KeyDown) +8:1382:0:46:1 //Delete sample selection: DELETE (KeyDown) +8:1386:0:107:1 //Zoom Out: NUM PLUS (KeyDown) +8:1387:0:109:1 //Zoom In: NUM SUB (KeyDown) + +//----( Instrument Context [bottom] (9) )------------ + +//----( Comments Context [bottom] (10) )------------ + +//----( Unknown Context (11) )------------ + +//----( Unknown Context (12) )------------ + +//----( Plugin GUI Context (13) )------------ + +//----( General Context [top] (14) )------------ + +//----( Pattern Context [top] (15) )------------ + +//----( Sample Context [top] (16) )------------ + +//----( Instrument Context [top] (17) )------------ + +//----( Comments Context [top] (18) )------------ + +//----( Unknown Context (19) )------------ Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/mptrack/resource.h 2009-08-18 20:38:41 UTC (rev 332) @@ -47,6 +47,9 @@ #define IDS_ERR_NO_TUNING_SELECTION 208 #define IDS_UNSUPPORTED_TUNING_DnD 209 #define IDS_OPERATION_FAIL 210 +#define IDS_CANT_OPEN_KEYBINDING_FILE 211 +#define IDS_UNABLE_TO_LOAD_KEYBINDINGS 212 +#define IDS_CANT_OPEN_FILE_FOR_WRITING 213 #define IDB_MAINBAR 300 #define IDB_IMAGELIST 301 #define IDB_PATTERNS 302 @@ -107,6 +110,8 @@ #define IDD_MSGBOX_HIDABLE 516 #define IDD_ADDSILENCE 517 #define IDD_MODLOADING_WARNINGS 518 +#define IDR_DEFAULT_KEYBINDINGS 519 +#define IDR_BUILTIN_TUNINGS 520 #define IDC_BUTTON1 1001 #define IDC_BUTTON2 1002 #define IDC_BUTTON3 1003 @@ -1116,7 +1121,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 519 +#define _APS_NEXT_RESOURCE_VALUE 521 #define _APS_NEXT_COMMAND_VALUE 59229 #define _APS_NEXT_CONTROL_VALUE 2386 #define _APS_NEXT_SYMED_VALUE 901 Deleted: trunk/OpenMPT/packageTemplate/default.mkb =================================================================== --- trunk/OpenMPT/packageTemplate/default.mkb 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/packageTemplate/default.mkb 2009-08-18 20:38:41 UTC (rev 332) @@ -1,280 +0,0 @@ -//-------- OpenMPT key binding definition file ------- -//-Format is: - -//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments - -//---------------------------------------------------------------------- - -//----( Global Context (0) )------------ -0:1347:2:78:1 //File/New: Ctrl+N (KeyDown) -0:1346:2:79:1 //File/Open: Ctrl+O (KeyDown) -0:1349:2:83:1 //File/Save: Ctrl+S (KeyDown) -0:1030:0:116:1 //Play song/Pause song: F5 (KeyDown) -0:1031:0:119:1 //Pause song: F8 (KeyDown) -0:1375:0:27:1 //Stop Song: ESC (KeyDown) -0:1029:0:117:1 //Play song from start: F6 (KeyDown) -0:1027:0:118:5 //Play pattern from start: F7 (KeyDown|KeyHold) -0:1026:2:118:5 //Play pattern from cursor: Ctrl+F7 (KeyDown|KeyHold) -0:1376:0:120:1 //Toggle Midi Record: F9 (KeyDown) -0:1359:2:90:1 //Undo: Ctrl+Z (KeyDown) -0:1360:2:88:1 //Cut: Ctrl+X (KeyDown) -0:1361:2:67:1 //Copy: Ctrl+C (KeyDown) -0:1361:2:45:1 //Copy: Ctrl+INSERT (KeyDown) -0:1362:2:86:1 //Paste: Ctrl+V (KeyDown) -0:1362:1:45:1 //Paste: Shift+INSERT (KeyDown) -0:1364:2:53:1 //SelectAll: Ctrl+5 (KeyDown) -0:1365:2:70:1 //Find: Ctrl+F (KeyDown) -0:1366:0:114:1 //Find Next: F3 (KeyDown) -0:1021:4:71:1 //View General: Alt+G (KeyDown) -0:1022:4:80:1 //View Pattern: Alt+P (KeyDown) -0:1023:4:83:1 //View Samples: Alt+S (KeyDown) -0:1024:4:78:1 //View Instruments: Alt+N (KeyDown) -0:1025:1:120:1 //View Comments: Shift+F9 (KeyDown) -0:1368:2:113:1 //Toggle Tree View: Ctrl+F2 (KeyDown) -0:1369:2:112:1 //View Options: Ctrl+F1 (KeyDown) -0:1370:0:112:1 //Help (to do): F1 (KeyDown) -0:1032:2:111:5 //Previous instrument: Ctrl+NUM DIVIDE (KeyDown|KeyHold) -0:1032:2:38:5 //Previous instrument: Ctrl+UP (KeyDown|KeyHold) -0:1033:2:106:5 //Next instrument: Ctrl+NUMMULT (KeyDown|KeyHold) -0:1033:2:40:5 //Next instrument: Ctrl+DOWN (KeyDown|KeyHold) -0:1036:0:111:1 //Previous octave: NUM DIVIDE (KeyDown) -0:1037:0:106:1 //Next octave: NUMMULT (KeyDown) -0:1034:2:37:5 //Previous order: Ctrl+LEFT (KeyDown|KeyHold) -0:1035:2:39:5 //Next order: Ctrl+RIGHT (KeyDown|KeyHold) - -//----( General Context [bottom] (1) )------------ - -//----( Pattern Context [bottom] (2) )------------ -2:1017:0:34:5 //Jump down by measure: PGDOWN (KeyDown|KeyHold) -2:1018:0:33:5 //Jump up by measure: PGUP (KeyDown|KeyHold) -2:1338:4:34:5 //Jump down by beat: Alt+PGDOWN (KeyDown|KeyHold) -2:1339:4:33:5 //Jump up by beat: Alt+PGUP (KeyDown|KeyHold) -2:1340:6:34:5 //Snap down to beat: Ctrl+Alt+PGDOWN (KeyDown|KeyHold) -2:1341:6:33:5 //Snap up to beat: Ctrl+Alt+PGUP (KeyDown|KeyHold) -2:1038:0:40:5 //Navigate down by 1 row: DOWN (KeyDown|KeyHold) -2:1039:0:38:5 //Navigate up by 1 row: UP (KeyDown|KeyHold) -2:1691:4:40:5 //Navigate down by spacing: Alt+DOWN (KeyDown|KeyHold) -2:1692:4:38:5 //Navigate up by spacing: Alt+UP (KeyDown|KeyHold) -2:1040:0:37:5 //Navigate left: LEFT (KeyDown|KeyHold) -2:1041:0:39:5 //Navigate right: RIGHT (KeyDown|KeyHold) -2:1042:0:9:5 //Navigate to next channel: TAB (KeyDown|KeyHold) -2:1043:1:9:5 //Navigate to previous channel: Shift+TAB (KeyDown|KeyHold) -2:1044:0:36:1 //Go to first channel: HOME (KeyDown) -2:1045:2:36:1 //Go to first row: Ctrl+HOME (KeyDown) -2:1046:6:36:1 //Go to first row of first channel: Ctrl+Alt+HOME (KeyDown) -2:1047:0:35:1 //Go to last channel: END (KeyDown) -2:1048:2:35:1 //Go to last row: Ctrl+END (KeyDown) -2:1049:6:35:1 //Go to last row of last channel: Ctrl+Alt+END (KeyDown) -2:1050:1:16:1 //Selection key: Shift (KeyDown) -2:1051:2:17:1 //Copy select key: Ctrl (KeyDown) -2:1011:2:76:1 //Select channel / Select all: Ctrl+L (KeyDown) -2:1663:0:122:1 //Toggle follow song: F11 (KeyDown) -2:1003:0:13:5 //Quick copy: ENTER (KeyDown|KeyHold) -2:1004:0:32:5 //Quick paste: SPACE (KeyDown|KeyHold) -2:1001:2:32:1 //Enable recording: Ctrl+SPACE (KeyDown) -2:1002:2:13:5 //Play row: Ctrl+ENTER (KeyDown|KeyHold) -2:1317:4:18:1 //Set row jump on note entry: Alt (KeyDown) -2:1685:2:9:1 //Switch to order list: Ctrl+TAB (KeyDown) -2:1662:6:80:1 //Toggle channel's plugin editor: Ctrl+Alt+P (KeyDown) -2:1062:0:93:1 //Show note properties: Application (KeyDown) -2:1005:0:121:5 //Mute current channel: F10 (KeyDown|KeyHold) -2:1006:2:121:5 //Solo current channel: Ctrl+F10 (KeyDown|KeyHold) -2:1007:2:81:5 //Transpose +1: Ctrl+Q (KeyDown|KeyHold) -2:1008:2:65:5 //Transpose -1: Ctrl+A (KeyDown|KeyHold) -2:1009:3:81:5 //Transpose +12: Shift+Ctrl+Q (KeyDown|KeyHold) -2:1010:3:65:5 //Transpose -12: Shift+Ctrl+A (KeyDown|KeyHold) -2:1012:2:77:1 //Amplify selection: Ctrl+M (KeyDown) -2:1014:2:74:1 //Interpolate volume: Ctrl+J (KeyDown) -2:1015:2:75:1 //Interpolate effect: Ctrl+K (KeyDown) -2:1016:4:66:1 //Open effect visualizer: Alt+B (KeyDown) -2:1766:2:71:1 //Go to row/channel/...: Ctrl+G (KeyDown) -2:1013:2:73:1 //Apply current instrument: Ctrl+I (KeyDown) -2:1660:4:69:5 //Grow selection: Alt+E (KeyDown|KeyHold) -2:1661:4:68:5 //Shrink selection: Alt+D (KeyDown|KeyHold) -2:1058:0:46:1 //Clear field: DELETE (KeyDown) -2:1664:1:190:1 //Clear field (IT Style): Shift+. (KeyDown) -2:1059:2:46:1 //Clear row and step: Ctrl+DELETE (KeyDown) -2:1665:1:46:5 //Clear field and step (IT Style): Shift+DELETE (KeyDown|KeyHold) -2:1061:0:8:5 //Delete rows: BACKSPACE (KeyDown|KeyHold) -2:1377:2:8:5 //Delete all rows: Ctrl+BACKSPACE (KeyDown|KeyHold) -2:1378:0:45:1 //Insert Row: INSERT (KeyDown) -2:1379:2:45:1 //Insert All Rows: Ctrl+INSERT (KeyDown) -2:1055:0:109:5 //Previous pattern: NUM SUB (KeyDown|KeyHold) -2:1054:0:107:5 //Next pattern: NUM PLUS (KeyDown|KeyHold) - -//----( Pattern Context [bottom] - Note Col (3) )------------ -3:1064:0:81:1 //Base octave C: Q (KeyDown) -3:1065:0:87:1 //Base octave C#: W (KeyDown) -3:1066:0:69:1 //Base octave D: E (KeyDown) -3:1067:0:82:1 //Base octave D#: R (KeyDown) -3:1068:0:84:1 //Base octave E: T (KeyDown) -3:1069:0:89:1 //Base octave F: Y (KeyDown) -3:1070:0:85:1 //Base octave F#: U (KeyDown) -3:1071:0:73:1 //Base octave G: I (KeyDown) -3:1072:0:79:1 //Base octave G#: O (KeyDown) -3:1073:0:80:1 //Base octave +1 A: P (KeyDown) -3:1074:0:219:1 //Base octave +1 A#: [ (KeyDown) -3:1075:0:221:1 //Base octave +1 B: ] (KeyDown) -3:1076:0:65:1 //Base octave +1 C: A (KeyDown) -3:1077:0:83:1 //Base octave +1 C#: S (KeyDown) -3:1078:0:68:1 //Base octave +1 D: D (KeyDown) -3:1079:0:70:1 //Base octave +1 D#: F (KeyDown) -3:1080:0:71:1 //Base octave +1 E: G (KeyDown) -3:1081:0:72:1 //Base octave +1 F: H (KeyDown) -3:1082:0:74:1 //Base octave +1 F#: J (KeyDown) -3:1083:0:75:1 //Base octave +1 G: K (KeyDown) -3:1084:0:76:1 //Base octave +1 G#: L (KeyDown) -3:1085:0:186:1 //Base octave +2 A: ; (KeyDown) -3:1086:0:222:1 //Base octave +2 A#: # (KeyDown) -3:1087:0:220:1 //Base octave +2 B: \ (KeyDown) -3:1088:0:90:1 //Base octave +2 C: Z (KeyDown) -3:1089:0:88:1 //Base octave +2 C#: X (KeyDown) -3:1090:0:67:1 //Base octave +2 D: C (KeyDown) -3:1091:0:86:1 //Base octave +2 D#: V (KeyDown) -3:1092:0:66:1 //Base octave +2 E: B (KeyDown) -3:1093:0:78:1 //Base octave +2 F: N (KeyDown) -3:1094:0:77:1 //Base octave +2 F#: M (KeyDown) -3:1095:0:188:1 //Base octave +2 G: , (KeyDown) -3:1096:0:190:1 //Base octave +2 G#: . (KeyDown) -3:1097:0:191:1 //Base octave +3 A: / (KeyDown) -3:1212:0:48:1 //Set octave 0: 0 (KeyDown) -3:1212:0:96:1 //Set octave 0: NUM 0 (KeyDown) -3:1213:0:49:1 //Set octave 1: 1 (KeyDown) -3:1213:0:97:1 //Set octave 1: NUM 1 (KeyDown) -3:1214:0:50:1 //Set octave 2: 2 (KeyDown) -3:1214:0:98:1 //Set octave 2: NUM 2 (KeyDown) -3:1215:0:51:1 //Set octave 3: 3 (KeyDown) -3:1215:0:99:1 //Set octave 3: NUM 3 (KeyDown) -3:1216:0:52:1 //Set octave 4: 4 (KeyDown) -3:1216:0:100:1 //Set octave 4: NUM 4 (KeyDown) -3:1217:0:53:1 //Set octave 5: 5 (KeyDown) -3:1217:0:101:1 //Set octave 5: NUM 5 (KeyDown) -3:1218:0:54:1 //Set octave 6: 6 (KeyDown) -3:1218:0:102:1 //Set octave 6: NUM 6 (KeyDown) -3:1219:0:55:1 //Set octave 7: 7 (KeyDown) -3:1219:0:103:1 //Set octave 7: NUM 7 (KeyDown) -3:1220:0:56:1 //Set octave 8: 8 (KeyDown) -3:1220:0:104:1 //Set octave 8: NUM 8 (KeyDown) -3:1221:0:57:1 //Set octave 9: 9 (KeyDown) -3:1221:0:105:1 //Set octave 9: NUM 9 (KeyDown) -3:1316:1:16:1 //Chord Modifier: Shift (KeyDown) -3:1200:0:192:1 //Note cut: ' (KeyDown) -3:1201:0:187:1 //Note off: = (KeyDown) - -//----( Pattern Context [bottom] - Ins Col (4) )------------ -4:1202:0:96:1 //Set instrument digit 0: NUM 0 (KeyDown) -4:1202:0:48:1 //Set instrument digit 0: 0 (KeyDown) -4:1203:0:97:1 //Set instrument digit 1: NUM 1 (KeyDown) -4:1203:0:49:1 //Set instrument digit 1: 1 (KeyDown) -4:1204:0:98:1 //Set instrument digit 2: NUM 2 (KeyDown) -4:1204:0:50:1 //Set instrument digit 2: 2 (KeyDown) -4:1205:0:99:1 //Set instrument digit 3: NUM 3 (KeyDown) -4:1205:0:51:1 //Set instrument digit 3: 3 (KeyDown) -4:1206:0:100:1 //Set instrument digit 4: NUM 4 (KeyDown) -4:1206:0:52:1 //Set instrument digit 4: 4 (KeyDown) -4:1207:0:101:1 //Set instrument digit 5: NUM 5 (KeyDown) -4:1207:0:53:1 //Set instrument digit 5: 5 (KeyDown) -4:1208:0:102:1 //Set instrument digit 6: NUM 6 (KeyDown) -4:1208:0:54:1 //Set instrument digit 6: 6 (KeyDown) -4:1209:0:103:1 //Set instrument digit 7: NUM 7 (KeyDown) -4:1209:0:55:1 //Set instrument digit 7: 7 (KeyDown) -4:1210:0:56:1 //Set instrument digit 8: 8 (KeyDown) -4:1211:0:105:1 //Set instrument digit 9: NUM 9 (KeyDown) -4:1211:0:57:1 //Set instrument digit 9: 9 (KeyDown) - -//----( Pattern Context [bottom] - Vol Col (5) )------------ -5:1222:0:48:1 //Set volume digit 0: 0 (KeyDown) -5:1222:0:96:1 //Set volume digit 0: NUM 0 (KeyDown) -5:1223:0:49:1 //Set volume digit 1: 1 (KeyDown) -5:1223:0:97:1 //Set volume digit 1: NUM 1 (KeyDown) -5:1224:0:50:1 //Set volume digit 2: 2 (KeyDown) -5:1224:0:98:1 //Set volume digit 2: NUM 2 (KeyDown) -5:1225:0:51:1 //Set volume digit 3: 3 (KeyDown) -5:1225:0:99:1 //Set volume digit 3: NUM 3 (KeyDown) -5:1226:0:52:1 //Set volume digit 4: 4 (KeyDown) -5:1226:0:100:1 //Set volume digit 4: NUM 4 (KeyDown) -5:1227:0:53:1 //Set volume digit 5: 5 (KeyDown) -5:1227:0:101:1 //Set volume digit 5: NUM 5 (KeyDown) -5:1228:0:54:1 //Set volume digit 6: 6 (KeyDown) -5:1228:0:102:1 //Set volume digit 6: NUM 6 (KeyDown) -5:1229:0:55:1 //Set volume digit 7: 7 (KeyDown) -5:1229:0:103:1 //Set volume digit 7: NUM 7 (KeyDown) -5:1230:0:56:1 //Set volume digit 8: 8 (KeyDown) -5:1231:0:57:1 //Set volume digit 9: 9 (KeyDown) -5:1231:0:105:1 //Set volume digit 9: NUM 9 (KeyDown) -5:1232:0:86:1 //Vol command - volume: V (KeyDown) -5:1233:0:80:1 //Vol command - pan: P (KeyDown) -5:1234:0:67:1 //Vol command - vol slide up: C (KeyDown) -5:1235:0:68:1 //Vol command - vol slide down: D (KeyDown) -5:1236:0:65:1 //Vol command - vol fine slide up: A (KeyDown) -5:1237:0:66:1 //Vol command - vol fine slide down: B (KeyDown) -5:1238:0:85:1 //Vol command - vibrato speed: U (KeyDown) -5:1239:0:72:1 //Vol command - vibrato: H (KeyDown) -5:1240:0:76:1 //Vol command - XM pan left: L (KeyDown) -5:1241:0:82:1 //Vol command - XM pan right: R (KeyDown) -5:1242:0:71:1 //Vol command - Portamento: G (KeyDown) -5:1243:0:70:1 //Vol command - Portamento Up: F (KeyDown) -5:1244:0:69:1 //Vol command - Portamento Down: E (KeyDown) -5:1245:1:186:1 //Vol command - Velocity: Shift+; (KeyDown) -5:1246:0:79:1 //Vol command - Offset: O (KeyDown) - -//----( Pattern Context [bottom] - FX Col (6) )------------ -6:1294:0:220:1 //FX midi macro slide: \ (KeyDown) -6:1295:1:186:1 //FX pseudo-velocity (experimental): Shift+; (KeyDown) - -//----( Pattern Context [bottom] - Param Col (7) )------------ -7:1247:0:48:1 //FX Param digit 0: 0 (KeyDown) -7:1247:0:96:1 //FX Param digit 0: NUM 0 (KeyDown) -7:1248:0:49:1 //FX Param digit 1: 1 (KeyDown) -7:1248:0:97:1 //FX Param digit 1: NUM 1 (KeyDown) -7:1249:0:50:1 //FX Param digit 2: 2 (KeyDown) -7:1249:0:98:1 //FX Param digit 2: NUM 2 (KeyDown) -7:1250:0:51:1 //FX Param digit 3: 3 (KeyDown) -7:1250:0:99:1 //FX Param digit 3: NUM 3 (KeyDown) -7:1251:0:52:1 //FX Param digit 4: 4 (KeyDown) -7:1251:0:100:1 //FX Param digit 4: NUM 4 (KeyDown) -7:1252:0:53:1 //FX Param digit 5: 5 (KeyDown) -7:1252:0:101:1 //FX Param digit 5: NUM 5 (KeyDown) -7:1253:0:54:1 //FX Param digit 6: 6 (KeyDown) -7:1253:0:102:1 //FX Param digit 6: NUM 6 (KeyDown) -7:1254:0:55:1 //FX Param digit 7: 7 (KeyDown) -7:1254:0:103:1 //FX Param digit 7: NUM 7 (KeyDown) -7:1255:0:56:1 //FX Param digit 8: 8 (KeyDown) -7:1255:0:104:1 //FX Param digit 8: NUM 8 (KeyDown) -7:1256:0:57:1 //FX Param digit 9: 9 (KeyDown) -7:1256:0:105:1 //FX Param digit 9: NUM 9 (KeyDown) -7:1257:0:65:1 //FX Param digit A: A (KeyDown) -7:1258:0:66:1 //FX Param digit B: B (KeyDown) -7:1259:0:67:1 //FX Param digit C: C (KeyDown) -7:1260:0:68:1 //FX Param digit D: D (KeyDown) -7:1261:0:69:1 //FX Param digit E: E (KeyDown) -7:1262:0:70:1 //FX Param digit F: F (KeyDown) - -//----( Sample Context [bottom] (8) )------------ -8:1380:2:84:1 //Trim sample around loop points: Ctrl+T (KeyDown) -8:1383:0:8:1 //Silence sample selection: BACKSPACE (KeyDown) -8:1385:3:65:1 //Amplify Sample: Shift+Ctrl+A (KeyDown) -8:1381:3:82:1 //Reverse sample: Shift+Ctrl+R (KeyDown) -8:1382:0:46:1 //Delete sample selection: DELETE (KeyDown) -8:1386:0:107:1 //Zoom Out: NUM PLUS (KeyDown) -8:1387:0:109:1 //Zoom In: NUM SUB (KeyDown) - -//----( Instrument Context [bottom] (9) )------------ - -//----( Comments Context [bottom] (10) )------------ - -//----( Unknown Context (11) )------------ - -//----( Unknown Context (12) )------------ - -//----( Plugin GUI Context (13) )------------ - -//----( General Context [top] (14) )------------ - -//----( Pattern Context [top] (15) )------------ - -//----( Sample Context [top] (16) )------------ - -//----( Instrument Context [top] (17) )------------ - -//----( Comments Context [top] (18) )------------ - -//----( Unknown Context (19) )------------ Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-18 20:38:41 UTC (rev 332) @@ -161,12 +161,12 @@ if(csf.Instruments[i]->pTuning) continue; - csf.Instruments[i]->pTuning = csf.GetStandardTunings().GetTuning(str); + csf.Instruments[i]->pTuning = csf.GetBuiltInTunings().GetTuning(str); if(csf.Instruments[i]->pTuning) continue; - if(str == "TET12" && csf.GetStandardTunings().GetNumTunings() > 0) - csf.Instruments[i]->pTuning = &csf.GetStandardTunings().GetTuning(0); + if(str == "TET12" && csf.GetBuiltInTunings().GetNumTunings() > 0) + csf.Instruments[i]->pTuning = &csf.GetBuiltInTunings().GetTuning(0); if(csf.Instruments[i]->pTuning) continue; Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-18 20:38:41 UTC (rev 332) @@ -390,7 +390,7 @@ ////////////////////////////////////////////////////////// // CSoundFile -CTuningCollection* CSoundFile::s_pTuningsSharedStandard(0); +CTuningCollection* CSoundFile::s_pTuningsSharedBuiltIn(0); CTuningCollection* CSoundFile::s_pTuningsSharedLocal(0); uint8 CSoundFile::s_DefaultPlugVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE; @@ -2839,7 +2839,7 @@ //--------------------------------- { delete s_pTuningsSharedLocal; s_pTuningsSharedLocal = 0; - delete s_pTuningsSharedStandard; s_pTuningsSharedStandard = 0; + delete s_pTuningsSharedBuiltIn; s_pTuningsSharedBuiltIn = 0; } bool CSoundFile::SaveStaticTunings() @@ -2862,42 +2862,45 @@ bool CSoundFile::LoadStaticTunings() //----------------------------------- { - if(s_pTuningsSharedLocal || s_pTuningsSharedStandard) return true; + if(s_pTuningsSharedLocal || s_pTuningsSharedBuiltIn) return true; //For now not allowing to reload tunings(one should be careful when reloading them //since various parts may use addresses of the tuningobjects). CTuning::MessageHandler = &SimpleMessageBox; - - s_pTuningsSharedStandard = new CTuningCollection("Standard tunings"); + + s_pTuningsSharedBuiltIn = new CTuningCollection; s_pTuningsSharedLocal = new CTuningCollection("Local tunings"); - const string exeDir = CMainFrame::m_csExecutableDirectoryPath; - const string baseDirectoryName = exeDir + "tunings\\"; - string filenameBase; - string filename; - - s_pTuningsSharedStandard->SetSavefilePath(baseDirectoryName + string("standard\\std_tunings") + CTuningCollection::s_FileExtension); - s_pTuningsSharedLocal->SetSavefilePath(baseDirectoryName + string("local_tunings") + CTuningCollection::s_FileExtension); - - s_pTuningsSharedStandard->Deserialize(); - s_pTuningsSharedLocal->Deserialize(); - - //This condition should not be true. - if(s_pTuningsSharedStandard->GetNumTunings() == 0) + // Load built-in tunings. + const char* pData = nullptr; + HGLOBAL hglob = nullptr; + size_t nSize = 0; + if (LoadResource(MAKEINTRESOURCE(IDR_BUILTIN_TUNINGS), TEXT("TUNING"), pData, nSize, hglob) != nullptr) { + std::istrstream iStrm(pData, nSize); + s_pTuningsSharedBuiltIn->Deserialize(iStrm); + FreeResource(hglob); + } + if(s_pTuningsSharedBuiltIn->GetNumTunings() == 0) + { + ASSERT(false); CTuningRTI* pT = new CTuningRTI; //Note: Tuning collection class handles deleting. pT->CreateGeometric(1,1); - if(s_pTuningsSharedStandard->AddTuning(pT)) + if(s_pTuningsSharedBuiltIn->AddTuning(pT)) delete pT; } + + // Load local tunings. + s_pTuningsSharedLocal->SetSavefilePath(std::string(CMainFrame::m_csExecutableDirectoryPath + "tunings\\local_tunings" + CTuningCollection::s_FileExtension.c_str())); + s_pTuningsSharedLocal->Deserialize(); - //Enabling adding/removing of tunings for standard collection - //only for debug builds. + // Enabling adding/removing of tunings for standard collection + // only for debug builds. #ifdef DEBUG - s_pTuningsSharedStandard->SetConstStatus(CTuningCollection::EM_ALLOWALL); + s_pTuningsSharedBuiltIn->SetConstStatus(CTuningCollection::EM_ALLOWALL); #else - s_pTuningsSharedStandard->SetConstStatus(CTuningCollection::EM_CONST); + s_pTuningsSharedBuiltIn->SetConstStatus(CTuningCollection::EM_CONST); #endif MODINSTRUMENT::s_DefaultTuning = NULL; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-08-18 18:41:12 UTC (rev 331) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-08-18 20:38:41 UTC (rev 332) @@ -835,14 +835,14 @@ static bool LoadStaticTunings(); static bool SaveStaticTunings(); static void DeleteStaticdata(); - static CTuningCollection& GetStandardTunings() {return *s_pTuningsSharedStandard;} + static CTuningCollection& GetBuiltInTunings() {return *s_pTuningsSharedBuiltIn;} static CTuningCollection& GetLocalTunings() {return *s_pTuningsSharedLocal;} CTuningCollection& GetTuneSpecificTunings() {return *m_pTuningsTuneSpecific;} std::string GetNoteName(const int16&, const int inst = -1) const; private: CTuningCollection* m_pTuningsTuneSpecific; - static CTuningCollection* s_pTuningsSharedStandard; + static CTuningCollection* s_pTuningsSharedBuiltIn; static CTuningCollection* s_pTuningsSharedLocal; //<--Tuning This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rel...@us...> - 2009-08-20 16:46:20
|
Revision: 335 http://modplug.svn.sourceforge.net/modplug/?rev=335&view=rev Author: relabsoluness Date: 2009-08-20 16:46:12 +0000 (Thu, 20 Aug 2009) Log Message: ----------- [New] MIDI: Can now record MIDI mapping changes to pattern. Modified Paths: -------------- trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp trunk/OpenMPT/mptrack/MIDIMappingDialog.h trunk/OpenMPT/mptrack/Mpt_midi.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/midi.h trunk/OpenMPT/soundlib/modcommand.h Modified: trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp =================================================================== --- trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp 2009-08-19 15:20:48 UTC (rev 334) +++ trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp 2009-08-20 16:46:12 UTC (rev 335) @@ -52,6 +52,7 @@ ON_BN_CLICKED(IDC_BUTTON_REMOVE, OnBnClickedButtonRemove) ON_MESSAGE(WM_MOD_MIDIMSG, OnMidiMsg) ON_NOTIFY(UDN_DELTAPOS, IDC_SPINMOVEMAPPING, OnDeltaposSpinmovemapping) + ON_BN_CLICKED(IDC_CHECK_PATRECORD, OnBnClickedCheckPatRecord) END_MESSAGE_MAP() @@ -77,10 +78,15 @@ { CDialog::OnInitDialog(); + if (m_rMIDIMapper.GetCount() > 0) + m_Setting = m_rMIDIMapper.GetDirective(0); + m_ChannelCBox.SetCurSel(m_Setting.GetChannel()); - CheckDlgButton(IDC_CHECKACTIVE, m_Setting.IsActive() ? MF_CHECKED : MF_UNCHECKED); - CheckDlgButton(IDC_CHECKCAPTURE, m_Setting.GetCaptureMIDI() ? MF_CHECKED : MF_UNCHECKED); + CheckDlgButton(IDC_CHECKACTIVE, m_Setting.IsActive() ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(IDC_CHECKCAPTURE, m_Setting.GetCaptureMIDI() ? BST_CHECKED : BST_UNCHECKED); + GetDlgItem(IDC_CHECK_PATRECORD)->ShowWindow((m_rSndFile.GetType() == MOD_TYPE_MPT) ? SW_SHOW : SW_HIDE); + CheckDlgButton(IDC_CHECK_PATRECORD, m_Setting.GetAllowPatternEdit() ? BST_CHECKED : BST_UNCHECKED); m_EventCBox.SetCurSel(0); @@ -168,6 +174,14 @@ } +void CMIDIMappingDialog::OnBnClickedCheckPatRecord() +//-------------------------------------------------- +{ + m_Setting.SetAllowPatternEdit(IsDlgButtonChecked(IDC_CHECK_PATRECORD) == BST_CHECKED); + UpdateString(); +} + + void CMIDIMappingDialog::UpdateString() //------------------------------------- { Modified: trunk/OpenMPT/mptrack/MIDIMappingDialog.h =================================================================== --- trunk/OpenMPT/mptrack/MIDIMappingDialog.h 2009-08-19 15:20:48 UTC (rev 334) +++ trunk/OpenMPT/mptrack/MIDIMappingDialog.h 2009-08-20 16:46:12 UTC (rev 335) @@ -65,4 +65,5 @@ afx_msg void OnBnClickedButtonRemove(); afx_msg LRESULT OnMidiMsg(WPARAM, LPARAM); afx_msg void OnDeltaposSpinmovemapping(NMHDR *pNMHDR, LRESULT *pResult); + afx_msg void OnBnClickedCheckPatRecord(); }; Modified: trunk/OpenMPT/mptrack/Mpt_midi.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpt_midi.cpp 2009-08-19 15:20:48 UTC (rev 334) +++ trunk/OpenMPT/mptrack/Mpt_midi.cpp 2009-08-20 16:46:12 UTC (rev 335) @@ -192,7 +192,8 @@ uint8 temp8 = citer->IsActive(); //bit 0 if(citer->GetCaptureMIDI()) temp8 |= (1 << 1); //bit 1 //bits 2-4: Mapping type: 0 for plug param control. - //bit 5: if(citer->GetAllowPatternEdit()) temp8 |= (1 << 4); + //bit 5: + if(citer->GetAllowPatternEdit()) temp8 |= (1 << 5); //bits 6-7: Size: 5, 6, 8, 12 BYTE parambytes = 4; @@ -238,7 +239,7 @@ CMIDIMappingDirective s; s.SetActive((i8 & 1) != 0); s.SetCaptureMIDI((i8 & (1 << 1)) != 0); - s.SetAllowPatternEdit((i8 & (1 << 4)) != 0); + s.SetAllowPatternEdit((i8 & (1 << 5)) != 0); memcpy(&i16, ptr, 2); ptr += 2; //Channel, event, MIDIbyte1. memcpy(&i8, ptr, 1); ptr++; //Plugindex const BYTE remainingbytes = psize - 4; Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-08-19 15:20:48 UTC (rev 334) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-08-20 16:46:12 UTC (rev 335) @@ -3001,6 +3001,30 @@ } +ModCommandPos CViewPattern::GetEditPos(CSoundFile& rSf, const bool bLiveRecord) const +//----------------------------------------------------------------------------------- +{ + ModCommandPos editpos; + if(bLiveRecord) + SetEditPos(rSf, editpos.nRow, editpos.nPat, rSf.m_nRow, rSf.m_nPattern); + else + {editpos.nPat = m_nPattern; editpos.nRow = m_nRow;} + editpos.nChn = GetChanFromCursor(m_dwCursor); + return editpos; +} + + +MODCOMMAND* CViewPattern::GetModCommand(CSoundFile& rSf, const ModCommandPos& pos) +//-------------------------------------------------------------------------------- +{ + static MODCOMMAND m; + if (rSf.Patterns.IsValidIndex(pos.nPat) && pos.nRow < rSf.Patterns[pos.nPat].GetNumRows() && pos.nChn < rSf.GetNumChannels()) + return rSf.Patterns[pos.nPat].GetpModCommand(pos.nRow, pos.nChn); + else + return &m; +} + + LRESULT CViewPattern::OnMidiMsg(WPARAM dwMidiDataParam, LPARAM) //-------------------------------------------------------- { @@ -3043,10 +3067,25 @@ if ((event == 0x9) && !nVol) event = 0x8; //Convert event to note-off if req'd - //Try finding MIDI mapping. - BYTE mappedIndex = 0, paramValue = 0; + // Handle MIDI mapping. + uint8 mappedIndex = uint8_max, paramValue = uint8_max; uint32 paramIndex = 0; - if(pSndFile->GetMIDIMapper().OnMIDImsg(dwMidiData, mappedIndex, paramIndex, paramValue)) + const bool bCaptured = pSndFile->GetMIDIMapper().OnMIDImsg(dwMidiData, mappedIndex, paramIndex, paramValue); + + // Write parameter control commands if needed. + if (paramValue != uint8_max && IsEditingEnabled() && pSndFile->GetType() == MOD_TYPE_MPT) + { + // Note: There's no undo for these modifications. + const bool bLiveRecord = IsLiveRecord(*pModDoc, *pSndFile); + ModCommandPos editpos = GetEditPos(*pSndFile, bLiveRecord); + MODCOMMAND* p = GetModCommand(*pSndFile, editpos); + p->Set(NOTE_PCS, mappedIndex, static_cast<uint16>(paramIndex), static_cast<uint16>((paramValue * MODCOMMAND::maxColumnValue)/127)); + if(bLiveRecord == false) + InvalidateRow(editpos.nRow); + pMainFrm->ThreadSafeSetModified(pModDoc); + } + + if (bCaptured) return 0; switch(event) @@ -3079,17 +3118,13 @@ } // Checking whether to record MIDI controller change as MIDI macro change. - if((CMainFrame::m_dwMidiSetup & MIDISETUP_MIDIMACROCONTROL) && IsEditingEnabled()) + // Don't write this if command was already written by MIDI mapping. + if((paramValue == uint8_max || pSndFile->GetType() != MOD_TYPE_MPT) && IsEditingEnabled() && (CMainFrame::m_dwMidiSetup & MIDISETUP_MIDIMACROCONTROL)) { - // Note: No undo for these modifications. + // Note: There's no undo for these modifications. const bool bLiveRecord = IsLiveRecord(*pModDoc, *pSndFile); - ROWINDEX nRow = m_nRow; - PATTERNINDEX nPat = m_nPattern; - if(bLiveRecord) - SetEditPos(*pSndFile, nRow, nPat, pSndFile->m_nRow, pSndFile->m_nPattern); - - const CHANNELINDEX nChn = GetChanFromCursor(m_dwCursor); - MODCOMMAND *p = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); + ModCommandPos editpos = GetEditPos(*pSndFile, bLiveRecord); + MODCOMMAND* p = GetModCommand(*pSndFile, editpos); if(p->command == 0 || p->command == CMD_SMOOTHMIDI || p->command == CMD_MIDI) { // Write command only if there's no existing command or already a midi macro command. p->command = CMD_SMOOTHMIDI; @@ -3098,7 +3133,7 @@ // Update GUI only if not recording live. if(bLiveRecord == false) - InvalidateRow(nRow); + InvalidateRow(editpos.nRow); } } @@ -4941,20 +4976,15 @@ return chans.GetCount(); } -UINT CViewPattern::GetRowFromCursor(DWORD cursor) { -//----------------------------------------------- - return cursor >> 16; -} +ROWINDEX CViewPattern::GetRowFromCursor(DWORD cursor) {return cursor >> 16;} +//--------------------------------------------------- + +CHANNELINDEX CViewPattern::GetChanFromCursor(DWORD cursor) {return static_cast<CHANNELINDEX>((cursor & 0xFFFF) >> 3);} +//------------------------------------------------------- -UINT CViewPattern::GetChanFromCursor(DWORD cursor) { -//------------------------------------------------ - return (cursor & 0xFFFF) >> 3; -} +UINT CViewPattern::GetColTypeFromCursor(DWORD cursor) {return cursor & 0x07;} +//--------------------------------------------------- -UINT CViewPattern::GetColTypeFromCursor(DWORD cursor) { -//-------------------------------------------------- - return cursor & 0x07; -} bool CViewPattern::IsInterpolationPossible(UINT startRow, UINT endRow, UINT chan, UINT colType, CSoundFile* pSndFile) { Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2009-08-19 15:20:48 UTC (rev 334) +++ trunk/OpenMPT/mptrack/View_pat.h 2009-08-20 16:46:12 UTC (rev 335) @@ -55,7 +55,14 @@ }; const RowMask DefaultRowMask = {true, true, true, true, true}; +struct ModCommandPos +{ + PATTERNINDEX nPat; + ROWINDEX nRow; + CHANNELINDEX nChn; +}; + ////////////////////////////////////////////////////////////////// // Pattern editing class @@ -323,9 +330,9 @@ UINT GetSelectionEndChan(); UINT ListChansWhereColSelected(UINT colType, CArray<UINT,UINT> &chans); - UINT GetRowFromCursor(DWORD cursor); - UINT GetChanFromCursor(DWORD cursor); - UINT GetColTypeFromCursor(DWORD cursor); + static ROWINDEX GetRowFromCursor(DWORD cursor); + static CHANNELINDEX GetChanFromCursor(DWORD cursor); + static UINT GetColTypeFromCursor(DWORD cursor); bool IsInterpolationPossible(UINT startRow, UINT endRow, UINT chan, UINT colType, CSoundFile* pSndFile); void Interpolate(UINT type); @@ -341,6 +348,13 @@ ROWINDEX& iRow, PATTERNINDEX& iPat, const ROWINDEX iRowCandidate, const PATTERNINDEX iPatCandidate) const; + // Returns edit position. + ModCommandPos GetEditPos(CSoundFile& rSf, const bool bLiveRecord) const; + + // Returns pointer to modcommand at given position. If the position is not valid, returns pointer + // to a dummy command. + MODCOMMAND* GetModCommand(CSoundFile& rSf, const ModCommandPos& pos); + bool IsEditingEnabled() const {return ((m_dwStatus&PATSTATUS_RECORD) != 0);} //Like IsEditingEnabled(), but shows some notification when editing is not enabled. Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-08-19 15:20:48 UTC (rev 334) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-08-20 16:46:12 UTC (rev 335) @@ -2248,7 +2248,7 @@ BEGIN GROUPBOX "Current mapping",IDC_STATIC,5,5,325,105 CONTROL "Active",IDC_CHECKACTIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,20,42,10 - CONTROL "Capture",IDC_CHECKCAPTURE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,65,20,39,10 + CONTROL "Capture",IDC_CHECKCAPTURE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,67,20,39,10 LTEXT "Channel",IDC_STATIC,15,35,27,8 COMBOBOX IDC_COMBO_CHANNEL,15,45,36,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "Event",IDC_STATIC,61,35,20,8 @@ -2267,6 +2267,7 @@ CONTROL "",IDC_SPINMOVEMAPPING,"msctls_updown32",0x0,330,115,11,80 CONTROL "MIDI learn",IDC_CHECK_MIDILEARN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,335,30,47,11 DEFPUSHBUTTON "Close",IDOK,335,10,50,14 + CONTROL "Pattern record",IDC_CHECK_PATRECORD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,114,20,63,10 END IDD_TUNING DIALOGEX 0, 0, 512, 240 Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2009-08-19 15:20:48 UTC (rev 334) +++ trunk/OpenMPT/mptrack/resource.h 2009-08-20 16:46:12 UTC (rev 335) @@ -882,6 +882,7 @@ #define IDC_SPIN_ADDSILENCE 2382 #define IDC_RADIO_RESIZETO 2384 #define IDC_EDIT_MODLOADING_WARNINGS 2385 +#define IDC_CHECK_PATRECORD 2386 #define ID_FILE_NEWMOD 32771 #define ID_FILE_NEWXM 32772 #define ID_FILE_NEWS3M 32773 @@ -1123,7 +1124,7 @@ #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 521 #define _APS_NEXT_COMMAND_VALUE 59229 -#define _APS_NEXT_CONTROL_VALUE 2386 +#define _APS_NEXT_CONTROL_VALUE 2387 #define _APS_NEXT_SYMED_VALUE 901 #endif #endif Modified: trunk/OpenMPT/soundlib/midi.h =================================================================== --- trunk/OpenMPT/soundlib/midi.h 2009-08-19 15:20:48 UTC (rev 334) +++ trunk/OpenMPT/soundlib/midi.h 2009-08-20 16:46:12 UTC (rev 335) @@ -68,10 +68,10 @@ CString ToString() const { CString str; str.Preallocate(20); - char flags[3] = "00"; + char flags[4] = "000"; if(m_Active) flags[0] = '1'; if(m_CaptureMIDI) flags[1] = '1'; - //if(m_AllowPatternEdit) flags[2] = '1'; + if(m_AllowPatternEdit) flags[2] = '1'; str.Format("%s:%d:%x:%d:%d:%d", flags, (int)GetChannel(), (int)GetEvent(), (int)GetController(), (int)m_PluginIndex, m_Parameter); str.Trim(); return str; Modified: trunk/OpenMPT/soundlib/modcommand.h =================================================================== --- trunk/OpenMPT/soundlib/modcommand.h 2009-08-19 15:20:48 UTC (rev 334) +++ trunk/OpenMPT/soundlib/modcommand.h 2009-08-20 16:46:12 UTC (rev 335) @@ -31,6 +31,8 @@ return !(*this == mc); } + void Set(NOTE n, INSTR ins, uint16 volcol, uint16 effectcol) {note = n; instr = ins; SetValueVolCol(volcol); SetValueEffectCol(effectcol);} + uint16 GetValueVolCol() const {return GetValueVolCol(volcmd, vol);} static uint16 GetValueVolCol(BYTE volcmd, BYTE vol) {return (volcmd << 8) + vol;} void SetValueVolCol(const uint16 val) {volcmd = static_cast<BYTE>(val >> 8); vol = static_cast<BYTE>(val & 0xFF);} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |