summaryrefslogtreecommitdiff
path: root/libs/ardour/parameter_descriptor.cc
diff options
context:
space:
mode:
authorNil Geisweiller <ngeiswei@gmail.com>2017-05-12 21:27:56 +0300
committerRobin Gareus <robin@gareus.org>2017-05-14 18:13:07 +0200
commit40f3efa3aa405c48f717fd527d92ed5de2cb0c1e (patch)
tree3e9c504cee3ea9bb4c7f46bbd609b1911bddc9fb /libs/ardour/parameter_descriptor.cc
parentc55c8141776ff97765875617af7b38d6236633a7 (diff)
Add note name parser to convert to midi note number
Supports i18n, is case and whitespace insensitive for more resilent parsing.
Diffstat (limited to 'libs/ardour/parameter_descriptor.cc')
-rw-r--r--libs/ardour/parameter_descriptor.cc42
1 files changed, 40 insertions, 2 deletions
diff --git a/libs/ardour/parameter_descriptor.cc b/libs/ardour/parameter_descriptor.cc
index 660abbc616..16c618dec6 100644
--- a/libs/ardour/parameter_descriptor.cc
+++ b/libs/ardour/parameter_descriptor.cc
@@ -17,6 +17,8 @@
675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <boost/algorithm/string.hpp>
+
#include "ardour/amp.h"
#include "ardour/dB.h"
#include "ardour/parameter_descriptor.h"
@@ -190,7 +192,7 @@ ParameterDescriptor::update_steps()
}
std::string
-ParameterDescriptor::midi_note_name (const uint8_t b)
+ParameterDescriptor::midi_note_name (const uint8_t b, bool translate)
{
char buf[16];
if (b > 127) {
@@ -198,6 +200,10 @@ ParameterDescriptor::midi_note_name (const uint8_t b)
return buf;
}
+ static const char* en_notes[] = {
+ "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"
+ };
+
static const char* notes[] = {
S_("Note|C"),
S_("Note|C#"),
@@ -215,8 +221,40 @@ ParameterDescriptor::midi_note_name (const uint8_t b)
/* MIDI note 0 is in octave -1 (in scientific pitch notation) */
const int octave = b / 12 - 1;
- snprintf (buf, sizeof (buf), "%s%d", notes[b % 12], octave);
+ const size_t p = b % 12;
+ snprintf (buf, sizeof (buf), "%s%d", translate ? notes[p] : en_notes[p], octave);
return buf;
}
+std::string
+ParameterDescriptor::normalize_note_name(const std::string& name)
+{
+ // Remove whitespaces and convert to lower case for a more resilient parser
+ return boost::to_lower_copy(boost::erase_all_copy(name, " "));
+};
+
+ParameterDescriptor::NameNumMap
+ParameterDescriptor::build_midi_name2num()
+{
+ NameNumMap name2num;
+ for (uint8_t num = 0; num < 128; num++) {
+ name2num[normalize_note_name(midi_note_name(num))] = num;
+ }
+ return name2num;
+}
+
+uint8_t
+ParameterDescriptor::midi_note_num (const std::string& name)
+{
+ static NameNumMap name2num = build_midi_name2num();
+
+ uint8_t num = -1; // -1 (or 255) is returned in case of failure
+
+ NameNumMap::const_iterator it = name2num.find(normalize_note_name(name));
+ if (it != name2num.end())
+ num = it->second;
+
+ return num;
+}
+
} // namespace ARDOUR