public class VoiceStatus extends Object
VoiceStatus
对象包含有关由Synthesizer
生成的其中一个语音的当前状态的信息 。
MIDI合成器通常能够产生一些最大数量的同时音符,也称为声音。 声音是连续的单音符流,将进入的MIDI音符分配给特定语音的过程称为语音分配。 然而,语音分配算法和每个声音的内容通常是MIDI合成器的内部并且从外部视图隐藏。 当然,可以从MIDI信息中学习合成器正在播放的信息,也可以推断出声音分配的内容。 但是MIDI本身并没有提供一种方法来报告一个合成器分配给哪个声音的音符,甚至没有报告合成器能够合成多少个声音。
然而,在Java Sound中, Synthesizer
类可以通过其getVoiceStatus()
方法公开其语音内容。 此行为被推荐但可选; 不暴露其语音分配的合成器只需返回一个零长度的数组。 一个Synthesizer
,做报告其声音状态应该时刻保持信息的所有的声音,无论是当前发声与否。 换句话说,给定类型的Synthesizer
总是具有固定数量的声音,等于能够发声的同时音符的最大数量。
如果声音当前未处理MIDI音符,则视为无效。 当没有给出注释命令时,或接收到的每个音符开启命令已被相应的音符关闭(或通过“所有音符关闭”消息)终止时,语音不活动。 例如,当能够播放16个同时音符的合成器被告知要播放四音弦时,会发生这种情况。 在这种情况下,只有四个声音是活跃的(假设以前的音符还在播放)。 通常情况下,一个声音的状态被报告为活跃的是产生可听见的声音,但并不总是如此; 它取决于仪器的细节(即合成算法)以及音符的持续时间。 例如,声音可以合成单手掌的声音。 因为这个声音很快就会消失,所以在接收到一个音符关闭消息之前,这个声音可能会听不见。 在这种情况下,声音仍然被认为是活跃的,即使没有声音正在产生。
除了主动或非活动状态, VoiceStatus
课程还提供显示语音当前MIDI通道,银行和程序编号,MIDI音符编号和MIDI音量的字段。 所有这些都可以在声音的过程中改变。 当声音不活动时,这些字段中的每一个都具有未指定的值,因此您应首先检查活动字段。
public boolean active
public int channel
MidiChannel
, active
public int bank
SoundBank
对象。
如果语音处于活动状态,则取值范围为0〜16383,如果语音处于非活动状态,则取值范围为未指定。
Patch
, Soundbank
, active
, MidiChannel.programChange(int, int)
public int program
MidiChannel.getProgram()
, Patch
, active
public int note
MidiChannel.noteOn(int, int)
,
active
public int volume
请注意,该值不一定反映这种声音产生的声音的瞬时水平; 该水平是许多因素的结果,包括当前仪器和其产生的幅度包络的形状。
active