さて、CircuitPythonに置き換えて動作まで試したままだったpimoroniのRGB KeypadですがUSB-MIDIデバイスに仕上げてゆこうと思います。
CircuitPythonでPico RGB Keypad Baseを使えるようにするまではこちら
現在利用しているコードはこれです。
# SPDX-FileCopyrightText: 2021 Sandy Macdonald
#
# SPDX-License-Identifier: MIT
# This example demonstrates how to light keys when pressed.
# Drop the `keybow2040.py` file and `keybow_hardware` folder
# into your `lib` folder on your `CIRCUITPY` drive.
from keybow2040 import Keybow2040
#from keybow_hardware.pim56x import PIM56X as Hardware # for Keybow 2040
from keybow_hardware.pim551 import PIM551 as Hardware # for Pico RGB Keypad Base
# Set up Keybow
keybow = Keybow2040(Hardware())
keys = keybow.keys
# Use cyan as the colour.
rgb = (0, 255, 255)
while True:
# Always remember to call keybow.update() on every iteration of your loop!
keybow.update()
# Loop through the keys and set the LED to cyan if pressed, otherwise turn
# it off (set it to black).
for key in keys:
if key.pressed:
key.set_led(*rgb)
else:
key.set_led(0, 0, 0)
ボタンが押されたらmidi noteなりccなりを送信、としたいので見るべきは if key.pressed:
あたりです。
keyがどういう内容か見てみるとこのようになっていました。
['__class__', '__init__', '__module__', '__qualname__', '__str__', 'update',
'__dict__', 'pressed', 'state', 'x', 'y', 'rgb', 'number', 'set_led',
'hardware', 'time_of_last_press', 'time_since_last_press', 'lit', 'led_off',
'press_function', 'release_function', 'hold_function', 'last_state',
'time_held_for', 'held', 'hold_time', 'modifier', 'xy', 'get_xy',
'press_func_fired', 'hold_func_fired', 'debounce', 'key_locked', 'get_state',
'get_number', 'is_modifier', 'led_on', 'led_state', 'toggle_led']
どのキーが押されたかを判別しないといけないのでそれっぽいnumber
とget_number()
の両方を試したところ
どちらも動作は変わらないようです。のでkey.number
としてキー番号を取得することにします。
ここから適当なバージョンを取得します。CircuitPythonのバージョンに合わせたmpyのパッケージを取得しますが、
わたしのRaspberry Pi picoにはCircuitPython 8.2.8
が入っているのでBundle for Version 8.x
をダウンロードしました。
ダウンロードしたらzipを解凍してLibの中のadafruit_midi
をフォルダごとRaspberry Pi picoのLibの中に
コピーします。
まずインポートとか状態保持のための配列とか。 midiの初期化とか。
import usb_midi
import adafruit_midi
from adafruit_midi.note_on import NoteOn
from adafruit_midi.note_off import NoteOff
midi = adafruit_midi.MIDI(midi_out=usb_midi.ports[1], out_channel=0)
# midi keys
midi_keys = [False] * 16
次に、パッドが押されたときに、状態が変化したのかどうかをチェックして変化したならmidiを送信という処理を追加します。
for key in keys:
if key.pressed:
if midi_keys[key.number] == False:
midi_keys[key.number] = True
midi.send([NoteOn(60+key.number, 100)])
key.set_led(*rgb)
else:
if midi_keys[key.number] == True:
midi_keys[key.number] = False
midi.send([NoteOff(60+key.number, 0)])
key.set_led(0, 0, 0)
こんな感じですか。
とりあえずmidiノートナンバー60 + キーパッドの番号(0~15)という単純な処理にしてありますが。
利便性を考えるならオクターブを変えるなりキーに割り当てられている機能を切り替えられるとか諸々あった方がいいです。
今はひとまずテストということで。
DAWなんかでシンセのプラグインなどをインサートしてmidiデバイスにCircuitPython Audioを選びパッドを捺してみるとしっかり機能しているようです。
ものすごいお手軽でいい感じですね。
ひとまず動作確認は出来ましたがこのままではただの高いおもちゃなのでしっかり使えるようにしてゆこうというのが次のステップです。