chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

CirtuitPythonでMIDI Controllerを作る

CircuitPythonの組み込みライブラリには、USB MIDIがあり、AdaruitBundleも使うと簡単にMIDI Controllerが作れる。以下は、ボリュームの操作に応じて、MIDIのControl Changeを送信するアプリ

import time
import random
from analogio import AnalogIn

import usb_midi
import adafruit_midi 
from adafruit_midi.note_off import NoteOff
from adafruit_midi.note_on import NoteOn
from adafruit_midi.control_change import ControlChange

USB_MIDI_channel = 1 
usb_midi = adafruit_midi.MIDI(midi_out=usb_midi.ports[1], out_channel=USB_MIDI_channel - 1)


# MIDI Channel (from Adaruit: [Code USB MIDI in CircuitPython])
# 0 Bank Select
# 1 Modulation Wheel
# 2 Breath Controller
# 3 Undefined
# 4 Foot Controller
# 5 Portamento time
# 6 Data Entry Most Significant Bits
# 7 Volume
# 8 Balance
# 9 Undefined
# 10 Pan
# 11 Expression
# 12 Effect Controller 1
# 13 Effect Controller 2
# 14 Undefined
# 15 Undefined


CC_EXPRESSION=11

# range 0-127
MAX_VALUE = 127

knob0 = AnalogIn(board.A0)  # e0 - 0xffff


def ctrl_knob():
    prev_val = 0
    while True:
        level = knob0.value
        val = int(MAX_VALUE * level / 0xffff )
        if prev_val == val :         # or  abs(prev_val - val) < 2:
            pass
        else:
            usb_midi.send(ControlChange(CC_EXPRESSION, val))
            print(" cc:",val,end="")
        prev_val = val
        time.sleep(0.1)

ボリュームを操作すると、Control ChangeがPCに送信される。PC側ではDAWFL Studioが走っていて、Control ChangeがSpireのLowPassFilterのCut Off 周波数ボリュームに割り当てられている。ボリュームを操作すると、SpireのCut Off ボリュームが連動して動く。だから、ボリュームを回すとシンセの音が変わる。
普段だとマウスの上下操作でGUIのボリュームを操作するのだけど、どうも慣れないし、直感的ではない。だけど本物のボリュームをグリグリ回すと微妙な匙加減が可能にるし、自分の指で音色を作っている実感が沸いてくる。
システムの外観:Raspbery Pi Pico上でCircuitPythonを動かしていて、USB経由でPCと接続、PC上ではDAWFL Studioが動いている。FL Studio内で先日買ったSpireが動いている。

ご参考:
FL-Studioには、MIDIコントローラと、シンセのボリューム類とを紐づけるための機能(Multilink機能とか)があって、ボリュームボタンを押して、シンセのボリュームを操作ー>MIDIコントローラを操作 すると、2つの間で紐づけがなされる。一度学習させると、MIDIコントローラを操作すると、紐づけたシンセのボリュームが連動して動く。赤枠で囲んだ部分がマルチリンクのボタン

USBだとケーブルがぶらぶらするのがちょっとアレですが、、BLE MIDIと比べるとソースコードも極端に短いし(CircuitPythonとAdafruitのライブラリのお陰なのですが)、応答遅延も感じられないので、無理してBLEにしなくてもいいかと思うのでした。


参考記事
Adaruit: [Code USB MIDI in CircuitPython]
Code USB MIDI in CircuitPython | Grand Central USB MIDI Controller in CircuitPython | Adafruit Learning System