]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
better integrations
authorJack Humbert <jack.humb@gmail.com>
Wed, 20 Jan 2016 05:06:52 +0000 (00:06 -0500)
committerJack Humbert <jack.humb@gmail.com>
Wed, 20 Jan 2016 05:06:52 +0000 (00:06 -0500)
12 files changed:
keyboard/planck/Makefile
keyboard/planck/keymaps/keymap_default.c
keyboard/planck/keymaps/keymap_lock.c
keyboard/planck/planck.h
quantum/audio.c [new file with mode: 0644]
quantum/audio.h [new file with mode: 0644]
quantum/beeps.c [deleted file]
quantum/beeps.h [deleted file]
quantum/keymap_midi.c
quantum/quantum.mk
tmk_core/common.mk
tmk_core/protocol/lufa/lufa.c

index fdf8c1640041767866aa79a60df5bda00cc8957f..7b06446d74b2b1a950128de0dc7d8a3f70ab13b7 100644 (file)
@@ -50,8 +50,7 @@ TMK_DIR = ../../tmk_core
 TARGET_DIR = .
 
 # # project specific files
-SRC = planck.c \
-       backlight.c 
+SRC = planck.c
 
 ifdef KEYMAP
     SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
@@ -124,9 +123,13 @@ COMMAND_ENABLE = yes    # Commands for debug and configuration
 # NKRO_ENABLE = yes            # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 # BACKLIGHT_ENABLE = yes  # Enable keyboard backlight functionality
 MIDI_ENABLE = YES              # MIDI controls
+AUDIO_ENABLE = YES             # Audio output on port C6
 # UNICODE_ENABLE = YES                 # Unicode
 # BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
 
+ifdef BACKLIGHT_ENABLE
+       SRC += backlight.c
+endif
 
 # Optimize size but this may cause error "relocation truncated to fit"
 #EXTRALDFLAGS = -Wl,--relax
index 49670dafd3e31a981aa0996666e048bb1781a771..a9c2a06813f6b237cba424a9cf654e26764b401b 100644 (file)
@@ -2,7 +2,9 @@
 // this is the style you want to emulate.
 
 #include "planck.h"
-#include "backlight.h"
+#ifdef BACKLIGHT_ENABLE
+  #include "backlight.h"
+#endif
 
 // Each layer gets a name for readability, which is then used in the keymap matrix below.
 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
@@ -58,7 +60,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
         case 0:
           if (record->event.pressed) {
             register_code(KC_RSFT);
-            backlight_step();
+            #ifdef BACKLIGHT_ENABLE
+              backlight_step();
+            #endif
           } else {
             unregister_code(KC_RSFT);
           }
index 7a99b57c9d1acfab0afac64321df6e1a9469de00..0deb212cc71937e8cfb1a2a1ff93c3af84476eea 100644 (file)
@@ -1,8 +1,10 @@
 #include "keymap_common.h"
-// #include "backlight.h"
+#ifdef BACKLIGHT_ENABLE
+  #include "backlight.h"
+#endif
 #include "action_layer.h"
 #include "keymap_midi.h"
-#include "beeps.h"
+#include "audio.h"
 #include <avr/boot.h>
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@@ -86,7 +88,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
           play_notes(&walk_up, 3, false);
           // play_note(440, 20);
           // register_code(KC_RSFT);
-          // backlight_set(BACKLIGHT_LEVELS);
+          #ifdef BACKLIGHT_ENABLE
+            backlight_set(BACKLIGHT_LEVELS);
+          #endif
           default_layer_and(0); 
           default_layer_or((1<<5));
 
@@ -118,17 +122,14 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
           // register_code(hextokeycode((lock & 0x0F)));
           // unregister_code(hextokeycode((lock & 0x0F)));
 
-          // note(0+12, 20);
-          // note(0+24, 20);
         } else {
           unregister_code(KC_RSFT);
           play_notes(&walk_dn, 3, false);
-          // backlight_set(0);
+          #ifdef BACKLIGHT_ENABLE
+            backlight_set(0);
+          #endif
           default_layer_and(0); 
           default_layer_or(0);
-          // note(0+24, 20);
-          // note(0, 20);
-          // play_note(4, 20);
         }
         break;
       } 
