Module  java.desktop
软件包  javax.sound.midi

Interface Sequencer

  • All Superinterfaces:
    AutoCloseableMidiDevice


    public interface Sequencer
    extends MidiDevice
    播放MIDI sequence的硬件或软件设备被称为音序器 MIDI序列包含时间戳的MIDI数据列表,例如可能从标准MIDI文件读取。 大多数音序器还提供了创建和编辑序列的功能。

    Sequencer接口包括以下基本MIDI音序器操作的方法:

    • 从MIDI文件数据获取序列
    • 开始和停止播放
    • 按顺序移动到任意位置
    • 改变播放速度(速度)
    • 将播放同步到内部时钟或接收MIDI消息
    • 控制另一个设备的时序
    此外,以下操作可以直接地或间接地通过Sequencer可以访问的对象来支持:
    • 通过添加或删除单个MIDI事件或整个曲目来编辑数据
    • 在序列中静音或独奏个别曲目
    • 通知侦听器对象关于播放序列时遇到的任何元事件或控制更改事件。
    另请参见:
    Sequencer.SyncModeaddMetaEventListener(javax.sound.midi.MetaEventListener)ControllerEventListenerReceiverTransmitterMidiDevice
    • 字段详细信息

      • LOOP_CONTINUOUSLY

        static final int LOOP_CONTINUOUSLY
        一个值,指示循环应该在无限期之后继续,而不是在特定循环数之后完成。
        从以下版本开始:
        1.5
        另请参见:
        setLoopCount(int)Constant Field Values
    • 方法详细信息

      • setSequence

        void setSequence​(Sequence sequence)
                  throws InvalidMidiDataException
        设置序列发生器工作的当前序列。

        即使Sequencer关闭,也可以调用此方法。

        参数
        sequence - 要加载的序列
        异常
        InvalidMidiDataException - 如果序列包含无效的MIDI数据,或不支持
      • setSequence

        void setSequence​(InputStream stream)
                  throws IOException,
                         InvalidMidiDataException
        设置序列发生器工作的当前序列。 流必须指向MIDI文件数据。

        即使Sequencer关闭,也可以调用此方法。

        参数
        stream - 包含MIDI文件数据的流
        异常
        IOException - 如果在读取流中发生I / O异常
        InvalidMidiDataException - 如果流中遇到无效数据,或者不支持流
      • getSequence

        Sequence getSequence​()
        获取序列器当前正在操作的顺序。

        即使Sequencer关闭,也可以调用此方法。

        结果
        当前序列,或 null如果当前没有设置序列
      • start

        void start​()
        在当前加载的序列中开始播放MIDI数据。 播放将从当前位置开始。 如果播放位置到达环路终点,并且循环计数大于0,则回放起始点将恢复setLoopCount设置的重复次数。 之后,或者如果循环次数为0,播放将继续播放到序列的末尾。

        该实现确保通过发送适当的控制器,俯仰弯曲和程序改变事件跳转到循环起点时,合成器达到一致状态。

        异常
        IllegalStateException - 如果 Sequencer关闭
        另请参见:
        setLoopStartPoint(long)setLoopEndPoint(long)setLoopCount(int)stop()
      • stop

        void stop​()
        停止录制,如果有效,并播放当前加载的序列(如果有)。
        异常
        IllegalStateException - 如果 Sequencer关闭
        另请参见:
        start()isRunning()
      • isRunning

        boolean isRunning​()
        指示排序器当前是否正在运行。 默认值为false 当调用start()startRecording()时,序列器开始运行。 isRunning然后返回true直到播放顺序完成或调用stop()
        结果
        true如果序正在运行,否则 false
      • startRecording

        void startRecording​()
        开始录制和播放MIDI数据。 数据被记录到所有启用的轨道上,在它们启用的通道上。 录音从音序器的当前位置开始。 在录制会话期间,已经在轨道中的任何事件都将被覆盖。 来自当前加载的序列(如果有的话)的事件与记录期间接收的消息一起传送到定序器的发送器。

        请注意,曲目不会默认启用录制。 为了录制MIDI数据,至少必须有一个音轨才能录制。

        异常
        IllegalStateException - 如果 Sequencer关闭
        另请参见:
        recordEnable(javax.sound.midi.Track, int)recordDisable(javax.sound.midi.Track)
      • isRecording

        boolean isRecording​()
        指示音序器当前正在录制。 默认值为false 调用startRecording()时,音序器开始录制,然后返回true直到调用stop()stopRecording()
        结果
        true如果音序器正在录制,否则为 false
      • recordEnable

        void recordEnable​(Track track,
                          int channel)
        准备指定的轨道,用于记录在特定频道上收到的事件。 一旦启用,轨道将在记录活动时接收事件。
        参数
        track - 将记录事件的轨道
        channel - 接收事件的频道。 如果为通道值指定了-1,则轨道将从所有通道接收数据。
        异常
        IllegalArgumentException - 如果轨道不是当前序列的一部分,则抛出
      • recordDisable

        void recordDisable​(Track track)
        禁用记录到指定的轨道。 事件将不再被记录在此轨道中。
        参数
        track - 禁止录制的曲目,或 null禁用所有曲目的录制
      • getTempoInBPM

        float getTempoInBPM​()
        获得当前节奏,以每分钟的节拍表示。 播放的实际速度是返回值和速度因子的乘积。
        结果
        当前每分钟节拍速度
        另请参见:
        getTempoFactor()setTempoInBPM(float)getTempoInMPQ()
      • setTempoInBPM

        void setTempoInBPM​(float bpm)
        设置每分钟节拍的速度。 播放的实际速度是指定值和速度因子的乘积。
        参数
        bpm - 每分钟节拍所需的新节奏
        另请参见:
        getTempoFactor()setTempoInMPQ(float)getTempoInBPM()
      • getTempoInMPQ

        float getTempoInMPQ​()
        获得当前的节奏,以每季度的微秒表示。 播放的实际速度是返回值和速度因子的乘积。
        结果
        当前每分钟音符的微秒数
        另请参见:
        getTempoFactor()setTempoInMPQ(float)getTempoInBPM()
      • setTempoInMPQ

        void setTempoInMPQ​(float mpq)
        设置每四分之一音符的微秒速度。 播放的实际速度是指定值和速度因子的乘积。
        参数
        mpq - 所需的新节奏(以微秒为单位)
        另请参见:
        getTempoFactor()setTempoInBPM(float)getTempoInMPQ()
      • setTempoFactor

        void setTempoFactor​(float factor)
        按照提供的因素来调整音序器的实际播放速度。 默认值为1.0。 值为1.0表示自然速率(序列中指定的速度),2.0表示快两倍等速度因素不影响getTempoInMPQ()getTempoInBPM()返回的值。 这些值表示缩放之前的速度。

        请注意,使用外部同步时,速度系数无法调节。 在这种情况下, setTempoFactor总是将速度系数设置为1.0。

        参数
        factor - 请求的速度标量
        另请参见:
        getTempoFactor()
      • getTempoFactor

        float getTempoFactor​()
        返回音序器的当前速度因子。 默认值为1.0。
        结果
        速度因素
        另请参见:
        setTempoFactor(float)
      • getTickLength

        long getTickLength​()
        获取当前序列的长度,以MIDI刻度表示,如果没有设置序列,则为0。
        结果
        序列长度在蜱
      • getTickPosition

        long getTickPosition​()
        获取序列中的当前位置,以MIDI刻度表示。 (以秒为单位的刻度的持续时间由速度和存储在Sequence的定时分辨率确定 。)
        结果
        当前滴答
        另请参见:
        setTickPosition(long)
      • setTickPosition

        void setTickPosition​(long tick)
        以MIDI刻度设置当前音序器的位置。
        参数
        tick - 所需的刻度位置
        另请参见:
        getTickPosition()
      • getMicrosecondLength

        long getMicrosecondLength​()
        获取当前序列的长度,以微秒表示,如果没有设置序列,则为0。
        结果
        序列长度,单位为微秒
      • setMicrosecondPosition

        void setMicrosecondPosition​(long microseconds)
        设置序列中的当前位置,以微秒表示。
        参数
        microseconds - 所需位置(以微秒为单位)
        另请参见:
        getMicrosecondPosition()
      • setTrackMute

        void setTrackMute​(int track,
                          boolean mute)
        设置轨道的静音状态。 由于多种原因,此方法可能会失败。 例如,指定的轨道号可能对当前序列无效,或者定序器可能不支持此功能。 需要验证此操作是否成功的应用程序应该通过调用getTrackMute(int)跟随此呼叫。
        参数
        track - 轨道号。 当前序列中的轨迹从0到序列中的轨道数减1。
        mute - 轨道的新静音状态。 true意味着轨道应该静音, false意味着轨道应该取消静音。
        另请参见:
        getSequence()
      • getTrackMute

        boolean getTrackMute​(int track)
        获取当前静音状态的轨道。 所有未静音轨迹的默认静音状态为false。 在任何情况下,指定的轨道未被静音,此方法应返回false。 如果音序器不支持音轨静音,并且指定的曲目索引无效,则适用。
        参数
        track - 轨道号。 当前序列中的轨迹从0到序列中的轨道数减1。
        结果
        true如果静音, false如果没有
      • setTrackSolo

        void setTrackSolo​(int track,
                          boolean solo)
        设置轨道的独奏状态。 如果solotrue只有这个轨道和其他独奏的轨道会发出声音。 如果solofalse那么只有其他独奏的曲目会发出声音,除非没有轨道是独奏的,在这种情况下,所有未静音的曲目都会发出声音。

        由于多种原因,此方法可能会失败。 例如,指定的轨道号可能对当前序列无效,或者定序器可能不支持此功能。 需要验证此操作是否成功的应用程序应该通过调用getTrackSolo(int)来跟随此呼叫。

        参数
        track - 轨道号。 当前序列中的轨迹从0到序列中的轨道数减1。
        solo - 新的独奏状态的轨道。 true意味着轨道应该是独奏, false暗示轨道不应该是独奏的。
        另请参见:
        getSequence()
      • getTrackSolo

        boolean getTrackSolo​(int track)
        获得目前的独奏状态。 所有未独立音轨的默认静音状态为false。 在任何情况下,如果指定的轨道未被单独使用,则此方法应返回false。 如果音序器不支持音轨独奏,并且指定的曲目索引无效,则适用。
        参数
        track - 轨道号。 当前序列中的轨迹从0到序列中的轨道数减1。
        结果
        true如果solo'd, false如果没有
      • addControllerEventListener

        int[] addControllerEventListener​(ControllerEventListener listener,
                                         int[] controllers)
        注册一个控制器事件侦听器,只要顺序程序处理所请求的类型或类型的控制更改事件,就会收到通知。 类型由controllers参数指定,该参数应包含一组MIDI控制器编号。 (每个数字应在0到127之间,包括对应于各种类型的控制器的数字的MIDI 1.0规范。)

        返回的数组包含MIDI控制器编号,侦听器现在将为其接收事件。 某些顺控程序可能不支持控制器事件通知,在这种情况下,阵列的长度为0.其他定序器可能支持某些控制器的通知,但并不全部。 可以重复地调用该方法。 每次返回的数组都会指示监听器将被通知的所有控制器,不仅是在该特定调用中请求的控制器。

        参数
        listener - 控制器事件侦听器添加到已注册的侦听器列表中
        controllers - 请求更改通知的MIDI控制器编号
        结果
        所有MIDI控制器的数量现在将被更改指定给指定的侦听器
        另请参见:
        removeControllerEventListener(javax.sound.midi.ControllerEventListener, int[])ControllerEventListener
      • removeControllerEventListener

        int[] removeControllerEventListener​(ControllerEventListener listener,
                                            int[] controllers)
        删除控制器事件侦听器对一种或多种类型的控制器事件的兴趣。 controllers参数是与控制器相对应的MIDI数组数组,监听器不应再接收更改通知。 要从已注册的听众列表中完全删除此侦听器,请传送null以获取controllers 返回的数组包含MIDI控制器编号,侦听器现在将为其接收事件。 如果监听器不会收到任何控制器的更改通知,该数组的长度为0。
        参数
        listener - 老听众
        controllers - 应取消变更通知的MIDI控制器编号,或 null取消所有控制器
        结果
        所有MIDI控制器的数量现在将被更改指定给指定的侦听器
        另请参见:
        addControllerEventListener(javax.sound.midi.ControllerEventListener, int[])
      • setLoopStartPoint

        void setLoopStartPoint​(long tick)
        设置将在循环中播放的第一个MIDI刻度。 如果循环次数大于0,则到达循环终点时,播放将跳到此点。

        起始点的值为0表示加载序列的开头。 起始点必须低于或等于终点,并且必须在加载序列的大小之内。

        音序器的循环起始点默认为序列的开始。

        参数
        tick - 循环的起始位置,在MIDI刻度(从零开始)
        异常
        IllegalArgumentException - 如果请求的循环起始点无法设置,通常是因为它不在序列的持续时间之外,或者因为起点在终点之后
        从以下版本开始:
        1.5
        另请参见:
        setLoopEndPoint(long)setLoopCount(int)getLoopStartPoint()start()
      • getLoopStartPoint

        long getLoopStartPoint​()
        获取循环的开始位置,以MIDI刻度。
        结果
        循环的起始位置,以MIDI刻度(从零开始)
        从以下版本开始:
        1.5
        另请参见:
        setLoopStartPoint(long)
      • setLoopEndPoint

        void setLoopEndPoint​(long tick)
        设置将在循环中播放的最后一个MIDI刻度。 如果循环计数为0,则循环结束点不起作用,当到达循环终点时,回放继续播放。

        结束点的值为-1表示序列的最后一个刻度。 否则,终点必须大于或等于起始点,并且必须在加载的序列的大小之内。

        音序器的循环终点默认为-1,表示序列的结尾。

        参数
        tick - 循环的结束位置,以MIDI刻度(从零开始)或-1表示最后一个刻度
        异常
        IllegalArgumentException - 如果所请求的循环点不能被设置,通常是因为它不在序列的持续时间之外,或者因为结束点在起始点之前
        从以下版本开始:
        1.5
        另请参见:
        setLoopStartPoint(long)setLoopCount(int)getLoopEndPoint()start()
      • getLoopEndPoint

        long getLoopEndPoint​()
        获得循环的最终位置,以MIDI刻度。
        结果
        循环的结束位置,以MIDI刻度(从零开始)或-1表示序列的结束
        从以下版本开始:
        1.5
        另请参见:
        setLoopEndPoint(long)
      • setLoopCount

        void setLoopCount​(int count)
        设置循环播放次数。 当播放位置到达环路终点时,它将循环回到起始点count次,之后播放将继续播放到序列的末尾。

        如果调用此方法时的当前位置大于循环终点,则回放将继续到序列结束而不进行循环,除非循环结束点随后更改。

        一个count值为0,禁用循环:回放将在循环结束点继续,并且不会循环回环路起始点。 这是一个音序器的默认值。

        如果在循环过程中播放停止,则当前循环状态被清除; 后续的启动请求不受中断循环操作的影响。

        参数
        count - 播放应该从循环的结束位置循环回循环的起始位置的次数,或 LOOP_CONTINUOUSLY以指示循环应该继续直到中断
        异常
        IllegalArgumentException - 如果 count为负,不等于 LOOP_CONTINUOUSLY
        从以下版本开始:
        1.5
        另请参见:
        setLoopStartPoint(long)setLoopEndPoint(long)getLoopCount()start()
      • getLoopCount

        int getLoopCount​()
        获取播放次数。
        结果
        播放播放到序列结尾之后的循环数
        从以下版本开始:
        1.5
        另请参见:
        setLoopCount(int), start()