This commit is contained in:
Zach DeCook 2025-07-16 10:20:32 -07:00 committed by GitHub
commit 3897f118d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 1739 additions and 0 deletions

View File

@ -0,0 +1,5 @@
// Copyright 2023 Zach DeCook
// SPDX-License-Identifier: GPL-3.0-only
#pragma once
#define OLED_DISPLAY_128X128

View File

@ -0,0 +1,446 @@
{
"matrix_pins": {
"cols": ["GP6", "GP7", "GP8", "GP9", "GP10", "GP11", "GP12", "GP13", "GP14", "GP15"],
"io_delay": 50,
"rows": ["GP4", "GP5", "GP2", "GP3", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4"]
},
"rgb_matrix": {
"layout": [
{"matrix": [0, 0], "x": 130, "y": 3, "flags": 8},
{"matrix": [0, 1], "x": 242, "y": 12, "flags": 8},
{"matrix": [0, 2], "x": 242, "y": 18, "flags": 8},
{"matrix": [0, 3], "x": 242, "y": 24, "flags": 8},
{"matrix": [0, 4], "x": 242, "y": 30, "flags": 8},
{"matrix": [0, 5], "x": 242, "y": 36, "flags": 8},
{"matrix": [0, 6], "x": 242, "y": 42, "flags": 8},
{"matrix": [0, 7], "x": 242, "y": 48, "flags": 8},
{"matrix": [0, 8], "x": 242, "y": 54, "flags": 8},
{"matrix": [0, 9], "x": 242, "y": 60, "flags": 8},
{"matrix": [1, 0], "x": 224, "y": 9, "flags": 8},
{"matrix": [1, 1], "x": 224, "y": 15, "flags": 8},
{"matrix": [1, 2], "x": 224, "y": 21, "flags": 8},
{"matrix": [1, 3], "x": 224, "y": 27, "flags": 8},
{"matrix": [1, 4], "x": 224, "y": 33, "flags": 8},
{"matrix": [1, 5], "x": 224, "y": 39, "flags": 8},
{"matrix": [1, 6], "x": 224, "y": 45, "flags": 8},
{"matrix": [1, 7], "x": 224, "y": 51, "flags": 8},
{"matrix": [1, 8], "x": 224, "y": 57, "flags": 8},
{"matrix": [1, 9], "x": 224, "y": 64, "flags": 8},
{"matrix": [2, 0], "x": 112, "y": 0, "flags": 8},
{"matrix": [2, 1], "x": 205, "y": 12, "flags": 8},
{"matrix": [2, 2], "x": 205, "y": 18, "flags": 8},
{"matrix": [2, 3], "x": 205, "y": 24, "flags": 8},
{"matrix": [2, 4], "x": 205, "y": 30, "flags": 8},
{"matrix": [2, 5], "x": 205, "y": 36, "flags": 8},
{"matrix": [2, 6], "x": 205, "y": 42, "flags": 8},
{"matrix": [2, 7], "x": 205, "y": 48, "flags": 8},
{"matrix": [2, 8], "x": 205, "y": 54, "flags": 8},
{"matrix": [2, 9], "x": 205, "y": 60, "flags": 8},
{"matrix": [3, 0], "x": 186, "y": 9, "flags": 8},
{"matrix": [3, 1], "x": 186, "y": 15, "flags": 8},
{"matrix": [3, 2], "x": 186, "y": 21, "flags": 8},
{"matrix": [3, 3], "x": 186, "y": 27, "flags": 8},
{"matrix": [3, 4], "x": 186, "y": 33, "flags": 8},
{"matrix": [3, 5], "x": 186, "y": 39, "flags": 8},
{"matrix": [3, 6], "x": 186, "y": 45, "flags": 8},
{"matrix": [3, 7], "x": 186, "y": 51, "flags": 8},
{"matrix": [3, 8], "x": 186, "y": 57, "flags": 8},
{"matrix": [3, 9], "x": 186, "y": 64, "flags": 8},
{"matrix": [4, 0], "x": 93, "y": 3, "flags": 8},
{"matrix": [4, 1], "x": 168, "y": 12, "flags": 8},
{"matrix": [4, 2], "x": 168, "y": 18, "flags": 8},
{"matrix": [4, 3], "x": 168, "y": 24, "flags": 8},
{"matrix": [4, 4], "x": 168, "y": 30, "flags": 8},
{"matrix": [4, 5], "x": 168, "y": 36, "flags": 8},
{"matrix": [4, 6], "x": 168, "y": 42, "flags": 8},
{"matrix": [4, 7], "x": 168, "y": 48, "flags": 8},
{"matrix": [4, 8], "x": 168, "y": 54, "flags": 8},
{"matrix": [4, 9], "x": 168, "y": 60, "flags": 8},
{"matrix": [5, 0], "x": 149, "y": 9, "flags": 8},
{"matrix": [5, 1], "x": 149, "y": 15, "flags": 8},
{"matrix": [5, 2], "x": 149, "y": 21, "flags": 8},
{"matrix": [5, 3], "x": 149, "y": 27, "flags": 8},
{"matrix": [5, 4], "x": 149, "y": 33, "flags": 8},
{"matrix": [5, 5], "x": 149, "y": 39, "flags": 8},
{"matrix": [5, 6], "x": 149, "y": 45, "flags": 8},
{"matrix": [5, 7], "x": 149, "y": 51, "flags": 8},
{"matrix": [5, 8], "x": 149, "y": 57, "flags": 8},
{"matrix": [5, 9], "x": 149, "y": 64, "flags": 8},
{"matrix": [6, 0], "x": 74, "y": 0, "flags": 8},
{"matrix": [6, 1], "x": 130, "y": 12, "flags": 8},
{"matrix": [6, 2], "x": 130, "y": 18, "flags": 8},
{"matrix": [6, 3], "x": 130, "y": 24, "flags": 8},
{"matrix": [6, 4], "x": 130, "y": 30, "flags": 8},
{"matrix": [6, 5], "x": 130, "y": 36, "flags": 8},
{"matrix": [6, 6], "x": 130, "y": 42, "flags": 8},
{"matrix": [6, 7], "x": 130, "y": 48, "flags": 8},
{"matrix": [6, 8], "x": 130, "y": 54, "flags": 8},
{"matrix": [6, 9], "x": 130, "y": 60, "flags": 8},
{"matrix": [7, 0], "x": 112, "y": 9, "flags": 8},
{"matrix": [7, 1], "x": 112, "y": 15, "flags": 8},
{"matrix": [7, 2], "x": 112, "y": 21, "flags": 8},
{"matrix": [7, 3], "x": 112, "y": 27, "flags": 8},
{"matrix": [7, 4], "x": 112, "y": 33, "flags": 8},
{"matrix": [7, 5], "x": 112, "y": 39, "flags": 8},
{"matrix": [7, 6], "x": 112, "y": 45, "flags": 8},
{"matrix": [7, 7], "x": 112, "y": 51, "flags": 8},
{"matrix": [7, 8], "x": 112, "y": 57, "flags": 8},
{"matrix": [7, 9], "x": 112, "y": 64, "flags": 8},
{"matrix": [8, 0], "x": 56, "y": 3, "flags": 8},
{"matrix": [8, 1], "x": 93, "y": 12, "flags": 8},
{"matrix": [8, 2], "x": 93, "y": 18, "flags": 8},
{"matrix": [8, 3], "x": 93, "y": 24, "flags": 8},
{"matrix": [8, 4], "x": 93, "y": 30, "flags": 8},
{"matrix": [8, 5], "x": 93, "y": 36, "flags": 8},
{"matrix": [8, 6], "x": 93, "y": 42, "flags": 8},
{"matrix": [8, 7], "x": 93, "y": 48, "flags": 8},
{"matrix": [8, 8], "x": 93, "y": 54, "flags": 8},
{"matrix": [8, 9], "x": 93, "y": 60, "flags": 8},
{"matrix": [9, 0], "x": 74, "y": 9, "flags": 8},
{"matrix": [9, 1], "x": 74, "y": 15, "flags": 8},
{"matrix": [9, 2], "x": 74, "y": 21, "flags": 8},
{"matrix": [9, 3], "x": 74, "y": 27, "flags": 8},
{"matrix": [9, 4], "x": 74, "y": 33, "flags": 8},
{"matrix": [9, 5], "x": 74, "y": 39, "flags": 8},
{"matrix": [9, 6], "x": 74, "y": 45, "flags": 8},
{"matrix": [9, 7], "x": 74, "y": 51, "flags": 8},
{"matrix": [9, 8], "x": 74, "y": 57, "flags": 8},
{"matrix": [9, 9], "x": 74, "y": 64, "flags": 8},
{"matrix": [10, 0], "x": 37, "y": 0, "flags": 8},
{"matrix": [10, 1], "x": 56, "y": 12, "flags": 8},
{"matrix": [10, 2], "x": 56, "y": 18, "flags": 8},
{"matrix": [10, 3], "x": 56, "y": 24, "flags": 8},
{"matrix": [10, 4], "x": 56, "y": 30, "flags": 8},
{"matrix": [10, 5], "x": 56, "y": 36, "flags": 8},
{"matrix": [10, 6], "x": 56, "y": 42, "flags": 8},
{"matrix": [10, 7], "x": 56, "y": 48, "flags": 8},
{"matrix": [10, 8], "x": 56, "y": 54, "flags": 8},
{"matrix": [10, 9], "x": 56, "y": 60, "flags": 8},
{"matrix": [11, 0], "x": 37, "y": 9, "flags": 8},
{"matrix": [11, 1], "x": 37, "y": 15, "flags": 8},
{"matrix": [11, 2], "x": 37, "y": 21, "flags": 8},
{"matrix": [11, 3], "x": 37, "y": 27, "flags": 8},
{"matrix": [11, 4], "x": 37, "y": 33, "flags": 8},
{"matrix": [11, 5], "x": 37, "y": 39, "flags": 8},
{"matrix": [11, 6], "x": 37, "y": 45, "flags": 8},
{"matrix": [11, 7], "x": 37, "y": 51, "flags": 8},
{"matrix": [11, 8], "x": 37, "y": 57, "flags": 8},
{"matrix": [11, 9], "x": 37, "y": 64, "flags": 8},
{"matrix": [12, 0], "x": 18, "y": 3, "flags": 8},
{"matrix": [12, 1], "x": 18, "y": 12, "flags": 8},
{"matrix": [12, 2], "x": 18, "y": 18, "flags": 8},
{"matrix": [12, 3], "x": 18, "y": 24, "flags": 8},
{"matrix": [12, 4], "x": 18, "y": 30, "flags": 8},
{"matrix": [12, 5], "x": 18, "y": 36, "flags": 8},
{"matrix": [12, 6], "x": 18, "y": 42, "flags": 8},
{"matrix": [12, 7], "x": 18, "y": 48, "flags": 8},
{"matrix": [12, 8], "x": 18, "y": 54, "flags": 8},
{"matrix": [12, 9], "x": 18, "y": 60, "flags": 8},
{"matrix": [13, 0], "x": 0, "y": 9, "flags": 8},
{"matrix": [13, 1], "x": 0, "y": 15, "flags": 8},
{"matrix": [13, 2], "x": 0, "y": 21, "flags": 8},
{"matrix": [13, 3], "x": 0, "y": 27, "flags": 8},
{"matrix": [13, 4], "x": 0, "y": 33, "flags": 8},
{"matrix": [13, 5], "x": 0, "y": 39, "flags": 8},
{"matrix": [13, 6], "x": 0, "y": 45, "flags": 8},
{"matrix": [13, 7], "x": 0, "y": 51, "flags": 8},
{"matrix": [13, 8], "x": 0, "y": 57, "flags": 8},
{"matrix": [13, 9], "x": 0, "y": 64, "flags": 8}
]
},
"usb": {
"device_version": "1.1.0",
"pid": "0x6B02",
"vid": "0x575C"
},
"layouts": {
"LAYOUT_landscape": {
"layout": [
{"matrix": [10, 0], "x": 2, "y": 0},
{"matrix": [6, 0], "x": 4, "y": 0},
{"matrix": [2, 0], "x": 6, "y": 0},
{"matrix": [12, 0], "x": 1, "y": 0.5},
{"matrix": [8, 0], "x": 3, "y": 0.5},
{"matrix": [4, 0], "x": 5, "y": 0.5},
{"matrix": [0, 0], "x": 7, "y": 0.5},
{"matrix": [13, 0], "x": 0, "y": 1.5},
{"matrix": [11, 0], "x": 2, "y": 1.5},
{"matrix": [9, 0], "x": 4, "y": 1.5},
{"matrix": [7, 0], "x": 6, "y": 1.5},
{"matrix": [5, 0], "x": 8, "y": 1.5},
{"matrix": [3, 0], "x": 10, "y": 1.5},
{"matrix": [1, 0], "x": 12, "y": 1.5},
{"matrix": [12, 1], "x": 1, "y": 2},
{"matrix": [10, 1], "x": 3, "y": 2},
{"matrix": [8, 1], "x": 5, "y": 2},
{"matrix": [6, 1], "x": 7, "y": 2},
{"matrix": [4, 1], "x": 9, "y": 2},
{"matrix": [2, 1], "x": 11, "y": 2},
{"matrix": [0, 1], "x": 13, "y": 2},
{"matrix": [13, 1], "x": 0, "y": 2.5},
{"matrix": [11, 1], "x": 2, "y": 2.5},
{"matrix": [9, 1], "x": 4, "y": 2.5},
{"matrix": [7, 1], "x": 6, "y": 2.5},
{"matrix": [5, 1], "x": 8, "y": 2.5},
{"matrix": [3, 1], "x": 10, "y": 2.5},
{"matrix": [1, 1], "x": 12, "y": 2.5},
{"matrix": [12, 2], "x": 1, "y": 3},
{"matrix": [10, 2], "x": 3, "y": 3},
{"matrix": [8, 2], "x": 5, "y": 3},
{"matrix": [6, 2], "x": 7, "y": 3},
{"matrix": [4, 2], "x": 9, "y": 3},
{"matrix": [2, 2], "x": 11, "y": 3},
{"matrix": [0, 2], "x": 13, "y": 3},
{"matrix": [13, 2], "x": 0, "y": 3.5},
{"matrix": [11, 2], "x": 2, "y": 3.5},
{"matrix": [9, 2], "x": 4, "y": 3.5},
{"matrix": [7, 2], "x": 6, "y": 3.5},
{"matrix": [5, 2], "x": 8, "y": 3.5},
{"matrix": [3, 2], "x": 10, "y": 3.5},
{"matrix": [1, 2], "x": 12, "y": 3.5},
{"matrix": [12, 3], "x": 1, "y": 4},
{"matrix": [10, 3], "x": 3, "y": 4},
{"matrix": [8, 3], "x": 5, "y": 4},
{"matrix": [6, 3], "x": 7, "y": 4},
{"matrix": [4, 3], "x": 9, "y": 4},
{"matrix": [2, 3], "x": 11, "y": 4},
{"matrix": [0, 3], "x": 13, "y": 4},
{"matrix": [13, 3], "x": 0, "y": 4.5},
{"matrix": [11, 3], "x": 2, "y": 4.5},
{"matrix": [9, 3], "x": 4, "y": 4.5},
{"matrix": [7, 3], "x": 6, "y": 4.5},
{"matrix": [5, 3], "x": 8, "y": 4.5},
{"matrix": [3, 3], "x": 10, "y": 4.5},
{"matrix": [1, 3], "x": 12, "y": 4.5},
{"matrix": [12, 4], "x": 1, "y": 5},
{"matrix": [10, 4], "x": 3, "y": 5},
{"matrix": [8, 4], "x": 5, "y": 5},
{"matrix": [6, 4], "x": 7, "y": 5},
{"matrix": [4, 4], "x": 9, "y": 5},
{"matrix": [2, 4], "x": 11, "y": 5},
{"matrix": [0, 4], "x": 13, "y": 5},
{"matrix": [13, 4], "x": 0, "y": 5.5},
{"matrix": [11, 4], "x": 2, "y": 5.5},
{"matrix": [9, 4], "x": 4, "y": 5.5},
{"matrix": [7, 4], "x": 6, "y": 5.5},
{"matrix": [5, 4], "x": 8, "y": 5.5},
{"matrix": [3, 4], "x": 10, "y": 5.5},
{"matrix": [1, 4], "x": 12, "y": 5.5},
{"matrix": [12, 5], "x": 1, "y": 6},
{"matrix": [10, 5], "x": 3, "y": 6},
{"matrix": [8, 5], "x": 5, "y": 6},
{"matrix": [6, 5], "x": 7, "y": 6},
{"matrix": [4, 5], "x": 9, "y": 6},
{"matrix": [2, 5], "x": 11, "y": 6},
{"matrix": [0, 5], "x": 13, "y": 6},
{"matrix": [13, 5], "x": 0, "y": 6.5},
{"matrix": [11, 5], "x": 2, "y": 6.5},
{"matrix": [9, 5], "x": 4, "y": 6.5},
{"matrix": [7, 5], "x": 6, "y": 6.5},
{"matrix": [5, 5], "x": 8, "y": 6.5},
{"matrix": [3, 5], "x": 10, "y": 6.5},
{"matrix": [1, 5], "x": 12, "y": 6.5},
{"matrix": [12, 6], "x": 1, "y": 7},
{"matrix": [10, 6], "x": 3, "y": 7},
{"matrix": [8, 6], "x": 5, "y": 7},
{"matrix": [6, 6], "x": 7, "y": 7},
{"matrix": [4, 6], "x": 9, "y": 7},
{"matrix": [2, 6], "x": 11, "y": 7},
{"matrix": [0, 6], "x": 13, "y": 7},
{"matrix": [13, 6], "x": 0, "y": 7.5},
{"matrix": [11, 6], "x": 2, "y": 7.5},
{"matrix": [9, 6], "x": 4, "y": 7.5},
{"matrix": [7, 6], "x": 6, "y": 7.5},
{"matrix": [5, 6], "x": 8, "y": 7.5},
{"matrix": [3, 6], "x": 10, "y": 7.5},
{"matrix": [1, 6], "x": 12, "y": 7.5},
{"matrix": [12, 7], "x": 1, "y": 8},
{"matrix": [10, 7], "x": 3, "y": 8},
{"matrix": [8, 7], "x": 5, "y": 8},
{"matrix": [6, 7], "x": 7, "y": 8},
{"matrix": [4, 7], "x": 9, "y": 8},
{"matrix": [2, 7], "x": 11, "y": 8},
{"matrix": [0, 7], "x": 13, "y": 8},
{"matrix": [13, 7], "x": 0, "y": 8.5},
{"matrix": [11, 7], "x": 2, "y": 8.5},
{"matrix": [9, 7], "x": 4, "y": 8.5},
{"matrix": [7, 7], "x": 6, "y": 8.5},
{"matrix": [5, 7], "x": 8, "y": 8.5},
{"matrix": [3, 7], "x": 10, "y": 8.5},
{"matrix": [1, 7], "x": 12, "y": 8.5},
{"matrix": [12, 8], "x": 1, "y": 9},
{"matrix": [10, 8], "x": 3, "y": 9},
{"matrix": [8, 8], "x": 5, "y": 9},
{"matrix": [6, 8], "x": 7, "y": 9},
{"matrix": [4, 8], "x": 9, "y": 9},
{"matrix": [2, 8], "x": 11, "y": 9},
{"matrix": [0, 8], "x": 13, "y": 9},
{"matrix": [13, 8], "x": 0, "y": 9.5},
{"matrix": [11, 8], "x": 2, "y": 9.5},
{"matrix": [9, 8], "x": 4, "y": 9.5},
{"matrix": [7, 8], "x": 6, "y": 9.5},
{"matrix": [5, 8], "x": 8, "y": 9.5},
{"matrix": [3, 8], "x": 10, "y": 9.5},
{"matrix": [1, 8], "x": 12, "y": 9.5},
{"matrix": [12, 9], "x": 1, "y": 10},
{"matrix": [10, 9], "x": 3, "y": 10},
{"matrix": [8, 9], "x": 5, "y": 10},
{"matrix": [6, 9], "x": 7, "y": 10},
{"matrix": [4, 9], "x": 9, "y": 10},
{"matrix": [2, 9], "x": 11, "y": 10},
{"matrix": [0, 9], "x": 13, "y": 10},
{"matrix": [13, 9], "x": 0, "y": 10.5},
{"matrix": [11, 9], "x": 2, "y": 10.5},
{"matrix": [9, 9], "x": 4, "y": 10.5},
{"matrix": [7, 9], "x": 6, "y": 10.5},
{"matrix": [5, 9], "x": 8, "y": 10.5},
{"matrix": [3, 9], "x": 10, "y": 10.5},
{"matrix": [1, 9], "x": 12, "y": 10.5}
]
},
"LAYOUT_portrait": {
"layout": [
{"matrix": [0, 0], "x": 0.5, "y": 6},
{"matrix": [0, 1], "x": 2, "y": 0},
{"matrix": [0, 2], "x": 3, "y": 0},
{"matrix": [0, 3], "x": 4, "y": 0},
{"matrix": [0, 4], "x": 5, "y": 0},
{"matrix": [0, 5], "x": 6, "y": 0},
{"matrix": [0, 6], "x": 7, "y": 0},
{"matrix": [0, 7], "x": 8, "y": 0},
{"matrix": [0, 8], "x": 9, "y": 0},
{"matrix": [0, 9], "x": 10, "y": 0},
{"matrix": [1, 0], "x": 1.5, "y": 1},
{"matrix": [1, 1], "x": 2.5, "y": 1},
{"matrix": [1, 2], "x": 3.5, "y": 1},
{"matrix": [1, 3], "x": 4.5, "y": 1},
{"matrix": [1, 4], "x": 5.5, "y": 1},
{"matrix": [1, 5], "x": 6.5, "y": 1},
{"matrix": [1, 6], "x": 7.5, "y": 1},
{"matrix": [1, 7], "x": 8.5, "y": 1},
{"matrix": [1, 8], "x": 9.5, "y": 1},
{"matrix": [1, 9], "x": 10.5, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 7},
{"matrix": [2, 1], "x": 2, "y": 2},
{"matrix": [2, 2], "x": 3, "y": 2},
{"matrix": [2, 3], "x": 4, "y": 2},
{"matrix": [2, 4], "x": 5, "y": 2},
{"matrix": [2, 5], "x": 6, "y": 2},
{"matrix": [2, 6], "x": 7, "y": 2},
{"matrix": [2, 7], "x": 8, "y": 2},
{"matrix": [2, 8], "x": 9, "y": 2},
{"matrix": [2, 9], "x": 10, "y": 2},
{"matrix": [3, 0], "x": 1.5, "y": 3},
{"matrix": [3, 1], "x": 2.5, "y": 3},
{"matrix": [3, 2], "x": 3.5, "y": 3},
{"matrix": [3, 3], "x": 4.5, "y": 3},
{"matrix": [3, 4], "x": 5.5, "y": 3},
{"matrix": [3, 5], "x": 6.5, "y": 3},
{"matrix": [3, 6], "x": 7.5, "y": 3},
{"matrix": [3, 7], "x": 8.5, "y": 3},
{"matrix": [3, 8], "x": 9.5, "y": 3},
{"matrix": [3, 9], "x": 10.5, "y": 3},
{"matrix": [4, 0], "x": 0.5, "y": 8},
{"matrix": [4, 1], "x": 2, "y": 4},
{"matrix": [4, 2], "x": 3, "y": 4},
{"matrix": [4, 3], "x": 4, "y": 4},
{"matrix": [4, 4], "x": 5, "y": 4},
{"matrix": [4, 5], "x": 6, "y": 4},
{"matrix": [4, 6], "x": 7, "y": 4},
{"matrix": [4, 7], "x": 8, "y": 4},
{"matrix": [4, 8], "x": 9, "y": 4},
{"matrix": [4, 9], "x": 10, "y": 4},
{"matrix": [5, 0], "x": 1.5, "y": 5},
{"matrix": [5, 1], "x": 2.5, "y": 5},
{"matrix": [5, 2], "x": 3.5, "y": 5},
{"matrix": [5, 3], "x": 4.5, "y": 5},
{"matrix": [5, 4], "x": 5.5, "y": 5},
{"matrix": [5, 5], "x": 6.5, "y": 5},
{"matrix": [5, 6], "x": 7.5, "y": 5},
{"matrix": [5, 7], "x": 8.5, "y": 5},
{"matrix": [5, 8], "x": 9.5, "y": 5},
{"matrix": [5, 9], "x": 10.5, "y": 5},
{"matrix": [6, 0], "x": 0, "y": 9},
{"matrix": [6, 1], "x": 2, "y": 6},
{"matrix": [6, 2], "x": 3, "y": 6},
{"matrix": [6, 3], "x": 4, "y": 6},
{"matrix": [6, 4], "x": 5, "y": 6},
{"matrix": [6, 5], "x": 6, "y": 6},
{"matrix": [6, 6], "x": 7, "y": 6},
{"matrix": [6, 7], "x": 8, "y": 6},
{"matrix": [6, 8], "x": 9, "y": 6},
{"matrix": [6, 9], "x": 10, "y": 6},
{"matrix": [7, 0], "x": 1.5, "y": 7},
{"matrix": [7, 1], "x": 2.5, "y": 7},
{"matrix": [7, 2], "x": 3.5, "y": 7},
{"matrix": [7, 3], "x": 4.5, "y": 7},
{"matrix": [7, 4], "x": 5.5, "y": 7},
{"matrix": [7, 5], "x": 6.5, "y": 7},
{"matrix": [7, 6], "x": 7.5, "y": 7},
{"matrix": [7, 7], "x": 8.5, "y": 7},
{"matrix": [7, 8], "x": 9.5, "y": 7},
{"matrix": [7, 9], "x": 10.5, "y": 7},
{"matrix": [8, 0], "x": 0.5, "y": 10},
{"matrix": [8, 1], "x": 2, "y": 8},
{"matrix": [8, 2], "x": 3, "y": 8},
{"matrix": [8, 3], "x": 4, "y": 8},
{"matrix": [8, 4], "x": 5, "y": 8},
{"matrix": [8, 5], "x": 6, "y": 8},
{"matrix": [8, 6], "x": 7, "y": 8},
{"matrix": [8, 7], "x": 8, "y": 8},
{"matrix": [8, 8], "x": 9, "y": 8},
{"matrix": [8, 9], "x": 10, "y": 8},
{"matrix": [9, 0], "x": 1.5, "y": 9},
{"matrix": [9, 1], "x": 2.5, "y": 9},
{"matrix": [9, 2], "x": 3.5, "y": 9},
{"matrix": [9, 3], "x": 4.5, "y": 9},
{"matrix": [9, 4], "x": 5.5, "y": 9},
{"matrix": [9, 5], "x": 6.5, "y": 9},
{"matrix": [9, 6], "x": 7.5, "y": 9},
{"matrix": [9, 7], "x": 8.5, "y": 9},
{"matrix": [9, 8], "x": 9.5, "y": 9},
{"matrix": [9, 9], "x": 10.5, "y": 9},
{"matrix": [10, 0], "x": 0, "y": 11},
{"matrix": [10, 1], "x": 2, "y": 10},
{"matrix": [10, 2], "x": 3, "y": 10},
{"matrix": [10, 3], "x": 4, "y": 10},
{"matrix": [10, 4], "x": 5, "y": 10},
{"matrix": [10, 5], "x": 6, "y": 10},
{"matrix": [10, 6], "x": 7, "y": 10},
{"matrix": [10, 7], "x": 8, "y": 10},
{"matrix": [10, 8], "x": 9, "y": 10},
{"matrix": [10, 9], "x": 10, "y": 10},
{"matrix": [11, 0], "x": 1.5, "y": 11},
{"matrix": [11, 1], "x": 2.5, "y": 11},
{"matrix": [11, 2], "x": 3.5, "y": 11},
{"matrix": [11, 3], "x": 4.5, "y": 11},
{"matrix": [11, 4], "x": 5.5, "y": 11},
{"matrix": [11, 5], "x": 6.5, "y": 11},
{"matrix": [11, 6], "x": 7.5, "y": 11},
{"matrix": [11, 7], "x": 8.5, "y": 11},
{"matrix": [11, 8], "x": 9.5, "y": 11},
{"matrix": [11, 9], "x": 10.5, "y": 11},
{"matrix": [12, 0], "x": 0.5, "y": 12},
{"matrix": [12, 1], "x": 2, "y": 12},
{"matrix": [12, 2], "x": 3, "y": 12},
{"matrix": [12, 3], "x": 4, "y": 12},
{"matrix": [12, 4], "x": 5, "y": 12},
{"matrix": [12, 5], "x": 6, "y": 12},
{"matrix": [12, 6], "x": 7, "y": 12},
{"matrix": [12, 7], "x": 8, "y": 12},
{"matrix": [12, 8], "x": 9, "y": 12},
{"matrix": [12, 9], "x": 10, "y": 12},
{"matrix": [13, 0], "x": 1.5, "y": 13},
{"matrix": [13, 1], "x": 2.5, "y": 13},
{"matrix": [13, 2], "x": 3.5, "y": 13},
{"matrix": [13, 3], "x": 4.5, "y": 13},
{"matrix": [13, 4], "x": 5.5, "y": 13},
{"matrix": [13, 5], "x": 6.5, "y": 13},
{"matrix": [13, 6], "x": 7.5, "y": 13},
{"matrix": [13, 7], "x": 8.5, "y": 13},
{"matrix": [13, 8], "x": 9.5, "y": 13},
{"matrix": [13, 9], "x": 10.5, "y": 13}
]
}
}
}

View File

@ -0,0 +1,4 @@
SRC += matrix.c
CUSTOM_MATRIX = lite
AUDIO_DRIVER = pwm_hardware

View File

@ -0,0 +1,38 @@
// Copyright 2023 Zach DeCook
// SPDX-License-Identifier: GPL-3.0-only
#pragma once
#define RP2040_FLASH_GENERIC_03H
#define MATRIX_ROWS 14
#define MATRIX_COLS 10
// WS2812_BYTE_ORDER defined by revision
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150
#define RGB_MATRIX_LED_COUNT 140
#define ENABLE_RGB_MATRIX_SOLID_COLOR
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
#define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
#define ENABLE_RGB_MATRIX_BREATHING
// #define ENABLE_RGB_MATRIX_MULTISPLASH
#define ENABLE_RGB_MATRIX_SOLID_SPLASH
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
// #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
#define AUDIO_PIN GP23
// From the data sheet, pin 23 is PWM3 B
#define AUDIO_PWM_DRIVER PWMD3
#define AUDIO_PWM_CHANNEL RP2040_PWM_CHANNEL_B
#define AUDIO_INIT_DELAY
#define AUDIO_ENABLE_TONE_MULTIPLEXING
#define AUDIO_TONE_MULTIPLEXING_RATE_DEFAULT 50
// From the data sheet, pins 16/17 can use I2C0 DA/CL
#define I2C_DRIVER I2CD0
// (The name of these defines is confusing...)
#define I2C1_SDA_PIN GP16
#define I2C1_SCL_PIN GP17
#define OLED_BRIGHTNESS 55
#define OLED_IC OLED_IC_SH1106
// OLED_DISPLAY_ defined by revision
#define ENCODER_DEFAULT_POS 0x3

View File

@ -0,0 +1,11 @@
// Copyright 2023 Zach DeCook
// SPDX-License-Identifier: GPL-3.0-only
#pragma once
// The dev unit had a different pixel order
#define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_RGB
// The dev unit used a smaller display
#define OLED_DISPLAY_128X64
// Needs to be shifted over
#define OLED_COLUMN_OFFSET 2

View File

@ -0,0 +1,10 @@
// Copyright 2022-2023 Zach DeCook
// SPDX-License-Identifier: GPL-3.0-only
#include "quantum.h"
#ifdef OLED_ENABLE
oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
return OLED_ROTATION_180;
}
#endif

