Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

InputEventMIDI

继承: InputEvent < Resource < RefCounted < Object

代表来自 MIDI 设备的输入事件,例如钢琴。

描述

InputEventMIDI 允许从钢琴等 MIDI(Musical Instrument Digital Interface)设备接收输入事件。

MIDI 信号可以通过 5 针 MIDI 连接器或 USB 发送,如果你的设备支持这两种方式,请务必检查设备中的设置以查看它使用的是哪种输出。

要从 MIDI 设备接收输入事件,需要调用 OS.open_midi_inputs。可以使用 OS.get_connected_midi_inputs 检查检测到哪些设备。

func _ready():
    OS.open_midi_inputs()
    print(OS.get_connected_midi_inputs())

func _input(input_event):
    if input_event is InputEventMIDI:
        _print_midi_info(input_event)

func _print_midi_info(midi_event: InputEventMIDI):
    print(midi_event)
    print("Channel " + str(midi_event.channel))
    print("Message " + str(midi_event.message))
    print("Pitch " + str(midi_event.pitch))
    print("Velocity " + str(midi_event.velocity))
    print("Instrument " + str(midi_event.instrument))
    print("Pressure " + str(midi_event.pressure))
    print("Controller number: " + str(midi_event.controller_number))
    print("Controller value: " + str(midi_event.controller_value))

请注意,Godot 目前不支持 MIDI 输出,因此无法从 Godot 发出 MIDI 信号。只有 MIDI 输入有效。

教程

属性

int

channel

0

int

controller_number

0

int

controller_value

0

int

instrument

0

MIDIMessage

message

0

int

pitch

0

int

pressure

0

int

velocity

0


属性说明

int channel = 0

  • void set_channel ( int value )

  • int get_channel ( )

这个输入事件的 MIDI 通道。总共有 16 个通道,所以这个值的范围是 0 到 15。MIDI 通道 9 是为打击乐器保留的,其余通道供非打击乐器使用。


int controller_number = 0

  • void set_controller_number ( int value )

  • int get_controller_number ( )

如果消息是 @GlobalScope.MIDI_MESSAGE_CONTROL_CHANGE,则表示控制器号,否则为零。控制器包含踏板、推杆等设备。


int controller_value = 0

  • void set_controller_value ( int value )

  • int get_controller_value ( )

如果消息是 @GlobalScope.MIDI_MESSAGE_CONTROL_CHANGE,则表示控制器值,否则为零。控制器包含踏板、推杆等设备。


int instrument = 0

  • void set_instrument ( int value )

  • int get_instrument ( )

这个输入事件的乐器。这个值的范围是 0 到 127。乐器列表请参考维基百科的 General MIDI 文中的乐器列表,不过这个值是从 0 开始的,所以请把那张表中的数字都减一。标准钢琴的乐器号为 0。


MIDIMessage message = 0

返回表示这个 MIDI 信号类型的值,是 MIDIMessage 枚举的成员。

对于在 0x80 和 0xEF 之间的 MIDI 消息,这个值返回的是左半部分的比特位,另一半是通道(例:0x94 会变成 0x9)。对于在 0xF0 到 0xFF 之间的 MIDI 消息,这个值是原样返回的。

激活音符时会返回 @GlobalScope.MIDI_MESSAGE_NOTE_ON,但失活时并不一定会返回 @GlobalScope.MIDI_MESSAGE_NOTE_OFF,因此你的代码应该在经过一段时间后将输入处理为停止。

有些 MIDI 设备可能发送速度为零的 @GlobalScope.MIDI_MESSAGE_NOTE_ON 来代替 @GlobalScope.MIDI_MESSAGE_NOTE_OFF

更多消息请参阅 velocity 中的备注,以及上面链接的 MIDI 消息状态字节列表。


int pitch = 0

  • void set_pitch ( int value )

  • int get_pitch ( )

这个 MIDI 信号的音高索引号。这个值的范围为 0 到 127。在钢琴上,中央 C 是 60,而 A440 是 69,更多信息请参阅维基百科钢琴琴键频率表的“MIDI 音符”列。


int pressure = 0

  • void set_pressure ( int value )

  • int get_pressure ( )

MIDI 信号的压力。这个值在 0 到 127 之间。对于很多设备,这个值总是 0。


int velocity = 0

  • void set_velocity ( int value )

  • int get_velocity ( )

MIDI 信号的速度。这个值在 0 到 127 之间。对于钢琴,这对应的是按键有多快,实际很少超过 110。

注意:部分 MIDI 设备可能会发送速度为零的 @GlobalScope.MIDI_MESSAGE_NOTE_ON 并期望进行和 @GlobalScope.MIDI_MESSAGE_NOTE_OFF 一样的处理,但因设备实现而异,所以 Godot 会原样汇报事件数据。根据硬件和游戏/应用的需求的不同,可以用几行脚本来可靠地处理这种 MIDI 特质(检查 @GlobalScope.MIDI_MESSAGE_NOTE_ON 的速度是否为零)。