如果经过了 10 秒钟时间,请将一个重置事件发送给 FluidSynth。这将清除仍在处理的所有剩余通知,即使它们已经减弱为听不见的音量级别。变量初始化后,与 us(用户 CPU 使用量)对应的通知将被 sendNote 命令激活。由于 us 字段的值总是在 0 到 100 之间,因此无需进行其他处理。只要使用 sendNote 子例程在通道 14 中发送通知速率,其中最低速率为 12,最高速率为 96。

在最初通知事件后,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 输出的。根据其他系统元素修改音量级别会是添加信息的直观方法,而无需添加通知或和声变化。


清单 6. getNetworkStats 子例程
sub getNetworkStats {
my $networkCmd = "/sbin/ifconfig eth0 | grep 'RX bytes'";
$networkCmd = `$networkCmd`;
my $rxBytes = 0;
my $txBytes = 0;
chomp($networkCmd);
for( $networkCmd ){
$rxBytes = substr($_, 19);
$rxBytes = substr($rxBytes,0,index($rxBytes," "));
$txBytes = substr($_, 52);
$txBytes = substr($txBytes,0,index($txBytes," "));
my $bothBytes = $rxBytes + $txBytes;
if( $totalPackets == 0 ){
$totalPackets = $bothBytes;
}else{
# find the difference between measurements, set maximum difference to
# 1Mbit, which works well for `saturated' on a 100Mbit/sec network
# reduce the value by a factor of 10000, which spreads the usage
# nicely over 1-100
my $diffRX = $bothBytes - $totalPackets;
if( $diffRX > 1000000 ){ $diffRX = 1000000 }
$diffRX = ($diffRX / 10000);
$totalPackets = $bothBytes;
return( $diffRX );
}# if not first packet check
}# packet count check
}#getNetworkStats





如果 obtuse 方法接近网卡的负载,则这段代码是简单的。/sbin/ifconfig/eth0 命令的输出将列出收到和传输的所有信息包总数。在网络连接速度为 100Mbit/sec 的测试计算机上,超过 1000,000 个传输或接收信息包的所有情况都被视为完全饱和。该值的范围随后会被调整为 0 到 100 之间的通知速率,并作为电子钢琴通知播放。