tracktion-engine 3.0-10-g034fdde4aa5
Tracktion Engine — High level data model for audio applications

« « « Anklang Documentation
Loading...
Searching...
No Matches
tracktion_MidiModifier.cpp
Go to the documentation of this file.
1 /*
2 ,--. ,--. ,--. ,--.
3 ,-' '-.,--.--.,--,--.,---.| |,-.,-' '-.`--' ,---. ,--,--, Copyright 2024
4 '-. .-'| .--' ,-. | .--'| /'-. .-',--.| .-. || \ Tracktion Software
5 | | | | \ '-' \ `--.| \ \ | | | |' '-' '| || | Corporation
6 `---' `--' `--`--'`---'`--'`--' `---' `--' `---' `--''--' www.tracktion.com
7
8 Tracktion Engine uses a GPL/commercial licence - see LICENCE.md for details.
9*/
10
11namespace tracktion { inline namespace engine
12{
13
14MidiModifierPlugin::MidiModifierPlugin (PluginCreationInfo info) : Plugin (info)
15{
16 semitones = addParam ("semitones up", TRANS("Semitones"),
17 { -getMaximumSemitones(), getMaximumSemitones() },
18 [] (float value) { return std::abs (value) < 0.01f ? "(" + TRANS("Original pitch") + ")"
19 : getSemitonesAsString (value); },
20 [] (const juce::String& s) { return juce::jlimit (-MidiModifierPlugin::getMaximumSemitones(),
21 MidiModifierPlugin::getMaximumSemitones(),
22 s.getFloatValue()); });
23
24 semitonesValue.referTo (state, IDs::semitonesUp, getUndoManager());
25 semitones->attachToCurrentValue (semitonesValue);
26}
27
28MidiModifierPlugin::~MidiModifierPlugin()
29{
30 notifyListenersOfDeletion();
31
32 semitones->detachFromCurrentValue();
33}
34
35const char* MidiModifierPlugin::xmlTypeName ("midiModifier");
36
37juce::String MidiModifierPlugin::getName() const { return TRANS("MIDI Modifier"); }
38juce::String MidiModifierPlugin::getPluginType() { return xmlTypeName; }
39juce::String MidiModifierPlugin::getShortName (int) { return TRANS("MIDI Modifier"); }
40void MidiModifierPlugin::initialise (const PluginInitialisationInfo&) {}
41void MidiModifierPlugin::deinitialise() {}
42double MidiModifierPlugin::getLatencySeconds() { return 0.0; }
43int MidiModifierPlugin::getNumOutputChannelsGivenInputs (int) { return 0; }
44void MidiModifierPlugin::getChannelNames (juce::StringArray*, juce::StringArray*) {}
45bool MidiModifierPlugin::takesAudioInput() { return false; }
46bool MidiModifierPlugin::canBeAddedToClip() { return false; }
47bool MidiModifierPlugin::needsConstantBufferSize() { return false; }
48
49void MidiModifierPlugin::applyToBuffer (const PluginRenderContext& fc)
50{
51 if (fc.bufferForMidiMessages != nullptr)
52 fc.bufferForMidiMessages->addToNoteNumbers (juce::roundToInt (semitones->getCurrentValue()));
53}
54
55juce::String MidiModifierPlugin::getSelectableDescription()
56{
57 return TRANS("MIDI Modifier Plugin");
58}
59
60void MidiModifierPlugin::restorePluginStateFromValueTree (const juce::ValueTree& v)
61{
62 copyPropertiesToCachedValues (v, semitonesValue);
63
64 for (auto p : getAutomatableParameters())
65 p->updateFromAttachedValue();
66}
67
68}} // namespace tracktion { inline namespace engine
#define TRANS(stringLiteral)
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
int roundToInt(const FloatType value) noexcept
Passed into Plugins when they are being initialised, to give them useful contextual information that ...
The context passed to plugin render methods to provide it with buffers to fill.
MidiMessageArray * bufferForMidiMessages
A buffer of MIDI events to process.