标签归档:MIDI

Synthesiser类群详解 3-3

事实上,开发采样器程序时,很少直接操作SynthesiserSound和SynthesiserVoice这两个类,大多数时候,使用Synthesiser合成器类添加它们的对象即可完成任务。

Synthesiser相当于多个SynthesiserVoice和多个SynthesiserSound的容器,即:本类持有两个数组,一个用来保存SynthesiserVoice类的指针(堆对象),一个用来保存SynthesiserSound类的指针(堆对象)。内部使这两个类协同配合,产生本类所需的音频数据和相关信息。

继续阅读Synthesiser类群详解 3-3

Synthesiser类群详解 3-2

SynthesiserVoice

抽象类,该类可将所持有的SynthesiserSound渲染为Synthesiser所需的音频流。一个SynthesiserVoice相当于合成器发声时的一个声部,一个声部在同一时间产生一个SynthesiserSound所“描述”的声音。合成器持有一个声部数组,因此,可在同一时间播放多个声部,从而实现可同时发声的最大音符数,即MIDI音源的最大复音数。

继续阅读Synthesiser类群详解 3-2

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

JUCE类库MIDI方面的主要特色

  • 支持MIDI I/O,MAC和Linux下支持虚拟MIDI驱动。
  • 简单易用的MIDI封装,无需直接设置和操纵字节即可随意操作处理MIDI消息。
  • MIDI缓冲类可有效的采集并编辑MIDI数据流。
  • 直接提供了一个实用的虚拟键盘(高级GUI)。
  • MIDI进出监视类。
  • MIDI合并与重计时,可实现与音频的自动同步。
  • 读写标准MIDI格式。