DeletedAtShutdown 自销毁类

DeletedAtShutdown虽非抽象类,但无法显式创建对象(构造函数与析构函数均为protected)。显然,该类只可作为基类使用。所有继承自DeletedAtShutdown的派生类,其堆对象均无需显式销毁,程序退出时自动释放该对象所占用的内存并交还给操作系统,不会出现内存泄露的问题。

如果某个自定义类需创建堆对象,又不便确定何时由何类来销毁,则可继承此类。比如:不打算显式销毁的单例类。

继续阅读DeletedAtShutdown 自销毁类

JUCE类库之FileLogger详解

除了可使用DBG()宏将调试信息输出到控制台之外,还可将调试数据、程序运行时所产生的数据、各种状态值等信息输出到磁盘文件,以方便查看并分析程序的调试信息和执行结果。此功能需两个类来完成:抽象基类Logger及其派生类FileLogger。无需显式创建对象,只需直接调用这两个类的静态函数即可实现文件日志功能。具体流程有三:

继续阅读JUCE类库之FileLogger详解

JUCE类库Time类详解

日期和时间类Time的实例代表一个精确的绝对时间点,其内部精度为毫秒 。可基于给出的毫秒数创建本类的对象,也可基于给出的年月日时分秒来创建对象。本类的一大批成员函数可返回当前对象所代表的年/月/日/时/分/秒/毫秒的数值类型和字符串类型,该对象所处于的月份名称,星期几名称,是本年度/本月/本周的第几天等等。并可设置计算机时钟。

实际编程中,几乎无需显式创建Time对象,而是直接调用静态函数getCurrentTime()来返回本类的栈对象,而后使用该对象串联调用其它非静态函数。Time类重载了一大批运算符,可用于和时间点有关的各类常规运算。

继续阅读JUCE类库Time类详解

JUCE类库之Random详解

Random类可生成整型、浮点型、bool型、BigInteger大整数类型的(伪)随机数。可直接使用其静态方法getSystemRandom()获取一个整型(伪)随机数:

// 返回0到maxValue(不含)之间的一个随机整数
Random::getSystemRandom().nextInt(maxValue); 

基于非固定的“种子”可得到更“随机”而不可预测的随机数(伪随机数皆可预测)。此时需实例化一个Random对象:

/* Time::currentTimeMillis()返回1970年1月1日0时0分0秒至今的毫秒数,类型为long long。该类型在JUCE中定义为独立于平台的64位整型:int64 */
Random*  random = new Random (Time::currentTimeMillis());
int64 aValue = random->nextInt64();

继续阅读JUCE类库之Random详解

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