870920 Menu

Synthesiser类群详解 3-3

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

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

Synthesiser是一个独立的功能类,既无基类,也无子类(但该类有虚函数,析构函数也为虚。因此,意味着可派生其子类,当然也可直接使用)。该类的主要作用是:接收MIDI消息,产生对应的音频数据,这些音频数据以AudioSource的固有方式发送出去,即:AudioSource的数据来源为本类,经过内部处理和转换后,以音频流的形式发送出去,供程序中的其他模块使用。在此期间,Synthesiser类可对所接收的MIDI消息进行各种控制。

通常,在自定义的AudioSource类中组合本类对象,该类的getNextAudioBlock()函数中,将本类对象所持有的音频数据发送到该函数的参数中(执行的结果是:AudioSource依据本类所持有的数据产生连续不断的音频流)。示例如下。

1、自定义AudioSource类,用于产生对应MIDI事件的音频流(MIDI发声):

2、构造函数中,Synthesiser对象添加声部(确定合成器的最大复音数)和音频采样:

3、实现基类的3个纯虚函数(releaseResources()函数是空继承,见类定义):

仅仅调用了Synthesiser的4个成员函数即完成了一个软件采样器的最核心类,方便简单!

Synthesiser类的主要成员函数及使用技巧(网站发布,略)