@@ -149,44 +150,5 @@ float start_up[][2] = {
 
 void * matrix_init_user(void) {
     init_notes();
-
     play_notes(&start_up, 9, false);
-    // play_note(((double)261.6*3)*pow(2.0,(36)/12.0), 0xF);
-    // _delay_ms(50);
-
-    // play_note(((double)261.6*3)*pow(2.0,(48)/12.0), 0xF);
-    // _delay_ms(25);
-    // stop_note(((double)261.6*3)*pow(2.0,(48)/12.0));
-
-    // play_note(((double)261.6*3)*pow(2.0,(48)/12.0), 0xF);
-    // _delay_ms(25);
-    // stop_note(((double)261.6*3)*pow(2.0,(48)/12.0));
-
-
-    // stop_note(((double)261.6*3)*pow(2.0,(36)/12.0));
-
-
-    // play_note(((double)261.6*3)*pow(2.0,(62)/12.0), 0xF);
-    // _delay_ms(50);
-    // stop_note(((double)261.6*3)*pow(2.0,(62)/12.0));
-
-
-    // play_note(((double)261.6*3)*pow(2.0,(64)/12.0), 0xF);
-    // _delay_ms(50);
-    // stop_note(((double)261.6*3)*pow(2.0,(64)/12.0));
-
-}
-
-
-// void * matrix_scan_user(void) {
-//   if (layer_state & (1<<2)) {
-//     if (!playing_notes)
-//       play_notes(&start_up, 9, true);
-//   } else if (layer_state & (1<<3)) {
-//     if (!playing_notes)
-//       play_notes(&start_up, 9, true);
-//   } else {
-//     if (playing_notes)
-//       stop_all_notes();
-//   }
-// }
\ No newline at end of file
+}
\ No newline at end of file
index 32c08f3b0b27a1bfcf5354749cfc1fe76d826270..e775ea7c62643684ea9525e2e4a598fd97d40b79 100644 (file)
@@ -3,7 +3,9 @@
 
 #include "matrix.h"
 #include "keymap_common.h"
-// #include "backlight.h"
+#ifdef BACKLIGHT_ENABLE
+       #include "backlight.h"
+#endif
 #include <stddef.h>
 #ifdef MIDI_ENABLE
        #include <keymap_midi.h>
