-
- All Superinterfaces:
-
AutoCloseable
,MidiDevice
public interface Sequencer extends MidiDevice
播放MIDIsequence
的硬件或软件设备称为音序器 。 MIDI序列包含带时间戳的MIDI数据列表,例如可以从标准MIDI文件中读取。 大多数序列发生器还提供用于创建和编辑序列的功能。Sequencer
接口包括以下基本MIDI音序器操作的方法:- 从MIDI文件数据中获取序列
- 开始和停止播放
- 移动到序列中的任意位置
- 改变播放的速度(速度)
- 将播放同步到内部时钟或接收的MIDI信息
- 控制另一台设备的时间
Sequencer
可访问的对象支持以下操作:- 通过添加或删除单个MIDI事件或整个曲目来编辑数据
- 按顺序静音或独奏单个曲目
- 通知侦听器对象有关播放序列时遇到的任何元事件或控件更改事件
-
-
嵌套类汇总
嵌套类 变量和类型 接口 描述 static class
Sequencer.SyncMode
SyncMode
对象表示MIDI音序器的时间概念可以与主设备或从设备同步的方式之一。-
Nested classes/interfaces declared in interface javax.sound.midi.MidiDevice
MidiDevice.Info
-
-
字段汇总
字段 变量和类型 字段 描述 static int
LOOP_CONTINUOUSLY
一个值,指示循环应该无限期地继续而不是在特定数量的循环之后完成。
-
方法摘要
所有方法 实例方法 抽象方法 变量和类型 方法 描述 int[]
addControllerEventListener(ControllerEventListener listener, int[] controllers)
注册控制器事件侦听器,以便在sequencer处理所请求类型的控件更改事件时接收通知。boolean
addMetaEventListener(MetaEventListener listener)
注册元事件侦听器,以便在序列中遇到元事件并由sequencer处理时接收通知。int
getLoopCount()
获得播放的重复次数。long
getLoopEndPoint()
以MIDI刻度获得循环的结束位置。long
getLoopStartPoint()
以MIDI刻度获得循环的起始位置。Sequencer.SyncMode
getMasterSyncMode()
获得此顺控程序的当前主同步模式。Sequencer.SyncMode[]
getMasterSyncModes()
获得此顺控程序支持的主同步模式集。long
getMicrosecondLength()
获得当前序列的长度,以微秒表示,如果未设置序列,则为0。long
getMicrosecondPosition()
获得序列中的当前位置,以微秒表示。Sequence
getSequence()
获取Sequencer当前运行的顺序。Sequencer.SyncMode
getSlaveSyncMode()
获得此顺控程序的当前从属同步模式。Sequencer.SyncMode[]
getSlaveSyncModes()
获得定序器支持的一组从同步模式。float
getTempoFactor()
返回音序器的当前速度因子。float
getTempoInBPM()
获得当前速度,以每分钟节拍数表示。float
getTempoInMPQ()
获得当前速度,以每四分音符的微秒数表示。long
getTickLength()
获得当前序列的长度,以MIDI刻度表示,如果未设置序列,则为0。long
getTickPosition()
获得序列中的当前位置,以MIDI刻度表示。boolean
getTrackMute(int track)
获得轨道的当前静音状态。boolean
getTrackSolo(int track)
获得轨道的当前独奏状态。boolean
isRecording()
指示Sequencer当前是否正在录制。boolean
isRunning()
指示Sequencer当前是否正在运行。void
recordDisable(Track track)
禁用录制到指定的轨道。void
recordEnable(Track track, int channel)
准备指定的轨道以记录在特定频道上接收的事件。int[]
removeControllerEventListener(ControllerEventListener listener, int[] controllers)
删除控制器事件侦听器对一种或多种类型的控制器事件的兴趣。void
removeMetaEventListener(MetaEventListener listener)
如果实际上已注册侦听器,则从此sequencer的已注册侦听器列表中删除指定的元事件侦听器。void
setLoopCount(int count)
设置回放循环的重复次数。void
setLoopEndPoint(long tick)
设置将在循环中播放的最后一个MIDI节拍。void
setLoopStartPoint(long tick)
设置将在循环中播放的第一个MIDI节拍。void
setMasterSyncMode(Sequencer.SyncMode sync)
设置此顺控程序使用的计时信息的来源。void
setMicrosecondPosition(long microseconds)
设置序列中的当前位置,以微秒表示。void
setSequence(InputStream stream)
设置顺控程序运行的当前顺序。void
setSequence(Sequence sequence)
设置顺控程序运行的当前顺序。void
setSlaveSyncMode(Sequencer.SyncMode sync)
设置顺控程序的从属同步模式。void
setTempoFactor(float factor)
按提供的系数缩放音序器的实际播放速度。void
setTempoInBPM(float bpm)
以每分钟节拍数设置速度。void
setTempoInMPQ(float mpq)
设置每季度音符的速度,以微秒为单位。void
setTickPosition(long tick)
以MIDI刻度设置当前音序器位置。void
setTrackMute(int track, boolean mute)
设置轨道的静音状态。void
setTrackSolo(int track, boolean solo)
设置轨道的独奏状态。void
start()
开始播放当前加载的序列中的MIDI数据。void
startRecording()
开始录制和播放MIDI数据。void
stop()
停止录制(如果有效),并播放当前加载的序列(如果有)。void
stopRecording()
停止录制,如果有效。-
声明方法的接口 javax.sound.midi.MidiDevice
close, getDeviceInfo, getMaxReceivers, getMaxTransmitters, getReceiver, getReceivers, getTransmitter, getTransmitters, isOpen, open
-
-
-
-
字段详细信息
-
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)
-
stopRecording
void stopRecording()
停止录制,如果有效。 继续播放当前序列。- 异常
-
IllegalStateException
- 如果Sequencer
已关闭 - 另请参见:
-
startRecording()
,isRecording()
-
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()
- 结果
- 目前的勾号
- 另请参见:
-
setTickPosition(long)
-
setTickPosition
void setTickPosition(long tick)
以MIDI刻度设置当前音序器位置。- 参数
-
tick
- 所需的刻度位置 - 另请参见:
-
getTickPosition()
-
getMicrosecondLength
long getMicrosecondLength()
获得当前序列的长度,以微秒表示,如果未设置序列,则为0。- 结果
- 序列的长度,以微秒为单位
-
getMicrosecondPosition
long getMicrosecondPosition()
获得序列中的当前位置,以微秒表示。- Specified by:
-
getMicrosecondPosition
在接口MidiDevice
- 结果
- 当前位置以微秒为单位
- 另请参见:
-
setMicrosecondPosition(long)
-
setMicrosecondPosition
void setMicrosecondPosition(long microseconds)
设置序列中的当前位置,以微秒表示。- 参数
-
microseconds
- 所需的位置,以微秒为单位 - 另请参见:
-
getMicrosecondPosition()
-
setMasterSyncMode
void setMasterSyncMode(Sequencer.SyncMode sync)
设置此顺控程序使用的计时信息的来源。 音序器与主控器同步,即内部时钟,MIDI时钟或MIDI时间码,具体取决于sync
的值。sync
参数必须是受支持的模式之一,由getMasterSyncModes()
返回。- 参数
-
sync
- 所需的主同步模式 - 另请参见:
-
Sequencer.SyncMode.INTERNAL_CLOCK
,Sequencer.SyncMode.MIDI_SYNC
,Sequencer.SyncMode.MIDI_TIME_CODE
,getMasterSyncMode()
-
getMasterSyncMode
Sequencer.SyncMode getMasterSyncMode()
获得此顺控程序的当前主同步模式。- 结果
- 当前的主同步模式
- 另请参见:
-
setMasterSyncMode(SyncMode)
,getMasterSyncModes()
-
getMasterSyncModes
Sequencer.SyncMode[] getMasterSyncModes()
获得此顺控程序支持的主同步模式集。
-
setSlaveSyncMode
void setSlaveSyncMode(Sequencer.SyncMode sync)
- 参数
-
sync
- 所需的从属同步模式 - 另请参见:
-
Sequencer.SyncMode.MIDI_SYNC
,Sequencer.SyncMode.MIDI_TIME_CODE
,Sequencer.SyncMode.NO_SYNC
,getSlaveSyncModes()
-
getSlaveSyncMode
Sequencer.SyncMode getSlaveSyncMode()
获得此顺控程序的当前从属同步模式。- 结果
- 当前的从属同步模式
- 另请参见:
-
setSlaveSyncMode(SyncMode)
,getSlaveSyncModes()
-
getSlaveSyncModes
Sequencer.SyncMode[] getSlaveSyncModes()
获得定序器支持的一组从同步模式。- 结果
- 可用的从属同步模式
- 另请参见:
-
Sequencer.SyncMode.MIDI_SYNC
,Sequencer.SyncMode.MIDI_TIME_CODE
,Sequencer.SyncMode.NO_SYNC
-
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)
设置轨道的独奏状态。 如果solo
是true
只有此曲目和其他独奏曲目会响起。 如果solo
是false
那么只有其他独奏曲目会响起,除非没有曲目独奏,在这种情况下所有未静音的曲目都会响起。此方法可能由于多种原因而失败。 例如,指定的轨道号可能对当前序列无效,或者序列发生器可能不支持此功能。 需要验证此操作是否成功的应用程序应通过调用
getTrackSolo(int)
进行此调用。- 参数
-
track
- 曲目编号。 当前序列中的轨道编号从0到序列中的轨道数减1。 -
solo
- 赛道的新独奏状态。true
暗示该曲目应该独奏,false
暗示曲目不应该独奏。 - 另请参见:
-
getSequence()
-
getTrackSolo
boolean getTrackSolo(int track)
获得轨道的当前独奏状态。 所有尚未独奏的曲目的默认静音状态为false。 在任何未单独指定轨道的情况下,此方法应返回false。 如果音序器不支持曲目的独奏,并且指定的音轨索引无效,则这适用。- 参数
-
track
- 曲目编号。 当前序列中的轨道编号从0到序列中的轨道数减1。 - 结果
-
true
如果没有,false
如果没有
-
addMetaEventListener
boolean addMetaEventListener(MetaEventListener listener)
注册元事件侦听器,以便在序列中遇到元事件并由sequencer处理时接收通知。 例如,如果此类序列发生器不支持元事件通知,则此方法可能会失败。- 参数
-
listener
- 要添加的侦听器 - 结果
-
true
如果成功添加了侦听器,否则为false
- 另请参见:
-
removeMetaEventListener(javax.sound.midi.MetaEventListener)
,MetaEventListener
,MetaMessage
-
removeMetaEventListener
void removeMetaEventListener(MetaEventListener listener)
如果实际上已注册侦听器,则从此sequencer的已注册侦听器列表中删除指定的元事件侦听器。- 参数
-
listener
- 要删除的元事件侦听器 - 另请参见:
-
addMetaEventListener(javax.sound.midi.MetaEventListener)
-
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()
-
-