在最初通知事件后,vmstat 中的 bi(磁盘块入)和 bo(磁盘块出)数据字段将被聚结为范围在 0 到 1,000 的一个字段。请注意,这些值十分适于测试计算机的标准 IDE 磁盘设置。如果在整个磁盘子系统中有一个高磁盘配置或低磁盘配置,则可能需要修改最大值,以便更准确地表示可用带宽。一旦总磁盘使用量的范围落在 0 到 1,000 的范围内,就会被除以 10 以获得 0 到 100 之间的值。然后将在通道 8 中使用通常的最小值和最大值把此值作为通知速率发送。
getNetworkStats 部分略微更复杂,但正如您所见,返回的数据库值范围在 0 到 100 之间,并作为另一个 noteon 事件发送出去。注意此最后一个通知事件的最大值是 84。这是由于 SoundFont 仅在通道 5 中创建音频通知,音频速率范围从 0 到 84。这可以证明足以检测在最大负荷状态下和声中的变化的那些音频通知是表示有问题的。
在圈选循环括号和计时代码后,它就成为了子例程。
清单 5. sendNote 子例程
sub sendNote {
my( $noteVal, $noteChan, $min, $max ) = @_;
if( $noteVal < $min ){
$noteVal = $min;
}else{
# divide it into twelve parts
$noteVal = sprintf( "%0.0f", $noteVal/12);
# reduce the note to 12 at the very least;
$noteVal = ($noteVal * 12);
if( $noteVal > $max ) { $noteVal = $max }
}#if note is > minimum
print "noteon $noteChan $noteVal 100\n";
}#sendNote
sendNote 子例程将获得值在 0 到 100 之间的通知速率,并将把该通知速率转换为基本通知中最接近 12 的通知步骤。在这种情况下,基本通知是 12,并且所有通知都将使用该值作为其 0 状态。这就为系统处于低负载状态时提供了频率相当低的 “跳动”(如果为令人满意的固定状态赋予人性的话)。为简单起见,所有通知都是以音量级别 100 输出的。根据其他系统元素修改音量级别会是添加信息的直观方法,而无需添加通知或和声变化。