View File

@ -0,0 +1,446 @@
{
"matrix_pins": {
"cols": ["GP14", "GP15", "GP13", "GP12", "GP11", "GP10", "GP9", "GP8", "GP7", "GP6"],
"io_delay": 50,
"rows": ["GP4", "GP5", "GP2", "GP3", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4"]
},
"rgb_matrix": {
"layout": [
{"matrix": [0, 0], "x": 224, "y": 64, "flags": 8},
{"matrix": [0, 1], "x": 224, "y": 57, "flags": 8},
{"matrix": [0, 2], "x": 224, "y": 51, "flags": 8},
{"matrix": [0, 3], "x": 224, "y": 45, "flags": 8},
{"matrix": [0, 4], "x": 224, "y": 39, "flags": 8},
{"matrix": [0, 5], "x": 224, "y": 33, "flags": 8},
{"matrix": [0, 6], "x": 224, "y": 27, "flags": 8},
{"matrix": [0, 7], "x": 224, "y": 21, "flags": 8},
{"matrix": [0, 8], "x": 224, "y": 15, "flags": 8},
{"matrix": [0, 9], "x": 120, "y": 3, "flags": 8},
{"matrix": [1, 0], "x": 206, "y": 67, "flags": 8},
{"matrix": [1, 1], "x": 206, "y": 60, "flags": 8},
{"matrix": [1, 2], "x": 206, "y": 54, "flags": 8},
{"matrix": [1, 3], "x": 206, "y": 48, "flags": 8},
{"matrix": [1, 4], "x": 206, "y": 42, "flags": 8},
{"matrix": [1, 5], "x": 206, "y": 36, "flags": 8},
{"matrix": [1, 6], "x": 206, "y": 30, "flags": 8},
{"matrix": [1, 7], "x": 206, "y": 24, "flags": 8},
{"matrix": [1, 8], "x": 206, "y": 18, "flags": 8},
{"matrix": [1, 9], "x": 206, "y": 12, "flags": 8},
{"matrix": [2, 0], "x": 189, "y": 64, "flags": 8},
{"matrix": [2, 1], "x": 189, "y": 57, "flags": 8},
{"matrix": [2, 2], "x": 189, "y": 51, "flags": 8},
{"matrix": [2, 3], "x": 189, "y": 45, "flags": 8},
{"matrix": [2, 4], "x": 189, "y": 39, "flags": 8},
{"matrix": [2, 5], "x": 189, "y": 33, "flags": 8},
{"matrix": [2, 6], "x": 189, "y": 27, "flags": 8},
{"matrix": [2, 7], "x": 189, "y": 21, "flags": 8},
{"matrix": [2, 8], "x": 189, "y": 15, "flags": 8},
{"matrix": [2, 9], "x": 103, "y": 0, "flags": 8},
{"matrix": [3, 0], "x": 172, "y": 67, "flags": 8},
{"matrix": [3, 1], "x": 172, "y": 60, "flags": 8},
{"matrix": [3, 2], "x": 172, "y": 54, "flags": 8},
{"matrix": [3, 3], "x": 172, "y": 48, "flags": 8},
{"matrix": [3, 4], "x": 172, "y": 42, "flags": 8},
{"matrix": [3, 5], "x": 172, "y": 36, "flags": 8},
{"matrix": [3, 6], "x": 172, "y": 30, "flags": 8},
{"matrix": [3, 7], "x": 172, "y": 24, "flags": 8},
{"matrix": [3, 8], "x": 172, "y": 18, "flags": 8},
{"matrix": [3, 9], "x": 172, "y": 12, "flags": 8},
{"matrix": [4, 0], "x": 155, "y": 64, "flags": 8},
{"matrix": [4, 1], "x": 155, "y": 57, "flags": 8},
{"matrix": [4, 2], "x": 155, "y": 51, "flags": 8},
{"matrix": [4, 3], "x": 155, "y": 45, "flags": 8},
{"matrix": [4, 4], "x": 155, "y": 39, "flags": 8},
{"matrix": [4, 5], "x": 155, "y": 33, "flags": 8},
{"matrix": [4, 6], "x": 155, "y": 27, "flags": 8},
{"matrix": [4, 7], "x": 155, "y": 21, "flags": 8},
{"matrix": [4, 8], "x": 155, "y": 15, "flags": 8},
{"matrix": [4, 9], "x": 86, "y": 3, "flags": 8},
{"matrix": [5, 0], "x": 137, "y": 67, "flags": 8},
{"matrix": [5, 1], "x": 137, "y": 60, "flags": 8},
{"matrix": [5, 2], "x": 137, "y": 54, "flags": 8},
{"matrix": [5, 3], "x": 137, "y": 48, "flags": 8},
{"matrix": [5, 4], "x": 137, "y": 42, "flags": 8},
{"matrix": [5, 5], "x": 137, "y": 36, "flags": 8},
{"matrix": [5, 6], "x": 137, "y": 30, "flags": 8},
{"matrix": [5, 7], "x": 137, "y": 24, "flags": 8},
{"matrix": [5, 8], "x": 137, "y": 18, "flags": 8},
{"matrix": [5, 9], "x": 137, "y": 12, "flags": 8},
{"matrix": [6, 0], "x": 120, "y": 64, "flags": 8},
{"matrix": [6, 1], "x": 120, "y": 57, "flags": 8},
{"matrix": [6, 2], "x": 120, "y": 51, "flags": 8},
{"matrix": [6, 3], "x": 120, "y": 45, "flags": 8},
{"matrix": [6, 4], "x": 120, "y": 39, "flags": 8},
{"matrix": [6, 5], "x": 120, "y": 33, "flags": 8},
{"matrix": [6, 6], "x": 120, "y": 27, "flags": 8},
{"matrix": [6, 7], "x": 120, "y": 21, "flags": 8},
{"matrix": [6, 8], "x": 120, "y": 15, "flags": 8},
{"matrix": [6, 9], "x": 68, "y": 0, "flags": 8},
{"matrix": [7, 0], "x": 103, "y": 67, "flags": 8},
{"matrix": [7, 1], "x": 103, "y": 60, "flags": 8},
{"matrix": [7, 2], "x": 103, "y": 54, "flags": 8},
{"matrix": [7, 3], "x": 103, "y": 48, "flags": 8},
{"matrix": [7, 4], "x": 103, "y": 42, "flags": 8},
{"matrix": [7, 5], "x": 103, "y": 36, "flags": 8},
{"matrix": [7, 6], "x": 103, "y": 30, "flags": 8},
{"matrix": [7, 7], "x": 103, "y": 24, "flags": 8},
{"matrix": [7, 8], "x": 103, "y": 18, "flags": 8},
{"matrix": [7, 9], "x": 103, "y": 12, "flags": 8},
{"matrix": [8, 0], "x": 86, "y": 64, "flags": 8},
{"matrix": [8, 1], "x": 86, "y": 57, "flags": 8},
{"matrix": [8, 2], "x": 86, "y": 51, "flags": 8},
{"matrix": [8, 3], "x": 86, "y": 45, "flags": 8},
{"matrix": [8, 4], "x": 86, "y": 39, "flags": 8},
{"matrix": [8, 5], "x": 86, "y": 33, "flags": 8},
{"matrix": [8, 6], "x": 86, "y": 27, "flags": 8},
{"matrix": [8, 7], "x": 86, "y": 21, "flags": 8},
{"matrix": [8, 8], "x": 86, "y": 15, "flags": 8},
{"matrix": [8, 9], "x": 51, "y": 3, "flags": 8},
{"matrix": [9, 0], "x": 68, "y": 67, "flags": 8},
{"matrix": [9, 1], "x": 68, "y": 60, "flags": 8},
{"matrix": [9, 2], "x": 68, "y": 54, "flags": 8},
{"matrix": [9, 3], "x": 68, "y": 48, "flags": 8},
{"matrix": [9, 4], "x": 68, "y": 42, "flags": 8},
{"matrix": [9, 5], "x": 68, "y": 36, "flags": 8},
{"matrix": [9, 6], "x": 68, "y": 30, "flags": 8},
{"matrix": [9, 7], "x": 68, "y": 24, "flags": 8},
{"matrix": [9, 8], "x": 68, "y": 18, "flags": 8},
{"matrix": [9, 9], "x": 68, "y": 12, "flags": 8},
{"matrix": [10, 0], "x": 51, "y": 64, "flags": 8},
{"matrix": [10, 1], "x": 51, "y": 57, "flags": 8},
{"matrix": [10, 2], "x": 51, "y": 51, "flags": 8},
{"matrix": [10, 3], "x": 51, "y": 45, "flags": 8},
{"matrix": [10, 4], "x": 51, "y": 39, "flags": 8},
{"matrix": [10, 5], "x": 51, "y": 33, "flags": 8},
{"matrix": [10, 6], "x": 51, "y": 27, "flags": 8},
{"matrix": [10, 7], "x": 51, "y": 21, "flags": 8},
{"matrix": [10, 8], "x": 51, "y": 15, "flags": 8},
{"matrix": [10, 9], "x": 34, "y": 0, "flags": 8},
{"matrix": [11, 0], "x": 34, "y": 67, "flags": 8},
{"matrix": [11, 1], "x": 34, "y": 60, "flags": 8},
{"matrix": [11, 2], "x": 34, "y": 54, "flags": 8},
{"matrix": [11, 3], "x": 34, "y": 48, "flags": 8},
{"matrix": [11, 4], "x": 34, "y": 42, "flags": 8},
{"matrix": [11, 5], "x": 34, "y": 36, "flags": 8},
{"matrix": [11, 6], "x": 34, "y": 30, "flags": 8},
{"matrix": [11, 7], "x": 34, "y": 24, "flags": 8},
{"matrix": [11, 8], "x": 34, "y": 18, "flags": 8},
{"matrix": [11, 9], "x": 34, "y": 12, "flags": 8},
{"matrix": [12, 0], "x": 17, "y": 64, "flags": 8},
{"matrix": [12, 1], "x": 17, "y": 57, "flags": 8},
{"matrix": [12, 2], "x": 17, "y": 51, "flags": 8},
{"matrix": [12, 3], "x": 17, "y": 45, "flags": 8},
{"matrix": [12, 4], "x": 17, "y": 39, "flags": 8},
{"matrix": [12, 5], "x": 17, "y": 33, "flags": 8},
{"matrix": [12, 6], "x": 17, "y": 27, "flags": 8},
{"matrix": [12, 7], "x": 17, "y": 21, "flags": 8},
{"matrix": [12, 8], "x": 17, "y": 15, "flags": 8},
{"matrix": [12, 9], "x": 17, "y": 3, "flags": 8},
{"matrix": [13, 0], "x": 0, "y": 67, "flags": 8},
{"matrix": [13, 1], "x": 0, "y": 60, "flags": 8},
{"matrix": [13, 2], "x": 0, "y": 54, "flags": 8},
{"matrix": [13, 3], "x": 0, "y": 48, "flags": 8},
{"matrix": [13, 4], "x": 0, "y": 42, "flags": 8},
{"matrix": [13, 5], "x": 0, "y": 36, "flags": 8},
{"matrix": [13, 6], "x": 0, "y": 30, "flags": 8},
{"matrix": [13, 7], "x": 0, "y": 24, "flags": 8},
{"matrix": [13, 8], "x": 0, "y": 18, "flags": 8},
{"matrix": [13, 9], "x": 0, "y": 12, "flags": 8}
]
},
"usb": {
"device_version": "1.0.0",
"pid": "0x6B01",
"vid": "0x575C"
},
"layouts": {
"LAYOUT_landscape": {
"layout": [
{"matrix": [10, 9], "x": 2, "y": 0},
{"matrix": [6, 9], "x": 4, "y": 0},
{"matrix": [2, 9], "x": 6, "y": 0},
{"matrix": [12, 9], "x": 1, "y": 0.5},
{"matrix": [8, 9], "x": 3, "y": 0.5},
{"matrix": [4, 9], "x": 5, "y": 0.5},
{"matrix": [0, 9], "x": 7, "y": 0.5},
{"matrix": [13, 9], "x": 0, "y": 2},
{"matrix": [11, 9], "x": 2, "y": 2},
{"matrix": [9, 9], "x": 4, "y": 2},
{"matrix": [7, 9], "x": 6, "y": 2},
{"matrix": [5, 9], "x": 8, "y": 2},
{"matrix": [3, 9], "x": 10, "y": 2},
{"matrix": [1, 9], "x": 12, "y": 2},
{"matrix": [12, 8], "x": 1, "y": 2.5},
{"matrix": [10, 8], "x": 3, "y": 2.5},
{"matrix": [8, 8], "x": 5, "y": 2.5},
{"matrix": [6, 8], "x": 7, "y": 2.5},
{"matrix": [4, 8], "x": 9, "y": 2.5},
{"matrix": [2, 8], "x": 11, "y": 2.5},
{"matrix": [0, 8], "x": 13, "y": 2.5},
{"matrix": [13, 8], "x": 0, "y": 3},
{"matrix": [11, 8], "x": 2, "y": 3},
{"matrix": [9, 8], "x": 4, "y": 3},
{"matrix": [7, 8], "x": 6, "y": 3},
{"matrix": [5, 8], "x": 8, "y": 3},
{"matrix": [3, 8], "x": 10, "y": 3},
{"matrix": [1, 8], "x": 12, "y": 3},
{"matrix": [12, 7], "x": 1, "y": 3.5},
{"matrix": [10, 7], "x": 3, "y": 3.5},
{"matrix": [8, 7], "x": 5, "y": 3.5},
{"matrix": [6, 7], "x": 7, "y": 3.5},
{"matrix": [4, 7], "x": 9, "y": 3.5},
{"matrix": [2, 7], "x": 11, "y": 3.5},
{"matrix": [0, 7], "x": 13, "y": 3.5},
{"matrix": [13, 7], "x": 0, "y": 4},
{"matrix": [11, 7], "x": 2, "y": 4},
{"matrix": [9, 7], "x": 4, "y": 4},
{"matrix": [7, 7], "x": 6, "y": 4},
{"matrix": [5, 7], "x": 8, "y": 4},
{"matrix": [3, 7], "x": 10, "y": 4},
{"matrix": [1, 7], "x": 12, "y": 4},
{"matrix": [12, 6], "x": 1, "y": 4.5},
{"matrix": [10, 6], "x": 3, "y": 4.5},
{"matrix": [8, 6], "x": 5, "y": 4.5},
{"matrix": [6, 6], "x": 7, "y": 4.5},
{"matrix": [4, 6], "x": 9, "y": 4.5},
{"matrix": [2, 6], "x": 11, "y": 4.5},
{"matrix": [0, 6], "x": 13, "y": 4.5},
{"matrix": [13, 6], "x": 0, "y": 5},
{"matrix": [11, 6], "x": 2, "y": 5},
{"matrix": [9, 6], "x": 4, "y": 5},
{"matrix": [7, 6], "x": 6, "y": 5},
{"matrix": [5, 6], "x": 8, "y": 5},
{"matrix": [3, 6], "x": 10, "y": 5},
{"matrix": [1, 6], "x": 12, "y": 5},
{"matrix": [12, 5], "x": 1, "y": 5.5},
{"matrix": [10, 5], "x": 3, "y": 5.5},
{"matrix": [8, 5], "x": 5, "y": 5.5},
{"matrix": [6, 5], "x": 7, "y": 5.5},
{"matrix": [4, 5], "x": 9, "y": 5.5},
{"matrix": [2, 5], "x": 11, "y": 5.5},
{"matrix": [0, 5], "x": 13, "y": 5.5},
{"matrix": [13, 5], "x": 0, "y": 6},
{"matrix": [11, 5], "x": 2, "y": 6},
{"matrix": [9, 5], "x": 4, "y": 6},
{"matrix": [7, 5], "x": 6, "y": 6},
{"matrix": [5, 5], "x": 8, "y": 6},
{"matrix": [3, 5], "x": 10, "y": 6},
{"matrix": [1, 5], "x": 12, "y": 6},
{"matrix": [12, 4], "x": 1, "y": 6.5},
{"matrix": [10, 4], "x": 3, "y": 6.5},
{"matrix": [8, 4], "x": 5, "y": 6.5},
{"matrix": [6, 4], "x": 7, "y": 6.5},
{"matrix": [4, 4], "x": 9, "y": 6.5},
{"matrix": [2, 4], "x": 11, "y": 6.5},
{"matrix": [0, 4], "x": 13, "y": 6.5},
{"matrix": [13, 4], "x": 0, "y": 7},
{"matrix": [11, 4], "x": 2, "y": 7},
{"matrix": [9, 4], "x": 4, "y": 7},
{"matrix": [7, 4], "x": 6, "y": 7},
{"matrix": [5, 4], "x": 8, "y": 7},
{"matrix": [3, 4], "x": 10, "y": 7},
{"matrix": [1, 4], "x": 12, "y": 7},
{"matrix": [12, 3], "x": 1, "y": 7.5},
{"matrix": [10, 3], "x": 3, "y": 7.5},
{"matrix": [8, 3], "x": 5, "y": 7.5},
{"matrix": [6, 3], "x": 7, "y": 7.5},
{"matrix": [4, 3], "x": 9, "y": 7.5},
{"matrix": [2, 3], "x": 11, "y": 7.5},
{"matrix": [0, 3], "x": 13, "y": 7.5},
{"matrix": [13, 3], "x": 0, "y": 8},
{"matrix": [11, 3], "x": 2, "y": 8},
{"matrix": [9, 3], "x": 4, "y": 8},
{"matrix": [7, 3], "x": 6, "y": 8},
{"matrix": [5, 3], "x": 8, "y": 8},
{"matrix": [3, 3], "x": 10, "y": 8},
{"matrix": [1, 3], "x": 12, "y": 8},
{"matrix": [12, 2], "x": 1, "y": 8.5},
{"matrix": [10, 2], "x": 3, "y": 8.5},
{"matrix": [8, 2], "x": 5, "y": 8.5},
{"matrix": [6, 2], "x": 7, "y": 8.5},
{"matrix": [4, 2], "x": 9, "y": 8.5},
{"matrix": [2, 2], "x": 11, "y": 8.5},
{"matrix": [0, 2], "x": 13, "y": 8.5},
{"matrix": [13, 2], "x": 0, "y": 9},
{"matrix": [11, 2], "x": 2, "y": 9},
{"matrix": [9, 2], "x": 4, "y": 9},
{"matrix": [7, 2], "x": 6, "y": 9},
{"matrix": [5, 2], "x": 8, "y": 9},
{"matrix": [3, 2], "x": 10, "y": 9},
{"matrix": [1, 2], "x": 12, "y": 9},
{"matrix": [12, 1], "x": 1, "y": 9.5},
{"matrix": [10, 1], "x": 3, "y": 9.5},
{"matrix": [8, 1], "x": 5, "y": 9.5},
{"matrix": [6, 1], "x": 7, "y": 9.5},
{"matrix": [4, 1], "x": 9, "y": 9.5},
{"matrix": [2, 1], "x": 11, "y": 9.5},
{"matrix": [0, 1], "x": 13, "y": 9.5},
{"matrix": [13, 1], "x": 0, "y": 10},
{"matrix": [11, 1], "x": 2, "y": 10},
{"matrix": [9, 1], "x": 4, "y": 10},
{"matrix": [7, 1], "x": 6, "y": 10},
{"matrix": [5, 1], "x": 8, "y": 10},
{"matrix": [3, 1], "x": 10, "y": 10},
{"matrix": [1, 1], "x": 12, "y": 10},
{"matrix": [12, 0], "x": 1, "y": 10.5},
{"matrix": [10, 0], "x": 3, "y": 10.5},
{"matrix": [8, 0], "x": 5, "y": 10.5},
{"matrix": [6, 0], "x": 7, "y": 10.5},
{"matrix": [4, 0], "x": 9, "y": 10.5},
{"matrix": [2, 0], "x": 11, "y": 10.5},
{"matrix": [0, 0], "x": 13, "y": 10.5},
{"matrix": [13, 0], "x": 0, "y": 11},
{"matrix": [11, 0], "x": 2, "y": 11},
{"matrix": [9, 0], "x": 4, "y": 11},
{"matrix": [7, 0], "x": 6, "y": 11},
{"matrix": [5, 0], "x": 8, "y": 11},
{"matrix": [3, 0], "x": 10, "y": 11},
{"matrix": [1, 0], "x": 12, "y": 11}
]
},
"LAYOUT_portrait": {
"layout": [
{"matrix": [0, 9], "x": 0.5, "y": 6},
{"matrix": [0, 8], "x": 2.5, "y": 0},
{"matrix": [0, 7], "x": 3.5, "y": 0},
{"matrix": [0, 6], "x": 4.5, "y": 0},
{"matrix": [0, 5], "x": 5.5, "y": 0},
{"matrix": [0, 4], "x": 6.5, "y": 0},
{"matrix": [0, 3], "x": 7.5, "y": 0},
{"matrix": [0, 2], "x": 8.5, "y": 0},
{"matrix": [0, 1], "x": 9.5, "y": 0},
{"matrix": [0, 0], "x": 10.5, "y": 0},
{"matrix": [1, 9], "x": 2, "y": 1},
{"matrix": [1, 8], "x": 3, "y": 1},
{"matrix": [1, 7], "x": 4, "y": 1},
{"matrix": [1, 6], "x": 5, "y": 1},
{"matrix": [1, 5], "x": 6, "y": 1},
{"matrix": [1, 4], "x": 7, "y": 1},
{"matrix": [1, 3], "x": 8, "y": 1},
{"matrix": [1, 2], "x": 9, "y": 1},
{"matrix": [1, 1], "x": 10, "y": 1},
{"matrix": [1, 0], "x": 11, "y": 1},
{"matrix": [2, 9], "x": 0, "y": 7},
{"matrix": [2, 8], "x": 2.5, "y": 2},
{"matrix": [2, 7], "x": 3.5, "y": 2},
{"matrix": [2, 6], "x": 4.5, "y": 2},
{"matrix": [2, 5], "x": 5.5, "y": 2},
{"matrix": [2, 4], "x": 6.5, "y": 2},
{"matrix": [2, 3], "x": 7.5, "y": 2},
{"matrix": [2, 2], "x": 8.5, "y": 2},
{"matrix": [2, 1], "x": 9.5, "y": 2},
{"matrix": [2, 0], "x": 10.5, "y": 2},
{"matrix": [3, 9], "x": 2, "y": 3},
{"matrix": [3, 8], "x": 3, "y": 3},
{"matrix": [3, 7], "x": 4, "y": 3},
{"matrix": [3, 6], "x": 5, "y": 3},
{"matrix": [3, 5], "x": 6, "y": 3},
{"matrix": [3, 4], "x": 7, "y": 3},
{"matrix": [3, 3], "x": 8, "y": 3},
{"matrix": [3, 2], "x": 9, "y": 3},
{"matrix": [3, 1], "x": 10, "y": 3},
{"matrix": [3, 0], "x": 11, "y": 3},
{"matrix": [4, 9], "x": 0.5, "y": 8},
{"matrix": [4, 8], "x": 2.5, "y": 4},
{"matrix": [4, 7], "x": 3.5, "y": 4},
{"matrix": [4, 6], "x": 4.5, "y": 4},
{"matrix": [4, 5], "x": 5.5, "y": 4},
{"matrix": [4, 4], "x": 6.5, "y": 4},
{"matrix": [4, 3], "x": 7.5, "y": 4},
{"matrix": [4, 2], "x": 8.5, "y": 4},
{"matrix": [4, 1], "x": 9.5, "y": 4},
{"matrix": [4, 0], "x": 10.5, "y": 4},
{"matrix": [5, 9], "x": 2, "y": 5},
{"matrix": [5, 8], "x": 3, "y": 5},
{"matrix": [5, 7], "x": 4, "y": 5},
{"matrix": [5, 6], "x": 5, "y": 5},
{"matrix": [5, 5], "x": 6, "y": 5},
{"matrix": [5, 4], "x": 7, "y": 5},
{"matrix": [5, 3], "x": 8, "y": 5},
{"matrix": [5, 2], "x": 9, "y": 5},
{"matrix": [5, 1], "x": 10, "y": 5},
{"matrix": [5, 0], "x": 11, "y": 5},
{"matrix": [6, 9], "x": 0, "y": 9},
{"matrix": [6, 8], "x": 2.5, "y": 6},
{"matrix": [6, 7], "x": 3.5, "y": 6},
{"matrix": [6, 6], "x": 4.5, "y": 6},
{"matrix": [6, 5], "x": 5.5, "y": 6},
{"matrix": [6, 4], "x": 6.5, "y": 6},
{"matrix": [6, 3], "x": 7.5, "y": 6},
{"matrix": [6, 2], "x": 8.5, "y": 6},
{"matrix": [6, 1], "x": 9.5, "y": 6},
{"matrix": [6, 0], "x": 10.5, "y": 6},
{"matrix": [7, 9], "x": 2, "y": 7},
{"matrix": [7, 8], "x": 3, "y": 7},
{"matrix": [7, 7], "x": 4, "y": 7},
{"matrix": [7, 6], "x": 5, "y": 7},
{"matrix": [7, 5], "x": 6, "y": 7},
{"matrix": [7, 4], "x": 7, "y": 7},
{"matrix": [7, 3], "x": 8, "y": 7},
{"matrix": [7, 2], "x": 9, "y": 7},
{"matrix": [7, 1], "x": 10, "y": 7},
{"matrix": [7, 0], "x": 11, "y": 7},
{"matrix": [8, 9], "x": 0.5, "y": 10},
{"matrix": [8, 8], "x": 2.5, "y": 8},
{"matrix": [8, 7], "x": 3.5, "y": 8},
{"matrix": [8, 6], "x": 4.5, "y": 8},
{"matrix": [8, 5], "x": 5.5, "y": 8},
{"matrix": [8, 4], "x": 6.5, "y": 8},
{"matrix": [8, 3], "x": 7.5, "y": 8},
{"matrix": [8, 2], "x": 8.5, "y": 8},
{"matrix": [8, 1], "x": 9.5, "y": 8},
{"matrix": [8, 0], "x": 10.5, "y": 8},
{"matrix": [9, 9], "x": 2, "y": 9},
{"matrix": [9, 8], "x": 3, "y": 9},
{"matrix": [9, 7], "x": 4, "y": 9},
{"matrix": [9, 6], "x": 5, "y": 9},
{"matrix": [9, 5], "x": 6, "y": 9},
{"matrix": [9, 4], "x": 7, "y": 9},
{"matrix": [9, 3], "x": 8, "y": 9},
{"matrix": [9, 2], "x": 9, "y": 9},
{"matrix": [9, 1], "x": 10, "y": 9},
{"matrix": [9, 0], "x": 11, "y": 9},
{"matrix": [10, 9], "x": 0, "y": 11},
{"matrix": [10, 8], "x": 2.5, "y": 10},
{"matrix": [10, 7], "x": 3.5, "y": 10},
{"matrix": [10, 6], "x": 4.5, "y": 10},
{"matrix": [10, 5], "x": 5.5, "y": 10},
{"matrix": [10, 4], "x": 6.5, "y": 10},
{"matrix": [10, 3], "x": 7.5, "y": 10},
{"matrix": [10, 2], "x": 8.5, "y": 10},
{"matrix": [10, 1], "x": 9.5, "y": 10},
{"matrix": [10, 0], "x": 10.5, "y": 10},
{"matrix": [11, 9], "x": 2, "y": 11},
{"matrix": [11, 8], "x": 3, "y": 11},
{"matrix": [11, 7], "x": 4, "y": 11},
{"matrix": [11, 6], "x": 5, "y": 11},
{"matrix": [11, 5], "x": 6, "y": 11},
{"matrix": [11, 4], "x": 7, "y": 11},
{"matrix": [11, 3], "x": 8, "y": 11},
{"matrix": [11, 2], "x": 9, "y": 11},
{"matrix": [11, 1], "x": 10, "y": 11},
{"matrix": [11, 0], "x": 11, "y": 11},
{"matrix": [12, 9], "x": 0.5, "y": 12},
{"matrix": [12, 8], "x": 2.5, "y": 12},
{"matrix": [12, 7], "x": 3.5, "y": 12},
{"matrix": [12, 6], "x": 4.5, "y": 12},
{"matrix": [12, 5], "x": 5.5, "y": 12},
{"matrix": [12, 4], "x": 6.5, "y": 12},
{"matrix": [12, 3], "x": 7.5, "y": 12},
{"matrix": [12, 2], "x": 8.5, "y": 12},
{"matrix": [12, 1], "x": 9.5, "y": 12},
{"matrix": [12, 0], "x": 10.5, "y": 12},
{"matrix": [13, 9], "x": 2, "y": 13},
{"matrix": [13, 8], "x": 3, "y": 13},
{"matrix": [13, 7], "x": 4, "y": 13},
{"matrix": [13, 6], "x": 5, "y": 13},
{"matrix": [13, 5], "x": 6, "y": 13},
{"matrix": [13, 4], "x": 7, "y": 13},
{"matrix": [13, 3], "x": 8, "y": 13},
{"matrix": [13, 2], "x": 9, "y": 13},
{"matrix": [13, 1], "x": 10, "y": 13},
{"matrix": [13, 0], "x": 11, "y": 13}
]
}
}
}

View File

@ -0,0 +1,4 @@
SRC += matrix.c
CUSTOM_MATRIX = lite
AUDIO_DRIVER = pwm_hardware

View File

@ -0,0 +1,11 @@
// Copyright 2022 Stefan Kerkmann
// SPDX-License-Identifier: GPL-3.0-only
#pragma once
#undef HAL_USE_I2C
#define HAL_USE_I2C TRUE
#undef HAL_USE_PWM
#define HAL_USE_PWM TRUE
#include_next <halconf.h>

View File

@ -0,0 +1,32 @@
// Copyright 2022-2023 Zach DeCook
// SPDX-License-Identifier: GPL-3.0-only
#include "quantum.h"
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
#ifdef AUDIO_ENABLE
case QK_MIDI_NOTE_C_0 ... QK_MIDI_NOTE_B_5:
if (record->event.pressed)
process_audio_noteon(keycode - MI_C);
else
process_audio_noteoff(keycode - MI_C);
// Allow the normal handler to handle it as well.
return true;
#endif
}
return process_record_user(keycode, record);
}
#ifdef OLED_ENABLE
bool oled_task_kb(void) {
if (!oled_task_user()) {
return false;
}
oled_write_P(PSTR("HexBoard running QMK\n"), false);
oled_write_P(PSTR("\n"), false);
oled_write_P(PSTR("FW is GPLv3-licensed\n"), false);
oled_write_P(PSTR("https://qmk.fm/\n"), false);
return false;
}
#endif

