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
(115) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <Rel...@us...> - 2007-02-03 21:24:47
|
Revision: 172 http://svn.sourceforge.net/modplug/?rev=172&view=rev Author: Relabsoluness Date: 2007-02-03 13:24:42 -0800 (Sat, 03 Feb 2007) Log Message: ----------- (Note: This doesn't include the patch from pelya; I wanted to get my modifications committed before merging it.) + <Relabs> Ability to 'scale' envelope points, i.e. to move envelope points by given factor; try right click in envelope views. . <Relabs> Fixed 24-bit wav loading again :) . <Relabs> Fixed an ITP-saving bug I had created when extending the pattern/order-limit(messes orderlist up). . <Relabs> Fixed an ITP-loading bug concerning loading empty comments; could be noticed as trash characters in the comments when there shouldn't have been any. . <Relabs> Bug fix related to handling of finesteps when creating tunings. . <Relabs> Fixed the way modified flag appears when modifying tunings. . <Relabs> Fixed bug that VSTi was making no sound when corresponding instrument had no associated sample - Can cause some tracks using VSTi's to play differently. / <Relabs> Modified the way pattern data is saved/loaded with ITP in order to be able to hack the MODCOMMAND-class. / <Relabs> The tuning dialog now has a treeview instead of the comboboxes. / <Relabs> Local tunings are no longer saved to file everytime the program closes. / <Relabs> Changed the 'order message' at the bottom bar of the screen "Position x of y" to "Position x of y (x_in_hex of y_in_hex)". / <Relabs> To orderlist context menu, changed "Insert Pattern" and "Remove Pattern" to "Insert Order" and "Remove Order" because I find the former somewhat misleading. - Sometimes loading multiple files from openfile dialog fails. Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.h branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc branches/OpenMPT_MPTm_Tuning/mptrack/pattern.cpp branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h branches/OpenMPT_MPTm_Tuning/mptrack/patternContainer.cpp branches/OpenMPT_MPTm_Tuning/mptrack/resource.h branches/OpenMPT_MPTm_Tuning/soundlib/LOAD_DMF.CPP branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp branches/OpenMPT_MPTm_Tuning/soundlib/mod_specifications.h branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h branches/OpenMPT_MPTm_Tuning/soundlib/tuning.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningCollection.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningcollection.h branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h branches/OpenMPT_MPTm_Tuning/soundlib/midi.h Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -877,6 +877,7 @@ } PostViewMessage(VIEWMSG_SETCURRENTINSTRUMENT, m_nInstrument); UnlockControls(); + return TRUE; } @@ -2466,6 +2467,15 @@ v.push_back(&m_pSndFile->m_TuningsTuneSpecific); CTuningDialog td(this, v, pInstH->pTuning); td.DoModal(); + if(td.GetModifiedStatus(&m_pSndFile->s_TuningsSharedLocal)) + { + if(MsgBox(IDS_APPLY_TUNING_MODIFICATIONS, this, "", MB_OKCANCEL) == IDOK) + m_pSndFile->SaveStaticTunings(); + } + if(td.GetModifiedStatus(&m_pSndFile->m_TuningsTuneSpecific)) + { + m_pModDoc->SetModified(); + } //Recreating tuning combobox so that possible //new tuning(s) come visible. Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -409,8 +409,16 @@ CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); s[0] = 0; - wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "Position %02Xh of %02Xh" : "Position %d of %d", - m_nScrollPos, pSndFile->GetNumPatterns()); + if(CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) + { + wsprintf(s, "Position %02Xh of %02Xh", m_nScrollPos, pSndFile->GetNumPatterns()); + } + else + { + wsprintf(s, "Position %d of %d (%02Xh of %02Xh)", + m_nScrollPos, pSndFile->GetNumPatterns(), m_nScrollPos, pSndFile->GetNumPatterns()); + } + if (m_nScrollPos < pSndFile->Order.size()) { UINT nPat = pSndFile->Order[m_nScrollPos]; @@ -661,8 +669,8 @@ if (hMenu) { - AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Pattern\tIns"); - AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Pattern\tDel"); + AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_INSERT, "&Insert Order\tIns"); + AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_DELETE, "&Remove Order\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"); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -273,11 +273,8 @@ srcy = pfnt->nAlphaNZ_Y + 13 * COLUMN_HEIGHT; break; case '#': - srcx = pfnt->nNoteX + pfnt->nNoteWidth/2; - srcy = pfnt->nNoteY + 2*COLUMN_HEIGHT; - //TODO: '#' doesn't show properly in effect column. - //srcx = pfnt->nAlphaAM_X; - //srcy = pfnt->nAlphaAM_Y + 13 * COLUMN_HEIGHT; + srcx = pfnt->nAlphaAM_X; + srcy = pfnt->nAlphaAM_Y + 13 * COLUMN_HEIGHT; break; //rewbs.smoothVST case '\\': Modified: branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -648,10 +648,6 @@ delete m_pPerfCounter; CChannelManagerDlg::DestroySharedInstance(); - - - //Saving statictunings here. - CSoundFile::SaveStaticTunings(); } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -872,7 +872,8 @@ 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->nVolume, MAX_BASECHANNELS); + if (pPlugin) pPlugin->MidiCommand(penv->nMidiChannel, penv->nMidiProgram, penv->wMidiBank, note, pChn->GetVSTVolume(), MAX_BASECHANNELS); } } } Modified: branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -83,7 +83,6 @@ //--------------------------------------------------------------- { if(size() < count) resize(count, 0xFF); - ASSERT(count == size()); size_t i = 0; Added: branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -0,0 +1,94 @@ +// ScaleEnvPointsDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "mptrack.h" +#include "ScaleEnvPointsDlg.h" + + +// CScaleEnvPointsDlg dialog + +IMPLEMENT_DYNAMIC(CScaleEnvPointsDlg, CDialog) +CScaleEnvPointsDlg::CScaleEnvPointsDlg(CWnd* pParent, INSTRUMENTHEADER* pInst, BYTE env) + : CDialog(CScaleEnvPointsDlg::IDD, pParent), + m_pInstrument(pInst), + m_Env(env) +//---------------------------------------------------------------------- +{ +} + +CScaleEnvPointsDlg::~CScaleEnvPointsDlg() +//--------------------------------------- +{ +} + +void CScaleEnvPointsDlg::DoDataExchange(CDataExchange* pDX) +//-------------------------------------------------------- +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_EDIT_FACTOR, m_EditFactor); +} + + +BEGIN_MESSAGE_MAP(CScaleEnvPointsDlg, CDialog) + +END_MESSAGE_MAP() + + +// CScaleEnvPointsDlg message handlers + +void CScaleEnvPointsDlg::OnOK() +//------------------------------ +{ + char buffer[10]; + GetDlgItemText(IDC_EDIT_FACTOR, buffer, 9); + float factor = static_cast<float>(atof(buffer)); + if(factor > 0) + { + WORD (*array)[MAX_ENVPOINTS] = NULL; + UINT* arraySize = NULL; + switch(m_Env) + { + case ENV_VOLUME: + array = &m_pInstrument->VolPoints; + arraySize = &m_pInstrument->nVolEnv; + break; + + case ENV_PANNING: + array = &m_pInstrument->PanPoints; + arraySize = &m_pInstrument->nPanEnv; + break; + + case ENV_PITCH: + array = &m_pInstrument->PitchPoints; + arraySize = &m_pInstrument->nPitchEnv; + break; + } + + if(array && arraySize) + { + for(UINT i = 0; i<*arraySize; i++) + { + (*array)[i] *= factor; + + //Checking that the order of points is preserved. + if(i > 0 && (*array)[i] <= (*array)[i-1]) + (*array)[i] = (*array)[i-1]+1; + } + } + } + + CDialog::OnOK(); +} + +BOOL CScaleEnvPointsDlg::OnInitDialog() +//------------------------------------- +{ + CDialog::OnInitDialog(); + + SetDlgItemText(IDC_EDIT_FACTOR, ""); + m_EditFactor.SetFocus(); + + + return FALSE; // return TRUE unless you set the focus to a control +} Added: branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ScaleEnvPointsDlg.h 2007-02-03 21:24:42 UTC (rev 172) @@ -0,0 +1,33 @@ +#pragma once +#include "sndfile.h" +#include "afxwin.h" + +// CScaleEnvPointsDlg dialog + +//======================================= +class CScaleEnvPointsDlg : public CDialog +//======================================= +{ + DECLARE_DYNAMIC(CScaleEnvPointsDlg) + +public: + CScaleEnvPointsDlg(CWnd* pParent, INSTRUMENTHEADER* pInst, BYTE env); // standard constructor + virtual ~CScaleEnvPointsDlg(); + +// Dialog Data + enum { IDD = IDD_SCALE_ENV_POINTS }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + + DECLARE_MESSAGE_MAP() + +private: + INSTRUMENTHEADER* m_pInstrument; + BYTE m_Env; //To tell which envelope to process. + CEdit m_EditFactor; +protected: + virtual void OnOK(); +public: + virtual BOOL OnInitDialog(); +}; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2007-02-03 21:24:42 UTC (rev 172) @@ -3,17 +3,20 @@ #include "TuningDialog.h" #include <algorithm> #include "misc_util.h" +#include ".\tuningdialog.h" const string CTuningDialog::s_stringTypeGEN = "General"; const string CTuningDialog::s_stringTypeRP = "Ratio periodic"; const string CTuningDialog::s_stringTypeTET = "TET"; +const CTuningDialog::TUNINGTREEITEM CTuningDialog::s_notFoundItemTuning = TUNINGTREEITEM(); +const HTREEITEM CTuningDialog::s_notFoundItemTree = NULL; + /* TODOS: --Clear tuning(when copying existing tuning, it might have - e.g. unwanted note names which should able to be removed. --Drag'n'drop tuningfiles +-Clear tuning -Tooltips. +-Create own dialogs for Tuning collection part, and Tuning part. */ @@ -25,7 +28,11 @@ m_TuningCollections(rVec), m_TempTunings("Sandbox"), m_NoteEditApply(true), - m_RatioEditApply(true) + m_RatioEditApply(true), + m_pActiveTuningCollection(NULL), + m_TreeItemTuningItemMap(s_notFoundItemTree, s_notFoundItemTuning), + m_TreeCtrlTuning(this), + m_DoErrorExit(false) //---------------------------------------- { m_pActiveTuning = pTun; @@ -39,37 +46,129 @@ { for(size_t i = 0; i<m_TuningCollections.size(); i++) { - vector<CTuningCollection*>::iterator iter = find(m_DeletableTuningCollections.begin(), m_DeletableTuningCollections.end(), m_TuningCollections[i]); - if(iter != m_DeletableTuningCollections.end()) + if(IsDeletable(m_TuningCollections[i])) { delete m_TuningCollections[i]; - m_DeletableTuningCollections.erase(iter); + m_TuningCollections[i] = NULL; } } m_TuningCollections.clear(); m_DeletableTuningCollections.clear(); } +HTREEITEM CTuningDialog::AddTreeItem(CTuningCollection* pTC, HTREEITEM parent, HTREEITEM insertAfter) +//--------------------------------------------------------------------------------------------------- +{ + const HTREEITEM temp = m_TreeCtrlTuning.InsertItem(pTC->GetName().c_str(), parent, insertAfter); + HTREEITEM temp2 = NULL; + m_TreeItemTuningItemMap.AddPair(temp, TUNINGTREEITEM(pTC)); + for(size_t i = 0; i<pTC->GetNumTunings(); i++) + { + temp2 = AddTreeItem(&pTC->GetTuning(i), temp, temp2); + } + m_TreeCtrlTuning.EnsureVisible(temp); + return temp; +} + +HTREEITEM CTuningDialog::AddTreeItem(CTuning* pT, HTREEITEM parent, HTREEITEM insertAfter) +//----------------------------------------------------------------------------------------- +{ + const HTREEITEM temp = m_TreeCtrlTuning.InsertItem(pT->GetName().c_str(), parent, insertAfter); + m_TreeItemTuningItemMap.AddPair(temp, TUNINGTREEITEM(pT)); + m_TreeCtrlTuning.EnsureVisible(temp); + return temp; +} + +void CTuningDialog::DeleteTreeItem(CTuning* pT) +//--------------------------------------------- +{ + if(!pT) + return; + + HTREEITEM temp = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pT)); + if(temp) + { + HTREEITEM nextitem = m_TreeCtrlTuning.GetNextItem(temp, TVGN_NEXT); + if(!nextitem) nextitem = m_TreeCtrlTuning.GetNextItem(temp, TVGN_PREVIOUS); + m_pActiveTuning = m_TreeItemTuningItemMap.GetMapping_12(nextitem).GetT(); + m_TreeCtrlTuning.DeleteItem(temp); + //Note: Item from map is deleted 'automatically' in + //OnTvnDeleteitemTreeTuning. + + } +} + +void CTuningDialog::DeleteTreeItem(CTuningCollection* pTC) +//--------------------------------------------- +{ + if(!pTC) + return; + + m_pActiveTuning = NULL; + const HTREEITEM temp = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTC)); + if(temp) + { + TUNINGTREEITEM prevTTI = m_TreeItemTuningItemMap.GetMapping_12(m_TreeCtrlTuning.GetNextItem(temp, TVGN_PREVIOUS)); + TUNINGTREEITEM nextTTI = m_TreeItemTuningItemMap.GetMapping_12(m_TreeCtrlTuning.GetNextItem(temp, TVGN_NEXT)); + + CTuningCollection* pTCprev = prevTTI.GetTC(); + CTuningCollection* pTCnext = nextTTI.GetTC(); + if(pTCnext == NULL) + pTCnext = GetpTuningCollection(nextTTI.GetT()); + if(pTCprev == NULL) + pTCprev = GetpTuningCollection(prevTTI.GetT()); + + if(pTCnext != NULL && pTCnext != m_pActiveTuningCollection) + m_pActiveTuningCollection = pTCnext; + else + { + if(pTCprev != m_pActiveTuningCollection) + m_pActiveTuningCollection = pTCprev; + else + m_pActiveTuningCollection = NULL; + } + + m_TreeCtrlTuning.DeleteItem(temp); + //Note: Item from map is deleted 'automatically' in + //OnTvnDeleteitemTreeTuning. + } + else + { + ASSERT(false); + m_DoErrorExit = true; + m_pActiveTuningCollection = NULL; + } +} + BOOL CTuningDialog::OnInitDialog() //-------------------------------- { CDialog::OnInitDialog(); - + m_RatioMapWnd.Init(this, 0); - //Adding tuning collection names to the combobox. + //-->Creating treeview + m_TreeItemTuningItemMap.ClearMapping(); for(size_t i = 0; i<m_TuningCollections.size(); i++) { - m_CombobTuningCollection.AddString(m_TuningCollections[i]->GetName().c_str()); + AddTreeItem(m_TuningCollections[i], NULL, NULL); } + //<-- Creating treeview - //Adding tuning type names to corresponding combobox + m_pActiveTuningCollection = GetpTuningCollection(m_pActiveTuning); + + //Adding tuning type names to corresponding combobox. m_CombobTuningType.AddString(s_stringTypeGEN.c_str()); m_CombobTuningType.AddString(s_stringTypeRP.c_str()); m_CombobTuningType.AddString(s_stringTypeTET.c_str()); m_ButtonSet.EnableWindow(FALSE); + //#ifdef DEBUG + m_EditTuningCollectionVersion.ShowWindow(SW_SHOW); + m_EditTuningCollectionEditMask.ShowWindow(SW_SHOW); + //#endif + m_EditFineTuneSteps.SetLimitText(3); UpdateView(); @@ -77,117 +176,155 @@ return TRUE; } -void CTuningDialog::UpdateView() + +void CTuningDialog::UpdateView(const int updateMask) //------------------------------ { - - if(m_pActiveTuning == NULL && (m_TuningCollections.size() == 0 || m_TuningCollections[0]->GetNumTunings() == 0)) + if(m_DoErrorExit) { - ASSERT(false); + DoErrorExit(); return; } - if(m_pActiveTuning == NULL) - m_pActiveTuning = &m_TuningCollections[0]->GetTuning(0); - - - //Finding out where given tuning belongs to. - size_t curTCol = 0, curT = 0; //cur <-> Current, T <-> Tuning, Col <-> Collection. - bool found = false; - for(size_t i = 0; i<m_TuningCollections.size(); i++) + //-->Updating treeview + if(updateMask != UM_TUNINGDATA) { - CTuningCollection& rCurTCol = *m_TuningCollections.at(i); - for(size_t j = 0; j<rCurTCol.GetNumTunings(); j++) + TUNINGTREEITEM tuningitem; + if(m_pActiveTuning) + tuningitem.Set(m_pActiveTuning); + else { - if(m_pActiveTuning == &rCurTCol.GetTuning(static_cast<unsigned short>(j))) - { - curTCol = i; - curT = j; - found = true; - break; - } + if(m_pActiveTuningCollection) + tuningitem.Set(m_pActiveTuningCollection); } + HTREEITEM treeitem = m_TreeItemTuningItemMap.GetMapping_21(tuningitem); + if(treeitem) + { + m_TreeCtrlTuning.Select(treeitem, TVGN_CARET); + if(m_pActiveTuning) + m_TreeCtrlTuning.SetItemText(treeitem, m_pActiveTuning->GetName().c_str()); + else + m_TreeCtrlTuning.SetItemText(treeitem, m_pActiveTuningCollection->GetName().c_str()); + } } - ASSERT(found); + //<--Updating treeview + - m_CombobTuningCollection.SetCurSel(curTCol); - OnCbnSelchangeComboTcol(); - m_CombobTuningCollection.Invalidate(); + if(m_pActiveTuningCollection == NULL) + { + return; + } - m_CombobTuningName.SetCurSel(curT); - m_CombobTuningName.Invalidate(); + //Updating tuning collection part--> + if(updateMask == 0 || updateMask & UM_TUNINGCOLLECTION) + { + m_EditTuningCollectionName.SetWindowText(m_pActiveTuningCollection->GetName().c_str()); + m_EditTuningCollectionVersion.SetWindowText(m_pActiveTuningCollection->GetVersionString().c_str()); + m_EditTuningCollectionEditMask.SetWindowText(m_pActiveTuningCollection->GetEditMaskString().c_str()); + m_EditTuningCollectionItemNum.SetWindowText(Stringify(m_pActiveTuningCollection->GetNumTunings()).c_str()); + m_EditTuningCollectionPath.SetWindowText(m_pActiveTuningCollection->GetSaveFilePath().c_str()); + } + //<-- Updating tuning collection part + //Updating tuning part--> + if(m_pActiveTuning != NULL && (updateMask & UM_TUNINGDATA || updateMask == 0)) + { + UpdateTuningType(); - UpdateTuningType(); + m_EditName.SetWindowText(m_pActiveTuning->GetName().c_str()); + m_EditName.Invalidate(); - m_EditName.SetWindowText(m_pActiveTuning->GetName().c_str()); - m_EditName.Invalidate(); + //Finetunesteps-edit + m_EditFineTuneSteps.SetWindowText(Stringify(m_pActiveTuning->GetFineStepCount()).c_str()); + m_EditFineTuneSteps.Invalidate(); - //Finetunesteps-edit - m_EditFineTuneSteps.SetWindowText(Stringify(m_pActiveTuning->GetFineStepCount()).c_str()); - m_EditFineTuneSteps.Invalidate(); + //Making sure that ratiomap window is showing and + //updating its content. + m_RatioMapWnd.ShowWindow(SW_SHOW); + m_RatioMapWnd.m_pTuning = m_pActiveTuning; + m_RatioMapWnd.Invalidate(); + UpdateRatioMapEdits(m_RatioMapWnd.GetShownCentre()); - //.Making sure that ratiomap window is showing and - //updating its content. - m_RatioMapWnd.ShowWindow(SW_SHOW); - m_RatioMapWnd.m_pTuning = m_pActiveTuning; - m_RatioMapWnd.Invalidate(); - UpdateRatioMapEdits(m_RatioMapWnd.GetShownCentre()); - - const CTuning::STEPTYPE period = m_pActiveTuning->GetPeriod(); - const CTuning::RATIOTYPE periodRatio = m_pActiveTuning->GetPeriodRatio(); - if(period > 0) - { - m_EditSteps.EnableWindow(); - m_EditSteps.SetWindowText(Stringify(period).c_str()); + const CTuning::STEPTYPE period = m_pActiveTuning->GetPeriod(); + const CTuning::RATIOTYPE periodRatio = m_pActiveTuning->GetPeriodRatio(); + if(period > 0) + { + m_EditSteps.EnableWindow(); + m_EditSteps.SetWindowText(Stringify(period).c_str()); - m_EditRatioPeriod.EnableWindow(); - m_EditRatioPeriod.SetWindowText(Stringify(periodRatio).c_str()); - } - else //case: m_pActiveTuning is of type general. - { - m_EditSteps.EnableWindow(false); - m_EditRatioPeriod.EnableWindow(false); - } + m_EditRatioPeriod.EnableWindow(); + m_EditRatioPeriod.SetWindowText(Stringify(periodRatio).c_str()); + } + else //case: m_pActiveTuning is of type general. + { + m_EditSteps.EnableWindow(false); + m_EditRatioPeriod.EnableWindow(false); + } - m_EditRatioPeriod.Invalidate(); - m_EditSteps.Invalidate(); + m_EditRatioPeriod.Invalidate(); + m_EditSteps.Invalidate(); - bool enableControls = true; - if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST || + bool enableControls = true; + + if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST || m_pActiveTuning->GetEditMask() == CTuning::EM_CONST_STRICT) - { - CheckDlgButton(IDC_CHECK_READONLY, MF_CHECKED); - if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST_STRICT) - m_ButtonReadOnly.EnableWindow(FALSE); + { + CheckDlgButton(IDC_CHECK_READONLY, MF_CHECKED); + if(m_pActiveTuning->GetEditMask() == CTuning::EM_CONST_STRICT) + m_ButtonReadOnly.EnableWindow(FALSE); + else + m_ButtonReadOnly.EnableWindow(TRUE); + + enableControls = false; + } else - m_ButtonReadOnly.EnableWindow(TRUE); + { + CheckDlgButton(IDC_CHECK_READONLY, MF_UNCHECKED); + m_ButtonReadOnly.EnableWindow(); + } - enableControls = false; + m_CombobTuningType.EnableWindow(enableControls); + m_EditTableSize.SetReadOnly(!enableControls); + m_EditBeginNote.SetReadOnly(!enableControls); + m_EditSteps.SetReadOnly(!enableControls); + m_EditRatioPeriod.SetReadOnly(!enableControls); + m_EditRatio.SetReadOnly(!enableControls); + m_EditNotename.SetReadOnly(!enableControls); + m_EditMiscActions.SetReadOnly(!enableControls); + m_EditFineTuneSteps.SetReadOnly(!enableControls); + m_EditName.SetReadOnly(!enableControls); + + m_ButtonSet.EnableWindow(enableControls); + + m_CombobTuningType.Invalidate(); + m_EditSteps.Invalidate(); + m_EditRatioPeriod.Invalidate(); } - else + else { - CheckDlgButton(IDC_CHECK_READONLY, MF_UNCHECKED); - m_ButtonReadOnly.EnableWindow(); - } + if(m_pActiveTuning == NULL) //No active tuning, clearing tuning part. + { + m_EditName.SetWindowText(""); + m_EditTableSize.SetWindowText(""); + m_EditBeginNote.SetWindowText(""); + m_EditSteps.SetWindowText(""); + m_EditRatioPeriod.SetWindowText(""); + m_EditRatio.SetWindowText(""); + m_EditNotename.SetWindowText(""); + m_EditMiscActions.SetWindowText(""); + m_EditFineTuneSteps.SetWindowText(""); + m_EditName.SetWindowText(""); - m_CombobTuningType.EnableWindow(enableControls); - m_EditTableSize.SetReadOnly(!enableControls); - m_EditBeginNote.SetReadOnly(!enableControls); - m_EditSteps.SetReadOnly(!enableControls); - m_EditRatioPeriod.SetReadOnly(!enableControls); - m_EditRatio.SetReadOnly(!enableControls); - m_EditNotename.SetReadOnly(!enableControls); - m_EditMiscActions.SetReadOnly(!enableControls); - m_EditFineTuneSteps.SetReadOnly(!enableControls); - m_EditName.SetReadOnly(!enableControls); - - m_ButtonSet.EnableWindow(enableControls); - - m_CombobTuningType.Invalidate(); - m_EditSteps.Invalidate(); - m_EditRatioPeriod.Invalidate(); + m_CombobTuningType.SetCurSel(-1); + m_ButtonReadOnly.EnableWindow(FALSE); + + m_RatioMapWnd.ShowWindow(SW_HIDE); + m_RatioMapWnd.m_pTuning = NULL; + m_RatioMapWnd.Invalidate(); + } + } + //<--Updating tuning part } @@ -196,16 +333,11 @@ { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_STATICRATIOMAP, m_RatioMapWnd); - DDX_Control(pDX, IDC_COMBO_TCOL, m_CombobTuningCollection); - DDX_Control(pDX, IDC_COMBO_T, m_CombobTuningName); DDX_Control(pDX, IDC_COMBO_TTYPE, m_CombobTuningType); DDX_Control(pDX, IDC_EDIT_TABLESIZE, m_EditTableSize); DDX_Control(pDX, IDC_EDIT_BEGINNOTE, m_EditBeginNote); DDX_Control(pDX, IDC_EDIT_STEPS, m_EditSteps); DDX_Control(pDX, IDC_EDIT_RATIOPERIOD, m_EditRatioPeriod); - DDX_Control(pDX, IDC_CHECK_NEWTUNING, m_CheckNewTuning); - DDX_Control(pDX, IDC_ADD_TUNING, m_ButtonAddTuning); - DDX_Control(pDX, IDC_REMOVE_TUNING, m_ButtonRemoveTuning); DDX_Control(pDX, IDC_EDIT_RATIOVALUE, m_EditRatio); DDX_Control(pDX, IDC_EDIT_NOTENAME, m_EditNotename); DDX_Control(pDX, IDC_BUTTON_SETVALUES, m_ButtonSet); @@ -215,19 +347,20 @@ DDX_Control(pDX, IDC_EDIT_FINETUNESTEPS, m_EditFineTuneSteps); DDX_Control(pDX, IDC_CHECK_READONLY, m_ButtonReadOnly); DDX_Control(pDX, IDC_EDIT_NAME, m_EditName); + DDX_Control(pDX, IDC_TREE_TUNING, m_TreeCtrlTuning); + DDX_Control(pDX, IDC_EDIT_TUNINGCOLLECTION_NAME, m_EditTuningCollectionName); + DDX_Control(pDX, IDC_EDIT_TUNINGC_VERSION, m_EditTuningCollectionVersion); + DDX_Control(pDX, IDC_EDIT_TUNINGC_EDITMASK, m_EditTuningCollectionEditMask); + DDX_Control(pDX, IDC_EDIT_TUNINGNUM, m_EditTuningCollectionItemNum); + DDX_Control(pDX, IDC_EDIT_TUNINGCOLLECTION_PATH, m_EditTuningCollectionPath); } + BEGIN_MESSAGE_MAP(CTuningDialog, CDialog) - ON_CBN_SELCHANGE(IDC_COMBO_TCOL, OnCbnSelchangeComboTcol) - ON_CBN_SELCHANGE(IDC_COMBO_T, OnCbnSelchangeComboT) - ON_BN_CLICKED(IDC_CHECK_NEWTUNING, OnBnClickedCheckNewtuning) ON_CBN_SELCHANGE(IDC_COMBO_TTYPE, OnCbnSelchangeComboTtype) ON_EN_CHANGE(IDC_EDIT_STEPS, OnEnChangeEditSteps) ON_EN_CHANGE(IDC_EDIT_RATIOPERIOD, OnEnChangeEditRatioperiod) - ON_BN_CLICKED(IDC_ADD_TUNING, OnBnClickedAddTuning) - ON_BN_CLICKED(IDC_REMOVE_TUNING, OnBnClickedRemoveTuning) - ON_CBN_EDITCHANGE(IDC_COMBO_T, OnCbnEditchangeComboT) ON_EN_CHANGE(IDC_EDIT_NOTENAME, OnEnChangeEditNotename) ON_BN_CLICKED(IDC_BUTTON_SETVALUES, OnBnClickedButtonSetvalues) ON_EN_CHANGE(IDC_EDIT_RATIOVALUE, OnEnChangeEditRatiovalue) @@ -241,72 +374,39 @@ ON_EN_KILLFOCUS(IDC_EDIT_RATIOPERIOD, OnEnKillfocusEditRatioperiod) ON_EN_KILLFOCUS(IDC_EDIT_RATIOVALUE, OnEnKillfocusEditRatiovalue) ON_EN_KILLFOCUS(IDC_EDIT_NOTENAME, OnEnKillfocusEditNotename) + ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_TUNING, OnTvnSelchangedTreeTuning) + ON_NOTIFY(TVN_DELETEITEM, IDC_TREE_TUNING, OnTvnDeleteitemTreeTuning) + ON_NOTIFY(NM_RCLICK, IDC_TREE_TUNING, OnNMRclickTreeTuning) + ON_NOTIFY(TVN_BEGINDRAG, IDC_TREE_TUNING, OnTvnBegindragTreeTuning) + ON_COMMAND(ID_REMOVETUNING, OnRemoveTuning) + ON_COMMAND(ID_ADDTUNING, OnAddTuning) + ON_COMMAND(ID_MOVETUNING, OnMoveTuning) + ON_COMMAND(ID_COPYTUNING, OnCopyTuning) + ON_COMMAND(ID_REMOVETUNINGCOLLECTION, OnRemoveTuningCollection) + ON_BN_CLICKED(IDC_BUTTON_TUNINGCOLLECTION_SAVE, OnBnClickedButtonTuningcollectionSave) END_MESSAGE_MAP() -// CTuningDialog message handlers - -void CTuningDialog::OnCbnSelchangeComboTcol() -//------------------------------------------- +void CTuningDialog::DoErrorExit() +//------------------------------- { - const int curTCol = m_CombobTuningCollection.GetCurSel(); - if(curTCol < 0 || curTCol >= static_cast<int>(m_TuningCollections.size())) return; - - //Checking whether collection allows removing - if(m_TuningCollections[curTCol]->CanEdit(CTuningCollection::EM_REMOVE)) - m_ButtonRemoveTuning.EnableWindow(true); - else - m_ButtonRemoveTuning.EnableWindow(false); - - //Clearing existing items from name-combobox... - while(m_CombobTuningName.GetCount() > 0) - m_CombobTuningName.DeleteString(0); - - //...adding names of tunings in the current tuning collection... - CTuningCollection& rTCol = *m_TuningCollections.at(curTCol); - for(size_t i = 0; i<rTCol.GetNumTunings(); i++) - { - m_CombobTuningName.AddString(rTCol.GetTuning(static_cast<unsigned short>(i)).GetName().c_str()); - } - - //Checking whether tuning collection allows adding - //tunings... - if(m_TuningCollections.at(curTCol)->CanEdit(CTuningCollection::EM_ADD)) - m_ButtonAddTuning.EnableWindow(); - else - m_ButtonAddTuning.EnableWindow(false); - - if(m_TuningCollections.at(curTCol)->CanEdit(CTuningCollection::EM_REMOVE)) - m_ButtonRemoveTuning.EnableWindow(); - else - m_ButtonRemoveTuning.EnableWindow(FALSE); + m_DoErrorExit = false; + m_pActiveTuning = NULL; + m_pActiveTuningCollection = NULL; + MsgBox(IDS_ERR_DIALOG, this, NULL, MB_ICONINFORMATION); + OnOK(); } -void CTuningDialog::OnCbnSelchangeComboT() -//---------------------------------------- -{ - const int TCol = m_CombobTuningCollection.GetCurSel(); - if(TCol < 0 || TCol >= static_cast<int>(m_TuningCollections.size())) return; - CTuningCollection& rTCol = *m_TuningCollections.at(TCol); +// CTuningDialog message handlers - //...checking that tuning index is valid... - const unsigned short T = static_cast<unsigned short>(m_CombobTuningName.GetCurSel()); - if(T < 0 || T >= rTCol.GetNumTunings()) - return; - - m_pActiveTuning = &rTCol.GetTuning(T); - m_RatioMapWnd.m_pTuning = m_pActiveTuning; - - UpdateView(); -} - void CTuningDialog::UpdateTuningType() //------------------------------------ { if(m_pActiveTuning) { - ASSERT(m_CombobTuningType.GetCount() > 0); + if(m_CombobTuningType.GetCount() < 3) m_DoErrorExit = true; + if(m_pActiveTuning->GetTuningType() == CTuning::TT_TET) m_CombobTuningType.SetCurSel(2); else @@ -317,12 +417,7 @@ } } -void CTuningDialog::OnBnClickedCheckNewtuning() -//--------------------------------------------- -{ -} - CTuning::CTUNINGTYPE CTuningDialog::GetTuningTypeFromStr(const string& str) const //-------------------------------------------------------------------------------- { @@ -350,6 +445,8 @@ { if(MessageBox("This will change the ratio values; continue?", 0, MB_YESNO) == IDYES) { + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + const size_t BS = 20; char buffer[BS]; m_EditSteps.GetWindowText(buffer, BS); @@ -369,7 +466,7 @@ if(newType == CTuning::TT_TET) m_pActiveTuning->CreateTET(steps, pr); - UpdateView(); + UpdateView(UM_TUNINGDATA); } else //Not wanting to discard current values. { @@ -399,88 +496,6 @@ } -void CTuningDialog::OnBnClickedAddTuning() -//----------------------------------------- -{ - if(m_pActiveTuning == NULL) //Should never be true. - return; - - if(m_pActiveTuning->GetName().length() == 0) - { - MessageBox("Please give name for the tuning", 0, MB_OK); - return; - } - - if(m_CombobTuningCollection.GetCurSel() < 0 || m_CombobTuningCollection.GetCurSel() >= static_cast<int>(m_TuningCollections.size())) - { - MessageBox("No tuning collection chosen", 0, MB_OK); - return; - } - - CTuningCollection& rTCol = *m_TuningCollections[m_CombobTuningCollection.GetCurSel()]; - - string detailStr = string("Add tuning to '") + rTCol.GetName() + string("'(it will be create as a copy of current tuning)?"); - if(MessageBox(detailStr.c_str(), 0, MB_YESNO) == IDYES) - { - CTuning* pNewTuning = new CTuningRTI(m_pActiveTuning); - if(rTCol.AddTuning(pNewTuning)) - { - MessageBox("Add tuning failed"); - delete pNewTuning; - return; - } - m_pActiveTuning = pNewTuning; - UpdateView(); - } -} - -void CTuningDialog::OnBnClickedRemoveTuning() -//------------------------------------------- -{ - UpdateView(); - //Now TCol and T should have the values pointing to m_pActiveTuning. - const size_t TCol = static_cast<size_t>(m_CombobTuningCollection.GetCurSel()); - const size_t T = static_cast<size_t>(m_CombobTuningName.GetCurSel()); - if(TCol >= m_TuningCollections.size() || - T >= m_TuningCollections[TCol]->GetNumTunings()) - return; - - CTuningCollection& rTCol = *m_TuningCollections[TCol]; - const CTuning& rT = m_TuningCollections[TCol]->GetTuning(static_cast<WORD>(T)); - ASSERT(&rT == m_pActiveTuning); - string str = string("Remove tuning '") + rT.GetName() + string("' from collection ") + rTCol.GetName() + string("?"); - if(MessageBox(str.c_str(), 0, MB_YESNO) == IDYES) - { - if(m_TuningCollections[TCol]->Remove(T)) - { - MessageBox("Tuning removal failed"); - return; - } - if(rTCol.GetNumTunings() > 0) - m_pActiveTuning = &rTCol.GetTuning(static_cast<WORD>(min(T, rTCol.GetNumTunings()-1))); - else - if(m_TuningCollections.size() > 0 && m_TuningCollections[0] && m_TuningCollections[0]->GetNumTunings() > 0) - m_pActiveTuning = &m_TuningCollections[0]->GetTuning(0); - else - m_pActiveTuning = NULL; - - UpdateView(); - } -} - -void CTuningDialog::OnCbnEditchangeComboT() -//----------------------------------------- -{ - if(m_pActiveTuning != NULL) - { - const size_t BS = 40; - char buffer[BS]; - m_CombobTuningName.GetWindowText(buffer, BS); - m_pActiveTuning->SetName(buffer); - UpdateView(); - } -} - void CTuningDialog::OnEnChangeEditNotename() //------------------------------------------ { @@ -508,6 +523,7 @@ else m_pActiveTuning->ClearNoteName(currentNote); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; m_RatioMapWnd.Invalidate(); } @@ -534,6 +550,7 @@ if(str.length() > 0) { m_pActiveTuning->SetRatio(currentNote, static_cast<CTuning::RATIOTYPE>(atof(buffer))); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; UpdateTuningType(); m_RatioMapWnd.Invalidate(); } @@ -552,6 +569,7 @@ char buffer[BS]; m_EditMiscActions.GetWindowText(buffer, BS); m_pActiveTuning->Multiply(static_cast<CTuning::RATIOTYPE>(atof(buffer))); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; m_EditMiscActions.SetWindowText(""); m_RatioMapWnd.Invalidate(); } @@ -577,18 +595,18 @@ void CTuningDialog::OnBnClickedButtonExport() //------------------------------------------- { - CTuningCollection* pTC = NULL; //Used if exporting tuning collection. - const CTuning* pT = m_pActiveTuning; + const CTuningCollection* pTC = m_pActiveTuningCollection; - if(pT == NULL) + if(pT == NULL && pTC == NULL) + { + MsgBox(IDS_ERR_NO_TUNING_SELECTION, this, NULL, MB_ICONINFORMATION); return; - - size_t TCol = static_cast<size_t>(m_CombobTuningCollection.GetCurSel()); - if(TCol < m_TuningCollections.size()) - pTC = m_TuningCollections[TCol]; + } - string filter = string("Tuning files (*") + CTuning::s_FileExtension + string(")|*") + CTuning::s_FileExtension + string("|"); + string filter; + if(pT != NULL) + filter = string("Tuning files (*") + CTuning::s_FileExtension + string(")|*") + CTuning::s_FileExtension + string("|"); if(pTC != NULL) filter += string("Tuning collection files (") + CTuningCollection::s_FileExtension + string(")|*") + CTuningCollection::s_FileExtension + string("|"); @@ -626,8 +644,9 @@ //------------------------------------------- { //TODO: Ability to import ratios from text file. - string filter = string("Tuning files (*") + CTuning::s_FileExtension + string(")|*") + CTuning::s_FileExtension + string("|") + - string("Tuning collection files (*") + CTuningCollection::s_FileExtension + string(")|*") + CTuningCollection::s_FileExtension + string("|"); + string filter = string("Tuning files (*") + CTuning::s_FileExtension + string(", *") + CTuningCollection::s_FileExtension + string(")|*") + + CTuning::s_FileExtension + string(";*") + CTuningCollection::s_FileExtension + string("|"); + CFileDialog dlg(TRUE, NULL, NULL, @@ -653,6 +672,8 @@ { m_TempTunings.AddTuning(pT); m_pActiveTuning = pT; + + AddTreeItem(m_pActiveTuning, m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(&m_TempTunings)), NULL); UpdateView(); } } @@ -664,8 +685,8 @@ //a separate collection - no possibility to //directly replace some collection. CTuningCollection* pNewTCol = new CTuningCollection; - ifstream fin(dlg.GetPathName(), ios::binary); - failure = pNewTCol->UnSerializeBinary(fin); + pNewTCol->SetSavefilePath(static_cast<LPCTSTR>(dlg.GetPathName())); + failure = pNewTCol->UnSerializeBinary(); if(failure) { delete pNewTCol; pNewTCol = 0; @@ -674,8 +695,7 @@ { m_TuningCollections.push_back(pNewTCol); m_DeletableTuningCollections.push_back(pNewTCol); - m_CombobTuningCollection.AddString(pNewTCol->GetName().c_str()); - m_CombobTuningCollection.SetCurSel(m_CombobTuningCollection.GetCount()-1); + AddTreeItem(pNewTCol, NULL, NULL); UpdateView(); } @@ -703,6 +723,7 @@ char buffer[BS]; m_EditFineTuneSteps.GetWindowText(buffer, BS); m_EditFineTuneSteps.SetWindowText(Stringify(m_pActiveTuning->SetFineStepCount(static_cast<CTuning::FINESTEPTYPE>(atoi(buffer)))).c_str()); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; m_EditFineTuneSteps.Invalidate(); } } @@ -719,15 +740,16 @@ if(m_pActiveTuning->SetEditMask(CTuning::EM_CONST)) CheckDlgButton(IDC_CHECK_READONLY, MF_UNCHECKED); else - UpdateView(); + UpdateView(UM_TUNINGDATA); } else { if(m_pActiveTuning->SetEditMask(CTuning::EM_ALLOWALL)) CheckDlgButton(IDC_CHECK_READONLY, MF_CHECKED); else - UpdateView(); + UpdateView(UM_TUNINGDATA); } + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; } @@ -740,7 +762,9 @@ char buffer[BS]; m_EditName.GetWindowText(buffer, BS); m_pActiveTuning->SetName(buffer); - UpdateView(); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + UpdateView(UM_TUNINGDATA); + UpdateView(UM_TUNINGCOLLECTION); } } @@ -754,7 +778,8 @@ char buffer[BS]; m_EditSteps.GetWindowText(buffer, BS); m_pActiveTuning->ChangePeriod(static_cast<CTuning::STEPTYPE>(atoi(buffer))); - UpdateView(); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + UpdateView(UM_TUNINGDATA); } } @@ -768,20 +793,489 @@ char buffer[BS]; m_EditRatioPeriod.GetWindowText(buffer, BS); m_pActiveTuning->ChangePeriodRatio(static_cast<CTuning::RATIOTYPE>(atof(buffer))); - UpdateView(); + m_ModifiedTCs[GetpTuningCollection(m_pActiveTuning)] = true; + UpdateView(UM_TUNINGDATA); } } void CTuningDialog::OnEnKillfocusEditRatiovalue() //----------------------------------------------- { - UpdateView(); + UpdateView(UM_TUNINGDATA); } void CTuningDialog::OnEnKillfocusEditNotename() //----------------------------------------------- { + UpdateView(UM_TUNINGDATA); +} + +bool CTuningDialog::GetModifiedStatus(const CTuningCollection* const pTc) const +//----------------------------------------------------------------------------- +{ + MODIFIED_MAP::const_iterator iter = m_ModifiedTCs.find(pTc); + if(iter != m_ModifiedTCs.end()) + return (*iter).second; + else + return false; + +} + +CTuningCollection* CTuningDialog::GetpTuningCollection(HTREEITEM ti) const +//------------------------------------------------------------------------ +{ + //If treeitem is that of a tuningcollection, return address of + //that tuning collection. If treeitem is that of a tuning, return + //the owning tuningcollection + TUNINGTREEITEM tunItem = m_TreeItemTuningItemMap.GetMapping_12(ti); + CTuningCollection* pTC = tunItem.GetTC(); + if(pTC) + return pTC; + else + { + CTuning* pT = tunItem.GetT(); + return GetpTuningCollection(pT); + } +} + +CTuningCollection* CTuningDialog::GetpTuningCollection(const CTuning* const pT) const +//----------------------------------------------------------------- +{ + for(size_t i = 0; i<m_TuningCollections.size(); i++) + { + CTuningCollection& rCurTCol = *m_TuningCollections.at(i); + for(size_t j = 0; j<rCurTCol.GetNumTunings(); j++) + { + if(pT == &rCurTCol.GetTuning(static_cast<unsigned short>(j))) + { + return &rCurTCol; + } + } + } + return NULL; +} + + +void CTuningDialog::OnTvnSelchangedTreeTuning(NMHDR *pNMHDR, LRESULT *pResult) +//---------------------------------------------------------------------------- +{ + //This methods gets called when selected item in the treeview + //changes. + + //TODO: This gets called before killfocus messages of edits, this + // can be a problem. + + LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); + + TUNINGTREEITEM ti = m_TreeItemTuningItemMap.GetMapping_12(pNMTreeView->itemNew.hItem); + + if(ti) + { + int updateMask = UM_TUNINGDATA; + CTuningCollection* pPrevTuningCollection = m_pActiveTuningCollection; + CTuning* pT = ti.GetT(); + CTuningCollection* pTC = ti.GetTC(); + if(pTC) + { + m_pActiveTuningCollection = pTC; + ASSERT(pT == NULL); + m_pActiveTuning = NULL; + } + else + { + m_pActiveTuning = pT; + m_pActiveTuningCollection = GetpTuningCollection(m_pActiveTuning); + + } + if(m_pActiveTuningCollection != pPrevTuningCollection) updateMask |= UM_TUNINGCOLLECTION; + UpdateView(updateMask); + } + else + { + m_DoErrorExit = true; + } + + *pResult = 0; +} + +void CTuningDialog::OnTvnDeleteitemTreeTuning(NMHDR *pNMHDR, LRESULT *pResult) +//---------------------------------------------------------------------------- +{ + LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); + // TODO: Add your control notification handler code here + *pResult = 0; + if(pNMTreeView->itemOld.mask & TVIF_HANDLE && pNMTreeView->itemOld.hItem) + { + m_TreeItemTuningItemMap.RemoveValue_1(pNMTreeView->itemOld.hItem); + } + else + m_DoErrorExit = true; +} + +void CTuningDialog::OnNMRclickTreeTuning(NMHDR *, LRESULT *pResult) +//----------------------------------------------------------------------- +{ + *pResult = 0; + + HTREEITEM hItem; + POINT point, ptClient; + + GetCursorPos(&point); + ptClient = point; + m_TreeCtrlTuning.ScreenToClient(&ptClient); + hItem = m_TreeCtrlTuning.HitTest(ptClient, NULL); + if(hItem == NULL) + return; + + m_TreeCtrlTuning.Select(hItem, TVGN_CARET); + + TUNINGTREEITEM tunitem = m_TreeItemTuningItemMap.GetMapping_12(hItem); + + if(!tunitem) + { + m_DoErrorExit = true; + return; + } + + HMENU popUpMenu = CreatePopupMenu(); + if(popUpMenu == NULL) return; + + CTuning* pT = tunitem.GetT(); + CTuningCollection* pTC = tunitem.GetTC(); + + if(pT) //Creating context menu for tuning-item + { + pTC = GetpTuningCollection(pT); + if(pTC != NULL) + { + UINT mask = MF_STRING; + if(!pTC->CanEdit(CTuningCollection::EM_REMOVE)) + mask |= MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_REMOVETUNING, "Remove"); + + m_CommandItemDest.Set(pT); + } + } + else //Creating context menu for tuning collection item. + { + if(pTC != NULL) + { + UINT mask = MF_STRING; + + if(!pTC->CanEdit(CTuningCollection::EM_ADD)) + mask |= MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_ADDTUNING, "Add tuning"); + + mask = MF_STRING; + if(!IsDeletable(pTC)) + mask |= MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_REMOVETUNINGCOLLECTION, "Delete tuning collection"); + + m_CommandItemDest.Set(pTC); + } + } + + GetCursorPos(&point); + TrackPopupMenu(popUpMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, 0, m_hWnd, NULL); + DestroyMenu(popUpMenu); +} + +bool CTuningDialog::IsDeletable(const CTuningCollection* const pTC) const +//-------------------------------------------------------------------------------- +{ + vector<CTuningCollection*>::const_iterator iter = find(m_DeletableTuningCollections.begin(), m_DeletableTuningCollections.end(), pTC); + if(iter != m_DeletableTuningCollections.end()) + return true; + else + return false; +} + + +void CTuningDialog::OnTvnBegindragTreeTuning(NMHDR *pNMHDR, LRESULT *pResult) +//--------------------------------------------------------------------------- +{ + LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); + *pResult = 0; + + m_CommandItemDest.Reset(); + m_CommandItemSrc.Reset(); + if(pNMTreeView == NULL || pNMTreeView->itemNew.hItem == NULL) return; + TUNINGTREEITEM tunitem = m_TreeItemTuningItemMap.GetMapping_12(pNMTreeView->itemNew.hItem); + + if(tunitem.GetT() == NULL) + { + MsgBox(IDS_UNSUPPORTED_TUNING_DnD, this); + return; + } + + m_TreeCtrlTuning.SetDragging(); + m_DragItem = m_TreeItemTuningItemMap.GetMapping_12(pNMTreeView->itemNew.hItem); + + m_TreeCtrlTuning.Select(pNMTreeView->itemNew.hItem, TVGN_CARET); +} + +void CTuningDialog::OnEndDrag(HTREEITEM dragDestItem) +//-------------------------------------------------- +{ + m_TreeCtrlTuning.SetDragging(false); + if(m_DragItem == NULL) + return; + + m_CommandItemSrc = m_DragItem; + m_DragItem.Reset(); + + TUNINGTREEITEM destTunItem = m_TreeItemTuningItemMap.GetMapping_12(dragDestItem); + if(!destTunItem) + return; + + CTuningCollection* pTCdest = NULL; + CTuningCollection* pTCsrc = m_CommandItemSrc.GetTC(); + + if(pTCsrc == NULL) + pTCsrc = GetpTuningCollection(m_CommandItemSrc.GetT()); + + if(pTCsrc == NULL) + { + ASSERT(false); + return; + } + + if(destTunItem.GetT()) //Item dragged on tuning + pTCdest = GetpTuningCollection(destTunItem.GetT()); + else //Item dragged on tuningcollecition + pTCdest = destTunItem.GetTC(); + + //For now, ignoring drags within a tuning collection. + if(pTCdest == pTCsrc) + return; + + if(pTCdest) + { + UINT mask = MF_STRING; + HMENU popUpMenu = CreatePopupMenu(); + if(popUpMenu == NULL) return; + + POINT point; + GetCursorPos(&point); + + if(!pTCdest->CanEdit(CTuningCollection::EM_ADD)) + mask |= MF_GRAYED; + AppendMenu(popUpMenu, mask, ID_COPYTUNING, "Copy here"); + + if(!pTCsrc->CanEdit(CTuningCollection::EM_REMOVE) || + !pTCdest->CanEdit(CTuningCollection::EM_ADD)) + mask = MF_STRING | MF_GRAYED; + + AppendMenu(popUpMenu, mask, ID_MOVETUNING, "Move here"); + + GetCursorPos(&point); + TrackPopupMenu(popUpMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, 0, m_hWnd, NULL); + DestroyMenu(popUpMenu); + + m_CommandItemDest.Set(pTCdest); + } +} + +bool CTuningDialog::AddTuning(CTuningCollection* pTC, CTuning* pT) +//---------------------------------------------------------------- +{ + //Default: pT == NULL + + if(!pTC) + { + MessageBox("No tuning collection chosen", 0, MB_OK); + return true; + } + + CTuning* pNewTuning = new CTuningRTI(pT); + if(pTC->AddTuning(pNewTuning)) + { + MessageBox("Add tuning failed"); + delete pNewTuning; + return true; + } + AddTreeItem(pNewTuning, m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTC)), NULL); + m_pActiveTuning = pNewTuning; + m_ModifiedTCs[pTC] = true; UpdateView(); + + return false; } +void CTuningDialog::OnAddTuning() +//------------------------------- +{ + if(!m_CommandItemDest.GetTC()) + { + m_CommandItemDest = s_notFoundItemTuning; + return; + } + + CTuningCollection* pTC = m_CommandItemDest.GetTC(); + m_CommandItemDest = s_notFoundItemTuning; + m_ModifiedTCs[pTC]; + AddTuning(pTC); +} + +void CTuningDialog::OnRemoveTuning() +//---------------------------------- +{ + CTuning* pT = m_CommandItemDest.GetT(); + if(m_CommandItemDest.GetT()) + { + CTuningCollection* pTC = GetpTuningCollection(pT); + if(pTC) + { + string str = string("Remove tuning '") + pT->GetName() + string("' from ' ") + pTC->GetName() + string("'?"); + if(MessageBox(str.c_str(), 0, MB_YESNO) == IDYES) + { + if(!pTC->Remove(pT)) + { + m_ModifiedTCs[pTC] = true; + DeleteTreeItem(pT); + UpdateView(); + } + else + { + MessageBox("Tuning removal failed"); + } + } + } + } + + m_CommandItemDest = s_notFoundItemTuning; +} + +void CTuningDialog::OnMoveTuning() +//-------------------------------- +{ + if(!m_CommandItemDest) + return; + + CTuning* pT = m_CommandItemSrc.GetT(); + CTuningCollection* pTCsrc = GetpTuningCollection(pT); + + if(pT == NULL) + { + m_CommandItemDest = s_notFoundItemTuning; + return; + } + + CTuningCollection* pTCdest = NULL; + if(m_CommandItemDest.GetT()) + pTCdest = GetpTuningCollection(m_CommandItemDest.GetT()); + else + pTCdest = m_CommandItemDest.GetTC(); + + + HTREEITEM treeItemSrcTC = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTCsrc)); + HTREEITEM treeItemDestTC = m_TreeItemTuningItemMap.GetMapping_21(TUNINGTREEITEM(pTCdest)); + DeleteTreeItem(pT); + m_ModifiedTCs[pTCsrc] = true; + if(CTuningCollection::TransferTuning(pTCsrc, pTCdest, pT)) + { + MsgBox(IDS_OPERATION_FAIL, this, NULL, MB_OK); + AddTreeItem(pT, treeItemSrcTC, NULL); + } + else + AddTreeItem(pT, treeItemDestTC, NULL); + + UpdateView(); +} + + +void CTuningDialog::OnCopyTuning() +//-------------------------------- +{ + CTuningCollection* pTC = m_CommandItemDest.GetTC(); + + if(!pTC) + return; + + m_CommandItemDest = s_notFoundItemTuning; + + CTuning* pT = m_CommandItemSrc.GetT(); + if(pT == NULL) + { + return; + } + m_ModifiedTCs[pTC] = true; + AddTuning(pTC, pT); +} + +void CTuningDialog::OnRemoveTuningCollection() +//-------------------------------------------- +{ + if(!m_pActiveTuningCollection) + return; + + if(!IsDeletable(m_pActiveTuningCollection)) + { + ASSERT(false); + return; + } + + TUNINGVECTOR::iterator iter = find(m_TuningCollections.begin(), m_TuningCollections.end(), m_pActiveTuningCollection); + if(iter == m_TuningCollections.end()) + { + ASSERT(false); + return; + } + TUNINGVECTOR::iterator DTCiter = find(m_DeletableTuningCollections.begin(), m_DeletableTuningCollections.end(), *iter); + CTuningCollection* deletableTC = m_pActiveTuningCollection; + //Note: Order matters in the following lines. + m_DeletableTuningCollections.erase(DTCiter); + m_TuningCollections.erase(iter); + DeleteTreeItem(m_pActiveTuningCollection); + delete deletableTC; deletableTC = 0; + + UpdateView(); +} + + +void CTuningDialog::OnBnClickedButtonTuningcollectionSave() +//--------------------------------------------------------- +{ + if(!m_pActiveTuningCollection) + return; + + if(m_pActiveTuningCollection->SerializeBinary()) + { + MsgBox(IDS_OPERATION_FAIL, this, NULL, MB_ICONINFORMATION); + } + else + { + m_ModifiedTCs[m_pActiveTuningCollection] = false; + } +} + + +//////////////////////////////////////////////////////// +//*************** +//CTuningTreeCtrl +//*************** +//////////////////////////////////////////////////////// + +BEGIN_MESSAGE_MAP(CTuningTreeCtrl, CTreeCtrl) + ON_WM_LBUTTONUP() +END_MESSAGE_MAP() + + +void CTuningTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point) +//----------------------------------------------------------- +{ + if(IsDragging()) + { + HTREEITEM hItem; + hItem = HitTest(point, NULL); + m_rParentDialog.OnEndDrag(hItem); + + CTreeCtrl::OnLButtonUp(nFlags, point); + } +} + + Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2007-01-29 21:50:16 UTC (rev 171) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2007-02-03 21:24:42 UTC (rev 172) @@ -5,11 +5,179 @@ #include "tuningcollection.h" #include <vector> #include <string> +#include "afxcmn.h" +#include "afxwin.h" using std::vector; using std::string; +//========================== +template<class T1, class T2> +class CBijectiveMap +//========================== +{ +public: + CBijectiveMap(const T1& a, const T2& b) + : m_NotFoundT1(a), + m_NotFoundT2(b) + {} + void AddPair(const T1& a, const T2& b) + { + m_T1.push_back(a); + m_T2.push_back(b); + } + + void ClearMapping() + { + m_T1.clear(); + m_T2.clear(); + } + + size_t Size() const + { + ASSERT(m_T1.size() == m_T2.size()); + return m_T1.size(); + } + + void RemoveValue_1(const T1& a) + { + vector<T1>::iterator iter = find(m_T1.begin(), m_T1.end(), a); + if(iter != m_T1.end()) + { + m_T2.erase(m_T2.begin() + (iter-m_T1.begin())); + m_T1.erase(iter); + } + } + + void RemoveValue_2(const T2& b) + { + vector<T2>::iterator iter = find(m_T2.begin(), m_T2.end(), b); + if(iter != m_T2.end()) + { + m_T1.erase(m_T1.begin() + (iter-m_T2.begin())); + m_T2.erase(iter); + } + } + + T2 GetMapping_12(const T1& a) const + { + vector<T1>::const_iterator iter = find(m_T1.begin(), m_T1.end(), a); + if(iter != m_T1.end()) + { + return m_T2[iter-m_T1.begin()]; + } + else + return m_NotFoundT2; + } + + T1 GetMapping_21(const T2& b) const + { + vector<T2>::const_iterator iter = find(m_T2.begin(), m_T2.end(), b); + if(iter != m_T2.end()) + { + return m_T1[iter-m_T2.begin()]; + } + else + return m_NotFoundT1; + } + +private: + vector<T1> m_T1; + vector<T2> m_T2; + //Elements are collected to two arrays so that elements with the + //same index are mapped to each other. + + T1 m_NotFoundT1; + T2 m_NotFoundT2; +}; + +class CTuningDialog; + +//====================================== +class CTuningTreeCtrl : public CTreeCtrl +//====================================== +{ +private: + CTuningDialog& m_rParentDialog; +public: + CTuningTreeCtrl(CTuningDialog* parent) : m_rParentDialog(*parent) {} + //Note: Parent address may be given in initialiser list so + //do not use it. + + void SetDragging(bool state = true) {m_Dragging = state;} + bool IsDragging() {return m_Dragging;} + +private: + bool m_Dragging; + + afx_msg void OnLButtonUp(UINT nFlags, CPoint point); + DECLARE_MESSAGE_MAP() +}; + +//=================== +class CTuningTreeItem +//=================== +{ +private: + CTuning* m_pTuning; + CTuningCollection* m_pTuningCollection; + +public: + CTuningTreeItem() : m_pTuning(NULL), + m_pTuningCollection(NULL) + {} + + CTuningTreeItem(CTuning* pT) : + m_pTuning(pT), + m_pTuningCollection(NULL) + {} + + CTuningTreeItem(CTuningCollection* pTC) : + m_pTuning(NULL), + m_pTuningCollection(pTC) + {} + + bool operator==(const CTuningTreeItem& ti) const + { + if(m_pTuning == ti.m_pTuning && + m_pTuningCollection == ti.m_pTuningCollection) + return true; + else + return false; + } + + void Reset() {m_pTuning = NULL; m_pTuningCollection = NULL;} + + + void Set(CTuning* pT) + { + m_pTuning = pT; + m_pTuningCollection = NULL; + } + + void Set(CTuningCollection* pTC) + { + m_pTuning = NULL; + m_pTuningCollection = pTC; + } + + operator void*() + { + //Mimicing pointer behavior: if(CTuningTreeItemInstance) equals + //if(CTuningTreeItemInstance.m_pTuning != NULL || + // CTuningTreeItemInstance.m_pTuningCollection != NULL) + if(m_pTuning) + return m_pTuning; + else + return m_pTuningCollection; + } + + CTuningCollection* GetTC() {return m_pTuningCollection;} + + CTuning* GetT() {return m_pTuning;} +}; + // CTuningDialog dialog //================================== @@ -18,6 +186,8 @@ { DECLARE_DYNAMIC(CTuningDialog) + friend class CTuningTreeCtrl; + public: typedef vector<CTuningCollection*> TUNINGVECTOR; @@ -30,33 +200,52 @@ void AddTuningCollection(CTuningCollection* pTC) {if(pTC) m_TuningCollections.push_back(pTC);} void UpdateRatioMapEdits(const CTuning::STEPTYPE&); + bool GetModifiedStatus(const CTuningCollection* const pTc) const; + // Dialog Data enum { IDD = IDD_TUNING }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - DECLARE_MESSAGE_MAP() - private: CTuning::CTUNINGTYPE GetTuningTypeFromStr(const string& str) const; - void UpdateView(); + void UpdateView(const int UpdateMask = 0); void UpdateTuningType(); - + HTREEITEM AddTreeItem(CTuningCollection* pTC, HTREEITEM parent, HTREEITEM insertAfter); + HTREEITEM AddTreeItem(CTuning* pT, HTREEITEM parent, HTREEITEM insertAfter); + + void DeleteTreeItem(CTuning* pT); + void DeleteTreeItem(CTuningCollection* pTC); + + void OnEndDrag(HTREEITEM dragDestItem); + + CTuningCollection* GetpTuningCollection(const CTuning* const) const; + //Returns pointer to the tuning collection where tuning given as argument + //belongs to. + + CTuningCollection* GetpTuningCollection(HTREEITEM ti) const; + //Returns the address of corresponding tuningcollection; if it points + //to tuning-entry, returning the owning tuningcollection + + bool IsDeletable(const CTuningCollection* const pTC) const; + //Checks whether tuning collection can be deleted. + private: CTuningRatioMapWnd m_RatioMapWnd; TUNINGVECTOR m_TuningCollections; vector<CTuningCollection*> m_DeletableTuningCollections; CTuning* m_pActiveTuning; + CTuningCollection* m_pActiveTuningCollection; + CTuningCollection m_TempTunings; - CComboBox m_CombobTuningCollection; - CComboBox m_CombobTuningName; CComboBox m_CombobTuningType; + //Tuning Edits--> CEdit m_EditTableSize; CEdit m_EditBeginNote; CEdit m_EditSteps; @@ -66,26 +255,87 @@ CEdit m_EditMiscActions; CEdit m_EditFineTuneSteps; CEdit m_EditName; + //<--Tuning Edits + + //-->Tuning collection edits + CEdit m_EditTuningCollectionName; + CEdit m_EditTuningCollectionVersion; + CEdit m_EditTuningCollectionEditMask; + CEdit m_EditTuningCollectionItemNum; + CEdit m_EditTuningCollectionPath; + //<--Tuningcollection edits - CButton m_CheckNewTuning; - CButton m_ButtonAddTuning; - CButton m_ButtonRemoveTuning; CButton m_ButtonSet; CButton m_ButtonExport; CButton m_ButtonImport; CButton m_ButtonReadOnly; + CTuningTreeCtrl m_TreeCtrlTuning; +private: + static const string s_stringTypeGEN; + static const string s_stringTypeRP; + static const string s_stringTypeTET; + + typedef CTuningTreeItem TUNINGTREEITEM; + typedef CBijectiveMap<HTREEITEM, TUNINGTREEITEM> TREETUNING_MAP; + TREETUNING_MAP m_TreeItemTuningItemMap; + + TUNINGTREEITEM m_DragItem; + TUNINGTREEITEM m_CommandItemSrc; + TUNINGTREEITEM m_CommandItemDest; + //Commanditem is used when receiving context menu-commands, + //m_CommandItemDest is used when the command really need only + //one argument. + + typedef map<const CTuningCollection* const, bool> MODIFIED_MAP; + MODIFIED_MAP m_ModifiedTCs; + //If tuning collection seems to have been modified, its address + //is added to this map. + + enum + { + TT_TUNINGCOLLECTION = 1, + TT_TUNING + }; + + bool m_NoteEditApply; + bool m_RatioEditApply; + //To indicate whether to apply changes made to + //to those edit boxes(they are modified by non-user + //activies and in these cases the value should be applied + //to the tuning data. + + enum + { + UM_TUNINGDATA = 1, //UM <-> Update Mask + UM_TUNINGCOLLECTION = 2, + }; + + static const TUNINGTREEITEM s_notFoundItemTuning; + static const HTREEITEM s_notFoundItemTree; + + bool AddTuning(CTuningCollection*, CTuning* pT = NULL); + + bool m_DoErrorExit; + //Flag to prevent multiple exit error-messages. + + void DoErrorExit(); + + +//Treectrl context menu functions. public: - afx_msg void OnCbnSelchangeComboTcol(); - afx_msg void OnCbnSelchangeComboT(); - afx_msg void OnBnClickedCheckNewtuning(); + afx_msg void OnRemoveTuning(); + afx_msg void OnAddTuning(); + afx_msg void OnMoveTuning(); + afx_msg void OnCopyTuning(); + afx_msg void OnRemoveTuningCollection(); + +//Event-functions +public: afx_msg void OnCbnSelchangeComboTtype... [truncated message content] |
From: <Rel...@us...> - 2007-01-29 21:50:48
|
Revision: 171 http://svn.sourceforge.net/modplug/?rev=171&view=rev Author: Relabsoluness Date: 2007-01-29 13:50:16 -0800 (Mon, 29 Jan 2007) Log Message: ----------- <Relabs> Added missing misc_util.cpp and misc_util.h files. Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.cpp branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.h Added: branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.cpp (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.cpp 2007-01-29 21:50:16 UTC (rev 171) @@ -0,0 +1,44 @@ +#include "stdafx.h" +#include "misc_util.h" + + +bool StringToBinaryStream(ostream& outStream, const string& str) +//---------------------------------------------------- +{ + if(!outStream.good()) return true; + size_t size = str.size(); + outStream.write(reinterpret_cast<char*>(&size), sizeof(size)); + outStream << str; + if(outStream.good()) + return false; + else + return true; + +} + +bool StringFromBinaryStream(istream& inStrm, string& str, const size_t maxSize) +//--------------------------------------------------------- +{ + if(!inStrm.good()) return true; + size_t strSize; + inStrm.read(reinterpret_cast<char*>(&strSize), sizeof(strSize)); + + if(strSize > maxSize) + return true; + + str.resize(strSize); + + //Inefficiently reading to temporary buffer first and + //then setting that to the string. + char* buffer = new char[strSize+1]; + inStrm.read(buffer, strSize); + buffer[strSize] = '\0'; + str = buffer; + delete[] buffer; buffer = 0; + + + if(inStrm.good()) + return false; + else + return true; +} Added: branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/misc_util.h 2007-01-29 21:50:16 UTC (rev 171) @@ -0,0 +1,70 @@ +#ifndef MISC_UTIL_H +#define MISC_UTIL_H + +#include <vector> +#include <sstream> +#include <string> + +using namespace std; + +const UINT STRINGMAXSIZE = 1000; +const UINT VECTORMAXSIZE = 1000; +//Default sizelimits to string/vector load methods. +//Size limits are there to prevent corrupted streams from +//causing e.g. program to try to load of vector of size 2 000 000 000. + +template<class T> +bool VectorToBinaryStream(ostream& outStrm, const vector<T>& v) +//------------------------------------------------------------ +{ + if(!outStrm.good()) return true; + size_t s = v.size(); + outStrm.write(reinterpret_cast<const char*>(&s), sizeof(s)); + vector<T>::const_iterator iter = v.begin(); + for(iter; iter != v.end(); iter++) + outStrm.write(reinterpret_cast<const char*>(&(*iter)), sizeof(T)); + + if(outStrm.good()) + return false; + else + return true; +} + +template<class T> +bool VectorFromBinaryStream(istream& inStrm, vector<T>& v, const size_t maxSize = VECTORMAXSIZE) +//--------------------------------------------------------- +{ + if(!inStrm.good()) return true; + size_t size; + inStrm.read(reinterpret_cast<char*>(&size), sizeof(size)); + + if(size > maxSize) + return true; + + v.resize(size); + ASSERT(v.size() == size); + for(size_t i = 0; i<size; i++) + { + inStrm.read(reinterpret_cast<char*>(&v[i]), sizeof(T)); + } + if(inStrm.good()) + return false; + else + return true; +} + +bool StringToBinaryStream(ostream& outStream, const string& str); +bool StringFromBinaryStream(istream& inStrm, string& str, const size_t maxSize = STRINGMAXSIZE); + + +template<class T> +inline string Stringify(const T& x) +//-------------------------- +{ + std::ostringstream o; + if(!(o << x)) return "STRINGIFY() FAILURE"; + else return o.str(); +} + + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <qua...@lu...> - 2006-12-28 22:16:21
|
This svn-commit never ended up to the list, so sending it manually. ------------------------------------------------------- Revision: 168 http://svn.sourceforge.net/modplug/?rev=3D168&view=3Drev Author: Relabsoluness Date: 2006-10-02 14:41:06 -0700 (Mon, 02 Oct 2006) Log Message: ----------- + <Relabs> Tuning advancements(GUI improvements, better modeffect handling = when using new tuning things, finesteps, export/import tunings/tuning colle= ctions...) / <Relabs> Pattern&order code rewriting. Increased limit of patterns and or= ders to 65000(only for MPTm) ? <Relabs> Various smaller modifications including memoryleak fix in patter= n expand. Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.h branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.h branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Moptions.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp branches/OpenMPT_MPTm_Tuning/mptrack/PatternGotoDialog.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h branches/OpenMPT_MPTm_Tuning/mptrack/View_tre.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_tre.h branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp branches/OpenMPT_MPTm_Tuning/mptrack/bin/tunings/local_tunings.tc branches/OpenMPT_MPTm_Tuning/mptrack/bin/tunings/standard/std_tunings.tc branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/mod2midi.cpp branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc branches/OpenMPT_MPTm_Tuning/mptrack/resource.h branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.h branches/OpenMPT_MPTm_Tuning/soundlib/LOAD_AMF.CPP branches/OpenMPT_MPTm_Tuning/soundlib/LOAD_DBM.CPP branches/OpenMPT_MPTm_Tuning/soundlib/LOAD_DMF.CPP branches/OpenMPT_MPTm_Tuning/soundlib/LOAD_DSM.CPP branches/OpenMPT_MPTm_Tuning/soundlib/Load_669.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_ams.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_far.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mdl.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_med.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mid.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mod.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mt2.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mtm.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_okt.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_psm.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_ptm.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_s3m.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_stm.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_ult.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_wav.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_xm.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningCollection.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningcollection.h Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.cpp branches/OpenMPT_MPTm_Tuning/mptrack/OrderToPatternTable.h branches/OpenMPT_MPTm_Tuning/mptrack/pattern.cpp branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h branches/OpenMPT_MPTm_Tuning/mptrack/patternContainer.cpp branches/OpenMPT_MPTm_Tuning/mptrack/patternContainer.h branches/OpenMPT_MPTm_Tuning/soundlib/mod_specifications.h Property Changed: ---------------- branches/OpenMPT_MPTm_Tuning/ Property changes on: branches/OpenMPT_MPTm_Tuning ___________________________________________________________________ Name: svn:ignore + *.vcproj *.sln Modified: branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-08-20 2= 1:39:55 UTC (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-10-02 2= 1:41:06 UTC (rev 168) @@ -200,7 +200,7 @@ BEGIN_CRITICAL(); // Rearrange patterns content - for(i =3D 0 ; i < MAX_PATTERNS ; i++){ + for(i =3D 0; i < m_pSndFile->Patterns.Size(); i++){ // Allocate a new empty pattern to replace current pattern at i'th position= in pattern array p =3D m_pSndFile->Patterns[i]; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp 2006-08-20 21:39:55 U= TC (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp 2006-10-02 21:41:06 U= TC (rev 168) @@ -157,7 +157,7 @@ { // Detecting max valid restart position UINT i =3D 0; - for (i=3D0; i<MAX_ORDERS; i++) if (m_pSndFile->Order[i] =3D=3D 0xFF) brea= k; + for (i=3D0; i<m_pSndFile->Order.size(); i++) if (m_pSndFile->Order[i] =3D= =3D m_pSndFile->Patterns.GetInvalidIndex()) break; m_SpinRestartPos.SetRange(0, i); } if (dwHint & HINT_MODGENERAL) @@ -446,9 +446,9 @@ if (s[0]) { UINT n =3D atoi(s); - if (n < MAX_ORDERS) + if(n < m_pSndFile->Order.size()) { - for (UINT i=3D0; i<=3Dn; i++) if (m_pSndFile->Order[i] =3D=3D 0xFF) retur= n; + for (UINT i=3D0; i<=3Dn; i++) if (m_pSndFile->Order[i] =3D=3D m_pSndFile-= >Patterns.GetInvalidIndex()) return; if (n !=3D m_pSndFile->m_nRestartPos) { m_EditRestartPos.SetModify(FALSE); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-08-20 21:39:55 U= TC (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-10-02 21:41:06 U= TC (rev 168) @@ -16,6 +16,8 @@ #pragma warning(disable:4244) +const pair<string, WORD> CCtrlInstruments::s_TuningNotFound("Tuning was no= t found. Setting to default tuning", 7); + ///////////////////////////////////////////////////////////////////////// // CNoteMapWnd @@ -161,7 +163,9 @@ // Note s[0] =3D 0; - if ((nPos >=3D 0) && (nPos < 120)) wsprintf(s, "%s%d", szNoteNames[nPos %= 12], nPos/12); + + + if ((nPos >=3D 0) && (nPos < 120)) wsprintf(s, "%s", pSndFile->GetNoteNam= e(nPos+1, m_nInstrument).c_str()); rect.SetRect(0, ypaint, m_cxFont, ypaint+m_cyFont); DrawButtonRect(hdc, &rect, s, FALSE, FALSE); // Mapped Note @@ -174,7 +178,7 @@ UINT n =3D penv->NoteMap[nPos]; if (n =3D=3D 0xFF) strcpy(s, "=3D=3D=3D"); else if (n =3D=3D 0xFE) strcpy(s, "^^^"); else - if (n <=3D 120) wsprintf(s, "%s%d", szNoteNames[(n-1)%12], (n-1)/12); + if (n <=3D 120) wsprintf(s, "%s", pSndFile->GetNoteName(n, m_nInstrument)= .c_str()); } FillRect(hdc, &rect, (bHighLight) ? CMainFrame::brushHighLight : CMainFrame= ::brushWindow); if ((nPos =3D=3D (int)m_nNote) && (!m_bIns)) @@ -818,30 +822,12 @@ m_SpinInstrument.SetFocus(); - //-->Setting tunings to Combobox - for(size_t i =3D 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings()= ; i++) - { - m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).= GetName().c_str()); - } - for(size_t i =3D 0; i<CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i= ++) - { - m_ComboTuning.AddString(CSoundFile::s_TuningsSharedLocal.GetTuning(i).Get= Name().c_str()); - } - for(size_t i =3D 0; i<m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); = i++) - { - m_ComboTuning.AddString(m_pSndFile->m_TuningsTuneSpecific.GetTuning(i).Ge= tName().c_str()); - } - m_ComboTuning.AddString("Control tunings..."); - m_ComboTuning.SetCurSel(0); - - //<--Setting tunings to Combobox - + BuildTuningComboBox(); +=20 CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); - //OnBnClickedCheckPitchtempolock(); + OnBnClickedCheckPitchtempolock(); m_EditPitchTempoLock.SetLimitText(4); - - return FALSE; } @@ -1075,8 +1061,8 @@ m_SpinInstrument.SetRange(1, m_pSndFile->m_nInstruments); m_SpinInstrument.EnableWindow((m_pSndFile->m_nInstruments) ? TRUE : FALSE); m_ComboTuning.EnableWindow(bMPTOnly); - m_EditPitchTempoLock.EnableWindow(bITonly); - m_CheckPitchTempoLock.EnableWindow(bITonly); + m_EditPitchTempoLock.EnableWindow(bMPTOnly); + m_CheckPitchTempoLock.EnableWindow(bMPTOnly); } if (dwHintMask & (HINT_INSTRUMENT|HINT_MODTYPE)) { @@ -2387,6 +2373,7 @@ return 0; } + //end rewbs.customKeys void CCtrlInstruments::OnCbnSelchangeCombotuning() @@ -2398,8 +2385,20 @@ if(pInstH =3D=3D 0) return; + size_t sel =3D m_ComboTuning.GetCurSel(); + if(sel =3D=3D 0) //Setting IT behavior. + { + BEGIN_CRITICAL(); + pInstH->SetTuning(NULL); + END_CRITICAL(); + m_pModDoc->SetModified(); + UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT); + return; + } + + sel -=3D 1; CTuningCollection* tc =3D 0; - size_t sel =3D m_ComboTuning.GetCurSel(); +=20 if(sel < CSoundFile::s_TuningsSharedStandard.GetNumTunings()) tc =3D &CSoundFile::s_TuningsSharedStandard; else @@ -2418,13 +2417,14 @@ if(tc) { BEGIN_CRITICAL(); - pInstH->pTuning =3D &tc->GetTuning(sel); + pInstH->SetTuning(&tc->GetTuning(sel)); END_CRITICAL(); m_pModDoc->SetModified(); + UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT); return; } -=20 + //Case: Chosen tuning editor to be displayed. //Creating vector for the CTuningDialog. vector<CTuningCollection*> v; v.push_back(&m_pSndFile->s_TuningsSharedStandard); @@ -2435,27 +2435,9 @@ //Recreating tuning combobox so that possible //new tuning(s) come visible. - while(m_ComboTuning.GetCount() > 0) - m_ComboTuning.DeleteString(0); - for(size_t i =3D 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings()= ; i++) - { - m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).= GetName().c_str()); - } - for(size_t i =3D 0; i<CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i= ++) - { - m_ComboTuning.AddString(CSoundFile::s_TuningsSharedLocal.GetTuning(i).Get= Name().c_str()); - } - for(size_t i =3D 0; i<m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); = i++) - { - m_ComboTuning.AddString(m_pSndFile->m_TuningsTuneSpecific.GetTuning(i).Ge= tName().c_str()); - } - m_ComboTuning.AddString("Control tunings..."); - m_ComboTuning.SetCurSel(0); - - UpdateTuningComboBox(); - - - //TODO: Update notemap window with correct notenames. + BuildTuningComboBox(); +=20 + UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT); } @@ -2464,43 +2446,50 @@ { if (m_pModDoc =3D=3D 0 || m_pSndFile =3D=3D 0=20 || m_nInstrument > m_pSndFile->GetNumInstruments() - || m_pSndFile->Headers[m_nInstrument]->pTuning =3D=3D 0) return; + || m_pSndFile->Headers[m_nInstrument] =3D=3D NULL) return; + INSTRUMENTHEADER* const penv =3D m_pSndFile->Headers[m_nInstrument]; + if(penv->pTuning =3D=3D NULL) + { + m_ComboTuning.SetCurSel(0); + return; + } + for(size_t i =3D 0; i < CSoundFile::s_TuningsSharedStandard.GetNumTunings()= ; i++) { - if(m_pSndFile->Headers[m_nInstrument]->pTuning =3D=3D &CSoundFile::s_Tuni= ngsSharedStandard.GetTuning(i)) + if(penv->pTuning =3D=3D &CSoundFile::s_TuningsSharedStandard.GetTuning(i)= ) { - m_ComboTuning.SetCurSel(i); + m_ComboTuning.SetCurSel(i+1); return; } } for(size_t i =3D 0; i < CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i= ++) { - if(m_pSndFile->Headers[m_nInstrument]->pTuning =3D=3D &CSoundFile::s_Tuni= ngsSharedLocal.GetTuning(i)) + if(penv->pTuning =3D=3D &CSoundFile::s_TuningsSharedLocal.GetTuning(i)) { - m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunin= gs()); + m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunin= gs()+1); return; } } for(size_t i =3D 0; i < m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); = i++) { - if(m_pSndFile->Headers[m_nInstrument]->pTuning =3D=3D &m_pSndFile->m_Tuni= ngsTuneSpecific.GetTuning(i)) + if(penv->pTuning =3D=3D &m_pSndFile->m_TuningsTuneSpecific.GetTuning(i)) { - m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunin= gs() + CSoundFile::s_TuningsSharedLocal.GetNumTunings()); + m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunin= gs() + CSoundFile::s_TuningsSharedLocal.GetNumTunings()+1); return; } } - - string str =3D string("Tuning ") + m_pSndFile->Headers[m_nInstrument]->pT= uning->GetName() - + string(" was not found. Setting to default tuning."); + string str =3D s_TuningNotFound.first; + str.insert(s_TuningNotFound.second, m_pSndFile->Headers[m_nInstrument]->p= Tuning->GetName()); MessageBox(str.c_str()); BEGIN_CRITICAL(); - m_pSndFile->Headers[m_nInstrument]->pTuning =3D m_pSndFile->Headers[m_nIn= strument]->s_DefaultTuning; + penv->SetTuning(penv->s_DefaultTuning); END_CRITICAL(); - m_ComboTuning.SetCurSel(0); + m_pModDoc->SetModified(); + UpdateView((m_nInstrument << 24) | HINT_INSTRUMENT); } void CCtrlInstruments::OnEnChangeEditPitchtempolock() @@ -2537,7 +2526,7 @@ if(!penv) return; - //Checking to what value to put for the wPitchToTempoLock. + //Checking what value to put for the wPitchToTempoLock. m_EditPitchTempoLock.EnableWindow(); WORD ptl =3D penv->wPitchToTempoLock; if(ptl =3D=3D 0) @@ -2552,7 +2541,7 @@ ptl =3D m_pSndFile->m_nDefaultTempo; } m_EditPitchTempoLock.SetWindowText(Stringify(ptl).c_str()); - //SetModified() comes with this. + //SetModified() comes with SetWindowText(.). } else { @@ -2568,9 +2557,12 @@ } } + void CCtrlInstruments::OnEnKillfocusEditPitchtempolock() //------------------------------------------------------ { + //Checking that tempo value is in correct range. + if(!m_pSndFile || IsLocked()) return; char buffer[6]; @@ -2578,7 +2570,6 @@ int ptlTempo =3D atoi(buffer); bool changed =3D false; -=20 if(ptlTempo < m_pSndFile->GetTempoMin()) { ptlTempo =3D m_pSndFile->GetTempoMin(); @@ -2590,6 +2581,29 @@ changed =3D true; } - if(changed) m_EditPitchTempoLock.SetWindowText(Stringify(ptlTempo).c_str())= ; } + + +void CCtrlInstruments::BuildTuningComboBox() +//------------------------------------------ +{ + while(m_ComboTuning.GetCount() > 0) + m_ComboTuning.DeleteString(0); + + m_ComboTuning.AddString("IT behavior"); //<-> Instrument pTuning pointer = =3D=3D NULL + for(size_t i =3D 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings()= ; i++) + { + m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).= GetName().c_str()); + } + for(size_t i =3D 0; i<CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i= ++) + { + m_ComboTuning.AddString(CSoundFile::s_TuningsSharedLocal.GetTuning(i).Get= Name().c_str()); + } + for(size_t i =3D 0; i<m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); = i++) + { + m_ComboTuning.AddString(m_pSndFile->m_TuningsTuneSpecific.GetTuning(i).Ge= tName().c_str()); + } + m_ComboTuning.AddString("Control tunings..."); + m_ComboTuning.SetCurSel(0); +} Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h 2006-08-20 21:39:55 UTC= (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h 2006-10-02 21:41:06 UTC= (rev 168) @@ -81,11 +81,15 @@ //Tuning 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; CButton m_CheckPitchTempoLock; +=20 public: CCtrlInstruments(); virtual ~CCtrlInstruments(); @@ -98,6 +102,8 @@ VOID UpdateFilterText(); LONG* GetSplitPosRef() {return &CMainFrame::glInstrumentWindowHeight;} //re= wbs.varWindowSize +=20 + public: //{{AFX_VIRTUAL(CCtrlInstruments) virtual BOOL OnInitDialog(); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp 2006-08-20 21:39:55 U= TC (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp 2006-10-02 21:41:06 U= TC (rev 168) @@ -166,10 +166,13 @@ // Spin controls m_SpinSpacing.SetRange(0, 16); m_SpinSpacing.SetPos(CMainFrame::gnPatternSpacing); + m_SpinInstrument.SetRange(-1, 1); m_SpinInstrument.SetPos(0); + m_SpinOrderListMargins.SetRange(0, m_OrderList.GetShownOrdersMax()); m_SpinOrderListMargins.SetPos(m_OrderList.GetOrderlistMargins()); + SetDlgItemInt(IDC_EDIT_SPACING, CMainFrame::gnPatternSpacing); SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, m_OrderList.GetOrderlistMargins()= ); CheckDlgButton(IDC_PATTERN_FOLLOWSONG, !(CMainFrame::m_dwPatternSetup & PAT= TERN_FOLLOWSONGOFF)); //rewbs.noFollow - set to unchecked @@ -178,6 +181,8 @@ UpdateView(HINT_MODTYPE|HINT_PATNAMES, NULL); RecalcLayout(); +=20 + // -> CODE#0012 // -> DESC=3D"midi keyboard split" //rewbs.merge: fix buffer overrun: @@ -222,6 +227,7 @@ m_bInitialized =3D TRUE; UnlockControls(); + return FALSE; } @@ -550,6 +556,7 @@ //----------------------------------------------- { CModDoc *pModDoc =3D GetDocument(); + CSoundFile* pSndFile =3D pModDoc ? pModDoc->GetSoundFile() : NULL; if ((pModDoc) && (m_pParent)) { @@ -560,28 +567,26 @@ } m_pParent->InstrumentChanged(-1); } - if ((lParam >=3D 0) && (lParam < MAX_PATTERNS)) + if ((lParam >=3D 0) && (lParam < m_pSndFile->Patterns.Size())) { - if (pModDoc) + if (pSndFile) { - CSoundFile *pSndFile =3D pModDoc->GetSoundFile(); - for (UINT i=3D0; i<MAX_ORDERS; i++) + for (UINT i=3D0; i<pSndFile->Order.size(); i++) { if (pSndFile->Order[i] =3D=3D (UINT)lParam) { m_OrderList.SetCurSel(i, TRUE); break; } - if (pSndFile->Order[i] =3D=3D 0xFF) break; + if (pSndFile->Order[i] =3D=3D pSndFile->Patterns.GetInvalidIndex()) break= ; } } SetCurrentPattern(lParam); }=20 - else if ((lParam >=3D 0x8000) && (lParam < MAX_ORDERS + 0x8000))=20 + else if ((lParam >=3D 0x8000) && (lParam < pSndFile->Order.size() + 0x800= 0))=20 { - if (pModDoc) + if (pSndFile) { - CSoundFile *pSndFile =3D pModDoc->GetSoundFile(); lParam &=3D 0x7FFF; m_OrderList.SetCurSel(lParam); SetCurrentPattern(pSndFile->Order[lParam]); @@ -693,6 +698,8 @@ SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, i); } + + void CCtrlPatterns::OnSpacingChanged() //------------------------------------ { @@ -822,13 +829,13 @@ UINT nCurOrd =3D m_OrderList.GetCurSel(); UINT pat =3D pSndFile->Order[nCurOrd]; UINT rows =3D 64; - if ((pat < MAX_PATTERNS) && (pSndFile->Patterns[pat]) && (pSndFile->m_nTy= pe & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) + if ((pat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[pat]) && (pS= ndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) { rows =3D pSndFile->PatternSize[pat]; if (rows < 32) rows =3D 32; } LONG nNewPat =3D m_pModDoc->InsertPattern(nCurOrd+1, rows); - if ((nNewPat >=3D 0) && (nNewPat < MAX_PATTERNS)) + if ((nNewPat >=3D 0) && (nNewPat < pSndFile->Patterns.Size())) { m_OrderList.SetCurSel(nCurOrd+1); m_OrderList.InvalidateRect(NULL, FALSE); @@ -850,7 +857,7 @@ UINT nCurOrd =3D m_OrderList.GetCurSel(); UINT nCurPat =3D pSndFile->Order[nCurOrd]; UINT rows =3D 64; - if (nCurPat < MAX_PATTERNS) + if (nCurPat < pSndFile->Patterns.Size()) { if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_= TYPE_IT|MOD_TYPE_MPT))) { @@ -858,7 +865,7 @@ if (rows < 16) rows =3D 16; } LONG nNewPat =3D m_pModDoc->InsertPattern(nCurOrd+1, rows); - if ((nNewPat >=3D 0) && (nNewPat < MAX_PATTERNS)) + if ((nNewPat >=3D 0) && (nNewPat < pSndFile->Patterns.Size())) { MODCOMMAND *pSrc =3D pSndFile->Patterns[nCurPat]; MODCOMMAND *pDest =3D pSndFile->Patterns[nNewPat]; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.h 2006-08-20 21:39:55 UTC= (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.h 2006-10-02 21:41:06 UTC= (rev 168) @@ -12,11 +12,13 @@ HFONT m_hFont; COLORREF colorText, colorTextSel; int m_cxFont, m_cyFont, m_nXScroll, m_nScrollPos, m_nDropPos; + //m_nXScroll : The order at the beginning of shown orderlist? //m_nScrollPos: The same as order? BYTE m_nOrderlistMargins; //To tell how many orders('orderboxes') to show at least //on both sides of current order(when updating orderslist position). + UINT m_nDragOrder; BOOL m_bScrolling, m_bDragging, m_bShift; CModDoc *m_pModDoc; @@ -37,10 +39,15 @@ BOOL UpdateScrollInfo(); void UpdateInfoText(); int GetFontWidth(); - BYTE SetOrderlistMargins(int); //Returns the number that was set. + + BYTE SetOrderlistMargins(int); + //Returns the number that was set. + BYTE GetOrderlistMargins() const {return m_nOrderlistMargins;} - BYTE GetShownOrdersMax(); //Should return the maximum number of shown ord= ers. + BYTE GetShownOrdersMax(); + //Should return the maximum number of shown orders. + public: //{{AFX_VIRTUAL(COrderList) virtual BOOL PreTranslateMessage(MSG *pMsg); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2006-08-20 21:39:55 U= TC (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2006-10-02 21:41:06 U= TC (rev 168) @@ -105,7 +105,7 @@ UINT nPage; int nMax=3D0; - while ((nMax < MAX_ORDERS) && (pSndFile->Order[nMax] !=3D 0xFF)) nMax++; + while ((nMax < pSndFile->Order.size()) && (pSndFile->Order[nMax] !=3D pSn= dFile->Patterns.GetInvalidIndex())) nMax++; GetScrollInfo(SB_HORZ, &info, SIF_PAGE|SIF_RANGE); info.fMask =3D SIF_PAGE|SIF_RANGE; info.nMin =3D 0; @@ -166,9 +166,10 @@ //--------------------------------------------- { CMainFrame *pMainFrm =3D CMainFrame::GetMainFrame(); + CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); CRect rcClient; - if ((sel < 0) || (sel >=3D MAX_ORDERS) || (!m_pParent) || (!pMainFrm)) re= turn FALSE; + if ((sel < 0) || (sel >=3D pSndFile->Order.size()) || (!m_pParent) || (!p= MainFrm)) return FALSE; if (sel =3D=3D m_nScrollPos) return TRUE; GetClientRect(&rcClient); InvalidateSelection(); @@ -195,9 +196,8 @@ InvalidateSelection(); if ((m_pParent) && (m_pModDoc) && (bEdit)) { - CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); UINT n =3D pSndFile->Order[m_nScrollPos]; - if ((n < MAX_PATTERNS) && (pSndFile->Patterns[n])) + if ((n < pSndFile->Patterns.Size()) && (pSndFile->Patterns[n])) { BOOL bIsPlaying =3D (pMainFrm->GetModPlaying() =3D=3D m_pModDoc); if ((bIsPlaying) && (pSndFile->m_dwSongFlags & SONG_PATTERNLOOP)) @@ -216,7 +216,11 @@ pSndFile->m_nCurrentPattern =3D m_nScrollPos; pSndFile->SetCurrentOrder(m_nScrollPos); pSndFile->m_dwSongFlags |=3D dwPaused; - if (!(dwPaused & SONG_PATTERNLOOP)) pSndFile->GetLength(TRUE); + //if (!(dwPaused & SONG_PATTERNLOOP)) pSndFile->GetLength(TRUE); + //Relabs.note: Commented above line for it seems to cause + //significant slowdown when changing patterns without + //pattern-loop enabled. What is it's purpose anyway? + if (bIsPlaying) pMainFrm->ResetNotificationBuffer(); END_CRITICAL(); } @@ -231,9 +235,9 @@ UINT COrderList::GetCurrentPattern() const //---------------------------------------- { - if ((m_pModDoc) && (m_nScrollPos < MAX_PATTERNS)) + CSoundFile* pSndFile =3D m_pModDoc ? m_pModDoc->GetSoundFile() : NULL; + if ((pSndFile) && (m_nScrollPos < pSndFile->Patterns.Size())) { - CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); return pSndFile->Order[m_nScrollPos]; } return 0; @@ -255,7 +259,7 @@ { CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); int i =3D 0; - for (i=3D0; i<MAX_ORDERS-1; i++) if (pSndFile->Order[i+1] =3D=3D 0xFF) br= eak; + for (i=3D0; i<pSndFile->Order.size()-1; i++) if (pSndFile->Order[i+1] =3D= =3D pSndFile->Patterns.GetInvalidIndex()) break; SetCurSel(i); } break; @@ -288,10 +292,11 @@ CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); int ord =3D pSndFile->Order[m_nScrollPos]; int maxpat =3D 0; - for (int i=3D0; i<MAX_PATTERNS; i++) if (pSndFile->Patterns[i]) maxpat = =3D i; + for (int i=3D0; i<pSndFile->Patterns.Size(); i++) if (pSndFile->Patterns[= i]) maxpat =3D i; if ((nChar >=3D '0') && (nChar <=3D '9')) { - if (ord >=3D MAX_PATTERNS) ord =3D 0; + if (ord >=3D pSndFile->Patterns.Size()) ord =3D 0; + ord =3D ord * 10 + (nChar - '0'); if ((ord >=3D 100) && (ord > maxpat)) ord %=3D 100; if ((ord >=3D 10) && (ord > maxpat)) ord %=3D 10; @@ -299,18 +304,23 @@ if (nChar =3D=3D '+') { ord++; - if (ord > 0xFF) ord =3D 0; else - if ((ord > maxpat) && (ord < 0xFE)) ord =3D 0xFE; + if(ord > pSndFile->Patterns.GetInvalidIndex()) + ord =3D 0; + else + { + if(ord > maxpat && ord < pSndFile->Patterns.GetIgnoreIndex()) + ord =3D pSndFile->Patterns.GetIgnoreIndex(); + } } else if (nChar =3D=3D '-') { ord--; - if (ord < 0) ord =3D 0xFF; else - if ((ord > maxpat) && (ord < 0xFE)) ord =3D maxpat; + if (ord < 0) ord =3D pSndFile->Patterns.GetInvalidIndex(); else + if ((ord > maxpat) && (ord < pSndFile->Patterns.GetIgnoreIndex())) ord = =3D maxpat; } if (ord !=3D pSndFile->Order[m_nScrollPos]) { - pSndFile->Order[m_nScrollPos] =3D (BYTE)ord; + pSndFile->Order[m_nScrollPos] =3D static_cast<UINT>(ord); m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); InvalidateSelection(); @@ -401,10 +411,10 @@ s[0] =3D 0; wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "Position= %02Xh of %02Xh" : "Position %d of %d", m_nScrollPos, pSndFile->GetNumPatterns()); - if (m_nScrollPos < MAX_ORDERS) + if (m_nScrollPos < pSndFile->Order.size()) { UINT nPat =3D pSndFile->Order[m_nScrollPos]; - if ((nPat < MAX_PATTERNS) && (nPat < pSndFile->m_nPatternNames)) + if ((nPat < pSndFile->Patterns.Size()) && (nPat < pSndFile->m_nPatternNam= es)) { CHAR szpat[40] =3D ""; if (pSndFile->GetPatternName(nPat, szpat)) @@ -450,7 +460,7 @@ while (rect.left < rcClient.right) { BOOL bHighLight =3D ((bFocus) && (nIndex =3D=3D m_nScrollPos)) ? TRUE : FAL= SE; - int nOrder =3D ((nIndex >=3D 0) && (nIndex < MAX_ORDERS)) ? pSndFile->Ord= er[nIndex] : -1; + int nOrder =3D ((nIndex >=3D 0) && (nIndex < pSndFile->Order.size())) ? p= SndFile->Order[nIndex] : -1; if ((rect.right =3D rect.left + m_cxFont) > rcClient.right) rect.right =3D = rcClient.right; rect.right--; FillRect(dc.m_hDC, &rect, (bHighLight) ? CMainFrame::brushHighLight : CMain= Frame::brushWindow); @@ -482,9 +492,16 @@ s[0] =3D 0; if ((nOrder >=3D 0) && (rect.left + m_cxFont - 4 <=3D rcClient.right)) { - if (nOrder =3D=3D 0xFF) strcpy(s, "---"); else - if (nOrder < MAX_PATTERNS) wsprintf(s, "%d", nOrder); - else strcpy(s, "+++"); + if (nOrder =3D=3D pSndFile->Patterns.GetInvalidIndex()) strcpy(s, "---");= //Print the 'dots' + else=20 + { + if (nOrder < pSndFile->Patterns.Size()) wsprintf(s, "%d", nOrder); + else + { + if(nOrder =3D=3D pSndFile->Patterns.GetIgnoreIndex()) strcpy(s, "+++"); + else strcpy(s, "BUG"); + } + } } dc.SetTextColor((bHighLight) ? colorTextSel : colorText); dc.DrawText(s, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); @@ -531,7 +548,7 @@ { CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); int nOrder =3D m_nXScroll + (pt.x - rect.left) / m_cxFont; - if ((nOrder >=3D 0) && (nOrder < MAX_ORDERS)) + if ((nOrder >=3D 0) && (nOrder < pSndFile->Order.size())) { if (pSndFile->m_nSeqOverride =3D=3D nOrder+1) { pSndFile->m_nSeqOverride=3D0; @@ -599,7 +616,7 @@ if (rect.PtInRect(pt)) { n =3D m_nXScroll + (pt.x - rect.left) / m_cxFont; - if ((n < 0) || (n >=3D MAX_ORDERS)) n =3D -1; + if ((n < 0) || (n >=3D m_pModDoc->GetSoundFile()->Order.size())) n =3D -1= ; } if (n !=3D (int)m_nDropPos) { @@ -638,7 +655,7 @@ HMENU hMenu =3D ::CreatePopupMenu(); UINT nCurrentPattern =3D GetCurrentPattern(); - bool patternExists =3D (nCurrentPattern<MAX_PATTERNS + bool patternExists =3D (nCurrentPattern < m_pModDoc->GetSoundFile()->Patt= erns.Size() && m_pModDoc->GetSoundFile()->Patterns[nCurrentPattern] !=3D NULL); DWORD greyed =3D patternExists?FALSE:MF_GRAYED; @@ -729,7 +746,14 @@ if (m_pModDoc) { CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); - for (int i=3DMAX_ORDERS-1; i>m_nScrollPos; i--) pSndFile->Order[i] =3D pS= ndFile->Order[i-1]; + //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->Order.GetOrderNumberLimitMax()) + pSndFile->Order.push_back(pSndFile->Patterns.GetInvalidIndex()); + } + for (int i=3DpSndFile->Order.size()-1; i>m_nScrollPos; i--) pSndFile->Ord= er[i] =3D pSndFile->Order[i-1]; InvalidateRect(NULL, FALSE); m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); @@ -743,13 +767,13 @@ if (m_pModDoc) { CSoundFile *pSndFile =3D m_pModDoc->GetSoundFile(); - for (int i=3Dm_nScrollPos; i<MAX_ORDERS-1; i++) pSndFile->Order[i] =3D pS= ndFile->Order[i+1]; - pSndFile->Order[MAX_ORDERS-1] =3D 0xFF; + for (int i=3Dm_nScrollPos; i<pSndFile->Order.size()-1; i++) pSndFile->Ord= er[i] =3D pSndFile->Order[i+1]; + pSndFile->Order[pSndFile->Order.size()-1] =3D pSndFile->Patterns.GetInval= idIndex(); InvalidateRect(NULL, FALSE); m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); UINT nNewOrd =3D pSndFile->Order[m_nScrollPos]; - if ((nNewOrd < MAX_PATTERNS) && (pSndFile->Patterns[nNewOrd]) && (m_pPare= nt)) + if ((nNewOrd < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nNewOrd]= ) && (m_pParent)) { m_pParent->SetCurrentPattern(nNewOrd); } @@ -837,11 +861,12 @@ CPoint pt; if ((!pDropInfo) || (!m_pModDoc) || (m_pModDoc !=3D pDropInfo->pModDoc) || = (!m_cxFont)) return FALSE; + pSndFile =3D m_pModDoc->GetSoundFile(); bCanDrop =3D FALSE; switch(pDropInfo->dwDropType) { case DRAGONDROP_ORDER: - if (pDropInfo->dwDropItem >=3D MAX_ORDERS) break; + if (pDropInfo->dwDropItem >=3D pSndFile->Order.size()) break; case DRAGONDROP_PATTERN: bCanDrop =3D TRUE; break; @@ -851,12 +876,11 @@ ScreenToClient(&pt); if (pt.x < 0) pt.x =3D 0; posdest =3D m_nXScroll + (pt.x / m_cxFont); - if (posdest >=3D MAX_ORDERS) return FALSE; - pSndFile =3D m_pModDoc->GetSoundFile(); + if (posdest >=3D pSndFile->Order.size()) return FALSE; switch(pDropInfo->dwDropType) { case DRAGONDROP_PATTERN: - pSndFile->Order[posdest] =3D (BYTE)pDropInfo->dwDropItem; + pSndFile->Order[posdest] =3D static_cast<UINT>(pDropInfo->dwDropItem); break; case DRAGONDROP_ORDER: Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2006-08-20 21:39:55 U= TC (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2006-10-02 21:41:06 U= TC (rev 168) @@ -7,7 +7,11 @@ #include "view_pat.h" #include "EffectVis.h" //rewbs.fxvis #include "ChannelManagerDlg.h" +#include "../soundlib/tuning_template.h" +#include <string> +using std::string; + // Headers #define ROWHDR_WIDTH 32 // Row header #define COLHDR_HEIGHT 16 // Column header @@ -269,8 +273,11 @@ srcy =3D pfnt->nAlphaNZ_Y + 13 * COLUMN_HEIGHT; break; case '#': - srcx =3D pfnt->nAlphaAM_X; - srcy =3D pfnt->nAlphaAM_Y + 13 * COLUMN_HEIGHT; + srcx =3D pfnt->nNoteX + pfnt->nNoteWidth/2; + srcy =3D pfnt->nNoteY + 2*COLUMN_HEIGHT; + //TODO: '#' doesn't show properly in effect column. + //srcx =3D pfnt->nAlphaAM_X; + //srcy =3D pfnt->nAlphaAM_Y + 13 * COLUMN_HEIGHT; break; //rewbs.smoothVST case '\\': @@ -284,16 +291,24 @@ srcy =3D pfnt->nAlphaNZ_Y + 15 * COLUMN_HEIGHT; break; //end rewbs.velocity - + case ' ': + srcx =3D pfnt->nClrX; + srcy =3D pfnt->nClrY; + break; + case '-': + srcx =3D pfnt->nNoteX + pfnt->nNoteWidth/2; + srcy =3D pfnt->nNoteY + COLUMN_HEIGHT; + break; } m_Dib.TextBlt(x, y, sizex, COLUMN_HEIGHT, srcx+ofsx, srcy); } -void CViewPattern::DrawNote(int x, int y, UINT note) -//-------------------------------------------------- +void CViewPattern::DrawNote(int x, int y, UINT note, CTuning* pTuning) +//------------------------------------------------------------------------= --- { PCPATTERNFONT pfnt =3D GetCurrentPatternFont(); +=20 UINT xsrc =3D pfnt->nNoteX, ysrc =3D pfnt->nNoteY, dx =3D pfnt->nEltWidths[= 0]; if (!note) { @@ -308,11 +323,22 @@ m_Dib.TextBlt(x, y, dx, COLUMN_HEIGHT, xsrc, ysrc + 14*COLUMN_HEIGHT); } else { - UINT o =3D (note-1) / 12; - UINT n =3D (note-1) % 12; - m_Dib.TextBlt(x, y, pfnt->nNoteWidth, COLUMN_HEIGHT, xsrc, ysrc+(n+1)*COL= UMN_HEIGHT); - m_Dib.TextBlt(x+pfnt->nNoteWidth, y, pfnt->nOctaveWidth, COLUMN_HEIGHT, - pfnt->nNumX, pfnt->nNumY+o*COLUMN_HEIGHT); + if(pTuning) + { + string noteStr =3D pTuning->GetNoteName(static_cast<CTuning::STEPTYPE>(no= te-NOTE_MIDDLEC)); + noteStr.resize(3, ' '); + DrawLetter(x, y, noteStr[0]); + DrawLetter(x + pfnt->nNoteWidth/2, y, noteStr[1]); + DrawLetter(x + pfnt->nNoteWidth, y, noteStr[2]); + } + else //Original + { + UINT o =3D (note-1) / 12; //Octave + UINT n =3D (note-1) % 12; //Note + m_Dib.TextBlt(x, y, pfnt->nNoteWidth, COLUMN_HEIGHT, xsrc, ysrc+(n+1)*COL= UMN_HEIGHT); + m_Dib.TextBlt(x+pfnt->nNoteWidth, y, pfnt->nOctaveWidth, COLUMN_HEIGHT, + pfnt->nNumX, pfnt->nNumY+o*COLUMN_HEIGHT); + } } } @@ -491,13 +517,13 @@ { UINT nCurOrder =3D SendCtrlMessage(CTRLMSG_GETCURRENTORDER); - if ((nCurOrder > 0) && (nCurOrder < MAX_ORDERS) && (pSndFile->Order[nCurO= rder] =3D=3D m_nPattern)) + if ((nCurOrder > 0) && (nCurOrder < pSndFile->Order.size()) && (pSndFile-= >Order[nCurOrder] =3D=3D m_nPattern)) { nPrevPat =3D pSndFile->Order[nCurOrder-1]; bPrevPatFound =3D TRUE; } } - if ((bPrevPatFound) && (nPrevPat < MAX_PATTERNS) && (pSndFile->Patterns[n= PrevPat])) + if ((bPrevPatFound) && (nPrevPat < pSndFile->Patterns.Size()) && (pSndFil= e->Patterns[nPrevPat])) { UINT nPrevRows =3D pSndFile->PatternSize[nPrevPat]; UINT n =3D (nSkip < nPrevRows) ? nSkip : nPrevRows; @@ -535,12 +561,12 @@ BOOL bNextPatFound =3D FALSE; UINT nCurOrder =3D SendCtrlMessage(CTRLMSG_GETCURRENTORDER); - if ((nCurOrder+1 < MAX_ORDERS) && (pSndFile->Order[nCurOrder] =3D=3D m_nP= attern)) + if ((nCurOrder+1 < pSndFile->Order.size()) && (pSndFile->Order[nCurOrder]= =3D=3D m_nPattern)) { nNextPat =3D pSndFile->Order[nCurOrder+1]; bNextPatFound =3D TRUE; } - if ((bNextPatFound) && (nNextPat < MAX_PATTERNS) && (pSndFile->Patterns[n= NextPat])) + if ((bNextPatFound) && (nNextPat < pSndFile->Patterns.Size()) && (pSndFil= e->Patterns[nNextPat])) { UINT nNextRows =3D pSndFile->PatternSize[nNextPat]; UINT n =3D ((UINT)nVisRows < nNextRows) ? nVisRows : nNextRows; @@ -757,7 +783,10 @@ } // Drawing note m_Dib.SetTextColor(tx_col, bk_col); - DrawNote(xbmp+x, 0, m->note); + if(pSndFile->m_nType =3D=3D MOD_TYPE_MPT && m->instr < MAX_INSTRUMENTS &&= pSndFile->Headers[m->instr]) + DrawNote(xbmp+x, 0, m->note, pSndFile->Headers[m->instr]->pTuning); + else //Original + DrawNote(xbmp+x, 0, m->note); } x +=3D pfnt->nEltWidths[0]; // Instrument Modified: branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-08-20 21:39:55 UT= C (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-10-02 21:41:06 UT= C (rev 168) @@ -646,6 +646,9 @@ delete m_InputHandler; //rewbs.customKeys delete m_pAutoSaver; //rewbs.autosaver delete m_pPerfCounter; + + //Saving statictunings here. + CSoundFile::SaveStaticTunings(); } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) @@ -1984,11 +1987,9 @@ m_WaveFile.m_nSamples =3D 1; m_WaveFile.Order[0] =3D 0; m_WaveFile.Order[1] =3D 1; - m_WaveFile.Order[2] =3D 0xFF; - m_WaveFile.PatternSize[0] =3D 64; - m_WaveFile.PatternSize[1] =3D 64; - m_WaveFile.Patterns[0] =3D CSoundFile::AllocatePattern(64, 4); - m_WaveFile.Patterns[1] =3D CSoundFile::AllocatePattern(64, 4); + m_WaveFile.Order[2] =3D m_WaveFile.Patterns.GetInvalidIndex(); + m_WaveFile.Patterns.Insert(0,64); + m_WaveFile.Patterns.Insert(1,64); if (m_WaveFile.Patterns[0]) { if (!nNote) nNote =3D 5*12+1; @@ -2059,11 +2060,9 @@ } m_WaveFile.Order[0] =3D 0; m_WaveFile.Order[1] =3D 1; - m_WaveFile.Order[2] =3D 0xFF; - m_WaveFile.PatternSize[0] =3D 64; - m_WaveFile.PatternSize[1] =3D 64; - m_WaveFile.Patterns[0] =3D CSoundFile::AllocatePattern(64, 4); - m_WaveFile.Patterns[1] =3D CSoundFile::AllocatePattern(64, 4); + m_WaveFile.Order[2] =3D m_WaveFile.Patterns.GetInvalidIndex(); + m_WaveFile.Patterns.Insert(0, 64); + m_WaveFile.Patterns.Insert(1, 64); if (m_WaveFile.Patterns[0]) { if (!nNote) nNote =3D 5*12+1; @@ -2539,7 +2538,7 @@ if (m_pSndFile !=3D &m_WaveFile) { UINT nPat =3D m_pSndFile->m_nPattern; - if (nPat < MAX_PATTERNS) + if(nPat < m_pSndFile->Patterns.Size()) { if (nPat < 10) strcat(s, " "); if (nPat < 100) strcat(s, " "); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h 2006-08-20 21:39:55 UTC = (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h 2006-10-02 21:41:06 UTC = (rev 168) @@ -11,6 +11,7 @@ #include "sndfile.h" #include "CommandSet.h" #include "inputhandler.h" +#include "mptrack.h" class CInputHandler; class CMainFrame; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2006-08-20 21:39:55 UTC= (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2006-10-02 21:41:06 UTC= (rev 168) @@ -97,7 +97,8 @@ m_lpszLog =3D NULL; m_hWndFollow =3D NULL; memset(PatternUndo, 0, sizeof(PatternUndo)); - memset(OrderUndo, 0, sizeof(OrderUndo)); //rewbs.orderListUndo + vector<BYTE> temp; temp.resize(MAX_UNDO_LEVEL, 0); + OrderUndo.resize(m_SndFile.Order.size(), temp); #ifdef _DEBUG MODCHANNEL *p =3D m_SndFile.Chn; if (((DWORD)p) & 7) Log("MODCHANNEL is not aligned (0x%08X)\n", p); @@ -133,7 +134,7 @@ if (!CDocument::OnNewDocument()) return FALSE; m_SndFile.Create(NULL, this, 0); - m_SndFile.m_nType =3D CTrackApp::GetDefaultDocType(); + m_SndFile.ChangeModTypeTo(CTrackApp::GetDefaultDocType()); // -> CODE#0023 // -> DESC=3D"IT project files (.itp)" @@ -190,7 +191,7 @@ pEmbeddedBank =3D new CDLSBank(); pEmbeddedBank->Open(lpszPathName); } - m_SndFile.m_nType =3D MOD_TYPE_IT; + m_SndFile.ChangeModTypeTo(MOD_TYPE_IT); BeginWaitCursor(); LPMIDILIBSTRUCT lpMidiLib =3D CTrackApp::GetMidiLibrary(); // Scan Instruments @@ -319,17 +320,17 @@ case MOD_TYPE_AMF0: case MOD_TYPE_MTM: case MOD_TYPE_669: - m_SndFile.m_nType =3D MOD_TYPE_MOD; + m_SndFile.ChangeModTypeTo(MOD_TYPE_MOD); break; case MOD_TYPE_MED: case MOD_TYPE_OKT: case MOD_TYPE_AMS: case MOD_TYPE_MT2: - m_SndFile.m_nType =3D MOD_TYPE_XM; + m_SndFile.ChangeModTypeTo(MOD_TYPE_XM); if ((m_SndFile.m_nDefaultTempo =3D=3D 125) && (m_SndFile.m_nDefaultSpeed = =3D=3D 6) && (!m_SndFile.m_nInstruments)) { m_SndFile.m_nType =3D MOD_TYPE_MOD; - for (UINT i=3D0; i<MAX_PATTERNS; i++) + for (UINT i=3D0; i<m_SndFile.Patterns.Size(); i++) if ((m_SndFile.Patterns[i]) && (m_SndFile.PatternSize[i] !=3D 64)) m_SndFile.m_nType =3D MOD_TYPE_XM; } @@ -603,11 +604,10 @@ // m_SndFile.m_nChannels =3D (m_SndFile.m_nType & MOD_TYPE_MOD) ? 8 : 16; m_SndFile.m_nChannels =3D (m_SndFile.m_nType & MOD_TYPE_MOD) ? 8 : 32; // -! BEHAVIOUR_CHANGE#0006 - if (m_SndFile.Order[0] >=3D MAX_PATTERNS) m_SndFile.Order[0] =3D 0; + if (m_SndFile.Order[0] >=3D m_SndFile.Patterns.Size()) m_SndFile.Order[0]= =3D 0; if (!m_SndFile.Patterns[0]) { - m_SndFile.PatternSize[0] =3D 64; - m_SndFile.Patterns[0] =3D CSoundFile::AllocatePattern(m_SndFile.PatternSi= ze[0], m_SndFile.m_nChannels); + m_SndFile.Patterns.Insert(0, 64); } strcpy(m_SndFile.m_szNames[0], "untitled"); m_SndFile.m_nMusicTempo =3D m_SndFile.m_nDefaultTempo =3D 125; @@ -1208,7 +1208,7 @@ UINT CModDoc::GetPatternSize(UINT nPat) const //------------------------------------------- { - if ((nPat < MAX_PATTERNS) && (m_SndFile.Patterns[nPat])) return m_SndFile= .PatternSize[nPat]; + if ((nPat < m_SndFile.Patterns.Size()) && (m_SndFile.Patterns[nPat])) ret= urn m_SndFile.PatternSize[nPat]; return 0; } @@ -1346,7 +1346,7 @@ // Saving as wave file // -> CODE#0024 // -> DESC=3D"wav export update" - UINT p,n =3D 1; + UINT p =3D 0,n =3D 1; DWORD flags[MAX_BASECHANNELS]; CHAR channel[MAX_CHANNELNAME+2]; @@ -1646,18 +1646,18 @@ UINT nNextRow =3D m_SndFile.m_nNextRow; pMainFrm->PauseMod(); BEGIN_CRITICAL(); - if ((bLoop) && (nPat < MAX_PATTERNS)) + if ((bLoop) && (nPat < m_SndFile.Patterns.Size())) { - if ((m_SndFile.m_nCurrentPattern < MAX_ORDERS) && (m_SndFile.Order[m_SndF= ile.m_nCurrentPattern] =3D=3D nPat)) + if ((m_SndFile.m_nCurrentPattern < m_SndFile.Order.size()) && (m_SndFile.= Order[m_SndFile.m_nCurrentPattern] =3D=3D nPat)) { m_SndFile.m_nNextPattern =3D m_SndFile.m_nCurrentPattern; m_SndFile.m_nNextRow =3D nNextRow; m_SndFile.m_nRow =3D nRow; } else { - for (UINT i=3D0; i<MAX_ORDERS; i++) + for (UINT i=3D0; i<m_SndFile.Order.size(); i++) { - if (m_SndFile.Order[i] =3D=3D 0xFF) break; + if (m_SndFile.Order[i] =3D=3D m_SndFile.Patterns.GetInvalidIndex()) break= ; if (m_SndFile.Order[i] =3D=3D nPat) { m_SndFile.m_nCurrentPattern =3D i; @@ -1695,7 +1695,7 @@ CChildFrame *pChildFrm =3D (CChildFrame *) GetChildFrame(); if (strcmp("CViewPattern", pChildFrm->GetCurrentViewClassName()) =3D=3D 0) { - //Relabsoluness.note: User has sent play song command: set loop pattern c= heckbox to false. + //User has sent play song command: set loop pattern checkbox to false. pChildFrm->SendViewMessage(VIEWMSG_PATTERNLOOP, 0); } @@ -1866,10 +1866,10 @@ if (pat >=3D 0) { UINT ord =3D 0; - for (UINT i=3D0; i<MAX_ORDERS; i++) + for (UINT i=3D0; i<m_SndFile.Order.size(); i++) { if (m_SndFile.Order[i] =3D=3D pat) ord =3D i; - if (m_SndFile.Order[i] =3D=3D 0xFF) break; + if (m_SndFile.Order[i] =3D=3D m_SndFile.Patterns.GetInvalidIndex()) break= ; } ViewPattern(pat, ord); } @@ -1990,6 +1990,7 @@ #define MOD_TYPE_ITMPT (MOD_TYPE_IT|MOD_TYPE_MPT) #define MAX_FXINFO 66 //rewbs.smoothVST, increased from 64... I wonder what= this will break? + const MPTEFFECTINFO gFXInfo[MAX_FXINFO] =3D { {CMD_ARPEGGIO, 0,0, 0, 0xFFFFFFFF, "Arpeggio"}, @@ -2704,14 +2705,14 @@ ord =3D patternViewState->nOrder; } //rewbs.fix3185: if position is invalid, go to start of song. - if (ord > MAX_ORDERS) { + if (ord >=3D m_SndFile.Order.size()) { ord =3D 0; pat =3D pSndFile->Order[ord]; } - if (pat > MAX_PATTERNS) { + if (pat >=3D m_SndFile.Patterns.Size()) { pat=3D0; } - if (row > pSndFile->PatternSize[pat]) { + if (row >=3D pSndFile->PatternSize[pat]) { row=3D0; } //end rewbs.fix3185 @@ -2797,7 +2798,7 @@ { if (strcmp("CViewPattern", pChildFrm->GetCurrentViewClassName()) =3D=3D 0) { - //Relabsoluness.note: User has sent play pattern command: set loop patter= n checkbox to true. + //User has sent play pattern command: set loop pattern checkbox to true. pChildFrm->SendViewMessage(VIEWMSG_PATTERNLOOP, 1); } @@ -2817,7 +2818,7 @@ pSndFile->Chn[i].nFadeOutVol =3D 0; pSndFile->Chn[i].dwFlags |=3D CHN_NOTEFADE | CHN_KEYOFF; } - if ((nOrd < MAX_PATTERNS) && (pSndFile->Order[nOrd] =3D=3D nPat)) pSndFil= e->m_nCurrentPattern =3D pSndFile->m_nNextPattern =3D nOrd; + if ((nOrd < m_SndFile.Order.size()) && (pSndFile->Order[nOrd] =3D=3D nPat= )) pSndFile->m_nCurrentPattern =3D pSndFile->m_nNextPattern =3D nOrd; pSndFile->m_dwSongFlags &=3D ~(SONG_PAUSED|SONG_STEP); pSndFile->LoopPattern(nPat); pSndFile->m_nNextRow =3D 0; @@ -2848,7 +2849,7 @@ { if (strcmp("CViewPattern", pChildFrm->GetCurrentViewClassName()) =3D=3D 0) { - //Relabsoluness.note: User has sent play pattern command: set loop patter= n checkbox to true. + //User has sent play pattern command: set loop pattern checkbox to true. pChildFrm->SendViewMessage(VIEWMSG_PATTERNLOOP, 1); } @@ -2865,8 +2866,7 @@ { pSndFile->Chn[i].dwFlags |=3D CHN_NOTEFADE | CHN_KEYOFF; } - if ((nOrd < MAX_PATTERNS) && (pSndFile->Order[nOrd] =3D=3D nPat)) pSndFil= e->m_nCurrentPattern =3D pSndFile->m_nNextPattern =3D nOrd; - //Relabs.note: Some jumps occured when using pattern play and loop patter= n checkbox - above line hopefully fixes it. + if ((nOrd < m_SndFile.Order.size()) && (pSndFile->Order[nOrd] =3D=3D nPat= )) pSndFile->m_nCurrentPattern =3D pSndFile->m_nNextPattern =3D nOrd; pSndFile->m_dwSongFlags &=3D ~(SONG_PAUSED|SONG_STEP); pSndFile->LoopPattern(nPat); pSndFile->m_nNextRow =3D nRow; @@ -2897,7 +2897,7 @@ { if (strcmp("CViewPattern", pChildFrm->GetCurrentViewClassName()) =3D=3D 0) { - //Relabsoluness.note: User has sent play song command: set loop pattern c= heckbox to false. + //User has sent play song command: set loop pattern checkbox to false. pChildFrm->SendViewMessage(VIEWMSG_PATTERNLOOP, 0); } @@ -3114,4 +3114,4 @@ if (bShowLog) ShowLog("Conversion Status", CMainFrame::GetMainFrame()); SetModified(); } -} \ No newline at end of file +} Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.h 2006-08-20 21:39:55 UTC (= rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.h 2006-10-02 21:41:06 UTC (= rev 168) @@ -83,11 +83,12 @@ protected: LPSTR m_lpszLog; CSoundFile m_SndFile; + BOOL m_bPaused; HWND m_hWndFollow; DWORD m_dwNotifyType; PATTERNUNDOBUFFER PatternUndo[MAX_UNDO_LEVEL]; - BYTE OrderUndo[MAX_UNDO_LEVEL][MAX_ORDERS]; //rewbs.orderListUndo + vector<vector<BYTE> > OrderUndo; // -> CODE#0015 // -> DESC=3D"channels management dlg" @@ -143,7 +144,6 @@ public: BOOL ChangeModType(UINT nNewType); BOOL ChangeNumChannels(UINT nNewChannels); - BOOL ResizePattern(UINT nPattern, UINT nRows); BOOL ConvertInstrumentsToSamples();; BOOL RemoveUnusedSamples(); BOOL RemoveUnusedInstruments(); @@ -217,7 +217,7 @@ void RecordParamChange(int slot, long param); void LearnMacro(int macro, long param); - BOOL RemoveChannels(BOOL bChnMask[MAX_CHANNELS]); //Relabsoluness 20.12.2= 005 + BOOL RemoveChannels(BOOL bChnMask[MAX_CHANNELS]); bool m_bHasValidPath; //becomes true if document is loaded or saved. Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp 2006-08-20 21:39:55 UT= C (rev 167) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp 2006-10-02 21:41:06 UT= C (rev 168) @@ -42,7 +42,7 @@ } // Check if conversion to 64 rows is necessary - for (UINT ipat=3D0; ipat<MAX_PATTERNS; ipat++) + for (UINT ipat=3D0; ipat<m_SndFile.Patterns.Size(); ipat++) { if ((m_SndFile.Patterns[ipat]) && (m_SndFile.PatternSize[ipat] !=3D 64)) b6= 4++; } @@ -63,29 +63,9 @@ // Resizing all patterns to 64 rows UINT nPatCvt =3D 0; UINT i =3D 0; - for (i=3D0; i<MAX_PATTERNS; i++) if ((m_SndFile.Patterns[i]) && (m_SndFil= e.PatternSize[i] !=3D 64)) + for (i=3D0; i<m_SndFile.Patterns.Size(); i++) if ((m_SndFile.Patterns[i])= && (m_SndFile.PatternSize[i] !=3D 64)) { - if (m_SndFile.PatternSize[i] < 64) - { - MODCOMMAND *p =3D CSoundFile::AllocatePattern(64, m_SndFile.m_nChannels); - if (p) - { - memcpy(p, m_SndFile.Patterns[i], m_SndFile.m_nChannels*m_SndFile.PatternS= ize[i]*sizeof(MODCOMMAND)); - CSoundFile::FreePattern(m_SndFile.Patterns[i]); - m_SndFile.Patterns[i] =3D p; - m_SndFile.PatternSize[i] =3D 64; - } else AddToLog("ERROR: Not enough memory to resize pattern!\n"); - } else - { - MODCOMMAND *pnew =3D CSoundFile::AllocatePattern(64, m_SndFile.m_nChannel= s); - if (pnew) - { - memcpy(pnew, m_SndFile.Patterns[i], m_SndFile.m_nChannels*64*sizeof(MODCO= MMAND)); - CSoundFile::FreePattern(m_SndFile.Patterns[i]); - m_SndFile.Patterns[i] =3D pnew; - } - m_SndFile.PatternSize[i] =3D 64; - } + m_SndFile.Patterns[i].Resize(64); if (b64 < 5) { wsprintf(s, "WARNING: Pattern %d resized to 64 rows\n", i); @@ -116,7 +96,7 @@ // Adjust pattern data if ((m_SndFile.m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) && (nNewType & (MOD_TY= PE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))) { - for (UINT nPat=3D0; nPat<MAX_PATTERNS; nPat++) if (m_SndFile.Patterns[nPa= t]) + for (UINT nPat=3D0; nPat<m_SndFile.Patterns.Size(); nPat++) if (m_SndFile= .Patterns[nPat]) { MODCOMMAND *m =3D m_SndFile.Patterns[nPat]; for (UINT len =3D m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len;= m++, len--) @@ -172,7 +152,7 @@ } else if ((m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) && (nNewT= ype & (MOD_TYPE_MOD|MOD_TYPE_XM))) { - for (UINT nPat=3D0; nPat<MAX_PATTERNS; nPat++) if (m_SndFile.Patterns[nPa= t]) + for (UINT nPat=3D0; nPat<m_SndFile.Patterns.Size(); nPat++) if (m_SndFile= .Patterns[nPat]) { MODCOMMAND *m =3D m_SndFile.Patterns[nPat]; for (UINT len =3D m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; len-= -; m++) @@ -295,7 +275,7 @@ AddToLog("WARNING: Samples above 31 will be lost when saving this file as M= OD!\n"); } BEGIN_CRITICAL(); - m_SndFile.m_nType =3D nNewType; + m_SndFile.ChangeModTypeTo(nNewType); if ((!(nNewType & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_XM))) && (m_SndFile.m_= dwSongFlags & SONG_LINEARSLIDES)) { AddToLog("WARNING: Linear Frequency Slides not supported by the new format.= \n"); @@ -368,7 +348,7 @@ for (int iRst=3Dm_SndFile.m_nChannels-1; iRst>=3D0; iRst--) //rewbs.removeC= hanWindowCleanup { rem.m_bChnMask[iRst] =3D TRUE; - for (UINT ipat=3D0; ipat<MAX_PATTERNS; ipat++) if (m_SndFile.Patterns[ipa= t]) + for (UINT ipat=3D0; ipat<m_SndFile.Patterns.Size(); ipat++) if (m_SndFile= .Patterns[ipat]) { MODCOMMAND *p =3D m_SndFile.Patterns[ipat] + iRst; UINT len =3D m_SndFile.PatternSize[ipat]; @@ -395,7 +375,7 @@ BeginWaitCursor(); // Increasing number of channels BEGIN_CRITICAL(); - for (UINT i=3D0; i<MAX_PATTERNS; i++) if (m_SndFile.Patterns[i]) + for (UINT i=3D0; i<m_SndFile.Patterns.Size(); i++) if (m_SndFile.Patterns= [i]) { MODCOMMAND *p =3D m_SndFile.Patterns[i]; MODCOMMAND *newp =3D CSoundFile::AllocatePattern(m_SndFile.PatternSize[i], = nNewChannels); @@ -447,7 +427,7 @@ BeginWaitCursor(); BEGIN_CRITICAL(); - for (i=3D0; i<MAX_PATTERNS; i++) if (m_SndFile.Patterns[i]) + for (i=3D0; i<m_SndFile.Patterns.Size(); i++) if (m_SndFile.Patterns[i]) { MODCOMMAND *p =3D m_SndFile.Patterns[i]; MODCOMMAND *newp =3D CSoundFile::AllocatePattern(m_SndFile.PatternSize[i], = nRemainingChannels); @@ -495,102 +475,36 @@ return FALSE; } -BOOL CModDoc::ResizePattern(UINT nPattern, UINT nRows) -//---------------------------------------------------- -{ -// -> CODE#0008 -// -> DESC=3D"#define to set pattern size" -// if ((nPattern >=3D MAX_PATTERNS) || (nRows < 2) || (nRows > 256)) retur= n FALSE; - if ((nPattern >=3D MAX_PATTERNS) || (nRows < 2) || (nRows > MAX_PATTERN_R= OWS)) return FALSE; -// -! BEHAVIOUR_CHANGE#0008 - if (m_SndFile.m_nType & (MOD_TYPE_MOD|MOD_TYPE_S3M)) nRows =3D 64; - if (nRows =3D=3D m_SndFile.PatternSize[nPattern]) return TRUE; - BeginWaitCursor(); - BEGIN_CRITICAL(); - if (!m_SndFile.Patterns[nPattern]) - { - m_SndFile.Patterns[nPattern] =3D CSoundFile::AllocatePattern(nRows, m_Snd= File.m_nChannels); - m_SndFile.PatternSize[nPattern] =3D nRows; - } else - if (nRows > m_SndFile.PatternSize[nPattern]) - { - MODCOMMAND *p =3D CSoundFile::AllocatePattern(nRows, m_SndFile.m_nChannel= s); - if (p) - { - memcpy(p, m_SndFile.Patterns[nPattern], m_SndFile.m_nChannels*m_SndFile.P= atternSize[nPattern]*sizeof(MODCOMMAND)); - CSoundFile::FreePattern(m_SndFile.Patterns[nPattern]); - m_SndFile.Patterns[nPattern] =3D p; - m_SndFile.PatternSize[nPattern] =3D nRows; - } - } else - { - BOOL bOk =3D TRUE; - MODCOMMAND *p =3D m_SndFile.Patterns[nPattern]; - UINT ndif =3D (m_SndFile.PatternSize[nPattern] - nRows) * m_SndFile.m_nCh= annels; - UINT npos =3D nRows * m_SndFile.m_nChannels; - for (UINT i=3D0; i<ndif; i++) - { - if (*((DWORD *)(p+i+npos))) - { - bOk =3D FALSE; - break; - } - } - if (!bOk) - { - END_CRITICAL(); - EndWaitCursor(); - if (CMainFrame::GetMainFrame()->MessageBox("Data at the end of the patter= n will be lost.\nDo you want to continue", - "Shrink Pattern", MB_YESNO|MB_ICONQUESTION) =3D=3D IDYES) bOk =3D TRUE; - BeginWaitCursor(); - BEGIN_CRITICAL(); - } - if (bOk) - { - MODCOMMAND *pnew =3D CSoundFile::AllocatePattern(nRows, m_SndFile.m_nChan= nels); - if (pnew) - { - memcpy(pnew, m_SndFile.Patterns[nPattern], m_SndFile.m_nChannels*nRows*si= zeof(MODCOMMAND)); - CSoundFile::FreePattern(m_SndFile.Patterns[nPattern]); - m_SndFile.Patterns[nPattern] =3D pnew; - m_SndFile.PatternSize[nPattern] =3D nRows; - } - } - } - END_CRITICAL(); - EndWaitCursor(); - SetModified(); - return (nRows =3D=3D m_SndFile.PatternSize[nPattern]) ? TRUE : FALSE; -} - BOOL CModDoc::RemoveUnusedPatterns(BOOL bRemove) //---------------------------------------------- { - UINT nPatMap[MAX_PATTERNS]; - UINT nPatRows[MAX_PATTERNS]; - MODCOMMAND *pPatterns[MAX_PATTERNS]; - BOOL bPatUsed[MAX_PATTERNS]; + const UINT maxPatIndex =3D m_SndFile.Patterns.Size(); + const UINT maxOrdIndex =3D m_SndFile.Order.size(); + vector<UINT> nPatMap(maxPatIndex, 0); + vector<UINT> nPatRows(maxPatIndex, 0); + vector<MODCOMMAND*> pPatterns(maxPatIndex, NULL); + vector<BOOL> bPatUsed(maxPatIndex, false); +=20 CHAR s[512]; BOOL bEnd =3D FALSE, bReordered =3D FALSE; UINT nPatRemoved =3D 0, nMinToRemove, nPats; BeginWaitCursor(); - memset(bPatUsed, 0, sizeof(bPatUsed)); UINT maxpat =3D 0; - for (UINT iord=3D0; iord<MAX_ORDERS; iord++) + for (UINT iord=3D0; iord<maxOrdIndex; iord++) { UINT n =3D m_SndFile.Order[iord]; - if (n < MAX_PATTERNS) + if (n < maxPatIndex) { if (n >=3D maxpat) maxpat =3D n+1; if (!bEnd) bPatUsed[n] =3D TRUE; - } else if (n =3D=3D 0xFF) bEnd =3D TRUE; + } else if (n =3D=3D m_SndFile.Patterns.GetInvalidIndex()) bEnd =3D TRUE; } nMinToRemove =3D 0; if (!bRemove) { - UINT imax=3DMAX_PATTERNS; + UINT imax =3D maxPatIndex; while (imax > 0) { imax--; @@ -598,7 +512,7 @@ } nMinToRemove =3D imax+1; } - for (UINT ipat=3Dmaxpat; ipat<MAX_PATTERNS; ipat++) if ((m_SndFile.Patter= ns[ipat]) && (ipat >=3D nMinToRemove)) + for (UINT ipat=3Dmaxpat; ipat<maxPatIndex; ipat++) if ((m_SndFile.Pattern= s[ipat]) && (ipat >=3D nMinToRemove)) { MODCOMMAND *m =3D m_SndFile.Patterns[ipat]; UINT ncmd =3D m_SndFile.m_nChannels * m_SndFile.PatternSize[ipat]; @@ -606,17 +520,13 @@ { if ((m[i].note) || (m[i].instr) || (m[i].volcmd) || (m[i].command)) goto No= tEmpty; } - BEGIN_CRITICAL(); - m_SndFile.PatternSize[ipat] =3D 0; - m_SndFile.FreePattern(m_SndFile.Patterns[ipat]); - m_SndFile.Patterns[ipat] =3D NULL; + m_SndFile.Patterns.Remove(ipat); nPatRemoved++; - END_CRITICAL(); NotEmpty: ; } UINT bWaste =3D 0; - for (UINT ichk=3D0; ichk<MAX_PATTERNS; ichk++) + for (UINT ichk=3D0; ichk < maxPatIndex; ichk++) { if ((m_SndFile.Patterns[ichk]) && (!bPatUsed[ichk])) bWaste++; } @@ -627,34 +537,32 @@ if (CMainFrame::GetMainFrame()->MessageBox(s, "Pattern Cleanup", MB_YESNO) = !=3D IDYES) return TRUE; BeginWaitCursor(); } - memset(nPatRows, 0, sizeof(nPatRows)); - memset(pPatterns, 0, sizeof(pPatterns)); - for (UINT irst=3D0; irst<MAX_PATTERNS; irst++) nPatMap[irst] =3D 0xFFFF; + for (UINT irst=3D0; irst<maxPatIndex; irst++) nPatMap[irst] =3D 0xFFFF; nPats =3D 0; UINT imap =3D 0; - for (imap=3D0; imap<MAX_ORDERS; imap++) + for (imap=3D0; imap<maxOrdIndex; imap++) { UINT n =3D m_SndFile.Order[imap]; - if (n < MAX_PATTERNS) + if (n < maxPatIndex) { - if (nPatMap[n] > MAX_PATTERNS) nPatMap[n] =3D nPats++; + if (nPatMap[n] > maxPatIndex) nPatMap[n] =3D nPats++; m_SndFile.Order[imap] =3D nPatMap[n]; } else if (n =3D=3D 0xFF) break; } // Add unused patterns at the end if ((!bRemove) || (!bWaste)) { - for (UINT iadd=3D0; iadd<MAX_PATTERNS; iadd++) + for (UINT iadd=3D0; iadd<maxPatIndex; iadd++) { - if ((m_SndFile.Patterns[iadd]) && (nPatMap[iadd] >=3D MAX_PATTERNS)) + if ((m_SndFile.Patterns[iadd]) && (nPatMap[iadd] >=3D maxPatIndex)) { nPatMap[iadd] =3D nPats++; } } } - while (imap < MAX_ORDERS) + while (imap < maxOrdIndex) { - m_SndFile.Order[imap++] =3D 0xFF; + m_SndFile.Order[imap++] =3D m_SndFile.Patterns.GetInvalidIndex(); } BEGIN_CRITICAL(); // Reorder patterns & Delete unused patterns @@ -663,10 +571,10 @@ LPSTR lpszpatnames =3D m_SndFile.m_lpszPatternNames; m_SndFile.m_nPatternNames =3D 0; m_SndFile.m_lpszPatternNames =3D NULL; - for (UINT i=3D0; i<MAX_PATTERNS; i++) + for (UINT i=3D0; i<maxPatIndex; i++) { UINT k =3D nPatMap[i]; - if (k < MAX_PATTERNS) + if (k < maxPatIndex) { if (i !=3D k) bReordered =3D TRUE; // Remap pattern names @@ -686,16 +594,13 @@ } else if (m_SndFile.Patterns[i]) { - m_SndFile.FreePattern(m_SndFile.Patterns[i]); - m_SndFile.Patterns[i] =3D NULL; - m_SndFile.PatternSize[i] =3D 0; + m_SndFile.Patterns.Remove(i); nPatRemoved++; } } - for (UINT j=3D0; j<MAX_PATTERNS;j++) + for (UINT j=3D0; j<maxPatIndex;j++) { - m_SndFile.PatternSize[j] =3D nPatRows[j]; - m_SndFile.Patterns[j] =3D pPatterns[j]; + m_SndFile.Patterns[j].SetData(pPatterns[j], nPatRows[j]); } } END_CRITICAL(); @@ -719,7 +624,7 @@ //----------------------------------------- { if (!m_SndFile.m_nInstruments) return FALSE; - for (UINT i=3D0; i<MAX_PATTERNS; i++) if (m_SndFile.Patterns[i]) + for (UINT i=3D0; i<m_SndFile.Patterns.Size(); i++) if (m_SndFile.Patterns= [i]) { MODCOMMAND *p =3D m_SndFile.Patterns[i]; for (UINT j=3Dm_SndFile.m_nChannels*m_SndFile.PatternSize[i]; j; j--, p++) = if (p->instr) @@ -765,7 +670,7 @@ if (m_SndFile.m_nInstruments) { memset(bIns, 0, sizeof(bIns)); - for (UINT ipat=3D0; ipat<MAX_PATTERNS; ipat++) + for (UINT ipat=3D0; ipat<m_SndFile.Patterns.Size(); ipat++) { MODCOMMAND *p =3D m_SndFile.Patterns[ipat]; if (p) @@ -898,7 +803,7 @@ } //all outputs of used plugins count as used - if (usedmap[nPlug]=3D=3Dtrue) { + if (usedmap[nPlug]!=3D0) { if (m_SndFile.m_MixPlugins[nPlug].Info.dwOutputRouting & 0x80) { int output =3D m_SndFile.m_MixPlugins[nPlug].Info.dwOutputRouting & 0x7f; usedmap[output]=3Dtrue; @@ -1021,7 +926,7 @@ END_CRITICAL(); if (nSwap > 0) { - for (UINT iPat=3D0; iPat<MAX_PATTERNS; iPat++) if (m_SndFile.Patterns[iPa= t]) + for (UINT iPat=3D0; iPat<m_SndFile.Patterns.Size(); iPat++) if (m_SndFile= .Patterns[iPat]) { MODCOMMAND *p =3D m_SndFile.Patterns[iPat]; UINT nLen =3D m_SndFile.m_nChannels * m_SndFile.PatternSize[iPat]; @@ -1139,28 +1044,30 @@ LONG CModDoc::InsertPattern(LONG nOrd, UINT nRows) //------------------------------------------------ { - UINT maxpat =3D (m_SndFile.m_nType & MOD_TYPE_MOD) ? 128 : MAX_PATTERNS; - UINT i =3D 0; - for (i=3D0; i<maxpat; i++) + const int i =3D m_SndFile.Patterns.Insert(nRows); + if(i < 0) + return -1; + + //Increasing orderlist size if given order is beyond current limit, + //or if the last order already has a pattern. + if((nOrd =3D=3D m_SndFile.Order.size() || + m_SndFile.Order.back() < m_SndFile.Patterns.S... [truncated message content] |
From: <Rel...@us...> - 2006-12-28 17:09:57
|
Revision: 170 http://svn.sourceforge.net/modplug/?rev=170&view=rev Author: Relabsoluness Date: 2006-12-28 09:09:51 -0800 (Thu, 28 Dec 2006) Log Message: ----------- <Relabs> Added mptrack_generic.exe to the test branch. . <Relabs> Fixed a few possibilities of creating buffer overruns related to tuning notename handling. . <Relabs> Fixed channelmanager not updating channel states correctly when reordering channels. Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/bin/mptrack_Generic.exe branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h Modified: branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -199,40 +199,28 @@ BeginWaitCursor(); BEGIN_CRITICAL(); - // Rearrange patterns content - for(i = 0; i < m_pSndFile->Patterns.Size(); i++){ + //Creating new order-vector for ReArrangeChannels. + vector<CHANNELINDEX> newChnOrder; newChnOrder.reserve(nChannels); + for(i = 0; i<nChannels; i++) + { + newChnOrder.push_back(newpat[i]); + } + if(m_pSndFile->ReArrangeChannels(newChnOrder) != nChannels) + { + MessageBox("Rearranging channels failed"); + END_CRITICAL(); + EndWaitCursor(); - // Allocate a new empty pattern to replace current pattern at i'th position in pattern array - p = m_pSndFile->Patterns[i]; - if(p) newp = CSoundFile::AllocatePattern(m_pSndFile->PatternSize[i], nChannels); + ResetState(TRUE,TRUE,TRUE,TRUE,TRUE); + LeaveCriticalSection(&applying); - if(p && !newp){ - END_CRITICAL(); - EndWaitCursor(); - LeaveCriticalSection(&applying); - ::MessageBox(NULL, "Pattern Data is corrupted!!!", "ERROR: Not enough memory to rearrange channels!", MB_ICONERROR | MB_OK); - return; - } - - // Copy data from old pattern taking care of new channel reodering - if(p != NULL){ - for(j = 0 ; j < m_pSndFile->PatternSize[i] ; j++){ - for(k = 0 ; k < nChannels ; k++) - memcpy(&newp[j*nChannels + k],&p[j*m_pSndFile->m_nChannels + newpat[k]],sizeof(MODCOMMAND)); - } - // Set new pattern in pattern array & free previous pattern - m_pSndFile->Patterns[i] = newp; - CSoundFile::FreePattern(p); - } + return; } + - // Copy channel settings - for(i = 0 ; i < m_pSndFile->m_nChannels ; i++) settings[i] = m_pSndFile->ChnSettings[i]; - // Redistribute channel setting & update manager internal store memory for(i = 0 ; i < nChannels ; i++){ if(i != newpat[i]){ - m_pSndFile->ChnSettings[i] = settings[newpat[i]]; memory[0][i] = newMemory[0][newpat[i]]; memory[1][i] = newMemory[1][newpat[i]]; memory[2][i] = newMemory[2][newpat[i]]; @@ -240,23 +228,13 @@ memory[3][i] = i; } - // Also update record states (unfortunetely they are not part of channel settings) - for(i = 0 ; i < nChannels ; i++) newMemory[1][i] = pModDoc->IsChannelRecord(i); - - pModDoc->ReinitRecordState(); - for(i = 0 ; i < nChannels ; i++){ - if(newMemory[1][newpat[i]] == 1) pModDoc->Record1Channel(i,TRUE); - if(newMemory[1][newpat[i]] == 2) pModDoc->Record2Channel(i,TRUE); - } - - // Update new number of channels - m_pSndFile->m_nChannels = nChannels; if(pActiveMod == pModDoc){ i = m_pSndFile->GetCurrentPos(); m_pSndFile->m_dwSongFlags &= ~SONG_STEP; m_pSndFile->SetCurrentPos(0); m_pSndFile->SetCurrentPos(i); } + END_CRITICAL(); EndWaitCursor(); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -164,8 +164,9 @@ // Note s[0] = 0; - - if ((nPos >= 0) && (nPos < 120)) wsprintf(s, "%s", pSndFile->GetNoteName(nPos+1, m_nInstrument).c_str()); + string temp = pSndFile->GetNoteName(nPos+1, m_nInstrument); + temp.resize(4); + if ((nPos >= 0) && (nPos < 120)) wsprintf(s, "%s", temp.c_str()); rect.SetRect(0, ypaint, m_cxFont, ypaint+m_cyFont); DrawButtonRect(hdc, &rect, s, FALSE, FALSE); // Mapped Note @@ -178,7 +179,12 @@ UINT n = penv->NoteMap[nPos]; if (n == 0xFF) strcpy(s, "==="); else if (n == 0xFE) strcpy(s, "^^^"); else - if (n <= 120) wsprintf(s, "%s", pSndFile->GetNoteName(n, m_nInstrument).c_str()); + if (n <= 120) + { + string temp = pSndFile->GetNoteName(n, m_nInstrument); + temp.resize(4); + wsprintf(s, "%s", temp.c_str()); + } } FillRect(hdc, &rect, (bHighLight) ? CMainFrame::brushHighLight : CMainFrame::brushWindow); if ((nPos == (int)m_nNote) && (!m_bIns)) @@ -1351,8 +1357,8 @@ case IDC_CHECK_PITCHTEMPOLOCK: if ((m_pSndFile) && (m_pSndFile->Headers[m_nInstrument])) { - const string str = string("Tempo range: ") + Stringify(m_pSndFile->GetTempoMin()) + string(" - ") + Stringify(m_pSndFile->GetTempoMax()); - ASSERT(str.size() < 256); + string str = string("Tempo range: ") + Stringify(m_pSndFile->GetTempoMin()) + string(" - ") + Stringify(m_pSndFile->GetTempoMax()); + if(str.size() >= 250) str.resize(250); wsprintf(pszText, str.c_str()); return TRUE; } Modified: branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -1366,6 +1366,7 @@ } } } + return ENV_RELEASE_NODE_UNSET; } WORD CViewInstrument::EnvGetReleaseNodeValue() @@ -1388,6 +1389,7 @@ } } } + return 0; } WORD CViewInstrument::EnvGetReleaseNodeTick() @@ -1410,6 +1412,7 @@ } } } + return 0; } @@ -1456,7 +1459,6 @@ } else if ((pnotify->dwType & dwType) && ((pnotify->dwType & 0xFFFF) == m_nInstrument)) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); BOOL bUpdate = FALSE; for (UINT i=0; i<MAX_CHANNELS; i++) { @@ -2353,6 +2355,7 @@ if ((pModDoc) && (pMainFrm) && (note<128)) { CHAR s[64]; + const size_t sizeofS = sizeof(s) / sizeof(s[0]); if (note >= 0xFE) { pModDoc->NoteOff(0, (note == 0xFE) ? TRUE : FALSE, m_nInstrument); @@ -2379,7 +2382,14 @@ m_baPlayingNote[note] = true; //rewbs.instViewNNA m_nPlayingChannel= pModDoc->PlayNote(note, m_nInstrument, 0, FALSE); //rewbs.instViewNNA s[0] = 0; - if ((note) && (note <= 120)) wsprintf(s, "%s", pModDoc->GetSoundFile()->GetNoteName(static_cast<CTuning::STEPTYPE>(note), m_nInstrument).c_str()); + if ((note) && (note <= 120)) + { + const string temp = pModDoc->GetSoundFile()->GetNoteName(static_cast<CTuning::STEPTYPE>(note), m_nInstrument); + if(temp.size() >= sizeofS) + wsprintf(s, "%s", "..."); + else + wsprintf(s, "%s", temp.c_str()); + } pMainFrm->SetInfoText(s); } } @@ -2602,7 +2612,7 @@ return CModScrollView::PreTranslateMessage(pMsg); } -LRESULT CViewInstrument::OnCustomKeyMsg(WPARAM wParam, LPARAM lParam) +LRESULT CViewInstrument::OnCustomKeyMsg(WPARAM wParam, LPARAM) { if (wParam == kcNull) return NULL; @@ -2610,7 +2620,7 @@ CModDoc *pModDoc = GetDocument(); if (!pModDoc) return NULL; - CSoundFile *pSndFile = pModDoc->GetSoundFile(); + //CSoundFile *pSndFile = pModDoc->GetSoundFile(); CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); switch(wParam) Modified: branches/OpenMPT_MPTm_Tuning/mptrack/bin/mptrack_Generic.exe =================================================================== (Binary files differ) Modified: branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -1135,6 +1135,7 @@ //-------------------------------- { char s[64]; + const size_t sizeofS = sizeof(s) / sizeof(s[0]); CComboBox *combo; CSoundFile *pSndFile; @@ -1147,7 +1148,12 @@ combo->SetItemData(combo->AddString("No note"), 0); for (UINT i=1; i<=120; i++) { - wsprintf(s, "%s", pSndFile->GetNoteName(i, m_nInstr).c_str()); + const string temp = pSndFile->GetNoteName(i, m_nInstr); + if(temp.size() >= sizeofS) + wsprintf(s, "%s", "..."); + else + wsprintf(s, "%s", temp.c_str()); + combo->SetItemData(combo->AddString(s), i); } if (pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) @@ -2577,13 +2583,18 @@ //------------------------------------------------------------------- { CHAR s[32] = "--"; + const size_t sizeofS = sizeof(s)/sizeof(s[0]); if ((lParam >= 0) && (lParam < 3*12) && (m_pSndFile)) { UINT nSample = m_CbnSample.GetItemData(m_CbnSample.GetCurSel()); UINT nBaseOctave = m_SbOctave.GetPos() & 7; - wsprintf(s, "%s", m_pSndFile->GetNoteName(lParam+1+12*nBaseOctave, m_nInstrument).c_str()); + const string temp = m_pSndFile->GetNoteName(lParam+1+12*nBaseOctave, m_nInstrument).c_str(); + if(temp.size() >= sizeofS) + wsprintf(s, "%s", "..."); + else + wsprintf(s, "%s", temp.c_str()); INSTRUMENTHEADER *penv = m_pSndFile->Headers[m_nInstrument]; if ((wParam == KBDNOTIFY_LBUTTONDOWN) && (nSample > 0) && (nSample < MAX_SAMPLES) && (penv)) Modified: branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp 2006-12-28 17:09:51 UTC (rev 170) @@ -46,6 +46,7 @@ { BOOL bFocus = (::GetFocus() == m_hWnd) ? TRUE : FALSE; CHAR s[64]; + const size_t sizeofS = sizeof(s) / sizeof(s[0]); CRect rect; CTuning::STEPTYPE nNotes = static_cast<CTuning::STEPTYPE>((rcClient.bottom + m_cyFont - 1) / m_cyFont); @@ -59,7 +60,12 @@ BOOL bHighLight; // Note s[0] = 0; - wsprintf(s, "%s", m_pTuning->GetNoteName(nPos - 61).c_str()); + const string temp = m_pTuning->GetNoteName(nPos - 61).c_str(); + if(temp.size() >= sizeofS) + wsprintf(s, "%s", "..."); + else + wsprintf(s, "%s", temp.c_str()); + rect.SetRect(0, ypaint, m_cxFont, ypaint+m_cyFont); DrawButtonRect(hdc, &rect, s, FALSE, FALSE); // Mapped Note Modified: branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h 2006-12-21 15:02:44 UTC (rev 169) +++ branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h 2006-12-28 17:09:51 UTC (rev 170) @@ -368,7 +368,7 @@ const CTuningBase<>::SERIALIZATION_RETURN_TYPE CTuningBase<A, B, C>::SERIALIZATION_FAILURE = true; template<class A, class B, class C> -const string CTuningBase<A, B, C>::s_FileExtension = ".mptt"; +const string CTuningBase<A, B, C>::s_FileExtension = ".tun"; template<class A, class B, class C> const CTuning::CEDITMASK CTuningBase<A, B, C>::EM_MAINRATIOS = 0x1; //1b This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Rel...@us...> - 2006-12-21 15:02:49
|
Revision: 169 http://svn.sourceforge.net/modplug/?rev=169&view=rev Author: Relabsoluness Date: 2006-12-21 07:02:44 -0800 (Thu, 21 Dec 2006) Log Message: ----------- + <Relabs> Multiple samples/instruments/mods can be loaded from the load dialogs. + <Relabs> Pending solo channel and pending unmute all channels. + <Relabs> 32 bit float sample import . <Relabs> 24/32 bit PCM sample import. (+ <Relabs> Option to try to play files in a IT-compatible manner; affects only a couple of things for the time being.) ? Miscellaneous changes in the code Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h branches/OpenMPT_MPTm_Tuning/mptrack/resource.h branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h Modified: branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -181,7 +181,7 @@ EnterCriticalSection(&applying); - MODCOMMAND *p,*newp; + MODCOMMAND *p = NULL,*newp = NULL; MODCHANNELSETTINGS settings[MAX_BASECHANNELS]; UINT i,j,k,nChannels,newpat[MAX_BASECHANNELS],newMemory[4][MAX_BASECHANNELS]; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h 2006-12-21 15:02:44 UTC (rev 169) @@ -12,6 +12,7 @@ public: static CChannelManagerDlg * sharedInstance(BOOL autoCreate = TRUE); + static void DestroySharedInstance() {delete sharedInstance_; sharedInstance_ = NULL;} void SetDocument(void * parent); BOOL IsOwner(void * ctrl); BOOL IsDisplayed(void); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -2258,6 +2258,16 @@ commands[kcFileExportCompat].isHidden = false; commands[kcFileExportCompat].isDummy = false; + commands[kcUnmuteAllChnOnPatTransition].UID = 1778; + commands[kcUnmuteAllChnOnPatTransition].isHidden = false; + commands[kcUnmuteAllChnOnPatTransition].isDummy = false; + commands[kcUnmuteAllChnOnPatTransition].Message = "Unmute all channels on pattern transition"; + + commands[kcSoloChnOnPatTransition].UID = 1779; + commands[kcSoloChnOnPatTransition].isHidden = false; + commands[kcSoloChnOnPatTransition].isDummy = false; + commands[kcSoloChnOnPatTransition].Message = "Solo channel on pattern transition"; + #ifdef _DEBUG for (int i=0; i<kcNumCommands; i++) { if (commands[i].UID != 0) { // ignore unset UIDs Modified: branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h 2006-12-21 15:02:44 UTC (rev 169) @@ -226,6 +226,8 @@ kcChannelSolo, kcChannelUnmuteAll, kcToggleChanMuteOnPatTransition, + kcUnmuteAllChnOnPatTransition, + kcSoloChnOnPatTransition, kcCopyAndLoseSelection, kcTransposeUp, kcTransposeDown, Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1334,7 +1334,7 @@ BOOL CCtrlInstruments::GetToolTipText(UINT uId, LPSTR pszText) //------------------------------------------------------------ { - //NOTE: pszText seems to point to char array of length 256. + //NOTE: pszText seems to point to char array of length 256 (Noverber 2006). if ((pszText) && (uId)) { switch(uId) @@ -1472,7 +1472,7 @@ CFileDialog dlg(TRUE, NULL, NULL, - OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, + OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT, "All Instruments|*.xi;*.pat;*.iti;*.wav;*.aif;*.aiff|" "FastTracker II Instruments (*.xi)|*.xi|" "GF1 Patches (*.pat)|*.pat|" @@ -1483,8 +1483,36 @@ { dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurInsDir; } + const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size. + vector<char> filenameBuffer(bufferSize, 0); + dlg.GetOFN().lpstrFile = &filenameBuffer[0]; + dlg.GetOFN().nMaxFile = bufferSize; + if (dlg.DoModal() != IDOK) return; - if (!OpenInstrument(dlg.GetPathName())) ErrorBox(IDS_ERR_FILEOPEN, this); + + POSITION pos = dlg.GetStartPosition(); + size_t counter = 0; + while(pos != NULL) + { + //If loading multiple instruments, advancing to next instrument and creating + //new instrument if necessary. + if(counter > 0) + { + if(m_nInstrument >= MAX_INSTRUMENTS-1) + break; + else + m_nInstrument++; + + if(m_nInstrument > m_pSndFile->GetNumInstruments()) + OnInstrumentNew(); + } + + if(!OpenInstrument(dlg.GetNextPathName(pos))) + ErrorBox(IDS_ERR_FILEOPEN, this); + + counter++; + } + filenameBuffer.clear(); if (m_pParent) m_pParent->InstrumentChanged(m_nInstrument); SwitchToView(); } @@ -2386,7 +2414,7 @@ return; size_t sel = m_ComboTuning.GetCurSel(); - if(sel == 0) //Setting IT behavior. + if(sel == 0) //Setting IT behavior { BEGIN_CRITICAL(); pInstH->SetTuning(NULL); @@ -2591,7 +2619,7 @@ while(m_ComboTuning.GetCount() > 0) m_ComboTuning.DeleteString(0); - m_ComboTuning.AddString("IT behavior"); //<-> Instrument pTuning pointer == NULL + m_ComboTuning.AddString("OMPT IT behavior"); //<-> Instrument pTuning pointer == NULL for(size_t i = 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings(); i++) { m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).GetName().c_str()); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -893,7 +893,7 @@ CFileDialog dlg(TRUE, NULL, NULL, - OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, + OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT, "All Samples|*.wav;*.pat;*.s3i;*.smp;*.snd;*.raw;*.xi;*.aif;*.aiff;*.its;*.8sv;*.8svx;*.svx;*.pcm|" "Wave Files (*.wav)|*.wav|" "XI Samples (*.xi)|*.xi|" @@ -909,9 +909,38 @@ dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurSmpDir; } dlg.m_ofn.nFilterIndex = nLastIndex; + const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size in MFC 7(this note was written November 2006). + vector<char> filenameBuffer(bufferSize, 0); + dlg.GetOFN().lpstrFile = &filenameBuffer[0]; + dlg.GetOFN().nMaxFile = bufferSize; + if (dlg.DoModal() != IDOK) return; + nLastIndex = dlg.m_ofn.nFilterIndex; - if (!OpenSample(dlg.GetPathName())) ErrorBox(IDS_ERR_FILEOPEN, this); + + POSITION pos = dlg.GetStartPosition(); + size_t counter = 0; + while(pos != NULL) + { + //If loading multiple samples, advancing to next sample and creating + //new one if necessary. + if(counter > 0) + { + if(m_nSample >= MAX_SAMPLES-1) + break; + else + m_nSample++; + + if(m_nSample > m_pSndFile->GetNumSamples()) + OnSampleNew(); + } + + if(!OpenSample(dlg.GetNextPathName(pos))) + ErrorBox(IDS_ERR_FILEOPEN, this); + + counter++; + } + filenameBuffer.clear(); SwitchToView(); } @@ -2790,6 +2819,7 @@ } LRESULT CCtrlSamples::OnCustomKeyMsg(WPARAM wParam, LPARAM lParam) +//---------------------------------------------------------------- { if (wParam == kcNull) return NULL; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -229,9 +229,9 @@ for (int c=kcClearRow; c<=kcInsertAllRows; c++) newCat->commands.Add(c); newCat->separators.Add(kcInsertAllRows); //-------------------------------------- - for (int c=kcChannelMute; c<=kcToggleChanMuteOnPatTransition; c++) + for (int c=kcChannelMute; c<=kcSoloChnOnPatTransition; c++) newCat->commands.Add(c); - newCat->separators.Add(kcToggleChanMuteOnPatTransition); //-------------------------------------- + newCat->separators.Add(kcSoloChnOnPatTransition); //-------------------------------------- for (int c=kcTransposeUp; c<=kcTransposeOctDown; c++) newCat->commands.Add(c); newCat->separators.Add(kcTransposeOctDown); //-------------------------------------- Modified: branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -647,6 +647,9 @@ delete m_pAutoSaver; //rewbs.autosaver delete m_pPerfCounter; + CChannelManagerDlg::DestroySharedInstance(); + + //Saving statictunings here. CSoundFile::SaveStaticTunings(); } Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h 2006-12-21 15:02:44 UTC (rev 169) @@ -630,7 +630,8 @@ }; -const CHAR gszBuildDate[] = __TIMESTAMP__; +//const CHAR gszBuildDate[] = __TIMESTAMP__; +const string buildDateTime = string(__DATE__) + string(" ") + string(__TIME__); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -982,7 +982,7 @@ CFileDialog dlg(TRUE, NULL, NULL, - OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_FORCESHOWHIDDEN, + 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|" @@ -1008,15 +1008,25 @@ { dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurModDir; } - if (dlg.DoModal() == IDOK) + const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size in MFC 7(this note was written November 2006). + vector<char> filenameBuffer(bufferSize, 0); + dlg.GetOFN().lpstrFile = &filenameBuffer[0]; + dlg.GetOFN().nMaxFile = bufferSize; + if (dlg.DoModal() == IDOK) { - CHAR szDrive[_MAX_PATH], szDir[_MAX_PATH]; - _splitpath(dlg.GetPathName(), szDrive, szDir, NULL, NULL); - strcpy(CMainFrame::m_szCurModDir, szDrive); - strcat(CMainFrame::m_szCurModDir, szDir); - CMainFrame::m_nFilterIndex = dlg.m_ofn.nFilterIndex; - OpenDocumentFile(dlg.GetPathName()); + POSITION pos = dlg.GetStartPosition(); + while(pos != NULL) + { + CHAR szDrive[_MAX_PATH], szDir[_MAX_PATH]; + CString pathName = dlg.GetNextPathName(pos); + _splitpath(pathName, szDrive, szDir, NULL, NULL); + strcpy(CMainFrame::m_szCurModDir, szDrive); + strcat(CMainFrame::m_szCurModDir, szDir); + CMainFrame::m_nFilterIndex = dlg.m_ofn.nFilterIndex; + OpenDocumentFile(pathName); + } } + filenameBuffer.clear(); } @@ -1370,7 +1380,7 @@ CDialog::OnInitDialog(); m_bmp.SubclassDlgItem(IDC_BITMAP1, this); m_bmp.LoadBitmap(MAKEINTRESOURCE(IDB_MPTRACK)); - wsprintf(s, "Build Date: %s", gszBuildDate); + wsprintf(s, "Build Date: %s", buildDateTime.c_str()); SetDlgItemText(IDC_EDIT2, s); SetDlgItemText(IDC_EDIT3, CMainFrame::GetFullVersionString()); Added: branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -0,0 +1,31 @@ +#include "stdafx.h" +#include "PlaybackEventer.h" +#include "sndfile.h" + +CPlaybackEventer::~CPlaybackEventer() +//--------------------------------- +{ +} + +void CPlaybackEventer::PatternTranstionChnSolo(const CHANNELINDEX chnIndex) +//------------------------------------------------------------------------- +{ + if(chnIndex >= m_rSndFile.m_nChannels) + return; + + for(CHANNELINDEX i = 0; i<m_rSndFile.m_nChannels; i++) + { + m_rSndFile.m_bChannelMuteTogglePending[i] = (m_rSndFile.ChnSettings[i].dwFlags & CHN_MUTE) ? false : true; + } + m_rSndFile.m_bChannelMuteTogglePending[chnIndex] = (m_rSndFile.ChnSettings[chnIndex].dwFlags & CHN_MUTE) ? true : false; +} + + +void CPlaybackEventer::PatternTransitionChnUnmuteAll() +//---------------------------------------------------- +{ + for(CHANNELINDEX i = 0; i<m_rSndFile.m_nChannels; i++) + { + m_rSndFile.m_bChannelMuteTogglePending[i] = (m_rSndFile.ChnSettings[i].dwFlags & CHN_MUTE) ? true : false; + } +} \ No newline at end of file Added: branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h 2006-12-21 15:02:44 UTC (rev 169) @@ -0,0 +1,25 @@ +#ifndef PLAYBACKEVENTER_H +#define PLAYBACKEVENTER_H + +#include "pattern.h" + +class CSoundFile; + +//==================== +class CPlaybackEventer +//==================== +{ +public: + CPlaybackEventer(CSoundFile& sndf) : m_rSndFile(sndf) {} + ~CPlaybackEventer(); + + //SetPatternEvent(const PATTERNINDEX pattern, const ROWINDEX row, const CHANNELINDEX column); + + void PatternTranstionChnSolo(const CHANNELINDEX chnIndex); + void PatternTransitionChnUnmuteAll(); + +private: + CSoundFile& m_rSndFile; +}; + +#endif Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1,11 +1,7 @@ -// TuningDialog.cpp : implementation file -// - #include "stdafx.h" #include "mptrack.h" #include "TuningDialog.h" #include <algorithm> -#include ".\tuningdialog.h" #include "misc_util.h" const string CTuningDialog::s_stringTypeGEN = "General"; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2006-12-21 15:02:44 UTC (rev 169) @@ -2,9 +2,9 @@ #define TUNINGDIALOG_H #include "tuningratiomapwnd.h" +#include "tuningcollection.h" #include <vector> #include <string> -#include "afxwin.h" using std::vector; using std::string; @@ -111,6 +111,7 @@ //to those edit boxes(they are modified by non-user //activies and in these cases the value should be applied //to the tuning data. + }; #endif Modified: branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -68,6 +68,8 @@ ON_COMMAND(ID_PATTERN_MUTE, OnMuteFromClick) //rewbs.customKeys ON_COMMAND(ID_PATTERN_SOLO, OnSoloFromClick) //rewbs.customKeys ON_COMMAND(ID_PATTERN_TRANSITIONMUTE, OnTogglePendingMuteFromClick) + ON_COMMAND(ID_PATTERN_TRANSITIONSOLO, OnPendingSoloChnFromClick) + ON_COMMAND(ID_PATTERN_TRANSITION_UNMUTEALL, OnPendingUnmuteAllChnFromClick) ON_COMMAND(ID_PATTERN_UNMUTEALL,OnUnmuteAll) ON_COMMAND(ID_PATTERN_DELETEROW,OnDeleteRows) ON_COMMAND(ID_PATTERN_DELETEALLROW,OnDeleteRowsEx) @@ -1092,7 +1094,6 @@ { CModDoc *pModDoc = GetDocument(); CSoundFile *pSndFile; - CHAR s[256]; //rewbs.patPlugNames HMENU hMenu; // Too far left to get a ctx menu: @@ -2813,6 +2814,7 @@ InvalidateRow(); } + return 0; } @@ -3144,6 +3146,8 @@ case kcChannelSolo: OnSoloChannel(true); return wParam; case kcChannelUnmuteAll: OnUnmuteAll(); return wParam; case kcToggleChanMuteOnPatTransition: TogglePendingMute((m_dwCursor&0xFFFF)>>3); return wParam; + case kcUnmuteAllChnOnPatTransition: OnPendingUnmuteAllChnFromClick(); return wParam; + case kcSoloChnOnPatTransition: PendingSoloChn(GetCurrentChannel()); return wParam; case kcTransposeUp: OnTransposeUp(); return wParam; case kcTransposeDown: OnTransposeDown(); return wParam; case kcTransposeOctUp: OnTransposeOctUp(); return wParam; @@ -3797,7 +3801,7 @@ UINT instr = p->instr; instr = ((instr * 10) + val) % 1000; - if (instr > MAX_INSTRUMENTS) instr = instr % 100; + if (instr >= MAX_INSTRUMENTS) instr = instr % 100; if ( ((pSndFile->m_nInstruments==0) && (pSndFile->m_nSamples<100)) || // if we're using samples & have less than 100 samples (pSndFile->m_nInstruments < 100)) { // or if we're using instruments and have less than 100 instruments instr = instr % 100; // --> ensure the entered instrument value is less than 100. @@ -4247,6 +4251,7 @@ void CViewPattern::OnSelectPlugin(UINT nID) +//----------------------------------------- { CModDoc *pModDoc = GetDocument(); if (!pModDoc) return; CSoundFile *pSndFile = pModDoc->GetSoundFile(); if (!pSndFile) return; @@ -4342,15 +4347,18 @@ } if (b) AppendMenu(hMenu, MF_STRING, ID_PATTERN_SOLO, "Solo Channel\t" + ih->GetKeyTextFromCommand(kcChannelSolo)); if (bAll) AppendMenu(hMenu, MF_STRING, ID_PATTERN_UNMUTEALL, "Unmute All\t" + ih->GetKeyTextFromCommand(kcChannelUnmuteAll)); - + AppendMenu(hMenu, pSndFile->m_bChannelMuteTogglePending[nChn] ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_PATTERN_TRANSITIONMUTE, (pSndFile->ChnSettings[nChn].dwFlags & CHN_MUTE) ? - "Unmute on Transition\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition) : - "Mute on Transition\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition)); + "On transition: Unmute\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition) : + "On transition: Mute\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition)); + AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITION_UNMUTEALL, "On transition: Unmute all\t" + ih->GetKeyTextFromCommand(kcUnmuteAllChnOnPatTransition)); + AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITIONSOLO, "On transition: Solo\t" + ih->GetKeyTextFromCommand(kcSoloChnOnPatTransition)); + return true; } @@ -4587,10 +4595,9 @@ HMENU instrumentChangeMenu = ::CreatePopupMenu(); AppendMenu(hMenu, MF_POPUP|greyed, (UINT)instrumentChangeMenu, "Change Instrument\t" + ih->GetKeyTextFromCommand(kcPatternSetInstrument)); - CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); - CModDoc *pModDoc = GetDocument(); - CSoundFile* pSndFile; - if(pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return true; + if(pSndFile == NULL) + return false; + if (pSndFile->m_nInstruments) { for (UINT i=1; i<=pSndFile->m_nInstruments; i++) { @@ -4652,7 +4659,7 @@ if (GetColTypeFromCursor(m_dwBeginSel) <= colType) { chans.Add(startChan); //first selected chan includes this col type } - for (int chan=startChan+1; chan<endChan; chan++) { + for (UINT chan=startChan+1; chan<endChan; chan++) { chans.Add(chan); //All chans between first & last must include this col type } if ((startChan != endChan) && colType <= GetColTypeFromCursor(m_dwEndSel)) { @@ -4723,6 +4730,26 @@ TogglePendingMute((m_nMenuParam&0xFFFF)>>3); } +void CViewPattern::OnPendingSoloChnFromClick() +//----------------------------------------------- +{ + PendingSoloChn(GetChanFromCursor(m_nMenuParam)); +} + +void CViewPattern::OnPendingUnmuteAllChnFromClick() +//---------------------------------------------- +{ + GetDocument()->GetSoundFile()->GetPlaybackEventer().PatternTransitionChnUnmuteAll(); + InvalidateChannelsHeaders(); +} + +void CViewPattern::PendingSoloChn(const CHANNELINDEX nChn) +//--------------------------------------------- +{ + GetDocument()->GetSoundFile()->GetPlaybackEventer().PatternTranstionChnSolo(nChn); + InvalidateChannelsHeaders(); +} + void CViewPattern::TogglePendingMute(UINT nChn) //--------------------------------------------- { @@ -4745,15 +4772,11 @@ CPoint pt = GetPointFromPosition(m_dwCursor); - //AppendMenu(hMenu, MF_STRING|MF_GRAYED, 0, "Record is disabled(editing blocked)."); - //AppendMenu(hMenu, MF_STRING|MF_GRAYED, 0, "--------------------"); AppendMenu(hMenu, MF_STRING, IDC_PATTERN_RECORD, "Editing(record) is disabled; click here to enable it."); - //AppendMenu(hMenu, MF_STRING|MF_GRAYED, 0, "--------------------"); //To check: It seems to work the way it should, but still is it ok to use IDC_PATTERN_RECORD here since it is not //'aimed' to be used here. ClientToScreen(&pt); - //::TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_NONOTIFY, pt.x, pt.y, 0, m_hWnd, NULL); ::TrackPopupMenu(hMenu, TPM_LEFTALIGN, pt.x, pt.y, 0, m_hWnd, NULL); ::DestroyMenu(hMenu); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h 2006-12-21 15:02:44 UTC (rev 169) @@ -239,6 +239,8 @@ afx_msg void OnMuteFromClick(); //rewbs.customKeys afx_msg void OnSoloFromClick(); //rewbs.customKeys afx_msg void OnTogglePendingMuteFromClick(); //rewbs.customKeys + afx_msg void OnPendingSoloChnFromClick(); + afx_msg void OnPendingUnmuteAllChnFromClick(); afx_msg void OnSoloChannel(BOOL current); //rewbs.customKeys afx_msg void OnMuteChannel(BOOL current); //rewbs.customKeys afx_msg void OnUnmuteAll(); @@ -336,6 +338,8 @@ private: void TogglePendingMute(UINT nChn); + void PendingSoloChn(const CHANNELINDEX nChn); + void PendingUnmuteAllChn(); public: afx_msg void OnRButtonUp(UINT nFlags, CPoint point); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1305,7 +1305,10 @@ if (result) *result = 0; } -#define MAX_FILEOPEN_BUFSIZE 32000 +#define MAX_FILEOPEN_BUFSIZE 2048 +//Note: Above value might be the maximum size the buffer can be; +//it might be worthwhile to check the CFileDialog documentation +//if wanting the increase that. VOID CSelectPluginDlg::OnAddPlugin() //---------------------------------- Modified: branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -169,6 +169,7 @@ // -> CODE#0023 // -> DESC="IT project files (.itp)" ON_COMMAND(IDC_CHECK6, OnCheck6) + ON_COMMAND(IDC_IT_STANDARD, OnITStandard) ON_CBN_SELCHANGE(IDC_COMBO1,UpdateDialog) // -! NEW_FEATURE#0023 //}}AFX_MSG_MAP @@ -193,6 +194,7 @@ // -> DESC="IT project files (.itp)" DDX_Control(pDX, IDC_CHECK6, m_CheckBox6); // -! NEW_FEATURE#0023 + DDX_Control(pDX, IDC_IT_STANDARD, m_CheckBoxITStandard); //}}AFX_DATA_MAP } @@ -284,6 +286,7 @@ m_CheckBox3.SetCheck((m_pSndFile->m_dwSongFlags & SONG_ITOLDEFFECTS) ? MF_CHECKED : 0); m_CheckBox4.SetCheck((m_pSndFile->m_dwSongFlags & SONG_ITCOMPATMODE) ? MF_CHECKED : 0); m_CheckBox5.SetCheck((m_pSndFile->m_dwSongFlags & SONG_EXFILTERRANGE) ? MF_CHECKED : 0); + m_CheckBoxITStandard.SetCheck( (m_pSndFile->GetModSpecificFlag(IT_STANDARD) && m_pSndFile->GetType() == MOD_TYPE_IT) ? MF_CHECKED : MF_UNCHECKED); // -> CODE#0023 // -> DESC="IT project files (.itp)" @@ -300,6 +303,8 @@ // -> DESC="IT project files (.itp)" m_CheckBox6.EnableWindow(m_TypeBox.GetCurSel() == 4 ? TRUE : FALSE); // -! NEW_FEATURE#0023 + + m_CheckBoxITStandard.EnableWindow((m_pSndFile->GetType() == MOD_TYPE_IT) ? TRUE : FALSE); m_TempoModeBox.EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); GetDlgItem(IDC_ROWSPERBEAT)->EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE); @@ -370,6 +375,12 @@ } // -! NEW_FEATURE#0023 +void CModTypeDlg::OnITStandard() +//------------------------------ +{ + m_pSndFile->SetModSpecificFlag(IT_STANDARD, m_CheckBoxITStandard.GetCheck()); +} + BOOL CModTypeDlg::VerifyData() //--------------------------------- { Modified: branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h 2006-12-21 15:02:44 UTC (rev 169) @@ -20,6 +20,8 @@ CButton m_CheckBox6; // -! NEW_FEATURE#0023 + CButton m_CheckBoxITStandard; + public: CModTypeDlg(CSoundFile *pSndFile, CWnd *parent):CDialog(IDD_MODDOC_MODTYPE, parent) { m_pSndFile = pSndFile; m_nType = m_nChannels = 0; } BOOL VerifyData(); @@ -42,6 +44,7 @@ // -> DESC="IT project files (.itp)" afx_msg void OnCheck6(); // -! NEW_FEATURE#0023 + afx_msg void OnITStandard(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc 2006-12-21 15:02:44 UTC (rev 169) @@ -903,51 +903,54 @@ GROUPBOX "Sample Map",IDC_STATIC,461,27,62,141 END -IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 243, 198 +IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 247, 215 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Song Properties" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - DEFPUSHBUTTON "OK",IDOK,189,8,50,14 - PUSHBUTTON "Cancel",IDCANCEL,189,26,50,14 - GROUPBOX "Type",IDC_STATIC,4,4,174,41 + DEFPUSHBUTTON "OK",IDOK,193,8,50,14 + PUSHBUTTON "Cancel",IDCANCEL,193,26,50,14 + GROUPBOX "Type",IDC_STATIC,4,4,174,45 COMBOBOX IDC_COMBO1,8,16,101,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO2,114,16,60,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Linear Frequency Slides",IDC_CHECK1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,106,93,10 + BS_AUTOCHECKBOX | WS_TABSTOP,7,113,93,10 CONTROL "Fast Volume Slides",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,7,118,75,10 + WS_TABSTOP,7,124,75,10 CONTROL "IT Old Effects",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,111,106,76,10 + WS_TABSTOP,111,113,76,10 CONTROL "IT Compatible Gxx",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,111,118,76,10 + WS_TABSTOP,111,124,76,10 CONTROL "Extended filter range",IDC_CHECK5,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,130,82,10 + BS_AUTOCHECKBOX | WS_TABSTOP,7,137,82,10 CONTROL "Embed instrument parameters in ITP",IDC_CHECK6,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,8,33,128,10 - EDITTEXT IDC_ROWSPERBEAT,114,60,16,12,ES_AUTOHSCROLL | ES_NUMBER - EDITTEXT IDC_ROWSPERMEASURE,114,72,16,12,ES_AUTOHSCROLL | + EDITTEXT IDC_ROWSPERBEAT,114,65,16,12,ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_ROWSPERMEASURE,114,76,16,12,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Rows/beat",IDC_STATIC,132,62,36,8 - LTEXT "Rows/measure",IDC_STATIC,132,74,49,8 - COMBOBOX IDC_COMBO3,7,72,99,77,CBS_DROPDOWNLIST | WS_VSCROLL | + LTEXT "Rows/beat",IDC_STATIC,132,65,36,8 + LTEXT "Rows/measure",IDC_STATIC,132,78,49,8 + COMBOBOX IDC_COMBO3,7,76,99,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Tempo",IDC_STATIC,4,51,235,38 - LTEXT "Mode:",IDC_STATIC,7,62,21,8 - COMBOBOX IDC_COMBO4,156,129,81,51,CBS_DROPDOWNLIST | WS_VSCROLL | + GROUPBOX "Tempo",IDC_STATIC,4,55,235,38 + LTEXT "Mode:",IDC_STATIC,7,65,21,8 + COMBOBOX IDC_COMBO4,156,135,81,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Playback",IDC_STATIC,4,95,235,51 - LTEXT "Plugin levels:",IDC_STATIC,111,131,43,10 - GROUPBOX "OpenMPT Version Info",IDC_STATIC,4,150,235,42 - EDITTEXT IDC_EDIT1,67,161,166,13,ES_AUTOHSCROLL | ES_READONLY, + GROUPBOX "Playback",IDC_STATIC,4,99,240,62 + LTEXT "Plugin levels:",IDC_STATIC,111,138,43,10 + GROUPBOX "OpenMPT Version Info",IDC_STATIC,4,165,235,44 + EDITTEXT IDC_EDIT1,67,175,166,13,ES_AUTOHSCROLL | ES_READONLY, WS_EX_STATICEDGE - EDITTEXT IDC_EDIT2,67,175,166,13,ES_AUTOHSCROLL | ES_READONLY, + EDITTEXT IDC_EDIT2,67,190,166,13,ES_AUTOHSCROLL | ES_READONLY, WS_EX_STATICEDGE - EDITTEXT IDC_EDIT5,7,161,58,13,ES_AUTOHSCROLL | ES_READONLY - EDITTEXT IDC_EDIT6,7,175,58,13,ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_EDIT5,7,175,58,13,ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_EDIT6,7,190,58,13,ES_AUTOHSCROLL | ES_READONLY + CONTROL "Aim for Impulse Tracker playback (for IT)", + IDC_IT_STANDARD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8, + 149,143,10 END IDD_SHOWLOG DIALOG 0, 0, 300, 106 Modified: branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h 2006-12-21 15:02:44 UTC (rev 169) @@ -1,17 +1,15 @@ -#ifndef __SNDFILE_H -#include "../soundlib/sndfile.h" -#endif - #ifndef PATTERN_H #define PATTERN_H #include <vector> +#include "modcommand.h" using std::vector; class CPatternContainer; -typedef UINT ROWINDEX; +typedef size_t ROWINDEX; +typedef size_t CHANNELINDEX; //============ class CPattern Modified: branches/OpenMPT_MPTm_Tuning/mptrack/resource.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/resource.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/resource.h 2006-12-21 15:02:44 UTC (rev 169) @@ -438,7 +438,7 @@ #define IDC_CHECK67 1767 #define IDC_CHECK68 1768 #define IDC_CHECK69 1769 -#define IDC_CHECK70 1770 +#define IDC_IT_STANDARD 1770 #define IDC_CHECK71 1771 #define IDC_CHECK72 1772 #define IDC_CHECK73 1773 @@ -946,6 +946,8 @@ #define ID_EDIT_GOTO 36018 #define ID_VIEW_GRAPH 36019 #define ID_PATTERN_TRANSITIONMUTE 36020 +#define ID_PATTERN_TRANSITIONSOLO 36021 +#define ID_PATTERN_TRANSITION_UNMUTEALL 36022 #define ID_SELECTINST 36100 #define ID_NETLINK_MPTFR 37001 #define ID_PLUG_RECORDAUTOMATION 37003 Modified: branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h 2006-12-21 15:02:44 UTC (rev 169) @@ -39,7 +39,7 @@ } //Gets called on seekg - pos_type seekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::binary) + pos_type seekpos(pos_type sp, ios_base::openmode) // which = ios_base::in | ios_base::binary) { DWORD offset = static_cast<DWORD>(sp); if(offset >= 0 && offset < GetStrmSize()) @@ -52,7 +52,7 @@ } //Gets called on tellg - pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::binary) + pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode) // which = ios_base::in | ios_base::binary) { DWORD beginOffset = 0; if(way == ios::cur) Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -4478,7 +4478,11 @@ cbs.pubsetbuf((char*)cpcMPTStart, dwMemLength-mptStartPos); istream fin(&cbs); - m_TuningsTuneSpecific.UnSerializeBinary(fin); + if(m_TuningsTuneSpecific.UnSerializeBinary(fin)) + { + ::MessageBox(NULL, "Error occured - loading failed while trying to load tune specific tunings.", 0, MB_OK); + return FALSE; + } //2. Reading tuning id <-> tuning name map. typedef map<WORD, string> MAP; Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -10,6 +10,7 @@ #include "stdafx.h" #include "sndfile.h" #include "it_defs.h" +#include "wavConverter.h" #pragma warning(disable:4244) @@ -421,26 +422,28 @@ || (pfmtpk->channels != 1)) return FALSE; } else pfmtpk = NULL; } - // WAVE_FORMAT_PCM, WAVE_FORMAT_EXTENSIBLE - if (((pfmt->format != 1) && (pfmt->format != 0xFFFE)) + // WAVE_FORMAT_PCM, WAVE_FORMAT_IEEE_FLOAT, WAVE_FORMAT_EXTENSIBLE + if ((((pfmt->format != 1) && (pfmt->format != 0xFFFE)) + && (pfmt->format != 3 || pfmt->bitspersample != 32)) //Microsoft IEEE FLOAT || (pfmt->channels > 2) || (!pfmt->channels) || (pfmt->bitspersample & 7) || (!pfmt->bitspersample) || (pfmt->bitspersample > 32) ) return FALSE; + DestroySample(nSample); UINT nType = RS_PCM8U; if (pfmt->channels == 1) { if (pfmt->bitspersample == 24) nType = RS_PCM24S; - if (pfmt->bitspersample == 32) nType = RS_PCM32S; - else nType = (pfmt->bitspersample == 16) ? RS_PCM16S : RS_PCM8U; + else if (pfmt->bitspersample == 32) nType = RS_PCM32S; + else nType = (pfmt->bitspersample == 16) ? RS_PCM16S : RS_PCM8U; } else { if (pfmt->bitspersample == 24) nType = RS_STIPCM24S; else if (pfmt->bitspersample == 32) nType = RS_STIPCM32S; - else nType = (pfmt->bitspersample == 16) ? RS_STIPCM16S : RS_STIPCM8U; + else nType = (pfmt->bitspersample == 16) ? RS_STIPCM16S : RS_STIPCM8U; } UINT samplesize = pfmt->channels * (pfmt->bitspersample >> 3); MODINSTRUMENT *pins = &Ins[nSample]; @@ -477,7 +480,7 @@ AdjustSampleLoop(pins); } else { - ReadSample(pins, nType, (LPSTR)(lpMemFile+dwDataPos), dwFileLength-dwDataPos); + ReadSample(pins, nType, (LPSTR)(lpMemFile+dwDataPos), dwFileLength-dwDataPos, pfmt->format); } // smpl field if (psh) Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1045,7 +1045,7 @@ note = instr = 0; } } - if ((!note) && (instr)) + if ((!note) && (instr)) //Case: instrument with no note data. { if (m_nInstruments) { @@ -1059,9 +1059,11 @@ pChn->dwFlags &= ~CHN_NOTEFADE; pChn->nFadeOutVol = 65536; } - } else + } else //Case: Only samples are used; no instruments. { if (instr < MAX_SAMPLES) pChn->nVolume = Ins[instr].nVolume; + if (m_nType == MOD_TYPE_IT && GetModSpecificFlag(IT_STANDARD)) + note = pChn->nNote; } if (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) instr = 0; } @@ -1089,7 +1091,6 @@ InstrumentChange(pChn, instr, bPorta, TRUE); pChn->nNewIns = 0; // Special IT case: portamento+note causes sample change -> ignore portamento - //if ((m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) if ((m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) && (psmp != pChn->pInstrument) && (note) && (note < 0x80)) { @@ -3281,7 +3282,7 @@ } // Channel mutes - for (int chan=0; chan<m_nChannels; chan++) { + for (UINT chan=0; chan<m_nChannels; chan++) { if (m_bChannelMuteTogglePending[chan]) { m_pModDoc->MuteChannel(chan, !m_pModDoc->IsChannelMuted(chan)); m_bChannelMuteTogglePending[chan]=false; Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -13,6 +13,7 @@ #include "../mptrack/moddoc.h" #include "sndfile.h" #include "aeffectx.h" +#include "wavConverter.h" #include <vector> #include <algorithm> @@ -26,6 +27,7 @@ #define UNLHA_SUPPORT #define ZIPPED_MOD_SUPPORT LPCSTR glpszModExtensions = "mod|s3m|xm|it|stm|nst|ult|669|wow|mtm|med|far|mdl|ams|dsm|amf|okt|dmf|ptm|psm|mt2|umx"; +//Should there be mptm? #endif // NO_ARCHIVE_SUPPORT #else // NO_COPYRIGHT: EarSaver only loads mod/s3m/xm/it/wav #define MODPLUG_BASIC_SUPPORT @@ -375,7 +377,7 @@ CTuningCollection CSoundFile::s_TuningsSharedLocal("Local Tunings"); -CSoundFile::CSoundFile() : m_TuningsTuneSpecific("Tune specific tunings"), PatternSize(*this), Patterns(*this), Order(*this) +CSoundFile::CSoundFile() : m_TuningsTuneSpecific("Tune specific tunings"), PatternSize(*this), Patterns(*this), Order(*this), m_PlaybackEventer(*this) //---------------------- { m_nType = MOD_TYPE_NONE; @@ -400,6 +402,8 @@ m_bIsRendering = false; m_nMaxSample = 0; + m_ModFlags.reset(); + m_pModDoc = NULL; m_dwLastSavedWithVersion=0; m_dwCreatedWithVersion=0; @@ -698,7 +702,7 @@ BOOL CSoundFile::Destroy() //------------------------ { - int i; + size_t i; for (i=0; i<Patterns.Size(); i++) if (Patterns[i]) { FreePattern(Patterns[i]); @@ -1422,7 +1426,7 @@ UINT nRemainingChannels = newOrder.size(); - if(nRemainingChannels > min(MAX_CHANNELS, MAX_BASECHANNELS) || nRemainingChannels < 4) + if(nRemainingChannels > min(MAX_CHANNELS, MAX_BASECHANNELS) || nRemainingChannels < GetNumChannelMin()) { CString str = "Error: Bad newOrder vector in CSoundFile::ReArrangeChannels(...)"; CMainFrame::GetMainFrame()->MessageBox(str , "ReArrangeChannels", MB_OK | MB_ICONINFORMATION); @@ -1856,9 +1860,8 @@ // 5 = signed 16-bit PCM data // 6 = unsigned 16-bit PCM data - -UINT CSoundFile::ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR lpMemFile, DWORD dwMemLength) -//------------------------------------------------------------------------------------------------ +UINT CSoundFile::ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR lpMemFile, DWORD dwMemLength, const WORD format) +//----------------------------------------------------------------------------------------------------------------------- { UINT len = 0, mem = pIns->nLength+6; @@ -1888,7 +1891,7 @@ len = pIns->nLength; if (len > dwMemLength) len = pIns->nLength = dwMemLength; LPSTR pSample = pIns->pSample; - for (UINT j=0; j<len; j++) pSample[j] = (char)(lpMemFile[j] - 0x80); + for (UINT j=0; j<len; j++) pSample[j] = (char)(lpMemFile[j] - 0x80); } break; @@ -2207,7 +2210,7 @@ break; #ifdef MODPLUG_TRACKER - // PCM 24-bit signed -> load sample, and normalize it to 16-bit + // Mono PCM 24/32-bit signed & 32 bit float -> load sample, and normalize it to 16-bit case RS_PCM24S: case RS_PCM32S: len = pIns->nLength * 3; @@ -2215,56 +2218,66 @@ if (len > dwMemLength) break; if (len > 4*8) { - UINT slsize = (nFlags == RS_PCM32S) ? 4 : 3; - LPBYTE pSrc = (LPBYTE)lpMemFile; - LONG max = 255; - if (nFlags == RS_PCM32S) pSrc++; - for (UINT j=0; j<len; j+=slsize) + if(nFlags == RS_PCM24S) { - LONG l = ((((pSrc[j+2] << 8) + pSrc[j+1]) << 8) + pSrc[j]) << 8; - l /= 256; - if (l > max) max = l; - if (-l > max) max = -l; + char* pSrc = (char*)lpMemFile; + char* pDest = (char*)pIns->pSample; + CopyWavBuffer<3, 2, WavSigned24To16, MaxFinderInt<3> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); } - max = (max / 128) + 1; - signed short *pDest = (signed short *)pIns->pSample; - for (UINT k=0; k<len; k+=slsize) + else //RS_PCM32S { - LONG l = ((((pSrc[k+2] << 8) + pSrc[k+1]) << 8) + pSrc[k]) << 8; - *pDest++ = (signed short)(l / max); + char* pSrc = (char*)lpMemFile; + char* pDest = (char*)pIns->pSample; + if(format == 3) + CopyWavBuffer<4, 2, WavFloat32To16, MaxFinderFloat32>(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); + else + CopyWavBuffer<4, 2, WavSigned32To16, MaxFinderInt<4> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); } } break; - // Stereo PCM 24-bit signed -> load sample, and normalize it to 16-bit + // Stereo PCM 24/32-bit signed & 32 bit float -> convert sample to 16 bit case RS_STIPCM24S: case RS_STIPCM32S: - len = pIns->nLength * 6; - if (nFlags == RS_STIPCM32S) len += pIns->nLength * 2; - if (len > dwMemLength) break; - if (len > 8*8) + if(format == 3 && nFlags == RS_STIPCM32S) //Microsoft IEEE float { - UINT slsize = (nFlags == RS_STIPCM32S) ? 4 : 3; - LPBYTE pSrc = (LPBYTE)lpMemFile; - LONG max = 255; - if (nFlags == RS_STIPCM32S) pSrc++; - for (UINT j=0; j<len; j+=slsize) + len = pIns->nLength * 6; + //pIns->nLength tells(?) the number of frames there + //are. One 'frame' of 1 byte(== 8 bit) mono data requires + //1 byte of space, while one frame of 3 byte(24 bit) + //stereo data requires 3*2 = 6 bytes. This is(?) + //why there is factor 6. + + len += pIns->nLength * 2; + //Compared to 24 stereo, 32 bit stereo needs 16 bits(== 2 bytes) + //more per frame. + + if(len > dwMemLength) break; + char* pSrc = (char*)lpMemFile; + char* pDest = (char*)pIns->pSample; + if (len > 8*8) { - LONG l = ((((pSrc[j+2] << 8) + pSrc[j+1]) << 8) + pSrc[j]) << 8; - l /= 256; - if (l > max) max = l; - if (-l > max) max = -l; + CopyWavBuffer<4, 2, WavFloat32To16, MaxFinderFloat32>(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); } - max = (max / 128) + 1; - signed short *pDest = (signed short *)pIns->pSample; - for (UINT k=0; k<len; k+=slsize) + } + else + { + len = pIns->nLength * 6; + if (nFlags == RS_STIPCM32S) len += pIns->nLength * 2; + if (len > dwMemLength) break; + if (len > 8*8) { - LONG lr = ((((pSrc[k+2] << 8) + pSrc[k+1]) << 8) + pSrc[k]) << 8; - k += slsize; - LONG ll = ((((pSrc[k+2] << 8) + pSrc[k+1]) << 8) + pSrc[k]) << 8; - pDest[0] = (signed short)ll; - pDest[1] = (signed short)lr; - pDest += 2; + char* pSrc = (char*)lpMemFile; + char* pDest = (char*)pIns->pSample; + if(nFlags == RS_STIPCM32S) + { + CopyWavBuffer<4,2,WavSigned32To16, MaxFinderInt<4> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); + } + if(nFlags == RS_STIPCM24S) + { + CopyWavBuffer<3,2,WavSigned24To16, MaxFinderInt<3> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes()); + } + } } break; @@ -2800,12 +2813,33 @@ ROWINDEX CSoundFile::GetRowMax() const {return MAX_PATTERN_ROWS;} ROWINDEX CSoundFile::GetRowMin() const {return 2;} +CHANNELINDEX CSoundFile::GetNumChannelMax() const +//----------------------------------- +{ + if(m_nType == MOD_TYPE_MPT) return MPTM_SPECS.channelsMax; + if(m_nType == MOD_TYPE_IT) return max_chans_IT; + if(m_nType == MOD_TYPE_XM) return max_chans_XM; + if(m_nType == MOD_TYPE_MOD) return max_chans_MOD; + if(m_nType == MOD_TYPE_S3M) return max_chans_S3M; + return 4; +} + +CHANNELINDEX CSoundFile::GetNumChannelMin() const +//----------------------------------- +{ + if(m_nType == MOD_TYPE_MPT) return MPTM_SPECS.channelsMin; + else return 4; +} + void CSoundFile::ChangeModTypeTo(const int& newType) //--------------------------------------------------- { const UINT oldInvalidIndex = Patterns.GetInvalidIndex(); const UINT oldIgnoreIndex = Patterns.GetIgnoreIndex(); m_nType = newType; + + m_ModFlags.reset(); + replace(Order.begin(), Order.end(), oldInvalidIndex, Patterns.GetInvalidIndex()); replace(Order.begin(), Order.end(), oldIgnoreIndex, Patterns.GetIgnoreIndex()); } Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h 2006-12-21 15:02:44 UTC (rev 169) @@ -261,9 +261,12 @@ // 24-bit signed #define RS_PCM24S (RS_PCM16S|0x80) // mono 24-bit signed #define RS_STIPCM24S (RS_PCM16S|0x80|RSF_STEREO) // stereo 24-bit signed -#define RS_PCM32S (RS_PCM16S|0xC0) // mono 24-bit signed -#define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO) // stereo 24-bit signed +// 32-bit +#define RS_PCM32S (RS_PCM16S|0xC0) // mono 32-bit signed +#define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO) // stereo 32-bit signed + + // NNA types #define NNA_NOTECUT 0 #define NNA_CONTINUE 1 @@ -469,6 +472,7 @@ typedef struct _MODINSTRUMENT { UINT nLength,nLoopStart,nLoopEnd; + //nLength <-> Number of 'frames'? UINT nSustainStart, nSustainEnd; LPSTR pSample; UINT nC4Speed; @@ -483,6 +487,16 @@ BYTE nVibDepth; BYTE nVibRate; CHAR name[22]; + + //Returns size which pSample is at least. + //Very dirty implementation. + DWORD GetSampleSizeInBytes() const + { + DWORD len = nLength; + if(uFlags & CHN_16BIT) len *= 2; + if(uFlags & CHN_STEREO) len *= 2; + return len; + } } MODINSTRUMENT; @@ -678,17 +692,8 @@ CHAR szName[MAX_CHANNELNAME]; } MODCHANNELSETTINGS; +#include "modcommand.h" -typedef struct _MODCOMMAND -{ - BYTE note; - BYTE instr; - BYTE volcmd; - BYTE command; - BYTE vol; - BYTE param; -} MODCOMMAND, *LPMODCOMMAND; - //////////////////////////////////////////////////////////////////// // Mix Plugins #define MIXPLUG_MIXREADY 0x01 // Set when cleared @@ -836,6 +841,12 @@ #include "../mptrack/patternContainer.h" #include "../mptrack/ordertopatterntable.h" +typedef CPatternContainer::PATTERNINDEX PATTERNINDEX; + +#include "../mptrack/playbackEventer.h" + + + class CSoundFile; //====================== @@ -849,6 +860,9 @@ const CSoundFile& m_rSndFile; }; + +const BYTE IT_STANDARD = 0; + //============== class CSoundFile //============== @@ -862,8 +876,22 @@ ROWINDEX GetRowMax() const; ROWINDEX GetRowMin() const; + CHANNELINDEX GetNumChannelMax() const; + CHANNELINDEX GetNumChannelMin() const; + void ChangeModTypeTo(const int& newType); UINT GetModType() const {return m_nType;} + + bitset<8> m_ModFlags; + virtual bool GetModSpecificFlag(BYTE i) + { + return (i < m_ModFlags.size()) ? m_ModFlags[i] : false; + } + virtual void SetModSpecificFlag(BYTE i, bool val) + { + if(i < m_ModFlags.size()) + m_ModFlags[i] = val; + } //Tuning--> public: @@ -877,12 +905,20 @@ static CTuningCollection s_TuningsSharedLocal; //<--Tuning +public: + CPlaybackEventer& GetPlaybackEventer() {return m_PlaybackEventer;} + //const CPlaybackEventer& GetPlaybackEventer() const {return m_playbackEventer;} + private: void PortamentoMPT(MODCHANNEL*, int); void PortamentoFineMPT(MODCHANNEL*, int); +private: + CPlaybackEventer m_PlaybackEventer; + + public: // Static Members static UINT m_nXBassDepth, m_nXBassRange; static float m_nMaxSample; @@ -1172,7 +1208,7 @@ char GetDeltaValue(char prev, UINT n) const { return (char)(prev + CompressionTable[n & 0x0F]); } UINT PackSample(int &sample, int next); BOOL CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result=NULL); - UINT ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR pMemFile, DWORD dwMemLength); + UINT ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR pMemFile, DWORD dwMemLength, const WORD format = 1); BOOL DestroySample(UINT nSample); // -> CODE#0020 Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp 2006-10-02 21:41:06 UTC (rev 168) +++ branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp 2006-12-21 15:02:44 UTC (rev 169) @@ -1099,11 +1099,27 @@ } else //Original { - switch(m_nTickCount % 3) + BYTE note = pChn->nNote; + bool apply = true; + + if(m_nType == MOD_TYPE_IT && GetModSpecificFlag(IT_STANDARD)) { - case 1: period = GetPeriodFromNote(pChn->nNote + (pChn->nArpeggio >> 4), pChn->nFineTune, pChn->nC4Speed); break; - case 2: period = GetPeriodFromNote(pChn->nNote + (pChn->nArpeggio & 0x0F), pChn->nFineTune, pChn->nC4Speed); break; + if(pChn->nArpeggio >> 4 == 0 && (pChn->nArpeggio & 0x0F) == 0) + apply = false; + //Ignoring J00. + + if(apply) note = GetNoteFromPeriod(pChn->nPeriod); + //Using actual note instead of channel note. } + + if(apply) + { + switch(m_nTickCount % 3) + { + case 1: period = GetPeriodFromNote(note + (pChn->nArpeggio >> 4), pChn->nFineTune, pChn->nC4Speed); break; + case 2: period = GetPeriodFromNote(note + (pChn->nArpeggio & 0x0F), pChn->nFineTune, pChn->nC4Speed); break; + } + } } } Added: branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h 2006-12-21 15:02:44 UTC (rev 169) @@ -0,0 +1,14 @@ +#ifndef MODCOMMAND_H +#define MODCOMMAND_H + +typedef struct _MODCOMMAND +{ + BYTE note; + BYTE instr; + BYTE volcmd; + BYTE command; + BYTE vol; + BYTE param; +} MODCOMMAND, *LPMODCOMMAND; + +#endif Added: branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h (rev 0) +++ branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h 2006-12-21 15:02:44 UTC (rev 169) @@ -0,0 +1,137 @@ +#ifndef WAVCONVERTER_H +#define WAVCONVERTER_H + +#include <limits> + +typedef void (*DATACONV)(char* const, char*, const double); +//srcBuffer, destBuffer, maximum value in srcBuffer. + +typedef double MAXFINDER(const char* const, const size_t); +//Buffer, bufferSize. + +inline void WavSigned8To16(char* const inBuffer, char* outBuffer, const double max) +//---------------------------------------------------------------------- +{ + outBuffer[0] = 0; + outBuffer[1] = inBuffer[0]; +} + + +template<BYTE INBYTES> +inline double MaxFinderInt(const char* const buffer, const size_t bs) +//---------------------------------------------------------------------- +{ + if(INBYTES > 8) return 0; + if(bs < INBYTES) return 0; + + __int64 max = 0; + for(size_t i = 0; i <= bs-INBYTES; i += INBYTES) + { + __int64 temp = 0; + memcpy((char*)(&temp)+(8-INBYTES), buffer + i, INBYTES); + if(temp < 0) temp = -temp; + temp >>= 8*INBYTES; + if(temp > max) + max = temp; + } + return static_cast<double>(max); +} + + +inline double MaxFinderFloat32(const char* const buffer, const size_t bs) +//---------------------------------------------------------------------- +{ + float max = 0; + for(size_t i = 0; i<=bs-4; i+=4) + { + float temp = *reinterpret_cast<const float*>(buffer+i); + temp = fabs(temp); + if(temp > max) + max = temp; + } + return max; +} + + +inline void WavSigned24To16(char* const inBuffer, char* outBuffer, const double max) +//-------------------------------------------------------------------------------- +{ + __int32 val = 0; + memcpy((char*)(&val)+1, inBuffer, 3); + //Reading 24 bit data to three last bytes in 32 bit int. + + ASSERT((val << 24) == 0); + + bool negative = (val < 0) ? true : false; + if(negative) val = -val; + if(val < 0) val = (std::numeric_limits<__int32>::max)(); + //Handling special case that val is at minimum of int32 limit. + + val >>= 8; + + const __int64 NC = 32766; //Normalisation constant (2^16 / 2)-1. + const __int64 maxInt = static_cast<__int64>(max); + val = static_cast<__int32>(val*NC/maxInt); + + ASSERT((val >> 15) == 0); + + __int16 outVal = static_cast<__int16>(val); + + if(negative) outVal = -outVal; + + memcpy(outBuffer, &outVal, 2); +} + +inline void WavFloat32To16(char* const inBuffer, char* outBuffer, double max) +//---------------------------------------------------------------------- +{ + __int16* pOut = reinterpret_cast<__int16*>(outBuffer); + float* pIn = reinterpret_cast<float*>(inBuffer); + *pOut = static_cast<__int16>((*pIn / max) * 32766); +} + +inline void WavSigned32To16(char* const inBuffer, char* outBuffer, double max) +//---------------------------------------------------------------------- +{ + if(max >= 1) + { + double temp = *reinterpret_cast<const __int32*>(inBuffer); + __int16& pOut = *reinterpret_cast<__int16*>(outBuffer); + ASSERT(static_cast<__int16>(fabs(temp) / max * 32766) <= 32766); + pOut = static_cast<__int16>(temp / max * 32766); + } + else //No normalisation + { + outBuffer[0] = inBuffer[2]; + outBuffer[1] = inBuffer[3]; + } +} + + +template<size_t inBytes, size_t outBytes, DATACONV CopyAndConvert, MAXFINDER MaxFinder> +bool CopyWavBuffer(char* const readBuffer, const size_t rbSize, char* writeBuffer, const size_t wbSize) +//---------------------------------------------------------------------- +{ + if(inBytes > rbSize || outBytes > wbSize) return true; + if(inBytes > 8) return true; + size_t rbCounter = 0; + size_t wbCounter = 0; + + //Finding max value + const double max = MaxFinder(readBuffer, rbSize); + + if(max == 0) return true; + + //Copying buffer. + while(rbCounter <= rbSize-inBytes && wbCounter <= wbSize-outBytes) + { + CopyAndConvert(readBuffer+rbCounter, writeBuffer+wbCounter, max); + rbCounter += inBytes; + wbCounter += outBytes; + } + return false; +} + + + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-20 21:40:58
|
Revision: 167 Author: rewbs Date: 2006-08-20 14:39:55 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=167&view=rev Log Message: ----------- <rewbs> First attempt at providing initial MPTm and tuning mode code in new branch. Modified Paths: -------------- branches/OpenMPT_MPTm_Tuning/mptrack/AutoSaver.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Globals.cpp branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.h branches/OpenMPT_MPTm_Tuning/mptrack/View_gen.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_ins.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_smp.cpp branches/OpenMPT_MPTm_Tuning/mptrack/View_tre.cpp branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.vcproj branches/OpenMPT_MPTm_Tuning/mptrack/resource.h branches/OpenMPT_MPTm_Tuning/soundlib/Dlsbank.cpp branches/OpenMPT_MPTm_Tuning/soundlib/LOAD_DBM.CPP branches/OpenMPT_MPTm_Tuning/soundlib/Load_ams.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mdl.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mid.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mod.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_mt2.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_s3m.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Load_xm.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp branches/OpenMPT_MPTm_Tuning/soundlib/Tables.cpp Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h branches/OpenMPT_MPTm_Tuning/mptrack/bin/tunings/ branches/OpenMPT_MPTm_Tuning/mptrack/bin/tunings/local_tunings.tc branches/OpenMPT_MPTm_Tuning/mptrack/bin/tunings/standard/ branches/OpenMPT_MPTm_Tuning/mptrack/bin/tunings/standard/std_tunings.tc branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.cpp branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.cpp branches/OpenMPT_MPTm_Tuning/mptrack/tuningRatioMapWnd.h branches/OpenMPT_MPTm_Tuning/soundlib/MPT_module.cpp branches/OpenMPT_MPTm_Tuning/soundlib/MPT_module.h branches/OpenMPT_MPTm_Tuning/soundlib/tuning.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningCollection.cpp branches/OpenMPT_MPTm_Tuning/soundlib/tuning_template.h branches/OpenMPT_MPTm_Tuning/soundlib/tuningcollection.h Modified: branches/OpenMPT_MPTm_Tuning/mptrack/AutoSaver.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/AutoSaver.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/AutoSaver.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -206,6 +206,9 @@ name.Append(".it"); } break; + case MOD_TYPE_MPT: + name.Append(".mptm"); + break; case MOD_TYPE_XM: name.Append(".xm"); break; @@ -241,6 +244,9 @@ pSndFile->SaveITProject(fileName) : pSndFile->SaveIT(fileName, 0); break; + case MOD_TYPE_MPT: + success = pSndFile->SaveMPT(fileName, 0); + break; //default: //Do nothing } Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_gen.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -215,6 +215,8 @@ // -> DESC="IT project files (.itp)" // case MOD_TYPE_IT: pszModType = "IT (Impulse Tracker)"; break; case MOD_TYPE_IT: pszModType = m_pSndFile->m_dwSongFlags & SONG_ITPROJECT ? "ITP (IT Project)" : "IT (Impulse Tracker)"; break; + case MOD_TYPE_MPT: pszModType = "MPTM (OpenMPT)"; break; + // -! NEW_FEATURE#0023 } wsprintf(s, "%s, %d channels", pszModType, m_pSndFile->m_nChannels); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -7,6 +7,7 @@ #include "ctrl_ins.h" #include "view_ins.h" #include "dlg_misc.h" +#include "tuningDialog.h" #include "misc_util.h" #include <vector> #include <string> @@ -439,7 +440,7 @@ INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; if ((penv) && (m_nNote < 120)) { - if (!m_bIns && (pSndFile->m_nType & MOD_TYPE_IT)) + if (!m_bIns && (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) { UINT n = penv->NoteMap[m_nNote]; BOOL bOk = FALSE; @@ -496,7 +497,7 @@ return true; } - else if ((!m_bIns) && (pSndFile->m_nType & MOD_TYPE_IT)) { //in note column + else if ((!m_bIns) && (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) { //in note column UINT n = penv->NoteMap[m_nNote]; @@ -649,6 +650,7 @@ ON_CBN_SELCHANGE(IDC_FILTERMODE, OnFilterModeChanged) ON_COMMAND(ID_INSTRUMENT_SAMPLEMAP, OnEditSampleMap) //}}AFX_MSG_MAP + ON_CBN_SELCHANGE(IDC_COMBOTUNING, OnCbnSelchangeCombotuning) ON_EN_CHANGE(IDC_EDIT_PITCHTEMPOLOCK, OnEnChangeEditPitchtempolock) ON_BN_CLICKED(IDC_CHECK_PITCHTEMPOLOCK, OnBnClickedCheckPitchtempolock) ON_EN_KILLFOCUS(IDC_EDIT_PITCHTEMPOLOCK, OnEnKillfocusEditPitchtempolock) @@ -696,6 +698,7 @@ DDX_Control(pDX, IDC_SLIDER5, m_SliderAttack); DDX_Control(pDX, IDC_SPIN1, m_SpinAttack); // -! NEW_FEATURE#0027 + DDX_Control(pDX, IDC_COMBOTUNING, m_ComboTuning); DDX_Control(pDX, IDC_CHECK_PITCHTEMPOLOCK, m_CheckPitchTempoLock); DDX_Control(pDX, IDC_EDIT_PITCHTEMPOLOCK, m_EditPitchTempoLock); //}}AFX_DATA_MAP @@ -815,6 +818,24 @@ m_SpinInstrument.SetFocus(); + //-->Setting tunings to Combobox + for(size_t i = 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings(); i++) + { + m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).GetName().c_str()); + } + for(size_t i = 0; i<CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i++) + { + m_ComboTuning.AddString(CSoundFile::s_TuningsSharedLocal.GetTuning(i).GetName().c_str()); + } + for(size_t i = 0; i<m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); i++) + { + m_ComboTuning.AddString(m_pSndFile->m_TuningsTuneSpecific.GetTuning(i).GetName().c_str()); + } + m_ComboTuning.AddString("Control tunings..."); + m_ComboTuning.SetCurSel(0); + + //<--Setting tunings to Combobox + CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); //OnBnClickedCheckPitchtempolock(); m_EditPitchTempoLock.SetLimitText(4); @@ -1010,9 +1031,10 @@ if (!m_bInitialized) dwHintMask |= HINT_MODTYPE; if (dwHintMask & HINT_MODTYPE) { - BOOL bITonly = ((m_pSndFile->m_nType == MOD_TYPE_IT) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; + BOOL bITonly = ((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; //rewbs.instroVSTi - BOOL bITandXM = (((m_pSndFile->m_nType == MOD_TYPE_IT) || (m_pSndFile->m_nType == MOD_TYPE_XM)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; + BOOL bITandXM = (((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) || (m_pSndFile->m_nType == MOD_TYPE_XM)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; + bool bMPTOnly = ((m_pSndFile->m_nType == MOD_TYPE_MPT) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT10), bITandXM); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT11), bITandXM); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT7), bITandXM); @@ -1052,6 +1074,7 @@ m_SliderResonance.EnableWindow(bITonly); m_SpinInstrument.SetRange(1, m_pSndFile->m_nInstruments); m_SpinInstrument.EnableWindow((m_pSndFile->m_nInstruments) ? TRUE : FALSE); + m_ComboTuning.EnableWindow(bMPTOnly); m_EditPitchTempoLock.EnableWindow(bITonly); m_CheckPitchTempoLock.EnableWindow(bITonly); } @@ -1124,7 +1147,7 @@ m_ComboPPC.SetCurSel(penv->nPPC); SetDlgItemInt(IDC_EDIT15, penv->nPPS); // Filter - if (m_pSndFile->m_nType & MOD_TYPE_IT) + 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); @@ -1145,6 +1168,8 @@ if(n == 0) SetDlgItemText(IDC_EDIT2,"default"); else SetDlgItemInt(IDC_EDIT2,n); // -! NEW_FEATURE#0027 + + UpdateTuningComboBox(); if(penv->wPitchToTempoLock > 0) //Current instrument uses pitchTempoLock. CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_CHECKED); else @@ -1411,7 +1436,7 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - if ((pSndFile->m_nType & MOD_TYPE_IT) + if ((pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (pSndFile->m_nInstruments > 0) && (CMainFrame::GetInputHandler()->ShiftPressed())) //rewbs.customKeys { @@ -1438,7 +1463,7 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - if ((pSndFile->m_nType & MOD_TYPE_IT) && (pSndFile->m_nInstruments > 0)) + if ((pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (pSndFile->m_nInstruments > 0)) { BOOL bFirst = (pSndFile->m_nInstruments) ? FALSE : TRUE; LONG smp = m_pModDoc->InsertInstrument(0, m_nInstrument); @@ -1503,10 +1528,10 @@ // "FastTracker II Instruments (*.xi)|*.xi|" // "Impulse Tracker Instruments (*.iti)|*.iti||", // this); - CFileDialog dlg(FALSE, (m_pSndFile->m_nType & MOD_TYPE_IT) ? "iti" : "xi", + CFileDialog dlg(FALSE, (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) ? "iti" : "xi", szFileName, OFN_HIDEREADONLY| OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN, - ( m_pSndFile->m_nType & MOD_TYPE_IT ? "Impulse Tracker Instruments (*.iti)|*.iti|" + ( m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT) ? "Impulse Tracker Instruments (*.iti)|*.iti|" "FastTracker II Instruments (*.xi)|*.xi||" : "FastTracker II Instruments (*.xi)|*.xi|" "Impulse Tracker Instruments (*.iti)|*.iti||" ), @@ -1649,7 +1674,7 @@ if (nVol != (int)penv->nGlobalVol) { penv->nGlobalVol = nVol; - if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) m_pModDoc->SetModified(); // -> CODE#0023 // -> DESC="IT project files (.itp)" m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; @@ -1691,7 +1716,7 @@ if (nPan != (int)penv->nPan) { penv->nPan = nPan; - if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) m_pModDoc->SetModified(); // -> CODE#0023 // -> DESC="IT project files (.itp)" m_pSndFile->instrumentModified[m_nInstrument-1] = TRUE; @@ -2363,6 +2388,121 @@ return 0; } //end rewbs.customKeys + +void CCtrlInstruments::OnCbnSelchangeCombotuning() +//------------------------------------------------ +{ + if (IsLocked() || m_pModDoc == NULL || m_pSndFile == NULL) return; + + INSTRUMENTHEADER* pInstH = m_pSndFile->Headers[m_nInstrument]; + if(pInstH == 0) + return; + + CTuningCollection* tc = 0; + size_t sel = m_ComboTuning.GetCurSel(); + if(sel < CSoundFile::s_TuningsSharedStandard.GetNumTunings()) + tc = &CSoundFile::s_TuningsSharedStandard; + else + { + sel -= CSoundFile::s_TuningsSharedStandard.GetNumTunings(); + if(sel < CSoundFile::s_TuningsSharedLocal.GetNumTunings()) + tc = &CSoundFile::s_TuningsSharedLocal; + else + { + sel -= CSoundFile::s_TuningsSharedLocal.GetNumTunings(); + if(sel < m_pSndFile->m_TuningsTuneSpecific.GetNumTunings()) + tc = &m_pSndFile->m_TuningsTuneSpecific; + } + } + + if(tc) + { + BEGIN_CRITICAL(); + pInstH->pTuning = &tc->GetTuning(sel); + END_CRITICAL(); + m_pModDoc->SetModified(); + return; + } + + + //Creating vector for the CTuningDialog. + vector<CTuningCollection*> v; + v.push_back(&m_pSndFile->s_TuningsSharedStandard); + v.push_back(&m_pSndFile->s_TuningsSharedLocal); + v.push_back(&m_pSndFile->m_TuningsTuneSpecific); + CTuningDialog td(this, v, pInstH->pTuning); + td.DoModal(); + + //Recreating tuning combobox so that possible + //new tuning(s) come visible. + while(m_ComboTuning.GetCount() > 0) + m_ComboTuning.DeleteString(0); + for(size_t i = 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings(); i++) + { + m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).GetName().c_str()); + } + for(size_t i = 0; i<CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i++) + { + m_ComboTuning.AddString(CSoundFile::s_TuningsSharedLocal.GetTuning(i).GetName().c_str()); + } + for(size_t i = 0; i<m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); i++) + { + m_ComboTuning.AddString(m_pSndFile->m_TuningsTuneSpecific.GetTuning(i).GetName().c_str()); + } + m_ComboTuning.AddString("Control tunings..."); + m_ComboTuning.SetCurSel(0); + + UpdateTuningComboBox(); + + + //TODO: Update notemap window with correct notenames. +} + + +void CCtrlInstruments::UpdateTuningComboBox() +//------------------------------------------- +{ + if (m_pModDoc == 0 || m_pSndFile == 0 + || m_nInstrument > m_pSndFile->GetNumInstruments() + || m_pSndFile->Headers[m_nInstrument]->pTuning == 0) return; + + for(size_t i = 0; i < CSoundFile::s_TuningsSharedStandard.GetNumTunings(); i++) + { + if(m_pSndFile->Headers[m_nInstrument]->pTuning == &CSoundFile::s_TuningsSharedStandard.GetTuning(i)) + { + m_ComboTuning.SetCurSel(i); + return; + } + } + + for(size_t i = 0; i < CSoundFile::s_TuningsSharedLocal.GetNumTunings(); i++) + { + if(m_pSndFile->Headers[m_nInstrument]->pTuning == &CSoundFile::s_TuningsSharedLocal.GetTuning(i)) + { + m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunings()); + return; + } + } + + for(size_t i = 0; i < m_pSndFile->m_TuningsTuneSpecific.GetNumTunings(); i++) + { + if(m_pSndFile->Headers[m_nInstrument]->pTuning == &m_pSndFile->m_TuningsTuneSpecific.GetTuning(i)) + { + m_ComboTuning.SetCurSel(i+CSoundFile::s_TuningsSharedStandard.GetNumTunings() + CSoundFile::s_TuningsSharedLocal.GetNumTunings()); + return; + } + } + + + string str = string("Tuning ") + m_pSndFile->Headers[m_nInstrument]->pTuning->GetName() + + string(" was not found. Setting to default tuning."); + MessageBox(str.c_str()); + BEGIN_CRITICAL(); + m_pSndFile->Headers[m_nInstrument]->pTuning = m_pSndFile->Headers[m_nInstrument]->s_DefaultTuning; + END_CRITICAL(); + m_ComboTuning.SetCurSel(0); +} + void CCtrlInstruments::OnEnChangeEditPitchtempolock() //---------------------------------------------------- { Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.h 2006-08-20 21:39:55 UTC (rev 167) @@ -78,6 +78,10 @@ CSpinButtonCtrl m_SpinAttack; // -! NEW_FEATURE#0027 + //Tuning + CComboBox m_ComboTuning; + void UpdateTuningComboBox(); + //Pitch/Tempo lock CEdit m_EditPitchTempoLock; CButton m_CheckPitchTempoLock; @@ -148,6 +152,7 @@ afx_msg void OnEditSampleMap(); afx_msg void TogglePluginEditor(); //rewbs.instroVSTi afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys + afx_msg void OnCbnSelchangeCombotuning(); afx_msg void OnEnChangeEditPitchtempolock(); afx_msg void OnBnClickedCheckPitchtempolock(); afx_msg void OnEnKillfocusEditPitchtempolock(); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_pat.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -338,7 +338,7 @@ } m_pSndFile->GetPatternName(nPat, s, sizeof(s)); m_EditPatName.SetWindowText(s); - BOOL bXMIT = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) ? TRUE : FALSE; + BOOL bXMIT = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_ToolBar.EnableButton(ID_PATTERN_MIDIMACRO, bXMIT); m_ToolBar.EnableButton(ID_PATTERN_PROPERTIES, bXMIT); m_ToolBar.EnableButton(ID_PATTERN_EXPAND, bXMIT); @@ -822,7 +822,7 @@ UINT nCurOrd = m_OrderList.GetCurSel(); UINT pat = pSndFile->Order[nCurOrd]; UINT rows = 64; - if ((pat < MAX_PATTERNS) && (pSndFile->Patterns[pat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT))) + if ((pat < MAX_PATTERNS) && (pSndFile->Patterns[pat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) { rows = pSndFile->PatternSize[pat]; if (rows < 32) rows = 32; @@ -852,7 +852,7 @@ UINT rows = 64; if (nCurPat < MAX_PATTERNS) { - if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT))) + if ((pSndFile->Patterns[nCurPat]) && (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT))) { rows = pSndFile->PatternSize[nCurPat]; if (rows < 16) rows = 16; @@ -1074,7 +1074,7 @@ if (strcmp(s, sold)) { m_pSndFile->SetPatternName(nPat, s); - if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, (nPat << 24) | HINT_PATNAMES, this); } } @@ -1204,4 +1204,5 @@ return false; } + //end rewbs.instroVST \ No newline at end of file Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_seq.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -651,7 +651,7 @@ 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))) + 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..."); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -527,7 +527,7 @@ m_ComboSustainType.AddString("Off"); m_ComboSustainType.AddString("On"); // Bidirectional Loops - if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) { m_ComboLoopType.AddString("Bidi"); m_ComboSustainType.AddString("Bidi"); @@ -545,19 +545,19 @@ m_SpinSustainEnd.SetRange(-1, 1); m_SpinSustainEnd.SetPos(0); // Sustain Loops only available in IT - b = (m_pSndFile->m_nType == MOD_TYPE_IT) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_ComboSustainType.EnableWindow(b); m_SpinSustainStart.EnableWindow(b); m_SpinSustainEnd.EnableWindow(b); m_EditSustainStart.EnableWindow(b); m_EditSustainEnd.EnableWindow(b); // Finetune / C-4 Speed / BaseNote - b = (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; SetDlgItemText(IDC_TEXT7, (b) ? "Freq. (Hz)" : "Finetune"); m_SpinFineTune.SetRange(-1, 1); m_EditFileName.EnableWindow(b); // AutoVibrato - b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_ComboAutoVib.EnableWindow(b); m_SpinVibSweep.EnableWindow(b); m_SpinVibDepth.EnableWindow(b); @@ -566,11 +566,11 @@ m_EditVibDepth.EnableWindow(b); m_EditVibRate.EnableWindow(b); // Global Volume - b = (m_pSndFile->m_nType == MOD_TYPE_IT) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_EditGlobalVol.EnableWindow(b); m_SpinGlobalVol.EnableWindow(b); // Panning - b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) ? TRUE : FALSE; + b = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; m_CheckPanning.EnableWindow(b); m_EditPanning.EnableWindow(b); m_SpinPanning.EnableWindow(b); @@ -609,7 +609,7 @@ //end rewbs.fix36944 // FineTune / C-4 Speed / BaseNote int transp = 0; - if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { wsprintf(s, "%lu", pins->nC4Speed); m_EditFineTune.SetWindowText(s); @@ -926,7 +926,7 @@ SwitchToView(); return; } - if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { memcpy(szFileName, m_pSndFile->Ins[m_nSample].name, 22); szFileName[22] = 0; @@ -2166,7 +2166,7 @@ memcpy(m_pSndFile->Ins[m_nSample].name, 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 << 20) | HINT_SAMPLEINFO, this); - if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); } } @@ -2207,7 +2207,7 @@ { if (IsLocked()) return; BOOL b = FALSE; - if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) { b = IsDlgButtonChecked(IDC_CHECK1); } @@ -2216,14 +2216,14 @@ if (!(m_pSndFile->Ins[m_nSample].uFlags & CHN_PANNING)) { m_pSndFile->Ins[m_nSample].uFlags |= CHN_PANNING; - if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); } } else { if (m_pSndFile->Ins[m_nSample].uFlags & CHN_PANNING) { m_pSndFile->Ins[m_nSample].uFlags &= ~CHN_PANNING; - if (m_pSndFile->m_nType == MOD_TYPE_IT) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType == (MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); } } } @@ -2246,7 +2246,7 @@ if (nPan != m_pSndFile->Ins[m_nSample].nPan) { m_pSndFile->Ins[m_nSample].nPan = nPan; - if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) m_pModDoc->SetModified(); + if (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) m_pModDoc->SetModified(); } } @@ -2256,7 +2256,7 @@ { if (IsLocked()) return; int n = GetDlgItemInt(IDC_EDIT5); - if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M)) + 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)) { @@ -2290,7 +2290,7 @@ { if (IsLocked()) return; int n = 60 - (m_CbnBaseNote.GetCurSel() + BASENOTE_MIN); - if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M)) + 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; n = CSoundFile::TransposeToFrequency(n, ft); @@ -2724,7 +2724,7 @@ // FineTune / C-5 Speed if ((pos = (short int)m_SpinFineTune.GetPos()) != 0) { - if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) + if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { LONG d = pins->nC4Speed; if (d < 1) d = 8363; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Draw_pat.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -407,7 +407,7 @@ const char *pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]? "[Channel %d]" : "Channel %d"; // const char *pszfmt = pModDoc->IsChannelRecord(ncolhdr) ? "Channel %d " : "Channel %d"; // -! NEW_FEATURE#0012 - if ((pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) && ((BYTE)pSndFile->ChnSettings[ncolhdr].szName[0] > 0x20)) + if ((pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) && ((BYTE)pSndFile->ChnSettings[ncolhdr].szName[0] > 0x20)) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"%d: [%s]":"%d: %s"; else if (m_nDetailLevel < 2) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"[Ch%d]":"Ch%d"; else if (m_nDetailLevel < 3) pszfmt = pSndFile->m_bChannelMuteTogglePending[ncolhdr]?"[Chn %d]":"Chn %d"; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Globals.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Globals.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Globals.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -395,7 +395,7 @@ UINT nType = pSndFile->GetType(); UINT mask = 1 | 2 | 4 | 16; - if (nType & (MOD_TYPE_XM|MOD_TYPE_IT)) + if (nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) { mask |= 8; //mask |= 32; //rewbs.graph Modified: branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -352,6 +352,8 @@ m_InputHandler = new CInputHandler(this); //rewbs.customKeys m_pPerfCounter= new CPerformanceCounter(); + //Loading static tunings here - probably not the best place to do that but anyway. + CSoundFile::LoadStaticTunings(); } void CMainFrame::LoadIniSettings() @@ -1976,7 +1978,7 @@ m_WaveFile.m_nDefaultTempo = 125; m_WaveFile.m_nDefaultSpeed = 4; m_WaveFile.m_nRepeatCount = 0; - m_WaveFile.m_nType = MOD_TYPE_IT; + m_WaveFile.m_nType = MOD_TYPE_IT; //MOD_TYPE_MPT? m_WaveFile.m_nChannels = 4; m_WaveFile.m_nInstruments = 1; m_WaveFile.m_nSamples = 1; Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Moddoc.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -140,9 +140,9 @@ if(CTrackApp::IsProject()) m_SndFile.m_dwSongFlags |= SONG_ITPROJECT; // -! NEW_FEATURE#0023 - if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) m_SndFile.m_dwSongFlags |= SONG_LINEARSLIDES; + if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT | MOD_TYPE_MPT)) m_SndFile.m_dwSongFlags |= SONG_LINEARSLIDES; //rewbs.MacroGUI: enable embedded macros by default. - if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) m_SndFile.m_dwSongFlags |= SONG_EMBEDMIDICFG; + if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT | MOD_TYPE_MPT)) m_SndFile.m_dwSongFlags |= SONG_EMBEDMIDICFG; theApp.GetDefaultMidiMacro(&m_SndFile.m_MidiCfg); // -> CODE#0015 @@ -313,6 +313,7 @@ case MOD_TYPE_S3M: case MOD_TYPE_XM: case MOD_TYPE_IT: + case MOD_TYPE_MPT: bModified = FALSE; break; case MOD_TYPE_AMF0: @@ -381,6 +382,7 @@ // -> DESC="IT project files (.itp)" // if (!lstrcmpi(fext, ".it")) nType = MOD_TYPE_IT; else if (!lstrcmpi(fext, ".it") || !lstrcmpi(fext, ".itp")) nType = MOD_TYPE_IT; else + if (!lstrcmpi(fext, ".mptm")) nType = MOD_TYPE_MPT; else // -! NEW_FEATURE#0023 if (!greccount) { @@ -396,6 +398,7 @@ case MOD_TYPE_S3M: bOk = m_SndFile.SaveS3M(lpszPathName, dwPacking); break; case MOD_TYPE_XM: bOk = m_SndFile.SaveXM(lpszPathName, dwPacking); break; case MOD_TYPE_IT: bOk = (m_SndFile.m_dwSongFlags & SONG_ITPROJECT || !lstrcmpi(fext, ".itp")) ? m_SndFile.SaveITProject(lpszPathName) : m_SndFile.SaveIT(lpszPathName, dwPacking); break; + case MOD_TYPE_MPT: bOk = m_SndFile.SaveMPT(lpszPathName, dwPacking); break; } EndWaitCursor(); if (bOk) @@ -414,7 +417,7 @@ // -> DESC="IT project files (.itp)" BOOL CModDoc::SaveModified() { - if(m_SndFile.m_nType == MOD_TYPE_IT && m_SndFile.m_dwSongFlags & SONG_ITPROJECT && !(m_SndFile.m_dwSongFlags & SONG_ITPEMBEDIH)){ + if((m_SndFile.m_nType & MOD_TYPE_IT) && m_SndFile.m_dwSongFlags & SONG_ITPROJECT && !(m_SndFile.m_dwSongFlags & SONG_ITPEMBEDIH)){ BOOL unsavedInstrument = FALSE; @@ -430,7 +433,7 @@ BOOL iti = stricmp(&m_SndFile.m_szInstrumentPath[i][size-3],"iti") == 0; BOOL xi = stricmp(&m_SndFile.m_szInstrumentPath[i][size-2],"xi") == 0; - if(iti || (!iti && !xi && m_SndFile.m_nType == MOD_TYPE_IT)) + if(iti || (!iti && !xi && m_SndFile.m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) m_SndFile.SaveITIInstrument(i+1, m_SndFile.m_szInstrumentPath[i]); if(xi || (!xi && !iti && m_SndFile.m_nType == MOD_TYPE_XM)) m_SndFile.SaveXIInstrument(i+1, m_SndFile.m_szInstrumentPath[i]); @@ -509,6 +512,11 @@ } // -! NEW_FEATURE#0023 break; + case MOD_TYPE_MPT: + lpszDefExt = "mptm"; + lpszFilter = "OpenMPT Modules (*.mptm)|*.mptm||"; + strcpy(fext, ".mptm"); + break; default: ErrorBox(IDS_ERR_SAVESONG, CMainFrame::GetMainFrame()); return FALSE; @@ -609,7 +617,7 @@ { m_SndFile.ChnSettings[init].dwFlags = 0; m_SndFile.ChnSettings[init].nVolume = 64; - if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) + if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT | MOD_TYPE_MPT)) m_SndFile.ChnSettings[init].nPan = 128; else m_SndFile.ChnSettings[init].nPan = (init & 0x01) ? 64 : 192; @@ -630,7 +638,7 @@ m_SndFile.Headers[1] = new INSTRUMENTHEADER; InitializeInstrument(m_SndFile.Headers[1], 1); } - if (m_SndFile.m_nType & (MOD_TYPE_IT|MOD_TYPE_XM)) + if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT|MOD_TYPE_XM)) { m_SndFile.m_dwSongFlags |= SONG_LINEARSLIDES; } @@ -998,7 +1006,7 @@ } //Mark IT as modified - if (m_SndFile.m_nType == MOD_TYPE_IT) { + if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) { CMainFrame::GetMainFrame()->ThreadSafeSetModified(this); } @@ -1016,7 +1024,7 @@ BOOL CModDoc::SoloChannel(UINT nChn, BOOL bSolo) { if (nChn >= m_SndFile.m_nChannels) return FALSE; - if (m_SndFile.m_nType == MOD_TYPE_IT) SetModified(); + if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified(); if (bSolo) m_SndFile.ChnSettings[nChn].dwFlags |= CHN_SOLO; else m_SndFile.ChnSettings[nChn].dwFlags &= ~CHN_SOLO; return TRUE; @@ -1035,7 +1043,7 @@ BOOL CModDoc::NoFxChannel(UINT nChn, BOOL bNoFx, BOOL updateMix) { if (nChn >= m_SndFile.m_nChannels) return FALSE; - if (m_SndFile.m_nType == MOD_TYPE_IT) SetModified(); + if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified(); if (bNoFx){ m_SndFile.ChnSettings[nChn].dwFlags |= CHN_NOFX; if(updateMix) m_SndFile.Chn[nChn].dwFlags |= CHN_NOFX; @@ -1127,10 +1135,10 @@ DWORD d = (bSurround) ? CHN_SURROUND : 0; if (nChn >= m_SndFile.m_nChannels) return FALSE; - if (m_SndFile.m_nType != MOD_TYPE_IT) d = 0; + if (!(m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) d = 0; if (d != (m_SndFile.ChnSettings[nChn].dwFlags & CHN_SURROUND)) { - if (m_SndFile.m_nType == MOD_TYPE_IT) SetModified(); + if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified(); if (d) m_SndFile.ChnSettings[nChn].dwFlags |= CHN_SURROUND; else m_SndFile.ChnSettings[nChn].dwFlags &= ~CHN_SURROUND; @@ -1149,7 +1157,7 @@ if (m_SndFile.ChnSettings[nChn].nVolume != nVolume) { m_SndFile.ChnSettings[nChn].nVolume = nVolume; - if (m_SndFile.m_nType & MOD_TYPE_IT) SetModified(); + if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified(); bOk = TRUE; } m_SndFile.Chn[nChn].nGlobalVol = nVolume; @@ -1165,7 +1173,7 @@ if (m_SndFile.ChnSettings[nChn].nPan != nPan) { m_SndFile.ChnSettings[nChn].nPan = nPan; - if (m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) SetModified(); + if (m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified(); bOk = TRUE; } m_SndFile.Chn[nChn].nPan = nPan; @@ -1754,14 +1762,14 @@ void CModDoc::OnEditComments() //---------------------------- { - if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) SendMessageToActiveViews(WM_MOD_ACTIVATEVIEW, IDD_CONTROL_COMMENTS); + if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT | MOD_TYPE_MPT)) SendMessageToActiveViews(WM_MOD_ACTIVATEVIEW, IDD_CONTROL_COMMENTS); } //rewbs.graph void CModDoc::OnEditGraph() //---------------------------- { - if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) SendMessageToActiveViews(WM_MOD_ACTIVATEVIEW, IDD_CONTROL_GRAPH); + if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT | MOD_TYPE_MPT)) SendMessageToActiveViews(WM_MOD_ACTIVATEVIEW, IDD_CONTROL_GRAPH); } //end rewbs.graph @@ -1840,7 +1848,7 @@ //--------------------------------------- { if (p) p->Enable(((m_SndFile.m_nType == MOD_TYPE_XM) - || (m_SndFile.m_nType == MOD_TYPE_IT)) ? TRUE : FALSE); + || (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) ? TRUE : FALSE); } @@ -1975,8 +1983,11 @@ #define MOD_TYPE_MODXM (MOD_TYPE_MOD|MOD_TYPE_XM) #define MOD_TYPE_S3MIT (MOD_TYPE_S3M|MOD_TYPE_IT) -#define MOD_TYPE_NOMOD (MOD_TYPE_S3M|MOD_TYPE_XM|MOD_TYPE_IT) +#define MOD_TYPE_S3MITMPT (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT) +#define MOD_TYPE_NOMOD (MOD_TYPE_S3M|MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT) #define MOD_TYPE_XMIT (MOD_TYPE_XM|MOD_TYPE_IT) +#define MOD_TYPE_XMITMPT (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT) +#define MOD_TYPE_ITMPT (MOD_TYPE_IT|MOD_TYPE_MPT) #define MAX_FXINFO 66 //rewbs.smoothVST, increased from 64... I wonder what this will break? const MPTEFFECTINFO gFXInfo[MAX_FXINFO] = @@ -1999,12 +2010,12 @@ {CMD_SPEED, 0,0, 0, 0xFFFFFFFF, "Set Speed"}, {CMD_TEMPO, 0,0, 0, 0xFFFFFFFF, "Set Tempo"}, {CMD_TREMOR, 0,0, 0, MOD_TYPE_NOMOD, "Tremor"}, - {CMD_CHANNELVOLUME, 0,0, 0, MOD_TYPE_S3MIT, "Set channel volume"}, - {CMD_CHANNELVOLSLIDE,0,0, 0, MOD_TYPE_S3MIT, "Channel volslide"}, + {CMD_CHANNELVOLUME, 0,0, 0, MOD_TYPE_S3MITMPT, "Set channel volume"}, + {CMD_CHANNELVOLSLIDE,0,0, 0, MOD_TYPE_S3MITMPT, "Channel volslide"}, {CMD_GLOBALVOLUME, 0,0, 0, MOD_TYPE_NOMOD, "Set global volume"}, {CMD_GLOBALVOLSLIDE,0,0, 0, MOD_TYPE_NOMOD, "Global volume slide"}, {CMD_KEYOFF, 0,0, 0, MOD_TYPE_XM, "Key off"}, - {CMD_FINEVIBRATO, 0,0, 0, MOD_TYPE_S3MIT, "Fine vibrato"}, + {CMD_FINEVIBRATO, 0,0, 0, MOD_TYPE_S3MITMPT, "Fine vibrato"}, {CMD_PANBRELLO, 0,0, 0, MOD_TYPE_NOMOD, "Panbrello"}, {CMD_PANNINGSLIDE, 0,0, 0, MOD_TYPE_NOMOD, "Panning slide"}, {CMD_SETENVPOSITION,0,0, 0, MOD_TYPE_XM, "Envelope position"}, @@ -2027,19 +2038,19 @@ {CMD_MODCMDEX, 0xF0,0xE0, 0, MOD_TYPE_MODXM, "Pattern delay"}, {CMD_MODCMDEX, 0xF0,0xF0, 0, MOD_TYPE_XM, "Set active macro"}, // Extended S3M/IT effects - {CMD_S3MCMDEX, 0xF0,0x10, 0, MOD_TYPE_S3MIT, "Glissando control"}, + {CMD_S3MCMDEX, 0xF0,0x10, 0, MOD_TYPE_S3MITMPT, "Glissando control"}, {CMD_S3MCMDEX, 0xF0,0x20, 0, MOD_TYPE_S3M, "Set finetune"}, - {CMD_S3MCMDEX, 0xF0,0x30, 0, MOD_TYPE_S3MIT, "Vibrato waveform"}, - {CMD_S3MCMDEX, 0xF0,0x40, 0, MOD_TYPE_S3MIT, "Tremolo waveform"}, - {CMD_S3MCMDEX, 0xF0,0x50, 0, MOD_TYPE_S3MIT, "Panbrello waveform"}, - {CMD_S3MCMDEX, 0xF0,0x60, 0, MOD_TYPE_S3MIT, "Fine pattern delay"}, - {CMD_S3MCMDEX, 0xF0,0x80, 0, MOD_TYPE_S3MIT, "Set panning"}, - {CMD_S3MCMDEX, 0xF0,0xA0, 0, MOD_TYPE_S3MIT, "Set high offset"}, - {CMD_S3MCMDEX, 0xF0,0xB0, 0, MOD_TYPE_S3MIT, "Pattern loop"}, - {CMD_S3MCMDEX, 0xF0,0xC0, 0, MOD_TYPE_S3MIT, "Note cut"}, - {CMD_S3MCMDEX, 0xF0,0xD0, 0, MOD_TYPE_S3MIT, "Note delay"}, - {CMD_S3MCMDEX, 0xF0,0xE0, 0, MOD_TYPE_S3MIT, "Pattern delay"}, - {CMD_S3MCMDEX, 0xF0,0xF0, 0, MOD_TYPE_IT, "Set active macro"}, + {CMD_S3MCMDEX, 0xF0,0x30, 0, MOD_TYPE_S3MITMPT, "Vibrato waveform"}, + {CMD_S3MCMDEX, 0xF0,0x40, 0, MOD_TYPE_S3MITMPT, "Tremolo waveform"}, + {CMD_S3MCMDEX, 0xF0,0x50, 0, MOD_TYPE_S3MITMPT, "Panbrello waveform"}, + {CMD_S3MCMDEX, 0xF0,0x60, 0, MOD_TYPE_S3MITMPT, "Fine pattern delay"}, + {CMD_S3MCMDEX, 0xF0,0x80, 0, MOD_TYPE_S3MITMPT, "Set panning"}, + {CMD_S3MCMDEX, 0xF0,0xA0, 0, MOD_TYPE_S3MITMPT, "Set high offset"}, + {CMD_S3MCMDEX, 0xF0,0xB0, 0, MOD_TYPE_S3MITMPT, "Pattern loop"}, + {CMD_S3MCMDEX, 0xF0,0xC0, 0, MOD_TYPE_S3MITMPT, "Note cut"}, + {CMD_S3MCMDEX, 0xF0,0xD0, 0, MOD_TYPE_S3MITMPT, "Note delay"}, + {CMD_S3MCMDEX, 0xF0,0xE0, 0, MOD_TYPE_S3MITMPT, "Pattern delay"}, + {CMD_S3MCMDEX, 0xF0,0xF0, 0, MOD_TYPE_ITMPT, "Set active macro"}, // MPT XM extensions and special effects {CMD_XFINEPORTAUPDOWN,0xF0,0x10,0, MOD_TYPE_XM, "Extra fine porta up"}, {CMD_XFINEPORTAUPDOWN,0xF0,0x20,0, MOD_TYPE_XM, "Extra fine porta down"}, @@ -2048,11 +2059,11 @@ {CMD_XFINEPORTAUPDOWN,0xF0,0x90,0, MOD_TYPE_XM, "Sound control"}, {CMD_XFINEPORTAUPDOWN,0xF0,0xA0,0, MOD_TYPE_XM, "Set high offset"}, // MPT IT extensions and special effects - {CMD_S3MCMDEX, 0xF0,0x90, 0, MOD_TYPE_S3MIT, "Sound control"}, - {CMD_S3MCMDEX, 0xF0,0x70, 0, MOD_TYPE_IT, "Instr. control"}, + {CMD_S3MCMDEX, 0xF0,0x90, 0, MOD_TYPE_S3MITMPT, "Sound control"}, + {CMD_S3MCMDEX, 0xF0,0x70, 0, MOD_TYPE_ITMPT, "Instr. control"}, // -> CODE#0010 // -> DESC="add extended parameter mechanism to pattern effects" - {CMD_XPARAM, 0x00,0x00, 0, MOD_TYPE_XMIT, "X param"} + {CMD_XPARAM, 0x00,0x00, 0, MOD_TYPE_XMITMPT, "X param"} // -! NEW_FEATURE#0010 }; @@ -2258,7 +2269,7 @@ // -> CODE#0010 // -> DESC="add extended parameter mechanism to pattern effects" // if (nType & MOD_TYPE_S3MIT) nmin = 1; - if (nType & MOD_TYPE_S3MIT) nmin = 0; + if (nType & MOD_TYPE_S3MITMPT) nmin = 0; // -! NEW_FEATURE#0010 break; case CMD_VOLUMESLIDE: @@ -2266,13 +2277,13 @@ case CMD_VIBRATOVOL: case CMD_GLOBALVOLSLIDE: case CMD_CHANNELVOLSLIDE: - nmax = (nType & MOD_TYPE_S3MIT) ? 58 : 30; + nmax = (nType & MOD_TYPE_S3MITMPT) ? 58 : 30; break; case CMD_PANNING8: if (nType & (MOD_TYPE_MOD|MOD_TYPE_S3M)) nmax = 0x80; break; case CMD_GLOBALVOLUME: - nmax = (nType & MOD_TYPE_IT) ? 128 : 64; + nmax = (nType & MOD_TYPE_IT | MOD_TYPE_MPT) ? 128 : 64; break; } *prangeMin = nmin; @@ -2301,7 +2312,7 @@ case CMD_VIBRATOVOL: case CMD_GLOBALVOLSLIDE: case CMD_CHANNELVOLSLIDE: - if (m_SndFile.m_nType & MOD_TYPE_S3MIT) + if (m_SndFile.m_nType & MOD_TYPE_S3MITMPT) { if (!param) pos = 29; else if (((param & 0x0F) == 0x0F) && (param & 0xF0)) @@ -2338,7 +2349,7 @@ case CMD_VIBRATOVOL: case CMD_GLOBALVOLSLIDE: case CMD_CHANNELVOLSLIDE: - if (m_SndFile.m_nType & MOD_TYPE_S3MIT) + if (m_SndFile.m_nType & MOD_TYPE_S3MITMPT) { if (pos < 15) param = 15-pos; else if (pos < 29) param = (29-pos) | 0xF0; else @@ -2426,11 +2437,11 @@ { wsprintf(s, "continue"); } else - if ((m_SndFile.m_nType & MOD_TYPE_S3MIT) && ((param & 0x0F) == 0x0F) && (param & 0xF0)) + if ((m_SndFile.m_nType & MOD_TYPE_S3MITMPT) && ((param & 0x0F) == 0x0F) && (param & 0xF0)) { wsprintf(s, "fine +%d", param >> 4); } else - if ((m_SndFile.m_nType & MOD_TYPE_S3MIT) && ((param & 0xF0) == 0xF0) && (param & 0x0F)) + if ((m_SndFile.m_nType & MOD_TYPE_S3MITMPT) && ((param & 0xF0) == 0xF0) && (param & 0x0F)) { wsprintf(s, "fine -%d", param & 0x0F); } else @@ -2569,19 +2580,19 @@ { {VOLCMD_VOLUME, MOD_TYPE_NOMOD, "v: Set Volume"}, {VOLCMD_PANNING, MOD_TYPE_NOMOD, "p: Set Panning"}, - {VOLCMD_VOLSLIDEUP, MOD_TYPE_XMIT, "c: Volume slide up"}, - {VOLCMD_VOLSLIDEDOWN, MOD_TYPE_XMIT, "d: Volume slide down"}, - {VOLCMD_FINEVOLUP, MOD_TYPE_XMIT, "a: Fine volume up"}, - {VOLCMD_FINEVOLDOWN, MOD_TYPE_XMIT, "b: Fine volume down"}, - {VOLCMD_VIBRATOSPEED, MOD_TYPE_XMIT, "u: Vibrato speed"}, + {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_PANSLIDELEFT, MOD_TYPE_XM, "l: Pan slide left"}, {VOLCMD_PANSLIDERIGHT, MOD_TYPE_XM, "r: Pan slide right"}, - {VOLCMD_TONEPORTAMENTO, MOD_TYPE_XMIT, "g: Tone portamento"}, - {VOLCMD_PORTAUP, MOD_TYPE_IT, "f: Portamento up"}, - {VOLCMD_PORTADOWN, MOD_TYPE_IT, "e: Portamento down"}, - {VOLCMD_VELOCITY, MOD_TYPE_IT, ":: velocity"}, //rewbs.velocity - {VOLCMD_OFFSET, MOD_TYPE_IT, "o: offset"}, //rewbs.volOff + {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 }; @@ -3002,6 +3013,7 @@ { case MOD_TYPE_XM: newPath += ".xm"; break; case MOD_TYPE_IT: m_SndFile.m_dwSongFlags & SONG_ITPROJECT ? newPath+=".itp" : newPath+=".it"; break; + case MOD_TYPE_MPT: newPath += ".mptm"; break; case MOD_TYPE_S3M: newPath += ".s3m"; break; case MOD_TYPE_MOD: newPath += ".mod"; break; default: ASSERT(false); Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Modedit.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -34,6 +34,12 @@ return TRUE; } + if(m_SndFile.m_nType == MOD_TYPE_MPT) + { + if(::MessageBox(NULL, "Convertion from MPT to any other modtype makes certain features unavailable and is not assured to work properly; Do the convertion anyway? If yes, backupping the mod might be a good idea", + "Notice", MB_YESNO) != IDYES) + return FALSE; + } // Check if conversion to 64 rows is necessary for (UINT ipat=0; ipat<MAX_PATTERNS; ipat++) @@ -105,10 +111,10 @@ m_SndFile.m_nInstruments = 0; END_CRITICAL(); EndWaitCursor(); - } + } //End if (((m_SndFile.m_nInstruments) || (b64)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_S3M))) BeginWaitCursor(); // Adjust pattern data - if ((m_SndFile.m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) && (nNewType & (MOD_TYPE_S3M|MOD_TYPE_IT))) + if ((m_SndFile.m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) && (nNewType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))) { for (UINT nPat=0; nPat<MAX_PATTERNS; nPat++) if (m_SndFile.Patterns[nPat]) { @@ -164,7 +170,7 @@ } } } else - if ((m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_XM))) + if ((m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_XM))) { for (UINT nPat=0; nPat<MAX_PATTERNS; nPat++) if (m_SndFile.Patterns[nPat]) { @@ -243,7 +249,7 @@ if ((m_SndFile.m_nType == MOD_TYPE_MOD) && (nNewType == MOD_TYPE_XM)) { } else - // Convert XM to S3M/IT + // Convert XM to S3M/IT/MPT if ((m_SndFile.m_nType == MOD_TYPE_XM) && (nNewType != MOD_TYPE_XM)) { for (UINT i=1; i<=m_SndFile.m_nSamples; i++) @@ -252,9 +258,9 @@ m_SndFile.Ins[i].RelativeTone = 0; m_SndFile.Ins[i].nFineTune = 0; } - if (nNewType & MOD_TYPE_IT) m_SndFile.m_dwSongFlags |= SONG_ITCOMPATMODE; + if (nNewType & (MOD_TYPE_IT|MOD_TYPE_MPT)) m_SndFile.m_dwSongFlags |= SONG_ITCOMPATMODE; } else - // Convert S3M/IT to XM + // Convert S3M/IT/MPT to XM if ((m_SndFile.m_nType != MOD_TYPE_XM) && (nNewType == MOD_TYPE_XM)) { for (UINT i=1; i<=m_SndFile.m_nSamples; i++) @@ -290,12 +296,12 @@ } BEGIN_CRITICAL(); m_SndFile.m_nType = nNewType; - if ((!(nNewType & (MOD_TYPE_IT|MOD_TYPE_XM))) && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES)) + if ((!(nNewType & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_XM))) && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES)) { AddToLog("WARNING: Linear Frequency Slides not supported by the new format.\n"); m_SndFile.m_dwSongFlags &= ~SONG_LINEARSLIDES; } - if (nNewType != MOD_TYPE_IT) m_SndFile.m_dwSongFlags &= ~(SONG_ITOLDEFFECTS|SONG_ITCOMPATMODE); + if (!(nNewType & (MOD_TYPE_IT|MOD_TYPE_MPT))) m_SndFile.m_dwSongFlags &= ~(SONG_ITOLDEFFECTS|SONG_ITCOMPATMODE); if (nNewType != MOD_TYPE_S3M) m_SndFile.m_dwSongFlags &= ~SONG_FASTVOLSLIDES; END_CRITICAL(); ChangeFileExtension(nNewType); @@ -326,7 +332,7 @@ //------------------------------------------------ { int maxChans; - if (m_SndFile.m_nType&MOD_TYPE_IT) { + if (m_SndFile.m_nType&(MOD_TYPE_IT|MOD_TYPE_MPT)) { maxChans=max_chans_IT; } else if (m_SndFile.m_nType&MOD_TYPE_XM) { maxChans=max_chans_XM; @@ -799,7 +805,7 @@ } } EndWaitCursor(); - if (nExt && !((m_SndFile.m_nType==MOD_TYPE_IT) && (m_SndFile.m_dwSongFlags&SONG_ITPROJECT))) + if (nExt && !(m_SndFile.m_nType & MOD_TYPE_IT) && (m_SndFile.m_dwSongFlags&SONG_ITPROJECT)) { //We don't remove an instrument's unused samples in an ITP. wsprintf(s, "OpenMPT detected %d sample(s) referenced by an instrument,\n" "but not used in the song. Do you want to remove them ?", nExt); @@ -952,7 +958,7 @@ if (!m_SndFile.m_nInstruments) return FALSE; char removeSamples = -1; - if ( !((m_SndFile.m_nType==MOD_TYPE_IT) && (m_SndFile.m_dwSongFlags&SONG_ITPROJECT))) { //never remove an instrument's samples in ITP. + if ( !((m_SndFile.m_nType & MOD_TYPE_IT) && (m_SndFile.m_dwSongFlags&SONG_ITPROJECT))) { //never remove an instrument's samples in ITP. if(::MessageBox(NULL, "Remove samples associated with an instrument if they are unused?", "Removing instrument", MB_YESNO | MB_ICONQUESTION) == IDYES) { removeSamples = 1; } @@ -1215,7 +1221,7 @@ //----------------------------------------------------------- { INSTRUMENTHEADER *pDup = NULL; - if ((m_SndFile.m_nType != MOD_TYPE_XM) && (m_SndFile.m_nType != MOD_TYPE_IT)) return -1; + if ((m_SndFile.m_nType != MOD_TYPE_XM) && !(m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) return -1; if ((lDuplicate > 0) && (lDuplicate <= (LONG)m_SndFile.m_nInstruments)) { pDup = m_SndFile.Headers[lDuplicate]; @@ -1329,6 +1335,7 @@ penv->Keyboard[n] = nsample; penv->NoteMap[n] = n+1; } + penv->pTuning = penv->s_DefaultTuning; } @@ -1582,6 +1589,7 @@ case MOD_TYPE_S3M: pszFormatName = "S3M"; break; case MOD_TYPE_XM: pszFormatName = "XM"; break; case MOD_TYPE_IT: pszFormatName = "IT"; break; + case MOD_TYPE_MPT: pszFormatName = "MPT"; break; default: pszFormatName = "MOD"; break; } LPSTR p = (LPSTR)GlobalLock(hCpy); @@ -1654,7 +1662,7 @@ { if (m->command) { - if (m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT)) + if (m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) p[9] = gszS3mCommands[m->command]; else p[9] = gszModCommands[m->command]; @@ -1722,7 +1730,8 @@ if (!c) goto PasteDone; if ((c == 0x0D) && (len > 3)) { - if ((p[len-3] == 'I') || (p[len-4] == 'S')) bS3M = TRUE; + //if ((p[len-3] == 'I') || (p[len-4] == 'S')) bS3M = TRUE; + if ((p[len-3] == 'I') || (p[len-4] == 'S') || (p[len-4] == 'M')) bS3M = TRUE; break; } } Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -527,6 +527,7 @@ // -> DESC="IT project files (.itp)" ON_COMMAND(ID_NEW_ITPROJECT,OnFileNewITProject) // -! NEW_FEATURE#0023 + ON_COMMAND(ID_NEW_MPT, OnFileNewMPT) ON_COMMAND(ID_FILE_OPEN, OnFileOpen) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) ON_COMMAND(ID_HELP_INDEX, CWinApp::OnHelpIndex) @@ -953,10 +954,20 @@ if (m_pModTemplate) m_pModTemplate->OpenDocumentFile(NULL); } +void CTrackApp::OnFileNewMPT() +//--------------------------- +{ + SetAsProject(FALSE); + SetDefaultDocType(MOD_TYPE_MPT); + if (m_pModTemplate) m_pModTemplate->OpenDocumentFile(NULL); +} + + // -> CODE#0023 // -> DESC="IT project files (.itp)" void CTrackApp::OnFileNewITProject() +//---------------------------------- { SetAsProject(TRUE); SetDefaultDocType(MOD_TYPE_IT); @@ -986,6 +997,7 @@ // -> DESC="IT project files (.itp)" "Impulse Tracker Projects (*.itp)|*.itp;*.itpz|" // -! NEW_FEATURE#0023 + "Open MPT 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|" "Wave Files (*.wav)|*.wav|" "Midi Files (*.mid,*.rmi)|*.mid;*.rmi;*.smf|" Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.h =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.h 2006-08-20 20:53:27 UTC (rev 166) +++ branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.h 2006-08-20 21:39:55 UTC (rev 167) @@ -218,6 +218,7 @@ afx_msg void OnFileNewS3M(); afx_msg void OnFileNewXM(); afx_msg void OnFileNewIT(); + afx_msg void OnFileNewMPT(); // -> CODE#0023 // -> DESC="IT project files (.itp)" afx_msg void OnFileNewITProject(); Added: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp =================================================================== --- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp (rev 0) +++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2006-08-20 21:39:55 UTC (rev 167) @@ -0,0 +1,675 @@ +// TuningDialog.cpp : implementation file +// + +#include "stdafx.h" +#include "mptrack.h" +#include "TuningDialog.h" +#include ".\tuningdialog.h" + +const string CTuningDialog::s_stringTypeGEN = "General"; +const string CTuningDialog::s_stringTypeRP = "Ratio periodic"; +const string CTuningDialog::s_stringTypeTET = "TET"; + +/* +TODOS: +-Clear tuning(when copying existing tuning, it might have + e.g. unwanted note names which should able to be removed. +-Show note name and ratio value also in the set-editboxes + (->clear note names) +*/ + + +// CTuningDialog dialog + +IMPLEMENT_DYNAMIC(CTuningDialog, CDialog) +CTuningDialog::CTuningDialog(CWnd* pParent, const TUNINGVECTOR& rVec, CTuning* pTun) + : CDialog(CTuningDialog::IDD, pParent), + m_TuningCollections(rVec), + m_pTempTuning(0), + m_pTempTuningCol(0), + m_NoteEditApply(true), + m_RatioEditApply(true) +//---------------------------------------- +{ + m_RatioMapWnd.m_pTuning = pTun; //pTun is the tuning to show when dialog opens. + + //Requiring that there is always at least one tuning collection. + if(m_TuningCollections.size() == 0) + { + m_pTempTuningCol = new CTuningCollection("Tuning dialog temp"); + m_TuningCollections.push_back(m_pTempTuningCol); + } + +} + +CTuningDialog::~CTuningDialog() +//---------------------------- +{ + delete m_pTempTuning; + delete m_pTempTuningCol; +} + +BOOL CTuningDialog::OnInitDialog() +//-------------------------------- +{ + CDialog::OnInitDialog(); + + //CWnd::EnableToolTips(true); + //Todo: Tooltips. + + m_RatioMapWnd.Init(this, 0); + + //Adding tuning collection names to the combobox. + for(size_t i = 0; i<m_TuningCollections.size(); i++) + { + m_CombobTuningCollection.AddString(m_TuningCollections[i]->GetName().c_str()); + } + + //Adding tuning type names to corresponding combobox + m_CombobTuningType.AddString(s_stringTypeGEN.c_str()); + m_CombobTuningType.AddString(s_stringTypeRP.c_str()); + m_CombobTuningType.AddString(s_stringTypeTET.c_str()); + + m_ButtonSet.EnableWindow(FALSE); + + SetView(m_RatioMapWnd.m_pTuning); + + return TRUE; +} + +void CTuningDialog::SetView(const CTuning* pTun) +//-------------------------------------------- +{ + if(!m_TuningCollections[0]) {ASSERT(false); return;} + if(m_TuningCollections[0]->GetNumTunings() == 0) + { + ASSERT(false); + return; + } + + if(!pTun) pTun = &m_TuningCollections[0]->GetTuning(0); + + //Finding out where given tuning belongs to. + size_t curTCol = 0, curT = 0; //cur <-> Current, T <-> Tuning, Col <-> Collection. + for(size_t i = 0; i<m_TuningCollections.size(); i++) + { + CTuningCollection& rCurTCol = *m_TuningCollections.at(i); + for(size_t j = 0; j<rCurTCol.GetNumTunings(); j++) + { + if(pTun == &rCurTCol.GetTuning(static_cast<unsigned short>(j))) + { + curTCol = i; + curT = j; + break; + } + } + } + + m_CombobTuningCollection.SetCurSel(curTCol); + OnCbnSelchangeComboTcol(); + m_CombobTuningName.SetCurSel(curT); + OnCbnSelchangeComboT(); +} + + +void CTuningDialog::DoDataExchange(CDataExchange* pDX) +//----------------------------------------------------- +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_STATICRATIOMAP, m_RatioMapWnd); + DDX_Control(pDX, IDC_COMBO_TCOL, m_CombobTuningCollection); + DDX_Control(pDX, IDC_COMBO_T, m_CombobTuningName); + DDX_Control(pDX, IDC_COMBO_TTYPE, m_CombobTuningType); + DDX_Control(pDX, IDC_EDIT_TABLESIZE, m_EditTableSize); + DDX_Control(pDX, IDC_EDIT_BEGINNOTE, m_EditBeginNote); + DDX_Control(pDX, IDC_EDIT_STEPS, m_EditSteps); + DDX_Control(pDX, IDC_EDIT_RATIOPERIOD, m_EditRatioPeriod); + DDX_Control(pDX, IDC_CHECK_NEWTUNING, m_CheckNewTuning); + DDX_Control(pDX, IDC_ADD_TUNING, m_ButtonAddTuning); + DDX_Control(pDX, IDC_REMOVE_TUNING, m_ButtonRemoveTuning); + DDX_Control(pDX, IDC_EDIT_RATIOVALUE, m_EditRatio); + DDX_Control(pDX, IDC_EDIT_NOTENAME, m_EditNotename); + DDX_Control(pDX, IDC_BUTTON_SETVALUES, m_ButtonSet); +} + + +BEGIN_MESSAGE_MAP(CTuningDialog, CDialog) + ON_CBN_SELCHANGE(IDC_COMBO_TCOL, OnCbnSelchangeComboTcol) + ON_CBN_SELCHANGE(IDC_COMBO_T, OnCbnSelchangeComboT) + ON_BN_CLICKED(IDC_CHECK_NEWTUNING, OnBnClickedCheckNewtuning) + ON_CBN_SELCHANGE(IDC_COMBO_TTYPE, OnCbnSelchangeComboTtype) + ON_EN_CHANGE(IDC_EDIT_STEPS, OnEnChangeEditSteps) + ON_EN_CHANGE(IDC_EDIT_RATIOPERIOD, OnEnChangeEditRatioperiod) + ON_BN_CLICKED(IDC_ADD_TUNING, OnBnClickedAddTuning) + ON_BN_CLICKED(IDC_REMOVE_TUNING, OnBnClickedRemoveTuning) + ON_CBN_EDITCHANGE(IDC_COMBO_T, OnCbnEditchangeComboT) + ON_EN_CHANGE(IDC_EDIT_NOTENAME, OnEnChangeEditNotename) + ON_BN_CLICKED(IDC_BUTTON_SETVALUES, OnBnClickedButtonSetvalues) + ON_EN_CHANGE(IDC_EDIT_RATIOVALUE, OnEnChangeEditRatiovalue) +END_MESSAGE_MAP() + + +// CTuningDialog message handlers + +void CTuningDialog::OnCbnSelchangeComboTcol() +//------------------------------------------- +{ + const int curTCol = m_CombobTuningCollection.GetCurSel(); + const int curT = m_CombobTuningName.GetCurSel(); + if(curTCol < 0 || curTCol >= static_cast<int>(m_TuningCollections.size())) return; + + //Checking whether collection allows removing + if(m_TuningCollections[curTCol]->CanEdit(CTuningCollection::EM_REMOVE)) + m_ButtonRemoveTuning.EnableWindow(true); + else + m_ButtonRemoveTuning.EnableWindow(false); + + if(IsDlgButtonChecked(IDC_CHECK_NEWTUNING)) + { + //Checking whether tuning collection allows adding + //tunings... + if(m_TuningCollections.at(curTCol)->CanEdit(CTuningCollection::EM_ADD)) + m_ButtonAddTuning.EnableWindow(); + else + m_ButtonAddTuning.EnableWindow(false); + + return; + } + + //Clearing existing items from name-combobox... + while(m_CombobTuningName.GetCount() > 0) + m_CombobTuningName.DeleteString(0); + + //...checking does the tuning collection have any + //tunings in it... + if(m_TuningCollections[curTCol]->GetNumTunings() == 0) + { + m_CombobTuningName.AddString("No tunings"); + m_CombobTuningName.SetCurSel(0); + m_RatioMapWnd.m_pTuning = 0; + //Hiding ratiomap window in this case. + m_RatioMapWnd.ShowWindow(SW_HIDE); + UpdateTuningType(0); + return; + } + + //...adding names of tunings in the current tuning collection... + CTuningCollection& rTCol = *m_TuningCollections.at(curTCol); + for(size_t i = 0; i<rTCol.GetNumTunings(); i++) + { + m_CombobTuningName.AddString(rTCol.GetTuning(static_cast<unsigned short>(i)).GetName().c_str()); + } + + //...checking can previous tuning item be used... + if(curT < 0 || curT >= m_CombobTuningName.GetCount()) + m_CombobTuningName.SetCurSel(0); + else + m_CombobTuningName.SetCurSel(curT); + + OnCbnSelchangeComboT(); +} + +void CTuningDialog::OnCbnSelchangeComboT() +//---------------------------------------- +{ + //Checking that there is valid Tuning collection index... + const int TCol = m_CombobTuningCollection.GetCurSel(); + if(TCol < 0 || TCol >= static_cast<int>(m_TuningCollections.size())) return; + + CTuningCollection& rTCol = *m_TuningCollections.at(TCol); + + //...checking that tuning index is valid... + const unsigned short T = static_cast<unsigned short>(m_CombobTuningName.GetCurSel()); + if(T < 0 || T >= rTCol.GetNumTunings()) + return; + + //...updating tuning type-combob... + UpdateTuningType(&rTCol.GetTuning(T)); + + //...and making sure that ratiomap window is showing and + //updating its content. + m_RatioMapWnd.ShowWindow(SW_SHOW); + m_RatioMapWnd.m_pTuning = &rTCol.GetTuning(T); + m_RatioMapWnd.Invalidate(); + UpdateRatioMapEdits(m_RatioMapWnd.GetShownCentre()); +} + +void CTuningDialog::UpdateTuningType(const CTuning* pT) +//----------------------------------------------------- +{ + if(pT) + { + ASSERT(m_CombobTuningType.GetCount() > 0); + if(pT->GetTuningType() == CTuning::TT_TET) + m_CombobTuningType.SetCurSel(2); + else + //if(pT->GetPeriod()) + if(pT->GetTuningType() == CTuning::TT_RATIOPERIODIC) + m_CombobTuningType.SetCurSel(1); + else + m_CombobTuningType.SetCurSel(0); + + + //Updating ratioperiod and steps in ratio fields... + CTuning::RATIOTYPE rp = pT->GetPeriodRatio(); + CTuning::STEPTYPE period = pT->GetPeriod(); + if(period) + { + m_EditSteps.EnableWindow(); + m_EditSteps.SetWindowText(Stringify(period).c_str()); + + m_EditRatioPeriod.EnableWindow(); + m_EditRatioPeriod.SetWindowText(Stringify(rp).c_str()); + } + else + { + if(!IsDlgButtonChecked(IDC_CHECK_NEWTUNING)) + { + m_EditSteps.EnableWindow(false); + m_EditRatioPeriod.EnableWindow(false); + } + } + } + m_CombobTuningType.Invalidate(); + m_EditSteps.Invalidate(); + m_EditRatioPeriod.Invalidate(); + +} + +void CTuningDialog::OnBnClickedCheckNewtuning() +//--------------------------------------------- +{ + + if(IsDlgButtonChecked(IDC_CHECK_NEWTUNING)) + { + //Bug? + if(m_pTempTuning != NULL) + { + MessageBox("Bug: m_pTempTuning != NULL in CTuningDialog::OnBnClickedCheckNewtuning()", 0); + delete m_pTempTuning; m_pTempTuning = NULL; + m_RatioMapWnd.m_pTuning = NULL; + return; + } + + m_ButtonSet.EnableWindow(); + m_ButtonRemoveTuning.ShowWindow(SW_HIDE); + m_RatioMapWnd.ShowWindow(SW_SHOW); + m_ButtonAddTuning.ShowWindow(SW_SHOW); + + const size_t TCol = static_cast<size_t>(m_CombobTuningCollection.GetCurSel()); + if(TCol >= 0 && TCol < m_TuningCollections.size()) + if(m_TuningCollections[TCol]->CanEdit(CTuningCollection::EM_ADD)) + m_ButtonAddTuning.EnableWindow(); + else + m_ButtonAddTuning.EnableWindow(FALSE); + + //Deleting tuning names from combob. + while(m_CombobTuningName.GetCount() > 0) + m_CombobTuningName.DeleteString(0); + //Invalidating later. + + + //Creating temporary tuning object and using + //previously shown tuning as 'template'. + m_pTempTuning = new CTuningRTI(m_RatioMapWnd.m_pTuning); + m_RatioMapWnd.m_pTuning = m_pTempTuning; + m_RatioMapWnd.Invalidate(); + UpdateRatioMapEdits(m_Rati... [truncated message content] |
From: <re...@us...> - 2006-08-20 20:53:41
|
Revision: 166 Author: rewbs Date: 2006-08-20 13:53:27 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=166&view=rev Log Message: ----------- <rewbs> Creating branch for MPT module format and tuning modes. Added Paths: ----------- branches/OpenMPT_MPTm_Tuning/ Copied: branches/OpenMPT_MPTm_Tuning (from rev 165, trunk/OpenMPT) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-20 20:32:51
|
Revision: 165 Author: rewbs Date: 2006-08-20 13:29:31 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=165&view=rev Log Message: ----------- v1.17.02.45 + <Relabsoluness & Alex> "Pitch to tempo lock" instrument setting: define the tempo at which your instrument loops correctly, and it will be pitched automatically to match the song's current tempo. + <Relabsoluness> Notification when attempting to modify pattern but pattern record is off. + <Relabsoluness> Orderlist margins: you can define how many slots to keep visible around the active pattern as the orderlist scrolls . <Relabsoluness> Fixes for various unexpected pattern loop state changes. . <Relabsoluness> Fixes to IT Style clear. . <Relabsoluness> Memory management fixes and misc other bug fixes. . <rewbs> ITP loading fixed (I broke it in v1.17.02.44) . <rewbs> Time estimation fixed for tracks with pattern break+XParam. . <rewbs> "Last saved with" version number was not always saved correctly - fixed Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_com.cpp trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe trunk/OpenMPT/mptrack/bin/mptrack_P3.exe trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe trunk/OpenMPT/mptrack/bin/version trunk/OpenMPT/mptrack/fxp.cpp trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/LOAD_AMF.CPP trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mdl.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/Tables.cpp trunk/OpenMPT/unlha/Unlha.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_com.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_com.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -186,13 +186,13 @@ if (p[0]) m_pSndFile->m_lpszSongComments = p; else - delete p; + delete[] p; if (oldcomments) { BOOL bSame = FALSE; if ((m_pSndFile->m_lpszSongComments) && (!strcmp(m_pSndFile->m_lpszSongComments, oldcomments))) bSame = TRUE; - delete oldcomments; + delete[] oldcomments; if (bSame) return; } else { Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -156,7 +156,8 @@ if (dwHint & HINT_MODSEQUENCE) { // Detecting max valid restart position - for (UINT i=0; i<MAX_ORDERS; i++) if (m_pSndFile->Order[i] == 0xFF) break; + UINT i = 0; + for (i=0; i<MAX_ORDERS; i++) if (m_pSndFile->Order[i] == 0xFF) break; m_SpinRestartPos.SetRange(0, i); } if (dwHint & HINT_MODGENERAL) Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -7,6 +7,11 @@ #include "ctrl_ins.h" #include "view_ins.h" #include "dlg_misc.h" +#include "misc_util.h" +#include <vector> +#include <string> +using std::string; +using std::vector; #pragma warning(disable:4244) @@ -215,7 +220,7 @@ { CWnd::OnSetFocus(pOldWnd); InvalidateRect(NULL, FALSE); - CMainFrame::GetMainFrame()->m_pNoteMapHasFocus= (CWnd*) this; //rewbs.customKeys + CMainFrame::GetMainFrame()->m_pNoteMapHasFocus = (CWnd*) this; //rewbs.customKeys } @@ -644,6 +649,9 @@ ON_CBN_SELCHANGE(IDC_FILTERMODE, OnFilterModeChanged) ON_COMMAND(ID_INSTRUMENT_SAMPLEMAP, OnEditSampleMap) //}}AFX_MSG_MAP + ON_EN_CHANGE(IDC_EDIT_PITCHTEMPOLOCK, OnEnChangeEditPitchtempolock) + ON_BN_CLICKED(IDC_CHECK_PITCHTEMPOLOCK, OnBnClickedCheckPitchtempolock) + ON_EN_KILLFOCUS(IDC_EDIT_PITCHTEMPOLOCK, OnEnKillfocusEditPitchtempolock) END_MESSAGE_MAP() void CCtrlInstruments::DoDataExchange(CDataExchange* pDX) @@ -688,6 +696,8 @@ DDX_Control(pDX, IDC_SLIDER5, m_SliderAttack); DDX_Control(pDX, IDC_SPIN1, m_SpinAttack); // -! NEW_FEATURE#0027 + DDX_Control(pDX, IDC_CHECK_PITCHTEMPOLOCK, m_CheckPitchTempoLock); + DDX_Control(pDX, IDC_EDIT_PITCHTEMPOLOCK, m_EditPitchTempoLock); //}}AFX_DATA_MAP } @@ -805,8 +815,12 @@ m_SpinInstrument.SetFocus(); + CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); + //OnBnClickedCheckPitchtempolock(); + m_EditPitchTempoLock.SetLimitText(4); + return FALSE; } @@ -1038,6 +1052,8 @@ m_SliderResonance.EnableWindow(bITonly); m_SpinInstrument.SetRange(1, m_pSndFile->m_nInstruments); m_SpinInstrument.EnableWindow((m_pSndFile->m_nInstruments) ? TRUE : FALSE); + m_EditPitchTempoLock.EnableWindow(bITonly); + m_CheckPitchTempoLock.EnableWindow(bITonly); } if (dwHintMask & (HINT_INSTRUMENT|HINT_MODTYPE)) { @@ -1129,6 +1145,12 @@ if(n == 0) SetDlgItemText(IDC_EDIT2,"default"); else SetDlgItemInt(IDC_EDIT2,n); // -! NEW_FEATURE#0027 + if(penv->wPitchToTempoLock > 0) //Current instrument uses pitchTempoLock. + CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_CHECKED); + else + CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); + + OnBnClickedCheckPitchtempolock(); } else { m_EditName.SetWindowText(""); @@ -1301,6 +1323,7 @@ BOOL CCtrlInstruments::GetToolTipText(UINT uId, LPSTR pszText) //------------------------------------------------------------ { + //NOTE: pszText seems to point to char array of length 256. if ((pszText) && (uId)) { switch(uId) @@ -1313,6 +1336,23 @@ return TRUE; } break; + case IDC_EDIT_PITCHTEMPOLOCK: + case IDC_CHECK_PITCHTEMPOLOCK: + if ((m_pSndFile) && (m_pSndFile->Headers[m_nInstrument])) + { + const string str = string("Tempo range: ") + Stringify(m_pSndFile->GetTempoMin()) + string(" - ") + Stringify(m_pSndFile->GetTempoMax()); + ASSERT(str.size() < 256); + wsprintf(pszText, str.c_str()); + return TRUE; + } + break; + case IDC_EDIT7: //Fade out + if ((m_pSndFile) && (m_pSndFile->Headers[m_nInstrument])) + { + wsprintf(pszText, "Higher value <-> Faster fade out"); + return TRUE; + } + break; } } return FALSE; @@ -2322,4 +2362,94 @@ return 0; } -//end rewbs.customKeys \ No newline at end of file +//end rewbs.customKeys +void CCtrlInstruments::OnEnChangeEditPitchtempolock() +//---------------------------------------------------- +{ + if(IsLocked() || !m_pModDoc || !m_pSndFile || !m_nInstrument || !m_pSndFile->Headers[m_nInstrument]) return; + + const WORD MINTEMPO = m_pSndFile->GetTempoMin(); + const WORD MAXTEMPO = m_pSndFile->GetTempoMax(); + char buffer[7]; + m_EditPitchTempoLock.GetWindowText(buffer, 6); + int ptlTempo = atoi(buffer); + if(ptlTempo < MINTEMPO) + ptlTempo = MINTEMPO; + if(ptlTempo > MAXTEMPO) + ptlTempo = MAXTEMPO; + + BEGIN_CRITICAL(); + m_pSndFile->Headers[m_nInstrument]->wPitchToTempoLock = ptlTempo; + END_CRITICAL(); + m_pModDoc->SetModified(); +} + +void CCtrlInstruments::OnBnClickedCheckPitchtempolock() +//----------------------------------------------------- +{ + if(!m_pSndFile || !m_nInstrument || !m_pSndFile->Headers[m_nInstrument]) + return; + + if(IsDlgButtonChecked(IDC_CHECK_PITCHTEMPOLOCK)) + { + + INSTRUMENTHEADER* penv = m_pSndFile->Headers[m_nInstrument]; + if(!penv) + return; + + //Checking to what value to put for the wPitchToTempoLock. + m_EditPitchTempoLock.EnableWindow(); + WORD ptl = penv->wPitchToTempoLock; + if(ptl == 0) + { + if(m_EditPitchTempoLock.GetWindowTextLength() > 0) + { + char buffer[7]; + m_EditPitchTempoLock.GetWindowText(buffer, 6); + ptl = atoi(buffer); + } + else + ptl = m_pSndFile->m_nDefaultTempo; + } + m_EditPitchTempoLock.SetWindowText(Stringify(ptl).c_str()); + //SetModified() comes with this. + } + else + { + m_EditPitchTempoLock.EnableWindow(FALSE); + if(m_pSndFile && m_nInstrument && m_pSndFile->Headers[m_nInstrument] && + m_pSndFile->Headers[m_nInstrument]->wPitchToTempoLock > 0) + { + BEGIN_CRITICAL(); + m_pSndFile->Headers[m_nInstrument]->wPitchToTempoLock = 0; + END_CRITICAL(); + m_pModDoc->SetModified(); + } + } +} + +void CCtrlInstruments::OnEnKillfocusEditPitchtempolock() +//------------------------------------------------------ +{ + if(!m_pSndFile || IsLocked()) return; + + char buffer[6]; + m_EditPitchTempoLock.GetWindowText(buffer, 5); + int ptlTempo = atoi(buffer); + bool changed = false; + + + if(ptlTempo < m_pSndFile->GetTempoMin()) + { + ptlTempo = m_pSndFile->GetTempoMin(); + changed = true; + } + if(ptlTempo > m_pSndFile->GetTempoMax()) + { + ptlTempo = m_pSndFile->GetTempoMax(); + changed = true; + + } + + if(changed) m_EditPitchTempoLock.SetWindowText(Stringify(ptlTempo).c_str()); +} Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2006-08-20 20:29:31 UTC (rev 165) @@ -78,6 +78,10 @@ CSpinButtonCtrl m_SpinAttack; // -! NEW_FEATURE#0027 + //Pitch/Tempo lock + CEdit m_EditPitchTempoLock; + CButton m_CheckPitchTempoLock; + public: CCtrlInstruments(); virtual ~CCtrlInstruments(); @@ -144,6 +148,9 @@ afx_msg void OnEditSampleMap(); afx_msg void TogglePluginEditor(); //rewbs.instroVSTi afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys + afx_msg void OnEnChangeEditPitchtempolock(); + afx_msg void OnBnClickedCheckPitchtempolock(); + afx_msg void OnEnKillfocusEditPitchtempolock(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -64,6 +64,7 @@ ON_COMMAND(IDC_PATINSTROPLUGGUI2, ToggleSplitPluginEditor) //rewbs.instroVST ON_EN_CHANGE(IDC_EDIT_SPACING, OnSpacingChanged) ON_EN_CHANGE(IDC_EDIT_PATTERNNAME, OnPatternNameChanged) + ON_EN_KILLFOCUS(IDC_EDIT_ORDERLIST_MARGINS, OnOrderListMarginsChanged) ON_UPDATE_COMMAND_UI(IDC_PATTERN_RECORD,OnUpdateRecord) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText) //}}AFX_MSG_MAP @@ -85,8 +86,10 @@ DDX_Control(pDX, IDC_COMBO_OCTAVEMODIFIER, m_CbnOctaveModifier); DDX_Control(pDX, IDC_COMBO_SPLITVOLUME, m_CbnSplitVolume); DDX_Control(pDX, IDC_EDIT_SPACING, m_EditSpacing); + DDX_Control(pDX, IDC_EDIT_ORDERLIST_MARGINS,m_EditOrderListMargins); DDX_Control(pDX, IDC_EDIT_PATTERNNAME, m_EditPatName); DDX_Control(pDX, IDC_SPIN_SPACING, m_SpinSpacing); + DDX_Control(pDX, IDC_SPIN_ORDERLIST_MARGINS,m_SpinOrderListMargins); DDX_Control(pDX, IDC_SPIN_INSTRUMENT, m_SpinInstrument); DDX_Control(pDX, IDC_TOOLBAR1, m_ToolBar); //}}AFX_DATA_MAP @@ -157,13 +160,18 @@ // Special edit controls -> tab switch to view m_EditSpacing.SetParent(this); m_EditPatName.SetParent(this); + m_EditPatName.SetLimitText(MAX_PATTERNNAME); + m_EditOrderListMargins.SetParent(this); + m_EditOrderListMargins.SetLimitText(3); // Spin controls m_SpinSpacing.SetRange(0, 16); + m_SpinSpacing.SetPos(CMainFrame::gnPatternSpacing); m_SpinInstrument.SetRange(-1, 1); m_SpinInstrument.SetPos(0); - m_SpinSpacing.SetPos(CMainFrame::gnPatternSpacing); - m_EditPatName.SetLimitText(MAX_PATTERNNAME); + m_SpinOrderListMargins.SetRange(0, m_OrderList.GetShownOrdersMax()); + m_SpinOrderListMargins.SetPos(m_OrderList.GetOrderlistMargins()); SetDlgItemInt(IDC_EDIT_SPACING, CMainFrame::gnPatternSpacing); + SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, m_OrderList.GetOrderlistMargins()); CheckDlgButton(IDC_PATTERN_FOLLOWSONG, !(CMainFrame::m_dwPatternSetup & PATTERN_FOLLOWSONGOFF)); //rewbs.noFollow - set to unchecked m_OrderList.SetFocus(); @@ -240,6 +248,7 @@ { m_OrderList.SetWindowPos(NULL, 0,0, cx, cy, SWP_NOMOVE|SWP_NOZORDER|SWP_DRAWFRAME); } + OnOrderListMarginsChanged(); } } @@ -410,6 +419,7 @@ SendViewMessage(VIEWMSG_PATTERNLOOP, (SONG_PATTERNLOOP & m_pSndFile->m_dwSongFlags)); } OnSpacingChanged(); + OnOrderListMarginsChanged(); //mimicry SendViewMessage(VIEWMSG_SETSPLITINSTRUMENT, m_nSplitInstrument); SendViewMessage(VIEWMSG_SETSPLITNOTE, m_nSplitNote); @@ -580,6 +590,7 @@ if (m_hWndView) { OnSpacingChanged(); + OnOrderListMarginsChanged(); //mimicry... if (m_bRecord) SendViewMessage(VIEWMSG_SETRECORD, m_bRecord); CChildFrame *pFrame = (CChildFrame *)GetParentFrame(); @@ -664,6 +675,24 @@ } +void CCtrlPatterns::OnOrderListMarginsChanged() +//--------------------------------------------- +{ + BYTE i; + BYTE maxOrders = m_OrderList.GetShownOrdersMax(); + if((m_EditOrderListMargins.m_hWnd) && (m_EditOrderListMargins.GetWindowTextLength() > 0)) + { + i = m_OrderList.SetOrderlistMargins(GetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS)); + } + else + { + i = m_OrderList.GetOrderlistMargins(); + } + + m_SpinOrderListMargins.SetRange(0, maxOrders); + SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, i); + +} void CCtrlPatterns::OnSpacingChanged() //------------------------------------ { Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2006-08-20 20:29:31 UTC (rev 165) @@ -12,6 +12,11 @@ HFONT m_hFont; COLORREF colorText, colorTextSel; int m_cxFont, m_cyFont, m_nXScroll, m_nScrollPos, m_nDropPos; + //m_nXScroll : The order at the beginning of shown orderlist? + //m_nScrollPos: The same as order? + BYTE m_nOrderlistMargins; + //To tell how many orders('orderboxes') to show at least + //on both sides of current order(when updating orderslist position). UINT m_nDragOrder; BOOL m_bScrolling, m_bDragging, m_bShift; CModDoc *m_pModDoc; @@ -32,6 +37,9 @@ BOOL UpdateScrollInfo(); void UpdateInfoText(); int GetFontWidth(); + BYTE SetOrderlistMargins(int); //Returns the number that was set. + BYTE GetOrderlistMargins() const {return m_nOrderlistMargins;} + BYTE GetShownOrdersMax(); //Should return the maximum number of shown orders. public: //{{AFX_VIRTUAL(COrderList) @@ -98,8 +106,8 @@ // -> DESC="midi keyboard split" CComboBox m_CbnSplitInstrument,m_CbnSplitNote,m_CbnOctaveModifier,m_CbnSplitVolume; // -! NEW_FEATURE#0012 - CPatEdit m_EditSpacing, m_EditPatName; - CSpinButtonCtrl m_SpinInstrument, m_SpinSpacing; + CPatEdit m_EditSpacing, m_EditPatName, m_EditOrderListMargins; + CSpinButtonCtrl m_SpinInstrument, m_SpinSpacing, m_SpinOrderListMargins; CModControlBar m_ToolBar; UINT m_nInstrument, m_nDetailLevel; BOOL m_bRecord, m_bVUMeters, m_bPluginNames; @@ -171,6 +179,7 @@ afx_msg void OnNextInstrument(); afx_msg void OnSpacingChanged(); afx_msg void OnPatternNameChanged(); + afx_msg void OnOrderListMarginsChanged(); afx_msg void OnSetupZxxMacros(); afx_msg void OnChordEditor(); afx_msg void OnDetailLo(); Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -67,7 +67,8 @@ m_pParent = NULL; m_cxFont = m_cyFont = 0; m_pModDoc = NULL; - m_nScrollPos = m_nXScroll = 0; + m_nScrollPos = m_nXScroll = 0; + m_nOrderlistMargins = 2; m_bScrolling = FALSE; m_bDragging = FALSE; m_bShift = FALSE; @@ -151,6 +152,16 @@ } +BYTE COrderList::GetShownOrdersMax() +//---------------------------------- +{ + CRect rcClient; + GetClientRect(&rcClient); + if(m_cxFont>0) return static_cast<BYTE>(rcClient.right / m_cxFont); + else return static_cast<BYTE>(rcClient.right / GetFontWidth()); +} + + BOOL COrderList::SetCurSel(int sel, BOOL bEdit) //--------------------------------------------- { @@ -164,18 +175,18 @@ m_nScrollPos = sel; if (!m_bScrolling) { - if ((m_nScrollPos < m_nXScroll) || (!m_cxFont) || (!m_cyFont)) + if ((m_nScrollPos < m_nXScroll+m_nOrderlistMargins) || (!m_cxFont) || (!m_cyFont)) { - m_nXScroll = m_nScrollPos; + m_nXScroll = max(0, m_nScrollPos - m_nOrderlistMargins); SetScrollPos(SB_HORZ, m_nXScroll); InvalidateRect(NULL, FALSE); } else { - int maxsel = (rcClient.right / m_cxFont); + int maxsel = GetShownOrdersMax(); if (maxsel) maxsel--; - if (m_nScrollPos - m_nXScroll >= maxsel) + if (m_nScrollPos - m_nXScroll >= maxsel-m_nOrderlistMargins) { - m_nXScroll = m_nScrollPos - maxsel; + m_nXScroll = m_nScrollPos - (maxsel-m_nOrderlistMargins); SetScrollPos(SB_HORZ, m_nXScroll); InvalidateRect(NULL, FALSE); } @@ -243,7 +254,8 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - for (int i=0; i<MAX_ORDERS-1; i++) if (pSndFile->Order[i+1] == 0xFF) break; + int i = 0; + for (i=0; i<MAX_ORDERS-1; i++) if (pSndFile->Order[i+1] == 0xFF) break; SetCurSel(i); } break; @@ -434,6 +446,7 @@ GetClientRect(&rcClient); rect = rcClient; int nIndex = m_nXScroll; + //Scrolling the shown orders(the showns rectangles)? while (rect.left < rcClient.right) { BOOL bHighLight = ((bFocus) && (nIndex == m_nScrollPos)) ? TRUE : FALSE; @@ -859,3 +872,24 @@ } return bCanDrop; } + + +BYTE COrderList::SetOrderlistMargins(int i) +//---------------------------------------------- +{ + const BYTE maxOrders = GetShownOrdersMax(); + const BYTE maxMargins = (maxOrders % 2 == 0) ? maxOrders/2 - 1 : maxOrders/2; + //For example: If maximum is 4 orders -> maxMargins = 4/2 - 1 = 1; + //if maximum is 5 -> maxMargins = (int)5/2 = 2 + + if(i >= 0 && i < maxMargins) + { + m_nOrderlistMargins = static_cast<BYTE>(i); + } + else + { + if(i<0) m_nOrderlistMargins = 0; + else m_nOrderlistMargins = maxMargins; + } + return m_nOrderlistMargins; +} Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -194,7 +194,7 @@ } -POINT CViewPattern::GetPointFromPosition(DWORD dwPos) +POINT CViewPattern::GetPointFromPosition(DWORD dwPos) //--------------------------------------------------- { PCPATTERNFONT pfnt = GetCurrentPatternFont(); @@ -231,7 +231,8 @@ int xx = (pt.x - m_szHeader.cx) % GetColumnWidth(), dx = 0; int imax = 4; if (imax > (int)m_nDetailLevel+1) imax = m_nDetailLevel+1; - for (int i=0; i<imax; i++) + int i = 0; + for (i=0; i<imax; i++) { dx += pfnt->nEltWidths[i]; if (xx < dx) break; Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -279,6 +279,12 @@ _getdcwd(_getdrive(), wd, 255); m_csExecutablePath = wd; //Assume working dir is executable path at this stage. + //Relabs.note: m_csExecutablePath doesn't give right path + //at least for debug builds. + #ifdef DEBUG + m_csExecutablePath += "\\bin"; + #endif + m_bModTreeHasFocus = false; //rewbs.customKeys m_pNoteMapHasFocus = NULL; //rewbs.customKeys m_bOptionsLocked = false; //rewbs.customKeys @@ -1607,18 +1613,18 @@ UINT uVerLength; if (!(::GetFileVersionInfo((LPTSTR)szFullPath, (DWORD)dwVerHnd, (DWORD)dwVerInfoSize, (LPVOID)pVersionInfo))) { - delete pVersionInfo; + delete[] pVersionInfo; return 0; } if (!(::VerQueryValue(pVersionInfo, TEXT("\\StringFileInfo\\040904b0\\FileVersion"), (LPVOID*)&szVer, &uVerLength))) { - delete pVersionInfo; + delete[] pVersionInfo; return 0; } //version will be like: 1, 17, 2, 38 CString version = szVer; - delete pVersionInfo; + delete[] pVersionInfo; int v1, v2, v3, v4; sscanf(version, "%x, %x, %x, %x", &v1, &v2, &v3, &v4); @@ -1873,7 +1879,9 @@ } if (m_pSndFile) { - m_pSndFile->LoopPattern(-1); + //m_pSndFile->LoopPattern(-1); + //Relabs.note: Commented above line - why loop should be disabled when pausing? + m_pSndFile->m_dwSongFlags &= ~SONG_PAUSED; if (m_pSndFile == &m_WaveFile) { m_pSndFile = NULL; Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -1069,7 +1069,7 @@ fwrite(&zero, 1, 1, f); list.filesize++; } - delete pszComments; + delete[] pszComments; } } for (UINT iCmt=0; iCmt<=6; iCmt++) Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -107,7 +107,6 @@ // -> DESC="channels management dlg" ReinitRecordState(); // -! NEW_FEATURE#0015 - } @@ -132,6 +131,7 @@ //--------------------------- { if (!CDocument::OnNewDocument()) return FALSE; + m_SndFile.Create(NULL, this, 0); m_SndFile.m_nType = CTrackApp::GetDefaultDocType(); @@ -349,6 +349,13 @@ // -> DESC="channels management dlg" ReinitRecordState(); // -! NEW_FEATURE#0015 + if (m_SndFile.m_dwLastSavedWithVersion>CMainFrame::GetFullVersionNumeric()) { + char s[256]; + wsprintf(s, "Warning: this song was last saved with a more recent version of OpenMPT.\r\nSong saved with: v%s. Current version: v%s.\r\n", + CMainFrame::GetVersionString(m_SndFile.m_dwLastSavedWithVersion), + CMainFrame::GetFullVersionString()); + ::AfxMessageBox(s); + } SetModifiedFlag(FALSE); // (bModified); m_bHasValidPath=true; @@ -364,7 +371,7 @@ CHAR fext[_MAX_EXT]=""; UINT nType = m_SndFile.m_nType, dwPacking = 0; BOOL bOk = FALSE; - + m_SndFile.m_dwLastSavedWithVersion=CMainFrame::GetFullVersionNumeric(); if (!lpszPathName) return FALSE; _splitpath(lpszPathName, NULL, NULL, NULL, fext); if (!lstrcmpi(fext, ".mod")) nType = MOD_TYPE_MOD; else @@ -558,7 +565,6 @@ { SetModified(FALSE); m_bHasValidPath=true; - m_SndFile.m_dwLastSavedWithVersion=CMainFrame::GetFullVersionNumeric(); return TRUE; } else { @@ -693,7 +699,7 @@ { strcpy(p, m_lpszLog); strcat(p, lpszLog); - delete m_lpszLog; + delete[] m_lpszLog; m_lpszLog = p; } } else @@ -710,7 +716,7 @@ { if (m_lpszLog) { - delete m_lpszLog; + delete[] m_lpszLog; m_lpszLog = NULL; } return TRUE; @@ -1406,6 +1412,9 @@ if(!wsdlg.m_bChannelMode || !(flags[i] & CHN_MUTE)){ // rewbs.fix3239 m_SndFile.SetCurrentPos(0); + //Relabs.note: Since I removed pattern loop disabling from certain + //methods, making sure that pattern loop is off. + m_SndFile.m_dwSongFlags &= ~SONG_PATTERNLOOP; if (wsdlg.m_bSelectPlay) { m_SndFile.SetCurrentOrder(wsdlg.m_nMinOrder); m_SndFile.m_nCurrentPattern = wsdlg.m_nMinOrder; @@ -1477,6 +1486,9 @@ bplaying = TRUE; pMainFrm->PauseMod(); m_SndFile.SetCurrentPos(0); + + m_SndFile.m_dwSongFlags &= ~SONG_PATTERNLOOP; + // Saving file PTAGID3INFO pTag = (wsdlg.m_bSaveInfoField) ? &wsdlg.m_id3tag : NULL; CDoAcmConvert dwcdlg(&m_SndFile, s, &wfx.wfx, hadid, pTag, pMainFrm); @@ -1580,9 +1592,9 @@ if (pMainFrm) { CChildFrame *pChildFrm = (CChildFrame *) GetChildFrame(); - if (strcmp("CViewPattern", pChildFrm->GetCurrentViewClassName()) == 0) // Relabsoluness.note: Using existing 'dirty HACK' + if (strcmp("CViewPattern", pChildFrm->GetCurrentViewClassName()) == 0) { - //Relabsoluness.note: User has sent play song command: set loop pattern checkbox to false. + //User has sent play song command: set loop pattern checkbox to false. pChildFrm->SendViewMessage(VIEWMSG_PATTERNLOOP, 0); } @@ -1604,7 +1616,9 @@ m_SndFile.ResumePlugins(); } END_CRITICAL(); - m_SndFile.m_dwSongFlags &= ~(SONG_STEP|SONG_PAUSED); + //m_SndFile.m_dwSongFlags &= ~(SONG_STEP|SONG_PAUSED); + //Relabs.note: Added SONG_PATTERNLOOP. + m_SndFile.m_dwSongFlags &= ~(SONG_STEP|SONG_PAUSED|SONG_PATTERNLOOP); pMainFrm->PlayMod(this, m_hWndFollow, m_dwNotifyType); } } @@ -1679,7 +1693,9 @@ pMainFrm->PauseMod(); - m_SndFile.m_dwSongFlags &= ~SONG_STEP; + //m_SndFile.m_dwSongFlags &= ~SONG_STEP; + //Relabs.hack: Added SONG_PATTERNLOOP + m_SndFile.m_dwSongFlags &= ~(SONG_STEP|SONG_PATTERNLOOP); m_SndFile.SetCurrentPos(0); pMainFrm->ResetElapsedTime(); BEGIN_CRITICAL(); @@ -2061,7 +2077,8 @@ BOOL bSupported; int fxndx = -1; pszDescription[0] = 0; - for (UINT i=0; i<MAX_FXINFO; i++) + UINT i = 0; + for (i=0; i<MAX_FXINFO; i++) { if ((command == gFXInfo[i].dwEffect) // Effect && ((param & gFXInfo[i].dwParamMask) == gFXInfo[i].dwParamValue)) // Value @@ -2837,6 +2854,8 @@ { pSndFile->Chn[i].dwFlags |= CHN_NOTEFADE | CHN_KEYOFF; } + if ((nOrd < MAX_PATTERNS) && (pSndFile->Order[nOrd] == nPat)) pSndFile->m_nCurrentPattern = pSndFile->m_nNextPattern = nOrd; + //Relabs.note: Some jumps occured when using pattern play and loop pattern checkbox - above line hopefully fixes it. pSndFile->m_dwSongFlags &= ~(SONG_PAUSED|SONG_STEP); pSndFile->LoopPattern(nPat); pSndFile->m_nNextRow = nRow; @@ -3041,7 +3060,8 @@ if (macroType==sfx_plug && MacroToPlugParam(macroText)==paramToUse) { CString message; message.Format("Param %d can already be controlled with macro %X", paramToUse, checkMacro); - ::MessageBox(NULL,message, "Macro exists for this param",MB_ICONINFORMATION | MB_OK); + CMainFrame::GetMainFrame()->MessageBox(message, "Macro exists for this param",MB_ICONINFORMATION | MB_OK); + //Relabs.expl: Modified to prevent notification box go 'under' ompt to block key messages. return; } } Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -56,7 +56,8 @@ } // Resizing all patterns to 64 rows UINT nPatCvt = 0; - for (UINT i=0; i<MAX_PATTERNS; i++) if ((m_SndFile.Patterns[i]) && (m_SndFile.PatternSize[i] != 64)) + UINT i = 0; + for (i=0; i<MAX_PATTERNS; i++) if ((m_SndFile.Patterns[i]) && (m_SndFile.PatternSize[i] != 64)) { if (m_SndFile.PatternSize[i] < 64) { @@ -424,7 +425,8 @@ { UINT nRemainingChannels = 0; //First calculating how many channels are to be left - for(UINT i = 0; i<m_SndFile.m_nChannels; i++) + UINT i = 0; + for(i = 0; i<m_SndFile.m_nChannels; i++) { if(!m_bChnMask[i]) nRemainingChannels++; } @@ -439,7 +441,7 @@ BeginWaitCursor(); BEGIN_CRITICAL(); - for (UINT i=0; i<MAX_PATTERNS; i++) if (m_SndFile.Patterns[i]) + for (i=0; i<MAX_PATTERNS; i++) if (m_SndFile.Patterns[i]) { MODCOMMAND *p = m_SndFile.Patterns[i]; MODCOMMAND *newp = CSoundFile::AllocatePattern(m_SndFile.PatternSize[i], nRemainingChannels); @@ -623,7 +625,8 @@ memset(pPatterns, 0, sizeof(pPatterns)); for (UINT irst=0; irst<MAX_PATTERNS; irst++) nPatMap[irst] = 0xFFFF; nPats = 0; - for (UINT imap=0; imap<MAX_ORDERS; imap++) + UINT imap = 0; + for (imap=0; imap<MAX_ORDERS; imap++) { UINT n = m_SndFile.Order[imap]; if (n < MAX_PATTERNS) @@ -1131,7 +1134,8 @@ //------------------------------------------------ { UINT maxpat = (m_SndFile.m_nType & MOD_TYPE_MOD) ? 128 : MAX_PATTERNS; - for (UINT i=0; i<maxpat; i++) + UINT i = 0; + for (i=0; i<maxpat; i++) { if (!m_SndFile.Patterns[i]) break; } @@ -1172,7 +1176,8 @@ LONG CModDoc::InsertSample(BOOL bLimit) //------------------------------------- { - for (UINT i=1; i<=m_SndFile.m_nSamples; i++) + UINT i = 1; + for (i=1; i<=m_SndFile.m_nSamples; i++) { if ((!m_SndFile.m_szNames[i][0]) && (m_SndFile.Ins[i].pSample == NULL)) { @@ -2071,7 +2076,7 @@ { for (UINT i=0; i<MAX_UNDO_LEVEL; i++) { - if (PatternUndo[i].pbuffer) delete PatternUndo[i].pbuffer; + if (PatternUndo[i].pbuffer) delete[] PatternUndo[i].pbuffer; PatternUndo[i].cx = 0; PatternUndo[i].cy = 0; PatternUndo[i].pbuffer = NULL; @@ -2110,7 +2115,7 @@ bUpdate = (PatternUndo[0].pbuffer) ? FALSE : TRUE; if (PatternUndo[MAX_UNDO_LEVEL-1].pbuffer) { - delete PatternUndo[MAX_UNDO_LEVEL-1].pbuffer; + delete[] PatternUndo[MAX_UNDO_LEVEL-1].pbuffer; PatternUndo[MAX_UNDO_LEVEL-1].pbuffer = NULL; } for (UINT i=MAX_UNDO_LEVEL-1; i>=1; i--) @@ -2172,7 +2177,7 @@ pUndo += PatternUndo[0].cx; } } - delete PatternUndo[0].pbuffer; + delete[] PatternUndo[0].pbuffer; for (UINT i=0; i<MAX_UNDO_LEVEL-1; i++) { PatternUndo[i] = PatternUndo[i+1]; Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -1158,12 +1158,12 @@ } if (m_lpRotoZoom) { - delete m_lpRotoZoom; + delete[] m_lpRotoZoom; m_lpRotoZoom = NULL; } if (m_lpCopy) { - delete m_lpCopy; + delete[] m_lpCopy; m_lpCopy = NULL; } } Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -457,7 +457,8 @@ UINT nParams = pVstPlugin->GetNumParameters(); m_CbnParam.SetRedraw(FALSE); m_CbnParam.ResetContent(); - for (UINT i=0; i<nParams; i++) + UINT i = 0; + for (i=0; i<nParams; i++) { pVstPlugin->GetParamName(i, sname, sizeof(sname)); wsprintf(s, "%02X: %s", i|0x80, sname); Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -2243,7 +2243,8 @@ penv->VolEnv[0] = 64; penv->nVolEnv = 1; } - for (UINT i=0; i<penv->nVolEnv; i++) if (nTick <= penv->VolPoints[i]) break; + UINT i = 0; + for (i=0; i<penv->nVolEnv; i++) if (nTick <= penv->VolPoints[i]) break; for (UINT j=penv->nVolEnv; j>i; j--) { penv->VolPoints[j] = penv->VolPoints[j-1]; @@ -2269,7 +2270,8 @@ penv->PanEnv[0] = 32; penv->nPanEnv = 1; } - for (UINT i=0; i<penv->nPanEnv; i++) if (nTick <= penv->PanPoints[i]) break; + UINT i = 0; + for (i=0; i<penv->nPanEnv; i++) if (nTick <= penv->PanPoints[i]) break; for (UINT j=penv->nPanEnv; j>i; j--) { penv->PanPoints[j] = penv->PanPoints[j-1]; @@ -2295,7 +2297,8 @@ penv->PitchEnv[0] = 32; penv->nPitchEnv = 1; } - for (UINT i=0; i<penv->nPitchEnv; i++) if (nTick <= penv->PitchPoints[i]) break; + UINT i = 0; + for (i=0; i<penv->nPitchEnv; i++) if (nTick <= penv->PitchPoints[i]) break; for (UINT j=penv->nPitchEnv; j>i; j--) { penv->PitchPoints[j] = penv->PitchPoints[j-1]; Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2006-08-16 23:47:38 UTC (rev 164) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2006-08-20 20:29:31 UTC (rev 165) @@ -10,7 +10,7 @@ #include "dlsbank.h" #include "EffectVis.h" //rewbs.fxvis #include "OpenGLEditor.h" //rewbs.fxvis -#include "PatternGotoDialog.h" +#include "PatternGotoDialog.h" #include "PatternRandomizer.h" #include ".\arrayutils.h" #include ".\view_pat.h" @@ -63,7 +63,7 @@ // -> DESC="midi keyboard split" ON_COMMAND(ID_EDIT_SPLITRECSELECT, OnSplitRecordSelect) // -! NEW_FEATURE#0012 - ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) + ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) ON_COMMAND(ID_PATTERN_MUTE, OnMuteFromClick) //rewbs.customKeys ON_COMMAND(ID_PATTERN_SOLO, OnSoloFromClick) //rewbs.customKeys ON_COMMAND(ID_PATTERN_TRANSITIONMUTE, OnTogglePendingMuteFromClick) @@ -187,6 +187,8 @@ pSndFile->PatternSize[npat] = 64; pSndFile->Patterns[npat] = CSoundFile::AllocatePattern(64, pSndFile->m_nChannels); } + + bUpdateScroll = FALSE; m_nPattern = npat; if ((nrow >= 0) && (nrow != (int)m_nRow) && (nrow < (int)pSndFile->PatternSize[m_nPattern])) @@ -200,12 +202,12 @@ UpdateSizes(); UpdateScrollSize(); UpdateIndicator(); - + if (m_bWholePatternFitsOnScreen) //rewbs.scrollFix SetScrollPos(SB_VERT, 0); else if (bUpdateScroll) //rewbs.fix3147 SetScrollPos(SB_VERT, m_nRow * GetColumnHeight()); - + UpdateScrollPos(); InvalidatePattern(TRUE); SendCtrlMessage(CTRLMSG_PATTERNCHANGED, m_nPattern); @@ -223,7 +225,7 @@ pSndFile = pModDoc->GetSoundFile(); CRect rect; UINT yofs = GetYScrollPos(); - + if ((bWrap) && (pSndFile->PatternSize[m_nPattern])) { if ((int)row < (int)0) @@ -331,14 +333,14 @@ SetCurSel(sel0, sel); UpdateIndicator(); - Log("Row: %d; Chan: %d; ColType: %d; cursor&0xFFFF: %x; cursor>>16: %x;\n", - GetRowFromCursor(sel0), + Log("Row: %d; Chan: %d; ColType: %d; cursor&0xFFFF: %x; cursor>>16: %x;\n", + GetRowFromCursor(sel0), GetChanFromCursor(sel0), GetColTypeFromCursor(sel0), (int)(sel0&0xFFFF), (int)(sel0>>16)); - + return TRUE; } @@ -457,7 +459,7 @@ CModDoc *pModDoc = GetDocument(); int yofs = GetYScrollPos(), xofs = GetXScrollPos(); int row, col; - + if ((!pModDoc) || (!m_szCell.cy)) return FALSE; GetClientRect(&rect); pSndFile = pModDoc->GetSoundFile(); @@ -570,28 +572,28 @@ { //rewbs.customKeys //We handle keypresses before Windows has a chance to handle them (for alt etc..) - if ((pMsg->message == WM_SYSKEYUP) || (pMsg->message == WM_KEYUP) || + if ((pMsg->message == WM_SYSKEYUP) || (pMsg->message == WM_KEYUP) || (pMsg->message == WM_SYSKEYDOWN) || (pMsg->message == WM_KEYDOWN)) { CInputHandler* ih = (CMainFrame::GetMainFrame())->GetInputHandler(); - + //Translate message manually UINT nChar = pMsg->wParam; UINT nRepCnt = LOWORD(pMsg->lParam); UINT nFlags = HIWORD(pMsg->lParam); KeyEventType kT = ih->GetKeyEventType(nFlags); InputTargetContext ctx = (InputTargetContext)(kCtxViewPatterns+1 + (m_dwCursor & 0x07)); - + if (ih->KeyEvent(ctx, nChar, nRepCnt, nFlags, kT) != kcNull) { return true; // Mapped to a command, no need to pass message on. - } + } //HACK: fold kCtxViewPatternsFX and kCtxViewPatternsFXparam so that all commands of 1 are active in the other - else { + else { if (ctx==kCtxViewPatternsFX) { if (ih->KeyEvent(kCtxViewPatternsFXparam, nChar, nRepCnt, nFlags, kT) != kcNull) { return true; // Mapped to a command, no need to pass message on. } - } + } if (ctx==kCtxViewPatternsFXparam) { if (ih->KeyEvent(kCtxViewPatternsFX, nChar, nRepCnt, nFlags, kT) != kcNull) { return true; // Mapped to a command, no need to pass message on. @@ -601,9 +603,9 @@ //end HACK. } //end rewbs.customKeys - + } - + return CModScrollView::PreTranslateMessage(pMsg); } @@ -615,7 +617,7 @@ //---------------------------- { if (m_pEffectVis) { - m_pEffectVis->DoClose(); + m_pEffectVis->DoClose(); delete m_pEffectVis; m_pEffectVis = NULL; } @@ -638,7 +640,7 @@ } if (m_pOpenGLEditor) { - m_pOpenGLEditor->DoClose(); + m_pOpenGLEditor->DoClose(); delete m_pOpenGLEditor; m_pOpenGLEditor = NULL; } @@ -667,13 +669,13 @@ //------------------------------------------- { CScrollView::OnKillFocus(pNewWnd); - + //rewbs.customKeys //Unset all selection m_dwStatus &= ~PATSTATUS_KEYDRAGSEL; m_dwStatus &= ~PATSTATUS_CTRLDRAGSEL; // CMainFrame::GetMainFrame()->GetInputHandler()->SetModifierMask(0); - //end rewbs.customKeys + //end rewbs.customKeys m_dwStatus &= ~PATSTATUS_FOCUS; InvalidateRow(); @@ -689,7 +691,7 @@ MODCOMMAND *p = pSndFile->Patterns[m_nPattern]; if (!p) return; BeginWaitCursor(); - + DWORD startSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16))?m_dwBeginSel:m_dwEndSel; DWORD endSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16))?m_dwEndSel:m_dwBeginSel; pModDoc->PrepareUndo(m_nPattern, 0, 0, pSndFile->m_nChannels, pSndFile->PatternSize[m_nPattern]); @@ -743,7 +745,7 @@ DWORD startSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16))?m_dwBeginSel:m_dwEndSel; DWORD endSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16))?m_dwEndSel:m_dwBeginSel; pModDoc->PrepareUndo(m_nPattern, 0, 0, pSndFile->m_nChannels, pSndFile->PatternSize[m_nPattern]); - + int finalDest = (startSel>>16)+((endSel>>16)-(startSel>>16))/2; for (int row=(startSel>>16)+1; row<=finalDest; row++) @@ -801,46 +803,51 @@ //----------------------------------------------------------- { CModDoc *pModDoc = GetDocument(); - if (!pModDoc || !(m_dwStatus&PATSTATUS_RECORD)) return; + if (!pModDoc || !(IsEditingEnabled_bmsg())) return; CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *p = pSndFile->Patterns[m_nPattern]; if (!p) return; + BeginWaitCursor(); + + if(ITStyle && GetColTypeFromCursor(m_dwEndSel) == NOTE_COLUMN) m_dwEndSel += 1; + //If selection ends to a note column, in ITStyle extending it to instrument column since the instrument data is + //removed with note data. + PrepareUndo(m_dwBeginSel, m_dwEndSel); DWORD tmp = m_dwEndSel; for (UINT row=(m_dwBeginSel >> 16); row<=(m_dwEndSel >> 16); row++) { // for all selected rows for (UINT i=(m_dwBeginSel & 0xFFFF); i<=(m_dwEndSel & 0xFFFF); i++) if ((i & 7) < 5) { // for all selected cols - + UINT chn = i >> 3; if ((chn >= pSndFile->m_nChannels) || (row >= pSndFile->PatternSize[m_nPattern])) continue; MODCOMMAND *m = &p[row * pSndFile->m_nChannels + chn]; - switch(i & 7) { case 0: // Clear note if (rm.note) { - m->note = 0; + m->note = 0; if (ITStyle) m->instr = 0; } break; case 1: // Clear instrument if (rm.instrument) { - m->instr = 0; + m->instr = 0; } break; case 2: // Clear volume if (rm.volume) { - m->volcmd = m->vol = 0; + m->volcmd = m->vol = 0; } - break; - case 3: // Clear Command + break; + case 3: // Clear Command if (rm.command) { m->command = 0; } break; case 4: // Clear Command Param if (rm.parameter) { - m->param = 0; + m->param = 0; } break; } //end switch @@ -882,8 +889,8 @@ //------------------------------ { CModDoc *pModDoc = GetDocument(); - - if (pModDoc && m_dwStatus&PATSTATUS_RECORD) + + if (pModDoc && IsEditingEnabled_bmsg()) { pModDoc->PastePattern(m_nPattern, m_dwBeginSel, false); InvalidatePattern(FALSE); @@ -896,8 +903,8 @@ //------------------------------ { CModDoc *pModDoc = GetDocument(); - - if (pModDoc && m_dwStatus&PATSTATUS_RECORD) + + if (pModDoc && IsEditingEnabled_bmsg()) { pModDoc->PastePattern(m_nPattern, m_dwBeginSel, true); InvalidatePattern(FALSE); @@ -909,8 +916,8 @@ //---------------------------------------- { CModDoc *pModDoc = GetDocument(); - - if (pModDoc && m_dwStatus&PATSTATUS_RECORD) + + if (pModDoc && IsEditingEnabled_bmsg() ) { pModDoc->PastePattern(m_nPattern, m_dwBeginSel, true, true); InvalidatePattern(FALSE); @@ -1046,7 +1053,7 @@ pModDoc->Record1Channel(nItemNo); InvalidateChannelsHeaders(); } - } + } else if (!(nFlags&MK_CONTROL)) { pModDoc->MuteChannel(nItemNo, (pSndFile->ChnSettings[nItemNo].dwFlags & CHN_MUTE) ? FALSE : TRUE); } @@ -1088,7 +1095,7 @@ HMENU hMenu; // Too far left to get a ctx menu: - if ((!pModDoc) || (pt.x < m_szHeader.cx)) { + if ((!pModDoc) || (pt.x < m_szHeader.cx)) { return; } @@ -1116,7 +1123,7 @@ pSndFile = pModDoc->GetSoundFile(); m_nMenuParam = GetPositionFromPoint(pt); - + // Right-click outside selection? Reposition cursor to the new location if (((m_nMenuParam >> 16) < (m_dwBeginSel >> 16)) || ((m_nMenuParam >> 16) > (m_dwEndSel >> 16)) @@ -1443,7 +1450,7 @@ CSoundFile *pSndFile; UINT row, maxrow; - if (!pModDoc || !(m_dwStatus&PATSTATUS_RECORD)) return; + if (!pModDoc || !( IsEditingEnabled_bmsg() )) return; pSndFile = pModDoc->GetSoundFile(); if (!pSndFile->Patterns[m_nPattern]) return; row = m_dwBeginSel >> 16; @@ -1509,7 +1516,7 @@ CSoundFile *pSndFile; UINT row, maxrow; - if (!pModDoc || !(m_dwStatus&PATSTATUS_RECORD)) return; + if (!pModDoc || !(IsEditingEnabled_bmsg())) return; pSndFile = pModDoc->GetSoundFile(); if (!pSndFile->Patterns[m_nPattern]) return; row = m_dwBeginSel >> 16; @@ -1556,7 +1563,7 @@ maxrow = pSndFile->PatternSize[m_nPattern]; colmin = (m_dwBeginSel & 0xFFFF) >> 3; colmax = (m_dwEndSel & 0xFFFF) >> 3; - + InsertRows(colmin, colmax); } //end rewbs.customKeys @@ -1629,16 +1636,16 @@ CSoundFile* pSndFile = pModDoc->GetSoundFile(); UINT nCurrentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); UINT nCurrentChannel = ((m_dwCursor & 0xFFFF) >> 3) + 1; - + m_pGotoWnd->UpdatePos(m_nRow, nCurrentChannel, m_nPattern, nCurrentOrder, pSndFile); if (m_pGotoWnd->DoModal() == IDOK) { //Position should be valididated. - + if (m_pGotoWnd->m_nPattern != m_nPattern) { SetCurrentPattern(m_pGotoWnd->m_nPattern); } - + if (m_pGotoWnd->m_nOrder != nCurrentOrder) { SendCtrlMessage(CTRLMSG_SETCURRENTORDER, m_pGotoWnd->m_nOrder); } @@ -1951,7 +1958,7 @@ //rewbs.customKeys CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); - + if ((pModDoc) && (pMainFrm)) { PrepareUndo(m_dwBeginSel, m_dwEndSel); @@ -2007,7 +2014,7 @@ m_pRandomizer = new CPatternRandomizer(this); if (m_pRandomizer) { m_pRandomizer->showGUI(); - } + } } } } @@ -2076,7 +2083,7 @@ bool changed = false; CArray<UINT,UINT> validChans; - + if (type==EFFECT_COLUMN || type==PARAM_COLUMN) { CArray<UINT,UINT> moreValidChans; ListChansWhereColSelected(EFFECT_COLUMN, validChans); @@ -2099,11 +2106,11 @@ if (!IsInterpolationPossible(row0, row1, nchn, type, pSndFile)) { continue; //skip chans where interpolation isn't possible } - + if (!changed) { //ensure we save undo buffer only before any channels are interpolated PrepareUndo(m_dwBeginSel, m_dwEndSel); } - + int vsrc, vdest, vcmd, verr, distance; distance = row1 - row0; @@ -2134,9 +2141,9 @@ if (vdest < vsrc) verr = -verr; pcmd += row0 * pSndFile->m_nChannels + nchn; - + for (UINT i=0; i<=distance; i++, pcmd += pSndFile->m_nChannels) { - + switch(type) { case NOTE_COLUMN: if ((!pcmd->note) || (pcmd->instr == vcmd)) { @@ -2163,7 +2170,7 @@ ASSERT(false); } } - + changed=true; } //end for all channels where type is selected @@ -2221,7 +2228,7 @@ int x1, y1, x2, y2, c1, c2, xc1, xc2, xmc1, xmc2, ym1, ym2; int dx, dy, nChannels, nRows; - if ((pModDoc = GetDocument()) == NULL || !(m_dwStatus&PATSTATUS_RECORD)) return; + if ((pModDoc = GetDocument()) == NULL || !(IsEditingEnabled_bmsg())) return; pSndFile = pModDoc->GetSoundFile(); nChannels = pSndFile->m_nChannels; nRows = pSndFile->PatternSize[m_nPattern]; @@ -2256,7 +2263,7 @@ for (int c=0; c<4; c++) { int xsrc=x, ysrc=y, xc=x*4+c; - + // Destination is from destination selection if ((xc >= xmc1) && (xc <= xmc2) && (y >= ym1) && (y <= ym2)) { @@ -2284,9 +2291,12 @@ p++; } } + BEGIN_CRITICAL(); pSndFile->Patterns[m_nPattern] = pNewPattern; END_CRITICAL(); + + x1 += dx; x2 += dx; y1 += dy; @@ -2318,7 +2328,7 @@ BYTE nIns = static_cast<BYTE>(GetCurrentInstrument()); MODCOMMAND *p; BOOL bModified; - + if (!nIns) return; if ((pModDoc = GetDocument()) == NULL) return; pSndFile = pModDoc->GetSoundFile(); @@ -2338,7 +2348,6 @@ for (UINT c=startChan; c<endChan+1; c++) { 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||p->instr) && (p->instr!=nIns) ) { @@ -2394,11 +2403,11 @@ void CViewPattern::OnAddChannelFront() //------------------------------------ { - UINT nChn = ((m_nMenuParam&0xFFFF)>>3); + UINT nChn = GetChanFromCursor(m_nMenuParam); CModDoc *pModDoc = GetDocument(); CSoundFile* pSndFile; if (pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return; - + BeginWaitCursor(); //First adding channel as the last channel... if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1)) { @@ -2419,7 +2428,7 @@ void CViewPattern::OnAddChannelAfter() //------------------------------------ { - UINT nChn = ((m_nMenuParam&0xFFFF)>>3)+1; + UINT nChn = ((m_nMenuParam&0xFFFF)>>3)+1; CModDoc *pModDoc = GetDocument(); CSoundFile* pSndFile; if (pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return; @@ -2503,7 +2512,7 @@ //----------------------------- { CModDoc *pModDoc = GetDocument(); - if (pModDoc && m_dwStatus&PATSTATUS_RECORD) + if (pModDoc && IsEditingEnabled_bmsg()) { UINT nPat = pModDoc->DoUndo(); if (nPat < MAX_PATTERNS) @@ -2536,7 +2545,6 @@ if (pSndFile->Patterns[m_nPattern]) { MODCOMMAND *p = pSndFile->Patterns[m_nPattern]; - for (UINT j=0; j<pSndFile->m_nChannels; j++) { for (UINT i=0; i<pSndFile->PatternSize[m_nPattern]; i++) @@ -2571,8 +2579,8 @@ { chvol[j] = (BYTE)(pSndFile->Ins[nSmp].nVolume >> 2); break; - } - else + } + else { //nonexistant sample and no volume present in patten? assume volume=64. m->volcmd = VOLCMD_VOLUME; chvol[j] = 64; @@ -2677,14 +2685,14 @@ updateOrderList = true; m_nLastPlayedOrder = nOrd; } - + if (nRow < m_nLastPlayedRow) { InvalidateChannelsHeaders(); } m_nLastPlayedRow = nRow; if (pSndFile->m_dwSongFlags & (SONG_PAUSED|SONG_STEP)) return 0; - + //rewbs.toCheck: is it safe to remove this? What if a pattern has no order? /* if (pSndFile->m_dwSongFlags & SONG_PATTERNLOOP) @@ -2698,13 +2706,13 @@ nPat = pSndFile->Order[nOrd]; } */ - + if (pSndFile->Order[nOrd] != nPat) { //order doesn't correlate with pattern, so mark it as invalid - nOrd = 0xFFFF; + nOrd = 0xFFFF; } - if (m_pEffectVis && m_pEffectVis->m_hWnd) { + if (m_pEffectVis && m_pEffectVis->m_hWnd) { m_pEffectVis->SetPlayCursor(nPat, nRow); } @@ -2731,15 +2739,15 @@ SetPlayCursor(nPat, nRow); } - + } //Ends condition "if(pnotify->dwType & MPTNOTIFY_POSITION)" if ((pnotify->dwType & (MPTNOTIFY_VUMETERS|MPTNOTIFY_STOP)) && (m_dwStatus & PATSTATUS_VUMETERS)) { UpdateAllVUMeters(pnotify); } - + UpdateIndicator(); return 0; @@ -2791,20 +2799,20 @@ pRow->param = 0xF0 + (foundMacro&0x0F); InvalidateRow(); } - + } } - + //Write the data, but we only overwrite if the command is a macro anyway. if (pRow->command == 0 || pRow->command == CMD_SMOOTHMIDI || pRow->command == CMD_MIDI) { pRow->command = CMD_SMOOTHMIDI; pRow->param = value; InvalidateRow(); } - + } @@ -2816,7 +2824,8 @@ if ((!pModDoc) || (!pMainFrm)) return 0; -//Midi message from our perspective: +//Midi message from our perspective: +//NOTE: Velocity and Note data may actually consist of 7 bits, not 8 as said here. // +---------------------------+---------------------------+-------------+-------------+ //bit: | 24.23.22.21 | 20.19.18.17 | 16.15.14.13 | 12.11.10.09 | 08.07.06.05 | 04.03.02.01 | // +---------------------------+---------------------------+-------------+-------------+ @@ -2830,16 +2839,21 @@ //. We only handle note-on and note off events. //. Basing the event solely on the velocity as follows is incorrect, // since a note-off can have a velocity too: - // BYTE event = (dwMidiData>>16) & 0x64; + // BYTE event = (dwMidiData>>16) & 0x64; BYTE nNote = ((dwMidiData >> 8) & 0xFF) +1; // +1 is for MPT, where middle C is 61 BYTE nVol = (dwMidiData >> 16) & 0xFF; // At this stage nVol is a non linear value in [0;127] // Need to convert to linear in [0;64] - see below - BYTE event = dwMidiData & 0xF0; + BYTE event = dwMidiData & 0xF0; //Event 'contains' bits 08-05 (0xF0 == 11110000 in base 10) if ((event == 0x90) && !nVol) event = 0x80; //Convert event to note-off if req'd - + //Event nibble: 8 if Note Off, 9 is Note on. Don't care about other events ATM. - switch(event) + + + //NOTE: Midi in code should also be updated in view_smp.cpp and view_ins.cpp + //Should something be done to prevent need for code copy? + + switch(event) { case 0x80: // Note Off // The following method takes care of: @@ -2850,7 +2864,7 @@ case 0x90: // Note On if (CMainFrame::m_dwMidiSetup & MIDISETUP_RECORDVELOCITY) - { + { //Convert non linear value in [0;127] to linear value in [0;64]: nVol = (CDLSBank::DLSMidiVolumeToLinear(nVol)+1023) >> 10; //Amplify if requested: @@ -2861,14 +2875,14 @@ } else { //Use default volume - nVol = -1; + nVol = -1; } TempEnterNote(nNote, true, nVol); break; } - + return 0; } @@ -3162,17 +3176,17 @@ case kcPatternSnapUph2: CursorJump(CMainFrame::m_nRowSpacing2, true, true); return wParam; case kcPatternSnapDownh2Select: case kcPatternSnapDownh2: CursorJump(CMainFrame::m_nRowSpacing2, false, true); return wParam; - + case kcNavigateDownSelect: case kcNavigateDown: SetCurrentRow(m_nRow+1, TRUE); return wParam; case kcNavigateUpSelect: case kcNavigateUp: SetCurrentRow(m_nRow-1, TRUE); return wParam; - + case kcNavigateDownBySpacingSelect: case kcNavigateDownBySpacing: SetCurrentRow(m_nRow+m_nSpacing, TRUE); return wParam; case kcNavigateUpBySpacingSelect: case kcNavigateUpBySpacing: SetCurrentRow(m_nRow-m_nSpacing, TRUE); return wParam; - + case kcNavigateLeftSelect: case kcNavigateLeft: if ((CMainFrame::m_dwPatternSetup & PATTERN_WRAP) && (!m_dwCursor)) SetCurrentColumn((((pSndFile->m_nChannels-1) << 3) | 4)); @@ -3196,22 +3210,22 @@ SetCurSel(n, n); return wParam;} case kcHomeHorizontalSelect: - case kcHomeHorizontal: if (m_dwCursor) SetCurrentColumn(0); - else if (m_nRow > 0) SetCurrentRow(0); + case kcHomeHorizontal: if (m_dwCursor) SetCurrentColumn(0); + else if (m_nRow > 0) SetCurrentRow(0); return wParam; case kcHomeVerticalSelect: - case kcHomeVertical: if (m_nRow > 0) SetCurrentRow(0); + case kcHomeVertical: if (m_nRow > 0) SetCurrentRow(0); else if (m_dwCursor) SetCurrentColumn(0); - return wParam; + return wParam; case kcHomeAbsoluteSelect: - case kcHomeAbsolute: if (m_dwCursor) SetCurrentColumn(0); if (m_nRow > 0) SetCurrentRow(0); return wParam; + case kcHomeAbsolute: if (m_dwCursor) SetCurrentColumn(0); if (m_nRow > 0) SetCurrentRow(0); return wParam; case kcEndHorizontalSelect: case kcEndHorizontal: if (m_dwCursor!=(((pSndFile->m_nChannels-1) << 3) | 4)) SetCurrentColumn(((pSndFile->m_nChannels-1) << 3) | 4); else if (m_nRow < pModDoc->GetPatternSize(m_nPattern) - 1) SetCurrentRow(pModDoc->GetPatternSize(m_nPattern) - 1); - return wParam; + return wParam; case kcEndVerticalSelect: - case kcEndVertical: if (m_nRow < pModDoc->GetPatternSize(m_nPattern) - 1) SetCurrentRow(pModDoc->GetPatternSize(m_nPattern) - 1); + case kcEndVertical: if (m_nRow < pModDoc->GetPatternSize(m_nPattern) - 1) SetCurrentRow(pModDoc->GetPatternSize(m_nPattern) - 1); else if (m_dwCursor!=(((pSndFile->m_nChannels-1) << 3) | 4)) SetCurrentColumn(((pSndFile->m_nChannels-1) << 3) | 4); return wParam; case kcEndAbsoluteSelect: @@ -3219,7 +3233,7 @@ case kcNextPattern: { UINT n = m_nPattern + 1; while ((n < MAX_PATTERNS) && (!pSndFile->Patterns[n])) n++; - SetCurrentPattern((n < MAX_PATTERNS) ? n : 0); + SetCurrentPattern((n < MAX_PATTERNS) ? n : 0); int currentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); int newOrder = pSndFile->FindOrder(m_nPattern, currentOrder, true); SendCtrlMessage(CTRLMSG_SETCURRENTORDER, newOrder); @@ -3245,7 +3259,7 @@ case kcCopySelectOffWithSelect: case kcCopySelectOffWithNav: case kcCopySelectOff: m_dwStatus &= ~PATSTATUS_CTRLDRAGSEL; return wParam; - + case kcClearRow: OnClearField(-1, false); return wParam; case kcClearField: OnClearField(m_dwCursor & 0x07, false); return wParam; case kcClearFieldITStyle: OnClearField(m_dwCursor & 0x07, false, true); return wParam; @@ -3255,14 +3269,14 @@ case kcDeleteRows: OnDeleteRows(); return wParam; case kcDeleteAllRows: DeleteRows(0, pSndFile->m_nChannels-1,1); return wParam; case kcInsertRow: OnInsertRows(); return wParam; - case kcInsertAllRows: InsertRows(0, pSndFile->m_nChannels-1); return wParam; + case kcInsertAllRows: InsertRows(0, pSndFile->m_nChannels-1); return wParam; case kcShowNoteProperties: ShowEditWindow(); return wParam; case kcShowPatternProperties: OnPatternProperties(); return wParam; case kcShowMacroConfig: SendCtrlMessage(CTRLMSG_SETUPMACROS); return wParam; case kcShowEditMenu: {CPoint pt = GetPointFromPosition((m_nRow << 16) | m_dwCursor); OnRButtonDown(0, pt); } - return wParam; + return wParam; case kcPatternGoto: OnEditGoto(); return wParam; case kcNoteCut: TempEnterNote(254, false); return wParam; @@ -3277,7 +3291,7 @@ case kcEditCopy: OnEditCopy(); return wParam; case kcCopyAndLoseSelection: { - OnEditCopy(); + OnEditCopy(); int sel = m_dwCursor | (m_nRow << 16); SetCurSel(sel, sel); return wParam; @@ -3318,38 +3332,38 @@ if (wParam>=kcSetSpacing0 && wParam<kcSetSpacing9) { - SetSpacing(wParam - kcSetSpacing0); + SetSpacing(wParam - kcSetSpacing0); return wParam; } if (wParam>=kcSetIns0 && wParam<=kcSetIns9) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled_bmsg()) TempEnterIns(wParam-kcSetIns0); return wParam; } if (wParam>=kcSetOctave0 && wParam<=kcSetOctave9) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled()) TempEnterOctave(wParam-kcSetOctave0); return wParam; } if (wParam>=kcSetVolumeStart && wParam<=kcSetVolumeEnd) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled_bmsg()) TempEnterVol(wParam-kcSetVolumeStart); return wParam; } if (wParam>=kcSetFXStart && wParam<=kcSetFXEnd) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled_bmsg()) TempEnterFX(wParam-kcSetFXStart+1); return wParam; } if (wParam>=kcSetFXParam0 && wParam<=kcSetFXParamF) { - if ((m_dwStatus & PATSTATUS_RECORD)) + if (IsEditingEnabled_bmsg()) TempEnterFXparam(wParam-kcSetFXParam0); return wParam; } @@ -3358,18 +3372,20 @@ } void CViewPattern::TempEnterVol(int v) +//------------------------------------ { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (pMainFrm)) - { + { CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase; + MODCOMMAND oldcmd; // This is the command we are about to overwrite PrepareUndo(m_dwBeginSel, m_dwEndSel); - + // -- Work out where to put the new data UINT nChn = (m_dwCursor & 0xFFFF) >> 3; prowbase = p + m_nRow * pSndFile->m_nChannels; @@ -3382,7 +3398,7 @@ { vol = ((vol * 10) + v) % 100; if (!volcmd) volcmd = VOLCMD_VOLUME; - } + } else switch(v+kcSetVolumeStart) { @@ -3414,7 +3430,7 @@ p->volcmd = volcmd; p->vol = vol; - if (m_dwStatus & PATSTATUS_RECORD) + if (IsEditingEnabled_bmsg()) { DWORD sel = (m_nRow << 16) | m_dwCursor; SetCurSel(sel, sel); @@ -3435,6 +3451,7 @@ } void CViewPattern::SetSpacing(int n) +//---------------------------------- { if (n != m_nSpacing) { @@ -3444,12 +3461,13 @@ } void CViewPattern::TempEnterFX(int c) +//----------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (pMainFrm)) - { + { CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase; MODCOMMAND oldcmd; // This is the command we are about to overwrite @@ -3469,7 +3487,7 @@ m_cmdOld.command = c; } p->command = c; - + // Check for MOD/XM Speed/Tempo command if ((pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) && ((p->command == CMD_SPEED) || (p->command == CMD_TEMPO))) @@ -3478,7 +3496,7 @@ p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO; } - if (m_dwStatus & PATSTATUS_RECORD) + if (IsEditingEnabled_bmsg()) { DWORD sel = (m_nRow << 16) | m_dwCursor; SetCurSel(sel, sel); @@ -3494,12 +3512,13 @@ } void CViewPattern::TempEnterFXparam(int v) +//---------------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (pMainFrm)) - { + { CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *p = pSndFile->Patterns[m_nPattern], *prowbase; MODCOMMAND oldcmd; // This is the command we are about to overwrite @@ -3515,7 +3534,7 @@ // { p->param = (p->param << 4) | v; if (p->command == m_cmdOld.command) m_cmdOld.param = p->param; -/* } +/* } else if (v >= 10 && v <= 15) { p->param = (p->param << 4) | (v + 0x0A); @@ -3530,7 +3549,7 @@ p->command = (p->param <= maxspd) ? CMD_SPEED : CMD_TEMPO; } - if (m_dwStatus & PATSTATUS_RECORD) + if (IsEditingEnabled_bmsg()) { DWORD sel = (m_nRow << 16) | m_dwCursor; SetCurSel(sel, sel); @@ -3564,13 +3583,13 @@ if (!ins) ins = m_nFoundInstrument; pModDoc->NoteOff(note, TRUE, ins, (m_dwCursor & 0xFFFF) >> 3); } - + //Enter note off in pattern? if ((note < 1) || (note > 120)) return; if ((m_dwCursor & 7) > 1 && !fromMidi) return; - if (!pModDoc || !pMainFrm || !(m_dwStatus & PATSTATUS_RECORD)) + if (!pModDoc || !pMainFrm || !(IsEditingEnabled())) return; CSoundFile *pSndFile = pModDoc->GetSoundFile(); @@ -3603,7 +3622,7 @@ prowbase = p + nRow * pSndFile->m_nChannels; if (releaseChan>=0 && releaseChan<pSndFile->m_nChannels) p=prowbase+releaseChan; - else + else p=prowbase+nChn; //don't overwrite: @@ -3616,9 +3635,9 @@ return; } } else { - return; + return; } - } + } // -- write sdx if playing live if (usePlaybackPosition && pSndFile->m_nTickCount) { // avoid SD0 which will be mis-interpreted @@ -3630,7 +3649,8 @@ //Enter note off p->note = 0xFF; - p->instr = 0; + p->instr = GetCurrentInstrument(); //p->instr = 0; + //Writing the instrument as well - probably someone finds this annoying :) p->volcmd = 0; p->vol = 0; @@ -3640,7 +3660,7 @@ UpdateIndicator();... [truncated message content] |
From: <re...@us...> - 2006-08-16 23:47:48
|
Revision: 164 Author: rewbs Date: 2006-08-16 16:47:38 -0700 (Wed, 16 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=164&view=rev Log Message: ----------- <rewbs> ITP fixes Modified Paths: -------------- trunk/OpenMPT/soundlib/Load_it.cpp Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2006-08-13 15:52:29 UTC (rev 163) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2006-08-16 23:47:38 UTC (rev 164) @@ -248,7 +248,7 @@ streamPos += sizeof(DWORD); // name string - if (streamPos+len<=dwMemLength && len<MAX_SAMPLES*32) { + if (streamPos+len<=dwMemLength && len<=MAX_SAMPLES*32) { memcpy(&m_szNames[0],lpStream+streamPos,len); streamPos += len; } @@ -331,7 +331,7 @@ streamPos += sizeof(DWORD); // ChnSettings[i].szName - if (streamPos+len<=dwMemLength && len<MAX_CHANNELNAME) { + if (streamPos+len<=dwMemLength && len<=MAX_CHANNELNAME) { memcpy(&ChnSettings[i].szName[0],lpStream+streamPos,len); streamPos += len; } @@ -372,7 +372,7 @@ // instruments' paths for(i=0; i<m_nInstruments; i++){ - if (len+streamPos<=dwMemLength && len<_MAX_PATH) { + if (len+streamPos<=dwMemLength && len<=_MAX_PATH) { memcpy(&m_szInstrumentPath[i][0],lpStream+streamPos,len); streamPos += len; } @@ -386,7 +386,7 @@ streamPos += sizeof(DWORD); // order data - if (size+streamPos<=dwMemLength && size<MAX_ORDERS) { + if (size+streamPos<=dwMemLength && size<=MAX_ORDERS) { memcpy(&Order[0],lpStream+streamPos,size); streamPos += size; } @@ -410,8 +410,8 @@ streamPos += sizeof(DWORD); // m_lpszPatternNames - m_lpszPatternNames = new char[m_nPatternNames * len]; - if (m_lpszPatternNames) { + if (len<=MAX_PATTERNNAME && m_nPatternNames<=MAX_PATTERNS) { + m_lpszPatternNames = new char[m_nPatternNames * len]; memcpy(&m_lpszPatternNames[0],lpStream+streamPos,m_nPatternNames * len); } streamPos += m_nPatternNames * len; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-13 15:52:41
|
Revision: 163 Author: rewbs Date: 2006-08-13 08:52:29 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=163&view=rev Log Message: ----------- v1.17.02.44 + <rewbs> Added release section to volume envelope (see: http://openmpt.xwiki.com/xwiki/bin/view/Manual/InstrumentReleaseEnvelope). IT only. . <rewbs> Overflow fixes in file loading functions (see: http://aluigi.altervista.org/adv/mptho-adv.txt) . <rewbs> Greyed out irrelevant items in the orderlist context menu. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_ins.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2006-08-13 15:51:11 UTC (rev 162) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2006-08-13 15:52:29 UTC (rev 163) @@ -85,6 +85,7 @@ ON_COMMAND(ID_INSTRUMENT_SAMPLEMAP, OnEditSampleMap) ON_MESSAGE(WM_MOD_MIDIMSG, OnMidiMsg) ON_MESSAGE(WM_MOD_KEYCOMMAND, OnCustomKeyMsg) //rewbs.customKeys + ON_COMMAND(ID_ENVELOPE_TOGGLERELEASENODE, OnEnvToggleReleasNode) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -1305,6 +1306,7 @@ { maxpoint--; m_dcMemMain.SelectObject(CMainFrame::penEnvelope); + int releaseNode = EnvGetReleaseNode(); for (UINT i=0; i<=maxpoint; i++) { int x = (EnvGetTick(i) + 1) * ENV_ZOOM - nScrollPos; @@ -1313,11 +1315,18 @@ rect.top = y - 3; rect.right = x + 4; rect.bottom = y + 4; - m_dcMemMain.FrameRect(&rect, CBrush::FromHandle(CMainFrame::brushWhite)); - if (i) + if (i) { m_dcMemMain.LineTo(x, y); - else + } else { m_dcMemMain.MoveTo(x, y); + } + if (i==releaseNode) { + m_dcMemMain.FrameRect(&rect, CBrush::FromHandle(CMainFrame::brushHighLightRed)); + m_dcMemMain.SelectObject(CMainFrame::penEnvelopeHighlight); + } else { + m_dcMemMain.FrameRect(&rect, CBrush::FromHandle(CMainFrame::brushWhite)); + } + } } DrawPositionMarks(m_dcMemMain.m_hDC); @@ -1337,7 +1346,73 @@ // -! NEW_FEATURE#0015 } +BYTE CViewInstrument::EnvGetReleaseNode() +//-------------------------------------- +{ + CModDoc *pModDoc = GetDocument(); + if (pModDoc) { + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; + if (penv) { + switch(m_nEnv) { + case ENV_VOLUME: + return penv->nVolEnvReleaseNode; + case ENV_PANNING: + return penv->nPanEnvReleaseNode; + case ENV_PITCH: + return penv->nPitchEnvReleaseNode; + default: + return ENV_RELEASE_NODE_UNSET; + } + } + } +} +WORD CViewInstrument::EnvGetReleaseNodeValue() +//-------------------------------------- +{ + CModDoc *pModDoc = GetDocument(); + if (pModDoc) { + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; + if (penv) { + switch(m_nEnv) { + case ENV_VOLUME: + return penv->VolEnv[EnvGetReleaseNode()]; + case ENV_PANNING: + return penv->PanEnv[EnvGetReleaseNode()]; + case ENV_PITCH: + return penv->PitchEnv[EnvGetReleaseNode()]; + default: + return 0; + } + } + } +} + +WORD CViewInstrument::EnvGetReleaseNodeTick() +//-------------------------------------- +{ + CModDoc *pModDoc = GetDocument(); + if (pModDoc) { + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; + if (penv) { + switch(m_nEnv) { + case ENV_VOLUME: + return penv->VolPoints[EnvGetReleaseNode()]; + case ENV_PANNING: + return penv->PanPoints[EnvGetReleaseNode()]; + case ENV_PITCH: + return penv->PitchPoints[EnvGetReleaseNode()]; + default: + return 0; + } + } + } +} + + void CViewInstrument::DrawPositionMarks(HDC hdc) //---------------------------------------------- { @@ -1654,7 +1729,14 @@ if (nVal < 0) nVal = 0; if (nVal > 64) nVal = 64; if (nTick < 0) nTick = 0; - wsprintf(s, "Tick %d, [%d]", nTick, (m_nEnv != ENV_VOLUME) ? nVal-32 : nVal); + if (nTick<=EnvGetReleaseNodeTick()+1) { + int displayVal = (m_nEnv != ENV_VOLUME) ? nVal-32 : nVal; + wsprintf(s, "Tick %d, [%d]", nTick, displayVal); + } else { + int displayVal = (nVal-EnvGetReleaseNodeValue())*2; + displayVal = (m_nEnv != ENV_VOLUME) ? displayVal-32 : displayVal; + wsprintf(s, "Tick %d, [Rel%c%d]", nTick, displayVal>0?'+':'-', abs(displayVal)); + } UpdateIndicator(s); if ((m_dwStatus & INSSTATUS_DRAGGING) && (m_nDragItem)) { @@ -1860,9 +1942,11 @@ pSubMenu->EnableMenuItem(ID_ENVELOPE_INSERTPOINT, (lastpoint < maxpoint) ? MF_ENABLED : MF_GRAYED); pSubMenu->EnableMenuItem(ID_ENVELOPE_REMOVEPOINT, ((m_nDragItem) && (lastpoint > 1)) ? MF_ENABLED : MF_GRAYED); pSubMenu->EnableMenuItem(ID_ENVELOPE_CARRY, (pSndFile->m_nType & MOD_TYPE_IT) ? MF_ENABLED : MF_GRAYED); + pSubMenu->EnableMenuItem(ID_ENVELOPE_TOGGLERELEASENODE, (pSndFile->m_nType&MOD_TYPE_IT && m_nEnv==ENV_VOLUME) ? MF_ENABLED : MF_GRAYED); pSubMenu->CheckMenuItem(ID_ENVELOPE_SETLOOP, (EnvGetLoop()) ? MF_CHECKED : MF_UNCHECKED); pSubMenu->CheckMenuItem(ID_ENVELOPE_SUSTAIN, (EnvGetSustain()) ? MF_CHECKED : MF_UNCHECKED); pSubMenu->CheckMenuItem(ID_ENVELOPE_CARRY, (EnvGetCarry()) ? MF_CHECKED : MF_UNCHECKED); + pSubMenu->CheckMenuItem(ID_ENVELOPE_TOGGLERELEASENODE, (EnvGetReleaseNode()==m_nDragItem-1) ? MF_CHECKED : MF_UNCHECKED); m_ptMenu = pt; ClientToScreen(&pt); pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x,pt.y,this); @@ -1950,7 +2034,45 @@ } } +void CViewInstrument::OnEnvToggleReleasNode() +//--------------------------------------------------- +{ + int node = m_nDragItem-1; + CModDoc *pModDoc = GetDocument(); + if ((pModDoc) && (node>0) && (node <= EnvGetLastPoint())) + { + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + INSTRUMENTHEADER *penv = pSndFile->Headers[m_nInstrument]; + switch(m_nEnv) { + case ENV_VOLUME: + if (penv->nVolEnvReleaseNode == node) { + penv->nVolEnvReleaseNode = ENV_RELEASE_NODE_UNSET; + } else { + penv->nVolEnvReleaseNode = node; + } + break; + case ENV_PANNING: + if (penv->nPanEnvReleaseNode == node) { + penv->nPanEnvReleaseNode = ENV_RELEASE_NODE_UNSET; + } else { + penv->nPanEnvReleaseNode = node; + } + break; + case ENV_PITCH: + if (penv->nPitchEnvReleaseNode == node) { + penv->nPitchEnvReleaseNode = ENV_RELEASE_NODE_UNSET; + } else { + penv->nPitchEnvReleaseNode = node; + } + break; + } + pModDoc->SetModified(); + InvalidateRect(NULL, FALSE); + } +} + + void CViewInstrument::OnEnvVolChanged() //------------------------------------- { @@ -2040,6 +2162,7 @@ if (penv->nVolLoopEnd > nPoint) penv->nVolLoopEnd--; if (penv->nVolSustainBegin > nPoint) penv->nVolSustainBegin--; if (penv->nVolSustainEnd > nPoint) penv->nVolSustainEnd--; + if (penv->nVolEnvReleaseNode>nPoint && penv->nVolEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) penv->nVolEnvReleaseNode--; penv->VolPoints[0] = 0; bOk = TRUE; } @@ -2058,6 +2181,7 @@ if (penv->nPanLoopEnd > nPoint) penv->nPanLoopEnd--; if (penv->nPanSustainBegin > nPoint) penv->nPanSustainBegin--; if (penv->nPanSustainEnd > nPoint) penv->nPanSustainEnd--; + if (penv->nPanEnvReleaseNode>nPoint && penv->nPanEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) penv->nPanEnvReleaseNode--; penv->PanPoints[0] = 0; bOk = TRUE; } @@ -2076,6 +2200,7 @@ if (penv->nPitchLoopEnd > nPoint) penv->nPitchLoopEnd--; if (penv->nPitchSustainBegin > nPoint) penv->nPitchSustainBegin--; if (penv->nPitchSustainEnd > nPoint) penv->nPitchSustainEnd--; + if (penv->nPitchEnvReleaseNode>nPoint && penv->nPitchEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) penv->nPitchEnvReleaseNode--; penv->PitchPoints[0] = 0; bOk = TRUE; } @@ -2131,6 +2256,7 @@ if (penv->nVolLoopEnd >= i) penv->nVolLoopEnd++; if (penv->nVolSustainBegin >= i) penv->nVolSustainBegin++; if (penv->nVolSustainEnd >= i) penv->nVolSustainEnd++; + if (penv->nVolEnvReleaseNode>=i && penv->nVolEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) penv->nVolEnvReleaseNode++; bOk = TRUE; } break; @@ -2156,6 +2282,7 @@ if (penv->nPanLoopEnd >= i) penv->nPanLoopEnd++; if (penv->nPanSustainBegin >= i) penv->nPanSustainBegin++; if (penv->nPanSustainEnd >= i) penv->nPanSustainEnd++; + if (penv->nPanEnvReleaseNode>=i && penv->nPanEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) penv->nPanEnvReleaseNode++; bOk = TRUE; } break; @@ -2181,6 +2308,7 @@ if (penv->nPitchLoopEnd >= i) penv->nPitchLoopEnd++; if (penv->nPitchSustainBegin >= i) penv->nPitchSustainBegin++; if (penv->nPitchSustainEnd >= i) penv->nPitchSustainEnd++; + if (penv->nPitchEnvReleaseNode>=i && penv->nPitchEnvReleaseNode!=ENV_RELEASE_NODE_UNSET) penv->nPitchEnvReleaseNode++; bOk = TRUE; } break; Modified: trunk/OpenMPT/mptrack/View_ins.h =================================================================== --- trunk/OpenMPT/mptrack/View_ins.h 2006-08-13 15:51:11 UTC (rev 162) +++ trunk/OpenMPT/mptrack/View_ins.h 2006-08-13 15:52:29 UTC (rev 163) @@ -115,6 +115,7 @@ afx_msg void OnEnvLoopChanged(); afx_msg void OnEnvSustainChanged(); afx_msg void OnEnvCarryChanged(); + afx_msg void OnEnvToggleReleasNode(); afx_msg void OnEnvInsertPoint(); afx_msg void OnEnvRemovePoint(); afx_msg void OnSelectVolumeEnv(); @@ -134,6 +135,11 @@ virtual BOOL PreTranslateMessage(MSG *pMsg); //rewbs.customKeys //}}AFX_MSG DECLARE_MESSAGE_MAP() + +private: + BYTE EnvGetReleaseNode(); + WORD EnvGetReleaseNodeValue(); + WORD EnvGetReleaseNodeTick(); }; Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2006-08-13 15:51:11 UTC (rev 162) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2006-08-13 15:52:29 UTC (rev 163) @@ -437,25 +437,17 @@ || (!pChn->nLength) || ((pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol))) { pChn->dwFlags |= CHN_FASTVOLRAMP; - if ((m_nType & MOD_TYPE_IT) && (!bInstrumentChanged) && (penv) && (!(pChn->dwFlags & (CHN_KEYOFF|CHN_NOTEFADE)))) - { - if (!(penv->dwFlags & ENV_VOLCARRY)) pChn->nVolEnvPosition = 0; - if (!(penv->dwFlags & ENV_PANCARRY)) pChn->nPanEnvPosition = 0; - if (!(penv->dwFlags & ENV_PITCHCARRY)) pChn->nPitchEnvPosition = 0; - } else - { - pChn->nVolEnvPosition = 0; - pChn->nPanEnvPosition = 0; - pChn->nPitchEnvPosition = 0; + if ((m_nType & MOD_TYPE_IT) && (!bInstrumentChanged) && (penv) && (!(pChn->dwFlags & (CHN_KEYOFF|CHN_NOTEFADE)))) { + if (!(penv->dwFlags & ENV_VOLCARRY)) resetEnvelopes(pChn, ENV_RESET_VOL); + if (!(penv->dwFlags & ENV_PANCARRY)) resetEnvelopes(pChn, ENV_RESET_PAN); + if (!(penv->dwFlags & ENV_PITCHCARRY)) resetEnvelopes(pChn, ENV_RESET_PITCH); + } else { + resetEnvelopes(pChn); } pChn->nAutoVibDepth = 0; pChn->nAutoVibPos = 0; - } else - if ((penv) && (!(penv->dwFlags & ENV_VOLUME))) - { - pChn->nVolEnvPosition = 0; - pChn->nAutoVibDepth = 0; - pChn->nAutoVibPos = 0; + } else if ((penv) && (!(penv->dwFlags & ENV_VOLUME))) { + resetEnvelopes(pChn); } } // Invalid sample ? @@ -593,9 +585,7 @@ { if ((m_nType & MOD_TYPE_IT) && (pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol)) { - pChn->nVolEnvPosition = 0; - pChn->nPanEnvPosition = 0; - pChn->nPitchEnvPosition = 0; + resetEnvelopes(pChn); pChn->nAutoVibDepth = 0; pChn->nAutoVibPos = 0; pChn->dwFlags &= ~CHN_NOTEFADE; @@ -1013,9 +1003,7 @@ if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) { pChn->dwFlags |= CHN_FASTVOLRAMP; - pChn->nVolEnvPosition = 0; - pChn->nPanEnvPosition = 0; - pChn->nPitchEnvPosition = 0; + resetEnvelopes(pChn); pChn->nAutoVibDepth = 0; pChn->nAutoVibPos = 0; pChn->dwFlags &= ~CHN_NOTEFADE; @@ -1069,9 +1057,7 @@ if ((bPorta) && (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) && (instr)) { pChn->dwFlags |= CHN_FASTVOLRAMP; - pChn->nVolEnvPosition = 0; - pChn->nPanEnvPosition = 0; - pChn->nPitchEnvPosition = 0; + resetEnvelopes(pChn); pChn->nAutoVibDepth = 0; pChn->nAutoVibPos = 0; } @@ -1566,7 +1552,33 @@ return TRUE; } +void CSoundFile::resetEnvelopes(MODCHANNEL* pChn, int envToReset) +{ + switch (envToReset) { + case ENV_RESET_ALL: + pChn->nVolEnvPosition = 0; + pChn->nPanEnvPosition = 0; + pChn->nPitchEnvPosition = 0; + pChn->nVolEnvValueAtReleaseJump = NOT_YET_RELEASED; + pChn->nPitchEnvValueAtReleaseJump = NOT_YET_RELEASED; + pChn->nPanEnvValueAtReleaseJump = NOT_YET_RELEASED; + break; + case ENV_RESET_VOL: + pChn->nVolEnvPosition = 0; + pChn->nVolEnvValueAtReleaseJump = NOT_YET_RELEASED; + break; + case ENV_RESET_PAN: + pChn->nPanEnvPosition = 0; + pChn->nPanEnvValueAtReleaseJump = NOT_YET_RELEASED; + break; + case ENV_RESET_PITCH: + pChn->nPitchEnvPosition = 0; + pChn->nPitchEnvValueAtReleaseJump = NOT_YET_RELEASED; + break; + } +} + //////////////////////////////////////////////////////////// // Channels effects @@ -2689,8 +2701,15 @@ if (pChn->pHeader) { INSTRUMENTHEADER *penv = pChn->pHeader; - if (((penv->dwFlags & ENV_VOLLOOP) || (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) && (penv->nFadeOut)) + if (((penv->dwFlags & ENV_VOLLOOP) || (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) && (penv->nFadeOut)) { pChn->dwFlags |= CHN_NOTEFADE; + } + + if (penv->nVolEnvReleaseNode != ENV_RELEASE_NODE_UNSET) { + pChn->nVolEnvValueAtReleaseJump=getVolEnvValueFromPosition(pChn->nVolEnvPosition, penv); + pChn->nVolEnvPosition= penv->VolPoints[penv->nVolEnvReleaseNode]; + } + } } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2006-08-13 15:51:11 UTC (rev 162) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2006-08-13 15:52:29 UTC (rev 163) @@ -189,6 +189,9 @@ VSB. nVolSustainBegin; VSE. nVolSustainEnd; VSTV [EXT] nVSTiVolume; +PERN nPitchEnvReleaseNode +AERN nPanEnvReleaseNode +VERN nVolEnvReleaseNode ----------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------*/ @@ -265,6 +268,9 @@ WRITE_MPTHEADER_sized_member( nCutSwing , BYTE , CS.. ) WRITE_MPTHEADER_sized_member( nResSwing , BYTE , RS.. ) WRITE_MPTHEADER_sized_member( nFilterMode , BYTE , FM.. ) +WRITE_MPTHEADER_sized_member( nPitchEnvReleaseNode, BYTE , PERN ) +WRITE_MPTHEADER_sized_member( nPanEnvReleaseNode , BYTE , AERN ) +WRITE_MPTHEADER_sized_member( nVolEnvReleaseNode , BYTE , VERN ) } // -------------------------------------------------------------------------------------------- @@ -338,6 +344,9 @@ GET_MPTHEADER_sized_member( nCutSwing , BYTE , CS.. ) GET_MPTHEADER_sized_member( nResSwing , BYTE , RS.. ) GET_MPTHEADER_sized_member( nFilterMode , BYTE , FM.. ) +GET_MPTHEADER_sized_member( nPitchEnvReleaseNode, BYTE , PERN ) +GET_MPTHEADER_sized_member( nPanEnvReleaseNode , BYTE , AERN ) +GET_MPTHEADER_sized_member( nVolEnvReleaseNode , BYTE , VERN ) } return pointer; @@ -748,6 +757,8 @@ LPSTR CSoundFile::AllocateSample(UINT nbytes) //------------------------------------------- { + if (nbytes>0xFFFFFFD6) + return NULL; LPSTR p = (LPSTR)GlobalAllocPtr(GHND, (nbytes+39) & ~7); if (p) p += 16; return p; @@ -2650,8 +2661,20 @@ m_defaultInstrument.nResampling = SRCMODE_DEFAULT; m_defaultInstrument.nFilterMode = FLTMODE_UNCHANGED; m_defaultInstrument.nPPC = 5*12; - m_defaultInstrument.nGlobalVol=128; + m_defaultInstrument.nGlobalVol=64; m_defaultInstrument.nPan = 0x20 << 2; m_defaultInstrument.nIFC = 0xFF; + m_defaultInstrument.nPanEnvReleaseNode=ENV_RELEASE_NODE_UNSET; + m_defaultInstrument.nPitchEnvReleaseNode=ENV_RELEASE_NODE_UNSET; + m_defaultInstrument.nVolEnvReleaseNode=ENV_RELEASE_NODE_UNSET; } +void CSoundFile::SetDefaultInstrumentValues(INSTRUMENTHEADER *penv) +//----------------------------------------------------------------- +{ + penv->nResampling = m_defaultInstrument.nResampling; + penv->nFilterMode = m_defaultInstrument.nFilterMode; + penv->nPitchEnvReleaseNode = m_defaultInstrument.nPitchEnvReleaseNode; + penv->nPanEnvReleaseNode = m_defaultInstrument.nPanEnvReleaseNode; + penv->nVolEnvReleaseNode = m_defaultInstrument.nVolEnvReleaseNode; +} \ No newline at end of file Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2006-08-13 15:51:11 UTC (rev 162) +++ trunk/OpenMPT/soundlib/Sndfile.h 2006-08-13 15:52:29 UTC (rev 163) @@ -62,6 +62,7 @@ #define MAX_MIXPLUGINS 100 //50 // -! BEHAVIOUR_CHANGE#0006 #define MAX_PLUGPRESETS 1000 //rewbs.plugPresets +#define MED_MAX_COMMENT_LENGTH 5*1024 //I think 5kB should be enough, though I admit this is a guess. #define MOD_TYPE_NONE 0x00 #define MOD_TYPE_MOD 0x01 @@ -353,6 +354,15 @@ NUM_SRC_MODES }; +enum { + ENV_RESET_ALL, + ENV_RESET_VOL, + ENV_RESET_PAN, + ENV_RESET_PITCH, + ENV_RELEASE_NODE_UNSET=0xFF, + NOT_YET_RELEASED=-1 +}; + // Midi Continuous Controller Codes // http://www.borg.com/~jglatt/tech/midispec/ctllist.htm enum { @@ -537,6 +547,9 @@ BYTE nCutSwing; BYTE nResSwing; BYTE nFilterMode; + BYTE nPitchEnvReleaseNode; + BYTE nPanEnvReleaseNode; + BYTE nVolEnvReleaseNode; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // WHEN adding new members here, ALSO update Sndfile.cpp (instructions near the top of this file)! @@ -588,6 +601,7 @@ INSTRUMENTHEADER *pHeader; MODINSTRUMENT *pInstrument; DWORD nVolEnvPosition, nPanEnvPosition, nPitchEnvPosition; + LONG nVolEnvValueAtReleaseJump, nPanEnvValueAtReleaseJump, nPitchEnvValueAtReleaseJump; DWORD nMasterChn, nVUMeter; LONG nGlobalVol, nInsVol; LONG nFineTune, nTranspose; @@ -1153,6 +1167,10 @@ static UINT Normalize24BitBuffer(LPBYTE pbuffer, UINT cbsizebytes, DWORD lmax24, DWORD dwByteInc); UINT GetBestPlugin(UINT nChn, UINT priority, bool respectMutes); + + int getVolEnvValueFromPosition(int position, INSTRUMENTHEADER* penv); + void resetEnvelopes(MODCHANNEL* pChn, int envToReset = ENV_RESET_ALL); + void SetDefaultInstrumentValues(INSTRUMENTHEADER *penv); private: UINT __cdecl GetChannelPlugin(UINT nChan, bool respectMutes); UINT __cdecl GetActiveInstrumentPlugin(UINT nChan, bool respectMutes); @@ -1160,6 +1178,9 @@ void HandlePatternTransitionEvents(); void BuildDefaultInstrument(); + + + }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-13 15:51:24
|
Revision: 162 Author: rewbs Date: 2006-08-13 08:51:11 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=162&view=rev Log Message: ----------- v1.17.02.44 + <rewbs> Added release section to volume envelope (see: http://openmpt.xwiki.com/xwiki/bin/view/Manual/InstrumentReleaseEnvelope). IT only. . <rewbs> Overflow fixes in file loading functions (see: http://aluigi.altervista.org/adv/mptho-adv.txt) . <rewbs> Greyed out irrelevant items in the orderlist context menu. Modified Paths: -------------- trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2006-08-13 15:49:22 UTC (rev 161) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2006-08-13 15:51:11 UTC (rev 162) @@ -944,39 +944,30 @@ // Volume Envelope if ((pChn->dwFlags & CHN_VOLENV) && (penv->nVolEnv)) { - int envpos = pChn->nVolEnvPosition; - UINT pt = penv->nVolEnv - 1; - for (UINT i=0; i<(UINT)(penv->nVolEnv-1); i++) - { - if (envpos <= penv->VolPoints[i]) - { - pt = i; - break; + int envvol = getVolEnvValueFromPosition(pChn->nVolEnvPosition, penv); + + // if we are in the release portion of the envelope, + // rescale envelope factor so that it is proportional to the release point + // and release envelope beginning. + if (penv->nVolEnvReleaseNode != ENV_RELEASE_NODE_UNSET + && pChn->nVolEnvPosition>=penv->VolPoints[penv->nVolEnvReleaseNode] + && pChn->nVolEnvValueAtReleaseJump != NOT_YET_RELEASED) { + int envValueAtReleaseJump = pChn->nVolEnvValueAtReleaseJump; + int envValueAtReleaseNode = penv->VolEnv[penv->nVolEnvReleaseNode] << 2; + + //If we have just hit the release node, force the current env value + //to be that of the release node. This works around the case where + // we have another node at the same position as the release node. + if (pChn->nVolEnvPosition==penv->VolPoints[penv->nVolEnvReleaseNode]) { + envvol=envValueAtReleaseNode; } + + int relativeVolumeChange = (envvol-envValueAtReleaseNode)*2; + envvol = envValueAtReleaseJump + relativeVolumeChange; } - int x2 = penv->VolPoints[pt]; - int x1, envvol; - if (envpos >= x2) - { - envvol = penv->VolEnv[pt] << 2; - x1 = x2; - } else - if (pt) - { - envvol = penv->VolEnv[pt-1] << 2; - x1 = penv->VolPoints[pt-1]; - } else - { - envvol = 0; - x1 = 0; - } - if (envpos > x2) envpos = x2; - if ((x2 > x1) && (envpos > x1)) - { - envvol += ((envpos - x1) * (((int)penv->VolEnv[pt]<<2) - envvol)) / (x2 - x1); - } if (envvol < 0) envvol = 0; - if (envvol > 256) envvol = 256; + if (envvol > 512) + envvol = 512; vol = (vol * envvol) >> 8; } // Panning Envelope @@ -1698,6 +1689,41 @@ } +int CSoundFile::getVolEnvValueFromPosition(int position, INSTRUMENTHEADER* penv) +{ + UINT pt = penv->nVolEnv - 1; + for (UINT i=0; i<(UINT)(penv->nVolEnv-1); i++) + { + if (position <= penv->VolPoints[i]) + { + pt = i; + break; + } + } + int x2 = penv->VolPoints[pt]; + int x1, envvol; + if (position >= x2) + { + envvol = penv->VolEnv[pt] << 2; + x1 = x2; + } else + if (pt) + { + envvol = penv->VolEnv[pt-1] << 2; + x1 = penv->VolPoints[pt-1]; + } else + { + envvol = 0; + x1 = 0; + } + if (position > x2) position = x2; + if ((x2 > x1) && (position > x1)) + { + envvol += ((position - x1) * (((int)penv->VolEnv[pt]<<2) - envvol)) / (x2 - x1); + } + return envvol; +} + #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-13 15:49:39
|
Revision: 161 Author: rewbs Date: 2006-08-13 08:49:22 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=161&view=rev Log Message: ----------- v1.17.02.44 + <rewbs> Added release section to volume envelope (see: http://openmpt.xwiki.com/xwiki/bin/view/Manual/InstrumentReleaseEnvelope). IT only. . <rewbs> Overflow fixes in file loading functions (see: http://aluigi.altervista.org/adv/mptho-adv.txt) . <rewbs> Greyed out irrelevant items in the orderlist context menu. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/fxp.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2006-08-13 15:49:22 UTC (rev 161) @@ -623,19 +623,25 @@ SetCurSel(m_nXScroll + (pt.x - rect.left) / m_cxFont); SetFocus(); HMENU hMenu = ::CreatePopupMenu(); + + UINT nCurrentPattern = GetCurrentPattern(); + bool patternExists = (nCurrentPattern<MAX_PATTERNS + && m_pModDoc->GetSoundFile()->Patterns[nCurrentPattern] != NULL); + DWORD greyed = patternExists?FALSE:MF_GRAYED; + if (hMenu) { 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, ID_ORDERLIST_COPY, "&Duplicate Pattern"); - AppendMenu(hMenu, MF_STRING, ID_PATTERNCOPY, "&Copy Pattern"); - AppendMenu(hMenu, MF_STRING, ID_PATTERNPASTE, "P&aste 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))) { AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); - AppendMenu(hMenu, MF_STRING, ID_PATTERN_PROPERTIES, "&Properties..."); + 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); Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2006-08-13 15:49:22 UTC (rev 161) @@ -212,6 +212,7 @@ HPEN CMainFrame::penHalfDarkGray = NULL; HPEN CMainFrame::penSample = NULL; HPEN CMainFrame::penEnvelope = NULL; +HPEN CMainFrame::penEnvelopeHighlight = NULL; HPEN CMainFrame::penSeparator = NULL; HBRUSH CMainFrame::brushGray = NULL; HBRUSH CMainFrame::brushBlack = NULL; @@ -220,6 +221,7 @@ //CBrush *CMainFrame::pbrushWhite = NULL;//rewbs.envRowGrid HBRUSH CMainFrame::brushHighLight = NULL; +HBRUSH CMainFrame::brushHighLightRed = NULL; HBRUSH CMainFrame::brushWindow = NULL; HCURSOR CMainFrame::curDragging = NULL; HCURSOR CMainFrame::curArrow = NULL; @@ -767,6 +769,7 @@ DeleteGDIObject(penDarkGray); DeleteGDIObject(penSample); DeleteGDIObject(penEnvelope); + DeleteGDIObject(penEnvelopeHighlight); DeleteGDIObject(m_hFixedFont); DeleteGDIObject(penScratch); DeleteGDIObject(penGray00); @@ -1672,6 +1675,9 @@ penSample = ::CreatePen(PS_SOLID, 0, rgbCustomColors[MODCOLOR_SAMPLE]); if (penEnvelope) DeleteObject(penEnvelope); penEnvelope = ::CreatePen(PS_SOLID, 0, rgbCustomColors[MODCOLOR_ENVELOPES]); + if (penEnvelopeHighlight) DeleteObject(penEnvelopeHighlight); + penEnvelopeHighlight = ::CreatePen(PS_SOLID, 0, RGB(0xFF, 0xFF, 0x00)); + for (UINT i=0; i<NUM_VUMETER_PENS*2; i++) { int r0,g0,b0, r1,g1,b1; @@ -1718,8 +1724,11 @@ COLORREF crBkgnd = GetSysColor(COLOR_WINDOW); if (brushHighLight) DeleteObject(brushHighLight); brushHighLight = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT)); + if (brushHighLightRed) DeleteObject(brushHighLight); + brushHighLightRed = CreateSolidBrush(RGB(0xFF,0x00,0x00)); + if (brushWindow) DeleteObject(brushWindow); - brushWindow = CreateSolidBrush(crBkgnd); + brushWindow = CreateSolidBrush(crBkgnd); if (penSeparator) DeleteObject(penSeparator); penSeparator = CreatePen(PS_SOLID, 0, RGB(GetRValue(crBkgnd)/2, GetGValue(crBkgnd)/2, GetBValue(crBkgnd)/2)); } Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2006-08-13 15:49:22 UTC (rev 161) @@ -379,9 +379,9 @@ // GDI static HICON m_hIcon; static HFONT m_hGUIFont, m_hFixedFont, m_hLargeFixedFont; - static HBRUSH brushGray, brushBlack, brushWhite, brushHighLight, brushWindow; + static HBRUSH brushGray, brushBlack, brushWhite, brushHighLight, brushHighLightRed, brushWindow; // static CBrush *pbrushBlack, *pbrushWhite; - static HPEN penBlack, penDarkGray, penLightGray, penWhite, penHalfDarkGray, penSample, penEnvelope, penSeparator, penScratch, penGray00, penGray33, penGray40, penGray55, penGray80, penGray99, penGraycc, penGrayff; + static HPEN penBlack, penDarkGray, penLightGray, penWhite, penHalfDarkGray, penSample, penEnvelope, penEnvelopeHighlight, penSeparator, penScratch, penGray00, penGray33, penGray40, penGray55, penGray80, penGray99, penGraycc, penGrayff; static HCURSOR curDragging, curNoDrop, curArrow, curNoDrop2, curVSplit; static COLORREF rgbCustomColors[MAX_MODCOLORS]; static LPMODPLUGDIB bmpPatterns, bmpNotes, bmpVUMeters, bmpVisNode; Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2006-08-13 15:49:22 UTC (rev 161) @@ -786,9 +786,7 @@ pChn->nNewNote = note; if (nins) { //Set instrument - pChn->nVolEnvPosition = 0; - pChn->nPanEnvPosition = 0; - pChn->nPitchEnvPosition = 0; + m_SndFile.resetEnvelopes(pChn); m_SndFile.InstrumentChange(pChn, nins); } else if ((nsmp) && (nsmp < MAX_SAMPLES)) { //Or set sample Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2006-08-13 15:49:22 UTC (rev 161) @@ -1318,8 +1318,7 @@ penv->nGlobalVol = 64; penv->nPan = 128; penv->nPPC = 5*12; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + m_SndFile.SetDefaultInstrumentValues(penv); for (UINT n=0; n<128; n++) { penv->Keyboard[n] = nsample; Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2006-08-13 15:49:22 UTC (rev 161) @@ -2005,7 +2005,6 @@ Dispatch(effMainsChanged, 0, 1, NULL, 0.0f); // calls plugin's resume Dispatch(effStartProcess, 0, 0, NULL, 0.0f); m_bPlugResumed = true; -// ClearVSTEvents(); //DEBUG } catch (...) { CVstPluginManager::ReportPlugException("Exception in Resume() (Plugin=%s)\n", m_pFactory->szLibraryName); } @@ -2623,8 +2622,10 @@ dwMidiCode = 0x80|nCh|(vol<<16); //note off, on chan nCh; vol is note off velocity. for (UINT i=0; i<128; i++) //all notes { - pCh->uNoteOnMap[i][trackChannel]=0; - MidiSend(dwMidiCode|(i<<8)); + //if (!(m_pEffect->uniqueID==1413633619L) || pCh->uNoteOnMap[i][trackChannel]>0) { //only send necessary NOs for TBVS. + pCh->uNoteOnMap[i][trackChannel]=0; + MidiSend(dwMidiCode|(i<<8)); + //} } } Modified: trunk/OpenMPT/mptrack/fxp.cpp =================================================================== --- trunk/OpenMPT/mptrack/fxp.cpp 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/fxp.cpp 2006-08-13 15:49:22 UTC (rev 161) @@ -106,7 +106,7 @@ ChunkMagic == 'CcnK' && (fxMagic == 'FxCk' || fxMagic == 'FPCh'))) { - ::AfxMessageBox("Bad Magic."); + ::AfxMessageBox("Bad Magic number: this does not look like a preset file."); inStream.Close(); return false; } @@ -124,7 +124,7 @@ } } } - else if (fxMagic == 'FPCh') // load chunk list + else if (fxMagic == 'FPCh') // load chunk { if (!ReadLE(inStream, chunkSize)) { @@ -254,7 +254,7 @@ bool Cfxp::WriteLE(CFile &out, const long &l) { int size=sizeof(long); - long l2 = l; // maybe I should have made that arg a const.. + long l2 = l; if (NeedSwap()) SwapBytes(l2); out.Write(&l2, size); @@ -264,7 +264,7 @@ bool Cfxp::WriteLE(CFile &out, const float &f) { int size=sizeof(float); - float f2 = f; // maybe I should have made that arg a const.. + float f2 = f; if (NeedSwap()) SwapBytes(f2); out.Write(&f2, size); Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/mptrack.rc 2006-08-13 15:49:22 UTC (rev 161) @@ -216,6 +216,8 @@ MENUITEM "C&arry envelope", ID_ENVELOPE_CARRY MENUITEM "&Insert Point", ID_ENVELOPE_INSERTPOINT MENUITEM "&Remove Point", ID_ENVELOPE_REMOVEPOINT + MENUITEM "&Toggle Release Node", ID_ENVELOPE_TOGGLERELEASENODE + MENUITEM SEPARATOR MENUITEM "&Copy envelope", ID_EDIT_COPY MENUITEM "&Paste envelope", ID_EDIT_PASTE @@ -1894,7 +1896,7 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,17,2,43 + FILEVERSION 1,17,2,44 PRODUCTVERSION 0,0,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG @@ -1912,9 +1914,9 @@ BEGIN VALUE "CompanyName", "Olivier Lapicque / OpenMPT team" VALUE "FileDescription", "OpenMPT / ModPlug Tracker" - VALUE "FileVersion", "1, 17, 2, 43" + VALUE "FileVersion", "1, 17, 2, 44" VALUE "InternalName", "Modplug Tracker" - VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2005 GPL." + VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2007 GPL." VALUE "LegalTrademarks", "M.O.D.P.L.U.G" VALUE "OriginalFilename", "mptrack.exe" VALUE "ProductName", "OpenMPT / ModPlug Tracker" @@ -2187,6 +2189,7 @@ "Display channel manager window\nChannel manager" ID_INDICATOR_CPU "-" ID_FILE_EXPORTCOMPAT "Export file to standard IT/XM." + ID_ENVELOPE_SETRELEASENODE "Set release node" END STRINGTABLE Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2006-08-13 09:05:57 UTC (rev 160) +++ trunk/OpenMPT/mptrack/resource.h 2006-08-13 15:49:22 UTC (rev 161) @@ -41,6 +41,7 @@ #define IDR_ENVELOPES 203 #define ID_INDICATOR_CPU 203 #define ID_FILE_EXPORTCOMPAT 204 +#define ID_ENVELOPE_SETRELEASENODE 205 #define IDB_MAINBAR 300 #define IDB_IMAGELIST 301 #define IDB_PATTERNS 302 @@ -943,6 +944,7 @@ #define ID_Menu 59200 #define ID_FILE_SAVECOMPAT 59202 #define ID_CLEANUP_PLUGS 59205 +#define ID_ENVELOPE_TOGGLERELEASENODE 59206 // Next default values for new objects // @@ -950,7 +952,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 510 -#define _APS_NEXT_COMMAND_VALUE 59206 +#define _APS_NEXT_COMMAND_VALUE 59207 #define _APS_NEXT_CONTROL_VALUE 2256 #define _APS_NEXT_SYMED_VALUE 901 #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-13 09:07:42
|
Revision: 160 Author: rewbs Date: 2006-08-13 02:05:57 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=160&view=rev Log Message: ----------- v1.17.02.44 + <rewbs> Added release section to volume envelope (see: http://openmpt.xwiki.com/xwiki/bin/view/Manual/InstrumentReleaseEnvelope). IT only. . <rewbs> Overflow fixes in file loading functions (see: http://aluigi.altervista.org/adv/mptho-adv.txt) . <rewbs> Greyed out irrelevant items in the orderlist context menu. Modified Paths: -------------- trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe trunk/OpenMPT/mptrack/bin/mptrack_P3.exe trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe trunk/OpenMPT/mptrack/bin/version Modified: trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_P3.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/version =================================================================== --- trunk/OpenMPT/mptrack/bin/version 2006-08-13 09:05:14 UTC (rev 159) +++ trunk/OpenMPT/mptrack/bin/version 2006-08-13 09:05:57 UTC (rev 160) @@ -1 +1 @@ -1.17.02.43 \ No newline at end of file +1.17.02.44 \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-13 09:05:26
|
Revision: 159 Author: rewbs Date: 2006-08-13 02:05:14 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=159&view=rev Log Message: ----------- v1.17.02.44 + <rewbs> Added release section to volume envelope (see: http://openmpt.xwiki.com/xwiki/bin/view/Manual/InstrumentReleaseEnvelope). IT only. . <rewbs> Overflow fixes in file loading functions (see: http://aluigi.altervista.org/adv/mptho-adv.txt) . <rewbs> Greyed out irrelevant items in the orderlist context menu. Modified Paths: -------------- trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sampleio.cpp Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp =================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2006-08-13 09:05:14 UTC (rev 159) @@ -1701,6 +1701,9 @@ penv->nDNA = DNA_NOTEFADE; penv->nResampling = SRCMODE_DEFAULT; penv->nFilterMode = FLTMODE_UNCHANGED; + penv->nPanEnvReleaseNode=ENV_RELEASE_NODE_UNSET; + penv->nPitchEnvReleaseNode=ENV_RELEASE_NODE_UNSET; + penv->nVolEnvReleaseNode=ENV_RELEASE_NODE_UNSET; pSndFile->Headers[nInstr] = penv; nSample = 1; UINT nLoadedSmp = 0; Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2006-08-13 09:05:14 UTC (rev 159) @@ -167,8 +167,7 @@ else penv->nPan = 128; penv->nPPC = 5*12; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); for (UINT i=0; i<120; i++) { penv->Keyboard[i] = nsmp; Modified: trunk/OpenMPT/soundlib/Load_ams.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/Load_ams.cpp 2006-08-13 09:05:14 UTC (rev 159) @@ -366,8 +366,7 @@ penv->nGlobalVol = 64; penv->nPan = 128; penv->nPPC = 60; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); Headers[nIns] = penv; if (insnamelen) { Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mdl.cpp 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2006-08-13 09:05:14 UTC (rev 159) @@ -331,8 +331,7 @@ memcpy(penv->name, lpStream+dwPos+2, 32); penv->nGlobalVol = 64; penv->nPPC = 5*12; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); for (j=0; j<lpStream[dwPos+1]; j++) { const BYTE *ps = lpStream+dwPos+34+14*j; Modified: trunk/OpenMPT/soundlib/Load_med.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/Load_med.cpp 2006-08-13 09:05:14 UTC (rev 159) @@ -696,11 +696,13 @@ // Song Comments UINT annotxt = BigEndian(pmex->annotxt); UINT annolen = BigEndian(pmex->annolen); - if ((annotxt) && (annolen) && (annotxt+annolen <= dwMemLength)) - { + annolen = min(annolen, MED_MAX_COMMENT_LENGTH); //Thanks to Luigi Auriemma for pointing out an overflow risk + if ((annotxt) && (annolen) && (annotxt+annolen <= dwMemLength) ) { m_lpszSongComments = new char[annolen+1]; - memcpy(m_lpszSongComments, lpStream+annotxt, annolen); - m_lpszSongComments[annolen] = 0; + if (m_lpszSongComments) { + memcpy(m_lpszSongComments, lpStream+annotxt, annolen); + m_lpszSongComments[annolen] = 0; + } } // Song Name UINT songname = BigEndian(pmex->songname); Modified: trunk/OpenMPT/soundlib/Load_mid.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mid.cpp 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/Load_mid.cpp 2006-08-13 09:05:14 UTC (rev 159) @@ -424,8 +424,7 @@ penv->nNNA = NNA_NOTEOFF; penv->nDCT = (nChannel == MIDI_DRUMCHANNEL) ? DCT_SAMPLE : DCT_NOTE; penv->nDNA = DNA_NOTEFADE; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); for (UINT j=0; j<120; j++) { int mapnote = j+1; Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2006-08-13 09:05:14 UTC (rev 159) @@ -385,8 +385,7 @@ penv->nFadeOut = xmsh.volfade; penv->nPan = 128; penv->nPPC = 5*12; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); if (xmsh.vtype & 1) penv->dwFlags |= ENV_VOLUME; if (xmsh.vtype & 2) penv->dwFlags |= ENV_VOLSUSTAIN; if (xmsh.vtype & 4) penv->dwFlags |= ENV_VOLLOOP; Modified: trunk/OpenMPT/soundlib/Sampleio.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sampleio.cpp 2006-08-13 09:04:37 UTC (rev 158) +++ trunk/OpenMPT/soundlib/Sampleio.cpp 2006-08-13 09:05:14 UTC (rev 159) @@ -82,8 +82,7 @@ penv->nGlobalVol = 64; penv->nPan = 128; penv->nPPC = 5*12; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); for (UINT iinit=0; iinit<128; iinit++) { penv->Keyboard[iinit] = nSample; @@ -1167,8 +1166,7 @@ if (penv->nPanLoopStart >= penv->nPanLoopEnd) penv->dwFlags &= ~ENV_PANLOOP; penv->nGlobalVol = 64; penv->nPPC = 5*12; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); for (UINT ienv=0; ienv<12; ienv++) { penv->VolPoints[ienv] = (WORD)pih->venv[ienv*2]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-08-13 09:04:46
|
Revision: 158 Author: rewbs Date: 2006-08-13 02:04:37 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=158&view=rev Log Message: ----------- v1.17.02.44 + <rewbs> Added release section to volume envelope (see: http://openmpt.xwiki.com/xwiki/bin/view/Manual/InstrumentReleaseEnvelope). IT only. . <rewbs> Overflow fixes in file loading functions (see: http://aluigi.altervista.org/adv/mptho-adv.txt) . <rewbs> Greyed out irrelevant items in the orderlist context menu. Modified Paths: -------------- trunk/OpenMPT/soundlib/Load_it.cpp Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2006-06-20 00:44:57 UTC (rev 157) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2006-08-13 09:04:37 UTC (rev 158) @@ -211,8 +211,7 @@ penv->nVolSwing = pis->rv; penv->nPanSwing = pis->rp; penv->nPan = (pis->dfp & 0x7F) << 2; - penv->nResampling = SRCMODE_DEFAULT; - penv->nFilterMode = FLTMODE_UNCHANGED; + SetDefaultInstrumentValues(penv); if (penv->nPan > 256) penv->nPan = 128; if (pis->dfp < 0x80) penv->dwFlags |= ENV_SETPANNING; } @@ -249,8 +248,10 @@ streamPos += sizeof(DWORD); // name string - memcpy(&m_szNames[0],lpStream+streamPos,len); - streamPos += len; + if (streamPos+len<=dwMemLength && len<MAX_SAMPLES*32) { + memcpy(&m_szNames[0],lpStream+streamPos,len); + streamPos += len; + } // Song comments @@ -260,11 +261,15 @@ // allocate comment string if(m_lpszSongComments) delete m_lpszSongComments; - m_lpszSongComments = new char[id]; + if (id<dwMemLength) { + m_lpszSongComments = new char[id]; + } // m_lpszSongComments - if(id) memcpy(&m_lpszSongComments[0],lpStream+streamPos,id); - streamPos += id; + if (m_lpszSongComments && id && streamPos+id<=dwMemLength) { + memcpy(&m_lpszSongComments[0],lpStream+streamPos,id); + streamPos += id; + } // Song global config @@ -326,8 +331,10 @@ streamPos += sizeof(DWORD); // ChnSettings[i].szName - memcpy(&ChnSettings[i].szName[0],lpStream+streamPos,len); - streamPos += len; + if (streamPos+len<=dwMemLength && len<MAX_CHANNELNAME) { + memcpy(&ChnSettings[i].szName[0],lpStream+streamPos,len); + streamPos += len; + } } // Song mix plugins @@ -346,8 +353,10 @@ streamPos += sizeof(DWORD); // midi cfg - memcpy(&m_MidiCfg,lpStream+streamPos,id); - streamPos += id; + if (id<=sizeof(m_MidiCfg) && id+streamPos<=dwMemLength) { + memcpy(&m_MidiCfg,lpStream+streamPos,id); + streamPos += id; + } // Song Instruments @@ -363,8 +372,10 @@ // instruments' paths for(i=0; i<m_nInstruments; i++){ - memcpy(&m_szInstrumentPath[i][0],lpStream+streamPos,len); - streamPos += len; + if (len+streamPos<=dwMemLength && len<_MAX_PATH) { + memcpy(&m_szInstrumentPath[i][0],lpStream+streamPos,len); + streamPos += len; + } } // Song Orders @@ -375,8 +386,11 @@ streamPos += sizeof(DWORD); // order data - memcpy(&Order[0],lpStream+streamPos,size); - streamPos += size; + if (size+streamPos<=dwMemLength && size<MAX_ORDERS) { + memcpy(&Order[0],lpStream+streamPos,size); + streamPos += size; + } + // Song Patterns @@ -427,8 +441,11 @@ } // Pattern data - memcpy(Patterns[npat],lpStream+streamPos,m_nChannels * PatternSize[npat] * n); - streamPos += m_nChannels * PatternSize[npat] * n; + long datasize = m_nChannels * PatternSize[npat] * n; + if (streamPos+datasize<=dwMemLength) { + memcpy(Patterns[npat],lpStream+streamPos,datasize); + streamPos += datasize; + } } } @@ -3002,7 +3019,8 @@ void CSoundFile::SaveExtendedInstrumentProperties(INSTRUMENTHEADER *instruments[], UINT nInstruments, FILE* f) //------------------------------------------------------------------------------------------------------------ -// Used only when saving IT and XM. ITI, ITP saves using Ericus' macros etc... +// Used only when saving IT and XM. +// ITI, ITP saves using Ericus' macros etc... // The reason is that ITs and XMs save [code][size][ins1.Value][ins2.Value]... // whereas ITP saves [code][size][ins1.Value][code][size][ins2.Value]... // too late to turn back.... @@ -3029,6 +3047,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); return; } @@ -3134,4 +3155,5 @@ return; -} \ No newline at end of file +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-06-20 00:47:14
|
Revision: 157 Author: rewbs Date: 2006-06-19 17:44:57 -0700 (Mon, 19 Jun 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=157&view=rev Log Message: ----------- . v1.17.02.43 + <rewbs> You can now load up new plugins from anywhere, not just the General tab. Select "Plugin Manager..." from the view menu. This can also be assigned to a global hotkey. Limitation: currently plugins added to a song in this manner with always be put in the first empty slot. In a future version you'll be able to choose the slot directly from that window. + <rewbs> "Cleanup Plugins" to remove any plugs that are not associated to a channel and not used by an instrument and not used as an output for any used plugs. . <rewbs> Fixed channel limits. Should be able to correctly save IT pattern data with up to 127 chans. There's only space for 64 channel headers though (channel names etc..). XMs restricted to 64 chans. . <rewbs> Added channel limit check when adding chans from the pattern editor. . <rewbs> Fixed instant crash with SampleTank 2.1. Modified Paths: -------------- trunk/OpenMPT/mptrack/Childfrm.cpp trunk/OpenMPT/mptrack/Childfrm.h trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Globals.cpp trunk/OpenMPT/mptrack/Globals.h trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe trunk/OpenMPT/mptrack/bin/mptrack_P3.exe trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe trunk/OpenMPT/mptrack/bin/version trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/packageTemplate/History.txt trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/Childfrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/Childfrm.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Childfrm.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -220,7 +220,18 @@ return TRUE; } +void CChildFrame::ForceRefresh() +//------------------------------ +{ + CModControlView *pModView; + if ((pModView = (CModControlView *)m_wndSplitter.GetPane(0, 0)) != NULL) + { + pModView->ForceRefresh(); + } + return; +} + void CChildFrame::SavePosition(BOOL bForce) //----------------------------------------- { Modified: trunk/OpenMPT/mptrack/Childfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Childfrm.h 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Childfrm.h 2006-06-20 00:44:57 UTC (rev 157) @@ -102,6 +102,7 @@ // Operations public: BOOL ChangeViewClass(CRuntimeClass* pNewViewClass, CCreateContext* pContext=NULL); + void ForceRefresh(); void SavePosition(BOOL bExit=FALSE); CHAR* GetCurrentViewClassName(); //rewbs.varWindowSize LRESULT SendViewMessage(UINT uMsg, LPARAM lParam=0) const; Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -2050,7 +2050,7 @@ commands[kcNoteOffOld].Message = "Note off (don't remember instrument)"; commands[kcViewAddPlugin].UID = 1669; - commands[kcViewAddPlugin].Message = "View 'Add Plugin' Window"; + commands[kcViewAddPlugin].Message = "View Plugin Manager"; commands[kcViewAddPlugin].isHidden = false; commands[kcViewAddPlugin].isDummy = false; Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -134,6 +134,7 @@ if (m_pModDoc) m_pModDoc->SetFollowWnd(m_hWnd, MPTNOTIFY_MASTERVU); if (pMainFrm) pMainFrm->SetFollowSong(m_pModDoc, m_hWnd, TRUE, MPTNOTIFY_MASTERVU); CMainFrame::EnableLowLatencyMode(FALSE); + PostViewMessage(VIEWMSG_SETACTIVE, NULL); SetFocus(); } Modified: trunk/OpenMPT/mptrack/Globals.cpp =================================================================== --- trunk/OpenMPT/mptrack/Globals.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Globals.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -272,6 +272,18 @@ } +void CModControlView::ForceRefresh() +//--------------------------------- +{ + SetActivePage(GetActivePage()); +} + +int CModControlView::GetActivePage() +//----------------------------------- +{ + return m_nActiveDlg; +} + BOOL CModControlView::SetActivePage(int nIndex, LPARAM lParam) //------------------------------------------------------------ { Modified: trunk/OpenMPT/mptrack/Globals.h =================================================================== --- trunk/OpenMPT/mptrack/Globals.h 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Globals.h 2006-06-20 00:44:57 UTC (rev 157) @@ -143,11 +143,13 @@ void InstrumentChanged(int nInstr=-1) { m_nInstrumentChanged = nInstr; } int GetInstrumentChange() const { return m_nInstrumentChanged; } void SetMDIParentFrame(HWND hwnd) { m_hWndMDI = hwnd; } + void ForceRefresh(); protected: void RecalcLayout(); void UpdateView(DWORD dwHintMask=0, CObject *pHint=NULL); BOOL SetActivePage(int nIndex=-1, LPARAM lParam=-1); + int GetActivePage(); //{{AFX_VIRTUAL(CModControlView) public: Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -67,7 +67,7 @@ // -> CODE#0002 // -> DESC="list box to choose VST plugin presets (programs)" - ON_COMMAND(ID_PLUGIN_SETUP, OnPluginSetup) + ON_COMMAND(ID_PLUGIN_SETUP, OnPluginManager) // -! NEW_FEATURE#0002 // -> CODE#0015 @@ -2304,10 +2304,31 @@ // -> CODE#0002 // -> DESC="list box to choose VST plugin presets (programs)" -void CMainFrame::OnPluginSetup() +void CMainFrame::OnPluginManager() { - CSelectPluginDlg dlg(NULL, GetActiveDoc(), this); + int nPlugslot=-1; + CModDoc* pModDoc = GetActiveDoc(); + + if (pModDoc) { + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + //Find empty plugin slot + for (int nPlug=0; nPlug<MAX_MIXPLUGINS; nPlug++) { + PSNDMIXPLUGIN pCandidatePlugin = &pSndFile->m_MixPlugins[nPlug]; + if (pCandidatePlugin->pMixPlugin == NULL) { + nPlugslot=nPlug; + break; + } + } + } + CSelectPluginDlg dlg(GetActiveDoc(), nPlugslot, this); dlg.DoModal(); + if (pModDoc) { + //Refresh views + pModDoc->UpdateAllViews(NULL, HINT_MIXPLUGINS|HINT_MODTYPE); + //Refresh Controls + CChildFrame *pActiveChild = (CChildFrame *)MDIGetActive(); + pActiveChild->ForceRefresh(); + } } // -! NEW_FEATURE#0002 @@ -2696,7 +2717,7 @@ case kcFileOpen: theApp.OnFileOpen(); break; case kcMidiRecord: OnMidiRecord(); break; case kcHelp: CMDIFrameWnd::OnHelp(); break; - case kcViewAddPlugin: OnPluginSetup(); break; + case kcViewAddPlugin: OnPluginManager(); break; case kcViewChannelManager: OnChannelManager(); break; case kcNextDocument: MDINext(); break; case kcPrevDocument: MDIPrev(); break; Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2006-06-20 00:44:57 UTC (rev 157) @@ -588,7 +588,7 @@ // -> CODE#0002 // -> DESC="list box to choose VST plugin presets (programs)" - afx_msg void OnPluginSetup(); + afx_msg void OnPluginManager(); // -! NEW_FEATURE#0002 // -> CODE#0015 Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -46,6 +46,7 @@ ON_COMMAND(ID_INSERT_INSTRUMENT, OnInsertInstrument) ON_COMMAND(ID_CLEANUP_SAMPLES, OnCleanupSamples) ON_COMMAND(ID_CLEANUP_INSTRUMENTS, OnCleanupInstruments) + ON_COMMAND(ID_CLEANUP_PLUGS, OnCleanupPlugs) ON_COMMAND(ID_CLEANUP_PATTERNS, OnCleanupPatterns) ON_COMMAND(ID_CLEANUP_SONG, OnCleanupSong) ON_COMMAND(ID_CLEANUP_REARRANGE, OnRearrangePatterns) @@ -1770,7 +1771,17 @@ ShowLog("Instrument Cleanup", CMainFrame::GetMainFrame()); } +void CModDoc::OnCleanupPlugs() +//---------------------------------- +{ + ClearLog(); + RemoveUnusedPlugs(); + UpdateAllViews(NULL, HINT_MODTYPE); + ShowLog("Plugin Cleanup", CMainFrame::GetMainFrame()); +} + + void CModDoc::OnCleanupPatterns() //------------------------------- { @@ -1788,6 +1799,7 @@ RemoveUnusedPatterns(); RemoveUnusedInstruments(); RemoveUnusedSamples(); + RemoveUnusedPlugs(); UpdateAllViews(NULL, HINT_MODTYPE|HINT_MODSEQUENCE); ShowLog("Song Cleanup", CMainFrame::GetMainFrame()); } Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Moddoc.h 2006-06-20 00:44:57 UTC (rev 157) @@ -147,6 +147,7 @@ BOOL ConvertInstrumentsToSamples();; BOOL RemoveUnusedSamples(); BOOL RemoveUnusedInstruments(); + BOOL RemoveUnusedPlugs(); BOOL RemoveUnusedPatterns(BOOL bRemove=TRUE); LONG InsertPattern(LONG nOrd=-1, UINT nRows=64); LONG InsertSample(BOOL bLimit=FALSE); @@ -274,6 +275,7 @@ afx_msg void OnInsertInstrument(); afx_msg void OnCleanupSamples(); afx_msg void OnCleanupInstruments(); + afx_msg void OnCleanupPlugs(); afx_msg void OnCleanupPatterns(); afx_msg void OnCleanupSong(); afx_msg void OnRearrangePatterns(); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -324,7 +324,24 @@ BOOL CModDoc::ChangeNumChannels(UINT nNewChannels) //------------------------------------------------ { - if (nNewChannels == m_SndFile.m_nChannels) return TRUE; + int maxChans; + if (m_SndFile.m_nType&MOD_TYPE_IT) { + maxChans=max_chans_IT; + } else if (m_SndFile.m_nType&MOD_TYPE_XM) { + maxChans=max_chans_XM; + } else if (m_SndFile.m_nType&MOD_TYPE_S3M) { + maxChans=max_chans_S3M; + } else { + maxChans=max_chans_MOD; + } + if (nNewChannels > maxChans) { + CString error; + error.Format("Error: Max number of channels for this type is %d", maxChans); + ::AfxMessageBox(error, MB_OK|MB_ICONEXCLAMATION); + return FALSE; + } + + if (nNewChannels == m_SndFile.m_nChannels) return FALSE; if (nNewChannels < m_SndFile.m_nChannels) { UINT nChnToRemove = 0; @@ -363,7 +380,7 @@ if ((--nFound) == 0) break; } } - if (rem.DoModal() != IDOK) return TRUE; + if (rem.DoModal() != IDOK) return FALSE; // Removing selected channels RemoveChannels(rem.m_bChnMask); } else @@ -379,7 +396,7 @@ { END_CRITICAL(); AddToLog("ERROR: Not enough memory to create new channels!\nPattern Data is corrupted!\n"); - return TRUE; + return FALSE; } for (UINT j=0; j<m_SndFile.PatternSize[i]; j++) { @@ -395,7 +412,7 @@ SetModified(); ClearUndo(); UpdateAllViews(NULL, HINT_MODTYPE); - return FALSE; + return TRUE; } @@ -841,7 +858,83 @@ return FALSE; } +BOOL CModDoc::RemoveUnusedPlugs() +//------------------------------- +{ + BYTE usedmap[MAX_MIXPLUGINS]; + memset(usedmap, false, MAX_MIXPLUGINS); + + for (int nPlug=0; nPlug<MAX_MIXPLUGINS; nPlug++) { + + //Is the plugin assigned to a channel? + for (int nChn=0; nChn<m_SndFile.m_nChannels; nChn++) { + if (m_SndFile.ChnSettings[nChn].nMixPlugin == nPlug+1) { + usedmap[nPlug]=true; + break; + } + } + + //Is the plugin used by an instrument? + for (int nIns=1; nIns<=m_SndFile.m_nInstruments; nIns++) { + if (m_SndFile.Headers[nIns] && (m_SndFile.Headers[nIns]->nMixPlug == nPlug+1)) { + usedmap[nPlug]=true; + break; + } + } + + //Is the plugin assigned to master? + if (m_SndFile.m_MixPlugins[nPlug].Info.dwInputRouting & MIXPLUG_INPUTF_MASTEREFFECT) { + usedmap[nPlug]=true; + } + + //all outputs of used plugins count as used + if (usedmap[nPlug]==true) { + if (m_SndFile.m_MixPlugins[nPlug].Info.dwOutputRouting & 0x80) { + int output = m_SndFile.m_MixPlugins[nPlug].Info.dwOutputRouting & 0x7f; + usedmap[output]=true; + } + } + + } + + //Remove unused plugins + int nRemoved=0; + for (int nPlug=0; nPlug<MAX_MIXPLUGINS; nPlug++) { + SNDMIXPLUGIN* pPlug = &m_SndFile.m_MixPlugins[nPlug]; + if (usedmap[nPlug] || !pPlug) { + Log("Keeping mixplug addess (%d): %X\n", nPlug, &(pPlug->pMixPlugin)); + continue; + } + + if (pPlug->pPluginData) { + delete pPlug->pPluginData; + pPlug->pPluginData = NULL; + } + if (pPlug->pMixPlugin) { + pPlug->pMixPlugin->Release(); + pPlug->pMixPlugin=NULL; + } + if (pPlug->pMixState) { + delete pPlug->pMixState; + } + + memset(&(pPlug->Info), 0, sizeof(SNDMIXPLUGININFO)); + Log("Zeroing range (%d) %X - %X\n", nPlug, &(pPlug->Info), &(pPlug->Info)+sizeof(SNDMIXPLUGININFO)); + pPlug->nPluginDataSize=0; + pPlug->fDryRatio=0; + pPlug->defaultProgram=0; + nRemoved++; + + } + + if (nRemoved) { + SetModified(); + } + + return nRemoved; +} + BOOL CModDoc::RemoveUnusedInstruments() //------------------------------------- { Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -1212,8 +1212,7 @@ if ((pModDoc) && (m_nCurrentPlugin < MAX_MIXPLUGINS)) { CSoundFile *pSndFile = pModDoc->GetSoundFile(); - PSNDMIXPLUGIN pPlugin = &pSndFile->m_MixPlugins[m_nCurrentPlugin]; - CSelectPluginDlg dlg(pPlugin, pModDoc, this); //rewbs.plugDocAware + CSelectPluginDlg dlg(pModDoc, m_nCurrentPlugin, this); if (dlg.DoModal() == IDOK) { if (pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT)) Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -2401,16 +2401,17 @@ BeginWaitCursor(); //First adding channel as the last channel... - pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1); - pSndFile->SetChannelSettingsToDefault(pSndFile->m_nChannels-1); - //...and then moving it to right position. - pSndFile->MoveChannel(pSndFile->m_nChannels-1, nChn); + if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1)) { + pSndFile->SetChannelSettingsToDefault(pSndFile->m_nChannels-1); + //...and then moving it to right position. + pSndFile->MoveChannel(pSndFile->m_nChannels-1, nChn); - pModDoc->SetModified(); - pModDoc->ClearUndo(); - pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS); //refresh channel headers - pModDoc->UpdateAllViews(NULL, HINT_MODTYPE); //updates(?) the channel number to general tab display - SetCurrentPattern(m_nPattern); + pModDoc->SetModified(); + pModDoc->ClearUndo(); + pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS); //refresh channel headers + pModDoc->UpdateAllViews(NULL, HINT_MODTYPE); //updates(?) the channel number to general tab display + SetCurrentPattern(m_nPattern); + } EndWaitCursor(); } @@ -2424,15 +2425,16 @@ if (pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return; BeginWaitCursor(); - pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1); - pSndFile->SetChannelSettingsToDefault(pSndFile->m_nChannels-1); - pSndFile->MoveChannel(pSndFile->m_nChannels-1, nChn); + if (pModDoc->ChangeNumChannels(pSndFile->m_nChannels+1)) { + pSndFile->SetChannelSettingsToDefault(pSndFile->m_nChannels-1); + pSndFile->MoveChannel(pSndFile->m_nChannels-1, nChn); - pModDoc->SetModified(); - pModDoc->ClearUndo(); - pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS); - pModDoc->UpdateAllViews(NULL, HINT_MODTYPE); - SetCurrentPattern(m_nPattern); + pModDoc->SetModified(); + pModDoc->ClearUndo(); + pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS); + pModDoc->UpdateAllViews(NULL, HINT_MODTYPE); + SetCurrentPattern(m_nPattern); + } EndWaitCursor(); } Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -999,11 +999,19 @@ } -CSelectPluginDlg::CSelectPluginDlg(PSNDMIXPLUGIN pPlugin, CModDoc *pModDoc, CWnd *parent):CDialog(IDD_SELECTMIXPLUGIN, parent) +CSelectPluginDlg::CSelectPluginDlg(CModDoc *pModDoc, int nPlugSlot, CWnd *parent):CDialog(IDD_SELECTMIXPLUGIN, parent) //---------------------------------------------------------------------------------------------------------- { - m_pModDoc = pModDoc; //rewbs.plugDocAware - m_pPlugin = pPlugin; + m_pPlugin = NULL; + m_pModDoc = pModDoc; + m_nPlugSlot = nPlugSlot; + + if (m_pModDoc) { + CSoundFile* pSndFile = pModDoc->GetSoundFile(); + if (pSndFile && (0<=m_nPlugSlot && m_nPlugSlot<MAX_MIXPLUGINS)) { + m_pPlugin = &pSndFile->m_MixPlugins[m_nPlugSlot]; + } + } } @@ -1016,6 +1024,15 @@ CDialog::OnInitDialog(); m_treePlugins.ModifyStyle(dwRemove, dwAdd); m_treePlugins.SetImageList(CMainFrame::GetMainFrame()->GetImageList(), TVSIL_NORMAL); + + if (m_pPlugin) { + CString targetSlot; + targetSlot.Format("Put in FX%02d", m_nPlugSlot+1); + SetDlgItemText(IDOK, targetSlot); + ::EnableWindow(::GetDlgItem(m_hWnd, IDOK), TRUE); + } else { + ::EnableWindow(::GetDlgItem(m_hWnd, IDOK), FALSE); + } MoveWindow(CMainFrame::GetMainFrame()->gnPlugWindowX, CMainFrame::GetMainFrame()->gnPlugWindowY, @@ -1065,7 +1082,7 @@ { // -> CODE#0002 // -> DESC="list box to choose VST plugin presets (programs)" - if(m_pPlugin == NULL) { CDialog::OnOK(); return; } + if(m_pPlugin==NULL) { CDialog::OnOK(); return; } // -! NEW_FEATURE#0002 BOOL bChanged = FALSE; @@ -1371,11 +1388,11 @@ if (m_treePlugins) { m_treePlugins.MoveWindow(11,11, cx-105, cy-40, FALSE); - ::MoveWindow(GetDlgItem(IDC_TEXT1)->m_hWnd, 11,cy-25, cx-22, 25, FALSE); - ::MoveWindow(GetDlgItem(IDOK)->m_hWnd, cx-85, 11, 75, 23, FALSE); - ::MoveWindow(GetDlgItem(IDCANCEL)->m_hWnd, cx-85, 39, 75, 23, FALSE); - ::MoveWindow(GetDlgItem(IDC_BUTTON1)->m_hWnd , cx-85, cy-80, 75, 23, FALSE); - ::MoveWindow(GetDlgItem(IDC_BUTTON2)->m_hWnd, cx-85, cy-52, 75, 23, FALSE); + ::MoveWindow(GetDlgItem(IDC_TEXT1)->m_hWnd, 11,cy-25, cx-22, 25, FALSE); + ::MoveWindow(GetDlgItem(IDOK)->m_hWnd, cx-85, 11, 75, 23, FALSE); + ::MoveWindow(GetDlgItem(IDCANCEL)->m_hWnd, cx-85, 39, 75, 23, FALSE); + ::MoveWindow(GetDlgItem(IDC_BUTTON1)->m_hWnd , cx-85, cy-80, 75, 23, FALSE); + ::MoveWindow(GetDlgItem(IDC_BUTTON2)->m_hWnd, cx-85, cy-52, 75, 23, FALSE); Invalidate(); } } @@ -1508,8 +1525,8 @@ } Dispatch(effMainsChanged, 0, 1, NULL, 0.0f); - m_nInputs = (m_pEffect->numInputs < 16) ? m_pEffect->numInputs : 16; - m_nOutputs = (m_pEffect->numOutputs < 16) ? m_pEffect->numOutputs : 16; + m_nInputs = m_pEffect->numInputs; + m_nOutputs = m_pEffect->numOutputs; m_pInputs = (float **)new char[m_nInputs*sizeof(float *)]; m_pOutputs = (float **)new char[m_nOutputs*sizeof(float *)]; m_pTempBuffer = (float **)new char[m_nOutputs*sizeof(float *)]; //rewbs.dryRatio @@ -2052,6 +2069,50 @@ m_pMixStruct->fDryRatio = 1.0-(static_cast<float>(param)/127.0f); } +/* +void CVstPlugin::Process(float **pOutputs, unsigned long nSamples) +//---------------------------------------------------------------- +{ + float wetRatio, dryRatio; + wetRatio *= m_fGain; + dryRatio *= m_fGain; + + ProcessVSTEvents(); + if ((m_pEffect) && (m_pProcessFP) && (m_pInputs) && (m_pOutputs) && (m_pMixStruct)) { + + //Merge stereo input before sending to the plug if the plug can only handle one input. + if (m_pEffect->numInputs == 1) { + for (UINT i=0; i<nSamples; i++) { + m_pInputs[0][i] = 0.5f*m_pInputs[0][i] + 0.5f*m_pInputs[1][i]; + } + } + + //Clear the buffers that will be receiving the plugin's output. + for (UINT iOut=0; iOut<m_nOutputs; iOut++) { + memset(m_pTempBuffer[iOut], 0, nSamples*sizeof(float)); + m_pOutputs[iOut] = m_pTempBuffer[iOut]; + } + + //Do the VST processing magic + m_dwTimeAtStartOfProcess = timeGetTime(); + try { + ASSERT(nSamples<=MIXBUFFERSIZE); + m_pProcessFP(m_pEffect, m_pInputs, m_pOutputs, nSamples); + } catch (char * str) { + m_pMixStruct->Info.dwInputRouting |= MIXPLUG_INPUTF_BYPASS; + CString processMethod = (m_pEffect->flags & effFlagsCanReplacing) ? "processReplacing" : "process"; + CVstPluginManager::ReportPlugException("The plugin %s threw an exception in %s: %s. It has automatically been set to \"Bypass\".", m_pMixStruct->Info.szName, processMethod, str); + ClearVSTEvents(); + SetEvent(processCalled); + } + + for(UINT i=0; i<nSamples; i++) { + pOutL[stream][i] += m_pTempBuffer[stream][i]*wetRatio + m_pInputs[stream%2][i]*dryRatio; + } + + } +} +*/ void CVstPlugin::Process(float *pOutL, float *pOutR, unsigned long nSamples) //-------------------------------------------------------------------------- { @@ -2080,7 +2141,7 @@ //RecalculateGain(); - //Merge stereo before sending to the plug if it is mono + //Merge stereo input before sending to the plug if the plug can only handle one input. if (m_pEffect->numInputs == 1) { for (UINT i=0; i<nSamples; i++) { Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/Vstplug.h 2006-06-20 00:44:57 UTC (rev 157) @@ -228,12 +228,13 @@ //==================================== { protected: + int m_nPlugSlot; PSNDMIXPLUGIN m_pPlugin; CModDoc *m_pModDoc; CTreeCtrl m_treePlugins; public: - CSelectPluginDlg(PSNDMIXPLUGIN, CModDoc *pModDoc, CWnd *parent); //rewbs.plugDocAware + CSelectPluginDlg(CModDoc *pModDoc, int nPlugSlot, CWnd *parent); //rewbs.plugDocAware VOID DoClose(); VOID UpdatePluginsList(DWORD forceSelect=0); bool VerifyPlug(PVSTPLUGINLIB plug); Modified: trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_P3.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/version =================================================================== --- trunk/OpenMPT/mptrack/bin/version 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/bin/version 2006-06-20 00:44:57 UTC (rev 157) @@ -1 +1 @@ -1.17.02.42 \ No newline at end of file +1.17.02.43 \ No newline at end of file Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -381,6 +381,25 @@ return FALSE; } + int sel = m_ChannelsBox.GetItemData(m_ChannelsBox.GetCurSel()); + int type = m_TypeBox.GetItemData(m_TypeBox.GetCurSel()); + int maxChans; + if (type&MOD_TYPE_IT) { + maxChans=max_chans_IT; + } else if (type&MOD_TYPE_XM) { + maxChans=max_chans_XM; + } else if (type&MOD_TYPE_S3M) { + maxChans=max_chans_S3M; + } else { + maxChans=max_chans_MOD; + } + if (sel > maxChans) { + CString error; + error.Format("Error: Max number of channels for this type is %d", maxChans); + ::AfxMessageBox(error, MB_OK|MB_ICONEXCLAMATION); + return FALSE; + } + return TRUE; } Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/mptrack.rc 2006-06-20 00:44:57 UTC (rev 157) @@ -145,6 +145,7 @@ MENUITEM "Cleanup S&ong", ID_CLEANUP_SONG MENUITEM "Remove &All Instruments", ID_INSTRUMENTS_REMOVEALL MENUITEM "Rearrange Samples", ID_REARRANGE_SAMPLES + MENUITEM "Cleanup &Plugins", ID_CLEANUP_PLUGS END MENUITEM SEPARATOR MENUITEM "&Find\tCtrl+F", ID_EDIT_FIND @@ -1588,11 +1589,11 @@ CAPTION "Mix Plugins" FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN - DEFPUSHBUTTON "OK",IDOK,161,7,50,14 - PUSHBUTTON "Cancel",IDCANCEL,161,24,50,14 + DEFPUSHBUTTON "Add to Song",IDOK,161,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,161,132,50,14 LTEXT "",IDC_TEXT1,7,151,204,8 - PUSHBUTTON "Add Plugin...",IDC_BUTTON1,161,115,50,14 - PUSHBUTTON "Remove",IDC_BUTTON2,161,132,50,14 + PUSHBUTTON "New plugin...",IDC_BUTTON1,161,46,50,14,BS_MULTILINE + PUSHBUTTON "Remove",IDC_BUTTON2,161,63,50,14 CONTROL "Tree1",IDC_TREE1,"SysTreeView32",TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | WS_TABSTOP,7,7,148,140, WS_EX_CLIENTEDGE @@ -1893,7 +1894,7 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,17,2,42 + FILEVERSION 1,17,2,43 PRODUCTVERSION 0,0,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG @@ -1911,7 +1912,7 @@ BEGIN VALUE "CompanyName", "Olivier Lapicque / OpenMPT team" VALUE "FileDescription", "OpenMPT / ModPlug Tracker" - VALUE "FileVersion", "1, 17, 2, 42" + VALUE "FileVersion", "1, 17, 2, 43" VALUE "InternalName", "Modplug Tracker" VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2005 GPL." VALUE "LegalTrademarks", "M.O.D.P.L.U.G" Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2006-06-20 00:44:57 UTC (rev 157) @@ -807,6 +807,70 @@ </Filter> </Filter> <Filter + Name="Resource Files" + Filter="ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"> + <File + RelativePath="res\bitmap1.bmp"> + </File> + <File + RelativePath=".\res\colors.bmp"> + </File> + <File + RelativePath=".\res\dragging.cur"> + </File> + <File + RelativePath=".\Res\envbar.bmp"> + </File> + <File + RelativePath=".\res\img_list.bmp"> + </File> + <File + RelativePath=".\res\mainbar.bmp"> + </File> + <File + RelativePath=".\res\moddoc.ico"> + </File> + <File + RelativePath=".\res\modplthingmorecontrast.bmp"> + </File> + <File + RelativePath=".\res\MPTRACK.bmp"> + </File> + <File + RelativePath=".\res\mptrack.ico"> + </File> + <File + RelativePath=".\res\mptrack.rc2"> + </File> + <File + RelativePath=".\Res\nodrag.cur"> + </File> + <File + RelativePath=".\res\nodrop.cur"> + </File> + <File + RelativePath=".\res\patterns.bmp"> + </File> + <File + RelativePath=".\res\rt_manif.bin"> + </File> + <File + RelativePath=".\Res\smptoolb.bmp"> + </File> + <File + RelativePath=".\Res\splash.bmp"> + </File> + <File + RelativePath=".\res\splashno.bmp"> + </File> + <File + RelativePath=".\res\view_pat.bmp"> + </File> + <File + RelativePath=".\res\vumeters.bmp"> + </File> + </Filter> + <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl"> <File @@ -966,70 +1030,6 @@ RelativePath="..\soundlib\WindowedFIR.h"> </File> </Filter> - <Filter - Name="Resource Files" - Filter="ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"> - <File - RelativePath="res\bitmap1.bmp"> - </File> - <File - RelativePath=".\res\colors.bmp"> - </File> - <File - RelativePath=".\res\dragging.cur"> - </File> - <File - RelativePath=".\Res\envbar.bmp"> - </File> - <File - RelativePath=".\res\img_list.bmp"> - </File> - <File - RelativePath=".\res\mainbar.bmp"> - </File> - <File - RelativePath=".\res\moddoc.ico"> - </File> - <File - RelativePath=".\res\modplthingmorecontrast.bmp"> - </File> - <File - RelativePath=".\res\MPTRACK.bmp"> - </File> - <File - RelativePath=".\res\mptrack.ico"> - </File> - <File - RelativePath=".\res\mptrack.rc2"> - </File> - <File - RelativePath=".\Res\nodrag.cur"> - </File> - <File - RelativePath=".\res\nodrop.cur"> - </File> - <File - RelativePath=".\res\patterns.bmp"> - </File> - <File - RelativePath=".\res\rt_manif.bin"> - </File> - <File - RelativePath=".\Res\smptoolb.bmp"> - </File> - <File - RelativePath=".\Res\splash.bmp"> - </File> - <File - RelativePath=".\res\splashno.bmp"> - </File> - <File - RelativePath=".\res\view_pat.bmp"> - </File> - <File - RelativePath=".\res\vumeters.bmp"> - </File> - </Filter> <File RelativePath=".\mptrack.reg"> </File> Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/mptrack/resource.h 2006-06-20 00:44:57 UTC (rev 157) @@ -942,6 +942,7 @@ #define ID_PATTERN_REMOVECHANNELDIALOG 59151 #define ID_Menu 59200 #define ID_FILE_SAVECOMPAT 59202 +#define ID_CLEANUP_PLUGS 59205 // Next default values for new objects // @@ -949,8 +950,8 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 510 -#define _APS_NEXT_COMMAND_VALUE 59203 -#define _APS_NEXT_CONTROL_VALUE 2255 +#define _APS_NEXT_COMMAND_VALUE 59206 +#define _APS_NEXT_CONTROL_VALUE 2256 #define _APS_NEXT_SYMED_VALUE 901 #endif #endif Modified: trunk/OpenMPT/packageTemplate/History.txt =================================================================== --- trunk/OpenMPT/packageTemplate/History.txt 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/packageTemplate/History.txt 2006-06-20 00:44:57 UTC (rev 157) @@ -8,6 +8,14 @@ ?: other (tx XYZ): thanks to XYZ for telling me about the bug +. v1.17.02.43 + + <rewbs> You can now load up new plugins from anywhere, not just the General tab. Select "Plugin Manager..." from the view menu. This can also be assigned to a global hotkey. + Limitation: currently plugins added to a song in this manner with always be put in the first empty slot. In a future version you'll be able to choose the slot directly from that window. + + <rewbs> "Cleanup Plugins" to remove any plugs that are not associated to a channel and not used by an instrument and not used as an output for any used plugs. + . <rewbs> Fixed channel limits. Should be able to correctly save IT pattern data with up to 127 chans. There's only space for 64 channel headers though (channel names etc..). XMs restricted to 64 chans. + . <rewbs> Added channel limit check when adding chans from the pattern editor. + . <rewbs> Fixed instant crash with SampleTank 2.1. + . v1.17.02.42 + <rewbs> "Compatibility export" in file menu: save as 'plain' IT, without all of OpenMPT's crap. IT only for now (not XM). . <rewbs> Set instrument in pattern editor should work when no note is specified (tx Torvus - http://lpchip.com/modplug/viewtopic.php?t=470) @@ -22,6 +30,7 @@ . <rewbs> Fixed the following settings that were not saving correctly: mod document window status, row spacing, channel VU meters, channel effect visibility, Most recent files list, Toolbar settings. . <rewbs> Process priority no longer defaults to high. + . v 1.17.02.40 + <Relabsoluness> Added indicator of currently playing pattern to orderlist. + <Relabsoluness> 'Loop pattern' and 'follow song' keys should now work when orderlist has focus. Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb =================================================================== --- trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/packageTemplate/extraKeymaps/UK_mpt_it2_hybrid_(rewbs).mkb 2006-06-20 00:44:57 UTC (rev 157) @@ -280,3 +280,5 @@ //----( Instrument Context [top] (17) )------------ //----( Comments Context [top] (18) )------------ + +//----( Unknown Context (19) )------------ Modified: trunk/OpenMPT/soundlib/Fastmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/soundlib/Fastmix.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -1847,6 +1847,19 @@ } } + /* + if (pPlugin->multiRouting) { + int nOutput=0; + for (int nOutput=0; nOutput<pPlugin->nOutputs/2; nOutput++) { + destinationPlug = pPlugin->multiRoutingDestinations[nOutput]; + pOutState = m_MixPlugins[destinationPlug].pMixState; + pOutputs[2*nOutput] = pOutState->pOutBufferL; + pOutputs[2*(nOutput+1)] = pOutState->pOutBufferR; + } + + } +*/ + if (pPlugin->Info.dwInputRouting & MIXPLUG_INPUTF_MASTEREFFECT) { if (!bMasterMix) Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -665,11 +665,7 @@ m_nSongPreAmp=100; } // Reading Channels Pan Positions -// -> CODE#0006 -// -> DESC="misc quantity changes" -// for (int ipan=0; ipan<64; ipan++) if (pifh->chnpan[ipan] != 0xFF) - for (int ipan=0; ipan<MAX_BASECHANNELS; ipan++) if (pifh->chnpan[ipan] != 0xFF) -// -! BEHAVIOUR_CHANGE#0006 + for (int ipan=0; ipan</*MAX_BASECHANNELS*/64; ipan++) if (pifh->chnpan[ipan] != 0xFF) //Header only has room for settings for 64 chans... { ChnSettings[ipan].nVolume = pifh->chnvol[ipan]; ChnSettings[ipan].nPan = 128; @@ -814,7 +810,8 @@ UINT ch = b & IT_bitmask_patternChanField_c; // 0x7f We have some data grab a byte keeping only 127 bits if (ch) - ch = (ch - 1) & IT_bitmask_patternChanMask_c; // 0x3f mask of the byte again, keeping only 64 bits + ch = (ch - 1);// & IT_bitmask_patternChanMask_c; // 0x3f mask of the byte again, keeping only 64 bits + if (b & IT_bitmask_patternChanEnabled_c) // 0x80 check if the upper bit is enabled. { if (i >= len) @@ -1056,9 +1053,9 @@ } UINT ch = b & IT_bitmask_patternChanField_c; // 0x7f - + if (ch) - ch = (ch - 1) & IT_bitmask_patternChanMask_c; // 0x3f + ch = (ch - 1); //& IT_bitmask_patternChanMask_c; // 0x3f if (b & IT_bitmask_patternChanEnabled_c) // 0x80 { @@ -1493,17 +1490,22 @@ // Channel Pan and Volume memset(header.chnpan, 0xFF, 64); memset(header.chnvol, 64, 64); - for (UINT ich=0; ich<m_nChannels; ich++) + for (UINT ich=0; ich</*m_nChannels*/64; ich++) //Header only has room for settings for 64 chans... { header.chnpan[ich] = ChnSettings[ich].nPan >> 2; if (ChnSettings[ich].dwFlags & CHN_SURROUND) header.chnpan[ich] = 100; header.chnvol[ich] = ChnSettings[ich].nVolume; if (ChnSettings[ich].dwFlags & CHN_MUTE) header.chnpan[ich] |= 0x80; + } + + for (UINT ich=0; ich<m_nChannels; ich++) + { if (ChnSettings[ich].szName[0]) { dwChnNamLen = (ich+1) * MAX_CHANNELNAME; } } + if (dwChnNamLen) dwExtra += dwChnNamLen + 8; #ifdef SAVEITTIMESTAMP dwExtra += 8; // Time Stamp @@ -2067,7 +2069,7 @@ // Channel Pan and Volume memset(header.chnpan, 0xFF, 64); memset(header.chnvol, 64, 64); - for (UINT ich=0; ich<nChannels; ich++) + for (UINT ich=0; ich</*m_nChannels*/64; ich++) //Header only has room for settings for 64 chans... { header.chnpan[ich] = ChnSettings[ich].nPan >> 2; if (ChnSettings[ich].dwFlags & CHN_SURROUND) header.chnpan[ich] = 100; Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2006-06-20 00:44:57 UTC (rev 157) @@ -482,7 +482,7 @@ } } //end for all rows } else { - memset(s, 0, m_nChannels*4); //if patten does not exist + memset(s, 0, m_nChannels*4); //if pattern does not exist for (UINT i=0; i<64; i++) { //invent blank pattern fwrite(s, m_nChannels, 4, f); } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2006-04-11 23:44:36 UTC (rev 156) +++ trunk/OpenMPT/soundlib/Sndfile.h 2006-06-20 00:44:57 UTC (rev 157) @@ -34,21 +34,21 @@ // -> DESC="misc quantity changes" #define MAX_INSTRUMENTS 256 //200 // -! BEHAVIOUR_CHANGE#0006 -#ifdef FASTSOUNDLIB -#define MAX_CHANNELS 80 -#else +//#ifdef FASTSOUNDLIB +//#define MAX_CHANNELS 80 +//#else // -> CODE#0006 // -> DESC="misc quantity changes" #define MAX_CHANNELS 256 //200 // -! BEHAVIOUR_CHANGE#0006 -#endif +//#endif // -> CODE#0006 // -> DESC="misc quantity changes" -#ifdef FASTSOUNDLIB -#define MAX_BASECHANNELS 64 -#else -#define MAX_BASECHANNELS 128 // Let 128 channels between MAX_BASECHANNELS & MAX_CHANNELS -#endif +//#ifdef FASTSOUNDLIB +//#define MAX_BASECHANNELS 64 +//#else +#define MAX_BASECHANNELS 127 +//#endif // -! BEHAVIOUR_CHANGE#0006 #define MAX_ENVPOINTS 32 #define MIN_PERIOD 0x0020 @@ -770,7 +770,15 @@ MIDIOUT_PROGRAM, }; +enum { + max_chans_IT=127, + max_chans_XM=64, + max_chans_MOD=32, + max_chans_S3M=32, +}; + + typedef struct MODMIDICFG { CHAR szMidiGlb[9*32]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-04-11 23:46:56
|
Revision: 156 Author: rewbs Date: 2006-04-11 16:44:36 -0700 (Tue, 11 Apr 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=156&view=rev Log Message: ----------- . v1.17.02.42 + <rewbs> "Compatibility export" in file menu: save as 'plain' IT, without all of OpenMPT's crap. IT only for now (not XM). . <rewbs> Set instrument in pattern editor should work when no note is specified (tx Torvus - http://lpchip.com/modplug/viewtopic.php?t=470) . <rewbs> Restart position saved in IT (tx LPChip - http://lpchip.com/modplug/viewtopic.php?t=473) . <rewbs> Loop song now works even if restart pos falls on +++ (tx LPChip - http://lpchip.com/modplug/viewtopic.php?t=463) . <rewbs> Last used tempo is applied even when playback is triggered from instrument panel. (tx LPChip - http://lpchip.com/modplug/viewtopic.php?t=480) / <rewbs> User now gets a warning when loading MDA Degrade (tx fisk0 - http://lpchip.com/modplug/viewtopic.php?t=467) Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/InputHandler.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe trunk/OpenMPT/mptrack/bin/mptrack_P3.exe trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe trunk/OpenMPT/mptrack/bin/version trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/packageTemplate/History.txt trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Removed Paths: ------------- trunk/OpenMPT/mptrack/bin/testSvnCommitList trunk/OpenMPT/mptrack/bin/testSvnCommitList2 Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -2253,13 +2253,11 @@ commands[kcChangeLoopStatus].isDummy = false; commands[kcChangeLoopStatus].Message = "Toggle loop pattern"; + commands[kcFileExportCompat].UID = 1777; + commands[kcFileExportCompat].Message = "File/Export to standard IT/XM"; + commands[kcFileExportCompat].isHidden = false; + commands[kcFileExportCompat].isDummy = false; -/* commands[kcToggleLoopSong].UID = 1777; - commands[kcToggleLoopSong].isHidden = false; - commands[kcToggleLoopSong].isDummy = false; - commands[kcToggleLoopSong].Message = "Toggle loop song"; -*/ - #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 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/CommandSet.h 2006-04-11 23:44:36 UTC (rev 156) @@ -57,6 +57,7 @@ kcFileSaveAsWave, kcFileSaveAsMP3, kcFileSaveMidi, + kcFileExportCompat, kcPrevDocument, kcNextDocument, kcFileImportMidiLib, Modified: trunk/OpenMPT/mptrack/InputHandler.cpp =================================================================== --- trunk/OpenMPT/mptrack/InputHandler.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/InputHandler.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -330,6 +330,7 @@ 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; @@ -390,6 +391,7 @@ pMenu->ModifyMenu(ID_FILE_SAVEASWAVE, MF_BYCOMMAND | MF_STRING, ID_FILE_SAVEASWAVE, GetMenuText(ID_FILE_SAVEASWAVE)); pMenu->ModifyMenu(ID_FILE_SAVEASMP3, MF_BYCOMMAND | MF_STRING, ID_FILE_SAVEASMP3, GetMenuText(ID_FILE_SAVEASMP3)); pMenu->ModifyMenu(ID_FILE_SAVEMIDI, MF_BYCOMMAND | MF_STRING, ID_FILE_SAVEMIDI, GetMenuText(ID_FILE_SAVEMIDI)); + pMenu->ModifyMenu(ID_FILE_SAVECOMPAT, MF_BYCOMMAND | MF_STRING, ID_FILE_SAVECOMPAT, GetMenuText(ID_FILE_SAVECOMPAT)); pMenu->ModifyMenu(ID_IMPORT_MIDILIB, MF_BYCOMMAND | MF_STRING, ID_IMPORT_MIDILIB, GetMenuText(ID_IMPORT_MIDILIB)); pMenu->ModifyMenu(ID_ADD_SOUNDBANK, MF_BYCOMMAND | MF_STRING, ID_ADD_SOUNDBANK, GetMenuText(ID_ADD_SOUNDBANK)); Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -2707,6 +2707,7 @@ case kcFileSaveAs: case kcFileSaveAsWave: case kcFileSaveMidi: + case kcFileExportCompat: case kcFileClose: case kcFileSave: case kcViewGeneral: Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -30,6 +30,7 @@ ON_COMMAND(ID_FILE_SAVEASWAVE, OnFileWaveConvert) ON_COMMAND(ID_FILE_SAVEASMP3, OnFileMP3Convert) ON_COMMAND(ID_FILE_SAVEMIDI, OnFileMidiConvert) + ON_COMMAND(ID_FILE_SAVECOMPAT, OnFileCompatibilitySave) ON_COMMAND(ID_PLAYER_PLAY, OnPlayerPlay) ON_COMMAND(ID_PLAYER_PAUSE, OnPlayerPause) ON_COMMAND(ID_PLAYER_STOP, OnPlayerStop) @@ -386,11 +387,7 @@ case MOD_TYPE_MOD: bOk = m_SndFile.SaveMod(lpszPathName, dwPacking); break; case MOD_TYPE_S3M: bOk = m_SndFile.SaveS3M(lpszPathName, dwPacking); break; case MOD_TYPE_XM: bOk = m_SndFile.SaveXM(lpszPathName, dwPacking); break; -// -> CODE#0023 -// -> DESC="IT project files (.itp)" -// case MOD_TYPE_IT: bOk = m_SndFile.SaveIT(lpszPathName, dwPacking); break; case MOD_TYPE_IT: bOk = (m_SndFile.m_dwSongFlags & SONG_ITPROJECT || !lstrcmpi(fext, ".itp")) ? m_SndFile.SaveITProject(lpszPathName) : m_SndFile.SaveIT(lpszPathName, dwPacking); break; -// -! NEW_FEATURE#0023 } EndWaitCursor(); if (bOk) @@ -398,12 +395,8 @@ if (nType == m_SndFile.m_nType) SetPathName(lpszPathName); } else { -// -> CODE#0023 -// -> DESC="IT project files (.itp)" -// ErrorBox(IDS_ERR_SAVESONG, CMainFrame::GetMainFrame()); if(nType == MOD_TYPE_IT && m_SndFile.m_dwSongFlags & SONG_ITPROJECT) ::MessageBox(NULL,"ITP projects need to have a path set for each instrument...",NULL,MB_ICONERROR | MB_OK); else ErrorBox(IDS_ERR_SAVESONG, CMainFrame::GetMainFrame()); -// -! NEW_FEATURE#0023 } return bOk; } @@ -1499,7 +1492,7 @@ void CModDoc::OnFileMidiConvert() -//------------------------------- +//------------------------------------- { CHAR path[_MAX_PATH]="", drive[_MAX_DRIVE]=""; CHAR s[_MAX_PATH], fname[_MAX_FNAME]=""; @@ -1527,7 +1520,60 @@ } } +//HACK: This is a quick fix. Needs to be better integrated into player and GUI. +void CModDoc::OnFileCompatibilitySave() +//------------------------------- +{ + CHAR path[_MAX_PATH]="", drive[_MAX_DRIVE]=""; + CHAR s[_MAX_PATH], fname[_MAX_FNAME]=""; + CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); + CString ext, pattern; + + UINT type = m_SndFile.GetType(); + if ((!pMainFrm) || (!m_SndFile.GetType())) return; + switch (type) { + /*case MOD_TYPE_XM: + ext = "xm"; + pattern = "Fast Tracker Files (*.xm)|*.xm||"; + break;*/ + case MOD_TYPE_IT: + ext = "it"; + pattern = "Impulse Tracker Files (*.it)|*.it||"; + break; + default: + ::MessageBox(NULL,"Compatibility export is currently only available the IT format.", "Can't do compatibility export.",MB_ICONINFORMATION | MB_OK); + return; + } + + ::MessageBox(NULL,"Warning: the exported file will not contain any of MPT's file-format hacks.", "Compatibility export warning.",MB_ICONINFORMATION | MB_OK); + _splitpath(GetPathName(), drive, path, fname, NULL); + strcpy(s, drive); + strcat(s, path); + strcat(s, fname); + if (!strstr(fname, "compat")) { + strcat(s, ".compat."); + } else { + strcat(s, "."); + } + strcat(s, ext); + CFileDialog dlg(FALSE, ext, s, + OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN, + pattern, pMainFrm); + if (dlg.DoModal() != IDOK){ + return; + } + switch (type) { + case MOD_TYPE_XM: + m_SndFile.SaveCompatXM(dlg.GetPathName()); + break; + case MOD_TYPE_IT: + m_SndFile.SaveCompatIT(dlg.GetPathName()); + break; + } +} + + void CModDoc::OnPlayerPlay() //-------------------------- { @@ -2871,6 +2917,7 @@ case kcFileSaveAsWave: OnFileWaveConvert(); break; case kcFileSaveAsMP3: OnFileMP3Convert(); break; case kcFileSaveMidi: OnFileMidiConvert(); break; + case kcFileExportCompat: OnFileCompatibilitySave(); break; case kcEstimateSongLength: OnEstimateSongLength(); break; case kcApproxRealBPM: OnApproximateBPM(); break; case kcFileSave: DoSave(m_strPathName, 0); break; Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/Moddoc.h 2006-04-11 23:44:36 UTC (rev 156) @@ -258,6 +258,7 @@ afx_msg void OnFileWaveConvert(); afx_msg void OnFileMP3Convert(); afx_msg void OnFileMidiConvert(); + afx_msg void OnFileCompatibilitySave(); afx_msg void OnPlayerPlay(); afx_msg void OnPlayerStop(); afx_msg void OnPlayerPause(); Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -2315,7 +2315,7 @@ { CModDoc *pModDoc; CSoundFile *pSndFile; - UINT nIns = GetCurrentInstrument(); + BYTE nIns = static_cast<BYTE>(GetCurrentInstrument()); MODCOMMAND *p; BOOL bModified; @@ -2334,14 +2334,15 @@ UINT startChan = GetSelectionStartChan(); UINT endChan = GetSelectionEndChan(); - for (UINT r=startRow; r<endRow+1; r++) - { - for (UINT c=startChan; c<endChan+1; c++) - { + for (UINT r=startRow; r<endRow+1; r++) { + for (UINT c=startChan; c<endChan+1; c++) { + p = pSndFile->Patterns[m_nPattern] + r * pSndFile->m_nChannels + c; - if (p->note && p->instr != (BYTE)nIns) - { - p->instr = (BYTE)nIns; + + // 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||p->instr) && (p->instr!=nIns) ) { + p->instr = nIns; bModified = TRUE; } } Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -1040,7 +1040,8 @@ #define NUM_PROBLEMPLUGS 3 static _PROBLEMATIC_PLUG gProblemPlugs[NUM_PROBLEMPLUGS] = { - {'VstP', 'Ni4S', 1, "Native Instruments B4", "*v1.1.1 hangs on playback. Do not proceed unless you have v1.1.5.*"}, + {'VstP', 'Ni4S', 1, "Native Instruments B4", "* v1.1.1 hangs on playback. Do not proceed unless you have v1.1.5. *"}, + {'VstP', 'mdaC', 1, "MDA Degrade", "* This plugin can cause OpenMPT to behave erratically.\r\nYou should try SoundHack's Decimate, ConcreteFX's Lowbit or Subtek's LoFi Plus instead. *"}, }; bool CSelectPluginDlg::VerifyPlug(PVSTPLUGINLIB plug) @@ -1048,10 +1049,10 @@ CString s; for (int p=0; p<NUM_PROBLEMPLUGS; p++) { - if ( (gProblemPlugs[p].id2 == plug->dwPluginId2) && gProblemPlugs[p].id2 + if ( (gProblemPlugs[p].id2 == plug->dwPluginId2) /*&& (gProblemPlugs[p].id1 == plug->dwPluginId1)*/) { - s.Format("WARNING: This plugin has been identified as %s,\r\n which is known to have the following problem with MPT:\r\n\r\n%s\r\n\r\n(see here for more information: http://www.modplug.com/forum/viewtopic.php?p=36930#36930)\r\n\r\nDo you want to continue to load?", gProblemPlugs[p].name, gProblemPlugs[p].problem); + s.Format("WARNING: This plugin has been identified as %s,\r\nwhich is known to have the following problem with OpenMPT:\r\n\r\n%s\r\n\r\nWould you like to continue to load this plugin?", gProblemPlugs[p].name, gProblemPlugs[p].problem); return (AfxMessageBox(s, MB_YESNO) == IDYES); } } @@ -2564,6 +2565,7 @@ pCh->uNoteOnMap[i][trackChannel]=0; MidiSend(dwMidiCode|(i<<8)); } + } // All "active" notes off on this midi and tracker channel Modified: trunk/OpenMPT/mptrack/bin/mptrack_Generic.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_P3.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_P4-Athlon64.exe =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/bin/mptrack_athlon32.exe =================================================================== (Binary files differ) Deleted: trunk/OpenMPT/mptrack/bin/testSvnCommitList =================================================================== Deleted: trunk/OpenMPT/mptrack/bin/testSvnCommitList2 =================================================================== Modified: trunk/OpenMPT/mptrack/bin/version =================================================================== --- trunk/OpenMPT/mptrack/bin/version 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/bin/version 2006-04-11 23:44:36 UTC (rev 156) @@ -1 +1 @@ -1.17.02.41 \ No newline at end of file +1.17.02.42 \ No newline at end of file Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/mptrack.rc 2006-04-11 23:44:36 UTC (rev 156) @@ -106,6 +106,7 @@ MENUITEM "Save as &Wave...", ID_FILE_SAVEASWAVE MENUITEM "Save as M&P3...", ID_FILE_SAVEASMP3 MENUITEM "Export as M&idi...", ID_FILE_SAVEMIDI + MENUITEM "Export &unraped...", ID_FILE_SAVECOMPAT MENUITEM SEPARATOR MENUITEM "Import &midi Library...", ID_IMPORT_MIDILIB MENUITEM "Add Sound &Bank...", ID_ADD_SOUNDBANK @@ -1892,7 +1893,7 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,17,2,41 + FILEVERSION 1,17,2,42 PRODUCTVERSION 0,0,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG @@ -1910,7 +1911,7 @@ BEGIN VALUE "CompanyName", "Olivier Lapicque / OpenMPT team" VALUE "FileDescription", "OpenMPT / ModPlug Tracker" - VALUE "FileVersion", "1, 17, 2, 41" + VALUE "FileVersion", "1, 17, 2, 42" VALUE "InternalName", "Modplug Tracker" VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2005 GPL." VALUE "LegalTrademarks", "M.O.D.P.L.U.G" @@ -2184,6 +2185,7 @@ ID_PATTERN_CHANNELMANAGER "Display channel manager window\nChannel manager" ID_INDICATOR_CPU "-" + ID_FILE_EXPORTCOMPAT "Export file to standard IT/XM." END STRINGTABLE @@ -2456,7 +2458,7 @@ STRINGTABLE BEGIN ID_SAMPLE_TRIM "Delete everything except the current selection\nTrim Sample" - ID_FILE_SAVEMIDI "Convert the current song to a standard midi file" + ID_FILE_SAVEMIDI "Export the current song to a standard midi file" ID_NETLINK_FORUMS "Go to the Modplug Central Music Forums" ID_INSTRUMENT_SAMPLEMAP "Edit the sample map" ID_NETLINK_PLUGINS "Go to KVR Audio to download plugins" Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/mptrack/resource.h 2006-04-11 23:44:36 UTC (rev 156) @@ -40,6 +40,7 @@ #define ID_PATTERN_CHANNELMANAGER 202 #define IDR_ENVELOPES 203 #define ID_INDICATOR_CPU 203 +#define ID_FILE_EXPORTCOMPAT 204 #define IDB_MAINBAR 300 #define IDB_IMAGELIST 301 #define IDB_PATTERNS 302 @@ -546,7 +547,6 @@ #define IDC_PATTERN_PLAYFROMSTART 2026 #define IDC_PATTERN_STOP 2027 #define IDC_PATTERN_RECORD 2028 -#define IDC_PATTERN_FOLLOWSONG 3029 #define IDC_PATTERN_NEW 2030 #define IDC_PATTERN_OCTAVELINK 2031 #define IDC_SPIN_SPACING 2032 @@ -738,6 +738,7 @@ #define IDC_TEXT_RPB 2301 #define IDC_SPIN_RPB 2302 #define IDC_EDIT_RPB 2303 +#define IDC_PATTERN_FOLLOWSONG 3029 #define ID_FILE_NEWMOD 32771 #define ID_FILE_NEWXM 32772 #define ID_FILE_NEWS3M 32773 @@ -939,6 +940,8 @@ #define ID_PATTERN_ADDCHANNEL_AFTER 59149 #define ID_PATTERN_REMOVECHANNEL 59150 #define ID_PATTERN_REMOVECHANNELDIALOG 59151 +#define ID_Menu 59200 +#define ID_FILE_SAVECOMPAT 59202 // Next default values for new objects // @@ -946,7 +949,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 510 -#define _APS_NEXT_COMMAND_VALUE 59200 +#define _APS_NEXT_COMMAND_VALUE 59203 #define _APS_NEXT_CONTROL_VALUE 2255 #define _APS_NEXT_SYMED_VALUE 901 #endif Modified: trunk/OpenMPT/packageTemplate/History.txt =================================================================== --- trunk/OpenMPT/packageTemplate/History.txt 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/packageTemplate/History.txt 2006-04-11 23:44:36 UTC (rev 156) @@ -8,7 +8,15 @@ ?: other (tx XYZ): thanks to XYZ for telling me about the bug +. v1.17.02.42 + + <rewbs> "Compatibility export" in file menu: save as 'plain' IT, without all of OpenMPT's crap. IT only for now (not XM). + . <rewbs> Set instrument in pattern editor should work when no note is specified (tx Torvus - http://lpchip.com/modplug/viewtopic.php?t=470) + . <rewbs> Restart position saved in IT (tx LPChip - http://lpchip.com/modplug/viewtopic.php?t=473) + . <rewbs> Loop song now works even if restart pos falls on +++ (tx LPChip - http://lpchip.com/modplug/viewtopic.php?t=463) + . <rewbs> Last used tempo is applied even when playback is triggered from instrument panel. (tx LPChip - http://lpchip.com/modplug/viewtopic.php?t=480) + / <rewbs> User now gets a warning when loading MDA Degrade (tx fisk0 - http://lpchip.com/modplug/viewtopic.php?t=467) + . v 1.17.02.41 + <rewbs> Pattern record state is now saved to ini . <rewbs> Fixed the following settings that were not saving correctly: mod document window status, row spacing, channel VU meters, channel effect visibility, Most recent files list, Toolbar settings. Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -601,6 +601,7 @@ case 'SPA.': fadr = reinterpret_cast<BYTE*>(&m_nSongPreAmp); break; case 'VSTV': fadr = reinterpret_cast<BYTE*>(&m_nVSTiVolume); break; case 'DGV.': fadr = reinterpret_cast<BYTE*>(&m_nDefaultGlobalVolume); break; + case 'RP..': fadr = reinterpret_cast<BYTE*>(&m_nRestartPos); break; } if (fadr != NULL) { // if field code recognized @@ -1007,6 +1008,7 @@ case 'SPA.': fadr = reinterpret_cast<BYTE*>(&m_nSongPreAmp); break; case 'VSTV': fadr = reinterpret_cast<BYTE*>(&m_nVSTiVolume); break; case 'DGV.': fadr = reinterpret_cast<BYTE*>(&m_nDefaultGlobalVolume); break; + case 'RP..': fadr = reinterpret_cast<BYTE*>(&m_nRestartPos); break; } if (fadr != NULL) { // if field code recognized @@ -1996,6 +1998,579 @@ #pragma warning(default:4100) #endif // MODPLUG_NO_FILESAVE +//HACK: This is a quick fix. Needs to be better integrated into player and GUI. +//And need to split into subroutines and eliminate code duplication with SaveIT. +BOOL CSoundFile::SaveCompatIT(LPCSTR lpszFileName) +//------------------------------------------------ +{ + const int IT_MAX_CHANNELS=64; + DWORD dwPatNamLen, dwChnNamLen; + ITFILEHEADER header; + ITINSTRUMENT iti; + ITSAMPLESTRUCT itss; + BYTE smpcount[(MAX_SAMPLES+7)/8]; + DWORD inspos[MAX_INSTRUMENTS]; + DWORD patpos[MAX_PATTERNS]; + DWORD smppos[MAX_SAMPLES]; + DWORD dwPos = 0, dwHdrPos = 0, dwExtra = 2; + WORD patinfo[4]; +// -> CODE#0006 +// -> DESC="misc quantity changes" + BYTE chnmask[IT_MAX_CHANNELS]; + MODCOMMAND lastvalue[IT_MAX_CHANNELS]; + UINT nChannels = min(m_nChannels, IT_MAX_CHANNELS); +// -! BEHAVIOUR_CHANGE#0006 + BYTE buf[512]; + FILE *f; + + + if ((!lpszFileName) || ((f = fopen(lpszFileName, "wb")) == NULL)) return FALSE; + memset(inspos, 0, sizeof(inspos)); + memset(patpos, 0, sizeof(patpos)); + memset(smppos, 0, sizeof(smppos)); + // Writing Header + memset(&header, 0, sizeof(header)); + dwPatNamLen = 0; + dwChnNamLen = 0; + header.id = 0x4D504D49; + lstrcpyn(header.songname, m_szNames[0], 27); + header.reserved1 = 0x1004; + header.ordnum = 0; + header.ordnum=MAX_ORDERS; + while (header.ordnum>0 && Order[header.ordnum-1]==0xFF) { + header.ordnum--; + } + header.patnum = MAX_PATTERNS; + while ((header.patnum > 0) && (!Patterns[header.patnum-1])) { + header.patnum--; + } + + header.insnum = m_nInstruments; + header.smpnum = m_nSamples; + header.cwtv = 0x888; // We don't use these version info fields any more. + header.cmwt = 0x888; // Might come up as "Impulse Tracker 8" file in XMPlay. :) + header.flags = 0x0001; + header.special = 0x0006; + if (m_nInstruments) header.flags |= 0x04; + if (m_dwSongFlags & SONG_LINEARSLIDES) header.flags |= 0x08; + if (m_dwSongFlags & SONG_ITOLDEFFECTS) header.flags |= 0x10; + if (m_dwSongFlags & SONG_ITCOMPATMODE) header.flags |= 0x20; + if (m_dwSongFlags & SONG_EXFILTERRANGE) header.flags |= 0x1000; + header.globalvol = m_nDefaultGlobalVolume >> 1; + header.mv = m_nSongPreAmp; + if (header.mv < 0x20) header.mv = 0x20; + if (header.mv > 0x7F) header.mv = 0x7F; + header.speed = m_nDefaultSpeed; + header.tempo = min(m_nDefaultTempo,255); //Limit this one to 255, we save the real one as an extension below. + header.sep = 128; + dwHdrPos = sizeof(header) + header.ordnum; + // Channel Pan and Volume + memset(header.chnpan, 0xFF, 64); + memset(header.chnvol, 64, 64); + for (UINT ich=0; ich<nChannels; ich++) + { + header.chnpan[ich] = ChnSettings[ich].nPan >> 2; + if (ChnSettings[ich].dwFlags & CHN_SURROUND) header.chnpan[ich] = 100; + header.chnvol[ich] = ChnSettings[ich].nVolume; + if (ChnSettings[ich].dwFlags & CHN_MUTE) header.chnpan[ich] |= 0x80; +/* if (ChnSettings[ich].szName[0]) + { + dwChnNamLen = (ich+1) * MAX_CHANNELNAME; + } +*/ + } +// if (dwChnNamLen) dwExtra += dwChnNamLen + 8; +/*#ifdef SAVEITTIMESTAMP + dwExtra += 8; // Time Stamp +#endif +*/ + if (m_dwSongFlags & SONG_EMBEDMIDICFG) + { + header.flags |= 0x80; + header.special |= 0x08; + dwExtra += sizeof(MODMIDICFG); + } + // Pattern Names +/* if ((m_nPatternNames) && (m_lpszPatternNames)) + { + dwPatNamLen = m_nPatternNames * MAX_PATTERNNAME; + while ((dwPatNamLen >= MAX_PATTERNNAME) && (!m_lpszPatternNames[dwPatNamLen-MAX_PATTERNNAME])) dwPatNamLen -= MAX_PATTERNNAME; + if (dwPatNamLen < MAX_PATTERNNAME) dwPatNamLen = 0; + if (dwPatNamLen) dwExtra += dwPatNamLen + 8; + } +*/ // Mix Plugins + //dwExtra += SaveMixPlugins(NULL, TRUE); + // Comments + if (m_lpszSongComments) + { + header.special |= 1; + header.msglength = strlen(m_lpszSongComments)+1; + header.msgoffset = dwHdrPos + dwExtra + header.insnum*4 + header.patnum*4 + header.smpnum*4; + } + // Write file header + fwrite(&header, 1, sizeof(header), f); + fwrite(Order, 1, header.ordnum, f); + if (header.insnum) fwrite(inspos, 4, header.insnum, f); + if (header.smpnum) fwrite(smppos, 4, header.smpnum, f); + if (header.patnum) fwrite(patpos, 4, header.patnum, f); + // Writing editor history information + { +/*#ifdef SAVEITTIMESTAMP + SYSTEMTIME systime; + FILETIME filetime; + WORD timestamp[4]; + WORD nInfoEx = 1; + memset(timestamp, 0, sizeof(timestamp)); + fwrite(&nInfoEx, 1, 2, f); + GetSystemTime(&systime); + SystemTimeToFileTime(&systime, &filetime); + FileTimeToDosDateTime(&filetime, ×tamp[0], ×tamp[1]); + fwrite(timestamp, 1, 8, f); +#else +*/ WORD nInfoEx = 0; + fwrite(&nInfoEx, 1, 2, f); +//#endif + } + // Writing midi cfg + if (header.flags & 0x80) + { + fwrite(&m_MidiCfg, 1, sizeof(MODMIDICFG), f); + } + // Writing pattern names +/* if (dwPatNamLen) + { + DWORD d = 0x4d414e50; + fwrite(&d, 1, 4, f); + fwrite(&dwPatNamLen, 1, 4, f); + fwrite(m_lpszPatternNames, 1, dwPatNamLen, f); + } +*/ // Writing channel Names +/* if (dwChnNamLen) + { + DWORD d = 0x4d414e43; + fwrite(&d, 1, 4, f); + fwrite(&dwChnNamLen, 1, 4, f); + UINT nChnNames = dwChnNamLen / MAX_CHANNELNAME; + for (UINT inam=0; inam<nChnNames; inam++) + { + fwrite(ChnSettings[inam].szName, 1, MAX_CHANNELNAME, f); + } + } +*/ // Writing mix plugins info +/* SaveMixPlugins(f, FALSE); +*/ // Writing song message + dwPos = dwHdrPos + dwExtra + (header.insnum + header.smpnum + header.patnum) * 4; + if (header.special & 1) + { + dwPos += strlen(m_lpszSongComments) + 1; + fwrite(m_lpszSongComments, 1, strlen(m_lpszSongComments)+1, f); + } + // Writing instruments + for (UINT nins=1; nins<=header.insnum; nins++) + { + BOOL bKbdEx = FALSE; + BYTE keyboardex[120]; + + memset(&iti, 0, sizeof(iti)); + iti.id = 0x49504D49; // "IMPI" + //iti.trkvers = 0x211; + iti.trkvers = 0x220; //rewbs.itVersion + if (Headers[nins]) + { + INSTRUMENTHEADER *penv = Headers[nins]; + memset(smpcount, 0, sizeof(smpcount)); + memcpy(iti.filename, penv->filename, 12); + memcpy(iti.name, penv->name, 26); + iti.mbank = penv->wMidiBank; + iti.mpr = penv->nMidiProgram; + iti.mch = penv->nMidiChannel; + iti.nna = penv->nNNA; + if (penv->nDCT<DCT_PLUGIN) iti.dct = penv->nDCT; else iti.dct =0; + iti.dca = penv->nDNA; + iti.fadeout = penv->nFadeOut >> 5; + iti.pps = penv->nPPS; + iti.ppc = penv->nPPC; + iti.gbv = (BYTE)(penv->nGlobalVol << 1); + iti.dfp = (BYTE)penv->nPan >> 2; + if (!(penv->dwFlags & ENV_SETPANNING)) iti.dfp |= 0x80; + iti.rv = penv->nVolSwing; + iti.rp = penv->nPanSwing; + iti.ifc = penv->nIFC; + iti.ifr = penv->nIFR; + iti.nos = 0; + for (UINT i=0; i<120; i++) if (penv->Keyboard[i] < MAX_SAMPLES) + { + UINT smp = penv->Keyboard[i]; + if ((smp) && (!(smpcount[smp>>3] & (1<<(smp&7))))) + { + smpcount[smp>>3] |= 1 << (smp&7); + iti.nos++; + } + iti.keyboard[i*2] = penv->NoteMap[i] - 1; + iti.keyboard[i*2+1] = smp; + if (smp > 0xff) bKbdEx = TRUE; + keyboardex[i] = (smp>>8); + } else keyboardex[i] = 0; + // Writing Volume envelope + if (penv->dwFlags & ENV_VOLUME) iti.volenv.flags |= 0x01; + if (penv->dwFlags & ENV_VOLLOOP) iti.volenv.flags |= 0x02; + if (penv->dwFlags & ENV_VOLSUSTAIN) iti.volenv.flags |= 0x04; + if (penv->dwFlags & ENV_VOLCARRY) iti.volenv.flags |= 0x08; + iti.volenv.num = (BYTE)penv->nVolEnv; + iti.volenv.lpb = (BYTE)penv->nVolLoopStart; + iti.volenv.lpe = (BYTE)penv->nVolLoopEnd; + iti.volenv.slb = penv->nVolSustainBegin; + iti.volenv.sle = penv->nVolSustainEnd; + // Writing Panning envelope + if (penv->dwFlags & ENV_PANNING) iti.panenv.flags |= 0x01; + if (penv->dwFlags & ENV_PANLOOP) iti.panenv.flags |= 0x02; + if (penv->dwFlags & ENV_PANSUSTAIN) iti.panenv.flags |= 0x04; + if (penv->dwFlags & ENV_PANCARRY) iti.panenv.flags |= 0x08; + iti.panenv.num = (BYTE)penv->nPanEnv; + iti.panenv.lpb = (BYTE)penv->nPanLoopStart; + iti.panenv.lpe = (BYTE)penv->nPanLoopEnd; + iti.panenv.slb = penv->nPanSustainBegin; + iti.panenv.sle = penv->nPanSustainEnd; + // Writing Pitch Envelope + if (penv->dwFlags & ENV_PITCH) iti.pitchenv.flags |= 0x01; + if (penv->dwFlags & ENV_PITCHLOOP) iti.pitchenv.flags |= 0x02; + if (penv->dwFlags & ENV_PITCHSUSTAIN) iti.pitchenv.flags |= 0x04; + if (penv->dwFlags & ENV_PITCHCARRY) iti.pitchenv.flags |= 0x08; + if (penv->dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80; + iti.pitchenv.num = (BYTE)penv->nPitchEnv; + iti.pitchenv.lpb = (BYTE)penv->nPitchLoopStart; + iti.pitchenv.lpe = (BYTE)penv->nPitchLoopEnd; + iti.pitchenv.slb = (BYTE)penv->nPitchSustainBegin; + iti.pitchenv.sle = (BYTE)penv->nPitchSustainEnd; + // Writing Envelopes data + for (UINT ev=0; ev<25; ev++) + { + iti.volenv.data[ev*3] = penv->VolEnv[ev]; + iti.volenv.data[ev*3+1] = penv->VolPoints[ev] & 0xFF; + iti.volenv.data[ev*3+2] = penv->VolPoints[ev] >> 8; + iti.panenv.data[ev*3] = penv->PanEnv[ev] - 32; + iti.panenv.data[ev*3+1] = penv->PanPoints[ev] & 0xFF; + iti.panenv.data[ev*3+2] = penv->PanPoints[ev] >> 8; + iti.pitchenv.data[ev*3] = penv->PitchEnv[ev] - 32; + iti.pitchenv.data[ev*3+1] = penv->PitchPoints[ev] & 0xFF; + iti.pitchenv.data[ev*3+2] = penv->PitchPoints[ev] >> 8; + } + } else + // Save Empty Instrument + { + for (UINT i=0; i<120; i++) iti.keyboard[i*2] = i; + iti.ppc = 5*12; + iti.gbv = 128; + iti.dfp = 0x20; + iti.ifc = 0xFF; + } + if (!iti.nos) iti.trkvers = 0; + // Writing instrument + if (bKbdEx) *((int *)iti.dummy) = 'MPTX'; + inspos[nins-1] = dwPos; + dwPos += sizeof(ITINSTRUMENT); + fwrite(&iti, 1, sizeof(ITINSTRUMENT), f); + if (bKbdEx) + { + dwPos += 120; + fwrite(keyboardex, 1, 120, f); + } + + //------------ rewbs.modularInstData +/* if (Headers[nins]) + { + long modularInstSize = 0; + UINT ModInstID = 'INSM'; + fwrite(&ModInstID, 1, sizeof(ModInstID), f); // mark this as an instrument with modular extensions + long sizePos = ftell(f); // we will want to write the modular data's total size here + fwrite(&modularInstSize, 1, sizeof(modularInstSize), f); // write a DUMMY size, just to move file pointer by a long + + //Write chunks + UINT ID; + { //VST Slot chunk: + ID='PLUG'; + fwrite(&ID, 1, sizeof(int), f); + INSTRUMENTHEADER *penv = Headers[nins]; + fwrite(&(penv->nMixPlug), 1, sizeof(BYTE), f); + modularInstSize += sizeof(int)+sizeof(BYTE); + } +*/ //How to save your own modular instrument chunk: + /* { + ID='MYID'; + fwrite(&ID, 1, sizeof(int), f); + instModularDataSize+=sizeof(int); + + //You can save your chunk size somwhere here if you need variable chunk size. + fwrite(myData, 1, myDataSize, f); + instModularDataSize+=myDataSize; + } + */ +/* //write modular data's total size + long curPos = ftell(f); // remember current pos + fseek(f, sizePos, SEEK_SET); // go back to sizePos + fwrite(&modularInstSize, 1, sizeof(modularInstSize), f); // write data + fseek(f, curPos, SEEK_SET); // go back to where we were. + + //move forward + dwPos+=sizeof(ModInstID)+sizeof(modularInstSize)+modularInstSize; + } +*/ //------------ end rewbs.modularInstData + } + // Writing sample headers + memset(&itss, 0, sizeof(itss)); + for (UINT hsmp=0; hsmp<header.smpnum; hsmp++) + { + smppos[hsmp] = dwPos; + dwPos += sizeof(ITSAMPLESTRUCT); + fwrite(&itss, 1, sizeof(ITSAMPLESTRUCT), f); + } + // Writing Patterns + for (UINT npat=0; npat<header.patnum; npat++) + { + DWORD dwPatPos = dwPos; + UINT len; + if (!Patterns[npat]) continue; + patpos[npat] = dwPos; + patinfo[0] = 0; + patinfo[1] = PatternSize[npat]; + patinfo[2] = 0; + patinfo[3] = 0; + // Check for empty pattern + if (PatternSize[npat] == 64) + { + MODCOMMAND *pzc = Patterns[npat]; + UINT nz = PatternSize[npat] * nChannels; + for (UINT iz=0; iz<nz; iz++) + { + if ((pzc[iz].note) || (pzc[iz].instr) + || (pzc[iz].volcmd) || (pzc[iz].command)) break; + } + if (iz == nz) + { + patpos[npat] = 0; + continue; + } + } + fwrite(patinfo, 8, 1, f); + dwPos += 8; + memset(chnmask, 0xFF, sizeof(chnmask)); + memset(lastvalue, 0, sizeof(lastvalue)); + MODCOMMAND *m = Patterns[npat]; + for (UINT row=0; row<PatternSize[npat]; row++) + { + len = 0; + for (UINT ch=0; ch<nChannels; ch++, m++) + { + BYTE b = 0; + UINT command = m->command; + UINT param = m->param; + UINT vol = 0xFF; + UINT note = m->note; + if (note) b |= 1; + if ((note) && (note < 0xFE)) note--; + if (m->instr) b |= 2; + if (m->volcmd) + { + UINT volcmd = m->volcmd; + switch(volcmd) + { + case VOLCMD_VOLUME: vol = m->vol; if (vol > 64) vol = 64; break; + case VOLCMD_PANNING: vol = m->vol + 128; if (vol > 192) vol = 192; break; + case VOLCMD_VOLSLIDEUP: vol = 85 + ConvertVolParam(m->vol); break; + 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_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; + case VOLCMD_VELOCITY: vol = 213 + ConvertVolParam(m->vol); break; //rewbs.velocity + case VOLCMD_OFFSET: vol = 223 + ConvertVolParam(m->vol); break; //rewbs.volOff + default: vol = 0xFF; + } + } + if (vol != 0xFF) b |= 4; + if (command) + { + S3MSaveConvert(&command, ¶m, TRUE); + if (command) b |= 8; + } + // Packing information + if (b) + { + // Same note ? + if (b & 1) + { + if ((note == lastvalue[ch].note) && (lastvalue[ch].volcmd & 1)) + { + b &= ~1; + b |= 0x10; + } else + { + lastvalue[ch].note = note; + lastvalue[ch].volcmd |= 1; + } + } + // Same instrument ? + if (b & 2) + { + if ((m->instr == lastvalue[ch].instr) && (lastvalue[ch].volcmd & 2)) + { + b &= ~2; + b |= 0x20; + } else + { + lastvalue[ch].instr = m->instr; + lastvalue[ch].volcmd |= 2; + } + } + // Same volume column byte ? + if (b & 4) + { + if ((vol == lastvalue[ch].vol) && (lastvalue[ch].volcmd & 4)) + { + b &= ~4; + b |= 0x40; + } else + { + lastvalue[ch].vol = vol; + lastvalue[ch].volcmd |= 4; + } + } + // Same command / param ? + if (b & 8) + { + if ((command == lastvalue[ch].command) && (param == lastvalue[ch].param) && (lastvalue[ch].volcmd & 8)) + { + b &= ~8; + b |= 0x80; + } else + { + lastvalue[ch].command = command; + lastvalue[ch].param = param; + lastvalue[ch].volcmd |= 8; + } + } + if (b != chnmask[ch]) + { + chnmask[ch] = b; + buf[len++] = (ch+1) | 0x80; + buf[len++] = b; + } else + { + buf[len++] = ch+1; + } + if (b & 1) buf[len++] = note; + if (b & 2) buf[len++] = m->instr; + if (b & 4) buf[len++] = vol; + if (b & 8) + { + buf[len++] = command; + buf[len++] = param; + } + } + } + buf[len++] = 0; + dwPos += len; + patinfo[0] += len; + fwrite(buf, 1, len, f); + } + fseek(f, dwPatPos, SEEK_SET); + fwrite(patinfo, 8, 1, f); + fseek(f, dwPos, SEEK_SET); + } + // Writing Sample Data + for (UINT nsmp=1; nsmp<=header.smpnum; nsmp++) + { + MODINSTRUMENT *psmp = &Ins[nsmp]; + memset(&itss, 0, sizeof(itss)); + memcpy(itss.filename, psmp->name, 12); + memcpy(itss.name, m_szNames[nsmp], 26); + itss.id = 0x53504D49; + itss.gvl = (BYTE)psmp->nGlobalVol; + if (m_nInstruments) + { + for (UINT iu=1; iu<=m_nInstruments; iu++) if (Headers[iu]) + { + INSTRUMENTHEADER *penv = Headers[iu]; + for (UINT ju=0; ju<128; ju++) if (penv->Keyboard[ju] == nsmp) + { + itss.flags = 0x01; + break; + } + } + } else + { + itss.flags = 0x01; + } + if (psmp->uFlags & CHN_LOOP) itss.flags |= 0x10; + if (psmp->uFlags & CHN_SUSTAINLOOP) itss.flags |= 0x20; + if (psmp->uFlags & CHN_PINGPONGLOOP) itss.flags |= 0x40; + if (psmp->uFlags & CHN_PINGPONGSUSTAIN) itss.flags |= 0x80; + itss.C5Speed = psmp->nC4Speed; + if (!itss.C5Speed) itss.C5Speed = 8363; + itss.length = psmp->nLength; + itss.loopbegin = psmp->nLoopStart; + itss.loopend = psmp->nLoopEnd; + itss.susloopbegin = psmp->nSustainStart; + itss.susloopend = psmp->nSustainEnd; + itss.vol = psmp->nVolume >> 2; + itss.dfp = psmp->nPan >> 2; + itss.vit = autovibxm2it[psmp->nVibType & 7]; + itss.vis = psmp->nVibRate; + itss.vid = psmp->nVibDepth; + itss.vir = (psmp->nVibSweep < 64) ? psmp->nVibSweep * 4 : 255; + if (psmp->uFlags & CHN_PANNING) itss.dfp |= 0x80; + if ((psmp->pSample) && (psmp->nLength)) itss.cvt = 0x01; + UINT flags = RS_PCM8S; +#ifndef NO_PACKING + if (nPacking) + { + if ((!(psmp->uFlags & (CHN_16BIT|CHN_STEREO))) + && (CanPackSample(psmp->pSample, psmp->nLength, nPacking))) + { + flags = RS_ADPCM4; + itss.cvt = 0xFF; + } + } else +#endif // NO_PACKING + { + if (psmp->uFlags & CHN_STEREO) + { + flags = RS_STPCM8S; + itss.flags |= 0x04; + } + if (psmp->uFlags & CHN_16BIT) + { + itss.flags |= 0x02; + flags = (psmp->uFlags & CHN_STEREO) ? RS_STPCM16S : RS_PCM16S; + } + } + itss.samplepointer = dwPos; + fseek(f, smppos[nsmp-1], SEEK_SET); + fwrite(&itss, 1, sizeof(ITSAMPLESTRUCT), f); + fseek(f, dwPos, SEEK_SET); + if ((psmp->pSample) && (psmp->nLength)) + { + dwPos += WriteSample(f, psmp, flags); + } + } + + //Save hacked-on extra info +// SaveExtendedInstrumentProperties(Headers, header.insnum, f); +// SaveExtendedSongProperties(f); + + // Updating offsets + fseek(f, dwHdrPos, SEEK_SET); + if (header.insnum) fwrite(inspos, 4, header.insnum, f); + if (header.smpnum) fwrite(smppos, 4, header.smpnum, f); + if (header.patnum) fwrite(patpos, 4, header.patnum, f); + fclose(f); + return TRUE; + +} + ////////////////////////////////////////////////////////////////////////////// // IT 2.14 compression @@ -2549,5 +3124,12 @@ fwrite(&size, 1, sizeof(__int16), f); fwrite(&m_nDefaultGlobalVolume, 1, size, f); + code = 'RP..'; //write m_nRestartPos + fwrite(&code, 1, sizeof(__int32), f); + size = sizeof(m_nRestartPos); + fwrite(&size, 1, sizeof(__int16), f); + fwrite(&m_nRestartPos, 1, size, f); + + return; } \ No newline at end of file Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -988,4 +988,12 @@ return TRUE; } +//HACK: This is a quick fix. Needs to be better integrated into player and GUI. +BOOL CSoundFile::SaveCompatXM(LPCSTR lpszFileName) +//------------------------------------------------ +{ + + return TRUE; +} + #endif // MODPLUG_NO_FILESAVE Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -172,6 +172,7 @@ PSB. nPanSustainBegin; PSE. nPanSustainEnd; R... nResampling; +RP.. [EXT] nRestartPos; RPB. [EXT] nRowsPerBeat; RPM. [EXT] nRowsPerMeasure; RS.. nResSwing; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/soundlib/Sndfile.h 2006-04-11 23:44:36 UTC (rev 156) @@ -934,6 +934,8 @@ BOOL SaveS3M(LPCSTR lpszFileName, UINT nPacking=0); BOOL SaveMod(LPCSTR lpszFileName, UINT nPacking=0); BOOL SaveIT(LPCSTR lpszFileName, UINT nPacking=0); + BOOL SaveCompatIT(LPCSTR lpszFileName); + BOOL SaveCompatXM(LPCSTR lpszFileName); // -> CODE#0023 // -> DESC="IT project files (.itp)" BOOL SaveITProject(LPCSTR lpszFileName); Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2006-03-23 01:46:21 UTC (rev 155) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2006-04-11 23:44:36 UTC (rev 156) @@ -611,7 +611,8 @@ m_nTickCount = 0; m_nRow = m_nNextRow; // Reset Pattern Loop Effect - if (m_nCurrentPattern != m_nNextPattern) m_nCurrentPattern = m_nNextPattern; + if (m_nCurrentPattern != m_nNextPattern) + m_nCurrentPattern = m_nNextPattern; // Check if pattern is valid if (!(m_dwSongFlags & SONG_PATTERNLOOP)) { @@ -629,16 +630,14 @@ //rewbs.instroVSTi: stop all VSTi at end of song, if looping. StopAllVsti(); - m_nMusicSpeed = m_nDefaultSpeed; m_nMusicTempo = m_nDefaultTempo; m_nGlobalVolume = m_nDefaultGlobalVolume; - for (UINT i=0; i<MAX_CHANNELS; i++) - { + for (UINT i=0; i<MAX_CHANNELS; i++) { Chn[i].dwFlags |= CHN_NOTEFADE | CHN_KEYOFF; Chn[i].nFadeOutVol = 0; - if (i < m_nChannels) - { + + if (i < m_nChannels) { Chn[i].nGlobalVol = ChnSettings[i].nVolume; Chn[i].nVolume = ChnSettings[i].nVolume; Chn[i].nPan = ChnSettings[i].nPan; @@ -648,8 +647,8 @@ Chn[i].nOldOffset = 0; Chn[i].nOldHiOffset = 0; Chn[i].nPortamentoDest = 0; - if (!Chn[i].nLength) - { + + if (!Chn[i].nLength) { Chn[i].dwFlags = ChnSettings[i].dwFlags; Chn[i].nLoopStart = 0; Chn[i].nLoopEnd = 0; @@ -662,31 +661,42 @@ } + + //Handle Repeat position if (m_nRepeatCount > 0) m_nRepeatCount--; m_nCurrentPattern = m_nRestartPos; - m_nRow = 0; - if ((Order[m_nCurrentPattern] >= MAX_PATTERNS) || (!Patterns[Order[m_nCurrentPattern]])) return FALSE; - } else - { + m_nRow = 0; + //If restart pos points to +++, move along + while (Order[m_nCurrentPattern] == 0xFE) { + m_nCurrentPattern++; + } + //Check for end of song or bad pattern + if ( (Order[m_nCurrentPattern] >= MAX_PATTERNS) + || (!Patterns[Order[m_nCurrentPattern]]) ) { + return FALSE; + } + + } else { m_nCurrentPattern++; } - m_nPattern = (m_nCurrentPattern < MAX_ORDERS) ? Order[m_nCurrentPattern] : 0xFF; - if ((m_nPattern < MAX_PATTERNS) && (!Patterns[m_nPattern])) m_nPattern = 0xFE; + + if (m_nCurrentPattern < MAX_ORDERS) { + m_nPattern = Order[m_nCurrentPattern]; + } else { + m_nPattern = 0xFF; + } + + if ((m_nPattern < MAX_PATTERNS) && (!Patterns[m_nPattern])) { + m_nPattern = 0xFE; + } } m_nNextPattern = m_nCurrentPattern; #ifdef MODPLUG_TRACKER -// if (m_nInstruments) ProcessMidiOut(); //rewbs.VSTnoteDelay if ((m_nMaxOrderPosition) && (m_nCurrentPattern >= m_nMaxOrderPosition)) return FALSE; #endif // MODPLUG_TRACKER } -//#ifdef MODPLUG_TRACKER -// if (m_dwSongFlags & SONG_STEP) -// { -// m_dwSongFlags &= ~SONG_STEP; -// m_dwSongFlags |= SONG_PAUSED; -// } -//#endif // MODPLUG_TRACKER + // Weird stuff? if ((m_nPattern >= MAX_PATTERNS) || (!Patterns[m_nPattern])) return FALSE; // Should never happen @@ -766,10 +776,7 @@ //////////////////////////////////////////////////////////////////////////////////// m_nTotalCount++; if (!m_nMusicTempo) return FALSE; -// -> CODE#0022 -// -> DESC="alternative BPM/Speed interpretation method" - switch(m_nTempoMode) { case tempo_mode_alternative: @@ -796,47 +803,22 @@ default: m_nBufferCount = (gdwMixingFreq * 5 * m_nTempoFactor) / (m_nMusicTempo << 8); } - /* - if (CMainFrame::m_dwPatternSetup & PATTERN_ALTERNTIVEBPMSPEED) { - m_nBufferCount = gdwMixingFreq / m_nMusicTempo; - } - else { - m_nBufferCount = (gdwMixingFreq * 5 * m_nTempoFactor) / (m_nMusicTempo << 8); - } - */ -// -! NEW_FEATURE#0022 m_nSamplesPerTick = m_nBufferCount; //rewbs.flu -#ifdef MODPLUG_TRACKER - if (m_dwSongFlags & SONG_PAUSED) - { - m_nBufferCount = gdwMixingFreq / 64; // 1/64 seconds - } -#endif + +// robinf: this block causes envelopes to behave incorrectly when +// playback is triggered from instrument panel. +// I can't see why it would be useful. Dissabling for now. +// +// if (m_dwSongFlags & SONG_PAUSED) { +// m_nBufferCount = gdwMixingFreq / 64; // 1/64 seconds +// } + + // Master Volume + Pre-Amplification / Attenuation setup DWORD nMasterVol; { -////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// ericus 10/02/2005 -/* - int nchn32 = (m_nChannels < 32) ? m_nChannels : 31; - if ((m_nType & MOD_TYPE_IT) && (m_nInstruments) && (nchn32 < 6)) nchn32 = 6; - int realmastervol = m_nMasterVolume; - if (realmastervol > 0x80) - { - realmastervol = 0x80 + ((realmastervol - 0x80) * (nchn32+4)) / 16; - } - UINT attenuation = (gdwSoundSetup & SNDMIX_AGC) ? PreAmpAGCTable[nchn32>>1] : PreAmpTable[nchn32>>1]; - DWORD mastervol = (realmastervol * (m_nSongPreAmp + 0x10)) >> 6; - if (mastervol > 0x200) mastervol = 0x200; - if ((m_dwSongFlags & SONG_GLOBALFADE) && (m_nGlobalFadeMaxSamples)) - { - mastervol = _muldiv(mastervol, m_nGlobalFadeSamples, m_nGlobalFadeMaxSamples); - } - nMasterVol = (mastervol << 7) / attenuation; - if (nMasterVol > 0x180) nMasterVol = 0x180; -*/ int nchn32 = 0; MODCHANNEL *pChn = Chn; for (UINT nChn=0; nChn<m_nChannels; nChn++,pChn++) { @@ -862,8 +844,6 @@ if(attenuation < 1) attenuation = 1; nMasterVol = (mastervol << 7) / attenuation; - -////////////////////////////////////////////////////////////////////////////////////////////////////////////// } //////////////////////////////////////////////////////////////////////////////////// // Update channels data This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <re...@us...> - 2006-03-23 01:46:31
|
Revision: 155 Author: rewbs Date: 2006-03-22 17:46:21 -0800 (Wed, 22 Mar 2006) ViewCVS: http://svn.sourceforge.net/modplug/?rev=155&view=rev Log Message: ----------- Testing svn commit mailing list, again. Added Paths: ----------- trunk/OpenMPT/mptrack/bin/testSvnCommitList3 Copied: trunk/OpenMPT/mptrack/bin/testSvnCommitList3 (from rev 154, trunk/OpenMPT/mptrack/bin/testSvnCommitList2) =================================================================== This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |