114 lines
3.2 KiB
Python
114 lines
3.2 KiB
Python
# SPDX-FileCopyrightText: 2022 Liz Clark for Adafruit Industries
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
import board
|
|
import displayio
|
|
import keypad
|
|
from adafruit_st7789 import ST7789
|
|
import adafruit_imageload
|
|
import usb_hid
|
|
from adafruit_hid.keyboard import Keyboard
|
|
from adafruit_hid.keycode import Keycode
|
|
import usb_midi
|
|
import adafruit_midi
|
|
from adafruit_midi.note_on import NoteOn
|
|
from adafruit_midi.note_off import NoteOff
|
|
|
|
# if you want to use this as an HID keyboard, set keyboard_mode to True
|
|
# otherwise, set it to False
|
|
keyboard_mode = True
|
|
# if you want to use this as a MIDI keyboard, set midi_mode to True
|
|
# otherwise, set it to False
|
|
midi_mode = False
|
|
|
|
# change keyboard shortcuts here
|
|
# defaults are shortcuts for save, cut, copy & paste
|
|
# comment out ctrl depending on windows or macOS
|
|
if keyboard_mode:
|
|
keyboard = Keyboard(usb_hid.devices)
|
|
# modifier for windows
|
|
ctrl = Keycode.CONTROL
|
|
# modifier for macOS
|
|
# ctrl = Keycode.COMMAND
|
|
key0 = Keycode.S
|
|
key1 = Keycode.X
|
|
key2 = Keycode.C
|
|
key3 = Keycode.V
|
|
shortcuts = [key0, key1, key2, key3]
|
|
|
|
# change MIDI note numbers here
|
|
if midi_mode:
|
|
midi = adafruit_midi.MIDI(midi_out=usb_midi.ports[1], out_channel=0)
|
|
midi_notes = [60, 61, 62, 63]
|
|
|
|
# Release any resources currently in use for the displays
|
|
displayio.release_displays()
|
|
|
|
# spi display setup
|
|
spi = board.SPI()
|
|
tft_cs = board.D7
|
|
tft_dc = board.D5
|
|
|
|
display_bus = displayio.FourWire(
|
|
spi, command=tft_dc, chip_select=tft_cs, reset=board.D6
|
|
)
|
|
|
|
# display setup
|
|
display = ST7789(display_bus, width=240, height=240, rowstart=80)
|
|
|
|
bitmap, palette = adafruit_imageload.load("/partyParrotsSmol.bmp",
|
|
bitmap=displayio.Bitmap,
|
|
palette=displayio.Palette)
|
|
|
|
# Create a TileGrid to hold the bitmap
|
|
parrot0_grid = displayio.TileGrid(bitmap, pixel_shader=palette,
|
|
tile_height=32, tile_width=32)
|
|
|
|
# Create a Group to hold the TileGrid
|
|
group = displayio.Group(scale=4, x = 64, y = 32)
|
|
|
|
# Add the TileGrid to the Group
|
|
group.append(parrot0_grid)
|
|
|
|
# Add the Group to the Display
|
|
display.root_group = group
|
|
|
|
# setup button pins
|
|
key_pins = (
|
|
board.A0,
|
|
board.A1,
|
|
board.A2,
|
|
board.A3,
|
|
)
|
|
|
|
# create keypad
|
|
keys = keypad.Keys(key_pins, value_when_pressed=False, pull=True)
|
|
|
|
p = 0 # variable for tilegrid index
|
|
|
|
while True:
|
|
|
|
# get keypad inputs
|
|
event = keys.events.get()
|
|
if event:
|
|
# if a key is pressed..
|
|
if event.pressed:
|
|
# if a midi keyboard
|
|
if midi_mode:
|
|
# send note number
|
|
midi.send(NoteOn(midi_notes[event.key_number], 120))
|
|
# if hid keyboard
|
|
if keyboard_mode:
|
|
# send hid keyboard shortcut
|
|
keyboard.send(ctrl, shortcuts[event.key_number])
|
|
# advance parrot index
|
|
p = (p + 1) % 10
|
|
# update parrot bitmap
|
|
parrot0_grid[0] = p
|
|
# if a key is released
|
|
if event.released:
|
|
# if a midi keyboard
|
|
if midi_mode:
|
|
# send note off message
|
|
midi.send(NoteOff(midi_notes[event.key_number], 120))
|