View File

@ -0,0 +1,36 @@
{
"manufacturer": "Shaping The Silence",
"keyboard_name": "HexBoard",
"maintainer": "earboxer",
"audio": {
"pins": ["GP23"],
"voices": true
},
"board": "GENERIC_RP_RP2040",
"bootloader": "rp2040",
"diode_direction": "COL2ROW",
"encoder": {
"rotary": [
{"pin_a": "GP21", "pin_b": "GP20"}
]
},
"features": {
"audio": true,
"bootmagic": true,
"encoder": true,
"extrakey": true,
"midi": true,
"mousekey": true,
"oled": true,
"rgb_matrix": true
},
"processor": "RP2040",
"rgb_matrix": {
"driver": "ws2812"
},
"url": "https://shapingthesilence.com/tech/hexboard-midi-controller/",
"ws2812": {
"driver": "vendor",
"pin": "GP22"
}
}

View File

@ -0,0 +1,55 @@
// Copyright 2022-2023 Zach DeCook
// SPDX-License-Identifier: GPL-3.0-only
#include QMK_KEYBOARD_H
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
[0] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU),},
[1] = {ENCODER_CCW_CW(KC_BRID, KC_BRIU),},
};
#endif
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_landscape(
_______,QK_BOOT,RGB_HUI,
MO(1), _______,RGB_VAD,RGB_MOD,
_______,_______,_______,KC_EQL ,_______,_______,KC_PGUP,
_______,_______,KC_LBRC,KC_RBRC,_______,KC_HOME,KC_END ,
_______,_______,_______,KC_MINS,_______,_______,KC_PGDN,
_______,KC_F15 ,_______,_______,KC_F20 ,_______,_______,
_______,KC_F14 ,KC_F16 ,_______,KC_F19 ,KC_F21 ,_______,
KC_F13 ,KC_F3 ,KC_F17 ,KC_F18 ,KC_F8 ,KC_F22 ,_______,
_______,KC_F2 ,KC_F4 ,_______,KC_F7 ,KC_F9 ,KC_F23 ,
KC_F1 ,KC_3 ,KC_F5 ,KC_F6 ,KC_8 ,KC_F10 ,KC_F24 ,
_______,KC_2 ,KC_4 ,_______,KC_7 ,KC_9 ,KC_F11 ,
KC_1 ,KC_E ,KC_5 ,KC_6 ,KC_I ,KC_0 ,KC_F12 ,
KC_TAB ,KC_W ,KC_R ,_______,KC_U ,KC_O ,KC_BSPC,
KC_Q ,KC_D , KC_T ,KC_Y ,KC_K ,KC_P ,_______,
KC_ESC ,KC_S ,KC_F ,_______,KC_J ,KC_L ,KC_QUOT,
KC_A ,KC_C ,KC_G ,KC_H ,KC_COMM,KC_SCLN,KC_SLSH,
KC_LSFT,KC_X ,KC_V ,_______,KC_M ,KC_DOT ,KC_ENT ,
KC_Z ,_______,KC_B ,KC_N ,_______,KC_SLSH,_______,
_______,_______,_______,_______,_______,_______,KC_UP ,
KC_LCTL,KC_LGUI,_______,_______,KC_RALT,KC_LEFT,KC_RGHT,
_______,KC_LALT,MO(1) ,KC_SPC ,KC_RGUI,KC_RCTL,KC_DOWN
),
[1] = LAYOUT_portrait(
_______, _______,_______,_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
_______, _______,_______,_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
_______, _______,_______,_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
_______, _______,_______,_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
_______, _______,_______,_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
_______, _______,_______,_______,_______,_______,_______,_______,_______,_______,
KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,
_______, KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_H ,KC_J ,KC_K ,KC_L ,
SFT_T(KC_SPC),KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_B ,KC_N ,KC_M ,RCTL_T(KC_COMM)
),
};

