From 40f3efa3aa405c48f717fd527d92ed5de2cb0c1e Mon Sep 17 00:00:00 2001 From: Nil Geisweiller Date: Fri, 12 May 2017 21:27:56 +0300 Subject: Add note name parser to convert to midi note number Supports i18n, is case and whitespace insensitive for more resilent parsing. --- libs/ardour/parameter_descriptor.cc | 42 +++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) (limited to 'libs/ardour/parameter_descriptor.cc') 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 + #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 -- cgit v1.2.3