https://notyet-maker.blogspot.com/2025/08/blog-post_15.html
で、ギター風 電子楽器の部品を再選定したが、まずは、Wio Terminal単体で動作確認をしてみようと思った。
ChatGPTによると、USB-MIDIというものが使えるそうで、Wio Terminalの操作で、Chromebookから音を再生してみようと思う。
midi.city というサイトの利用を提案された。
右下の INPUT を選択すると、SEEEDUINO WIO TERMINAL MIDI 1 が認識されている。
次に、Wio Terminal側で adafruit_midi を使い、Ch.1でNoteOn/NoteOffメッセージを送信するコードをREPLで実行する。
(コードはChatGPTが生成。)
まずは、送信テスト。
///// コードここから /////
# 出力(PortOut)を自動選択し、C4を1秒だけ鳴らして止める簡易テスト
import time, usb_midi
from adafruit_midi import MIDI
from adafruit_midi.note_on import NoteOn
from adafruit_midi.note_off import NoteOff
outs = [p for p in usb_midi.ports if hasattr(p, "write")]
print("ports:", usb_midi.ports)
print("outs:", outs)
if not outs:
raise RuntimeError("送信できるUSB-MIDIポート(PortOut)が見つかりません")
midi = MIDI(midi_out=outs[0], out_channel=0) # ch1固定
print("TX test on PortOut:", outs[0])
midi.send(NoteOn(60, 100)) # C4
time.sleep(1.0)
midi.send(NoteOff(60, 0))
print("Sent NoteOn/Off C4 on ch1")
///// コードここまで /////
MIDI Input Debugger に、
Latest Input Channel: 1 (success)
と表示された。
さらに、
///// コードここから /////# Wio Terminal / CircuitPython
# BUTTON_1/2/3 = C4/D4/E4(押している間だけ)、
# SWITCH_UP/DOWN = CC#7 音量±8、SWITCH_PRESS = Panic(All Notes Off)
import time, board, keypad, usb_midi
from adafruit_midi import MIDI
from adafruit_midi.note_on import NoteOn
from adafruit_midi.note_off import NoteOff
from adafruit_midi.control_change import ControlChange
from adafruit_midi.all_notes_off import AllNotesOff
# ---- 送信ポート自動選択(PortOutだけ抽出) ----
outs = [p for p in usb_midi.ports if hasattr(p, "write")]
if not outs:
raise RuntimeError("USB-MIDIの送信ポート(PortOut)が見つかりません")
midi = MIDI(midi_out=outs[0], out_channel=0) # ch1
# ---- 入力(3ボタン+上下+中央) ----
KEYS = (
board.BUTTON_1, # ド C4
board.BUTTON_2, # レ D4
board.BUTTON_3, # ミ E4
board.SWITCH_UP, # Volume +
board.SWITCH_DOWN, # Volume -
board.SWITCH_PRESS, # Panic
)
km = keypad.Keys(KEYS, value_when_pressed=False, pull=True)
IDX_C, IDX_D, IDX_E, IDX_VOL_UP, IDX_VOL_DN, IDX_PANIC = range(len(KEYS))
# ---- ノート/音量 ----
NOTE_C4, NOTE_D4, NOTE_E4 = 60, 62, 64
BUTTON_NOTE = {IDX_C: NOTE_C4, IDX_D: NOTE_D4, IDX_E: NOTE_E4}
velocity = 96
volume = 100
VOL_STEP = 8
active = set()
def send_volume():
global volume
volume = max(0, min(127, volume))
midi.send(ControlChange(7, volume))
# 起動時に音量を通知
send_volume()
print("Ready: BUTTON_1/2/3=C/D/E, UP/DOWN=Vol, PRESS=Panic")
while True:
ev = km.events.get()
if ev:
# ド・レ・ミ(押している間だけ)
if ev.key_number in (IDX_C, IDX_D, IDX_E):
note = BUTTON_NOTE[ev.key_number]
if ev.pressed:
midi.send(NoteOn(note, velocity))
active.add(note)
else:
midi.send(NoteOff(note, 0))
active.discard(note)
# 音量(CC#7)
elif ev.key_number == IDX_VOL_UP and ev.pressed:
volume = min(127, volume + VOL_STEP); send_volume()
elif ev.key_number == IDX_VOL_DN and ev.pressed:
volume = max(0, volume - VOL_STEP); send_volume()
# Panic(全ノート停止)
elif ev.key_number == IDX_PANIC and ev.pressed:
midi.send(AllNotesOff(0))
for n in list(active):
midi.send(NoteOff(n, 0))
active.clear()
time.sleep(0.003)
///// コードここまで /////で、Wio Terminal上部の3つのボタンを押すと、Chromebookからドレミの音が出た。
5方向スイッチで、音量操作したかったが、どうもCircuitPythonでは対応していないようだ。
0 件のコメント:
コメントを投稿