From: <sag...@us...> - 2012-09-18 20:10:05
|
Revision: 1352 http://modplug.svn.sourceforge.net/modplug/?rev=1352&view=rev Author: saga-games Date: 2012-09-18 20:09:56 +0000 (Tue, 18 Sep 2012) Log Message: ----------- [New/Fix/Imp] Refined VSTi portamento system: Specify the plugin's pitch wheel depth in the instrument settings and all portamentos and vibratos made with this instrument will sound identical to sample portamentos / vibratos. For old files, there is a compatible mode with the old behaviour (to be found in the song properties). For modules made with OpenMPT 1.20.02.01 - 1.20.02.09, pitch wheel depth has to be reset to 2 for proper VSTi vibrato. [Ref] A bit of VST code cleanup (reordering of variables for better struct packing and removal of unused variables) [Mod] OpenMPT: Version is now 1.20.02.10 Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Loaders.h trunk/OpenMPT/soundlib/ModInstrument.cpp trunk/OpenMPT/soundlib/ModInstrument.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/XMTools.cpp trunk/OpenMPT/soundlib/plugins/PlugInterface.h Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2012-09-18 20:09:56 UTC (rev 1352) @@ -795,6 +795,7 @@ ON_EN_CHANGE(IDC_EDIT10, OnMPRChanged) ON_EN_CHANGE(IDC_EDIT11, OnMBKChanged) //rewbs.MidiBank ON_EN_CHANGE(IDC_EDIT15, OnPPSChanged) + ON_EN_CHANGE(IDC_PITCHWHEELDEPTH, OnPitchWheelDepthChanged) // -> CODE#0027 // -> DESC="per-instrument volume ramping setup (refered as attack)" @@ -809,9 +810,9 @@ ON_CBN_SELCHANGE(IDC_COMBO6, OnMixPlugChanged) //rewbs.instroVSTi ON_CBN_SELCHANGE(IDC_COMBO9, OnResamplingChanged) ON_CBN_SELCHANGE(IDC_FILTERMODE, OnFilterModeChanged) - ON_CBN_SELCHANGE(IDC_PLUGIN_VELOCITYSTYLE, OnPluginVelocityHandlingChanged) - ON_CBN_SELCHANGE(IDC_PLUGIN_VOLUMESTYLE, OnPluginVolumeHandlingChanged) - ON_COMMAND(ID_INSTRUMENT_SAMPLEMAP, OnEditSampleMap) + ON_CBN_SELCHANGE(IDC_PLUGIN_VOLUMESTYLE, OnPluginVolumeHandlingChanged) + ON_COMMAND(IDC_PLUGIN_VELOCITYSTYLE, OnPluginVelocityHandlingChanged) + ON_COMMAND(ID_INSTRUMENT_SAMPLEMAP, OnEditSampleMap) //}}AFX_MSG_MAP ON_CBN_SELCHANGE(IDC_COMBOTUNING, OnCbnSelchangeCombotuning) ON_EN_CHANGE(IDC_EDIT_PITCHTEMPOLOCK, OnEnChangeEditPitchtempolock) @@ -864,8 +865,9 @@ DDX_Control(pDX, IDC_COMBOTUNING, m_ComboTuning); DDX_Control(pDX, IDC_CHECK_PITCHTEMPOLOCK, m_CheckPitchTempoLock); DDX_Control(pDX, IDC_EDIT_PITCHTEMPOLOCK, m_EditPitchTempoLock); - DDX_Control(pDX, IDC_PLUGIN_VELOCITYSTYLE, m_CbnPluginVelocityHandling); - DDX_Control(pDX, IDC_PLUGIN_VOLUMESTYLE, m_CbnPluginVolumeHandling); + DDX_Control(pDX, IDC_PLUGIN_VOLUMESTYLE, m_CbnPluginVolumeHandling); + DDX_Control(pDX, IDC_PLUGIN_VELOCITYSTYLE, velocityStyle); + DDX_Control(pDX, IDC_SPIN2, pwdSpin); //}}AFX_DATA_MAP } @@ -945,8 +947,6 @@ m_CbnFilterMode.SetItemData(m_CbnFilterMode.AddString("Force highpass"), FLTMODE_HIGHPASS); //VST velocity/volume handling - m_CbnPluginVelocityHandling.AddString("Use note volume"); - m_CbnPluginVelocityHandling.AddString("Process as volume"); m_CbnPluginVolumeHandling.AddString("MIDI volume"); m_CbnPluginVolumeHandling.AddString("Dry/Wet ratio"); m_CbnPluginVolumeHandling.AddString("None"); @@ -973,6 +973,8 @@ m_SpinInstrument.SetFocus(); + GetDlgItem(IDC_PITCHWHEELDEPTH)->EnableWindow(FALSE); + BuildTuningComboBox(); CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, MF_UNCHECKED); @@ -1195,6 +1197,14 @@ // Panning ranges (0...64 for IT, 0...256 for MPTM) m_SpinPanning.SetRange(0, (m_pSndFile->GetType() & MOD_TYPE_IT) ? 64 : 256); + // Pitch Wheel Depth + if(m_pSndFile->GetType() == MOD_TYPE_XM) + pwdSpin.SetRange(0, 36); + else + pwdSpin.SetRange(-128, 127); + GetDlgItem(IDC_PITCHWHEELDEPTH)->EnableWindow(bITandXM); + pwdSpin.EnableWindow(bITandXM); + m_NoteMap.EnableWindow(bITandXM); m_CbnResampling.EnableWindow(bITandXM); @@ -1339,30 +1349,23 @@ m_CheckPitchTempoLock.EnableWindow(m_EditPitchTempoLock.IsWindowEnabled()); CheckDlgButton(IDC_CHECK_PITCHTEMPOLOCK, (pIns->wPitchToTempoLock > 0 ? MF_CHECKED : MF_UNCHECKED)); + // Pitch Wheel Depth + SetDlgItemInt(IDC_PITCHWHEELDEPTH, pIns->midiPWD, TRUE); + OnBnClickedCheckPitchtempolock(); if(m_pSndFile->GetType() & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) { - if(m_CbnMixPlug.GetCurSel() > 0 && m_pSndFile->GetModFlag(MSF_MIDICC_BUGEMULATION) == false) - { - m_CbnPluginVelocityHandling.EnableWindow(TRUE); - m_CbnPluginVolumeHandling.EnableWindow(TRUE); - } - else - { - m_CbnPluginVelocityHandling.EnableWindow(FALSE); - m_CbnPluginVolumeHandling.EnableWindow(FALSE); - } - + BOOL enableVol = (m_CbnMixPlug.GetCurSel() > 0 && !m_pSndFile->GetModFlag(MSF_MIDICC_BUGEMULATION)) ? TRUE : FALSE; + velocityStyle.EnableWindow(enableVol); + m_CbnPluginVolumeHandling.EnableWindow(enableVol); } } else { m_EditName.SetWindowText(""); m_EditFileName.SetWindowText(""); - m_CbnPluginVelocityHandling.EnableWindow(FALSE); + velocityStyle.EnableWindow(FALSE); m_CbnPluginVolumeHandling.EnableWindow(FALSE); - m_CbnPluginVelocityHandling.SetCurSel(-1); - m_CbnPluginVolumeHandling.SetCurSel(-1); if(m_nInstrument > m_pSndFile->GetNumInstruments()) SetCurrentInstrument(m_pSndFile->GetNumInstruments()); @@ -1587,13 +1590,19 @@ if(pIns->nMixPlug < 1) return FALSE; if(m_pSndFile->GetModFlag(MSF_MIDICC_BUGEMULATION)) { - m_CbnPluginVelocityHandling.EnableWindow(FALSE); + velocityStyle.EnableWindow(FALSE); m_CbnPluginVolumeHandling.EnableWindow(FALSE); strcpy(pszText, "To enable, clear Plugin volume command bug emulation flag from Song Properties"); return TRUE; + } else + { + if(uId == IDC_PLUGIN_VELOCITYSTYLE) + { + strcpy(pszText, "Volume commands (vxx) next to a note are sent as note velocity instead."); + return TRUE; + } + return FALSE; } - else - return FALSE; case IDC_COMBO5: // MIDI Channel @@ -1624,6 +1633,10 @@ wsprintf(pszText, "\xB1%d resonance variation", pIns->nResSwing); return TRUE; + case IDC_PITCHWHEELDEPTH: + strcpy(pszText, "Set this to the actual Pitch Wheel Depth used in your plugin on this channel."); + return TRUE; + } } return FALSE; @@ -2125,17 +2138,11 @@ if (pIns) { - if(nPlug < 1 || m_pSndFile->GetModFlag(MSF_MIDICC_BUGEMULATION)) - { - m_CbnPluginVelocityHandling.EnableWindow(FALSE); - m_CbnPluginVolumeHandling.EnableWindow(FALSE); - } else - { - m_CbnPluginVelocityHandling.EnableWindow(); - m_CbnPluginVolumeHandling.EnableWindow(); - } + BOOL enableVol = (nPlug < 1 || m_pSndFile->GetModFlag(MSF_MIDICC_BUGEMULATION)) ? FALSE : TRUE; + velocityStyle.EnableWindow(enableVol); + m_CbnPluginVolumeHandling.EnableWindow(enableVol); - if (nPlug>=0 && nPlug <= MAX_MIXPLUGINS) + if(nPlug >= 0 && nPlug <= MAX_MIXPLUGINS) { if ((!IsLocked()) && pIns->nMixPlug != nPlug) { @@ -2143,7 +2150,8 @@ SetInstrumentModified(true); m_pModDoc->UpdateAllViews(NULL, HINT_MIXPLUGINS, this); } - m_CbnPluginVelocityHandling.SetCurSel(pIns->nPluginVelocityHandling); + + velocityStyle.SetCheck(pIns->nPluginVelocityHandling == PLUGIN_VELOCITYHANDLING_CHANNEL ? BST_CHECKED : BST_UNCHECKED); m_CbnPluginVolumeHandling.SetCurSel(pIns->nPluginVolumeHandling); if(pIns->nMixPlug) @@ -2719,15 +2727,10 @@ { if(IsLocked() || !m_pModDoc || !m_pSndFile || !m_nInstrument || !m_pSndFile->Instruments[m_nInstrument]) return; - const TEMPO MINTEMPO = m_pSndFile->GetModSpecifications().tempoMin; - const TEMPO MAXTEMPO = m_pSndFile->GetModSpecifications().tempoMax; char buffer[7]; m_EditPitchTempoLock.GetWindowText(buffer, 6); - int ptlTempo = atoi(buffer); - if(ptlTempo < MINTEMPO) - ptlTempo = MINTEMPO; - if(ptlTempo > MAXTEMPO) - ptlTempo = MAXTEMPO; + TEMPO ptlTempo = atoi(buffer); + Limit(ptlTempo, m_pSndFile->GetModSpecifications().tempoMin, m_pSndFile->GetModSpecifications().tempoMax); CriticalSection cs; m_pSndFile->Instruments[m_nInstrument]->wPitchToTempoLock = ptlTempo; @@ -2737,14 +2740,20 @@ void CCtrlInstruments::OnPluginVelocityHandlingChanged() -//------------------------------------------------ +//------------------------------------------------------ { ModInstrument *pIns = m_pSndFile->Instruments[m_nInstrument]; - if ((!IsLocked()) && (pIns)) + if(!IsLocked() && pIns != nullptr) { - BYTE n = static_cast<BYTE>(m_CbnPluginVelocityHandling.GetCurSel()); + uint8 n = static_cast<uint8>(velocityStyle.GetCheck() != BST_UNCHECKED ? PLUGIN_VELOCITYHANDLING_CHANNEL : PLUGIN_VELOCITYHANDLING_VOLUME); if(n != pIns->nPluginVelocityHandling) { + if(n == PLUGIN_VELOCITYHANDLING_VOLUME && m_CbnPluginVolumeHandling.GetCurSel() == PLUGIN_VOLUMEHANDLING_IGNORE) + { + // This combination doesn't make sense. + m_CbnPluginVolumeHandling.SetCurSel(PLUGIN_VOLUMEHANDLING_MIDI); + } + pIns->nPluginVelocityHandling = n; SetInstrumentModified(true); } @@ -2756,11 +2765,18 @@ //---------------------------------------------- { ModInstrument *pIns = m_pSndFile->Instruments[m_nInstrument]; - if ((!IsLocked()) && (pIns)) + if(!IsLocked() && pIns != nullptr) { - BYTE n = static_cast<BYTE>(m_CbnPluginVolumeHandling.GetCurSel()); + uint8 n = static_cast<uint8>(m_CbnPluginVolumeHandling.GetCurSel()); if(n != pIns->nPluginVolumeHandling) { + + if(velocityStyle.GetCheck() == BST_UNCHECKED && n == PLUGIN_VOLUMEHANDLING_IGNORE) + { + // This combination doesn't make sense. + velocityStyle.SetCheck(BST_CHECKED); + } + pIns->nPluginVolumeHandling = n; SetInstrumentModified(true); } @@ -2768,6 +2784,26 @@ } +void CCtrlInstruments::OnPitchWheelDepthChanged() +//----------------------------------------------- +{ + ModInstrument *pIns = m_pSndFile->Instruments[m_nInstrument]; + if(!IsLocked() && pIns != nullptr) + { + int pwd = GetDlgItemInt(IDC_PITCHWHEELDEPTH, NULL, TRUE); + if(m_pSndFile->GetType() == MOD_TYPE_XM) + Limit(pwd, 0, 36); + else + Limit(pwd, -128, 127); + if(pwd != pIns->midiPWD) + { + pIns->midiPWD = static_cast<int8>(pwd); + SetInstrumentModified(true); + } + } +} + + void CCtrlInstruments::OnBnClickedCheckPitchtempolock() //----------------------------------------------------- { @@ -2791,14 +2827,14 @@ char buffer[7]; m_EditPitchTempoLock.GetWindowText(buffer, 6); ptl = atoi(buffer); + } else + { + ptl = m_pSndFile->m_nDefaultTempo; } - else - ptl = m_pSndFile->m_nDefaultTempo; } m_EditPitchTempoLock.SetWindowText(Stringify(ptl).c_str()); //SetModified() comes with SetWindowText(.). - } - else + } else { m_EditPitchTempoLock.EnableWindow(FALSE); if(m_pSndFile && m_nInstrument && m_pSndFile->Instruments[m_nInstrument] && Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2012-09-18 20:09:56 UTC (rev 1352) @@ -90,10 +90,10 @@ protected: CModControlBar m_ToolBar; CSpinButtonCtrl m_SpinInstrument, m_SpinFadeOut, m_SpinGlobalVol, m_SpinPanning; - CSpinButtonCtrl m_SpinMidiPR, m_SpinPPS, m_SpinMidiBK; - CComboBox m_ComboNNA, m_ComboDCT, m_ComboDCA, m_ComboPPC, m_CbnMidiCh, m_CbnMixPlug, m_CbnResampling, m_CbnFilterMode, m_CbnPluginVelocityHandling, m_CbnPluginVolumeHandling; + CSpinButtonCtrl m_SpinMidiPR, m_SpinPPS, m_SpinMidiBK, pwdSpin; + CComboBox m_ComboNNA, m_ComboDCT, m_ComboDCA, m_ComboPPC, m_CbnMidiCh, m_CbnMixPlug, m_CbnResampling, m_CbnFilterMode, m_CbnPluginVolumeHandling; CEdit m_EditName, m_EditFileName, m_EditGlobalVol, m_EditPanning, m_EditPPS, m_EditFadeOut; - CButton m_CheckPanning, m_CheckCutOff, m_CheckResonance; + CButton m_CheckPanning, m_CheckCutOff, m_CheckResonance, velocityStyle; CSliderCtrl m_SliderVolSwing, m_SliderPanSwing, m_SliderCutSwing, m_SliderResSwing, m_SliderCutOff, m_SliderResonance; CNoteMapWnd m_NoteMap; @@ -174,6 +174,7 @@ afx_msg void OnFilterModeChanged(); afx_msg void OnPluginVelocityHandlingChanged(); afx_msg void OnPluginVolumeHandlingChanged(); + afx_msg void OnPitchWheelDepthChanged(); // -> CODE#0027 Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2012-09-18 20:09:56 UTC (rev 1352) @@ -1311,7 +1311,6 @@ m_nInputs = m_nOutputs = 0; m_nEditorX = m_nEditorY = -1; m_pModDoc = nullptr; //rewbs.plugDocAware - m_nPreviousMidiChan = nInvalidMidiChan; //rewbs.VSTCompliance m_pProcessFP = nullptr; // Insert ourselves in the beginning of the list @@ -1333,13 +1332,12 @@ m_bSongPlaying = false; //rewbs.VSTCompliance m_bPlugResumed = false; - m_bModified = false; m_nSampleRate = nInvalidSampleRate; //rewbs.VSTCompliance: gets set on Resume() MemsetZero(m_MidiCh); - for (int ch=0; ch<16; ch++) + for(int ch = 0; ch < 16; ch++) { - m_nMidiPitchBendPos[ch] = MIDIEvents::pitchBendCentre; //centre pitch bend on all channels + m_MidiCh[ch].midiPitchBendPos = EncodePitchBendParam(MIDIEvents::pitchBendCentre); //centre pitch bend on all channels } } @@ -1521,10 +1519,10 @@ } -int CVstPlugin::Release() -//----------------------- +size_t CVstPlugin::Release() +//-------------------------- { - if (!(--m_nRefCount)) + if(!(--m_nRefCount)) { try { @@ -2364,47 +2362,75 @@ } -// Bend MIDI pitch for given MIDI channel using tracker param (0x00-0xFF) -void CVstPlugin::MidiPitchBend(uint8 nMidiCh, int nParam, CHANNELINDEX /*trackChannel*/) -//-------------------------------------------------------------------------------------- +void CVstPlugin::ApplyPitchWheelDepth(int32 &value, int8 pwd) +//----------------------------------------------------------- { - const int16 increment = static_cast<int16>((nParam * 0x800) / 0xFF); - int16 newPitchBendPos = (m_nMidiPitchBendPos[nMidiCh] & vstPitchBendMask) + increment; - Limit(newPitchBendPos, int16(MIDIEvents::pitchBendMin), int16(MIDIEvents::pitchBendMax)); + if(pwd != 0) + { + // 16383 / 127 = 129 + value = (value * ((MIDIEvents::pitchBendMax - MIDIEvents::pitchBendMin) / 127)) / pwd; + } else + { + value = 0; + } +} + +// Bend MIDI pitch for given MIDI channel using fine tracker param (one unit = 1/64th of a note step) +void CVstPlugin::MidiPitchBend(uint8 nMidiCh, int32 increment, int8 pwd) +//---------------------------------------------------------------------- +{ + if(m_pSndFile && m_pSndFile->GetModFlag(MSF_OLD_MIDI_PITCHBENDS)) + { + // OpenMPT Legacy: Old pitch slides never were really accurate, but setting the PWD to 13 in plugins would give the closest results. + increment = (increment * 0x800 * 13) / (0xFF * pwd); + increment = EncodePitchBendParam(increment); + } else + { + increment = EncodePitchBendParam(increment); + ApplyPitchWheelDepth(increment, pwd); + } + + int32 newPitchBendPos = (increment + m_MidiCh[nMidiCh].midiPitchBendPos) & vstPitchBendMask; + Limit(newPitchBendPos, EncodePitchBendParam(MIDIEvents::pitchBendMin), EncodePitchBendParam(MIDIEvents::pitchBendMax)); + MidiPitchBend(nMidiCh, newPitchBendPos); } -//Set MIDI pitch for given MIDI channel using uncoverted midi value (0-16383) -void CVstPlugin::MidiPitchBend(uint8 nMidiCh, int16 newPitchBendPos) +//Set MIDI pitch for given MIDI channel using fixed point pitch bend value (converted back to 0-16383 MIDI range) +void CVstPlugin::MidiPitchBend(uint8 nMidiCh, int32 newPitchBendPos) //------------------------------------------------------------------ { - ASSERT(MIDIEvents::pitchBendMin <= newPitchBendPos && newPitchBendPos <= MIDIEvents::pitchBendMax); - m_nMidiPitchBendPos[nMidiCh] = newPitchBendPos; - MidiSend(MIDIEvents::BuildPitchBendEvent(nMidiCh, newPitchBendPos)); + ASSERT(EncodePitchBendParam(MIDIEvents::pitchBendMin) <= newPitchBendPos && newPitchBendPos <= EncodePitchBendParam(MIDIEvents::pitchBendMax)); + m_MidiCh[nMidiCh].midiPitchBendPos = newPitchBendPos; + MidiSend(MIDIEvents::BuildPitchBendEvent(nMidiCh, DecodePitchBendParam(newPitchBendPos))); } // Apply vibrato effect through pitch wheel commands on a given MIDI channel. -void CVstPlugin::MidiVibrato(uint8 nMidiCh, int16 depth) -//------------------------------------------------------ +void CVstPlugin::MidiVibrato(uint8 nMidiCh, int32 depth, int8 pwd) +//---------------------------------------------------------------- { - if(depth != 0 || (m_nMidiPitchBendPos[nMidiCh] & vstVibratoFlag)) + depth = EncodePitchBendParam(depth); + if(depth != 0 || (m_MidiCh[nMidiCh].midiPitchBendPos & vstVibratoFlag)) { + ApplyPitchWheelDepth(depth, pwd); + // Temporarily add vibrato offset to current pitch - int16 pitch = (m_nMidiPitchBendPos[nMidiCh] & vstPitchBendMask) + depth; - Limit(pitch, int16(MIDIEvents::pitchBendMin), int16(MIDIEvents::pitchBendMax)); - MidiSend(MIDIEvents::BuildPitchBendEvent(nMidiCh, pitch)); + int32 newPitchBendPos = (depth + m_MidiCh[nMidiCh].midiPitchBendPos) & vstPitchBendMask; + Limit(newPitchBendPos, EncodePitchBendParam(MIDIEvents::pitchBendMin), EncodePitchBendParam(MIDIEvents::pitchBendMax)); + + MidiSend(MIDIEvents::BuildPitchBendEvent(nMidiCh, DecodePitchBendParam(newPitchBendPos))); } // Update vibrato status if(depth != 0) { - m_nMidiPitchBendPos[nMidiCh] |= vstVibratoFlag; + m_MidiCh[nMidiCh].midiPitchBendPos |= vstVibratoFlag; } else { - m_nMidiPitchBendPos[nMidiCh] &= ~vstVibratoFlag; + m_MidiCh[nMidiCh].midiPitchBendPos &= ~vstVibratoFlag; } } @@ -2415,8 +2441,8 @@ { VSTInstrChannel &channel = m_MidiCh[nMidiCh]; - bool bankChanged = (channel.wMidiBank != --wMidiBank) && (wMidiBank < 0x4000); - bool progChanged = (channel.nProgram != --nMidiProg) && (nMidiProg < 0x80); + bool bankChanged = (channel.currentBank != --wMidiBank) && (wMidiBank < 0x4000); + bool progChanged = (channel.currentProgram != --nMidiProg) && (nMidiProg < 0x80); //get vol in [0,128[ uint8 volume = static_cast<uint8>(Util::Min(vol / 2, 127)); @@ -2426,7 +2452,7 @@ uint8 high = static_cast<uint8>(wMidiBank >> 7); uint8 low = static_cast<uint8>(wMidiBank & 0x7F); - if((channel.wMidiBank >> 7) != high) + if((channel.currentBank >> 7) != high) { // High byte changed MidiSend(MIDIEvents::BuildCCEvent(MIDIEvents::MIDICC_BankSelect_Coarse, nMidiCh, high)); @@ -2435,7 +2461,7 @@ //GetSoundFile()->ProcessMIDIMacro(trackChannel, false, GetSoundFile()->m_MidiCfg.szMidiGlb[MIDIOUT_BANKSEL], 0); MidiSend(MIDIEvents::BuildCCEvent(MIDIEvents::MIDICC_BankSelect_Fine, nMidiCh, low)); - channel.wMidiBank = wMidiBank; + channel.currentBank = wMidiBank; } // Program change @@ -2443,7 +2469,7 @@ // Thus we send program changes also if only the bank has changed. if(nMidiProg < 0x80 && (progChanged || bankChanged)) { - channel.nProgram = nMidiProg; + channel.currentProgram = nMidiProg; //GetSoundFile()->ProcessMIDIMacro(trackChannel, false, GetSoundFile()->m_MidiCfg.szMidiGlb[MIDIOUT_PROGRAM], 0); MidiSend(MIDIEvents::BuildProgramChangeEvent(nMidiCh, nMidiProg)); } @@ -2507,9 +2533,9 @@ // Reset pitch bend on each new note, tracker style. // This is done if the pitch wheel has been moved or there was a vibrato on the previous row (in which case the highest bit of the pitch bend memory is set) - if(m_nMidiPitchBendPos[nMidiCh] != MIDIEvents::pitchBendCentre) + if(m_MidiCh[nMidiCh].midiPitchBendPos != EncodePitchBendParam(MIDIEvents::pitchBendCentre)) { - MidiPitchBend(nMidiCh, MIDIEvents::pitchBendCentre); + MidiPitchBend(nMidiCh, EncodePitchBendParam(MIDIEvents::pitchBendCentre)); } // count instances of active notes. @@ -2522,9 +2548,6 @@ MidiSend(MIDIEvents::BuildNoteOnEvent(nMidiCh, static_cast<uint8>(note), volume)); } - - m_nPreviousMidiChan = nMidiCh; - } @@ -2628,7 +2651,6 @@ if ((m_pEffect) && (m_pMixStruct)) { m_pMixStruct->defaultProgram = -1; - m_bModified = false; if ((m_pEffect->flags & effFlagsProgramChunks) && (Dispatch(effIdentify, 0,0, nullptr, 0.0f) == 'NvEf')) @@ -2816,21 +2838,6 @@ //rewbs.defaultPlugGui: CVstEditor now COwnerVstEditor -//rewbs.VSTcompliance -bool CVstPlugin::GetSpeakerArrangement() -//-------------------------------------- -{ - VstSpeakerArrangement **pSA = nullptr; - Dispatch(effGetSpeakerArrangement, 0, 0, pSA, 0); - if (pSA) - { - MemCopy(speakerArrangement, **pSA); - } - - return true; -} - - void CVstPlugin::NotifySongPlaying(bool playing) //---------------------------------------------- { Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/mptrack/Vstplug.h 2012-09-18 20:09:56 UTC (rev 1352) @@ -104,10 +104,10 @@ struct VSTInstrChannel { - //BYTE uNoteOnMap[128/8]; rewbs.deMystifyMidiNoteMap + int32 midiPitchBendPos; // Current Pitch Wheel position, in 16.11 fixed point format. Lowest bit is used for indicating that vibrato was applied. Vibrato offset itself is not stored in this value. + uint16 currentProgram; + uint16 currentBank; //rewbs.MidiBank uint8 uNoteOnMap[128][MAX_CHANNELS]; - uint32 nProgram; - uint16 wMidiBank; //rewbs.MidiBank }; @@ -130,11 +130,12 @@ // Number of MIDI events that can be sent to a plugin at once (the internal queue is not affected by this number, it can hold any number of events) vstNumProcessEvents = 256, - vstPitchBendMask = 0x7FFF, - vstVibratoFlag = 0x8000, + // Pitch wheel constants + vstPitchBendShift = 12, // Use lowest 12 bits for fractional part and vibrato flag => 16.11 fixed point precision + vstPitchBendMask = (~1), + vstVibratoFlag = 1, }; - ULONG m_nRefCount; CVstPlugin *m_pNext, *m_pPrev; HINSTANCE m_hLibrary; VSTPluginLib *m_pFactory; @@ -142,30 +143,26 @@ AEffect *m_pEffect; void (*m_pProcessFP)(AEffect*, float**, float**, VstInt32); //Function pointer to AEffect processReplacing if supported, else process. CAbstractVstEditor *m_pEditor; //rewbs.defaultPlugGUI - static const UINT nInvalidSampleRate = UINT_MAX; - UINT m_nSampleRate; - bool m_bIsVst2; + CModDoc *m_pModDoc; //rewbs.plugDocAware + CSoundFile *m_pSndFile; //rewbs.plugDocAware + + size_t m_nRefCount; + static const uint32 nInvalidSampleRate = UINT_MAX; + uint32 m_nSampleRate; SNDMIXPLUGINSTATE m_MixState; - UINT m_nInputs, m_nOutputs; - VSTInstrChannel m_MidiCh[16]; - int16 m_nMidiPitchBendPos[16]; // Current pitch wheel depth. Highest bit is used for indicating that vibrato was applied. Vibrato offset itself is not stored in this value. + uint32 m_nInputs, m_nOutputs; + int32 m_nEditorX, m_nEditorY; - CModDoc* m_pModDoc; //rewbs.plugDocAware - CSoundFile* m_pSndFile; //rewbs.plugDocAware -// PSNDMIXPLUGIN m_pSndMixPlugin; //rewbs.plugDocAware - static const UINT nInvalidMidiChan = UINT_MAX; - UINT m_nPreviousMidiChan; //rewbs.VSTCompliance + float m_fGain; + PLUGINDEX m_nSlot; bool m_bSongPlaying; //rewbs.VSTCompliance bool m_bPlugResumed; //rewbs.VSTCompliance - bool m_bModified; - PLUGINDEX m_nSlot; - float m_fGain; + bool m_bIsVst2; bool m_bIsInstrument; - int m_nEditorX, m_nEditorY; - + VSTInstrChannel m_MidiCh[16]; // MIDI channel state PluginMixBuffer<float, MIXBUFFERSIZE> mixBuffer; // Float buffers (input and output) for plugins - int m_MixBuffer[MIXBUFFERSIZE * 2 + 2]; // Stereo interleaved + int32 m_MixBuffer[MIXBUFFERSIZE * 2 + 2]; // Stereo interleaved PluginEventQueue<vstNumProcessEvents> vstEvents; // MIDI events that should be sent to the plugin public: @@ -187,7 +184,6 @@ VstInt32 GetVersion(); //rewbs.VSTpresets bool GetParams(float* param, VstInt32 min, VstInt32 max); //rewbs.VSTpresets bool RandomizeParams(PlugParamIndex minParam = 0, PlugParamIndex maxParam = 0); //rewbs.VSTpresets - bool isModified() {return m_bModified;} inline CModDoc* GetModDoc() {return m_pModDoc;} inline CSoundFile* GetSoundFile() {return m_pSndFile;} PLUGINDEX FindSlot(); @@ -214,12 +210,11 @@ BOOL GetDefaultEffectName(LPSTR pszName); BOOL GetCommandName(UINT index, LPSTR pszName); CAbstractVstEditor* GetEditor(); //rewbs.defaultPlugGUI - bool GetSpeakerArrangement(); //rewbs.VSTCompliance void Bypass(bool bypass = true); bool IsBypassed() const { return m_pMixStruct->IsBypassed(); }; - bool isInstrument(); // ericus 18/02/2005 + bool isInstrument(); bool CanRecieveMidiEvents(); size_t GetOutputPlugList(vector<CVstPlugin *> &list); @@ -228,8 +223,8 @@ size_t GetInputChannelList(vector<CHANNELINDEX> &list); public: - int AddRef() { return ++m_nRefCount; } - int Release(); + size_t AddRef() { return ++m_nRefCount; } + size_t Release(); void SaveAllParameters(); void RestoreAllParameters(long nProg=-1); //rewbs.plugDefaultProgram - added param void RecalculateGain(); @@ -237,8 +232,8 @@ void Init(unsigned long nFreq, int bReset); bool MidiSend(DWORD dwMidiCode); void MidiCC(uint8 nMidiCh, MIDIEvents::MidiCC nController, uint8 nParam, CHANNELINDEX trackChannel); - void MidiPitchBend(uint8 nMidiCh, int nParam, CHANNELINDEX trackChannel); - void MidiVibrato(uint8 nMidiCh, int16 depth); + void MidiPitchBend(uint8 nMidiCh, int32 increment, int8 pwd); + void MidiVibrato(uint8 nMidiCh, int32 depth, int8 pwd); void MidiCommand(uint8 nMidiCh, uint8 nMidiProg, uint16 wMidiBank, uint16 note, uint16 vol, CHANNELINDEX trackChannel); void HardAllNotesOff(); //rewbs.VSTiNoteHoldonStopFix bool isPlaying(UINT note, UINT midiChn, UINT trackerChn); //rewbs.instroVST @@ -260,10 +255,14 @@ void SetZxxParameter(UINT nParam, UINT nValue); UINT GetZxxParameter(UINT nParam); //rewbs.smoothVST - VstSpeakerArrangement speakerArrangement; //rewbs.VSTcompliance - private: - void MidiPitchBend(uint8 nMidiCh, int16 pitchBendPos); + void MidiPitchBend(uint8 nMidiCh, int32 pitchBendPos); + // Converts a 14-bit MIDI pitch bend position to a 16.11 fixed point pitch bend position + static int32 EncodePitchBendParam(int32 position) { return (position << vstPitchBendShift); } + // Converts a 16.11 fixed point pitch bend position to a 14-bit MIDI pitch bend position + static int16 DecodePitchBendParam(int32 position) { return static_cast<int16>(position >> vstPitchBendShift); } + // Apply Pitch Wheel Depth (PWD) to some MIDI pitch bend value. + static inline void ApplyPitchWheelDepth(int32 &value, int8 pwd); bool GetProgramNameIndexed(VstInt32 index, VstIntPtr category, char *text); //rewbs.VSTpresets Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2012-09-18 20:09:56 UTC (rev 1352) @@ -136,6 +136,7 @@ CheckDlgButton(IDC_CHK_COMPATPLAY, m_pSndFile->GetModFlag(MSF_COMPATIBLE_PLAY)); CheckDlgButton(IDC_CHK_MIDICCBUG, m_pSndFile->GetModFlag(MSF_MIDICC_BUGEMULATION)); CheckDlgButton(IDC_CHK_OLDRANDOM, m_pSndFile->GetModFlag(MSF_OLDVOLSWING)); + CheckDlgButton(IDC_CHK_OLDPITCH, m_pSndFile->GetModFlag(MSF_OLD_MIDI_PITCHBENDS)); // Time signature information @@ -239,11 +240,13 @@ GetDlgItem(IDC_CHK_COMPATPLAY)->ShowWindow(XMorITorMPT); GetDlgItem(IDC_CHK_MIDICCBUG)->ShowWindow(XMorITorMPT); - GetDlgItem(IDC_CHK_OLDRANDOM)->ShowWindow(ITorMPT); + GetDlgItem(IDC_CHK_OLDRANDOM)->ShowWindow(XMorITorMPT); + GetDlgItem(IDC_CHK_OLDPITCH)->ShowWindow(XMorITorMPT); // Deprecated flags are greyed out if they are not being used. GetDlgItem(IDC_CHK_MIDICCBUG)->EnableWindow(m_pSndFile->GetModFlag(MSF_MIDICC_BUGEMULATION) ? TRUE : FALSE); - GetDlgItem(IDC_CHK_OLDRANDOM)->EnableWindow(m_pSndFile->GetModFlag(MSF_OLDVOLSWING) ? TRUE : FALSE); + GetDlgItem(IDC_CHK_OLDRANDOM)->EnableWindow((ITorMPT && m_pSndFile->GetModFlag(MSF_OLDVOLSWING)) ? TRUE : FALSE); + GetDlgItem(IDC_CHK_OLDPITCH)->EnableWindow(m_pSndFile->GetModFlag(MSF_OLD_MIDI_PITCHBENDS) ? TRUE : FALSE); // Mixmode Box GetDlgItem(IDC_TEXT_MIXMODE)->ShowWindow(XMorITorMPT); @@ -369,6 +372,7 @@ if(IsDlgButtonChecked(IDC_CHK_COMPATPLAY)) m_pSndFile->SetModFlag(MSF_COMPATIBLE_PLAY, true); if(IsDlgButtonChecked(IDC_CHK_MIDICCBUG)) m_pSndFile->SetModFlag(MSF_MIDICC_BUGEMULATION, true); if(IsDlgButtonChecked(IDC_CHK_OLDRANDOM)) m_pSndFile->SetModFlag(MSF_OLDVOLSWING, true); + if(IsDlgButtonChecked(IDC_CHK_OLDPITCH)) m_pSndFile->SetModFlag(MSF_OLD_MIDI_PITCHBENDS, true); } m_pSndFile->m_nDefaultRowsPerBeat = GetDlgItemInt(IDC_ROWSPERBEAT); @@ -393,7 +397,7 @@ TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; CStringA strTipText = ""; UINT_PTR nID = pNMHDR->idFrom; - if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) || + 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 @@ -435,16 +439,18 @@ case IDC_CHK_OLDRANDOM: strTipText = "Use old (buggy) random volume / panning variation algorithm (not recommended)"; break; + case IDC_CHK_OLDPITCH: + strTipText = "Use old (imprecise) portamento logic for instrument plugins (not recommended)"; + break; } - if (pNMHDR->code == TTN_NEEDTEXTA) + 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, CountOf(pTTTA->szText) - 1)); - } - else + } else { ::MultiByteToWideChar(CP_ACP , 0, strTipText, strTipText.GetLength() + 1, pTTTW->szText, CountOf(pTTTW->szText)); Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/mptrack/mptrack.rc 2012-09-18 20:09:56 UTC (rev 1352) @@ -229,18 +229,18 @@ BEGIN CONTROL "Channel 1:",IDC_STATIC_CHANNEL_NAME,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,6,8,45,8 EDITTEXT IDC_EDIT3,60,6,126,12,ES_AUTOHSCROLL - PUSHBUTTON "<<",IDC_BUTTON1,192,6,18,12 - PUSHBUTTON ">>",IDC_BUTTON2,216,6,18,12 + PUSHBUTTON "&<<",IDC_BUTTON1,192,6,18,12 + PUSHBUTTON "&>>",IDC_BUTTON2,216,6,18,12 LTEXT "Initial Volume:",IDC_STATIC,6,30,45,8 CONTROL "",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,54,24,92,22 EDITTEXT IDC_EDIT1,150,30,36,12,ES_NUMBER CONTROL "",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,174,30,11,14 - CONTROL "Mute",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,192,30,42,12 + CONTROL "&Mute",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,192,30,42,12 LTEXT "Initial Pan:",IDC_STATIC,6,54,34,8 CONTROL "",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,54,48,92,22 EDITTEXT IDC_EDIT2,150,54,36,12,ES_NUMBER CONTROL "",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,174,54,11,14 - CONTROL "Surround",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,192,54,42,12 + CONTROL "&Surround",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,192,54,42,12 END @@ -758,7 +758,7 @@ LTEXT "Parameters",IDC_TEXT_STRETCHPARAMS,385,38,39,8 END -IDD_CONTROL_INSTRUMENTS DIALOGEX 0, 0, 558, 173 +IDD_CONTROL_INSTRUMENTS DIALOGEX 0, 0, 536, 170 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -766,81 +766,83 @@ CONTROL "Spin1",IDC_SPIN_INSTRUMENT,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS | WS_TABSTOP,111,8,11,11 EDITTEXT IDC_SAMPLE_NAME,131,6,151,12,ES_AUTOHSCROLL EDITTEXT IDC_SAMPLE_FILENAME,324,6,105,12,ES_AUTOHSCROLL + CTEXT "Global Volume",IDC_STATIC,8,36,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE EDITTEXT IDC_EDIT8,84,36,37,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN8,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,40,8,10 + CTEXT "Fade Out",IDC_STATIC,8,53,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE EDITTEXT IDC_EDIT7,84,53,37,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SPIN7,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,57,8,10 CONTROL "Set Pan",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,42,72,42,10 EDITTEXT IDC_EDIT9,84,70,37,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SPIN9,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,74,8,11 + CTEXT "Sep",IDC_STATIC,8,99,25,13,SS_CENTERIMAGE,WS_EX_STATICEDGE EDITTEXT IDC_EDIT15,33,99,27,13,ES_AUTOHSCROLL - CONTROL "Spin1",IDC_SPIN12,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,61,103,7,11 + CONTROL "Spin1",IDC_SPIN12,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,54,102,11,11 + CTEXT "Centre",IDC_STATIC,69,99,26,13,SS_CENTERIMAGE,WS_EX_STATICEDGE COMBOBOX IDC_COMBO4,95,99,27,91,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CTEXT "Ramping",IDC_STATIC,7,133,39,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CONTROL "",IDC_SLIDER5,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS,47,135,36,10 EDITTEXT IDC_EDIT2,85,133,36,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,116,133,8,12 + CTEXT "Resampling",IDC_STATIC,7,151,39,13,SS_CENTERIMAGE,WS_EX_STATICEDGE COMBOBOX IDC_COMBO9,50,151,71,81,CBS_DROPDOWNLIST | WS_TABSTOP CONTROL "Reso",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,136,37,33,10 CONTROL "Slider2",IDC_SLIDER4,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS | WS_DISABLED | WS_TABSTOP,168,37,64,10 CONTROL "Cutoff",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,136,52,35,10 CONTROL "Slider2",IDC_SLIDER3,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS | WS_DISABLED | WS_TABSTOP,168,53,64,10 + RTEXT "--",IDC_FILTERTEXT,166,62,65,8 + CTEXT "Mode",IDC_STATIC,135,70,23,13,SS_CENTERIMAGE,WS_EX_STATICEDGE COMBOBOX IDC_FILTERMODE,163,70,69,42,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CTEXT "Volume",IDC_STATIC,136,99,33,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS | WS_TABSTOP,172,101,60,10 + CTEXT "Panning",IDC_STATIC,136,116,33,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CONTROL "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS | WS_TABSTOP,172,118,60,10 + CTEXT "Cutoff",IDC_STATIC,136,133,33,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CONTROL "",IDC_SLIDER6,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS | WS_TABSTOP,172,135,60,10 + CTEXT "Reso",IDC_STATIC,136,151,33,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CONTROL "",IDC_SLIDER7,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS | WS_TABSTOP,172,152,60,10 + CTEXT "Action",IDC_STATIC,246,36,59,13,SS_CENTERIMAGE,WS_EX_STATICEDGE COMBOBOX IDC_COMBO1,308,36,50,54,CBS_DROPDOWNLIST | WS_TABSTOP + CTEXT "Duplicate Check",IDC_STATIC,246,53,59,13,SS_CENTERIMAGE,WS_EX_STATICEDGE COMBOBOX IDC_COMBO2,308,53,50,69,CBS_DROPDOWNLIST | WS_TABSTOP + CTEXT "Duplicate Action",IDC_STATIC,246,70,59,13,SS_CENTERIMAGE,WS_EX_STATICEDGE COMBOBOX IDC_COMBO3,308,70,50,54,CBS_DROPDOWNLIST | WS_TABSTOP COMBOBOX IDC_COMBO6,246,99,72,127,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Editor",IDC_INSVIEWPLG,321,99,37,13,0,WS_EX_STATICEDGE + CTEXT "MIDI Channel",IDC_STATIC,246,116,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE COMBOBOX IDC_COMBO5,321,116,37,169,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CTEXT "MIDI Program",IDC_STATIC,246,134,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE EDITTEXT IDC_EDIT10,321,134,37,12,ES_AUTOHSCROLL CONTROL "Spin1",IDC_SPIN10,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,349,135,8,11 + CTEXT "MIDI Bank",IDC_STATIC,245,152,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE EDITTEXT IDC_EDIT11,321,152,37,12,ES_AUTOHSCROLL CONTROL "",IDC_SPIN11,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,351,153,8,11 - COMBOBOX IDC_PLUGIN_VELOCITYSTYLE,367,115,83,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_PLUGIN_VOLUMESTYLE,367,148,83,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_COMBOTUNING,367,39,86,48,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Loop tempo:",IDC_CHECK_PITCHTEMPOLOCK,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,367,68,51,8 - EDITTEXT IDC_EDIT_PITCHTEMPOLOCK,425,67,24,12,ES_AUTOHSCROLL - CONTROL "",IDC_NOTEMAP,"Static",SS_GRAYRECT | SS_NOTIFY | WS_TABSTOP,461,37,62,131,WS_EX_CLIENTEDGE + LTEXT "P. Bend Range:",IDC_STATIC,366,101,54,8,SS_CENTERIMAGE + EDITTEXT IDC_PITCHWHEELDEPTH,420,99,36,12,ES_AUTOHSCROLL + CONTROL "",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS | WS_TABSTOP,444,102,11,11 + LTEXT "Volume Command Handling:",IDC_STATIC,366,114,90,8,SS_CENTERIMAGE + COMBOBOX IDC_PLUGIN_VOLUMESTYLE,366,126,90,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Volume commands with note are Velocities",IDC_PLUGIN_VELOCITYSTYLE, + "Button",BS_AUTOCHECKBOX | BS_VCENTER | BS_MULTILINE | BS_FLAT | WS_TABSTOP,366,141,90,24 + COMBOBOX IDC_COMBOTUNING,368,38,88,48,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Loop tempo:",IDC_CHECK_PITCHTEMPOLOCK,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,369,70,51,8 + EDITTEXT IDC_EDIT_PITCHTEMPOLOCK,426,68,30,12,ES_AUTOHSCROLL + CONTROL "",IDC_NOTEMAP,"Static",SS_GRAYRECT | SS_NOTIFY | WS_TABSTOP,466,37,62,131,WS_EX_CLIENTEDGE CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP | 0x4d,4,4,76,17 - CTEXT "MIDI / VSTi Channel",IDC_STATIC,246,116,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "MIDI Program",IDC_STATIC,246,134,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "MIDI Bank",IDC_STATIC,245,152,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "Fade Out",IDC_STATIC,8,53,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "Global Volume",IDC_STATIC,8,36,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE CTEXT "File",IDC_STATIC,289,6,35,12,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "Sep",IDC_STATIC,8,99,25,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "Centre",IDC_STATIC,69,99,26,13,SS_CENTERIMAGE,WS_EX_STATICEDGE GROUPBOX "Random Variation",IDC_STATIC,131,88,104,80 - CTEXT "Volume",IDC_STATIC,136,99,33,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "Panning",IDC_STATIC,136,116,33,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - EDITTEXT IDC_EDIT1,492,119,30,12,ES_RIGHT | ES_READONLY | NOT WS_VISIBLE | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RIGHT - CTEXT "Duplicate Action",IDC_STATIC,246,70,59,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "Duplicate Check",IDC_STATIC,246,53,59,13,SS_CENTERIMAGE,WS_EX_STATICEDGE GROUPBOX "Filter",IDC_STATIC,131,27,104,141 GROUPBOX "General",IDC_STATIC,3,27,123,141 GROUPBOX "Pitch/Pan",IDC_STATIC,3,88,123,80 - CTEXT "Action",IDC_STATIC,246,36,59,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - GROUPBOX "New Note Action",IDC_STATIC,240,27,122,59 + GROUPBOX "New Note Action",IDC_STATIC,240,27,122,60 GROUPBOX "Sample Quality",IDC_STATIC,3,118,123,50 - CTEXT "Ramping",IDC_STATIC,7,133,39,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "Cutoff",IDC_STATIC,136,133,33,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "Reso",IDC_STATIC,136,151,33,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "Resampling",IDC_STATIC,7,151,39,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "Mode",IDC_STATIC,135,70,23,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - RTEXT "--",IDC_FILTERTEXT,166,62,65,8 - GROUPBOX "Pitch/Tempo Lock",IDC_STATIC,364,57,89,25 - GROUPBOX "Sample Map",IDC_STATIC,461,27,62,141 - CTEXT "Velocity handling",IDC_STATIC,367,102,83,10,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "Volume handling",IDC_STATIC,367,133,83,10,SS_CENTERIMAGE,WS_EX_STATICEDGE - GROUPBOX "Tuning (experimental)",IDC_STATIC,364,28,92,28 - GROUPBOX "Plugin / MIDI",IDC_STATIC,240,88,216,80 + GROUPBOX "Pitch/Tempo Lock",IDC_STATIC,364,57,98,30 + GROUPBOX "Sample Map",IDC_STATIC,466,27,62,141 + GROUPBOX "Alternative Tuning",IDC_STATIC,364,27,98,28 + GROUPBOX "Plugin / MIDI",IDC_STATIC,240,88,222,80 END -IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 262, 305 +IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 262, 317 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Song Properties" FONT 8, "MS Shell Dlg", 0, 0, 0x0 @@ -849,7 +851,7 @@ PUSHBUTTON "Cancel",IDCANCEL,204,24,50,14 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,174,8 + 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 @@ -863,21 +865,23 @@ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,162,222,12 CONTROL "Old &random variation behaviour for instruments",IDC_CHK_OLDRANDOM, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,174,222,12 - COMBOBOX IDC_COMBO_TEMPOMODE,12,222,108,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_ROWSPERBEAT,132,210,24,12,ES_AUTOHSCROLL | ES_NUMBER - EDITTEXT IDC_ROWSPERMEASURE,132,228,24,12,ES_AUTOHSCROLL | ES_NUMBER - EDITTEXT IDC_EDIT_CREATEDWITH,78,265,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE - EDITTEXT IDC_EDIT_SAVEDWITH,78,283,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE + CONTROL "Old P&itch Wheel behaviour for instrument plugins",IDC_CHK_OLDPITCH, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,186,222,12 + LTEXT "Mode:",IDC_TEXT_TEMPOMODE,12,222,21,8 + COMBOBOX IDC_COMBO_TEMPOMODE,12,234,108,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_ROWSPERBEAT,132,222,24,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Rows per beat",IDC_TEXT_ROWSPERBEAT,162,224,84,8 + EDITTEXT IDC_ROWSPERMEASURE,132,240,24,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Rows per measure",IDC_TEXT_ROWSPERMEASURE,162,242,84,8 + RTEXT "IDC_TEXT_CREATEDWITH",IDC_TEXT_CREATEDWITH,18,279,54,8 + EDITTEXT IDC_EDIT_CREATEDWITH,78,277,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE + RTEXT "IDC_TEXT_SAVEDWITH",IDC_TEXT_SAVEDWITH,18,295,54,8 + EDITTEXT IDC_EDIT_SAVEDWITH,78,295,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE 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,72 - GROUPBOX "Tempo",IDC_FRAME_TEMPOMODE,6,198,246,48 - LTEXT "Mode:",IDC_TEXT_TEMPOMODE,12,210,21,8 - LTEXT "Rows per beat",IDC_TEXT_ROWSPERBEAT,162,212,84,8 - LTEXT "Rows per measure",IDC_TEXT_ROWSPERMEASURE,162,230,84,8 - GROUPBOX "OpenMPT Version Info",IDC_FRAME_MPTVERSION,6,251,246,48 - RTEXT "IDC_TEXT_CREATEDWITH",IDC_TEXT_CREATEDWITH,18,267,54,8 - RTEXT "IDC_TEXT_SAVEDWITH",IDC_TEXT_SAVEDWITH,18,283,54,8 + GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_FRAME_MPTEXT,6,120,246,84 + GROUPBOX "Tempo",IDC_FRAME_TEMPOMODE,6,210,246,48 + GROUPBOX "OpenMPT Version Info",IDC_FRAME_MPTVERSION,6,263,246,48 END IDD_SHOWLOG DIALOG 0, 0, 300, 106 @@ -1654,14 +1658,14 @@ IDD_CONTROL_INSTRUMENTS, DIALOG BEGIN - RIGHTMARGIN, 522 - BOTTOMMARGIN, 168 + RIGHTMARGIN, 500 + BOTTOMMARGIN, 165 END IDD_MODDOC_MODTYPE, DIALOG BEGIN RIGHTMARGIN, 248 - BOTTOMMARGIN, 298 + BOTTOMMARGIN, 310 END IDD_SHOWLOG, DIALOG Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/mptrack/resource.h 2012-09-18 20:09:56 UTC (rev 1352) @@ -819,6 +819,7 @@ #define IDC_CHK_MIDICCBUG 2322 #define IDC_CHK_OLDRANDOM 2323 #define IDC_CHECKCAPTURE 2324 +#define IDC_CHK_OLDPITCH 2324 #define IDC_SPINMOVEMAPPING 2325 #define IDC_BUTTON_HALF 2326 #define IDC_BUTTON_DOUBLE 2327 @@ -936,6 +937,7 @@ #define IDC_RESTORE_KEYMAP 2436 #define IDC_SAMPLE_AUTOTUNE 2437 #define IDC_FIND 2438 +#define IDC_PITCHWHEELDEPTH 2439 #define ID_FILE_NEWMOD 32771 #define ID_FILE_NEWXM 32772 #define ID_FILE_NEWS3M 32773 @@ -1213,7 +1215,7 @@ #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 535 #define _APS_NEXT_COMMAND_VALUE 44605 -#define _APS_NEXT_CONTROL_VALUE 2439 +#define _APS_NEXT_CONTROL_VALUE 2440 #define _APS_NEXT_SYMED_VALUE 901 #endif #endif Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/mptrack/version.h 2012-09-18 20:09:56 UTC (rev 1352) @@ -19,7 +19,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 02 -#define VER_MINORMINOR 09 +#define VER_MINORMINOR 10 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2012-09-18 20:09:56 UTC (rev 1352) @@ -735,6 +735,7 @@ if(instrument != nullptr) { ITInstrToMPT(lpStream + inspos[nins], instrument, itHeader.cmwt, dwMemLength - inspos[nins]); + instrument->midiPWD = itHeader.pwd; } } } @@ -1175,6 +1176,16 @@ itHeader.speed = m_nDefaultSpeed; itHeader.tempo = min(m_nDefaultTempo, 255); //Limit this one to 255, we save the real one as an extension below. itHeader.sep = 128; // pan separation + // IT doesn't have a per-instrument Pitch Wheel Depth setting, so we just store the first non-zero PWD setting in the header. + for(INSTRUMENTINDEX ins = 1; ins < GetNumInstruments(); ins++) + { + if(Instruments[ins] != nullptr && Instruments[ins]->midiPWD != 0) + { + itHeader.pwd = abs(Instruments[ins]->midiPWD); + break; + } + } + dwHdrPos = sizeof(itHeader) + itHeader.ordnum; // Channel Pan and Volume memset(itHeader.chnpan, 0xA0, 64); @@ -2063,6 +2074,12 @@ WriteInstrumentPropertyForAllInstruments('PVEH', sizeof(ModInstrument().nPluginVelocityHandling), f, nInstruments); WriteInstrumentPropertyForAllInstruments('PVOH', sizeof(ModInstrument().nPluginVolumeHandling), f, nInstruments); + if(!(GetType() & MOD_TYPE_XM)) + { + // XM instrument headers already have support for this + WriteInstrumentPropertyForAllInstruments('MPWD', sizeof(ModInstrument().midiPWD), f, nInstruments); + } + if(GetType() & MOD_TYPE_MPT) { UINT maxNodes = 0; @@ -2324,7 +2341,7 @@ *pInterpretMptMade = true; // HACK: Reset mod flags to default values here, as they are not always written. - m_ModFlags = 0; + m_ModFlags.reset(); // Case macros. #define CASE(id, data) \ Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2012-09-18 20:09:56 UTC (rev 1352) @@ -99,7 +99,7 @@ } // New candidate slot is first unused sample slot. - candidateSlot = std::find(usedSamples.begin() + 1, usedSamples.end(), false) - usedSamples.begin(); + candidateSlot = static_cast<SAMPLEINDEX>(std::find(usedSamples.begin() + 1, usedSamples.end(), false) - usedSamples.begin()); } else { // No unused sampel slots: Give up :( @@ -376,7 +376,7 @@ if((insHeader.instrument.midiChannel | insHeader.instrument.midiEnabled | insHeader.instrument.midiProgram | insHeader.instrument.muteComputer | insHeader.instrument.pitchWheelRange) != 0) { // Definitely not MPT. (or any other tracker) - isFT2 = true; + //isFT2 = true; } // Read sample headers @@ -712,7 +712,7 @@ if ((note <= 12) || (note > 96+12)) note = 0; else note -= 12; uint8 vol = 0; - if (p->volcmd) + if (p->volcmd != VOLCMD_NONE) { switch(p->volcmd) { Modified: trunk/OpenMPT/soundlib/Loaders.h =================================================================== --- trunk/OpenMPT/soundlib/Loaders.h 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/soundlib/Loaders.h 2012-09-18 20:09:56 UTC (rev 1352) @@ -57,7 +57,7 @@ // Returns false if position is invalid. bool Seek(size_t position) { - if(position < streamLength) + if(position <= streamLength) { streamPos = position; return true; @@ -292,7 +292,8 @@ float target; if(Read(target)) { - uint32 temp = LittleEndian(*reinterpret_cast<uint32 *>(&target)); + uint32 temp = *reinterpret_cast<uint32 *>(&target); + SwapBytesLE(temp); return *reinterpret_cast<float *>(&temp); } else { @@ -307,7 +308,8 @@ float target; if(Read(target)) { - uint32 temp = BigEndian(*reinterpret_cast<uint32 *>(&target)); + uint32 temp = *reinterpret_cast<uint32 *>(&target); + SwapBytesBE(temp); return *reinterpret_cast<float *>(&temp); } else { Modified: trunk/OpenMPT/soundlib/ModInstrument.cpp =================================================================== --- trunk/OpenMPT/soundlib/ModInstrument.cpp 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/soundlib/ModInstrument.cpp 2012-09-18 20:09:56 UTC (rev 1352) @@ -141,6 +141,7 @@ nMidiProgram = 0; nMidiChannel = 0; nMidiDrumKey = 0; + midiPWD = 2; nPPC = NOTE_MIDDLEC - 1; nPPS = 0; @@ -196,6 +197,10 @@ nMidiChannel = 1; } + // FT2 only has signed Pitch Wheel Depth, and it's limited to 0...36 (in the GUI, at least. As you would expect it from FT2, this value is actually not sanitized on load). + midiPWD = abs(midiPWD); + Limit(midiPWD, int8(0), int8(36)); + nGlobalVol = 64; nPan = 128; Modified: trunk/OpenMPT/soundlib/ModInstrument.h =================================================================== --- trunk/OpenMPT/soundlib/ModInstrument.h 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/soundlib/ModInstrument.h 2012-09-18 20:09:56 UTC (rev 1352) @@ -57,6 +57,7 @@ uint8 nMidiProgram; // MIDI Program (1...128). 0 = Don't send. uint8 nMidiChannel; // MIDI Channel (1...16). 0 = Don't send. 17 = Mapped (Send to tracker channel modulo 16). uint8 nMidiDrumKey; // Drum set note mapping (currently only used by the .MID loader) + int8 midiPWD; // MIDI Pitch Wheel Depth in semitones uint8 nNNA; // New note action uint8 nDCT; // Duplicate check type (i.e. which condition will trigger the duplicate note action) @@ -75,8 +76,8 @@ uint8 nFilterMode; // Default filter mode uint8 nPluginVelocityHandling; // How to deal with plugin velocity uint8 nPluginVolumeHandling; // How to deal with plugin volume + uint16 wPitchToTempoLock; // BPM at which the samples assigned to this instrument loop correctly uint32 nResampling; // Resampling mode - uint16 wPitchToTempoLock; // BPM at which the samples assigned to this instrument loop correctly CTuning *pTuning; // sample tuning assigned to this instrument static CTuning *s_DefaultTuning; Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2012-09-18 20:09:56 UTC (rev 1352) @@ -2667,7 +2667,13 @@ int actualParam = abs(param); int pitchBend = 0; - if(doFineSlides && actualParam >= 0xE0) + // Old MIDI Pitch Bends: + // - Applied on every tick + // - No fine pitch slides (they are interpreted as normal slides) + // New MIDI Pitch Bends: + // - Behaviour identical to sample pitch bends if the instrument's PWD parameter corresponds to the actual VSTi setting. + + if(doFineSlides && actualParam >= 0xE0 && !GetModFlag(MSF_OLD_MIDI_PITCHBENDS)) { if(m_SongFlags[SONG_FIRSTTICK]) { @@ -2679,7 +2685,7 @@ pitchBend *= 4; } } - } else + } else if(!m_SongFlags[SONG_FIRSTTICK] || GetModFlag(MSF_OLD_MIDI_PITCHBENDS)) { // Regular slide pitchBend = param * 4; @@ -2690,7 +2696,12 @@ IMixPlugin *plugin = GetChannelInstrumentPlugin(nChn); if(plugin != nullptr) { - plugin->MidiPitchBend(GetBestMidiChannel(nChn), pitchBend, 0); + int8 pwd = 13; // Early OpenMPT legacy... Actually it's not *exactly* 13, but close enough... + if(Chn[nChn].pModInstrument != nullptr) + { + pwd = Chn[nChn].pModInstrument->midiPWD; + } + plugin->MidiPitchBend(GetBestMidiChannel(nChn), pitchBend, pwd); } } } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2012-09-18 19:52:29 UTC (rev 1351) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2012-09-18 20:09:56 UTC (rev 1352) @@ -10,17 +10,15 @@ #include "stdafx.h" -#include "../mptrack/mptrack.h" +#ifdef MODPLUG_TRACKER #include "../mptrack/mainfrm.h" #include "../mptrack/moddoc.h" +#endif // MODPLUG_TRACKER #include "../mptrack/version.h" #include "../mptrack/serialization_utils.h" #include "sndfile.h" #include "tuningcollection.h" #include "../common/StringFixer.h" -#include <vector> -#include <list> -#include <algorithm> #ifndef NO_COPYRIGHT #ifndef NO_MMCMP_SUPPORT @@ -192,6 +190,7 @@ PFLG PitchEnv.dwFlag AFLG PanEnv.dwFlags VFLG VolEnv.dwFlags +MPWD MIDI Pitch Wheel Depth ----------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------*/ @@ -314,6 +313,7 @@ WRITE_MPTHEADER_sized_member( PitchEnv.dwFlags , uint32 , PFLG ) WRITE_MPTHEADER_sized_member( PanEnv.dwFlags , uint32 , AFLG ) WRITE_MPTHEADER_sized_member( VolEnv.dwFlags , uint32 , VFLG ) +WRITE_MPTHEADER_sized_member( midiPWD , int8 , MPWD ) } // -------------------------------------------------------------------------------------------- @@ -396,6 +396,7 @@ GET_MPTHEADER_sized_member( PitchEnv.dwFlags , DWORD , PFLG ) GET_MPTHEADER_sized_member( PanEnv.dwFlags , DWORD , AFLG ) GET_MPTHEADER_sized_member( VolEnv.dwFlags , DWORD , VFLG ) +GET_MPTHEADER_sized_member( midiPWD , int8 , MPWD ) } return pointer; @@ -438,19 +439,23 @@ m_nRepeatCount = 0; m_nSeqOverride = ORDERINDEX_INVALID; m_bPatternTransitionOccurred = false; - m_nDefaultRowsPerBeat = m_nCurrentRowsPerBeat = (CMainFrame::GetSettings().m_nRowHighlightBeats) ? CMainFrame::GetSettings().m_nRowHighlightBeats : 4; - m_nDefaultRowsPerMeasure = m_nCurrentRowsPerMeasure = (CMainFrame::GetSettings().m_nRowHighlightMeasures >= m_nDefaultRowsPerBeat) ? CMainFrame::GetSettings().m_nRowHighlightMeasures : m_nDefaultRowsPerBeat * 4; m_nTempoMode = tempo_mode_classic; m_bIsRendering = false; #ifdef MODPLUG_TRACKER m_lockOrderStart = m_lockOrderEnd = ORDERINDEX_INVALID; + m_pModDoc = nullptr; + + m_nDefaultRowsPerBeat = m_nCurrentRowsPerBeat = (CMainFrame::GetSettings().m_nRowHighlightBeats) ? CMainFrame::GetSettings().m_nRowHighlightBeats : 4; + m_nDefaultRowsPerMeasure = m_nCurrentRowsPerMeasure = (CMainFrame::GetSettings().m_nRowHighlightMeasures >= m_nDefaultRowsPerBeat) ? CMainFrame::GetSettings().m_nRowHighlightMeasures : m_nDefaultRowsPerBeat * 4; +#else + m_nDefaultRowsPerBeat = m_nCurrentRowsPerBeat = 4; + m_nDefaultRowsPerMeasure = m_nCurrentRowsPerMeasure = 16; #endif // MODPLUG_TRACKER - m_ModFlags = 0; + m_ModFlags.reset(); m_bITBidiMode = false; - m_pModDoc = nullptr; m_dwLastSavedWithVersion=0; m_dwCreatedWithVersion=0; m_bChannelMuteTogglePending.reset(); @@ -487,10 +492,17 @@ } +#ifdef MODPLUG_TRACKER BOOL CSoundFile::Create(LPCBYTE lpStream, CModDoc *pModDoc, DWORD dwMemLength) //---------------------------------------------------------------------------- { m_pModDoc = pModDoc; +#else +BOOL CSoundFile::Create(LPCBYTE lpStream, void *pModDoc, DWORD dwMemLength) +//-------------------------------------------------------------------------- +{ +#endif // MODPLUG_TRACKER + m_nType = MOD_TYPE_NONE; m_SongFlags.reset(); m_nChannels = 0; @@ -738,6 +750,7 @@ string notFoundText; std::vector<PLUGINDEX> notFoundIDs; +#ifndef NO_VST // Load plugins only when m_pModDoc is valid. (can be invalid for example when examining module samples in treeview. if (gpMixPluginCreateProc && GetpModDoc() != nullptr) { @@ -797,12 +810,13 @@ CTrackApp::OpenURL(sUrl); } } +#endif // NO_VST // Set up mix levels m_pConfig->SetMixLevels(m_nMixLevels); RecalculateGainForAllPlugs(); - if(m_nType != MOD_TYPE_NONE) + if(GetType() != MOD_TYPE_NONE) { SetModSpecsPointer(m_pModSpecs, m_nType); const ORDERINDEX nMinLength = (std::min)(ModSequenceSet::s_nCacheSize, GetModSpecifications().ordersMax); @@ -1306,11 +1320,13 @@ Chn[nChn].Reset(ModChannel::resetTotal, *this, nChn); +#ifdef MODPLUG_TRACKER if(GetpModDoc() != nullptr) { GetpModDoc()->Record1Channel(nChn, false); GetpModDoc()->Record2Channel(nChn, false); } +#endif // MODPLUG_TRACK... [truncated message content] |