108 lines
4.0 KiB
C++
108 lines
4.0 KiB
C++
// ---------------------------------------------------------------------------
|
|
// AUTHOR/LICENSE:
|
|
// The following code was written by Antoine Beauchamp. For other authors, see AUTHORS file.
|
|
// The code & updates for the library can be found at https://github.com/end2endzone/AnyRtttl
|
|
// MIT License: http://www.opensource.org/licenses/mit-license.php
|
|
// ---------------------------------------------------------------------------
|
|
|
|
#ifndef BINRTTTL_H
|
|
#define BINRTTTL_H
|
|
|
|
#include "Arduino.h"
|
|
|
|
#define RTTTL_SONG_NAME_SIZE 11
|
|
#define RTTTL_NOTE_SIZE_BITS 10
|
|
|
|
namespace anyrtttl
|
|
{
|
|
|
|
typedef unsigned char DURATION_INDEX;
|
|
typedef unsigned char NOTE_LETTER_INDEX;
|
|
typedef unsigned char OCTAVE_INDEX;
|
|
typedef unsigned char BPM_INDEX;
|
|
|
|
static DURATION_INDEX INVALID_DURATION_INDEX = (DURATION_INDEX)-1;
|
|
static NOTE_LETTER_INDEX INVALID_NOTE_LETTER_INDEX = (NOTE_LETTER_INDEX)-1;
|
|
static OCTAVE_INDEX INVALID_OCTAVE_INDEX = (OCTAVE_INDEX)-1;
|
|
static BPM_INDEX INVALID_BPM_INDEX = (BPM_INDEX)-1;
|
|
|
|
typedef unsigned short RTTTL_DURATION;
|
|
typedef char RTTTL_NOTE_LETTER;
|
|
typedef unsigned char RTTTL_OCTAVE_VALUE;
|
|
typedef unsigned short RTTTL_BPM;
|
|
|
|
#pragma pack(push, 1) // exact fit - no padding
|
|
union RTTTL_NOTE
|
|
{
|
|
unsigned short raw;
|
|
struct
|
|
{
|
|
DURATION_INDEX durationIdx : 3; //ranges from 0 to 7. Matches index of getNoteDurationFromIndex()
|
|
NOTE_LETTER_INDEX noteIdx : 3; //ranges from 0 to 7. Matches index of getNoteLetterFromIndex()
|
|
bool pound : 1; //ranges from 0 to 1. True if the note is pound
|
|
bool dotted : 1; //ranges from 0 to 1. True if the duration is dotted
|
|
OCTAVE_INDEX octaveIdx : 2; //ranges from 0 to 3. Matches index of getNoteOctaveFromIndex()
|
|
unsigned char padding : 6;
|
|
};
|
|
};
|
|
|
|
union RTTTL_DEFAULT_VALUE_SECTION
|
|
{
|
|
unsigned short raw;
|
|
//struct
|
|
//{
|
|
// DURATION_INDEX durationIdx : 3; //ranges from 0 to 7. Matches index of getNoteDurationFromIndex()
|
|
// OCTAVE_INDEX octaveIdx : 2; //ranges from 0 to 3. Matches index of getNoteOctaveFromIndex()
|
|
// RTTTL_BPM bpm : 10; //ranges from 0 to 900.
|
|
// bool padding : 1;
|
|
//};
|
|
struct //aligned on 8 bits types
|
|
{
|
|
DURATION_INDEX durationIdx : 3; //ranges from 0 to 7. Matches index of getNoteDurationFromIndex()
|
|
OCTAVE_INDEX octaveIdx : 2; //ranges from 0 to 3. Matches index of getNoteOctaveFromIndex()
|
|
unsigned char : 3; //padding for bpm
|
|
unsigned char : 7; //padding for bpm
|
|
unsigned char : 1; //padding
|
|
};
|
|
struct //aligned on 16 bits types
|
|
{
|
|
unsigned short : 5; //padding for durationIdx and octaveIdx
|
|
RTTTL_BPM bpm : 10; //ranges from 1 to 900.
|
|
unsigned short : 1; //padding
|
|
};
|
|
};
|
|
#pragma pack(pop) //back to whatever the previous packing mode was
|
|
|
|
//RTTTL note letters
|
|
//allowed values: 'c','d','e','f','g','a','b','p'
|
|
RTTTL_NOTE_LETTER getNoteLetterFromIndex(NOTE_LETTER_INDEX iIndex);
|
|
uint16_t getNoteLettersCount();
|
|
NOTE_LETTER_INDEX findNoteLetterIndex(RTTTL_NOTE_LETTER n);
|
|
|
|
//RTTTL note offsets
|
|
//allowed values: 1, 3, 5, 6, 8, 10, 12, 0
|
|
int getNoteOffsetFromLetterIndex(NOTE_LETTER_INDEX iIndex);
|
|
int getNoteOffsetFromLetter(RTTTL_NOTE_LETTER n);
|
|
|
|
//RTTTL durations
|
|
//allowed values: 1, 2, 4, 8, 16, 32
|
|
RTTTL_DURATION getNoteDurationFromIndex(DURATION_INDEX iIndex);
|
|
uint16_t getNoteDurationsCount();
|
|
DURATION_INDEX findNoteDurationIndex(RTTTL_DURATION n);
|
|
|
|
//RTTTL octaves
|
|
//allowed values: 4, 5, 6, 7
|
|
RTTTL_OCTAVE_VALUE getNoteOctaveFromIndex(OCTAVE_INDEX iIndex);
|
|
uint16_t getNoteOctavesCount();
|
|
OCTAVE_INDEX findNoteOctaveIndex(RTTTL_OCTAVE_VALUE n);
|
|
|
|
//RTTTL BPM values
|
|
//allowed values: 25, 28, 31, 35, 40, 45, 50, 56, 63, 70, 80, 90, 100, 112, 125, 140, 160, 180, 200, 225, 250, 285, 320, 355, 400, 450, 500, 565, 635, 715, 800 and 900.
|
|
RTTTL_BPM getBpmFromIndex(BPM_INDEX iIndex);
|
|
uint16_t getBpmsCount();
|
|
BPM_INDEX findBpmIndex(RTTTL_BPM n);
|
|
|
|
}; //anyrtttl namespace
|
|
|
|
#endif //BINRTTTL_H
|