123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- /*
- * LFOPlugin.h
- * -----------
- * Purpose: Plugin for automating other plugins' parameters
- * Notes : (currently none)
- * Authors: OpenMPT Devs
- * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
- */
- #pragma once
- #include "openmpt/all/BuildSettings.hpp"
- #ifndef NO_PLUGINS
- #include "PlugInterface.h"
- #include "../../common/mptRandom.h"
- OPENMPT_NAMESPACE_BEGIN
- class LFOPlugin final : public IMixPlugin
- {
- friend class LFOPluginEditor;
- protected:
- enum Parameters
- {
- kAmplitude = 0,
- kOffset,
- kFrequency,
- kTempoSync,
- kWaveform,
- kPolarity,
- kBypassed,
- kLoopMode,
- kCurrentPhase,
- kLFONumParameters
- };
- enum LFOWaveform
- {
- kSine = 0,
- kTriangle,
- kSaw,
- kSquare,
- kSHNoise,
- kSmoothNoise,
- kNumWaveforms
- };
- std::vector<std::byte> m_chunkData;
- static constexpr PlugParamIndex INVALID_OUTPUT_PARAM = uint32_max;
- // LFO parameters
- float m_amplitude = 0.5f, m_offset = 0.5f, m_frequency = 0.290241f;
- LFOWaveform m_waveForm = kSine;
- PlugParamIndex m_outputParam = INVALID_OUTPUT_PARAM;
- bool m_tempoSync = false, m_polarity = false, m_bypassed = false, m_outputToCC = false, m_oneshot = false;
- // LFO state
- double m_computedFrequency = 0.0;
- double m_phase = 0.0, m_increment = 0.0;
- double m_random = 0.0, m_nextRandom = 0.0;
- double m_tempo = 0.0;
- mpt::fast_prng m_PRNG;
- #ifdef MODPLUG_TRACKER
- static constexpr int WM_PARAM_UDPATE = WM_USER + 500;
- #endif
- public:
- static IMixPlugin* Create(VSTPluginLib &factory, CSoundFile &sndFile, SNDMIXPLUGIN *mixStruct);
- LFOPlugin(VSTPluginLib &factory, CSoundFile &sndFile, SNDMIXPLUGIN *mixStruct);
- void Release() override { delete this; }
- int32 GetUID() const override { int32 id; memcpy(&id, "LFO ", 4); return id; }
- int32 GetVersion() const override { return 0; }
- void Idle() override { }
- uint32 GetLatency() const override { return 0; }
- void Process(float *pOutL, float *pOutR, uint32 numFrames) override;
- float RenderSilence(uint32) override { return 0.0f; }
- // MIDI event handling (mostly passing it through to the follow-up plugin)
- bool MidiSend(uint32 midiCode) override;
- bool MidiSysexSend(mpt::const_byte_span sysex) override;
- void MidiCC(MIDIEvents::MidiCC nController, uint8 nParam, CHANNELINDEX trackChannel) override;
- void MidiPitchBend(int32 increment, int8 pwd, CHANNELINDEX trackChannel) override;
- void MidiVibrato(int32 depth, int8 pwd, CHANNELINDEX trackChannel) override;
- void MidiCommand(const ModInstrument &instr, uint16 note, uint16 vol, CHANNELINDEX trackChannel) override;
- void HardAllNotesOff() override;
- bool IsNotePlaying(uint8 note, CHANNELINDEX trackerChn) override;
- int32 GetNumPrograms() const override { return 0; }
- int32 GetCurrentProgram() override { return 0; }
- void SetCurrentProgram(int32) override { }
- PlugParamIndex GetNumParameters() const override { return kLFONumParameters; }
- PlugParamValue GetParameter(PlugParamIndex index) override;
- void SetParameter(PlugParamIndex index, PlugParamValue value) override;
- void Resume() override;
- void Suspend() override { m_isResumed = false; }
- void PositionChanged() override;
- bool IsInstrument() const override { return false; }
- bool CanRecieveMidiEvents() override { return false; }
- bool ShouldProcessSilence() override { return true; }
- #ifdef MODPLUG_TRACKER
- CString GetDefaultEffectName() override { return _T("LFO"); }
- std::pair<PlugParamValue, PlugParamValue> GetParamUIRange(PlugParamIndex param) override;
- CString GetParamName(PlugParamIndex param) override;
- CString GetParamLabel(PlugParamIndex) override;
- CString GetParamDisplay(PlugParamIndex param) override;
- CString GetCurrentProgramName() override { return CString(); }
- void SetCurrentProgramName(const CString &) override { }
- CString GetProgramName(int32) override { return CString(); }
- bool HasEditor() const override { return true; }
- protected:
- CAbstractVstEditor *OpenEditor() override;
- #endif
- public:
- int GetNumInputChannels() const override { return 2; }
- int GetNumOutputChannels() const override { return 2; }
- bool ProgramsAreChunks() const override { return true; }
- // Save parameters for storing them in a module file
- void SaveAllParameters() override;
- // Restore parameters from module file
- void RestoreAllParameters(int32 program) override;
- ChunkData GetChunk(bool) override;
- void SetChunk(const ChunkData &chunk, bool) override;
- protected:
- void NextRandom();
- void RecalculateFrequency();
- void RecalculateIncrement();
- IMixPlugin *GetOutputPlugin() const;
- public:
- static LFOWaveform ParamToWaveform(float param) { return static_cast<LFOWaveform>(std::clamp(mpt::saturate_round<int>(param * 32.0f), 0, kNumWaveforms - 1)); }
- static float WaveformToParam(LFOWaveform waveform) { return static_cast<int>(waveform) / 32.0f; }
- };
- OPENMPT_NAMESPACE_END
- #endif // NO_PLUGINS
|