mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-09 23:25:43 +01:00
137 lines
3.3 KiB
C++
137 lines
3.3 KiB
C++
/*
|
|
Copyright (C) 2014 Paul Davis
|
|
Author: David Robillard
|
|
|
|
This program is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by the Free
|
|
Software Foundation; either version 2 of the License, or (at your option)
|
|
any later version.
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
#include "ardour/amp.h"
|
|
#include "ardour/parameter_descriptor.h"
|
|
#include "ardour/types.h"
|
|
|
|
namespace ARDOUR {
|
|
|
|
ParameterDescriptor::ParameterDescriptor(const Evoral::Parameter& parameter)
|
|
: Evoral::ParameterDescriptor()
|
|
, key((uint32_t)-1)
|
|
, datatype(Variant::NOTHING)
|
|
, unit(NONE)
|
|
, step(0)
|
|
, smallstep(0)
|
|
, largestep(0)
|
|
, integer_step(parameter.type() >= MidiCCAutomation &&
|
|
parameter.type() <= MidiChannelPressureAutomation)
|
|
, logarithmic(false)
|
|
, sr_dependent(false)
|
|
, min_unbound(0)
|
|
, max_unbound(0)
|
|
, enumeration(false)
|
|
{
|
|
if (parameter.type() == GainAutomation) {
|
|
unit = DB;
|
|
}
|
|
|
|
switch((AutomationType)parameter.type()) {
|
|
case GainAutomation:
|
|
upper = Amp::max_gain_coefficient;
|
|
normal = 1.0f;
|
|
break;
|
|
case PanAzimuthAutomation:
|
|
normal = 0.5f; // there really is no _normal but this works for stereo, sort of
|
|
upper = 1.0f;
|
|
break;
|
|
case PanWidthAutomation:
|
|
lower = -1.0;
|
|
upper = 1.0;
|
|
normal = 0.0f;
|
|
break;
|
|
case RecEnableAutomation:
|
|
lower = 0.0;
|
|
upper = 1.0;
|
|
toggled = true;
|
|
break;
|
|
case PluginAutomation:
|
|
case FadeInAutomation:
|
|
case FadeOutAutomation:
|
|
case EnvelopeAutomation:
|
|
upper = 2.0f;
|
|
normal = 1.0f;
|
|
break;
|
|
case SoloAutomation:
|
|
case MuteAutomation:
|
|
upper = 1.0f;
|
|
normal = 0.0f;
|
|
toggled = true;
|
|
break;
|
|
case MidiCCAutomation:
|
|
case MidiPgmChangeAutomation:
|
|
case MidiChannelPressureAutomation:
|
|
lower = 0.0;
|
|
normal = 0.0;
|
|
upper = 127.0;
|
|
break;
|
|
case MidiPitchBenderAutomation:
|
|
lower = 0.0;
|
|
normal = 8192.0;
|
|
upper = 16383.0;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
update_steps();
|
|
}
|
|
|
|
ParameterDescriptor::ParameterDescriptor()
|
|
: Evoral::ParameterDescriptor()
|
|
, key((uint32_t)-1)
|
|
, datatype(Variant::NOTHING)
|
|
, unit(NONE)
|
|
, step(0)
|
|
, smallstep(0)
|
|
, largestep(0)
|
|
, integer_step(false)
|
|
, logarithmic(false)
|
|
, sr_dependent(false)
|
|
, min_unbound(0)
|
|
, max_unbound(0)
|
|
, enumeration(false)
|
|
{}
|
|
|
|
void
|
|
ParameterDescriptor::update_steps()
|
|
{
|
|
if (unit == ParameterDescriptor::MIDI_NOTE) {
|
|
step = smallstep = 1; // semitone
|
|
largestep = 12; // octave
|
|
} else if (integer_step) {
|
|
const float delta = upper - lower;
|
|
|
|
smallstep = delta / 10000.0f;
|
|
step = delta / 1000.0f;
|
|
largestep = delta / 40.0f;
|
|
|
|
smallstep = std::max(1.0, rint(smallstep));
|
|
step = std::max(1.0, rint(step));
|
|
largestep = std::max(1.0, rint(largestep));
|
|
}
|
|
/* else: leave all others as default '0'
|
|
* in that case the UI (eg. AutomationController::create)
|
|
* uses internal_to_interface() to map the value
|
|
* to an appropriate interface range
|
|
*/
|
|
}
|
|
|
|
} // namespace ARDOUR
|