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
(49) |
Jun
(55) |
Jul
(91) |
Aug
(191) |
Sep
|
Oct
(68) |
Nov
|
Dec
|
|
From: <rel...@us...> - 2009-08-20 16:46:20
|
Revision: 335
http://modplug.svn.sourceforge.net/modplug/?rev=335&view=rev
Author: relabsoluness
Date: 2009-08-20 16:46:12 +0000 (Thu, 20 Aug 2009)
Log Message:
-----------
[New] MIDI: Can now record MIDI mapping changes to pattern.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp
trunk/OpenMPT/mptrack/MIDIMappingDialog.h
trunk/OpenMPT/mptrack/Mpt_midi.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/View_pat.h
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/resource.h
trunk/OpenMPT/soundlib/midi.h
trunk/OpenMPT/soundlib/modcommand.h
Modified: trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp 2009-08-19 15:20:48 UTC (rev 334)
+++ trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp 2009-08-20 16:46:12 UTC (rev 335)
@@ -52,6 +52,7 @@
ON_BN_CLICKED(IDC_BUTTON_REMOVE, OnBnClickedButtonRemove)
ON_MESSAGE(WM_MOD_MIDIMSG, OnMidiMsg)
ON_NOTIFY(UDN_DELTAPOS, IDC_SPINMOVEMAPPING, OnDeltaposSpinmovemapping)
+ ON_BN_CLICKED(IDC_CHECK_PATRECORD, OnBnClickedCheckPatRecord)
END_MESSAGE_MAP()
@@ -77,10 +78,15 @@
{
CDialog::OnInitDialog();
+ if (m_rMIDIMapper.GetCount() > 0)
+ m_Setting = m_rMIDIMapper.GetDirective(0);
+
m_ChannelCBox.SetCurSel(m_Setting.GetChannel());
- CheckDlgButton(IDC_CHECKACTIVE, m_Setting.IsActive() ? MF_CHECKED : MF_UNCHECKED);
- CheckDlgButton(IDC_CHECKCAPTURE, m_Setting.GetCaptureMIDI() ? MF_CHECKED : MF_UNCHECKED);
+ CheckDlgButton(IDC_CHECKACTIVE, m_Setting.IsActive() ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(IDC_CHECKCAPTURE, m_Setting.GetCaptureMIDI() ? BST_CHECKED : BST_UNCHECKED);
+ GetDlgItem(IDC_CHECK_PATRECORD)->ShowWindow((m_rSndFile.GetType() == MOD_TYPE_MPT) ? SW_SHOW : SW_HIDE);
+ CheckDlgButton(IDC_CHECK_PATRECORD, m_Setting.GetAllowPatternEdit() ? BST_CHECKED : BST_UNCHECKED);
m_EventCBox.SetCurSel(0);
@@ -168,6 +174,14 @@
}
+void CMIDIMappingDialog::OnBnClickedCheckPatRecord()
+//--------------------------------------------------
+{
+ m_Setting.SetAllowPatternEdit(IsDlgButtonChecked(IDC_CHECK_PATRECORD) == BST_CHECKED);
+ UpdateString();
+}
+
+
void CMIDIMappingDialog::UpdateString()
//-------------------------------------
{
Modified: trunk/OpenMPT/mptrack/MIDIMappingDialog.h
===================================================================
--- trunk/OpenMPT/mptrack/MIDIMappingDialog.h 2009-08-19 15:20:48 UTC (rev 334)
+++ trunk/OpenMPT/mptrack/MIDIMappingDialog.h 2009-08-20 16:46:12 UTC (rev 335)
@@ -65,4 +65,5 @@
afx_msg void OnBnClickedButtonRemove();
afx_msg LRESULT OnMidiMsg(WPARAM, LPARAM);
afx_msg void OnDeltaposSpinmovemapping(NMHDR *pNMHDR, LRESULT *pResult);
+ afx_msg void OnBnClickedCheckPatRecord();
};
Modified: trunk/OpenMPT/mptrack/Mpt_midi.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mpt_midi.cpp 2009-08-19 15:20:48 UTC (rev 334)
+++ trunk/OpenMPT/mptrack/Mpt_midi.cpp 2009-08-20 16:46:12 UTC (rev 335)
@@ -192,7 +192,8 @@
uint8 temp8 = citer->IsActive(); //bit 0
if(citer->GetCaptureMIDI()) temp8 |= (1 << 1); //bit 1
//bits 2-4: Mapping type: 0 for plug param control.
- //bit 5: if(citer->GetAllowPatternEdit()) temp8 |= (1 << 4);
+ //bit 5:
+ if(citer->GetAllowPatternEdit()) temp8 |= (1 << 5);
//bits 6-7: Size: 5, 6, 8, 12
BYTE parambytes = 4;
@@ -238,7 +239,7 @@
CMIDIMappingDirective s;
s.SetActive((i8 & 1) != 0);
s.SetCaptureMIDI((i8 & (1 << 1)) != 0);
- s.SetAllowPatternEdit((i8 & (1 << 4)) != 0);
+ s.SetAllowPatternEdit((i8 & (1 << 5)) != 0);
memcpy(&i16, ptr, 2); ptr += 2; //Channel, event, MIDIbyte1.
memcpy(&i8, ptr, 1); ptr++; //Plugindex
const BYTE remainingbytes = psize - 4;
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-08-19 15:20:48 UTC (rev 334)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-08-20 16:46:12 UTC (rev 335)
@@ -3001,6 +3001,30 @@
}
+ModCommandPos CViewPattern::GetEditPos(CSoundFile& rSf, const bool bLiveRecord) const
+//-----------------------------------------------------------------------------------
+{
+ ModCommandPos editpos;
+ if(bLiveRecord)
+ SetEditPos(rSf, editpos.nRow, editpos.nPat, rSf.m_nRow, rSf.m_nPattern);
+ else
+ {editpos.nPat = m_nPattern; editpos.nRow = m_nRow;}
+ editpos.nChn = GetChanFromCursor(m_dwCursor);
+ return editpos;
+}
+
+
+MODCOMMAND* CViewPattern::GetModCommand(CSoundFile& rSf, const ModCommandPos& pos)
+//--------------------------------------------------------------------------------
+{
+ static MODCOMMAND m;
+ if (rSf.Patterns.IsValidIndex(pos.nPat) && pos.nRow < rSf.Patterns[pos.nPat].GetNumRows() && pos.nChn < rSf.GetNumChannels())
+ return rSf.Patterns[pos.nPat].GetpModCommand(pos.nRow, pos.nChn);
+ else
+ return &m;
+}
+
+
LRESULT CViewPattern::OnMidiMsg(WPARAM dwMidiDataParam, LPARAM)
//--------------------------------------------------------
{
@@ -3043,10 +3067,25 @@
if ((event == 0x9) && !nVol) event = 0x8; //Convert event to note-off if req'd
- //Try finding MIDI mapping.
- BYTE mappedIndex = 0, paramValue = 0;
+ // Handle MIDI mapping.
+ uint8 mappedIndex = uint8_max, paramValue = uint8_max;
uint32 paramIndex = 0;
- if(pSndFile->GetMIDIMapper().OnMIDImsg(dwMidiData, mappedIndex, paramIndex, paramValue))
+ const bool bCaptured = pSndFile->GetMIDIMapper().OnMIDImsg(dwMidiData, mappedIndex, paramIndex, paramValue);
+
+ // Write parameter control commands if needed.
+ if (paramValue != uint8_max && IsEditingEnabled() && pSndFile->GetType() == MOD_TYPE_MPT)
+ {
+ // Note: There's no undo for these modifications.
+ const bool bLiveRecord = IsLiveRecord(*pModDoc, *pSndFile);
+ ModCommandPos editpos = GetEditPos(*pSndFile, bLiveRecord);
+ MODCOMMAND* p = GetModCommand(*pSndFile, editpos);
+ p->Set(NOTE_PCS, mappedIndex, static_cast<uint16>(paramIndex), static_cast<uint16>((paramValue * MODCOMMAND::maxColumnValue)/127));
+ if(bLiveRecord == false)
+ InvalidateRow(editpos.nRow);
+ pMainFrm->ThreadSafeSetModified(pModDoc);
+ }
+
+ if (bCaptured)
return 0;
switch(event)
@@ -3079,17 +3118,13 @@
}
// Checking whether to record MIDI controller change as MIDI macro change.
- if((CMainFrame::m_dwMidiSetup & MIDISETUP_MIDIMACROCONTROL) && IsEditingEnabled())
+ // Don't write this if command was already written by MIDI mapping.
+ if((paramValue == uint8_max || pSndFile->GetType() != MOD_TYPE_MPT) && IsEditingEnabled() && (CMainFrame::m_dwMidiSetup & MIDISETUP_MIDIMACROCONTROL))
{
- // Note: No undo for these modifications.
+ // Note: There's no undo for these modifications.
const bool bLiveRecord = IsLiveRecord(*pModDoc, *pSndFile);
- ROWINDEX nRow = m_nRow;
- PATTERNINDEX nPat = m_nPattern;
- if(bLiveRecord)
- SetEditPos(*pSndFile, nRow, nPat, pSndFile->m_nRow, pSndFile->m_nPattern);
-
- const CHANNELINDEX nChn = GetChanFromCursor(m_dwCursor);
- MODCOMMAND *p = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn);
+ ModCommandPos editpos = GetEditPos(*pSndFile, bLiveRecord);
+ MODCOMMAND* p = GetModCommand(*pSndFile, editpos);
if(p->command == 0 || p->command == CMD_SMOOTHMIDI || p->command == CMD_MIDI)
{ // Write command only if there's no existing command or already a midi macro command.
p->command = CMD_SMOOTHMIDI;
@@ -3098,7 +3133,7 @@
// Update GUI only if not recording live.
if(bLiveRecord == false)
- InvalidateRow(nRow);
+ InvalidateRow(editpos.nRow);
}
}
@@ -4941,20 +4976,15 @@
return chans.GetCount();
}
-UINT CViewPattern::GetRowFromCursor(DWORD cursor) {
-//-----------------------------------------------
- return cursor >> 16;
-}
+ROWINDEX CViewPattern::GetRowFromCursor(DWORD cursor) {return cursor >> 16;}
+//---------------------------------------------------
+
+CHANNELINDEX CViewPattern::GetChanFromCursor(DWORD cursor) {return static_cast<CHANNELINDEX>((cursor & 0xFFFF) >> 3);}
+//-------------------------------------------------------
-UINT CViewPattern::GetChanFromCursor(DWORD cursor) {
-//------------------------------------------------
- return (cursor & 0xFFFF) >> 3;
-}
+UINT CViewPattern::GetColTypeFromCursor(DWORD cursor) {return cursor & 0x07;}
+//---------------------------------------------------
-UINT CViewPattern::GetColTypeFromCursor(DWORD cursor) {
-//--------------------------------------------------
- return cursor & 0x07;
-}
bool CViewPattern::IsInterpolationPossible(UINT startRow, UINT endRow,
UINT chan, UINT colType, CSoundFile* pSndFile) {
Modified: trunk/OpenMPT/mptrack/View_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.h 2009-08-19 15:20:48 UTC (rev 334)
+++ trunk/OpenMPT/mptrack/View_pat.h 2009-08-20 16:46:12 UTC (rev 335)
@@ -55,7 +55,14 @@
};
const RowMask DefaultRowMask = {true, true, true, true, true};
+struct ModCommandPos
+{
+ PATTERNINDEX nPat;
+ ROWINDEX nRow;
+ CHANNELINDEX nChn;
+};
+
//////////////////////////////////////////////////////////////////
// Pattern editing class
@@ -323,9 +330,9 @@
UINT GetSelectionEndChan();
UINT ListChansWhereColSelected(UINT colType, CArray<UINT,UINT> &chans);
- UINT GetRowFromCursor(DWORD cursor);
- UINT GetChanFromCursor(DWORD cursor);
- UINT GetColTypeFromCursor(DWORD cursor);
+ static ROWINDEX GetRowFromCursor(DWORD cursor);
+ static CHANNELINDEX GetChanFromCursor(DWORD cursor);
+ static UINT GetColTypeFromCursor(DWORD cursor);
bool IsInterpolationPossible(UINT startRow, UINT endRow, UINT chan, UINT colType, CSoundFile* pSndFile);
void Interpolate(UINT type);
@@ -341,6 +348,13 @@
ROWINDEX& iRow, PATTERNINDEX& iPat,
const ROWINDEX iRowCandidate, const PATTERNINDEX iPatCandidate) const;
+ // Returns edit position.
+ ModCommandPos GetEditPos(CSoundFile& rSf, const bool bLiveRecord) const;
+
+ // Returns pointer to modcommand at given position. If the position is not valid, returns pointer
+ // to a dummy command.
+ MODCOMMAND* GetModCommand(CSoundFile& rSf, const ModCommandPos& pos);
+
bool IsEditingEnabled() const {return ((m_dwStatus&PATSTATUS_RECORD) != 0);}
//Like IsEditingEnabled(), but shows some notification when editing is not enabled.
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2009-08-19 15:20:48 UTC (rev 334)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2009-08-20 16:46:12 UTC (rev 335)
@@ -2248,7 +2248,7 @@
BEGIN
GROUPBOX "Current mapping",IDC_STATIC,5,5,325,105
CONTROL "Active",IDC_CHECKACTIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,20,42,10
- CONTROL "Capture",IDC_CHECKCAPTURE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,65,20,39,10
+ CONTROL "Capture",IDC_CHECKCAPTURE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,67,20,39,10
LTEXT "Channel",IDC_STATIC,15,35,27,8
COMBOBOX IDC_COMBO_CHANNEL,15,45,36,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Event",IDC_STATIC,61,35,20,8
@@ -2267,6 +2267,7 @@
CONTROL "",IDC_SPINMOVEMAPPING,"msctls_updown32",0x0,330,115,11,80
CONTROL "MIDI learn",IDC_CHECK_MIDILEARN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,335,30,47,11
DEFPUSHBUTTON "Close",IDOK,335,10,50,14
+ CONTROL "Pattern record",IDC_CHECK_PATRECORD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,114,20,63,10
END
IDD_TUNING DIALOGEX 0, 0, 512, 240
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-08-19 15:20:48 UTC (rev 334)
+++ trunk/OpenMPT/mptrack/resource.h 2009-08-20 16:46:12 UTC (rev 335)
@@ -882,6 +882,7 @@
#define IDC_SPIN_ADDSILENCE 2382
#define IDC_RADIO_RESIZETO 2384
#define IDC_EDIT_MODLOADING_WARNINGS 2385
+#define IDC_CHECK_PATRECORD 2386
#define ID_FILE_NEWMOD 32771
#define ID_FILE_NEWXM 32772
#define ID_FILE_NEWS3M 32773
@@ -1123,7 +1124,7 @@
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 521
#define _APS_NEXT_COMMAND_VALUE 59229
-#define _APS_NEXT_CONTROL_VALUE 2386
+#define _APS_NEXT_CONTROL_VALUE 2387
#define _APS_NEXT_SYMED_VALUE 901
#endif
#endif
Modified: trunk/OpenMPT/soundlib/midi.h
===================================================================
--- trunk/OpenMPT/soundlib/midi.h 2009-08-19 15:20:48 UTC (rev 334)
+++ trunk/OpenMPT/soundlib/midi.h 2009-08-20 16:46:12 UTC (rev 335)
@@ -68,10 +68,10 @@
CString ToString() const
{
CString str; str.Preallocate(20);
- char flags[3] = "00";
+ char flags[4] = "000";
if(m_Active) flags[0] = '1';
if(m_CaptureMIDI) flags[1] = '1';
- //if(m_AllowPatternEdit) flags[2] = '1';
+ if(m_AllowPatternEdit) flags[2] = '1';
str.Format("%s:%d:%x:%d:%d:%d", flags, (int)GetChannel(), (int)GetEvent(), (int)GetController(), (int)m_PluginIndex, m_Parameter);
str.Trim();
return str;
Modified: trunk/OpenMPT/soundlib/modcommand.h
===================================================================
--- trunk/OpenMPT/soundlib/modcommand.h 2009-08-19 15:20:48 UTC (rev 334)
+++ trunk/OpenMPT/soundlib/modcommand.h 2009-08-20 16:46:12 UTC (rev 335)
@@ -31,6 +31,8 @@
return !(*this == mc);
}
+ void Set(NOTE n, INSTR ins, uint16 volcol, uint16 effectcol) {note = n; instr = ins; SetValueVolCol(volcol); SetValueEffectCol(effectcol);}
+
uint16 GetValueVolCol() const {return GetValueVolCol(volcmd, vol);}
static uint16 GetValueVolCol(BYTE volcmd, BYTE vol) {return (volcmd << 8) + vol;}
void SetValueVolCol(const uint16 val) {volcmd = static_cast<BYTE>(val >> 8); vol = static_cast<BYTE>(val & 0xFF);}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-08-19 15:20:54
|
Revision: 334
http://modplug.svn.sourceforge.net/modplug/?rev=334&view=rev
Author: saga-games
Date: 2009-08-19 15:20:48 +0000 (Wed, 19 Aug 2009)
Log Message:
-----------
[New] (Partly from last commit): Envelope points can now be added by shift-clicking somewhere in the envelope editor. Middle mouse button click removes the nearest point.
[Fix] Mod Conversion: Used MAX_CHANNELS instead of MAX_BASECHANNELS (luckily, nothing could go wrong as there are more max. virtual channels than max. chanenls)
[Fix] Pattern editor: Inserting a new pattern won't resize it to 32 rows anymore if the current pattern has less than 32 rows.
[Mod] Note properties / Find&Replace: Show "Note Cut", "Note Fade", "Note Off" instead of "^^", "~~" and "==" for easier understanding. Maybe this should only happen in the note properties, though.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/Mptrack.h
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/mptrack/View_ins.h
trunk/OpenMPT/mptrack/dlg_misc.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-08-18 23:06:08 UTC (rev 333)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-08-19 15:20:48 UTC (rev 334)
@@ -850,10 +850,10 @@
if ((pat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[pat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)))
{
rows = pSndFile->PatternSize[pat];
- if (rows < 32) rows = 32;
+ rows = CLAMP(rows, pSndFile->GetModSpecifications().patternRowsMin, pSndFile->GetModSpecifications().patternRowsMax);
}
PATTERNINDEX nNewPat = m_pModDoc->InsertPattern(nCurOrd + 1, rows);
- if ((nNewPat >= 0) && (nNewPat < pSndFile->Patterns.Size()))
+ if ((nNewPat != PATTERNINDEX_INVALID) && (nNewPat < pSndFile->Patterns.Size()))
{
m_OrderList.SetCurSel(nCurOrd + 1);
m_OrderList.InvalidateRect(NULL, FALSE);
@@ -889,11 +889,10 @@
if (nCurPat < pSndFile->Patterns.Size() && pReplaceIndex[nCurPat] == PATTERNINDEX_INVALID)
{
rows = pSndFile->PatternSize[nCurPat];
- if (rows < pSndFile->GetModSpecifications().patternRowsMin) rows = pSndFile->GetModSpecifications().patternRowsMin;
- if (rows > pSndFile->GetModSpecifications().patternRowsMax) rows = pSndFile->GetModSpecifications().patternRowsMax;
+ rows = CLAMP(rows, pSndFile->GetModSpecifications().patternRowsMin, pSndFile->GetModSpecifications().patternRowsMax);
PATTERNINDEX nNewPat = m_pModDoc->InsertPattern(nInsertWhere + i, rows);
- if ((nNewPat >= 0) && (nNewPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nCurPat] != nullptr))
+ if ((nNewPat != PATTERNINDEX_INVALID) && (nNewPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nCurPat] != nullptr))
{
MODCOMMAND *pSrc = pSndFile->Patterns[nCurPat];
MODCOMMAND *pDest = pSndFile->Patterns[nNewPat];
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-18 23:06:08 UTC (rev 333)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-19 15:20:48 UTC (rev 334)
@@ -159,13 +159,13 @@
/////////////////////////////
// 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];
// This is used for -> MOD/XM conversion
- BYTE cEffectMemory[MAX_CHANNELS][MAX_EFFECTS];
- memset(&cEffectMemory, 0, sizeof(BYTE) * MAX_CHANNELS * MAX_EFFECTS);
+ BYTE cEffectMemory[MAX_BASECHANNELS][MAX_EFFECTS];
+ memset(&cEffectMemory, 0, sizeof(BYTE) * MAX_BASECHANNELS * MAX_EFFECTS);
UINT nChannel = m_SndFile.m_nChannels - 1;
for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--)
@@ -1613,7 +1613,7 @@
{
const int i = m_SndFile.Patterns.Insert(nRows);
if(i < 0)
- return -1;
+ return PATTERNINDEX_INVALID;
//Increasing orderlist size if given order is beyond current limit,
//or if the last order already has a pattern.
Modified: trunk/OpenMPT/mptrack/Mptrack.h
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.h 2009-08-18 23:06:08 UTC (rev 333)
+++ trunk/OpenMPT/mptrack/Mptrack.h 2009-08-19 15:20:48 UTC (rev 334)
@@ -405,7 +405,8 @@
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("^^"), TEXT("==")};
+//const LPCTSTR szSpecialNoteNames[NOTE_MAX_SPECIAL - NOTE_MIN_SPECIAL + 1] = {TEXT("PCs"), TEXT("PC"), TEXT("~~"), TEXT("^^"), TEXT("==")};
+const LPCTSTR szSpecialNoteNames[NOTE_MAX_SPECIAL - NOTE_MIN_SPECIAL + 1] = {TEXT("PCs"), TEXT("PC"), TEXT("Note Fade"), TEXT("Note Cut"), TEXT("Note Off")};
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.
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2009-08-18 23:06:08 UTC (rev 333)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-08-19 15:20:48 UTC (rev 334)
@@ -62,6 +62,7 @@
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONDOWN()
+ ON_WM_MBUTTONDOWN()
ON_WM_NCLBUTTONDOWN()
ON_WM_NCLBUTTONUP()
ON_WM_NCLBUTTONDBLCLK()
@@ -1700,6 +1701,7 @@
}
else
{
+ // Shift-Click: Insert envelope point here
if(CMainFrame::GetMainFrame()->GetInputHandler()->ShiftPressed())
{
m_ptMenu = pt;
@@ -1756,7 +1758,18 @@
}
}
+void CViewInstrument::OnMButtonDown(UINT, CPoint pt)
+//--------------------------------------------------
+{
+ // Middle mouse button: Remove envelope point
+ if(EnvGetLastPoint() <= 1) return;
+ m_nDragItem = ScreenToPoint(pt.x, pt.y) + 1;
+ if(m_nDragItem == 0) return;
+ m_ptMenu = pt;
+ OnEnvRemovePoint();
+}
+
void CViewInstrument::OnPrevInstrument()
//--------------------------------------
{
Modified: trunk/OpenMPT/mptrack/View_ins.h
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.h 2009-08-18 23:06:08 UTC (rev 333)
+++ trunk/OpenMPT/mptrack/View_ins.h 2009-08-19 15:20:48 UTC (rev 334)
@@ -111,6 +111,7 @@
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnLButtonUp(UINT, CPoint);
afx_msg void OnRButtonDown(UINT, CPoint);
+ afx_msg void OnMButtonDown(UINT, CPoint);
afx_msg void OnNcMouseMove(UINT nHitTest, CPoint point);
afx_msg void OnNcLButtonDown(UINT, CPoint);
afx_msg void OnNcLButtonUp(UINT, CPoint);
Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-08-18 23:06:08 UTC (rev 333)
+++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-08-19 15:20:48 UTC (rev 334)
@@ -916,9 +916,10 @@
combo->AddString(s);
}
combo->SetCurSel(nrows - specs.patternRowsMin);
- wsprintf(s, "Pattern #%d:\x0d\x0a %d rows (%dK)",
+ wsprintf(s, "Pattern #%d:\x0d\x0a %d row%s (%dK)",
m_nPattern,
pSndFile->PatternSize[m_nPattern],
+ (pSndFile->PatternSize[m_nPattern] == 1) ? "" : "s",
(pSndFile->PatternSize[m_nPattern] * pSndFile->m_nChannels * sizeof(MODCOMMAND))/1024);
SetDlgItemText(IDC_TEXT1, s);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-08-18 23:06:19
|
Revision: 333
http://modplug.svn.sourceforge.net/modplug/?rev=333&view=rev
Author: saga-games
Date: 2009-08-18 23:06:08 +0000 (Tue, 18 Aug 2009)
Log Message:
-----------
[Fix] Pattern editor: Multiselect Pattern Duplicate shouldn't crash anymore if a non-existing pattern is being duplicated.
[Ref] Instrument editor code: Making use of the new INSTRUMENTENVELOPE sub-objects to reduce redundancy A LOT; Also using bool instead of BOOL.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/mptrack/View_ins.h
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-08-18 20:38:41 UTC (rev 332)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-08-18 23:06:08 UTC (rev 333)
@@ -873,13 +873,14 @@
if (m_pModDoc)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
+
ORD_SELECTION selection = m_OrderList.GetCurSel(false);
ORDERINDEX nInsertCount = selection.nOrdHi - selection.nOrdLo;
ORDERINDEX nInsertWhere = selection.nOrdLo + nInsertCount + 1;
bool bSuccess = false;
// has this pattern been duplicated already? (for multiselect)
- PATTERNINDEX pReplaceIndex[MAX_PATTERNS]; // TODO I think this is a bit much...
- memset(&pReplaceIndex, PATTERNINDEX_INVALID, sizeof(PATTERNINDEX) * MAX_PATTERNS);
+ vector<PATTERNINDEX> pReplaceIndex;
+ pReplaceIndex.resize(pSndFile->Patterns.Size(), PATTERNINDEX_INVALID);
for(ORDERINDEX i = 0; i <= nInsertCount; i++)
{
@@ -887,13 +888,12 @@
ROWINDEX rows = 64;
if (nCurPat < pSndFile->Patterns.Size() && pReplaceIndex[nCurPat] == PATTERNINDEX_INVALID)
{
- if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)))
- {
- rows = pSndFile->PatternSize[nCurPat];
- if (rows < pSndFile->GetModSpecifications().patternRowsMin) rows = pSndFile->GetModSpecifications().patternRowsMin;
- }
+ rows = pSndFile->PatternSize[nCurPat];
+ if (rows < pSndFile->GetModSpecifications().patternRowsMin) rows = pSndFile->GetModSpecifications().patternRowsMin;
+ if (rows > pSndFile->GetModSpecifications().patternRowsMax) rows = pSndFile->GetModSpecifications().patternRowsMax;
+
PATTERNINDEX nNewPat = m_pModDoc->InsertPattern(nInsertWhere + i, rows);
- if ((nNewPat >= 0) && (nNewPat < pSndFile->Patterns.Size()))
+ if ((nNewPat >= 0) && (nNewPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nCurPat] != nullptr))
{
MODCOMMAND *pSrc = pSndFile->Patterns[nCurPat];
MODCOMMAND *pDest = pSndFile->Patterns[nNewPat];
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2009-08-18 20:38:41 UTC (rev 332)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-08-18 23:06:08 UTC (rev 333)
@@ -268,10 +268,10 @@
}
-BOOL CViewInstrument::EnvSetValue(int nPoint, int nTick, int nValue)
+bool CViewInstrument::EnvSetValue(int nPoint, int nTick, int nValue)
//------------------------------------------------------------------
{
- BOOL bOk = FALSE;
+ bool bOk = false;
CModDoc *pModDoc = GetDocument();
if (pModDoc)
{
@@ -282,24 +282,14 @@
LPWORD pPoints = NULL;
LPBYTE pData = NULL;
UINT maxpoints = 0;
- switch(m_nEnv)
- {
- case ENV_VOLUME:
- maxpoints = pIns->VolEnv.nNodes;
- pPoints = pIns->VolEnv.Ticks;
- pData = pIns->VolEnv.Values;
- break;
- case ENV_PANNING:
- maxpoints = pIns->PanEnv.nNodes;
- pPoints = pIns->PanEnv.Ticks;
- pData = pIns->PanEnv.Values;
- break;
- case ENV_PITCH:
- maxpoints = pIns->PitchEnv.nNodes;
- pPoints = pIns->PitchEnv.Ticks;
- pData = pIns->PitchEnv.Values;
- break;
- }
+
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return false;
+
+ maxpoints = envelope->nNodes;
+ pPoints = envelope->Ticks;
+ pData = envelope->Values;
+
if (!nPoint) nTick = 0;
if ((nPoint < (int)maxpoints) && (pPoints) && (pData))
{
@@ -313,7 +303,7 @@
if (nTick != pPoints[nPoint])
{
pPoints[nPoint] = (WORD)nTick;
- bOk = TRUE;
+ bOk = true;
}
}
if (nValue >= 0)
@@ -322,7 +312,7 @@
if (nValue != pData[nPoint])
{
pData[nPoint] = (BYTE)nValue;
- bOk = TRUE;
+ bOk = true;
}
}
}
@@ -335,28 +325,9 @@
UINT CViewInstrument::EnvGetNumPoints() const
//-------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- switch(m_nEnv)
- {
- case ENV_VOLUME:
- if (pIns->VolEnv.nNodes) return pIns->VolEnv.nNodes;
- break;
- case ENV_PANNING:
- if (pIns->PanEnv.nNodes) return pIns->PanEnv.nNodes;
- break;
- case ENV_PITCH:
- if (pIns->PitchEnv.nNodes) return pIns->PitchEnv.nNodes;
- break;
- }
- }
- }
- return 0;
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return 0;
+ return envelope->nNodes;
}
@@ -369,7 +340,7 @@
}
-BOOL CViewInstrument::EnvGetLoop() const
+bool CViewInstrument::EnvGetLoop() const
//--------------------------------------
{
CModDoc *pModDoc = GetDocument();
@@ -382,22 +353,22 @@
switch(m_nEnv)
{
case ENV_VOLUME:
- if (pIns->dwFlags & ENV_VOLLOOP) return TRUE;
+ if (pIns->dwFlags & ENV_VOLLOOP) return true;
break;
case ENV_PANNING:
- if (pIns->dwFlags & ENV_PANLOOP) return TRUE;
+ if (pIns->dwFlags & ENV_PANLOOP) return true;
break;
case ENV_PITCH:
- if (pIns->dwFlags & ENV_PITCHLOOP) return TRUE;
+ if (pIns->dwFlags & ENV_PITCHLOOP) return true;
break;
}
}
}
- return FALSE;
+ return false;
}
-BOOL CViewInstrument::EnvGetSustain() const
+bool CViewInstrument::EnvGetSustain() const
//-----------------------------------------
{
CModDoc *pModDoc = GetDocument();
@@ -410,22 +381,22 @@
switch(m_nEnv)
{
case ENV_VOLUME:
- if (pIns->dwFlags & ENV_VOLSUSTAIN) return TRUE;
+ if (pIns->dwFlags & ENV_VOLSUSTAIN) return true;
break;
case ENV_PANNING:
- if (pIns->dwFlags & ENV_PANSUSTAIN) return TRUE;
+ if (pIns->dwFlags & ENV_PANSUSTAIN) return true;
break;
case ENV_PITCH:
- if (pIns->dwFlags & ENV_PITCHSUSTAIN) return TRUE;
+ if (pIns->dwFlags & ENV_PITCHSUSTAIN) return true;
break;
}
}
}
- return FALSE;
+ return false;
}
-BOOL CViewInstrument::EnvGetCarry() const
+bool CViewInstrument::EnvGetCarry() const
//---------------------------------------
{
CModDoc *pModDoc = GetDocument();
@@ -438,110 +409,58 @@
switch(m_nEnv)
{
case ENV_VOLUME:
- if (pIns->dwFlags & ENV_VOLCARRY) return TRUE;
+ if (pIns->dwFlags & ENV_VOLCARRY) return true;
break;
case ENV_PANNING:
- if (pIns->dwFlags & ENV_PANCARRY) return TRUE;
+ if (pIns->dwFlags & ENV_PANCARRY) return true;
break;
case ENV_PITCH:
- if (pIns->dwFlags & ENV_PITCHCARRY) return TRUE;
+ if (pIns->dwFlags & ENV_PITCHCARRY) return true;
break;
}
}
}
- return FALSE;
+ return false;
}
UINT CViewInstrument::EnvGetLoopStart() const
//-------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- switch(m_nEnv)
- {
- case ENV_VOLUME: return pIns->VolEnv.nLoopStart;
- case ENV_PANNING: return pIns->PanEnv.nLoopStart;
- case ENV_PITCH: return pIns->PitchEnv.nLoopStart;
- }
- }
- }
- return 0;
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return 0;
+ return envelope->nLoopStart;
}
UINT CViewInstrument::EnvGetLoopEnd() const
//-----------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- switch(m_nEnv)
- {
- case ENV_VOLUME: return pIns->VolEnv.nLoopEnd;
- case ENV_PANNING: return pIns->PanEnv.nLoopEnd;
- case ENV_PITCH: return pIns->PitchEnv.nLoopEnd;
- }
- }
- }
- return 0;
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return 0;
+ return envelope->nLoopEnd;
}
UINT CViewInstrument::EnvGetSustainStart() const
//----------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- switch(m_nEnv)
- {
- case ENV_VOLUME: return pIns->VolEnv.nSustainStart;
- case ENV_PANNING: return pIns->PanEnv.nSustainStart;
- case ENV_PITCH: return pIns->PitchEnv.nSustainStart;
- }
- }
- }
- return 0;
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return 0;
+ return envelope->nSustainStart;
}
UINT CViewInstrument::EnvGetSustainEnd() const
//--------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- switch(m_nEnv)
- {
- case ENV_VOLUME: return pIns->VolEnv.nSustainEnd;
- case ENV_PANNING: return pIns->PanEnv.nSustainEnd;
- case ENV_PITCH: return pIns->PitchEnv.nSustainEnd;
- }
- }
- }
- return 0;
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return 0;
+ return envelope->nSustainEnd;
}
-BOOL CViewInstrument::EnvGetVolEnv() const
+bool CViewInstrument::EnvGetVolEnv() const
//----------------------------------------
{
CModDoc *pModDoc = GetDocument();
@@ -549,13 +468,13 @@
{
CSoundFile *pSndFile = pModDoc->GetSoundFile();
MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns) return (pIns->dwFlags & ENV_VOLUME) ? TRUE : FALSE;
+ if (pIns) return (pIns->dwFlags & ENV_VOLUME) ? true : false;
}
- return FALSE;
+ return false;
}
-BOOL CViewInstrument::EnvGetPanEnv() const
+bool CViewInstrument::EnvGetPanEnv() const
//----------------------------------------
{
CModDoc *pModDoc = GetDocument();
@@ -563,13 +482,13 @@
{
CSoundFile *pSndFile = pModDoc->GetSoundFile();
MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns) return (pIns->dwFlags & ENV_PANNING) ? TRUE : FALSE;
+ if (pIns) return (pIns->dwFlags & ENV_PANNING) ? true : false;
}
- return FALSE;
+ return false;
}
-BOOL CViewInstrument::EnvGetPitchEnv() const
+bool CViewInstrument::EnvGetPitchEnv() const
//------------------------------------------
{
CModDoc *pModDoc = GetDocument();
@@ -577,13 +496,13 @@
{
CSoundFile *pSndFile = pModDoc->GetSoundFile();
MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns) return ((pIns->dwFlags & (ENV_PITCH|ENV_FILTER)) == ENV_PITCH) ? TRUE : FALSE;
+ if (pIns) return ((pIns->dwFlags & (ENV_PITCH|ENV_FILTER)) == ENV_PITCH) ? true : false;
}
- return FALSE;
+ return false;
}
-BOOL CViewInstrument::EnvGetFilterEnv() const
+bool CViewInstrument::EnvGetFilterEnv() const
//-------------------------------------------
{
CModDoc *pModDoc = GetDocument();
@@ -591,185 +510,95 @@
{
CSoundFile *pSndFile = pModDoc->GetSoundFile();
MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns) return ((pIns->dwFlags & (ENV_PITCH|ENV_FILTER)) == (ENV_PITCH|ENV_FILTER)) ? TRUE : FALSE;
+ if (pIns) return ((pIns->dwFlags & (ENV_PITCH|ENV_FILTER)) == (ENV_PITCH|ENV_FILTER)) ? true : false;
}
- return FALSE;
+ return false;
}
-BOOL CViewInstrument::EnvSetLoopStart(int nPoint)
+bool CViewInstrument::EnvSetLoopStart(int nPoint)
//-----------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if ((pModDoc) && (nPoint >= 0) && (nPoint <= (int)EnvGetLastPoint()))
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return false;
+ if(nPoint < 0 || nPoint > (int)EnvGetLastPoint()) return false;
+
+ if (nPoint != envelope->nLoopStart)
{
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- switch(m_nEnv)
- {
- case ENV_VOLUME:
- if (nPoint != pIns->VolEnv.nLoopStart)
- {
- pIns->VolEnv.nLoopStart = (BYTE)nPoint;
- if (pIns->VolEnv.nLoopEnd < nPoint) pIns->VolEnv.nLoopEnd = (BYTE)nPoint;
- return TRUE;
- }
- break;
- case ENV_PANNING:
- if (nPoint != pIns->PanEnv.nLoopStart)
- {
- pIns->PanEnv.nLoopStart = (BYTE)nPoint;
- if (pIns->PanEnv.nLoopEnd < nPoint) pIns->PanEnv.nLoopEnd = (BYTE)nPoint;
- return TRUE;
- }
- break;
- case ENV_PITCH:
- if (nPoint != pIns->PitchEnv.nLoopStart)
- {
- pIns->PitchEnv.nLoopStart = (BYTE)nPoint;
- if (pIns->PitchEnv.nLoopEnd < nPoint) pIns->PitchEnv.nLoopEnd = (BYTE)nPoint;
- return TRUE;
- }
- break;
- }
- }
+ envelope->nLoopStart = (BYTE)nPoint;
+ if (envelope->nLoopEnd < nPoint) envelope->nLoopEnd = (BYTE)nPoint;
+ return true;
+ } else
+ {
+ return false;
}
- return FALSE;
}
-BOOL CViewInstrument::EnvSetLoopEnd(int nPoint)
+bool CViewInstrument::EnvSetLoopEnd(int nPoint)
//---------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if ((pModDoc) && (nPoint >= 0) && (nPoint <= (int)EnvGetLastPoint()))
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return false;
+ if(nPoint < 0 || nPoint > (int)EnvGetLastPoint()) return false;
+
+ if (nPoint != envelope->nLoopEnd)
{
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- switch(m_nEnv)
- {
- case ENV_VOLUME:
- if (nPoint != pIns->VolEnv.nLoopEnd)
- {
- pIns->VolEnv.nLoopEnd = (BYTE)nPoint;
- if (pIns->VolEnv.nLoopStart > nPoint) pIns->VolEnv.nLoopStart = (BYTE)nPoint;
- return TRUE;
- }
- break;
- case ENV_PANNING:
- if (nPoint != pIns->PanEnv.nLoopEnd)
- {
- pIns->PanEnv.nLoopEnd = (BYTE)nPoint;
- if (pIns->PanEnv.nLoopStart > nPoint) pIns->PanEnv.nLoopStart = (BYTE)nPoint;
- return TRUE;
- }
- break;
- case ENV_PITCH:
- if (nPoint != pIns->PitchEnv.nLoopEnd)
- {
- pIns->PitchEnv.nLoopEnd = (BYTE)nPoint;
- if (pIns->PitchEnv.nLoopStart > nPoint) pIns->PitchEnv.nLoopStart = (BYTE)nPoint;
- return TRUE;
- }
- break;
- }
- }
+ envelope->nLoopEnd = (BYTE)nPoint;
+ if (envelope->nLoopStart > nPoint) envelope->nLoopStart = (BYTE)nPoint;
+ return true;
+ } else
+ {
+ return false;
}
- return FALSE;
}
-BOOL CViewInstrument::EnvSetSustainStart(int nPoint)
+bool CViewInstrument::EnvSetSustainStart(int nPoint)
//--------------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if ((pModDoc) && (nPoint >= 0) && (nPoint <= (int)EnvGetLastPoint()))
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return false;
+ if(nPoint < 0 || nPoint > (int)EnvGetLastPoint()) return false;
+
+ // We won't do any security checks here as GetEnvelopePtr() does that for us.
+ CSoundFile *pSndFile = GetDocument()->GetSoundFile();
+
+ if (nPoint != envelope->nSustainStart)
{
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- switch(m_nEnv)
- {
- case ENV_VOLUME:
- if (nPoint != pIns->VolEnv.nSustainStart)
- {
- pIns->VolEnv.nSustainStart = (BYTE)nPoint;
- if ((pIns->VolEnv.nSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->VolEnv.nSustainEnd = (BYTE)nPoint;
- return TRUE;
- }
- break;
- case ENV_PANNING:
- if (nPoint != pIns->PanEnv.nSustainStart)
- {
- pIns->PanEnv.nSustainStart = (BYTE)nPoint;
- if ((pIns->PanEnv.nSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->PanEnv.nSustainEnd = (BYTE)nPoint;
- return TRUE;
- }
- break;
- case ENV_PITCH:
- if (nPoint != pIns->PitchEnv.nSustainStart)
- {
- pIns->PitchEnv.nSustainStart = (BYTE)nPoint;
- if ((pIns->PitchEnv.nSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->PitchEnv.nSustainEnd = (BYTE)nPoint;
- return TRUE;
- }
- break;
- }
- }
+ envelope->nSustainStart = (BYTE)nPoint;
+ if ((envelope->nSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) envelope->nSustainEnd = (BYTE)nPoint;
+ return true;
+ } else
+ {
+ return false;
}
- return FALSE;
}
-BOOL CViewInstrument::EnvSetSustainEnd(int nPoint)
+bool CViewInstrument::EnvSetSustainEnd(int nPoint)
//------------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if ((pModDoc) && (nPoint >= 0) && (nPoint <= (int)EnvGetLastPoint()))
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return false;
+ if(nPoint < 0 || nPoint > (int)EnvGetLastPoint()) return false;
+
+ // We won't do any security checks here as GetEnvelopePtr() does that for us.
+ CSoundFile *pSndFile = GetDocument()->GetSoundFile();
+
+ if (nPoint != envelope->nSustainEnd)
{
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- switch(m_nEnv)
- {
- case ENV_VOLUME:
- if (nPoint != pIns->VolEnv.nSustainEnd)
- {
- pIns->VolEnv.nSustainEnd = (BYTE)nPoint;
- if ((pIns->VolEnv.nSustainStart > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->VolEnv.nSustainStart = (BYTE)nPoint;
- return TRUE;
- }
- break;
- case ENV_PANNING:
- if (nPoint != pIns->PanEnv.nSustainEnd)
- {
- pIns->PanEnv.nSustainEnd = (BYTE)nPoint;
- if ((pIns->PanEnv.nSustainStart > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->PanEnv.nSustainStart = (BYTE)nPoint;
- return TRUE;
- }
- break;
- case ENV_PITCH:
- if (nPoint != pIns->PitchEnv.nSustainEnd)
- {
- pIns->PitchEnv.nSustainEnd = (BYTE)nPoint;
- if ((pIns->PitchEnv.nSustainStart > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->PitchEnv.nSustainStart = (BYTE)nPoint;
- return TRUE;
- }
- break;
- }
- }
+ envelope->nSustainEnd = (BYTE)nPoint;
+ if ((envelope->nSustainStart > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) envelope->nSustainStart = (BYTE)nPoint;
+ return true;
+ } else
+ {
+ return false;
}
- return FALSE;
}
-BOOL CViewInstrument::EnvSetLoop(BOOL bLoop)
+bool CViewInstrument::EnvSetLoop(bool bLoop)
//------------------------------------------
{
CModDoc *pModDoc = GetDocument();
@@ -786,29 +615,29 @@
case ENV_PANNING: dwMask = ENV_PANLOOP; break;
case ENV_PITCH: dwMask = ENV_PITCHLOOP; break;
}
- if (!dwMask) return FALSE;
+ if (!dwMask) return false;
if (bLoop)
{
if (!(pIns->dwFlags & dwMask))
{
pIns->dwFlags |= dwMask;
- return TRUE;
+ return true;
}
} else
{
if (pIns->dwFlags & dwMask)
{
pIns->dwFlags &= ~dwMask;
- return TRUE;
+ return true;
}
}
}
}
- return FALSE;
+ return false;
}
-BOOL CViewInstrument::EnvSetSustain(BOOL bSustain)
+bool CViewInstrument::EnvSetSustain(bool bSustain)
//------------------------------------------------
{
CModDoc *pModDoc = GetDocument();
@@ -825,29 +654,29 @@
case ENV_PANNING: dwMask = ENV_PANSUSTAIN; break;
case ENV_PITCH: dwMask = ENV_PITCHSUSTAIN; break;
}
- if (!dwMask) return FALSE;
+ if (!dwMask) return false;
if (bSustain)
{
if (!(pIns->dwFlags & dwMask))
{
pIns->dwFlags |= dwMask;
- return TRUE;
+ return true;
}
} else
{
if (pIns->dwFlags & dwMask)
{
pIns->dwFlags &= ~dwMask;
- return TRUE;
+ return true;
}
}
}
}
- return FALSE;
+ return false;
}
-BOOL CViewInstrument::EnvSetCarry(BOOL bCarry)
+bool CViewInstrument::EnvSetCarry(bool bCarry)
//--------------------------------------------
{
CModDoc *pModDoc = GetDocument();
@@ -864,29 +693,29 @@
case ENV_PANNING: dwMask = ENV_PANCARRY; break;
case ENV_PITCH: dwMask = ENV_PITCHCARRY; break;
}
- if (!dwMask) return FALSE;
+ if (!dwMask) return false;
if (bCarry)
{
if (!(pIns->dwFlags & dwMask))
{
pIns->dwFlags |= dwMask;
- return TRUE;
+ return true;
}
} else
{
if (pIns->dwFlags & dwMask)
{
pIns->dwFlags &= ~dwMask;
- return TRUE;
+ return true;
}
}
}
}
- return FALSE;
+ return false;
}
-BOOL CViewInstrument::EnvSetVolEnv(BOOL bEnable)
+bool CViewInstrument::EnvSetVolEnv(bool bEnable)
//----------------------------------------------
{
CModDoc *pModDoc = GetDocument();
@@ -912,14 +741,14 @@
{
pIns->dwFlags &= ~ENV_VOLUME;
}
- return TRUE;
+ return true;
}
}
- return FALSE;
+ return false;
}
-BOOL CViewInstrument::EnvSetPanEnv(BOOL bEnable)
+bool CViewInstrument::EnvSetPanEnv(bool bEnable)
//----------------------------------------------
{
CModDoc *pModDoc = GetDocument();
@@ -945,14 +774,14 @@
{
pIns->dwFlags &= ~ENV_PANNING;
}
- return TRUE;
+ return true;
}
}
- return FALSE;
+ return false;
}
-BOOL CViewInstrument::EnvSetPitchEnv(BOOL bEnable)
+bool CViewInstrument::EnvSetPitchEnv(bool bEnable)
//------------------------------------------------
{
CModDoc *pModDoc = GetDocument();
@@ -979,14 +808,14 @@
{
pIns->dwFlags &= ~(ENV_PITCH|ENV_FILTER);
}
- return TRUE;
+ return true;
}
}
- return FALSE;
+ return false;
}
-BOOL CViewInstrument::EnvSetFilterEnv(BOOL bEnable)
+bool CViewInstrument::EnvSetFilterEnv(bool bEnable)
//-------------------------------------------------
{
CModDoc *pModDoc = GetDocument();
@@ -1012,10 +841,10 @@
{
pIns->dwFlags &= ~(ENV_PITCH|ENV_FILTER);
}
- return TRUE;
+ return true;
}
}
- return FALSE;
+ return false;
}
@@ -1351,72 +1180,27 @@
}
BYTE CViewInstrument::EnvGetReleaseNode()
-//--------------------------------------
+//---------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc) {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns) {
- switch(m_nEnv) {
- case ENV_VOLUME:
- return pIns->VolEnv.nReleaseNode;
- case ENV_PANNING:
- return pIns->PanEnv.nReleaseNode;
- case ENV_PITCH:
- return pIns->PitchEnv.nReleaseNode;
- default:
- return ENV_RELEASE_NODE_UNSET;
- }
- }
- }
- return ENV_RELEASE_NODE_UNSET;
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return ENV_RELEASE_NODE_UNSET;
+ return envelope->nReleaseNode;
}
WORD CViewInstrument::EnvGetReleaseNodeValue()
-//--------------------------------------
+//--------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc) {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns) {
- switch(m_nEnv) {
- case ENV_VOLUME:
- return pIns->VolEnv.Values[EnvGetReleaseNode()];
- case ENV_PANNING:
- return pIns->PanEnv.Values[EnvGetReleaseNode()];
- case ENV_PITCH:
- return pIns->PitchEnv.Values[EnvGetReleaseNode()];
- default:
- return 0;
- }
- }
- }
- return 0;
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return 0;
+ return envelope->Values[EnvGetReleaseNode()];
}
WORD CViewInstrument::EnvGetReleaseNodeTick()
-//--------------------------------------
+//-------------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc) {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns) {
- switch(m_nEnv) {
- case ENV_VOLUME:
- return pIns->VolEnv.Ticks[EnvGetReleaseNode()];
- case ENV_PANNING:
- return pIns->PanEnv.Ticks[EnvGetReleaseNode()];
- case ENV_PITCH:
- return pIns->PitchEnv.Ticks[EnvGetReleaseNode()];
- default:
- return 0;
- }
- }
- }
- return 0;
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return 0;
+ return envelope->Ticks[EnvGetReleaseNode()];
}
@@ -1914,6 +1698,14 @@
SetCapture();
m_dwStatus |= INSSTATUS_DRAGGING;
}
+ else
+ {
+ if(CMainFrame::GetMainFrame()->GetInputHandler()->ShiftPressed())
+ {
+ m_ptMenu = pt;
+ OnEnvInsertPoint();
+ }
+ }
}
}
@@ -2054,29 +1846,16 @@
{
CSoundFile *pSndFile = pModDoc->GetSoundFile();
MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- switch(m_nEnv) {
- case ENV_VOLUME:
- if (pIns->VolEnv.nReleaseNode == node) {
- pIns->VolEnv.nReleaseNode = ENV_RELEASE_NODE_UNSET;
- } else {
- pIns->VolEnv.nReleaseNode = node;
- }
- break;
- case ENV_PANNING:
- if (pIns->PanEnv.nReleaseNode == node) {
- pIns->PanEnv.nReleaseNode = ENV_RELEASE_NODE_UNSET;
- } else {
- pIns->PanEnv.nReleaseNode = node;
- }
- break;
- case ENV_PITCH:
- if (pIns->PitchEnv.nReleaseNode == node) {
- pIns->PitchEnv.nReleaseNode = ENV_RELEASE_NODE_UNSET;
- } else {
- pIns->PitchEnv.nReleaseNode = node;
- }
- break;
+
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return;
+
+ if (envelope->nReleaseNode == node) {
+ envelope->nReleaseNode = ENV_RELEASE_NODE_UNSET;
+ } else {
+ envelope->nReleaseNode = node;
}
+
pModDoc->SetModified();
InvalidateRect(NULL, FALSE);
}
@@ -2154,73 +1933,27 @@
MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
if (pIns)
{
- BOOL bOk = FALSE;
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr || envelope->nNodes == 0) return;
+
UINT nPoint = m_nDragItem - 1;
- switch(m_nEnv)
+
+ envelope->nNodes--;
+ for (UINT i=nPoint; i<envelope->nNodes; i++)
{
- case ENV_VOLUME:
- if (pIns->VolEnv.nNodes > 1)
- {
- pIns->VolEnv.nNodes--;
- for (UINT i=nPoint; i<pIns->VolEnv.nNodes; i++)
- {
- pIns->VolEnv.Ticks[i] = pIns->VolEnv.Ticks[i+1];
- pIns->VolEnv.Values[i] = pIns->VolEnv.Values[i+1];
- }
- if (nPoint >= pIns->VolEnv.nNodes) nPoint = pIns->VolEnv.nNodes-1;
- if (pIns->VolEnv.nLoopStart > nPoint) pIns->VolEnv.nLoopStart--;
- if (pIns->VolEnv.nLoopEnd > nPoint) pIns->VolEnv.nLoopEnd--;
- if (pIns->VolEnv.nSustainStart > nPoint) pIns->VolEnv.nSustainStart--;
- if (pIns->VolEnv.nSustainEnd > nPoint) pIns->VolEnv.nSustainEnd--;
- if (pIns->VolEnv.nReleaseNode>nPoint && pIns->VolEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->VolEnv.nReleaseNode--;
- pIns->VolEnv.Ticks[0] = 0;
- bOk = TRUE;
- }
- break;
- case ENV_PANNING:
- if (pIns->PanEnv.nNodes > 1)
- {
- pIns->PanEnv.nNodes--;
- for (UINT i=nPoint; i<pIns->PanEnv.nNodes; i++)
- {
- pIns->PanEnv.Ticks[i] = pIns->PanEnv.Ticks[i+1];
- pIns->PanEnv.Values[i] = pIns->PanEnv.Values[i+1];
- }
- if (nPoint >= pIns->PanEnv.nNodes) nPoint = pIns->PanEnv.nNodes-1;
- if (pIns->PanEnv.nLoopStart > nPoint) pIns->PanEnv.nLoopStart--;
- if (pIns->PanEnv.nLoopEnd > nPoint) pIns->PanEnv.nLoopEnd--;
- if (pIns->PanEnv.nSustainStart > nPoint) pIns->PanEnv.nSustainStart--;
- if (pIns->PanEnv.nSustainEnd > nPoint) pIns->PanEnv.nSustainEnd--;
- if (pIns->PanEnv.nReleaseNode>nPoint && pIns->PanEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->PanEnv.nReleaseNode--;
- pIns->PanEnv.Ticks[0] = 0;
- bOk = TRUE;
- }
- break;
- case ENV_PITCH:
- if (pIns->PitchEnv.nNodes > 1)
- {
- pIns->PitchEnv.nNodes--;
- for (UINT i=nPoint; i<pIns->PitchEnv.nNodes; i++)
- {
- pIns->PitchEnv.Ticks[i] = pIns->PitchEnv.Ticks[i+1];
- pIns->PitchEnv.Values[i] = pIns->PitchEnv.Values[i+1];
- }
- if (nPoint >= pIns->PitchEnv.nNodes) nPoint = pIns->PitchEnv.nNodes-1;
- if (pIns->PitchEnv.nLoopStart > nPoint) pIns->PitchEnv.nLoopStart--;
- if (pIns->PitchEnv.nLoopEnd > nPoint) pIns->PitchEnv.nLoopEnd--;
- if (pIns->PitchEnv.nSustainStart > nPoint) pIns->PitchEnv.nSustainStart--;
- if (pIns->PitchEnv.nSustainEnd > nPoint) pIns->PitchEnv.nSustainEnd--;
- if (pIns->PitchEnv.nReleaseNode>nPoint && pIns->PitchEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->PitchEnv.nReleaseNode--;
- pIns->PitchEnv.Ticks[0] = 0;
- bOk = TRUE;
- }
- break;
+ envelope->Ticks[i] = envelope->Ticks[i + 1];
+ envelope->Values[i] = envelope->Values[i + 1];
}
- if (bOk)
- {
- pModDoc->SetModified();
- pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL);
- }
+ if (nPoint >= envelope->nNodes) nPoint = envelope->nNodes-1;
+ if (envelope->nLoopStart > nPoint) envelope->nLoopStart--;
+ if (envelope->nLoopEnd > nPoint) envelope->nLoopEnd--;
+ if (envelope->nSustainStart > nPoint) envelope->nSustainStart--;
+ if (envelope->nSustainEnd > nPoint) envelope->nSustainEnd--;
+ if (envelope->nReleaseNode>nPoint && envelope->nReleaseNode!=ENV_RELEASE_NODE_UNSET) envelope->nReleaseNode--;
+ envelope->Ticks[0] = 0;
+
+ pModDoc->SetModified();
+ pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL);
}
}
}
@@ -2236,100 +1969,58 @@
MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
if (pIns)
{
- BOOL bOk = FALSE;
int nTick = ScreenToTick(m_ptMenu.x);
int nValue = ScreenToValue(m_ptMenu.y);
+ if(nTick < 0) return;
+
UINT maxpoints = (pSndFile->m_nType == MOD_TYPE_XM) ? 12 : 25;
//To check: Should there be MAX_ENVPOINTS?
- if (nValue < 0) nValue = 0;
- if (nValue > 64) nValue = 64;
- if (nTick >= 0) switch(m_nEnv)
+ nValue = CLAMP(nValue, 0, 64);
+
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return;
+ BYTE cDefaultValue;
+
+ switch(m_nEnv)
{
- case ENV_VOLUME:
- if (pIns->VolEnv.nNodes < maxpoints)
+ case ENV_VOLUME:
+ cDefaultValue = 64;
+ break;
+ case ENV_PANNING:
+ cDefaultValue = 32;
+ break;
+ case ENV_PITCH:
+ cDefaultValue = (pIns->dwFlags & ENV_FILTER) ? 64 : 32;
+ break;
+ default:
+ return;
+ }
+
+ if (envelope->nNodes < maxpoints)
+ {
+ if (!envelope->nNodes)
{
- if (!pIns->VolEnv.nNodes)
- {
- pIns->VolEnv.Ticks[0] = 0;
- pIns->VolEnv.Values[0] = 64;
- pIns->VolEnv.nNodes = 1;
- }
- UINT i = 0;
- for (i=0; i<pIns->VolEnv.nNodes; i++) if (nTick <= pIns->VolEnv.Ticks[i]) break;
- for (UINT j=pIns->VolEnv.nNodes; j>i; j--)
- {
- pIns->VolEnv.Ticks[j] = pIns->VolEnv.Ticks[j-1];
- pIns->VolEnv.Values[j] = pIns->VolEnv.Values[j-1];
- }
- pIns->VolEnv.Ticks[i] = (WORD)nTick;
- pIns->VolEnv.Values[i] = (BYTE)nValue;
- pIns->VolEnv.nNodes++;
- if (pIns->VolEnv.nLoopStart >= i) pIns->VolEnv.nLoopStart++;
- if (pIns->VolEnv.nLoopEnd >= i) pIns->VolEnv.nLoopEnd++;
- if (pIns->VolEnv.nSustainStart >= i) pIns->VolEnv.nSustainStart++;
- if (pIns->VolEnv.nSustainEnd >= i) pIns->VolEnv.nSustainEnd++;
- if (pIns->VolEnv.nReleaseNode>=i && pIns->VolEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->VolEnv.nReleaseNode++;
- bOk = TRUE;
+ envelope->Ticks[0] = 0;
+ envelope->Values[0] = cDefaultValue;
+ envelope->nNodes = 1;
}
- break;
- case ENV_PANNING:
- if (pIns->PanEnv.nNodes < maxpoints)
+ UINT i = 0;
+ for (i = 0; i < envelope->nNodes; i++) if (nTick <= envelope->Ticks[i]) break;
+ for (UINT j = envelope->nNodes; j > i; j--)
{
- if (!pIns->PanEnv.nNodes)
- {
- pIns->PanEnv.Ticks[0] = 0;
- pIns->PanEnv.Values[0] = 32;
- pIns->PanEnv.nNodes = 1;
- }
- UINT i = 0;
- for (i=0; i<pIns->PanEnv.nNodes; i++) if (nTick <= pIns->PanEnv.Ticks[i]) break;
- for (UINT j=pIns->PanEnv.nNodes; j>i; j--)
- {
- pIns->PanEnv.Ticks[j] = pIns->PanEnv.Ticks[j-1];
- pIns->PanEnv.Values[j] = pIns->PanEnv.Values[j-1];
- }
- pIns->PanEnv.Ticks[i] = (WORD)nTick;
- pIns->PanEnv.Values[i] =(BYTE)nValue;
- pIns->PanEnv.nNodes++;
- if (pIns->PanEnv.nLoopStart >= i) pIns->PanEnv.nLoopStart++;
- if (pIns->PanEnv.nLoopEnd >= i) pIns->PanEnv.nLoopEnd++;
- if (pIns->PanEnv.nSustainStart >= i) pIns->PanEnv.nSustainStart++;
- if (pIns->PanEnv.nSustainEnd >= i) pIns->PanEnv.nSustainEnd++;
- if (pIns->PanEnv.nReleaseNode>=i && pIns->PanEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->PanEnv.nReleaseNode++;
- bOk = TRUE;
+ envelope->Ticks[j] = envelope->Ticks[j - 1];
+ envelope->Values[j] = envelope->Values[j - 1];
}
- break;
- case ENV_PITCH:
- if (pIns->PitchEnv.nNodes < maxpoints)
- {
- if (!pIns->PitchEnv.nNodes)
- {
- pIns->PitchEnv.Ticks[0] = 0;
- pIns->PitchEnv.Values[0] = 32;
- pIns->PitchEnv.nNodes = 1;
- }
- UINT i = 0;
- for (i=0; i<pIns->PitchEnv.nNodes; i++) if (nTick <= pIns->PitchEnv.Ticks[i]) break;
- for (UINT j=pIns->PitchEnv.nNodes; j>i; j--)
- {
- pIns->PitchEnv.Ticks[j] = pIns->PitchEnv.Ticks[j-1];
- pIns->PitchEnv.Values[j] = pIns->PitchEnv.Values[j-1];
- }
- pIns->PitchEnv.Ticks[i] = (WORD)nTick;
- pIns->PitchEnv.Values[i] = (BYTE)nValue;
- pIns->PitchEnv.nNodes++;
- if (pIns->PitchEnv.nLoopStart >= i) pIns->PitchEnv.nLoopStart++;
- if (pIns->PitchEnv.nLoopEnd >= i) pIns->PitchEnv.nLoopEnd++;
- if (pIns->PitchEnv.nSustainStart >= i) pIns->PitchEnv.nSustainStart++;
- if (pIns->PitchEnv.nSustainEnd >= i) pIns->PitchEnv.nSustainEnd++;
- if (pIns->PitchEnv.nReleaseNode>=i && pIns->PitchEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->PitchEnv.nReleaseNode++;
- bOk = TRUE;
- }
- break;
- }
- if (bOk)
- {
+ envelope->Ticks[i] = (WORD)nTick;
+ envelope->Values[i] = (BYTE)nValue;
+ envelope->nNodes++;
+ if (envelope->nLoopStart >= i) envelope->nLoopStart++;
+ if (envelope->nLoopEnd >= i) envelope->nLoopEnd++;
+ if (envelope->nSustainStart >= i) envelope->nSustainStart++;
+ if (envelope->nSustainEnd >= i) envelope->nSustainEnd++;
+ if (envelope->nReleaseNode >= i && envelope->nReleaseNode != ENV_RELEASE_NODE_UNSET) envelope->nReleaseNode++;
+
pModDoc->SetModified();
pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL);
}
@@ -2719,3 +2410,34 @@
}
+
+INSTRUMENTENVELOPE *CViewInstrument::GetEnvelopePtr() const
+//---------------------------------------------------------
+{
+ // Get a pointer to the currently selected envelope.
+ // First do some standard checks...
+ CModDoc *pModDoc = GetDocument();
+ if(pModDoc == nullptr) return nullptr;
+ CSoundFile *pSndFile = pModDoc->GetSoundFile();
+ if(pSndFile == nullptr) return nullptr;
+ MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
+ if(pIns == nullptr) return nullptr;
+
+ // Now for the real thing.
+ INSTRUMENTENVELOPE *envelope = nullptr;
+
+ switch(m_nEnv)
+ {
+ case ENV_VOLUME:
+ envelope = &pIns->VolEnv;
+ break;
+ case ENV_PANNING:
+ envelope = &pIns->PanEnv;
+ break;
+ case ENV_PITCH:
+ envelope = &pIns->PitchEnv;
+ break;
+ }
+
+ return envelope;
+}
Modified: trunk/OpenMPT/mptrack/View_ins.h
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.h 2009-08-18 20:38:41 UTC (rev 332)
+++ trunk/OpenMPT/mptrack/View_ins.h 2009-08-18 23:06:08 UTC (rev 333)
@@ -41,6 +41,7 @@
public:
void UpdateScrollSize();
BOOL SetCurrentInstrument(UINT nIns, UINT m_nEnv=0);
+ INSTRUMENTENVELOPE *GetEnvelopePtr() const;
UINT EnvGetTick(int nPoint) const;
UINT EnvGetValue(int nPoint) const;
UINT EnvGetLastPoint() const;
@@ -49,25 +50,25 @@
UINT EnvGetLoopEnd() const;
UINT EnvGetSustainStart() const;
UINT EnvGetSustainEnd() const;
- BOOL EnvGetLoop() const;
- BOOL EnvGetSustain() const;
- BOOL EnvGetCarry() const;
- BOOL EnvGetVolEnv() const;
- BOOL EnvGetPanEnv() const;
- BOOL EnvGetPitchEnv() const;
- BOOL EnvGetFilterEnv() const;
- BOOL EnvSetValue(int nPoint, int nTick=-1, int nValue=-1);
- BOOL EnvSetLoopStart(int nPoint);
- BOOL EnvSetLoopEnd(int nPoint);
- BOOL EnvSetSustainStart(int nPoint);
- BOOL EnvSetSustainEnd(int nPoint);
- BOOL EnvSetLoop(BOOL bLoop);
- BOOL EnvSetSustain(BOOL bSustain);
- BOOL EnvSetCarry(BOOL bCarry);
- BOOL EnvSetVolEnv(BOOL bEnable);
- BOOL EnvSetPanEnv(BOOL bEnable);
- BOOL EnvSetPitchEnv(BOOL bEnable);
- BOOL EnvSetFilterEnv(BOOL bEnable);
+ bool EnvGetLoop() const;
+ bool EnvGetSustain() const;
+ bool EnvGetCarry() const;
+ bool EnvGetVolEnv() const;
+ bool EnvGetPanEnv() const;
+ bool EnvGetPitchEnv() const;
+ bool EnvGetFilterEnv() const;
+ bool EnvSetValue(int nPoint, int nTick=-1, int nValue=-1);
+ bool EnvSetLoopStart(int nPoint);
+ bool EnvSetLoopEnd(int nPoint);
+ bool EnvSetSustainStart(int nPoint);
+ bool EnvSetSustainEnd(int nPoint);
+ bool EnvSetLoop(bool bLoop);
+ bool EnvSetSustain(bool bSustain);
+ bool EnvSetCarry(bool bCarry);
+ bool EnvSetVolEnv(bool bEnable);
+ bool EnvSetPanEnv(bool bEnable);
+ bool EnvSetPitchEnv(bool bEnable);
+ bool EnvSetFilterEnv(bool bEnable);
int TickToScreen(int nTick) const;
int PointToScreen(int nPoint) const;
int ScreenToTick(int x) const;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <rel...@us...> - 2009-08-18 20:38:58
|
Revision: 332
http://modplug.svn.sourceforge.net/modplug/?rev=332&view=rev
Author: relabsoluness
Date: 2009-08-18 20:38:41 +0000 (Tue, 18 Aug 2009)
Log Message:
-----------
[Mod] Default keybindings and tunings are now loaded from resources.
[Ref] Some related tweaks and renaming.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/CommandSet.cpp
trunk/OpenMPT/mptrack/CommandSet.h
trunk/OpenMPT/mptrack/Ctrl_ins.cpp
trunk/OpenMPT/mptrack/InputHandler.cpp
trunk/OpenMPT/mptrack/Stdafx.h
trunk/OpenMPT/mptrack/misc_util.cpp
trunk/OpenMPT/mptrack/misc_util.h
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/mptrack.vcproj
trunk/OpenMPT/mptrack/mptrack_08.vcproj
trunk/OpenMPT/mptrack/resource.h
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
Added Paths:
-----------
trunk/OpenMPT/mptrack/res/built-inTunings.tc
trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb
Removed Paths:
-------------
trunk/OpenMPT/mptrack/bin/tunings/
trunk/OpenMPT/packageTemplate/default.mkb
trunk/OpenMPT/packageTemplate/tunings/
Modified: trunk/OpenMPT/mptrack/CommandSet.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.cpp 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/mptrack/CommandSet.cpp 2009-08-18 20:38:41 UTC (rev 332)
@@ -2,8 +2,10 @@
#include "stdafx.h"
#include ".\commandset.h"
+#include "resource.h"
#include <stdio.h>
#include <stdlib.h>
+#include <fstream>
#define ENABLE_LOGGING 0
@@ -3074,7 +3076,7 @@
if( (outStream = fopen( fileName, "w" )) == NULL )
{
- ::MessageBox(NULL, "Can't open file for writing.", "", MB_ICONEXCLAMATION|MB_OK);
+ AfxMessageBox(IDS_CANT_OPEN_FILE_FOR_WRITING, MB_ICONEXCLAMATION|MB_OK);
return false;
}
fprintf(outStream, "//-------- OpenMPT key binding definition file -------\n");
@@ -3111,10 +3113,9 @@
return true;
}
-bool CCommandSet::LoadFile(CString fileName)
+
+bool CCommandSet::LoadFile(std::istream& iStrm, LPCTSTR szFilename)
{
-
- FILE *inStream;
KeyCombination kc;
CommandID cmd=kcNumCommands;
char s[1024];
@@ -3124,17 +3125,8 @@
int l=0;
pTempCS = new CCommandSet();
-
-
- if( (inStream = fopen( fileName, "r" )) == NULL )
- {
- ::MessageBox(NULL, "Can't open file keyboard config file " + fileName + " for reading.", "", MB_ICONEXCLAMATION|MB_OK);
- delete pTempCS;
- return false;
- }
-
int errorCount=0;
- while(fgets(s,1024,inStream))
+ while(iStrm.getline(s, sizeof(s)))
{
//::MessageBox(NULL, s, "", MB_ICONEXCLAMATION|MB_OK);
curLine = s;
@@ -3189,7 +3181,7 @@
errorCount++;
CString err;
if (errorCount<10) {
- err.Format("Line %d in key binding file %s was not understood.", l, fileName);
+ err.Format("Line %d in key binding file %s was not understood.", l, szFilename);
if(s_bShowErrorOnUnknownKeybinding) ::MessageBox(NULL, err, "", MB_ICONEXCLAMATION|MB_OK);
Log(err);
} else if (errorCount==10) {
@@ -3214,6 +3206,19 @@
return true;
}
+bool CCommandSet::LoadFile(CString fileName)
+{
+ std::ifstream fin(fileName);
+ if (fin.fail())
+ {
+ CString strMsg;
+ AfxFormatString1(strMsg, IDS_CANT_OPEN_KEYBINDING_FILE, fileName);
+ AfxMessageBox(strMsg, MB_ICONEXCLAMATION|MB_OK);
+ return false;
+ }
+ else
+ return LoadFile(fin, fileName);
+}
//Could do better search algo but this is not perf critical.
Modified: trunk/OpenMPT/mptrack/CommandSet.h
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.h 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/mptrack/CommandSet.h 2009-08-18 20:38:41 UTC (rev 332)
@@ -1101,6 +1101,7 @@
void GenKeyMap(KeyMap &km); // Generate a keymap from this command set
bool SaveFile(CString FileName, bool debug);
bool LoadFile(CString FileName);
+ bool LoadFile(std::istream& iStrm, LPCTSTR szFilename);
static DWORD GetKeymapLabel(InputTargetContext ctx, UINT mod, UINT code, KeyEventType ke);
Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-18 20:38:41 UTC (rev 332)
@@ -2553,11 +2553,11 @@
sel -= 1;
CTuningCollection* tc = 0;
- if(sel < CSoundFile::GetStandardTunings().GetNumTunings())
- tc = &CSoundFile::GetStandardTunings();
+ if(sel < CSoundFile::GetBuiltInTunings().GetNumTunings())
+ tc = &CSoundFile::GetBuiltInTunings();
else
{
- sel -= CSoundFile::GetStandardTunings().GetNumTunings();
+ sel -= CSoundFile::GetBuiltInTunings().GetNumTunings();
if(sel < CSoundFile::GetLocalTunings().GetNumTunings())
tc = &CSoundFile::GetLocalTunings();
else
@@ -2581,7 +2581,7 @@
//Case: Chosen tuning editor to be displayed.
//Creating vector for the CTuningDialog.
vector<CTuningCollection*> v;
- v.push_back(&m_pSndFile->GetStandardTunings());
+ v.push_back(&m_pSndFile->GetBuiltInTunings());
v.push_back(&m_pSndFile->GetLocalTunings());
v.push_back(&m_pSndFile->GetTuneSpecificTunings());
CTuningDialog td(this, v, pInstH->pTuning);
@@ -2618,9 +2618,9 @@
return;
}
- for(size_t i = 0; i < CSoundFile::GetStandardTunings().GetNumTunings(); i++)
+ for(size_t i = 0; i < CSoundFile::GetBuiltInTunings().GetNumTunings(); i++)
{
- if(pIns->pTuning == &CSoundFile::GetStandardTunings().GetTuning(i))
+ if(pIns->pTuning == &CSoundFile::GetBuiltInTunings().GetTuning(i))
{
m_ComboTuning.SetCurSel(i+1);
return;
@@ -2631,7 +2631,7 @@
{
if(pIns->pTuning == &CSoundFile::GetLocalTunings().GetTuning(i))
{
- m_ComboTuning.SetCurSel(i+CSoundFile::GetStandardTunings().GetNumTunings()+1);
+ m_ComboTuning.SetCurSel(i+CSoundFile::GetBuiltInTunings().GetNumTunings()+1);
return;
}
}
@@ -2640,7 +2640,7 @@
{
if(pIns->pTuning == &m_pSndFile->GetTuneSpecificTunings().GetTuning(i))
{
- m_ComboTuning.SetCurSel(i+CSoundFile::GetStandardTunings().GetNumTunings() + CSoundFile::GetLocalTunings().GetNumTunings()+1);
+ m_ComboTuning.SetCurSel(i+CSoundFile::GetBuiltInTunings().GetNumTunings() + CSoundFile::GetLocalTunings().GetNumTunings()+1);
return;
}
}
@@ -2792,9 +2792,9 @@
m_ComboTuning.DeleteString(0);
m_ComboTuning.AddString("OMPT IT behavior"); //<-> Instrument pTuning pointer == NULL
- for(size_t i = 0; i<CSoundFile::GetStandardTunings().GetNumTunings(); i++)
+ for(size_t i = 0; i<CSoundFile::GetBuiltInTunings().GetNumTunings(); i++)
{
- m_ComboTuning.AddString(CSoundFile::GetStandardTunings().GetTuning(i).GetName().c_str());
+ m_ComboTuning.AddString(CSoundFile::GetBuiltInTunings().GetTuning(i).GetName().c_str());
}
for(size_t i = 0; i<CSoundFile::GetLocalTunings().GetNumTunings(); i++)
{
Modified: trunk/OpenMPT/mptrack/InputHandler.cpp
===================================================================
--- trunk/OpenMPT/mptrack/InputHandler.cpp 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/mptrack/InputHandler.cpp 2009-08-18 20:38:41 UTC (rev 332)
@@ -8,6 +8,8 @@
#include "mainfrm.h"
#include <direct.h>
#include ".\inputhandler.h"
+#include <strstream>
+#include <Shlwapi.h>
#define TRANSITIONBIT 0x8000
#define REPEATBIT 0x4000
@@ -21,17 +23,43 @@
activeCommandSet = new CCommandSet();
CCommandSet::s_bShowErrorOnUnknownKeybinding = (CMainFrame::GetMainFrame()->GetPrivateProfileLong("Misc", "ShowErrorOnUnknownKeybinding", 1, theApp.GetConfigFileName()) != 0);
- CString workingDir;
- char wd[255];
- _getdcwd(_getdrive(), wd, 255);
- workingDir = wd;
- if (!CMainFrame::m_szKbdFile[0]) {
- strcpy(CMainFrame::m_szKbdFile, workingDir + "\\default.mkb");
- }
- if (!(activeCommandSet->LoadFile(CMainFrame::m_szKbdFile))) {
- if (!(activeCommandSet->LoadFile(workingDir + "\\default.mkb"))) {
- AfxMessageBox("Warning! OpenMPT has not been able to locate a keymap file. Please locate one in the settings.\r\nUntil you do so, the keyboard will not work in OpenMPT.");
+ CString sDefaultPath = CMainFrame::m_csExecutableDirectoryPath + TEXT("Keybindings.mkb");
+ if (sDefaultPath.GetLength() > MAX_PATH - 1)
+ sDefaultPath = "";
+
+ const bool bNoExistingKbdFileSetting = (CMainFrame::m_szKbdFile[0] == 0);
+
+ // 1. Try to load keybindings from the path saved in the settings.
+ // 2. If the setting doesn't exist or the loading fails, try to load from default location.
+ // 3. If neither one of these worked, load default keybindings from resources.
+ // 4. If there were no keybinging setting already, create a keybinding file to default location
+ // and set it's path to settings.
+
+ if (bNoExistingKbdFileSetting || !(activeCommandSet->LoadFile(CMainFrame::m_szKbdFile)))
+ {
+ if (bNoExistingKbdFileSetting)
+ _tcscpy(CMainFrame::m_szKbdFile, sDefaultPath);
+ bool bSuccess = false;
+ if (PathFileExists(sDefaultPath) == TRUE)
+ bSuccess = activeCommandSet->LoadFile(sDefaultPath);
+ if (bSuccess == false)
+ {
+ // Load keybindings from resources.
+ Log("Loading keybindings from resources\n");
+ const char* pData = nullptr;
+ HGLOBAL hglob = nullptr;
+ size_t nSize = 0;
+ if (LoadResource(MAKEINTRESOURCE(IDR_DEFAULT_KEYBINDINGS), TEXT("KEYBINDINGS"), pData, nSize, hglob) != nullptr)
+ {
+ std::istrstream iStrm(pData, nSize);
+ bSuccess = activeCommandSet->LoadFile(iStrm, TEXT("\"executable resource\""));
+ FreeResource(hglob);
+ if (bSuccess && bNoExistingKbdFileSetting)
+ activeCommandSet->SaveFile(CMainFrame::m_szKbdFile, false);
+ }
}
+ if (bSuccess == false)
+ AfxMessageBox(IDS_UNABLE_TO_LOAD_KEYBINDINGS, MB_ICONERROR);
}
//Get Keymap
@@ -148,7 +176,7 @@
inp[0].type = inp[1].type = INPUT_KEYBOARD;
inp[0].ki.time = inp[1].ki.time = 0;
inp[0].ki.dwExtraInfo = inp[0].ki.dwExtraInfo = 0;
- inp[0].ki.wVk = inp[1].ki.wVk = nChar;
+ inp[0].ki.wVk = inp[1].ki.wVk = static_cast<WORD>(nChar);
inp[0].ki.wScan = inp[1].ki.wScan = 0;
inp[0].ki.dwFlags = KEYEVENTF_KEYUP;
inp[1].ki.dwFlags = 0;
@@ -339,12 +367,12 @@
bool CInputHandler::CtrlPressed(void)
{
- return (modifierMask & HOTKEYF_CONTROL);
+ return ((modifierMask & HOTKEYF_CONTROL) != 0);
}
bool CInputHandler::AltPressed(void)
{
- return (modifierMask & HOTKEYF_ALT);
+ return ((modifierMask & HOTKEYF_ALT) != 0);
}
void CInputHandler::Bypass(bool b)
Modified: trunk/OpenMPT/mptrack/Stdafx.h
===================================================================
--- trunk/OpenMPT/mptrack/Stdafx.h 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/mptrack/Stdafx.h 2009-08-18 20:38:41 UTC (rev 332)
@@ -50,6 +50,10 @@
//#include <afxdhtml.h>
#pragma warning(default:4201)
+#include <string>
+#include <fstream>
+#include <strstream>
+
#ifndef OFN_FORCESHOWHIDDEN
#define OFN_FORCESHOWHIDDEN 0x10000000
#endif
Modified: trunk/OpenMPT/mptrack/misc_util.cpp
===================================================================
--- trunk/OpenMPT/mptrack/misc_util.cpp 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/mptrack/misc_util.cpp 2009-08-18 20:38:41 UTC (rev 332)
@@ -1,3 +1,31 @@
#include "stdafx.h"
#include "misc_util.h"
+/*
+ * Loads resource.
+ * lpName and lpType: parameters passed to FindResource().
+ * pData: Pointer to loaded resource data, nullptr if load not successful.
+ * nSize: Size of the data in bytes, zero if load not succesfull.
+ * hglob: HGLOBAL returned by LoadResource-function.
+ * Return: pData.
+ */
+LPCCH LoadResource(LPCTSTR lpName, LPCTSTR lpType, LPCCH& pData, size_t& nSize, HGLOBAL& hglob)
+//---------------------------------------------------------------------------------------------
+{
+ pData = nullptr;
+ nSize = 0;
+ hglob = nullptr;
+ HINSTANCE hInstance = AfxGetInstanceHandle();
+ HRSRC hrsrc = FindResource(hInstance, lpName, lpType);
+ if (hrsrc != NULL)
+ {
+ hglob = LoadResource(hInstance, hrsrc);
+ if (hglob != NULL)
+ {
+ pData = reinterpret_cast<const char*>(LockResource(hglob));
+ nSize = SizeofResource(hInstance, hrsrc);
+ }
+ }
+ return pData;
+}
+
Modified: trunk/OpenMPT/mptrack/misc_util.h
===================================================================
--- trunk/OpenMPT/mptrack/misc_util.h 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/mptrack/misc_util.h 2009-08-18 20:38:41 UTC (rev 332)
@@ -78,5 +78,7 @@
#define CLAMP(number, low, high) min(high, max(low, number))
#endif
+
+LPCCH LoadResource(LPCTSTR lpName, LPCTSTR lpType, LPCCH& pData, size_t& nSize, HGLOBAL& hglob);
#endif
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2009-08-18 20:38:41 UTC (rev 332)
@@ -13,7 +13,7 @@
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
-// Deutsch (Deutschland) resources
+// German (Germany) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
#ifdef _WIN32
@@ -55,12 +55,12 @@
END
#endif // APSTUDIO_INVOKED
-#endif // Deutsch (Deutschland) resources
+#endif // German (Germany) resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
-// Englisch (USA) resources
+// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
@@ -2204,14 +2204,19 @@
IDS_UNSUPPORTED_TUNING_DnD
"For the time being Drag and Drop is only supported for tuning instances."
IDS_OPERATION_FAIL "Operation failed."
+ IDS_CANT_OPEN_KEYBINDING_FILE
+ "Can't open keybindings file %1 for reading. Default keybindings will be used."
+ IDS_UNABLE_TO_LOAD_KEYBINDINGS
+ "Loading keybindings failed. The keyboard won't work properly."
+ IDS_CANT_OPEN_FILE_FOR_WRITING "Can't open file for writing."
END
-#endif // Englisch (USA) resources
+#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
-// Englisch (GB) resources
+// English (U.K.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
#ifdef _WIN32
@@ -2565,11 +2570,25 @@
//
1 RT_MANIFEST "res\\rt_manif.bin"
-#endif // Englisch (GB) resources
+
/////////////////////////////////////////////////////////////////////////////
+//
+// KEYBINDINGS
+//
+IDR_DEFAULT_KEYBINDINGS KEYBINDINGS "res\\defaultKeybindings.mkb"
+/////////////////////////////////////////////////////////////////////////////
+//
+// TUNING
+//
+IDR_BUILTIN_TUNINGS TUNING "res\\built-inTunings.tc"
+#endif // English (U.K.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
Modified: trunk/OpenMPT/mptrack/mptrack.vcproj
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.vcproj 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/mptrack/mptrack.vcproj 2009-08-18 20:38:41 UTC (rev 332)
@@ -638,9 +638,15 @@
RelativePath="res\bitmap1.bmp">
</File>
<File
+ RelativePath=".\res\built-inTunings.tc">
+ </File>
+ <File
RelativePath=".\res\colors.bmp">
</File>
<File
+ RelativePath=".\res\defaultKeyBindings.mkb">
+ </File>
+ <File
RelativePath=".\res\dragging.cur">
</File>
<File
Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj
===================================================================
--- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2009-08-18 20:38:41 UTC (rev 332)
@@ -1236,6 +1236,14 @@
</File>
</Filter>
<File
+ RelativePath=".\res\built-inTunings.tc"
+ >
+ </File>
+ <File
+ RelativePath=".\res\defaultKeybindings.mkb"
+ >
+ </File>
+ <File
RelativePath=".\mptrack.reg"
>
</File>
Added: trunk/OpenMPT/mptrack/res/built-inTunings.tc
===================================================================
(Binary files differ)
Property changes on: trunk/OpenMPT/mptrack/res/built-inTunings.tc
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb
===================================================================
--- trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb (rev 0)
+++ trunk/OpenMPT/mptrack/res/defaultKeybindings.mkb 2009-08-18 20:38:41 UTC (rev 332)
@@ -0,0 +1,280 @@
+//-------- OpenMPT key binding definition file -------
+//-Format is: -
+//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments -
+//----------------------------------------------------------------------
+
+//----( Global Context (0) )------------
+0:1347:2:78:1 //File/New: Ctrl+N (KeyDown)
+0:1346:2:79:1 //File/Open: Ctrl+O (KeyDown)
+0:1349:2:83:1 //File/Save: Ctrl+S (KeyDown)
+0:1030:0:116:1 //Play song/Pause song: F5 (KeyDown)
+0:1031:0:119:1 //Pause song: F8 (KeyDown)
+0:1375:0:27:1 //Stop Song: ESC (KeyDown)
+0:1029:0:117:1 //Play song from start: F6 (KeyDown)
+0:1027:0:118:5 //Play pattern from start: F7 (KeyDown|KeyHold)
+0:1026:2:118:5 //Play pattern from cursor: Ctrl+F7 (KeyDown|KeyHold)
+0:1376:0:120:1 //Toggle Midi Record: F9 (KeyDown)
+0:1359:2:90:1 //Undo: Ctrl+Z (KeyDown)
+0:1360:2:88:1 //Cut: Ctrl+X (KeyDown)
+0:1361:2:67:1 //Copy: Ctrl+C (KeyDown)
+0:1361:2:45:1 //Copy: Ctrl+INSERT (KeyDown)
+0:1362:2:86:1 //Paste: Ctrl+V (KeyDown)
+0:1362:1:45:1 //Paste: Shift+INSERT (KeyDown)
+0:1364:2:53:1 //SelectAll: Ctrl+5 (KeyDown)
+0:1365:2:70:1 //Find: Ctrl+F (KeyDown)
+0:1366:0:114:1 //Find Next: F3 (KeyDown)
+0:1021:4:71:1 //View General: Alt+G (KeyDown)
+0:1022:4:80:1 //View Pattern: Alt+P (KeyDown)
+0:1023:4:83:1 //View Samples: Alt+S (KeyDown)
+0:1024:4:78:1 //View Instruments: Alt+N (KeyDown)
+0:1025:1:120:1 //View Comments: Shift+F9 (KeyDown)
+0:1368:2:113:1 //Toggle Tree View: Ctrl+F2 (KeyDown)
+0:1369:2:112:1 //View Options: Ctrl+F1 (KeyDown)
+0:1370:0:112:1 //Help (to do): F1 (KeyDown)
+0:1032:2:111:5 //Previous instrument: Ctrl+NUM DIVIDE (KeyDown|KeyHold)
+0:1032:2:38:5 //Previous instrument: Ctrl+UP (KeyDown|KeyHold)
+0:1033:2:106:5 //Next instrument: Ctrl+NUMMULT (KeyDown|KeyHold)
+0:1033:2:40:5 //Next instrument: Ctrl+DOWN (KeyDown|KeyHold)
+0:1036:0:111:1 //Previous octave: NUM DIVIDE (KeyDown)
+0:1037:0:106:1 //Next octave: NUMMULT (KeyDown)
+0:1034:2:37:5 //Previous order: Ctrl+LEFT (KeyDown|KeyHold)
+0:1035:2:39:5 //Next order: Ctrl+RIGHT (KeyDown|KeyHold)
+
+//----( General Context [bottom] (1) )------------
+
+//----( Pattern Context [bottom] (2) )------------
+2:1017:0:34:5 //Jump down by measure: PGDOWN (KeyDown|KeyHold)
+2:1018:0:33:5 //Jump up by measure: PGUP (KeyDown|KeyHold)
+2:1338:4:34:5 //Jump down by beat: Alt+PGDOWN (KeyDown|KeyHold)
+2:1339:4:33:5 //Jump up by beat: Alt+PGUP (KeyDown|KeyHold)
+2:1340:6:34:5 //Snap down to beat: Ctrl+Alt+PGDOWN (KeyDown|KeyHold)
+2:1341:6:33:5 //Snap up to beat: Ctrl+Alt+PGUP (KeyDown|KeyHold)
+2:1038:0:40:5 //Navigate down by 1 row: DOWN (KeyDown|KeyHold)
+2:1039:0:38:5 //Navigate up by 1 row: UP (KeyDown|KeyHold)
+2:1691:4:40:5 //Navigate down by spacing: Alt+DOWN (KeyDown|KeyHold)
+2:1692:4:38:5 //Navigate up by spacing: Alt+UP (KeyDown|KeyHold)
+2:1040:0:37:5 //Navigate left: LEFT (KeyDown|KeyHold)
+2:1041:0:39:5 //Navigate right: RIGHT (KeyDown|KeyHold)
+2:1042:0:9:5 //Navigate to next channel: TAB (KeyDown|KeyHold)
+2:1043:1:9:5 //Navigate to previous channel: Shift+TAB (KeyDown|KeyHold)
+2:1044:0:36:1 //Go to first channel: HOME (KeyDown)
+2:1045:2:36:1 //Go to first row: Ctrl+HOME (KeyDown)
+2:1046:6:36:1 //Go to first row of first channel: Ctrl+Alt+HOME (KeyDown)
+2:1047:0:35:1 //Go to last channel: END (KeyDown)
+2:1048:2:35:1 //Go to last row: Ctrl+END (KeyDown)
+2:1049:6:35:1 //Go to last row of last channel: Ctrl+Alt+END (KeyDown)
+2:1050:1:16:1 //Selection key: Shift (KeyDown)
+2:1051:2:17:1 //Copy select key: Ctrl (KeyDown)
+2:1011:2:76:1 //Select channel / Select all: Ctrl+L (KeyDown)
+2:1663:0:122:1 //Toggle follow song: F11 (KeyDown)
+2:1003:0:13:5 //Quick copy: ENTER (KeyDown|KeyHold)
+2:1004:0:32:5 //Quick paste: SPACE (KeyDown|KeyHold)
+2:1001:2:32:1 //Enable recording: Ctrl+SPACE (KeyDown)
+2:1002:2:13:5 //Play row: Ctrl+ENTER (KeyDown|KeyHold)
+2:1317:4:18:1 //Set row jump on note entry: Alt (KeyDown)
+2:1685:2:9:1 //Switch to order list: Ctrl+TAB (KeyDown)
+2:1662:6:80:1 //Toggle channel's plugin editor: Ctrl+Alt+P (KeyDown)
+2:1062:0:93:1 //Show note properties: Application (KeyDown)
+2:1005:0:121:5 //Mute current channel: F10 (KeyDown|KeyHold)
+2:1006:2:121:5 //Solo current channel: Ctrl+F10 (KeyDown|KeyHold)
+2:1007:2:81:5 //Transpose +1: Ctrl+Q (KeyDown|KeyHold)
+2:1008:2:65:5 //Transpose -1: Ctrl+A (KeyDown|KeyHold)
+2:1009:3:81:5 //Transpose +12: Shift+Ctrl+Q (KeyDown|KeyHold)
+2:1010:3:65:5 //Transpose -12: Shift+Ctrl+A (KeyDown|KeyHold)
+2:1012:2:77:1 //Amplify selection: Ctrl+M (KeyDown)
+2:1014:2:74:1 //Interpolate volume: Ctrl+J (KeyDown)
+2:1015:2:75:1 //Interpolate effect: Ctrl+K (KeyDown)
+2:1016:4:66:1 //Open effect visualizer: Alt+B (KeyDown)
+2:1766:2:71:1 //Go to row/channel/...: Ctrl+G (KeyDown)
+2:1013:2:73:1 //Apply current instrument: Ctrl+I (KeyDown)
+2:1660:4:69:5 //Grow selection: Alt+E (KeyDown|KeyHold)
+2:1661:4:68:5 //Shrink selection: Alt+D (KeyDown|KeyHold)
+2:1058:0:46:1 //Clear field: DELETE (KeyDown)
+2:1664:1:190:1 //Clear field (IT Style): Shift+. (KeyDown)
+2:1059:2:46:1 //Clear row and step: Ctrl+DELETE (KeyDown)
+2:1665:1:46:5 //Clear field and step (IT Style): Shift+DELETE (KeyDown|KeyHold)
+2:1061:0:8:5 //Delete rows: BACKSPACE (KeyDown|KeyHold)
+2:1377:2:8:5 //Delete all rows: Ctrl+BACKSPACE (KeyDown|KeyHold)
+2:1378:0:45:1 //Insert Row: INSERT (KeyDown)
+2:1379:2:45:1 //Insert All Rows: Ctrl+INSERT (KeyDown)
+2:1055:0:109:5 //Previous pattern: NUM SUB (KeyDown|KeyHold)
+2:1054:0:107:5 //Next pattern: NUM PLUS (KeyDown|KeyHold)
+
+//----( Pattern Context [bottom] - Note Col (3) )------------
+3:1064:0:81:1 //Base octave C: Q (KeyDown)
+3:1065:0:87:1 //Base octave C#: W (KeyDown)
+3:1066:0:69:1 //Base octave D: E (KeyDown)
+3:1067:0:82:1 //Base octave D#: R (KeyDown)
+3:1068:0:84:1 //Base octave E: T (KeyDown)
+3:1069:0:89:1 //Base octave F: Y (KeyDown)
+3:1070:0:85:1 //Base octave F#: U (KeyDown)
+3:1071:0:73:1 //Base octave G: I (KeyDown)
+3:1072:0:79:1 //Base octave G#: O (KeyDown)
+3:1073:0:80:1 //Base octave +1 A: P (KeyDown)
+3:1074:0:219:1 //Base octave +1 A#: [ (KeyDown)
+3:1075:0:221:1 //Base octave +1 B: ] (KeyDown)
+3:1076:0:65:1 //Base octave +1 C: A (KeyDown)
+3:1077:0:83:1 //Base octave +1 C#: S (KeyDown)
+3:1078:0:68:1 //Base octave +1 D: D (KeyDown)
+3:1079:0:70:1 //Base octave +1 D#: F (KeyDown)
+3:1080:0:71:1 //Base octave +1 E: G (KeyDown)
+3:1081:0:72:1 //Base octave +1 F: H (KeyDown)
+3:1082:0:74:1 //Base octave +1 F#: J (KeyDown)
+3:1083:0:75:1 //Base octave +1 G: K (KeyDown)
+3:1084:0:76:1 //Base octave +1 G#: L (KeyDown)
+3:1085:0:186:1 //Base octave +2 A: ; (KeyDown)
+3:1086:0:222:1 //Base octave +2 A#: # (KeyDown)
+3:1087:0:220:1 //Base octave +2 B: \ (KeyDown)
+3:1088:0:90:1 //Base octave +2 C: Z (KeyDown)
+3:1089:0:88:1 //Base octave +2 C#: X (KeyDown)
+3:1090:0:67:1 //Base octave +2 D: C (KeyDown)
+3:1091:0:86:1 //Base octave +2 D#: V (KeyDown)
+3:1092:0:66:1 //Base octave +2 E: B (KeyDown)
+3:1093:0:78:1 //Base octave +2 F: N (KeyDown)
+3:1094:0:77:1 //Base octave +2 F#: M (KeyDown)
+3:1095:0:188:1 //Base octave +2 G: , (KeyDown)
+3:1096:0:190:1 //Base octave +2 G#: . (KeyDown)
+3:1097:0:191:1 //Base octave +3 A: / (KeyDown)
+3:1212:0:48:1 //Set octave 0: 0 (KeyDown)
+3:1212:0:96:1 //Set octave 0: NUM 0 (KeyDown)
+3:1213:0:49:1 //Set octave 1: 1 (KeyDown)
+3:1213:0:97:1 //Set octave 1: NUM 1 (KeyDown)
+3:1214:0:50:1 //Set octave 2: 2 (KeyDown)
+3:1214:0:98:1 //Set octave 2: NUM 2 (KeyDown)
+3:1215:0:51:1 //Set octave 3: 3 (KeyDown)
+3:1215:0:99:1 //Set octave 3: NUM 3 (KeyDown)
+3:1216:0:52:1 //Set octave 4: 4 (KeyDown)
+3:1216:0:100:1 //Set octave 4: NUM 4 (KeyDown)
+3:1217:0:53:1 //Set octave 5: 5 (KeyDown)
+3:1217:0:101:1 //Set octave 5: NUM 5 (KeyDown)
+3:1218:0:54:1 //Set octave 6: 6 (KeyDown)
+3:1218:0:102:1 //Set octave 6: NUM 6 (KeyDown)
+3:1219:0:55:1 //Set octave 7: 7 (KeyDown)
+3:1219:0:103:1 //Set octave 7: NUM 7 (KeyDown)
+3:1220:0:56:1 //Set octave 8: 8 (KeyDown)
+3:1220:0:104:1 //Set octave 8: NUM 8 (KeyDown)
+3:1221:0:57:1 //Set octave 9: 9 (KeyDown)
+3:1221:0:105:1 //Set octave 9: NUM 9 (KeyDown)
+3:1316:1:16:1 //Chord Modifier: Shift (KeyDown)
+3:1200:0:192:1 //Note cut: ' (KeyDown)
+3:1201:0:187:1 //Note off: = (KeyDown)
+
+//----( Pattern Context [bottom] - Ins Col (4) )------------
+4:1202:0:96:1 //Set instrument digit 0: NUM 0 (KeyDown)
+4:1202:0:48:1 //Set instrument digit 0: 0 (KeyDown)
+4:1203:0:97:1 //Set instrument digit 1: NUM 1 (KeyDown)
+4:1203:0:49:1 //Set instrument digit 1: 1 (KeyDown)
+4:1204:0:98:1 //Set instrument digit 2: NUM 2 (KeyDown)
+4:1204:0:50:1 //Set instrument digit 2: 2 (KeyDown)
+4:1205:0:99:1 //Set instrument digit 3: NUM 3 (KeyDown)
+4:1205:0:51:1 //Set instrument digit 3: 3 (KeyDown)
+4:1206:0:100:1 //Set instrument digit 4: NUM 4 (KeyDown)
+4:1206:0:52:1 //Set instrument digit 4: 4 (KeyDown)
+4:1207:0:101:1 //Set instrument digit 5: NUM 5 (KeyDown)
+4:1207:0:53:1 //Set instrument digit 5: 5 (KeyDown)
+4:1208:0:102:1 //Set instrument digit 6: NUM 6 (KeyDown)
+4:1208:0:54:1 //Set instrument digit 6: 6 (KeyDown)
+4:1209:0:103:1 //Set instrument digit 7: NUM 7 (KeyDown)
+4:1209:0:55:1 //Set instrument digit 7: 7 (KeyDown)
+4:1210:0:56:1 //Set instrument digit 8: 8 (KeyDown)
+4:1211:0:105:1 //Set instrument digit 9: NUM 9 (KeyDown)
+4:1211:0:57:1 //Set instrument digit 9: 9 (KeyDown)
+
+//----( Pattern Context [bottom] - Vol Col (5) )------------
+5:1222:0:48:1 //Set volume digit 0: 0 (KeyDown)
+5:1222:0:96:1 //Set volume digit 0: NUM 0 (KeyDown)
+5:1223:0:49:1 //Set volume digit 1: 1 (KeyDown)
+5:1223:0:97:1 //Set volume digit 1: NUM 1 (KeyDown)
+5:1224:0:50:1 //Set volume digit 2: 2 (KeyDown)
+5:1224:0:98:1 //Set volume digit 2: NUM 2 (KeyDown)
+5:1225:0:51:1 //Set volume digit 3: 3 (KeyDown)
+5:1225:0:99:1 //Set volume digit 3: NUM 3 (KeyDown)
+5:1226:0:52:1 //Set volume digit 4: 4 (KeyDown)
+5:1226:0:100:1 //Set volume digit 4: NUM 4 (KeyDown)
+5:1227:0:53:1 //Set volume digit 5: 5 (KeyDown)
+5:1227:0:101:1 //Set volume digit 5: NUM 5 (KeyDown)
+5:1228:0:54:1 //Set volume digit 6: 6 (KeyDown)
+5:1228:0:102:1 //Set volume digit 6: NUM 6 (KeyDown)
+5:1229:0:55:1 //Set volume digit 7: 7 (KeyDown)
+5:1229:0:103:1 //Set volume digit 7: NUM 7 (KeyDown)
+5:1230:0:56:1 //Set volume digit 8: 8 (KeyDown)
+5:1231:0:57:1 //Set volume digit 9: 9 (KeyDown)
+5:1231:0:105:1 //Set volume digit 9: NUM 9 (KeyDown)
+5:1232:0:86:1 //Vol command - volume: V (KeyDown)
+5:1233:0:80:1 //Vol command - pan: P (KeyDown)
+5:1234:0:67:1 //Vol command - vol slide up: C (KeyDown)
+5:1235:0:68:1 //Vol command - vol slide down: D (KeyDown)
+5:1236:0:65:1 //Vol command - vol fine slide up: A (KeyDown)
+5:1237:0:66:1 //Vol command - vol fine slide down: B (KeyDown)
+5:1238:0:85:1 //Vol command - vibrato speed: U (KeyDown)
+5:1239:0:72:1 //Vol command - vibrato: H (KeyDown)
+5:1240:0:76:1 //Vol command - XM pan left: L (KeyDown)
+5:1241:0:82:1 //Vol command - XM pan right: R (KeyDown)
+5:1242:0:71:1 //Vol command - Portamento: G (KeyDown)
+5:1243:0:70:1 //Vol command - Portamento Up: F (KeyDown)
+5:1244:0:69:1 //Vol command - Portamento Down: E (KeyDown)
+5:1245:1:186:1 //Vol command - Velocity: Shift+; (KeyDown)
+5:1246:0:79:1 //Vol command - Offset: O (KeyDown)
+
+//----( Pattern Context [bottom] - FX Col (6) )------------
+6:1294:0:220:1 //FX midi macro slide: \ (KeyDown)
+6:1295:1:186:1 //FX pseudo-velocity (experimental): Shift+; (KeyDown)
+
+//----( Pattern Context [bottom] - Param Col (7) )------------
+7:1247:0:48:1 //FX Param digit 0: 0 (KeyDown)
+7:1247:0:96:1 //FX Param digit 0: NUM 0 (KeyDown)
+7:1248:0:49:1 //FX Param digit 1: 1 (KeyDown)
+7:1248:0:97:1 //FX Param digit 1: NUM 1 (KeyDown)
+7:1249:0:50:1 //FX Param digit 2: 2 (KeyDown)
+7:1249:0:98:1 //FX Param digit 2: NUM 2 (KeyDown)
+7:1250:0:51:1 //FX Param digit 3: 3 (KeyDown)
+7:1250:0:99:1 //FX Param digit 3: NUM 3 (KeyDown)
+7:1251:0:52:1 //FX Param digit 4: 4 (KeyDown)
+7:1251:0:100:1 //FX Param digit 4: NUM 4 (KeyDown)
+7:1252:0:53:1 //FX Param digit 5: 5 (KeyDown)
+7:1252:0:101:1 //FX Param digit 5: NUM 5 (KeyDown)
+7:1253:0:54:1 //FX Param digit 6: 6 (KeyDown)
+7:1253:0:102:1 //FX Param digit 6: NUM 6 (KeyDown)
+7:1254:0:55:1 //FX Param digit 7: 7 (KeyDown)
+7:1254:0:103:1 //FX Param digit 7: NUM 7 (KeyDown)
+7:1255:0:56:1 //FX Param digit 8: 8 (KeyDown)
+7:1255:0:104:1 //FX Param digit 8: NUM 8 (KeyDown)
+7:1256:0:57:1 //FX Param digit 9: 9 (KeyDown)
+7:1256:0:105:1 //FX Param digit 9: NUM 9 (KeyDown)
+7:1257:0:65:1 //FX Param digit A: A (KeyDown)
+7:1258:0:66:1 //FX Param digit B: B (KeyDown)
+7:1259:0:67:1 //FX Param digit C: C (KeyDown)
+7:1260:0:68:1 //FX Param digit D: D (KeyDown)
+7:1261:0:69:1 //FX Param digit E: E (KeyDown)
+7:1262:0:70:1 //FX Param digit F: F (KeyDown)
+
+//----( Sample Context [bottom] (8) )------------
+8:1380:2:84:1 //Trim sample around loop points: Ctrl+T (KeyDown)
+8:1383:0:8:1 //Silence sample selection: BACKSPACE (KeyDown)
+8:1385:3:65:1 //Amplify Sample: Shift+Ctrl+A (KeyDown)
+8:1381:3:82:1 //Reverse sample: Shift+Ctrl+R (KeyDown)
+8:1382:0:46:1 //Delete sample selection: DELETE (KeyDown)
+8:1386:0:107:1 //Zoom Out: NUM PLUS (KeyDown)
+8:1387:0:109:1 //Zoom In: NUM SUB (KeyDown)
+
+//----( Instrument Context [bottom] (9) )------------
+
+//----( Comments Context [bottom] (10) )------------
+
+//----( Unknown Context (11) )------------
+
+//----( Unknown Context (12) )------------
+
+//----( Plugin GUI Context (13) )------------
+
+//----( General Context [top] (14) )------------
+
+//----( Pattern Context [top] (15) )------------
+
+//----( Sample Context [top] (16) )------------
+
+//----( Instrument Context [top] (17) )------------
+
+//----( Comments Context [top] (18) )------------
+
+//----( Unknown Context (19) )------------
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/mptrack/resource.h 2009-08-18 20:38:41 UTC (rev 332)
@@ -47,6 +47,9 @@
#define IDS_ERR_NO_TUNING_SELECTION 208
#define IDS_UNSUPPORTED_TUNING_DnD 209
#define IDS_OPERATION_FAIL 210
+#define IDS_CANT_OPEN_KEYBINDING_FILE 211
+#define IDS_UNABLE_TO_LOAD_KEYBINDINGS 212
+#define IDS_CANT_OPEN_FILE_FOR_WRITING 213
#define IDB_MAINBAR 300
#define IDB_IMAGELIST 301
#define IDB_PATTERNS 302
@@ -107,6 +110,8 @@
#define IDD_MSGBOX_HIDABLE 516
#define IDD_ADDSILENCE 517
#define IDD_MODLOADING_WARNINGS 518
+#define IDR_DEFAULT_KEYBINDINGS 519
+#define IDR_BUILTIN_TUNINGS 520
#define IDC_BUTTON1 1001
#define IDC_BUTTON2 1002
#define IDC_BUTTON3 1003
@@ -1116,7 +1121,7 @@
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
-#define _APS_NEXT_RESOURCE_VALUE 519
+#define _APS_NEXT_RESOURCE_VALUE 521
#define _APS_NEXT_COMMAND_VALUE 59229
#define _APS_NEXT_CONTROL_VALUE 2386
#define _APS_NEXT_SYMED_VALUE 901
Deleted: trunk/OpenMPT/packageTemplate/default.mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/default.mkb 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/packageTemplate/default.mkb 2009-08-18 20:38:41 UTC (rev 332)
@@ -1,280 +0,0 @@
-//-------- OpenMPT key binding definition file -------
-//-Format is: -
-//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments -
-//----------------------------------------------------------------------
-
-//----( Global Context (0) )------------
-0:1347:2:78:1 //File/New: Ctrl+N (KeyDown)
-0:1346:2:79:1 //File/Open: Ctrl+O (KeyDown)
-0:1349:2:83:1 //File/Save: Ctrl+S (KeyDown)
-0:1030:0:116:1 //Play song/Pause song: F5 (KeyDown)
-0:1031:0:119:1 //Pause song: F8 (KeyDown)
-0:1375:0:27:1 //Stop Song: ESC (KeyDown)
-0:1029:0:117:1 //Play song from start: F6 (KeyDown)
-0:1027:0:118:5 //Play pattern from start: F7 (KeyDown|KeyHold)
-0:1026:2:118:5 //Play pattern from cursor: Ctrl+F7 (KeyDown|KeyHold)
-0:1376:0:120:1 //Toggle Midi Record: F9 (KeyDown)
-0:1359:2:90:1 //Undo: Ctrl+Z (KeyDown)
-0:1360:2:88:1 //Cut: Ctrl+X (KeyDown)
-0:1361:2:67:1 //Copy: Ctrl+C (KeyDown)
-0:1361:2:45:1 //Copy: Ctrl+INSERT (KeyDown)
-0:1362:2:86:1 //Paste: Ctrl+V (KeyDown)
-0:1362:1:45:1 //Paste: Shift+INSERT (KeyDown)
-0:1364:2:53:1 //SelectAll: Ctrl+5 (KeyDown)
-0:1365:2:70:1 //Find: Ctrl+F (KeyDown)
-0:1366:0:114:1 //Find Next: F3 (KeyDown)
-0:1021:4:71:1 //View General: Alt+G (KeyDown)
-0:1022:4:80:1 //View Pattern: Alt+P (KeyDown)
-0:1023:4:83:1 //View Samples: Alt+S (KeyDown)
-0:1024:4:78:1 //View Instruments: Alt+N (KeyDown)
-0:1025:1:120:1 //View Comments: Shift+F9 (KeyDown)
-0:1368:2:113:1 //Toggle Tree View: Ctrl+F2 (KeyDown)
-0:1369:2:112:1 //View Options: Ctrl+F1 (KeyDown)
-0:1370:0:112:1 //Help (to do): F1 (KeyDown)
-0:1032:2:111:5 //Previous instrument: Ctrl+NUM DIVIDE (KeyDown|KeyHold)
-0:1032:2:38:5 //Previous instrument: Ctrl+UP (KeyDown|KeyHold)
-0:1033:2:106:5 //Next instrument: Ctrl+NUMMULT (KeyDown|KeyHold)
-0:1033:2:40:5 //Next instrument: Ctrl+DOWN (KeyDown|KeyHold)
-0:1036:0:111:1 //Previous octave: NUM DIVIDE (KeyDown)
-0:1037:0:106:1 //Next octave: NUMMULT (KeyDown)
-0:1034:2:37:5 //Previous order: Ctrl+LEFT (KeyDown|KeyHold)
-0:1035:2:39:5 //Next order: Ctrl+RIGHT (KeyDown|KeyHold)
-
-//----( General Context [bottom] (1) )------------
-
-//----( Pattern Context [bottom] (2) )------------
-2:1017:0:34:5 //Jump down by measure: PGDOWN (KeyDown|KeyHold)
-2:1018:0:33:5 //Jump up by measure: PGUP (KeyDown|KeyHold)
-2:1338:4:34:5 //Jump down by beat: Alt+PGDOWN (KeyDown|KeyHold)
-2:1339:4:33:5 //Jump up by beat: Alt+PGUP (KeyDown|KeyHold)
-2:1340:6:34:5 //Snap down to beat: Ctrl+Alt+PGDOWN (KeyDown|KeyHold)
-2:1341:6:33:5 //Snap up to beat: Ctrl+Alt+PGUP (KeyDown|KeyHold)
-2:1038:0:40:5 //Navigate down by 1 row: DOWN (KeyDown|KeyHold)
-2:1039:0:38:5 //Navigate up by 1 row: UP (KeyDown|KeyHold)
-2:1691:4:40:5 //Navigate down by spacing: Alt+DOWN (KeyDown|KeyHold)
-2:1692:4:38:5 //Navigate up by spacing: Alt+UP (KeyDown|KeyHold)
-2:1040:0:37:5 //Navigate left: LEFT (KeyDown|KeyHold)
-2:1041:0:39:5 //Navigate right: RIGHT (KeyDown|KeyHold)
-2:1042:0:9:5 //Navigate to next channel: TAB (KeyDown|KeyHold)
-2:1043:1:9:5 //Navigate to previous channel: Shift+TAB (KeyDown|KeyHold)
-2:1044:0:36:1 //Go to first channel: HOME (KeyDown)
-2:1045:2:36:1 //Go to first row: Ctrl+HOME (KeyDown)
-2:1046:6:36:1 //Go to first row of first channel: Ctrl+Alt+HOME (KeyDown)
-2:1047:0:35:1 //Go to last channel: END (KeyDown)
-2:1048:2:35:1 //Go to last row: Ctrl+END (KeyDown)
-2:1049:6:35:1 //Go to last row of last channel: Ctrl+Alt+END (KeyDown)
-2:1050:1:16:1 //Selection key: Shift (KeyDown)
-2:1051:2:17:1 //Copy select key: Ctrl (KeyDown)
-2:1011:2:76:1 //Select channel / Select all: Ctrl+L (KeyDown)
-2:1663:0:122:1 //Toggle follow song: F11 (KeyDown)
-2:1003:0:13:5 //Quick copy: ENTER (KeyDown|KeyHold)
-2:1004:0:32:5 //Quick paste: SPACE (KeyDown|KeyHold)
-2:1001:2:32:1 //Enable recording: Ctrl+SPACE (KeyDown)
-2:1002:2:13:5 //Play row: Ctrl+ENTER (KeyDown|KeyHold)
-2:1317:4:18:1 //Set row jump on note entry: Alt (KeyDown)
-2:1685:2:9:1 //Switch to order list: Ctrl+TAB (KeyDown)
-2:1662:6:80:1 //Toggle channel's plugin editor: Ctrl+Alt+P (KeyDown)
-2:1062:0:93:1 //Show note properties: Application (KeyDown)
-2:1005:0:121:5 //Mute current channel: F10 (KeyDown|KeyHold)
-2:1006:2:121:5 //Solo current channel: Ctrl+F10 (KeyDown|KeyHold)
-2:1007:2:81:5 //Transpose +1: Ctrl+Q (KeyDown|KeyHold)
-2:1008:2:65:5 //Transpose -1: Ctrl+A (KeyDown|KeyHold)
-2:1009:3:81:5 //Transpose +12: Shift+Ctrl+Q (KeyDown|KeyHold)
-2:1010:3:65:5 //Transpose -12: Shift+Ctrl+A (KeyDown|KeyHold)
-2:1012:2:77:1 //Amplify selection: Ctrl+M (KeyDown)
-2:1014:2:74:1 //Interpolate volume: Ctrl+J (KeyDown)
-2:1015:2:75:1 //Interpolate effect: Ctrl+K (KeyDown)
-2:1016:4:66:1 //Open effect visualizer: Alt+B (KeyDown)
-2:1766:2:71:1 //Go to row/channel/...: Ctrl+G (KeyDown)
-2:1013:2:73:1 //Apply current instrument: Ctrl+I (KeyDown)
-2:1660:4:69:5 //Grow selection: Alt+E (KeyDown|KeyHold)
-2:1661:4:68:5 //Shrink selection: Alt+D (KeyDown|KeyHold)
-2:1058:0:46:1 //Clear field: DELETE (KeyDown)
-2:1664:1:190:1 //Clear field (IT Style): Shift+. (KeyDown)
-2:1059:2:46:1 //Clear row and step: Ctrl+DELETE (KeyDown)
-2:1665:1:46:5 //Clear field and step (IT Style): Shift+DELETE (KeyDown|KeyHold)
-2:1061:0:8:5 //Delete rows: BACKSPACE (KeyDown|KeyHold)
-2:1377:2:8:5 //Delete all rows: Ctrl+BACKSPACE (KeyDown|KeyHold)
-2:1378:0:45:1 //Insert Row: INSERT (KeyDown)
-2:1379:2:45:1 //Insert All Rows: Ctrl+INSERT (KeyDown)
-2:1055:0:109:5 //Previous pattern: NUM SUB (KeyDown|KeyHold)
-2:1054:0:107:5 //Next pattern: NUM PLUS (KeyDown|KeyHold)
-
-//----( Pattern Context [bottom] - Note Col (3) )------------
-3:1064:0:81:1 //Base octave C: Q (KeyDown)
-3:1065:0:87:1 //Base octave C#: W (KeyDown)
-3:1066:0:69:1 //Base octave D: E (KeyDown)
-3:1067:0:82:1 //Base octave D#: R (KeyDown)
-3:1068:0:84:1 //Base octave E: T (KeyDown)
-3:1069:0:89:1 //Base octave F: Y (KeyDown)
-3:1070:0:85:1 //Base octave F#: U (KeyDown)
-3:1071:0:73:1 //Base octave G: I (KeyDown)
-3:1072:0:79:1 //Base octave G#: O (KeyDown)
-3:1073:0:80:1 //Base octave +1 A: P (KeyDown)
-3:1074:0:219:1 //Base octave +1 A#: [ (KeyDown)
-3:1075:0:221:1 //Base octave +1 B: ] (KeyDown)
-3:1076:0:65:1 //Base octave +1 C: A (KeyDown)
-3:1077:0:83:1 //Base octave +1 C#: S (KeyDown)
-3:1078:0:68:1 //Base octave +1 D: D (KeyDown)
-3:1079:0:70:1 //Base octave +1 D#: F (KeyDown)
-3:1080:0:71:1 //Base octave +1 E: G (KeyDown)
-3:1081:0:72:1 //Base octave +1 F: H (KeyDown)
-3:1082:0:74:1 //Base octave +1 F#: J (KeyDown)
-3:1083:0:75:1 //Base octave +1 G: K (KeyDown)
-3:1084:0:76:1 //Base octave +1 G#: L (KeyDown)
-3:1085:0:186:1 //Base octave +2 A: ; (KeyDown)
-3:1086:0:222:1 //Base octave +2 A#: # (KeyDown)
-3:1087:0:220:1 //Base octave +2 B: \ (KeyDown)
-3:1088:0:90:1 //Base octave +2 C: Z (KeyDown)
-3:1089:0:88:1 //Base octave +2 C#: X (KeyDown)
-3:1090:0:67:1 //Base octave +2 D: C (KeyDown)
-3:1091:0:86:1 //Base octave +2 D#: V (KeyDown)
-3:1092:0:66:1 //Base octave +2 E: B (KeyDown)
-3:1093:0:78:1 //Base octave +2 F: N (KeyDown)
-3:1094:0:77:1 //Base octave +2 F#: M (KeyDown)
-3:1095:0:188:1 //Base octave +2 G: , (KeyDown)
-3:1096:0:190:1 //Base octave +2 G#: . (KeyDown)
-3:1097:0:191:1 //Base octave +3 A: / (KeyDown)
-3:1212:0:48:1 //Set octave 0: 0 (KeyDown)
-3:1212:0:96:1 //Set octave 0: NUM 0 (KeyDown)
-3:1213:0:49:1 //Set octave 1: 1 (KeyDown)
-3:1213:0:97:1 //Set octave 1: NUM 1 (KeyDown)
-3:1214:0:50:1 //Set octave 2: 2 (KeyDown)
-3:1214:0:98:1 //Set octave 2: NUM 2 (KeyDown)
-3:1215:0:51:1 //Set octave 3: 3 (KeyDown)
-3:1215:0:99:1 //Set octave 3: NUM 3 (KeyDown)
-3:1216:0:52:1 //Set octave 4: 4 (KeyDown)
-3:1216:0:100:1 //Set octave 4: NUM 4 (KeyDown)
-3:1217:0:53:1 //Set octave 5: 5 (KeyDown)
-3:1217:0:101:1 //Set octave 5: NUM 5 (KeyDown)
-3:1218:0:54:1 //Set octave 6: 6 (KeyDown)
-3:1218:0:102:1 //Set octave 6: NUM 6 (KeyDown)
-3:1219:0:55:1 //Set octave 7: 7 (KeyDown)
-3:1219:0:103:1 //Set octave 7: NUM 7 (KeyDown)
-3:1220:0:56:1 //Set octave 8: 8 (KeyDown)
-3:1220:0:104:1 //Set octave 8: NUM 8 (KeyDown)
-3:1221:0:57:1 //Set octave 9: 9 (KeyDown)
-3:1221:0:105:1 //Set octave 9: NUM 9 (KeyDown)
-3:1316:1:16:1 //Chord Modifier: Shift (KeyDown)
-3:1200:0:192:1 //Note cut: ' (KeyDown)
-3:1201:0:187:1 //Note off: = (KeyDown)
-
-//----( Pattern Context [bottom] - Ins Col (4) )------------
-4:1202:0:96:1 //Set instrument digit 0: NUM 0 (KeyDown)
-4:1202:0:48:1 //Set instrument digit 0: 0 (KeyDown)
-4:1203:0:97:1 //Set instrument digit 1: NUM 1 (KeyDown)
-4:1203:0:49:1 //Set instrument digit 1: 1 (KeyDown)
-4:1204:0:98:1 //Set instrument digit 2: NUM 2 (KeyDown)
-4:1204:0:50:1 //Set instrument digit 2: 2 (KeyDown)
-4:1205:0:99:1 //Set instrument digit 3: NUM 3 (KeyDown)
-4:1205:0:51:1 //Set instrument digit 3: 3 (KeyDown)
-4:1206:0:100:1 //Set instrument digit 4: NUM 4 (KeyDown)
-4:1206:0:52:1 //Set instrument digit 4: 4 (KeyDown)
-4:1207:0:101:1 //Set instrument digit 5: NUM 5 (KeyDown)
-4:1207:0:53:1 //Set instrument digit 5: 5 (KeyDown)
-4:1208:0:102:1 //Set instrument digit 6: NUM 6 (KeyDown)
-4:1208:0:54:1 //Set instrument digit 6: 6 (KeyDown)
-4:1209:0:103:1 //Set instrument digit 7: NUM 7 (KeyDown)
-4:1209:0:55:1 //Set instrument digit 7: 7 (KeyDown)
-4:1210:0:56:1 //Set instrument digit 8: 8 (KeyDown)
-4:1211:0:105:1 //Set instrument digit 9: NUM 9 (KeyDown)
-4:1211:0:57:1 //Set instrument digit 9: 9 (KeyDown)
-
-//----( Pattern Context [bottom] - Vol Col (5) )------------
-5:1222:0:48:1 //Set volume digit 0: 0 (KeyDown)
-5:1222:0:96:1 //Set volume digit 0: NUM 0 (KeyDown)
-5:1223:0:49:1 //Set volume digit 1: 1 (KeyDown)
-5:1223:0:97:1 //Set volume digit 1: NUM 1 (KeyDown)
-5:1224:0:50:1 //Set volume digit 2: 2 (KeyDown)
-5:1224:0:98:1 //Set volume digit 2: NUM 2 (KeyDown)
-5:1225:0:51:1 //Set volume digit 3: 3 (KeyDown)
-5:1225:0:99:1 //Set volume digit 3: NUM 3 (KeyDown)
-5:1226:0:52:1 //Set volume digit 4: 4 (KeyDown)
-5:1226:0:100:1 //Set volume digit 4: NUM 4 (KeyDown)
-5:1227:0:53:1 //Set volume digit 5: 5 (KeyDown)
-5:1227:0:101:1 //Set volume digit 5: NUM 5 (KeyDown)
-5:1228:0:54:1 //Set volume digit 6: 6 (KeyDown)
-5:1228:0:102:1 //Set volume digit 6: NUM 6 (KeyDown)
-5:1229:0:55:1 //Set volume digit 7: 7 (KeyDown)
-5:1229:0:103:1 //Set volume digit 7: NUM 7 (KeyDown)
-5:1230:0:56:1 //Set volume digit 8: 8 (KeyDown)
-5:1231:0:57:1 //Set volume digit 9: 9 (KeyDown)
-5:1231:0:105:1 //Set volume digit 9: NUM 9 (KeyDown)
-5:1232:0:86:1 //Vol command - volume: V (KeyDown)
-5:1233:0:80:1 //Vol command - pan: P (KeyDown)
-5:1234:0:67:1 //Vol command - vol slide up: C (KeyDown)
-5:1235:0:68:1 //Vol command - vol slide down: D (KeyDown)
-5:1236:0:65:1 //Vol command - vol fine slide up: A (KeyDown)
-5:1237:0:66:1 //Vol command - vol fine slide down: B (KeyDown)
-5:1238:0:85:1 //Vol command - vibrato speed: U (KeyDown)
-5:1239:0:72:1 //Vol command - vibrato: H (KeyDown)
-5:1240:0:76:1 //Vol command - XM pan left: L (KeyDown)
-5:1241:0:82:1 //Vol command - XM pan right: R (KeyDown)
-5:1242:0:71:1 //Vol command - Portamento: G (KeyDown)
-5:1243:0:70:1 //Vol command - Portamento Up: F (KeyDown)
-5:1244:0:69:1 //Vol command - Portamento Down: E (KeyDown)
-5:1245:1:186:1 //Vol command - Velocity: Shift+; (KeyDown)
-5:1246:0:79:1 //Vol command - Offset: O (KeyDown)
-
-//----( Pattern Context [bottom] - FX Col (6) )------------
-6:1294:0:220:1 //FX midi macro slide: \ (KeyDown)
-6:1295:1:186:1 //FX pseudo-velocity (experimental): Shift+; (KeyDown)
-
-//----( Pattern Context [bottom] - Param Col (7) )------------
-7:1247:0:48:1 //FX Param digit 0: 0 (KeyDown)
-7:1247:0:96:1 //FX Param digit 0: NUM 0 (KeyDown)
-7:1248:0:49:1 //FX Param digit 1: 1 (KeyDown)
-7:1248:0:97:1 //FX Param digit 1: NUM 1 (KeyDown)
-7:1249:0:50:1 //FX Param digit 2: 2 (KeyDown)
-7:1249:0:98:1 //FX Param digit 2: NUM 2 (KeyDown)
-7:1250:0:51:1 //FX Param digit 3: 3 (KeyDown)
-7:1250:0:99:1 //FX Param digit 3: NUM 3 (KeyDown)
-7:1251:0:52:1 //FX Param digit 4: 4 (KeyDown)
-7:1251:0:100:1 //FX Param digit 4: NUM 4 (KeyDown)
-7:1252:0:53:1 //FX Param digit 5: 5 (KeyDown)
-7:1252:0:101:1 //FX Param digit 5: NUM 5 (KeyDown)
-7:1253:0:54:1 //FX Param digit 6: 6 (KeyDown)
-7:1253:0:102:1 //FX Param digit 6: NUM 6 (KeyDown)
-7:1254:0:55:1 //FX Param digit 7: 7 (KeyDown)
-7:1254:0:103:1 //FX Param digit 7: NUM 7 (KeyDown)
-7:1255:0:56:1 //FX Param digit 8: 8 (KeyDown)
-7:1255:0:104:1 //FX Param digit 8: NUM 8 (KeyDown)
-7:1256:0:57:1 //FX Param digit 9: 9 (KeyDown)
-7:1256:0:105:1 //FX Param digit 9: NUM 9 (KeyDown)
-7:1257:0:65:1 //FX Param digit A: A (KeyDown)
-7:1258:0:66:1 //FX Param digit B: B (KeyDown)
-7:1259:0:67:1 //FX Param digit C: C (KeyDown)
-7:1260:0:68:1 //FX Param digit D: D (KeyDown)
-7:1261:0:69:1 //FX Param digit E: E (KeyDown)
-7:1262:0:70:1 //FX Param digit F: F (KeyDown)
-
-//----( Sample Context [bottom] (8) )------------
-8:1380:2:84:1 //Trim sample around loop points: Ctrl+T (KeyDown)
-8:1383:0:8:1 //Silence sample selection: BACKSPACE (KeyDown)
-8:1385:3:65:1 //Amplify Sample: Shift+Ctrl+A (KeyDown)
-8:1381:3:82:1 //Reverse sample: Shift+Ctrl+R (KeyDown)
-8:1382:0:46:1 //Delete sample selection: DELETE (KeyDown)
-8:1386:0:107:1 //Zoom Out: NUM PLUS (KeyDown)
-8:1387:0:109:1 //Zoom In: NUM SUB (KeyDown)
-
-//----( Instrument Context [bottom] (9) )------------
-
-//----( Comments Context [bottom] (10) )------------
-
-//----( Unknown Context (11) )------------
-
-//----( Unknown Context (12) )------------
-
-//----( Plugin GUI Context (13) )------------
-
-//----( General Context [top] (14) )------------
-
-//----( Pattern Context [top] (15) )------------
-
-//----( Sample Context [top] (16) )------------
-
-//----( Instrument Context [top] (17) )------------
-
-//----( Comments Context [top] (18) )------------
-
-//----( Unknown Context (19) )------------
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-18 20:38:41 UTC (rev 332)
@@ -161,12 +161,12 @@
if(csf.Instruments[i]->pTuning)
continue;
- csf.Instruments[i]->pTuning = csf.GetStandardTunings().GetTuning(str);
+ csf.Instruments[i]->pTuning = csf.GetBuiltInTunings().GetTuning(str);
if(csf.Instruments[i]->pTuning)
continue;
- if(str == "TET12" && csf.GetStandardTunings().GetNumTunings() > 0)
- csf.Instruments[i]->pTuning = &csf.GetStandardTunings().GetTuning(0);
+ if(str == "TET12" && csf.GetBuiltInTunings().GetNumTunings() > 0)
+ csf.Instruments[i]->pTuning = &csf.GetBuiltInTunings().GetTuning(0);
if(csf.Instruments[i]->pTuning)
continue;
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-18 20:38:41 UTC (rev 332)
@@ -390,7 +390,7 @@
//////////////////////////////////////////////////////////
// CSoundFile
-CTuningCollection* CSoundFile::s_pTuningsSharedStandard(0);
+CTuningCollection* CSoundFile::s_pTuningsSharedBuiltIn(0);
CTuningCollection* CSoundFile::s_pTuningsSharedLocal(0);
uint8 CSoundFile::s_DefaultPlugVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE;
@@ -2839,7 +2839,7 @@
//---------------------------------
{
delete s_pTuningsSharedLocal; s_pTuningsSharedLocal = 0;
- delete s_pTuningsSharedStandard; s_pTuningsSharedStandard = 0;
+ delete s_pTuningsSharedBuiltIn; s_pTuningsSharedBuiltIn = 0;
}
bool CSoundFile::SaveStaticTunings()
@@ -2862,42 +2862,45 @@
bool CSoundFile::LoadStaticTunings()
//-----------------------------------
{
- if(s_pTuningsSharedLocal || s_pTuningsSharedStandard) return true;
+ if(s_pTuningsSharedLocal || s_pTuningsSharedBuiltIn) return true;
//For now not allowing to reload tunings(one should be careful when reloading them
//since various parts may use addresses of the tuningobjects).
CTuning::MessageHandler = &SimpleMessageBox;
-
- s_pTuningsSharedStandard = new CTuningCollection("Standard tunings");
+
+ s_pTuningsSharedBuiltIn = new CTuningCollection;
s_pTuningsSharedLocal = new CTuningCollection("Local tunings");
- const string exeDir = CMainFrame::m_csExecutableDirectoryPath;
- const string baseDirectoryName = exeDir + "tunings\\";
- string filenameBase;
- string filename;
-
- s_pTuningsSharedStandard->SetSavefilePath(baseDirectoryName + string("standard\\std_tunings") + CTuningCollection::s_FileExtension);
- s_pTuningsSharedLocal->SetSavefilePath(baseDirectoryName + string("local_tunings") + CTuningCollection::s_FileExtension);
-
- s_pTuningsSharedStandard->Deserialize();
- s_pTuningsSharedLocal->Deserialize();
-
- //This condition should not be true.
- if(s_pTuningsSharedStandard->GetNumTunings() == 0)
+ // Load built-in tunings.
+ const char* pData = nullptr;
+ HGLOBAL hglob = nullptr;
+ size_t nSize = 0;
+ if (LoadResource(MAKEINTRESOURCE(IDR_BUILTIN_TUNINGS), TEXT("TUNING"), pData, nSize, hglob) != nullptr)
{
+ std::istrstream iStrm(pData, nSize);
+ s_pTuningsSharedBuiltIn->Deserialize(iStrm);
+ FreeResource(hglob);
+ }
+ if(s_pTuningsSharedBuiltIn->GetNumTunings() == 0)
+ {
+ ASSERT(false);
CTuningRTI* pT = new CTuningRTI;
//Note: Tuning collection class handles deleting.
pT->CreateGeometric(1,1);
- if(s_pTuningsSharedStandard->AddTuning(pT))
+ if(s_pTuningsSharedBuiltIn->AddTuning(pT))
delete pT;
}
+
+ // Load local tunings.
+ s_pTuningsSharedLocal->SetSavefilePath(std::string(CMainFrame::m_csExecutableDirectoryPath + "tunings\\local_tunings" + CTuningCollection::s_FileExtension.c_str()));
+ s_pTuningsSharedLocal->Deserialize();
- //Enabling adding/removing of tunings for standard collection
- //only for debug builds.
+ // Enabling adding/removing of tunings for standard collection
+ // only for debug builds.
#ifdef DEBUG
- s_pTuningsSharedStandard->SetConstStatus(CTuningCollection::EM_ALLOWALL);
+ s_pTuningsSharedBuiltIn->SetConstStatus(CTuningCollection::EM_ALLOWALL);
#else
- s_pTuningsSharedStandard->SetConstStatus(CTuningCollection::EM_CONST);
+ s_pTuningsSharedBuiltIn->SetConstStatus(CTuningCollection::EM_CONST);
#endif
MODINSTRUMENT::s_DefaultTuning = NULL;
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2009-08-18 18:41:12 UTC (rev 331)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2009-08-18 20:38:41 UTC (rev 332)
@@ -835,14 +835,14 @@
static bool LoadStaticTunings();
static bool SaveStaticTunings();
static void DeleteStaticdata();
- static CTuningCollection& GetStandardTunings() {return *s_pTuningsSharedStandard;}
+ static CTuningCollection& GetBuiltInTunings() {return *s_pTuningsSharedBuiltIn;}
static CTuningCollection& GetLocalTunings() {return *s_pTuningsSharedLocal;}
CTuningCollection& GetTuneSpecificTunings() {return *m_pTuningsTuneSpecific;}
std::string GetNoteName(const int16&, const int inst = -1) const;
private:
CTuningCollection* m_pTuningsTuneSpecific;
- static CTuningCollection* s_pTuningsSharedStandard;
+ static CTuningCollection* s_pTuningsSharedBuiltIn;
static CTuningCollection* s_pTuningsSharedLocal;
//<--Tuning
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-08-18 18:41:23
|
Revision: 331
http://modplug.svn.sourceforge.net/modplug/?rev=331&view=rev
Author: saga-games
Date: 2009-08-18 18:41:12 +0000 (Tue, 18 Aug 2009)
Log Message:
-----------
[New] Pattern editor: Multiple orders can be selected in the pattern sequence. At the moment, it is possible to insert, delete, duplicate and dragondrop multiple orders.
[Ref] Redesigned a few functions and stuff to make this new feature work; Replace UINT/DWORD/whatever by ORDERINDEX/PATTERNINDEX and BOOL by bool where appropriate
[Fix] Moving orders (when duplicating them) should be aware of the max. possible order now.
[Fix] 669 Loader: Small modification so corehop.669 can be loaded; Note: Loader is still buggy like hell
[Imp] Added tests for bitshifting version numbers
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/Ctrl_pat.h
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/mptrack/test/test.cpp
trunk/OpenMPT/mptrack/typedefs.h
trunk/OpenMPT/soundlib/Load_669.cpp
trunk/OpenMPT/soundlib/Sndmix.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-08-16 22:47:01 UTC (rev 330)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-08-18 18:41:12 UTC (rev 331)
@@ -408,7 +408,7 @@
case CTRLMSG_SETCURRENTORDER:
//Set orderlist selection and refresh GUI if change successful
- m_OrderList.SetCurSel(lParam, FALSE);
+ m_OrderList.SetCurSel((ORDERINDEX)lParam, FALSE);
break;
case CTRLMSG_FORCEREFRESH:
@@ -417,7 +417,7 @@
break;
case CTRLMSG_GETCURRENTORDER:
- return m_OrderList.GetCurSel();
+ return m_OrderList.GetCurSel(true).nOrdLo;
case CTRLMSG_SETCURRENTINSTRUMENT:
case CTRLMSG_PAT_SETINSTRUMENT:
@@ -472,11 +472,11 @@
break;
case CTRLMSG_PREVORDER:
- m_OrderList.SetCurSel(m_OrderList.GetCurSel()-1, TRUE);
+ m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).nOrdLo - 1, TRUE);
break;
case CTRLMSG_NEXTORDER:
- m_OrderList.SetCurSel(m_OrderList.GetCurSel()+1, TRUE);
+ m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).nOrdLo + 1, TRUE);
break;
//rewbs.customKeys
@@ -582,7 +582,7 @@
{
if (pSndFile)
{
- for (UINT i=0; i<pSndFile->Order.size(); i++)
+ for (ORDERINDEX i=0; i<pSndFile->Order.size(); i++)
{
if (pSndFile->Order[i] == (UINT)lParam)
{
@@ -599,7 +599,7 @@
if (pSndFile)
{
lParam &= 0x7FFF;
- m_OrderList.SetCurSel(lParam);
+ m_OrderList.SetCurSel((ORDERINDEX)lParam);
SetCurrentPattern(pSndFile->Order[lParam]);
}
}
@@ -652,7 +652,7 @@
void CCtrlPatterns::OnSequencePrev()
//----------------------------------
{
- m_OrderList.SetCurSel(m_OrderList.GetCurSel()-1);
+ m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).nOrdLo - 1);
m_OrderList.SetFocus();
}
@@ -660,7 +660,7 @@
void CCtrlPatterns::OnSequenceNext()
//----------------------------------
{
- m_OrderList.SetCurSel(m_OrderList.GetCurSel()+1);
+ m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).nOrdLo + 1);
m_OrderList.SetFocus();
}
@@ -844,18 +844,18 @@
if (m_pModDoc)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- UINT nCurOrd = m_OrderList.GetCurSel();
- UINT pat = pSndFile->Order[nCurOrd];
- UINT rows = 64;
+ ORDERINDEX nCurOrd = m_OrderList.GetCurSel(true).nOrdLo;
+ PATTERNINDEX pat = pSndFile->Order[nCurOrd];
+ ROWINDEX rows = 64;
if ((pat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[pat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)))
{
rows = pSndFile->PatternSize[pat];
if (rows < 32) rows = 32;
}
- LONG nNewPat = m_pModDoc->InsertPattern(nCurOrd+1, rows);
+ PATTERNINDEX nNewPat = m_pModDoc->InsertPattern(nCurOrd + 1, rows);
if ((nNewPat >= 0) && (nNewPat < pSndFile->Patterns.Size()))
{
- m_OrderList.SetCurSel(nCurOrd+1);
+ m_OrderList.SetCurSel(nCurOrd + 1);
m_OrderList.InvalidateRect(NULL, FALSE);
SetCurrentPattern(nNewPat);
m_pModDoc->SetModified();
@@ -869,35 +869,67 @@
void CCtrlPatterns::OnPatternDuplicate()
//--------------------------------------
{
+ // duplicates one or more patterns.
if (m_pModDoc)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- UINT nCurOrd = m_OrderList.GetCurSel();
- UINT nCurPat = pSndFile->Order[nCurOrd];
- UINT rows = 64;
- if (nCurPat < pSndFile->Patterns.Size())
+ ORD_SELECTION selection = m_OrderList.GetCurSel(false);
+ ORDERINDEX nInsertCount = selection.nOrdHi - selection.nOrdLo;
+ ORDERINDEX nInsertWhere = selection.nOrdLo + nInsertCount + 1;
+ bool bSuccess = false;
+ // has this pattern been duplicated already? (for multiselect)
+ PATTERNINDEX pReplaceIndex[MAX_PATTERNS]; // TODO I think this is a bit much...
+ memset(&pReplaceIndex, PATTERNINDEX_INVALID, sizeof(PATTERNINDEX) * MAX_PATTERNS);
+
+ for(ORDERINDEX i = 0; i <= nInsertCount; i++)
{
- if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)))
+ PATTERNINDEX nCurPat = pSndFile->Order[selection.nOrdLo + i];
+ ROWINDEX rows = 64;
+ if (nCurPat < pSndFile->Patterns.Size() && pReplaceIndex[nCurPat] == PATTERNINDEX_INVALID)
{
- rows = pSndFile->PatternSize[nCurPat];
- if (rows < pSndFile->GetModSpecifications().patternRowsMin) rows = pSndFile->GetModSpecifications().patternRowsMin;
+ if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)))
+ {
+ rows = pSndFile->PatternSize[nCurPat];
+ if (rows < pSndFile->GetModSpecifications().patternRowsMin) rows = pSndFile->GetModSpecifications().patternRowsMin;
+ }
+ PATTERNINDEX nNewPat = m_pModDoc->InsertPattern(nInsertWhere + i, rows);
+ if ((nNewPat >= 0) && (nNewPat < pSndFile->Patterns.Size()))
+ {
+ MODCOMMAND *pSrc = pSndFile->Patterns[nCurPat];
+ MODCOMMAND *pDest = pSndFile->Patterns[nNewPat];
+ UINT n = pSndFile->PatternSize[nCurPat];
+ if (pSndFile->PatternSize[nNewPat] < n) n = pSndFile->PatternSize[nNewPat];
+ n *= pSndFile->m_nChannels;
+ if (n) memcpy(pDest, pSrc, n * sizeof(MODCOMMAND));
+ bSuccess = true;
+ pReplaceIndex[nCurPat] = nNewPat; // mark as duplicated
+ }
+ else
+ {
+ break;
+ }
}
- LONG nNewPat = m_pModDoc->InsertPattern(nCurOrd+1, rows);
- if ((nNewPat >= 0) && (nNewPat < pSndFile->Patterns.Size()))
+ else
{
- MODCOMMAND *pSrc = pSndFile->Patterns[nCurPat];
- MODCOMMAND *pDest = pSndFile->Patterns[nNewPat];
- UINT n = pSndFile->PatternSize[nCurPat];
- if (pSndFile->PatternSize[nNewPat] < n) n = pSndFile->PatternSize[nNewPat];
- n *= pSndFile->m_nChannels;
- if (n) memcpy(pDest, pSrc, n * sizeof(MODCOMMAND));
- m_OrderList.SetCurSel(nCurOrd+1);
- m_OrderList.InvalidateRect(NULL, FALSE);
- SetCurrentPattern(nNewPat);
- m_pModDoc->SetModified();
- m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE|HINT_PATNAMES, this);
+ // invalid pattern, or it has been duplicated before (multiselect)
+ for (int j = pSndFile->Order.size() - 1; j > selection.nOrdLo + i + nInsertCount + 1; j--) pSndFile->Order[j] = pSndFile->Order[j - 1];
+ PATTERNINDEX nNewPat;
+ if(nCurPat < pSndFile->Patterns.Size() && pReplaceIndex[nCurPat] != PATTERNINDEX_INVALID)
+ nNewPat = pReplaceIndex[nCurPat]; // take care of patterns that have been duplicated before
+ else
+ nNewPat= pSndFile->Order[selection.nOrdLo + i];
+ pSndFile->Order[selection.nOrdLo + i + nInsertCount + 1] = nNewPat;
}
}
+ if(bSuccess)
+ {
+ m_OrderList.InvalidateRect(NULL, FALSE);
+ m_OrderList.SetCurSel(nInsertWhere);
+ SetCurrentPattern(pSndFile->Order[nInsertWhere]);
+ m_pModDoc->SetModified();
+ m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE|HINT_PATNAMES, this);
+ if(selection.nOrdHi != selection.nOrdLo) m_OrderList.m_nScrollPos2nd = nInsertWhere + nInsertCount;
+ }
}
SwitchToView();
}
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-08-16 22:47:01 UTC (rev 330)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-08-18 18:41:12 UTC (rev 331)
@@ -5,6 +5,12 @@
class COrderList;
class CCtrlPatterns;
+struct ORD_SELECTION
+{
+ ORDERINDEX nOrdLo;
+ ORDERINDEX nOrdHi;
+};
+
//===========================
class COrderList: public CWnd
//===========================
@@ -13,14 +19,17 @@
protected:
HFONT m_hFont;
COLORREF colorText, colorTextSel;
- //m_nXScroll : The order at the beginning of shown orderlist?
- //m_nScrollPos: The same as order?
- int m_cxFont, m_cyFont, m_nXScroll, m_nScrollPos, m_nDropPos;
+ int m_cxFont, m_cyFont;
+ //m_nXScroll : The order at the beginning of shown orderlist
+ //m_nScrollPos: The same as order
+ //m_nScrollPos2nd: 2nd selection point if multiple orders are selected
+ // (not neccessarily the higher order - GetCurSel() is taking care of that.)
+ ORDERINDEX m_nXScroll, m_nScrollPos, m_nScrollPos2nd, m_nDropPos;
+ bool m_bScrolling, m_bDragging, m_bShift;
+ ORDERINDEX m_nDragOrder;
//To tell how many orders('orderboxes') to show at least
//on both sides of current order(when updating orderslist position).
BYTE m_nOrderlistMargins;
- UINT m_nDragOrder;
- BOOL m_bScrolling, m_bDragging, m_bShift;
CModDoc *m_pModDoc;
CCtrlPatterns *m_pParent;
@@ -33,9 +42,9 @@
public:
BOOL Init(const CRect&, CCtrlPatterns *pParent, CModDoc *, HFONT hFont);
void InvalidateSelection() const;
- int GetCurSel() const { return m_nScrollPos; }
UINT GetCurrentPattern() const;
- BOOL SetCurSel(int sel, BOOL bEdit=TRUE);
+ ORD_SELECTION GetCurSel(bool bIgnoreSelection) const;
+ bool SetCurSel(ORDERINDEX sel, bool bEdit = true, bool bShiftClick = false);
BOOL ProcessKeyDown(UINT nChar);
BOOL ProcessChar(UINT nChar);
BOOL UpdateScrollInfo();
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-08-16 22:47:01 UTC (rev 330)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-08-18 18:41:12 UTC (rev 331)
@@ -5,7 +5,6 @@
#include "globals.h"
#include "ctrl_pat.h"
#include "view_pat.h"
-#include ".\ctrl_pat.h"
//////////////////////////////////////////////////////////////
// CPatEdit
@@ -75,14 +74,15 @@
//----------------------
{
m_hFont = NULL;
- m_pParent = NULL;
+ m_pParent = nullptr;
m_cxFont = m_cyFont = 0;
- m_pModDoc = NULL;
+ m_pModDoc = nullptr;
m_nScrollPos = m_nXScroll = 0;
+ m_nScrollPos2nd = ORDERINDEX_INVALID;
m_nOrderlistMargins = s_nDefaultMargins;
- m_bScrolling = FALSE;
- m_bDragging = FALSE;
- m_bShift = FALSE;
+ m_bScrolling = false;
+ m_bDragging = false;
+ m_bShift = false;
}
@@ -159,11 +159,27 @@
void COrderList::InvalidateSelection() const
//------------------------------------------
{
+ ORDERINDEX nOrdLo = m_nScrollPos, nCount = 1;
+ static ORDERINDEX m_nScrollPos2Old = m_nScrollPos2nd;
+ if(m_nScrollPos2Old != ORDERINDEX_INVALID)
+ {
+ // there were multiple orders selected - remove them all
+ ORDERINDEX nOrdHi = m_nScrollPos;
+ if(m_nScrollPos2Old < m_nScrollPos)
+ {
+ nOrdLo = m_nScrollPos2Old;
+ } else
+ {
+ nOrdHi = m_nScrollPos2Old;
+ }
+ nCount = nOrdHi - nOrdLo + 1;
+ }
+ m_nScrollPos2Old = m_nScrollPos2nd;
CRect rcClient, rect;
GetClientRect(&rcClient);
- rect.left = rcClient.left + (m_nScrollPos - m_nXScroll) * m_cxFont;
+ rect.left = rcClient.left + (nOrdLo - m_nXScroll) * m_cxFont;
rect.top = rcClient.top;
- rect.right = rect.left + m_cxFont;
+ rect.right = rect.left + m_cxFont * nCount;
rect.bottom = rcClient.bottom;
if (rect.right > rcClient.right) rect.right = rcClient.right;
if (rect.left < rcClient.left) rect.left = rcClient.left;
@@ -186,34 +202,51 @@
}
-BOOL COrderList::SetCurSel(int sel, BOOL bEdit)
-//---------------------------------------------
+ORD_SELECTION COrderList::GetCurSel(bool bIgnoreSelection) const
+//--------------------------------------------------------------
{
+ // returns the currently selected order(s)
+ ORD_SELECTION result;
+ result.nOrdLo = result.nOrdHi = m_nScrollPos;
+ // bIgnoreSelection: true if only first selection marker is important.
+ if(!bIgnoreSelection && m_nScrollPos2nd != ORDERINDEX_INVALID) {
+ if(m_nScrollPos2nd < m_nScrollPos) // ord2 < ord1
+ result.nOrdLo = m_nScrollPos2nd;
+ else
+ result.nOrdHi = m_nScrollPos2nd;
+ }
+ return result;
+}
+
+bool COrderList::SetCurSel(ORDERINDEX sel, bool bEdit, bool bShiftClick)
+//----------------------------------------------------------------------
+{
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
+ ORDERINDEX *nOrder = (bShiftClick) ? &m_nScrollPos2nd : &m_nScrollPos;
- if ((sel < 0) || (sel >= int(pSndFile->Order.size())) || (!m_pParent) || (!pMainFrm)) return FALSE;
- if (sel == m_nScrollPos) return TRUE;
+ if ((sel < 0) || (sel >= int(pSndFile->Order.size())) || (!m_pParent) || (!pMainFrm)) return false;
+ if (sel == *nOrder) return true;
const BYTE nShownLength = GetLength();
InvalidateSelection();
- m_nScrollPos = sel;
+ *nOrder = sel;
if (!m_bScrolling)
{
const BYTE nMargins = GetMargins(GetMarginsMax(nShownLength));
- if ((m_nScrollPos < m_nXScroll + nMargins) || (!m_cxFont) || (!m_cyFont))
+ if ((*nOrder < m_nXScroll + nMargins) || (!m_cxFont) || (!m_cyFont))
{ // Must move first shown sequence item to left in order to show
// the new active order.
- m_nXScroll = max(0, m_nScrollPos - nMargins);
+ m_nXScroll = max(0, *nOrder - nMargins);
SetScrollPos(SB_HORZ, m_nXScroll);
InvalidateRect(NULL, FALSE);
} else
{
- int maxsel = nShownLength;
+ ORDERINDEX maxsel = nShownLength;
if (maxsel) maxsel--;
- if (m_nScrollPos - m_nXScroll >= maxsel - nMargins)
+ if (*nOrder - m_nXScroll >= maxsel - nMargins)
{ // Must move first shown sequence item to right in order to show
// the new active order.
- m_nXScroll = m_nScrollPos - (maxsel - nMargins);
+ m_nXScroll = *nOrder - (maxsel - nMargins);
SetScrollPos(SB_HORZ, m_nXScroll);
InvalidateRect(NULL, FALSE);
}
@@ -223,7 +256,7 @@
if ((m_pParent) && (m_pModDoc) && (bEdit))
{
UINT n = pSndFile->Order[m_nScrollPos];
- if ((n < pSndFile->Patterns.Size()) && (pSndFile->Patterns[n]))
+ if ((n < pSndFile->Patterns.Size()) && (pSndFile->Patterns[n]) && !bShiftClick)
{
BOOL bIsPlaying = (pMainFrm->GetModPlaying() == m_pModDoc);
if ((bIsPlaying) && (pSndFile->m_dwSongFlags & SONG_PATTERNLOOP))
@@ -251,7 +284,8 @@
}
}
UpdateInfoText();
- return TRUE;
+ if(m_nScrollPos == m_nScrollPos2nd) m_nScrollPos2nd = ORDERINDEX_INVALID;
+ return true;
}
@@ -273,15 +307,15 @@
switch(nChar)
{
case VK_UP:
- case VK_LEFT: SetCurSel(m_nScrollPos-1); break;
+ case VK_LEFT: SetCurSel(m_nScrollPos - 1); break;
case VK_DOWN:
- case VK_RIGHT: SetCurSel(m_nScrollPos+1); break;
+ case VK_RIGHT: SetCurSel(m_nScrollPos + 1); break;
case VK_HOME: SetCurSel(0); break;
case VK_END:
if (m_pModDoc)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- int i = 0;
+ ORDERINDEX i = 0;
const int nSeqLength = pSndFile->Order.size();
for (i=0; i+1 < nSeqLength; i++) if (pSndFile->Order[i+1] == pSndFile->Order.GetInvalidPatIndex()) break;
SetCurSel(i);
@@ -492,12 +526,14 @@
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
GetClientRect(&rcClient);
rect = rcClient;
- int nIndex = m_nXScroll;
+ ORDERINDEX nIndex = m_nXScroll;
+ ORD_SELECTION selection = GetCurSel(false);
+
//Scrolling the shown orders(the showns rectangles)?
while (rect.left < rcClient.right)
{
- BOOL bHighLight = ((bFocus) && (nIndex == m_nScrollPos)) ? TRUE : FALSE;
- int nOrder = ((nIndex >= 0) && (nIndex < int(pSndFile->Order.size()))) ? pSndFile->Order[nIndex] : -1;
+ bool bHighLight = ((bFocus) && (nIndex >= selection.nOrdLo && nIndex <= selection.nOrdHi)) ? true : false;
+ ORDERINDEX nOrder = ((nIndex >= 0) && (nIndex < int(pSndFile->Order.size()))) ? pSndFile->Order[nIndex] : -1;
if ((rect.right = rect.left + m_cxFont) > rcClient.right) rect.right = rcClient.right;
rect.right--;
if (bHighLight) {
@@ -586,10 +622,12 @@
if (ih->CtrlPressed())
{
+ // queue pattern
+ //m_nScrollPos2nd = ORDERINDEX_INVALID;
if (m_pModDoc)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- int nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont;
+ ORDERINDEX nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont;
if ((nOrder >= 0) && (nOrder < int(pSndFile->Order.size())))
{
if (pSndFile->m_nSeqOverride == static_cast<UINT>(nOrder)+1) {
@@ -602,12 +640,22 @@
}
} else
{
+ // mark pattern (+skip to)
const int oldXScroll = m_nXScroll;
- SetCurSel(m_nXScroll + (pt.x - rect.left) / m_cxFont);
- m_bDragging = IsOrderInMargins(m_nScrollPos, oldXScroll) ? FALSE : TRUE;
- if(m_bDragging == TRUE)
+
+ ORDERINDEX nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont;
+ ORD_SELECTION selection = GetCurSel(false);
+
+ // check if cursor is in selection - if it is, only react on MouseUp as the user might want to drag those orders
+ if(m_nScrollPos2nd == ORDERINDEX_INVALID || nOrder < selection.nOrdLo || nOrder > selection.nOrdHi)
{
- m_nDragOrder = GetCurSel();
+ m_nScrollPos2nd = ORDERINDEX_INVALID;
+ SetCurSel(nOrder, true, ih->ShiftPressed());
+ }
+ m_bDragging = IsOrderInMargins(m_nScrollPos, oldXScroll) ? false : true;
+ if(m_bDragging == true)
+ {
+ m_nDragOrder = GetCurSel(true).nOrdLo;
m_nDropPos = m_nDragOrder;
SetCapture();
}
@@ -622,25 +670,68 @@
void COrderList::OnLButtonUp(UINT nFlags, CPoint pt)
//--------------------------------------------------
{
+ CRect rect;
+ GetClientRect(&rect);
+
if (m_bDragging)
{
- CRect rect;
-
- m_bDragging = FALSE;
+ m_bDragging = false;
ReleaseCapture();
- GetClientRect(&rect);
if (rect.PtInRect(pt))
{
int n = m_nXScroll + (pt.x - rect.left) / m_cxFont;
if ((n >= 0) && (n == m_nDropPos) && (m_pModDoc))
{
- if (m_nDragOrder == (UINT)m_nDropPos) return;
- if (m_pModDoc->MoveOrder(m_nDragOrder, m_nDropPos, TRUE, m_bShift))
+ // drag multiple orders (not quite as easy...)
+ ORD_SELECTION selection = GetCurSel(false);
+ // move how many orders from where?
+ ORDERINDEX nMoveCount = (selection.nOrdHi - selection.nOrdLo), nMovePos = selection.nOrdLo;
+ // drop before or after the selection
+ bool bMoveBack = !(m_nDragOrder < (UINT)m_nDropPos);
+ // don't do anything if drop position is inside the selection
+ if(m_nDropPos >= selection.nOrdLo && m_nDropPos <= selection.nOrdHi) return;
+ // drag or order or multiple orders?
+ bool bMultiSelection = (selection.nOrdLo != selection.nOrdHi);
+
+ for(int i = 0; i <= nMoveCount; i++)
{
- SetCurSel(((m_nDragOrder < (UINT)m_nDropPos) && (!m_bShift)) ? m_nDropPos-1 : m_nDropPos);
- m_pModDoc->SetModified();
+ if(!m_pModDoc->MoveOrder(nMovePos, m_nDropPos, true, m_bShift)) return;
+ if((bMoveBack ^ m_bShift) == true && bMultiSelection)
+ {
+ nMovePos++;
+ m_nDropPos++;
+ }
+ if(bMoveBack && m_bShift && bMultiSelection) {
+ nMovePos += 2;
+ m_nDropPos++;
+ }
}
+ if(bMultiSelection)
+ {
+ // adjust selection
+ m_nScrollPos2nd = m_nDropPos - 1;
+ m_nDropPos -= nMoveCount + (bMoveBack ? 0 : 1);
+ SetCurSel((bMoveBack && (!m_bShift)) ? m_nDropPos - 1 : m_nDropPos);
+ } else
+ {
+ SetCurSel(((m_nDragOrder < (UINT)m_nDropPos) && (!m_bShift)) ? m_nDropPos - 1 : m_nDropPos);
+ }
+ m_pModDoc->SetModified();
}
+ else
+ {
+ ORDERINDEX nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont;
+ ORD_SELECTION selection = GetCurSel(false);
+
+ // this should actually have equal signs but that breaks multiselect: nOrder >= selection.nOrdLo && nOrder <= section.nOrdHi
+ if (pt.y < rect.bottom && m_nScrollPos2nd != ORDERINDEX_INVALID && nOrder > selection.nOrdLo && nOrder < selection.nOrdHi)
+ {
+ // Remove selection if we didn't drag anything but multiselect was active
+ m_nScrollPos2nd = ORDERINDEX_INVALID;
+ SetFocus();
+ SetCurSel(m_nXScroll + (pt.x - rect.left) / m_cxFont);
+ }
+ }
}
InvalidateRect(NULL, FALSE);
} else
@@ -658,11 +749,12 @@
CRect rect;
GetClientRect(&rect);
- int n = -1;
+ ORDERINDEX n = ORDERINDEX_INVALID;
if (rect.PtInRect(pt))
{
+ CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
n = m_nXScroll + (pt.x - rect.left) / m_cxFont;
- if ((n < 0) || (n >= int(m_pModDoc->GetSoundFile()->Order.size()))) n = -1;
+ if (n >= int(pSndFile->Order.size()) || n >= pSndFile->GetModSpecifications().ordersMax) n = ORDERINDEX_INVALID;
}
if (n != (int)m_nDropPos)
{
@@ -673,7 +765,7 @@
SetCursor(CMainFrame::curDragging);
} else
{
- m_nDropPos = -1;
+ m_nDropPos = ORDERINDEX_INVALID;
SetCursor(CMainFrame::curNoDrop);
}
}
@@ -691,39 +783,59 @@
GetClientRect(&rect);
if (m_bDragging)
{
- m_nDropPos = -1;
+ m_nDropPos = ORDERINDEX_INVALID;
OnLButtonUp(nFlags, pt);
}
- if (pt.y < rect.bottom)
+ if (pt.y >= rect.bottom) return;
+
+ CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
+
+ bool bMultiSelection = (m_nScrollPos2nd != ORDERINDEX_INVALID);
+
+ if(!bMultiSelection) SetCurSel(m_nXScroll + (pt.x - rect.left) / m_cxFont);
+ SetFocus();
+ HMENU hMenu = ::CreatePopupMenu();
+ if(!hMenu) return;
+
+ // check if at least one pattern in the current selection exists
+ bool bPatternExists = false;
+ ORD_SELECTION selection = GetCurSel(false);
+ for(ORDERINDEX nOrd = selection.nOrdLo; nOrd <= selection.nOrdHi; nOrd++)
{
- SetCurSel(m_nXScroll + (pt.x - rect.left) / m_cxFont);
- SetFocus();
- HMENU hMenu = ::CreatePopupMenu();
-
- UINT nCurrentPattern = GetCurrentPattern();
- bool patternExists = (nCurrentPattern < m_pModDoc->GetSoundFile()->Patterns.Size()
- && m_pModDoc->GetSoundFile()->Patterns[nCurrentPattern] != NULL);
- DWORD greyed = patternExists?FALSE:MF_GRAYED;
+ bPatternExists = ((pSndFile->Order[nOrd] < pSndFile->Patterns.Size())
+ && (pSndFile->Patterns[pSndFile->Order[nOrd]] != nullptr));
+ if(bPatternExists) break;
+ }
- if (hMenu)
+ DWORD greyed = bPatternExists ? 0 : MF_GRAYED;
+
+ if(bMultiSelection)
+ {
+ // several patterns are selected.
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Patterns\tIns");
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Patterns\tDel");
+ AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
+ AppendMenu(hMenu, MF_STRING | greyed, ID_ORDERLIST_COPY, "&Duplicate Patterns");
+ }
+ else
+ {
+ // only one pattern is selected
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Pattern\tIns");
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Pattern\tDel");
+ AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_NEW, "Create &New Pattern");
+ AppendMenu(hMenu, MF_STRING | greyed, ID_ORDERLIST_COPY, "&Duplicate Pattern");
+ AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERNCOPY, "&Copy Pattern");
+ AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERNPASTE, "P&aste Pattern");
+ if ((m_pModDoc) && (m_pModDoc->GetSoundFile()->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)))
{
- AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Pattern\tIns");
- AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Pattern\tDel");
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
- AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_NEW, "Create &New Pattern");
- AppendMenu(hMenu, MF_STRING|greyed, ID_ORDERLIST_COPY, "&Duplicate Pattern");
- AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERNCOPY, "&Copy Pattern");
- AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERNPASTE, "P&aste Pattern");
- if ((m_pModDoc) && (m_pModDoc->GetSoundFile()->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)))
- {
- AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
- AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERN_PROPERTIES, "&Properties...");
- }
- ClientToScreen(&pt);
- ::TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, pt.x, pt.y, 0, m_hWnd, NULL);
- ::DestroyMenu(hMenu);
+ AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERN_PROPERTIES, "&Properties...");
}
}
+ ClientToScreen(&pt);
+ ::TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, m_hWnd, NULL);
+ ::DestroyMenu(hMenu);
}
@@ -732,6 +844,8 @@
{
if ((m_pModDoc) && (m_pParent))
{
+ m_nScrollPos2nd = ORDERINDEX_INVALID;
+ SetFocus();
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
m_pParent->SetCurrentPattern(pSndFile->Order[m_nScrollPos]);
}
@@ -741,11 +855,11 @@
void COrderList::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar*)
//--------------------------------------------------------------
{
- UINT nNewPos = m_nXScroll;
+ ORDERINDEX nNewPos = m_nXScroll;
UINT smin, smax;
GetScrollRange(SB_HORZ, (LPINT)&smin, (LPINT)&smax);
- m_bScrolling = TRUE;
+ m_bScrolling = true;
switch(nSBCode)
{
case SB_LEFT: nNewPos = 0; break;
@@ -755,7 +869,7 @@
case SB_PAGERIGHT: if (nNewPos+4 < smax) nNewPos += 4; else nNewPos = smax; break;
case SB_THUMBTRACK:
case SB_THUMBPOSITION: nNewPos = nPos; if (nNewPos & 0xFFFF8000) nNewPos = smin; break;
- case SB_ENDSCROLL: m_bScrolling = FALSE; break;
+ case SB_ENDSCROLL: m_bScrolling = false; break;
}
if (nNewPos > smax) nNewPos = smax;
if (nNewPos != (UINT)m_nXScroll)
@@ -770,12 +884,13 @@
void COrderList::OnSize(UINT nType, int cx, int cy)
//-------------------------------------------------
{
- int smin, smax, nPos;
+ ORDERINDEX nPos;
+ int smin, smax;
CWnd::OnSize(nType, cx, cy);
UpdateScrollInfo();
GetScrollRange(SB_HORZ, &smin, &smax);
- nPos = (short int)GetScrollPos(SB_HORZ);
+ nPos = (ORDERINDEX)GetScrollPos(SB_HORZ);
if (nPos > smax) nPos = smax;
if (m_nXScroll != nPos)
{
@@ -789,17 +904,34 @@
void COrderList::OnInsertOrder()
//------------------------------
{
+ // insert the same order(s) after the currently selected order(s)
if (m_pModDoc)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- //Checking whether there is some pattern at the end of orderlist.
- if(pSndFile->Order[pSndFile->Order.size()-1] < pSndFile->Patterns.Size())
+ ORD_SELECTION selection = GetCurSel(false);
+ ORDERINDEX nInsertCount = selection.nOrdHi - selection.nOrdLo, nInsertEnd = selection.nOrdHi;
+
+ for(int i = 0; i <= nInsertCount; i++)
{
- if(pSndFile->Order.size() < pSndFile->GetModSpecifications().ordersMax)
- pSndFile->Order.push_back(pSndFile->Order.GetInvalidPatIndex());
+
+ //Checking whether there is some pattern at the end of orderlist.
+ if(pSndFile->Order[pSndFile->Order.size() - 1] < pSndFile->Patterns.Size())
+ {
+ if(pSndFile->Order.size() < pSndFile->GetModSpecifications().ordersMax)
+ pSndFile->Order.push_back(pSndFile->Order.GetInvalidPatIndex());
+ }
+
+ for (int i=pSndFile->Order.size() - 1; i>nInsertEnd; i--) pSndFile->Order[i] = pSndFile->Order[i - 1];
}
- for (int i=pSndFile->Order.size()-1; i>m_nScrollPos; i--) pSndFile->Order[i] = pSndFile->Order[i-1];
+ // now that there is enough space in the order list, overwrite the orders
+ for(ORDERINDEX i = 0; i <= nInsertCount; i++)
+ {
+ if(nInsertEnd + i + 1 < pSndFile->GetModSpecifications().ordersMax)
+ pSndFile->Order[nInsertEnd + i + 1] = pSndFile->Order[nInsertEnd - nInsertCount + i];
+ }
+ m_nScrollPos = nInsertEnd + 1;
+ m_nScrollPos2nd = m_nScrollPos + nInsertCount;
InvalidateRect(NULL, FALSE);
m_pModDoc->SetModified();
m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this);
@@ -814,14 +946,22 @@
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- m_pModDoc->RemoveOrder(m_nScrollPos);
+ ORD_SELECTION selection = GetCurSel(false);
+ // remove selection
+ m_nScrollPos2nd = ORDERINDEX_INVALID;
+
+ for(int i = 0; i <= (selection.nOrdHi - selection.nOrdLo); i++)
+ {
+ m_pModDoc->RemoveOrder(selection.nOrdLo);
+ }
InvalidateRect(NULL, FALSE);
m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this);
- UINT nNewOrd = pSndFile->Order[m_nScrollPos];
- if ((nNewOrd < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nNewOrd]) && (m_pParent))
+ SetCurSel(selection.nOrdLo);
+ PATTERNINDEX nNewPat = pSndFile->Order[selection.nOrdLo];
+ if ((nNewPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nNewPat] != nullptr) && (m_pParent))
{
- m_pParent->SetCurrentPattern(nNewOrd);
+ m_pParent->SetCurrentPattern(nNewPat);
}
}
}
@@ -938,7 +1078,7 @@
InvalidateRect(NULL, FALSE);
m_pModDoc->SetModified();
m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this);
- SetCurSel(posdest, TRUE);
+ SetCurSel(posdest, true);
}
return bCanDrop;
}
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-08-16 22:47:01 UTC (rev 330)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-08-18 18:41:12 UTC (rev 331)
@@ -197,14 +197,14 @@
void RearrangeSampleList();
BOOL CompoCleanup();
- LONG InsertPattern(ORDERINDEX nOrd = -1, ROWINDEX nRows = 64);
- LONG InsertSample(BOOL bLimit=FALSE);
- LONG InsertInstrument(LONG lSample=0, LONG lDuplicate=0);
+ PATTERNINDEX InsertPattern(ORDERINDEX nOrd = -1, ROWINDEX nRows = 64);
+ SAMPLEINDEX InsertSample(bool bLimit = false);
+ INSTRUMENTINDEX InsertInstrument(LONG lSample=0, LONG lDuplicate=0);
void InitializeInstrument(MODINSTRUMENT *pIns, UINT nsample=0);
- BOOL RemoveOrder(UINT n);
- BOOL RemovePattern(UINT n);
- BOOL RemoveSample(UINT n);
- BOOL RemoveInstrument(UINT n);
+ bool RemoveOrder(ORDERINDEX n);
+ bool RemovePattern(PATTERNINDEX n);
+ bool RemoveSample(SAMPLEINDEX n);
+ bool RemoveInstrument(INSTRUMENTINDEX n);
UINT PlayNote(UINT note, UINT nins, UINT nsmp, BOOL bpause, LONG nVol=-1, LONG loopstart=0, LONG loopend=0, int nCurrentChn=-1, const uint32 nStartPos = uint32_max); //rewbs.vstiLive: added current chan param
BOOL NoteOff(UINT note, BOOL bFade=FALSE, UINT nins=-1, UINT nCurrentChn=-1); //rewbs.vstiLive: add params
@@ -240,7 +240,7 @@
BOOL IsChildSample(UINT nIns, UINT nSmp) const;
UINT FindSampleParent(UINT nSmp) const;
UINT FindInstrumentChild(UINT nIns) const;
- BOOL MoveOrder(UINT nSourceNdx, UINT nDestNdx, BOOL bUpdate=TRUE, BOOL bCopy=FALSE);
+ bool MoveOrder(UINT nSourceNdx, UINT nDestNdx, bool bUpdate = true, bool bCopy = false);
BOOL ExpandPattern(PATTERNINDEX nPattern);
BOOL ShrinkPattern(PATTERNINDEX nPattern);
BOOL CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel);
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-16 22:47:01 UTC (rev 330)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-18 18:41:12 UTC (rev 331)
@@ -1046,6 +1046,81 @@
}
+
+
+void CModDoc::RearrangeSampleList()
+//---------------------------------
+{
+ if(m_SndFile.m_nSamples < 2)
+ return;
+
+ UINT nRemap = 0; // remap count
+ UINT nSampleMap[MAX_SAMPLES + 1]; // map old => new
+ for(UINT i = 0; i <= MAX_SAMPLES; i++)
+ nSampleMap[i] = i;
+
+ // First, find out which sample slots are unused and create the new sample map
+ for(UINT i = 1 ; i <= m_SndFile.m_nSamples; i++) {
+ if(!m_SndFile.Samples[i].pSample)
+ {
+ // Move all following samples
+ nRemap++;
+ nSampleMap[i] = 0;
+ for(UINT j = i + 1; j <= m_SndFile.m_nSamples; j++)
+ nSampleMap[j]--;
+ }
+ }
+
+ if(!nRemap)
+ return;
+
+ BEGIN_CRITICAL();
+
+ // Now, move everything around
+ for(UINT i = 1; i <= m_SndFile.m_nSamples; i++)
+ {
+ if(nSampleMap[i] && nSampleMap[i] != i)
+ {
+ // This gotta be moved
+ m_SndFile.MoveSample(i, nSampleMap[i]);
+ m_SndFile.Samples[i].pSample = nullptr;
+ strcpy(m_SndFile.m_szNames[nSampleMap[i]], m_SndFile.m_szNames[i]);
+ m_SndFile.m_szNames[i][0] = '\0';
+
+ // Also update instrument mapping (if module is in instrument mode)
+ for(UINT iInstr = 1; iInstr <= m_SndFile.m_nInstruments; iInstr++){
+ if(m_SndFile.Instruments[iInstr]){
+ MODINSTRUMENT *p = m_SndFile.Instruments[iInstr];
+ for(WORD iNote =0; iNote < 128; iNote++)
+ if(p->Keyboard[iNote] == i) p->Keyboard[iNote] = nSampleMap[i];
+ }
+ }
+ }
+ }
+
+ // Go through the patterns and remap samples (if module is in sample mode)
+ if(!m_SndFile.m_nInstruments)
+ {
+ for (UINT nPat=0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat])
+ {
+ MODCOMMAND *m = m_SndFile.Patterns[nPat];
+ for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--)
+ {
+ if(nSampleMap[m->instr]) m->instr = nSampleMap[m->instr];
+ }
+ }
+ }
+
+ m_SndFile.m_nSamples -= nRemap;
+
+ END_CRITICAL();
+
+ SetModified();
+ UpdateAllViews(NULL, HINT_MODTYPE);
+
+}
+
+
BOOL CModDoc::ConvertInstrumentsToSamples()
//-----------------------------------------
{
@@ -1533,8 +1608,8 @@
}
-LONG CModDoc::InsertPattern(ORDERINDEX nOrd, ROWINDEX nRows)
-//------------------------------------------------
+PATTERNINDEX CModDoc::InsertPattern(ORDERINDEX nOrd, ROWINDEX nRows)
+//------------------------------------------------------------------
{
const int i = m_SndFile.Patterns.Insert(nRows);
if(i < 0)
@@ -1573,8 +1648,8 @@
}
-LONG CModDoc::InsertSample(BOOL bLimit)
-//-------------------------------------
+SAMPLEINDEX CModDoc::InsertSample(bool bLimit)
+//--------------------------------------------
{
UINT i = 1;
for (i=1; i<=m_SndFile.m_nSamples; i++)
@@ -1611,7 +1686,7 @@
}
-LONG CModDoc::InsertInstrument(LONG lSample, LONG lDuplicate)
+INSTRUMENTINDEX CModDoc::InsertInstrument(LONG lSample, LONG lDuplicate)
//-----------------------------------------------------------
{
MODINSTRUMENT *pDup = NULL;
@@ -1733,44 +1808,44 @@
}
-BOOL CModDoc::RemoveOrder(UINT n)
+bool CModDoc::RemoveOrder(ORDERINDEX n)
//-------------------------------
{
if (n < m_SndFile.Order.size())
{
BEGIN_CRITICAL();
- for (UINT i=n; i<m_SndFile.Order.size()-1; i++)
+ for (ORDERINDEX i=n; i<m_SndFile.Order.size()-1; i++)
{
m_SndFile.Order[i] = m_SndFile.Order[i+1];
}
m_SndFile.Order[m_SndFile.Order.size()-1] = m_SndFile.Order.GetInvalidPatIndex();
END_CRITICAL();
SetModified();
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
-BOOL CModDoc::RemovePattern(UINT n)
+bool CModDoc::RemovePattern(PATTERNINDEX n)
//---------------------------------
{
if ((n < m_SndFile.Patterns.Size()) && (m_SndFile.Patterns[n]))
{
BEGIN_CRITICAL();
LPVOID p = m_SndFile.Patterns[n];
- m_SndFile.Patterns[n] = NULL;
+ m_SndFile.Patterns[n] = nullptr;
m_SndFile.SetPatternName(n, "");
CSoundFile::FreePattern(p);
END_CRITICAL();
SetModified();
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
-BOOL CModDoc::RemoveSample(UINT n)
+bool CModDoc::RemoveSample(SAMPLEINDEX n)
//--------------------------------
{
if ((n) && (n <= m_SndFile.m_nSamples))
@@ -1783,86 +1858,13 @@
&& (!m_SndFile.Samples[m_SndFile.m_nSamples].pSample)) m_SndFile.m_nSamples--;
END_CRITICAL();
SetModified();
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
-void CModDoc::RearrangeSampleList()
-//---------------------------------
-{
- if(m_SndFile.m_nSamples < 2)
- return;
-
- UINT nRemap = 0; // remap count
- UINT nSampleMap[MAX_SAMPLES + 1]; // map old => new
- for(UINT i = 0; i <= MAX_SAMPLES; i++)
- nSampleMap[i] = i;
-
- // First, find out which sample slots are unused and create the new sample map
- for(UINT i = 1 ; i <= m_SndFile.m_nSamples; i++) {
- if(!m_SndFile.Samples[i].pSample)
- {
- // Move all following samples
- nRemap++;
- nSampleMap[i] = 0;
- for(UINT j = i + 1; j <= m_SndFile.m_nSamples; j++)
- nSampleMap[j]--;
- }
- }
-
- if(!nRemap)
- return;
-
- BEGIN_CRITICAL();
-
- // Now, move everything around
- for(UINT i = 1; i <= m_SndFile.m_nSamples; i++)
- {
- if(nSampleMap[i] && nSampleMap[i] != i)
- {
- // This gotta be moved
- m_SndFile.MoveSample(i, nSampleMap[i]);
- m_SndFile.Samples[i].pSample = nullptr;
- strcpy(m_SndFile.m_szNames[nSampleMap[i]], m_SndFile.m_szNames[i]);
- m_SndFile.m_szNames[i][0] = '\0';
-
- // Also update instrument mapping (if module is in instrument mode)
- for(UINT iInstr = 1; iInstr <= m_SndFile.m_nInstruments; iInstr++){
- if(m_SndFile.Instruments[iInstr]){
- MODINSTRUMENT *p = m_SndFile.Instruments[iInstr];
- for(WORD iNote =0; iNote < 128; iNote++)
- if(p->Keyboard[iNote] == i) p->Keyboard[iNote] = nSampleMap[i];
- }
- }
- }
- }
-
- // Go through the patterns and remap samples (if module is in sample mode)
- if(!m_SndFile.m_nInstruments)
- {
- for (UINT nPat=0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat])
- {
- MODCOMMAND *m = m_SndFile.Patterns[nPat];
- for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--)
- {
- if(nSampleMap[m->instr]) m->instr = nSampleMap[m->instr];
- }
- }
- }
-
- m_SndFile.m_nSamples -= nRemap;
-
- END_CRITICAL();
-
- SetModified();
- UpdateAllViews(NULL, HINT_MODTYPE);
-
-}
-
-
-BOOL CModDoc::RemoveInstrument(UINT n)
+bool CModDoc::RemoveInstrument(INSTRUMENTINDEX n)
//------------------------------------
{
if ((n) && (n <= m_SndFile.m_nInstruments) && (m_SndFile.Instruments[n]))
@@ -1875,31 +1877,32 @@
if (!bIns) m_SndFile.m_nInstruments = 0;
END_CRITICAL();
SetModified();
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
-BOOL CModDoc::MoveOrder(UINT nSourceNdx, UINT nDestNdx, BOOL bUpdate, BOOL bCopy)
+bool CModDoc::MoveOrder(UINT nSourceNdx, UINT nDestNdx, bool bUpdate, bool bCopy)
//-------------------------------------------------------------------------------
{
- if ((nSourceNdx >= m_SndFile.Order.size()) || (nDestNdx >= m_SndFile.Order.size())) return FALSE;
- UINT n = m_SndFile.Order[nSourceNdx];
+ if ((nSourceNdx >= m_SndFile.Order.size()) || (nDestNdx >= m_SndFile.Order.size())) return false;
+ if (nDestNdx >= m_SndFile.GetModSpecifications().ordersMax) return false;
+ ORDERINDEX n = m_SndFile.Order[nSourceNdx];
// Delete source
if (!bCopy)
{
- for (UINT i=nSourceNdx; i<m_SndFile.Order.size()-1; i++) m_SndFile.Order[i] = m_SndFile.Order[i+1];
+ for (ORDERINDEX i = nSourceNdx; i < m_SndFile.Order.size() - 1; i++) m_SndFile.Order[i] = m_SndFile.Order[i+1];
if (nSourceNdx < nDestNdx) nDestNdx--;
}
// Insert at dest
- for (UINT j=m_SndFile.Order.size()-1; j>nDestNdx; j--) m_SndFile.Order[j] = m_SndFile.Order[j-1];
+ for (ORDERINDEX j = m_SndFile.Order.size() - 1; j > nDestNdx; j--) m_SndFile.Order[j] = m_SndFile.Order[j-1];
m_SndFile.Order[nDestNdx] = n;
if (bUpdate)
{
UpdateAllViews(NULL, HINT_MODSEQUENCE, NULL);
}
- return TRUE;
+ return true;
}
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2009-08-16 22:47:01 UTC (rev 330)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-08-18 18:41:12 UTC (rev 331)
@@ -1870,7 +1870,7 @@
{
if (bDoDrop)
{
- if (dwItemDrag != dwItemDrop) pModDoc->MoveOrder(dwItemDrag, dwItemDrop, TRUE);
+ if (dwItemDrag != dwItemDrop) pModDoc->MoveOrder(dwItemDrag, dwItemDrop, true);
}
return TRUE;
}
Modified: trunk/OpenMPT/mptrack/test/test.cpp
===================================================================
--- trunk/OpenMPT/mptrack/test/test.cpp 2009-08-16 22:47:01 UTC (rev 330)
+++ trunk/OpenMPT/mptrack/test/test.cpp 2009-08-18 18:41:12 UTC (rev 331)
@@ -95,6 +95,9 @@
STATIC_ASSERT( MAKE_VERSION_NUMERIC(1,17,2,28) == 18285096 );
STATIC_ASSERT( MAKE_VERSION_NUMERIC(1,17,02,48) == 18285128 );
STATIC_ASSERT( MAKE_VERSION_NUMERIC(01,17,02,52) == 18285138 );
+ // Ensure that bit-shifting works (used in some mod loaders for example)
+ STATIC_ASSERT( MAKE_VERSION_NUMERIC(01,17,00,00) == 0x0117 << 16 );
+ STATIC_ASSERT( MAKE_VERSION_NUMERIC(01,17,03,00) >> 8 == 0x011703 );
}
//Verify that the version obtained from the executable file is the same as
Modified: trunk/OpenMPT/mptrack/typedefs.h
===================================================================
--- trunk/OpenMPT/mptrack/typedefs.h 2009-08-16 22:47:01 UTC (rev 330)
+++ trunk/OpenMPT/mptrack/typedefs.h 2009-08-18 18:41:12 UTC (rev 331)
@@ -36,7 +36,10 @@
typedef uint16 CHANNELINDEX;
typedef uint16 ORDERINDEX;
const ORDERINDEX ORDERINDEX_MAX = uint16_max;
+ const ORDERINDEX ORDERINDEX_INVALID = ORDERINDEX_MAX;
typedef uint16 PATTERNINDEX;
+ const PATTERNINDEX PATTERNINDEX_MAX = uint16_max;
+ const PATTERNINDEX PATTERNINDEX_INVALID = PATTERNINDEX_MAX;
typedef uint8 PLUGINDEX;
typedef uint16 TEMPO;
typedef uint16 SAMPLEINDEX;
Modified: trunk/OpenMPT/soundlib/Load_669.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_669.cpp 2009-08-16 22:47:01 UTC (rev 330)
+++ trunk/OpenMPT/soundlib/Load_669.cpp 2009-08-18 18:41:12 UTC (rev 331)
@@ -59,7 +59,7 @@
DWORD len = LittleEndian(*((DWORD *)(&psmp[ichk].length)));
dontfuckwithme += len;
}
- if (dontfuckwithme > dwMemLength) return false;
+ if (dontfuckwithme - 0x1F1 > dwMemLength) return false;
// That should be enough checking: this must be a 669 module.
m_nType = MOD_TYPE_669;
m_dwSongFlags |= SONG_LINEARSLIDES;
Modified: trunk/OpenMPT/soundlib/Sndmix.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-08-16 22:47:01 UTC (rev 330)
+++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-08-18 18:41:12 UTC (rev 331)
@@ -855,9 +855,7 @@
//if(!(pChn->dwFlags & CHN_MUTE)) //removed by rewbs: fix http://www.modplug.com/forum/viewtopic.php?t=3358
nchn32++;
}
- if(nchn32 < 1) nchn32 = 1;
- if(nchn32 > 31) nchn32 = 31;
-
+ nchn32 = CLAMP(nchn32, 1, 31);
DWORD mastervol;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-08-16 22:47:11
|
Revision: 330
http://modplug.svn.sourceforge.net/modplug/?rev=330&view=rev
Author: saga-games
Date: 2009-08-16 22:47:01 +0000 (Sun, 16 Aug 2009)
Log Message:
-----------
[Fix] Rearrange Samples: Empty samples were overwriting the mod title
[Fix] Mod Conversion: Resetting the effect memory array proplery (nope, this was note a char array :)
[Imp] IMF Loading: Remove the last disabled channels and a little bit of refactoring
[Ref] Some more usage of the *INDEX datatypes
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Childfrm.h
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/soundlib/Load_imf.cpp
Modified: trunk/OpenMPT/mptrack/Childfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Childfrm.h 2009-08-16 16:58:51 UTC (rev 329)
+++ trunk/OpenMPT/mptrack/Childfrm.h 2009-08-16 22:47:01 UTC (rev 330)
@@ -26,13 +26,13 @@
typedef struct PATTERNVIEWSTATE
{
DWORD cbStruct;
- UINT nPattern;
- UINT nRow;
+ PATTERNINDEX nPattern;
+ ROWINDEX nRow;
UINT nCursor;
DWORD dwBeginSel;
DWORD dwEndSel;
UINT nDetailLevel;
- UINT nOrder; //rewbs.playSongFromCursor
+ ORDERINDEX nOrder; //rewbs.playSongFromCursor
} PATTERNVIEWSTATE;
typedef struct SAMPLEVIEWSTATE
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-08-16 16:58:51 UTC (rev 329)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-08-16 22:47:01 UTC (rev 330)
@@ -197,7 +197,7 @@
void RearrangeSampleList();
BOOL CompoCleanup();
- LONG InsertPattern(LONG nOrd=-1, UINT nRows=64);
+ LONG InsertPattern(ORDERINDEX nOrd = -1, ROWINDEX nRows = 64);
LONG InsertSample(BOOL bLimit=FALSE);
LONG InsertInstrument(LONG lSample=0, LONG lDuplicate=0);
void InitializeInstrument(MODINSTRUMENT *pIns, UINT nsample=0);
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-16 16:58:51 UTC (rev 329)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-16 22:47:01 UTC (rev 330)
@@ -162,8 +162,12 @@
for (UINT nPat=0; nPat<m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat])
{
MODCOMMAND *m = m_SndFile.Patterns[nPat];
- BYTE cEffectMemory[MAX_CHANNELS][MAX_EFFECTS] = {0}; // for -> MOD/XM conversion
+
+ // This is used for -> MOD/XM conversion
+ BYTE cEffectMemory[MAX_CHANNELS][MAX_EFFECTS];
+ memset(&cEffectMemory, 0, sizeof(BYTE) * MAX_CHANNELS * MAX_EFFECTS);
UINT nChannel = m_SndFile.m_nChannels - 1;
+
for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--)
{
nChannel = (nChannel + 1) % m_SndFile.m_nChannels; // 0...Channels - 1
@@ -1529,7 +1533,7 @@
}
-LONG CModDoc::InsertPattern(LONG nOrd, UINT nRows)
+LONG CModDoc::InsertPattern(ORDERINDEX nOrd, ROWINDEX nRows)
//------------------------------------------------
{
const int i = m_SndFile.Patterns.Insert(nRows);
@@ -1816,16 +1820,15 @@
// Now, move everything around
for(UINT i = 1; i <= m_SndFile.m_nSamples; i++)
{
- if(nSampleMap[i] != i)
+ if(nSampleMap[i] && nSampleMap[i] != i)
{
// This gotta be moved
-
m_SndFile.MoveSample(i, nSampleMap[i]);
m_SndFile.Samples[i].pSample = nullptr;
strcpy(m_SndFile.m_szNames[nSampleMap[i]], m_SndFile.m_szNames[i]);
m_SndFile.m_szNames[i][0] = '\0';
- // Also update instrument mapping
+ // Also update instrument mapping (if module is in instrument mode)
for(UINT iInstr = 1; iInstr <= m_SndFile.m_nInstruments; iInstr++){
if(m_SndFile.Instruments[iInstr]){
MODINSTRUMENT *p = m_SndFile.Instruments[iInstr];
@@ -1839,12 +1842,12 @@
// Go through the patterns and remap samples (if module is in sample mode)
if(!m_SndFile.m_nInstruments)
{
- for (UINT nPat=0; nPat<m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat])
+ for (UINT nPat=0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat])
{
MODCOMMAND *m = m_SndFile.Patterns[nPat];
for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--)
{
- m->instr = nSampleMap[m->instr];
+ if(nSampleMap[m->instr]) m->instr = nSampleMap[m->instr];
}
}
}
Modified: trunk/OpenMPT/soundlib/Load_imf.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_imf.cpp 2009-08-16 16:58:51 UTC (rev 329)
+++ trunk/OpenMPT/soundlib/Load_imf.cpp 2009-08-16 22:47:01 UTC (rev 330)
@@ -1,7 +1,7 @@
/*
* Purpose: Load IMF (Imago Orpheus) modules
* Authors: Storlek (Original author - http://schismtracker.org/)
- * Johannes Schultz (OpenMPT Port)
+ * Johannes Schultz (OpenMPT Port, tweaks)
*
* Thanks to Storlek for allowing me to use this code!
*/
@@ -232,7 +232,6 @@
static void load_imf_envelope(MODINSTRUMENT *ins, INSTRUMENTENVELOPE *env, IMFINSTRUMENT *imfins, int e)
{
- UINT n;
UINT min = 0; // minimum tick value for next node
int shift = (e == IMF_ENV_VOL) ? 0 : 2;
@@ -242,7 +241,7 @@
env->nSustainStart = env->nSustainEnd = imfins->env[e].sustain;
env->nReleaseNode = ENV_RELEASE_NODE_UNSET;
- for (n = 0; n < env->nNodes; n++) {
+ for (UINT n = 0; n < env->nNodes; n++) {
UINT16 nTick, nValue;
nTick = LittleEndianW(imfins->nodes[e][n].tick);
nValue = LittleEndianW(imfins->nodes[e][n].value) >> shift;
@@ -302,7 +301,7 @@
m_nSamples = 0; // Will be incremented later
m_nInstruments = 0;
- m_nChannels = 32;
+ m_nChannels = 0;
for (CHANNELINDEX nChn = 0; nChn < 32; nChn++) {
ChnSettings[nChn].nPan = hdr.channels[nChn].panning * 64 / 255;
ChnSettings[nChn].nPan *= 4;
@@ -313,9 +312,11 @@
// TODO: reverb/chorus?
switch (hdr.channels[nChn].status) {
case 0: // enabled; don't worry about it
+ m_nChannels = nChn + 1;
break;
case 1: // mute
ChnSettings[nChn].dwFlags |= CHN_MUTE;
+ m_nChannels = nChn + 1;
break;
case 2: // disabled
ChnSettings[nChn].dwFlags |= CHN_MUTE;
@@ -326,6 +327,7 @@
return false;
}
}
+ if(!m_nChannels) return false;
for (ORDERINDEX nOrd = 0; nOrd < hdr.ordnum; nOrd++)
Order[nOrd] = ((hdr.orderlist[nOrd] == 0xff) ? Order.GetIgnoreIndex() : hdr.orderlist[nOrd]);
@@ -360,7 +362,7 @@
dwMemPos += 1;
if (mask == 0) {
row++;
- row_data += 32;
+ row_data += m_nChannels;
continue;
}
@@ -449,7 +451,7 @@
// read instruments
for (INSTRUMENTINDEX nIns = 0; nIns < hdr.insnum; nIns++) {
IMFINSTRUMENT imfins;
- MODINSTRUMENT *ins;
+ MODINSTRUMENT *pIns;
ASSERT_CAN_READ(sizeof(IMFINSTRUMENT));
memset(&imfins, 0, sizeof(IMFINSTRUMENT));
memcpy(&imfins, lpStream + dwMemPos, sizeof(IMFINSTRUMENT));
@@ -465,42 +467,33 @@
return false;
}
- ins = new MODINSTRUMENT;
- if (!ins) continue;
- Instruments[nIns + 1] = ins;
- memset(ins, 0, sizeof(MODINSTRUMENT));
+ pIns = new MODINSTRUMENT;
+ if (!pIns) continue;
+ Instruments[nIns + 1] = pIns;
+ memset(pIns, 0, sizeof(MODINSTRUMENT));
+ pIns->nPPC = 5 * 12;
+ SetDefaultInstrumentValues(pIns);
- strncpy(ins->name, imfins.name, 25);
- ins->name[25] = 0;
+ strncpy(pIns->name, imfins.name, 31);
+ pIns->name[31] = 0;
if (imfins.smpnum) {
for (BYTE cNote = 0; cNote < 120; cNote++) {
- ins->NoteMap[cNote] = cNote + 1;
- ins->Keyboard[cNote] = firstsample + imfins.map[cNote];
+ pIns->NoteMap[cNote] = cNote + 1;
+ pIns->Keyboard[cNote] = firstsample + imfins.map[cNote];
}
}
- /* Fadeout:
- IT1 - 64
- IT2 - 256
- FT2 - 4095
- IMF - 4095
- MPT - god knows what, all the loaders are inconsistent
- Schism - 128 presented (!); 8192? internal
+ pIns->nFadeOut = imfins.fadeout;
+ pIns->nGlobalVol = 128;
- IMF and XM have the same range and modplug's XM loader doesn't do any bit shifting with it,
- so I'll do the same here for now. I suppose I should get this nonsense straightened
- out at some point, though. */
- ins->nFadeOut = imfins.fadeout;
- ins->nGlobalVol = 128;
+ load_imf_envelope(pIns, &pIns->VolEnv, &imfins, IMF_ENV_VOL);
+ load_imf_envelope(pIns, &pIns->PanEnv, &imfins, IMF_ENV_PAN);
+ load_imf_envelope(pIns, &pIns->PitchEnv, &imfins, IMF_ENV_FILTER);
- load_imf_envelope(ins, &ins->VolEnv, &imfins, IMF_ENV_VOL);
- load_imf_envelope(ins, &ins->PanEnv, &imfins, IMF_ENV_PAN);
- load_imf_envelope(ins, &ins->PitchEnv, &imfins, IMF_ENV_FILTER);
-
// hack to get === to stop notes (from modplug's xm loader)
- if (!(ins->dwFlags & ENV_VOLUME) && !ins->nFadeOut)
- ins->nFadeOut = 8192;
+ if (!(pIns->dwFlags & ENV_VOLUME) && !pIns->nFadeOut)
+ pIns->nFadeOut = 8192;
// read this instrument's samples
for (SAMPLEINDEX nSmp = 0; nSmp < imfins.smpnum; nSmp++) {
@@ -520,7 +513,7 @@
strncpy(pSample->filename, imfsmp.filename, 12);
pSample->filename[12] = 0;
- strcpy(m_szNames[nSmp + 1], pSample->filename);
+ strcpy(m_szNames[m_nSamples], pSample->filename);
blen = pSample->nLength = LittleEndian(imfsmp.length);
pSample->nLoopStart = LittleEndian(imfsmp.loop_start);
pSample->nLoopEnd = LittleEndian(imfsmp.loop_end);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-08-16 16:59:06
|
Revision: 329
http://modplug.svn.sourceforge.net/modplug/?rev=329&view=rev
Author: saga-games
Date: 2009-08-16 16:58:51 +0000 (Sun, 16 Aug 2009)
Log Message:
-----------
[Imp] Mod Conversion: Try to use fix commands that don't have cache (00 value) in XM (Arpeggio) and MOD format (Arpeggio and a few others) by using the previous value
[New] OpenMPT can now import IMF (Imago Orpheus) modules
[Ref] Minor modifications in the GDM and MO3 loaders
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
trunk/OpenMPT/soundlib/Load_gdm.cpp
trunk/OpenMPT/soundlib/Load_imf.cpp
trunk/OpenMPT/soundlib/Load_mo3.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-16 11:55:06 UTC (rev 328)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-16 16:58:51 UTC (rev 329)
@@ -162,8 +162,11 @@
for (UINT nPat=0; nPat<m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat])
{
MODCOMMAND *m = m_SndFile.Patterns[nPat];
+ BYTE cEffectMemory[MAX_CHANNELS][MAX_EFFECTS] = {0}; // for -> MOD/XM conversion
+ UINT nChannel = m_SndFile.m_nChannels - 1;
for (UINT len = m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len; m++, len--)
{
+ nChannel = (nChannel + 1) % m_SndFile.m_nChannels; // 0...Channels - 1
//////////////////////////
// Convert 8-bit Panning
@@ -286,6 +289,13 @@
switch(m->command)
{
+ case CMD_ARPEGGIO:
+ // No effect memory in XM / MOD
+ if(m->param == 0)
+ m->param = cEffectMemory[nChannel][CMD_ARPEGGIO];
+ else
+ cEffectMemory[nChannel][CMD_ARPEGGIO] = m->param;
+ break;
case CMD_S3MCMDEX:
m->command = CMD_MODCMDEX;
switch(m->param & 0xF0)
@@ -391,8 +401,8 @@
}
- //////////////////////////////////////////////////////////////////
- // Convert anything to MOD - remove volume column, adjust retrig
+ /////////////////////////////////////////////////////////////////////////////////
+ // Convert anything to MOD - remove volume column, adjust retrig, effect memory
if (newTypeIsMOD)
{
if(m->command) switch(m->command)
@@ -401,6 +411,17 @@
m->command = CMD_MODCMDEX;
m->param = 0x90 | (m->param & 0x0F);
break;
+ case CMD_PORTAMENTOUP:
+ case CMD_PORTAMENTODOWN:
+ case CMD_TONEPORTAVOL:
+ case CMD_VIBRATOVOL:
+ case CMD_VOLUMESLIDE:
+ // ProTracker doesn't have effect memory for these commands, so let's try to fix them
+ if(m->param == 0)
+ m->param = cEffectMemory[nChannel][m->command];
+ else
+ cEffectMemory[nChannel][m->command] = m->param;
+ break;
}
else switch(m->volcmd)
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-08-16 11:55:06 UTC (rev 328)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-08-16 16:58:51 UTC (rev 329)
@@ -1252,13 +1252,11 @@
OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_FORCESHOWHIDDEN | OFN_ALLOWMULTISELECT,
// -> CODE#0023
// -> DESC="IT project files (.itp)"
-// "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.bak;*.umx;*.amf;*.psm;*.mt2|"
-// "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.bak;*.umx;*.amf;*.psm;*.mt2;*.gdm|"
#ifndef NO_MO3_SUPPORT
- "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2;*.gdm;*.mo3|"
+ "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2;*.gdm;*.imf;*.mo3|"
"Compressed Modules (*.mdz;*.s3z;*.xmz;*.itz;*.mo3)|*.mdz;*.s3z;*.xmz;*.itz;*.mdr;*.zip;*.rar;*.lha;*.mo3|"
#else
- "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2;*.gdm|"
+ "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.itp;*.mptm;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.umx;*.amf;*.psm;*.mt2;*.gdm;*.imf|"
"Compressed Modules (*.mdz;*.s3z;*.xmz;*.itz)|*.mdz;*.s3z;*.xmz;*.itz;*.mdr;*.zip;*.rar;*.lha|"
#endif
// -! NEW_FEATURE#0023
@@ -1271,7 +1269,7 @@
"Impulse Tracker Projects (*.itp)|*.itp;*.itpz|"
// -! NEW_FEATURE#0023
"OpenMPT Modules (*.mptm)|*.mptm;*.mptmz|"
- "Other Modules (mtm,okt,mdl,669,far,...)|*.mtm;*.669;*.ult;*.wow;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.med;*.ams;*.dbm;*.dsm;*.umx;*.amf;*.psm;*.mt2;*.gdm|"
+ "Other Modules (mtm,okt,mdl,669,far,...)|*.mtm;*.669;*.ult;*.wow;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.med;*.ams;*.dbm;*.dsm;*.umx;*.amf;*.psm;*.mt2;*.gdm;*.imf|"
"Wave Files (*.wav)|*.wav|"
"Midi Files (*.mid,*.rmi)|*.mid;*.rmi;*.smf|"
"All Files (*.*)|*.*||",
Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-08-16 11:55:06 UTC (rev 328)
+++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-08-16 16:58:51 UTC (rev 329)
@@ -66,6 +66,8 @@
BYTE Pan; // default pan
} GDMSAMPLEHEADER, *PGDMSAMPLEHEADER;
+#pragma pack()
+
bool CSoundFile::ReadGDM(const LPCBYTE lpStream, const DWORD dwMemLength)
//-----------------------------------------------------------
{
Modified: trunk/OpenMPT/soundlib/Load_imf.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_imf.cpp 2009-08-16 11:55:06 UTC (rev 328)
+++ trunk/OpenMPT/soundlib/Load_imf.cpp 2009-08-16 16:58:51 UTC (rev 329)
@@ -1,6 +1,6 @@
/*
* Purpose: Load IMF (Imago Orpheus) modules
- * Authors: Storlek (http://schismtracker.org/)
+ * Authors: Storlek (Original author - http://schismtracker.org/)
* Johannes Schultz (OpenMPT Port)
*
* Thanks to Storlek for allowing me to use this code!
@@ -12,7 +12,7 @@
#pragma pack(1)
struct IMFCHANNEL {
- char name[12]; // Channelname (ASCIIZ-String, max 11 chars)
+ char name[12]; // Channel name (ASCIIZ-String, max 11 chars)
BYTE chorus; // Default chorus
BYTE reverb; // Default reverb
BYTE panning; // Pan positions 00-FF
@@ -20,20 +20,20 @@
};
struct IMFHEADER {
- char title[32]; // Songname (ASCIIZ-String, max. 31 chars)
- UINT16 ordnum; // Number of orders saved
- UINT16 patnum; // Number of patterns saved
- UINT16 insnum; // Number of instruments saved
- UINT16 flags; // Module flags (&1 => linear)
+ char title[32]; // Songname (ASCIIZ-String, max. 31 chars)
+ UINT16 ordnum; // Number of orders saved
+ UINT16 patnum; // Number of patterns saved
+ UINT16 insnum; // Number of instruments saved
+ UINT16 flags; // Module flags (&1 => linear)
BYTE unused1[8];
- BYTE tempo; // Default tempo (Axx, 1..255)
- BYTE bpm; // Default beats per minute (BPM) (Txx, 32..255)
- BYTE master; // Default mastervolume (Vxx, 0..64)
- BYTE amp; // Amplification factor (mixing volume, 4..127)
+ BYTE tempo; // Default tempo (Axx, 1..255)
+ BYTE bpm; // Default beats per minute (BPM) (Txx, 32..255)
+ BYTE master; // Default mastervolume (Vxx, 0..64)
+ BYTE amp; // Amplification factor (mixing volume, 4..127)
BYTE unused2[8];
- char im10[4]; // 'IM10'
- struct IMFCHANNEL channels[32]; // Channel settings
- BYTE orderlist[256]; // Order list (0xff = +++; blank out anything beyond ordnum)
+ char im10[4]; // 'IM10'
+ IMFCHANNEL channels[32]; // Channel settings
+ BYTE orderlist[256]; // Order list (0xff = +++; blank out anything beyond ordnum)
};
enum {
@@ -60,22 +60,22 @@
char name[32]; // Inst. name (ASCIIZ-String, max. 31 chars)
BYTE map[120]; // Multisample settings
BYTE unused[8];
- struct IMFENVNODES nodes[3][16];
- struct IMFENVELOPE env[3];
+ IMFENVNODES nodes[3][16];
+ IMFENVELOPE env[3];
UINT16 fadeout; // Fadeout rate (0...0FFFH)
UINT16 smpnum; // Number of samples in instrument
char ii10[4]; // 'II10'
};
struct IMFSAMPLE {
- char filename[13]; // Sample filename (12345678.ABC) */
+ char filename[13]; // Sample filename (12345678.ABC) */
BYTE unused1[3];
UINT32 length; // Length
UINT32 loop_start; // Loop start
UINT32 loop_end; // Loop end
UINT32 C5Speed; // Samplerate
- BYTE volume; // Default volume (0..64)
- BYTE panning; // Default pan (00h = Left / 80h = Middle)
+ BYTE volume; // Default volume (0...64)
+ BYTE panning; // Default pan (0...255)
BYTE unused2[14];
BYTE flags; // Sample flags
BYTE unused3[5];
@@ -85,54 +85,53 @@
};
#pragma pack()
-
static BYTE imf_efftrans[] = {
CMD_NONE,
- CMD_SPEED, // 0x01 1xx Set Tempo
- CMD_TEMPO, // 0x02 2xx Set BPM
+ CMD_SPEED, // 0x01 1xx Set Tempo
+ CMD_TEMPO, // 0x02 2xx Set BPM
CMD_TONEPORTAMENTO, // 0x03 3xx Tone Portamento
- CMD_TONEPORTAVOL, // 0x04 4xy Tone Portamento + Volume Slide
- CMD_VIBRATO, // 0x05 5xy Vibrato
- CMD_VIBRATOVOL, // 0x06 6xy Vibrato + Volume Slide
- CMD_FINEVIBRATO, // 0x07 7xy Fine Vibrato
- CMD_TREMOLO, // 0x08 8xy Tremolo
- CMD_ARPEGGIO, // 0x09 9xy Arpeggio
- CMD_PANNING8, // 0x0A Axx Set Pan Position
- CMD_PANNINGSLIDE, // 0x0B Bxy Pan Slide
- CMD_VOLUME, // 0x0C Cxx Set Volume
- CMD_VOLUMESLIDE, // 0x0D Dxy Volume Slide
- CMD_VOLUMESLIDE, // 0x0E Exy Fine Volume Slide
- CMD_S3MCMDEX, // 0x0F Fxx Set Finetune
- CMD_NOTESLIDEUP, // 0x10 Gxy Note Slide Up
- CMD_NOTESLIDEDOWN, // 0x11 Hxy Note Slide Down
- CMD_PORTAMENTOUP, // 0x12 Ixx Slide Up
- CMD_PORTAMENTODOWN, // 0x13 Jxx Slide Down
- CMD_PORTAMENTOUP, // 0x14 Kxx Fine Slide Up
- CMD_PORTAMENTODOWN, // 0x15 Lxx Fine Slide Down
- CMD_MIDI, // 0x16 Mxx Set Filter Cutoff - XXX
- CMD_NONE, // 0x17 Nxy Filter Slide + Resonance - XXX
- CMD_OFFSET, // 0x18 Oxx Set Sample Offset
- CMD_NONE, // 0x19 Pxx Set Fine Sample Offset - XXX
- CMD_KEYOFF, // 0x1A Qxx Key Off
- CMD_RETRIG, // 0x1B Rxy Retrig
- CMD_TREMOR, // 0x1C Sxy Tremor
- CMD_POSITIONJUMP, // 0x1D Txx Position Jump
- CMD_PATTERNBREAK, // 0x1E Uxx Pattern Break
- CMD_GLOBALVOLUME, // 0x1F Vxx Set Mastervolume
- CMD_GLOBALVOLSLIDE, // 0x20 Wxy Mastervolume Slide
- CMD_S3MCMDEX, // 0x21 Xxx Extended Effect
- // X1x Set Filter
- // X3x Glissando
- // X5x Vibrato Waveform
- // X8x Tremolo Waveform
- // XAx Pattern Loop
- // XBx Pattern Delay
- // XCx Note Cut
- // XDx Note Delay
- // XEx Ignore Envelope
- // XFx Invert Loop
- CMD_NONE, // 0x22 Yxx Chorus - XXX
- CMD_NONE, // 0x23 Zxx Reverb - XXX
+ CMD_TONEPORTAVOL, // 0x04 4xy Tone Portamento + Volume Slide
+ CMD_VIBRATO, // 0x05 5xy Vibrato
+ CMD_VIBRATOVOL, // 0x06 6xy Vibrato + Volume Slide
+ CMD_FINEVIBRATO, // 0x07 7xy Fine Vibrato
+ CMD_TREMOLO, // 0x08 8xy Tremolo
+ CMD_ARPEGGIO, // 0x09 9xy Arpeggio
+ CMD_PANNING8, // 0x0A Axx Set Pan Position
+ CMD_PANNINGSLIDE, // 0x0B Bxy Pan Slide
+ CMD_VOLUME, // 0x0C Cxx Set Volume
+ CMD_VOLUMESLIDE, // 0x0D Dxy Volume Slide
+ CMD_VOLUMESLIDE, // 0x0E Exy Fine Volume Slide
+ CMD_S3MCMDEX, // 0x0F Fxx Set Finetune
+ CMD_NOTESLIDEUP, // 0x10 Gxy Note Slide Up
+ CMD_NOTESLIDEDOWN, // 0x11 Hxy Note Slide Down
+ CMD_PORTAMENTOUP, // 0x12 Ixx Slide Up
+ CMD_PORTAMENTODOWN, // 0x13 Jxx Slide Down
+ CMD_PORTAMENTOUP, // 0x14 Kxx Fine Slide Up
+ CMD_PORTAMENTODOWN, // 0x15 Lxx Fine Slide Down
+ CMD_MIDI, // 0x16 Mxx Set Filter Cutoff - XXX
+ CMD_NONE, // 0x17 Nxy Filter Slide + Resonance - XXX
+ CMD_OFFSET, // 0x18 Oxx Set Sample Offset
+ CMD_NONE, // 0x19 Pxx Set Fine Sample Offset - XXX
+ CMD_KEYOFF, // 0x1A Qxx Key Off
+ CMD_RETRIG, // 0x1B Rxy Retrig
+ CMD_TREMOR, // 0x1C Sxy Tremor
+ CMD_POSITIONJUMP, // 0x1D Txx Position Jump
+ CMD_PATTERNBREAK, // 0x1E Uxx Pattern Break
+ CMD_GLOBALVOLUME, // 0x1F Vxx Set Mastervolume
+ CMD_GLOBALVOLSLIDE, // 0x20 Wxy Mastervolume Slide
+ CMD_S3MCMDEX, // 0x21 Xxx Extended Effect
+ // X1x Set Filter
+ // X3x Glissando
+ // X5x Vibrato Waveform
+ // X8x Tremolo Waveform
+ // XAx Pattern Loop
+ // XBx Pattern Delay
+ // XCx Note Cut
+ // XDx Note Delay
+ // XEx Ignore Envelope
+ // XFx Invert Loop
+ CMD_NONE, // 0x22 Yxx Chorus - XXX
+ CMD_NONE, // 0x23 Zxx Reverb - XXX
};
static void import_imf_effect(MODCOMMAND *note)
@@ -225,115 +224,6 @@
}
}
-#ifdef _IMF_SUPPORT_FINISHED_
-
-static void load_imf_pattern(CSoundFile *csf, int pat, UINT32 ignore_channels, slurp_t *fp)
-{
- UINT16 length, nrows;
- BYTE mask, channel;
- int row, startpos;
- unsigned int lostfx = 0;
- MODCOMMAND *row_data, *note, junk_note;
-
- startpos = slurp_tell(fp);
-
- slurp_read(fp, &length, 2);
- length = LittleEndianW(length);
- slurp_read(fp, &nrows, 2);
- nrows = LittleEndianW(nrows);
-
- csf->Patterns.Insert(pat, nrows);
- //row_data = Patterns[pat] = csf_allocate_pattern(nrows, 64);
- //PatternSize[pat] = PatternAllocSize[pat] = nrows;
- row_data = csf->Patterns[pat];
-
- row = 0;
- while (row < nrows) {
- mask = slurp_getc(fp);
- if (mask == 0) {
- row++;
- row_data += MAX_CHANNELS;
- continue;
- }
-
- channel = mask & 0x1f;
-
- if (ignore_channels & (1 << channel)) {
- /* should do this better, i.e. not go through the whole process of deciding
- what to do with the effects since they're just being thrown out */
- //printf("disabled channel %d contains data\n", channel + 1);
- note = &junk_note;
- } else {
- note = row_data + channel;
- }
-
- if (mask & 0x20) {
- /* read note/instrument */
- note->note = slurp_getc(fp);
- note->instr = slurp_getc(fp);
- if (note->note == 160) {
- note->note = NOTE_KEYOFF; /* ??? */
- } else if (note->note == 255) {
- note->note = NOTE_NONE; /* ??? */
- } else {
- note->note = (note->note >> 4) * 12 + (note->note & 0xf) + 12 + 1;
- if (note->note > NOTE_MAX) {
- //printf("%d.%d.%d: funny note 0x%02x\n",
- // pat, row, channel, fp->data[fp->pos - 1]);
- note->note = NOTE_NONE;
- }
- }
- }
- if ((mask & 0xc0) == 0xc0) {
- BYTE e1c, e1d, e2c, e2d;
-
- /* read both effects and figure out what to do with them */
- e1c = slurp_getc(fp);
- e1d = slurp_getc(fp);
- e2c = slurp_getc(fp);
- e2d = slurp_getc(fp);
- if (e1c == 0xc) {
- note->vol = min(e1d, 0x40);
- note->volcmd = VOLCMD_VOLUME;
- note->command = e2c;
- note->param = e2d;
- } else if (e2c == 0xc) {
- note->vol = min(e2d, 0x40);
- note->volcmd = VOLCMD_VOLUME;
- note->command = e1c;
- note->param = e1d;
- } else if (e1c == 0xa) {
- note->vol = e1d * 64 / 255;
- note->volcmd = VOLCMD_PANNING;
- note->command = e2c;
- note->param = e2d;
- } else if (e2c == 0xa) {
- note->vol = e2d * 64 / 255;
- note->volcmd = VOLCMD_PANNING;
- note->command = e1c;
- note->param = e1d;
- } else {
- /* check if one of the effects is a 'global' effect
- -- if so, put it in some unused channel instead.
- otherwise pick the most important effect. */
- lostfx++;
- note->command = e2c;
- note->param = e2d;
- }
- } else if (mask & 0xc0) {
- /* there's one effect, just stick it in the effect column */
- note->command = slurp_getc(fp);
- note->param = slurp_getc(fp);
- }
- if (note->command)
- import_imf_effect(note);
- }
-
- /*if (lostfx)
- log_appendf(2, "Pattern %d: %d effect%s skipped!\n", pat, lostfx, lostfx == 1 ? "" : "s");*/
-}
-
-
static unsigned int envflags[3][3] = {
{ENV_VOLUME, ENV_VOLSUSTAIN, ENV_VOLLOOP},
{ENV_PANNING, ENV_PANSUSTAIN, ENV_PANLOOP},
@@ -342,21 +232,23 @@
static void load_imf_envelope(MODINSTRUMENT *ins, INSTRUMENTENVELOPE *env, IMFINSTRUMENT *imfins, int e)
{
- int n, t, v;
- int min = 0; // minimum tick value for next node
- int shift = (e == IMF_ENV_VOL ? 0 : 2);
+ UINT n;
+ UINT min = 0; // minimum tick value for next node
+ int shift = (e == IMF_ENV_VOL) ? 0 : 2;
env->nNodes = CLAMP(imfins->env[e].points, 2, 25);
env->nLoopStart = imfins->env[e].loop_start;
env->nLoopEnd = imfins->env[e].loop_end;
env->nSustainStart = env->nSustainEnd = imfins->env[e].sustain;
+ env->nReleaseNode = ENV_RELEASE_NODE_UNSET;
for (n = 0; n < env->nNodes; n++) {
- t = LittleEndianW(imfins->nodes[e][n].tick);
- v = LittleEndianW(imfins->nodes[e][n].value) >> shift;
- env->Ticks[n] = max(min, t);
- env->Values[n] = v = min(v, 64);
- min = t + 1;
+ UINT16 nTick, nValue;
+ nTick = LittleEndianW(imfins->nodes[e][n].tick);
+ nValue = LittleEndianW(imfins->nodes[e][n].value) >> shift;
+ env->Ticks[n] = (WORD)max(min, nTick);
+ env->Values[n] = (BYTE)min(nValue, 64);
+ min = nTick + 1;
}
// this would be less retarded if the envelopes all had their own flags...
if (imfins->env[e].flags & 1)
@@ -367,20 +259,22 @@
ins->dwFlags |= envflags[e][2];
}
-//int fmt_imf_load_song(CSoundFile *song, slurp_t *fp, UNUSED unsigned int lflags)
bool CSoundFile::ReadIMF(const LPCBYTE lpStream, const DWORD dwMemLength)
{
- DWORD dwMemPos;
+ #define ASSERT_CAN_READ(x) \
+ if( dwMemPos > dwMemLength || x > dwMemLength - dwMemPos ) return false;
+
+ DWORD dwMemPos = 0;
IMFHEADER hdr;
- int n, s;
MODSAMPLE *pSample = Samples + 1;
- int firstsample = 1; // first pSample for the current instrument
- UINT32 ignore_channels = 0; /* bit set for each channel that's completely disabled */
+ WORD firstsample = 1; // first pSample for the current instrument
+ UINT32 ignore_channels = 0; // bit set for each channel that's completely disabled
- //slurp_read(fp, &hdr, sizeof(hdr));
- if(sizeof(IMFHEADER) > dwMemLength) return false;
- memset(hdr, 0, sizeof(IMFHEADER));
- memcpy(hdr, lpStream, sizeof(IMFHEADER))
+ ASSERT_CAN_READ(sizeof(IMFHEADER));
+ memset(&hdr, 0, sizeof(IMFHEADER));
+ memcpy(&hdr, lpStream, sizeof(IMFHEADER));
+ dwMemPos = sizeof(IMFHEADER);
+
hdr.ordnum = LittleEndianW(hdr.ordnum);
hdr.patnum = LittleEndianW(hdr.patnum);
hdr.insnum = LittleEndianW(hdr.insnum);
@@ -390,56 +284,177 @@
return false;
ChangeModTypeTo(MOD_TYPE_IT);
+ SetModFlag(MSF_COMPATIBLE_PLAY, true);
// song name
memset(m_szNames, 0, sizeof(m_szNames));
- memcpy(m_szNames[0], hdr.title, 25);
- m_szNames[0][25] = 0;
+ memcpy(m_szNames[0], hdr.title, 31);
+ m_szNames[0][31] = 0;
SetNullTerminator(m_szNames[0]);
if (hdr.flags & 1)
m_dwSongFlags |= SONG_LINEARSLIDES;
- //m_dwSongFlags |= SONG_INSTRUMENTMODE;
m_nDefaultSpeed = hdr.tempo;
m_nDefaultTempo = hdr.bpm;
- m_nDefaultGlobalVolume = hdr.master << 1;
- m_nSamplePreAmp = hdr.amp;
+ m_nDefaultGlobalVolume = CLAMP(hdr.master, 0, 64) << 2;
+ m_nSamplePreAmp = CLAMP(hdr.amp, 4, 127);
+
+ m_nSamples = 0; // Will be incremented later
+ m_nInstruments = 0;
- for (n = 0; n < 32; n++) {
- Chn[n].nPan = hdr.channels[n].panning * 64 / 255;
- Chn[n].nPan *= 4; //mphack
- /* TODO: reverb/chorus??? */
- switch (hdr.channels[n].status) {
- case 0: /* enabled; don't worry about it */
+ m_nChannels = 32;
+ for (CHANNELINDEX nChn = 0; nChn < 32; nChn++) {
+ ChnSettings[nChn].nPan = hdr.channels[nChn].panning * 64 / 255;
+ ChnSettings[nChn].nPan *= 4;
+
+ memcpy(&ChnSettings[nChn].szName[0], hdr.channels[nChn].name, 12);
+ SetNullTerminator(ChnSettings[nChn].szName);
+
+ // TODO: reverb/chorus?
+ switch (hdr.channels[nChn].status) {
+ case 0: // enabled; don't worry about it
break;
- case 1: /* mute */
- Chn[n].dwFlags |= CHN_MUTE;
+ case 1: // mute
+ ChnSettings[nChn].dwFlags |= CHN_MUTE;
break;
- case 2: /* disabled */
- Chn[n].dwFlags |= CHN_MUTE;
- ignore_channels |= (1 << n);
+ case 2: // disabled
+ ChnSettings[nChn].dwFlags |= CHN_MUTE;
+ ignore_channels |= (1 << nChn);
break;
- default: /* uhhhh.... freak out */
+ default: // uhhhh.... freak out
//fprintf(stderr, "imf: channel %d has unknown status %d\n", n, hdr.channels[n].status);
return false;
}
}
- for (; n < MAX_CHANNELS; n++)
- Chn[n].dwFlags |= CHN_MUTE;
- for (n = 0; n < hdr.ordnum; n++)
- Order[n] = ((hdr.orderlist[n] == 0xff) ? Order.GetIgnoreIndex() : hdr.orderlist[n]);
+ for (ORDERINDEX nOrd = 0; nOrd < hdr.ordnum; nOrd++)
+ Order[nOrd] = ((hdr.orderlist[nOrd] == 0xff) ? Order.GetIgnoreIndex() : hdr.orderlist[nOrd]);
- for (n = 0; n < hdr.patnum; n++)
- load_imf_pattern(this, n, ignore_channels, fp);
-
- dwMemPos = sizeof(IMFHEADER);
+ // read patterns
+ for (PATTERNINDEX nPat = 0; nPat < hdr.patnum; nPat++)
+ {
+ UINT16 length, nrows;
+ BYTE mask, channel;
+ int row;
+ unsigned int lostfx = 0;
+ MODCOMMAND *row_data, *note, junk_note;
- for (n = 0; n < hdr.insnum; n++) {
- // read the ins header
- struct IMFINSTRUMENT imfins;
+ ASSERT_CAN_READ(4);
+ length = LittleEndianW(*((UINT16 *)(lpStream + dwMemPos)));
+ nrows = LittleEndianW(*((UINT16 *)(lpStream + dwMemPos + 2)));
+ dwMemPos += 4;
+
+ if(Patterns.Insert(nPat, nrows))
+ {
+ CString s;
+ s.Format(TEXT("Allocating patterns failed starting from pattern %u"), nPat);
+ MessageBox(NULL, s, TEXT("OpenMPT IMF import"), MB_ICONERROR);
+ break;
+ }
+ row_data = Patterns[nPat];
+
+ row = 0;
+ while (row < nrows) {
+ ASSERT_CAN_READ(1);
+ mask = *((BYTE *)(lpStream + dwMemPos));
+ dwMemPos += 1;
+ if (mask == 0) {
+ row++;
+ row_data += 32;
+ continue;
+ }
+
+ channel = mask & 0x1f;
+
+ if (ignore_channels & (1 << channel)) {
+ /* should do this better, i.e. not go through the whole process of deciding
+ what to do with the effects since they're just being thrown out */
+ //printf("disabled channel %d contains data\n", channel + 1);
+ note = &junk_note;
+ } else {
+ note = row_data + channel;
+ }
+
+ if (mask & 0x20) {
+ // read note/instrument
+ ASSERT_CAN_READ(2);
+ note->note = *((BYTE *)(lpStream + dwMemPos));
+ note->instr = *((BYTE *)(lpStream + dwMemPos + 1));
+ dwMemPos += 2;
+
+ if (note->note == 160) {
+ note->note = NOTE_KEYOFF; /* ??? */
+ } else if (note->note == 255) {
+ note->note = NOTE_NONE; /* ??? */
+ } else {
+ note->note = (note->note >> 4) * 12 + (note->note & 0xf) + 12 + 1;
+ if (note->note > NOTE_MAX) {
+ /*printf("%d.%d.%d: funny note 0x%02x\n",
+ nPat, row, channel, fp->data[fp->pos - 1]);*/
+ note->note = NOTE_NONE;
+ }
+ }
+ }
+ if ((mask & 0xc0) == 0xc0) {
+ BYTE e1c, e1d, e2c, e2d;
+
+ // read both effects and figure out what to do with them
+ ASSERT_CAN_READ(4);
+ e1c = *((BYTE *)(lpStream + dwMemPos));
+ e1d = *((BYTE *)(lpStream + dwMemPos + 1));
+ e2c = *((BYTE *)(lpStream + dwMemPos + 2));
+ e2d = *((BYTE *)(lpStream + dwMemPos + 3));
+ dwMemPos += 4;
+
+ if (e1c == 0xc) {
+ note->vol = min(e1d, 0x40);
+ note->volcmd = VOLCMD_VOLUME;
+ note->command = e2c;
+ note->param = e2d;
+ } else if (e2c == 0xc) {
+ note->vol = min(e2d, 0x40);
+ note->volcmd = VOLCMD_VOLUME;
+ note->command = e1c;
+ note->param = e1d;
+ } else if (e1c == 0xa) {
+ note->vol = e1d * 64 / 255;
+ note->volcmd = VOLCMD_PANNING;
+ note->command = e2c;
+ note->param = e2d;
+ } else if (e2c == 0xa) {
+ note->vol = e2d * 64 / 255;
+ note->volcmd = VOLCMD_PANNING;
+ note->command = e1c;
+ note->param = e1d;
+ } else {
+ /* check if one of the effects is a 'global' effect
+ -- if so, put it in some unused channel instead.
+ otherwise pick the most important effect. */
+ lostfx++;
+ note->command = e2c;
+ note->param = e2d;
+ }
+ } else if (mask & 0xc0) {
+ // there's one effect, just stick it in the effect column
+ ASSERT_CAN_READ(2);
+ note->command = *((BYTE *)(lpStream + dwMemPos));
+ note->param = *((BYTE *)(lpStream + dwMemPos + 1));
+ dwMemPos += 2;
+ }
+ if (note->command)
+ import_imf_effect(note);
+ }
+ }
+
+ // read instruments
+ for (INSTRUMENTINDEX nIns = 0; nIns < hdr.insnum; nIns++) {
+ IMFINSTRUMENT imfins;
MODINSTRUMENT *ins;
- slurp_read(fp, &imfins, sizeof(imfins));
+ ASSERT_CAN_READ(sizeof(IMFINSTRUMENT));
+ memset(&imfins, 0, sizeof(IMFINSTRUMENT));
+ memcpy(&imfins, lpStream + dwMemPos, sizeof(IMFINSTRUMENT));
+ dwMemPos += sizeof(IMFINSTRUMENT);
+ m_nInstruments++;
imfins.smpnum = LittleEndianW(imfins.smpnum);
imfins.fadeout = LittleEndianW(imfins.fadeout);
@@ -452,16 +467,16 @@
ins = new MODINSTRUMENT;
if (!ins) continue;
- Instruments[n + 1] = ins;
+ Instruments[nIns + 1] = ins;
memset(ins, 0, sizeof(MODINSTRUMENT));
strncpy(ins->name, imfins.name, 25);
ins->name[25] = 0;
if (imfins.smpnum) {
- for (s = 0; s < 120; s++) {
- ins->NoteMap[s] = s + 1;
- ins->Keyboard[s] = firstsample + imfins.map[s];
+ for (BYTE cNote = 0; cNote < 120; cNote++) {
+ ins->NoteMap[cNote] = cNote + 1;
+ ins->Keyboard[cNote] = firstsample + imfins.map[cNote];
}
}
@@ -487,13 +502,16 @@
if (!(ins->dwFlags & ENV_VOLUME) && !ins->nFadeOut)
ins->nFadeOut = 8192;
- for (s = 0; s < imfins.smpnum; s++) {
+ // read this instrument's samples
+ for (SAMPLEINDEX nSmp = 0; nSmp < imfins.smpnum; nSmp++) {
IMFSAMPLE imfsmp;
UINT32 blen;
- if(dwMemPos + sizeof(IMFSAMPLE) > dwMemLength) break;
- memset(imfsmp, 0, sizeof(IMFSAMPLE));
- memcpy(imfsmp, lpStream + dwMemPos, sizeof(IMFSAMPLE));
-
+ ASSERT_CAN_READ(sizeof(IMFSAMPLE));
+ memset(&imfsmp, 0, sizeof(IMFSAMPLE));
+ memcpy(&imfsmp, lpStream + dwMemPos, sizeof(IMFSAMPLE));
+ dwMemPos += sizeof(IMFSAMPLE);
+ m_nSamples++;
+
if (memcmp(imfsmp.is10, "IS10", 4) != 0) {
//printf("is10 says %02x %02x %02x %02x!\n",
// imfsmp.is10[0], imfsmp.is10[1], imfsmp.is10[2], imfsmp.is10[3]);
@@ -502,13 +520,14 @@
strncpy(pSample->filename, imfsmp.filename, 12);
pSample->filename[12] = 0;
- strcpy(m_szNames[s + 1], pSample->filename);
+ strcpy(m_szNames[nSmp + 1], pSample->filename);
blen = pSample->nLength = LittleEndian(imfsmp.length);
pSample->nLoopStart = LittleEndian(imfsmp.loop_start);
pSample->nLoopEnd = LittleEndian(imfsmp.loop_end);
pSample->nC5Speed = LittleEndian(imfsmp.C5Speed);
- pSample->nVolume = imfsmp.volume * 4; //mphack
- pSample->nPan = imfsmp.panning; //mphack (IT uses 0-64, IMF uses the full 0-255)
+ pSample->nVolume = imfsmp.volume * 4;
+ pSample->nGlobalVol = 256;
+ pSample->nPan = imfsmp.panning;
if (imfsmp.flags & 1)
pSample->uFlags |= CHN_LOOP;
if (imfsmp.flags & 2)
@@ -522,20 +541,17 @@
if (imfsmp.flags & 8)
pSample->uFlags |= CHN_PANNING;
- if (!blen) {
- /* leave it blank */
- /*} else if (lflags & LOAD_NOSAMPLES) {
- slurp_seek(fp, blen, SEEK_CUR);*/
- } else {
- ReadSample(pSample, (imfsmp.flags & 4) ? RS_PCM8U : RS_PCM16U, reinterpret_cast<LPCSTR>(lpStream + iSampleOffset), blen);
+ if(blen)
+ {
+ ASSERT_CAN_READ(blen);
+ ReadSample(pSample, (imfsmp.flags & 4) ? RS_PCM16S : RS_PCM8S, reinterpret_cast<LPCSTR>(lpStream + dwMemPos), blen);
}
+ dwMemPos += blen;
pSample++;
- dwMemPos += sizeof(IMFSAMPLE);
}
firstsample += imfins.smpnum;
}
return true;
-}
-#endif
\ No newline at end of file
+}
\ No newline at end of file
Modified: trunk/OpenMPT/soundlib/Load_mo3.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mo3.cpp 2009-08-16 11:55:06 UTC (rev 328)
+++ trunk/OpenMPT/soundlib/Load_mo3.cpp 2009-08-16 16:58:51 UTC (rev 329)
@@ -23,11 +23,15 @@
//-----------------------------------------------------------
{
// no valid MO3 file (magic bytes: "MO3")
- if(dwMemLength < 3 || lpStream[0] != 'M' || lpStream[1] != 'O' || lpStream[2] != '3')
+ if(dwMemLength < 4 || lpStream[0] != 'M' || lpStream[1] != 'O' || lpStream[2] != '3')
return false;
#ifdef NO_MO3_SUPPORT
- UNREFERENCED_PARAMETER(dwMemLength);
+ /* As of August 2009, the format revision is 5; Versions > 31 are unlikely to exist in the next few years,
+ so we will just ignore those if there's no UNMO3 library to tell us if the file is valid or not
+ (avoid messagebox with .MOD files that have a song name starting with "MO3" */
+ if(lpStream[3] > 31) return false;
+
AfxMessageBox(GetStrI18N(__TEXT("The file appears to be a MO3 file, but this OpenMPT build does not support loading MO3 files.")));
return false;
#else
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-16 11:55:06 UTC (rev 328)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-16 16:58:51 UTC (rev 329)
@@ -593,8 +593,9 @@
#endif // MODPLUG_TRACKER
#endif
#endif // MODPLUG_BASIC_SUPPORT
+ && (!ReadGDM(lpStream, dwMemLength))
+ && (!ReadIMF(lpStream, dwMemLength))
&& (!ReadMO3(lpStream, dwMemLength))
- && (!ReadGDM(lpStream, dwMemLength))
&& (!ReadMod(lpStream, dwMemLength))) m_nType = MOD_TYPE_NONE;
#ifdef ZIPPED_MOD_SUPPORT
if ((!m_lpszSongComments) && (archive.GetComments(FALSE)))
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-08-16 11:55:18
|
Revision: 328
http://modplug.svn.sourceforge.net/modplug/?rev=328&view=rev
Author: saga-games
Date: 2009-08-16 11:55:06 +0000 (Sun, 16 Aug 2009)
Log Message:
-----------
[Fix] VST Editor: Patches are now saved in the folder specified by the user in the "save as" dialog (not the working directory)
[Ref] Refactoring, part 3: The three envelopes are now sub-structs of MODINSTRUMENT to reduce redundancy. Based on the new structs, more parts of the code could be optimized.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/AbstractVstEditor.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/soundlib/Dlsbank.cpp
trunk/OpenMPT/soundlib/LOAD_DBM.CPP
trunk/OpenMPT/soundlib/Load_ams.cpp
trunk/OpenMPT/soundlib/Load_imf.cpp
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_mdl.cpp
trunk/OpenMPT/soundlib/Load_mid.cpp
trunk/OpenMPT/soundlib/Load_mt2.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
trunk/OpenMPT/soundlib/Sampleio.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/Sndmix.cpp
Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp
===================================================================
--- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2009-08-16 11:46:32 UTC (rev 327)
+++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2009-08-16 11:55:06 UTC (rev 328)
@@ -113,8 +113,8 @@
if (m_pVstPlugin)
{
CFileDialog dlg(TRUE, "fxp", NULL,
- OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_ENABLESIZING | OFN_NOREADONLYRETURN,
- "VST Program (*.fxp)|*.fxp||", theApp.m_pMainWnd);
+ OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_ENABLESIZING | OFN_NOREADONLYRETURN,
+ "VST Program (*.fxp)|*.fxp||", theApp.m_pMainWnd);
const LPCTSTR pszWdir = CMainFrame::GetWorkingDirectory(DIR_PLUGINPRESETS);
if(pszWdir[0])
dlg.m_ofn.lpstrInitialDir = pszWdir;
@@ -122,10 +122,11 @@
if (!(dlg.DoModal() == IDOK)) return;
- CMainFrame::SetWorkingDirectory(dlg.GetFileName(), DIR_PLUGINPRESETS, true);
+ CString sFile = dlg.GetPathName();
+ CMainFrame::SetWorkingDirectory(sFile, DIR_PLUGINPRESETS, true);
//TODO: exception handling to distinguish errors at this level.
- if (!(m_pVstPlugin->LoadProgram(dlg.GetFileName())))
+ if (!(m_pVstPlugin->LoadProgram(sFile)))
::AfxMessageBox("Error loading preset. Are you sure it is for this plugin?");
}
}
@@ -136,17 +137,18 @@
if (m_pVstPlugin)
{
CFileDialog dlg(FALSE, "fxp", NULL,
- OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_ENABLESIZING | OFN_NOREADONLYRETURN,
- "VST Program (*.fxp)|*.fxp||", theApp.m_pMainWnd);
+ OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_ENABLESIZING | OFN_NOREADONLYRETURN,
+ "VST Program (*.fxp)|*.fxp||", theApp.m_pMainWnd);
const LPCTSTR pszWdir = CMainFrame::GetWorkingDirectory(DIR_PLUGINPRESETS);
if(pszWdir[0])
dlg.m_ofn.lpstrInitialDir = pszWdir;
if (!(dlg.DoModal() == IDOK)) return;
- CMainFrame::SetWorkingDirectory(dlg.GetFileName(), DIR_PLUGINPRESETS, true);
+ CString sFile = dlg.GetPathName();
+ CMainFrame::SetWorkingDirectory(sFile, DIR_PLUGINPRESETS, true);
//TODO: exception handling
- if (!(m_pVstPlugin->SaveProgram(dlg.GetFileName())))
+ if (!(m_pVstPlugin->SaveProgram(sFile)))
::AfxMessageBox("Error saving preset.");
}
return;
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-16 11:46:32 UTC (rev 327)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-08-16 11:55:06 UTC (rev 328)
@@ -2323,45 +2323,45 @@
switch(nEnv)
{
case ENV_PANNING:
- pPoints = pIns->PanPoints;
- pValues = pIns->PanEnv;
- nPoints = pIns->nPanEnv;
+ pPoints = pIns->PanEnv.Ticks;
+ pValues = pIns->PanEnv.Values;
+ nPoints = pIns->PanEnv.nNodes;
bLoop = (pIns->dwFlags & ENV_PANLOOP) ? TRUE : FALSE;
bSus = (pIns->dwFlags & ENV_PANSUSTAIN) ? TRUE : FALSE;
bCarry = (pIns->dwFlags & ENV_PANCARRY) ? TRUE : FALSE;
- susBegin = pIns->nPanSustainBegin;
- susEnd = pIns->nPanSustainEnd;
- loopBegin = pIns->nPanLoopStart;
- loopEnd = pIns->nPanLoopEnd;
- releaseNode = pIns->nPanEnvReleaseNode;
+ susBegin = pIns->PanEnv.nSustainStart;
+ susEnd = pIns->PanEnv.nSustainEnd;
+ loopBegin = pIns->PanEnv.nLoopStart;
+ loopEnd = pIns->PanEnv.nLoopEnd;
+ releaseNode = pIns->PanEnv.nReleaseNode;
break;
case ENV_PITCH:
- pPoints = pIns->PitchPoints;
- pValues = pIns->PitchEnv;
- nPoints = pIns->nPitchEnv;
+ pPoints = pIns->PitchEnv.Ticks;
+ pValues = pIns->PitchEnv.Values;
+ nPoints = pIns->PitchEnv.nNodes;
bLoop = (pIns->dwFlags & ENV_PITCHLOOP) ? TRUE : FALSE;
bSus = (pIns->dwFlags & ENV_PITCHSUSTAIN) ? TRUE : FALSE;
bCarry = (pIns->dwFlags & ENV_PITCHCARRY) ? TRUE : FALSE;
- susBegin = pIns->nPitchSustainBegin;
- susEnd = pIns->nPitchSustainEnd;
- loopBegin = pIns->nPitchLoopStart;
- loopEnd = pIns->nPitchLoopEnd;
- releaseNode = pIns->nPitchEnvReleaseNode;
+ susBegin = pIns->PitchEnv.nSustainStart;
+ susEnd = pIns->PitchEnv.nSustainEnd;
+ loopBegin = pIns->PitchEnv.nLoopStart;
+ loopEnd = pIns->PitchEnv.nLoopEnd;
+ releaseNode = pIns->PitchEnv.nReleaseNode;
break;
default:
- pPoints = pIns->VolPoints;
- pValues = pIns->VolEnv;
- nPoints = pIns->nVolEnv;
+ pPoints = pIns->VolEnv.Ticks;
+ pValues = pIns->VolEnv.Values;
+ nPoints = pIns->VolEnv.nNodes;
bLoop = (pIns->dwFlags & ENV_VOLLOOP) ? TRUE : FALSE;
bSus = (pIns->dwFlags & ENV_VOLSUSTAIN) ? TRUE : FALSE;
bCarry = (pIns->dwFlags & ENV_VOLCARRY) ? TRUE : FALSE;
- susBegin = pIns->nVolSustainBegin;
- susEnd = pIns->nVolSustainEnd;
- loopBegin = pIns->nVolLoopStart;
- loopEnd = pIns->nVolLoopEnd;
- releaseNode = pIns->nVolEnvReleaseNode;
+ susBegin = pIns->VolEnv.nSustainStart;
+ susEnd = pIns->VolEnv.nSustainEnd;
+ loopBegin = pIns->VolEnv.nLoopStart;
+ loopEnd = pIns->VolEnv.nLoopEnd;
+ releaseNode = pIns->VolEnv.nReleaseNode;
break;
}
strcpy(s, pszEnvHdr);
@@ -2440,48 +2440,48 @@
switch(nEnv)
{
case ENV_PANNING:
- pPoints = pIns->PanPoints;
- pValues = pIns->PanEnv;
- pIns->nPanEnv = nPoints;
+ pPoints = pIns->PanEnv.Ticks;
+ pValues = pIns->PanEnv.Values;
+ pIns->PanEnv.nNodes = nPoints;
pIns->dwFlags &= ~(ENV_PANLOOP|ENV_PANSUSTAIN|ENV_PANCARRY);
if (bLoop) pIns->dwFlags |= ENV_PANLOOP;
if (bSus) pIns->dwFlags |= ENV_PANSUSTAIN;
if (bCarry) pIns->dwFlags |= ENV_PANCARRY;
- pIns->nPanSustainBegin = susBegin;
- pIns->nPanSustainEnd = susEnd;
- pIns->nPanLoopStart = loopBegin;
- pIns->nPanLoopEnd = loopEnd;
- pIns->nPanEnvReleaseNode = releaseNode;
+ pIns->PanEnv.nSustainStart = susBegin;
+ pIns->PanEnv.nSustainEnd = susEnd;
+ pIns->PanEnv.nLoopStart = loopBegin;
+ pIns->PanEnv.nLoopEnd = loopEnd;
+ pIns->PanEnv.nReleaseNode = releaseNode;
break;
case ENV_PITCH:
- pPoints = pIns->PitchPoints;
- pValues = pIns->PitchEnv;
- pIns->nPitchEnv = nPoints;
+ pPoints = pIns->PitchEnv.Ticks;
+ pValues = pIns->PitchEnv.Values;
+ pIns->PitchEnv.nNodes = nPoints;
pIns->dwFlags &= ~(ENV_PITCHLOOP|ENV_PITCHSUSTAIN|ENV_PITCHCARRY);
if (bLoop) pIns->dwFlags |= ENV_PITCHLOOP;
if (bSus) pIns->dwFlags |= ENV_PITCHSUSTAIN;
if (bCarry) pIns->dwFlags |= ENV_PITCHCARRY;
- pIns->nPitchSustainBegin = susBegin;
- pIns->nPitchSustainEnd = susEnd;
- pIns->nPitchLoopStart = loopBegin;
- pIns->nPitchLoopEnd = loopEnd;
- pIns->nPitchEnvReleaseNode = releaseNode;
+ pIns->PitchEnv.nSustainStart = susBegin;
+ pIns->PitchEnv.nSustainEnd = susEnd;
+ pIns->PitchEnv.nLoopStart = loopBegin;
+ pIns->PitchEnv.nLoopEnd = loopEnd;
+ pIns->PitchEnv.nReleaseNode = releaseNode;
break;
default:
- pPoints = pIns->VolPoints;
- pValues = pIns->VolEnv;
- pIns->nVolEnv = nPoints;
+ pPoints = pIns->VolEnv.Ticks;
+ pValues = pIns->VolEnv.Values;
+ pIns->VolEnv.nNodes = nPoints;
pIns->dwFlags &= ~(ENV_VOLLOOP|ENV_VOLSUSTAIN|ENV_VOLCARRY);
if (bLoop) pIns->dwFlags |= ENV_VOLLOOP;
if (bSus) pIns->dwFlags |= ENV_VOLSUSTAIN;
if (bCarry) pIns->dwFlags |= ENV_VOLCARRY;
- pIns->nVolSustainBegin = susBegin;
- pIns->nVolSustainEnd = susEnd;
- pIns->nVolLoopStart = loopBegin;
- pIns->nVolLoopEnd = loopEnd;
- pIns->nVolEnvReleaseNode = releaseNode;
+ pIns->VolEnv.nSustainStart = susBegin;
+ pIns->VolEnv.nSustainEnd = susEnd;
+ pIns->VolEnv.nLoopStart = loopBegin;
+ pIns->VolEnv.nLoopEnd = loopEnd;
+ pIns->VolEnv.nReleaseNode = releaseNode;
break;
}
int oldn = 0;
@@ -2510,15 +2510,15 @@
switch(nEnv)
{
case ENV_PANNING:
- pIns->nPanEnvReleaseNode = r;
+ pIns->PanEnv.nReleaseNode = r;
break;
case ENV_PITCH:
- pIns->nPitchEnvReleaseNode = r;
+ pIns->PitchEnv.nReleaseNode = r;
break;
default:
- pIns->nVolEnvReleaseNode = r;
+ pIns->VolEnv.nReleaseNode = r;
break;
}
}
Modified: trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp
===================================================================
--- trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp 2009-08-16 11:46:32 UTC (rev 327)
+++ trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp 2009-08-16 11:55:06 UTC (rev 328)
@@ -50,18 +50,18 @@
switch(m_Env)
{
case ENV_VOLUME:
- array = &m_pInstrument->VolPoints;
- arraySize = &m_pInstrument->nVolEnv;
+ array = &m_pInstrument->VolEnv.Ticks;
+ arraySize = &m_pInstrument->VolEnv.nNodes;
break;
case ENV_PANNING:
- array = &m_pInstrument->PanPoints;
- arraySize = &m_pInstrument->nPanEnv;
+ array = &m_pInstrument->PanEnv.Ticks;
+ arraySize = &m_pInstrument->PanEnv.nNodes;
break;
case ENV_PITCH:
- array = &m_pInstrument->PitchPoints;
- arraySize = &m_pInstrument->nPitchEnv;
+ array = &m_pInstrument->PitchEnv.Ticks;
+ arraySize = &m_pInstrument->PitchEnv.nNodes;
break;
}
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2009-08-16 11:46:32 UTC (rev 327)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-08-16 11:55:06 UTC (rev 328)
@@ -225,13 +225,13 @@
switch(m_nEnv)
{
case ENV_VOLUME:
- if (nPoint < (int)pIns->nVolEnv) return pIns->VolPoints[nPoint];
+ if (nPoint < (int)pIns->VolEnv.nNodes) return pIns->VolEnv.Ticks[nPoint];
break;
case ENV_PANNING:
- if (nPoint < (int)pIns->nPanEnv) return pIns->PanPoints[nPoint];
+ if (nPoint < (int)pIns->PanEnv.nNodes) return pIns->PanEnv.Ticks[nPoint];
break;
case ENV_PITCH:
- if (nPoint < (int)pIns->nPitchEnv) return pIns->PitchPoints[nPoint];
+ if (nPoint < (int)pIns->PitchEnv.nNodes) return pIns->PitchEnv.Ticks[nPoint];
break;
}
}
@@ -253,13 +253,13 @@
switch(m_nEnv)
{
case ENV_VOLUME:
- if (nPoint < (int)pIns->nVolEnv) return pIns->VolEnv[nPoint];
+ if (nPoint < (int)pIns->VolEnv.nNodes) return pIns->VolEnv.Values[nPoint];
break;
case ENV_PANNING:
- if (nPoint < (int)pIns->nPanEnv) return pIns->PanEnv[nPoint];
+ if (nPoint < (int)pIns->PanEnv.nNodes) return pIns->PanEnv.Values[nPoint];
break;
case ENV_PITCH:
- if (nPoint < (int)pIns->nPitchEnv) return pIns->PitchEnv[nPoint];
+ if (nPoint < (int)pIns->PitchEnv.nNodes) return pIns->PitchEnv.Values[nPoint];
break;
}
}
@@ -285,19 +285,19 @@
switch(m_nEnv)
{
case ENV_VOLUME:
- maxpoints = pIns->nVolEnv;
- pPoints = pIns->VolPoints;
- pData = pIns->VolEnv;
+ maxpoints = pIns->VolEnv.nNodes;
+ pPoints = pIns->VolEnv.Ticks;
+ pData = pIns->VolEnv.Values;
break;
case ENV_PANNING:
- maxpoints = pIns->nPanEnv;
- pPoints = pIns->PanPoints;
- pData = pIns->PanEnv;
+ maxpoints = pIns->PanEnv.nNodes;
+ pPoints = pIns->PanEnv.Ticks;
+ pData = pIns->PanEnv.Values;
break;
case ENV_PITCH:
- maxpoints = pIns->nPitchEnv;
- pPoints = pIns->PitchPoints;
- pData = pIns->PitchEnv;
+ maxpoints = pIns->PitchEnv.nNodes;
+ pPoints = pIns->PitchEnv.Ticks;
+ pData = pIns->PitchEnv.Values;
break;
}
if (!nPoint) nTick = 0;
@@ -345,13 +345,13 @@
switch(m_nEnv)
{
case ENV_VOLUME:
- if (pIns->nVolEnv) return pIns->nVolEnv;
+ if (pIns->VolEnv.nNodes) return pIns->VolEnv.nNodes;
break;
case ENV_PANNING:
- if (pIns->nPanEnv) return pIns->nPanEnv;
+ if (pIns->PanEnv.nNodes) return pIns->PanEnv.nNodes;
break;
case ENV_PITCH:
- if (pIns->nPitchEnv) return pIns->nPitchEnv;
+ if (pIns->PitchEnv.nNodes) return pIns->PitchEnv.nNodes;
break;
}
}
@@ -465,9 +465,9 @@
{
switch(m_nEnv)
{
- case ENV_VOLUME: return pIns->nVolLoopStart;
- case ENV_PANNING: return pIns->nPanLoopStart;
- case ENV_PITCH: return pIns->nPitchLoopStart;
+ case ENV_VOLUME: return pIns->VolEnv.nLoopStart;
+ case ENV_PANNING: return pIns->PanEnv.nLoopStart;
+ case ENV_PITCH: return pIns->PitchEnv.nLoopStart;
}
}
}
@@ -487,9 +487,9 @@
{
switch(m_nEnv)
{
- case ENV_VOLUME: return pIns->nVolLoopEnd;
- case ENV_PANNING: return pIns->nPanLoopEnd;
- case ENV_PITCH: return pIns->nPitchLoopEnd;
+ case ENV_VOLUME: return pIns->VolEnv.nLoopEnd;
+ case ENV_PANNING: return pIns->PanEnv.nLoopEnd;
+ case ENV_PITCH: return pIns->PitchEnv.nLoopEnd;
}
}
}
@@ -509,9 +509,9 @@
{
switch(m_nEnv)
{
- case ENV_VOLUME: return pIns->nVolSustainBegin;
- case ENV_PANNING: return pIns->nPanSustainBegin;
- case ENV_PITCH: return pIns->nPitchSustainBegin;
+ case ENV_VOLUME: return pIns->VolEnv.nSustainStart;
+ case ENV_PANNING: return pIns->PanEnv.nSustainStart;
+ case ENV_PITCH: return pIns->PitchEnv.nSustainStart;
}
}
}
@@ -531,9 +531,9 @@
{
switch(m_nEnv)
{
- case ENV_VOLUME: return pIns->nVolSustainEnd;
- case ENV_PANNING: return pIns->nPanSustainEnd;
- case ENV_PITCH: return pIns->nPitchSustainEnd;
+ case ENV_VOLUME: return pIns->VolEnv.nSustainEnd;
+ case ENV_PANNING: return pIns->PanEnv.nSustainEnd;
+ case ENV_PITCH: return pIns->PitchEnv.nSustainEnd;
}
}
}
@@ -610,26 +610,26 @@
switch(m_nEnv)
{
case ENV_VOLUME:
- if (nPoint != pIns->nVolLoopStart)
+ if (nPoint != pIns->VolEnv.nLoopStart)
{
- pIns->nVolLoopStart = (BYTE)nPoint;
- if (pIns->nVolLoopEnd < nPoint) pIns->nVolLoopEnd = (BYTE)nPoint;
+ pIns->VolEnv.nLoopStart = (BYTE)nPoint;
+ if (pIns->VolEnv.nLoopEnd < nPoint) pIns->VolEnv.nLoopEnd = (BYTE)nPoint;
return TRUE;
}
break;
case ENV_PANNING:
- if (nPoint != pIns->nPanLoopStart)
+ if (nPoint != pIns->PanEnv.nLoopStart)
{
- pIns->nPanLoopStart = (BYTE)nPoint;
- if (pIns->nPanLoopEnd < nPoint) pIns->nPanLoopEnd = (BYTE)nPoint;
+ pIns->PanEnv.nLoopStart = (BYTE)nPoint;
+ if (pIns->PanEnv.nLoopEnd < nPoint) pIns->PanEnv.nLoopEnd = (BYTE)nPoint;
return TRUE;
}
break;
case ENV_PITCH:
- if (nPoint != pIns->nPitchLoopStart)
+ if (nPoint != pIns->PitchEnv.nLoopStart)
{
- pIns->nPitchLoopStart = (BYTE)nPoint;
- if (pIns->nPitchLoopEnd < nPoint) pIns->nPitchLoopEnd = (BYTE)nPoint;
+ pIns->PitchEnv.nLoopStart = (BYTE)nPoint;
+ if (pIns->PitchEnv.nLoopEnd < nPoint) pIns->PitchEnv.nLoopEnd = (BYTE)nPoint;
return TRUE;
}
break;
@@ -653,26 +653,26 @@
switch(m_nEnv)
{
case ENV_VOLUME:
- if (nPoint != pIns->nVolLoopEnd)
+ if (nPoint != pIns->VolEnv.nLoopEnd)
{
- pIns->nVolLoopEnd = (BYTE)nPoint;
- if (pIns->nVolLoopStart > nPoint) pIns->nVolLoopStart = (BYTE)nPoint;
+ pIns->VolEnv.nLoopEnd = (BYTE)nPoint;
+ if (pIns->VolEnv.nLoopStart > nPoint) pIns->VolEnv.nLoopStart = (BYTE)nPoint;
return TRUE;
}
break;
case ENV_PANNING:
- if (nPoint != pIns->nPanLoopEnd)
+ if (nPoint != pIns->PanEnv.nLoopEnd)
{
- pIns->nPanLoopEnd = (BYTE)nPoint;
- if (pIns->nPanLoopStart > nPoint) pIns->nPanLoopStart = (BYTE)nPoint;
+ pIns->PanEnv.nLoopEnd = (BYTE)nPoint;
+ if (pIns->PanEnv.nLoopStart > nPoint) pIns->PanEnv.nLoopStart = (BYTE)nPoint;
return TRUE;
}
break;
case ENV_PITCH:
- if (nPoint != pIns->nPitchLoopEnd)
+ if (nPoint != pIns->PitchEnv.nLoopEnd)
{
- pIns->nPitchLoopEnd = (BYTE)nPoint;
- if (pIns->nPitchLoopStart > nPoint) pIns->nPitchLoopStart = (BYTE)nPoint;
+ pIns->PitchEnv.nLoopEnd = (BYTE)nPoint;
+ if (pIns->PitchEnv.nLoopStart > nPoint) pIns->PitchEnv.nLoopStart = (BYTE)nPoint;
return TRUE;
}
break;
@@ -696,26 +696,26 @@
switch(m_nEnv)
{
case ENV_VOLUME:
- if (nPoint != pIns->nVolSustainBegin)
+ if (nPoint != pIns->VolEnv.nSustainStart)
{
- pIns->nVolSustainBegin = (BYTE)nPoint;
- if ((pIns->nVolSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->nVolSustainEnd = (BYTE)nPoint;
+ pIns->VolEnv.nSustainStart = (BYTE)nPoint;
+ if ((pIns->VolEnv.nSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->VolEnv.nSustainEnd = (BYTE)nPoint;
return TRUE;
}
break;
case ENV_PANNING:
- if (nPoint != pIns->nPanSustainBegin)
+ if (nPoint != pIns->PanEnv.nSustainStart)
{
- pIns->nPanSustainBegin = (BYTE)nPoint;
- if ((pIns->nPanSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->nPanSustainEnd = (BYTE)nPoint;
+ pIns->PanEnv.nSustainStart = (BYTE)nPoint;
+ if ((pIns->PanEnv.nSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->PanEnv.nSustainEnd = (BYTE)nPoint;
return TRUE;
}
break;
case ENV_PITCH:
- if (nPoint != pIns->nPitchSustainBegin)
+ if (nPoint != pIns->PitchEnv.nSustainStart)
{
- pIns->nPitchSustainBegin = (BYTE)nPoint;
- if ((pIns->nPitchSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->nPitchSustainEnd = (BYTE)nPoint;
+ pIns->PitchEnv.nSustainStart = (BYTE)nPoint;
+ if ((pIns->PitchEnv.nSustainEnd < nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->PitchEnv.nSustainEnd = (BYTE)nPoint;
return TRUE;
}
break;
@@ -739,26 +739,26 @@
switch(m_nEnv)
{
case ENV_VOLUME:
- if (nPoint != pIns->nVolSustainEnd)
+ if (nPoint != pIns->VolEnv.nSustainEnd)
{
- pIns->nVolSustainEnd = (BYTE)nPoint;
- if ((pIns->nVolSustainBegin > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->nVolSustainBegin = (BYTE)nPoint;
+ pIns->VolEnv.nSustainEnd = (BYTE)nPoint;
+ if ((pIns->VolEnv.nSustainStart > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->VolEnv.nSustainStart = (BYTE)nPoint;
return TRUE;
}
break;
case ENV_PANNING:
- if (nPoint != pIns->nPanSustainEnd)
+ if (nPoint != pIns->PanEnv.nSustainEnd)
{
- pIns->nPanSustainEnd = (BYTE)nPoint;
- if ((pIns->nPanSustainBegin > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->nPanSustainBegin = (BYTE)nPoint;
+ pIns->PanEnv.nSustainEnd = (BYTE)nPoint;
+ if ((pIns->PanEnv.nSustainStart > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->PanEnv.nSustainStart = (BYTE)nPoint;
return TRUE;
}
break;
case ENV_PITCH:
- if (nPoint != pIns->nPitchSustainEnd)
+ if (nPoint != pIns->PitchEnv.nSustainEnd)
{
- pIns->nPitchSustainEnd = (BYTE)nPoint;
- if ((pIns->nPitchSustainBegin > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->nPitchSustainBegin = (BYTE)nPoint;
+ pIns->PitchEnv.nSustainEnd = (BYTE)nPoint;
+ if ((pIns->PitchEnv.nSustainStart > nPoint) || (pSndFile->m_nType & MOD_TYPE_XM)) pIns->PitchEnv.nSustainStart = (BYTE)nPoint;
return TRUE;
}
break;
@@ -899,13 +899,13 @@
if (bEnable)
{
pIns->dwFlags |= ENV_VOLUME;
- if (!pIns->nVolEnv)
+ if (!pIns->VolEnv.nNodes)
{
- pIns->VolEnv[0] = 64;
- pIns->VolEnv[1] = 64;
- pIns->VolPoints[0] = 0;
- pIns->VolPoints[1] = 10;
- pIns->nVolEnv = 2;
+ pIns->VolEnv.Values[0] = 64;
+ pIns->VolEnv.Values[1] = 64;
+ pIns->VolEnv.Ticks[0] = 0;
+ pIns->VolEnv.Ticks[1] = 10;
+ pIns->VolEnv.nNodes = 2;
InvalidateRect(NULL, FALSE);
}
} else
@@ -932,13 +932,13 @@
if (bEnable)
{
pIns->dwFlags |= ENV_PANNING;
- if (!pIns->nPanEnv)
+ if (!pIns->PanEnv.nNodes)
{
- pIns->PanEnv[0] = 32;
- pIns->PanEnv[1] = 32;
- pIns->PanPoints[0] = 0;
- pIns->PanPoints[1] = 10;
- pIns->nPanEnv = 2;
+ pIns->PanEnv.Values[0] = 32;
+ pIns->PanEnv.Values[1] = 32;
+ pIns->PanEnv.Ticks[0] = 0;
+ pIns->PanEnv.Ticks[1] = 10;
+ pIns->PanEnv.nNodes = 2;
InvalidateRect(NULL, FALSE);
}
} else
@@ -966,13 +966,13 @@
{
pIns->dwFlags |= ENV_PITCH;
pIns->dwFlags &= ~ENV_FILTER;
- if (!pIns->nPitchEnv)
+ if (!pIns->PitchEnv.nNodes)
{
- pIns->PitchEnv[0] = 32;
- pIns->PitchEnv[1] = 32;
- pIns->PitchPoints[0] = 0;
- pIns->PitchPoints[1] = 10;
- pIns->nPitchEnv = 2;
+ pIns->PitchEnv.Values[0] = 32;
+ pIns->PitchEnv.Values[1] = 32;
+ pIns->PitchEnv.Ticks[0] = 0;
+ pIns->PitchEnv.Ticks[1] = 10;
+ pIns->PitchEnv.nNodes = 2;
InvalidateRect(NULL, FALSE);
}
} else
@@ -999,13 +999,13 @@
if ((bEnable) && (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)))
{
pIns->dwFlags |= (ENV_PITCH|ENV_FILTER);
- if (!pIns->nPitchEnv)
+ if (!pIns->PitchEnv.nNodes)
{
- pIns->PitchEnv[0] = 64;
- pIns->PitchEnv[1] = 64;
- pIns->PitchPoints[0] = 0;
- pIns->PitchPoints[1] = 10;
- pIns->nPitchEnv = 2;
+ pIns->PitchEnv.Values[0] = 64;
+ pIns->PitchEnv.Values[1] = 64;
+ pIns->PitchEnv.Ticks[0] = 0;
+ pIns->PitchEnv.Ticks[1] = 10;
+ pIns->PitchEnv.nNodes = 2;
InvalidateRect(NULL, FALSE);
}
} else
@@ -1360,11 +1360,11 @@
if (pIns) {
switch(m_nEnv) {
case ENV_VOLUME:
- return pIns->nVolEnvReleaseNode;
+ return pIns->VolEnv.nReleaseNode;
case ENV_PANNING:
- return pIns->nPanEnvReleaseNode;
+ return pIns->PanEnv.nReleaseNode;
case ENV_PITCH:
- return pIns->nPitchEnvReleaseNode;
+ return pIns->PitchEnv.nReleaseNode;
default:
return ENV_RELEASE_NODE_UNSET;
}
@@ -1383,11 +1383,11 @@
if (pIns) {
switch(m_nEnv) {
case ENV_VOLUME:
- return pIns->VolEnv[EnvGetReleaseNode()];
+ return pIns->VolEnv.Values[EnvGetReleaseNode()];
case ENV_PANNING:
- return pIns->PanEnv[EnvGetReleaseNode()];
+ return pIns->PanEnv.Values[EnvGetReleaseNode()];
case ENV_PITCH:
- return pIns->PitchEnv[EnvGetReleaseNode()];
+ return pIns->PitchEnv.Values[EnvGetReleaseNode()];
default:
return 0;
}
@@ -1406,11 +1406,11 @@
if (pIns) {
switch(m_nEnv) {
case ENV_VOLUME:
- return pIns->VolPoints[EnvGetReleaseNode()];
+ return pIns->VolEnv.Ticks[EnvGetReleaseNode()];
case ENV_PANNING:
- return pIns->PanPoints[EnvGetReleaseNode()];
+ return pIns->PanEnv.Ticks[EnvGetReleaseNode()];
case ENV_PITCH:
- return pIns->PitchPoints[EnvGetReleaseNode()];
+ return pIns->PitchEnv.Ticks[EnvGetReleaseNode()];
default:
return 0;
}
@@ -2056,24 +2056,24 @@
MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
switch(m_nEnv) {
case ENV_VOLUME:
- if (pIns->nVolEnvReleaseNode == node) {
- pIns->nVolEnvReleaseNode = ENV_RELEASE_NODE_UNSET;
+ if (pIns->VolEnv.nReleaseNode == node) {
+ pIns->VolEnv.nReleaseNode = ENV_RELEASE_NODE_UNSET;
} else {
- pIns->nVolEnvReleaseNode = node;
+ pIns->VolEnv.nReleaseNode = node;
}
break;
case ENV_PANNING:
- if (pIns->nPanEnvReleaseNode == node) {
- pIns->nPanEnvReleaseNode = ENV_RELEASE_NODE_UNSET;
+ if (pIns->PanEnv.nReleaseNode == node) {
+ pIns->PanEnv.nReleaseNode = ENV_RELEASE_NODE_UNSET;
} else {
- pIns->nPanEnvReleaseNode = node;
+ pIns->PanEnv.nReleaseNode = node;
}
break;
case ENV_PITCH:
- if (pIns->nPitchEnvReleaseNode == node) {
- pIns->nPitchEnvReleaseNode = ENV_RELEASE_NODE_UNSET;
+ if (pIns->PitchEnv.nReleaseNode == node) {
+ pIns->PitchEnv.nReleaseNode = ENV_RELEASE_NODE_UNSET;
} else {
- pIns->nPitchEnvReleaseNode = node;
+ pIns->PitchEnv.nReleaseNode = node;
}
break;
}
@@ -2159,59 +2159,59 @@
switch(m_nEnv)
{
case ENV_VOLUME:
- if (pIns->nVolEnv > 1)
+ if (pIns->VolEnv.nNodes > 1)
{
- pIns->nVolEnv--;
- for (UINT i=nPoint; i<pIns->nVolEnv; i++)
+ pIns->VolEnv.nNodes--;
+ for (UINT i=nPoint; i<pIns->VolEnv.nNodes; i++)
{
- pIns->VolPoints[i] = pIns->VolPoints[i+1];
- pIns->VolEnv[i] = pIns->VolEnv[i+1];
+ pIns->VolEnv.Ticks[i] = pIns->VolEnv.Ticks[i+1];
+ pIns->VolEnv.Values[i] = pIns->VolEnv.Values[i+1];
}
- if (nPoint >= pIns->nVolEnv) nPoint = pIns->nVolEnv-1;
- if (pIns->nVolLoopStart > nPoint) pIns->nVolLoopStart--;
- if (pIns->nVolLoopEnd > nPoint) pIns->nVolLoopEnd--;
- if (pIns->nVolSustainBegin > nPoint) pIns->nVolSustainBegin--;
- if (pIns->nVolSustainEnd > nPoint) pIns->nVolSustainEnd--;
- if (pIns->nVolEnvReleaseNode>nPoint && pIns->nVolEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->nVolEnvReleaseNode--;
- pIns->VolPoints[0] = 0;
+ if (nPoint >= pIns->VolEnv.nNodes) nPoint = pIns->VolEnv.nNodes-1;
+ if (pIns->VolEnv.nLoopStart > nPoint) pIns->VolEnv.nLoopStart--;
+ if (pIns->VolEnv.nLoopEnd > nPoint) pIns->VolEnv.nLoopEnd--;
+ if (pIns->VolEnv.nSustainStart > nPoint) pIns->VolEnv.nSustainStart--;
+ if (pIns->VolEnv.nSustainEnd > nPoint) pIns->VolEnv.nSustainEnd--;
+ if (pIns->VolEnv.nReleaseNode>nPoint && pIns->VolEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->VolEnv.nReleaseNode--;
+ pIns->VolEnv.Ticks[0] = 0;
bOk = TRUE;
}
break;
case ENV_PANNING:
- if (pIns->nPanEnv > 1)
+ if (pIns->PanEnv.nNodes > 1)
{
- pIns->nPanEnv--;
- for (UINT i=nPoint; i<pIns->nPanEnv; i++)
+ pIns->PanEnv.nNodes--;
+ for (UINT i=nPoint; i<pIns->PanEnv.nNodes; i++)
{
- pIns->PanPoints[i] = pIns->PanPoints[i+1];
- pIns->PanEnv[i] = pIns->PanEnv[i+1];
+ pIns->PanEnv.Ticks[i] = pIns->PanEnv.Ticks[i+1];
+ pIns->PanEnv.Values[i] = pIns->PanEnv.Values[i+1];
}
- if (nPoint >= pIns->nPanEnv) nPoint = pIns->nPanEnv-1;
- if (pIns->nPanLoopStart > nPoint) pIns->nPanLoopStart--;
- if (pIns->nPanLoopEnd > nPoint) pIns->nPanLoopEnd--;
- if (pIns->nPanSustainBegin > nPoint) pIns->nPanSustainBegin--;
- if (pIns->nPanSustainEnd > nPoint) pIns->nPanSustainEnd--;
- if (pIns->nPanEnvReleaseNode>nPoint && pIns->nPanEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->nPanEnvReleaseNode--;
- pIns->PanPoints[0] = 0;
+ if (nPoint >= pIns->PanEnv.nNodes) nPoint = pIns->PanEnv.nNodes-1;
+ if (pIns->PanEnv.nLoopStart > nPoint) pIns->PanEnv.nLoopStart--;
+ if (pIns->PanEnv.nLoopEnd > nPoint) pIns->PanEnv.nLoopEnd--;
+ if (pIns->PanEnv.nSustainStart > nPoint) pIns->PanEnv.nSustainStart--;
+ if (pIns->PanEnv.nSustainEnd > nPoint) pIns->PanEnv.nSustainEnd--;
+ if (pIns->PanEnv.nReleaseNode>nPoint && pIns->PanEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->PanEnv.nReleaseNode--;
+ pIns->PanEnv.Ticks[0] = 0;
bOk = TRUE;
}
break;
case ENV_PITCH:
- if (pIns->nPitchEnv > 1)
+ if (pIns->PitchEnv.nNodes > 1)
{
- pIns->nPitchEnv--;
- for (UINT i=nPoint; i<pIns->nPitchEnv; i++)
+ pIns->PitchEnv.nNodes--;
+ for (UINT i=nPoint; i<pIns->PitchEnv.nNodes; i++)
{
- pIns->PitchPoints[i] = pIns->PitchPoints[i+1];
- pIns->PitchEnv[i] = pIns->PitchEnv[i+1];
+ pIns->PitchEnv.Ticks[i] = pIns->PitchEnv.Ticks[i+1];
+ pIns->PitchEnv.Values[i] = pIns->PitchEnv.Values[i+1];
}
- if (nPoint >= pIns->nPitchEnv) nPoint = pIns->nPitchEnv-1;
- if (pIns->nPitchLoopStart > nPoint) pIns->nPitchLoopStart--;
- if (pIns->nPitchLoopEnd > nPoint) pIns->nPitchLoopEnd--;
- if (pIns->nPitchSustainBegin > nPoint) pIns->nPitchSustainBegin--;
- if (pIns->nPitchSustainEnd > nPoint) pIns->nPitchSustainEnd--;
- if (pIns->nPitchEnvReleaseNode>nPoint && pIns->nPitchEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->nPitchEnvReleaseNode--;
- pIns->PitchPoints[0] = 0;
+ if (nPoint >= pIns->PitchEnv.nNodes) nPoint = pIns->PitchEnv.nNodes-1;
+ if (pIns->PitchEnv.nLoopStart > nPoint) pIns->PitchEnv.nLoopStart--;
+ if (pIns->PitchEnv.nLoopEnd > nPoint) pIns->PitchEnv.nLoopEnd--;
+ if (pIns->PitchEnv.nSustainStart > nPoint) pIns->PitchEnv.nSustainStart--;
+ if (pIns->PitchEnv.nSustainEnd > nPoint) pIns->PitchEnv.nSustainEnd--;
+ if (pIns->PitchEnv.nReleaseNode>nPoint && pIns->PitchEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->PitchEnv.nReleaseNode--;
+ pIns->PitchEnv.Ticks[0] = 0;
bOk = TRUE;
}
break;
@@ -2247,83 +2247,83 @@
if (nTick >= 0) switch(m_nEnv)
{
case ENV_VOLUME:
- if (pIns->nVolEnv < maxpoints)
+ if (pIns->VolEnv.nNodes < maxpoints)
{
- if (!pIns->nVolEnv)
+ if (!pIns->VolEnv.nNodes)
{
- pIns->VolPoints[0] = 0;
- pIns->VolEnv[0] = 64;
- pIns->nVolEnv = 1;
+ pIns->VolEnv.Ticks[0] = 0;
+ pIns->VolEnv.Values[0] = 64;
+ pIns->VolEnv.nNodes = 1;
}
UINT i = 0;
- for (i=0; i<pIns->nVolEnv; i++) if (nTick <= pIns->VolPoints[i]) break;
- for (UINT j=pIns->nVolEnv; j>i; j--)
+ for (i=0; i<pIns->VolEnv.nNodes; i++) if (nTick <= pIns->VolEnv.Ticks[i]) break;
+ for (UINT j=pIns->VolEnv.nNodes; j>i; j--)
{
- pIns->VolPoints[j] = pIns->VolPoints[j-1];
- pIns->VolEnv[j] = pIns->VolEnv[j-1];
+ pIns->VolEnv.Ticks[j] = pIns->VolEnv.Ticks[j-1];
+ pIns->VolEnv.Values[j] = pIns->VolEnv.Values[j-1];
}
- pIns->VolPoints[i] = (WORD)nTick;
- pIns->VolEnv[i] = (BYTE)nValue;
- pIns->nVolEnv++;
- if (pIns->nVolLoopStart >= i) pIns->nVolLoopStart++;
- if (pIns->nVolLoopEnd >= i) pIns->nVolLoopEnd++;
- if (pIns->nVolSustainBegin >= i) pIns->nVolSustainBegin++;
- if (pIns->nVolSustainEnd >= i) pIns->nVolSustainEnd++;
- if (pIns->nVolEnvReleaseNode>=i && pIns->nVolEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->nVolEnvReleaseNode++;
+ pIns->VolEnv.Ticks[i] = (WORD)nTick;
+ pIns->VolEnv.Values[i] = (BYTE)nValue;
+ pIns->VolEnv.nNodes++;
+ if (pIns->VolEnv.nLoopStart >= i) pIns->VolEnv.nLoopStart++;
+ if (pIns->VolEnv.nLoopEnd >= i) pIns->VolEnv.nLoopEnd++;
+ if (pIns->VolEnv.nSustainStart >= i) pIns->VolEnv.nSustainStart++;
+ if (pIns->VolEnv.nSustainEnd >= i) pIns->VolEnv.nSustainEnd++;
+ if (pIns->VolEnv.nReleaseNode>=i && pIns->VolEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->VolEnv.nReleaseNode++;
bOk = TRUE;
}
break;
case ENV_PANNING:
- if (pIns->nPanEnv < maxpoints)
+ if (pIns->PanEnv.nNodes < maxpoints)
{
- if (!pIns->nPanEnv)
+ if (!pIns->PanEnv.nNodes)
{
- pIns->PanPoints[0] = 0;
- pIns->PanEnv[0] = 32;
- pIns->nPanEnv = 1;
+ pIns->PanEnv.Ticks[0] = 0;
+ pIns->PanEnv.Values[0] = 32;
+ pIns->PanEnv.nNodes = 1;
}
UINT i = 0;
- for (i=0; i<pIns->nPanEnv; i++) if (nTick <= pIns->PanPoints[i]) break;
- for (UINT j=pIns->nPanEnv; j>i; j--)
+ for (i=0; i<pIns->PanEnv.nNodes; i++) if (nTick <= pIns->PanEnv.Ticks[i]) break;
+ for (UINT j=pIns->PanEnv.nNodes; j>i; j--)
{
- pIns->PanPoints[j] = pIns->PanPoints[j-1];
- pIns->PanEnv[j] = pIns->PanEnv[j-1];
+ pIns->PanEnv.Ticks[j] = pIns->PanEnv.Ticks[j-1];
+ pIns->PanEnv.Values[j] = pIns->PanEnv.Values[j-1];
}
- pIns->PanPoints[i] = (WORD)nTick;
- pIns->PanEnv[i] =(BYTE)nValue;
- pIns->nPanEnv++;
- if (pIns->nPanLoopStart >= i) pIns->nPanLoopStart++;
- if (pIns->nPanLoopEnd >= i) pIns->nPanLoopEnd++;
- if (pIns->nPanSustainBegin >= i) pIns->nPanSustainBegin++;
- if (pIns->nPanSustainEnd >= i) pIns->nPanSustainEnd++;
- if (pIns->nPanEnvReleaseNode>=i && pIns->nPanEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->nPanEnvReleaseNode++;
+ pIns->PanEnv.Ticks[i] = (WORD)nTick;
+ pIns->PanEnv.Values[i] =(BYTE)nValue;
+ pIns->PanEnv.nNodes++;
+ if (pIns->PanEnv.nLoopStart >= i) pIns->PanEnv.nLoopStart++;
+ if (pIns->PanEnv.nLoopEnd >= i) pIns->PanEnv.nLoopEnd++;
+ if (pIns->PanEnv.nSustainStart >= i) pIns->PanEnv.nSustainStart++;
+ if (pIns->PanEnv.nSustainEnd >= i) pIns->PanEnv.nSustainEnd++;
+ if (pIns->PanEnv.nReleaseNode>=i && pIns->PanEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->PanEnv.nReleaseNode++;
bOk = TRUE;
}
break;
case ENV_PITCH:
- if (pIns->nPitchEnv < maxpoints)
+ if (pIns->PitchEnv.nNodes < maxpoints)
{
- if (!pIns->nPitchEnv)
+ if (!pIns->PitchEnv.nNodes)
{
- pIns->PitchPoints[0] = 0;
- pIns->PitchEnv[0] = 32;
- pIns->nPitchEnv = 1;
+ pIns->PitchEnv.Ticks[0] = 0;
+ pIns->PitchEnv.Values[0] = 32;
+ pIns->PitchEnv.nNodes = 1;
}
UINT i = 0;
- for (i=0; i<pIns->nPitchEnv; i++) if (nTick <= pIns->PitchPoints[i]) break;
- for (UINT j=pIns->nPitchEnv; j>i; j--)
+ for (i=0; i<pIns->PitchEnv.nNodes; i++) if (nTick <= pIns->PitchEnv.Ticks[i]) break;
+ for (UINT j=pIns->PitchEnv.nNodes; j>i; j--)
{
- pIns->PitchPoints[j] = pIns->PitchPoints[j-1];
- pIns->PitchEnv[j] = pIns->PitchEnv[j-1];
+ pIns->PitchEnv.Ticks[j] = pIns->PitchEnv.Ticks[j-1];
+ pIns->PitchEnv.Values[j] = pIns->PitchEnv.Values[j-1];
}
- pIns->PitchPoints[i] = (WORD)nTick;
- pIns->PitchEnv[i] = (BYTE)nValue;
- pIns->nPitchEnv++;
- if (pIns->nPitchLoopStart >= i) pIns->nPitchLoopStart++;
- if (pIns->nPitchLoopEnd >= i) pIns->nPitchLoopEnd++;
- if (pIns->nPitchSustainBegin >= i) pIns->nPitchSustainBegin++;
- if (pIns->nPitchSustainEnd >= i) pIns->nPitchSustainEnd++;
- if (pIns->nPitchEnvReleaseNode>=i && pIns->nPitchEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->nPitchEnvReleaseNode++;
+ pIns->PitchEnv.Ticks[i] = (WORD)nTick;
+ pIns->PitchEnv.Values[i] = (BYTE)nValue;
+ pIns->PitchEnv.nNodes++;
+ if (pIns->PitchEnv.nLoopStart >= i) pIns->PitchEnv.nLoopStart++;
+ if (pIns->PitchEnv.nLoopEnd >= i) pIns->PitchEnv.nLoopEnd++;
+ if (pIns->PitchEnv.nSustainStart >= i) pIns->PitchEnv.nSustainStart++;
+ if (pIns->PitchEnv.nSustainEnd >= i) pIns->PitchEnv.nSustainEnd++;
+ if (pIns->PitchEnv.nReleaseNode>=i && pIns->PitchEnv.nReleaseNode!=ENV_RELEASE_NODE_UNSET) pIns->PitchEnv.nReleaseNode++;
bOk = TRUE;
}
break;
Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Dlsbank.cpp 2009-08-16 11:46:32 UTC (rev 327)
+++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2009-08-16 11:55:06 UTC (rev 328)
@@ -1703,9 +1703,9 @@
pIns->nDNA = DNA_NOTEFADE;
pIns->nResampling = SRCMODE_DEFAULT;
pIns->nFilterMode = FLTMODE_UNCHANGED;
- pIns->nPanEnvReleaseNode=ENV_RELEASE_NODE_UNSET;
- pIns->nPitchEnvReleaseNode=ENV_RELEASE_NODE_UNSET;
- pIns->nVolEnvReleaseNode=ENV_RELEASE_NODE_UNSET;
+ pIns->PanEnv.nReleaseNode=ENV_RELEASE_NODE_UNSET;
+ pIns->PitchEnv.nReleaseNode=ENV_RELEASE_NODE_UNSET;
+ pIns->VolEnv.nReleaseNode=ENV_RELEASE_NODE_UNSET;
pSndFile->Instruments[nInstr] = pIns;
nSample = 1;
UINT nLoadedSmp = 0;
@@ -1776,17 +1776,17 @@
// Delay section
// -> DLS level 2
// Attack section
- pIns->VolPoints[nPoint] = 0;
+ pIns->VolEnv.Ticks[nPoint] = 0;
if (part->wVolAttack)
{
- pIns->VolEnv[nPoint] = (BYTE)(64/(part->wVolAttack/2+2)+8);// /-----
- pIns->VolPoints[nPoint+1] = part->wVolAttack; // |
+ pIns->VolEnv.Values[nPoint] = (BYTE)(64/(part->wVolAttack/2+2)+8);// /-----
+ pIns->VolEnv.Ticks[nPoint+1] = part->wVolAttack; // |
} else
{
- pIns->VolEnv[nPoint] = 64; // |-----
- pIns->VolPoints[nPoint+1] = 1; // |
+ pIns->VolEnv.Values[nPoint] = 64; // |-----
+ pIns->VolEnv.Ticks[nPoint+1] = 1; // |
}
- pIns->VolEnv[nPoint+1] = 64;
+ pIns->VolEnv.Values[nPoint+1] = 64;
nPoint += 2;
// Hold section
// -> DLS Level 2
@@ -1795,7 +1795,7 @@
{
if (part->nVolSustainLevel < 128)
{
- LONG lStartTime = pIns->VolPoints[nPoint-1];
+ LONG lStartTime = pIns->VolEnv.Ticks[nPoint-1];
LONG lSusLevel = - DLS32BitRelativeLinearToGain(part->nVolSustainLevel << 9) / 65536;
LONG lDecayTime = 1;
if (lSusLevel > 0)
@@ -1812,10 +1812,10 @@
if ((ltime > 1) && (ltime < lDecayTime))
{
ltime += lStartTime;
- if (ltime > pIns->VolPoints[nPoint-1])
+ if (ltime > pIns->VolEnv.Ticks[nPoint-1])
{
- pIns->VolPoints[nPoint] = (WORD)ltime;
- pIns->VolEnv[nPoint] = (BYTE)(lFactor / 2);
+ pIns->VolEnv.Ticks[nPoint] = (WORD)ltime;
+ pIns->VolEnv.Values[nPoint] = (BYTE)(lFactor / 2);
nPoint++;
}
}
@@ -1823,10 +1823,10 @@
}
}
- if (lStartTime + lDecayTime > (LONG)pIns->VolPoints[nPoint-1])
+ if (lStartTime + lDecayTime > (LONG)pIns->VolEnv.Ticks[nPoint-1])
{
- pIns->VolEnv[nPoint] = (BYTE)((part->nVolSustainLevel+1) / 2);
- pIns->VolPoints[nPoint] = (WORD)(lStartTime+lDecayTime);
+ pIns->VolEnv.Values[nPoint] = (BYTE)((part->nVolSustainLevel+1) / 2);
+ pIns->VolEnv.Ticks[nPoint] = (WORD)(lStartTime+lDecayTime);
nPoint++;
}
}
@@ -1834,17 +1834,17 @@
} else
{
pIns->dwFlags |= ENV_VOLSUSTAIN;
- pIns->VolPoints[nPoint] = (WORD)(pIns->VolPoints[nPoint-1]+1);
- pIns->VolEnv[nPoint] = pIns->VolEnv[nPoint-1];
+ pIns->VolEnv.Ticks[nPoint] = (WORD)(pIns->VolEnv.Ticks[nPoint-1]+1);
+ pIns->VolEnv.Values[nPoint] = pIns->VolEnv.Values[nPoint-1];
nPoint++;
}
- pIns->nVolSustainBegin = pIns->nVolSustainEnd = (BYTE)(nPoint - 1);
+ pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = (BYTE)(nPoint - 1);
// Release section
- if ((part->wVolRelease) && (pIns->VolEnv[nPoint-1] > 1))
+ if ((part->wVolRelease) && (pIns->VolEnv.Values[nPoint-1] > 1))
{
LONG lReleaseTime = part->wVolRelease;
- LONG lStartTime = pIns->VolPoints[nPoint-1];
- LONG lStartFactor = pIns->VolEnv[nPoint-1];
+ LONG lStartTime = pIns->VolEnv.Ticks[nPoint-1];
+ LONG lStartFactor = pIns->VolEnv.Values[nPoint-1];
LONG lSusLevel = - DLS32BitRelativeLinearToGain(lStartFactor << 10) / 65536;
LONG lDecayEndTime = (lReleaseTime * lSusLevel) / 960;
lReleaseTime -= lDecayEndTime;
@@ -1859,26 +1859,26 @@
if ((ltime > 1) && (ltime < lReleaseTime))
{
ltime += lStartTime;
- if (ltime > pIns->VolPoints[nPoint-1])
+ if (ltime > pIns->VolEnv.Ticks[nPoint-1])
{
- pIns->VolPoints[nPoint] = (WORD)ltime;
- pIns->VolEnv[nPoint] = (BYTE)lFactor;
+ pIns->VolEnv.Ticks[nPoint] = (WORD)ltime;
+ pIns->VolEnv.Values[nPoint] = (BYTE)lFactor;
nPoint++;
}
}
}
}
if (lReleaseTime < 1) lReleaseTime = 1;
- pIns->VolPoints[nPoint] = (WORD)(lStartTime + lReleaseTime);
- pIns->VolEnv[nPoint] = 0;
+ pIns->VolEnv.Ticks[nPoint] = (WORD)(lStartTime + lReleaseTime);
+ pIns->VolEnv.Values[nPoint] = 0;
nPoint++;
} else
{
- pIns->VolPoints[nPoint] = (BYTE)(pIns->VolPoints[nPoint-1] + 1);
- pIns->VolEnv[nPoint] = 0;
+ pIns->VolEnv.Ticks[nPoint] = (BYTE)(pIns->VolEnv.Ticks[nPoint-1] + 1);
+ pIns->VolEnv.Values[nPoint] = 0;
nPoint++;
}
- pIns->nVolEnv = (BYTE)nPoint;
+ pIns->VolEnv.nNodes = (BYTE)nPoint;
}
}
if (pDlsIns->ulBank & F_INSTRUMENT_DRUMS)
@@ -1888,15 +1888,15 @@
if (!(pIns->dwFlags & ENV_VOLUME))
{
pIns->dwFlags |= ENV_VOLUME;
- pIns->VolPoints[0] = 0;
- pIns->VolEnv[0] = 64;
- pIns->VolPoints[1] = 5;
- pIns->VolEnv[1] = 64;
- pIns->VolPoints[2] = 10;
- pIns->VolEnv[2] = 32;
- pIns->VolPoints[3] = 20; // 1 second max. for drums
- pIns->VolEnv[3] = 0;
- pIns->nVolEnv = 4;
+ pIns->VolEnv.Ticks[0] = 0;
+ pIns->VolEnv.Values[0] = 64;
+ pIns->VolEnv.Ticks[1] = 5;
+ pIns->VolEnv.Values[1] = 64;
+ pIns->VolEnv.Ticks[2] = 10;
+ pIns->VolEnv.Values[2] = 32;
+ pIns->VolEnv.Ticks[3] = 20; // 1 second max. for drums
+ pIns->VolEnv.Values[3] = 0;
+ pIns->VolEnv.nNodes = 4;
}
}
return TRUE;
Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP
===================================================================
--- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2009-08-16 11:46:32 UTC (rev 327)
+++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2009-08-16 11:55:06 UTC (rev 328)
@@ -219,15 +219,15 @@
if (peh->flags & 1) pIns->dwFlags |= ENV_VOLUME;
if (peh->flags & 2) pIns->dwFlags |= ENV_VOLSUSTAIN;
if (peh->flags & 4) pIns->dwFlags |= ENV_VOLLOOP;
- pIns->nVolEnv = peh->numpoints + 1;
- if (pIns->nVolEnv > MAX_ENVPOINTS) pIns->nVolEnv = MAX_ENVPOINTS;
- pIns->nVolLoopStart = peh->loopbegin;
- pIns->nVolLoopEnd = peh->loopend;
- pIns->nVolSustainBegin = pIns->nVolSustainEnd = peh->sustain1;
- for (UINT i=0; i<pIns->nVolEnv; i++)
+ pIns->VolEnv.nNodes = peh->numpoints + 1;
+ if (pIns->VolEnv.nNodes > MAX_ENVPOINTS) pIns->VolEnv.nNodes = MAX_ENVPOINTS;
+ pIns->VolEnv.nLoopStart = peh->loopbegin;
+ pIns->VolEnv.nLoopEnd = peh->loopend;
+ pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = peh->sustain1;
+ for (UINT i=0; i<pIns->VolEnv.nNodes; i++)
{
- pIns->VolPoints[i] = BigEndianW(peh->volenv[i*2]);
- pIns->VolEnv[i] = (BYTE)BigEndianW(peh->volenv[i*2+1]);
+ pIns->VolEnv.Ticks[i] = BigEndianW(peh->volenv[i*2]);
+ pIns->VolEnv.Values[i] = (BYTE)BigEndianW(peh->volenv[i*2+1]);
}
}
chunk_pos += sizeof(DBMENVELOPE);
Modified: trunk/OpenMPT/soundlib/Load_ams.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_ams.cpp 2009-08-16 11:46:32 UTC (rev 327)
+++ trunk/OpenMPT/soundlib/Load_ams.cpp 2009-08-16 11:55:06 UTC (rev 328)
@@ -381,15 +381,15 @@
// Volume Envelope
{
UINT pos = 0;
- pIns->nVolEnv = (volenv->points > 16) ? 16 : volenv->points;
- pIns->nVolSustainBegin = pIns->nVolSustainEnd = volenv->sustain;
- pIns->nVolLoopStart = volenv->loopbegin;
- pIns->nVolLoopEnd = volenv->loopend;
- for (UINT i=0; i<pIns->nVolEnv; i++)
+ pIns->VolEnv.nNodes = (volenv->points > 16) ? 16 : volenv->points;
+ pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = volenv->sustain;
+ pIns->VolEnv.nLoopStart = volenv->loopbegin;
+ pIns->VolEnv.nLoopEnd = volenv->loopend;
+ for (UINT i=0; i<pIns->VolEnv.nNodes; i++)
{
- pIns->VolEnv[i] = (BYTE)((volenv->info[i*3+2] & 0x7F) >> 1);
+ pIns->VolEnv.Values[i] = (BYTE)((volenv->info[i*3+2] & 0x7F) >> 1);
pos += volenv->info[i*3] + ((volenv->info[i*3+1] & 1) << 8);
- pIns->VolPoints[i] = (WORD)pos;
+ pIns->VolEnv.Ticks[i] = (WORD)pos;
}
}
pIns->nFadeOut = (((lpStream[dwMemPos+2] & 0x0F) << 8) | (lpStream[dwMemPos+1])) << 3;
Modified: trunk/OpenMPT/soundlib/Load_imf.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_imf.cpp 2009-08-16 11:46:32 UTC (rev 327)
+++ trunk/OpenMPT/soundlib/Load_imf.cpp 2009-08-16 11:55:06 UTC (rev 328)
@@ -389,6 +389,8 @@
if (memcmp(hdr.im10, "IM10", 4) != 0)
return false;
+ ChangeModTypeTo(MOD_TYPE_IT);
+
// song name
memset(m_szNames, 0, sizeof(m_szNames));
memcpy(m_szNames[0], hdr.title, 25);
@@ -402,7 +404,6 @@
m_nDefaultTempo = hdr.bpm;
m_nDefaultGlobalVolume = hdr.master << 1;
m_nSamplePreAmp = hdr.amp;
- m_nVSTiVolume = 48; // not supported
for (n = 0; n < 32; n++) {
Chn[n].nPan = hdr.channels[n].panning * 64 / 255;
@@ -489,7 +490,9 @@
for (s = 0; s < imfins.smpnum; s++) {
IMFSAMPLE imfsmp;
UINT32 blen;
- slurp_read(fp, &imfsmp, sizeof(imfsmp));
+ if(dwMemPos + sizeof(IMFSAMPLE) > dwMemLength) break;
+ memset(imfsmp, 0, sizeof(IMFSAMPLE));
+ memcpy(imfsmp, lpStream + dwMemPos, sizeof(IMFSAMPLE));
if (memcmp(imfsmp.is10, "IS10", 4) != 0) {
//printf("is10 says %02x %02x %02x %02x!\n",
@@ -528,6 +531,7 @@
}
pSample++;
+ dwMemPos += sizeof(IMFSAMPLE);
}
firstsample += imfins.smpnum;
}
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-16 11:46:32 UTC (rev 327)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-08-16 11:55:06 UTC (rev 328)
@@ -243,19 +243,19 @@
if (pis->flags & 0x01) pIns->dwFlags |= ENV_VOLUME;
if (pis->flags & 0x02) pIns->dwFlags |= ENV_VOLLOOP;
if (pis->flags & 0x04) pIns->dwFlags |= ENV_VOLSUSTAIN;
- pIns->nVolLoopStart = pis->vls;
- pIns->nVolLoopEnd = pis->vle;
- pIns->nVolSustainBegin = pis->sls;
- pIns->nVolSustainEnd = pis->sle;
- pIns->nVolEnv = 25;
+ pIns->VolEnv.nLoopStart = pis->vls;
+ pIns->VolEnv.nLoopEnd = pis->vle;
+ pIns->VolEnv.nSustainStart = pis->sls;
+ pIns->VolEnv.nSustainEnd = pis->sle;
+ pIns->VolEnv.nNodes = 25;
for (UINT ev=0; ev<25; ev++)
{
- if ((pIns->VolPoints[ev] = pis->nodes[ev*2]) == 0xFF)
+ if ((pIns->VolEnv.Ticks[ev] = pis->nodes[ev*2]) == 0xFF)
{
- pIns->nVolEnv = ev;
+ pIns->VolEnv.nNodes = ev;
break;
}
- pIns->VolEnv[ev] = pis->nodes[ev*2+1];
+ pIns->VolEnv.Values[ev] = pis->nodes[ev*2+1];
}
pIns->nNNA = pis->nna;
pIns->nDCT = pis->dnc;
@@ -348,44 +348,44 @@
if (pis->volenv.flags & 2) pIns->dwFlags |= ENV_VOLLOOP;
if (pis->volenv.flags & 4) pIns->dwFlags |= ENV_VOLSUSTAIN;
if (pis->volenv.flags & 8) pIns->dwFlags |= ENV_VOLCARRY;
- pIns->nVolEnv = pis->volenv.num;
- if (pIns->nVolEnv > 25) pIns->nVolEnv = 25;
- pIns->nVolLoopStart = pis->volenv.lpb;
- pIns->nVolLoopEnd = pis->volenv.lpe;
- pIns->nVolSustainBegin = pis->volenv.slb;
- pIns->nVolSustainEnd = pis->volenv.sle;
+ pIns->VolEnv.nNodes = pis->volenv.num;
+ if (pIns->VolEnv.nNodes > 25) pIns->VolEnv.nNodes = 25;
+ pIns->VolEnv.nLoopStart = pis->volenv.lpb;
+ pIns->VolEnv.nLoopEnd = pis->volenv.lpe;
+ pIns->VolEnv.nSustainStart = pis->volenv.slb;
+ pIns->VolEnv.nSustainEnd = pis->volenv.sle;
// Panning Envelope
if (pis->panenv.flags & 1) pIns->dwFlags |= ENV_PANNING;
if (pis->panenv.flags & 2) pIns->dwFlags |= ENV_PANLOOP;
if (pis->panenv.flags & 4) pIns->dwFlags |= ENV_PANSUSTAIN;
if (pis->panenv.flags & 8) pIns->dwFlags |= ENV_PANCARRY;
- pIns->nPanEnv = pis->panenv.num;
- if (pIns->nPanEnv > 25) pIns->nPanEnv = 25;
- pIns->nPanLoopStart = pis->panenv.lpb;
- pIns->nPanLoopEnd = pis->panenv.lpe;
- pIns->nPanSustainBegin = pis->panenv.slb;
- pIns->nPanSustainEnd = pis->panenv.sle;
+ pIns->PanEnv.nNodes = pis->panenv.num;
+ if (pIns->PanEnv.nNodes > 25) pIns->PanEnv.nNodes = 25;
+ pIns->PanEnv.nLoopStart = pis->panenv.lpb;
+ pIns->PanEnv.nLoopEnd = pis->panenv.lpe;
+ pIns->PanEnv.nSustainStart = pis->panenv.slb;
+ pIns->PanEnv.nSustainEnd = pis->panenv.sle;
// Pitch Envelope
if (pis->pitchenv.flags & 1) pIns->dwFlags |= ENV_PITCH;
if (pis->pitchenv.flags & 2) pIns->dwFlags |= ENV_PITCHLOOP;
if (pis->pitchenv.flags & 4) pIns->dwFlags |= ENV_PITCHSUSTAIN;
if (pis->pitchenv.flags & 8) pIns->dwFlags |= ENV_PITCHCARRY;
if (pis->pitchenv.flags & 0x80) pIns->dwFlags |= ENV_FILTER;
- pIns->nPitchEnv = pis->pitchenv.num;
- if (pIns->nPitchEnv > 25) pIns->nPitchEnv = 25;
- pIns->nPitchLoopStart = pis->pitchenv.lpb;
- pIns->nPitchLoopEnd = pis->pitchenv.lpe;
- pIns->nPitchSustainBegin = pis->pitchenv.slb;
- pIns->nPitchSustainEnd = pis->pitchenv.sle;
+ pIns->PitchEnv.nNodes = pis->pitchenv.num;
+ if (pIns->PitchEnv.nNodes > 25) pIns->PitchEnv.nNodes = 25;
+ pIns->PitchEnv.nLoopStart = pis->pitchenv.lpb;
+ pIns->PitchEnv.nLoopEnd = pis->pitchenv.lpe;
+ pIns->PitchEnv.nSustainStart = pis->pitchenv.slb;
+ pIns->PitchEnv.nSustainEnd = pis->pitchenv.sle;
// Envelopes Data
for (UINT ev=0; ev<25; ev++)
{
- pIns->VolEnv[ev] = pis->volenv.data[ev*3];
- pIns->VolPoints[ev] = (pis->volenv.data[ev*3+2] << 8) | (pis->volenv.data[ev*3+1]);
- pIns->PanEnv[ev] = pis->panenv.data[ev*3] + 32;
- pIns->PanPoints[ev] = (pis->panenv.data[ev*3+2] << 8) | (pis->panenv.data[ev*3+1]);
- pIns->PitchEnv[ev] = pis->pitchenv.data[ev*3] + 32;
- pIns->PitchPoints[ev] = (pis->pitchenv.data[ev*3+2] << 8) | (pis->pitchenv.data[ev*3+1]);
+ pIns->VolEnv.Values[ev] = pis->volenv.data[ev*3];
+ pIns->VolEnv.Ticks[ev] = (pis->volenv.data[ev*3+2] << 8) | (pis->volenv.data[ev*3+1]);
+ pIns->PanEnv.Values[ev] = pis->panenv.data[ev*3] + 32;
+ pIns->PanEnv.Ticks[ev] = (pis->panenv.data[ev*3+2] << 8) | (pis->panenv.data[ev*3+1]);
+ pIns->PitchEnv.Values[ev] = pis->pitchenv.data[ev*3] + 32;
+ pIns->PitchEnv.Ticks[ev] = (pis->pitchenv.data[ev*3+2] << 8) | (pis->pitchenv.data[ev*3+1]);
}
pIns->nNNA = pis->nna;
pIns->nDCT = pis->dct;
@@ -403,8 +403,8 @@
if (pIns->nPan > 256) pIns->nPan = 128;
if (pis->dfp < 0x80) pIns->dwFlags |= ENV_SETPANNING;
}
- if ((pIns->nVolLoopStart >= 25) || (pIns->nVolLoopEnd >= 25)) pIns->dwFlags &= ~ENV_VOLLOOP;
- if ((pIns->nVolSustainBegin >= 25) || (pIns->nVolSustainEnd >= 25)) pIns->dwFlags &= ~ENV_VOLSUSTAIN;
+ if ((pIns->VolEnv.nLoopStart >= 25) || (pIns->VolEnv.nLoopEnd >= 25)) pIns->dwFlags &= ~ENV_VOLLOOP;
+ if ((pIns->VolEnv.nSustainStart >= 25) || (pIns->VolEnv.nSustainEnd >= 25)) pIns->dwFlags &= ~ENV_VOLSUSTAIN;
return returnVal; //return offset
}
@@ -2030,44 +2030,44 @@
if (pIns->dwFlags & ENV_VOLLOOP) iti.volenv.flags |= 0x02;
if (pIns->dwFlags & ENV_VOLSUSTAIN) iti.volenv.flags |= 0x04;
if (pIns->dwFlags & ENV_VOLCARRY) iti.volenv.flags |= 0x08;
- iti.volenv.num = (BYTE)pIns->nVolEnv;
- iti.volenv.lpb = (BYTE)pIns->nVolLoopStart;
- iti.volenv.lpe = (BYTE)pIns->nVolLoopEnd;
- iti.volenv.slb = pIns->nVolSustainBegin;
- iti.volenv.sle = pIns->nVolSustainEnd;
+ iti.volenv.num = (BYTE)pIns->VolEnv.nNodes;
+ iti.volenv.lpb = (BYTE)pIns->VolEnv.nLoopStart;
+ iti.volenv.lpe = (BYTE)pIns->VolEnv.nLoopEnd;
+ iti.volenv.slb = pIns->VolEnv.nSustainStart;
+ iti.volenv.sle = pIns->VolEnv.nSustainEnd;
// Writing Panning envelope
if (pIns->dwFlags & ENV_PANNING) iti.panenv.flags |= 0x01;
if (pIns->dwFlags & ENV_PANLOOP) iti.panenv.flags |= 0x02;
if (pIns->dwFlags & ENV_PANSUSTAIN) iti.panenv.flags |= 0x04;
if (pIns->dwFlags & ENV_PANCARRY) iti.panenv.flags |= 0x08;
- iti.panenv.num = (BYTE)pIns->nPanEnv;
- iti.panenv.lpb = (BYTE)pIns->nPanLoopStart;
- iti.panenv.lpe = (BYTE)pIns->nPanLoopEnd;
- iti.panenv.slb = pIns->nPanSustainBegin;
- iti.panenv.sle = pIns->nPanSustainEnd;
+ iti.panenv.num = (BYTE)pIns->PanEnv.nNodes;
+ iti.panenv.lpb = (BYTE)pIns->PanEnv.nLoopStart;
+ iti.panenv.lpe = (BYTE)pIns->PanEnv.nLoopEnd;
+ iti.panenv.slb = pIns->PanEnv.nSustainStart;
+ iti.panenv.sle = pIns->PanEnv.nSustainEnd;
// Writing Pitch Envelope
if (pIns->dwFlags & ENV_PITCH) iti.pitchenv.flags |= 0x01;
if (pIns->dwFlags & ENV_PITCHLOOP) iti.pitchenv.flags |= 0x02;
if (pIns->dwFlags & ENV_PITCHSUSTAIN) iti.pitchenv.flags |= 0x04;
if (pIns->dwFlags & ENV_PITCHCARRY) iti.pitchenv.flags |= 0x08;
if (pIns->dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80;
- iti.pitchenv.num = (BYTE)pIns->nPitchEnv;
- iti.pitchenv.lpb = (BYTE)pIns->nPitchLoopStart;
- iti.pitchenv.lpe = (BYTE)pIns->nPitchLoopEnd;
- iti.pitchenv.slb = (BYTE)pIns->nPitchSustainBegin;
- iti.pitchenv.sle = (BYTE)pIns->nPitchSustainEnd;
+ iti.pitchenv.num = (BYTE)pIns->PitchEnv.nNodes;
+ iti.pitchenv.lpb = (BYTE)pIns->PitchEnv.nLoopStart;
+ iti.pitchenv.lpe = (BYTE)pIns->PitchEnv.nLoopEnd;
+ iti.pitchenv.slb = (BYTE)pIns->PitchEnv.nSustainStart;
+ iti.pitchenv.sle = (BYTE)pIns->PitchEnv.nSustainEnd;
// Writing Envelopes data
for (UINT ev=0; ev<25; ev++)
{
- iti.volenv.data[ev*3] = pIns->VolEnv[ev];
- iti.volenv.data[ev*3+1] = pIns->VolPoints[ev] & 0xFF;
- iti.volenv.data[ev*3+2] = pIns->VolPoints[ev] >> 8;
- iti.panenv.data[ev*3] = pIns->PanEnv[ev] - 32;
- iti.panenv.data[ev*3+1] = pIns->PanPoints[ev] & 0xFF;
- iti.panenv.data[ev*3+2] = pIns->PanPoints[ev] >> 8;
- iti.pitchenv.data[ev*3] = pIns->PitchEnv[ev] - 32;
- iti.pitchenv.data[ev*3+1] = pIns->PitchPoints[ev] & 0xFF;
- iti.pitchenv.data[ev*3+2] = pIns->PitchPoints[ev] >> 8;
+ iti.volenv.data[ev*3] = pIns->VolEnv.Values[ev];
+ iti.volenv.data[ev*3+1] = pIns->VolEnv.Ticks[ev] & 0xFF;
+ iti.volenv.data[ev*3+2] = pIns->VolEnv.Ticks[ev] >> 8;
+ iti.panenv.data[ev*3] = pIns->PanEnv.Values[ev] - 32;
+ iti.panenv.data[ev*3+1] = pIns->PanEnv.Ticks[ev] & 0xFF;
+ iti.panenv.data[ev*3+2] = pIns->PanEnv.Ticks[ev] >> 8;
+ iti.pitchenv.data[ev*3] = pIns->PitchEnv.Values[ev] - 32;
+ iti.pitchenv.data[ev*3+1] = pIns->PitchEnv.Ticks[ev] & 0xFF;
+ iti.pitchenv.data[ev*3+2] = pIns->PitchEnv.Ticks[ev] >> 8;
}
} else
// Save Empty Instrument
@@ -2675,44 +2675,44 @@
if (pIns->dwFlags & ENV_VOLLOOP) iti.volenv.flags |= 0x02;
if (pIns->dwFlags & ENV_VOLSUSTAIN) iti.volenv.flags |= 0x04;
if (pIns->dwFlags & ENV_VOLCARRY) iti.volenv.flags |= 0x08;
- iti.volenv.num = (BYTE)pIns->nVolEnv;
- iti.volenv.lpb = (BYTE)pIns->nVolLoopStart;
- iti.volenv.lpe = (BYTE)pIns->nVolLoopEnd;
- iti.volenv.slb = pIns->nVolSustainBegin;
- iti.volenv.sle = pIns->nVolSustainEnd;
+ iti.volenv.num = (BYTE)pIns->VolEnv.nNodes;
+ iti.volenv.lpb = (BYTE)pIns->VolEnv.nLoopStart;
+ iti.volenv.lpe = (BYTE)pIns->VolEnv.nLoopEnd;
+ iti.volenv.slb = pIns->VolEnv.nSustainStart;
+ iti.volenv.sle = pIns->VolEnv.nSustainEnd;
// Writing Panning envelope
if (pIns->dwFlags & ENV_PANNING) iti.panenv.flags |= 0x01;
if (pIns->dwFlags & ENV_PANLOOP) iti.panenv.flags |= 0x02;
if (pIns->dwFlags & ENV_PANSUSTAIN) iti.panenv.flags |= 0x04;
if (pIns->dwFlags & ENV_PANCARRY) iti.panenv.flags |= 0x08;
- iti.panenv.num = (BYTE)pIns->nPanEnv;
- iti.panenv.lpb = (BYTE)pIns->nPanLoopStart;
- iti.panenv.lpe = (BYTE)pIns->nPanLoopEnd;
- iti.panenv.slb = pIns->nPanSustainBegin;
- iti.panenv.sle = pIns->nPanSustainEnd;
+ iti.panenv.num = (BYTE)pIns->PanEnv.nNodes;
+ iti.panenv.lpb = (BYTE)pIns->PanEnv.nLoopStart;
+ iti.panenv.lpe = (BYTE)pIns->PanEnv.nLoopEnd;
+ iti.panenv.slb = pIns->PanEnv.nSustainStart;
+ iti.panenv.sle = pIns->PanEnv.nSustainEnd;
// Writing Pitch Envelope
if (pIns->dwFlags & ENV_PITCH) iti.pitchenv.flags |= 0x01;
if (pIns->dwFlags & ENV_PITCHLOOP) iti.pitchenv.flags |= 0x02;
if (pIns->dwFlags & ENV_PITCHSUSTAIN) iti.pitchenv.flags |= 0x04;
if (pIns->dwFlags & ENV_PITCHCARRY) iti.pitchenv.flags |= 0x08;
if (pIns->dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80;
- iti.pitchenv.num = (BYTE)pIns->nPitchEnv;
- iti.pitchenv.lpb = (BYTE)pIns->nPitchLoopStart;
- iti.pitchenv.lpe = (BYTE)pIns->nPitchLoopEnd;
- iti.pitchenv.slb = (BYTE)pIns->nPitchSustainBegin;
- iti.pitchenv.sle = (BYTE)pIns->nPitchSustainEnd;
+ iti.pitchenv.num = (BYTE)pIns->PitchEnv.nNodes;
+ iti.pitchenv.lpb = (BYTE)pIns->PitchEnv.nLoopStart;
+ iti.pitchenv.lpe = (BYTE)pIns->PitchEnv.nLoopEnd;
+ iti.pitchenv.slb = (BYTE)pIns->PitchEnv.nSustainStart;
+ iti.pitchenv.sle = (BYTE)pIns->PitchEnv.nSustainEnd;
// Writing Envelopes data
for (UINT ev=0; ev<25; ev++)
{
- iti.volenv.data[ev*3] = pIns->VolEnv[ev];
- iti.volenv.data[ev*3+1] = pIns->VolPoints[ev] & 0xFF;
- iti.volenv.data[ev*3+2] = pIns->VolPoints[ev] >> 8;
- iti.panenv.data[ev*3] = pIns->PanEnv[ev] - 32;
- iti.panenv.data[ev*3+1] = pIns->PanPoints[ev] & 0xFF;
- iti.panenv.data[ev*3+2] = pIns->PanPoints[ev] >> 8;
- iti.pitchenv.data[ev*3] = pIns->PitchEnv[ev] - 32;
- iti.pitchenv.data[ev*3+1] = pIns->PitchPoints[ev] & 0xFF;
- iti.pitchenv.data[ev*3+2] = pIns->PitchPoints[ev] >> 8;
+ iti.volenv.data[ev*3] = pIns->VolEnv.Values[ev];
+ iti.volenv.data[ev*3+1] = pIns->VolEnv.Ticks[ev] & 0xFF;
+ iti.volenv.data[ev*3+2] = pIns->VolEnv.Ticks[ev] >> 8;
+ iti.panenv.data[ev*3] = pIns->PanEnv.Values[ev] - 32;
+ iti.panenv.data[ev*3+1] = pIns->PanEnv.Ticks[ev] & 0xFF;
+ iti.panenv.data[ev*3+2] = pIns->PanEnv.Ticks[ev] >> 8;
+ iti.pitchenv.data[ev*3] = pIns->PitchEnv.Values[ev] - 32;
+ iti.pitchenv.data[ev*3+1] = pIns->PitchEnv.Ticks[ev] & 0xFF;
+ iti.pitchenv.data[ev*3+2] = pIns->PitchEnv.Ticks[ev] >> 8;
}
} else
// Save Empty Instrument
@@ -3494,9 +3494,9 @@
WriteInstrumentPropertyForAllInstruments('CS..', sizeof(m_defaultInstrument.nCutSwing), f, instruments, nInstruments);
WriteInstrumentPropertyForAllInstruments('RS..', sizeof(m_defaultInstrument.nResSwing), f, instruments, nInstruments);
WriteInstrumentPropertyForAllInstruments('FM..', sizeof(m_defaultInstrument.nFilterMode), f, instruments, nInstruments);
- WriteInstrumentPropertyForAllInstruments('PERN', sizeof(m_defaultInstrument.nPitchEnvReleaseNode ), f, instruments, nInstruments);
- WriteInstrumentPropertyForAllInstruments('AERN', sizeof(m_defaultInstrument.nPanEnvReleaseNode), f, instruments, nInstruments);
- WriteInstrumentPropertyForAllInstruments('VERN', sizeof(m_defaultInstrument.nVolEnvReleaseNode), f, instruments, nInstruments);
+ WriteInstrumentPropertyForAllInstruments('PERN', sizeof(m_defaultInstrument.PitchEnv.nReleaseNode ), f, instruments, nInstruments);
+ WriteInstrumentPropertyForAllInstruments('AERN', sizeof(m_defaultInstrument.PanEnv.nReleaseNode), f, instruments, nInstruments);
+ WriteInstrumentPropertyForAllInstruments('VERN', sizeof(m_defaultInstrument.VolEnv.nReleaseNode), f, instruments, nInstruments);
WriteInstrumentPropertyForAllInstruments('PTTL', sizeof(m_defaultInstrument.wPitchToTempoLock), f, instruments, nInstruments);
WriteInstrumentPropertyForAllInstruments('PVEH', sizeof(m_defaultInstrument.nPluginVelocityHandling), f, instruments, nInstruments);
WriteInstrumentPropertyForAllInstruments('PVOH', sizeof(m_defaultInstrument.nPluginVolumeHandling), f, instruments, nInstruments);
Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mdl.cpp 2009-08-16 11:46:32 UTC (rev 327)
+++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2009-08-16 11:55:06 UTC (rev 328)
@@ -497,23 +497,23 @@
for (UINT nve=0; nve<nvolenv; nve++, pve+=33) if (pve[0]+1 == insvolenv[iIns])
{
WORD vtick = 1;
- pIns->nVolEnv = 15;
+ pIns->VolEnv.nNodes = 15;
for (UINT iv=0; iv<15; iv++)
{
if (iv) vtick += pve[iv*2+1];
- pIns->VolPoints[iv] = vtick;
- pIns->VolEnv[iv] = pve[iv*2+2];
+ pIns->VolEnv.Ticks[iv] = vtick;
+ pIns->VolEnv.Values[iv] = pve[iv*2+2];
if (!pve[iv*2+1])
{
- pIns->nVolEnv = iv+1;
+ pIns->VolEnv.nNodes = iv+1;
break;
}
}
- pIns->nVolSustainBegin = pIns->nVolSustainEnd = pve[31] & 0x0F;
+ pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = pve[31] & 0x0F;
if (pve[31] & 0x10) pIns->dwFlags |= ENV_VOLSUSTAIN;
if (pve[31] & 0x20) pIns->dwFlags |= ENV_VOLLOOP;
- pIns->nVolLoopStart = pve[32] & 0x0F;
- pIns->nVolLoopEnd = pve[32] >> 4;
+ pIns->VolEnv.nLoopStart = pve[32] & 0x0F;
+ pIns->VolEnv.nLoopEnd = pve[32] >> 4;
}
}
// Setup panning envelope
@@ -523,22 +523,22 @@
for (UINT npe=0; npe<npanenv; npe++, ppe+=33) if (ppe[0]+1 == inspanenv[iIns])
{
WORD vtick = 1;
- pIns->nPanEnv = 15;
+ pIns->PanEnv.nNodes = 15;
for (UINT iv=0; iv<15; iv++)
{
if (iv) vtick += ppe[iv*2+1];
- pIns->PanPoints[iv] = vtick;
- pIns->PanEnv[iv] = ppe[iv*2+2];
+ pIns->PanEnv.Ticks[iv] = vtick;
+ pIns->PanEnv.Values[iv] = ppe[iv*2+2];
if (!ppe[iv*2+1])
{
- pIns->nPanEnv = iv+1;
+ pIns->PanEnv.nNodes = iv+1;
break;
}
}
if (ppe[31] & 0x10) pIns->dwFlags |= ENV_PANSUSTAIN;
if (ppe[31] & 0x20) pIns->dwFlags |= ENV_PANLOOP;
- pIns->nPa...
[truncated message content] |
|
From: <rel...@us...> - 2009-08-16 11:46:45
|
Revision: 327
http://modplug.svn.sourceforge.net/modplug/?rev=327&view=rev
Author: relabsoluness
Date: 2009-08-16 11:46:32 +0000 (Sun, 16 Aug 2009)
Log Message:
-----------
[Fix] Sample tab: Fix to crash that occurred when resizing sample while it was playing.
[Fix] Instrument tab: Fix to crash that occurred when multiple windows had instrument tab of the same document open.
[Fix] Tuning: Default tuning file should now load correctly (broken in rev. 323).
[Ref] S3M load: Check parameters before reading.
[Ref] Internal: Changes to get rid of some compiler warnings and disabled some warnings (see Stdafx.h).
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_ins.cpp
trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp
trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h
trunk/OpenMPT/mptrack/Stdafx.h
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/mptrack/serialization_utils.cpp
trunk/OpenMPT/soundlib/Load_s3m.cpp
trunk/OpenMPT/soundlib/modsmp_ctrl.cpp
trunk/OpenMPT/soundlib/modsmp_ctrl.h
Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-15 19:28:24 UTC (rev 326)
+++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-08-16 11:46:32 UTC (rev 327)
@@ -1295,7 +1295,7 @@
// -> DESC="IT project files (.itp)"
int n = strlen(lpszFileName);
if(n >= _MAX_PATH) n = _MAX_PATH-1;
- strncpy(&m_pSndFile->m_szInstrumentPath[m_nInstrument-1][0],lpszFileName,n);
+ strncpy(m_pSndFile->m_szInstrumentPath[m_nInstrument-1],lpszFileName,n);
m_pSndFile->m_szInstrumentPath[m_nInstrument-1][n] = '\0';
m_pSndFile->instrumentModified[m_nInstrument-1] = FALSE;
// -! NEW_FEATURE#0023
@@ -1643,7 +1643,7 @@
// -> DESC="IT project files (.itp)"
int n = strlen(dlg.GetPathName());
if(n > _MAX_PATH) n = _MAX_PATH;
- strncpy(&m_pSndFile->m_szInstrumentPath[m_nInstrument-1][0],dlg.GetPathName(),n);
+ strncpy(m_pSndFile->m_szInstrumentPath[m_nInstrument-1],dlg.GetPathName(),n);
m_pSndFile->instrumentModified[m_nInstrument-1] = FALSE;
// -! NEW_FEATURE#0023
@@ -2030,13 +2030,12 @@
if ((!IsLocked()) && pIns->nMixPlug != nPlug) {
m_pModDoc->SetModified();
pIns->nMixPlug = nPlug;
+ m_pModDoc->UpdateAllViews(NULL, HINT_MIXPLUGINS, this);
+ m_pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_INSNAMES, this);
}
m_CbnPluginVelocityHandling.SetCurSel(pIns->nPluginVelocityHandling);
m_CbnPluginVolumeHandling.SetCurSel(pIns->nPluginVolumeHandling);
- m_pModDoc->UpdateAllViews(NULL, HINT_MIXPLUGINS, this);
- m_pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_INSNAMES, this);
-
if (pIns->nMixPlug) //if we have not just set to no plugin
{
PSNDMIXPLUGIN pPlug = &(m_pSndFile->m_MixPlugins[pIns->nMixPlug-1]);
@@ -2653,7 +2652,6 @@
pIns->SetTuning(pIns->s_DefaultTuning);
END_CRITICAL();
m_pModDoc->SetModified();
- UpdateView((m_nInstrument << HINT_SHIFT_INS) | HINT_INSTRUMENT);
}
void CCtrlInstruments::OnEnChangeEditPitchtempolock()
Modified: trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp
===================================================================
--- trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp 2009-08-15 19:28:24 UTC (rev 326)
+++ trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp 2009-08-16 11:46:32 UTC (rev 327)
@@ -9,7 +9,7 @@
// CScaleEnvPointsDlg dialog
IMPLEMENT_DYNAMIC(CScaleEnvPointsDlg, CDialog)
-CScaleEnvPointsDlg::CScaleEnvPointsDlg(CWnd* pParent, MODINSTRUMENT* pInst, BYTE env)
+CScaleEnvPointsDlg::CScaleEnvPointsDlg(CWnd* pParent, MODINSTRUMENT* pInst, UINT env)
: CDialog(CScaleEnvPointsDlg::IDD, pParent),
m_pInstrument(pInst),
m_Env(env)
Modified: trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h
===================================================================
--- trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h 2009-08-15 19:28:24 UTC (rev 326)
+++ trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h 2009-08-16 11:46:32 UTC (rev 327)
@@ -11,7 +11,7 @@
DECLARE_DYNAMIC(CScaleEnvPointsDlg)
public:
- CScaleEnvPointsDlg(CWnd* pParent, MODINSTRUMENT* pInst, BYTE env); // standard constructor
+ CScaleEnvPointsDlg(CWnd* pParent, MODINSTRUMENT* pInst, UINT env); // standard constructor
virtual ~CScaleEnvPointsDlg();
// Dialog Data
@@ -24,7 +24,7 @@
private:
MODINSTRUMENT* m_pInstrument;
- BYTE m_Env; //To tell which envelope to process.
+ UINT m_Env; //To tell which envelope to process.
CEdit m_EditFactor;
protected:
virtual void OnOK();
Modified: trunk/OpenMPT/mptrack/Stdafx.h
===================================================================
--- trunk/OpenMPT/mptrack/Stdafx.h 2009-08-15 19:28:24 UTC (rev 326)
+++ trunk/OpenMPT/mptrack/Stdafx.h 2009-08-16 11:46:32 UTC (rev 327)
@@ -29,7 +29,7 @@
#define MMNODRV
#define MMNOMCI
-//#define _CRT_SECURE_NO_WARNINGS // Define to disable the "This function or variable may be unsafe" warnings.
+#define _CRT_SECURE_NO_WARNINGS // Define to disable the "This function or variable may be unsafe" warnings.
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2009-08-15 19:28:24 UTC (rev 326)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-08-16 11:46:32 UTC (rev 327)
@@ -2606,7 +2606,7 @@
dlg.m_ofn.nMaxFile = _MAX_PATH;
if(dlg.DoModal() == IDOK){
- strcpy(&pSndFile->m_szInstrumentPath[dwItem-1][0],pszFileNames);
+ strcpy(pSndFile->m_szInstrumentPath[dwItem-1], pszFileNames);
OnRefreshTree();
}
@@ -2642,7 +2642,7 @@
dlg.m_ofn.lpstrFile = pszFileNames;
dlg.m_ofn.nMaxFile = _MAX_PATH;
- if(dlg.DoModal() == IDOK) strcpy(&pSndFile->m_szInstrumentPath[dwItem-1][0],pszFileNames);
+ if(dlg.DoModal() == IDOK) strcpy(pSndFile->m_szInstrumentPath[dwItem-1], pszFileNames);
dlg.m_ofn.lpstrFile = NULL;
dlg.m_ofn.nMaxFile = 0;
Modified: trunk/OpenMPT/mptrack/serialization_utils.cpp
===================================================================
--- trunk/OpenMPT/mptrack/serialization_utils.cpp 2009-08-15 19:28:24 UTC (rev 326)
+++ trunk/OpenMPT/mptrack/serialization_utils.cpp 2009-08-16 11:46:32 UTC (rev 327)
@@ -696,7 +696,7 @@
}
if(Testbit(flagbyte, 3))
- iStrm.ignore(8);
+ iStrm.ignore(5);
// Read entrycount
ReadAdaptive1248(iStrm, tempU64);
Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-08-15 19:28:24 UTC (rev 326)
+++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-08-16 11:46:32 UTC (rev 327)
@@ -255,6 +255,8 @@
bool CSoundFile::ReadS3M(const BYTE *lpStream, DWORD dwMemLength)
//---------------------------------------------------------------
{
+ if ((!lpStream) || (dwMemLength <= sizeof(S3MFILEHEADER)+sizeof(S3MSAMPLESTRUCT)+64)) return false;
+
UINT insnum,patnum,nins,npat;
DWORD insfile[128];
WORD ptr[256];
@@ -273,7 +275,6 @@
psfh.scrm = LittleEndian(psfh.scrm);
psfh.special = LittleEndianW(psfh.special);
- if ((!lpStream) || (dwMemLength <= sizeof(S3MFILEHEADER)+sizeof(S3MSAMPLESTRUCT)+64)) return false;
if (psfh.scrm != 0x4D524353) return false;
if((psfh.cwtv & 0xF000) == 0x5000) // OpenMPT Version number (Major.Minor)
Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp
===================================================================
--- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-08-15 19:28:24 UTC (rev 326)
+++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-08-16 11:46:32 UTC (rev 327)
@@ -11,15 +11,17 @@
namespace ctrlSmp
{
-void ReplaceSample(MODSAMPLE& smp, const LPSTR pNewSample, const SmpLength nNewLength)
-//----------------------------------------------------------------------------------------
+void ReplaceSample(MODSAMPLE& smp, const LPSTR pNewSample, const SmpLength nNewLength, CSoundFile* pSndFile)
+//----------------------------------------------------------------------------------------------------------
{
LPSTR const pOldSmp = smp.pSample;
BEGIN_CRITICAL();
+ if (pSndFile != nullptr)
+ ctrlChn::ReplaceSample(pSndFile->Chn, pOldSmp, pNewSample, nNewLength);
smp.pSample = pNewSample;
smp.nLength = nNewLength;
- END_CRITICAL();
- CSoundFile::FreeSample(pOldSmp);
+ CSoundFile::FreeSample(pOldSmp);
+ END_CRITICAL();
}
@@ -60,7 +62,7 @@
AfxMessageBox(TEXT("Unsupported start position in InsertSilence."));
}
- ReplaceSample(smp, pNewSmp, nNewLength);
+ ReplaceSample(smp, pNewSmp, nNewLength, pSndFile);
AdjustEndOfSample(smp, pSndFile);
return smp.nLength;
@@ -88,7 +90,7 @@
// Copy over old data and replace sample by the new one
memcpy(pNewSmp, smp.pSample, nNewSmpBytes);
- ReplaceSample(smp, pNewSmp, nNewLength);
+ ReplaceSample(smp, pNewSmp, nNewLength, pSndFile);
// Adjust loops
if(smp.nLoopStart > nNewLength)
@@ -340,3 +342,32 @@
} // namespace ctrlSmp
+
+
+
+namespace ctrlChn
+{
+
+void ReplaceSample( MODCHANNEL (&Chn)[MAX_CHANNELS],
+ LPCSTR pOldSample,
+ LPSTR pNewSample,
+ const ctrlSmp::SmpLength nNewLength,
+ DWORD orFlags /* = 0*/,
+ DWORD andFlags /* = MAXDWORD*/)
+{
+ for (CHANNELINDEX i = 0; i < MAX_CHANNELS; i++)
+ {
+ if (Chn[i].pSample == pOldSample)
+ {
+ Chn[i].pSample = pNewSample;
+ Chn[i].pCurrentSample = pNewSample;
+ if (Chn[i].nPos > nNewLength)
+ Chn[i].nPos = 0;
+ Chn[i].nLength = nNewLength;
+ Chn[i].dwFlags |= orFlags;
+ Chn[i].dwFlags &= andFlags;
+ }
+ }
+}
+
+} // namespace ctrlChn
Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.h
===================================================================
--- trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-08-15 19:28:24 UTC (rev 326)
+++ trunk/OpenMPT/soundlib/modsmp_ctrl.h 2009-08-16 11:46:32 UTC (rev 327)
@@ -21,15 +21,16 @@
// Insert silence to given location.
// Note: Is currently implemented only for inserting silence to the beginning and to the end of the sample.
// Return: Length of the new sample.
-SmpLength InsertSilence(MODSAMPLE& smp, const SmpLength nSilenceLength, const SmpLength nStartFrom, CSoundFile* pSndFile = nullptr);
+SmpLength InsertSilence(MODSAMPLE& smp, const SmpLength nSilenceLength, const SmpLength nStartFrom, CSoundFile* pSndFile);
// Change sample size.
// Note: If resized sample is bigger, silence will be added to the sample's tail.
// Return: Length of the new sample.
-SmpLength ResizeSample(MODSAMPLE& smp, const SmpLength nNewLength, CSoundFile* pSndFile = nullptr);
+SmpLength ResizeSample(MODSAMPLE& smp, const SmpLength nNewLength, CSoundFile* pSndFile);
// Replaces sample in 'smp' with given sample and frees the old sample.
-void ReplaceSample(MODSAMPLE& smp, const LPSTR pNewSample, const SmpLength nNewLength);
+// If valid CSoundFile pointer is given, the sample will be replaced also from the sounds channels.
+void ReplaceSample(MODSAMPLE& smp, const LPSTR pNewSample, const SmpLength nNewLength, CSoundFile* pSndFile);
bool AdjustEndOfSample(MODSAMPLE& smp, CSoundFile* pSndFile = 0);
@@ -53,4 +54,17 @@
} // Namespace ctrlSmp
+namespace ctrlChn
+{
+
+// Replaces sample from sound channels by given sample.
+void ReplaceSample( MODCHANNEL (&Chn)[MAX_CHANNELS],
+ LPCSTR pOldSample,
+ LPSTR pNewSample,
+ const ctrlSmp::SmpLength nNewLength,
+ DWORD orFlags = 0,
+ DWORD andFlags = MAXDWORD);
+
+} // namespace ctrlChn
+
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-08-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.
|