View File

@ -0,0 +1,2 @@
ENCODER_MAP_ENABLE = yes
MIDI_ENABLE = no

View File

@ -0,0 +1,5 @@
// Copyright 2023 Zach DeCook
// SPDX-License-Identifier: GPL-3.0-only
#pragma once
#define MIDI_BASIC

View File

@ -0,0 +1,255 @@
// Copyright 2022-2023 Zach DeCook
// SPDX-License-Identifier: GPL-3.0-only
#include QMK_KEYBOARD_H
#include "quantum/color.h"
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
[0] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI),},
[1] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU),},
[2] = {ENCODER_CCW_CW(KC_LEFT, KC_RIGHT),},
};
#endif
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Hexboard Keyboard layout (landscape)
* ___ ___ ___
* BnU -AuTg-MiO__
* BnD-MuT-Pnc-Pnc
*
* ___ ___ ___ ___ ___ ___ ___
* F 5-Gb5-G 5-Ab5-A 5-Bb5-B 5__
* -D 5-Eb5-E 5-F 5-Gb5-G 5-Ab5
* Bb4-B 4-C 5-Db5-D 5-Eb5-E 5-
* -G 4-Ab4-A 4-Bb4-B 4-C 5-Db5
* Eb4-E 4-F 4-Gb4-G 4-Ab4-A 4-
* -C 4-Db4-D 4-Eb4-E 4-F 4-Gb4
* Ab3-A 3-Bb3-B 3-C 4-Db4-D 4-
* -F 3-Gb3-G 3-Ab3-A 3-Bb3-B 3
* Db3-D 3-Eb3-E 3-F 3-Gb3-G 3-
* - - E - - - I - -
* TAB- W - R - - U - O - -
* - Q - D - T - Y - K - P -
* Esc- S - F - - J - L - ' -
* - A - C - G - H - , - ; -
* sft- X - V - - M - . - -
* - Z - - B - N - - / -
* - - - - - - -
* -Ctl-Sup- - - 🡐 - 🡑 -
* -Alt-lyr- -LYR- 🡓 - 🡒
*
*/
[0] = LAYOUT_landscape(
MI_BNDU,AU_TOGG, RGB_HUI,
MI_BNDD,MI_TOGG, RGB_VAD, RGB_MOD,
MI_F5, MI_Gb5, MI_G5, MI_Ab5, MI_A5, MI_Bb5, MI_B5,
MI_D5, MI_Eb5, MI_E5, MI_F5, MI_Gb5, MI_G5, MI_Ab5,
MI_Bb4,MI_B4, MI_C5, MI_Db5, MI_D5, MI_Eb5, MI_E5,
MI_G4, MI_Ab4, MI_A4, MI_Bb4, MI_B4, MI_C5, MI_Db5,
MI_Eb4,MI_E4, MI_F4, MI_Gb4, MI_G4, MI_Ab4, MI_A4,
MI_C4, MI_Db4, MI_D4, MI_Eb4, MI_E4, MI_F4, MI_Gb4,
MI_Ab3,MI_A3, MI_Bb3, MI_B3, MI_C4, MI_Db4, MI_D4,
MI_F3, MI_Gb3, MI_G3, MI_Ab3, MI_A3, MI_Bb3,MI_B3,
MI_Db3,MI_D3, MI_Eb3, MI_E3, MI_F3, MI_Gb3, MI_G3,
_______,KC_E, _______, _______, KC_I, _______,_______,
KC_TAB, KC_W, KC_R, _______, KC_U, KC_O, KC_BSPC,
KC_Q, KC_D, KC_T, KC_Y, KC_K, KC_P, _______,
KC_ESC, KC_S, KC_F, _______, KC_J, KC_L, KC_QUOT,
KC_A, KC_C, KC_G, KC_H, KC_COMM, KC_SCLN,_______,
KC_LSFT,KC_X, KC_V, _______, KC_M, KC_DOT, KC_ENT,
KC_Z, _______, KC_B, KC_N, _______, KC_SLSH,_______,
_______,_______, _______, _______, _______, _______, _______,
KC_LCTL,KC_LGUI, _______, _______, KC_LEFT, KC_UP,KC_ENT,
_______,KC_LALT, MO(1), KC_SPC, MO(2), KC_DOWN, KC_RGHT
),
// "lower"
/**
* ... top rows fall through to other layer.
* ___ ___ ___ ___ ___ ___ ___
* - - - - - + - -
* ~ - - - - _ - { - -
* - - # - - - * - } -
* - @ - $ - - & - ( - | -
* - ! - - % - ^ - - ) -
* sft- - - - - - -
* - - - - - - -
* - - - - - - -
* - - - - - - -
* - -lyr- -LYR- -
*
*/
[1] = LAYOUT_landscape(
MI_BNDU,QK_BOOT, RGB_M_SN,
MI_BNDD,MI_TOGG, RGB_M_B,RGB_M_SW,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,KC_PLUS,_______,_______,
KC_TILD,_______,_______,_______,KC_UNDS,KC_LCBR,_______,
_______,KC_HASH,_______,_______,KC_ASTR,KC_RCBR,_______,
KC_DEL, KC_AT, KC_DLR,_______, KC_AMPR,KC_LPRN,KC_PIPE,
KC_EXLM,_______,KC_PERC,KC_CIRC,_______,KC_RPRN,_______,
KC_LSFT,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,KC_HOME,KC_PGUP,_______,
_______,_______,_______,_______,_______,KC_PGDN,KC_END
),
// "raise"
/**
* ... top rows fall through to other layer.
* ___ ___ ___ ___ ___ ___ ___
* - - - - - = - -
* ~ - - - - _ - [ - -
* - - 3 - - - 8 - ] -
* - 2 - 4 - - 7 - 9 - \ -
* - 1 - - 5 - 6 - - 0 -
* sft- - - - - - -
* - - - - - - -
* - - - - - - -
* - - - - - - -
* - -lyr- -LYR- -
*
*/
[2] = LAYOUT_landscape(
MI_BNDU,AU_TOGG, RGB_HUI,
MI_BNDD,MU_TOGG, RGB_VAD,RGB_MOD,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,KC_EQL ,_______,_______,
KC_GRV ,_______,_______,_______,KC_MINS,KC_LBRC,_______,
_______, KC_3 ,_______,_______, KC_8 ,KC_RBRC,_______,
KC_DEL , KC_2 , KC_4 ,_______, KC_7 , KC_9 ,KC_BSLS,
KC_1 ,_______, KC_5 , KC_6 ,_______, KC_0 ,_______,
KC_LSFT,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,KC_HOME,KC_PGUP,_______,
_______,_______,_______,_______,_______,KC_PGDN,KC_END
)
};
// Hue, Saturation, Config
#define HSC_AZURE 132, 102, rgb_matrix_config.hsv.v
#define HSC_BLUE 170, 255, rgb_matrix_config.hsv.v
#define HSC_CHARTREUSE 64, 255, rgb_matrix_config.hsv.v
#define HSC_CORAL 11, 176, rgb_matrix_config.hsv.v
#define HSC_CYAN 128, 255, rgb_matrix_config.hsv.v
#define HSC_GOLD 36, 255, rgb_matrix_config.hsv.v
#define HSC_GOLDENROD 30, 218, rgb_matrix_config.hsv.v
#define HSC_GREEN 85, 255, rgb_matrix_config.hsv.v
#define HSC_MAGENTA 213, 255, rgb_matrix_config.hsv.v
#define HSC_ORANGE 21, 255, rgb_matrix_config.hsv.v
#define HSC_PINK 234, 128, rgb_matrix_config.hsv.v
#define HSC_PURPLE 191, 255, rgb_matrix_config.hsv.v
#define HSC_RED 0, 255, rgb_matrix_config.hsv.v
#define HSC_SPRINGGREEN 106, 255, rgb_matrix_config.hsv.v
#define HSC_TEAL 128, 255, rgb_matrix_config.hsv.v>>1
#define HSC_TURQUOISE 123, 90, rgb_matrix_config.hsv.v>>1
#define HSC_WHITE 0, 0, rgb_matrix_config.hsv.v
#define HSC_YELLOW 43, 255, rgb_matrix_config.hsv.v
#define HSC_GRAY 0, 0, rgb_matrix_config.hsv.v>>1
// Categories
#define HSC_LETTERS HSC_GRAY
#define HSC_SLETTERS HSC_WHITE
#define HSC_NUMBERS HSC_YELLOW >> 1
#define HSC_SNUMBERS HSC_YELLOW
void rgb_matrix_set_hsv(uint8_t i, uint8_t h, uint8_t s, uint8_t v) {
HSV hsv = {h, s, v};
RGB rgb = hsv_to_rgb(hsv);
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
}
bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
uint8_t layer = get_highest_layer(layer_state);
if (layer < 0) {
return false;
}
for (uint8_t row = 0; row < MATRIX_ROWS; ++row) {
for (uint8_t col = 0; col < MATRIX_COLS; ++col) {
uint8_t index = g_led_config.matrix_co[row][col];
if (index < led_min || index >= led_max || index == NO_LED) continue;
uint16_t keycode = keymap_key_to_keycode(layer, (keypos_t){col, row});
if (keycode >= KC_1 && keycode <= KC_0)
rgb_matrix_set_hsv(index, HSC_NUMBERS);
else if (keycode >= S(KC_1) && keycode <= S(KC_0))
rgb_matrix_set_hsv(index, HSC_SNUMBERS);
else if (keycode == KC_ENTER || keycode == KC_TAB || keycode == KC_SPACE)
rgb_matrix_set_hsv(index, HSC_SPRINGGREEN);
else if (keycode == KC_BACKSPACE || keycode == KC_DELETE)
rgb_matrix_set_hsv(index, HSC_RED);
else if (keycode == KC_CAPS_LOCK)
rgb_matrix_set_hsv(index, HSC_BLUE);
else if (keycode >= KC_A && keycode <= KC_SLASH)
rgb_matrix_set_hsv(index, HSC_LETTERS);
else if (keycode >= S(KC_A) && keycode <= S(KC_SLASH))
rgb_matrix_set_hsv(index, HSC_SLETTERS);
else if (keycode >= KC_F1 && keycode <= KC_NUM_LOCK)
rgb_matrix_set_hsv(index, HSC_BLUE);
// TODO: numpad keycodes
else if (keycode >= KC_APPLICATION && keycode <= KC_MS_ACCEL2)
rgb_matrix_set_hsv(index, HSC_BLUE);
else if (keycode >= KC_LEFT_CTRL && keycode <= KC_RIGHT_GUI)
rgb_matrix_set_hsv(index, HSC_PURPLE);
// TODO: magic keycodes
else if (keycode >= QK_MIDI_NOTE_C_0 && keycode <= QK_MIDI_NOTE_B_5) {
rgb_matrix_set_hsv(index, ((keycode - QK_MIDI_NOTE_C_0) % 12) * 21, 255, rgb_matrix_config.hsv.v);
}
// sequencer, joystick, programmable, settings...
else if (keycode == MO(1) || keycode == MO(2))
rgb_matrix_set_hsv(index, HSC_PINK);
}
}
return false;
}
#ifdef OLED_ENABLE
bool oled_task_user(void) {
// Host Keyboard Layer Status
oled_write_P(PSTR(" Layer: "), false);
switch (get_highest_layer(layer_state)) {
case 0:
oled_write_P(PSTR("Default\n"), false);
break;
case 1:
oled_write_P(PSTR("symbols\n"), false);
break;
case 2:
oled_write_P(PSTR("numbers\n"), false);
break;
default:
// Or use the write_ln shortcut over adding '\n' to the end of your string
oled_write_ln_P(PSTR("Undefined"), false);
}
// Host Keyboard LED Status
// led_t led_state = host_keyboard_led_state();
// oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
// oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false);
// oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false);
return false;
}
#endif

