From: <sag...@us...> - 2010-05-09 22:04:40
|
Revision: 591 http://modplug.svn.sourceforge.net/modplug/?rev=591&view=rev Author: saga-games Date: 2010-05-09 22:04:33 +0000 (Sun, 09 May 2010) Log Message: ----------- [Imp] Instrument Editor: "Scale envelope points" is now always available for scaling the values of the points (y axis). [Ref] Related code changes. Modified Paths: -------------- trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp =================================================================== --- trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp 2010-05-08 22:11:33 UTC (rev 590) +++ trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp 2010-05-09 22:04:33 UTC (rev 591) @@ -1,78 +1,64 @@ -// ScaleEnvPointsDlg.cpp : implementation file -// +/* + * ScaleEnvPointsDlg.cpp + * --------------------- + * Purpose: Scale instrument envelope points on x and y axis. + * Notes : (currently none) + * Authors: OpenMPT Devs + */ #include "stdafx.h" #include "mptrack.h" #include "ScaleEnvPointsDlg.h" +float CScaleEnvPointsDlg::m_fFactorX = 1; +float CScaleEnvPointsDlg::m_fFactorY = 1; -// CScaleEnvPointsDlg dialog -IMPLEMENT_DYNAMIC(CScaleEnvPointsDlg, CDialog) -CScaleEnvPointsDlg::CScaleEnvPointsDlg(CWnd* pParent, MODINSTRUMENT* pInst, UINT env) - : CDialog(CScaleEnvPointsDlg::IDD, pParent), - m_pInstrument(pInst), - m_Env(env) -//---------------------------------------------------------------------- +BOOL CScaleEnvPointsDlg::OnInitDialog() +//------------------------------------- { -} + CDialog::OnInitDialog(); -CScaleEnvPointsDlg::~CScaleEnvPointsDlg() -//--------------------------------------- -{ -} + char buffer[10]; + _snprintf(buffer, 9, "%g", m_fFactorX); + SetDlgItemText(IDC_EDIT_FACTORX, buffer); + _snprintf(buffer, 9, "%g", m_fFactorY); + SetDlgItemText(IDC_EDIT_FACTORY, buffer); + GetDlgItem(IDC_EDIT_FACTORX)->SetFocus(); -void CScaleEnvPointsDlg::DoDataExchange(CDataExchange* pDX) -//-------------------------------------------------------- -{ - CDialog::DoDataExchange(pDX); - DDX_Control(pDX, IDC_EDIT_FACTOR, m_EditFactor); + return FALSE; // return TRUE unless you set the focus to a control } -BEGIN_MESSAGE_MAP(CScaleEnvPointsDlg, CDialog) - -END_MESSAGE_MAP() - - -// CScaleEnvPointsDlg message handlers - void CScaleEnvPointsDlg::OnOK() -//------------------------------ +//----------------------------- { char buffer[10]; - GetDlgItemText(IDC_EDIT_FACTOR, buffer, 9); - float factor = ConvertStrTo<float>(buffer); - if(factor > 0) + GetDlgItemText(IDC_EDIT_FACTORX, buffer, 9); + m_fFactorX = ConvertStrTo<float>(buffer); + + GetDlgItemText(IDC_EDIT_FACTORY, buffer, 9); + m_fFactorY = ConvertStrTo<float>(buffer); + + if(m_fFactorX > 0 && m_fFactorX != 1) { - INSTRUMENTENVELOPE *pEnv = nullptr; - switch(m_Env) + for(UINT i = 0; i < m_pEnv->nNodes; i++) { - case ENV_PANNING: pEnv = &m_pInstrument->PanEnv; break; - case ENV_PITCH: pEnv = &m_pInstrument->PitchEnv; break; - default: pEnv = &m_pInstrument->VolEnv; break; + m_pEnv->Ticks[i] = static_cast<WORD>(m_fFactorX * m_pEnv->Ticks[i]); + + // Checking that the order of points is preserved. + if(i > 0 && m_pEnv->Ticks[i] <= m_pEnv->Ticks[i - 1]) + m_pEnv->Ticks[i] = m_pEnv->Ticks[i - 1] + 1; } - for(UINT i = 0; i< pEnv->nNodes; i++) - { - pEnv->Ticks[i] = static_cast<WORD>(factor * pEnv->Ticks[i]); + } - //Checking that the order of points is preserved. - if(i > 0 && pEnv->Ticks[i] <= pEnv->Ticks[i - 1]) - pEnv->Ticks[i] = pEnv->Ticks[i - 1] + 1; + if(m_fFactorY != 1) + { + for(UINT i = 0; i < m_pEnv->nNodes; i++) + { + m_pEnv->Values[i] = CLAMP(static_cast<BYTE>((m_fFactorY * ((int)m_pEnv->Values[i] - m_nCenter)) + m_nCenter), ENVELOPE_MIN, ENVELOPE_MAX); } } CDialog::OnOK(); } - -BOOL CScaleEnvPointsDlg::OnInitDialog() -//------------------------------------- -{ - CDialog::OnInitDialog(); - - SetDlgItemText(IDC_EDIT_FACTOR, ""); - m_EditFactor.SetFocus(); - - - return FALSE; // return TRUE unless you set the focus to a control -} Modified: trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h =================================================================== --- trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h 2010-05-08 22:11:33 UTC (rev 590) +++ trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.h 2010-05-09 22:04:33 UTC (rev 591) @@ -1,33 +1,31 @@ +/* + * ScaleEnvPointsDlg.h + * ------------------- + * Purpose: Header file for envelope scaling dialog. + * Notes : (currently none) + * Authors: OpenMPT Devs + */ + #pragma once -#include "sndfile.h" -#include "afxwin.h" -// CScaleEnvPointsDlg dialog - //======================================= class CScaleEnvPointsDlg : public CDialog //======================================= { - DECLARE_DYNAMIC(CScaleEnvPointsDlg) - public: - CScaleEnvPointsDlg(CWnd* pParent, MODINSTRUMENT* pInst, UINT env); // standard constructor - virtual ~CScaleEnvPointsDlg(); -// Dialog Data - enum { IDD = IDD_SCALE_ENV_POINTS }; + CScaleEnvPointsDlg(CWnd* pParent, INSTRUMENTENVELOPE *pEnv, int nCenter) : CDialog(IDD_SCALE_ENV_POINTS, pParent) + { + m_pEnv = pEnv; + m_nCenter = nCenter; + } -protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - - DECLARE_MESSAGE_MAP() - private: - MODINSTRUMENT* m_pInstrument; - UINT m_Env; //To tell which envelope to process. - CEdit m_EditFactor; + INSTRUMENTENVELOPE *m_pEnv; //To tell which envelope to process. + static float m_fFactorX, m_fFactorY; + int m_nCenter; + protected: virtual void OnOK(); -public: virtual BOOL OnInitDialog(); }; Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2010-05-08 22:11:33 UTC (rev 590) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2010-05-09 22:04:33 UTC (rev 591) @@ -2189,15 +2189,18 @@ { CModDoc *pModDoc = GetDocument(); CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : NULL; - if(pSndFile == NULL) + if(pSndFile == nullptr) return; if(m_nInstrument >= 1 && m_nInstrument <= pSndFile->GetNumInstruments() && pSndFile->Instruments[m_nInstrument]) { - CScaleEnvPointsDlg dialog(this, pSndFile->Instruments[m_nInstrument], m_nEnv); - if (dialog.DoModal() == IDOK) + // "Center" y value of the envelope. For panning and pitch, this is 32, for volume and filter it is 0 (minimum). + int nOffset = ((m_nEnv != ENV_VOLUME) && ((GetEnvelopePtr()->dwFlags & ENV_FILTER) == 0)) ? 32 : 0; + + CScaleEnvPointsDlg dlg(this, GetEnvelopePtr(), nOffset); + if(dlg.DoModal()) { pModDoc->SetModified(); pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL); @@ -2281,10 +2284,10 @@ { INSTRUMENTENVELOPE *pEnv = GetEnvelopePtr(); if(pEnv == nullptr || !IsDragItemEnvPoint()) return; - if(pEnv->Values[m_nDragItem - 1] <= 64 - stepsize) + if(pEnv->Values[m_nDragItem - 1] <= ENVELOPE_MAX - stepsize) pEnv->Values[m_nDragItem - 1] += stepsize; else - pEnv->Values[m_nDragItem - 1] = 64; + pEnv->Values[m_nDragItem - 1] = ENVELOPE_MAX; GetDocument()->SetModified(); // sanity checks are done in GetEnvelopePtr() already InvalidateRect(NULL, FALSE); @@ -2296,10 +2299,10 @@ { INSTRUMENTENVELOPE *pEnv = GetEnvelopePtr(); if(pEnv == nullptr || !IsDragItemEnvPoint()) return; - if(pEnv->Values[m_nDragItem - 1] >= stepsize) + if(pEnv->Values[m_nDragItem - 1] >= ENVELOPE_MIN + stepsize) pEnv->Values[m_nDragItem - 1] -= stepsize; else - pEnv->Values[m_nDragItem - 1] = 0; + pEnv->Values[m_nDragItem - 1] = ENVELOPE_MIN; GetDocument()->SetModified(); // sanity checks are done in GetEnvelopePtr() already InvalidateRect(NULL, FALSE); Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2010-05-08 22:11:33 UTC (rev 590) +++ trunk/OpenMPT/mptrack/mptrack.rc 2010-05-09 22:04:33 UTC (rev 591) @@ -2547,15 +2547,18 @@ LISTBOX IDC_LIST6,312,62,86,68,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP END -IDD_SCALE_ENV_POINTS DIALOGEX 0, 0, 172, 47 +IDD_SCALE_ENV_POINTS DIALOGEX 0, 0, 172, 77 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Scale Envelope Points" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - LTEXT "Scale envelope points by:",IDC_STATIC_SCALE_ENV,6,6,90,8 - EDITTEXT IDC_EDIT_FACTOR,6,18,90,13,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,114,6,50,14 - PUSHBUTTON "Cancel",IDCANCEL,114,24,50,14 + EDITTEXT IDC_EDIT_FACTORX,126,6,36,13,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_FACTORY,126,24,36,13,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,60,54,50,14 + PUSHBUTTON "Cancel",IDCANCEL,114,54,50,14 + LTEXT "Scale envelope points (x axis) by:",IDC_STATIC,6,8,120,8 + LTEXT "Scale envelope values (y axis) by:",IDC_STATIC,6,26,120,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,45,156,1 END @@ -2629,7 +2632,7 @@ LEFTMARGIN, 2 RIGHTMARGIN, 165 TOPMARGIN, 6 - BOTTOMMARGIN, 43 + BOTTOMMARGIN, 73 END END #endif // APSTUDIO_INVOKED Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2010-05-08 22:11:33 UTC (rev 590) +++ trunk/OpenMPT/mptrack/resource.h 2010-05-09 22:04:33 UTC (rev 591) @@ -783,7 +783,8 @@ #define IDC_GENMACROLABEL 2253 #define IDC_RENDERZONE 2254 #define IDC_PATTERN_LOOP 2255 -#define IDC_EDIT_FACTOR 2256 +#define IDC_EDIT_FACTORX 2256 +#define IDC_EDIT_FACTORY 2257 #define IDC_EDIT_ORDERLIST_MARGINS 2258 #define IDC_STATICRATIOMAP 2259 #define IDC_SPIN_ORDERLIST_MARGINS 2260 Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp =================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp 2010-05-08 22:11:33 UTC (rev 590) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2010-05-09 22:04:33 UTC (rev 591) @@ -1779,14 +1779,14 @@ pIns->VolEnv.Ticks[nPoint] = 0; if (part->wVolAttack) { - pIns->VolEnv.Values[nPoint] = (BYTE)(64/(part->wVolAttack/2+2)+8);// /----- - pIns->VolEnv.Ticks[nPoint+1] = part->wVolAttack; // | + pIns->VolEnv.Values[nPoint] = (BYTE)(ENVELOPE_MAX / (part->wVolAttack / 2 + 2) + 8); // /----- + pIns->VolEnv.Ticks[nPoint+1] = part->wVolAttack; // | } else { - pIns->VolEnv.Values[nPoint] = 64; // |----- - pIns->VolEnv.Ticks[nPoint+1] = 1; // | + pIns->VolEnv.Values[nPoint] = ENVELOPE_MAX; // |----- + pIns->VolEnv.Ticks[nPoint + 1] = 1; // | } - pIns->VolEnv.Values[nPoint+1] = 64; + pIns->VolEnv.Values[nPoint + 1] = ENVELOPE_MAX; nPoint += 2; // Hold section // -> DLS Level 2 @@ -1870,12 +1870,12 @@ } if (lReleaseTime < 1) lReleaseTime = 1; pIns->VolEnv.Ticks[nPoint] = (WORD)(lStartTime + lReleaseTime); - pIns->VolEnv.Values[nPoint] = 0; + pIns->VolEnv.Values[nPoint] = ENVELOPE_MIN; nPoint++; } else { pIns->VolEnv.Ticks[nPoint] = (BYTE)(pIns->VolEnv.Ticks[nPoint-1] + 1); - pIns->VolEnv.Values[nPoint] = 0; + pIns->VolEnv.Values[nPoint] = ENVELOPE_MIN; nPoint++; } pIns->VolEnv.nNodes = (BYTE)nPoint; @@ -1889,13 +1889,13 @@ { pIns->VolEnv.dwFlags |= ENV_ENABLED; pIns->VolEnv.Ticks[0] = 0; - pIns->VolEnv.Values[0] = 64; + pIns->VolEnv.Values[0] = ENVELOPE_MAX; pIns->VolEnv.Ticks[1] = 5; - pIns->VolEnv.Values[1] = 64; + pIns->VolEnv.Values[1] = ENVELOPE_MAX; pIns->VolEnv.Ticks[2] = 10; - pIns->VolEnv.Values[2] = 32; + pIns->VolEnv.Values[2] = ENVELOPE_MID; pIns->VolEnv.Ticks[3] = 20; // 1 second max. for drums - pIns->VolEnv.Values[3] = 0; + pIns->VolEnv.Values[3] = ENVELOPE_MIN; pIns->VolEnv.nNodes = 4; } } Modified: trunk/OpenMPT/soundlib/Load_imf.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp 2010-05-08 22:11:33 UTC (rev 590) +++ trunk/OpenMPT/soundlib/Load_imf.cpp 2010-05-09 22:04:33 UTC (rev 591) @@ -255,7 +255,7 @@ nTick = LittleEndianW(imfins->nodes[e][n].tick); nValue = LittleEndianW(imfins->nodes[e][n].value) >> shift; env->Ticks[n] = (WORD)max(min, nTick); - env->Values[n] = (BYTE)min(nValue, 64); + env->Values[n] = (BYTE)min(nValue, ENVELOPE_MAX); min = nTick + 1; } } Modified: trunk/OpenMPT/soundlib/Load_mid.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mid.cpp 2010-05-08 22:11:33 UTC (rev 590) +++ trunk/OpenMPT/soundlib/Load_mid.cpp 2010-05-09 22:04:33 UTC (rev 591) @@ -443,13 +443,13 @@ if (nChannel != MIDI_DRUMCHANNEL) pIns->VolEnv.dwFlags |= ENV_SUSTAIN; pIns->VolEnv.nNodes = 4; pIns->VolEnv.Ticks[0] = 0; - pIns->VolEnv.Values[0] = 64; + pIns->VolEnv.Values[0] = ENVELOPE_MAX; pIns->VolEnv.Ticks[1] = 10; - pIns->VolEnv.Values[1] = 64; + pIns->VolEnv.Values[1] = ENVELOPE_MAX; pIns->VolEnv.Ticks[2] = 15; - pIns->VolEnv.Values[2] = 48; + pIns->VolEnv.Values[2] = (ENVELOPE_MAX + ENVELOPE_MID) / 2; pIns->VolEnv.Ticks[3] = 20; - pIns->VolEnv.Values[3] = 0; + pIns->VolEnv.Values[3] = ENVELOPE_MIN; pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = 1; // Sample Samples[m_nSamples].nPan = 128; Modified: trunk/OpenMPT/soundlib/Snd_defs.h =================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h 2010-05-08 22:11:33 UTC (rev 590) +++ trunk/OpenMPT/soundlib/Snd_defs.h 2010-05-09 22:04:33 UTC (rev 591) @@ -170,7 +170,12 @@ #define ENV_CARRY 0x08 // env carry #define ENV_FILTER 0x10 // filter env enabled (this has to be combined with ENV_ENABLED in the pitch envelope's flags) +// Envelope value boundaries +#define ENVELOPE_MIN 0 +#define ENVELOPE_MID 32 +#define ENVELOPE_MAX 64 + // Flags of 'dF..' datafield in extended instrument properties. #define dFdd_VOLUME 0x0001 #define dFdd_VOLSUSTAIN 0x0002 @@ -338,8 +343,8 @@ #define SNDMIX_NOBACKWARDJUMPS 0x40000 #define SNDMIX_MAXDEFAULTPAN 0x80000 // Used by the MOD loader (currently unused) #define SNDMIX_MUTECHNMODE 0x100000 // Notes are not played on muted channels -#define SNDMIX_EMULATE_MIX_BUGS 0x200000 // rewbs.emulateMixBugs + #define MAX_GLOBAL_VOLUME 256 // Resampling modes Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2010-05-08 22:11:33 UTC (rev 590) +++ trunk/OpenMPT/soundlib/Sndfile.h 2010-05-09 22:04:33 UTC (rev 591) @@ -119,7 +119,7 @@ CHAR name[32]; // Note: not guaranteed to be null-terminated. CHAR filename[32]; - BYTE nMixPlug; //rewbs.instroVSTi + PLUGINDEX nMixPlug; //rewbs.instroVSTi // -> CODE#0027 // -> DESC="per-instrument volume ramping setup (refered as attack)" USHORT nVolRamp; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2010-05-08 22:11:33 UTC (rev 590) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2010-05-09 22:04:33 UTC (rev 591) @@ -1298,12 +1298,12 @@ int x1, envpitch; if (envpos >= x2) { - envpitch = (((int)pIns->PitchEnv.Values[pt]) - 32) * 8; + envpitch = (((int)pIns->PitchEnv.Values[pt]) - ENVELOPE_MID) * 8; x1 = x2; } else if (pt) { - envpitch = (((int)pIns->PitchEnv.Values[pt-1]) - 32) * 8; + envpitch = (((int)pIns->PitchEnv.Values[pt-1]) - ENVELOPE_MID) * 8; x1 = pIns->PitchEnv.Ticks[pt-1]; } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |