以前に作った、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次第。