View File

@ -0,0 +1 @@
ENCODER_MAP_ENABLE = yes

View File

@ -0,0 +1,5 @@
// Copyright 2023 Zach DeCook
// SPDX-License-Identifier: GPL-3.0-only
#pragma once
#define MIDI_ADVANCED

View File

@ -0,0 +1,268 @@
// Copyright 2022-2023 Zach DeCook
// SPDX-License-Identifier: GPL-3.0-only
#include QMK_KEYBOARD_H
// Define the keycode, `QK_USER` avoids collisions with existing keycodes
enum keycodes {
KC_CYCLE_LAYERS = QK_USER,
KC_ENCODER_CCW,
KC_ENCODER_CW,
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
[0] = {ENCODER_CCW_CW(KC_ENCODER_CCW, KC_ENCODER_CW),},
[1] = {ENCODER_CCW_CW(KC_ENCODER_CCW, KC_ENCODER_CW),},
[2] = {ENCODER_CCW_CW(KC_ENCODER_CCW, KC_ENCODER_CW),},
[3] = {ENCODER_CCW_CW(KC_ENCODER_CCW, KC_ENCODER_CW),},
};
#endif
// 1st layer on the cycle
#define LAYER_CYCLE_START 0
// Last layer on the cycle
#define LAYER_CYCLE_END 3
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Hexboard Harmonic table layout (landscape)
* ___ ___ ___
* BnU - -VlM__
* BnD-Mod-VlL-VlH
*
* ___ ___ ___ ___ ___ ___ ___
* F 5-Gb5-G 5-Ab5-A 5-Bb5-B 5__
* -D 5-Eb5-E 5-F 5-Gb5-G 5-Ab5
* Bb4-B 4-C 5-Db5-D 5-Eb5-E 5-
* -G 4-Ab4-A 4-Bb4-B 4-C 5-Db5
* Eb4-E 4-F 4-Gb4-G 4-Ab4-A 4-
* -C 4-Db4-D 4-Eb4-E 4-F 4-Gb4
* Ab3-A 3-Bb3-B 3-C 4-Db4-D 4-
* -F 3-Gb3-G 3-Ab3-A 3-Bb3-B 3
* Db3-D 3-Eb3-E 3-F 3-Gb3-G 3-
* -Bb2-B 2-C 3-Db3-D 3-Eb3-E 3
* Gb2-G 2-Ab2-A 2-Bb2-B 2-C 3-
* -Eb2-E 2-F 2-Gb2-G 2-Ab2-A 2
* B 1-C 2-Db2-D 2-Eb2-E 2-F 2-
* -Ab1-A 1-Bb1-B 1-C 2-Db2-D 2
* E 1-F 1-Gb1-G 1-Ab1-A 1-Bb1-
* -Db1-D 1-Eb1-E 1-F 1-Gb1-G 1
* A -Bb -B -C 1-Db1-D 1-Eb1-
* -Gb -G -Ab -A -Bb -B -C 1
* D -Eb -E -F -Gb -G -Ab
*
*/
[0] = LAYOUT_landscape(
MI_BNDU,KC_CYCLE_LAYERS,MI_VL5,
MI_BNDD,MI_MOD, MI_VL2,MI_VL10,
MI_F5, MI_Gb5, MI_G5, MI_Ab5, MI_A5, MI_Bb5, MI_B5,
MI_D5, MI_Eb5, MI_E5, MI_F5, MI_Gb5, MI_G5, MI_Ab5,
MI_Bb4, MI_B4, MI_C5, MI_Db5, MI_D5, MI_Eb5, MI_E5,
MI_G4, MI_Ab4, MI_A4, MI_Bb4, MI_B4, MI_C5, MI_Db5,
MI_Eb4, MI_E4, MI_F4, MI_Gb4, MI_G4, MI_Ab4, MI_A4,
MI_C4, MI_Db4, MI_D4, MI_Eb4, MI_E4, MI_F4, MI_Gb4,
MI_Ab3, MI_A3, MI_Bb3, MI_B3, MI_C4, MI_Db4, MI_D4,
MI_F3, MI_Gb3, MI_G3, MI_Ab3, MI_A3, MI_Bb3, MI_B3,
MI_Db3, MI_D3, MI_Eb3, MI_E3, MI_F3, MI_Gb3, MI_G3,
MI_Bb2, MI_B2, MI_C3, MI_Db3, MI_D3, MI_Eb3, MI_E3,
MI_Gb2, MI_G2, MI_Ab2, MI_A2, MI_Bb2, MI_B2, MI_C3,
MI_Eb2, MI_E2, MI_F2, MI_Gb2, MI_G2, MI_Ab2, MI_A2,
MI_B1, MI_C2, MI_Db2, MI_D2, MI_Eb2, MI_E2, MI_F2,
MI_Ab1, MI_A1, MI_Bb1, MI_B1, MI_C2, MI_Db2, MI_D2,
MI_E1, MI_F1, MI_Gb1, MI_G1, MI_Ab1, MI_A1, MI_Bb1,
MI_Db1, MI_D1, MI_Eb1, MI_E1, MI_F1, MI_Gb1, MI_G1,
MI_A, MI_Bb, MI_B, MI_C1, MI_Db1, MI_D1, MI_Eb1,
MI_Gb, MI_G, MI_Ab, MI_A, MI_Bb, MI_B, MI_C1,
MI_D, MI_Eb, MI_E, MI_F, MI_Gb1, MI_G, MI_Ab
),
// wickiHaydenLayout
// ./makeLayout.py 79 2 -7 qmk
[1] = LAYOUT_portrait(
MI_VL10, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
MI_VL5, MI_G5, MI_A5, MI_B5, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
MI_C5, MI_D5, MI_E5, MI_Gb5, MI_Ab5, MI_Bb5, KC_NO, KC_NO, KC_NO, KC_NO,
MI_VL2, MI_G4, MI_A4, MI_B4, MI_Db5, MI_Eb5, MI_F5, MI_G5, MI_A5, MI_B5,
MI_C4, MI_D4, MI_E4, MI_Gb4, MI_Ab4, MI_Bb4, MI_C5, MI_D5, MI_E5, MI_Gb5,
QK_USER, MI_G3, MI_A3, MI_B3, MI_Db4, MI_Eb4, MI_F4, MI_G4, MI_A4, MI_B4,
MI_C3, MI_D3, MI_E3, MI_Gb3, MI_Ab3, MI_Bb3, MI_C4, MI_D4, MI_E4, MI_Gb4,
MI_MOD, MI_G2, MI_A2, MI_B2, MI_Db3, MI_Eb3, MI_F3, MI_G3, MI_A3, MI_B3,
MI_C2, MI_D2, MI_E2, MI_Gb2, MI_Ab2, MI_Bb2, MI_C3, MI_D3, MI_E3, MI_Gb3,
MI_BNDU, MI_G1, MI_A1, MI_B1, MI_Db2, MI_Eb2, MI_F2, MI_G2, MI_A2, MI_B2,
MI_C1, MI_D1, MI_E1, MI_Gb1, MI_Ab1, MI_Bb1, MI_C2, MI_D2, MI_E2, MI_Gb2,
MI_BNDD, MI_G, MI_A, MI_B, MI_Db1, MI_Eb1, MI_F1, MI_G1, MI_A1, MI_B1,
MI_C, MI_D, MI_E, MI_Gb, MI_Ab, MI_Bb, MI_C1, MI_D1, MI_E1, MI_Gb1
),
// gerhardLayout
// ./makeLayout.py 62 -1 -3 qmk
[2] = LAYOUT_portrait(
MI_VL10, MI_D5, MI_Db5, MI_C5, MI_B4, MI_Bb4, MI_A4, MI_Ab4, MI_G4, MI_Gb4,
MI_B4, MI_Bb4, MI_A4, MI_Ab4, MI_G4, MI_Gb4, MI_F4, MI_E4, MI_Eb4, MI_D4,
MI_VL5, MI_G4, MI_Gb4, MI_F4, MI_E4, MI_Eb4, MI_D4, MI_Db4, MI_C4, MI_B3,
MI_E4, MI_Eb4, MI_D4, MI_Db4, MI_C4, MI_B3, MI_Bb3, MI_A3, MI_Ab3, MI_G3,
MI_VL2, MI_C4, MI_B3, MI_Bb3, MI_A3, MI_Ab3, MI_G3, MI_Gb3, MI_F3, MI_E3,
MI_A3, MI_Ab3, MI_G3, MI_Gb3, MI_F3, MI_E3, MI_Eb3, MI_D3, MI_Db3, MI_C3,
QK_USER, MI_F3, MI_E3, MI_Eb3, MI_D3, MI_Db3, MI_C3, MI_B2, MI_Bb2, MI_A2,
MI_D3, MI_Db3, MI_C3, MI_B2, MI_Bb2, MI_A2, MI_Ab2, MI_G2, MI_Gb2, MI_F2,
MI_MOD, MI_Bb2, MI_A2, MI_Ab2, MI_G2, MI_Gb2, MI_F2, MI_E2, MI_Eb2, MI_D2,
MI_G2, MI_Gb2, MI_F2, MI_E2, MI_Eb2, MI_D2, MI_Db2, MI_C2, MI_B1, MI_Bb1,
MI_BNDU, MI_Eb2, MI_D2, MI_Db2, MI_C2, MI_B1, MI_Bb1, MI_A1, MI_Ab1, MI_G1,
MI_C2, MI_B1, MI_Bb1, MI_A1, MI_Ab1, MI_G1, MI_Gb1, MI_F1, MI_E1, MI_Eb1,
MI_BNDD, MI_Ab1, MI_G1, MI_Gb1, MI_F1, MI_E1, MI_Eb1, MI_D1, MI_Db1, MI_C1,
MI_F1, MI_E1, MI_Eb1, MI_D1, MI_Db1, MI_C1, MI_B, MI_Bb, MI_A, MI_Ab
),
// "Full" layout -- notably not full in qmk
// ./makeLayout.py 132 -1 -9 qmk
[3] = LAYOUT_portrait(
MI_VL10, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
MI_VL5, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
MI_VL2, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
QK_USER, KC_NO, KC_NO, KC_NO, KC_NO, MI_B5, MI_Bb5, MI_A5, MI_Ab5, MI_G5,
MI_Gb5, MI_F5, MI_E5, MI_Eb5, MI_D5, MI_Db5, MI_C5, MI_B4, MI_Bb4, MI_A4,
MI_MOD, MI_Ab4, MI_G4, MI_Gb4, MI_F4, MI_E4, MI_Eb4, MI_D4, MI_Db4, MI_C4,
MI_B3, MI_Bb3, MI_A3, MI_Ab3, MI_G3, MI_Gb3, MI_F3, MI_E3, MI_Eb3, MI_D3,
MI_BNDU, MI_Db3, MI_C3, MI_B2, MI_Bb2, MI_A2, MI_Ab2, MI_G2, MI_Gb2, MI_F2,
MI_E2, MI_Eb2, MI_D2, MI_Db2, MI_C2, MI_B1, MI_Bb1, MI_A1, MI_Ab1, MI_G1,
MI_BNDD, MI_Gb1, MI_F1, MI_E1, MI_Eb1, MI_D1, MI_Db1, MI_C1, MI_B, MI_Bb,
MI_A, MI_Ab, MI_G, MI_Gb, MI_F, MI_E, MI_Eb, MI_D, MI_Db, MI_C
),
};
void rgb_matrix_set_hsv(uint8_t i, uint8_t h, uint8_t s, uint8_t v) {
HSV hsv = {h, s, v};
RGB rgb = hsv_to_rgb(hsv);
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
}
bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
if (get_highest_layer(layer_state) < 0) {
return false;
}
uint8_t layer = get_highest_layer(layer_state);
for (uint8_t row = 0; row < MATRIX_ROWS; ++row) {
for (uint8_t col = 0; col < MATRIX_COLS; ++col) {
uint8_t index = g_led_config.matrix_co[row][col];
if (index < led_min || index >= led_max || index == NO_LED) continue;
uint16_t keycode = keymap_key_to_keycode(layer, (keypos_t){col, row});
if (keycode >= QK_MIDI_NOTE_C_0 && keycode <= QK_MIDI_NOTE_B_5) {
rgb_matrix_set_hsv(index, ((keycode - QK_MIDI_NOTE_C_0) % 12) * 21, 255, rgb_matrix_config.hsv.v);
} else if (keycode == QK_MIDI_PITCH_BEND_DOWN || keycode == QK_MIDI_PITCH_BEND_UP) {
// TODO: Make this reflect the internal pitch bend value.
rgb_matrix_set_hsv(index, 0, 255, rgb_matrix_config.hsv.v);
} else if (keycode == QK_MIDI_MODULATION) {
// TODO: Make this reflect the internal modulation value.
rgb_matrix_set_hsv(index, 85, 255, rgb_matrix_config.hsv.v);
} else if (keycode >= QK_MIDI_VELOCITY_0 && keycode <= QK_MIDI_VELOCITY_10) {
uint8_t vlev = keycode - QK_MIDI_VELOCITY_0; // 0-10
// Set brightness based on which is closest.
uint8_t brightness = 127 - abs((vlev * 12) - midi_config.velocity);
if (brightness > rgb_matrix_config.hsv.v) brightness = rgb_matrix_config.hsv.v;
// Highest velocity is red.
rgb_matrix_set_hsv(index, (10 - (vlev)) * 20, 255, brightness);
}
}
}
return false;
}
uint16_t held_keycode = 0;
// Add the behaviour of this new keycode
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_CYCLE_LAYERS:
// Our logic will happen on presses, nothing is done on releases
if (!record->event.pressed) {
// We've already handled the keycode (doing nothing), let QMK know so no further code is run unnecessarily
return false;
}
uint8_t current_layer = get_highest_layer(layer_state);
// Check if we are within the range, if not quit
if (current_layer > LAYER_CYCLE_END || current_layer < LAYER_CYCLE_START) {
return false;
}
uint8_t next_layer = current_layer + 1;
if (next_layer > LAYER_CYCLE_END) {
next_layer = LAYER_CYCLE_START;
}
layer_move(next_layer);
return false;
// Track the option buttons so they can modify the behavior of the encoder.
case MI_BNDU:
case MI_BNDD:
case MI_MOD:
case MI_VL2:
case MI_VL5:
case MI_VL10:
if (record->event.pressed) {
held_keycode = keycode;
} else if (held_keycode == keycode) {
held_keycode = 0;
}
// process normally
return true;
case KC_ENCODER_CCW:
case KC_ENCODER_CW:
switch (held_keycode) {
case MI_MOD:
if (keycode == KC_ENCODER_CW ? midi_config.modulation_interval != 255 : midi_config.modulation_interval != 0) {
midi_config.modulation_interval += (keycode == KC_ENCODER_CW ? 1 : -1);
}
break;
case MI_VL2:
case MI_VL5:
case MI_VL10:
if (keycode == KC_ENCODER_CW ? midi_config.velocity != 127 : midi_config.velocity != 0) {
midi_config.velocity += (keycode == KC_ENCODER_CW ? 1 : -1);
}
break;
default:
break;
}
// done processing.
return false;
// Process other keycodes normally
default:
return true;
}
}
#ifdef OLED_ENABLE
bool oled_task_user(void) {
// Host Keyboard Layer Status
oled_write_P(PSTR("Layer:"), false);
switch (get_highest_layer(layer_state)) {
case 0:
// skip the space because this fill the OLED width
oled_write_ln_P(PSTR("Harmonic Table"), false);
break;
case 1:
oled_write_ln_P(PSTR(" Wicki-Hayden"), false);
break;
case 2:
oled_write_ln_P(PSTR(" Gerhard"), false);
break;
case 3:
oled_write_ln_P(PSTR(" 'Full'"), false);
break;
default:
// Or use the write_ln shortcut over adding '\n' to the end of your string
oled_write_ln_P(PSTR("Undefined"), false);
}
oled_write_P(PSTR("Velocity: "), held_keycode >= MI_VL0 && held_keycode <= MI_VL10);
oled_write_ln(get_u8_str(midi_config.velocity, ' '), false);
oled_write_P(PSTR("Octave: "), held_keycode >= MI_OCN2 && held_keycode <= MI_OCTU);
oled_write_ln(get_u8_str(midi_config.octave, ' '), false);
oled_write_P(PSTR("Transposition: "), held_keycode >= MI_TRN6 && held_keycode <= MI_TRSU);
oled_write_ln(get_u8_str(midi_config.transpose, ' '), false);
oled_write_P(PSTR("Mod Int: "), held_keycode >= MI_MOD && held_keycode <= MI_MODU);
oled_write_ln(get_u8_str(midi_config.modulation_interval, ' '), false);
return false;
}
#endif

