/***************************************************************************
* This file is part of Melody Player, a library for Arduino *
* to play notes on piezoelectric buzzers. *
* *
* Copyright (C) 2020-2022 Fabiano Riccardi *
* *
* This library is free software; you can redistribute *
* it and/or modify it under the terms of the GNU Lesser General Public *
* License as published by the Free Software Foundation; either *
* version 2.1 of the License, or (at your option) any later version. *
* *
* This library 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 *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this library; if not, see *
***************************************************************************/
#ifndef PITCHES_UNORDERED_MAP_H
#define PITCHES_UNORDERED_MAP_H
#include
/**
* This class resembles the std::string_view class introduced with c++17. MelodyPlayer uses this
* version to ensure retro-compatibility with esp8266-core v2.x.x, which uses GCC v4.8.2.
*/
struct StringView {
StringView() = delete;
constexpr StringView(const char* s) : str(s), lenght(__builtin_strlen(s)) {}
constexpr bool operator==(const StringView& other) const {
return lenght == other.lenght && (__builtin_memcmp(str, other.str, lenght) == 0);
}
constexpr size_t length() const {
return lenght;
}
constexpr const char* data() const {
return str;
}
private:
const char* str;
size_t lenght;
};
// clang-format off
constexpr std::array, 92> noteMapping{{
{"SILENCE", 0 },
{ "B0", 31 },
{ "C1", 33 },
{ "CS1", 35 },
{ "D1", 37 },
{ "DS1", 39 },
{ "D1", 37 },
{ "DS1", 39 },
{ "E1", 41 },
{ "F1", 44 },
{ "FS1", 46 },
{ "G1", 49 },
{ "GS1", 52 },
{ "A1", 55 },
{ "AS1", 58 },
{ "B1", 62 },
{ "C2", 65 },
{ "CS2", 69 },
{ "D2", 73 },
{ "DS2", 78 },
{ "E2", 82 },
{ "F2", 87 },
{ "FS2", 93 },
{ "G2", 98 },
{ "GS2", 104 },
{ "A2", 110 },
{ "AS2", 117 },
{ "B2", 123 },
{ "C3", 131 },
{ "CS3", 139 },
{ "D3", 147 },
{ "DS3", 156 },
{ "E3", 165 },
{ "F3", 175 },
{ "FS3", 185 },
{ "G3", 196 },
{ "GS3", 208 },
{ "A3", 220 },
{ "AS3", 233 },
{ "B3", 247 },
{ "C4", 262 },
{ "CS4", 277 },
{ "D4", 294 },
{ "DS4", 311 },
{ "E4", 330 },
{ "F4", 349 },
{ "FS4", 370 },
{ "G4", 392 },
{ "GS4", 415 },
{ "A4", 440 },
{ "AS4", 466 },
{ "B4", 494 },
{ "C5", 523 },
{ "CS5", 554 },
{ "D5", 587 },
{ "DS5", 622 },
{ "E5", 659 },
{ "F5", 698 },
{ "FS5", 740 },
{ "G5", 784 },
{ "GS5", 831 },
{ "A5", 880 },
{ "AS5", 932 },
{ "B5", 988 },
{ "C6", 1047},
{ "CS6", 1109},
{ "D6", 1175},
{ "DS6", 1245},
{ "E6", 1319},
{ "F6", 1397},
{ "FS6", 1480},
{ "G6", 1568},
{ "GS6", 1661},
{ "A6", 1760},
{ "AS6", 1865},
{ "B6", 1976},
{ "C7", 2093},
{ "CS7", 2217},
{ "D7", 2349},
{ "DS7", 2489},
{ "E7", 2637},
{ "F7", 2794},
{ "FS7", 2960},
{ "G7", 3136},
{ "GS7", 3322},
{ "A7", 3520},
{ "AS7", 3729},
{ "B7", 3951},
{ "C8", 4186},
{ "CS8", 4435},
{ "D8", 4699},
{ "DS8", 4978}
}};
// clang-format on
#endif // END PITCHES_UNORDERED_MAP_H