summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour/parameter_descriptor.h
blob: 379d97ef3e190a4f36c6e25b365fe9b319bc1dbd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
    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.
*/

#ifndef __ardour_parameter_descriptor_h__
#define __ardour_parameter_descriptor_h__

#include "ardour/variant.h"
#include "evoral/Parameter.hpp"

namespace ARDOUR {

typedef std::map<const std::string, const float> ScalePoints;

/** Descriptor of a parameter or control.
 *
 * Essentially a union of LADSPA, VST and LV2 info.
 */
struct ParameterDescriptor
{
	enum Unit {
		NONE,       ///< No unit
		DB,         ///< Decibels
		MIDI_NOTE,  ///< MIDI note number
	};

	ParameterDescriptor(const Evoral::Parameter& parameter)
		: key((uint32_t)-1)
		, datatype(Variant::VOID)
		, normal(parameter.normal())
		, lower(parameter.min())
		, upper(parameter.max())
		, step((upper - lower) / 100.0f)
		, smallstep((upper - lower) / 1000.0f)
		, largestep((upper - lower) / 10.0f)
		, integer_step(parameter.type() >= MidiCCAutomation &&
		               parameter.type() <= MidiChannelPressureAutomation)
		, toggled(parameter.toggled())
		, logarithmic(false)
		, sr_dependent(false)
		, min_unbound(0)
		, max_unbound(0)
		, enumeration(false)
	{
		if (parameter.type() == GainAutomation) {
			unit = DB;
		}
	}

	ParameterDescriptor()
		: key((uint32_t)-1)
		, datatype(Variant::VOID)
		, normal(0)
		, lower(0)
		, upper(0)
		, step(0)
		, smallstep(0)
		, largestep(0)
		, integer_step(false)
		, toggled(false)
		, logarithmic(false)
		, sr_dependent(false)
		, min_unbound(0)
		, max_unbound(0)
		, enumeration(false)
	{}

	/// Set step, smallstep, and largestep, based on current description
	void update_steps() {
		if (unit == ParameterDescriptor::MIDI_NOTE) {
			step      = smallstep = 1;  // semitone
			largestep = 12;             // octave
		} else {
			const float delta = upper - lower;

			step      = delta / 1000.0f;
			smallstep = delta / 10000.0f;
			largestep = delta / 10.0f;

			if (integer_step) {
				step      = rint(step);
				largestep = rint(largestep);
				// leave smallstep alone for fine tuning
			}
		}
	}

	std::string                    label;
	std::string                    print_fmt;  ///< format string for pretty printing
	boost::shared_ptr<ScalePoints> scale_points;
	uint32_t                       key;  ///< for properties
	Variant::Type                  datatype;  ///< for properties
	Unit                           unit;
	float                          normal;
	float                          lower;  ///< for frequencies, this is in Hz (not a fraction of the sample rate)
	float                          upper;  ///< for frequencies, this is in Hz (not a fraction of the sample rate)
	float                          step;
	float                          smallstep;
	float                          largestep;
	bool                           integer_step;
	bool                           toggled;
	bool                           logarithmic;
	bool                           sr_dependent;
	bool                           min_unbound;
	bool                           max_unbound;
	bool                           enumeration;
};

} // namespace ARDOUR

#endif // __ardour_parameter_descriptor_h__