View File

@ -0,0 +1 @@
ENCODER_MAP_ENABLE = yes

View File

@ -0,0 +1,55 @@
// Copyright 2023 Zach DeCook
// SPDX-License-Identifier: GPL-3.0-only
#include "matrix.h"
static const uint8_t columns[MATRIX_COLS] = MATRIX_COL_PINS;
// At least four of these should be defined!
static const pin_t mux_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
void matrix_init_custom(void) {
// Set pinModes for the digital button matrix.
// For each column pin...
for (int pinNumber = 0; pinNumber < MATRIX_COLS; pinNumber++) {
// set the pinMode to INPUT_PULLUP (+3.3V / HIGH).
gpio_set_pin_input_high(columns[pinNumber]);
}
gpio_set_pin_output(mux_pins[0]);
gpio_set_pin_output(mux_pins[1]);
gpio_set_pin_output(mux_pins[2]);
gpio_set_pin_output(mux_pins[3]);
}
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
bool matrix_has_changed = false;
// Button Deck
// Iterate through each of the row pins on the multiplexing chip.
for (int rowIndex = 0; rowIndex < 14; rowIndex++) {
gpio_write_pin(mux_pins[0], rowIndex & 1);
gpio_write_pin(mux_pins[1], (rowIndex & 2) >> 1);
gpio_write_pin(mux_pins[2], (rowIndex & 4) >> 2);
gpio_write_pin(mux_pins[3], (rowIndex & 8) >> 3);
// Now iterate through each of the column pins that are connected to the current row pin.
for (int columnIndex = 0; columnIndex < MATRIX_COLS; columnIndex++) {
// Hold the currently selected column pin in a variable.
pin_t columnPin = columns[columnIndex];
// Set that row pin to INPUT_PULLUP mode (+3.3V / HIGH).
gpio_set_pin_input_high(columnPin);
matrix_io_delay();
bool previousValue = (current_matrix[rowIndex] >> columnIndex) & 1;
bool buttonState = !gpio_read_pin(columnPin); // inverted...
matrix_has_changed |= previousValue != buttonState;
if (buttonState) {
current_matrix[rowIndex] |= (1 << columnIndex);
} else {
current_matrix[rowIndex] &= ~(1 << columnIndex);
}
// Set the selected column pin back to INPUT mode (0V / LOW).
gpio_set_pin_input(columnPin);
}
}
return matrix_has_changed;
}

