870920 Menu

JUCE类库MIDI类群 2-2

MidiInput
如要实时接收外部MIDI输入设备的MIDI消息,则需使用MidiInput,该类代表一个MIDI输入设备,并保存MIDI输入设备所传来的MIDI消息。MidiInput无父无子,无需也不要调用构造函数显式创建对象。使用流程:

  • 使用静态函数getDevices()找出所有可用的MIDI输入设备;
  • 基于给出的索引,使用openDevice()函数打开设备;
  • openDevice()时,一并绑定MIDI输入回调类以捕获并处理本类所接收的MIDI消息。

MidiInput类的静态函数
 getDevices () 返回本机所有可用的MIDI输入设备,返回值为StringArray栈对象
 getDefaultDeviceIndex () 返回本机默认的MIDI输入设备的索引值
 openDevice (设备索引, MidiInputCallback对象) 打开某个MIDI输入设备,绑定捕获器
 createNewDevice () 创建一个新的MIDI输入设备(Windows系统下不可用)

MidiInput类的成员函数
 getName () 返回当前所使用的MIDI输入设备的名称
 setName () 设置当前所使用的MIDI输入设备的名称
 start () 开始运行当前所使用的MIDI输入设备
 stop () 停止运行当前所使用的MIDI输入设备

用于捕获并处理MidiInput的抽象基类MidiInputCallback,专用于同步接收MidiInput的MIDI消息。该类的成员函数为:
 handleIncomingMidiMessage () 纯虚函数,处理一条MIDI消息
 handlePartialSysexMessage () 处理系统专用信息

注意:MidiInput中的MIDI消息时间戳的值为:Time::getMillisecondCounter() / 1000.0(毫秒转秒数)

MidiMessageCollector
MidiKeyboardState和MidiInput均需要绑定捕获器(或者说是:添加或注册监听者)来处理本类所产生的消息或所接收的MIDI数据,其中,MIDI键盘状态类需绑定MidiKeyBoardStateListener,而MidiInput则需绑定MidiInputCallback,这两个捕获器均是抽象基类,使用时必须派生子类。有没有现成的类可用呢?当然有,而且该类还同时继承了这两个捕获器,此即MidiMessageCollector(MIDI消息采集器)。

MidiMessageCollector

图 3 16 MidiMessageCollector类的继承图示

MidiMessageCollector用于收集实时进入系统的MIDI消息和键盘状态,将这些消息添加到本类的缓冲队列中,而后在removeNextBlockOfMessages()函数中产生MIDI缓冲数据,所产生的数据供音频回调进行处理。

MidiMessageCollector的构造函数无参,其成员函数有:(网站发布,略)

MidiOutput

可对比MidiInput来理解MidiOutput,不同处:
 MidiInput代表一个MIDI输入设备,MidiOutput则代表一个MIDI输出设备
 MidiInput为无基类的独立类,而MidiOutput继承自Therad,本身即是一个后台线程
 MidiInput需绑定捕获器,用于获取外部的MIDI消息并转换为系统内部的MIDI缓冲,以供他用
 MidiOutput无需绑定捕获器,直接将MIDI消息或MIDI缓冲发给MIDI设备,发出声音。

MidiOutput无需也不能显式创建对象,除无需绑定捕获器之外,其使用流程与MidiInput完全一致:
 使用静态函数getDevices()找出所有可用的MIDI输入设备
 基于给出的索引,使用openDevice()函数打开设备
MidiOutput类的静态函数:
 getDevices () 返回本机所有可用的MIDI输出设备,返回值为StringArray栈对象
 getDefaultDeviceIndex () 返回本机默认的MIDI输出设备的索引值
 openDevice (设备索引值) 打开某个MIDI输出设备
 createNewDevice () 创建一个新的MIDI输出设备(Windows系统下不可用)

MidiOutput类的成员函数:(略)