You can subscribe to this list here.
| 2006 |
Jan
|
Feb
|
Mar
(1) |
Apr
(1) |
May
|
Jun
(1) |
Jul
|
Aug
(10) |
Sep
|
Oct
|
Nov
|
Dec
(3) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2007 |
Jan
(1) |
Feb
(2) |
Mar
(3) |
Apr
(2) |
May
(10) |
Jun
(2) |
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
(3) |
Dec
|
| 2008 |
Jan
(6) |
Feb
(4) |
Mar
(5) |
Apr
(2) |
May
(1) |
Jun
(1) |
Jul
(4) |
Aug
(6) |
Sep
(2) |
Oct
(9) |
Nov
(1) |
Dec
(4) |
| 2009 |
Jan
(9) |
Feb
(2) |
Mar
(2) |
Apr
(2) |
May
(6) |
Jun
(18) |
Jul
(33) |
Aug
(39) |
Sep
(33) |
Oct
(24) |
Nov
(23) |
Dec
(22) |
| 2010 |
Jan
(29) |
Feb
(32) |
Mar
(51) |
Apr
(17) |
May
(31) |
Jun
(21) |
Jul
(32) |
Aug
(28) |
Sep
(35) |
Oct
(27) |
Nov
(11) |
Dec
(13) |
| 2011 |
Jan
(14) |
Feb
(13) |
Mar
(27) |
Apr
(27) |
May
(28) |
Jun
(20) |
Jul
(43) |
Aug
(52) |
Sep
(66) |
Oct
(61) |
Nov
(11) |
Dec
(8) |
| 2012 |
Jan
(20) |
Feb
(30) |
Mar
(38) |
Apr
(21) |
May
(33) |
Jun
(21) |
Jul
(25) |
Aug
(9) |
Sep
(24) |
Oct
(42) |
Nov
(27) |
Dec
(41) |
| 2013 |
Jan
(20) |
Feb
(35) |
Mar
(156) |
Apr
(298) |
May
(258) |
Jun
(201) |
Jul
(105) |
Aug
(60) |
Sep
(193) |
Oct
(245) |
Nov
(280) |
Dec
(194) |
| 2014 |
Jan
(63) |
Feb
(202) |
Mar
(200) |
Apr
(23) |
May
(53) |
Jun
(105) |
Jul
(18) |
Aug
(26) |
Sep
(110) |
Oct
(187) |
Nov
(97) |
Dec
(74) |
| 2015 |
Jan
(45) |
Feb
(55) |
Mar
(116) |
Apr
(116) |
May
(193) |
Jun
(164) |
Jul
(50) |
Aug
(111) |
Sep
(98) |
Oct
(71) |
Nov
(103) |
Dec
(63) |
| 2016 |
Jan
(33) |
Feb
(101) |
Mar
(182) |
Apr
(139) |
May
(140) |
Jun
(103) |
Jul
(165) |
Aug
(286) |
Sep
(208) |
Oct
(127) |
Nov
(97) |
Dec
(54) |
| 2017 |
Jan
(64) |
Feb
(335) |
Mar
(202) |
Apr
(212) |
May
(139) |
Jun
(127) |
Jul
(294) |
Aug
(154) |
Sep
(170) |
Oct
(152) |
Nov
(156) |
Dec
(62) |
| 2018 |
Jan
(168) |
Feb
(237) |
Mar
(196) |
Apr
(174) |
May
(174) |
Jun
(161) |
Jul
(127) |
Aug
(88) |
Sep
(149) |
Oct
(66) |
Nov
(52) |
Dec
(135) |
| 2019 |
Jan
(146) |
Feb
(126) |
Mar
(104) |
Apr
(58) |
May
(60) |
Jun
(28) |
Jul
(197) |
Aug
(129) |
Sep
(141) |
Oct
(148) |
Nov
(63) |
Dec
(100) |
| 2020 |
Jan
(74) |
Feb
(37) |
Mar
(59) |
Apr
(154) |
May
(194) |
Jun
(133) |
Jul
(313) |
Aug
(197) |
Sep
(49) |
Oct
(162) |
Nov
(143) |
Dec
(57) |
| 2021 |
Jan
(120) |
Feb
(107) |
Mar
(314) |
Apr
(157) |
May
(524) |
Jun
(169) |
Jul
(72) |
Aug
(133) |
Sep
(135) |
Oct
(146) |
Nov
(198) |
Dec
(325) |
| 2022 |
Jan
(409) |
Feb
(249) |
Mar
(138) |
Apr
(95) |
May
(102) |
Jun
(221) |
Jul
(66) |
Aug
(120) |
Sep
(192) |
Oct
(131) |
Nov
(53) |
Dec
(171) |
| 2023 |
Jan
(357) |
Feb
(82) |
Mar
(168) |
Apr
(218) |
May
(196) |
Jun
(86) |
Jul
(115) |
Aug
(49) |
Sep
(190) |
Oct
(102) |
Nov
(45) |
Dec
(76) |
| 2024 |
Jan
(86) |
Feb
(50) |
Mar
(324) |
Apr
(209) |
May
(197) |
Jun
(232) |
Jul
(194) |
Aug
(247) |
Sep
(219) |
Oct
(266) |
Nov
(328) |
Dec
(304) |
| 2025 |
Jan
(191) |
Feb
(115) |
Mar
(137) |
Apr
(32) |
May
(126) |
Jun
(403) |
Jul
(213) |
Aug
(203) |
Sep
(148) |
Oct
(109) |
Nov
(191) |
Dec
(209) |
| 2026 |
Jan
(127) |
Feb
(123) |
Mar
(160) |
Apr
(141) |
May
(45) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
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: <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 15:09:38
|
Revision: 324
http://modplug.svn.sourceforge.net/modplug/?rev=324&view=rev
Author: saga-games
Date: 2009-08-15 15:09:25 +0000 (Sat, 15 Aug 2009)
Log Message:
-----------
[Imp] Mod Conversion: Tentative conversion of Param Control effects. The conversion is obviously not lossless.
[Fix] Pattern Editor: Apply Instrument to all notes won't affect Param Control and Note Fade.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-15 12:36:22 UTC (rev 323)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-15 15:09:25 UTC (rev 324)
@@ -186,8 +186,21 @@
m->param = min(m->param << 1, 0xFF);
}
}
- }
+ } // End if(m->command == CMD_PANNING8)
+ //////////////////////////
+ // Convert param control
+ if(oldTypeIsMPT)
+ {
+ if(m->note == NOTE_PC || m->note == NOTE_PCS)
+ {
+ m->param = min(MODCOMMAND::maxColumnValue, m->GetValueEffectCol()) * 0x7F / MODCOMMAND::maxColumnValue;
+ m->command = (m->note == NOTE_PC) ? CMD_MIDI : CMD_SMOOTHMIDI;
+ m->volcmd = VOLCMD_NONE;
+ m->note = NOTE_NONE;
+ }
+ } // End if(oldTypeIsMPT)
+
/////////////////////////////////////////
// Convert MOD / XM to S3M / IT / MPTM
if(oldTypeIsMOD_XM && newTypeIsS3M_IT_MPT)
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-08-15 12:36:22 UTC (rev 323)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-08-15 15:09:25 UTC (rev 324)
@@ -2486,7 +2486,7 @@
p = pSndFile->Patterns[m_nPattern] + r * pSndFile->m_nChannels + c;
// If a note or an instr is present on the row, do the change, if required.
// Do not set instr if note and instr are both blank.
- if ( ((p->note > 0 && p->note < NOTE_NOTECUT) ||p->instr) && (p->instr!=nIns) ) {
+ if ( ((p->note > 0 && p->note < NOTE_MIN_SPECIAL) ||p->instr) && (p->instr!=nIns) ) {
p->instr = nIns;
bModified = TRUE;
}
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-14 09:57:44
|
Revision: 322
http://modplug.svn.sourceforge.net/modplug/?rev=322&view=rev
Author: saga-games
Date: 2009-08-14 09:57:35 +0000 (Fri, 14 Aug 2009)
Log Message:
-----------
[Fix] XM Loading: Don't ignore last pattern if XM has no instruments
[Fix] IT Loading: Don't set "made with modplug" flag for IT files that were made with compatibility export
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-13 22:23:15 UTC (rev 321)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-14 09:57:35 UTC (rev 322)
@@ -984,10 +984,10 @@
}
}
- if((pifh->cwtv & 0xF000) == 0x5000) // OpenMPT Version number (Major.Minor)
+ if((pifh->cwtv & 0xF000) == 0x5000) // OpenMPT Version number (Major.Minor) - we won't interpret this as "made with modplug" as this is used by compatibility export
{
m_dwLastSavedWithVersion = (pifh->cwtv & 0x0FFF) << 16;
- interpretModplugmade = true;
+ //interpretModplugmade = true;
}
if (pifh->flags & 0x08) m_dwSongFlags |= SONG_LINEARSLIDES;
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-08-13 22:23:15 UTC (rev 321)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-08-14 09:57:35 UTC (rev 322)
@@ -188,7 +188,7 @@
packsize = LittleEndianW(*((WORD *)(lpStream+dwMemPos+7)));
if (dwMemPos + dwSize + 4 > dwMemLength) return true;
dwMemPos += dwSize;
- if (dwMemPos + packsize + 4 > dwMemLength) return true;
+ if (dwMemPos + packsize > dwMemLength) return true;
MODCOMMAND *p;
if (ipatmap < MAX_PATTERNS)
{
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: <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-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-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-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-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-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-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: <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-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: <sag...@us...> - 2009-07-31 13:09:34
|
Revision: 311
http://modplug.svn.sourceforge.net/modplug/?rev=311&view=rev
Author: saga-games
Date: 2009-07-31 12:56:26 +0000 (Fri, 31 Jul 2009)
Log Message:
-----------
[Fix] Retrig: A compatiblity change theoretically broke non-compatible Retrigger
[Imp] IT Compatibility: Improved IT compatible retrigger (didn't work if the retrigger didn't start together with a new note)
[Imp] IT Loader: Can now load IT files with very small patterns (< 4 rows)
[Imp] Mod Specifications: Decreased minimum pattern size for XM and IT format to 1 row. Experimental, but should not break anything (needs more testing).
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/mod_specifications.h
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-07-29 22:18:17 UTC (rev 310)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-07-31 12:56:26 UTC (rev 311)
@@ -928,7 +928,7 @@
bool interpretModplugmade = false;
bool hasModplugExtensions = false;
- if ((!lpStream) || (dwMemLength < 0x100)) return FALSE;
+ 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;
if (dwMemPos + pifh->ordnum + pifh->insnum*4
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-29 22:18:17 UTC (rev 310)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-31 12:56:26 UTC (rev 311)
@@ -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(!GetModFlag(MSF_COMPATIBLE_PLAY) || !(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)))
{
//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;
@@ -3018,7 +3018,7 @@
{
pChn->nRetrigCount = param & 0xf;
}
- else if (!--pChn->nRetrigCount)
+ else if (!pChn->nRetrigCount || !--pChn->nRetrigCount)
{
pChn->nRetrigCount = param & 0xf;
bDoRetrig = TRUE;
Modified: trunk/OpenMPT/soundlib/mod_specifications.h
===================================================================
--- trunk/OpenMPT/soundlib/mod_specifications.h 2009-07-29 22:18:17 UTC (rev 310)
+++ trunk/OpenMPT/soundlib/mod_specifications.h 2009-07-31 12:56:26 UTC (rev 311)
@@ -57,7 +57,7 @@
127, //Channel max
32, //Min tempo
512, //Max tempo
- 4, //Min pattern rows
+ 1, //Min pattern rows
1024, //Max pattern rows
25, //Max mod name length
4000, //SamplesMax
@@ -136,7 +136,7 @@
32, //Channel max
32, //Min tempo
255, //Max tempo
- 4, //Min pattern rows
+ 1, //Min pattern rows
256, //Max pattern rows
20, //Max mod name length
31, //SamplesMax
@@ -162,7 +162,7 @@
127, //Channel max
32, //Min tempo
512, //Max tempo
- 4, //Min pattern rows
+ 1, //Min pattern rows
1024, //Max pattern rows
20, //Max mod name length
4000, //SamplesMax
@@ -238,7 +238,7 @@
64, //Channel max
32, //Min tempo
255, //Max tempo
- 4, //Min pattern rows
+ 1, //Min pattern rows
256, //Max pattern rows
25, //Max mod name length
256, //SamplesMax
@@ -263,7 +263,7 @@
127, //Channel max
32, //Min tempo
512, //Max tempo
- 4, //Min pattern rows
+ 1, //Min pattern rows
1024, //Max pattern rows
25, //Max mod name length
4000, //SamplesMax
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-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-28 13:35:10
|
Revision: 308
http://modplug.svn.sourceforge.net/modplug/?rev=308&view=rev
Author: saga-games
Date: 2009-07-28 13:34:18 +0000 (Tue, 28 Jul 2009)
Log Message:
-----------
[Fix] S3M Saving: Patterns are now saved correctly. Previously, the last few rows might have come up as garbage in ST3, especially (only?) when they were empty.
[Imp] S3M Saving: Using an own version number in the header now, just like all the other trackers.
[Fix] IT Compatibility: Pattern loop count won't be reset on pattern transition (fixes gm-trippy01.it)
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_s3m.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-27 21:02:38 UTC (rev 307)
+++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-28 13:34:18 UTC (rev 308)
@@ -12,6 +12,9 @@
#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"
@@ -509,8 +512,13 @@
header[0x25] = nbp >> 8;
if (m_dwSongFlags & SONG_FASTVOLSLIDES) header[0x26] |= 0x40;
if ((m_nMaxPeriod < 20000) || (m_dwSongFlags & SONG_AMIGALIMITS)) header[0x26] |= 0x10;
- header[0x28] = 0x20;
- header[0x29] = 0x13;
+
+ // 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
+ 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[0x2A] = 0x02; // Version = 1 => Signed samples
header[0x2B] = 0x00;
header[0x2C] = 'S';
@@ -558,11 +566,11 @@
ofs1 = ftell(f);
fwrite(insex, nbi, 0x50, f);
// Packing patterns
- ofs += nbi*0x50;
- for (i=0; i<nbp; i++)
+ ofs += nbi * 0x50;
+ for (i = 0; i < nbp; i++)
{
WORD len = 64;
- vector<BYTE> buffer(5*1024, 0);
+ vector<BYTE> buffer(5 * 1024, 0);
patptr[i] = ofs / 16;
if (Patterns[i])
{
@@ -581,16 +589,18 @@
UINT param = m->param;
if ((note) || (m->instr)) b |= 0x20;
- if (!note) note = 0xFF; else
- if (note >= 0xFE) note = 0xFE; else
- if (note < 13) note = 0; else note -= 13;
+
+ if (!note) note = 0xFF; // no note
+ else if (note >= NOTE_MIN_SPECIAL) note = 0xFE; // special notes (notecut, noteoff etc)
+ else if (note < 13) note = 0; // too low
+ else note -= 13;
+
if (note < 0xFE) note = (note % 12) + ((note / 12) << 4);
if (command == CMD_VOLUME)
{
command = 0;
- if (param > 64) param = 64;
volcmd = VOLCMD_VOLUME;
- vol = param;
+ vol = min(param, 64);
}
if (volcmd == VOLCMD_VOLUME) b |= 0x40; else
if (volcmd == VOLCMD_PANNING) { vol |= 0x80; b |= 0x40; }
@@ -629,9 +639,9 @@
}
}
}
- buffer[0] = (len - 2) & 0xFF;
- buffer[1] = (len - 2) >> 8;
- len = (len+15) & (~0x0F);
+ buffer[0] = (len) & 0xFF;
+ buffer[1] = (len) >> 8;
+ len = (len + 15) & (~0x0F);
fwrite(&buffer[0], len, 1, f);
ofs += len;
}
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-27 21:02:38 UTC (rev 307)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-28 13:34:18 UTC (rev 308)
@@ -1568,7 +1568,7 @@
}
if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)))
{
- //IT compatibility 15. Retrigger
+ // IT compatibility 15. Retrigger
if (param)
pChn->nRetrigParam = (BYTE)(param & 0xFF);
@@ -1581,7 +1581,7 @@
}
else
{
- //MPT Retrig
+ // XM Retrig
if (param) pChn->nRetrigParam = (BYTE)(param & 0xFF); else param = pChn->nRetrigParam;
//rewbs.volOffset
//RetrigNote(nChn, param);
@@ -1875,7 +1875,7 @@
//end rewbs.fix
&& ((nPosJump != (int)m_nCurrentPattern) || (nBreakRow != (int)m_nRow)))
{
- if (nPosJump != (int)m_nCurrentPattern)
+ if (nPosJump != (int)m_nCurrentPattern && !((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)))
{
for (UINT i=0; i<m_nChannels; i++) Chn[i].nPatternLoopCount = 0;
}
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-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-26 23:50:27
|
Revision: 305
http://modplug.svn.sourceforge.net/modplug/?rev=305&view=rev
Author: saga-games
Date: 2009-07-26 23:50:13 +0000 (Sun, 26 Jul 2009)
Log Message:
-----------
[Imp] Mod Compatibility: Moved loop length check from compatibility export to normal save, as it does not break/change any MPT-made MOD file.
[Fix] Mod Specifications: Accidentally changed a wrong value in revision 304
[Fix] IT Compatibility: Unbreaking compatible retrigger (line was missing)
Revision Links:
--------------
http://modplug.svn.sourceforge.net/modplug/?rev=304&view=rev
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_mod.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/mod_specifications.h
Modified: trunk/OpenMPT/soundlib/Load_mod.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mod.cpp 2009-07-26 21:59:23 UTC (rev 304)
+++ trunk/OpenMPT/soundlib/Load_mod.cpp 2009-07-26 23:50:13 UTC (rev 305)
@@ -419,7 +419,7 @@
bTab[26] = pins->nLoopStart >> 9;
bTab[27] = pins->nLoopStart >> 1;
UINT replen = pins->nLoopEnd - pins->nLoopStart;
- if(bCompatibilityExport && replen < 2) // ensure PT will load it properly
+ if(replen < 2) // ensure PT will load it properly
replen = 2;
bTab[28] = replen >> 9;
bTab[29] = replen >> 1;
@@ -504,7 +504,7 @@
for (UINT ismpd=1; ismpd<=31; ismpd++) if (inslen[ismpd])
{
MODINSTRUMENT *pins = &Ins[insmap[ismpd]];
- if(bCompatibilityExport == true)
+ if(bCompatibilityExport == true) // first two bytes have to be 0 due to PT's one-shot loop ("no loop")
{
if(pins->nLength > 0) pins->pSample[0] = 0;
if(pins->nLength > 1) pins->pSample[1] = 0;
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-26 21:59:23 UTC (rev 304)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-26 23:50:13 UTC (rev 305)
@@ -1569,6 +1569,9 @@
if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)))
{
//IT compatibility 15. Retrigger
+ if (param)
+ pChn->nRetrigParam = (BYTE)(param & 0xFF);
+
if (volcmd == VOLCMD_OFFSET)
RetrigNote(nChn, pChn->nRetrigParam, vol << 3);
else if (volcmd == VOLCMD_VELOCITY)
Modified: trunk/OpenMPT/soundlib/mod_specifications.h
===================================================================
--- trunk/OpenMPT/soundlib/mod_specifications.h 2009-07-26 21:59:23 UTC (rev 304)
+++ trunk/OpenMPT/soundlib/mod_specifications.h 2009-07-26 23:50:13 UTC (rev 305)
@@ -157,7 +157,7 @@
false, //No notecut.
true, //Has noteoff.
240, //Pattern max.
- 255, //Order max.
+ 256, //Order max.
4, //Channel min
127, //Channel max
32, //Min tempo
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
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-25 15:39:29
|
Revision: 303
http://modplug.svn.sourceforge.net/modplug/?rev=303&view=rev
Author: saga-games
Date: 2009-07-25 15:39:19 +0000 (Sat, 25 Jul 2009)
Log Message:
-----------
[Imp] General tab: "Modtype" dialog will revert mod flags to previous values if user presses the Cancel button
[Imp] Sample tab: It is now possible to resize samples to a given sample size. You can do this using the already existing "add silence" dialog.
[Fix] S3M loader: Samples with very short loops (2 bytes) will now load correctly. This fixes for example 94hitmix.s3m and spectral.s3m. After using this patch for a long time, it seems to not break anything else.
Modified Paths:
--------------
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/resource.h
trunk/OpenMPT/soundlib/Load_s3m.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/modsmp_ctrl.cpp
trunk/OpenMPT/soundlib/modsmp_ctrl.h
Modified: trunk/OpenMPT/mptrack/View_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_smp.cpp 2009-07-25 13:27:30 UTC (rev 302)
+++ trunk/OpenMPT/mptrack/View_smp.cpp 2009-07-25 15:39:19 UTC (rev 303)
@@ -2415,14 +2415,14 @@
void CViewSample::OnAddSilence()
//------------------------------
{
- CAddSilenceDlg dlg(this);
- if (dlg.DoModal() != IDOK) return;
-
CModDoc *pModDoc = GetDocument();
if (!pModDoc) return;
CSoundFile *pSndFile = pModDoc->GetSoundFile();
if (!pSndFile) return;
+ CAddSilenceDlg dlg(this, 32, pSndFile->Ins[m_nSample].nLength);
+ if (dlg.DoModal() != IDOK) return;
+
const ctrlSmp::SmpLength nOldLength = pSndFile->Ins[m_nSample].nLength;
if( MAX_SAMPLE_LENGTH - nOldLength < dlg.m_nSamples )
@@ -2432,7 +2432,16 @@
return;
}
- ctrlSmp::InsertSilence(pSndFile->Ins[m_nSample], dlg.m_nSamples, (dlg.m_bAddAtEnd) ? pSndFile->Ins[m_nSample].nLength : 0, pSndFile);
+ if(dlg.m_nEditOption == 3)
+ {
+ // resize
+ ctrlSmp::ResizeSample(pSndFile->Ins[m_nSample], dlg.m_nSamples, pSndFile);
+ }
+ else
+ {
+ // add silence
+ ctrlSmp::InsertSilence(pSndFile->Ins[m_nSample], dlg.m_nSamples, (dlg.m_nEditOption == 2) ? pSndFile->Ins[m_nSample].nLength : 0, pSndFile);
+ }
if(nOldLength != pSndFile->Ins[m_nSample].nLength)
{
Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-25 13:27:30 UTC (rev 302)
+++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-25 15:39:19 UTC (rev 303)
@@ -138,6 +138,7 @@
CDialog::OnInitDialog();
m_nType = m_pSndFile->m_nType;
m_nChannels = m_pSndFile->m_nChannels;
+ m_dwSongFlags = m_pSndFile->m_dwSongFlags;
SetDlgItemInt(IDC_ROWSPERBEAT, m_pSndFile->m_nRowsPerBeat);
SetDlgItemInt(IDC_ROWSPERMEASURE, m_pSndFile->m_nRowsPerMeasure);
@@ -489,7 +490,15 @@
CDialog::OnOK();
}
+void CModTypeDlg::OnCancel()
+//--------------------------
+{
+ // Reset mod flags
+ m_pSndFile->m_dwSongFlags = m_dwSongFlags;
+ CDialog::OnCancel();
+}
+
//////////////////////////////////////////////////////////////////////////////
// CShowLogDlg
@@ -1568,19 +1577,45 @@
// Add silence to a sample
+BEGIN_MESSAGE_MAP(CAddSilenceDlg, CDialog)
+ ON_COMMAND(IDC_RADIO_ADDSILENCE_BEGIN, OnEditModeChanged)
+ ON_COMMAND(IDC_RADIO_ADDSILENCE_END, OnEditModeChanged)
+ ON_COMMAND(IDC_RADIO_RESIZETO, OnEditModeChanged)
+END_MESSAGE_MAP()
+
+
BOOL CAddSilenceDlg::OnInitDialog()
//---------------------------------
{
CDialog::OnInitDialog();
- CSpinButtonCtrl *spin = (CSpinButtonCtrl *)GetDlgItem(IDC_SPIN1);
+
+ CSpinButtonCtrl *spin = (CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_ADDSILENCE);
if (spin)
{
spin->SetRange(0, int16_max);
spin->SetPos(m_nSamples);
}
- CButton *radio2 = (CButton *)GetDlgItem(IDC_RADIO2);
- radio2->SetCheck(m_bAddAtEnd);
- SetDlgItemInt(IDC_EDIT1, m_nSamples);
+
+ int iRadioButton;
+ switch(m_nEditOption)
+ {
+ case 1:
+ iRadioButton = IDC_RADIO_ADDSILENCE_BEGIN;
+ break;
+ case 2:
+ default:
+ iRadioButton = IDC_RADIO_ADDSILENCE_END;
+ break;
+ case 3:
+ iRadioButton = IDC_RADIO_RESIZETO;
+ break;
+
+ }
+ CButton *radioEnd = (CButton *)GetDlgItem(iRadioButton);
+ radioEnd->SetCheck(true);
+
+ SetDlgItemInt(IDC_EDIT_ADDSILENCE, (m_nEditOption == 3) ? m_nLength : m_nSamples);
+
return TRUE;
}
@@ -1588,12 +1623,39 @@
void CAddSilenceDlg::OnOK()
//-------------------------
{
- m_nSamples = GetDlgItemInt(IDC_EDIT1);
- m_bAddAtEnd = (IsDlgButtonChecked(IDC_RADIO2) != 0);
+ m_nSamples = GetDlgItemInt(IDC_EDIT_ADDSILENCE);
+ m_nEditOption = GetEditMode();
CDialog::OnOK();
}
+void CAddSilenceDlg::OnEditModeChanged()
+//------------------------------------------------
+{
+ char cNewEditOption = GetEditMode();
+ if(cNewEditOption != 3 && m_nEditOption == 3)
+ {
+ m_nLength = GetDlgItemInt(IDC_EDIT_ADDSILENCE);
+ SetDlgItemInt(IDC_EDIT_ADDSILENCE, m_nSamples);
+ }
+ else if(cNewEditOption == 3 && m_nEditOption != 3)
+ {
+ m_nSamples = GetDlgItemInt(IDC_EDIT_ADDSILENCE);
+ SetDlgItemInt(IDC_EDIT_ADDSILENCE, m_nLength);
+ }
+ m_nEditOption = cNewEditOption;
+}
+
+
+char CAddSilenceDlg::GetEditMode()
+{
+ if(IsDlgButtonChecked(IDC_RADIO_ADDSILENCE_BEGIN)) return 1;
+ else if(IsDlgButtonChecked(IDC_RADIO_ADDSILENCE_END)) return 2;
+ else if(IsDlgButtonChecked(IDC_RADIO_RESIZETO)) return 3;
+ return 0;
+}
+
+
////////////////////////////////////////////////////////////////////////////////
// Sound Bank Information
Modified: trunk/OpenMPT/mptrack/dlg_misc.h
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.h 2009-07-25 13:27:30 UTC (rev 302)
+++ trunk/OpenMPT/mptrack/dlg_misc.h 2009-07-25 15:39:19 UTC (rev 303)
@@ -15,6 +15,7 @@
CEdit m_EditFlag;
CSoundFile *m_pSndFile;
UINT m_nChannels, m_nType;
+ DWORD m_dwSongFlags;
// -> CODE#0023
// -> DESC="IT project files (.itp)"
@@ -36,6 +37,7 @@
virtual void DoDataExchange(CDataExchange* pDX);
virtual BOOL OnInitDialog();
virtual void OnOK();
+ virtual void OnCancel();
//}}AFX_VIRTUAL
//{{AFX_MSG(CModTypeDlg)
@@ -346,12 +348,18 @@
class CAddSilenceDlg: public CDialog
//===========================
{
+protected:
+ char GetEditMode();
+ afx_msg void OnEditModeChanged();
+ DECLARE_MESSAGE_MAP()
+
public:
UINT m_nSamples;
- bool m_bAddAtEnd;
+ UINT m_nLength;
+ char m_nEditOption; //0 = add at beginning, 1 = add at end, 2 = resize
public:
- CAddSilenceDlg(CWnd *parent, UINT nSamples=32):CDialog(IDD_ADDSILENCE, parent) { m_nSamples = nSamples; m_bAddAtEnd = true; }
+ CAddSilenceDlg(CWnd *parent, UINT nSamples = 32, UINT nOrigLength = 1024):CDialog(IDD_ADDSILENCE, parent) { m_nSamples = nSamples; m_nLength = nOrigLength; m_nEditOption = 2; }
virtual BOOL OnInitDialog();
virtual void OnOK();
};
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2009-07-25 13:27:30 UTC (rev 302)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2009-07-25 15:39:19 UTC (rev 303)
@@ -1482,19 +1482,21 @@
LTEXT "around current",IDC_STATIC,156,84,49,8
END
-IDD_ADDSILENCE DIALOGEX 0, 0, 175, 71
+IDD_ADDSILENCE DIALOGEX 0, 0, 184, 82
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Insert Silence"
+CAPTION "Add Silence / Resize"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
- GROUPBOX "",IDC_STATIC,6,6,108,60
- DEFPUSHBUTTON "OK",IDOK,120,12,50,14
- PUSHBUTTON "Cancel",IDCANCEL,120,30,50,14
- EDITTEXT IDC_EDIT1,12,18,40,14,ES_AUTOHSCROLL | ES_NUMBER
- CONTROL "",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,44,18,11,14
- LTEXT "samples",IDC_STATIC,59,21,35,8
- CONTROL "At beginning of sample",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,12,36,97,10
- CONTROL "At end of sample",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,48,97,10
+ GROUPBOX "",IDC_STATIC,6,6,114,72
+ DEFPUSHBUTTON "OK",IDOK,126,12,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,126,30,50,14
+ EDITTEXT IDC_EDIT_ADDSILENCE,12,18,60,14,ES_AUTOHSCROLL | ES_NUMBER
+ 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
END
IDD_PATTERNRANDOMIZER_EFFECT DIALOGEX 0, 0, 235, 172
@@ -1790,9 +1792,9 @@
IDD_ADDSILENCE, DIALOG
BEGIN
LEFTMARGIN, 7
- RIGHTMARGIN, 168
+ RIGHTMARGIN, 177
TOPMARGIN, 7
- BOTTOMMARGIN, 64
+ BOTTOMMARGIN, 75
END
IDD_PATTERNRANDOMIZER_EFFECT, DIALOG
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-07-25 13:27:30 UTC (rev 302)
+++ trunk/OpenMPT/mptrack/resource.h 2009-07-25 15:39:19 UTC (rev 303)
@@ -869,6 +869,12 @@
#define IDC_EDIT_SAVEDWITH 2375
#define IDC_FRAME_MODFLAGS 2376
#define IDC_FRAME_MODTYPE 2377
+#define IDC_EDIT_ADDSILENCE 2378
+#define IDC_EDIT_RESIZESAMPLE 2379
+#define IDC_RADIO_ADDSILENCE_BEGIN 2380
+#define IDC_RADIO_ADDSILENCE_END 2381
+#define IDC_SPIN_ADDSILENCE 2382
+#define IDC_RADIO_RESIZETO 2384
#define ID_FILE_NEWMOD 32771
#define ID_FILE_NEWXM 32772
#define ID_FILE_NEWS3M 32773
@@ -1108,7 +1114,7 @@
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 518
#define _APS_NEXT_COMMAND_VALUE 59227
-#define _APS_NEXT_CONTROL_VALUE 2378
+#define _APS_NEXT_CONTROL_VALUE 2385
#define _APS_NEXT_SYMED_VALUE 901
#endif
#endif
Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-25 13:27:30 UTC (rev 302)
+++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-07-25 15:39:19 UTC (rev 303)
@@ -370,9 +370,8 @@
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;
- if(iLooplength > 0 && iLooplength < 8) Ins[iSmp].nLoopEnd = Ins[iSmp].nLoopStart + 8;
Ins[iSmp].nPan = 0x80;
- // ASSERT(iLooplength == 0 || iLooplength > 10);
+ //ASSERT(iLooplength == 0 || iLooplength > 4);
}
}
// Reading patterns
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-25 13:27:30 UTC (rev 302)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-25 15:39:19 UTC (rev 303)
@@ -650,7 +650,7 @@
if (pins->pSample)
{
if (pins->nLoopEnd > pins->nLength) pins->nLoopEnd = pins->nLength;
- if (pins->nLoopStart + 3 >= pins->nLoopEnd)
+ if (pins->nLoopStart >= pins->nLoopEnd)
{
pins->nLoopStart = 0;
pins->nLoopEnd = 0;
@@ -2447,7 +2447,7 @@
{
if ((!pIns->pSample) || (!pIns->nLength)) return;
if (pIns->nLoopEnd > pIns->nLength) pIns->nLoopEnd = pIns->nLength;
- if (pIns->nLoopStart+2 >= pIns->nLoopEnd)
+ if (pIns->nLoopStart >= pIns->nLoopEnd)
{
pIns->nLoopStart = pIns->nLoopEnd = 0;
pIns->uFlags &= ~CHN_LOOP;
Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp
===================================================================
--- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-07-25 13:27:30 UTC (rev 302)
+++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-07-25 15:39:19 UTC (rev 303)
@@ -23,7 +23,7 @@
}
-SmpLength InsertSilence(MODINSTRUMENT& smp, const SmpLength nSilenceLength, const SmpLength nStartFrom, CSoundFile* pSndFile)
+SmpLength InsertSilence(MODINSTRUMENT& smp, const SmpLength nSilenceLength, const SmpLength nStartFrom, CSoundFile* pSndFile)
//----------------------------------------------------------------------------------------------------------------------------
{
if(nSilenceLength == 0 || nSilenceLength >= MAX_SAMPLE_LENGTH || smp.nLength > MAX_SAMPLE_LENGTH - nSilenceLength)
@@ -66,6 +66,49 @@
return smp.nLength;
}
+SmpLength ResizeSample(MODINSTRUMENT& smp, const SmpLength nNewLength, CSoundFile* pSndFile)
+//----------------------------------------------------------------------------------------
+{
+ // Invalid sample size
+ if(nNewLength > MAX_SAMPLE_LENGTH || nNewLength == smp.nLength)
+ return smp.nLength;
+
+ // New sample will be bigger so we'll just use "InsertSilence" as it's already there.
+ if(nNewLength > smp.nLength)
+ return InsertSilence(smp, nNewLength - smp.nLength, smp.nLength, pSndFile);
+
+ // Else: Shrink sample
+
+ const SmpLength nNewSmpBytes = nNewLength * smp.GetElementarySampleSize() * smp.GetNumChannels();
+
+ LPSTR pNewSmp = 0;
+ pNewSmp = CSoundFile::AllocateSample(nNewSmpBytes);
+ if(pNewSmp == 0)
+ return smp.nLength; //Sample allocation failed.
+
+ // Copy over old data and replace sample by the new one
+ memcpy(pNewSmp, smp.pSample, nNewSmpBytes);
+ ReplaceSample(smp, pNewSmp, nNewLength);
+
+ // Adjust loops
+ if(smp.nLoopStart > nNewLength)
+ {
+ smp.nLoopStart = smp.nLoopEnd = 0;
+ smp.uFlags &= ~CHN_LOOP;
+ }
+ if(smp.nLoopEnd > nNewLength) smp.nLoopEnd = nNewLength;
+ if(smp.nSustainStart > nNewLength)
+ {
+ smp.nSustainStart = smp.nSustainEnd = 0;
+ smp.uFlags &= ~CHN_SUSTAINLOOP;
+ }
+ if(smp.nSustainEnd > nNewLength) smp.nSustainEnd = nNewLength;
+
+ AdjustEndOfSample(smp, pSndFile);
+
+ return smp.nLength;
+}
+
namespace // Unnamed namespace for local implementation functions.
{
Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.h
===================================================================
--- trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-07-25 13:27:30 UTC (rev 302)
+++ trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-07-25 15:39:19 UTC (rev 303)
@@ -20,8 +20,13 @@
// 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(MODINSTRUMENT& smp, const SmpLength nSilenceLength, const SmpLength nStartFrom, CSoundFile* pSndFile = 0);
+SmpLength InsertSilence(MODINSTRUMENT& smp, const SmpLength nSilenceLength, const SmpLength nStartFrom, CSoundFile* pSndFile = nullptr);
+// 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(MODINSTRUMENT& smp, const SmpLength nNewLength, CSoundFile* pSndFile = nullptr);
+
// Replaces sample in 'smp' with given sample and frees the old sample.
void ReplaceSample(MODINSTRUMENT& smp, const LPSTR pNewSample, const SmpLength nNewLength);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-07-25 13:27:42
|
Revision: 302
http://modplug.svn.sourceforge.net/modplug/?rev=302&view=rev
Author: saga-games
Date: 2009-07-25 13:27:30 +0000 (Sat, 25 Jul 2009)
Log Message:
-----------
[Imp] Mixing: It's now possible to go down to 1ms latency (works with ASIO)
[Fix] Pattern editor: Reverted the "loop pattern" fix from one of the latest revisions until a solution is found that doesn't break anything
[Fix] Pattern editor: Unbroke "remove channels" dialog when being called from the channel context menu
[Imp] General tab: Further improvements to the "mod type" dialog (some options are removed when using MOD/S3M formats)... Still too big, though.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Mpdlgs.cpp
trunk/OpenMPT/mptrack/dlg_misc.cpp
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/resource.h
trunk/OpenMPT/soundlib/SNDDEV.H
trunk/OpenMPT/soundlib/Snd_fx.cpp
Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mpdlgs.cpp 2009-07-23 21:51:50 UTC (rev 301)
+++ trunk/OpenMPT/mptrack/Mpdlgs.cpp 2009-07-25 13:27:30 UTC (rev 302)
@@ -138,6 +138,8 @@
m_CbnBufferLength.SetWindowText(s);
// -> CODE#0006
// -> DESC="misc quantity changes"
+ m_CbnBufferLength.AddString("1 ms");
+ m_CbnBufferLength.AddString("5 ms");
m_CbnBufferLength.AddString("10 ms");
m_CbnBufferLength.AddString("20 ms");
// -! BEHAVIOUR_CHANGE#0006
Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-23 21:51:50 UTC (rev 301)
+++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-07-25 13:27:30 UTC (rev 302)
@@ -116,8 +116,8 @@
//{{AFX_DATA_MAP(CModTypeDlg)
DDX_Control(pDX, IDC_COMBO1, m_TypeBox);
DDX_Control(pDX, IDC_COMBO2, m_ChannelsBox);
- DDX_Control(pDX, IDC_COMBO3, m_TempoModeBox);
- DDX_Control(pDX, IDC_COMBO4, m_PlugMixBox);
+ DDX_Control(pDX, IDC_COMBO_TEMPOMODE, m_TempoModeBox);
+ DDX_Control(pDX, IDC_COMBO_MIXLEVELS, m_PlugMixBox);
DDX_Control(pDX, IDC_CHECK1, m_CheckBox1);
DDX_Control(pDX, IDC_CHECK2, m_CheckBox2);
DDX_Control(pDX, IDC_CHECK3, m_CheckBox3);
@@ -196,11 +196,11 @@
default: m_PlugMixBox.SetCurSel(0); break;
}
- SetDlgItemText(IDC_STATIC_CREATEDWITH, "Created with:");
- SetDlgItemText(IDC_STATIC_SAVEDWITH, "Last saved with:");
+ SetDlgItemText(IDC_TEXT_CREATEDWITH, "Created with:");
+ SetDlgItemText(IDC_TEXT_SAVEDWITH, "Last saved with:");
- SetDlgItemText(IDC_EDIT1, MptVersion::ToStr(m_pSndFile->m_dwCreatedWithVersion));
- SetDlgItemText(IDC_EDIT2, MptVersion::ToStr(m_pSndFile->m_dwLastSavedWithVersion));
+ SetDlgItemText(IDC_EDIT_CREATEDWITH, MptVersion::ToStr(m_pSndFile->m_dwCreatedWithVersion));
+ SetDlgItemText(IDC_EDIT_SAVEDWITH, MptVersion::ToStr(m_pSndFile->m_dwLastSavedWithVersion));
m_EditFlag.SetLimitText(16);
@@ -270,6 +270,7 @@
const bool ITorMPT = ((m_TypeBox.GetItemData(m_TypeBox.GetCurSel()) & (MOD_TYPE_IT | MOD_TYPE_MPT)) != 0);
const bool XM = m_TypeBox.GetItemData(m_TypeBox.GetCurSel()) == MOD_TYPE_XM;
+ // Misc Flags box
CWnd* p = GetDlgItem(IDC_EDIT_FLAGS);
if(p) p->ShowWindow(XMorITorMPT);
p = GetDlgItem(IDC_FLAG_EXPLANATIONS);
@@ -284,8 +285,9 @@
"2. Unused\n"
"3. Plugin volume command bug");
}
- p = GetDlgItem(IDC_FLAGEDITTITLE);
- if(p) p->ShowWindow(XMorITorMPT);
+
+ GetDlgItem(IDC_FLAGEDITTITLE)->ShowWindow(XMorITorMPT);
+ GetDlgItem(IDC_FRAME_MPTEXT)->ShowWindow(XMorITorMPT);
if(XMorITorMPT)
{
char str[17] = "0000000000000000";
@@ -299,11 +301,37 @@
SetDlgItemText(IDC_EDIT_FLAGS, str);
}
- m_TempoModeBox.EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE);
- GetDlgItem(IDC_ROWSPERBEAT)->EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE);
- GetDlgItem(IDC_ROWSPERMEASURE)->EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE);
+ // Mixmode Box
+ GetDlgItem(IDC_TEXT_MIXMODE)->ShowWindow(XMorITorMPT);
+ m_PlugMixBox.ShowWindow(XMorITorMPT);
+
+ // Tempo mode box
+ m_TempoModeBox.ShowWindow(XMorITorMPT);
+ GetDlgItem(IDC_ROWSPERBEAT)->ShowWindow(XMorITorMPT);
+ GetDlgItem(IDC_ROWSPERMEASURE)->ShowWindow(XMorITorMPT);
+ GetDlgItem(IDC_TEXT_ROWSPERBEAT)->ShowWindow(XMorITorMPT);
+ GetDlgItem(IDC_TEXT_ROWSPERMEASURE)->ShowWindow(XMorITorMPT);
+ GetDlgItem(IDC_TEXT_TEMPOMODE)->ShowWindow(XMorITorMPT);
+ GetDlgItem(IDC_FRAME_TEMPOMODE)->ShowWindow(XMorITorMPT);
- m_PlugMixBox.EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE);
+ // Version info
+ GetDlgItem(IDC_FRAME_MPTVERSION)->ShowWindow(XMorITorMPT);
+ GetDlgItem(IDC_TEXT_CREATEDWITH)->ShowWindow(XMorITorMPT);
+ GetDlgItem(IDC_TEXT_SAVEDWITH)->ShowWindow(XMorITorMPT);
+ GetDlgItem(IDC_EDIT_CREATEDWITH)->ShowWindow(XMorITorMPT);
+ GetDlgItem(IDC_EDIT_SAVEDWITH)->ShowWindow(XMorITorMPT);
+
+ // Window height - some parts of the dialog won't be visible for all formats
+ RECT rWindow;
+ GetWindowRect(&rWindow);
+
+ UINT iHeight;
+ int nItemID = (XMorITorMPT) ? IDC_FRAME_MPTVERSION : IDC_FRAME_MODFLAGS;
+ RECT rFrame;
+ GetDlgItem(nItemID)->GetWindowRect(&rFrame);
+ iHeight = rFrame.bottom - rWindow.top + 12;
+ MoveWindow(rWindow.left, rWindow.top, rWindow.right - rWindow.left, iHeight);
+
}
@@ -530,7 +558,7 @@
BOOL CRemoveChannelsDlg::OnInitDialog()
//-------------------------------------
{
- CHAR label[20 + MAX_CHANNELNAME];
+ CHAR label[max(100, 20 + MAX_CHANNELNAME)];
CDialog::OnInitDialog();
for (UINT n = 0; n < m_nChannels; n++)
{
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2009-07-23 21:51:50 UTC (rev 301)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2009-07-25 13:27:30 UTC (rev 302)
@@ -378,10 +378,10 @@
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
COMBOBOX IDC_COMBO1,15,25,134,109,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- CONTROL "Primary highlight",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,91,74,10
- EDITTEXT IDC_PRIMARYHILITE,101,90,21,12,ES_AUTOHSCROLL | ES_NUMBER
- CONTROL "Secondary highlight",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,103,80,10
- EDITTEXT IDC_SECONDARYHILITE,101,102,21,12,ES_AUTOHSCROLL | ES_NUMBER
+ CONTROL "Primary highlight",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,91,74,10
+ EDITTEXT IDC_PRIMARYHILITE,114,90,21,12,ES_AUTOHSCROLL | ES_NUMBER
+ CONTROL "Secondary highlight",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,109,80,10
+ EDITTEXT IDC_SECONDARYHILITE,114,108,21,12,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "Enable effect highlighting",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,60,114,10
CONTROL "Use small font",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,45,102,10
PUSHBUTTON "MPT",IDC_BUTTON5,159,26,22,12
@@ -396,9 +396,9 @@
LTEXT "Highlight:",IDC_TEXT3,169,185,61,8
GROUPBOX "",IDC_STATIC,5,5,260,220
LTEXT "Select color for:",IDC_STATIC,15,15,63,8
- LTEXT "rows",IDC_STATIC,125,92,16,8
+ LTEXT "rows",IDC_STATIC,138,92,16,8
LTEXT "Presets:",IDC_STATIC,159,15,28,8
- LTEXT "rows",IDC_STATIC,125,104,16,8
+ LTEXT "rows",IDC_STATIC,138,110,16,8
CONTROL "",IDC_BUTTON4,"Button",BS_OWNERDRAW | BS_FLAT,65,130,114,43
CONTROL "Set highlights to songs' time signatures",IDC_CHECK5,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,75,136,10
@@ -715,34 +715,34 @@
BEGIN
DEFPUSHBUTTON "OK",IDOK,204,6,50,14
PUSHBUTTON "Cancel",IDCANCEL,204,24,50,14
- GROUPBOX "Type",IDC_STATIC,6,6,192,48
+ GROUPBOX "Type",IDC_FRAME_MODTYPE,6,6,192,48
COMBOBOX IDC_COMBO1,12,18,108,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_COMBO2,126,18,66,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "Embed instrument parameters in ITP",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,36,126,8
- GROUPBOX "Playback",IDC_STATIC,6,60,246,54
+ 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 "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
- GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_STATIC,6,120,246,84
- RTEXT "Mix Levels:",IDC_STATIC,18,134,81,8
- COMBOBOX IDC_COMBO4,108,132,84,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ 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
RTEXT "Miscellaneous flags(0/1):",IDC_FLAGEDITTITLE,18,150,81,12,SS_CENTERIMAGE
EDITTEXT IDC_EDIT_FLAGS,108,150,84,12,ES_AUTOHSCROLL
LTEXT "",IDC_FLAG_EXPLANATIONS,18,168,222,26
- GROUPBOX "OpenMPT Version Info",IDC_STATIC,6,263,246,48
- EDITTEXT IDC_EDIT1,78,276,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE
- EDITTEXT IDC_EDIT2,78,294,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE
- RTEXT "IDC_STATIC_CREATEDWITH",IDC_STATIC_CREATEDWITH,18,278,54,8
- RTEXT "IDC_STATIC_SAVEDWITH",IDC_STATIC_SAVEDWITH,18,295,54,8
- GROUPBOX "Tempo",IDC_STATIC,6,210,246,48
- LTEXT "Mode:",IDC_STATIC,12,224,21,8
- COMBOBOX IDC_COMBO3,36,222,108,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "OpenMPT Version Info",IDC_FRAME_MPTVERSION,6,263,246,48
+ EDITTEXT IDC_EDIT_CREATEDWITH,78,276,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE
+ EDITTEXT IDC_EDIT_SAVEDWITH,78,294,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE
+ RTEXT "IDC_TEXT_CREATEDWITH",IDC_TEXT_CREATEDWITH,18,278,54,8
+ RTEXT "IDC_TEXT_SAVEDWITH",IDC_TEXT_SAVEDWITH,18,295,54,8
+ GROUPBOX "Tempo",IDC_FRAME_TEMPOMODE,6,210,246,48
+ LTEXT "Mode:",IDC_TEXT_TEMPOMODE,12,224,21,8
+ COMBOBOX IDC_COMBO_TEMPOMODE,36,222,108,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
EDITTEXT IDC_ROWSPERBEAT,156,222,24,12,ES_AUTOHSCROLL | ES_NUMBER
- LTEXT "Rows/beat",IDC_STATIC,186,224,36,8
+ LTEXT "Rows/beat",IDC_TEXT_ROWSPERBEAT,186,224,36,8
EDITTEXT IDC_ROWSPERMEASURE,156,240,24,12,ES_AUTOHSCROLL | ES_NUMBER
- LTEXT "Rows/measure",IDC_STATIC,186,242,49,8
+ LTEXT "Rows/measure",IDC_TEXT_ROWSPERMEASURE,186,242,49,8
END
IDD_SHOWLOG DIALOG 0, 0, 300, 106
@@ -763,8 +763,8 @@
DEFPUSHBUTTON "OK",IDOK,54,198,50,14
PUSHBUTTON "Cancel",IDCANCEL,114,198,50,14
LISTBOX IDC_REMCHANSLIST,6,36,156,156,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
- LTEXT "Channels:",IDC_QUESTION1,6,6,157,11
- LTEXT "Detected unused channels are already selected",IDC_STATIC,6,18,159,10
+ LTEXT "Channels:",IDC_QUESTION1,6,6,157,18
+ LTEXT "Detected unused channels are already selected",IDC_STATIC,6,24,159,10
END
IDD_VIEW_GLOBALS DIALOGEX 0, 0, 471, 337
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-07-23 21:51:50 UTC (rev 301)
+++ trunk/OpenMPT/mptrack/resource.h 2009-07-25 13:27:30 UTC (rev 302)
@@ -850,10 +850,25 @@
#define IDC_STATIC_VSTPRESETDIR 2359
#define IDC_BUTTON_DEFAULT_RESAMPLING 2360
#define IDC_STATIC_CREATEDWITH 2361
+#define IDC_TEXT_CREATEDWITH 2361
#define IDC_STATIC_SAVEDWITH 2362
#define IDC_STATIC_VSTNAMEFILTER 2362
+#define IDC_TEXT_SAVEDWITH 2362
#define IDC_TEXT_CURRENT_VSTPLUG 2363
#define IDC_STATIC_SCALE_ENV 2364
+#define IDC_FRAME_MPTEXT 2365
+#define IDC_COMBO_MIXLEVELS 2366
+#define IDC_COMBO_TEMPOMODE 2367
+#define IDC_TEXT_TEMPOMODE 2368
+#define IDC_FRAME_TEMPOMODE 2369
+#define IDC_TEXT_MIXMODE 2370
+#define IDC_TEXT_ROWSPERBEAT 2371
+#define IDC_TEXT_ROWSPERMEASURE 2372
+#define IDC_FRAME_MPTVERSION 2373
+#define IDC_EDIT_CREATEDWITH 2374
+#define IDC_EDIT_SAVEDWITH 2375
+#define IDC_FRAME_MODFLAGS 2376
+#define IDC_FRAME_MODTYPE 2377
#define ID_FILE_NEWMOD 32771
#define ID_FILE_NEWXM 32772
#define ID_FILE_NEWS3M 32773
@@ -1093,7 +1108,7 @@
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 518
#define _APS_NEXT_COMMAND_VALUE 59227
-#define _APS_NEXT_CONTROL_VALUE 2365
+#define _APS_NEXT_CONTROL_VALUE 2378
#define _APS_NEXT_SYMED_VALUE 901
#endif
#endif
Modified: trunk/OpenMPT/soundlib/SNDDEV.H
===================================================================
--- trunk/OpenMPT/soundlib/SNDDEV.H 2009-07-23 21:51:50 UTC (rev 301)
+++ trunk/OpenMPT/soundlib/SNDDEV.H 2009-07-25 13:27:30 UTC (rev 302)
@@ -31,7 +31,7 @@
#define SNDDEV_MINBUFFERS 2
#define SNDDEV_MAXBUFFERS 16
-#define SNDDEV_MINBUFFERLEN 10 // 10ms
+#define SNDDEV_MINBUFFERLEN 1 // 1ms
#define SNDDEV_MAXBUFFERLEN 1000 // 1sec
#define SNDDEV_OPTIONS_SECONDARY 0x01 // Use secondary buffers (if available)
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-23 21:51:50 UTC (rev 301)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-25 13:27:30 UTC (rev 302)
@@ -1761,14 +1761,12 @@
// Position Jump
case CMD_POSITIONJUMP:
nPosJump = param;
- /* commented this out (http://lpchip.com/modplug/viewtopic.php?t=1808) - I hope it doesn't break anything else.
if((m_dwSongFlags & SONG_PATTERNLOOP && m_nSeqOverride == 0)) {
m_nSeqOverride = param+1;
//Releasing pattern loop after position jump could cause
//instant jumps - modifying behavior so that now position jumps
//occurs also when pattern loop is enabled.
}
- */
// see http://lpchip.com/modplug/viewtopic.php?t=2769 - FastTracker resets Dxx if Bxx is called _after_ Dxx
if(GetType() == MOD_TYPE_XM) nBreakRow = 0;
break;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|