View File

@ -0,0 +1,15 @@
// Copyright 2023 Zach DeCook
// SPDX-License-Identifier: GPL-3.0-only
#pragma once
#include_next <mcuconf.h>
#undef RP_I2C_USE_I2C0
#define RP_I2C_USE_I2C0 TRUE
#undef RP_I2C_USE_I2C1
#define RP_I2C_USE_I2C1 FALSE
// For audio, pin 23 is PWM3 B
#undef RP_PWM_USE_PWM3
#define RP_PWM_USE_PWM3 TRUE

View File

@ -0,0 +1,34 @@
# HexBoard
![HexBoard](https://i.imgur.com/8vtaXb7h.jpg)
*The HexBoard is a 140-key hexagonal MIDI controller which can double as a 120% keyboard*
* Keyboard Maintainer: [Zach DeCook](https://github.com/earboxer)
* Hardware Supported: Dev Unit with RP2040 Processor, HexBoard Production Unit (1.1)
* Hardware Not Supported: Dev Unit with Teensy Processor
* Hardware Availability:
* HexBoard Production Unit (1.1) https://shapingthesilence.com/tech/hexboard-midi-controller/ Since 2023.
The ["Arduino" firmware](https://sr.ht/~earboxer/HexBoard/) remains the official firmware for the HexBoard, but QMK can be used as an alternative which offers keyboard functionality.
Make example for this keyboard (after setting up your build environment):
make hexboard/1_1:default
make hexboard/dev:default
Flashing example for this keyboard:
make hexboard/1_1:default:flash
make hexboard/dev:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Flashing the Firmware
0. When you run the flash command, it will say "Waiting for drive to deploy..."
1. On the production model, hold the little button next to the USB-C port when plugging it in.
* On the dev model, hold the little button labeled RPBOOT while plugging it in
2. Mount the device on your computer
3. The flash command will copy the uf2 file onto the mounted device
4. Wait (maybe seven seconds)