870920 Menu

JUCE类库MIDI类群 2-1

MidiMessage
代表一条MIDI消息,无父类亦无子类,提供了一大批静态函数和成员函数。本类有多个重载版本的构造函数,可基于给出的1到多个int变量创建单字节、2字节和3字节MIDI消息,或基于内存数据和另一个MIDI消息创建新的MIDI消息。示例:

MidiMessage的静态函数与成员函数详解:(网站发布,略)

MidiBuffer
MidiBuffer类似于AudioSampleBuffer,用来存放一批MIDI事件。添加MIDI事件时,忽略所有事件的时间戳,代之以位置信息(无单位的时间戳数据),并基于位置信息的值,对缓冲中的MIDI事件进行排序。

MidiBuffer类无父亦无子,构造函数无参。其成员函数:
 clear () 从缓冲中移除所有事件,重载版本可移除某个范围内的事件
 isEmpty () 如果缓冲是空的,则返回true
 getNumEvents () 返回缓冲中的MIDI事件的个数
 addEvent () 添加MIDI事件,给出位置信息,本类自动排序
 getFirstEventTime () 返回缓冲中第一个事件的位置信息
 getLastEventTime () 返回缓冲中最后一个事件的位置信息
 swapWith () 交换两个缓冲的内容
 ensureSize () 预分配缓冲所使用的内存空间

MidiBuffer有一个嵌套类:MidiBuffer::Iterator,该类相当于一个迭代器,专门用来遍历MidiBuffer中的事件。MidiBuffer::Iterator的成员函数:
 Iterator (MidiBuffer对象) 构造函数,用于遍历参数缓冲
 setNextSamplePosition () 定位到该处
 getNextEvent () 检索下一个事件。其数据与位置信息保存到给出的参数中

MidiMessageSequence
代表一个MIDI消息序列,该序列中的每个MIDI消息均有“位置”信息,该位置信息相当于一个无单位的MIDI时间戳(double值)。序列中的MIDI消息按时间戳大小自动排序。MidiFile类可使用本类读写标准的MIDI文件。

MidiMessageSequence无父无子,无参构造。其成员函数有:(略)

MidiFile

MidiFile用于读写标准格式的MIDI文件。使用本类的大体流程:
 读MIDI文件:先调用readFrom(),而后调用getTrack()获取给定音轨的MIDI消息序列
 写MIDI文件:先调用addTrack()添加MIDI消息序列,而后writeTo()将数据写入文件输出流

MidiFile类无父无子,无参构造。其成员函数有:(略)

MidiKeyboardState
代表MIDI键盘上的某个键按下和抬起的状态,即MIDI消息中的音符开和音符关信息的抽象表示。本类可绑定MidiKeyboardStateListener,当键按下或键抬起时,所产生的消息可被捕获并处理。

本类可基于noteOn()和noteOff()函数触发键抬起或按下,所产生的MIDI消息将由processNextMidiBuffer()合并到调用方所提供的MIDI缓冲对象中。还可基于MIDI数据流中的音符开关信息改变MIDI键盘上对应MIDI通道的键按下或抬起状态:
 外部MIDI键盘的键按下或键抬起等状态变化可通过本对象同步写入程序内部的MIDI缓冲中。
 程序内部MIDI数据中的音符开/关事件可通过本对象同步更新外部MIDI键盘的键按下或键抬起状态。

MidiKeyboardState无父类,亦无子类。构造函数无参。成员函数有:(略)

MidiKeyboardState在键抬起和键按下时所产生的消息被MidiKeyboardStateListener捕获并处理,前提有二:
 自定义类继承自MidiKeyboardStateListener,实现其纯虚函数
 MidiKeyboardState对象addListener (自定义类)

MidiKeyboardStateListener的两个纯虚函数为:
 handleNoteOn () 捕获并处理MidiKeyboardState的键按下消息
 handleNoteOff () 捕获并处理MidiKeyboardState的键抬起消息