From: <sag...@us...> - 2010-05-07 21:36:30
|
Revision: 587 http://modplug.svn.sourceforge.net/modplug/?rev=587&view=rev Author: saga-games Date: 2010-05-07 21:36:23 +0000 (Fri, 07 May 2010) Log Message: ----------- [Imp] Song Properties: Tooltips are shown for various controls. [Ref] Added some security checks to tooltip code in the song cleanup dialog, to prevent too long tooltips. Modified Paths: -------------- trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-05-07 18:23:18 UTC (rev 586) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-05-07 21:36:23 UTC (rev 587) @@ -325,7 +325,7 @@ { //strncpy_s(pTTTA->szText, sizeof(pTTTA->szText), strTipText, // strTipText.GetLength() + 1); - strncpy(pTTTA->szText, strTipText, strTipText.GetLength() + 1); + strncpy(pTTTA->szText, strTipText, min(strTipText.GetLength() + 1, ARRAYELEMCOUNT(pTTTA->szText) - 1)); } else { Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-05-07 18:23:18 UTC (rev 586) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-05-07 21:36:23 UTC (rev 587) @@ -105,7 +105,12 @@ ON_COMMAND(IDC_CHECK_PT1X, OnCheckPT1x) ON_CBN_SELCHANGE(IDC_COMBO1,UpdateDialog) // -! NEW_FEATURE#0023 + + ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, &CModTypeDlg::OnToolTipNotify) + ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, &CModTypeDlg::OnToolTipNotify) + //}}AFX_MSG_MAP + END_MESSAGE_MAP() @@ -116,8 +121,8 @@ //{{AFX_DATA_MAP(CModTypeDlg) DDX_Control(pDX, IDC_COMBO1, m_TypeBox); DDX_Control(pDX, IDC_COMBO2, m_ChannelsBox); - DDX_Control(pDX, IDC_COMBO_TEMPOMODE, m_TempoModeBox); - DDX_Control(pDX, IDC_COMBO_MIXLEVELS, m_PlugMixBox); + DDX_Control(pDX, IDC_COMBO_TEMPOMODE, m_TempoModeBox); + DDX_Control(pDX, IDC_COMBO_MIXLEVELS, m_PlugMixBox); DDX_Control(pDX, IDC_CHECK1, m_CheckBox1); DDX_Control(pDX, IDC_CHECK2, m_CheckBox2); DDX_Control(pDX, IDC_CHECK3, m_CheckBox3); @@ -158,18 +163,12 @@ case MOD_TYPE_XM: m_TypeBox.SetCurSel(2); break; // -> CODE#0023 // -> DESC="IT project files (.itp)" -// case MOD_TYPE_IT: m_TypeBox.SetCurSel(3); break; case MOD_TYPE_IT: m_TypeBox.SetCurSel(m_pSndFile->m_dwSongFlags & SONG_ITPROJECT ? 4 : 3); break; +// -! NEW_FEATURE#0023 case MOD_TYPE_MPT: m_TypeBox.SetCurSel(5); break; -// -! NEW_FEATURE#0023 default: m_TypeBox.SetCurSel(0); break; } -// -> CODE#0006 -// -> DESC="misc quantity changes" -// for (int i=4; i<=64; i++) -// for (int i=4; i<=MAX_BASECHANNELS; i++) -// -! BEHAVIOUR_CHANGE#0006 UpdateChannelCBox(); m_TempoModeBox.SetItemData(m_TempoModeBox.AddString("Classic"), tempo_mode_classic); @@ -192,8 +191,8 @@ { //case mixLevels_Test: m_PlugMixBox.SetCurSel(4); break; case mixLevels_original: m_PlugMixBox.SetCurSel(3); break; - case mixLevels_117RC1: m_PlugMixBox.SetCurSel(2); break; - case mixLevels_117RC2: m_PlugMixBox.SetCurSel(1); break; + case mixLevels_117RC1: m_PlugMixBox.SetCurSel(2); break; + case mixLevels_117RC2: m_PlugMixBox.SetCurSel(1); break; case mixLevels_117RC3: default: m_PlugMixBox.SetCurSel(0); break; } @@ -207,6 +206,8 @@ m_EditFlag.SetLimitText(16); UpdateDialog(); + + EnableToolTips(TRUE); return TRUE; } @@ -216,8 +217,8 @@ { const MODTYPE type = m_TypeBox.GetItemData(m_TypeBox.GetCurSel()); CHANNELINDEX currChanSel = m_ChannelsBox.GetItemData(m_ChannelsBox.GetCurSel()); - const CHANNELINDEX minChans = m_pSndFile->GetModSpecifications(type).channelsMin; - const CHANNELINDEX maxChans = m_pSndFile->GetModSpecifications(type).channelsMax; + const CHANNELINDEX minChans = CSoundFile::GetModSpecifications(type).channelsMin; + const CHANNELINDEX maxChans = CSoundFile::GetModSpecifications(type).channelsMax; if(m_ChannelsBox.GetCount() < 1 || m_ChannelsBox.GetItemData(0) != minChans @@ -408,7 +409,7 @@ } -BOOL CModTypeDlg::VerifyData() +bool CModTypeDlg::VerifyData() //---------------------------- { @@ -418,7 +419,7 @@ { ::AfxMessageBox("Error: Rows per measure must be greater than rows per beat.", MB_OK|MB_ICONEXCLAMATION); GetDlgItem(IDC_ROWSPERMEASURE)->SetFocus(); - return FALSE; + return false; } int sel = m_ChannelsBox.GetItemData(m_ChannelsBox.GetCurSel()); @@ -426,7 +427,8 @@ CHANNELINDEX maxChans = CSoundFile::GetModSpecifications(type).channelsMax; - if (sel > maxChans) { + if (sel > maxChans) + { CString error; error.Format("Error: Max number of channels for this type is %d", maxChans); ::AfxMessageBox(error, MB_OK|MB_ICONEXCLAMATION); @@ -436,18 +438,17 @@ if(maxChans < m_pSndFile->GetNumChannels()) { if(MessageBox("New modtype supports less channels than currently used, and reducing channel number is required. Continue?", "", MB_OKCANCEL) != IDOK) - return FALSE; + return false; } - return TRUE; + return true; } void CModTypeDlg::OnOK() //---------------------- { - if (!VerifyData()) { + if (!VerifyData()) return; - } int sel = m_TypeBox.GetCurSel(); if (sel >= 0) @@ -455,7 +456,8 @@ m_nType = m_TypeBox.GetItemData(sel); // -> CODE#0023 // -> DESC="IT project files (.itp)" - if(m_pSndFile->m_dwSongFlags & SONG_ITPROJECT && sel != 4){ + if(m_pSndFile->m_dwSongFlags & SONG_ITPROJECT && sel != 4) + { m_pSndFile->m_dwSongFlags &= ~SONG_ITPROJECT; m_pSndFile->m_dwSongFlags &= ~SONG_ITPEMBEDIH; } @@ -511,6 +513,69 @@ } +BOOL CModTypeDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) +//------------------------------------------------------------------------- +{ + UNREFERENCED_PARAMETER(id); + UNREFERENCED_PARAMETER(pResult); + + // need to handle both ANSI and UNICODE versions of the message + TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; + TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; + CStringA strTipText = ""; + UINT_PTR nID = pNMHDR->idFrom; + if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) || + pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND)) + { + // idFrom is actually the HWND of the tool + nID = ::GetDlgCtrlID((HWND)nID); + } + + switch(nID) + { + case IDC_CHECK1: + strTipText = "Note slides always slide the same amount, not depending on the sample frequency."; + break; + case IDC_CHECK2: + strTipText = "Old ScreamTracker 3 volume slide behaviour (not recommended)."; + break; + case IDC_CHECK3: + strTipText = "Play some effects like in early versions of Impulse Tracker (not recommended)."; + break; + case IDC_CHECK4: + strTipText = "Gxx and Exx/Fxx won't share effect memory. Gxx resets instrument envelopes."; + break; + case IDC_CHECK5: + strTipText = "The resonant filter's frequency range is incresed from about 4KHz to 10KHz"; + break; + case IDC_CHECK6: + strTipText = "The instrument settings of the external ITI files will be ignored."; + break; + case IDC_CHECK_PT1X: + strTipText = "Ignore pan fx, use on-the-fly sample swapping, enforce Amiga frequency limits."; + break; + case IDC_COMBO_MIXLEVELS: + strTipText = "Mixing method of sample and VST levels."; + break; + } + + if (pNMHDR->code == TTN_NEEDTEXTA) + { + //strncpy_s(pTTTA->szText, sizeof(pTTTA->szText), strTipText, + // strTipText.GetLength() + 1); + // 80 chars max?! + strncpy(pTTTA->szText, strTipText, min(strTipText.GetLength() + 1, ARRAYELEMCOUNT(pTTTA->szText) - 1)); + } + else + { + ::MultiByteToWideChar(CP_ACP , 0, strTipText, strTipText.GetLength() + 1, + pTTTW->szText, sizeof(pTTTW->szText)/(sizeof pTTTW->szText[0])); + } + + return TRUE; +} + + ////////////////////////////////////////////////////////////////////////////// // CShowLogDlg Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2010-05-07 18:23:18 UTC (rev 586) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2010-05-07 21:36:23 UTC (rev 587) @@ -14,7 +14,8 @@ CButton m_CheckBox1, m_CheckBox2, m_CheckBox3, m_CheckBox4, m_CheckBox5, m_CheckBoxPT1x; CEdit m_EditFlag; CSoundFile *m_pSndFile; - UINT m_nChannels, m_nType; + UINT m_nChannels; + MODTYPE m_nType; DWORD m_dwSongFlags; // -> CODE#0023 @@ -25,8 +26,8 @@ CButton m_CheckBoxITCompatiblePlay; public: - CModTypeDlg(CSoundFile *pSndFile, CWnd *parent):CDialog(IDD_MODDOC_MODTYPE, parent) { m_pSndFile = pSndFile; m_nType = m_nChannels = 0; } - BOOL VerifyData(); + CModTypeDlg(CSoundFile *pSndFile, CWnd *parent):CDialog(IDD_MODDOC_MODTYPE, parent) { m_pSndFile = pSndFile; m_nType = MOD_TYPE_NONE; m_nChannels = 0; } + bool VerifyData(); void UpdateDialog(); private: @@ -40,6 +41,9 @@ virtual void OnCancel(); //}}AFX_VIRTUAL + + BOOL OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult); + //{{AFX_MSG(CModTypeDlg) afx_msg void OnCheck1(); afx_msg void OnCheck2(); @@ -565,7 +569,7 @@ //========================================= { protected: - CComboBox m_CbnSplitInstrument,m_CbnSplitNote,m_CbnOctaveModifier,m_CbnSplitVolume; + CComboBox m_CbnSplitInstrument, m_CbnSplitNote, m_CbnOctaveModifier, m_CbnSplitVolume; CSoundFile *m_pSndFile; public: Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2010-05-07 18:23:18 UTC (rev 586) +++ trunk/OpenMPT/mptrack/mptrack.rc 2010-05-07 21:36:23 UTC (rev 587) @@ -13,7 +13,7 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// German (Germany) resources +// Deutsch (Deutschland) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) #ifdef _WIN32 @@ -207,12 +207,12 @@ END #endif // APSTUDIO_INVOKED -#endif // German (Germany) resources +#endif // Deutsch (Deutschland) resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources +// Englisch (USA) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 @@ -239,7 +239,7 @@ END IDD_OPTIONS_PLAYER DIALOGEX 0, 0, 272, 279 -STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_DISABLED | WS_CAPTION +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Player" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -278,7 +278,7 @@ EDITTEXT IDC_WFIRCUTOFF,156,216,24,14,ES_AUTOHSCROLL | ES_NUMBER LTEXT "%",IDC_STATIC,186,219,8,8 LTEXT "Sample ramping (click avoidance):",IDC_STATIC,18,238,109,8 - LTEXT "(can be overridden by instrument setting)",IDC_STATIC,18,248,128,8 + LTEXT "(can be overridden by instrument setting)",IDC_STATIC,18,248,138,8 EDITTEXT IDC_RAMPING,156,235,24,14,ES_AUTOHSCROLL | ES_NUMBER LTEXT "Samples",IDC_STATIC,182,238,29,8 PUSHBUTTON "Default Settings",IDC_BUTTON_DEFAULT_RESAMPLING,186,180,66,12 @@ -579,7 +579,7 @@ PUSHBUTTON "...",IDC_BUTTON2,502,51,13,13,NOT WS_VISIBLE,WS_EX_CLIENTEDGE RTEXT "Sample",IDC_STATIC,62,8,24,8 CTEXT "Length: 000000 (16-bit)",IDC_TEXT5,175,6,90,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - CONTROL "Toolbar2",IDC_TOOLBAR2,"ToolbarWindow32",WS_GROUP | 0x4d,268,4,186,17 + CONTROL "Toolbar2",IDC_TOOLBAR2,"ToolbarWindow32",WS_GROUP | 0x4d,268,4,252,17 GROUPBOX "",IDC_STATIC,3,22,94,78 LTEXT "Default Volume",IDC_STATIC,8,32,49,8 LTEXT "Global Volume",IDC_STATIC,8,45,46,8 @@ -693,41 +693,41 @@ END IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 262, 317 -STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Song Properties" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN DEFPUSHBUTTON "OK",IDOK,204,6,50,14 PUSHBUTTON "Cancel",IDCANCEL,204,24,50,14 - GROUPBOX "Type",IDC_FRAME_MODTYPE,6,6,192,48 COMBOBOX IDC_COMBO1,12,18,108,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO2,126,18,66,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Embed instrument parameters in ITP",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,36,126,8 - GROUPBOX "Playback",IDC_FRAME_MODFLAGS,6,60,246,54 + CONTROL "Embed instrument parameters in ITP",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,36,174,8 CONTROL "Linear Frequency Slides",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,72,91,10 + CONTROL "Old Effects (IT)",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,72,66,10 CONTROL "Fast Volume Slides (S3M)",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,84,96,10 + CONTROL "Compatible Gxx (IT)",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,84,84,10 CONTROL "Extended filter range",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,96,81,10 - CONTROL "Old Effects (IT)",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,72,66,10 - CONTROL "Compatible Gxx (IT)",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,84,84,10 - GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_FRAME_MPTEXT,6,120,246,84 + CONTROL "ProTracker 1.x Mode (MOD)",IDC_CHECK_PT1X,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,96,108,10 RTEXT "Mix Levels:",IDC_TEXT_MIXMODE,18,134,81,8 COMBOBOX IDC_COMBO_MIXLEVELS,108,132,84,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP RTEXT "Miscellaneous flags(0/1):",IDC_FLAGEDITTITLE,18,150,81,12,SS_CENTERIMAGE EDITTEXT IDC_EDIT_FLAGS,108,150,84,12,ES_AUTOHSCROLL - LTEXT "",IDC_FLAG_EXPLANATIONS,18,168,222,26 - GROUPBOX "OpenMPT Version Info",IDC_FRAME_MPTVERSION,6,263,246,48 + COMBOBOX IDC_COMBO_TEMPOMODE,36,222,108,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_ROWSPERBEAT,156,222,24,12,ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_ROWSPERMEASURE,156,240,24,12,ES_AUTOHSCROLL | ES_NUMBER EDITTEXT IDC_EDIT_CREATEDWITH,78,276,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE EDITTEXT IDC_EDIT_SAVEDWITH,78,294,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE - RTEXT "IDC_TEXT_CREATEDWITH",IDC_TEXT_CREATEDWITH,18,278,54,8 - RTEXT "IDC_TEXT_SAVEDWITH",IDC_TEXT_SAVEDWITH,18,295,54,8 + GROUPBOX "Type",IDC_FRAME_MODTYPE,6,6,192,48 + GROUPBOX "Playback",IDC_FRAME_MODFLAGS,6,60,246,54 + GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_FRAME_MPTEXT,6,120,246,84 + LTEXT "",IDC_FLAG_EXPLANATIONS,18,168,222,26 GROUPBOX "Tempo",IDC_FRAME_TEMPOMODE,6,210,246,48 LTEXT "Mode:",IDC_TEXT_TEMPOMODE,12,224,21,8 - COMBOBOX IDC_COMBO_TEMPOMODE,36,222,108,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_ROWSPERBEAT,156,222,24,12,ES_AUTOHSCROLL | ES_NUMBER LTEXT "Rows/beat",IDC_TEXT_ROWSPERBEAT,186,224,36,8 - EDITTEXT IDC_ROWSPERMEASURE,156,240,24,12,ES_AUTOHSCROLL | ES_NUMBER LTEXT "Rows/measure",IDC_TEXT_ROWSPERMEASURE,186,242,49,8 - CONTROL "ProTracker 1.x Mode (MOD)",IDC_CHECK_PT1X,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,96,108,10 + GROUPBOX "OpenMPT Version Info",IDC_FRAME_MPTVERSION,6,263,246,48 + RTEXT "IDC_TEXT_CREATEDWITH",IDC_TEXT_CREATEDWITH,18,278,54,8 + RTEXT "IDC_TEXT_SAVEDWITH",IDC_TEXT_SAVEDWITH,18,295,54,8 END IDD_SHOWLOG DIALOG 0, 0, 300, 106 @@ -2378,12 +2378,12 @@ IDS_SOUNDTOUCH_LOADFAILURE "Unable to load OpenMPT_soundtouch_i16.dll." END -#endif // English (U.S.) resources +#endif // Englisch (USA) resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// -// English (U.K.) resources +// Englisch (GB) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) #ifdef _WIN32 @@ -2752,7 +2752,7 @@ // IDR_BUILTIN_TUNINGS TUNING "res\\built-inTunings.tc" -#endif // English (U.K.) resources +#endif // Englisch (GB) resources ///////////////////////////////////////////////////////////////////////////// This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-05-08 15:35:46
|
Revision: 588 http://modplug.svn.sourceforge.net/modplug/?rev=588&view=rev Author: saga-games Date: 2010-05-08 15:35:40 +0000 (Sat, 08 May 2010) Log Message: ----------- [Fix] Instrument Editor: New instruments are now assigning samples properly again (forgot to commit ctrl_ins in rev. 586) [Imp] Further improvments to automatic instrument creation. Modified Paths: -------------- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/AbstractVstEditor.h trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2010-05-07 21:36:23 UTC (rev 587) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2010-05-08 15:35:40 UTC (rev 588) @@ -320,32 +320,23 @@ case kcVSTGUIToggleSendKeysToPlug: OnPassKeypressesToPlug(); return wParam; case kcVSTGUIBypassPlug: OnBypassPlug(); return wParam; } - if (wParam>=kcVSTGUIStartNotes && wParam<=kcVSTGUIEndNotes) + if (wParam >= kcVSTGUIStartNotes && wParam <= kcVSTGUIEndNotes) { - if (!CheckInstrument(m_nInstrument)) { - m_nInstrument = GetBestInstrumentCandidate(); - } - - if(QueryAddInstrumentIfNeeded()) + if(ValidateCurrentInstrument()) { CModDoc* pModDoc = m_pVstPlugin->GetModDoc(); CMainFrame* pMainFrm = CMainFrame::GetMainFrame(); - pModDoc->PlayNote(wParam-kcVSTGUIStartNotes+1+pMainFrm->GetBaseOctave()*12, m_nInstrument, 0, FALSE); + pModDoc->PlayNote(wParam - kcVSTGUIStartNotes + 1 + pMainFrm->GetBaseOctave() * 12, m_nInstrument, 0, FALSE); } return wParam; } - if (wParam>=kcVSTGUIStartNoteStops && wParam<=kcVSTGUIEndNoteStops) + if (wParam >= kcVSTGUIStartNoteStops && wParam <= kcVSTGUIEndNoteStops) { - if (!CheckInstrument(m_nInstrument)) + if(ValidateCurrentInstrument()) { - m_nInstrument = GetBestInstrumentCandidate(); - } - - if(QueryAddInstrumentIfNeeded()) - { CModDoc* pModDoc = m_pVstPlugin->GetModDoc(); CMainFrame* pMainFrm = CMainFrame::GetMainFrame(); - pModDoc->NoteOff(wParam-kcVSTGUIStartNoteStops+1+pMainFrm->GetBaseOctave()*12, FALSE, m_nInstrument); + pModDoc->NoteOff(wParam - kcVSTGUIStartNoteStops + 1 + pMainFrm->GetBaseOctave() * 12, FALSE, m_nInstrument); } return wParam; } @@ -354,17 +345,20 @@ } -// Weird name! :-P // When trying to play a note using this plugin, but no instrument is assigned to it, // the user is asked whether a new instrument should be added. -bool CAbstractVstEditor::QueryAddInstrumentIfNeeded() -//--------------------------------------------------- +bool CAbstractVstEditor::ValidateCurrentInstrument() +//-------------------------------------------------- { - //only send warning if plug is able to process notes. + if (!CheckInstrument(m_nInstrument)) + m_nInstrument = GetBestInstrumentCandidate(); + + //only show messagebox if plug is able to process notes. if(m_nInstrument < 0 && m_pVstPlugin->CanRecieveMidiEvents()) { CModDoc *pModDoc = m_pVstPlugin->GetModDoc(); - if(!pModDoc || !pModDoc->GetSoundFile()) + CSoundFile *pSndFile = m_pVstPlugin->GetSoundFile(); + if(!pModDoc || !pSndFile) return false; if(pModDoc->GetSoundFile()->GetModSpecifications().instrumentsMax == 0 || @@ -374,20 +368,25 @@ } else { // try to set up a new instrument + bool bFirst = (pSndFile->GetNumInstruments() == 0); INSTRUMENTINDEX nIns = pModDoc->InsertInstrument(0); if(nIns == INSTRUMENTINDEX_INVALID) return false; - MODINSTRUMENT *pIns = pModDoc->GetSoundFile()->Instruments[nIns]; + MODINSTRUMENT *pIns = pSndFile->Instruments[nIns]; m_nInstrument = nIns; - _snprintf(pIns->name, ARRAYELEMCOUNT(pIns->name) - 1, _T("%d: %s"), m_pVstPlugin->GetSlot() + 1, pModDoc->GetSoundFile()->m_MixPlugins[m_pVstPlugin->GetSlot()].Info.szName); - _snprintf(pIns->filename, ARRAYELEMCOUNT(pIns->filename) - 1, _T("FX %d"), m_pVstPlugin->GetSlot() + 1); - pIns->nMixPlug = m_pVstPlugin->GetSlot() + 1; + _snprintf(pIns->name, ARRAYELEMCOUNT(pIns->name) - 1, _T("%d: %s"), m_pVstPlugin->GetSlot() + 1, pSndFile->m_MixPlugins[m_pVstPlugin->GetSlot()].Info.szName); + strncpy(pIns->filename, pSndFile->m_MixPlugins[m_pVstPlugin->GetSlot()].Info.szLibraryName, ARRAYELEMCOUNT(pIns->filename) - 1); + pIns->nMixPlug = (PLUGINDEX)m_pVstPlugin->GetSlot() + 1; pIns->nMidiChannel = 1; - pIns->wMidiBank = (m_pVstPlugin->GetCurrentProgram() >> 7) + 1; - pIns->nMidiProgram = (m_pVstPlugin->GetCurrentProgram() & 0x7F) + 1; + pIns->wMidiBank = (WORD)((m_pVstPlugin->GetCurrentProgram() >> 7) + 1); + pIns->nMidiProgram = (BYTE)((m_pVstPlugin->GetCurrentProgram() & 0x7F) + 1); + pModDoc->UpdateAllViews(NULL, (nIns << HINT_SHIFT_INS) | HINT_INSTRUMENT | HINT_INSNAMES | HINT_ENVELOPE | (bFirst ? HINT_MODTYPE : 0)); + if(pSndFile->GetModSpecifications().supportsPlugins) + pModDoc->SetModified(); + return true; } } else @@ -558,9 +557,9 @@ pInfoMenu->InsertMenu(1, MF_BYPOSITION|MF_POPUP, (UINT)m_pOutputMenu->m_hMenu, "Ou&tputs"); } -void CAbstractVstEditor::UpdateMacroMenu() { -//------------------------------------------ - +void CAbstractVstEditor::UpdateMacroMenu() +//---------------------------------------- +{ CString label, macroName, macroText; char paramName[128]; bool greyed; @@ -697,7 +696,8 @@ //Then just take the first instrument that points to this plug.. CArray<UINT, UINT> plugInstrumentList; m_pVstPlugin->GetInputInstrumentList(plugInstrumentList); - if (plugInstrumentList.GetSize()) { + if (plugInstrumentList.GetSize()) + { return plugInstrumentList[0]; } Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.h =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.h 2010-05-07 21:36:23 UTC (rev 587) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.h 2010-05-08 15:35:40 UTC (rev 588) @@ -64,7 +64,7 @@ void UpdateOptionsMenu(); int GetBestInstrumentCandidate(); bool CheckInstrument(int instrument); - bool QueryAddInstrumentIfNeeded(); + bool ValidateCurrentInstrument(); int m_nInstrument; int m_nLearnMacro; Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-05-07 21:36:23 UTC (rev 587) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-05-08 15:35:40 UTC (rev 588) @@ -330,7 +330,7 @@ else { ::MultiByteToWideChar(CP_ACP , 0, strTipText, strTipText.GetLength() + 1, - pTTTW->szText, sizeof(pTTTW->szText)/(sizeof pTTTW->szText[0])); + pTTTW->szText, ARRAYELEMCOUNT(pTTTW->szText)); } return TRUE; Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-05-07 21:36:23 UTC (rev 587) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-05-08 15:35:40 UTC (rev 588) @@ -1546,8 +1546,8 @@ OnInstrumentDuplicate(); return; } - BOOL bFirst = (pSndFile->m_nInstruments) ? FALSE : TRUE; - LONG ins = m_pModDoc->InsertInstrument(0); + bool bFirst = (pSndFile->GetNumInstruments() == 0); + LONG ins = m_pModDoc->InsertInstrument(); if (ins != INSTRUMENTINDEX_INVALID) { SetCurrentInstrument(ins); @@ -1569,7 +1569,7 @@ if ((pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (pSndFile->m_nInstruments > 0)) { BOOL bFirst = (pSndFile->m_nInstruments) ? FALSE : TRUE; - LONG ins = m_pModDoc->InsertInstrument(0, m_nInstrument); + LONG ins = m_pModDoc->InsertInstrument(INSTRUMENTINDEX_INVALID, m_nInstrument); if (ins != INSTRUMENTINDEX_INVALID) { SetCurrentInstrument(ins); Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-05-07 21:36:23 UTC (rev 587) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-05-08 15:35:40 UTC (rev 588) @@ -546,7 +546,7 @@ strTipText = "Gxx and Exx/Fxx won't share effect memory. Gxx resets instrument envelopes."; break; case IDC_CHECK5: - strTipText = "The resonant filter's frequency range is incresed from about 4KHz to 10KHz"; + strTipText = "The resonant filter's frequency range is incresed from about 4KHz to 10KHz."; break; case IDC_CHECK6: strTipText = "The instrument settings of the external ITI files will be ignored."; @@ -569,7 +569,7 @@ else { ::MultiByteToWideChar(CP_ACP , 0, strTipText, strTipText.GetLength() + 1, - pTTTW->szText, sizeof(pTTTW->szText)/(sizeof pTTTW->szText[0])); + pTTTW->szText, ARRAYELEMCOUNT(pTTTW->szText)); } return TRUE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-05-08 16:57:54
|
Revision: 589 http://modplug.svn.sourceforge.net/modplug/?rev=589&view=rev Author: saga-games Date: 2010-05-08 16:57:45 +0000 (Sat, 08 May 2010) Log Message: ----------- [Fix] General Tab: The background colour of the tabs in the channel configuration is now also correct when using WinXP Luna or Vista/Win7 Aero. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_gen.h Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2010-05-08 15:35:40 UTC (rev 588) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2010-05-08 16:57:45 UTC (rev 589) @@ -23,6 +23,7 @@ ON_WM_HSCROLL() ON_WM_VSCROLL() ON_WM_DESTROY() + ON_WM_CTLCOLOR() // -> CODE#0015 // -> DESC="channels management dlg" @@ -1483,3 +1484,27 @@ AfxMessageBox("Not yet implemented."); } + +typedef HRESULT (__stdcall * ETDT)(HWND, DWORD); + +HBRUSH CViewGlobals::OnCtlColor(CDC *pDC, CWnd* pWnd, UINT nCtlColor) +//------------------------------------------------------------------- +{ + static bool bUxInited = false; + static ETDT m_ETDT = nullptr; + + if(!bUxInited) + { + HMODULE uxlib = LoadLibrary("uxtheme.dll"); + if(uxlib) + m_ETDT = (ETDT)GetProcAddress(uxlib, "EnableThemeDialogTexture"); + bUxInited = true; + } + switch(nCtlColor) + { + case CTLCOLOR_DLG: + if(m_ETDT) + m_ETDT(*pWnd, ETDT_ENABLETAB); + } + return CFormView::OnCtlColor(pDC, pWnd, nCtlColor); +} Modified: trunk/OpenMPT/mptrack/View_gen.h =================================================================== --- trunk/OpenMPT/mptrack/View_gen.h 2010-05-08 15:35:40 UTC (rev 588) +++ trunk/OpenMPT/mptrack/View_gen.h 2010-05-08 16:57:45 UTC (rev 589) @@ -68,7 +68,9 @@ virtual void UpdateView(DWORD dwHintMask=0, CObject *pObj=NULL); virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint); virtual LRESULT OnModViewMsg(WPARAM, LPARAM); -// -> CODE#0015 + virtual HBRUSH OnCtlColor(CDC *pDC, CWnd* pWnd, UINT nCtlColor); + + // -> CODE#0015 // -> DESC="channels management dlg" virtual void OnDraw(CDC* pDC); // -! NEW_FEATURE#0015 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-05-08 22:11:39
|
Revision: 590 http://modplug.svn.sourceforge.net/modplug/?rev=590&view=rev Author: saga-games Date: 2010-05-08 22:11:33 +0000 (Sat, 08 May 2010) Log Message: ----------- [Mod] Added some more examples to the (still unfunctional) sample generator. [Ref] Small changes to the code from the last revision. Forgot to mention that this code was actually by coda, so thanks! Modified Paths: -------------- trunk/OpenMPT/mptrack/SampleGenerator.cpp trunk/OpenMPT/mptrack/View_gen.cpp Modified: trunk/OpenMPT/mptrack/SampleGenerator.cpp =================================================================== --- trunk/OpenMPT/mptrack/SampleGenerator.cpp 2010-05-08 16:57:45 UTC (rev 589) +++ trunk/OpenMPT/mptrack/SampleGenerator.cpp 2010-05-08 22:11:33 UTC (rev 590) @@ -596,6 +596,10 @@ preset.expression = "sin(xp * _pi / 50 * 440 * len / freq)"; presets.AddPreset(preset); + preset.description = "Brown Noise (kind of)"; + preset.expression = "rnd(1) * 0.1 + smp(x - 1) * 0.9"; + presets.AddPreset(preset); + preset.description = "Noisy Saw"; preset.expression = "(x mod 800) / 800 - 0.5 + rnd (0.1)"; presets.AddPreset(preset); @@ -618,10 +622,15 @@ preset.description = "Laser"; preset.expression = "sin(xp * _pi * 100 /(xp ^ 2)) * 100 / sqrt(xp)"; + presets.AddPreset(preset); + preset.description = "Noisy Laser Hit"; + preset.expression = "(sin(sqrt(xp) * 100) + rnd(1) - 0.5) * exp(-xp / 10)"; presets.AddPreset(preset); + preset.description = "Twinkle, Twinkle..."; preset.expression = "sin(xp * _pi * 100 / xp) * 100 / sqrt(xp)"; + presets.AddPreset(preset); preset.description = "FM Tom"; preset.expression = "sin(xp * _pi * 2 + (xp / 5 - 50) ^ 2) * exp(-xp / 10)"; @@ -630,6 +639,11 @@ preset.description = "FM Warp"; preset.expression = "sin(_pi * xp / 2 * (1 + (1 + sin(_pi * xp / 4 * 50)) / 4)) * exp(-(xp / 8) * .6)"; presets.AddPreset(preset); + + preset.description = "Weird Noise"; + preset.expression = "rnd(1) * 0.1 + smp(x - rnd(xp)) * 0.9"; + presets.AddPreset(preset); + } Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2010-05-08 16:57:45 UTC (rev 589) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2010-05-08 22:11:33 UTC (rev 590) @@ -1485,26 +1485,28 @@ } +// This is used for retrieving the correct background colour for the +// frames on the general tab when using WinXP Luna or Vista/Win7 Aero. typedef HRESULT (__stdcall * ETDT)(HWND, DWORD); HBRUSH CViewGlobals::OnCtlColor(CDC *pDC, CWnd* pWnd, UINT nCtlColor) //------------------------------------------------------------------- { static bool bUxInited = false; - static ETDT m_ETDT = nullptr; + static ETDT hETDT = NULL; if(!bUxInited) { HMODULE uxlib = LoadLibrary("uxtheme.dll"); if(uxlib) - m_ETDT = (ETDT)GetProcAddress(uxlib, "EnableThemeDialogTexture"); + hETDT = (ETDT)GetProcAddress(uxlib, "EnableThemeDialogTexture"); bUxInited = true; } switch(nCtlColor) { case CTLCOLOR_DLG: - if(m_ETDT) - m_ETDT(*pWnd, ETDT_ENABLETAB); + if(hETDT) + hETDT(*pWnd, ETDT_ENABLETAB); } return CFormView::OnCtlColor(pDC, pWnd, nCtlColor); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-06-25 21:00:43
|
Revision: 632 http://modplug.svn.sourceforge.net/modplug/?rev=632&view=rev Author: saga-games Date: 2010-06-25 21:00:37 +0000 (Fri, 25 Jun 2010) Log Message: ----------- [Fix] Pattern Editor: Transposing notes up/down allowed notes which were not supported by the current module format (f.e. notes below C-1 in XMs) [Imp] Instrument Editor: If an instrument is not initialized yet, this is done automatically now, so that changes done to the instrument are not lost although it looks like they are actually applied. [Fix] Added additional nullptr check in CModDoc::InitializeInstrument (nothing bad happened, but let's better sanitize this sooner than later) Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_pat.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-06-24 20:58:59 UTC (rev 631) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-06-25 21:00:37 UTC (rev 632) @@ -100,6 +100,15 @@ { m_pModDoc = pModDoc; if (nIns < MAX_INSTRUMENTS) m_nInstrument = nIns; + + // create missing instrument if needed + CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); + if(m_nInstrument > 0 && pSndFile && m_nInstrument <= pSndFile->GetNumInstruments() && pSndFile->Instruments[m_nInstrument] == nullptr) + { + pSndFile->Instruments[m_nInstrument] = new MODINSTRUMENT; + m_pModDoc->InitializeInstrument(pSndFile->Instruments[m_nInstrument]); + } + InvalidateRect(NULL, FALSE); } return TRUE; @@ -352,7 +361,7 @@ if (pIns) { bool bModified = false; - UINT n = pIns->NoteMap[m_nNote]; + BYTE n = pIns->NoteMap[m_nNote]; for (NOTEINDEXTYPE i = 0; i < NOTE_MAX; i++) if (pIns->NoteMap[i] != n) { pIns->NoteMap[i] = n; @@ -378,7 +387,7 @@ if (pIns) { bool bModified = false; - UINT n = pIns->Keyboard[m_nNote]; + WORD n = pIns->Keyboard[m_nNote]; for (NOTEINDEXTYPE i = 0; i < NOTE_MAX; i++) if (pIns->Keyboard[i] != n) { pIns->Keyboard[i] = n; Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2010-06-24 20:58:59 UTC (rev 631) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2010-06-25 21:00:37 UTC (rev 632) @@ -843,11 +843,13 @@ void CModDoc::InitializeInstrument(MODINSTRUMENT *pIns, UINT nsample) //------------------------------------------------------------------- { + if(pIns == nullptr) + return; memset(pIns, 0, sizeof(MODINSTRUMENT)); pIns->nFadeOut = 256; pIns->nGlobalVol = 64; pIns->nPan = 128; - pIns->nPPC = 5*12; + pIns->nPPC = NOTE_MIDDLEC - 1; m_SndFile.SetDefaultInstrumentValues(pIns); for (UINT n=0; n<128; n++) { Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2010-06-24 20:58:59 UTC (rev 631) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2010-06-25 21:00:37 UTC (rev 632) @@ -2357,10 +2357,12 @@ CModDoc *pModDoc = GetDocument(); if (pModDoc) { - UINT row0 = m_dwBeginSel >> 16, row1 = m_dwEndSel >> 16; - UINT col0 = ((m_dwBeginSel & 0xFFFF)+7) >> 3, col1 = (m_dwEndSel & 0xFFFF) >> 3; + const UINT row0 = m_dwBeginSel >> 16, row1 = m_dwEndSel >> 16; + const UINT col0 = ((m_dwBeginSel & 0xFFFF)+7) >> 3, col1 = (m_dwEndSel & 0xFFFF) >> 3; CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODCOMMAND *pcmd = pSndFile->Patterns[m_nPattern]; + const MODCOMMAND::NOTE noteMin = pSndFile->GetModSpecifications().noteMin; + const MODCOMMAND::NOTE noteMax = pSndFile->GetModSpecifications().noteMax; if ((!pcmd) || (col0 > col1) || (col1 >= pSndFile->m_nChannels) || (row0 > row1) || (row1 >= pSndFile->Patterns[m_nPattern].GetNumRows())) return FALSE; @@ -2371,11 +2373,11 @@ for (UINT col=col0; col<=col1; col++) { int note = m[col].note; - if ((note) && (note <= NOTE_MAX)) + if ((note >= NOTE_MIN) && (note <= NOTE_MAX)) { note += transp; - if (note < 1) note = 1; - if (note > NOTE_MAX) note = NOTE_MAX; + if (note < noteMin) note = noteMin; + if (note > noteMax) note = noteMax; m[col].note = (BYTE)note; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-06-26 14:04:53
|
Revision: 633 http://modplug.svn.sourceforge.net/modplug/?rev=633&view=rev Author: saga-games Date: 2010-06-26 14:04:46 +0000 (Sat, 26 Jun 2010) Log Message: ----------- [Imp] General Tab: To prevent OpenMPT from hanging while switching between plugins (or switching to the general tab), the preset box is only filled when it gets the focus. This makes working with Synth1 a lot easier, since it has an insane amount of presets... :) [Mod] General Tab: Changed tab order of the lower panel (now it's more logical to me) Modified Paths: -------------- trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_gen.h trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2010-06-25 21:00:37 UTC (rev 632) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2010-06-26 14:04:46 UTC (rev 633) @@ -84,6 +84,7 @@ // -> CODE#0002 // -> DESC="VST plugins presets" ON_CBN_SELCHANGE(IDC_COMBO8, OnProgramChanged) + ON_CBN_SETFOCUS(IDC_COMBO8, OnFillProgramCombo) // -! NEW_FEATURE#0002 // -> CODE#0028 @@ -482,30 +483,18 @@ // -> CODE#0002 // -> DESC="VST plugins presets" - CHAR s2[128]; - //UINT k = 0, nProg = min(pVstPlugin->GetNumPrograms(), 256); //Limit number of progs to 256 because of insane plugs like synth1 - UINT k = 0, nProg = pVstPlugin->GetNumPrograms(); + // For now, only display the "current" preset. + // This prevents the program from hanging when switching between plugin slots or + // switching to the general tab and the first plugin in the list has a lot of presets. + // Some plugins like Synth1 have so many presets that this *does* indeed make a difference, + // even on fairly modern CPUs. The rest of the presets are just added when the combo box + // gets the focus, i.e. just when they're needed. m_CbnPreset.SetRedraw(FALSE); m_CbnPreset.ResetContent(); - wsprintf(s2, "current"); - m_CbnPreset.SetItemData(m_CbnPreset.AddString(s2), 0); - for (i=0; i<nProg; i++) - { - k = 0; - pVstPlugin->GetProgramNameIndexed(i, 0, sname); - - if(sname[0] < 32) - wsprintf(s2, "%02X - Program %d",i,i); - else{ - while(k < sizeof(sname)-1 && sname[k] != 0 && sname[k] < 'a' && sname[k] < 'z' && sname[k] < 'A' && sname[k] < 'Z') k++; - wsprintf(s2, "%02X - %s",i,&sname[k]); - } - - m_CbnPreset.SetItemData(m_CbnPreset.AddString(s2), i+1); - } - m_nCurrentPreset = 0; + m_CbnPreset.SetItemData(m_CbnPreset.AddString(_T("current")), 0); m_CbnPreset.SetRedraw(TRUE); m_CbnPreset.SetCurSel(0); + m_sbValue.EnableWindow(TRUE); m_sbDryRatio.EnableWindow(TRUE); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT14), TRUE); @@ -519,7 +508,7 @@ m_nCurrentParam = 0; // -> CODE#0002 // -> DESC="VST plugins presets" - CHAR s2[32]; + CHAR s2[16]; m_CbnPreset.SetRedraw(FALSE); m_CbnPreset.ResetContent(); wsprintf(s2, "none"); @@ -1485,6 +1474,7 @@ } + void CViewGlobals::OnClonePlug() //------------------------------ { @@ -1492,6 +1482,51 @@ } +// The preset box is only filled when it gets the focus (done here). +void CViewGlobals::OnFillProgramCombo() +//------------------------------------- +{ + // no need to fill it again. + if(m_CbnPreset.GetCount() > 1) + return; + + if(GetDocument() == nullptr) return; + CSoundFile *pSndFile = GetDocument()->GetSoundFile(); + if(pSndFile == nullptr) return; + if (m_nCurrentPlugin >= MAX_MIXPLUGINS) m_nCurrentPlugin = 0; + PSNDMIXPLUGIN pPlugin = &(pSndFile->m_MixPlugins[m_nCurrentPlugin]); + CVstPlugin *pVstPlugin = (pPlugin->pMixPlugin) ? (CVstPlugin *)pPlugin->pMixPlugin : nullptr; + if(pVstPlugin == nullptr) return; + + CHAR sname[64]; + CHAR s2[128]; + UINT nProg = pVstPlugin->GetNumPrograms(); + m_CbnPreset.SetRedraw(FALSE); + m_CbnPreset.ResetContent(); + wsprintf(s2, _T("current")); + m_CbnPreset.SetItemData(m_CbnPreset.AddString(s2), 0); + for (UINT i = 0; i < nProg; i++) + { + pVstPlugin->GetProgramNameIndexed(i, 0, sname); + + if(sname[0] < ' ') + { + wsprintf(s2, "%02X - Program %d", i, i); + } else + { + size_t k = 0; + while(k < ARRAYELEMCOUNT(sname) - 1 && sname[k] <= ' ') k++; + wsprintf(s2, "%02X - %s",i,&sname[k]); + } + + m_CbnPreset.SetItemData(m_CbnPreset.AddString(s2), i+1); + } + m_nCurrentPreset = 0; + m_CbnPreset.SetRedraw(TRUE); + m_CbnPreset.SetCurSel(0); +} + + // This is used for retrieving the correct background colour for the // frames on the general tab when using WinXP Luna or Vista/Win7 Aero. typedef HRESULT (__stdcall * ETDT)(HWND, DWORD); Modified: trunk/OpenMPT/mptrack/View_gen.h =================================================================== --- trunk/OpenMPT/mptrack/View_gen.h 2010-06-25 21:00:37 UTC (rev 632) +++ trunk/OpenMPT/mptrack/View_gen.h 2010-06-26 14:04:46 UTC (rev 633) @@ -115,6 +115,7 @@ afx_msg void OnParamChanged(); // -> CODE#0002 // -> DESC="VST plugins presets" + afx_msg void OnFillProgramCombo(); afx_msg void OnProgramChanged(); afx_msg void OnLoadParam(); afx_msg void OnSaveParam(); Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2010-06-25 21:00:37 UTC (rev 632) +++ trunk/OpenMPT/mptrack/mptrack.rc 2010-06-26 14:04:46 UTC (rev 633) @@ -755,102 +755,102 @@ END IDD_VIEW_GLOBALS DIALOGEX 0, 0, 471, 337 -STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - GROUPBOX "Channel 1",IDC_TEXT1,5,18,99,157 + CONTROL "",IDC_TABCTRL1,"SysTabControl32",0x0,0,0,412,14 EDITTEXT IDC_EDIT9,10,30,89,12,ES_AUTOHSCROLL - LTEXT "Initial Volume:",IDC_STATIC,10,48,45,8 - LTEXT "Initial Pan:",IDC_STATIC,10,89,34,8 - CONTROL "Slider2",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,10,59,92,22 - CONTROL "Slider2",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,10,100,92,22 + EDITTEXT IDC_EDIT10,113,30,89,12,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT11,216,30,89,12,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT12,319,30,89,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT1,63,46,36,12,ES_NUMBER CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,95,45,11,14 + EDITTEXT IDC_EDIT3,166,46,36,12,ES_NUMBER + CONTROL "Spin1",IDC_SPIN3,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,198,45,11,14 + EDITTEXT IDC_EDIT5,269,46,36,12,ES_NUMBER + CONTROL "Spin1",IDC_SPIN5,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,301,45,11,14 + EDITTEXT IDC_EDIT7,372,46,36,12,ES_NUMBER + CONTROL "Spin1",IDC_SPIN7,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,396,45,11,14 + CONTROL "Slider2",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,10,59,92,22 + CONTROL "Slider2",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,113,59,92,22 + CONTROL "Slider2",IDC_SLIDER5,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,216,59,92,22 + CONTROL "Slider2",IDC_SLIDER7,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,319,59,92,22 EDITTEXT IDC_EDIT2,63,88,36,12,ES_NUMBER CONTROL "Spin1",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,95,86,11,14 + EDITTEXT IDC_EDIT4,166,88,36,12,ES_NUMBER + CONTROL "Spin1",IDC_SPIN4,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,198,86,11,14 + EDITTEXT IDC_EDIT6,269,88,36,12,ES_NUMBER + CONTROL "Spin1",IDC_SPIN6,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,301,86,11,14 + EDITTEXT IDC_EDIT8,372,88,36,12,ES_NUMBER + CONTROL "Spin1",IDC_SPIN8,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,401,86,11,14 + CONTROL "Slider2",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,10,100,92,22 + CONTROL "Slider2",IDC_SLIDER4,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,113,100,92,22 + CONTROL "Slider2",IDC_SLIDER6,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,216,100,92,22 + CONTROL "Slider2",IDC_SLIDER8,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,319,100,92,22 CONTROL "Mute",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,13,129,42,12 CONTROL "Surround",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,57,129,42,12 - COMBOBOX IDC_COMBO1,10,155,89,99,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Effect:",IDC_STATIC,10,146,29,8 - GROUPBOX "Channel 2",IDC_TEXT2,108,18,99,157 - EDITTEXT IDC_EDIT10,113,30,89,12,ES_AUTOHSCROLL - LTEXT "Initial Volume:",IDC_STATIC,113,48,45,8 - LTEXT "Initial Pan:",IDC_STATIC,113,89,34,8 - CONTROL "Slider2",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,113,59,92,22 - CONTROL "Slider2",IDC_SLIDER4,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,113,100,92,22 - EDITTEXT IDC_EDIT3,166,46,36,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN3,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,198,45,11,14 - EDITTEXT IDC_EDIT4,166,88,36,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN4,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,198,86,11,14 CONTROL "Mute",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,116,129,42,12 CONTROL "Surround",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,159,129,42,12 - COMBOBOX IDC_COMBO2,113,155,89,99,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Effect:",IDC_STATIC,113,146,29,8 - GROUPBOX "Channel 3",IDC_TEXT3,211,18,99,157 - EDITTEXT IDC_EDIT11,216,30,89,12,ES_AUTOHSCROLL - LTEXT "Initial Volume:",IDC_STATIC,216,48,45,8 - LTEXT "Initial Pan:",IDC_STATIC,216,89,34,8 - CONTROL "Slider2",IDC_SLIDER5,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,216,59,92,22 - CONTROL "Slider2",IDC_SLIDER6,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,216,100,92,22 - EDITTEXT IDC_EDIT5,269,46,36,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN5,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,301,45,11,14 - EDITTEXT IDC_EDIT6,269,88,36,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN6,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,301,86,11,14 CONTROL "Mute",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,219,129,42,12 CONTROL "Surround",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,262,129,42,12 - COMBOBOX IDC_COMBO3,216,155,89,99,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Effect:",IDC_STATIC,216,146,29,8 - EDITTEXT IDC_EDIT12,319,30,89,12,ES_AUTOHSCROLL - LTEXT "Initial Volume:",IDC_STATIC,319,48,45,8 - LTEXT "Initial Pan:",IDC_STATIC,319,89,34,8 - CONTROL "Slider2",IDC_SLIDER7,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,319,59,92,22 - CONTROL "Slider2",IDC_SLIDER8,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,319,100,92,22 - EDITTEXT IDC_EDIT7,372,46,36,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN7,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,396,45,11,14 - EDITTEXT IDC_EDIT8,372,88,36,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN8,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,401,86,11,14 CONTROL "Mute",IDC_CHECK7,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,322,129,42,12 CONTROL "Surround",IDC_CHECK8,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,365,129,42,12 + COMBOBOX IDC_COMBO1,10,155,89,99,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO2,113,155,89,99,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO3,216,155,89,99,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO4,319,155,89,99,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Effect:",IDC_STATIC,319,146,29,8 - GROUPBOX "Plugins",IDC_STATIC,5,177,408,131 COMBOBOX IDC_COMBO5,53,191,135,148,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CTEXT "Display name",IDC_STATIC,263,191,48,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - EDITTEXT IDC_EDIT13,310,191,96,13,ES_CENTER | ES_AUTOHSCROLL PUSHBUTTON "Select...",IDC_BUTTON1,193,191,34,13,0,WS_EX_STATICEDGE PUSHBUTTON "Edit...",IDC_BUTTON2,231,191,27,13,0,WS_EX_STATICEDGE - CTEXT "Parameter",IDC_STATIC,16,266,43,13,SS_CENTERIMAGE,WS_EX_STATICEDGE + PUSHBUTTON "Insert...",IDC_INSERTFXSLOT,154,207,34,13,0,WS_EX_STATICEDGE + PUSHBUTTON "Move...",IDC_MOVEFXSLOT,53,207,34,13,0,WS_EX_STATICEDGE + PUSHBUTTON "Clone...",IDC_CLONEPLUG,103,207,34,13,NOT WS_VISIBLE,WS_EX_STATICEDGE + PUSHBUTTON "<<",IDC_BUTTON5,11,191,18,13,NOT WS_TABSTOP,WS_EX_STATICEDGE + PUSHBUTTON ">>",IDC_BUTTON4,32,191,18,13,NOT WS_TABSTOP,WS_EX_STATICEDGE + EDITTEXT IDC_EDIT13,310,191,96,13,ES_CENTER | ES_AUTOHSCROLL + COMBOBOX IDC_COMBO8,16,239,102,68,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Load",IDC_BUTTON6,122,239,27,13,0,WS_EX_STATICEDGE + PUSHBUTTON "Save",IDC_BUTTON8,154,239,27,13,0,WS_EX_STATICEDGE COMBOBOX IDC_COMBO6,61,266,122,162,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "ValSld",IDC_SLIDER9,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,16,283,102,14,WS_EX_STATICEDGE EDITTEXT IDC_EDIT14,121,283,39,14,ES_AUTOHSCROLL PUSHBUTTON "Set",IDC_BUTTON3,163,283,20,14,0,WS_EX_STATICEDGE - CTEXT "Output to",IDC_STATIC,245,261,37,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - COMBOBOX IDC_COMBO7,285,261,117,68,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_TEXT6,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,311,208,96,13,WS_EX_STATICEDGE - PUSHBUTTON ">>",IDC_BUTTON4,32,191,18,13,NOT WS_TABSTOP,WS_EX_STATICEDGE - PUSHBUTTON "<<",IDC_BUTTON5,11,191,18,13,NOT WS_TABSTOP,WS_EX_STATICEDGE CONTROL "Master",IDC_CHECK9,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,199,242,46,10 CONTROL "Bypass",IDC_CHECK10,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,199,256,40,10 + CONTROL "Expand",IDC_CHECK12,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,199,271,37,10 CONTROL "Dry mix",IDC_CHECK11,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,199,286,37,10 - COMBOBOX IDC_COMBO8,16,239,102,68,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO9,285,241,62,99,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "",IDC_SPIN10,"msctls_updown32",UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,392,242,9,11 + COMBOBOX IDC_COMBO7,285,261,117,68,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "",IDC_SLIDER10,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,314,282,88,14,WS_EX_STATICEDGE - PUSHBUTTON "Load",IDC_BUTTON6,122,239,27,13,0,WS_EX_STATICEDGE - PUSHBUTTON "Save",IDC_BUTTON8,154,239,27,13,0,WS_EX_STATICEDGE + GROUPBOX "Plugins",IDC_STATIC,5,177,408,131 + GROUPBOX "Channel 1",IDC_TEXT1,5,18,99,157 + GROUPBOX "Channel 2",IDC_TEXT2,108,18,99,157 + GROUPBOX "Channel 3",IDC_TEXT3,211,18,99,157 + GROUPBOX "Channel 4",IDC_TEXT4,314,18,99,157 + LTEXT "Initial Volume:",IDC_STATIC,10,48,45,8 + LTEXT "Initial Volume:",IDC_STATIC,113,48,45,8 + LTEXT "Initial Volume:",IDC_STATIC,216,48,45,8 + LTEXT "Initial Volume:",IDC_STATIC,319,48,45,8 + LTEXT "Initial Pan:",IDC_STATIC,10,89,34,8 + LTEXT "Initial Pan:",IDC_STATIC,113,89,34,8 + LTEXT "Initial Pan:",IDC_STATIC,216,89,34,8 + LTEXT "Initial Pan:",IDC_STATIC,319,89,34,8 + LTEXT "Effect:",IDC_STATIC,10,146,29,8 + LTEXT "Effect:",IDC_STATIC,113,146,29,8 + LTEXT "Effect:",IDC_STATIC,216,146,29,8 + LTEXT "Effect:",IDC_STATIC,319,146,29,8 + CTEXT "Display name",IDC_STATIC,263,191,48,13,SS_CENTERIMAGE,WS_EX_STATICEDGE + CTEXT "Parameter",IDC_STATIC,16,266,43,13,SS_CENTERIMAGE,WS_EX_STATICEDGE + CTEXT "Output to",IDC_STATIC,245,261,37,13,SS_CENTERIMAGE,WS_EX_STATICEDGE + CONTROL "",IDC_TEXT6,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,311,208,96,13,WS_EX_STATICEDGE CTEXT "Wet Dry Ratio",IDC_STATIC8,245,282,65,14,SS_CENTERIMAGE,WS_EX_STATICEDGE - CONTROL "Expand",IDC_CHECK12,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,199,271,37,10 - COMBOBOX IDC_COMBO9,285,241,62,99,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CTEXT "Mix mode",IDC_STATIC,245,241,37,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - CONTROL "",IDC_SPIN10,"msctls_updown32",UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,392,242,9,11 LTEXT "Gain: x 1.0",IDC_STATIC2,353,241,34,14,SS_CENTERIMAGE GROUPBOX "Mix settings",IDC_STATIC,193,226,214,78 GROUPBOX "Factory preset",IDC_STATIC,11,226,177,34 GROUPBOX "",IDC_STATIC,11,255,177,49 CTEXT "I/O Type:",IDC_STATIC,263,208,47,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - PUSHBUTTON "Move...",IDC_MOVEFXSLOT,53,207,34,13,0,WS_EX_STATICEDGE - PUSHBUTTON "Clone...",IDC_CLONEPLUG,103,207,34,13,NOT WS_VISIBLE,WS_EX_STATICEDGE - PUSHBUTTON "Insert...",IDC_INSERTFXSLOT,154,207,34,13,0,WS_EX_STATICEDGE - GROUPBOX "Channel 4",IDC_TEXT4,314,18,99,157 - CONTROL "",IDC_TABCTRL1,"SysTabControl32",0x0,0,0,412,14 END IDD_EDIT_FIND DIALOGEX 0, 0, 182, 145 @@ -1071,7 +1071,7 @@ END IDD_OPTIONS_SOUNDCARD DIALOGEX 0, 0, 272, 276 -STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_DISABLED | WS_CAPTION +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Sound Card" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-07-16 21:43:21
|
Revision: 649 http://modplug.svn.sourceforge.net/modplug/?rev=649&view=rev Author: saga-games Date: 2010-07-16 21:43:14 +0000 (Fri, 16 Jul 2010) Log Message: ----------- [Ref] Some refactoring and additional documentation. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_com.cpp trunk/OpenMPT/mptrack/MPTHacks.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h Modified: trunk/OpenMPT/mptrack/Ctrl_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_com.cpp 2010-07-16 19:20:22 UTC (rev 648) +++ trunk/OpenMPT/mptrack/Ctrl_com.cpp 2010-07-16 21:43:14 UTC (rev 649) @@ -152,7 +152,7 @@ CHAR s[256], *oldcomments = NULL; if ((m_nLockCount) || (!m_pSndFile) - || (m_pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_S3M))) return; + || !m_pSndFile->GetModSpecifications().hasComments) return; if ((!m_bInitialized) || (!m_EditComments.m_hWnd) || (!m_EditComments.GetModify())) return; if (m_pSndFile->m_lpszSongComments) { @@ -164,7 +164,7 @@ UINT n = m_EditComments.GetLineCount(); - LPSTR p = new char[n*LINE_LENGTH+1]; + LPSTR p = new char[n * LINE_LENGTH + 1]; p[0] = 0; if (!p) return; for (UINT i=0; i<n; i++) @@ -189,9 +189,9 @@ delete[] p; if (oldcomments) { - BOOL bSame = FALSE; + bool bSame = false; if ((m_pSndFile->m_lpszSongComments) - && (!strcmp(m_pSndFile->m_lpszSongComments, oldcomments))) bSame = TRUE; + && (!strcmp(m_pSndFile->m_lpszSongComments, oldcomments))) bSame = true; delete[] oldcomments; if (bSame) return; } else Modified: trunk/OpenMPT/mptrack/MPTHacks.cpp =================================================================== --- trunk/OpenMPT/mptrack/MPTHacks.cpp 2010-07-16 19:20:22 UTC (rev 648) +++ trunk/OpenMPT/mptrack/MPTHacks.cpp 2010-07-16 21:43:14 UTC (rev 649) @@ -90,7 +90,7 @@ { const CModSpecifications *originalSpecs = &m_SndFile.GetModSpecifications(); // retrieve original (not hacked) specs. - switch(m_SndFile.GetType()) + switch(m_SndFile.GetBestSaveFormat()) { case MOD_TYPE_MOD: originalSpecs = &ModSpecs::mod; Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2010-07-16 19:20:22 UTC (rev 648) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2010-07-16 21:43:14 UTC (rev 649) @@ -874,6 +874,7 @@ DeleteGDIObject(penEnvelope); DeleteGDIObject(penEnvelopeHighlight); DeleteGDIObject(m_hFixedFont); + DeleteGDIObject(m_hLargeFixedFont); DeleteGDIObject(penScratch); DeleteGDIObject(penGray00); DeleteGDIObject(penGray33); @@ -3082,8 +3083,6 @@ // retrieve / set default directory from given string and store it our setup variables -// TODO: Let some magic happen to convert between absolute and relative paths. m_csExecutableDirectoryPath might be helpful - void CMainFrame::SetDirectory(const LPCTSTR szFilenameFrom, Directory dir, TCHAR (&directories)[NUM_DIRS][_MAX_PATH], bool bStripFilename) //---------------------------------------------------------------------------------------------------------------------------------------- { Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2010-07-16 19:20:22 UTC (rev 648) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2010-07-16 21:43:14 UTC (rev 649) @@ -197,15 +197,15 @@ // Midi Setup -#define MIDISETUP_RECORDVELOCITY 0x01 -#define MIDISETUP_TRANSPOSEKEYBOARD 0x02 -#define MIDISETUP_MIDITOPLUG 0x04 -#define MIDISETUP_MIDIVOL_TO_NOTEVOL 0x08 -#define MIDISETUP_RECORDNOTEOFF 0x10 -#define MIDISETUP_RESPONDTOPLAYCONTROLMSGS 0x20 -#define MIDISETUP_AMPLIFYVELOCITY 0x40 -#define MIDISETUP_MIDIMACROCONTROL 0x80 -#define MIDISETUP_PLAYPATTERNONMIDIIN 0x100 +#define MIDISETUP_RECORDVELOCITY 0x01 // Record MIDI velocity +#define MIDISETUP_TRANSPOSEKEYBOARD 0x02 // Apply transpose value to MIDI Notes +#define MIDISETUP_MIDITOPLUG 0x04 // Pass MIDI messages to plugins +#define MIDISETUP_MIDIVOL_TO_NOTEVOL 0x08 // Combine MIDI volume to note velocity +#define MIDISETUP_RECORDNOTEOFF 0x10 // Record MIDI Note Off to pattern +#define MIDISETUP_RESPONDTOPLAYCONTROLMSGS 0x20 // Respond to Restart/Continue/Stop MIDI commands +#define MIDISETUP_AMPLIFYVELOCITY 0x40 // Amplify velocity of recorded notes +#define MIDISETUP_MIDIMACROCONTROL 0x80 // Record MIDI controller changes a MIDI macro changes in pattern +#define MIDISETUP_PLAYPATTERNONMIDIIN 0x100 // Play pattern if MIDI Note is received and playback is paused This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-07-18 22:01:00
|
Revision: 655 http://modplug.svn.sourceforge.net/modplug/?rev=655&view=rev Author: saga-games Date: 2010-07-18 22:00:53 +0000 (Sun, 18 Jul 2010) Log Message: ----------- [Mod] Updated internet links. Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mptrack.cpp Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2010-07-17 22:19:07 UTC (rev 654) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2010-07-18 22:00:53 UTC (rev 655) @@ -2749,7 +2749,7 @@ void CMainFrame::OnReportBug() //---------------------------- { - CTrackApp::OpenURL("http://www.lpchip.com/modplug/"); + CTrackApp::OpenURL("http://openmpt.com/bugreport/"); return; } //end rewbs.reportBug Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2010-07-17 22:19:07 UTC (rev 654) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2010-07-18 22:00:53 UTC (rev 655) @@ -1825,7 +1825,7 @@ m_heContact.SetWindowText( "Contact / Discussion:\r\n\ -http://modplug.sourceforge.net/forum\r\n\ +http://openmpt.com/forum/\r\n\ \r\nUpdates:\r\n\ http://sourceforge.net/projects/modplug/"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-07-23 22:44:44
|
Revision: 658 http://modplug.svn.sourceforge.net/modplug/?rev=658&view=rev Author: saga-games Date: 2010-07-23 22:44:37 +0000 (Fri, 23 Jul 2010) Log Message: ----------- [Fix] Treeview: Deleting a sample from the treeview and then applying undo for this sample in the sample editor crashed OpenMPT. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_tre.cpp Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2010-07-18 23:05:20 UTC (rev 657) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2010-07-23 22:44:37 UTC (rev 658) @@ -1683,8 +1683,8 @@ if ((m_dwBeginSel >= m_dwEndSel) || (m_dwEndSel - m_dwBeginSel + 4 >= len)) { - if (MessageBox("Remove this sample ?", "Remove Sample", MB_YESNOCANCEL | MB_ICONQUESTION) != IDYES) return; - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_delete, 0, pSmp->nLength); + if (MessageBox("Remove this sample?", "Remove Sample", MB_YESNOCANCEL | MB_ICONQUESTION) != IDYES) return; + pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); BEGIN_CRITICAL(); pSndFile->DestroySample(m_nSample); END_CRITICAL(); @@ -2081,12 +2081,12 @@ void CViewSample::OnChar(UINT /*nChar*/, UINT, UINT /*nFlags*/) -//----------------------------------------------------- +//------------------------------------------------------------- { } void CViewSample::PlayNote(UINT note, const uint32 nStartPos) -//------------------------------------------------------------ +//----------------------------------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); @@ -2567,7 +2567,7 @@ } LRESULT CViewSample::OnCustomKeyMsg(WPARAM wParam, LPARAM /*lParam*/) -//--------------------------------------------------------------- +//------------------------------------------------------------------- { if (wParam == kcNull) return NULL; @@ -2608,12 +2608,12 @@ case kcNoteCut: PlayNote(NOTE_NOTECUT); return wParam; } - if (wParam>=kcSampStartNotes && wParam<=kcSampEndNotes) + if (wParam >= kcSampStartNotes && wParam <= kcSampEndNotes) { - PlayNote(wParam-kcSampStartNotes+1+pMainFrm->GetBaseOctave()*12); + PlayNote(wParam - kcSampStartNotes + 1 + pMainFrm->GetBaseOctave() * 12); return wParam; } - if (wParam>=kcSampStartNoteStops && wParam<=kcSampEndNoteStops) + if (wParam >= kcSampStartNoteStops && wParam <= kcSampEndNoteStops) { m_dwStatus &= ~SMPSTATUS_KEYDOWN; return wParam; Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2010-07-18 23:05:20 UTC (rev 657) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2010-07-23 22:44:37 UTC (rev 658) @@ -1403,14 +1403,15 @@ case MODITEM_SEQUENCE: if (pModDoc && pSndFile) { - wsprintf(s, _T("Delete sequence %d?"), modItemID & 0xFFFF); + wsprintf(s, _T("Remove sequence %d?"), modItemID); if(MessageBox(s, _T("Confirmation"), MB_YESNO | MB_DEFBUTTON2) == IDNO) break; - pSndFile->Order.RemoveSequence((SEQUENCEINDEX)(modItemID & 0xFFFF)); + pSndFile->Order.RemoveSequence((SEQUENCEINDEX)(modItemID)); pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, NULL); } break; case MODITEM_ORDER: + // might be slightly annoying to ask for confirmation here, and it's rather easy to restore the orderlist anyway. if ((pModDoc) && (pModDoc->RemoveOrder((SEQUENCEINDEX)(modItemID >> 16), (ORDERINDEX)(modItemID & 0xFFFF)))) { pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, NULL); @@ -1418,27 +1419,28 @@ break; case MODITEM_PATTERN: - wsprintf(s, _T("Delete pattern %d?"), modItemID & 0xFFFF); - if(MessageBox(s, _T("Confirmation"), MB_YESNO | MB_DEFBUTTON2) == IDNO) break; - if ((pModDoc) && (pModDoc->RemovePattern((PATTERNINDEX)modItemID))) + wsprintf(s, _T("Remove pattern %d?"), modItemID); + if (pModDoc == nullptr || MessageBox(s, _T("Confirmation"), MB_YESNO | MB_DEFBUTTON2) == IDNO) break; + if (pModDoc->RemovePattern((PATTERNINDEX)modItemID)) { pModDoc->UpdateAllViews(NULL, (UINT(modItemID) << HINT_SHIFT_PAT) | HINT_PATTERNDATA|HINT_PATNAMES); } break; case MODITEM_SAMPLE: - wsprintf(s, _T("Delete sample %d?"), modItemID & 0xFFFF); - if(MessageBox(s, _T("Confirmation"), MB_YESNO | MB_DEFBUTTON2) == IDNO) break; - if ((pModDoc) && (pModDoc->RemoveSample((SAMPLEINDEX)modItemID))) + wsprintf(s, _T("Remove sample %d?"), modItemID); + if (pModDoc == nullptr || MessageBox(s, _T("Confirmation"), MB_YESNO | MB_DEFBUTTON2) == IDNO) break; + pModDoc->GetSampleUndo()->PrepareUndo((SAMPLEINDEX)modItemID, sundo_replace); + if (pModDoc->RemoveSample((SAMPLEINDEX)modItemID)) { pModDoc->UpdateAllViews(NULL, (UINT(modItemID) << HINT_SHIFT_SMP) | HINT_SMPNAMES|HINT_SAMPLEDATA|HINT_SAMPLEINFO); } break; case MODITEM_INSTRUMENT: - wsprintf(s, _T("Delete instrument %d?"), modItemID & 0xFFFF); - if(MessageBox(s, _T("Confirmation"), MB_YESNO | MB_DEFBUTTON2) == IDNO) break; - if ((pModDoc) && (pModDoc->RemoveInstrument((INSTRUMENTINDEX)modItemID))) + wsprintf(s, _T("Remove instrument %d?"), modItemID); + if (pModDoc == nullptr || MessageBox(s, _T("Confirmation"), MB_YESNO | MB_DEFBUTTON2) == IDNO) break; + if (pModDoc->RemoveInstrument((INSTRUMENTINDEX)modItemID)) { pModDoc->UpdateAllViews(NULL, (UINT(modItemID) << HINT_SHIFT_INS) | HINT_MODTYPE|HINT_ENVELOPE|HINT_INSTRUMENT); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-07-23 23:58:33
|
Revision: 660 http://modplug.svn.sourceforge.net/modplug/?rev=660&view=rev Author: saga-games Date: 2010-07-23 23:58:27 +0000 (Fri, 23 Jul 2010) Log Message: ----------- [Fix] Pattern Editor: Shortcut for toggling record state didn't save the change, so it was reset with every new module. [Mod] OpenMPT: Version is now 1.18.02.06 Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2010-07-23 23:57:46 UTC (rev 659) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2010-07-23 23:58:27 UTC (rev 660) @@ -323,11 +323,11 @@ } if (dwHintMask & (HINT_MODTYPE|HINT_PATNAMES)) { - UINT nPat; - if (dwHintMask&HINT_PATNAMES) - nPat = (dwHintMask >> HINT_SHIFT_PAT); + PATTERNINDEX nPat; + if (dwHintMask & HINT_PATNAMES) + nPat = (PATTERNINDEX)(dwHintMask >> HINT_SHIFT_PAT); else - nPat = SendViewMessage(VIEWMSG_GETCURRENTPATTERN); + nPat = (PATTERNINDEX)SendViewMessage(VIEWMSG_GETCURRENTPATTERN); m_pSndFile->GetPatternName(nPat, s, sizeof(s)); m_EditPatName.SetWindowText(s); BOOL bXMIT = (m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE; @@ -436,6 +436,7 @@ case CTRLMSG_SETRECORD: if (lParam >= 0) m_bRecord = (BOOL)(lParam); else m_bRecord = !m_bRecord; m_ToolBar.SetState(IDC_PATTERN_RECORD, ((m_bRecord) ? TBSTATE_CHECKED : 0)|TBSTATE_ENABLED); + CMainFrame::gbPatternRecord = m_bRecord; SendViewMessage(VIEWMSG_SETRECORD, m_bRecord); break; @@ -927,7 +928,7 @@ { UINT nState = m_ToolBar.GetState(IDC_PATTERN_RECORD); m_bRecord = ((nState & TBSTATE_CHECKED) != 0); - CMainFrame::gbPatternRecord=m_bRecord; + CMainFrame::gbPatternRecord = m_bRecord; SendViewMessage(VIEWMSG_SETRECORD, m_bRecord); SwitchToView(); } Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2010-07-23 23:57:46 UTC (rev 659) +++ trunk/OpenMPT/mptrack/version.h 2010-07-23 23:58:27 UTC (rev 660) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 18 #define VER_MINOR 02 -#define VER_MINORMINOR 05 +#define VER_MINORMINOR 06 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-07-27 21:55:33
|
Revision: 662 http://modplug.svn.sourceforge.net/modplug/?rev=662&view=rev Author: saga-games Date: 2010-07-27 21:55:26 +0000 (Tue, 27 Jul 2010) Log Message: ----------- [New] Sample Editor / Sample Drawing: Horizontal lines can now be drawn by holding down the shift key. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_smp.h Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2010-07-26 20:09:53 UTC (rev 661) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2010-07-27 21:55:26 UTC (rev 662) @@ -107,6 +107,7 @@ memset(m_dwNotifyPos, 0, sizeof(m_dwNotifyPos)); memset(m_NcButtonState, 0, sizeof(m_NcButtonState)); m_bmpEnvBar.Create(IDB_SMPTOOLBAR, 20, 0, RGB(192,192,192)); + m_lastDrawPoint.SetPoint(-1, -1); } @@ -1310,6 +1311,17 @@ { if(m_dwEndDrag < len) { + // Shift = draw horizontal lines + if(CMainFrame::GetInputHandler()->ShiftPressed()) + { + if(m_lastDrawPoint.y != -1) + point.y = m_lastDrawPoint.y; + m_lastDrawPoint = point; + } else + { + m_lastDrawPoint.SetPoint(-1, -1); + } + if(pSndFile->Samples[m_nSample].GetElementarySampleSize() == 2) SetSampleData<int16, uint16>(pSndFile->Samples[m_nSample].pSample, point, old); else if(pSndFile->Samples[m_nSample].GetElementarySampleSize() == 1) @@ -1364,6 +1376,7 @@ // set initial point for sample drawing if (m_bDrawingEnabled) { + m_lastDrawPoint = point; pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); if(pSndFile->Samples[m_nSample].GetElementarySampleSize() == 2) SetInitialDrawPoint<int16, uint16>(pSndFile->Samples[m_nSample].pSample, point); @@ -1390,6 +1403,7 @@ m_dwStatus &= ~SMPSTATUS_MOUSEDRAG; ReleaseCapture(); } + m_lastDrawPoint.SetPoint(-1, -1); } Modified: trunk/OpenMPT/mptrack/View_smp.h =================================================================== --- trunk/OpenMPT/mptrack/View_smp.h 2010-07-26 20:09:53 UTC (rev 661) +++ trunk/OpenMPT/mptrack/View_smp.h 2010-07-27 21:55:26 UTC (rev 662) @@ -21,8 +21,10 @@ DWORD m_dwMenuParam; DWORD m_NcButtonState[SMP_LEFTBAR_BUTTONS]; DWORD m_dwNotifyPos[MAX_CHANNELS]; - bool m_bDrawingEnabled; + bool m_bDrawingEnabled; // sample drawing mode enabled? + CPoint m_lastDrawPoint; // for drawing horizontal lines + public: CViewSample(); DECLARE_SERIAL(CViewSample) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-07-28 18:29:07
|
Revision: 663 http://modplug.svn.sourceforge.net/modplug/?rev=663&view=rev Author: saga-games Date: 2010-07-28 18:28:58 +0000 (Wed, 28 Jul 2010) Log Message: ----------- [Ref] Simplified the ~2600 lines of keycommand definitions to ~500 lines by using a simple function instead of five lines of c&p code per keycommand. Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2010-07-27 21:55:26 UTC (rev 662) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2010-07-28 18:28:58 UTC (rev 663) @@ -49,2559 +49,563 @@ //commands.RemoveAll(); } + //------------------------------------------------------- // Setup //------------------------------------------------------- + +// Helper function for setting up commands +inline void CCommandSet::DefineKeyCommand(CommandID kc, UINT uid, enmKcVisibility visibility, enmKcDummy dummy, CString message) +//------------------------------------------------------------------------------------------------------------------------------ +{ + commands[kc].UID = uid; + commands[kc].isHidden = (visibility == kcHidden) ? true : false; + commands[kc].isDummy = (dummy == kcDummy) ? true : false; + commands[kc].Message = message; +} + //Get command descriptions etc.. loaded up. void CCommandSet::SetupCommands() +//------------------------------- { //TODO: make this hideous list a bit nicer, with a constructor or somthing. //NOTE: isHidden implies automatically set, since the user will not be able to see it. - commands[kcPatternRecord].UID = 1001; - commands[kcPatternRecord].isHidden = false; - commands[kcPatternRecord].isDummy = false; - commands[kcPatternRecord].Message = "Enable recording"; - - commands[kcPatternPlayRow].UID = 1002; - commands[kcPatternPlayRow].isHidden = false; - commands[kcPatternPlayRow].isDummy = false; - commands[kcPatternPlayRow].Message = "Play row"; - - commands[kcCursorCopy].UID = 1003; - commands[kcCursorCopy].isHidden = false; - commands[kcCursorCopy].isDummy = false; - commands[kcCursorCopy].Message = "Quick copy"; - - commands[kcCursorPaste].UID = 1004; - commands[kcCursorPaste].isHidden = false; - commands[kcCursorPaste].isDummy = false; - commands[kcCursorPaste].Message = "Quick paste"; - - commands[kcChannelMute].UID = 1005; - commands[kcChannelMute].isHidden = false; - commands[kcChannelMute].isDummy = false; - commands[kcChannelMute].Message = "Mute current channel"; - - commands[kcChannelSolo].UID = 1006; - commands[kcChannelSolo].isHidden = false; - commands[kcChannelSolo].isDummy = false; - commands[kcChannelSolo].Message = "Solo current channel"; - - commands[kcTransposeUp].UID = 1007; - commands[kcTransposeUp].isHidden = false; - commands[kcTransposeUp].isDummy = false; - commands[kcTransposeUp].Message = "Transpose +1"; - - commands[kcTransposeDown].UID = 1008; - commands[kcTransposeDown].isHidden = false; - commands[kcTransposeDown].isDummy = false; - commands[kcTransposeDown].Message = "Transpose -1"; - - commands[kcTransposeOctUp].UID = 1009; - commands[kcTransposeOctUp].isHidden = false; - commands[kcTransposeOctUp].isDummy = false; - commands[kcTransposeOctUp].Message = "Transpose +12"; - - commands[kcTransposeOctDown].UID = 1010; - commands[kcTransposeOctDown].isHidden = false; - commands[kcTransposeOctDown].isDummy = false; - commands[kcTransposeOctDown].Message = "Transpose -12"; - - commands[kcSelectColumn].UID = 1011; - commands[kcSelectColumn].isHidden = false; - commands[kcSelectColumn].isDummy = false; - commands[kcSelectColumn].Message = "Select channel / Select all"; - - commands[kcPatternAmplify].UID = 1012; - commands[kcPatternAmplify].isHidden = false; - commands[kcPatternAmplify].isDummy = false; - commands[kcPatternAmplify].Message = "Amplify selection"; - - commands[kcPatternSetInstrument].UID = 1013; - commands[kcPatternSetInstrument].isHidden = false; - commands[kcPatternSetInstrument].isDummy = false; - commands[kcPatternSetInstrument].Message = "Apply current instrument"; - - commands[kcPatternInterpolateVol].UID = 1014; - commands[kcPatternInterpolateVol].isHidden = false; - commands[kcPatternInterpolateVol].isDummy = false; - commands[kcPatternInterpolateVol].Message = "Interpolate volume"; - - commands[kcPatternInterpolateEffect].UID = 1015; - commands[kcPatternInterpolateEffect].isHidden = false; - commands[kcPatternInterpolateEffect].isDummy = false; - commands[kcPatternInterpolateEffect].Message = "Interpolate effect"; - - commands[kcPatternVisualizeEffect].UID = 1016; - commands[kcPatternVisualizeEffect].isHidden = false; - commands[kcPatternVisualizeEffect].isDummy = false; - commands[kcPatternVisualizeEffect].Message = "Open effect visualizer"; - - commands[kcPatternJumpDownh1].UID = 1017; - commands[kcPatternJumpDownh1].isHidden = false; - commands[kcPatternJumpDownh1].isDummy = false; - commands[kcPatternJumpDownh1].Message = "Jump down by measure"; - - commands[kcPatternJumpUph1].UID = 1018; - commands[kcPatternJumpUph1].isHidden = false; - commands[kcPatternJumpUph1].isDummy = false; - commands[kcPatternJumpUph1].Message = "Jump up by measure"; - - commands[kcPatternSnapDownh1].UID = 1019; - commands[kcPatternSnapDownh1].isHidden = false; - commands[kcPatternSnapDownh1].isDummy = false; - commands[kcPatternSnapDownh1].Message = "Snap down to measure"; - - commands[kcPatternSnapUph1].UID = 1020; - commands[kcPatternSnapUph1].isHidden = false; - commands[kcPatternSnapUph1].isDummy = false; - commands[kcPatternSnapUph1].Message = "Snap up to measure"; - - commands[kcViewGeneral].UID = 1021; - commands[kcViewGeneral].isHidden = false; - commands[kcViewGeneral].isDummy = false; - commands[kcViewGeneral].Message = "View General"; - - commands[kcViewPattern].UID = 1022; - commands[kcViewPattern].isHidden = false; - commands[kcViewPattern].isDummy = false; - commands[kcViewPattern].Message = "View Pattern"; - - commands[kcViewSamples].UID = 1023; - commands[kcViewSamples].isHidden = false; - commands[kcViewSamples].isDummy = false; - commands[kcViewSamples].Message = "View Samples"; - - commands[kcViewInstruments].UID = 1024; - commands[kcViewInstruments].isHidden = false; - commands[kcViewInstruments].isDummy = false; - commands[kcViewInstruments].Message = "View Instruments"; - - commands[kcViewComments].UID = 1025; - commands[kcViewComments].isHidden = false; - commands[kcViewComments].isDummy = false; - commands[kcViewComments].Message = "View Comments"; - - commands[kcPlayPatternFromCursor].UID = 1026; - commands[kcPlayPatternFromCursor].isHidden = false; - commands[kcPlayPatternFromCursor].isDummy = false; - commands[kcPlayPatternFromCursor].Message = "Play pattern from cursor"; - - commands[kcPlayPatternFromStart].UID = 1027; - commands[kcPlayPatternFromStart].isHidden = false; - commands[kcPlayPatternFromStart].isDummy = false; - commands[kcPlayPatternFromStart].Message = "Play pattern from start"; - - commands[kcPlaySongFromCursor].UID = 1028; - commands[kcPlaySongFromCursor].isHidden = false; - commands[kcPlaySongFromCursor].isDummy = false; - commands[kcPlaySongFromCursor].Message = "Play song from cursor"; - - commands[kcPlaySongFromStart].UID = 1029; - commands[kcPlaySongFromStart].isHidden = false; - commands[kcPlaySongFromStart].isDummy = false; - commands[kcPlaySongFromStart].Message = "Play song from start"; - - commands[kcPlayPauseSong].UID = 1030; - commands[kcPlayPauseSong].isHidden = false; - commands[kcPlayPauseSong].isDummy = false; - commands[kcPlayPauseSong].Message = "Play song/Pause song"; - - commands[kcPauseSong].UID = 1031; - commands[kcPauseSong].isHidden = false; - commands[kcPauseSong].isDummy = false; - commands[kcPauseSong].Message = "Pause song"; - - commands[kcPrevInstrument].UID = 1032; - commands[kcPrevInstrument].isHidden = false; - commands[kcPrevInstrument].isDummy = false; - commands[kcPrevInstrument].Message = "Previous instrument"; - - commands[kcNextInstrument].UID = 1033; - commands[kcNextInstrument].isHidden = false; - commands[kcNextInstrument].isDummy = false; - commands[kcNextInstrument].Message = "Next instrument"; - - commands[kcPrevOrder].UID = 1034; - commands[kcPrevOrder].isHidden = false; - commands[kcPrevOrder].isDummy = false; - commands[kcPrevOrder].Message = "Previous order"; - - commands[kcNextOrder].UID = 1035; - commands[kcNextOrder].isHidden = false; - commands[kcNextOrder].isDummy = false; - commands[kcNextOrder].Message = "Next order"; - - commands[kcPrevOctave].UID = 1036; - commands[kcPrevOctave].isHidden = false; - commands[kcPrevOctave].isDummy = false; - commands[kcPrevOctave].Message = "Previous octave"; - - commands[kcNextOctave].UID = 1037; - commands[kcNextOctave].isHidden = false; - commands[kcNextOctave].isDummy = false; - commands[kcNextOctave].Message = "Next octave"; - - commands[kcNavigateDown].UID = 1038; - commands[kcNavigateDown].isHidden = false; - commands[kcNavigateDown].isDummy = false; - commands[kcNavigateDown].Message = "Navigate down by 1 row"; - - commands[kcNavigateUp].UID = 1039; - commands[kcNavigateUp].isHidden = false; - commands[kcNavigateUp].isDummy = false; - commands[kcNavigateUp].Message = "Navigate up by 1 row"; - - commands[kcNavigateLeft].UID = 1040; - commands[kcNavigateLeft].isHidden = false; - commands[kcNavigateLeft].isDummy = false; - commands[kcNavigateLeft].Message = "Navigate left"; - - commands[kcNavigateRight].UID = 1041; - commands[kcNavigateRight].isHidden = false; - commands[kcNavigateRight].isDummy = false; - commands[kcNavigateRight].Message = "Navigate right"; - - commands[kcNavigateNextChan].UID = 1042; - commands[kcNavigateNextChan].isHidden = false; - commands[kcNavigateNextChan].isDummy = false; - commands[kcNavigateNextChan].Message = "Navigate to next channel"; - - commands[kcNavigatePrevChan].UID = 1043; - commands[kcNavigatePrevChan].isHidden = false; - commands[kcNavigatePrevChan].isDummy = false; - commands[kcNavigatePrevChan].Message = "Navigate to previous channel"; - - commands[kcHomeHorizontal].UID = 1044; - commands[kcHomeHorizontal].isHidden = false; - commands[kcHomeHorizontal].isDummy = false; - commands[kcHomeHorizontal].Message = "Go to first channel"; - - commands[kcHomeVertical].UID = 1045; - commands[kcHomeVertical].isHidden = false; - commands[kcHomeVertical].isDummy = false; - commands[kcHomeVertical].Message = "Go to first row"; - - commands[kcHomeAbsolute].UID = 1046; - commands[kcHomeAbsolute].isHidden = false; - commands[kcHomeAbsolute].isDummy = false; - commands[kcHomeAbsolute].Message = "Go to first row of first channel"; - - commands[kcEndHorizontal].UID = 1047; - commands[kcEndHorizontal].isHidden = false; - commands[kcEndHorizontal].isDummy = false; - commands[kcEndHorizontal].Message = "Go to last channel"; - - commands[kcEndVertical].UID = 1048; - commands[kcEndVertical].isHidden = false; - commands[kcEndVertical].isDummy = false; - commands[kcEndVertical].Message = "Go to last row"; - - commands[kcEndAbsolute].UID = 1049; - commands[kcEndAbsolute].isHidden = false; - commands[kcEndAbsolute].isDummy = false; - commands[kcEndAbsolute].Message = "Go to last row of last channel"; - - commands[kcSelect].UID = 1050; - commands[kcSelect].isHidden = false; - commands[kcSelect].isDummy = false; - commands[kcSelect].Message = "Selection key"; - - commands[kcCopySelect].UID = 1051; - commands[kcCopySelect].isHidden = false; - commands[kcCopySelect].isDummy = false; - commands[kcCopySelect].Message = "Copy select key"; - - commands[kcSelectOff].UID = 1052; - commands[kcSelectOff].isHidden = true; - commands[kcSelectOff].isDummy = false; - commands[kcSelectOff].Message = "Deselect"; - - commands[kcCopySelectOff].UID = 1053; - commands[kcCopySelectOff].isHidden = true; - commands[kcCopySelectOff].isDummy = false; - commands[kcCopySelectOff].Message = "Copy deselect key"; - - commands[kcNextPattern].UID = 1054; - commands[kcNextPattern].isHidden = false; - commands[kcNextPattern].isDummy = false; - commands[kcNextPattern].Message = "Next pattern"; - - commands[kcPrevPattern].UID = 1055; - commands[kcPrevPattern].isHidden = false; - commands[kcPrevPattern].isDummy = false; - commands[kcPrevPattern].Message = "Previous pattern"; - -/* commands[kcClearSelection].UID = 1056; - commands[kcClearSelection].isHidden = false; - commands[kcClearSelection].isDummy = false; - commands[kcClearSelection].Message = "Wipe selection";*/ - - commands[kcClearRow].UID = 1057; - commands[kcClearRow].isHidden = false; - commands[kcClearRow].isDummy = false; - commands[kcClearRow].Message = "Clear row"; - - commands[kcClearField].UID = 1058; - commands[kcClearField].isHidden = false; - commands[kcClearField].isDummy = false; - commands[kcClearField].Message = "Clear field"; - - commands[kcClearRowStep].UID = 1059; - commands[kcClearRowStep].isHidden = false; - commands[kcClearRowStep].isDummy = false; - commands[kcClearRowStep].Message = "Clear row and step"; - - commands[kcClearFieldStep].UID = 1060; - commands[kcClearFieldStep].isHidden = false; - commands[kcClearFieldStep].isDummy = false; - commands[kcClearFieldStep].Message = "Clear field and step"; - - commands[kcDeleteRows].UID = 1061; - commands[kcDeleteRows].isHidden = false; - commands[kcDeleteRows].isDummy = false; - commands[kcDeleteRows].Message = "Delete rows"; - - commands[kcShowNoteProperties].UID = 1062; - commands[kcShowNoteProperties].isHidden = false; - commands[kcShowNoteProperties].isDummy = false; - commands[kcShowNoteProperties].Message = "Show note properties"; - - commands[kcShowEditMenu].UID = 1063; - commands[kcShowEditMenu].isHidden = false; - commands[kcShowEditMenu].isDummy = false; - commands[kcShowEditMenu].Message = "Show context (right-click) menu"; - - commands[kcVPNoteC_0].UID = 1064; - commands[kcVPNoteC_0].isHidden = false; - commands[kcVPNoteC_0].isDummy = false; - commands[kcVPNoteC_0].Message = "Base octave C"; - - commands[kcVPNoteCS0].UID = 1065; - commands[kcVPNoteCS0].isHidden = false; - commands[kcVPNoteCS0].isDummy = false; - commands[kcVPNoteCS0].Message = "Base octave C#"; - - commands[kcVPNoteD_0].UID = 1066; - commands[kcVPNoteD_0].isHidden = false; - commands[kcVPNoteD_0].isDummy = false; - commands[kcVPNoteD_0].Message = "Base octave D"; - - commands[kcVPNoteDS0].UID = 1067; - commands[kcVPNoteDS0].isHidden = false; - commands[kcVPNoteDS0].isDummy = false; - commands[kcVPNoteDS0].Message = "Base octave D#"; - - commands[kcVPNoteE_0].UID = 1068; - commands[kcVPNoteE_0].isHidden = false; - commands[kcVPNoteE_0].isDummy = false; - commands[kcVPNoteE_0].Message = "Base octave E"; - - commands[kcVPNoteF_0].UID = 1069; - commands[kcVPNoteF_0].isHidden = false; - commands[kcVPNoteF_0].isDummy = false; - commands[kcVPNoteF_0].Message = "Base octave F"; - - commands[kcVPNoteFS0].UID = 1070; - commands[kcVPNoteFS0].isHidden = false; - commands[kcVPNoteFS0].isDummy = false; - commands[kcVPNoteFS0].Message = "Base octave F#"; - - commands[kcVPNoteG_0].UID = 1071; - commands[kcVPNoteG_0].isHidden = false; - commands[kcVPNoteG_0].isDummy = false; - commands[kcVPNoteG_0].Message = "Base octave G"; - - commands[kcVPNoteGS0].UID = 1072; - commands[kcVPNoteGS0].isHidden = false; - commands[kcVPNoteGS0].isDummy = false; - commands[kcVPNoteGS0].Message = "Base octave G#"; - - commands[kcVPNoteA_1].UID = 1073; - commands[kcVPNoteA_1].isHidden = false; - commands[kcVPNoteA_1].isDummy = false; - commands[kcVPNoteA_1].Message = "Base octave A"; - - commands[kcVPNoteAS1].UID = 1074; - commands[kcVPNoteAS1].isHidden = false; - commands[kcVPNoteAS1].isDummy = false; - commands[kcVPNoteAS1].Message = "Base octave A#"; - - commands[kcVPNoteB_1].UID = 1075; - commands[kcVPNoteB_1].isHidden = false; - commands[kcVPNoteB_1].isDummy = false; - commands[kcVPNoteB_1].Message = "Base octave B"; - - commands[kcVPNoteC_1].UID = 1076; - commands[kcVPNoteC_1].isHidden = false; - commands[kcVPNoteC_1].isDummy = false; - commands[kcVPNoteC_1].Message = "Base octave +1 C"; - - commands[kcVPNoteCS1].UID = 1077; - commands[kcVPNoteCS1].isHidden = false; - commands[kcVPNoteCS1].isDummy = false; - commands[kcVPNoteCS1].Message = "Base octave +1 C#"; - - commands[kcVPNoteD_1].UID = 1078; - commands[kcVPNoteD_1].isHidden = false; - commands[kcVPNoteD_1].isDummy = false; - commands[kcVPNoteD_1].Message = "Base octave +1 D"; - - commands[kcVPNoteDS1].UID = 1079; - commands[kcVPNoteDS1].isHidden = false; - commands[kcVPNoteDS1].isDummy = false; - commands[kcVPNoteDS1].Message = "Base octave +1 D#"; - - commands[kcVPNoteE_1].UID = 1080; - commands[kcVPNoteE_1].isHidden = false; - commands[kcVPNoteE_1].isDummy = false; - commands[kcVPNoteE_1].Message = "Base octave +1 E"; - - commands[kcVPNoteF_1].UID = 1081; - commands[kcVPNoteF_1].isHidden = false; - commands[kcVPNoteF_1].isDummy = false; - commands[kcVPNoteF_1].Message = "Base octave +1 F"; - - commands[kcVPNoteFS1].UID = 1082; - commands[kcVPNoteFS1].isHidden = false; - commands[kcVPNoteFS1].isDummy = false; - commands[kcVPNoteFS1].Message = "Base octave +1 F#"; - - commands[kcVPNoteG_1].UID = 1083; - commands[kcVPNoteG_1].isHidden = false; - commands[kcVPNoteG_1].isDummy = false; - commands[kcVPNoteG_1].Message = "Base octave +1 G"; - - commands[kcVPNoteGS1].UID = 1084; - commands[kcVPNoteGS1].isHidden = false; - commands[kcVPNoteGS1].isDummy = false; - commands[kcVPNoteGS1].Message = "Base octave +1 G#"; - - commands[kcVPNoteA_2].UID = 1085; - commands[kcVPNoteA_2].isHidden = false; - commands[kcVPNoteA_2].isDummy = false; - commands[kcVPNoteA_2].Message = "Base octave +1 A"; - - commands[kcVPNoteAS2].UID = 1086; - commands[kcVPNoteAS2].isHidden = false; - commands[kcVPNoteAS2].isDummy = false; - commands[kcVPNoteAS2].Message = "Base octave +1 A#"; - - commands[kcVPNoteB_2].UID = 1087; - commands[kcVPNoteB_2].isHidden = false; - commands[kcVPNoteB_2].isDummy = false; - commands[kcVPNoteB_2].Message = "Base octave +1 B"; - - commands[kcVPNoteC_2].UID = 1088; - commands[kcVPNoteC_2].isHidden = false; - commands[kcVPNoteC_2].isDummy = false; - commands[kcVPNoteC_2].Message = "Base octave +2 C"; - - commands[kcVPNoteCS2].UID = 1089; - commands[kcVPNoteCS2].isHidden = false; - commands[kcVPNoteCS2].isDummy = false; - commands[kcVPNoteCS2].Message = "Base octave +2 C#"; - - commands[kcVPNoteD_2].UID = 1090; - commands[kcVPNoteD_2].isHidden = false; - commands[kcVPNoteD_2].isDummy = false; - commands[kcVPNoteD_2].Message = "Base octave +2 D"; - - commands[kcVPNoteDS2].UID = 1091; - commands[kcVPNoteDS2].isHidden = false; - commands[kcVPNoteDS2].isDummy = false; - commands[kcVPNoteDS2].Message = "Base octave +2 D#"; - - commands[kcVPNoteE_2].UID = 1092; - commands[kcVPNoteE_2].isHidden = false; - commands[kcVPNoteE_2].isDummy = false; - commands[kcVPNoteE_2].Message = "Base octave +2 E"; - - commands[kcVPNoteF_2].UID = 1093; - commands[kcVPNoteF_2].isHidden = false; - commands[kcVPNoteF_2].isDummy = false; - commands[kcVPNoteF_2].Message = "Base octave +2 F"; - - commands[kcVPNoteFS2].UID = 1094; - commands[kcVPNoteFS2].isHidden = false; - commands[kcVPNoteFS2].isDummy = false; - commands[kcVPNoteFS2].Message = "Base octave +2 F#"; - - commands[kcVPNoteG_2].UID = 1095; - commands[kcVPNoteG_2].isHidden = false; - commands[kcVPNoteG_2].isDummy = false; - commands[kcVPNoteG_2].Message = "Base octave +2 G"; - - commands[kcVPNoteGS2].UID = 1096; - commands[kcVPNoteGS2].isHidden = false; - commands[kcVPNoteGS2].isDummy = false; - commands[kcVPNoteGS2].Message = "Base octave +2 G#"; - - commands[kcVPNoteA_3].UID = 1097; - commands[kcVPNoteA_3].isHidden = false; - commands[kcVPNoteA_3].isDummy = false; - commands[kcVPNoteA_3].Message = "Base octave +2 A"; - - commands[kcVPNoteStopC_0].UID = 1098; - commands[kcVPNoteStopC_0].isHidden = true; - commands[kcVPNoteStopC_0].isDummy = false; - commands[kcVPNoteStopC_0].Message = "Stop base octave C"; - - commands[kcVPNoteStopCS0].UID = 1099; - commands[kcVPNoteStopCS0].isHidden = true; - commands[kcVPNoteStopCS0].isDummy = false; - commands[kcVPNoteStopCS0].Message = "Stop base octave C#"; - - commands[kcVPNoteStopD_0].UID = 1100; - commands[kcVPNoteStopD_0].isHidden = true; - commands[kcVPNoteStopD_0].isDummy = false; - commands[kcVPNoteStopD_0].Message = "Stop base octave D"; - - commands[kcVPNoteStopDS0].UID = 1101; - commands[kcVPNoteStopDS0].isHidden = true; - commands[kcVPNoteStopDS0].isDummy = false; - commands[kcVPNoteStopDS0].Message = "Stop base octave D#"; - - commands[kcVPNoteStopE_0].UID = 1102; - commands[kcVPNoteStopE_0].isHidden = true; - commands[kcVPNoteStopE_0].isDummy = false; - commands[kcVPNoteStopE_0].Message = "Stop base octave E"; - - commands[kcVPNoteStopF_0].UID = 1103; - commands[kcVPNoteStopF_0].isHidden = true; - commands[kcVPNoteStopF_0].isDummy = false; - commands[kcVPNoteStopF_0].Message = "Stop base octave F"; - - commands[kcVPNoteStopFS0].UID = 1104; - commands[kcVPNoteStopFS0].isHidden = true; - commands[kcVPNoteStopFS0].isDummy = false; - commands[kcVPNoteStopFS0].Message = "Stop base octave F#"; - - commands[kcVPNoteStopG_0].UID = 1105; - commands[kcVPNoteStopG_0].isHidden = true; - commands[kcVPNoteStopG_0].isDummy = false; - commands[kcVPNoteStopG_0].Message = "Stop base octave G"; - - commands[kcVPNoteStopGS0].UID = 1106; - commands[kcVPNoteStopGS0].isHidden = true; - commands[kcVPNoteStopGS0].isDummy = false; - commands[kcVPNoteStopGS0].Message = "Stop base octave G#"; - - commands[kcVPNoteStopA_1].UID = 1107; - commands[kcVPNoteStopA_1].isHidden = true; - commands[kcVPNoteStopA_1].isDummy = false; - commands[kcVPNoteStopA_1].Message = "Stop base octave +1 A"; - - commands[kcVPNoteStopAS1].UID = 1108; - commands[kcVPNoteStopAS1].isHidden = true; - commands[kcVPNoteStopAS1].isDummy = false; - commands[kcVPNoteStopAS1].Message = "Stop base octave +1 A#"; - - commands[kcVPNoteStopB_1].UID = 1109; - commands[kcVPNoteStopB_1].isHidden = true; - commands[kcVPNoteStopB_1].isDummy = false; - commands[kcVPNoteStopB_1].Message = "Stop base octave +1 B"; - - commands[kcVPNoteStopC_1].UID = 1110; - commands[kcVPNoteStopC_1].isHidden = true; - commands[kcVPNoteStopC_1].isDummy = false; - commands[kcVPNoteStopC_1].Message = "Stop base octave +1 C"; - - commands[kcVPNoteStopCS1].UID = 1111; - commands[kcVPNoteStopCS1].isHidden = true; - commands[kcVPNoteStopCS1].isDummy = false; - commands[kcVPNoteStopCS1].Message = "Stop base octave +1 C#"; - - commands[kcVPNoteStopD_1].UID = 1112; - commands[kcVPNoteStopD_1].isHidden = true; - commands[kcVPNoteStopD_1].isDummy = false; - commands[kcVPNoteStopD_1].Message = "Stop base octave +1 D"; - - commands[kcVPNoteStopDS1].UID = 1113; - commands[kcVPNoteStopDS1].isHidden = true; - commands[kcVPNoteStopDS1].isDummy = false; - commands[kcVPNoteStopDS1].Message = "Stop base octave +1 D#"; - - commands[kcVPNoteStopE_1].UID = 1114; - commands[kcVPNoteStopE_1].isHidden = true; - commands[kcVPNoteStopE_1].isDummy = false; - commands[kcVPNoteStopE_1].Message = "Stop base octave +1 E"; - - commands[kcVPNoteStopF_1].UID = 1115; - commands[kcVPNoteStopF_1].isHidden = true; - commands[kcVPNoteStopF_1].isDummy = false; - commands[kcVPNoteStopF_1].Message = "Stop base octave +1 F"; - - commands[kcVPNoteStopFS1].UID = 1116; - commands[kcVPNoteStopFS1].isHidden = true; - commands[kcVPNoteStopFS1].isDummy = false; - commands[kcVPNoteStopFS1].Message = "Stop base octave +1 F#"; - - commands[kcVPNoteStopG_1].UID = 1117; - commands[kcVPNoteStopG_1].isHidden = true; - commands[kcVPNoteStopG_1].isDummy = false; - commands[kcVPNoteStopG_1].Message = "Stop base octave +1 G"; - - commands[kcVPNoteStopGS1].UID = 1118; - commands[kcVPNoteStopGS1].isHidden = true; - commands[kcVPNoteStopGS1].isDummy = false; - commands[kcVPNoteStopGS1].Message = "Stop base octave +1 G#"; - - commands[kcVPNoteStopA_2].UID = 1119; - commands[kcVPNoteStopA_2].isHidden = true; - commands[kcVPNoteStopA_2].isDummy = false; - commands[kcVPNoteStopA_2].Message = "Stop base octave +2 A"; - - commands[kcVPNoteStopAS2].UID = 1120; - commands[kcVPNoteStopAS2].isHidden = true; - commands[kcVPNoteStopAS2].isDummy = false; - commands[kcVPNoteStopAS2].Message = "Stop base octave +2 A#"; - - commands[kcVPNoteStopB_2].UID = 1121; - commands[kcVPNoteStopB_2].isHidden = true; - commands[kcVPNoteStopB_2].isDummy = false; - commands[kcVPNoteStopB_2].Message = "Stop base octave +2 B"; - - commands[kcVPNoteStopC_2].UID = 1122; - commands[kcVPNoteStopC_2].isHidden = true; - commands[kcVPNoteStopC_2].isDummy = false; - commands[kcVPNoteStopC_2].Message = "Stop base octave +2 C"; - - commands[kcVPNoteStopCS2].UID = 1123; - commands[kcVPNoteStopCS2].isHidden = true; - commands[kcVPNoteStopCS2].isDummy = false; - commands[kcVPNoteStopCS2].Message = "Stop base octave +2 C#"; - - commands[kcVPNoteStopD_2].UID = 1124; - commands[kcVPNoteStopD_2].isHidden = true; - commands[kcVPNoteStopD_2].isDummy = false; - commands[kcVPNoteStopD_2].Message = "Stop base octave +2 D"; - - commands[kcVPNoteStopDS2].UID = 1125; - commands[kcVPNoteStopDS2].isHidden = true; - commands[kcVPNoteStopDS2].isDummy = false; - commands[kcVPNoteStopDS2].Message = "Stop base octave +2 D#"; - - commands[kcVPNoteStopE_2].UID = 1126; - commands[kcVPNoteStopE_2].isHidden = true; - commands[kcVPNoteStopE_2].isDummy = false; - commands[kcVPNoteStopE_2].Message = "Stop base octave +2 E"; - - commands[kcVPNoteStopF_2].UID = 1127; - commands[kcVPNoteStopF_2].isHidden = true; - commands[kcVPNoteStopF_2].isDummy = false; - commands[kcVPNoteStopF_2].Message = "Stop base octave +2 F"; - - commands[kcVPNoteStopFS2].UID = 1128; - commands[kcVPNoteStopFS2].isHidden = true; - commands[kcVPNoteStopFS2].isDummy = false; - commands[kcVPNoteStopFS2].Message = "Stop base octave +2 F#"; - - commands[kcVPNoteStopG_2].UID = 1129; - commands[kcVPNoteStopG_2].isHidden = true; - commands[kcVPNoteStopG_2].isDummy = false; - commands[kcVPNoteStopG_2].Message = "Stop base octave +2 G"; - - commands[kcVPNoteStopGS2].UID = 1130; - commands[kcVPNoteStopGS2].isHidden = true; - commands[kcVPNoteStopGS2].isDummy = false; - commands[kcVPNoteStopGS2].Message = "Stop base octave +2 G#"; - - commands[kcVPNoteStopA_3].UID = 1131; - commands[kcVPNoteStopA_3].isHidden = true; - commands[kcVPNoteStopA_3].isDummy = false; - commands[kcVPNoteStopA_3].Message = "Stop base octave +3 A"; - - - commands[kcVPChordC_0].UID = 1132; - commands[kcVPChordC_0].isHidden = true; - commands[kcVPChordC_0].isDummy = false; - commands[kcVPChordC_0].Message = "base octave chord C"; - - commands[kcVPChordCS0].UID = 1133; - commands[kcVPChordCS0].isHidden = true; - commands[kcVPChordCS0].isDummy = false; - commands[kcVPChordCS0].Message = "base octave chord C#"; - - commands[kcVPChordD_0].UID = 1134; - commands[kcVPChordD_0].isHidden = true; - commands[kcVPChordD_0].isDummy = false; - commands[kcVPChordD_0].Message = "base octave chord D"; - - commands[kcVPChordDS0].UID = 1135; - commands[kcVPChordDS0].isHidden = true; - commands[kcVPChordDS0].isDummy = false; - commands[kcVPChordDS0].Message = "base octave chord D#"; - - commands[kcVPChordE_0].UID = 1136; - commands[kcVPChordE_0].isHidden = true; - commands[kcVPChordE_0].isDummy = false; - commands[kcVPChordE_0].Message = "base octave chord E"; - - commands[kcVPChordF_0].UID = 1137; - commands[kcVPChordF_0].isHidden = true; - commands[kcVPChordF_0].isDummy = false; - commands[kcVPChordF_0].Message = "base octave chord F"; - - commands[kcVPChordFS0].UID = 1138; - commands[kcVPChordFS0].isHidden = true; - commands[kcVPChordFS0].isDummy = false; - commands[kcVPChordFS0].Message = "base octave chord F#"; - - commands[kcVPChordG_0].UID = 1139; - commands[kcVPChordG_0].isHidden = true; - commands[kcVPChordG_0].isDummy = false; - commands[kcVPChordG_0].Message = "base octave chord G"; - - commands[kcVPChordGS0].UID = 1140; - commands[kcVPChordGS0].isHidden = true; - commands[kcVPChordGS0].isDummy = false; - commands[kcVPChordGS0].Message = "base octave chord G#"; - - commands[kcVPChordA_1].UID = 1141; - commands[kcVPChordA_1].isHidden = true; - commands[kcVPChordA_1].isDummy = false; - commands[kcVPChordA_1].Message = "base octave +1 chord A"; - - commands[kcVPChordAS1].UID = 1142; - commands[kcVPChordAS1].isHidden = true; - commands[kcVPChordAS1].isDummy = false; - commands[kcVPChordAS1].Message = "base octave +1 chord A#"; - - commands[kcVPChordB_1].UID = 1143; - commands[kcVPChordB_1].isHidden = true; - commands[kcVPChordB_1].isDummy = false; - commands[kcVPChordB_1].Message = "base octave +1 chord B"; - - commands[kcVPChordC_1].UID = 1144; - commands[kcVPChordC_1].isHidden = true; - commands[kcVPChordC_1].isDummy = false; - commands[kcVPChordC_1].Message = "base octave +1 chord C"; - - commands[kcVPChordCS1].UID = 1145; - commands[kcVPChordCS1].isHidden = true; - commands[kcVPChordCS1].isDummy = false; - commands[kcVPChordCS1].Message = "base octave +1 chord C#"; - - commands[kcVPChordD_1].UID = 1146; - commands[kcVPChordD_1].isHidden = true; - commands[kcVPChordD_1].isDummy = false; - commands[kcVPChordD_1].Message = "base octave +1 chord D"; - - commands[kcVPChordDS1].UID = 1147; - commands[kcVPChordDS1].isHidden = true; - commands[kcVPChordDS1].isDummy = false; - commands[kcVPChordDS1].Message = "base octave +1 chord D#"; - - commands[kcVPChordE_1].UID = 1148; - commands[kcVPChordE_1].isHidden = true; - commands[kcVPChordE_1].isDummy = false; - commands[kcVPChordE_1].Message = "base octave +1 chord E"; - - commands[kcVPChordF_1].UID = 1149; - commands[kcVPChordF_1].isHidden = true; - commands[kcVPChordF_1].isDummy = false; - commands[kcVPChordF_1].Message = "base octave +1 chord F"; - - commands[kcVPChordFS1].UID = 1150; - commands[kcVPChordFS1].isHidden = true; - commands[kcVPChordFS1].isDummy = false; - commands[kcVPChordFS1].Message = "base octave +1 chord F#"; - - commands[kcVPChordG_1].UID = 1151; - commands[kcVPChordG_1].isHidden = true; - commands[kcVPChordG_1].isDummy = false; - commands[kcVPChordG_1].Message = "base octave +1 chord G"; - - commands[kcVPChordGS1].UID = 1152; - commands[kcVPChordGS1].isHidden = true; - commands[kcVPChordGS1].isDummy = false; - commands[kcVPChordGS1].Message = "base octave +1 chord G#"; - - commands[kcVPChordA_2].UID = 1153; - commands[kcVPChordA_2].isHidden = true; - commands[kcVPChordA_2].isDummy = false; - commands[kcVPChordA_2].Message = "base octave +2 chord A"; - - commands[kcVPChordAS2].UID = 1154; - commands[kcVPChordAS2].isHidden = true; - commands[kcVPChordAS2].isDummy = false; - commands[kcVPChordAS2].Message = "base octave +2 chord A#"; - - commands[kcVPChordB_2].UID = 1155; - commands[kcVPChordB_2].isHidden = true; - commands[kcVPChordB_2].isDummy = false; - commands[kcVPChordB_2].Message = "base octave +2 chord B"; - - commands[kcVPChordC_2].UID = 1156; - commands[kcVPChordC_2].isHidden = true; - commands[kcVPChordC_2].isDummy = false; - commands[kcVPChordC_2].Message = "base octave +2 chord C"; - - commands[kcVPChordCS2].UID = 1157; - commands[kcVPChordCS2].isHidden = true; - commands[kcVPChordCS2].isDummy = false; - commands[kcVPChordCS2].Message = "base octave +2 chord C#"; - - commands[kcVPChordD_2].UID = 1158; - commands[kcVPChordD_2].isHidden = true; - commands[kcVPChordD_2].isDummy = false; - commands[kcVPChordD_2].Message = "base octave +2 chord D"; - - commands[kcVPChordDS2].UID = 1159; - commands[kcVPChordDS2].isHidden = true; - commands[kcVPChordDS2].isDummy = false; - commands[kcVPChordDS2].Message = "base octave +2 chord D#"; - - commands[kcVPChordE_2].UID = 1160; - commands[kcVPChordE_2].isHidden = true; - commands[kcVPChordE_2].isDummy = false; - commands[kcVPChordE_2].Message = "base octave +2 chord E"; - - commands[kcVPChordF_2].UID = 1161; - commands[kcVPChordF_2].isHidden = true; - commands[kcVPChordF_2].isDummy = false; - commands[kcVPChordF_2].Message = "base octave +2 chord F"; - - commands[kcVPChordFS2].UID = 1162; - commands[kcVPChordFS2].isHidden = true; - commands[kcVPChordFS2].isDummy = false; - commands[kcVPChordFS2].Message = "base octave +2 chord F#"; - - commands[kcVPChordG_2].UID = 1163; - commands[kcVPChordG_2].isHidden = true; - commands[kcVPChordG_2].isDummy = false; - commands[kcVPChordG_2].Message = "base octave +2 chord G"; - - commands[kcVPChordGS2].UID = 1164; - commands[kcVPChordGS2].isHidden = true; - commands[kcVPChordGS2].isDummy = false; - commands[kcVPChordGS2].Message = "base octave +2 chord G#"; - - commands[kcVPChordA_3].UID = 1165; - commands[kcVPChordA_3].isHidden = true; - commands[kcVPChordA_3].isDummy = false; - commands[kcVPChordA_3].Message = "base octave chord +3 A"; - - - commands[kcVPChordStopC_0].UID = 1166; - commands[kcVPChordStopC_0].isHidden = true; - commands[kcVPChordStopC_0].isDummy = false; - commands[kcVPChordStopC_0].Message = "Stop base octave chord C"; - - commands[kcVPChordStopCS0].UID = 1167; - commands[kcVPChordStopCS0].isHidden = true; - commands[kcVPChordStopCS0].isDummy = false; - commands[kcVPChordStopCS0].Message = "Stop base octave chord C#"; - - commands[kcVPChordStopD_0].UID = 1168; - commands[kcVPChordStopD_0].isHidden = true; - commands[kcVPChordStopD_0].isDummy = false; - commands[kcVPChordStopD_0].Message = "Stop base octave chord D"; - - commands[kcVPChordStopDS0].UID = 1169; - commands[kcVPChordStopDS0].isHidden = true; - commands[kcVPChordStopDS0].isDummy = false; - commands[kcVPChordStopDS0].Message = "Stop base octave chord D#"; - - commands[kcVPChordStopE_0].UID = 1170; - commands[kcVPChordStopE_0].isHidden = true; - commands[kcVPChordStopE_0].isDummy = false; - commands[kcVPChordStopE_0].Message = "Stop base octave chord E"; - - commands[kcVPChordStopF_0].UID = 1171; - commands[kcVPChordStopF_0].isHidden = true; - commands[kcVPChordStopF_0].isDummy = false; - commands[kcVPChordStopF_0].Message = "Stop base octave chord F"; - - commands[kcVPChordStopFS0].UID = 1172; - commands[kcVPChordStopFS0].isHidden = true; - commands[kcVPChordStopFS0].isDummy = false; - commands[kcVPChordStopFS0].Message = "Stop base octave chord F#"; - - commands[kcVPChordStopG_0].UID = 1173; - commands[kcVPChordStopG_0].isHidden = true; - commands[kcVPChordStopG_0].isDummy = false; - commands[kcVPChordStopG_0].Message = "Stop base octave chord G"; - - commands[kcVPChordStopGS0].UID = 1174; - commands[kcVPChordStopGS0].isHidden = true; - commands[kcVPChordStopGS0].isDummy = false; - commands[kcVPChordStopGS0].Message = "Stop base octave chord G#"; - - commands[kcVPChordStopA_1].UID = 1175; - commands[kcVPChordStopA_1].isHidden = true; - commands[kcVPChordStopA_1].isDummy = false; - commands[kcVPChordStopA_1].Message = "Stop base octave +1 chord A"; - - commands[kcVPChordStopAS1].UID = 1176; - commands[kcVPChordStopAS1].isHidden = true; - commands[kcVPChordStopAS1].isDummy = false; - commands[kcVPChordStopAS1].Message = "Stop base octave +1 chord A#"; - - commands[kcVPChordStopB_1].UID = 1177; - commands[kcVPChordStopB_1].isHidden = true; - commands[kcVPChordStopB_1].isDummy = false; - commands[kcVPChordStopB_1].Message = "Stop base octave +1 chord B"; - - commands[kcVPChordStopC_1].UID = 1178; - commands[kcVPChordStopC_1].isHidden = true; - commands[kcVPChordStopC_1].isDummy = false; - commands[kcVPChordStopC_1].Message = "Stop base octave +1 chord C"; - - commands[kcVPChordStopCS1].UID = 1179; - commands[kcVPChordStopCS1].isHidden = true; - commands[kcVPChordStopCS1].isDummy = false; - commands[kcVPChordStopCS1].Message = "Stop base octave +1 chord C#"; - - commands[kcVPChordStopD_1].UID = 1180; - commands[kcVPChordStopD_1].isHidden = true; - commands[kcVPChordStopD_1].isDummy = false; - commands[kcVPChordStopD_1].Message = "Stop base octave +1 chord D"; - - commands[kcVPChordStopDS1].UID = 1181; - commands[kcVPChordStopDS1].isHidden = true; - commands[kcVPChordStopDS1].isDummy = false; - commands[kcVPChordStopDS1].Message = "Stop base octave +1 chord D#"; - - commands[kcVPChordStopE_1].UID = 1182; - commands[kcVPChordStopE_1].isHidden = true; - commands[kcVPChordStopE_1].isDummy = false; - commands[kcVPChordStopE_1].Message = "Stop base octave +1 chord E"; - - commands[kcVPChordStopF_1].UID = 1183; - commands[kcVPChordStopF_1].isHidden = true; - commands[kcVPChordStopF_1].isDummy = false; - commands[kcVPChordStopF_1].Message = "Stop base octave +1 chord F"; - - commands[kcVPChordStopFS1].UID = 1184; - commands[kcVPChordStopFS1].isHidden = true; - commands[kcVPChordStopFS1].isDummy = false; - commands[kcVPChordStopFS1].Message = "Stop base octave +1 chord F#"; - - commands[kcVPChordStopG_1].UID = 1185; - commands[kcVPChordStopG_1].isHidden = true; - commands[kcVPChordStopG_1].isDummy = false; - commands[kcVPChordStopG_1].Message = "Stop base octave +1 chord G"; - - commands[kcVPChordStopGS1].UID = 1186; - commands[kcVPChordStopGS1].isHidden = true; - commands[kcVPChordStopGS1].isDummy = false; - commands[kcVPChordStopGS1].Message = "Stop base octave +1 chord G#"; - - commands[kcVPChordStopA_2].UID = 1187; - commands[kcVPChordStopA_2].isHidden = true; - commands[kcVPChordStopA_2].isDummy = false; - commands[kcVPChordStopA_2].Message = "Stop base octave +2 chord A"; - - commands[kcVPChordStopAS2].UID = 1188; - commands[kcVPChordStopAS2].isHidden = true; - commands[kcVPChordStopAS2].isDummy = false; - commands[kcVPChordStopAS2].Message = "Stop base octave +2 chord A#"; - - commands[kcVPChordStopB_2].UID = 1189; - commands[kcVPChordStopB_2].isHidden = true; - commands[kcVPChordStopB_2].isDummy = false; - commands[kcVPChordStopB_2].Message = "Stop base octave +2 chord B"; - - commands[kcVPChordStopC_2].UID = 1190; - commands[kcVPChordStopC_2].isHidden = true; - commands[kcVPChordStopC_2].isDummy = false; - commands[kcVPChordStopC_2].Message = "Stop base octave +2 chord C"; - - commands[kcVPChordStopCS2].UID = 1191; - commands[kcVPChordStopCS2].isHidden = true; - commands[kcVPChordStopCS2].isDummy = false; - commands[kcVPChordStopCS2].Message = "Stop base octave +2 chord C#"; - - commands[kcVPChordStopD_2].UID = 1192; - commands[kcVPChordStopD_2].isHidden = true; - commands[kcVPChordStopD_2].isDummy = false; - commands[kcVPChordStopD_2].Message = "Stop base octave +2 chord D"; - - commands[kcVPChordStopDS2].UID = 1193; - commands[kcVPChordStopDS2].isHidden = true; - commands[kcVPChordStopDS2].isDummy = false; - commands[kcVPChordStopDS2].Message = "Stop base octave +2 chord D#"; - - commands[kcVPChordStopE_2].UID = 1194; - commands[kcVPChordStopE_2].isHidden = true; - commands[kcVPChordStopE_2].isDummy = false; - commands[kcVPChordStopE_2].Message = "Stop base octave +2 chord E"; - - commands[kcVPChordStopF_2].UID = 1195; - commands[kcVPChordStopF_2].isHidden = true; - commands[kcVPChordStopF_2].isDummy = false; - commands[kcVPChordStopF_2].Message = "Stop base octave +2 chord F"; - - commands[kcVPChordStopFS2].UID = 1196; - commands[kcVPChordStopFS2].isHidden = true; - commands[kcVPChordStopFS2].isDummy = false; - commands[kcVPChordStopFS2].Message = "Stop base octave +2 chord F#"; - - commands[kcVPChordStopG_2].UID = 1197; - commands[kcVPChordStopG_2].isHidden = true; - commands[kcVPChordStopG_2].isDummy = false; - commands[kcVPChordStopG_2].Message = "Stop base octave +2 chord G"; - - commands[kcVPChordStopGS2].UID = 1198; - commands[kcVPChordStopGS2].isHidden = true; - commands[kcVPChordStopGS2].isDummy = false; - commands[kcVPChordStopGS2].Message = "Stop base octave +2 chord G#"; - - commands[kcVPChordStopA_3].UID = 1199; - commands[kcVPChordStopA_3].isHidden = true; - commands[kcVPChordStopA_3].isDummy = false; - commands[kcVPChordStopA_3].Message = "Stop base octave +3 chord A"; - - commands[kcNoteCut].UID = 1200; - commands[kcNoteCut].isHidden = false; - commands[kcNoteCut].isDummy = false; - commands[kcNoteCut].Message = "Note Cut"; - - commands[kcNoteOff].UID = 1201; - commands[kcNoteOff].isHidden = false; - commands[kcNoteOff].isDummy = false; - commands[kcNoteOff].Message = "Note Off"; - - commands[kcSetIns0].UID = 1202; - commands[kcSetIns0].isHidden = false; - commands[kcSetIns0].isDummy = false; - commands[kcSetIns0].Message = "Set instrument digit 0"; - - commands[kcSetIns1].UID = 1203; - commands[kcSetIns1].isHidden = false; - commands[kcSetIns1].isDummy = false; - commands[kcSetIns1].Message = "Set instrument digit 1"; - - commands[kcSetIns2].UID = 1204; - commands[kcSetIns2].isHidden = false; - commands[kcSetIns2].isDummy = false; - commands[kcSetIns2].Message = "Set instrument digit 2"; - - commands[kcSetIns3].UID = 1205; - commands[kcSetIns3].isHidden = false; - commands[kcSetIns3].isDummy = false; - commands[kcSetIns3].Message = "Set instrument digit 3"; - - commands[kcSetIns4].UID = 1206; - commands[kcSetIns4].isHidden = false; - commands[kcSetIns4].isDummy = false; - commands[kcSetIns4].Message = "Set instrument digit 4"; - - commands[kcSetIns5].UID = 1207; - commands[kcSetIns5].isHidden = false; - commands[kcSetIns5].isDummy = false; - commands[kcSetIns5].Message = "Set instrument digit 5"; - - commands[kcSetIns6].UID = 1208; - commands[kcSetIns6].isHidden = false; - commands[kcSetIns6].isDummy = false; - commands[kcSetIns6].Message = "Set instrument digit 6"; - - commands[kcSetIns7].UID = 1209; - commands[kcSetIns7].isHidden = false; - commands[kcSetIns7].isDummy = false; - commands[kcSetIns7].Message = "Set instrument digit 7"; - - commands[kcSetIns8].UID = 1210; - commands[kcSetIns8].isHidden = false; - commands[kcSetIns8].isDummy = false; - commands[kcSetIns8].Message = "Set instrument digit 8"; - - commands[kcSetIns9].UID = 1211; - commands[kcSetIns9].isHidden = false; - commands[kcSetIns9].isDummy = false; - commands[kcSetIns9].Message = "Set instrument digit 9"; - - commands[kcSetOctave0].UID = 1212; - commands[kcSetOctave0].isHidden = false; - commands[kcSetOctave0].isDummy = false; - commands[kcSetOctave0].Message = "Set octave 0"; - - commands[kcSetOctave1].UID = 1213; - commands[kcSetOctave1].isHidden = false; - commands[kcSetOctave1].isDummy = false; - commands[kcSetOctave1].Message = "Set octave 1"; - - commands[kcSetOctave2].UID = 1214; - commands[kcSetOctave2].isHidden = false; - commands[kcSetOctave2].isDummy = false; - commands[kcSetOctave2].Message = "Set octave 2"; - - commands[kcSetOctave3].UID = 1215; - commands[kcSetOctave3].isHidden = false; - commands[kcSetOctave3].isDummy = false; - commands[kcSetOctave3].Message = "Set octave 3"; - - commands[kcSetOctave4].UID = 1216; - commands[kcSetOctave4].isHidden = false; - commands[kcSetOctave4].isDummy = false; - commands[kcSetOctave4].Message = "Set octave 4"; - - commands[kcSetOctave5].UID = 1217; - commands[kcSetOctave5].isHidden = false; - commands[kcSetOctave5].isDummy = false; - commands[kcSetOctave5].Message = "Set octave 5"; - - commands[kcSetOctave6].UID = 1218; - commands[kcSetOctave6].isHidden = false; - commands[kcSetOctave6].isDummy = false; - commands[kcSetOctave6].Message = "Set octave 6"; - - commands[kcSetOctave7].UID = 1219; - commands[kcSetOctave7].isHidden = false; - commands[kcSetOctave7].isDummy = false; - commands[kcSetOctave7].Message = "Set octave 7"; - - commands[kcSetOctave8].UID = 1220; - commands[kcSetOctave8].isHidden = false; - commands[kcSetOctave8].isDummy = false; - commands[kcSetOctave8].Message = "Set octave 8"; - - commands[kcSetOctave9].UID = 1221; - commands[kcSetOctave9].isHidden = false; - commands[kcSetOctave9].isDummy = false; - commands[kcSetOctave9].Message = "Set octave 9"; - - commands[kcSetVolume0].UID = 1222; - commands[kcSetVolume0].isHidden = false; - commands[kcSetVolume0].isDummy = false; - commands[kcSetVolume0].Message = "Set volume digit 0"; - - commands[kcSetVolume1].UID = 1223; - commands[kcSetVolume1].isHidden = false; - commands[kcSetVolume1].isDummy = false; - commands[kcSetVolume1].Message = "Set volume digit 1"; - - commands[kcSetVolume2].UID = 1224; - commands[kcSetVolume2].isHidden = false; - commands[kcSetVolume2].isDummy = false; - commands[kcSetVolume2].Message = "Set volume digit 2"; - - commands[kcSetVolume3].UID = 1225; - commands[kcSetVolume3].isHidden = false; - commands[kcSetVolume3].isDummy = false; - commands[kcSetVolume3].Message = "Set volume digit 3"; - - commands[kcSetVolume4].UID = 1226; - commands[kcSetVolume4].isHidden = false; - commands[kcSetVolume4].isDummy = false; - commands[kcSetVolume4].Message = "Set volume digit 4"; - - commands[kcSetVolume5].UID = 1227; - commands[kcSetVolume5].isHidden = false; - commands[kcSetVolume5].isDummy = false; - commands[kcSetVolume5].Message = "Set volume digit 5"; - - commands[kcSetVolume6].UID = 1228; - commands[kcSetVolume6].isHidden = false; - commands[kcSetVolume6].isDummy = false; - commands[kcSetVolume6].Message = "Set volume digit 6"; - - commands[kcSetVolume7].UID = 1229; - commands[kcSetVolume7].isHidden = false; - commands[kcSetVolume7].isDummy = false; - commands[kcSetVolume7].Message = "Set volume digit 7"; - - commands[kcSetVolume8].UID = 1230; - commands[kcSetVolume8].isHidden = false; - commands[kcSetVolume8].isDummy = false; - commands[kcSetVolume8].Message = "Set volume digit 8"; - - commands[kcSetVolume9].UID = 1231; - commands[kcSetVolume9].isHidden = false; - commands[kcSetVolume9].isDummy = false; - commands[kcSetVolume9].Message = "Set volume digit 9"; - - commands[kcSetVolumeVol].UID = 1232; - commands[kcSetVolumeVol].isHidden = false; - commands[kcSetVolumeVol].isDummy = false; - commands[kcSetVolumeVol].Message = "Vol command - volume"; - - commands[kcSetVolumePan].UID = 1233; - commands[kcSetVolumePan].isHidden = false; - commands[kcSetVolumePan].isDummy = false; - commands[kcSetVolumePan].Message = "Vol command - pan"; - - commands[kcSetVolumeVolSlideUp].UID = 1234; - commands[kcSetVolumeVolSlideUp].isHidden = false; - commands[kcSetVolumeVolSlideUp].isDummy = false; - commands[kcSetVolumeVolSlideUp].Message = "Vol command - vol slide up"; - - commands[kcSetVolumeVolSlideDown].UID = 1235; - commands[kcSetVolumeVolSlideDown].isHidden = false; - commands[kcSetVolumeVolSlideDown].isDummy = false; - commands[kcSetVolumeVolSlideDown].Message = "Vol command - vol slide down"; - - commands[kcSetVolumeFineVolUp].UID = 1236; - commands[kcSetVolumeFineVolUp].isHidden = false; - commands[kcSetVolumeFineVolUp].isDummy = false; - commands[kcSetVolumeFineVolUp].Message = "Vol command - vol fine slide up"; - - commands[kcSetVolumeFineVolDown].UID = 1237; - commands[kcSetVolumeFineVolDown].isHidden = false; - commands[kcSetVolumeFineVolDown].isDummy = false; - commands[kcSetVolumeFineVolDown].Message = "Vol command - vol fine slide down"; - - commands[kcSetVolumeVibratoSpd].UID = 1238; - commands[kcSetVolumeVibratoSpd].isHidden = false; - commands[kcSetVolumeVibratoSpd].isDummy = false; - commands[kcSetVolumeVibratoSpd].Message = "Vol command - vibrato speed"; - - commands[kcSetVolumeVibrato].UID = 1239; - commands[kcSetVolumeVibrato].isHidden = false; - commands[kcSetVolumeVibrato].isDummy = false; - commands[kcSetVolumeVibrato].Message = "Vol command - vibrato"; - - commands[kcSetVolumeXMPanLeft].UID = 1240; - commands[kcSetVolumeXMPanLeft].isHidden = false; - commands[kcSetVolumeXMPanLeft].isDummy = false; - commands[kcSetVolumeXMPanLeft].Message = "Vol command - XM pan left"; - - commands[kcSetVolumeXMPanRight].UID = 1241; - commands[kcSetVolumeXMPanRight].isHidden = false; - commands[kcSetVolumeXMPanRight].isDummy = false; - commands[kcSetVolumeXMPanRight].Message = "Vol command - XM pan right"; - - commands[kcSetVolumePortamento].UID = 1242; - commands[kcSetVolumePortamento].isHidden = false; - commands[kcSetVolumePortamento].isDummy = false; - commands[kcSetVolumePortamento].Message = "Vol command - Portamento"; - - commands[kcSetVolumeITPortaUp].UID = 1243; - commands[kcSetVolumeITPortaUp].isHidden = false; - commands[kcSetVolumeITPortaUp].isDummy = false; - commands[kcSetVolumeITPortaUp].Message = "Vol command - Portamento Up"; - - commands[kcSetVolumeITPortaDown].UID = 1244; - commands[kcSetVolumeITPortaDown].isHidden = false; - commands[kcSetVolumeITPortaDown].isDummy = false; - commands[kcSetVolumeITPortaDown].Message = "Vol command - Portamento Down"; - - commands[kcSetVolumeITUnused].UID = 1245; - commands[kcSetVolumeITUnused].isHidden = true; - commands[kcSetVolumeITUnused].isDummy = false; - commands[kcSetVolumeITUnused].Message = "Vol command - Unused"; - - commands[kcSetVolumeITOffset].UID = 1246; - commands[kcSetVolumeITOffset].isHidden = false; - commands[kcSetVolumeITOffset].isDummy = false; - commands[kcSetVolumeITOffset].Message = "Vol command - Offset"; - - commands[kcSetFXParam0].UID = 1247; - commands[kcSetFXParam0].isHidden = false; - commands[kcSetFXParam0].isDummy = false; - commands[kcSetFXParam0].Message = "FX Param digit 0"; - - commands[kcSetFXParam1].UID = 1248; - commands[kcSetFXParam1].isHidden = false; - commands[kcSetFXParam1].isDummy = false; - commands[kcSetFXParam1].Message = "FX Param digit 1"; - - commands[kcSetFXParam2].UID = 1249; - commands[kcSetFXParam2].isHidden = false; - commands[kcSetFXParam2].isDummy = false; - commands[kcSetFXParam2].Message = "FX Param digit 2"; - - commands[kcSetFXParam3].UID = 1250; - commands[kcSetFXParam3].isHidden = false; - commands[kcSetFXParam3].isDummy = false; - commands[kcSetFXParam3].Message = "FX Param digit 3"; - - commands[kcSetFXParam4].UID = 1251; - commands[kcSetFXParam4].isHidden = false; - commands[kcSetFXParam4].isDummy = false; - commands[kcSetFXParam4].Message = "FX Param digit 4"; - - commands[kcSetFXParam5].UID = 1252; - commands[kcSetFXParam5].isHidden = false; - commands[kcSetFXParam5].isDummy = false; - commands[kcSetFXParam5].Message = "FX Param digit 5"; - - commands[kcSetFXParam6].UID = 1253; - commands[kcSetFXParam6].isHidden = false; - commands[kcSetFXParam6].isDummy = false; - commands[kcSetFXParam6].Message = "FX Param digit 6"; - - commands[kcSetFXParam7].UID = 1254; - commands[kcSetFXParam7].isHidden = false; - commands[kcSetFXParam7].isDummy = false; - commands[kcSetFXParam7].Message = "FX Param digit 7"; - - commands[kcSetFXParam8].UID = 1255; - commands[kcSetFXParam8].isHidden = false; - commands[kcSetFXParam8].isDummy = false; - commands[kcSetFXParam8].Message = "FX Param digit 8"; - - commands[kcSetFXParam9].UID = 1256; - commands[kcSetFXParam9].isHidden = false; - commands[kcSetFXParam9].isDummy = false; - commands[kcSetFXParam9].Message = "FX Param digit 9"; - - commands[kcSetFXParamA].UID = 1257; - commands[kcSetFXParamA].isHidden = false; - commands[kcSetFXParamA].isDummy = false; - commands[kcSetFXParamA].Message = "FX Param digit A"; - - commands[kcSetFXParamB].UID = 1258; - commands[kcSetFXParamB].isHidden = false; - commands[kcSetFXParamB].isDummy = false; - commands[kcSetFXParamB].Message = "FX Param digit B"; - - commands[kcSetFXParamC].UID = 1259; - commands[kcSetFXParamC].isHidden = false; - commands[kcSetFXParamC].isDummy = false; - commands[kcSetFXParamC].Message = "FX Param digit C"; - - commands[kcSetFXParamD].UID = 1260; - commands[kcSetFXParamD].isHidden = false; - commands[kcSetFXParamD].isDummy = false; - commands[kcSetFXParamD].Message = "FX Param digit D"; - - commands[kcSetFXParamE].UID = 1261; - commands[kcSetFXParamE].isHidden = false; - commands[kcSetFXParamE].isDummy = false; - commands[kcSetFXParamE].Message = "FX Param digit E"; - - commands[kcSetFXParamF].UID = 1262; - commands[kcSetFXParamF].isHidden = false; - commands[kcSetFXParamF].isDummy = false; - commands[kcSetFXParamF].Message = "FX Param digit F"; - - commands[kcSetFXarp].UID = 1263; - commands[kcSetFXarp].isHidden = true; - commands[kcSetFXarp].isDummy = false; - commands[kcSetFXarp].Message = "FX arpeggio"; - - commands[kcSetFXportUp].UID = 1264; - commands[kcSetFXportUp].isHidden = true; - commands[kcSetFXportUp].isDummy = false; - commands[kcSetFXportUp].Message = "FX portamentao Up"; - - commands[kcSetFXportDown].UID = 1265; - commands[kcSetFXportDown].isHidden = true; - commands[kcSetFXportDown].isDummy = false; - commands[kcSetFXportDown].Message = "FX portamentao Down"; - - commands[kcSetFXport].UID = 1266; - commands[kcSetFXport].isHidden = true; - commands[kcSetFXport].isDummy = false; - commands[kcSetFXport].Message = "FX portamentao"; - - commands[kcSetFXvibrato].UID = 1267; - commands[kcSetFXvibrato].isHidden = true; - commands[kcSetFXvibrato].isDummy = false; - commands[kcSetFXvibrato].Message = "FX vibrato"; - - commands[kcSetFXportSlide].UID = 1268; - commands[kcSetFXportSlide].isHidden = true; - commands[kcSetFXportSlide].isDummy = false; - commands[kcSetFXportSlide].Message = "FX portamento slide"; - - commands[kcSetFXvibSlide].UID = 1269; - commands[kcSetFXvibSlide].isHidden = true; - commands[kcSetFXvibSlide].isDummy = false; - commands[kcSetFXvibSlide].Message = "FX vibrato slide"; - - commands[kcSetFXtremolo].UID = 1270; - commands[kcSetFXtremolo].isHidden = true; - commands[kcSetFXtremolo].isDummy = false; - commands[kcSetFXtremolo].Message = "FX tremolo"; - - commands[kcSetFXpan].UID = 1271; - commands[kcSetFXpan].isHidden = true; - commands[kcSetFXpan].isDummy = false; - commands[kcSetFXpan].Message = "FX pan"; - - commands[kcSetFXoffset].UID = 1272; - commands[kcSetFXoffset].isHidden = true; - commands[kcSetFXoffset].isDummy = false; - commands[kcSetFXoffset].Message = "FX offset"; - - commands[kcSetFXvolSlide].UID = 1273; - commands[kcSetFXvolSlide].isHidden = true; - commands[kcSetFXvolSlide].isDummy = false; - commands[kcSetFXvolSlide].Message = "FX Volume slide"; - - commands[kcSetFXgotoOrd].UID = 1274; - commands[kcSetFXgotoOrd].isHidden = true; - commands[kcSetFXgotoOrd].isDummy = false; - commands[kcSetFXgotoOrd].Message = "FX go to order"; - - commands[kcSetFXsetVol].UID = 1275; - commands[kcSetFXsetVol].isHidden = true; - commands[kcSetFXsetVol].isDummy = false; - commands[kcSetFXsetVol].Message = "FX set volume"; - - commands[kcSetFXgotoRow].UID = 1276; - commands[kcSetFXgotoRow].isHidden = true; - commands[kcSetFXgotoRow].isDummy = false; - commands[kcSetFXgotoRow].Message = "FX go to row"; - - commands[kcSetFXretrig].UID = 1277; - commands[kcSetFXretrig].isHidden = true; - commands[kcSetFXretrig].isDummy = false; - commands[kcSetFXretrig].Message = "FX retrigger"; - - commands[kcSetFXspeed].UID = 1278; - commands[kcSetFXspeed].isHidden = true; - commands[kcSetFXspeed].isDummy = false; - commands[kcSetFXspeed].Message = "FX set speed"; - - commands[kcSetFXtempo].UID = 1279; - commands[kcSetFXtempo].isHidden = true; - commands[kcSetFXtempo].isDummy = false; - commands[kcSetFXtempo].Message = "FX set tempo"; - - commands[kcSetFXtremor].UID = 1280; - commands[kcSetFXtremor].isHidden = true; - commands[kcSetFXtremor].isDummy = false; - commands[kcSetFXtremor].Message = "FX tremor"; - - commands[kcSetFXextendedMOD].UID = 1281; - commands[kcSetFXextendedMOD].isHidden = true; - commands[kcSetFXextendedMOD].isDummy = false; - commands[kcSetFXextendedMOD].Message = "FX extended MOD cmds"; - - commands[kcSetFXextendedS3M].UID = 1282; - commands[kcSetFXextendedS3M].isHidden = true; - commands[kcSetFXextendedS3M].isDummy = false; - commands[kcSetFXextendedS3M].Message = "FX extended S3M cmds"; - - commands[kcSetFXchannelVol].UID = 1283; - commands[kcSetFXchannelVol].isHidden = true; - commands[kcSetFXchannelVol].isDummy = false; - commands[kcSetFXchannelVol].Message = "FX set channel vol"; - - commands[kcSetFXchannelVols].UID = 1284; - commands[kcSetFXchannelVols].isHidden = true; - commands[kcSetFXchannelVols].isDummy = false; - commands[kcSetFXchannelVols].Message = "FX channel vol slide"; - - commands[kcSetFXglobalVol].UID = 1285; - commands[kcSetFXglobalVol].isHidden = true; - commands[kcSetFXglobalVol].isDummy = false; - commands[kcSetFXglobalVol].Message = "FX set global volume"; - - commands[kcSetFXglobalVols].UID = 1286; - commands[kcSetFXglobalVols].isHidden = true; - commands[kcSetFXglobalVols].isDummy = false; - commands[kcSetFXglobalVols].Message = "FX global volume slide"; - - commands[kcSetFXkeyoff].UID = 1287; - commands[kcSetFXkeyoff].isHidden = true; - commands[kcSetFXkeyoff].isDummy = false; - commands[kcSetFXkeyoff].Message = "FX Some XM Command :D"; - - commands[kcSetFXfineVib].UID = 1288; - commands[kcSetFXfineVib].isHidden = true; - commands[kcSetFXfineVib].isDummy = false; - commands[kcSetFXfineVib].Message = "FX fine vibrato"; - - commands[kcSetFXpanbrello].UID = 1289; - commands[kcSetFXpanbrello].isHidden = true; - commands[kcSetFXpanbrello].isDummy = false; - commands[kcSetFXpanbrello].Message = "FX set panbrello"; - - commands[kcSetFXextendedXM].UID = 1290; - commands[kcSetFXextendedXM].isHidden = true; - commands[kcSetFXextendedXM].isDummy = false; - commands[kcSetFXextendedXM].Message = "FX extended XM effects "; - - commands[kcSetFXpanSlide].UID = 1291; - commands[kcSetFXpanSlide].isHidden = true; - commands[kcSetFXpanSlide].isDummy = false; - commands[kcSetFXpanSlide].Message = "FX pan slide"; - - commands[kcSetFXsetEnvPos].UID = 1292; - commands[kcSetFXsetEnvPos].isHidden = true; - commands[kcSetFXsetEnvPos].isDummy = false; - commands[kcSetFXsetEnvPos].Message = "FX set envelope position (XM only)"; - - commands[kcSetFXmacro].UID = 1293; - commands[kcSetFXmacro].isHidden = true; - commands[kcSetFXmacro].isDummy = false; - commands[kcSetFXmacro].Message = "FX midi macro"; - - commands[kcSetFXmacroSlide].UID = 1294; - commands[kcSetFXmacroSlide].isHidden = false; - commands[kcSetFXmacroSlide].isDummy = false; - commands[kcSetFXmacroSlide].Message = "FX midi macro slide"; - - commands[kcSetFXdelaycut].UID = 1295; - commands[kcSetFXdelaycut].isHidden = false; - commands[kcSetFXdelaycut].isDummy = false; - commands[kcSetFXdelaycut].Message = "FX combined note delay and note cut"; - - commands[kcPatternJumpDownh1Select].UID = 1296; - commands[kcPatternJumpDownh1Select].isHidden = true; - commands[kcPatternJumpDownh1Select].isDummy = false; - commands[kcPatternJumpDownh1Select].Message = "kcPatternJumpDownh1Select"; - - commands[kcPatternJumpUph1Select].UID = 1297; - commands[kcPatternJumpUph1Select].isHidden = true; - commands[kcPatternJumpUph1Select].isDummy = false; - commands[kcPatternJumpUph1Select].Message = "kcPatternJumpUph1Select"; - - commands[kcPatternSnapDownh1Select].UID = 1298; - commands[kcPatternSnapDownh1Select].isHidden = true; - commands[kcPatternSnapDownh1Select].isDummy = false; - commands[kcPatternSnapDownh1Select].Message = "kcPatternSnapDownh1Select"; - - commands[kcPatternSnapUph1Select].UID = 1299; - commands[kcPatternSnapUph1Select].isHidden = true; - commands[kcPatternSnapUph1Select].isDummy = false; - commands[kcPatternSnapUph1Select].Message = "kcPatternSnapUph1Select"; - - commands[kcNavigateDownSelect].UID = 1300; - commands[kcNavigateDownSelect].isHidden = true; - commands[kcNavigateDownSelect].isDummy = false; - commands[kcNavigateDownSelect].Message = "kcNavigateDownSelect"; - - commands[kcNavigateUpSelect].UID = 1301; - commands[kcNavigateUpSelect].isHidden = true; - commands[kcNavigateUpSelect].isDummy = false; - commands[kcNavigateUpSelect].Message = "kcNavigateUpSelect"; - - commands[kcNavigateLeftSelect].UID = 1302; - commands[kcNavigateLeftSelect].isHidden = true; - commands[kcNavigateLeftSelect].isDummy = false; - commands[kcNavigateLeftSelect].Message = "kcNavigateLeftSelect"; - - commands[kcNavigateRightSelect].UID = 1303; - commands[kcNavigateRightSelect].isHidden = true; - commands[kcNavigateRightSelect].isDummy = false; - commands[kcNavigateRightSelect].Message = "kcNavigateRightSelect"; - - commands[kcNavigateNextChanSelect].UID = 1304; - commands[kcNavigateNextChanSelect].isHidden = true; - commands[kcNavigateNextChanSelect].isDummy = false; - commands[kcNavigateNextChanSelect].Message = "kcNavigateNextChanSelect"; - - commands[kcNavigatePrevChanSelect].UID = 1305; - commands[kcNavigatePrevChanSelect].isHidden = true; - commands[kcNavigatePrevChanSelect].isDummy = false; - commands[kcNavigatePrevChanSelect].Message = "kcNavigatePrevChanSelect"; - - commands[kcHomeHorizontalSelect].UID = 1306; - commands[kcHomeHorizontalSelect].isHidden = true; - commands[kcHomeHorizontalSelect].isDummy = false; - commands[kcHomeHorizontalSelect].Message = "kcHomeHorizontalSelect"; - - commands[kcHomeVerticalSelect].UID = 1307; - commands[kcHomeVerticalSelect].isHidden = true; - commands[kcHomeVerticalSelect].isDummy = false; - commands[kcHomeVerticalSelect].Message = "kcHomeVerticalSelect"; - - commands[kcHomeAbsoluteSelect].UID = 1308; - commands[kcHomeAbsoluteSelect].isHidden = true; - commands[kcHomeAbsoluteSelect].isDummy = false; - commands[kcHomeAbsoluteSelect].Message = "kcHomeAbsoluteSelect"; - - commands[kcEndHorizontalSelect].UID = 1309; - commands[kcEndHorizontalSelect].isHidden = true; - commands[kcEndHorizontalSelect].isDummy = false; - commands[kcEndHorizontalSelect].Message = "kcEndH... [truncated message content] |
From: <sag...@us...> - 2010-08-06 18:33:12
|
Revision: 679 http://modplug.svn.sourceforge.net/modplug/?rev=679&view=rev Author: saga-games Date: 2010-08-06 18:33:04 +0000 (Fri, 06 Aug 2010) Log Message: ----------- [Fix] Comments Tab: Editing a sample/instrument name didn't mark the module as modified (tx djmakas) [Imp] Improved algorithm for finding a free channel for note playback in the editor. Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/view_com.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2010-08-06 15:28:31 UTC (rev 678) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2010-08-06 18:33:04 UTC (rev 679) @@ -1676,7 +1676,7 @@ void CModDoc::OnFileMidiConvert() -//------------------------------------- +//------------------------------- { CHAR path[_MAX_PATH]="", drive[_MAX_DRIVE]=""; CHAR s[_MAX_PATH], fname[_MAX_FNAME]=""; @@ -3526,21 +3526,20 @@ UINT CModDoc::FindAvailableChannel() //---------------------------------- { + CHANNELINDEX nStoppedChannel = CHANNELINDEX_INVALID; // Search for available channel for (CHANNELINDEX j = m_SndFile.m_nChannels; j < MAX_CHANNELS; j++) { MODCHANNEL *p = &m_SndFile.Chn[j]; if (!p->nLength) return j; + else if(p->dwFlags & CHN_NOTEFADE) + nStoppedChannel = j; } - // Not found: look for one that's stopped - for (CHANNELINDEX j = m_SndFile.m_nChannels; j < MAX_CHANNELS; j++) - { - MODCHANNEL *p = &m_SndFile.Chn[j]; - if (p->dwFlags & CHN_NOTEFADE) - return j; - } + // Nothing found: return one that's stopped + if(nStoppedChannel != CHANNELINDEX_INVALID) + return nStoppedChannel; //Last resort: go for first virutal channel. return m_SndFile.m_nChannels; @@ -3588,7 +3587,7 @@ CString message; message.Format("Param %d can now be controlled with macro %X", paramToUse, macroToSet); - ::MessageBox(NULL,message, "Macro assigned for this param",MB_ICONINFORMATION | MB_OK); + ::MessageBox(NULL, message, "Macro assigned for this param",MB_ICONINFORMATION | MB_OK); return; } @@ -3599,20 +3598,20 @@ CModTypeDlg dlg(GetSoundFile(), CMainFrame::GetMainFrame()); if (dlg.DoModal() == IDOK) { - BOOL bShowLog = FALSE; + bool bShowLog = false; ClearLog(); if(dlg.m_nType) { if (!ChangeModType(dlg.m_nType)) return; - bShowLog = TRUE; + bShowLog = true; } UINT nNewChannels = CLAMP(dlg.m_nChannels, m_SndFile.GetModSpecifications().channelsMin, m_SndFile.GetModSpecifications().channelsMax); - if (nNewChannels != GetSoundFile()->m_nChannels) + if (nNewChannels != GetSoundFile()->GetNumChannels()) { const bool showCancelInRemoveDlg = m_SndFile.GetModSpecifications().channelsMax >= m_SndFile.GetNumChannels(); - if(ChangeNumChannels(nNewChannels, showCancelInRemoveDlg)) bShowLog = TRUE; + if(ChangeNumChannels(nNewChannels, showCancelInRemoveDlg)) bShowLog = true; } if (bShowLog) ShowLog("Conversion Status", CMainFrame::GetMainFrame()); Modified: trunk/OpenMPT/mptrack/view_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/view_com.cpp 2010-08-06 15:28:31 UTC (rev 678) +++ trunk/OpenMPT/mptrack/view_com.cpp 2010-08-06 18:33:04 UTC (rev 679) @@ -500,6 +500,7 @@ SetNullTerminator(pSndFile->m_szNames[iItem + 1]); // 05/01/05 : ericus replaced "<< 24" by "<< 20" : 4000 samples -> 12bits [see Moddoc.h] pModDoc->UpdateAllViews(this, ((iItem + 1) << HINT_SHIFT_SMP) | (HINT_SMPNAMES|HINT_SAMPLEINFO), this); + pModDoc->SetModified(); } } else if (m_nListId == IDC_LIST_INSTRUMENTS) @@ -510,6 +511,7 @@ memcpy(pIns->name, s, sizeof(pIns->name)); SetNullTerminator(pIns->name); pModDoc->UpdateAllViews(this, ((iItem + 1) << HINT_SHIFT_INS) | (HINT_INSNAMES|HINT_INSTRUMENT), this); + pModDoc->SetModified(); } } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-08-09 20:38:44
|
Revision: 682 http://modplug.svn.sourceforge.net/modplug/?rev=682&view=rev Author: saga-games Date: 2010-08-09 20:38:37 +0000 (Mon, 09 Aug 2010) Log Message: ----------- [Imp] Added keyboard shortcut for the panic button. [Ref] Moved panic button code to CModDoc. Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2010-08-09 14:30:17 UTC (rev 681) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2010-08-09 20:38:37 UTC (rev 682) @@ -598,6 +598,7 @@ DefineKeyCommand(kcInsNoteMapEditSample, 1849, kcVisible, kcNoDummy, _T("Edit current sample")); DefineKeyCommand(kcInsNoteMapEditSampleMap, 1850, kcVisible, kcNoDummy, _T("Edit sample map")); DefineKeyCommand(kcInstrumentCtrlDuplicate, 1851, kcVisible, kcNoDummy, _T("Duplicate instrument")); + DefineKeyCommand(kcPanic, 1852, kcVisible, kcNoDummy, _T("Panic")); // Add new key commands here. #ifdef _DEBUG Modified: trunk/OpenMPT/mptrack/CommandSet.h =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h 2010-08-09 14:30:17 UTC (rev 681) +++ trunk/OpenMPT/mptrack/CommandSet.h 2010-08-09 20:38:37 UTC (rev 682) @@ -74,6 +74,7 @@ kcPlaySongFromCursor, kcPlayPatternFromStart, kcPlayPatternFromCursor, + kcPanic, kcEstimateSongLength, kcApproxRealBPM, kcMidiRecord, Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2010-08-09 14:30:17 UTC (rev 681) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2010-08-09 20:38:37 UTC (rev 682) @@ -2705,14 +2705,9 @@ void CMainFrame::OnPanic() //------------------------ { - // Panic button. At the moment, it just resets all VSTi and sample notes. - if(m_pModPlaying && m_pModPlaying->GetSoundFile()) - { - BEGIN_CRITICAL(); - m_pModPlaying->GetSoundFile()->ResetChannels(); - m_pModPlaying->GetSoundFile()->StopAllVsti(); - END_CRITICAL(); - } + // "Panic button." At the moment, it just resets all VSTi and sample notes. + if(m_pModPlaying) + m_pModPlaying->OnPanic(); } Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2010-08-09 14:30:17 UTC (rev 681) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2010-08-09 20:38:37 UTC (rev 682) @@ -3447,6 +3447,7 @@ case kcPlaySongFromStart: OnPlayerPlayFromStart(); break; case kcPlayPauseSong: OnPlayerPlay(); break; case kcStopSong: OnPlayerStop(); break; + case kcPanic: OnPanic(); break; // case kcPauseSong: OnPlayerPause(); break; @@ -3690,9 +3691,20 @@ } void CModDoc::SafeFileClose() -//-------------------------- +//--------------------------- { // Verify that the main window has the focus. This saves us a lot of trouble because active dialogs normally don't check if their pSndFile pointers are still valid. if(GetActiveWindow() == CMainFrame::GetMainFrame()->m_hWnd) OnFileClose(); +} + + +// "Panic button". At the moment, it just resets all VSTi and sample notes. +void CModDoc::OnPanic() +//--------------------- +{ + BEGIN_CRITICAL(); + m_SndFile.ResetChannels(); + m_SndFile.StopAllVsti(); + END_CRITICAL(); } \ No newline at end of file Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2010-08-09 14:30:17 UTC (rev 681) +++ trunk/OpenMPT/mptrack/Moddoc.h 2010-08-09 20:38:37 UTC (rev 682) @@ -356,6 +356,7 @@ afx_msg void OnPlayerStop(); afx_msg void OnPlayerPause(); afx_msg void OnPlayerPlayFromStart(); + afx_msg void OnPanic(); afx_msg void OnEditGlobals(); afx_msg void OnEditPatterns(); afx_msg void OnEditSamples(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-08-12 16:12:55
|
Revision: 686 http://modplug.svn.sourceforge.net/modplug/?rev=686&view=rev Author: saga-games Date: 2010-08-12 16:12:48 +0000 (Thu, 12 Aug 2010) Log Message: ----------- [Imp] Mod Savers: Garbage characters following the trailing null char in sample/instrument/song names are now removed before saving, so they don't turn up in the saved modules anymore (happened sometimes). Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/misc_util.h Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2010-08-12 12:39:51 UTC (rev 685) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2010-08-12 16:12:48 UTC (rev 686) @@ -93,7 +93,7 @@ CModDoc::CModDoc() //---------------- { - m_bHasValidPath=false; + m_bHasValidPath = false; m_bPaused = TRUE; m_lpszLog = NULL; m_hWndFollow = NULL; @@ -425,6 +425,7 @@ } BeginWaitCursor(); ClearLog(); + FixNullStrings(); switch(nType) { case MOD_TYPE_MOD: bOk = m_SndFile.SaveMod(lpszPathName, dwPacking); break; @@ -1760,6 +1761,7 @@ if(files.abort) return; ClearLog(); + FixNullStrings(); switch (type) { case MOD_TYPE_MOD: @@ -3707,4 +3709,43 @@ m_SndFile.ResetChannels(); m_SndFile.StopAllVsti(); END_CRITICAL(); +} + + +// Before saving, make sure that every char after the terminating null char is also null. +// Else, garbage might end up in various text strings that wasn't supposed to be there. +void CModDoc::FixNullStrings() +//---------------------------- +{ + // Song title + FixNullString(m_SndFile.m_szNames[0]); + + // Sample names + filenames + for(SAMPLEINDEX nSmp = 1; nSmp < m_SndFile.GetNumSamples(); nSmp++) + { + FixNullString(m_SndFile.m_szNames[nSmp]); + FixNullString(m_SndFile.Samples[nSmp].filename); + } + + // Instrument names + for(INSTRUMENTINDEX nIns = 1; nIns < m_SndFile.GetNumInstruments(); nIns++) + { + if(m_SndFile.Instruments[nIns] != nullptr) + { + FixNullString(m_SndFile.Instruments[nIns]->name); + FixNullString(m_SndFile.Instruments[nIns]->filename); + } + } + + // Channel names + for(CHANNELINDEX nChn = 0; nChn < m_SndFile.GetNumChannels(); nChn++) + { + FixNullString(m_SndFile.ChnSettings[nChn].szName); + } + + // Pattern names + // Halp, this is currently not possible. Is it even needed? + + // Sequence names. + // Not needed? } \ No newline at end of file Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2010-08-12 12:39:51 UTC (rev 685) +++ trunk/OpenMPT/mptrack/Moddoc.h 2010-08-12 16:12:48 UTC (rev 686) @@ -291,6 +291,8 @@ bool HasMPTHacks(bool autofix = false); + void FixNullStrings(); + bool m_bHasValidPath; //becomes true if document is loaded or saved. // Fix: save pattern scrollbar position when switching to other tab CSize GetOldPatternScrollbarsPos() const { return m_szOldPatternScrollbarsPos; }; Modified: trunk/OpenMPT/mptrack/misc_util.h =================================================================== --- trunk/OpenMPT/mptrack/misc_util.h 2010-08-12 12:39:51 UTC (rev 685) +++ trunk/OpenMPT/mptrack/misc_util.h 2010-08-12 16:12:48 UTC (rev 686) @@ -103,13 +103,16 @@ // If the source and destination arrays overlap, behaviour is undefined. template <class T> void ArrayCopy(T* pDst, const T* pSrc, const size_t n) +//---------------------------------------------------- { utilImpl::ArrayCopyImpl<std::tr1::has_trivial_assign<T>::value>::Do(pDst, pSrc, n); } + // Sanitize a filename (remove special chars) template <size_t size> inline void SanitizeFilename(char (&buffer)[size]) +//------------------------------------------------ { STATIC_ASSERT(size > 0); for(size_t i = 0; i < size; i++) @@ -132,9 +135,11 @@ } } + // Convert a 0-terminated string to a space-padded string template <size_t size> void NullToSpaceString(char (&buffer)[size]) +//------------------------------------------ { STATIC_ASSERT(size > 0); size_t pos = size; @@ -143,9 +148,12 @@ buffer[pos] = 32; buffer[size - 1] = 0; } + + // Convert a space-padded string to a 0-terminated string template <size_t size> void SpaceToNullString(char (&buffer)[size]) +//------------------------------------------ { STATIC_ASSERT(size > 0); // First, remove any Nulls @@ -161,6 +169,24 @@ buffer[size - 1] = 0; } + +// Remove any chars after the first null char +template <size_t size> +void FixNullString(char (&buffer)[size]) +//-------------------------------------- +{ + STATIC_ASSERT(size > 0); + bool overwrite = false; + for(size_t pos = 0; pos < size; pos++) + { + if(overwrite) + buffer[pos] = 0; + else if(buffer[pos] == 0) + overwrite = true; + } +} + + // Convert a space-padded string to a 0-terminated string. // Additional parameter to specifify the max length of the final string, // not including null char (useful for e.g. mod loaders) @@ -178,4 +204,5 @@ buffer[pos] = 0; } } + #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-09-02 23:00:26
|
Revision: 697 http://modplug.svn.sourceforge.net/modplug/?rev=697&view=rev Author: saga-games Date: 2010-09-02 23:00:19 +0000 (Thu, 02 Sep 2010) Log Message: ----------- [Fix] VST: The time signature sent to VST plugins should now be correct. Since there's only the RPB and RPM values to derive it from, it's not really possible to differentiate between time signatures like 3/4 and 6/8, so quarters are always assumed. [Mod] OpenMPT: Version is now 1.19.00.02 Modified Paths: -------------- trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2010-09-02 22:54:25 UTC (rev 696) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2010-09-02 23:00:19 UTC (rev 697) @@ -778,8 +778,13 @@ } if ((value & kVstTimeSigValid) && pSndFile) { timeInfo.flags |= kVstTimeSigValid; - timeInfo.timeSigNumerator = pSndFile->m_nCurrentRowsPerBeat; - timeInfo.timeSigDenominator = pSndFile->m_nCurrentRowsPerMeasure; + //timeInfo.timeSigNumerator = pSndFile->m_nCurrentRowsPerBeat; + //timeInfo.timeSigDenominator = pSndFile->m_nCurrentRowsPerMeasure; + + // Time signature. numerator = rows per beats / rows pear measure (should sound somewhat logical to you). + // the denominator is a bit more tricky, since it cannot be set explicitely. so we just assume quarters for now. + timeInfo.timeSigNumerator = pSndFile->m_nCurrentRowsPerMeasure / max(pSndFile->m_nCurrentRowsPerBeat, 1); + timeInfo.timeSigDenominator = 4; //gcd(pSndFile->m_nCurrentRowsPerMeasure, pSndFile->m_nCurrentRowsPerBeat); } } return (long)&timeInfo; Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2010-09-02 22:54:25 UTC (rev 696) +++ trunk/OpenMPT/mptrack/version.h 2010-09-02 23:00:19 UTC (rev 697) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 19 #define VER_MINOR 00 -#define VER_MINORMINOR 01 +#define VER_MINORMINOR 02 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-09-07 14:37:33
|
Revision: 701 http://modplug.svn.sourceforge.net/modplug/?rev=701&view=rev Author: saga-games Date: 2010-09-07 14:37:26 +0000 (Tue, 07 Sep 2010) Log Message: ----------- [Ref] Moved the big pile of module conversion code to a separate file. Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/mptrack_08.vcproj Added Paths: ----------- trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/mptrack/ModConvert.h Added: trunk/OpenMPT/mptrack/ModConvert.cpp =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.cpp (rev 0) +++ trunk/OpenMPT/mptrack/ModConvert.cpp 2010-09-07 14:37:26 UTC (rev 701) @@ -0,0 +1,460 @@ +/* + * ModConvert.cpp + * -------------- + * Purpose: Code for converting between various module formats. + * Notes : (currently none) + * Authors: OpenMPT Devs + * + */ + +#include "Stdafx.h" +#include "Moddoc.h" +#include "Mainfrm.h" +#include "modsmp_ctrl.h" +#include "ModConvert.h" + + +#define CHANGEMODTYPE_WARNING(x) nWarnings |= (1 << x); +#define CHANGEMODTYPE_CHECK(x, s) if((nWarnings & (1 << x)) != 0) AddToLog(_T(s)); + + +bool CModDoc::ChangeModType(MODTYPE nNewType) +//------------------------------------------- +{ + uint64 nWarnings = 0; + PATTERNINDEX nResizedPatterns = 0; + + const MODTYPE nOldType = m_SndFile.GetType(); + + if (nNewType == nOldType && nNewType == MOD_TYPE_IT) + { + // Even if m_nType doesn't change, we might need to change extension in itp<->it case. + // This is because ITP is a HACK and doesn't genuinely change m_nType, + // but uses flages instead. + ChangeFileExtension(nNewType); + return true; + } + + if(nNewType == nOldType) + return true; + + const bool oldTypeIsMOD = (nOldType == MOD_TYPE_MOD), oldTypeIsXM = (nOldType == MOD_TYPE_XM), + oldTypeIsS3M = (nOldType == MOD_TYPE_S3M), oldTypeIsIT = (nOldType == MOD_TYPE_IT), + oldTypeIsMPT = (nOldType == MOD_TYPE_MPT), oldTypeIsMOD_XM = (oldTypeIsMOD || oldTypeIsXM), + oldTypeIsS3M_IT_MPT = (oldTypeIsS3M || oldTypeIsIT || oldTypeIsMPT), + oldTypeIsIT_MPT = (oldTypeIsIT || oldTypeIsMPT); + + const bool newTypeIsMOD = (nNewType == MOD_TYPE_MOD), newTypeIsXM = (nNewType == MOD_TYPE_XM), + newTypeIsS3M = (nNewType == MOD_TYPE_S3M), newTypeIsIT = (nNewType == MOD_TYPE_IT), + newTypeIsMPT = (nNewType == MOD_TYPE_MPT), newTypeIsMOD_XM = (newTypeIsMOD || newTypeIsXM), + newTypeIsS3M_IT_MPT = (newTypeIsS3M || newTypeIsIT || newTypeIsMPT), + newTypeIsXM_IT_MPT = (newTypeIsXM || newTypeIsIT || newTypeIsMPT), + newTypeIsIT_MPT = (newTypeIsIT || newTypeIsMPT); + + const CModSpecifications& specs = m_SndFile.GetModSpecifications(nNewType); + + /* + Incomplete list of MPTm-only features and extensions in the old formats: + + Features only available for MPTm: + -User definable tunings. + -Extended pattern range + -Extended sequence + -Multiple sequences ("songs") + -Pattern-specific time signatures + -Pattern effects :xy, S7D, S7E + -Long instrument envelopes + -Envelope release node (this was previously also usable in the IT format, but is deprecated in that format) + + Extended features in IT/XM/S3M/MOD(not all listed below are available in all of those formats): + -plugs + -Extended ranges for + -sample count + -instrument count + -pattern count + -sequence size + -Row count + -channel count + -tempo limits + -Extended sample/instrument properties. + -MIDI mapping directives + -Versioninfo + -channel names + -pattern names + -Alternative tempomodes + -For more info, see e.g. SaveExtendedSongProperties(), SaveExtendedInstrumentProperties() + */ + + // Check if conversion to 64 rows is necessary + for(PATTERNINDEX ipat=0; ipat<m_SndFile.Patterns.Size(); ipat++) + { + if ((m_SndFile.Patterns[ipat]) && (m_SndFile.Patterns[ipat].GetNumRows() != 64)) nResizedPatterns++; + } + + if(((m_SndFile.m_nInstruments) || (nResizedPatterns)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_S3M))) + { + if(::MessageBox(NULL, + "This operation will convert all instruments to samples,\n" + "and resize all patterns to 64 rows.\n" + "Do you want to continue?", "Warning", MB_YESNO | MB_ICONQUESTION) != IDYES) return false; + BeginWaitCursor(); + BEGIN_CRITICAL(); + + // Converting instruments to samples + if(m_SndFile.m_nInstruments) + { + ConvertInstrumentsToSamples(); + CHANGEMODTYPE_WARNING(wInstrumentsToSamples); + } + + // Resizing all patterns to 64 rows + for(PATTERNINDEX nPat = 0; nPat < m_SndFile.Patterns.Size(); nPat++) if ((m_SndFile.Patterns[nPat]) && (m_SndFile.Patterns[nPat].GetNumRows() != 64)) + { + // try to save short patterns by inserting a pattern break. + if(m_SndFile.Patterns[nPat].GetNumRows() < 64) + { + m_SndFile.TryWriteEffect(nPat, m_SndFile.Patterns[nPat].GetNumRows() - 1, CMD_PATTERNBREAK, 0, false, CHANNELINDEX_INVALID, false, true); + } + m_SndFile.Patterns[nPat].Resize(64, false); + CHANGEMODTYPE_WARNING(wResizedPatterns); + } + + // Removing all instrument headers + for(CHANNELINDEX nChn = 0; nChn < MAX_CHANNELS; nChn++) + { + m_SndFile.Chn[nChn].pModInstrument = nullptr; + } + + for(INSTRUMENTINDEX nIns = 0; nIns < m_SndFile.m_nInstruments; nIns++) if (m_SndFile.Instruments[nIns]) + { + delete m_SndFile.Instruments[nIns]; + m_SndFile.Instruments[nIns] = nullptr; + } + m_SndFile.m_nInstruments = 0; + END_CRITICAL(); + EndWaitCursor(); + } //End if (((m_SndFile.m_nInstruments) || (b64)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_S3M))) + BeginWaitCursor(); + + + ///////////////////////////// + // Converting pattern data + + for(PATTERNINDEX nPat = 0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) + { + MODCOMMAND *m = m_SndFile.Patterns[nPat]; + + // This is used for -> MOD/XM conversion + vector<vector<MODCOMMAND::PARAM> > cEffectMemory; + cEffectMemory.resize(m_SndFile.GetNumChannels()); + for(size_t i = 0; i < m_SndFile.GetNumChannels(); i++) + { + cEffectMemory[i].resize(MAX_EFFECTS, 0); + } + + CHANNELINDEX nChannel = m_SndFile.m_nChannels - 1; + + for (UINT len = m_SndFile.Patterns[nPat].GetNumRows() * m_SndFile.m_nChannels; len; m++, len--) + { + nChannel = (nChannel + 1) % m_SndFile.m_nChannels; // 0...Channels - 1 + + m_SndFile.ConvertCommand(m, nOldType, nNewType); + + // Deal with effect memory for MOD/XM arpeggio + if (oldTypeIsS3M_IT_MPT && newTypeIsMOD_XM) + { + switch(m->command) + { + case CMD_ARPEGGIO: + case CMD_S3MCMDEX: + case CMD_MODCMDEX: + // No effect memory in XM / MOD + if(m->param == 0) + m->param = cEffectMemory[nChannel][m->command]; + else + cEffectMemory[nChannel][m->command] = m->param; + break; + } + } + + // Adjust effect memory for MOD files + if(newTypeIsMOD) + { + switch(m->command) + { + case CMD_PORTAMENTOUP: + case CMD_PORTAMENTODOWN: + case CMD_TONEPORTAVOL: + case CMD_VIBRATOVOL: + case CMD_VOLUMESLIDE: + // ProTracker doesn't have effect memory for these commands, so let's try to fix them + if(m->param == 0) + m->param = cEffectMemory[nChannel][m->command]; + else + cEffectMemory[nChannel][m->command] = m->param; + break; + + } + } + } + } + + //////////////////////////////////////////////// + // Converting instrument / sample / etc. data + + + // Do some sample conversion + for(SAMPLEINDEX nSmp = 1; nSmp <= m_SndFile.m_nSamples; nSmp++) + { + // No Sustain loops for MOD/S3M + if(newTypeIsMOD || newTypeIsS3M) + { + if(m_SndFile.Samples[nSmp].nSustainStart || m_SndFile.Samples[nSmp].nSustainEnd) + { + m_SndFile.Samples[nSmp].nSustainStart = m_SndFile.Samples[nSmp].nSustainEnd = 0; + CHANGEMODTYPE_WARNING(wSampleSustainLoops); + } + if(m_SndFile.Samples[nSmp].nVibDepth || m_SndFile.Samples[nSmp].nVibRate || m_SndFile.Samples[nSmp].nVibSweep) + { + m_SndFile.Samples[nSmp].nVibDepth = m_SndFile.Samples[nSmp].nVibRate = m_SndFile.Samples[nSmp].nVibSweep = m_SndFile.Samples[nSmp].nVibType = 0; + CHANGEMODTYPE_WARNING(wSampleAutoVibrato); + } + } + + // Transpose to Frequency (MOD/XM to S3M/IT/MPT) + if(oldTypeIsMOD_XM && newTypeIsS3M_IT_MPT) + { + m_SndFile.Samples[nSmp].nC5Speed = CSoundFile::TransposeToFrequency(m_SndFile.Samples[nSmp].RelativeTone, m_SndFile.Samples[nSmp].nFineTune); + m_SndFile.Samples[nSmp].RelativeTone = 0; + m_SndFile.Samples[nSmp].nFineTune = 0; + } + + // Frequency to Transpose, panning (S3M/IT/MPT to MOD/XM) + if(oldTypeIsS3M_IT_MPT && newTypeIsMOD_XM) + { + CSoundFile::FrequencyToTranspose(&m_SndFile.Samples[nSmp]); + if (!(m_SndFile.Samples[nSmp].uFlags & CHN_PANNING)) m_SndFile.Samples[nSmp].nPan = 128; + // No relative note for MOD files + // TODO: Pattern notes could be transposed based on the previous relative tone? + if(newTypeIsMOD && m_SndFile.Samples[nSmp].RelativeTone != 0) + { + m_SndFile.Samples[nSmp].RelativeTone = 0; + CHANGEMODTYPE_WARNING(wMODSampleFrequency); + } + } + + if(oldTypeIsXM && newTypeIsIT_MPT) + { + // Autovibrato settings (XM to IT, where sweep 0 means "no vibrato") + if(m_SndFile.Samples[nSmp].nVibSweep == 0 && m_SndFile.Samples[nSmp].nVibRate != 0 && m_SndFile.Samples[nSmp].nVibDepth != 0) + m_SndFile.Samples[nSmp].nVibSweep = 255; + } else if(oldTypeIsIT_MPT && newTypeIsXM) + { + // Autovibrato settings (IT to XM, where sweep 0 means "no sweep") + if(m_SndFile.Samples[nSmp].nVibSweep == 0) + m_SndFile.Samples[nSmp].nVibRate = m_SndFile.Samples[nSmp].nVibDepth = 0; + } + } + + // Convert IT/MPT to XM (instruments) + if(oldTypeIsIT_MPT && newTypeIsXM) + { + for(INSTRUMENTINDEX nIns = 1; nIns <= m_SndFile.GetNumInstruments(); nIns++) + { + MODINSTRUMENT *pIns = m_SndFile.Instruments[nIns]; + if (pIns) + { + for (UINT k = 0; k < NOTE_MAX; k++) + { + if ((pIns->NoteMap[k]) && (pIns->NoteMap[k] != (BYTE)(k+1))) + { + CHANGEMODTYPE_WARNING(wBrokenNoteMap); + break; + } + } + // Convert sustain loops to sustain "points" + if(pIns->VolEnv.nSustainStart != pIns->VolEnv.nSustainEnd) + { + CHANGEMODTYPE_WARNING(wInstrumentSustainLoops); + pIns->VolEnv.nSustainEnd = pIns->VolEnv.nSustainStart; + } + if(pIns->PanEnv.nSustainStart != pIns->PanEnv.nSustainEnd) + { + CHANGEMODTYPE_WARNING(wInstrumentSustainLoops); + pIns->PanEnv.nSustainEnd = pIns->PanEnv.nSustainStart; + } + pIns->VolEnv.dwFlags &= ~ENV_CARRY; + pIns->PanEnv.dwFlags &= ~ENV_CARRY; + pIns->PitchEnv.dwFlags &= ~(ENV_CARRY|ENV_ENABLED|ENV_FILTER); + pIns->dwFlags &= ~INS_SETPANNING; + pIns->nIFC &= 0x7F; + pIns->nIFR &= 0x7F; + } + } + } + + // Instrument tunings + if(oldTypeIsMPT) + { + for(INSTRUMENTINDEX nIns = 1; nIns <= m_SndFile.GetNumInstruments(); nIns++) + { + if(m_SndFile.Instruments[nIns] != nullptr && m_SndFile.Instruments[nIns]->pTuning != nullptr) + { + m_SndFile.Instruments[nIns]->SetTuning(nullptr); + CHANGEMODTYPE_WARNING(wInstrumentTuning); + } + } + } + + if(newTypeIsMOD) + { + // Not supported in MOD format + m_SndFile.m_nDefaultSpeed = 6; + m_SndFile.m_nDefaultTempo = 125; + m_SndFile.m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME; + m_SndFile.m_nSamplePreAmp = 48; + m_SndFile.m_nVSTiVolume = 48; + CHANGEMODTYPE_WARNING(wMODGlobalVars); + + // Too many samples? + if(m_SndFile.m_nSamples > 31) + { + CHANGEMODTYPE_WARNING(wMOD31Samples); + } + } + + // Is the "restart position" value allowed in this format? + if(m_SndFile.m_nRestartPos > 0 && !CSoundFile::GetModSpecifications(nNewType).hasRestartPos) + { + m_SndFile.m_nRestartPos = 0; + CHANGEMODTYPE_WARNING(wRestartPos); + } + + // Fix channel settings (pan/vol) + for(CHANNELINDEX nChn = 0; nChn < m_SndFile.m_nChannels; nChn++) + { + if(newTypeIsMOD_XM || newTypeIsS3M) + { + if(m_SndFile.ChnSettings[nChn].nVolume != 64 || (m_SndFile.ChnSettings[nChn].dwFlags & CHN_SURROUND)) + { + m_SndFile.ChnSettings[nChn].nVolume = 64; + m_SndFile.ChnSettings[nChn].dwFlags &= ~CHN_SURROUND; + CHANGEMODTYPE_WARNING(wChannelVolSurround); + } + } + if(newTypeIsXM) + { + if(m_SndFile.ChnSettings[nChn].nPan != 128) + { + m_SndFile.ChnSettings[nChn].nPan = 128; + CHANGEMODTYPE_WARNING(wChannelPanning); + } + } + } + + // Check for patterns with custom time signatures (fixing will be applied in the pattern container) + if(!CSoundFile::GetModSpecifications(nNewType).hasPatternSignatures) + { + for(PATTERNINDEX nPat = 0; nPat < m_SndFile.GetNumPatterns(); nPat++) + { + if(m_SndFile.Patterns[nPat].GetOverrideSignature()) + { + CHANGEMODTYPE_WARNING(wPatternSignatures); + break; + } + } + } + + BEGIN_CRITICAL(); + m_SndFile.ChangeModTypeTo(nNewType); + if(!newTypeIsXM_IT_MPT && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES)) + { + CHANGEMODTYPE_WARNING(wLinearSlides); + m_SndFile.m_dwSongFlags &= ~SONG_LINEARSLIDES; + } + if(!newTypeIsIT_MPT) m_SndFile.m_dwSongFlags &= ~(SONG_ITOLDEFFECTS|SONG_ITCOMPATGXX); + if(!newTypeIsS3M) m_SndFile.m_dwSongFlags &= ~SONG_FASTVOLSLIDES; + if(!newTypeIsMOD) m_SndFile.m_dwSongFlags &= ~SONG_PT1XMODE; + if(newTypeIsS3M || newTypeIsMOD) m_SndFile.m_dwSongFlags &= ~SONG_EXFILTERRANGE; + if(oldTypeIsXM && newTypeIsIT_MPT) m_SndFile.m_dwSongFlags |= SONG_ITCOMPATGXX; + + END_CRITICAL(); + ChangeFileExtension(nNewType); + + //rewbs.cutomKeys: update effect key commands + CInputHandler *ih = CMainFrame::GetMainFrame()->GetInputHandler(); + if (newTypeIsMOD_XM) + ih->SetXMEffects(); + else + ih->SetITEffects(); + //end rewbs.cutomKeys + + // Check mod specifications + m_SndFile.m_nDefaultTempo = CLAMP(m_SndFile.m_nDefaultTempo, specs.tempoMin, specs.tempoMax); + m_SndFile.m_nDefaultSpeed = CLAMP(m_SndFile.m_nDefaultSpeed, specs.speedMin, specs.speedMax); + + for(INSTRUMENTINDEX i = 1; i <= m_SndFile.m_nInstruments; i++) if(m_SndFile.Instruments[i] != nullptr) + { + UpdateEnvelopes(&(m_SndFile.Instruments[i]->VolEnv), nWarnings); + UpdateEnvelopes(&(m_SndFile.Instruments[i]->PanEnv), nWarnings); + UpdateEnvelopes(&(m_SndFile.Instruments[i]->PitchEnv), nWarnings); + } + + CHAR s[64]; + CHANGEMODTYPE_CHECK(wInstrumentsToSamples, "All instruments have been converted to samples.\n"); + wsprintf(s, "%d patterns have been resized to 64 rows\n", nResizedPatterns); + CHANGEMODTYPE_CHECK(wResizedPatterns, s); + CHANGEMODTYPE_CHECK(wSampleSustainLoops, "New format doesn't support sample sustain loops.\n"); + CHANGEMODTYPE_CHECK(wSampleAutoVibrato, "New format doesn't support sample autovibrato.\n"); + CHANGEMODTYPE_CHECK(wMODSampleFrequency, "Sample C-5 frequencies will be lost.\n"); + CHANGEMODTYPE_CHECK(wBrokenNoteMap, "Note Mapping will be lost when saving as XM.\n"); + CHANGEMODTYPE_CHECK(wInstrumentSustainLoops, "Sustain loops were converted to sustain points.\n"); + CHANGEMODTYPE_CHECK(wInstrumentTuning, "Instrument tunings will be lost.\n"); + CHANGEMODTYPE_CHECK(wMODGlobalVars, "Default speed, tempo and global volume will be lost.\n"); + CHANGEMODTYPE_CHECK(wMOD31Samples, "Samples above 31 will be lost when saving as MOD.\n"); + CHANGEMODTYPE_CHECK(wRestartPos, "Restart position is not supported by the new format.\n"); + CHANGEMODTYPE_CHECK(wChannelVolSurround, "Channel volume and surround are not supported by the new format.\n"); + CHANGEMODTYPE_CHECK(wChannelPanning, "Channel panning is not supported by the new format.\n"); + CHANGEMODTYPE_CHECK(wPatternSignatures, "Pattern-specific time signatures are not supported by the new format.\n"); + CHANGEMODTYPE_CHECK(wLinearSlides, "Linear Frequency Slides not supported by the new format.\n"); + CHANGEMODTYPE_CHECK(wTrimmedEnvelopes, "Instrument envelopes have been shortened.\n"); + CHANGEMODTYPE_CHECK(wReleaseNode, "Instrument envelope release nodes are not supported by the new format.\n"); + + SetModified(); + GetPatternUndo()->ClearUndo(); + GetSampleUndo()->ClearUndo(); + UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODGENERAL); + EndWaitCursor(); + return true; +} + +// Trim envelopes and remove release nodes. +void CModDoc::UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv, uint64 &nWarnings) +//-------------------------------------------------------------------------- +{ + // shorten instrument envelope if necessary (for mod conversion) + const UINT iEnvMax = m_SndFile.GetModSpecifications().envelopePointsMax; + + #define TRIMENV(nPat) if(nPat > iEnvMax) { nPat = iEnvMax; CHANGEMODTYPE_WARNING(wTrimmedEnvelopes); } + + TRIMENV(mptEnv->nNodes); + TRIMENV(mptEnv->nLoopStart); + TRIMENV(mptEnv->nLoopEnd); + TRIMENV(mptEnv->nSustainStart); + TRIMENV(mptEnv->nSustainEnd); + if(mptEnv->nReleaseNode != ENV_RELEASE_NODE_UNSET) + { + TRIMENV(mptEnv->nReleaseNode); + if(!m_SndFile.GetModSpecifications().hasReleaseNode) + { + mptEnv->nReleaseNode = ENV_RELEASE_NODE_UNSET; + CHANGEMODTYPE_WARNING(wReleaseNode); + } + } + + #undef TRIMENV +} + + +#undef CHANGEMODTYPE_WARNING +#undef CHANGEMODTYPE_CHECK Added: trunk/OpenMPT/mptrack/ModConvert.h =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.h (rev 0) +++ trunk/OpenMPT/mptrack/ModConvert.h 2010-09-07 14:37:26 UTC (rev 701) @@ -0,0 +1,31 @@ +/* + * ModConvert.h + * ------------ + * Purpose: Headers for module conversion code. + * Notes : (currently none) + * Authors: OpenMPT Devs + * + */ + + +// Warning types +enum enmWarnings +{ + wInstrumentsToSamples = 0, + wResizedPatterns, + wSampleSustainLoops, + wSampleAutoVibrato, + wMODSampleFrequency, + wBrokenNoteMap, + wInstrumentSustainLoops, + wInstrumentTuning, + wMODGlobalVars, + wMOD31Samples, + wRestartPos, + wChannelVolSurround, + wChannelPanning, + wPatternSignatures, + wLinearSlides, + wTrimmedEnvelopes, + wReleaseNode, +}; Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2010-09-05 23:08:56 UTC (rev 700) +++ trunk/OpenMPT/mptrack/Moddoc.h 2010-09-07 14:37:26 UTC (rev 701) @@ -336,7 +336,7 @@ //}}AFX_VIRTUAL // for mod conversion - uint8 UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv); + void UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv, uint64 &nWarnings); // Implementation Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2010-09-05 23:08:56 UTC (rev 700) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2010-09-07 14:37:26 UTC (rev 701) @@ -32,438 +32,6 @@ } -////////////////////////////////////////////////////////////////////// -// Module type conversion - -bool CModDoc::ChangeModType(MODTYPE nNewType) -//------------------------------------------- -{ - CHAR s[256]; - UINT b64 = 0; - - const MODTYPE nOldType = m_SndFile.GetType(); - - if (nNewType == nOldType && nNewType == MOD_TYPE_IT){ - // Even if m_nType doesn't change, we might need to change extension in itp<->it case. - // This is because ITP is a HACK and doesn't genuinely change m_nType, - // but uses flages instead. - ChangeFileExtension(nNewType); - return true; - } - - if(nNewType == nOldType) - return true; - - const bool oldTypeIsMOD = (nOldType == MOD_TYPE_MOD), oldTypeIsXM = (nOldType == MOD_TYPE_XM), - oldTypeIsS3M = (nOldType == MOD_TYPE_S3M), oldTypeIsIT = (nOldType == MOD_TYPE_IT), - oldTypeIsMPT = (nOldType == MOD_TYPE_MPT), oldTypeIsMOD_XM = (oldTypeIsMOD || oldTypeIsXM), - oldTypeIsS3M_IT_MPT = (oldTypeIsS3M || oldTypeIsIT || oldTypeIsMPT), - oldTypeIsIT_MPT = (oldTypeIsIT || oldTypeIsMPT); - - const bool newTypeIsMOD = (nNewType == MOD_TYPE_MOD), newTypeIsXM = (nNewType == MOD_TYPE_XM), - newTypeIsS3M = (nNewType == MOD_TYPE_S3M), newTypeIsIT = (nNewType == MOD_TYPE_IT), - newTypeIsMPT = (nNewType == MOD_TYPE_MPT), newTypeIsMOD_XM = (newTypeIsMOD || newTypeIsXM), - newTypeIsS3M_IT_MPT = (newTypeIsS3M || newTypeIsIT || newTypeIsMPT), - newTypeIsXM_IT_MPT = (newTypeIsXM || newTypeIsIT || newTypeIsMPT), - newTypeIsIT_MPT = (newTypeIsIT || newTypeIsMPT); - - const CModSpecifications& specs = m_SndFile.GetModSpecifications(nNewType); - - /* - Incomplete list of MPTm-only features and extensions in the old formats: - - Features only available for MPTm: - -User definable tunings. - -Extended pattern range - -Extended sequence - -Multiple sequences ("songs") - -Pattern-specific time signatures - -Pattern effects :xy, S7D, S7E - -Long instrument envelopes - -Envelope release node (this was previously also usable in the IT format, but is deprecated in that format) - - Extended features in IT/XM/S3M/MOD(not all listed below are available in all of those formats): - -plugs - -Extended ranges for - -sample count - -instrument count - -pattern count - -sequence size - -Row count - -channel count - -tempo limits - -Extended sample/instrument properties. - -MIDI mapping directives - -Versioninfo - -channel names - -pattern names - -Alternative tempomodes - -For more info, see e.g. SaveExtendedSongProperties(), SaveExtendedInstrumentProperties() - */ - - // Check if conversion to 64 rows is necessary - for (UINT ipat=0; ipat<m_SndFile.Patterns.Size(); ipat++) - { - if ((m_SndFile.Patterns[ipat]) && (m_SndFile.Patterns[ipat].GetNumRows() != 64)) b64++; - } - if (((m_SndFile.m_nInstruments) || (b64)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_S3M))) - { - if (::MessageBox(NULL, - "This operation will convert all instruments to samples,\n" - "and resize all patterns to 64 rows.\n" - "Do you want to continue?", "Warning", MB_YESNO | MB_ICONQUESTION) != IDYES) return false; - BeginWaitCursor(); - BEGIN_CRITICAL(); - // Converting instruments to samples - if (m_SndFile.m_nInstruments) - { - ConvertInstrumentsToSamples(); - AddToLog("WARNING: All instruments have been converted to samples.\n"); - } - // Resizing all patterns to 64 rows - UINT nPatCvt = 0; - UINT i = 0; - for (i=0; i<m_SndFile.Patterns.Size(); i++) if ((m_SndFile.Patterns[i]) && (m_SndFile.Patterns[i].GetNumRows() != 64)) - { - if(m_SndFile.Patterns[i].GetNumRows() < 64) - { - // try to save short patterns by inserting a pattern break. - m_SndFile.TryWriteEffect(i, m_SndFile.Patterns[i].GetNumRows() - 1, CMD_PATTERNBREAK, 0, false, CHANNELINDEX_INVALID, false, true); - } - m_SndFile.Patterns[i].Resize(64, false); - if (b64 < 5) - { - wsprintf(s, "WARNING: Pattern %d resized to 64 rows\n", i); - AddToLog(s); - } - nPatCvt++; - } - if (nPatCvt >= 5) - { - wsprintf(s, "WARNING: %d patterns have been resized to 64 rows\n", i); - AddToLog(s); - } - // Removing all instrument headers - for (UINT i1=0; i1<MAX_CHANNELS; i1++) - { - m_SndFile.Chn[i1].pModInstrument = nullptr; - } - for (UINT i2=0; i2<m_SndFile.m_nInstruments; i2++) if (m_SndFile.Instruments[i2]) - { - delete m_SndFile.Instruments[i2]; - m_SndFile.Instruments[i2] = nullptr; - } - m_SndFile.m_nInstruments = 0; - END_CRITICAL(); - EndWaitCursor(); - } //End if (((m_SndFile.m_nInstruments) || (b64)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_S3M))) - BeginWaitCursor(); - - - ///////////////////////////// - // Converting pattern data - - for (PATTERNINDEX nPat = 0; nPat < m_SndFile.Patterns.Size(); nPat++) if (m_SndFile.Patterns[nPat]) - { - MODCOMMAND *m = m_SndFile.Patterns[nPat]; - - // This is used for -> MOD/XM conversion - vector<vector<MODCOMMAND::PARAM> > cEffectMemory; - cEffectMemory.resize(m_SndFile.GetNumChannels()); - for(size_t i = 0; i < m_SndFile.GetNumChannels(); i++) - { - cEffectMemory[i].resize(MAX_EFFECTS, 0); - } - - UINT nChannel = m_SndFile.m_nChannels - 1; - - for (UINT len = m_SndFile.Patterns[nPat].GetNumRows() * m_SndFile.m_nChannels; len; m++, len--) - { - nChannel = (nChannel + 1) % m_SndFile.m_nChannels; // 0...Channels - 1 - - m_SndFile.ConvertCommand(m, nOldType, nNewType); - - // Deal with effect memory for MOD/XM arpeggio - if (oldTypeIsS3M_IT_MPT && newTypeIsMOD_XM) - { - switch(m->command) - { - case CMD_ARPEGGIO: - case CMD_S3MCMDEX: - case CMD_MODCMDEX: - // No effect memory in XM / MOD - if(m->param == 0) - m->param = cEffectMemory[nChannel][m->command]; - else - cEffectMemory[nChannel][m->command] = m->param; - break; - } - } - - // Adjust effect memory for MOD files - if(newTypeIsMOD) - { - switch(m->command) - { - case CMD_PORTAMENTOUP: - case CMD_PORTAMENTODOWN: - case CMD_TONEPORTAVOL: - case CMD_VIBRATOVOL: - case CMD_VOLUMESLIDE: - // ProTracker doesn't have effect memory for these commands, so let's try to fix them - if(m->param == 0) - m->param = cEffectMemory[nChannel][m->command]; - else - cEffectMemory[nChannel][m->command] = m->param; - break; - - } - } - } - } - - //////////////////////////////////////////////// - // Converting instrument / sample / etc. data - - - // Do some sample conversion - for (SAMPLEINDEX nSmp = 1; nSmp <= m_SndFile.m_nSamples; nSmp++) - { - // No Sustain loops for MOD/S3M - if(newTypeIsMOD || newTypeIsS3M) - { - m_SndFile.Samples[nSmp].nSustainStart = m_SndFile.Samples[nSmp].nSustainEnd = 0; - } - - // Transpose to Frequency (MOD/XM to S3M/IT/MPT) - if(oldTypeIsMOD_XM && newTypeIsS3M_IT_MPT) - { - m_SndFile.Samples[nSmp].nC5Speed = CSoundFile::TransposeToFrequency(m_SndFile.Samples[nSmp].RelativeTone, m_SndFile.Samples[nSmp].nFineTune); - m_SndFile.Samples[nSmp].RelativeTone = 0; - m_SndFile.Samples[nSmp].nFineTune = 0; - } - - // Frequency to Transpose (S3M/IT/MPT to MOD/XM) - if(oldTypeIsS3M_IT_MPT && newTypeIsXM) - { - CSoundFile::FrequencyToTranspose(&m_SndFile.Samples[nSmp]); - if (!(m_SndFile.Samples[nSmp].uFlags & CHN_PANNING)) m_SndFile.Samples[nSmp].nPan = 128; - } - - if(oldTypeIsXM && newTypeIsIT_MPT) - { - // Autovibrato settings (XM to IT, where sweep 0 means "no vibrato") - if(m_SndFile.Samples[nSmp].nVibSweep == 0 && m_SndFile.Samples[nSmp].nVibRate != 0 && m_SndFile.Samples[nSmp].nVibDepth != 0) - m_SndFile.Samples[nSmp].nVibSweep = 255; - } else if(oldTypeIsIT_MPT && newTypeIsXM) - { - // Autovibrato settings (IT to XM, where sweep 0 means "no sweep") - if(m_SndFile.Samples[nSmp].nVibSweep == 0) - m_SndFile.Samples[nSmp].nVibRate = m_SndFile.Samples[nSmp].nVibDepth = 0; - } - } - - // No Autovibrato for MOD/S3M - if(newTypeIsMOD || newTypeIsS3M) - { - ctrlSmp::ResetSamples(m_SndFile, ctrlSmp::SmpResetVibrato); - } - - if (oldTypeIsXM && newTypeIsIT_MPT) m_SndFile.m_dwSongFlags |= SONG_ITCOMPATGXX; - - // Convert IT/MPT to XM (instruments) - if (oldTypeIsIT_MPT && newTypeIsXM) - { - bool bBrokenNoteMap = false, bBrokenSustainLoop = false; - for(INSTRUMENTINDEX nIns = 1; nIns <= m_SndFile.GetNumInstruments(); nIns++) - { - MODINSTRUMENT *pIns = m_SndFile.Instruments[nIns]; - if (pIns) - { - for (UINT k = 0; k < NOTE_MAX; k++) - { - if ((pIns->NoteMap[k]) && (pIns->NoteMap[k] != (BYTE)(k+1))) - { - bBrokenNoteMap = true; - break; - } - } - // Convert sustain loops to sustain "points" - if(pIns->VolEnv.nSustainStart != pIns->VolEnv.nSustainEnd) - { - pIns->VolEnv.nSustainEnd = pIns->VolEnv.nSustainStart; - bBrokenSustainLoop = true; - } - if(pIns->PanEnv.nSustainStart != pIns->PanEnv.nSustainEnd) - { - pIns->PanEnv.nSustainEnd = pIns->PanEnv.nSustainStart; - bBrokenSustainLoop = true; - } - pIns->VolEnv.dwFlags &= ~ENV_CARRY; - pIns->PanEnv.dwFlags &= ~ENV_CARRY; - pIns->PitchEnv.dwFlags &= ~(ENV_CARRY|ENV_ENABLED|ENV_FILTER); - pIns->dwFlags &= ~INS_SETPANNING; - pIns->nIFC &= 0x7F; - pIns->nIFR &= 0x7F; - } - } - if (bBrokenNoteMap) AddToLog("WARNING: Note Mapping will be lost when saving as XM.\n"); - if (bBrokenSustainLoop) AddToLog("WARNING: Sustain loops were converted to sustain points.\n"); - } - - // Instrument tunings - if(oldTypeIsMPT) - { - bool bFirstWarn = true; - for(INSTRUMENTINDEX nIns = 1; nIns <= m_SndFile.GetNumInstruments(); nIns++) - { - if(m_SndFile.Instruments[nIns] != nullptr && m_SndFile.Instruments[nIns]->pTuning != nullptr) - { - m_SndFile.Instruments[nIns]->SetTuning(nullptr); - if(bFirstWarn) - { - AddToLog("WARNING: Instrument tunings will be lost!\n"); - bFirstWarn = false; - } - } - } - } - - if(newTypeIsMOD) - { - // Not supported in MOD format - m_SndFile.m_nDefaultSpeed = 6; - m_SndFile.m_nDefaultTempo = 125; - m_SndFile.m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME; - m_SndFile.m_nSamplePreAmp = 48; - m_SndFile.m_nVSTiVolume = 48; - AddToLog("WARNING: Default speed, tempo and global volume will be lost.\n"); - - // Too many samples? - if(m_SndFile.m_nSamples > 31) - { - AddToLog("WARNING: Samples above 31 will be lost when saving as MOD!\n"); - } - } - - // Is the "restart position" value allowed in this format? - if(m_SndFile.m_nRestartPos > 0 && !CSoundFile::GetModSpecifications(nNewType).hasRestartPos) - { - m_SndFile.m_nRestartPos = 0; - AddToLog("WARNING: Restart position is not supported by the new format.\n"); - } - - - // Fix channel settings (pan/vol) - for(CHANNELINDEX nChn = 0; nChn < m_SndFile.m_nChannels; nChn++) - { - if(newTypeIsMOD_XM || newTypeIsS3M) - { - m_SndFile.ChnSettings[nChn].nVolume = 64; - m_SndFile.ChnSettings[nChn].dwFlags &= ~CHN_SURROUND; - } - if(newTypeIsXM) - { - m_SndFile.ChnSettings[nChn].nPan = 128; - } - } - - // Check for patterns with custom time signatures (fixing will be applied in the pattern container) - if(!CSoundFile::GetModSpecifications(nNewType).hasPatternSignatures) - { - for(PATTERNINDEX nPat = 0; nPat < m_SndFile.GetNumPatterns(); nPat++) - { - if(m_SndFile.Patterns[nPat].GetOverrideSignature()) - { - AddToLog("WARNING: Pattern-specific time signatures are not supported by the new format.\n"); - break; - } - } - } - - BEGIN_CRITICAL(); - m_SndFile.ChangeModTypeTo(nNewType); - if (!newTypeIsXM_IT_MPT && (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 (!newTypeIsIT_MPT) m_SndFile.m_dwSongFlags &= ~(SONG_ITOLDEFFECTS|SONG_ITCOMPATGXX); - if (!newTypeIsS3M) m_SndFile.m_dwSongFlags &= ~SONG_FASTVOLSLIDES; - if (!newTypeIsMOD) m_SndFile.m_dwSongFlags &= ~SONG_PT1XMODE; - if (newTypeIsS3M || newTypeIsMOD) m_SndFile.m_dwSongFlags &= ~SONG_EXFILTERRANGE; - END_CRITICAL(); - ChangeFileExtension(nNewType); - - //rewbs.cutomKeys: update effect key commands - CInputHandler *ih = CMainFrame::GetMainFrame()->GetInputHandler(); - if (newTypeIsMOD_XM) - ih->SetXMEffects(); - else - ih->SetITEffects(); - //end rewbs.cutomKeys - - // Check mod specifications - m_SndFile.m_nDefaultTempo = CLAMP(m_SndFile.m_nDefaultTempo, specs.tempoMin, specs.tempoMax); - m_SndFile.m_nDefaultSpeed = CLAMP(m_SndFile.m_nDefaultSpeed, specs.speedMin, specs.speedMax); - - uint8 trimmedEnvelopes = 0; - for(INSTRUMENTINDEX i = 1; i <= m_SndFile.m_nInstruments; i++) if(m_SndFile.Instruments[i] != nullptr) - { - trimmedEnvelopes |= UpdateEnvelopes(&(m_SndFile.Instruments[i]->VolEnv)); - trimmedEnvelopes |= UpdateEnvelopes(&(m_SndFile.Instruments[i]->PanEnv)); - trimmedEnvelopes |= UpdateEnvelopes(&(m_SndFile.Instruments[i]->PitchEnv)); - } - if(trimmedEnvelopes & 1) - AddToLog("WARNING: Instrument envelopes have been shortened.\n"); - if(trimmedEnvelopes & 2) - AddToLog("WARNING: Instrument envelope release nodes are not supported by the new format.\n"); - - SetModified(); - GetPatternUndo()->ClearUndo(); - GetSampleUndo()->ClearUndo(); - UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODGENERAL); - EndWaitCursor(); - return true; -} - -// Trim envelopes and remove release nodes. -// If bit 0 of the return value is set, the envelope has been shortened. -// If bit 1 of the return value is set, the envelope's release node has been removed. -uint8 CModDoc::UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv) -//-------------------------------------------------------- -{ - // shorten instrument envelope if necessary (for mod conversion) - const UINT iEnvMax = m_SndFile.GetModSpecifications().envelopePointsMax; - uint8 result = 0; - - #define TRIMENV(i) if(i > iEnvMax) { i = iEnvMax; result |= 1; } - - TRIMENV(mptEnv->nNodes); - TRIMENV(mptEnv->nLoopStart); - TRIMENV(mptEnv->nLoopEnd); - TRIMENV(mptEnv->nSustainStart); - TRIMENV(mptEnv->nSustainEnd); - if(mptEnv->nReleaseNode != ENV_RELEASE_NODE_UNSET) - { - TRIMENV(mptEnv->nReleaseNode); - if(!m_SndFile.GetModSpecifications().hasReleaseNode) - { - mptEnv->nReleaseNode = ENV_RELEASE_NODE_UNSET; - result |= 2; - } - } - - #undef TRIMENV - - return result; -} - - - - - - // Change the number of channels bool CModDoc::ChangeNumChannels(UINT nNewChannels, const bool showCancelInRemoveDlg) //---------------------------------------------------------------------------------- Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2010-09-05 23:08:56 UTC (rev 700) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2010-09-07 14:37:26 UTC (rev 701) @@ -376,6 +376,9 @@ RelativePath="..\soundlib\modcommand.cpp"> </File> <File + RelativePath=".\ModConvert.cpp"> + </File> + <File RelativePath=".\Moddoc.cpp"> </File> <File @@ -825,6 +828,9 @@ RelativePath="..\soundlib\modcommand.h"> </File> <File + RelativePath=".\ModConvert.h"> + </File> + <File RelativePath=".\moddoc.h"> </File> <File Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2010-09-05 23:08:56 UTC (rev 700) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2010-09-07 14:37:26 UTC (rev 701) @@ -505,6 +505,10 @@ > </File> <File + RelativePath=".\ModConvert.cpp" + > + </File> + <File RelativePath=".\Moddoc.cpp" > </File> @@ -1095,6 +1099,10 @@ > </File> <File + RelativePath=".\ModConvert.h" + > + </File> + <File RelativePath=".\moddoc.h" > </File> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-09-07 16:13:16
|
Revision: 702 http://modplug.svn.sourceforge.net/modplug/?rev=702&view=rev Author: saga-games Date: 2010-09-07 16:13:10 +0000 (Tue, 07 Sep 2010) Log Message: ----------- [Imp] Mod Conversion: When converting patterns from a format with instruments to a format without instruments (or when removing all instruments using the cleanup dialog), the instrument note mapping is now also taken care of. [Ref] Refactored the instrument->sample pattern conversion code using ForEachModCommand. Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2010-09-07 14:37:26 UTC (rev 701) +++ trunk/OpenMPT/mptrack/Moddoc.h 2010-09-07 16:13:10 UTC (rev 702) @@ -221,7 +221,7 @@ bool ChangeModType(MODTYPE wType); bool ChangeNumChannels(UINT nNewChannels, const bool showCancelInRemoveDlg = true); - BOOL ConvertInstrumentsToSamples(); + bool ConvertInstrumentsToSamples(); UINT RemovePlugs(const bool (&keepMask)[MAX_MIXPLUGINS]); PATTERNINDEX InsertPattern(ORDERINDEX nOrd = ORDERINDEX_INVALID, ROWINDEX nRows = 64); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2010-09-07 14:37:26 UTC (rev 701) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2010-09-07 16:13:10 UTC (rev 702) @@ -182,29 +182,49 @@ } -BOOL CModDoc::ConvertInstrumentsToSamples() -//----------------------------------------- +// Functor for converting instrument numbers to sample numbers in the patterns +struct ConvertInstrumentsToSamplesInPatterns +//========================================== { - if (!m_SndFile.m_nInstruments) return FALSE; - for (UINT i=0; i<m_SndFile.Patterns.Size(); i++) if (m_SndFile.Patterns[i]) + ConvertInstrumentsToSamplesInPatterns(CSoundFile *pSndFile) { - MODCOMMAND *p = m_SndFile.Patterns[i]; - for (UINT j=m_SndFile.m_nChannels*m_SndFile.Patterns[i].GetNumRows(); j; j--, p++) if (p->instr) + this->pSndFile = pSndFile; + } + + void operator()(MODCOMMAND& m) + { + if(m.instr) { - UINT instr = p->instr; - UINT note = p->note; - UINT newins = 0; - if ((note) && (note < 128)) note--; else note = 5*12; - if ((instr < MAX_INSTRUMENTS) && (m_SndFile.Instruments[instr])) + MODCOMMAND::INSTR instr = m.instr, newinstr = 0; + MODCOMMAND::NOTE note = m.note, newnote = note; + if((note) && (note <= NOTE_MAX)) + note--; + else + note = NOTE_MIDDLEC - 1; + + if((instr < MAX_INSTRUMENTS) && (pSndFile->Instruments[instr])) { - MODINSTRUMENT *pIns = m_SndFile.Instruments[instr]; - newins = pIns->Keyboard[note]; - if (newins >= MAX_SAMPLES) newins = 0; + const MODINSTRUMENT *pIns = pSndFile->Instruments[instr]; + newinstr = pIns->Keyboard[note]; + newnote = pIns->NoteMap[note]; + if(newinstr >= MAX_SAMPLES) newinstr = 0; } - p->instr = newins; + m.instr = newinstr; + m.note = newnote; } } - return TRUE; + + CSoundFile *pSndFile; +}; + + +bool CModDoc::ConvertInstrumentsToSamples() +//----------------------------------------- +{ + if (!m_SndFile.GetNumInstruments()) + return false; + m_SndFile.Patterns.ForEachModCommand(ConvertInstrumentsToSamplesInPatterns(&m_SndFile)); + return true; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-09-07 17:45:39
|
Revision: 703 http://modplug.svn.sourceforge.net/modplug/?rev=703&view=rev Author: saga-games Date: 2010-09-07 17:45:33 +0000 (Tue, 07 Sep 2010) Log Message: ----------- [Imp] Mod Conversion: Sample sustain loops are now converted to normal loops if needed and possible. [Imp] Mod Conversion: Bidi loops are disabled when converting to MOD/S3M now. Modified Paths: -------------- trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/mptrack/ModConvert.h Modified: trunk/OpenMPT/mptrack/ModConvert.cpp =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.cpp 2010-09-07 16:13:10 UTC (rev 702) +++ trunk/OpenMPT/mptrack/ModConvert.cpp 2010-09-07 17:45:33 UTC (rev 703) @@ -2,7 +2,35 @@ * ModConvert.cpp * -------------- * Purpose: Code for converting between various module formats. - * Notes : (currently none) + * Notes : Incomplete list of MPTm-only features and extensions in the old formats: + * Features only available for MPTm: + * - User definable tunings. + * - Extended pattern range + * - Extended sequence + * - Multiple sequences ("songs") + * - Pattern-specific time signatures + * - Pattern effects :xy, S7D, S7E + * - Long instrument envelopes + * - Envelope release node (this was previously also usable in the IT format, but is now deprecated in that format) + * + * Extended features in IT/XM/S3M/MOD(not all listed below are available in all of those formats): + * - Plugins + * - Extended ranges for + * - Sample count + * - Instrument count + * - Pattern count + * - Sequence size + * - Row count + * - Channel count + * - Tempo limits + * - Extended sample/instrument properties. + * - MIDI mapping directives + * - Version info + * - Channel names + * - Pattern names + * - Alternative tempomodes + * - For more info, see e.g. SaveExtendedSongProperties(), SaveExtendedInstrumentProperties() + * * Authors: OpenMPT Devs * */ @@ -30,7 +58,7 @@ { // Even if m_nType doesn't change, we might need to change extension in itp<->it case. // This is because ITP is a HACK and doesn't genuinely change m_nType, - // but uses flages instead. + // but uses flags instead. ChangeFileExtension(nNewType); return true; } @@ -53,42 +81,11 @@ const CModSpecifications& specs = m_SndFile.GetModSpecifications(nNewType); - /* - Incomplete list of MPTm-only features and extensions in the old formats: - - Features only available for MPTm: - -User definable tunings. - -Extended pattern range - -Extended sequence - -Multiple sequences ("songs") - -Pattern-specific time signatures - -Pattern effects :xy, S7D, S7E - -Long instrument envelopes - -Envelope release node (this was previously also usable in the IT format, but is deprecated in that format) - - Extended features in IT/XM/S3M/MOD(not all listed below are available in all of those formats): - -plugs - -Extended ranges for - -sample count - -instrument count - -pattern count - -sequence size - -Row count - -channel count - -tempo limits - -Extended sample/instrument properties. - -MIDI mapping directives - -Versioninfo - -channel names - -pattern names - -Alternative tempomodes - -For more info, see e.g. SaveExtendedSongProperties(), SaveExtendedInstrumentProperties() - */ - // Check if conversion to 64 rows is necessary - for(PATTERNINDEX ipat=0; ipat<m_SndFile.Patterns.Size(); ipat++) + for(PATTERNINDEX nPat = 0; nPat < m_SndFile.Patterns.Size(); nPat++) { - if ((m_SndFile.Patterns[ipat]) && (m_SndFile.Patterns[ipat].GetNumRows() != 64)) nResizedPatterns++; + if ((m_SndFile.Patterns[nPat]) && (m_SndFile.Patterns[nPat].GetNumRows() != 64)) + nResizedPatterns++; } if(((m_SndFile.m_nInstruments) || (nResizedPatterns)) && (nNewType & (MOD_TYPE_MOD|MOD_TYPE_S3M))) @@ -206,14 +203,32 @@ // Do some sample conversion for(SAMPLEINDEX nSmp = 1; nSmp <= m_SndFile.m_nSamples; nSmp++) { - // No Sustain loops for MOD/S3M + // No Bidi / Sustain loops / Autovibrato for MOD/S3M if(newTypeIsMOD || newTypeIsS3M) { + // Bidi loops + if((m_SndFile.Samples[nSmp].uFlags & CHN_PINGPONGLOOP) != 0) + { + m_SndFile.Samples[nSmp].uFlags &= ~CHN_PINGPONGLOOP; + CHANGEMODTYPE_WARNING(wSampleBidiLoops); + } + + // Sustain loops if(m_SndFile.Samples[nSmp].nSustainStart || m_SndFile.Samples[nSmp].nSustainEnd) { + // We can at least try to convert sustain loops to normal loops + if(m_SndFile.Samples[nSmp].nLoopEnd == 0) + { + m_SndFile.Samples[nSmp].nSustainStart = m_SndFile.Samples[nSmp].nLoopStart; + m_SndFile.Samples[nSmp].nSustainEnd = m_SndFile.Samples[nSmp].nLoopEnd; + m_SndFile.Samples[nSmp].uFlags |= CHN_LOOP; + } m_SndFile.Samples[nSmp].nSustainStart = m_SndFile.Samples[nSmp].nSustainEnd = 0; + m_SndFile.Samples[nSmp].uFlags &= ~(CHN_SUSTAINLOOP|CHN_PINGPONGSUSTAIN); CHANGEMODTYPE_WARNING(wSampleSustainLoops); } + + // Autovibrato if(m_SndFile.Samples[nSmp].nVibDepth || m_SndFile.Samples[nSmp].nVibRate || m_SndFile.Samples[nSmp].nVibSweep) { m_SndFile.Samples[nSmp].nVibDepth = m_SndFile.Samples[nSmp].nVibRate = m_SndFile.Samples[nSmp].nVibSweep = m_SndFile.Samples[nSmp].nVibType = 0; @@ -381,14 +396,6 @@ END_CRITICAL(); ChangeFileExtension(nNewType); - //rewbs.cutomKeys: update effect key commands - CInputHandler *ih = CMainFrame::GetMainFrame()->GetInputHandler(); - if (newTypeIsMOD_XM) - ih->SetXMEffects(); - else - ih->SetITEffects(); - //end rewbs.cutomKeys - // Check mod specifications m_SndFile.m_nDefaultTempo = CLAMP(m_SndFile.m_nDefaultTempo, specs.tempoMin, specs.tempoMax); m_SndFile.m_nDefaultSpeed = CLAMP(m_SndFile.m_nDefaultSpeed, specs.speedMin, specs.speedMax); @@ -404,6 +411,7 @@ CHANGEMODTYPE_CHECK(wInstrumentsToSamples, "All instruments have been converted to samples.\n"); wsprintf(s, "%d patterns have been resized to 64 rows\n", nResizedPatterns); CHANGEMODTYPE_CHECK(wResizedPatterns, s); + CHANGEMODTYPE_CHECK(wSampleBidiLoops, "Sample bidi loops are not supported by the new format.\n"); CHANGEMODTYPE_CHECK(wSampleSustainLoops, "New format doesn't support sample sustain loops.\n"); CHANGEMODTYPE_CHECK(wSampleAutoVibrato, "New format doesn't support sample autovibrato.\n"); CHANGEMODTYPE_CHECK(wMODSampleFrequency, "Sample C-5 frequencies will be lost.\n"); @@ -425,6 +433,15 @@ GetSampleUndo()->ClearUndo(); UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODGENERAL); EndWaitCursor(); + + //rewbs.customKeys: update effect key commands + CInputHandler *ih = CMainFrame::GetMainFrame()->GetInputHandler(); + if (newTypeIsMOD_XM) + ih->SetXMEffects(); + else + ih->SetITEffects(); + //end rewbs.customKeys + return true; } Modified: trunk/OpenMPT/mptrack/ModConvert.h =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.h 2010-09-07 16:13:10 UTC (rev 702) +++ trunk/OpenMPT/mptrack/ModConvert.h 2010-09-07 17:45:33 UTC (rev 703) @@ -13,6 +13,7 @@ { wInstrumentsToSamples = 0, wResizedPatterns, + wSampleBidiLoops, wSampleSustainLoops, wSampleAutoVibrato, wMODSampleFrequency, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-09-08 23:51:52
|
Revision: 705 http://modplug.svn.sourceforge.net/modplug/?rev=705&view=rev Author: saga-games Date: 2010-09-08 23:51:45 +0000 (Wed, 08 Sep 2010) Log Message: ----------- [Ref] Rewrote the mod convert warning code a bit. Modified Paths: -------------- trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/mptrack/ModConvert.h trunk/OpenMPT/mptrack/Moddoc.h Modified: trunk/OpenMPT/mptrack/ModConvert.cpp =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.cpp 2010-09-08 23:45:46 UTC (rev 704) +++ trunk/OpenMPT/mptrack/ModConvert.cpp 2010-09-08 23:51:45 UTC (rev 705) @@ -13,7 +13,7 @@ * - Long instrument envelopes * - Envelope release node (this was previously also usable in the IT format, but is now deprecated in that format) * - * Extended features in IT/XM/S3M/MOD(not all listed below are available in all of those formats): + * Extended features in IT/XM/S3M/MOD (not all listed below are available in all of those formats): * - Plugins * - Extended ranges for * - Sample count @@ -42,14 +42,43 @@ #include "ModConvert.h" -#define CHANGEMODTYPE_WARNING(x) nWarnings |= (1 << x); -#define CHANGEMODTYPE_CHECK(x, s) if((nWarnings & (1 << x)) != 0) AddToLog(_T(s)); +#define CHANGEMODTYPE_WARNING(x) warnings.set(x); +#define CHANGEMODTYPE_CHECK(x, s) if(warnings[x]) AddToLog(_T(s)); +// Trim envelopes and remove release nodes. +void UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv, CSoundFile *pSndFile, std::bitset<wNumWarnings> &warnings) +//--------------------------------------------------------------------------------------------------------- +{ + // shorten instrument envelope if necessary (for mod conversion) + const UINT iEnvMax = pSndFile->GetModSpecifications().envelopePointsMax; + + #define TRIMENV(nPat) if(nPat > iEnvMax) { nPat = iEnvMax; CHANGEMODTYPE_WARNING(wTrimmedEnvelopes); } + + TRIMENV(mptEnv->nNodes); + TRIMENV(mptEnv->nLoopStart); + TRIMENV(mptEnv->nLoopEnd); + TRIMENV(mptEnv->nSustainStart); + TRIMENV(mptEnv->nSustainEnd); + if(mptEnv->nReleaseNode != ENV_RELEASE_NODE_UNSET) + { + TRIMENV(mptEnv->nReleaseNode); + if(!pSndFile->GetModSpecifications().hasReleaseNode) + { + mptEnv->nReleaseNode = ENV_RELEASE_NODE_UNSET; + CHANGEMODTYPE_WARNING(wReleaseNode); + } + } + + #undef TRIMENV +} + + bool CModDoc::ChangeModType(MODTYPE nNewType) //------------------------------------------- { - uint64 nWarnings = 0; + std::bitset<wNumWarnings> warnings; + warnings.reset(); PATTERNINDEX nResizedPatterns = 0; const MODTYPE nOldType = m_SndFile.GetType(); @@ -402,9 +431,9 @@ for(INSTRUMENTINDEX i = 1; i <= m_SndFile.m_nInstruments; i++) if(m_SndFile.Instruments[i] != nullptr) { - UpdateEnvelopes(&(m_SndFile.Instruments[i]->VolEnv), nWarnings); - UpdateEnvelopes(&(m_SndFile.Instruments[i]->PanEnv), nWarnings); - UpdateEnvelopes(&(m_SndFile.Instruments[i]->PitchEnv), nWarnings); + UpdateEnvelopes(&(m_SndFile.Instruments[i]->VolEnv), &m_SndFile, warnings); + UpdateEnvelopes(&(m_SndFile.Instruments[i]->PanEnv), &m_SndFile, warnings); + UpdateEnvelopes(&(m_SndFile.Instruments[i]->PitchEnv), &m_SndFile, warnings); } CHAR s[64]; @@ -419,7 +448,7 @@ CHANGEMODTYPE_CHECK(wInstrumentSustainLoops, "Sustain loops were converted to sustain points.\n"); CHANGEMODTYPE_CHECK(wInstrumentTuning, "Instrument tunings will be lost.\n"); CHANGEMODTYPE_CHECK(wMODGlobalVars, "Default speed, tempo and global volume will be lost.\n"); - CHANGEMODTYPE_CHECK(wMOD31Samples, "Samples above 31 will be lost when saving as MOD.\n"); + CHANGEMODTYPE_CHECK(wMOD31Samples, "Samples above 31 will be lost when saving as MOD. Consider rearranging samples if there are unused slots available.\n"); CHANGEMODTYPE_CHECK(wRestartPos, "Restart position is not supported by the new format.\n"); CHANGEMODTYPE_CHECK(wChannelVolSurround, "Channel volume and surround are not supported by the new format.\n"); CHANGEMODTYPE_CHECK(wChannelPanning, "Channel panning is not supported by the new format.\n"); @@ -445,33 +474,6 @@ return true; } -// Trim envelopes and remove release nodes. -void CModDoc::UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv, uint64 &nWarnings) -//-------------------------------------------------------------------------- -{ - // shorten instrument envelope if necessary (for mod conversion) - const UINT iEnvMax = m_SndFile.GetModSpecifications().envelopePointsMax; - #define TRIMENV(nPat) if(nPat > iEnvMax) { nPat = iEnvMax; CHANGEMODTYPE_WARNING(wTrimmedEnvelopes); } - - TRIMENV(mptEnv->nNodes); - TRIMENV(mptEnv->nLoopStart); - TRIMENV(mptEnv->nLoopEnd); - TRIMENV(mptEnv->nSustainStart); - TRIMENV(mptEnv->nSustainEnd); - if(mptEnv->nReleaseNode != ENV_RELEASE_NODE_UNSET) - { - TRIMENV(mptEnv->nReleaseNode); - if(!m_SndFile.GetModSpecifications().hasReleaseNode) - { - mptEnv->nReleaseNode = ENV_RELEASE_NODE_UNSET; - CHANGEMODTYPE_WARNING(wReleaseNode); - } - } - - #undef TRIMENV -} - - #undef CHANGEMODTYPE_WARNING #undef CHANGEMODTYPE_CHECK Modified: trunk/OpenMPT/mptrack/ModConvert.h =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.h 2010-09-08 23:45:46 UTC (rev 704) +++ trunk/OpenMPT/mptrack/ModConvert.h 2010-09-08 23:51:45 UTC (rev 705) @@ -7,6 +7,9 @@ * */ +#ifndef MODCONVERT_H +#define MODCONVERT_H +#pragma once // Warning types enum enmWarnings @@ -29,4 +32,7 @@ wLinearSlides, wTrimmedEnvelopes, wReleaseNode, + wNumWarnings }; + +#endif // MODCONVERT_H Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2010-09-08 23:45:46 UTC (rev 704) +++ trunk/OpenMPT/mptrack/Moddoc.h 2010-09-08 23:51:45 UTC (rev 705) @@ -123,7 +123,7 @@ struct SplitKeyboardSettings //========================== { - bool IsSplitActive() {return (octaveLink && (octaveModifier != 0)) || (splitInstrument > 0) || (splitVolume != 0);} + bool IsSplitActive() const { return (octaveLink && (octaveModifier != 0)) || (splitInstrument > 0) || (splitVolume != 0); } MODCOMMAND::NOTE splitNote; MODCOMMAND::INSTR splitInstrument; MODCOMMAND::VOL splitVolume; @@ -168,7 +168,7 @@ CSoundFile *GetSoundFile() { return &m_SndFile; } void SetPause(BOOL bPause) { m_bPaused = bPause; } void SetModified(BOOL bModified=TRUE) { SetModifiedFlag(bModified); bModifiedAutosave = (bModified != FALSE); } - BOOL ModifiedSinceLastAutosave() { bool bRetval = bModifiedAutosave; bModifiedAutosave = false; return bRetval; } // return "IsModified" value and reset it until the next SetModified() (as this is only used for polling) + bool ModifiedSinceLastAutosave() { bool bRetval = bModifiedAutosave; bModifiedAutosave = false; return bRetval; } // return "IsModified" value and reset it until the next SetModified() (as this is only used for polling) void SetShowSaveDialog(bool b) {m_ShowSavedialog = b;} void PostMessageToAllViews(UINT uMsg, WPARAM wParam=0, LPARAM lParam=0); void SendMessageToActiveViews(UINT uMsg, WPARAM wParam=0, LPARAM lParam=0); @@ -335,10 +335,7 @@ virtual void SetModifiedFlag(BOOL bModified=TRUE); //}}AFX_VIRTUAL - // for mod conversion - void UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv, uint64 &nWarnings); - // Implementation public: virtual ~CModDoc(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-09-12 19:55:20
|
Revision: 708 http://modplug.svn.sourceforge.net/modplug/?rev=708&view=rev Author: saga-games Date: 2010-09-12 19:55:14 +0000 (Sun, 12 Sep 2010) Log Message: ----------- [Imp] Made tagging functions a bit more stable (apparently nothing was broken, but let's better be safe than sorry) Modified Paths: -------------- trunk/OpenMPT/mptrack/tagging.cpp trunk/OpenMPT/mptrack/tagging.h Modified: trunk/OpenMPT/mptrack/tagging.cpp =================================================================== --- trunk/OpenMPT/mptrack/tagging.cpp 2010-09-11 15:42:24 UTC (rev 707) +++ trunk/OpenMPT/mptrack/tagging.cpp 2010-09-12 19:55:14 UTC (rev 708) @@ -86,15 +86,15 @@ void CFileTagging::WriteID3v2Frame(char cFrameID[4], string sFramecontent, FILE *f) //--------------------------------------------------------------------------------- { - if(!strcmp(cFrameID, "") || sFramecontent.empty() || !f) return; + if(!cFrameID[0] || sFramecontent.empty() || !f) return; - if(!strcmp(cFrameID, "COMM")) + if(!memcmp(cFrameID, "COMM", 4)) { // English language for comments - no description following (hence the text ending nullchar(s)) // For language IDs, see http://en.wikipedia.org/wiki/ISO-639-2 sFramecontent = "eng" + (ID3v2_TEXTENDING + sFramecontent); } - if(!strcmp(cFrameID, "WXXX")) + if(!memcmp(cFrameID, "WXXX", 4)) { // User-defined URL field (we have no description for the URL, so we leave it out) sFramecontent = ID3v2_TEXTENDING + sFramecontent; Modified: trunk/OpenMPT/mptrack/tagging.h =================================================================== --- trunk/OpenMPT/mptrack/tagging.h 2010-09-11 15:42:24 UTC (rev 707) +++ trunk/OpenMPT/mptrack/tagging.h 2010-09-12 19:55:14 UTC (rev 708) @@ -78,8 +78,8 @@ // charset... choose text ending accordingly. // $00 = ISO-8859-1. Terminated with $00. -// $01 = UTF-16. Terminated with $00 00. -// $02 = UTF-16BE. Terminated with $00 00. +// $01 = UTF-16 with BOM. Terminated with $00 00. +// $02 = UTF-16BE without BOM. Terminated with $00 00. // $03 = UTF-8. Terminated with $00. #ifdef UNICODE #define ID3v2_CHARSET '\3' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-09-13 15:53:22
|
Revision: 709 http://modplug.svn.sourceforge.net/modplug/?rev=709&view=rev Author: saga-games Date: 2010-09-13 15:53:16 +0000 (Mon, 13 Sep 2010) Log Message: ----------- [Fix] Instrument editor: Changing the filter mode didn't set the file as modified. [Fix] (Just a theoretical fix at the moment, since OpenMPT just runs on little-endian hosts anyway): When converting ints to synchsafe ints, the input variable must match the host's endianness. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/tagging.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-09-12 19:55:14 UTC (rev 708) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-09-13 15:53:16 UTC (rev 709) @@ -2311,16 +2311,17 @@ if ((!IsLocked()) && (pIns)) { int instFiltermode = m_CbnFilterMode.GetItemData(m_CbnFilterMode.GetCurSel()); - if (!m_pModDoc) { + if (!m_pModDoc) return; - } CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) { + if (pIns) + { pIns->nFilterMode = instFiltermode; + m_pModDoc->SetModified(); // Translate from mode as stored in instrument to mode as understood by player. // (The reason for the translation is that the player treats 0 as lowpass, @@ -2334,11 +2335,12 @@ }*/ //Update channel settings where this instrument is active, if required. - if (instFiltermode != FLTMODE_UNCHANGED) { - for (UINT i=0; i<MAX_CHANNELS; i++) { - if (pSndFile->Chn[i].pModInstrument == pIns) { + if(instFiltermode != FLTMODE_UNCHANGED) + { + for (CHANNELINDEX i = 0; i < MAX_CHANNELS; i++) + { + if (pSndFile->Chn[i].pModInstrument == pIns) pSndFile->Chn[i].nFilterMode = instFiltermode; - } } } Modified: trunk/OpenMPT/mptrack/tagging.cpp =================================================================== --- trunk/OpenMPT/mptrack/tagging.cpp 2010-09-12 19:55:14 UTC (rev 708) +++ trunk/OpenMPT/mptrack/tagging.cpp 2010-09-13 15:53:16 UTC (rev 709) @@ -27,9 +27,9 @@ uint32 CFileTagging::intToSynchsafe(uint32 iIn) //--------------------------------------------- { - iIn = LittleEndian(iIn); uint32 iOut = 0, iSteps = 0; - do { + do + { iOut |= (iIn & 0x7F) << iSteps; iSteps += 8; } while(iIn >>= 7); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-10-12 20:17:46
|
Revision: 737 http://modplug.svn.sourceforge.net/modplug/?rev=737&view=rev Author: saga-games Date: 2010-10-12 20:17:40 +0000 (Tue, 12 Oct 2010) Log Message: ----------- [New] Experimental feature: Play the whole pattern row when entering notes and chords into the pattern editor. [Mod] OpenMPT: Version is now 1.19.00.07 Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Moptions.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2010-10-12 20:13:10 UTC (rev 736) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2010-10-12 20:17:40 UTC (rev 737) @@ -462,8 +462,10 @@ m_dwPatternSetup |= PATTERN_NOTEFADE; if(vIniVersion < MAKE_VERSION_NUMERIC(1,17,03,01)) m_dwPatternSetup |= PATTERN_RESETCHANNELS; - if(vIniVersion < MAKE_VERSION_NUMERIC(1,19,00,00)) - m_dwPatternSetup &= ~(0x800|0x200000|0x400000); // various deprecated old options + if(vIniVersion < MAKE_VERSION_NUMERIC(1,19,00,07)) + m_dwPatternSetup &= ~0x800; // this was previously deprecated and is now used for something else + if(vIniVersion < MPT_VERSION_NUMERIC) + m_dwPatternSetup &= ~(0x200000|0x400000); // various deprecated old options m_nRowSpacing = GetPrivateProfileDWord("Pattern Editor", "RowSpacing", 16, iniFile); m_nRowSpacing2 = GetPrivateProfileDWord("Pattern Editor", "RowSpacing2", 4, iniFile); @@ -600,9 +602,9 @@ RegQueryValueEx(key, "MidiSetup", NULL, &dwREG_DWORD, (LPBYTE)&m_dwMidiSetup, &dwDWORDSize); RegQueryValueEx(key, "MidiDevice", NULL, &dwREG_DWORD, (LPBYTE)&m_nMidiDevice, &dwDWORDSize); RegQueryValueEx(key, "PatternSetup", NULL, &dwREG_DWORD, (LPBYTE)&m_dwPatternSetup, &dwDWORDSize); + m_dwPatternSetup &= ~(0x800|0x200000|0x400000); // various deprecated old options m_dwPatternSetup |= PATTERN_NOTEFADE; // Set flag to maintain old behaviour (was changed in 1.17.02.50). m_dwPatternSetup |= PATTERN_RESETCHANNELS; // Set flag to reset channels on loop was changed in 1.17.03.01). - m_dwPatternSetup &= ~0x800; // quick paste autorepeat is now a keymap option RegQueryValueEx(key, "RowSpacing", NULL, &dwREG_DWORD, (LPBYTE)&m_nRowSpacing, &dwDWORDSize); RegQueryValueEx(key, "RowSpacing2", NULL, &dwREG_DWORD, (LPBYTE)&m_nRowSpacing2, &dwDWORDSize); RegQueryValueEx(key, "LoopSong", NULL, &dwREG_DWORD, (LPBYTE)&gbLoopSong, &dwDWORDSize); Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2010-10-12 20:13:10 UTC (rev 736) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2010-10-12 20:17:40 UTC (rev 737) @@ -173,7 +173,7 @@ #define PATTERN_FLATBUTTONS 0x100 // flat toolbar buttons #define PATTERN_CREATEBACKUP 0x200 // create .bak files when saving #define PATTERN_SINGLEEXPAND 0x400 // single click to expand tree -//#define PATTERN_AUTOSPACEBAR 0x800 // space bar repeats previous action - DOES NOT EXIST ANYMORE, use "on key hold" instead +#define PATTERN_PLAYEDITROW 0x800 // play all notes on the current row while entering notes #define PATTERN_NOEXTRALOUD 0x1000 // no loud samples in sample editor #define PATTERN_DRAGNDROPEDIT 0x2000 // enable drag and drop editing #define PATTERN_2NDHIGHLIGHT 0x4000 // activate secondary highlight Modified: trunk/OpenMPT/mptrack/Moptions.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moptions.cpp 2010-10-12 20:13:10 UTC (rev 736) +++ trunk/OpenMPT/mptrack/Moptions.cpp 2010-10-12 20:17:40 UTC (rev 737) @@ -556,6 +556,7 @@ enum { OPTGEN_PLAYNEWNOTES=0, + OPTGEN_PLAYEDITROW, OPTGEN_CENTERROW, OPTGEN_LARGECOMMENTSFONT, OPTGEN_HEXROWDISP, @@ -586,6 +587,7 @@ static OPTGENDESC gOptGenDesc[OPTGEN_MAXOPTIONS] = { {PATTERN_PLAYNEWNOTE, "Play new notes while recording", "When this option is enabled, notes entered in the pattern editor will always be played (If not checked, notes won't be played in record mode)."}, + {PATTERN_PLAYEDITROW, "Play whole row while recording", "When this option is enabled, all notes on the current row are played when entering notes in the pattern editor."}, {PATTERN_CENTERROW, "Always center active row", "Turn on this option to have the active row always centered in the pattern editor (requires \"Always center active row\")."}, {PATTERN_LARGECOMMENTS, "Use large font for comments", "With this option enabled, the song message editor will use a larger font."}, {PATTERN_HEXDISPLAY, "Display rows in hex", "With this option enabled, row numbers and sequence numbers will be displayed in hexadecimal."}, Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2010-10-12 20:13:10 UTC (rev 736) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2010-10-12 20:17:40 UTC (rev 737) @@ -2002,6 +2002,13 @@ void CViewPattern::OnPatternStep() //-------------------------------- { + PatternStep(true); +} + + +void CViewPattern::PatternStep(bool autoStep) +//--------------------------------------------- +{ CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); @@ -2025,10 +2032,13 @@ pMainFrm->PlayMod(pModDoc, m_hWnd, MPTNOTIFY_POSITION|MPTNOTIFY_VUMETERS); } CMainFrame::EnableLowLatencyMode(); - if (CMainFrame::m_dwPatternSetup & PATTERN_CONTSCROLL) - SetCurrentRow(GetCurrentRow()+1, TRUE); - else - SetCurrentRow((GetCurrentRow()+1) % pSndFile->Patterns[m_nPattern].GetNumRows(), FALSE); + if(autoStep) + { + if (CMainFrame::m_dwPatternSetup & PATTERN_CONTSCROLL) + SetCurrentRow(GetCurrentRow() + 1, TRUE); + else + SetCurrentRow((GetCurrentRow() + 1) % pSndFile->Patterns[m_nPattern].GetNumRows(), FALSE); + } SetFocus(); } } @@ -4109,7 +4119,7 @@ } void CViewPattern::TempEnterIns(int val) -//--------------------------------------------- +//-------------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); @@ -4205,7 +4215,7 @@ BYTE recordGroup = pModDoc->IsChannelRecord(nChn); UINT nPlayIns = 0; const bool bIsLiveRecord = IsLiveRecord(*pMainFrm, *pModDoc, *pSndFile); - const bool usePlaybackPosition = (bIsLiveRecord && (CMainFrame::m_dwPatternSetup & PATTERN_AUTODELAY)); + const bool usePlaybackPosition = (bIsLiveRecord && (CMainFrame::m_dwPatternSetup & PATTERN_AUTODELAY) && !(pSndFile->m_dwSongFlags & SONG_STEP)); //Param control 'note' if(MODCOMMAND::IsPcNote(note) && bRecordEnabled) { @@ -4370,38 +4380,48 @@ } // -- play note - if ((CMainFrame::m_dwPatternSetup & PATTERN_PLAYNEWNOTE) || (bRecordEnabled == false)) + if ((CMainFrame::m_dwPatternSetup & (PATTERN_PLAYNEWNOTE|PATTERN_PLAYEDITROW)) || (bRecordEnabled == false)) { - if (p->instr) nPlayIns = p->instr; - - else if ((!p->instr) && (p->note < 128)) + if ((CMainFrame::m_dwPatternSetup & PATTERN_PLAYEDITROW) && !bIsLiveRecord) { - MODCOMMAND *search = p; - UINT srow = nRow; - while (srow > 0) + // play the whole row + PatternStep(false); + } else + { + // just play the newly inserted note... + if (p->instr) { - srow--; - search -= pSndFile->m_nChannels; - if (search->instr) + // ...using the already specified instrument + nPlayIns = p->instr; + } else if ((!p->instr) && (p->note <= NOTE_MAX)) + { + // ...or one that can be found on a previous row of this pattern. + MODCOMMAND *search = p; + UINT srow = nRow; + while (srow-- > 0) { - nPlayIns = search->instr; - m_nFoundInstrument = nPlayIns; //used to figure out which instrument to stop on key release. - break; + search -= pSndFile->m_nChannels; + if (search->instr) + { + nPlayIns = search->instr; + m_nFoundInstrument = nPlayIns; //used to figure out which instrument to stop on key release. + break; + } } } - } - BOOL bNotPlaying = ((pMainFrm->GetModPlaying() == pModDoc) && (pMainFrm->IsPlaying())) ? FALSE : TRUE; - //pModDoc->PlayNote(p->note, nPlayIns, 0, bNotPlaying, -1, 0, 0, nChn); //rewbs.vstiLive - added extra args - pModDoc->PlayNote(p->note, nPlayIns, 0, bNotPlaying, 4*vol, 0, 0, nChn); //rewbs.vstiLive - added extra args -/* for (UINT kplchrd=0; kplchrd<nPlayChord; kplchrd++) - { - if (chordplaylist[kplchrd]) + BOOL bNotPlaying = ((pMainFrm->GetModPlaying() == pModDoc) && (pMainFrm->IsPlaying())) ? FALSE : TRUE; + //pModDoc->PlayNote(p->note, nPlayIns, 0, bNotPlaying, -1, 0, 0, nChn); //rewbs.vstiLive - added extra args + pModDoc->PlayNote(p->note, nPlayIns, 0, bNotPlaying, 4*vol, 0, 0, nChn); //rewbs.vstiLive - added extra args +/* for (UINT kplchrd=0; kplchrd<nPlayChord; kplchrd++) { - pModDoc->PlayNote(chordplaylist[kplchrd], nPlayIns, 0, FALSE, -1, 0, 0, nChn); //rewbs.vstiLive - - added extra args - m_dwStatus |= PATSTATUS_CHORDPLAYING; + if (chordplaylist[kplchrd]) + { + pModDoc->PlayNote(chordplaylist[kplchrd], nPlayIns, 0, FALSE, -1, 0, 0, nChn); //rewbs.vstiLive - - added extra args + m_dwStatus |= PATSTATUS_CHORDPLAYING; + } } +*/ } -*/ } //-- if not recording, restore old command. @@ -4433,6 +4453,7 @@ MODCOMMAND* p = &prowbase[nChn]; const MODCOMMAND oldcmd = *p; // This is the command we are about to overwrite + const bool bIsLiveRecord = IsLiveRecord(*pMainFrm, *pModDoc, *pSndFile); // -- establish note data //const bool isSplit = HandleSplit(p, note); @@ -4517,34 +4538,45 @@ } // -- play note - if ((CMainFrame::m_dwPatternSetup & PATTERN_PLAYNEWNOTE) || (!(IsEditingEnabled()))) + if ((CMainFrame::m_dwPatternSetup & (PATTERN_PLAYNEWNOTE|PATTERN_PLAYEDITROW)) || (!(IsEditingEnabled()))) { - if (p->instr) nPlayIns = p->instr; - - else if ((!p->instr) && (p->note < 128)) + if ((CMainFrame::m_dwPatternSetup & PATTERN_PLAYEDITROW) && !bIsLiveRecord) { - MODCOMMAND *search = p; - UINT srow = m_nRow; - while (srow > 0) + // play the whole row + PatternStep(false); + } else + { + // just play the newly inserted notes... + if (p->instr) { - srow--; - search -= pSndFile->m_nChannels; - if (search->instr) + // ...using the already specified instrument + nPlayIns = p->instr; + } else if ((!p->instr) && (p->note < 128)) + { + // ...or one that can be found on a previous row of this pattern. + MODCOMMAND *search = p; + UINT srow = m_nRow; + while (srow > 0) { - nPlayIns = search->instr; - m_nFoundInstrument = nPlayIns; //used to figure out which instrument to stop on key release. - break; + srow--; + search -= pSndFile->m_nChannels; + if (search->instr) + { + nPlayIns = search->instr; + m_nFoundInstrument = nPlayIns; //used to figure out which instrument to stop on key release. + break; + } } } - } - BOOL bNotPlaying = ((pMainFrm->GetModPlaying() == pModDoc) && (pMainFrm->IsPlaying())) ? FALSE : TRUE; - pModDoc->PlayNote(p->note, nPlayIns, 0, bNotPlaying, -1, 0, 0, nChn); //rewbs.vstiLive - added extra args - for (UINT kplchrd=0; kplchrd<nPlayChord; kplchrd++) - { - if (chordplaylist[kplchrd]) + BOOL bNotPlaying = ((pMainFrm->GetModPlaying() == pModDoc) && (pMainFrm->IsPlaying())) ? FALSE : TRUE; + pModDoc->PlayNote(p->note, nPlayIns, 0, bNotPlaying, -1, 0, 0, nChn); //rewbs.vstiLive - added extra args + for (UINT kplchrd=0; kplchrd<nPlayChord; kplchrd++) { - pModDoc->PlayNote(chordplaylist[kplchrd], nPlayIns, 0, FALSE, -1, 0, 0, nChn); //rewbs.vstiLive - - added extra args - m_dwStatus |= PATSTATUS_CHORDPLAYING; + if (chordplaylist[kplchrd]) + { + pModDoc->PlayNote(chordplaylist[kplchrd], nPlayIns, 0, FALSE, -1, 0, 0, nChn); //rewbs.vstiLive - - added extra args + m_dwStatus |= PATSTATUS_CHORDPLAYING; + } } } } // end play note Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2010-10-12 20:13:10 UTC (rev 736) +++ trunk/OpenMPT/mptrack/View_pat.h 2010-10-12 20:17:40 UTC (rev 737) @@ -375,8 +375,10 @@ //Like IsEditingEnabled(), but shows some notification when editing is not enabled. bool IsEditingEnabled_bmsg(); - + // Play one pattern row and stop ("step mode") + void PatternStep(bool autoStep); + public: afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point); private: Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2010-10-12 20:13:10 UTC (rev 736) +++ trunk/OpenMPT/mptrack/version.h 2010-10-12 20:17:40 UTC (rev 737) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 19 #define VER_MINOR 00 -#define VER_MINORMINOR 06 +#define VER_MINORMINOR 07 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-10-16 00:26:54
|
Revision: 742 http://modplug.svn.sourceforge.net/modplug/?rev=742&view=rev Author: saga-games Date: 2010-10-16 00:26:47 +0000 (Sat, 16 Oct 2010) Log Message: ----------- [Fix] Playing instruments in the pattern while recording is disabled is now possible again (broke with the new "play whole row" setting) [Mod] OpenMPT: Version is now 1.19.00.09 Modified Paths: -------------- trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2010-10-15 20:50:52 UTC (rev 741) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2010-10-16 00:26:47 UTC (rev 742) @@ -4319,12 +4319,6 @@ if (oldStyle && ((p->note == NOTE_NOTECUT) || (p->note == NOTE_KEYOFF) || (p->note == NOTE_FADE))) p->instr=0; - //-- if not recording, restore old command. - if (bRecordEnabled == false) - { - *p = oldcmd; - } - // -- play note if ((CMainFrame::m_dwPatternSetup & (PATTERN_PLAYNEWNOTE|PATTERN_PLAYEDITROW)) || (!bRecordEnabled)) { @@ -4370,6 +4364,12 @@ } } + //-- if not recording, restore old command. + if (bRecordEnabled == false) + { + *p = oldcmd; + } + // -- if recording, handle post note entry behaviour (move cursor etc..) if(bRecordEnabled) { @@ -4411,7 +4411,7 @@ BYTE* activeNoteMap = isSplit ? splitActiveNoteChannel : activeNoteChannel; if (p->note <= NOTE_MAX) - activeNoteMap[p->note]=nChn; + activeNoteMap[p->note] = nChn; //Move to next channel if required if (recordGroup) @@ -4466,7 +4466,12 @@ const PatternRow prowbase = pSndFile->Patterns[m_nPattern].GetRow(m_nRow); MODCOMMAND* p = &prowbase[nChn]; - const MODCOMMAND oldcmd = *p; // This is the command we are about to overwrite + // Save old row contents + vector<MODCOMMAND> oldrow(pSndFile->GetNumChannels()); + for(CHANNELINDEX nChn = 0; nChn < pSndFile->GetNumChannels(); nChn++) + { + oldrow[nChn] = prowbase[nChn]; + } const bool bIsLiveRecord = IsLiveRecord(*pMainFrm, *pModDoc, *pSndFile); const bool bRecordEnabled = IsEditingEnabled(); @@ -4479,9 +4484,10 @@ UINT baseoctave = pMainFrm->GetBaseOctave(); UINT nchord = note - baseoctave * 12 - 1; UINT nNote; - if (nchord < 3*12) + bool modified = false; + if (nchord < 3 * 12) { - UINT nchordnote = pChords[nchord].key + baseoctave*12 + 1; + UINT nchordnote = pChords[nchord].key + baseoctave * 12 + 1; // Rev. 244, commented the isSplit conditions below, can't see the point in it. //if (isSplit) // nchordnote = pChords[nchord].key + baseoctave*(p->note%12) + 1; @@ -4512,38 +4518,26 @@ { prowbase[nchordch].note = n; if (p->instr) prowbase[nchordch].instr = p->instr; + if(prowbase[nchordch] != oldrow[nchordch]) + { + modified = true; + } + nchno++; if (CMainFrame::m_dwPatternSetup & PATTERN_PLAYNEWNOTE) { - if ((n) && (n<=NOTE_MAX)) chordplaylist[nPlayChord++] = n; + if ((n) && (n <= NOTE_MAX)) chordplaylist[nPlayChord++] = n; } } } else { nchno++; - if ((n) && (n<=NOTE_MAX)) chordplaylist[nPlayChord++] = n; + if ((n) && (n <= NOTE_MAX)) chordplaylist[nPlayChord++] = n; } } } } - // -- write notedata - if(bRecordEnabled) - { - DWORD sel = (m_nRow << 16) | m_dwCursor; - SetCurSel(sel, sel); - sel &= ~7; - if(*p != oldcmd) - { - pModDoc->SetModified(); - InvalidateRow(); - UpdateIndicator(); - } - } else - { - // recording disabled - *p = oldcmd; - } // -- play note if ((CMainFrame::m_dwPatternSetup & (PATTERN_PLAYNEWNOTE|PATTERN_PLAYEDITROW)) || (!bRecordEnabled)) @@ -4559,7 +4553,7 @@ { // ...using the already specified instrument nPlayIns = p->instr; - } else if ((!p->instr) && (p->note < 128)) + } else if ((!p->instr) && (p->note <= NOTE_MAX)) { // ...or one that can be found on a previous row of this pattern. MODCOMMAND *search = p; @@ -4588,6 +4582,28 @@ } } // end play note + + // -- write notedata + if(bRecordEnabled) + { + DWORD sel = (m_nRow << 16) | m_dwCursor; + SetCurSel(sel, sel); + sel &= ~7; + if(modified) + { + pModDoc->SetModified(); + InvalidateRow(); + UpdateIndicator(); + } + } else + { + // recording disabled + for(CHANNELINDEX nChn = 0; nChn < pSndFile->GetNumChannels(); nChn++) + { + prowbase[nChn] = oldrow[nChn]; + } + } + // Set new cursor position (row spacing) - only when not recording live if (bRecordEnabled && !bIsLiveRecord) { Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2010-10-15 20:50:52 UTC (rev 741) +++ trunk/OpenMPT/mptrack/version.h 2010-10-16 00:26:47 UTC (rev 742) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 19 #define VER_MINOR 00 -#define VER_MINORMINOR 08 +#define VER_MINORMINOR 09 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-10-25 19:31:23
|
Revision: 752 http://modplug.svn.sourceforge.net/modplug/?rev=752&view=rev Author: saga-games Date: 2010-10-25 19:31:16 +0000 (Mon, 25 Oct 2010) Log Message: ----------- [Fix] The speed input field on the general tab broke for S3M files in rev.744 [Fix] WAV cue points were not written properly on Big-Endian system, which is not really an error since OpenMPT doesn't run on any of them anyway. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Mod2wave.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2010-10-25 19:28:16 UTC (rev 751) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2010-10-25 19:31:16 UTC (rev 752) @@ -96,7 +96,7 @@ if(m_pSndFile->GetType() & MOD_TYPE_S3M) { m_SpinTempo.SetRange(33, 255); - m_SpinSpeed.SetRange(1, 25); + m_SpinSpeed.SetRange(1, 255); } else { m_SpinTempo.SetRange((short)specs.tempoMin, (short)specs.tempoMax); Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2010-10-25 19:28:16 UTC (rev 751) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2010-10-25 19:31:16 UTC (rev 752) @@ -870,10 +870,10 @@ // Write all cue points vector<PatternCuePoint>::const_iterator iter; DWORD num = 0; - for(iter = m_pSndFile->m_PatternCuePoints.begin(); iter != m_pSndFile->m_PatternCuePoints.end(); ++iter) + for(iter = m_pSndFile->m_PatternCuePoints.begin(); iter != m_pSndFile->m_PatternCuePoints.end(); ++iter, num++) { WAVCUEPOINT cuepoint; - cuepoint.cp_id = LittleEndian(num++); + cuepoint.cp_id = LittleEndian(num); cuepoint.cp_pos = LittleEndian((DWORD)iter->offset); cuepoint.cp_chunkid = LittleEndian(IFFID_data); cuepoint.cp_chunkstart = 0; // we use no Wave List Chunk (wavl) as we have only one data block, so this should be 0. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |