From: <sag...@us...> - 2015-05-31 17:22:45
|
Revision: 5217 http://sourceforge.net/p/modplug/code/5217 Author: saga-games Date: 2015-05-31 17:22:30 +0000 (Sun, 31 May 2015) Log Message: ----------- [New] Support for fractional tempo in the MPTM format. At the moment, only the default tempo can be fractional, Txx still only supports integer tempos (http://bugs.openmpt.org/view.php?id=145). [New] Support for fractional tempo for pitch/tempo lock. [Ref] Since most of the related files had to be touched anyway, rename a few enums: enmEnvelopeTypes => EnvelopeType, tempoMode => TempoMode, mixLevels => MixLevels, forcePanningMode => ForcePanningMode [Mod] OpenMPT: Version is now 1.25.00.10 Modified Paths: -------------- trunk/OpenMPT/build/vs2008/OpenMPT.vcproj trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj.filters trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj.filters trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj.filters trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj.filters trunk/OpenMPT/common/versionNumber.h trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/AppendModule.cpp trunk/OpenMPT/mptrack/AutoSaver.cpp trunk/OpenMPT/mptrack/Childfrm.h trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/Ctrl_com.cpp trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Ctrl_gen.h trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/EffectInfo.cpp trunk/OpenMPT/mptrack/ExceptionHandler.cpp trunk/OpenMPT/mptrack/Globals.cpp trunk/OpenMPT/mptrack/KeyConfigDlg.cpp trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp trunk/OpenMPT/mptrack/MPTHacks.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainbar.cpp trunk/OpenMPT/mptrack/Mainbar.h trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/mptrack/ModConvert.h trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/PSRatioCalc.cpp trunk/OpenMPT/mptrack/PSRatioCalc.h trunk/OpenMPT/mptrack/PatternClipboard.cpp trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_ins.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters trunk/OpenMPT/mptrack/view_com.cpp trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/InstrumentExtensions.cpp trunk/OpenMPT/soundlib/Load_669.cpp trunk/OpenMPT/soundlib/Load_amf.cpp trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_dbm.cpp trunk/OpenMPT/soundlib/Load_dmf.cpp trunk/OpenMPT/soundlib/Load_dsm.cpp trunk/OpenMPT/soundlib/Load_far.cpp trunk/OpenMPT/soundlib/Load_gdm.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_itp.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Load_okt.cpp trunk/OpenMPT/soundlib/Load_plm.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_stm.cpp trunk/OpenMPT/soundlib/Load_wav.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/ModChannel.h trunk/OpenMPT/soundlib/ModInstrument.cpp trunk/OpenMPT/soundlib/ModInstrument.h trunk/OpenMPT/soundlib/ModSequence.cpp trunk/OpenMPT/soundlib/SampleFormats.cpp trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/SoundFilePlayConfig.cpp trunk/OpenMPT/soundlib/SoundFilePlayConfig.h trunk/OpenMPT/soundlib/UpgradeModule.cpp trunk/OpenMPT/soundlib/load_j2b.cpp trunk/OpenMPT/soundlib/mod_specifications.cpp trunk/OpenMPT/soundlib/mod_specifications.h trunk/OpenMPT/soundlib/modcommand.cpp trunk/OpenMPT/soundlib/pattern.cpp trunk/OpenMPT/soundlib/patternContainer.cpp trunk/OpenMPT/test/test.cpp trunk/OpenMPT/test/test.mptm Added Paths: ----------- trunk/OpenMPT/mptrack/CDecimalSupport.cpp trunk/OpenMPT/mptrack/CDecimalSupport.h Modified: trunk/OpenMPT/build/vs2008/OpenMPT.vcproj =================================================================== --- trunk/OpenMPT/build/vs2008/OpenMPT.vcproj 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/build/vs2008/OpenMPT.vcproj 2015-05-31 17:22:30 UTC (rev 5217) @@ -832,6 +832,14 @@ > </File> <File + RelativePath="..\..\mptrack\CDecimalSupport.cpp" + > + </File> + <File + RelativePath="..\..\mptrack\CDecimalSupport.h" + > + </File> + <File RelativePath="..\..\mptrack\CImageListEx.cpp" > </File> Modified: trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj =================================================================== --- trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj 2015-05-31 17:22:30 UTC (rev 5217) @@ -376,6 +376,7 @@ <ClInclude Include="..\..\mptrack\AdvancedConfigDlg.h" /> <ClInclude Include="..\..\mptrack\AutoSaver.h" /> <ClInclude Include="..\..\mptrack\Autotune.h" /> + <ClInclude Include="..\..\mptrack\CDecimalSupport.h" /> <ClInclude Include="..\..\mptrack\CImageListEx.h" /> <ClInclude Include="..\..\mptrack\CListCtrl.h" /> <ClInclude Include="..\..\mptrack\CTreeCtrl.h" /> @@ -556,6 +557,7 @@ <ClCompile Include="..\..\mptrack\AppendModule.cpp" /> <ClCompile Include="..\..\mptrack\AutoSaver.cpp" /> <ClCompile Include="..\..\mptrack\Autotune.cpp" /> + <ClCompile Include="..\..\mptrack\CDecimalSupport.cpp" /> <ClCompile Include="..\..\mptrack\CImageListEx.cpp" /> <ClCompile Include="..\..\mptrack\ChannelManagerDlg.cpp" /> <ClCompile Include="..\..\mptrack\Childfrm.cpp" /> Modified: trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj.filters =================================================================== --- trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj.filters 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/build/vs2010/OpenMPT.vcxproj.filters 2015-05-31 17:22:30 UTC (rev 5217) @@ -125,6 +125,9 @@ <ClInclude Include="..\..\mptrack\Autotune.h"> <Filter>mptrack</Filter> </ClInclude> + <ClInclude Include="..\..\mptrack\CDecimalSupport.h"> + <Filter>mptrack</Filter> + </ClInclude> <ClInclude Include="..\..\mptrack\CImageListEx.h"> <Filter>mptrack</Filter> </ClInclude> @@ -640,6 +643,9 @@ <ClCompile Include="..\..\mptrack\Autotune.cpp"> <Filter>mptrack</Filter> </ClCompile> + <ClCompile Include="..\..\mptrack\CDecimalSupport.cpp"> + <Filter>mptrack</Filter> + </ClCompile> <ClCompile Include="..\..\mptrack\CImageListEx.cpp"> <Filter>mptrack</Filter> </ClCompile> Modified: trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj =================================================================== --- trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj 2015-05-31 17:22:30 UTC (rev 5217) @@ -382,6 +382,7 @@ <ClInclude Include="..\..\mptrack\AdvancedConfigDlg.h" /> <ClInclude Include="..\..\mptrack\AutoSaver.h" /> <ClInclude Include="..\..\mptrack\Autotune.h" /> + <ClInclude Include="..\..\mptrack\CDecimalSupport.h" /> <ClInclude Include="..\..\mptrack\CImageListEx.h" /> <ClInclude Include="..\..\mptrack\CListCtrl.h" /> <ClInclude Include="..\..\mptrack\CTreeCtrl.h" /> @@ -562,6 +563,7 @@ <ClCompile Include="..\..\mptrack\AppendModule.cpp" /> <ClCompile Include="..\..\mptrack\AutoSaver.cpp" /> <ClCompile Include="..\..\mptrack\Autotune.cpp" /> + <ClCompile Include="..\..\mptrack\CDecimalSupport.cpp" /> <ClCompile Include="..\..\mptrack\CImageListEx.cpp" /> <ClCompile Include="..\..\mptrack\ChannelManagerDlg.cpp" /> <ClCompile Include="..\..\mptrack\Childfrm.cpp" /> Modified: trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj.filters =================================================================== --- trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj.filters 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/build/vs2012/OpenMPT.vcxproj.filters 2015-05-31 17:22:30 UTC (rev 5217) @@ -125,6 +125,9 @@ <ClInclude Include="..\..\mptrack\Autotune.h"> <Filter>mptrack</Filter> </ClInclude> + <ClInclude Include="..\..\mptrack\CDecimalSupport.h"> + <Filter>mptrack</Filter> + </ClInclude> <ClInclude Include="..\..\mptrack\CImageListEx.h"> <Filter>mptrack</Filter> </ClInclude> @@ -640,6 +643,9 @@ <ClCompile Include="..\..\mptrack\Autotune.cpp"> <Filter>mptrack</Filter> </ClCompile> + <ClCompile Include="..\..\mptrack\CDecimalSupport.cpp"> + <Filter>mptrack</Filter> + </ClCompile> <ClCompile Include="..\..\mptrack\CImageListEx.cpp"> <Filter>mptrack</Filter> </ClCompile> Modified: trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj =================================================================== --- trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj 2015-05-31 17:22:30 UTC (rev 5217) @@ -383,6 +383,7 @@ <ClInclude Include="..\..\mptrack\AdvancedConfigDlg.h" /> <ClInclude Include="..\..\mptrack\AutoSaver.h" /> <ClInclude Include="..\..\mptrack\Autotune.h" /> + <ClInclude Include="..\..\mptrack\CDecimalSupport.h" /> <ClInclude Include="..\..\mptrack\CImageListEx.h" /> <ClInclude Include="..\..\mptrack\CListCtrl.h" /> <ClInclude Include="..\..\mptrack\CTreeCtrl.h" /> @@ -563,6 +564,7 @@ <ClCompile Include="..\..\mptrack\AppendModule.cpp" /> <ClCompile Include="..\..\mptrack\AutoSaver.cpp" /> <ClCompile Include="..\..\mptrack\Autotune.cpp" /> + <ClCompile Include="..\..\mptrack\CDecimalSupport.cpp" /> <ClCompile Include="..\..\mptrack\CImageListEx.cpp" /> <ClCompile Include="..\..\mptrack\ChannelManagerDlg.cpp" /> <ClCompile Include="..\..\mptrack\Childfrm.cpp" /> Modified: trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj.filters =================================================================== --- trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj.filters 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/build/vs2013/OpenMPT.vcxproj.filters 2015-05-31 17:22:30 UTC (rev 5217) @@ -125,6 +125,9 @@ <ClInclude Include="..\..\mptrack\Autotune.h"> <Filter>mptrack</Filter> </ClInclude> + <ClInclude Include="..\..\mptrack\CDecimalSupport.h"> + <Filter>mptrack</Filter> + </ClInclude> <ClInclude Include="..\..\mptrack\CImageListEx.h"> <Filter>mptrack</Filter> </ClInclude> @@ -640,6 +643,9 @@ <ClCompile Include="..\..\mptrack\Autotune.cpp"> <Filter>mptrack</Filter> </ClCompile> + <ClCompile Include="..\..\mptrack\CDecimalSupport.cpp"> + <Filter>mptrack</Filter> + </ClCompile> <ClCompile Include="..\..\mptrack\CImageListEx.cpp"> <Filter>mptrack</Filter> </ClCompile> Modified: trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj =================================================================== --- trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj 2015-05-31 17:22:30 UTC (rev 5217) @@ -383,6 +383,7 @@ <ClInclude Include="..\..\mptrack\AdvancedConfigDlg.h" /> <ClInclude Include="..\..\mptrack\AutoSaver.h" /> <ClInclude Include="..\..\mptrack\Autotune.h" /> + <ClInclude Include="..\..\mptrack\CDecimalSupport.h" /> <ClInclude Include="..\..\mptrack\CImageListEx.h" /> <ClInclude Include="..\..\mptrack\CListCtrl.h" /> <ClInclude Include="..\..\mptrack\CTreeCtrl.h" /> @@ -563,6 +564,7 @@ <ClCompile Include="..\..\mptrack\AppendModule.cpp" /> <ClCompile Include="..\..\mptrack\AutoSaver.cpp" /> <ClCompile Include="..\..\mptrack\Autotune.cpp" /> + <ClCompile Include="..\..\mptrack\CDecimalSupport.cpp" /> <ClCompile Include="..\..\mptrack\CImageListEx.cpp" /> <ClCompile Include="..\..\mptrack\ChannelManagerDlg.cpp" /> <ClCompile Include="..\..\mptrack\Childfrm.cpp" /> Modified: trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj.filters =================================================================== --- trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj.filters 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/build/vs2015/OpenMPT.vcxproj.filters 2015-05-31 17:22:30 UTC (rev 5217) @@ -125,6 +125,9 @@ <ClInclude Include="..\..\mptrack\Autotune.h"> <Filter>mptrack</Filter> </ClInclude> + <ClInclude Include="..\..\mptrack\CDecimalSupport.h"> + <Filter>mptrack</Filter> + </ClInclude> <ClInclude Include="..\..\mptrack\CImageListEx.h"> <Filter>mptrack</Filter> </ClInclude> @@ -640,6 +643,9 @@ <ClCompile Include="..\..\mptrack\Autotune.cpp"> <Filter>mptrack</Filter> </ClCompile> + <ClCompile Include="..\..\mptrack\CDecimalSupport.cpp"> + <Filter>mptrack</Filter> + </ClCompile> <ClCompile Include="..\..\mptrack\CImageListEx.cpp"> <Filter>mptrack</Filter> </ClCompile> Modified: trunk/OpenMPT/common/versionNumber.h =================================================================== --- trunk/OpenMPT/common/versionNumber.h 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/common/versionNumber.h 2015-05-31 17:22:30 UTC (rev 5217) @@ -19,7 +19,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 25 #define VER_MINOR 00 -#define VER_MINORMINOR 09 +#define VER_MINORMINOR 10 //Version string. For example "1.17.02.28" #define MPT_VERSION_STR VER_STRINGIZE(VER_MAJORMAJOR) "." VER_STRINGIZE(VER_MAJOR) "." VER_STRINGIZE(VER_MINOR) "." VER_STRINGIZE(VER_MINORMINOR) Modified: trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp 2015-05-31 17:22:30 UTC (rev 5217) @@ -29,6 +29,7 @@ #include "common/misc_util.h" #include "common/FileReader.h" #include "soundlib/Sndfile.h" +#include "soundlib/mod_specifications.h" #include "soundlib/AudioReadTarget.h" using namespace OpenMPT; Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2015-05-31 17:22:30 UTC (rev 5217) @@ -13,6 +13,7 @@ #include "Moddoc.h" #include "Mainfrm.h" #include "../soundlib/Sndfile.h" +#include "../soundlib/mod_specifications.h" #include "Vstplug.h" #include "dlg_misc.h" #include "AbstractVstEditor.h" Modified: trunk/OpenMPT/mptrack/AppendModule.cpp =================================================================== --- trunk/OpenMPT/mptrack/AppendModule.cpp 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/mptrack/AppendModule.cpp 2015-05-31 17:22:30 UTC (rev 5217) @@ -10,6 +10,7 @@ #include "stdafx.h" #include "Moddoc.h" +#include "../soundlib/mod_specifications.h" OPENMPT_NAMESPACE_BEGIN Modified: trunk/OpenMPT/mptrack/AutoSaver.cpp =================================================================== --- trunk/OpenMPT/mptrack/AutoSaver.cpp 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/mptrack/AutoSaver.cpp 2015-05-31 17:22:30 UTC (rev 5217) @@ -14,6 +14,7 @@ #include "Moddoc.h" #include "AutoSaver.h" #include "FileDialog.h" +#include "../soundlib/mod_specifications.h" #include <algorithm> Added: trunk/OpenMPT/mptrack/CDecimalSupport.cpp =================================================================== --- trunk/OpenMPT/mptrack/CDecimalSupport.cpp (rev 0) +++ trunk/OpenMPT/mptrack/CDecimalSupport.cpp 2015-05-31 17:22:30 UTC (rev 5217) @@ -0,0 +1,46 @@ +/* + * CDecimalSupport.cpp + * ------------------- + * Purpose: Various extensions of the CDecimalSupport implementation. + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#include "stdafx.h" +#include "Snd_defs.h" +#include "CDecimalSupport.h" + +OPENMPT_NAMESPACE_BEGIN + +BEGIN_MESSAGE_MAP(CNumberEdit, CEdit) + ON_WM_CHAR() +END_MESSAGE_MAP() + + +void CNumberEdit::SetTempoValue(const TEMPO &t) +//--------------------------------------------- +{ + SetFixedValue(t.ToDouble(), 4); +} + + +TEMPO CNumberEdit::GetTempoValue() +//-------------------------------- +{ + double d; + GetDecimalValue(d); + return TEMPO(d); +} + + +void CNumberEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) +//------------------------------------------------------------- +{ + BOOL bHandled = false; + CDecimalSupport<CNumberEdit>::OnChar(0, nChar, 0, bHandled); + if(!bHandled) CEdit::OnChar(nChar , nRepCnt, nFlags); +} + +OPENMPT_NAMESPACE_END \ No newline at end of file Property changes on: trunk/OpenMPT/mptrack/CDecimalSupport.cpp ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/x-c++src \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: trunk/OpenMPT/mptrack/CDecimalSupport.h =================================================================== --- trunk/OpenMPT/mptrack/CDecimalSupport.h (rev 0) +++ trunk/OpenMPT/mptrack/CDecimalSupport.h 2015-05-31 17:22:30 UTC (rev 5217) @@ -0,0 +1,387 @@ +/* + * CDecimalSupport.h + * ----------------- + * Purpose: Edit field which allows negative and fractional values to be entered + * Notes : Alexander Uckun's original code has beem modified a bit to suit our purposes. + * Authors: OpenMPT Devs + * Alexander Uckun + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#pragma once + +OPENMPT_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +/// \class CDecimalSupport +/// \brief decimal number support for your control +/// \author Alexander Uckun +/// \version 1.0 + +// Copyright (c) 2007 - Alexander Uckun +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +template <class T, size_t limit = _CVTBUFSIZE> +class CDecimalSupport +{ + /// the locale dependant decimal separator + TCHAR m_DecimalSeparator[5]; + /// the locale dependant negative sign + TCHAR m_NegativeSign[6]; + + bool allowSign, allowFractions; + +public: + +#ifdef BEGIN_MSG_MAP + BEGIN_MSG_MAP(CDecimalSupport) + + ALT_MSG_MAP(8) + MESSAGE_HANDLER(WM_CHAR, OnChar) + MESSAGE_HANDLER(WM_PASTE, OnPaste) + END_MSG_MAP() +#endif + + /// \brief Initialize m_DecimalSeparator and m_NegativeSign + /// \remarks calls InitDecimalSeparator and InitNegativeSign + CDecimalSupport() + : allowSign(true) + , allowFractions(true) + { + InitDecimalSeparator(); + InitNegativeSign(); + } + + /// \brief sets m_DecimalSeparator + /// \remarks calls GetLocaleInfo with LOCALE_SDECIMAL to set m_DecimalSeparator + /// \param[in] Locale the locale parameter (see GetLocaleInfo) + /// \return the number of TCHARs written to the destination buffer + int InitDecimalSeparator(LCID Locale = LOCALE_USER_DEFAULT) + { + return ::GetLocaleInfo( Locale, LOCALE_SDECIMAL, m_DecimalSeparator , sizeof(m_DecimalSeparator) / sizeof(TCHAR)); + } + + /// \brief sets m_NegativeSign + /// \remarks calls GetLocaleInfo with LOCALE_SNEGATIVESIGN to set m_NegativeSign + /// \param[in] Locale the locale parameter (see GetLocaleInfo) + /// \return the number of TCHARs written to the destination buffer + int InitNegativeSign(LCID Locale = LOCALE_USER_DEFAULT) + { + return ::GetLocaleInfo( Locale, LOCALE_SNEGATIVESIGN, m_NegativeSign , sizeof(m_NegativeSign) / sizeof(TCHAR)); + } + + /// callback for the WM_PASTE message + /// validates the input + /// \param uMsg + /// \param wParam + /// \param lParam + /// \param[out] bHandled true, if the text is a valid number + /// \return 0 + LRESULT OnPaste(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/,BOOL& bHandled) + { + bHandled = false; + int neg_sign = 0; + int dec_point = 0; + + T* pT = static_cast<T*>(this); + int nStartChar; + int nEndChar; + pT->GetSel(nStartChar , nEndChar); + TCHAR buffer[limit]; + pT->GetWindowText(buffer, limit); + + // Check if the texr already contains a decimal point + for (TCHAR* x = buffer; *x; ++x) + { + if (x - buffer == nStartChar) x += nEndChar - nStartChar; + if (*x == m_DecimalSeparator[0]) ++dec_point; + if (*x == m_NegativeSign[0]) ++neg_sign; + } + +#ifdef _UNICODE + if (!IsClipboardFormatAvailable(CF_UNICODETEXT)) return 0; +#else + if (!IsClipboardFormatAvailable(CF_TEXT)) return 0; +#endif + + if (!OpenClipboard((HWND) *pT)) return 0; + +#ifdef _UNICODE + HGLOBAL hglb = GetClipboardData(CF_UNICODETEXT); +#else + HGLOBAL hglb = ::GetClipboardData(CF_TEXT); +#endif + if (hglb != NULL) + { + LPTSTR lptstr = reinterpret_cast<TCHAR*>(GlobalLock(hglb)); + if (lptstr != NULL) + { + for (TCHAR* s = lptstr; *s; ++s) + { + if (*s == m_NegativeSign[0]) + { + + for (TCHAR* t = m_NegativeSign + 1; *t; ++t, ++s) + { + if (*t != *(s+1)) ++neg_sign; + } + + if (neg_sign || nStartChar > 0) + { + bHandled = true; + break; + } + + ++neg_sign; + continue; + } + if (*s == m_DecimalSeparator[0]) + { + for (TCHAR* t = m_DecimalSeparator + 1; *t ; ++t, ++s) + { + if (*t != *(s+1)) ++dec_point; + } + + if (dec_point) + { + bHandled = true; + break; + } + ++dec_point; + continue; + } + + if (*s < _T('0') || *s > _T('9')) + { + bHandled = true; + break; + } + + } + + GlobalUnlock(hglb); + + } + } + CloseClipboard(); + return 0; + } + + + /// callback for the WM_CHAR message + /// handles the decimal point and the negative sign keys + /// \param uMsg + /// \param[in] wParam contains the pressed key + /// \param lParam + /// \param[out] bHandled true, if the key press was handled in this function + /// \return 0 + LRESULT OnChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + bHandled = false; + if (static_cast<TCHAR>(wParam) == m_DecimalSeparator[0] || wParam == _T('.') && allowFractions) + { + T* pT = static_cast<T*>(this); + int nStartChar; + int nEndChar; + pT->GetSel(nStartChar , nEndChar); + TCHAR buffer[limit]; + pT->GetWindowText(buffer, limit); + //Verify that the control doesn't already contain a decimal point + for (TCHAR* x = buffer; *x; ++x) + { + if (x - buffer == nStartChar) x += nEndChar - nStartChar; + if (*x == m_DecimalSeparator[0]) return 0; + } + + pT->ReplaceSel(m_DecimalSeparator, true); + bHandled = true; + } + + if (static_cast<TCHAR>(wParam) == m_NegativeSign[0] && allowSign) + { + T* pT = static_cast<T*>(this); + int nStartChar; + int nEndChar; + pT->GetSel(nStartChar , nEndChar); + if (nStartChar) return 0; + + TCHAR buffer[limit]; + pT->GetWindowText(buffer, limit); + //Verify that the control doesn't already contain a negative sign + if (nEndChar == 0 && buffer[0] == m_NegativeSign[0]) return 0; + pT->ReplaceSel(m_NegativeSign, true); + bHandled = true; + } + return 0; + } + + /// converts the controls text to double + /// \param[out] d the converted value + /// \return true on success + bool GetDecimalValue(double& d) const + { + TCHAR szBuff[limit]; + static_cast<const T*>(this)->GetWindowText(szBuff, limit); + return TextToDouble(szBuff, d); + } + + /// converts a string to double + /// \remarks the decimal separator and the negative sign may change in the string + /// \param[in, out] szBuff the string to convert + /// \param[out] d the converted value + /// \return true on success + bool TextToDouble(TCHAR* szBuff, double& d) const + { + //replace the locale dependant separator with . + if (m_DecimalSeparator[0] != _T('.')) + { + for (TCHAR* x = szBuff; *x; ++x) + { + if (*x == m_DecimalSeparator[0]) + { + *x = _T('.'); + break; + } + } + + } + + TCHAR* endPtr; + //replace the negative sign with - + if (szBuff[0] == m_NegativeSign[0]) szBuff[0] = _T('-'); + d = _tcstod(szBuff, &endPtr); + return *endPtr == _T('\0'); + } + + /// sets a number as the controls text + /// \param[in] d the value + /// \param[in] count digits after the decimal point + void SetFixedValue(double d, int count) + { + int decimal_pos; + int sign; +#if _MSC_VER >= 1400 + char digits[limit]; + _fcvt_s(digits,d,count,&decimal_pos,&sign); +#else + char* digits = _fcvt(d,count,&decimal_pos,&sign); +#endif + return DisplayDecimalValue(digits, decimal_pos, sign); + } + + /// sets a number as the controls text + /// \param[in] d the value + /// \param[in] count total number of digits + + void SetDecimalValue(double d, int count) + { + int decimal_pos; + int sign; +#if _MSC_VER >= 1400 + char digits[limit]; + _ecvt_s(digits,d,count,&decimal_pos,&sign); +#else + char* digits = _ecvt(d,count,&decimal_pos,&sign); +#endif + DisplayDecimalValue(digits, decimal_pos, sign); + } + /// sets a number as the controls text + /// \param[in] d the value + /// \remarks the total number of digits is calculated using the GetLimitText function + + void SetDecimalValue(double d) + { + SetDecimalValue(d , std::min(limit , static_cast<const T*>(this)->GetLimitText()) - 2); + } + + /// sets the controls text + /// \param[in] digits array containing the digits + /// \param[in] decimal_pos the position of the decimal point + /// \param[in] sign 1 if negative + + void DisplayDecimalValue(const char* digits, int decimal_pos, int sign) + { + TCHAR szBuff[limit]; + DecimalToText(szBuff, limit , digits, decimal_pos, sign); + static_cast<T*>(this)->SetWindowText(szBuff); + } + + /// convert a digit array to string + /// \param[out] szBuff target buffer for output + /// \param[in] buflen maximum characters in output buffer + /// \param[in] digits array containing the digits + /// \param[in] decimal_pos the position of the decimal point + /// \param[in] sign 1 if negative + + void DecimalToText(TCHAR* szBuff, size_t buflen , const char* digits, int decimal_pos, int sign) const + { + int i = 0; + size_t pos = 0; + if (sign) + { + for (const TCHAR *x = m_NegativeSign; *x ; ++x , ++pos) szBuff[pos] = *x; + } + + for (; pos < buflen && digits[i] && i < decimal_pos ; ++i , ++pos) szBuff[pos] = digits[i]; + + if (decimal_pos < 1) szBuff[pos++] = _T('0'); + size_t last_nonzero = pos; + + for (const TCHAR *x = m_DecimalSeparator; *x ; ++x , ++pos) szBuff[pos] = *x; + for (; pos < buflen && decimal_pos < 0; ++decimal_pos , ++pos) szBuff[pos] = _T('0'); + + for (; pos < buflen && digits[i]; ++i , ++pos) + { + szBuff[pos] = digits[i]; + if (digits[i] != '0') last_nonzero = pos+1; + } + szBuff[std::min(buflen - 1,last_nonzero)] = _T('\0'); + } + + void AllowSign(bool allow) + { + allowSign = allow; + } + + void AllowFractions(bool allow) + { + allowFractions = allow; + } + +}; + + +class CNumberEdit : public CEdit, public CDecimalSupport<CNumberEdit> +{ +public: + void SetTempoValue(const TEMPO &t); + TEMPO GetTempoValue(); + +protected: + afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); + DECLARE_MESSAGE_MAP() +}; + +OPENMPT_NAMESPACE_END \ No newline at end of file Property changes on: trunk/OpenMPT/mptrack/CDecimalSupport.h ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/x-chdr \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Modified: trunk/OpenMPT/mptrack/Childfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Childfrm.h 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/mptrack/Childfrm.h 2015-05-31 17:22:30 UTC (rev 5217) @@ -52,7 +52,7 @@ typedef struct INSTRUMENTVIEWSTATE { DWORD cbStruct; - enmEnvelopeTypes nEnv; + EnvelopeType nEnv; INSTRUMENTINDEX initialInstrument; bool bGrid; } INSTRUMENTVIEWSTATE; Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2015-05-31 17:22:30 UTC (rev 5217) @@ -812,13 +812,13 @@ // convert to IT... modDoc.ChangeModType(MOD_TYPE_IT); - sndFile.SetMixLevels(mixLevels_compatible); - sndFile.m_nTempoMode = tempo_mode_classic; + sndFile.SetMixLevels(mixLevelsCompatible); + sndFile.m_nTempoMode = tempoModeClassic; sndFile.m_SongFlags = SONG_LINEARSLIDES; sndFile.m_MidiCfg.Reset(); // Global vars - sndFile.m_nDefaultTempo = 125; + sndFile.m_nDefaultTempo.Set(125); sndFile.m_nDefaultSpeed = 6; sndFile.m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME; sndFile.m_nSamplePreAmp = 48; Modified: trunk/OpenMPT/mptrack/Ctrl_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_com.cpp 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/mptrack/Ctrl_com.cpp 2015-05-31 17:22:30 UTC (rev 5217) @@ -10,13 +10,14 @@ #include "stdafx.h" -#include "mptrack.h" -#include "mainfrm.h" -#include "moddoc.h" -#include "globals.h" -#include "ctrl_com.h" +#include "Mptrack.h" +#include "Mainfrm.h" +#include "Moddoc.h" +#include "Globals.h" +#include "Ctrl_com.h" #include "view_com.h" #include "InputHandler.h" +#include "../soundlib/mod_specifications.h" OPENMPT_NAMESPACE_BEGIN Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2015-05-31 17:22:30 UTC (rev 5217) @@ -1,5 +1,5 @@ /* - * ctrl_gen.cpp + * Ctrl_gen.cpp * ------------ * Purpose: General tab, upper panel. * Notes : (currently none) @@ -10,15 +10,15 @@ #include "stdafx.h" -#include "mptrack.h" -#include "mainfrm.h" -#include "moddoc.h" -#include "globals.h" +#include "Mptrack.h" +#include "Mainfrm.h" +#include "Moddoc.h" +#include "Globals.h" #include "dlg_misc.h" -#include "ctrl_gen.h" -#include "view_gen.h" -#include "math.h" +#include "Ctrl_gen.h" +#include "View_gen.h" #include "../common/misc_util.h" +#include "../soundlib/mod_specifications.h" OPENMPT_NAMESPACE_BEGIN @@ -51,7 +51,7 @@ //{{AFX_DATA_MAP(CCtrlGeneral) DDX_Control(pDX, IDC_EDIT_SONGTITLE, m_EditTitle); DDX_Control(pDX, IDC_EDIT_ARTIST, m_EditArtist); - DDX_Control(pDX, IDC_EDIT_TEMPO, m_EditTempo); + //DDX_Control(pDX, IDC_EDIT_TEMPO, m_EditTempo); DDX_Control(pDX, IDC_SPIN_TEMPO, m_SpinTempo); DDX_Control(pDX, IDC_EDIT_SPEED, m_EditSpeed); DDX_Control(pDX, IDC_SPIN_SPEED, m_SpinSpeed); @@ -102,10 +102,13 @@ m_SliderVSTiVol.SetRange(0, MAX_SLIDER_VSTI_VOL); m_SliderSamplePreAmp.SetRange(0, MAX_SLIDER_SAMPLE_VOL); + m_SpinTempo.SetRange(-10, 10); m_SliderTempo.SetLineSize(1); m_SliderTempo.SetPageSize(10); + m_EditTempo.SubclassDlgItem(IDC_EDIT_TEMPO, this); + m_EditTempo.AllowSign(false); - m_bEditsLocked=false; + m_bEditsLocked = false; UpdateView(GeneralHint().ModType()); OnActivatePage(0); m_bInitialized = TRUE; @@ -178,16 +181,17 @@ if(delay) { uint32 newTempo = 60000 * numSamples; - if(m_sndFile.m_nTempoMode != tempo_mode_modern) + if(m_sndFile.m_nTempoMode != tempoModeModern) { newTempo = (newTempo * m_sndFile.m_nDefaultSpeed * m_sndFile.m_nDefaultRowsPerBeat) / 24; } - newTempo /= delay; + newTempo = Util::muldivr(newTempo, TEMPO::fractFact, delay); + TEMPO t; + t.SetRaw(newTempo); - int tempoMin, tempoMax; - m_SpinTempo.GetRange32(tempoMin, tempoMax); - Limit(newTempo, TEMPO(tempoMin), TEMPO(tempoMax)); - SetDlgItemInt(IDC_EDIT_TEMPO, newTempo, FALSE); + Limit(t, tempoMin, tempoMax); + if(!m_sndFile.GetModSpecifications().hasFractionalTempo) t.Set(t.GetInt(), 0); + m_EditTempo.SetTempoValue(t); } } @@ -233,14 +237,14 @@ else m_SpinSpeed.SetRange32(specs.speedMin, specs.speedMax); - TEMPO tempoMin = specs.tempoMin; + tempoMin = specs.tempoMin; tempoMax = specs.tempoMax; // IT Hack: There are legacy OpenMPT-made ITs out there which use a higher default speed than 255. // Changing the upper tempo limit in the mod specs would break them, so do it here instead. - if(m_sndFile.GetType() == MOD_TYPE_IT && m_sndFile.m_nDefaultTempo <= 255) - tempoMax = 255; - m_SliderTempo.SetRange(0, tempoMax - tempoMin); - m_SpinTempo.SetRange(tempoMin, tempoMax); + if(m_sndFile.GetType() == MOD_TYPE_IT && m_sndFile.m_nDefaultTempo <= TEMPO(255, 0)) + tempoMax.Set(255); + m_SliderTempo.SetRange(0, tempoMax.GetInt() - tempoMin.GetInt()); + m_EditTempo.AllowFractions(specs.hasFractionalTempo); const BOOL bIsNotMOD = (m_sndFile.GetType() != MOD_TYPE_MOD); const BOOL bIsNotMOD_S3M = ((bIsNotMOD) && (m_sndFile.GetType() != MOD_TYPE_S3M)); @@ -293,7 +297,7 @@ { m_EditTitle.SetWindowText(m_sndFile.GetTitle().c_str()); ::SetWindowTextW(m_EditArtist.m_hWnd, mpt::ToWide(m_sndFile.songArtist).c_str()); - SetDlgItemInt(IDC_EDIT_TEMPO, m_sndFile.m_nDefaultTempo, FALSE); + m_EditTempo.SetTempoValue(m_sndFile.m_nDefaultTempo); SetDlgItemInt(IDC_EDIT_SPEED, m_sndFile.m_nDefaultSpeed, FALSE); SetDlgItemInt(IDC_EDIT_GLOBALVOL, m_sndFile.m_nDefaultGlobalVolume / GetGlobalVolumeFactor(), FALSE); SetDlgItemInt(IDC_EDIT_RESTARTPOS, m_sndFile.m_nRestartPos, FALSE); @@ -304,7 +308,7 @@ m_SliderGlobalVol.SetPos(MAX_SLIDER_GLOBAL_VOL - m_sndFile.m_nDefaultGlobalVolume); m_SliderVSTiVol.SetPos(MAX_SLIDER_VSTI_VOL - m_sndFile.m_nVSTiVolume); m_SliderSamplePreAmp.SetPos(MAX_SLIDER_SAMPLE_VOL - m_sndFile.m_nSamplePreAmp); - m_SliderTempo.SetPos(tempoMax - m_sndFile.m_nDefaultTempo); + m_SliderTempo.SetPos((tempoMax - m_sndFile.m_nDefaultTempo).GetInt()); int srcMode = 0; for(int i = 0; i < CountOf(interpolationTypes); i++) @@ -332,20 +336,19 @@ { CSliderCtrl* pSlider = (CSliderCtrl*) pscroll; - if (pSlider==&m_SliderTempo) + if (pSlider == &m_SliderTempo) { - const TEMPO tempo = tempoMax - TEMPO(m_SliderTempo.GetPos()); + const TEMPO tempo = tempoMax - TEMPO(m_SliderTempo.GetPos(), 0); if ((tempo >= m_sndFile.GetModSpecifications().tempoMin) && (tempo <= m_sndFile.GetModSpecifications().tempoMax) && (tempo != m_sndFile.m_nDefaultTempo)) { - m_sndFile.m_nDefaultTempo = tempo; - m_sndFile.m_PlayState.m_nMusicTempo = tempo; + m_sndFile.m_nDefaultTempo = m_sndFile.m_PlayState.m_nMusicTempo = tempo; m_modDoc.SetModified(); m_modDoc.UpdateAllViews(nullptr, GeneralHint().General(), this); } } - else if (pSlider==&m_SliderGlobalVol) + else if (pSlider == &m_SliderGlobalVol) { const UINT gv = MAX_SLIDER_GLOBAL_VOL - m_SliderGlobalVol.GetPos(); if ((gv >= 0) && (gv <= MAX_SLIDER_GLOBAL_VOL) && (gv != m_sndFile.m_nDefaultGlobalVolume)) @@ -358,7 +361,7 @@ } } - else if (pSlider==&m_SliderSamplePreAmp) + else if (pSlider == &m_SliderSamplePreAmp) { const UINT spa = MAX_SLIDER_SAMPLE_VOL - m_SliderSamplePreAmp.GetPos(); if ((spa >= 0) && (spa <= MAX_SLIDER_SAMPLE_VOL) && (spa != m_sndFile.m_nSamplePreAmp)) @@ -370,7 +373,7 @@ } } - else if (pSlider==&m_SliderVSTiVol) + else if (pSlider == &m_SliderVSTiVol) { const UINT vv = MAX_SLIDER_VSTI_VOL - m_SliderVSTiVol.GetPos(); if ((vv >= 0) && (vv <= MAX_SLIDER_VSTI_VOL) && (vv != m_sndFile.m_nVSTiVolume)) @@ -382,6 +385,20 @@ } } + else if(pSlider == (CSliderCtrl*)&m_SpinTempo) + { + int pos = m_SpinTempo.GetPos32(); + if(pos != 0) + { + TEMPO newTempo = m_sndFile.m_nDefaultTempo + TEMPO(pos, 0); + Limit(newTempo, tempoMin, tempoMax); + m_sndFile.m_nDefaultTempo = m_sndFile.m_PlayState.m_nMusicTempo = newTempo; + m_modDoc.SetModified(); + m_modDoc.UpdateAllViews(nullptr, GeneralHint().General(), this); + } + m_SpinTempo.SetPos(0); + } + UpdateView(GeneralHint().General()); } } @@ -422,27 +439,20 @@ void CCtrlGeneral::OnTempoChanged() //--------------------------------- { - CHAR s[16]; - if (m_bInitialized) + if (m_bInitialized && m_EditTempo.GetWindowTextLength() > 0) { - m_EditTempo.GetWindowText(s, sizeof(s)); - if (s[0]) + TEMPO tempo = m_EditTempo.GetTempoValue(); + Limit(tempo, tempoMin, tempoMax); + if(!m_sndFile.GetModSpecifications().hasFractionalTempo) tempo.Set(tempo.GetInt()); + if (tempo != m_sndFile.m_nDefaultTempo) { - TEMPO n = TEMPO(atoi(s)); - int tempoMin, tempoMax; - m_SpinTempo.GetRange32(tempoMin, tempoMax); - n = Clamp(n, TEMPO(tempoMin), TEMPO(tempoMax)); - if (n != m_sndFile.m_nDefaultTempo) - { - m_bEditsLocked=true; - m_EditTempo.SetModify(FALSE); - m_sndFile.m_nDefaultTempo = n; - m_sndFile.m_PlayState.m_nMusicTempo = n; - m_modDoc.SetModified(); - m_modDoc.UpdateAllViews(nullptr, GeneralHint().General(), this); - UpdateView(GeneralHint().General()); - m_bEditsLocked=false; - } + m_bEditsLocked=true; + m_EditTempo.SetModify(FALSE); + m_sndFile.m_nDefaultTempo = tempo; + m_sndFile.m_PlayState.m_nMusicTempo = tempo; + m_modDoc.SetModified(); + m_modDoc.UpdateAllViews(nullptr, GeneralHint().General()); + m_bEditsLocked=false; } } } Modified: trunk/OpenMPT/mptrack/Ctrl_gen.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.h 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/mptrack/Ctrl_gen.h 2015-05-31 17:22:30 UTC (rev 5217) @@ -11,6 +11,8 @@ #pragma once +#include "CDecimalSupport.h" + OPENMPT_NAMESPACE_BEGIN //========================= @@ -63,8 +65,9 @@ bool m_bEditsLocked; //{{AFX_DATA(CCtrlGeneral) CEdit m_EditTitle, m_EditArtist; - CEdit m_EditTempo, m_EditSpeed, m_EditGlobalVol, m_EditRestartPos, + CEdit m_EditSpeed, m_EditGlobalVol, m_EditRestartPos, m_EditSamplePA, m_EditVSTiVol; + CNumberEdit m_EditTempo; CButton m_BtnModType; CSpinButtonCtrl m_SpinTempo, m_SpinSpeed, m_SpinGlobalVol, m_SpinRestartPos, m_SpinSamplePA, m_SpinVSTiVol; @@ -73,7 +76,7 @@ CSliderCtrl m_SliderTempo, m_SliderSamplePreAmp, m_SliderGlobalVol, m_SliderVSTiVol; CVuMeter m_VuMeterLeft, m_VuMeterRight; - TEMPO tempoMax; + TEMPO tempoMin, tempoMax; //}}AFX_DATA //{{AFX_VIRTUAL(CCtrlGeneral) virtual BOOL OnInitDialog(); Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2015-05-31 17:22:30 UTC (rev 5217) @@ -1,5 +1,5 @@ /* - * ctrl_ins.cpp + * Ctrl_ins.cpp * ------------ * Purpose: Instrument tab, upper panel. * Notes : (currently none) @@ -15,6 +15,7 @@ #include "InputHandler.h" #include "Childfrm.h" #include "Moddoc.h" +#include "../soundlib/mod_specifications.h" #include "Globals.h" #include "Ctrl_ins.h" #include "View_ins.h" @@ -835,7 +836,6 @@ DDX_Control(pDX, IDC_SPIN12, m_SpinPPS); DDX_Control(pDX, IDC_EDIT8, m_EditGlobalVol); DDX_Control(pDX, IDC_EDIT9, m_EditPanning); - DDX_Control(pDX, IDC_EDIT15, m_EditPPS); DDX_Control(pDX, IDC_CHECK1, m_CheckPanning); DDX_Control(pDX, IDC_CHECK2, m_CheckCutOff); DDX_Control(pDX, IDC_CHECK3, m_CheckResonance); @@ -849,10 +849,9 @@ DDX_Control(pDX, IDC_SPIN1, m_SpinAttack); DDX_Control(pDX, IDC_COMBOTUNING, m_ComboTuning); DDX_Control(pDX, IDC_CHECK_PITCHTEMPOLOCK, m_CheckPitchTempoLock); - DDX_Control(pDX, IDC_EDIT_PITCHTEMPOLOCK, m_EditPitchTempoLock); DDX_Control(pDX, IDC_PLUGIN_VOLUMESTYLE, m_CbnPluginVolumeHandling); DDX_Control(pDX, IDC_PLUGIN_VELOCITYSTYLE, velocityStyle); - DDX_Control(pDX, IDC_SPIN2, pwdSpin); + DDX_Control(pDX, IDC_SPIN2, m_SpinPWD); //}}AFX_DATA_MAP } @@ -918,6 +917,9 @@ m_SpinMidiPR.SetRange(0, 128); // Midi Bank m_SpinMidiBK.SetRange(0, 16384); + // MIDI Pitch Wheel Depth + m_EditPWD.SubclassDlgItem(IDC_PITCHWHEELDEPTH, this); + m_EditPWD.AllowFractions(false); m_CbnResampling.SetItemData(m_CbnResampling.AddString("Default"), SRCMODE_DEFAULT); m_CbnResampling.SetItemData(m_CbnResampling.AddString("None"), SRCMODE_NEAREST); @@ -944,6 +946,8 @@ m_SliderCutOff.SetRange(0x00, 0x7F); m_SliderResonance.SetRange(0x00, 0x7F); // Pitch/Pan Separation + m_EditPPS.SubclassDlgItem(IDC_EDIT15, this); + m_EditPPS.AllowFractions(false); m_SpinPPS.SetRange(-32, +32); // Pitch/Pan Center AppendNotesToControl(m_ComboPPC, 0, NOTE_MAX - NOTE_MIN); @@ -955,12 +959,14 @@ m_SpinInstrument.SetFocus(); - GetDlgItem(IDC_PITCHWHEELDEPTH)->EnableWindow(FALSE); + m_EditPWD.EnableWindow(FALSE); BuildTuningComboBox(); CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); - m_EditPitchTempoLock.SetLimitText(4); + m_EditPitchTempoLock.SubclassDlgItem(IDC_EDIT_PITCHTEMPOLOCK, this); + m_EditPitchTempoLock.AllowSign(false); + m_EditPitchTempoLock.SetLimitText(9); SetRedraw(TRUE); return FALSE; @@ -1186,11 +1192,11 @@ // Pitch Wheel Depth if(m_sndFile.GetType() == MOD_TYPE_XM) - pwdSpin.SetRange(0, 36); + m_SpinPWD.SetRange(0, 36); else - pwdSpin.SetRange(-128, 127); - GetDlgItem(IDC_PITCHWHEELDEPTH)->EnableWindow(bITandXM); - pwdSpin.EnableWindow(bITandXM); + m_SpinPWD.SetRange(-128, 127); + m_EditPWD.EnableWindow(bITandXM); + m_SpinPWD.EnableWindow(bITandXM); m_NoteMap.EnableWindow(bITandXM); m_CbnResampling.EnableWindow(bITandXM); @@ -1225,11 +1231,11 @@ { CString s; if (ich == MidiNoChannel) - s = "None"; + s = _T("None"); else if (ich == MidiMappedChannel) - s = "Mapped"; + s = _T("Mapped"); else - s.Format("%d", ich); + s.Format(_T("%u"), ich); m_CbnMidiCh.SetItemData(m_CbnMidiCh.AddString(s), ich); } } @@ -1255,11 +1261,11 @@ if (pIns->nMidiProgram>0 && pIns->nMidiProgram<=128) SetDlgItemInt(IDC_EDIT10, pIns->nMidiProgram); else - SetDlgItemText(IDC_EDIT10, "---"); + SetDlgItemText(IDC_EDIT10, _T("---")); if (pIns->wMidiBank && pIns->wMidiBank <= 16384) SetDlgItemInt(IDC_EDIT11, pIns->wMidiBank); else - SetDlgItemText(IDC_EDIT11, "---"); + SetDlgItemText(IDC_EDIT11, _T("---")); if (pIns->nMidiChannel < 18) { @@ -1310,7 +1316,7 @@ m_ComboPPC.SetRedraw(TRUE); } m_ComboPPC.SetCurSel(pIns->nPPC); - ASSERT(m_ComboPPC.GetItemData(m_ComboPPC.GetCurSel()) == pIns->nPPC + NOTE_MIN); + ASSERT((uint8)m_ComboPPC.GetItemData(m_ComboPPC.GetCurSel()) == pIns->nPPC + NOTE_MIN); SetDlgItemInt(IDC_EDIT15, pIns->nPPS); // Filter if (m_sndFile.GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) @@ -1334,12 +1340,12 @@ UpdateTuningComboBox(); // Only enable Pitch/Tempo Lock for MPTM files or legacy files that have this property enabled. - m_CheckPitchTempoLock.EnableWindow((m_sndFile.GetType() == MOD_TYPE_MPT || pIns->wPitchToTempoLock > 0) ? TRUE : FALSE); - CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, pIns->wPitchToTempoLock > 0 ? MF_CHECKED : MF_UNCHECKED); - m_EditPitchTempoLock.EnableWindow(pIns->wPitchToTempoLock > 0 ? TRUE : FALSE); - if(pIns->wPitchToTempoLock > 0) + m_CheckPitchTempoLock.EnableWindow((m_sndFile.GetType() == MOD_TYPE_MPT || pIns->pitchToTempoLock.GetRaw() > 0) ? TRUE : FALSE); + CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, pIns->pitchToTempoLock.GetRaw() > 0 ? MF_CHECKED : MF_UNCHECKED); + m_EditPitchTempoLock.EnableWindow(pIns->pitchToTempoLock.GetRaw() > 0 ? TRUE : FALSE); + if(pIns->pitchToTempoLock.GetRaw() > 0) { - m_EditPitchTempoLock.SetWindowText(mpt::ToString(pIns->wPitchToTempoLock).c_str()); + m_EditPitchTempoLock.SetTempoValue(pIns->pitchToTempoLock); } // Pitch Wheel Depth @@ -1397,20 +1403,20 @@ ModInstrument *pIns = m_sndFile.Instruments[m_nInstrument]; if(pIns) { - CHAR s[32]; + TCHAR s[32]; // In IT Compatible mode, it is enough to just have resonance enabled to turn on the filter. const bool resEnabled = (pIns->IsResonanceEnabled() && pIns->GetResonance() > 0 && m_sndFile.IsCompatibleMode(TRK_IMPULSETRACKER)); if((pIns->IsCutoffEnabled() && pIns->GetCutoff() < 0x7F) || resEnabled) { const BYTE cutoff = (resEnabled && !pIns->IsCutoffEnabled()) ? 0x7F : pIns->GetCutoff(); - wsprintf(s, "Z%02X (%d Hz)", cutoff, m_sndFile.CutOffToFrequency(cutoff)); + wsprintf(s, _T("Z%02X (%u Hz)"), cutoff, m_sndFile.CutOffToFrequency(cutoff)); } else if(pIns->IsCutoffEnabled()) { - strcpy(s, "Z7F (Off)"); + _tcscpy(s, _T("Z7F (Off)")); } else { - strcpy(s, "No Change"); + _tcscpy(s, _T("No Change")); } SetDlgItemText(IDC_FILTERTEXT, s); @@ -1556,15 +1562,13 @@ // Pitch/Tempo lock { const CModSpecifications& specs = m_sndFile.GetModSpecifications(); - std::string str = std::string("Tempo range: ") + mpt::ToString(specs.tempoMin) + std::string(" - ") + mpt::ToString(specs.tempoMax); - if(str.size() >= 250) str.resize(250); - strcpy(pszText, str.c_str()); + wsprintf(pszText, _T("Tempo range: %u - %u"), specs.tempoMin.GetInt(), specs.tempoMax.GetInt()); return TRUE; } case IDC_EDIT7: // Fade Out - wsprintf(pszText, "Higher value <-> Faster fade out"); + _tcscpy(pszText, _T("Higher value <-> Faster fade out")); return TRUE; case IDC_PLUGIN_VELOCITYSTYLE: @@ -1575,13 +1579,13 @@ { velocityStyle.EnableWindow(FALSE); m_CbnPluginVolumeHandling.EnableWindow(FALSE); - strcpy(pszText, "To enable, clear Plugin volume command bug emulation flag from Song Properties"); + _tcscpy(pszText, ("To enable, clear Plugin volume command bug emulation flag from Song Properties")); return TRUE; } else { if(uId == IDC_PLUGIN_VELOCITYSTYLE) { - strcpy(pszText, "Volume commands (vxx) next to a note are sent as note velocity instead."); + _tcscpy(pszText, _T("Volume commands (vxx) next to a note are sent as note velocity instead.")); return TRUE; } return FALSE; @@ -1589,7 +1593,7 @@ case IDC_COMBO5: // MIDI Channel - strcpy(pszText, "Mapped: MIDI channel corresponds to pattern channel modulo 16"); + _tcscpy(pszText, _T("Mapped: MIDI channel corresponds to pattern channel modulo 16")); return TRUE; case IDC_SLIDER1: @@ -1601,11 +1605,11 @@ return TRUE; case IDC_SLIDER3: - wsprintf(pszText, "%d", pIns->GetCutoff()); + wsprintf(pszText, _T("%u"), pIns->GetCutoff()); return TRUE; case IDC_SLIDER4: - wsprintf(pszText, "%d", pIns->GetResonance()); + wsprintf(pszText, _T("%u"), pIns->GetResonance()); return TRUE; case IDC_SLIDER6: @@ -1617,7 +1621,7 @@ return TRUE; case IDC_PITCHWHEELDEPTH: - strcpy(pszText, "Set this to the actual Pitch Wheel Depth used in your plugin on this channel."); + _tcscpy(pszText, _T("Set this to the actual Pitch Wheel Depth used in your plugin on this channel.")); return TRUE; } @@ -1755,7 +1759,7 @@ void CCtrlInstruments::OnInstrumentSave() //--------------------------------------- { - TCHAR szFileName[_MAX_PATH] = ""; + TCHAR szFileName[_MAX_PATH] = _T(""); ModInstrument *pIns = m_sndFile.Instruments[m_nInstrument]; if (!pIns) return; @@ -1820,7 +1824,7 @@ { if (!IsLocked()) { - CHAR s[64]; + TCHAR s[64]; s[0] = 0; m_EditName.GetWindowText(s, sizeof(s)); ModInstrument *pIns = m_sndFile.Instruments[m_nInstrument]; @@ -1838,7 +1842,7 @@ { if (!IsLocked()) { - CHAR s[64]; + TCHAR s[64]; s[0] = 0; m_EditFileName.GetWindowText(s, sizeof(s)); ModInstrument *pIns = m_sndFile.Instruments[m_nInstrument]; @@ -1906,7 +1910,7 @@ for(std::set<SAMPLEINDEX>::const_iterator sample = referencedSamples.begin(); sample != referencedSamples.end(); sample++) { - if(*sample <= m_sndFile.GetNumSamples() && m_sndFile.GetSample(*sample).uFlags & CHN_PANNING) + if(*sample <= m_sndFile.GetNumSamples() && m_sndFile.GetSample(*sample).uFlags[CHN_PANNING]) { smpPanningInUse = true; break; @@ -1920,11 +1924,11 @@ "Do you wish to disable panning from those samples so that the instrument pan setting is effective " "for the whole instrument?")) == cnfYes) { - for(BYTE i = 0; i < CountOf(pIns->Keyboard); i++) + for(size_t i = 0; i < CountOf(pIns->Keyboard); i++) { const SAMPLEINDEX smp = pIns->Keyboard[i]; if(smp > 0 && smp <= m_sndFile.GetNumSamples()) - m_sndFile.GetSample(smp).uFlags &= ~CHN_PANNING; + m_sndFile.GetSample(smp).uFlags.reset(CHN_PANNING); } m_modDoc.UpdateAllViews(nullptr, SampleHint().Info().ModType(), this); } @@ -2016,10 +2020,10 @@ } } // we will not set the midi bank/program if it is 0 - if (n == 0) + if(n == 0) { LockControls(); - SetDlgItemText(IDC_EDIT10, "---"); + SetDlgItemText(IDC_EDIT10, _T("---")); UnlockControls(); } } @@ -2032,17 +2036,17 @@ ModInstrument *pIns = m_sndFile.Instruments[m_nInstrument]; if ((!IsLocked()) && (pIns)) { - WORD w = GetDlgItemInt(IDC_EDIT11); + uint16 w = GetDlgItemInt(IDC_EDIT11); if(w >= 0 && w <= 16384 && pIns->wMidiBank != w) { pIns->wMidiBank = w; SetModified(InstrumentHint().Info(), false); } - // we will not set the midi bank/program if it is 0 + // we will not set the midi bank/program if it is 0 if(w == 0) { LockControls(); - SetDlgItemText(IDC_EDIT11, "---"); + SetDlgItemText(IDC_EDIT11, _T("---")); UnlockControls(); } } @@ -2070,10 +2074,10 @@ ModInstrument *pIns = m_sndFile.Instruments[m_nInstrument]; if ((!IsLocked()) && (pIns)) { - int n = m_CbnResampling.GetItemData(m_CbnResampling.GetCurSel()); - if (pIns->nResampling != (BYTE)(n & 0xff)) + uint32 n = m_CbnResampling.GetItemData(m_CbnResampling.GetCurSel()); + if (pIns->nResampling != n) { - pIns->nResampling = (BYTE)(n & 0xff); + pIns->nResampling = n; SetModified(InstrumentHint().Info(), false); } } @@ -2183,7 +2187,8 @@ if ((!IsLocked()) && (pIns)) { int n = GetDlgItemInt(IDC_EDIT15); - if ((n >= -32) && (n <= 32)) { + if ((n >= -32) && (n <= 32)) + { if (pIns->nPPS != (signed char)n) { pIns->nPPS = (signed char)n; @@ -2327,6 +2332,7 @@ void CCtrlInstruments::OnVScroll(UINT nCode, UINT nPos, CScrollBar *pSB) //---------------------------------------------------------------------- { + // Give focus back to envelope editor when stopping to scroll spin buttons (for instrument preview keyboard focus) CModControlDlg::OnVScroll(nCode, nPos, pSB); if (nCode == SB_ENDSCROLL) SwitchToView(); } @@ -2697,10 +2703,9 @@ if(!IsLocked() && pIns != nullptr) { int pwd = GetDlgItemInt(IDC_PITCHWHEELDEPTH, NULL, TRUE); - if(m_sndFile.GetType() == MOD_TYPE_XM) - Limit(pwd, 0, 36); - else - Limit(pwd, -128, 127); + int lower = -128, upper = 127; + m_SpinPWD.GetRange32(lower, upper); + Limit(pwd, lower, upper); if(pwd != pIns->midiPWD) { pIns->midiPWD = static_cast<int8>(pwd); @@ -2726,24 +2731,22 @@ if(IsDlgButtonChecked(IDC_CHECK_PITCHTEMPOLOCK)) { //Checking what value to put for the wPitchToTempoLock. - uint16 ptl = 0; + TEMPO ptl; if(m_EditPitchTempoLock.GetWindowTextLength() > 0) { - TCHAR buffer[8]; - m_EditPitchTempoLock.GetWindowText(buffer, CountOf(buffer)); - ptl = _ttoi(buffer); + ptl = m_EditPitchTempoLock.GetTempoValue(); } - if(!ptl) + if(!ptl.GetRaw()) { ptl = m_sndFile.m_nDefaultTempo; } - m_EditPitchTempoLock.SetWindowText(mpt::ToString(ptl).c_str()); + m_EditPitchTempoLock.SetTempoValue(ptl); for(INSTRUMENTINDEX i = firstIns; i <= lastIns; i++) { - if(m_sndFile.Instruments[i] != nullptr && m_sndFile.Instruments[i]->wPitchToTempoLock == 0) + if(m_sndFile.Instruments[i] != nullptr && m_sndFile.Instruments[i]->pitchToTempoLock.GetRaw() == 0) { - m_sndFile.Instruments[i]->wPitchToTempoLock = ptl; + m_sndFile.Instruments[i]->pitchToTempoLock = ptl; m_modDoc.SetModified(); } } @@ -2751,9 +2754,9 @@ { for(INSTRUMENTINDEX i = firstIns; i <= lastIns; i++) { - if(m_sndFile.Instruments[i] != nullptr && m_sndFile.Instruments[i]->wPitchToTempoLock != 0) + if(m_sndFile.Instruments[i] != nullptr && m_sndFile.Instruments[i]->pitchToTempoLock.GetRaw() != 0) { - m_sndFile.Instruments[i]->wPitchToTempoLock = 0; + m_sndFile.Instruments[i]->pitchToTempoLock.Set(0); m_modDoc.SetModified(); } } @@ -2767,12 +2770,10 @@ { if(IsLocked() || !m_nInstrument || !m_sndFile.Instruments[m_nInstrument]) return; - TCHAR buffer[8]; - m_EditPitchTempoLock.GetWindowText(buffer, CountOf(buffer)); - TEMPO ptlTempo = _ttoi(buffer); + TEMPO ptlTempo = m_EditPitchTempoLock.GetTempoValue(); Limit(ptlTempo, m_sndFile.GetModSpecifications().tempoMin, m_sndFile.GetModSpecifications().tempoMax); - m_sndFile.Instruments[m_nInstrument]->wPitchToTempoLock = ptlTempo; + m_sndFile.Instruments[m_nInstrument]->pitchToTempoLock = ptlTempo; m_modDoc.SetModified(); // Only update other views after killing focus } @@ -2783,9 +2784,7 @@ //Checking that tempo value is in correct range. if(IsLocked()) return; - TCHAR buffer[8]; - m_EditPitchTempoLock.GetWindowText(buffer, CountOf(buffer)); - int ptlTempo = _ttoi(buffer); + TEMPO ptlTempo = m_EditPitchTempoLock.GetTempoValue(); bool changed = false; const CModSpecifications& specs = m_sndFile.GetModSpecifications(); @@ -2793,16 +2792,14 @@ { ptlTempo = specs.tempoMin; changed = true; - } - if(ptlTempo > specs.tempoMax) + } else if(ptlTempo > specs.tempoMax) { ptlTempo = specs.tempoMax; changed = true; - } if(changed) { - m_EditPitchTempoLock.SetWindowText(mpt::ToString(ptlTempo).c_str()); + m_EditPitchTempoLock.SetTempoValue(ptlTempo); m_modDoc.SetModified(); } m_modDoc.UpdateAllViews(nullptr, InstrumentHint().Info(), this); Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2015-05-31 17:22:30 UTC (rev 5217) @@ -11,6 +11,8 @@ #pragma once +#include "CDecimalSupport.h" + OPENMPT_NAMESPACE_BEGIN class CNoteMapWnd; @@ -92,9 +94,10 @@ protected: CModControlBar m_ToolBar; CSpinButtonCtrl m_SpinInstrument, m_SpinFadeOut, m_SpinGlobalVol, m_SpinPanning; - CSpinButtonCtrl m_SpinMidiPR, m_SpinPPS, m_SpinMidiBK, pwdSpin; + CSpinButtonCtrl m_SpinMidiPR, m_SpinPPS, m_SpinMidiBK, m_SpinPWD; CComboBox m_ComboNNA, m_ComboDCT, m_ComboDCA, m_ComboPPC, m_CbnMidiCh, m_CbnMixPlug, m_CbnResampling, m_CbnFilterMode, m_CbnPluginVolumeHandling; - CEdit m_EditName, m_EditFileName, m_EditGlobalVol, m_EditPanning, m_EditPPS, m_EditFadeOut; + CEdit m_EditName, m_EditFileName, m_EditGlobalVol, m_EditPanning, m_EditFadeOut; + CNumberEdit m_EditPPS, m_EditPWD; CButton m_CheckPanning, m_CheckCutOff, m_CheckResonance, velocityStyle; CSliderCtrl m_SliderVolSwing, m_SliderPanSwing, m_SliderCutSwing, m_SliderResSwing, m_SliderCutOff, m_SliderResonance; @@ -113,7 +116,7 @@ void UpdatePluginList(); //Pitch/Tempo lock - CEdit m_EditPitchTempoLock; + CNumberEdit m_EditPitchTempoLock; CButton m_CheckPitchTempoLock; @@ -165,10 +168,10 @@ afx_msg void OnDCTChanged(); afx_msg void OnDCAChanged(); afx_msg void OnMPRChanged(); - afx_msg void OnMBKChanged(); //rewbs.MidiBank + afx_msg void OnMBKChanged(); afx_msg void OnMCHChanged(); afx_msg void OnResamplingChanged(); - afx_msg void OnMixPlugChanged(); //rewbs.instroVSTi + afx_msg void OnMixPlugChanged(); afx_msg void OnPPSChanged(); afx_msg void OnPPCChanged(); afx_msg void OnFilterModeChanged(); @@ -176,18 +179,12 @@ afx_msg void OnPluginVolumeHandlingChanged(); afx_msg void OnPitchWheelDepthChanged(); afx_msg void OnOpenPluginList() { openendPluginListWithMouse = true; } - - -// -> CODE#0027 -// -> DESC="per-instrument volume ramping setup (refered as attack)" afx_msg void OnAttackChanged(); -// -! NEW_FEATURE#0027 - afx_msg void OnEnableCutOff(); afx_msg void OnEnableResonance(); afx_msg void OnEditSampleMap(); - afx_msg void TogglePluginEditor(); //rewbs.instroVSTi - afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys + afx_msg void TogglePluginEditor(); + afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); afx_msg void OnCbnSelchangeCombotuning(); afx_msg void OnEnChangeEditPitchtempolock(); afx_msg void OnBnClickedCheckPitchtempolock(); Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2015-05-31 17:22:30 UTC (rev 5217) @@ -10,14 +10,15 @@ #include "stdafx.h" -#include "mptrack.h" +#include "Mptrack.h" #include "mainfrm.h" #include "InputHandler.h" -#include "childfrm.h" -#include "moddoc.h" -#include "globals.h" -#include "ctrl_pat.h" -#include "view_pat.h" +#include "Childfrm.h" +#include "Moddoc.h" +#include "../soundlib/mod_specifications.h" +#include "Globals.h" +#include "Ctrl_pat.h" +#include "View_pat.h" #include "PatternEditorDialogs.h" #include "ChannelManagerDlg.h" #include "../common/StringFixer.h" Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2015-05-31 17:22:30 UTC (rev 5217) @@ -15,6 +15,7 @@ #include "View_tre.h" #include "InputHandler.h" #include "Moddoc.h" +#include "../soundlib/mod_specifications.h" #include "Globals.h" #include "Ctrl_pat.h" #include "PatternClipboard.h" Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2015-05-31 14:37:32 UTC (rev 5216) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2015-05-31 17:22:30 UTC (rev 5217) @@ -10,14 +10,15 @@ #include "stdafx.h" -#include "mptrack.h" -#include "mainfrm.h" +#include "Mptrack.h" +#include "Mainfrm.h" #include "InputHandler.h"... [truncated message content] |