use automatic rests with songs (no more rest styles)
This commit is contained in:
parent
f40ded7894
commit
92ccc9a7b8
3 changed files with 30 additions and 24 deletions
|
@ -99,7 +99,6 @@ uint16_t note_position = 0;
|
||||||
float (* notes_pointer)[][2];
|
float (* notes_pointer)[][2];
|
||||||
uint16_t notes_count;
|
uint16_t notes_count;
|
||||||
bool notes_repeat;
|
bool notes_repeat;
|
||||||
float notes_rest;
|
|
||||||
bool note_resting = false;
|
bool note_resting = false;
|
||||||
|
|
||||||
uint8_t current_note = 0;
|
uint8_t current_note = 0;
|
||||||
|
@ -180,7 +179,7 @@ void audio_init()
|
||||||
audio_initialized = true;
|
audio_initialized = true;
|
||||||
|
|
||||||
if (audio_config.enable) {
|
if (audio_config.enable) {
|
||||||
PLAY_NOTE_ARRAY(startup_song, false, LEGATO);
|
PLAY_SONG(startup_song);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -416,9 +415,12 @@ ISR(TIMER3_COMPA_vect)
|
||||||
note_position++;
|
note_position++;
|
||||||
bool end_of_note = false;
|
bool end_of_note = false;
|
||||||
if (TIMER_3_PERIOD > 0) {
|
if (TIMER_3_PERIOD > 0) {
|
||||||
end_of_note = (note_position >= (note_length / TIMER_3_PERIOD * 0xFFFF));
|
if (!note_resting)
|
||||||
|
end_of_note = (note_position >= (note_length / TIMER_3_PERIOD * 0xFFFF - 1));
|
||||||
|
else
|
||||||
|
end_of_note = (note_position >= (note_length));
|
||||||
} else {
|
} else {
|
||||||
end_of_note = (note_position >= (note_length * 0x7FF));
|
end_of_note = (note_position >= (note_length));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (end_of_note) {
|
if (end_of_note) {
|
||||||
|
@ -433,11 +435,16 @@ ISR(TIMER3_COMPA_vect)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!note_resting && (notes_rest > 0)) {
|
if (!note_resting) {
|
||||||
note_resting = true;
|
note_resting = true;
|
||||||
note_frequency = 0;
|
|
||||||
note_length = notes_rest;
|
|
||||||
current_note--;
|
current_note--;
|
||||||
|
if ((*notes_pointer)[current_note][0] == (*notes_pointer)[current_note + 1][0]) {
|
||||||
|
note_frequency = 0;
|
||||||
|
note_length = 1;
|
||||||
|
} else {
|
||||||
|
note_frequency = (*notes_pointer)[current_note][0];
|
||||||
|
note_length = 1;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
note_resting = false;
|
note_resting = false;
|
||||||
envelope_index = 0;
|
envelope_index = 0;
|
||||||
|
@ -548,9 +555,9 @@ ISR(TIMER1_COMPA_vect)
|
||||||
note_position++;
|
note_position++;
|
||||||
bool end_of_note = false;
|
bool end_of_note = false;
|
||||||
if (TIMER_1_PERIOD > 0) {
|
if (TIMER_1_PERIOD > 0) {
|
||||||
end_of_note = (note_position >= (note_length / TIMER_1_PERIOD * 0xFFFF));
|
end_of_note = (note_position >= (note_length / TIMER_1_PERIOD * 0xFFFF - 1));
|
||||||
} else {
|
} else {
|
||||||
end_of_note = (note_position >= (note_length * 0x7FF));
|
end_of_note = (note_position >= (note_length));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (end_of_note) {
|
if (end_of_note) {
|
||||||
|
@ -565,11 +572,16 @@ ISR(TIMER1_COMPA_vect)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!note_resting && (notes_rest > 0)) {
|
if (!note_resting) {
|
||||||
note_resting = true;
|
note_resting = true;
|
||||||
note_frequency = 0;
|
|
||||||
note_length = notes_rest;
|
|
||||||
current_note--;
|
current_note--;
|
||||||
|
if ((*notes_pointer)[current_note][0] == (*notes_pointer)[current_note + 1][0]) {
|
||||||
|
note_frequency = 0;
|
||||||
|
note_length = 1;
|
||||||
|
} else {
|
||||||
|
note_frequency = (*notes_pointer)[current_note][0];
|
||||||
|
note_length = 1;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
note_resting = false;
|
note_resting = false;
|
||||||
envelope_index = 0;
|
envelope_index = 0;
|
||||||
|
@ -638,7 +650,7 @@ void play_note(float freq, int vol) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest)
|
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!audio_initialized) {
|
if (!audio_initialized) {
|
||||||
|
@ -663,7 +675,6 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest)
|
||||||
notes_pointer = np;
|
notes_pointer = np;
|
||||||
notes_count = n_count;
|
notes_count = n_count;
|
||||||
notes_repeat = n_repeat;
|
notes_repeat = n_repeat;
|
||||||
notes_rest = n_rest;
|
|
||||||
|
|
||||||
place = 0;
|
place = 0;
|
||||||
current_note = 0;
|
current_note = 0;
|
||||||
|
|
|
@ -86,7 +86,7 @@ void play_sample(uint8_t * s, uint16_t l, bool r);
|
||||||
void play_note(float freq, int vol);
|
void play_note(float freq, int vol);
|
||||||
void stop_note(float freq);
|
void stop_note(float freq);
|
||||||
void stop_all_notes(void);
|
void stop_all_notes(void);
|
||||||
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest);
|
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat);
|
||||||
|
|
||||||
#define SCALE (int8_t []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
|
#define SCALE (int8_t []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
|
||||||
0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
|
0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
|
||||||
|
@ -98,8 +98,10 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest)
|
||||||
// length. This works around the limitation of C's sizeof operation on pointers.
|
// length. This works around the limitation of C's sizeof operation on pointers.
|
||||||
// The global float array for the song must be used here.
|
// The global float array for the song must be used here.
|
||||||
#define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0]))))
|
#define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0]))))
|
||||||
#define PLAY_NOTE_ARRAY(note_array, note_repeat, note_rest_style) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat), (note_rest_style));
|
#define PLAY_NOTE_ARRAY(note_array, note_repeat, deprecated_arg) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat)); \
|
||||||
#define PLAY_SONG(song) PLAY_NOTE_ARRAY(song, false, STACCATO)
|
_Pragma ("message \"'PLAY_NOTE_ARRAY' macro is deprecated\"")
|
||||||
|
#define PLAY_SONG(note_array) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), false);
|
||||||
|
#define PLAY_LOOP(note_array) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), true);
|
||||||
|
|
||||||
bool is_playing_notes(void);
|
bool is_playing_notes(void);
|
||||||
|
|
||||||
|
|
|
@ -51,12 +51,6 @@
|
||||||
#define ED_NOTE(n) EIGHTH_DOT_NOTE(n)
|
#define ED_NOTE(n) EIGHTH_DOT_NOTE(n)
|
||||||
#define SD_NOTE(n) SIXTEENTH_DOT_NOTE(n)
|
#define SD_NOTE(n) SIXTEENTH_DOT_NOTE(n)
|
||||||
|
|
||||||
// Note Styles
|
|
||||||
// Staccato makes sure there is a rest between each note. Think: TA TA TA
|
|
||||||
// Legato makes notes flow together. Think: TAAA
|
|
||||||
#define STACCATO 0.01
|
|
||||||
#define LEGATO 0
|
|
||||||
|
|
||||||
// Note Timbre
|
// Note Timbre
|
||||||
// Changes how the notes sound
|
// Changes how the notes sound
|
||||||
#define TIMBRE_12 0.125
|
#define TIMBRE_12 0.125
|
||||||
|
@ -65,7 +59,6 @@
|
||||||
#define TIMBRE_75 0.750
|
#define TIMBRE_75 0.750
|
||||||
#define TIMBRE_DEFAULT TIMBRE_50
|
#define TIMBRE_DEFAULT TIMBRE_50
|
||||||
|
|
||||||
|
|
||||||
// Notes - # = Octave
|
// Notes - # = Octave
|
||||||
|
|
||||||
#define NOTE_REST 0.00
|
#define NOTE_REST 0.00
|
||||||
|
|
Loading…
Reference in a new issue