summaryrefslogtreecommitdiffstats
path: root/quantum/audio.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/audio.c')
-rw-r--r--quantum/audio.c58
1 files changed, 37 insertions, 21 deletions
diff --git a/quantum/audio.c b/quantum/audio.c
index 5edcccdbe..6bd6532a3 100644
--- a/quantum/audio.c
+++ b/quantum/audio.c
@@ -12,6 +12,8 @@
#define PI 3.14159265
+#define CPU_PRESCALER 8
+
// #define PWM_AUDIO
#ifdef PWM_AUDIO
@@ -59,7 +61,11 @@ uint16_t note_position = 0;
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;
@@ -175,7 +181,7 @@ void init_notes() {
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
@@ -196,14 +202,14 @@ ISR(TIMER3_COMPA_vect) {
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;
@@ -244,12 +250,12 @@ ISR(TIMER3_COMPA_vect) {
// ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period
// OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period
voice_place %= voices;
- if (place > (frequencies[voice_place] / 500)) {
+ if (place > (frequencies[voice_place] / 50)) {
voice_place = (voice_place + 1) % voices;
place = 0.0;
}
- ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period
- OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1 * duty_place; // Set compare to half the period
+ ICR3 = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)); // Set max to the period
+ OCR3A = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)) >> 1 * duty_place; // Set compare to half the period
place++;
// if (duty_counter > (frequencies[voice_place] / 500)) {
// duty_place = (duty_place % 3) + 1;
@@ -281,8 +287,8 @@ ISR(TIMER3_COMPA_vect) {
place -= SINE_LENGTH;
#else
if (note_frequency > 0) {
- ICR3 = (int)(((double)F_CPU) / note_frequency); // Set max to the period
- OCR3A = (int)(((double)F_CPU) / note_frequency) >> 1; // Set compare to half the period
+ ICR3 = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)); // Set max to the period
+ OCR3A = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)) >> 1; // Set compare to half the period
} else {
ICR3 = 0;
OCR3A = 0;
@@ -292,9 +298,9 @@ ISR(TIMER3_COMPA_vect) {
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++;
@@ -312,13 +318,21 @@ ISR(TIMER3_COMPA_vect) {
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;
}
@@ -330,17 +344,17 @@ ISR(TIMER3_COMPA_vect) {
}
}
-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;
@@ -360,6 +374,8 @@ if (audio_config.enable) {
TIMSK3 |= _BV(OCIE3A);
TCCR3A |= _BV(COM3A1);
#endif
+
+ notes = true;
}
}
@@ -389,7 +405,6 @@ if (audio_config.enable && voices < 8) {
if (notes)
stop_all_notes();
- note = true;
#ifdef PWM_AUDIO
freq = freq / SAMPLE_RATE;
#endif
@@ -397,7 +412,7 @@ if (audio_config.enable && voices < 8) {
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) {
@@ -421,6 +436,7 @@ if (audio_config.enable && voices < 8) {
TCCR3A |= _BV(COM3A1);
#endif
+ note = true;
}
} \ No newline at end of file