float (* notes_pointer)[][2];
uint8_t notes_length;
bool notes_repeat;
+float notes_rest;
+bool note_resting = false;
+
uint8_t current_note = 0;
+uint8_t rest_counter = 0;
audio_config_t audio_config;
DDRC |= _BV(PORTC6);
TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
-
+
TCCR3A = 0x0; // Options not needed
TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC
OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback
if (voices == 1) {
// SINE
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2;
-
+
// SQUARE
// if (((int)place) >= 1024){
// OCR4A = 0xFF >> 2;
// } else {
// OCR4A = 0x00;
// }
-
+
// SAWTOOTH
// OCR4A = (int)place / 4;
note_position++;
bool end_of_note = false;
- if (ICR3 > 0)
+ if (ICR3 > 0)
end_of_note = (note_position >= (note_length / ICR3 * 0xFFFF));
- else
+ else
end_of_note = (note_position >= (note_length * 0x7FF));
if (end_of_note) {
current_note++;
return;
}
}
- #ifdef PWM_AUDIO
- note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
- note_length = (*notes_pointer)[current_note][1];
- #else
- note_frequency = (*notes_pointer)[current_note][0];
- note_length = (*notes_pointer)[current_note][1] / 4;
- #endif
+ if (!note_resting && (notes_rest > 0)) {
+ note_resting = true;
+ note_frequency = 0;
+ note_length = notes_rest;
+ current_note--;
+ } else {
+ note_resting = false;
+ #ifdef PWM_AUDIO
+ note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
+ note_length = (*notes_pointer)[current_note][1];
+ #else
+ note_frequency = (*notes_pointer)[current_note][0];
+ note_length = (*notes_pointer)[current_note][1] / 4;
+ #endif
+ }
note_position = 0;
}
}
}
-void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
+void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat, float n_rest) {
if (audio_config.enable) {
if (note)
stop_all_notes();
- notes = true;
notes_pointer = np;
notes_length = n_length;
notes_repeat = n_repeat;
+ notes_rest = n_rest;
place = 0;
current_note = 0;
TIMSK3 |= _BV(OCIE3A);
TCCR3A |= _BV(COM3A1);
#endif
+
+ notes = true;
}
}
if (notes)
stop_all_notes();
- note = true;
#ifdef PWM_AUDIO
freq = freq / SAMPLE_RATE;
#endif
if (frequency != 0) {
double starting_f = frequency;
if (frequency < freq) {
- for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {
+ for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {
frequency = f;
}
} else if (frequency > freq) {
TCCR3A |= _BV(COM3A1);
#endif
+ note = true;
}
}
\ No newline at end of file