RPi Pico でmidiドラム(タッチセンサー)

目次
以前に作った、USB MIDI IF のドラム。
MacやiPadで、USB MIDI キーボードとして認識され、キーを押すと、音が鳴る。
そういえば、aitendoのセールで買ったタッチセンサーがあったので、試す。
静電容量方式タッチセンサー
常に静電気を帯びている人体が、センサに近づくと検知できる。

セールで、495円が199円。お得ー!と購入したけど、現在は195円で新製品がでてる。。
コントローラチップTTP223の仕様によると、レスポンスはmaxで以下の通り。
- 3.3V Low Modeで 220msec
- 5V Fast Modeで60msec
内部のセンサーは、Fast Modeの場合、20mesc毎に値をチェックしているのでそんなものかも。
配線
- GP0 ... センサーの
SIG - VBUS ... センサーの
VCC - GND ... センサーの
GND
プログラム
circuitpython でさくっと。
midi_touch_drum.py · Gistpython
import board
import busio
import digitalio
import time
import usb_midi
import adafruit_midi
from adafruit_midi.note_off import NoteOff
from adafruit_midi.note_on import NoteOn
# pitch class
C2 = 50
D2 = 52
E2 = 54
G2 = 55
A3 = 57
B3 = 59
C3 = 60
D3 = 62
E3 = 64
F3 = 65
F3S = 66
G3 = 67
A3 = 69
B3 = 71
C4 = 72
D4 = 74
E4 = 76
# key1 and key2 note
CHORDS = [C2, D2]
class MidiDrum:
def __init__(self):
# KEY1=GP0, KEY2=GP1
self.keys_ = []
for pin in (board.GP0, board.GP1):
key = digitalio.DigitalInOut(pin)
key.switch_to_input(pull=digitalio.Pull.DOWN)
self.keys_.append(key)
#
# USB MIDI up on channel 0
# doc: https://circuitpython.readthedocs.io/projects/midi/en/latest/api.html
#
self.midi_ = adafruit_midi.MIDI(midi_out=usb_midi.ports[1], out_channel=0)
def is_key_press(self):
is_pressed = []
for key in self.keys_:
# press True, release False
is_pressed.append(key.value)
return is_pressed
if __name__ == "__main__":
# key press LED
led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT
mk = MidiDrum()
current_key_statuses = [False, False]
while True:
# get current key press or release
is_presses = mk.is_key_press()
is_changes = [False, False]
# check changed to press or release
for no, is_press in enumerate(is_presses):
if current_key_statuses[no] != is_press:
is_changes[no] = True
current_key_statuses[no] = is_press
if is_changes[0] or is_changes[1]:
for no in range(len(CHORDS)):
if not is_changes[no]:
continue
is_pressed = current_key_statuses[no]
print("key {} press {} {}".format(no, is_pressed, CHORDS[no]))
if is_pressed:
led.value = True
mk.midi_.send(NoteOn(CHORDS[no], 127))
else:
led.value = False
mk.midi_.send(NoteOff(CHORDS[no], 0))Mac のGarageBandでdemo
Macに繋ぐと自動的にMIDIキーボードとして認識されるので、GarageBandを起動して打ち込む。
感想
クリック音がなく、ダイレクトに音源の音が実感できて気持ちがいい。
けど、やっぱりwireless の操作しやすさにはかなわない。 ちゃんとしたenclosure(ケース)を作って、持ちやすくすればいいかも。
このセンサーを前回のM5StickC に接続することもできるが、演奏中の取り回しを考えると、enclosure次第。
