标签归档:合成器

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

AudioProcessor类群详解 5-4

AudioPluginInstance

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

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

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

AudioProcessor类群详解 5-3

AudioProcessorGraph是AudioProcessor的直接派生类之一,可添加并连接一到多个AudioProcessor(甚至可以添加本类的另一个对象),而后集中产生最终的音频流。所添加的每个AudioProcessor,可以是程序内部的音频处理模块(AudioProcessor的派生类的对象),也可以是外部的音频插件或MIDI音源。也就是说,本类相当于一个元素为AudioProcessor的数据容器。

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