VoiceStatus 对象包含有关 Synthesizer 产生的声音之一的当前状态的信息。
MIDI 合成器通常能够同时产生一些最大数量的音符,也称为声音。声音是连续的单个音符流,将传入的 MIDI 音符分配给特定声音的过程称为声音分配。然而,语音分配算法和每个语音的内容通常是 MIDI 合成器内部的,并且对外部视图是隐藏的。当然,可以从合成器正在播放的音符的 MIDI 消息中学习,并且可以推断出一些关于音符分配给声音的信息。但是 MIDI 本身并没有提供一种方法来报告合成器将哪些音符分配给了哪个声音,甚至也没有报告合成器能够合成多少声音。
然而,在 Java Sound 中,Synthesizer 类可以通过其 getVoiceStatus() 方法公开其声音的内容。这种行为是推荐的但可选的;不公开其语音分配的合成器只返回一个零长度数组。确实报告其语音状态的 Synthesizer 应始终为其所有语音维护此信息,无论它们当前是否在发声。换句话说,给定类型的 Synthesizer 始终具有固定数量的声音,等于它能够同时发出的最大音符数量。
如果语音当前未处理 MIDI 音符,则认为它处于非活动状态。当没有给出音符打开命令时,或者当收到的每个音符打开命令都已被相应的音符关闭(或“所有音符关闭”消息)终止时,语音处于非活动状态。例如,当一个能够同时演奏 16 个音符的合成器被要求演奏一个四音符和弦时,就会发生这种情况;在这种情况下只有四个声音处于活动状态(假设没有更早的音符仍在播放)。通常,状态报告为活动的语音会发出可听见的声音,但这并不总是如此;这取决于乐器的细节(即合成算法)以及音符进行了多长时间。例如,语音可能正在合成单个拍手的声音。由于此声音消失得如此之快,因此在收到音符关闭消息之前可能会变得听不见。在这种情况下,即使当前没有发出声音,语音仍然被认为是活跃的。
除了活动或非活动状态外,VoiceStatus 类还提供显示语音当前 MIDI 通道、库和程序编号、MIDI 音符编号和 MIDI 音量的字段。所有这些都可以在语音过程中发生变化。当语音处于非活动状态时,这些字段中的每一个都有一个未指定的值,因此您应该首先检查活动字段。
- 参见:
-
字段摘要
字段 -
构造方法总结
构造方法 -
方法总结
-
字段详细信息
-
active
public boolean active指示语音当前是否正在处理 MIDI 音符。请参阅 活跃和不活跃的声音 的解释。 -
channel
public int channel播放此语音的 MIDI 通道。如果语音处于活动状态,则该值为从零开始的通道号,如果语音处于非活动状态,则该值为未指定。- 参见:
-
bank
public int bank此语音当前使用的乐器的库编号。这是一个由 MIDI bank-select 消息指定的数字;它不引用SoundBank对象。如果语音处于激活状态,取值范围为 0 到 16383,如果语音处于非激活状态,则不指定。- 参见:
-
program
public int program此语音当前使用的乐器的程序编号。如果语音处于活动状态,则该值的范围为 0 到 127,如果语音处于非活动状态,则该值未指定。- 参见:
-
note
public int noteMIDI 注意到这个声音正在播放。活跃声部的范围是从 0 到 127 半音,其中 60 指代中央 C。如果声部不活跃,则该值未指定。- 参见:
-
volume
public int volume语音的当前 MIDI 音量级别。如果语音处于活动状态,则该值的范围为 0 到 127,如果语音处于非活动状态,则该值未指定。请注意,此值不一定反映此语音产生的声音的瞬时电平;该水平是许多影响因素的结果,包括当前仪器及其产生的振幅包络的形状。
- 参见:
-
-
构造方法详细信息
-
VoiceStatus
public VoiceStatus()构造一个VoiceStatus
-