模块  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)常数字段值
    • 方法详细信息

      • 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当前运行的顺序。

        即使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()
        指示Sequencer当前是否正在运行。 默认值为false 当调用start()startRecording()时,Sequencer开始运行。 isRunning然后返回true直到序列的播放完成或调用stop()
        结果
        true如果Sequencer正在运行,否则为 false
      • startRecording

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

        请注意,默认情况下不启用曲目进行录制。 为了记录MIDI数据,必须专门启用至少一个轨道进行记录。

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

        boolean isRecording()
        指示Sequencer当前是否正在录制。 默认值为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如果没有, false如果没有
      • addControllerEventListener

        int[] addControllerEventListener​(ControllerEventListener listener,
                                         int[] controllers)
        注册控制器事件侦听器,以便在sequencer处理所请求类型的控件更改事件时接收通知。 这些类型由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()