123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- #pragma once
- #include "openmpt/all/BuildSettings.hpp"
- #include "ModSample.h"
- #include "ModInstrument.h"
- #include "modcommand.h"
- #include "Paula.h"
- #include "tuningbase.h"
- OPENMPT_NAMESPACE_BEGIN
- class CSoundFile;
- struct ModChannel
- {
-
- struct EnvInfo
- {
- uint32 nEnvPosition = 0;
- int16 nEnvValueAtReleaseJump = NOT_YET_RELEASED;
- FlagSet<EnvelopeFlags> flags;
- void Reset()
- {
- nEnvPosition = 0;
- nEnvValueAtReleaseJump = NOT_YET_RELEASED;
- }
- };
-
- SamplePosition position;
- SamplePosition increment;
- const void *pCurrentSample;
- int32 leftVol;
- int32 rightVol;
- int32 leftRamp;
- int32 rightRamp;
- int32 rampLeftVol;
- int32 rampRightVol;
- mixsample_t nFilter_Y[2][2];
- mixsample_t nFilter_A0, nFilter_B0, nFilter_B1;
- mixsample_t nFilter_HP;
- SmpLength nLength;
- SmpLength nLoopStart;
- SmpLength nLoopEnd;
- FlagSet<ChannelFlags> dwFlags;
- mixsample_t nROfs, nLOfs;
- uint32 nRampLength;
- const ModSample *pModSample;
- Paula::State paulaState;
-
- const ModInstrument *pModInstrument;
- SmpLength prevNoteOffset;
- SmpLength oldOffset;
- FlagSet<ChannelFlags> dwOldFlags;
- int32 newLeftVol, newRightVol;
- int32 nRealVolume, nRealPan;
- int32 nVolume, nPan, nFadeOutVol;
- int32 nPeriod;
- int32 nC5Speed, nPortamentoDest;
- int32 cachedPeriod, glissandoPeriod;
- int32 nCalcVolume;
- EnvInfo VolEnv, PanEnv, PitchEnv;
- int32 nGlobalVol;
- int32 nInsVol;
- int32 nAutoVibDepth;
- uint32 nEFxOffset;
- ROWINDEX nPatternLoop;
- uint16 portamentoSlide;
- int16 nTranspose;
- int16 nFineTune;
- int16 microTuning;
- int16 nVolSwing, nPanSwing;
- int16 nCutSwing, nResSwing;
- uint16 nRestorePanOnNewNote;
- CHANNELINDEX nMasterChn;
- ModCommand rowCommand;
-
- ResamplingMode resamplingMode;
- uint8 nRestoreResonanceOnNewNote;
- uint8 nRestoreCutoffOnNewNote;
- uint8 nNote;
- NewNoteAction nNNA;
- uint8 nLastNote;
- uint8 nArpeggioLastNote, nArpeggioBaseNote;
- uint8 nNewNote, nNewIns, nOldIns, nCommand, nArpeggio;
- uint8 nRetrigParam, nRetrigCount;
- uint8 nOldVolumeSlide, nOldFineVolUpDown;
- uint8 nOldPortaUp, nOldPortaDown, nOldFinePortaUpDown, nOldExtraFinePortaUpDown;
- uint8 nOldPanSlide, nOldChnVolSlide;
- uint8 nOldGlobalVolSlide;
- uint8 nAutoVibPos, nVibratoPos, nTremoloPos, nPanbrelloPos;
- uint8 nVibratoType, nVibratoSpeed, nVibratoDepth;
- uint8 nTremoloType, nTremoloSpeed, nTremoloDepth;
- uint8 nPanbrelloType, nPanbrelloSpeed, nPanbrelloDepth;
- int8 nPanbrelloOffset, nPanbrelloRandomMemory;
- uint8 nOldCmdEx, nOldVolParam, nOldTempo;
- uint8 nOldHiOffset;
- uint8 nCutOff, nResonance;
- uint8 nTremorCount, nTremorParam;
- uint8 nPatternLoopCount;
- uint8 nLeftVU, nRightVU;
- uint8 nActiveMacro;
- FilterMode nFilterMode;
- uint8 nEFxSpeed, nEFxDelay;
- uint8 noteSlideParam, noteSlideCounter;
- uint8 lastZxxParam;
- bool isFirstTick : 1;
- bool triggerNote : 1;
- bool isPreviewNote : 1;
- bool isPaused : 1;
- bool portaTargetReached : 1;
-
-
-
-
- bool m_ReCalculateFreqOnFirstTick : 1;
-
- bool m_CalculateFreq : 1;
- int32 m_PortamentoFineSteps, m_PortamentoTickSlide;
-
- float m_plugParamValueStep, m_plugParamTargetValue;
- uint16 m_RowPlugParam;
- PLUGINDEX m_RowPlug;
- void ClearRowCmd() { rowCommand = ModCommand(); }
-
- const EnvInfo &GetEnvelope(EnvelopeType envType) const
- {
- switch(envType)
- {
- case ENV_VOLUME:
- default:
- return VolEnv;
- case ENV_PANNING:
- return PanEnv;
- case ENV_PITCH:
- return PitchEnv;
- }
- }
- EnvInfo &GetEnvelope(EnvelopeType envType)
- {
- return const_cast<EnvInfo &>(static_cast<const ModChannel *>(this)->GetEnvelope(envType));
- }
- void ResetEnvelopes()
- {
- VolEnv.Reset();
- PanEnv.Reset();
- PitchEnv.Reset();
- }
- enum ResetFlags
- {
- resetChannelSettings = 1,
- resetSetPosBasic = 2,
- resetSetPosAdvanced = 4,
- resetSetPosFull = resetSetPosBasic | resetSetPosAdvanced | resetChannelSettings,
- resetTotal = resetSetPosFull,
- };
- void Reset(ResetFlags resetMask, const CSoundFile &sndFile, CHANNELINDEX sourceChannel, ChannelFlags muteFlag);
- void Stop();
- bool IsSamplePlaying() const noexcept { return !increment.IsZero(); }
- uint32 GetVSTVolume() const noexcept { return (pModInstrument) ? pModInstrument->nGlobalVol * 4 : nVolume; }
- ModCommand::NOTE GetPluginNote(bool realNoteMapping) const;
-
- bool HasMIDIOutput() const noexcept { return pModInstrument != nullptr && pModInstrument->HasValidMIDIChannel(); }
-
- bool HasCustomTuning() const noexcept { return pModInstrument != nullptr && pModInstrument->pTuning != nullptr; }
-
- bool InSustainLoop() const noexcept { return (dwFlags & (CHN_LOOP | CHN_KEYOFF)) == CHN_LOOP && pModSample->uFlags[CHN_SUSTAINLOOP]; }
- void UpdateInstrumentVolume(const ModSample *smp, const ModInstrument *ins);
- void SetInstrumentPan(int32 pan, const CSoundFile &sndFile);
- void RestorePanAndFilter();
- void RecalcTuningFreq(Tuning::RATIOTYPE vibratoFactor, Tuning::NOTEINDEXTYPE arpeggioSteps, const CSoundFile &sndFile);
-
- void InstrumentControl(uint8 param, const CSoundFile &sndFile);
- int32 GetMIDIPitchBend() const noexcept { return (static_cast<int32>(microTuning) + 0x8000) / 4; }
- };
- struct ModChannelSettings
- {
- #ifdef MODPLUG_TRACKER
- static constexpr uint32 INVALID_COLOR = 0xFFFFFFFF;
- uint32 color = INVALID_COLOR;
- #endif
- FlagSet<ChannelFlags> dwFlags;
- uint16 nPan = 128;
- uint16 nVolume = 64;
- PLUGINDEX nMixPlugin = 0;
- mpt::charbuf<MAX_CHANNELNAME> szName;
- void Reset()
- {
- *this = {};
- }
- };
- OPENMPT_NAMESPACE_END
|