diff options
-rw-r--r-- | keyboards/qaz/config.h | 49 | ||||
-rw-r--r-- | keyboards/qaz/info.json | 15 | ||||
-rw-r--r-- | keyboards/qaz/keymaps/default/config.h | 6 | ||||
-rw-r--r-- | keyboards/qaz/keymaps/default/keymap.c | 57 | ||||
-rw-r--r-- | keyboards/qaz/keymaps/default/readme.md | 1 | ||||
-rw-r--r-- | keyboards/qaz/keymaps/default/rules.mk | 1 | ||||
-rw-r--r-- | keyboards/qaz/keymaps/default_big_space/config.h | 6 | ||||
-rw-r--r-- | keyboards/qaz/keymaps/default_big_space/keymap.c | 57 | ||||
-rw-r--r-- | keyboards/qaz/keymaps/default_big_space/readme.md | 1 | ||||
-rw-r--r-- | keyboards/qaz/keymaps/default_big_space/rules.mk | 1 | ||||
-rw-r--r-- | keyboards/qaz/keymaps/via/keymap.c | 29 | ||||
-rw-r--r-- | keyboards/qaz/keymaps/via/rules.mk | 1 | ||||
-rw-r--r-- | keyboards/qaz/qaz.c | 1 | ||||
-rw-r--r-- | keyboards/qaz/qaz.h | 33 | ||||
-rw-r--r-- | keyboards/qaz/readme.md | 15 | ||||
-rw-r--r-- | keyboards/qaz/rules.mk | 22 |
16 files changed, 295 insertions, 0 deletions
diff --git a/keyboards/qaz/config.h b/keyboards/qaz/config.h new file mode 100644 index 000000000..1dbaaa0fc --- /dev/null +++ b/keyboards/qaz/config.h @@ -0,0 +1,49 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x7431 +#define PRODUCT_ID 0x0001 +#define DEVICE_VER 0x0001 +#define MANUFACTURER whydobearsexplod +#define PRODUCT qaz keyboard + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 7 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * + */ +#define MATRIX_ROW_PINS { F4, D4, C6, E6, D1, D0 } +#define MATRIX_COL_PINS { B4, D3, D2, F5, B5, F6, D7 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL*/ +#define DIODE_DIRECTION COL2ROW + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +#define RGB_DI_PIN F7 + +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 21 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif diff --git a/keyboards/qaz/info.json b/keyboards/qaz/info.json new file mode 100644 index 000000000..c8993d57e --- /dev/null +++ b/keyboards/qaz/info.json @@ -0,0 +1,15 @@ +{ + "keyboard_name": "qaz", + "url": "", + "maintainer": "tominabox1", + "width": 10.25, + "height": 4, + "layouts": { + "LAYOUT_split_space": { + "layout": [{"label":"Q", "x":0, "y":0}, {"label":"W", "x":1, "y":0}, {"label":"E", "x":2, "y":0}, {"label":"R", "x":3, "y":0}, {"label":"T", "x":4, "y":0}, {"label":"Y", "x":5, "y":0}, {"label":"U", "x":6, "y":0}, {"label":"I", "x":7, "y":0}, {"label":"O", "x":8, "y":0}, {"label":"P", "x":9, "y":0, "w":1.25}, {"label":"A", "x":0, "y":1, "w":1.25}, {"label":"S", "x":1.25, "y":1}, {"label":"D", "x":2.25, "y":1}, {"label":"F", "x":3.25, "y":1}, {"label":"G", "x":4.25, "y":1}, {"label":"H", "x":5.25, "y":1}, {"label":"J", "x":6.25, "y":1}, {"label":"K", "x":7.25, "y":1}, {"label":"L", "x":8.25, "y":1}, {"label":"Ent", "x":9.25, "y":1}, {"label":"Z", "x":0, "y":2, "w":1.75}, {"label":"X", "x":1.75, "y":2}, {"label":"C", "x":2.75, "y":2}, {"label":"V", "x":3.75, "y":2}, {"label":"B", "x":4.75, "y":2}, {"label":"N", "x":5.75, "y":2}, {"label":"M", "x":6.75, "y":2}, {"label":".", "x":7.75, "y":2}, {"label":"Shift","x":8.75, "y":2, "w":1.5},{"label":"Super", "x":0, "y":3}, {"label":"Meta", "x":1, "y":3}, {"label":"Alt", "x":2, "y":3}, {"label":"", "x":3, "y":3, "w":2.25}, {"label":"", "x":5.25, "y":3, "w":2}, {"label":"AltGr", "x":7.25, "y":3},{"label":"Meta", "x":8.25, "y":3},{"label":"Super", "x":9.25, "y":3}] + }, + "LAYOUT": { + "layout": [{"label":"Q", "x":0, "y":0}, {"label":"W", "x":1, "y":0}, {"label":"E", "x":2, "y":0}, {"label":"R", "x":3, "y":0}, {"label":"T", "x":4, "y":0}, {"label":"Y", "x":5, "y":0}, {"label":"U", "x":6, "y":0}, {"label":"I", "x":7, "y":0}, {"label":"O", "x":8, "y":0}, {"label":"P", "x":9, "y":0, "w":1.25}, {"label":"A", "x":0, "y":1, "w":1.25}, {"label":"S", "x":1.25, "y":1}, {"label":"D", "x":2.25, "y":1}, {"label":"F", "x":3.25, "y":1}, {"label":"G", "x":4.25, "y":1}, {"label":"H", "x":5.25, "y":1}, {"label":"J", "x":6.25, "y":1}, {"label":"K", "x":7.25, "y":1}, {"label":"L", "x":8.25, "y":1}, {"label":"Ent", "x":9.25, "y":1}, {"label":"Z", "x":0, "y":2, "w":1.75}, {"label":"X", "x":1.75, "y":2}, {"label":"C", "x":2.75, "y":2}, {"label":"V", "x":3.75, "y":2}, {"label":"B", "x":4.75, "y":2}, {"label":"N", "x":5.75, "y":2}, {"label":"M", "x":6.75, "y":2}, {"label":".", "x":7.75, "y":2}, {"label":"Shift","x":8.75, "y":2, "w":1.5},{"label":"Super", "x":0, "y":3}, {"label":"Meta", "x":1, "y":3}, {"label":"", "x":2, "y":3, "w":6.25}, {"label":"Meta", "x":8.25, "y":3},{"label":"Super", "x":9.25, "y":3}] + } + } +} diff --git a/keyboards/qaz/keymaps/default/config.h b/keyboards/qaz/keymaps/default/config.h new file mode 100644 index 000000000..12482ff6f --- /dev/null +++ b/keyboards/qaz/keymaps/default/config.h @@ -0,0 +1,6 @@ +#pragma once + +#ifdef COMBO_ENABLE +# define COMBO_COUNT 5 +# define COMBO_TERM 200 +#endif diff --git a/keyboards/qaz/keymaps/default/keymap.c b/keyboards/qaz/keymaps/default/keymap.c new file mode 100644 index 000000000..cf721292a --- /dev/null +++ b/keyboards/qaz/keymaps/default/keymap.c @@ -0,0 +1,57 @@ +#include QMK_KEYBOARD_H + +enum layers{ + _BASE, + _NUM_SYM, + _NAV +}; +enum combo_events { + COMBO_BSPC, + COMBO_NUMBAK, + COMBO_TAB, + COMBO_ESC, + COMBO_DEL, +}; + +#define KC_NUM_SPC LT(_NUM_SYM, KC_SPC) +#define KC_GA LGUI_T(KC_A) +#define KC_AS LALT_T(KC_S) +#define KC_CD LCTL_T(KC_D) +#define KC_SF LSFT_T(KC_F) +#define KC_SJ RSFT_T(KC_J) +#define KC_CK RCTL_T(KC_K) +#define KC_AL RALT_T(KC_L) +#define KC_GSCLN RGUI_T(KC_SCLN) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_split_space( + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_GA, KC_AS, KC_CD, KC_SF, KC_G, KC_H, KC_SJ, KC_CK, KC_AL, KC_ENT, + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, + KC_LCTL, KC_LALT, KC_LGUI, KC_BSPC, LT(_NUM_SYM,KC_SPACE), KC_RALT, KC_RGUI, KC_RCTL + ), + + [_NUM_SYM] = LAYOUT_split_space( + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, + KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_EQUAL, KC_MINS, + KC_LCBR, KC_LBRC, KC_LPRN, KC_UNDS, KC_RPRN, KC_RBRC, KC_RCBR, KC_SCLN, KC_QUOTE, + RGB_TOG, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; + +#ifdef COMBO_ENABLE +const uint16_t PROGMEM combo_bspc[] = {KC_O, KC_P, COMBO_END}; +const uint16_t PROGMEM combo_numbak[] = {KC_0, KC_9, COMBO_END}; +const uint16_t PROGMEM combo_tab[] = {KC_Q, KC_W, COMBO_END}; +const uint16_t PROGMEM combo_esc[] = {KC_E, KC_W, COMBO_END}; +const uint16_t PROGMEM combo_del[] = {KC_MINS, KC_EQL, COMBO_END}; + +combo_t key_combos[COMBO_COUNT] = { + [COMBO_BSPC] = COMBO(combo_bspc,KC_BSPC), + [COMBO_NUMBAK] = COMBO(combo_numbak,KC_BSPC), + [COMBO_TAB] = COMBO(combo_tab,KC_TAB), + [COMBO_ESC] = COMBO(combo_esc,KC_ESC), + [COMBO_DEL] = COMBO(combo_del,KC_DEL), + +}; +#endif diff --git a/keyboards/qaz/keymaps/default/readme.md b/keyboards/qaz/keymaps/default/readme.md new file mode 100644 index 000000000..fb85d36e2 --- /dev/null +++ b/keyboards/qaz/keymaps/default/readme.md @@ -0,0 +1 @@ +# Default QAZ Layout diff --git a/keyboards/qaz/keymaps/default/rules.mk b/keyboards/qaz/keymaps/default/rules.mk new file mode 100644 index 000000000..ab1e43818 --- /dev/null +++ b/keyboards/qaz/keymaps/default/rules.mk @@ -0,0 +1 @@ +COMBO_ENABLE = yes diff --git a/keyboards/qaz/keymaps/default_big_space/config.h b/keyboards/qaz/keymaps/default_big_space/config.h new file mode 100644 index 000000000..12482ff6f --- /dev/null +++ b/keyboards/qaz/keymaps/default_big_space/config.h @@ -0,0 +1,6 @@ +#pragma once + +#ifdef COMBO_ENABLE +# define COMBO_COUNT 5 +# define COMBO_TERM 200 +#endif diff --git a/keyboards/qaz/keymaps/default_big_space/keymap.c b/keyboards/qaz/keymaps/default_big_space/keymap.c new file mode 100644 index 000000000..13f105add --- /dev/null +++ b/keyboards/qaz/keymaps/default_big_space/keymap.c @@ -0,0 +1,57 @@ +#include QMK_KEYBOARD_H + +enum layers{ + _BASE, + _NUM_SYM, + _NAV +}; +enum combo_events { + COMBO_BSPC, + COMBO_NUMBAK, + COMBO_TAB, + COMBO_ESC, + COMBO_DEL, +}; + +#define KC_NUM_SPC LT(_NUM_SYM, KC_SPC) +#define KC_GA LGUI_T(KC_A) +#define KC_AS LALT_T(KC_S) +#define KC_CD LCTL_T(KC_D) +#define KC_SF LSFT_T(KC_F) +#define KC_SJ RSFT_T(KC_J) +#define KC_CK RCTL_T(KC_K) +#define KC_AL RALT_T(KC_L) +#define KC_GSCLN RGUI_T(KC_SCLN) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT( + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_GA, KC_AS, KC_CD, KC_SF, KC_G, KC_H, KC_SJ, KC_CK, KC_AL, KC_ENT, + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, + KC_LCTL, KC_LALT, LT(_NUM_SYM,KC_SPACE), KC_RGUI, KC_RCTL + ), + + [_NUM_SYM] = LAYOUT( + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, + KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_EQUAL, KC_MINS, + KC_LCBR, KC_LBRC, KC_LPRN, KC_UNDS, KC_RPRN, KC_RBRC, KC_RCBR, KC_SCLN, KC_QUOTE, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; + +#ifdef COMBO_ENABLE +const uint16_t PROGMEM combo_bspc[] = {KC_O, KC_P, COMBO_END}; +const uint16_t PROGMEM combo_numbak[] = {KC_0, KC_9, COMBO_END}; +const uint16_t PROGMEM combo_tab[] = {KC_Q, KC_W, COMBO_END}; +const uint16_t PROGMEM combo_esc[] = {KC_E, KC_W, COMBO_END}; +const uint16_t PROGMEM combo_del[] = {KC_MINS, KC_EQL, COMBO_END}; + +combo_t key_combos[COMBO_COUNT] = { + [COMBO_BSPC] = COMBO(combo_bspc,KC_BSPC), + [COMBO_NUMBAK] = COMBO(combo_numbak,KC_BSPC), + [COMBO_TAB] = COMBO(combo_tab,KC_TAB), + [COMBO_ESC] = COMBO(combo_esc,KC_ESC), + [COMBO_DEL] = COMBO(combo_del,KC_DEL), + +}; +#endif diff --git a/keyboards/qaz/keymaps/default_big_space/readme.md b/keyboards/qaz/keymaps/default_big_space/readme.md new file mode 100644 index 000000000..f1fc30c21 --- /dev/null +++ b/keyboards/qaz/keymaps/default_big_space/readme.md @@ -0,0 +1 @@ +# Default QAZ Layout full size spacebar diff --git a/keyboards/qaz/keymaps/default_big_space/rules.mk b/keyboards/qaz/keymaps/default_big_space/rules.mk new file mode 100644 index 000000000..ab1e43818 --- /dev/null +++ b/keyboards/qaz/keymaps/default_big_space/rules.mk @@ -0,0 +1 @@ +COMBO_ENABLE = yes diff --git a/keyboards/qaz/keymaps/via/keymap.c b/keyboards/qaz/keymaps/via/keymap.c new file mode 100644 index 000000000..92556c330 --- /dev/null +++ b/keyboards/qaz/keymaps/via/keymap.c @@ -0,0 +1,29 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_split_space( + 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, KC_ENT, + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, + KC_LCTL, KC_LALT, KC_LGUI, KC_BSPC, KC_SPACE, KC_RALT, KC_RGUI, KC_RCTL + ), + + [1] = LAYOUT_split_space( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + [2] = LAYOUT_split_space( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + [3] = LAYOUT_split_space( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; diff --git a/keyboards/qaz/keymaps/via/rules.mk b/keyboards/qaz/keymaps/via/rules.mk new file mode 100644 index 000000000..74d66eb22 --- /dev/null +++ b/keyboards/qaz/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/qaz/qaz.c b/keyboards/qaz/qaz.c new file mode 100644 index 000000000..a9e72fa61 --- /dev/null +++ b/keyboards/qaz/qaz.c @@ -0,0 +1 @@ +#include "qaz.h" diff --git a/keyboards/qaz/qaz.h b/keyboards/qaz/qaz.h new file mode 100644 index 000000000..aba68d3d2 --- /dev/null +++ b/keyboards/qaz/qaz.h @@ -0,0 +1,33 @@ +#pragma once + +#include "quantum.h" + +#define XXX KC_NO + +#define LAYOUT_split_space( \ + K00, K01, K02, K03, K04, K05, K06, K40, K41, K42, \ + K10, K11, K12, K13, K14, K15, K16, K50, K51, K52, \ + K20, K21, K22, K23, K24, K25, K26, K43, K53, \ + K30, K31, K32, K33, K34, K35, K36, K44 \ +) { \ +{ K00, K01, K02, K03, K04, K05, K06 }, \ +{ K10, K11, K12, K13, K14, K15, K16 }, \ +{ K20, K21, K22, K23, K24, K25, K26 }, \ +{ K30, K31, K32, K33, K34, K35, K36 }, \ +{ K40, K41, K42, K43, K44, XXX, XXX }, \ +{ K50, K51, K52, K53, XXX, XXX, XXX } \ +} + +#define LAYOUT( \ + K00, K01, K02, K03, K04, K05, K06, K40, K41, K42, \ + K10, K11, K12, K13, K14, K15, K16, K50, K51, K52, \ + K20, K21, K22, K23, K24, K25, K26, K43, K53, \ + K30, K31, K34, K36, K44 \ +) { \ +{ K00, K01, K02, K03, K04, K05, K06 }, \ +{ K10, K11, K12, K13, K14, K15, K16 }, \ +{ K20, K21, K22, K23, K24, K25, K26 }, \ +{ K30, K31, XXX, XXX, K34, XXX, K36 }, \ +{ K40, K41, K42, K43, K44, XXX, XXX }, \ +{ K50, K51, K52, K53, XXX, XXX, XXX } \ +} diff --git a/keyboards/qaz/readme.md b/keyboards/qaz/readme.md new file mode 100644 index 000000000..2f1e7fcc9 --- /dev/null +++ b/keyboards/qaz/readme.md @@ -0,0 +1,15 @@ +# QAZ + +![QAZ](https://i.imgur.com/kmxDneol.png) + +QAZ is a careful exercise in minimalism, leveraging advanced QMK magic like combos, tapdances and mod layers to unlock complete functionality while remaining oddly familiar. +Throw it in your fanny pack and hop on your fixed gear and away you go. QAZ is cheap, hip, and effective with all the keyboardy features you expect, including the ability to type numbers- should you choose to add them to your layout. + +* Keyboard Maintainer: [TJ Campie](https://github.com/tominabox1) +* Hardware Availability: 40s Discord Mini Group Buy + +Make example for this keyboard (after setting up your build environment): + + qmk compile -kb qaz -km default + +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). diff --git a/keyboards/qaz/rules.mk b/keyboards/qaz/rules.mk new file mode 100644 index 000000000..760e96e1c --- /dev/null +++ b/keyboards/qaz/rules.mk @@ -0,0 +1,22 @@ +# MCU name +MCU = atmega32u4 + +# Bootloader selection +BOOTLOADER = caterina + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow +BLUETOOTH_ENABLE = no # Enable Bluetooth +AUDIO_ENABLE = no # Audio output |