MidiKeyboardComponent详解

MidiKeyboardComponent

MidiKeyboardComponent是一个可视组件,其外观为一个128键的MIDI键盘,鼠标指向或点击某个键时,该键的背景色默认变为黄色。可设置键盘的放置方向和键的颜色。本组件持有一个MidiKeyboardState对象,用来显示键按下和键抬起的状态,并将产生的MIDI消息发送给该对象,或者接受该对象的noteOn()或noteOff()函数所产生的MIDI消息。

继续阅读MidiKeyboardComponent详解

JUCE类库MIDI类群 2-2

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

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

继续阅读JUCE类库MIDI类群 2-2

JUCE类库MIDI类群 2-1

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

/** 创建一条MIDI消息,0x90为第一通道,0x91为第二通道,0x92为第三通道,以此类推。
如果设置为0x99,即第十通道,则GM协议默认为打击乐器,此时将忽略programChange()所设置的音色60为MIDI音符的编号(MIDI音高),100为该音符的力度,0为时间戳(位置信息)*/

MidiMessage playMessage (0x90, 60, 100, 0);

继续阅读JUCE类库MIDI类群 2-1

MIDI编程的基础常识 2-2

  • SMF:标准MIDI文件(Standard MIDI File),二进制文件,扩展名为“.mid”。格式1为通道分轨,格式0为所有通道集中为一轨。
  • 采用格式1的MIDI文件,其每一轨通常以这些MIDI消息作为其参数:Program Change, Volume, Pan, Reverb, Chorus等等。
  • 时间戳(Time Stamp):每个MIDI消息均有一个时间戳信息,该信息标示了本条消息所执行的时间点,亦即本条消息在MIDI序列中的“位置”。

继续阅读MIDI编程的基础常识 2-2

MIDI编程的基础常识 2-1

以下为本人(Running)在MIDI及相关软插件设计开发过程中的部分随记和备注,未仔细整理,有点乱。可能有错漏,请酌情参考。

传统上,MIDI编程需具备良好的十六进制基础,熟练掌握Bit、Byte等概念与C/C++语言的位运算。MIDI的本质是计算机和MIDI设备的通信,即字节序列的发送和接收。序列中的数据以MIDI消息为单位,1条MIDI消息由3个字节构成,分别为:

继续阅读MIDI编程的基础常识 2-1

AudioPluginFormat类群详解

本小节内容与开发独立插件基本无关,与宿主平台的插件管理关系密切。所涉及的类:

  • AudioPluginFormat 代表某种插件格式,比如:VST、AU等等
  • AudioPluginFormatManager 保存并管理本机所有可用的插件格式
  • KnownPluginList 持有并可管理本机所有可用的插件实例
  • PluginDirectoryScanner 扫描某个目录,将可识别的插件添加到KnownPluginList
  • PluginListComponent 专门显示插件列表的高级UI组件,可扫描、添加、排序插件

继续阅读AudioPluginFormat类群详解

AudioProcessor类群详解 5-4

AudioPluginInstance

AudioPluginInstance是AudioProcessor的直接派生类之一,该类也是一个抽象基类,代表某个音频插件。该插件是逻辑意义上的,可以是外部需动态加载的插件,也可以是程序内部的处理模块或总输入/输出节点。

AudioPluginInstance没有实现基类的任何一个函数,其新增的成员函数为:

继续阅读AudioProcessor类群详解 5-4