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 检查检测到哪些设备。

GDScriptC#

  1. func _ready():
  2. OS.open_midi_inputs()
  3. print(OS.get_connected_midi_inputs())
  4. func _input(input_event):
  5. if input_event is InputEventMIDI:
  6. _print_midi_info(input_event)
  7. func _print_midi_info(midi_event: InputEventMIDI):
  8. print(midi_event)
  9. print("Channel " + str(midi_event.channel))
  10. print("Message " + str(midi_event.message))
  11. print("Pitch " + str(midi_event.pitch))
  12. print("Velocity " + str(midi_event.velocity))
  13. print("Instrument " + str(midi_event.instrument))
  14. print("Pressure " + str(midi_event.pressure))
  15. print("Controller number: " + str(midi_event.controller_number))
  16. print("Controller value: " + str(midi_event.controller_value))
  1. public override void _Ready()
  2. {
  3. OS.OpenMidiInputs();
  4. GD.Print(OS.GetConnectedMidiInputs());
  5. }
  6. public override void _Input(InputEvent @event)
  7. {
  8. if (@event is InputEventMIDI midiEvent)
  9. {
  10. PrintMIDIInfo(midiEvent);
  11. }
  12. }
  13. private void PrintMIDIInfo(InputEventMIDI midiEvent)
  14. {
  15. GD.Print(midiEvent);
  16. GD.Print($"Channel {midiEvent.Channel}");
  17. GD.Print($"Message {midiEvent.Message}");
  18. GD.Print($"Pitch {midiEvent.Pitch}");
  19. GD.Print($"Velocity {midiEvent.Velocity}");
  20. GD.Print($"Instrument {midiEvent.Instrument}");
  21. GD.Print($"Pressure {midiEvent.Pressure}");
  22. GD.Print($"Controller number: {midiEvent.ControllerNumber}");
  23. GD.Print($"Controller value: {midiEvent.ControllerValue}");
  24. }

请注意,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 的速度是否为零)。

Previous Next


© 版权所有 2014-present Juan Linietsky, Ariel Manzur and the Godot community (CC BY 3.0). Revision b1c660f7.

Built with Sphinx using a theme provided by Read the Docs.