【Godot4】MIDIコントローラーの入力を受け取る

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【Godot4】MIDIコントローラーの入力を受け取る

2023-8-11 | , ,

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("--", )

このスプリプトを適当なNodeControlにスクリプトをアタッチしてシーンを実行すると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イベントがノートのオン・オフだった場合にどの鍵盤だったか。0127int。440hz(4A)は69

velocity

受信したMIDIイベントがノートのオン・オフだった場合の打鍵の強さ。0127int
MIDIコントローラーによってはvelocityが固定値のものもある。(古い&廉価モデルのシンセサイザーがその傾向)

pressure

受信したMIDIイベントがノートのオン・オフだった場合の打鍵の押し込み具合的な。0127int
MIDIコントローラーによってはpressureに対応しておらず固定値0のものもある。

instrument

受信したMIDIイベントの楽器の番号。0127int

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コントローラーを使ったゲームとかアプリを作るのに使えるかもね!

参考・引用文献

下記の公式のドキュメントが参考になりました。