#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; }