|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- #include "midi-utils.h"
-
- #if !defined _WIN32
- /**
- * Converts a string to lowercase.
- * @param dest - The string to convert.
- */
- void _strlwr(char* dest) {
- for (unsigned int i = 0; i < strlen(dest); i += 1) {
- if ('A' <= dest[i] && dest[i] <= 'Z') {
- dest[i] += 0x20;
- }
- }
- }
- #endif
-
- /**
- * Gets the name of a MIDI note value.
- * @param midi_note - The MIDI note value.
- * @note Valid values are from 0-127.
- * @return The MIDI note name.
- * @see MIDI_GetNoteFromName()
- */
- char* MIDI_GetNoteName(unsigned char midi_note) {
- static const char* pitch_names[] = {
- "C",
- "C#",
- "D",
- "D#",
- "E",
- "F",
- "F#",
- "G",
- "G#",
- "A",
- "A#",
- "B"
- };
-
- const unsigned char pitch_class = midi_note % 12;
- const unsigned char octave = midi_note / 12;
- static char note_name[8];
- sprintf(note_name, "%s%u", pitch_names[pitch_class], octave);
- return note_name;
- }
-
- /**
- * Gets the note value from a MIDI note name
- * @param name - The MIDI note name.
- * @return The MIDI note value, or 255 if an invalid name is passed.
- * @see MIDI_GetNoteName()
- */
- unsigned char MIDI_GetNoteFromName(const char* name) {
- if (!name) {
- return 255u;
- }
-
- char name_copy[8];
- strcpy(name_copy, name);
- _strlwr(name_copy);
-
- unsigned char octave = 0;
- unsigned char has_accidental = name_copy[1] == '#' || name_copy[1] == 'b';
- unsigned char octave_start = has_accidental ? 2 : 1;
- unsigned char pitch_class;
- char octave_offset = 0;
-
- for (unsigned char i = octave_start; '0' <= name_copy[i] && name_copy[i] <= '9'; i += 1) {
- octave *= 10;
- octave += name_copy[i] - '0';
- }
-
- if (strstr(name_copy, "c#") || strstr(name_copy, "db")) {
- pitch_class = 1;
- } else if (strstr(name_copy, "d#") || strstr(name_copy, "eb")) {
- pitch_class = 3;
- } else if (strstr(name_copy, "fb")) {
- pitch_class = 4;
- } else if (strstr(name_copy, "e#")) {
- pitch_class = 5;
- } else if (strstr(name_copy, "f#") || strstr(name_copy, "gb")) {
- pitch_class = 6;
- } else if (strstr(name_copy, "g#") || strstr(name_copy, "ab")) {
- pitch_class = 8;
- } else if (strstr(name_copy, "a#") || strstr(name_copy, "bb")) {
- pitch_class = 10;
- } else if (strstr(name_copy, "cb")) {
- pitch_class = 11;
- octave_offset = -1;
- } else if (strstr(name_copy, "b#")) {
- pitch_class = 0;
- octave_offset = 1;
- } else if (strstr(name_copy, "c")) {
- pitch_class = 0;
- } else if (strstr(name_copy, "d")) {
- pitch_class = 2;
- } else if (strstr(name_copy, "e")) {
- pitch_class = 4;
- } else if (strstr(name_copy, "f")) {
- pitch_class = 5;
- } else if (strstr(name_copy, "g")) {
- pitch_class = 7;
- } else if (strstr(name_copy, "a")) {
- pitch_class = 9;
- } else if (strstr(name_copy, "b")) {
- pitch_class = 11;
- } else {
- return 255u;
- }
-
- if (octave == 0 && octave_offset < 0) {
- return 255u;
- }
-
- return ((octave * 12) + octave_offset) + pitch_class;
- }
|