diff --git a/quantum/audio.c b/quantum/audio.c
new file mode 100644 (file)
index 0000000..3a3a1a4
--- /dev/null
@@ -0,0 +1,362 @@
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <avr/pgmspace.h>
+#include <avr/interrupt.h>
+#include <avr/io.h>
+
+#include "audio.h"
+#include "keymap_common.h"
+
+#define PI 3.14159265
+
+// #define PWM_AUDIO
+
+#ifdef PWM_AUDIO
+    #include "wave.h"
+    #define SAMPLE_DIVIDER 39
+    #define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048)
+    // Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap
+#endif
+
+void delay_us(int count) {
+  while(count--) {
+    _delay_us(1);
+  }
+}
+
+int voices = 0;
+int voice_place = 0;
+double frequency = 0;
+int volume = 0;
+long position = 0;
+
+double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+bool sliding = false;
+
+int max = 0xFF;
+float sum = 0;
+int value = 128;
+float place = 0;
+float places[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+
+uint16_t place_int = 0;
+bool repeat = true;
+uint8_t * sample;
+uint16_t sample_length = 0;
+
+
+bool notes = false;
+bool note = false;
+float note_frequency = 0;
+float note_length = 0;
+uint16_t note_position = 0;
+float (* notes_pointer)[][2];
+uint8_t notes_length;
+bool notes_repeat;
+uint8_t current_note = 0;
+
+void stop_all_notes() {
+    voices = 0;
+    #ifdef PWM_AUDIO
+        TIMSK3 &= ~_BV(OCIE3A);
+    #else
+        TIMSK3 &= ~_BV(OCIE3A);
+        TCCR3A &= ~_BV(COM3A1);
+    #endif
+    notes = false;
+    note = false;
+    frequency = 0;
+    volume = 0;
+
+    for (int i = 0; i < 8; i++) {
+        frequencies[i] = 0;
+        volumes[i] = 0;
+    }
+}
+
+void stop_note(double freq) {
+    #ifdef PWM_AUDIO
+        freq = freq / SAMPLE_RATE;
+    #endif
+    for (int i = 7; i >= 0; i--) {
+        if (frequencies[i] == freq) {
+            frequencies[i] = 0;
+            volumes[i] = 0;
+            for (int j = i; (j < 7); j++) {
+                frequencies[j] = frequencies[j+1];
+                frequencies[j+1] = 0;
+                volumes[j] = volumes[j+1];
+                volumes[j+1] = 0;
+            }
+        }
+    }
+    voices--;
+    if (voices < 0)
+        voices = 0;
+    if (voices == 0) {
+        #ifdef PWM_AUDIO
+            TIMSK3 &= ~_BV(OCIE3A);
+        #else
+            TIMSK3 &= ~_BV(OCIE3A);
+            TCCR3A &= ~_BV(COM3A1);
+        #endif
+        frequency = 0;
+        volume = 0;
+        note = false;
+    } else {
+        double freq = frequencies[voices - 1];
+        int vol = volumes[voices - 1];
+        double starting_f = frequency;
+        if (frequency < freq) {
+            sliding = true;
+            for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {
+                frequency = f;
+            }
+            sliding = false;
+        } else if (frequency > freq) {
+            sliding = true;
+            for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) {
+                frequency = f;
+            }
+            sliding = false;
+        }
+        frequency = freq;
+        volume = vol;
+    }
+}
+
+void init_notes() {
+
+    #ifdef PWM_AUDIO
+        PLLFRQ = _BV(PDIV2);
+        PLLCSR = _BV(PLLE);
+        while(!(PLLCSR & _BV(PLOCK)));
+        PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */
+
+        /* Init a fast PWM on Timer4 */
+        TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */
+        TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */
+        OCR4A = 0;
+
+        /* Enable the OC4A output */
+        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
+    #else
+        DDRC |= _BV(PORTC6);
+
+        TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
+
+        TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
+        TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
+    #endif
+}
+
+
+ISR(TIMER3_COMPA_vect) {
+
+    if (note) {
+        #ifdef PWM_AUDIO
+            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;
+
+                // TRIANGLE
+                // if (((int)place) >= 1024) {
+                //     OCR4A = (int)place / 2;
+                // } else {
+                //     OCR4A = 2048 - (int)place / 2;
+                // }
+
+                place += frequency;
+
+                if (place >= SINE_LENGTH)
+                    place -= SINE_LENGTH;
+
+            } else {
+                int sum = 0;
+                for (int i = 0; i < voices; i++) {
+                    // SINE
+                    sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2;
+
+                    // SQUARE
+                    // if (((int)places[i]) >= 1024){
+                    //     sum += 0xFF >> 2;
+                    // } else {
+                    //     sum += 0x00;
+                    // }
+
+                    places[i] += frequencies[i];
+
+                    if (places[i] >= SINE_LENGTH)
+                        places[i] -= SINE_LENGTH;
+                }
+                OCR4A = sum;
+            }
+        #else
+            if (frequency > 0) {
+                // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period
+                // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period
+                if (place > 10) {
+                    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; // Set compare to half the period
+                place++;
+            }
+        #endif
+    }
+
+    // SAMPLE
+    // OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]);
+
+    // place_int++;
+
+    // if (place_int >= sample_length)
+    //     if (repeat)
+    //         place_int -= sample_length;
+    //     else
+    //         TIMSK3 &= ~_BV(OCIE3A);
+
+
+    if (notes) {
+        #ifdef PWM_AUDIO
+            OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0;
+
+            place += note_frequency;
+            if (place >= SINE_LENGTH)
+                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
+            }
+        #endif
+
+
+        note_position++;
+        if (note_position >= note_length) {
+            current_note++;
+            if (current_note >= notes_length) {
+                if (notes_repeat) {
+                    current_note = 0;
+                } else {
+                    #ifdef PWM_AUDIO
+                        TIMSK3 &= ~_BV(OCIE3A);
+                    #else
+                        TIMSK3 &= ~_BV(OCIE3A);
+                        TCCR3A &= ~_BV(COM3A1);
+                    #endif
+                    notes = false;
+                    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
+            note_position = 0;
+        }
+
+    }
+
+}
+
+void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
+    if (note)
+        stop_all_notes();
+    notes = true;
+
+    notes_pointer = np;
+    notes_length = n_length;
+    notes_repeat = n_repeat;
+
+    place = 0;
+    current_note = 0;
+    #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;
+
+
+    #ifdef PWM_AUDIO
+        TIMSK3 |= _BV(OCIE3A);
+    #else
+        TIMSK3 |= _BV(OCIE3A);
+        TCCR3A |= _BV(COM3A1);
+    #endif
+}
+
+void play_sample(uint8_t * s, uint16_t l, bool r) {
+    stop_all_notes();
+    place_int = 0;
+    sample = s;
+    sample_length = l;
+    repeat = r;
+
+    #ifdef PWM_AUDIO
+        TIMSK3 |= _BV(OCIE3A);
+    #else
+    #endif
+}
+
+void play_note(double freq, int vol) {
+    if (notes)
+        stop_all_notes();
+    note = true;
+    #ifdef PWM_AUDIO
+        freq = freq / SAMPLE_RATE;
+    #endif
+    if (freq > 0) {
+        if (frequency != 0) {
+            double starting_f = frequency;
+            if (frequency < freq) {
+                for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {   
+                    frequency = f;
+                }
+            } else if (frequency > freq) {
+                for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) {
+                    frequency = f;
+                }
+            }
+        }
+        frequency = freq;
+        volume = vol;
+
+        frequencies[voices] = frequency;
+        volumes[voices] = volume;
+        voices++;
+    }
+
+    #ifdef PWM_AUDIO
+        TIMSK3 |= _BV(OCIE3A);
+    #else
+        TIMSK3 |= _BV(OCIE3A);
+        TCCR3A |= _BV(COM3A1);
+    #endif
+
+}
\ No newline at end of file
diff --git a/quantum/audio.h b/quantum/audio.h
new file mode 100644 (file)
index 0000000..99203ce
--- /dev/null
@@ -0,0 +1,11 @@
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include <util/delay.h>
+
+void play_sample(uint8_t * s, uint16_t l, bool r);
+void play_note(double freq, int vol);
+void stop_note(double freq);
+void stop_all_notes();
+void init_notes();
+void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat);
\ No newline at end of file
diff --git a/quantum/beeps.c b/quantum/beeps.c
deleted file mode 100644 (file)
index 7586ebc..0000000
+++ /dev/null
@@ -1,265 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-#include <avr/pgmspace.h>
-#include <avr/interrupt.h>
-#include <avr/io.h>
-
-#include "beeps.h"
-#include "keymap_common.h"
-#include "wave.h"
-
-#define PI 3.14159265
-
-#define SAMPLE_DIVIDER 39
-#define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048)
-// Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap
-
-void delay_us(int count) {
-  while(count--) {
-    _delay_us(1);
-  }
-}
-
-int voices = 0;
-double frequency = 0;
-int volume = 0;
-long position = 0;
-
-double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
-int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
-bool sliding = false;
-#define RANGE 1000
-volatile int i=0; //elements of the wave
-
-int max = 0xFF;
-float sum = 0;
-int value = 128;
-float place = 0;
-
-uint16_t place_int = 0;
-bool repeat = true;
-uint8_t * sample;
-uint16_t sample_length = 0;
-
-
-bool notes = false;
-float note_frequency = 0;
-float note_length = 0;
-uint16_t note_position = 0;
-float (* notes_pointer)[][2];
-uint8_t notes_length;
-bool notes_repeat;
-uint8_t current_note = 0;
-
-void stop_all_notes() {
-    voices = 0;
-    TIMSK3 &= ~_BV(OCIE3A);
-    notes = false;
-    playing_notes = false;
-    frequency = 0;
-    volume = 0;
-
-    for (int i = 0; i < 8; i++) {
-        frequencies[i] = 0;
-        volumes[i] = 0;
-    }
-}
-
-void stop_note(double freq) {
-    freq = freq / SAMPLE_RATE;
-    for (int i = 7; i >= 0; i--) {
-        if (frequencies[i] == freq) {
-            frequencies[i] = 0;
-            volumes[i] = 0;
-            for (int j = i; (j < 7); j++) {
-                frequencies[j] = frequencies[j+1];
-                frequencies[j+1] = 0;
-                volumes[j] = volumes[j+1];
-                volumes[j+1] = 0;
-            }
-        }
-    }
-    voices--;
-    if (voices < 0)
-        voices = 0;
-    if (voices == 0) {
-        TIMSK3 &= ~_BV(OCIE3A);
-        frequency = 0;
-        volume = 0;
-    } else {
-        double freq = frequencies[voices - 1];
-        int vol = volumes[voices - 1];
-        double starting_f = frequency;
-        if (frequency < freq) {
-            sliding = true;
-            for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 500.0)) {
-                frequency = f;
-            }
-            sliding = false;
-        } else if (frequency > freq) {
-            sliding = true;
-            for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 500.0)) {
-                frequency = f;
-            }
-            sliding = false;
-        }
-        frequency = freq;
-        volume = vol;
-    }
-}
-
-void init_notes() {
-
-    PLLFRQ = _BV(PDIV2);
-    PLLCSR = _BV(PLLE);
-    while(!(PLLCSR & _BV(PLOCK)));
-    PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */
-
-    /* Init a fast PWM on Timer4 */
-    TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */
-    TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */
-    OCR4A = 0;
-
-    /* Enable the OC4A output */
-    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
-
-    playing_notes = false;
-
-}
-
-
-ISR(TIMER3_COMPA_vect) {
-
-
-    // SINE
-    // OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]);
-    
-    // SQUARE
-    // if (((int)place) >= 1024){
-    //     OCR4A = 0xFF;
-    // } else {
-    //     OCR4A = 0x00;
-    // }
-    
-    // SAWTOOTH
-    // OCR4A = (int)place / 4;
-
-    // TRIANGLE
-    // if (((int)place) >= 1024) {
-    //     OCR4A = (int)place / 2;
-    // } else {
-    //     OCR4A = 2048 - (int)place / 2;
-    // }
-
-    // place += frequency;
-
-    // if (place >= SINE_LENGTH)
-    //     if (repeat)
-    //         place -= SINE_LENGTH;
-    //     else
-    //         TIMSK3 &= ~_BV(OCIE3A);
-
-    // SAMPLE
-    // OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]);
-
-    // place_int++;
-
-    // if (place_int >= sample_length)
-    //     if (repeat)
-    //         place_int -= sample_length;
-    //     else
-    //         TIMSK3 &= ~_BV(OCIE3A);
-
-
-    if (notes) {
-        OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0;
-
-        place += note_frequency;
-        if (place >= SINE_LENGTH)
-            place -= SINE_LENGTH;
-        note_position++;
-        if (note_position >= note_length) {
-            current_note++;
-            if (current_note >= notes_length) {
-                if (notes_repeat) {
-                    current_note = 0;
-                } else {
-                    TIMSK3 &= ~_BV(OCIE3A);
-                    notes = false;
-                    playing_notes = false;
-                    return;
-                }
-            }
-            note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
-            note_length = (*notes_pointer)[current_note][1];
-            note_position = 0;
-        }
-
-    }
-
-}
-
-void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
-    notes = true;
-
-    notes_pointer = np;
-    notes_length = n_length;
-    notes_repeat = n_repeat;
-
-    place = 0;
-    current_note = 0;
-    note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
-    note_length = (*notes_pointer)[current_note][1];
-    // note_frequency = 880.0 / SAMPLE_RATE;
-    // note_length = 1000;
-    note_position = 0;
-
-
-    TIMSK3 |= _BV(OCIE3A);
-    playing_notes = true;
-}
-
-void play_sample(uint8_t * s, uint16_t l, bool r) {
-    place_int = 0;
-    sample = s;
-    sample_length = l;
-    repeat = r;
-
-    TIMSK3 |= _BV(OCIE3A);
-    playing_notes = true;
-}
-
-void play_note(double freq, int vol) {
-
-    freq = freq / SAMPLE_RATE;
-    if (freq > 0) {
-        if (frequency != 0) {
-            double starting_f = frequency;
-            if (frequency < freq) {
-                for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 500.0)) {   
-                    frequency = f;
-                }
-            } else if (frequency > freq) {
-                for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 500.0)) {
-                    frequency = f;
-                }
-            }
-        }
-        frequency = freq;
-        volume = vol;
-
-        frequencies[voices] = frequency;
-        volumes[voices] = volume;
-        voices++;
-    }
-
-    TIMSK3 |= _BV(OCIE3A);
-
-}
\ No newline at end of file
diff --git a/quantum/beeps.h b/quantum/beeps.h
deleted file mode 100644 (file)
index 4ccc344..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/io.h>
-#include <util/delay.h>
-
-bool playing_notes;
-
-void play_sample(uint8_t * s, uint16_t l, bool r);
-void play_note(double freq, int vol);
-void stop_note(double freq);
-void stop_all_notes();
-void init_notes();
-
-
-void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat);
\ No newline at end of file
index 3a1408e220e2445253bf22844e8fe50a8e6137ad..e37ea310398eb1929e263b6b4637d1ea46237d15 100644 (file)
@@ -100,10 +100,10 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
     if (record->event.pressed) {
        // midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
         midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
-        play_note(((double)261.626)*pow(2.0, 0.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
+        play_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
     } else {
         // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
         midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
-        stop_note(((double)261.626)*pow(2.0, 0.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
+        stop_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
     }
 }
\ No newline at end of file
index c82e478725dede21331d14653fa3acaf3d4b22ff..81a53f2035702a0d88f058a8c48fc045111241b3 100644 (file)
@@ -9,8 +9,11 @@ ifndef CUSTOM_MATRIX
 endif
 
 ifdef MIDI_ENABLE
-       SRC += $(QUANTUM_DIR)/keymap_midi.c \
-                  $(QUANTUM_DIR)/beeps.c
+       SRC += $(QUANTUM_DIR)/keymap_midi.c
+endif
+
+ifdef AUDIO_ENABLE
+       SRC += $(QUANTUM_DIR)/audio.c
 endif
 
 ifdef UNICODE_ENABLE
index edbcc282a579e61090613635c3fa752e3e285ea3..89c366f5547dcf2dc1c44b435ec692caaa98ca9a 100644 (file)
@@ -53,6 +53,9 @@ ifdef MIDI_ENABLE
     OPT_DEFS += -DMIDI_ENABLE
 endif
 
+ifdef AUDIO_ENABLE
+    OPT_DEFS += -DAUDIO_ENABLE
+endif
 
 ifdef USB_6KRO_ENABLE
     OPT_DEFS += -DUSB_6KRO_ENABLE
index f04790f4e887079a6ec789f02ea08854e50e7882..5d40dcf7b23cce5a8fbeb8d77b59b26cfb5b02ff 100644 (file)
@@ -52,8 +52,8 @@
 #include "descriptor.h"
 #include "lufa.h"
 
-#ifdef MIDI_ENABLE
-    #include <beeps.h>
+#ifdef AUDIO_ENABLE
+    #include <audio.h>
 #endif
 
 #ifdef BLUETOOTH_ENABLE
@@ -946,6 +946,8 @@ int main(void)
 #ifdef MIDI_ENABLE
 void fallthrough_callback(MidiDevice * device,
     uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2){
+
+#ifdef AUDIO_ENABLE
   if (cnt == 3) {
     switch (byte0 & 0xF0) {
         case MIDI_NOTEON:
@@ -959,6 +961,7 @@ void fallthrough_callback(MidiDevice * device,
   if (byte0 == MIDI_STOP) {
     stop_all_notes();
   }
+#endif
 }
 
 void cc_callback(MidiDevice * device,