模块  java.desktop
软件包  javax.sound.midi

Class VoiceStatus


  • public class VoiceStatus
    extends Object
    VoiceStatus对象包含有关Synthesizer生成的其中一个音色的当前状态的信息。

    MIDI合成器通常能够产生一些最大数量的同时音符,也称为语音。 语音是连续单个音符的流,并且将传入的MIDI音符分配给特定语音的过程称为语音分配。 然而,语音分配算法和每个语音的内容通常是MIDI合成器的内部并且从外部视图隐藏。 当然,人们可以从MIDI信息中学习合成器正在播放的音符,并且可以推断一些关于音符分配的信息。 但是MIDI本身并没有提供一种方法来报告合成器分配给哪个音符的音符,甚至也没有报告合成器能够合成多少个音色。

    但是,在Java Sound中, Synthesizer类可以通过其getVoiceStatus()方法显示其语音的内容。 建议使用此行为,但可选; 不公开其语音分配的合成器只返回一个零长度数组。 报告其语音状态的Synthesizer应始终保持此信息的所有声音,无论它们当前是否正在发声。 换句话说,给定类型的Synthesizer总是具有固定数量的声音,等于它能够发出声音的最大同时音符数。

    如果语音当前没有处理MIDI音符,则认为它处于非活动状态。 当没有给出音符开启命令时,或者当接收到的每个音符开启命令已被相应的音符关闭(或通过“所有音符关闭”消息)终止时,语音不活动。 例如,当能够播放16个同时音符的合成器被告知演奏四音符和弦时会发生这种情况; 在这种情况下只有四个声音处于活动状态(假设没有早期音符仍在播放)。 通常,其状态被报告为活动的语音产生可听声音,但这并非总是如此; 这取决于乐器的细节(即合成算法)以及音符的持续时间。 例如,语音可能正在合成单个手拍的声音。 由于这种声音很快消失,因此在收到音符关闭消息之前可能会听不到声音。 在这种情况下,即使当前没有声音产生,语音仍然被认为是活动的。

    除了活动或非活动状态, VoiceStatus类还提供显示语音当前MIDI通道,库和程序编号,MIDI音符编号和MIDI音量的字段。 所有这些都可以在声音过程中发生变化。 当语音处于非活动状态时,每个字段都有一个未指定的值,因此您应首先检查活动字段。

    另请参见:
    Synthesizer.getMaxPolyphony()Synthesizer.getVoiceStatus()
    • 字段详细信息

      • channel

        public int channel
        正在播放此声音的MIDI通道。 如果语音处于活动状态,则该值为从零开始的通道编号;如果语音处于非活动状态,则该值为未指定。
        另请参见:
        MidiChannelactive
      • bank

        public int bank
        此语音当前使用的乐器的库号。 这是由MIDI库选择消息决定的数字; 它没有引用SoundBank对象。 如果语音处于活动状态,则该值的范围为0到16383;如果语音处于非活动状态,则该值未指定。
        另请参见:
        PatchSoundbankactiveMidiChannel.programChange(int, int)
      • program

        public int program
        此语音当前使用的乐器的节目编号。 如果语音处于活动状态,则该值的范围为0到127;如果语音处于非活动状态,则该值未指定。
        另请参见:
        MidiChannel.getProgram()Patchactive
      • note

        public int note
        此声音正在播放的MIDI音符。 活动语音的范围以半音为0到127,其中60表示中间C.如果语音不活动,则未指定该值。
        另请参见:
        MidiChannel.noteOn(int, int)active
      • volume

        public int volume
        语音的当前MIDI音量级别。 如果语音处于活动状态,则该值的范围为0到127;如果语音处于非活动状态,则该值未指定。

        注意,该值不一定反映该声音产生的声音的瞬时水平; 该水平是许多因素的结果,包括当前仪器和它产生的振幅包络的形状。

        另请参见:
        active
    • 构造方法详细信息

      • VoiceStatus

        public VoiceStatus()