]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboard/preonic/keymap_midi.c
Merge pull request #196 from naps62/naps62
[qmk_firmware.git] / keyboard / preonic / keymap_midi.c
1 /*
2 Copyright 2015 Jack Humbert <jack.humb@gmail.com>
3
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 2 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17
18 #include "extended_keymap_common.h"
19 #include "keymap_midi.h"
20 #include <lufa.h>
21
22 uint8_t starting_note = 0x0C;
23 int offset = 7;
24
25 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
26 {
27     if (id != 0) {
28         if (record->event.pressed) {
29             midi_send_noteon(&midi_device, opt, (id & 0xFF), 127);
30         } else {
31             midi_send_noteoff(&midi_device, opt, (id & 0xFF), 127);
32         }
33     }
34
35     if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) {
36         if (record->event.pressed) {
37             starting_note++;
38             play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
39             midi_send_cc(&midi_device, 0, 0x7B, 0);
40             midi_send_cc(&midi_device, 1, 0x7B, 0);
41             midi_send_cc(&midi_device, 2, 0x7B, 0);
42             midi_send_cc(&midi_device, 3, 0x7B, 0);
43             midi_send_cc(&midi_device, 4, 0x7B, 0);
44             return;
45         } else {
46             stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
47             stop_all_notes();
48             return;
49         }
50     }
51     if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) {
52         if (record->event.pressed) {
53             starting_note--;
54             play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
55             midi_send_cc(&midi_device, 0, 0x7B, 0);
56             midi_send_cc(&midi_device, 1, 0x7B, 0);
57             midi_send_cc(&midi_device, 2, 0x7B, 0);
58             midi_send_cc(&midi_device, 3, 0x7B, 0);
59             midi_send_cc(&midi_device, 4, 0x7B, 0);
60             return;
61         } else {
62             stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
63             stop_all_notes();
64             return;
65         }
66     }
67
68     if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
69         offset++;
70         midi_send_cc(&midi_device, 0, 0x7B, 0);
71         midi_send_cc(&midi_device, 1, 0x7B, 0);
72         midi_send_cc(&midi_device, 2, 0x7B, 0);
73         midi_send_cc(&midi_device, 3, 0x7B, 0);
74         midi_send_cc(&midi_device, 4, 0x7B, 0);
75         stop_all_notes();
76         for (int i = 0; i <= 7; i++) {
77             play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
78             _delay_us(80000);
79             stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
80             _delay_us(8000);
81         }
82         return;
83     }
84     if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
85         offset--;
86         midi_send_cc(&midi_device, 0, 0x7B, 0);
87         midi_send_cc(&midi_device, 1, 0x7B, 0);
88         midi_send_cc(&midi_device, 2, 0x7B, 0);
89         midi_send_cc(&midi_device, 3, 0x7B, 0);
90         midi_send_cc(&midi_device, 4, 0x7B, 0);
91         stop_all_notes();
92         for (int i = 0; i <= 7; i++) {
93             play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
94             _delay_us(80000);
95             stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
96             _delay_us(8000);
97         }
98         return;
99     }
100
101     if (record->event.pressed) {
102         // midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
103         midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
104         play_note(((double)261.6)*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);
105     } else {
106         // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
107         midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
108         stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
109     }
110 }