Skip to content

Instantly share code, notes, and snippets.

@sugarflower
Last active December 15, 2023 17:36
Show Gist options
  • Save sugarflower/9595591ed15278a5fba034d1a6db66e5 to your computer and use it in GitHub Desktop.
Save sugarflower/9595591ed15278a5fba034d1a6db66e5 to your computer and use it in GitHub Desktop.

Pico RGB Keypad Base

さて、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']

どのキーが押されたかを判別しないといけないのでそれっぽいnumberget_number()の両方を試したところ どちらも動作は変わらないようです。のでkey.numberとしてキー番号を取得することにします。

usb-midiのライブラリ導入

CircuitPython Libraries

ここから適当なバージョンを取得します。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を選びパッドを捺してみるとしっかり機能しているようです。
ものすごいお手軽でいい感じですね。

ひとまず動作確認は出来ましたがこのままではただの高いおもちゃなのでしっかり使えるようにしてゆこうというのが次のステップです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment