Godot4でMIDIコントローラーの入力を受け取ってなんらかの処理をしたい!
概要
今回の記事では、Godot4でMIDIコントローラーの入力を受け取ってなんらかの処理をする手順を掲載する。
MIDIコントローラーってのは下記のような感じ。
これはMIDIキーボードと呼ばれるタイプのもの。見た目のとおりでピアノ的に音階の入力などに使われる。
これはMIDIパッドコントローラーと呼ばれるタイプのもの。
左半分の部分のパッドがキーボードの鍵盤的な役割になってる。ドラムの入力などに使われがち。
右半分のノブは設定したパラメーターを操作するのに使う。アナログシンセサイザーでいうとフィルターやレゾナンスをこれで操作したりする。
これらからの入力をGodotで受け取りたい!
仕様書
環境
- Gogot 4.1
手順書
MIDI入力は、Windows、macOS、Linuxなどデスクトップあぷりのみに対応してて、AndroidやiOSなどのモバイルアプリには非対応。
MIDIコントローラーからの入力をエディターのOutputに出力するサンプル。
extends Control
func _ready():
print("MidiInput")
OS.open_midi_inputs()
print(OS.get_connected_midi_inputs())
func _input(event):
if event is InputEventMIDI:
#var now = OS.get_datetime()
var now = Time.get_datetime_dict_from_system()
print(now)
print("%04d-%02d-%02d %02d:%02d:%02d"%[now["year"], now["month"], now["day"], now["hour"], now["minute"], now["second"]])
print(event)
print("channel: ", event.channel)
print("pitch: ", event.pitch)
print("velocity: ", event.velocity)
print("message: ", event.message)
print("instrument: ", event.instrument)
print("pressure: ", event.pressure)
print("--", )
このスプリプトを適当なNode
やControl
にスクリプトをアタッチしてシーンを実行するとPCに接続されてるMIDIコントローラーの一覧が表示される。その後、MIDIコントローラーの鍵盤などから入力があるとエディターのOutputに下記のように出力される。
yyyy-MM-dd HH:mm:ss
InputEventMIDI: channel=0, message=8, pitch=78, velocity=51, pressure=0, controller_number=0, controller_value=0
channel: 0
pitch: 78
velocity: 51
message: 8
instrument: 0
pressure: 0
--
...
一点注意なのが、FL StudioなどのDAWが起動してるとMIDIコントローラーを排他制御してるのかGodotではMIDIコントローラーを認識しなくなるのでDAWは閉じておく。また、逆も然り。(DAWよりも先にGodotでMIDIコントローラーを使ってるとDAWの方で使えなくなる可能性)
各プロパティの簡単な説明
MIDIの説明はそれだけで書籍が書けそうな文量があるので簡単に。そもそも私も全部は理解してない悲しみ。
pitch
受信したMIDIイベントがノートのオン・オフだった場合にどの鍵盤だったか。0
~127
のint
。440hz(4A)は69
。
velocity
受信したMIDIイベントがノートのオン・オフだった場合の打鍵の強さ。0
~127
のint
。
MIDIコントローラーによってはvelocity
が固定値のものもある。(古い&廉価モデルのシンセサイザーがその傾向)
pressure
受信したMIDIイベントがノートのオン・オフだった場合の打鍵の押し込み具合的な。0
~127
のint
。
MIDIコントローラーによってはpressure
に対応しておらず固定値0
のものもある。
instrument
受信したMIDIイベントの楽器の番号。0
~127
のint
。
General MIDIというMIDIの規格で番号に楽器が割り当てられてて、この規格に対応した楽器ではその割当てられてる楽器の音が鳴るといったような感じ。0
番だとアコースティックピアノ、36
番だとフレットレスベースみたいな感じ。詳細は下記を参照。
ゲームアプリでは使わなそう。
message
受信したMIDIイベントの種類が列挙型MIDIMessage
で送られてくる。よく使いそうなものから一部を載せる。
MIDIMessage | int | 説明 |
---|---|---|
MIDI_MESSAGE_NOTE_OFF |
8 |
鍵盤を離した |
MIDI_MESSAGE_NOTE_ON |
9 |
鍵盤を押した |
MIDI_MESSAGE_CONTROL_CHANGE |
11 |
ノブなどでパラメーターの変更があった |
MIDI_MESSAGE_PITCH_BEND |
14 |
ピッチベッド(鍵盤の左側にある動かすとセンターに戻ってくる方のやつ)の操作があった |
controller_number
受信したMIDIイベントのコントローラー番号。デバイスの番号ではなくて、MIDIでフィルターのカットオフやレゾナンスのパラメーターを変更できたりするんだけど、そのパラメーターの番号。
MIDIコントローラーだとノブやスライダーを動かした時にこのcontroller_number
と後述するcontroller_value
がセットで送信されてくる。はず。
controller_value
controller_number
はどのパラメーターなのかを表すのに対して、controller_value
はパラメーターの値になる。
まとめ(感想文)
MIDIコントローラーを使ったゲームとかアプリを作るのに使えるかもね!
参考・引用文献
下記の公式のドキュメントが参考になりました。