-
- All Superinterfaces:
-
AutoCloseable
,MidiDevice
public interface Sequencer extends MidiDevice
播放MIDIsequence
的硬件或软件设备被称为音序器 。 MIDI序列包含时间戳的MIDI数据列表,例如可能从标准MIDI文件读取。 大多数音序器还提供了创建和编辑序列的功能。Sequencer
接口包括以下基本MIDI音序器操作的方法:- 从MIDI文件数据获取序列
- 开始和停止播放
- 按顺序移动到任意位置
- 改变播放速度(速度)
- 将播放同步到内部时钟或接收MIDI消息
- 控制另一个设备的时序
Sequencer
可以访问的对象来支持:- 通过添加或删除单个MIDI事件或整个曲目来编辑数据
- 在序列中静音或独奏个别曲目
- 通知侦听器对象关于播放序列时遇到的任何元事件或控制更改事件。
-
-
Nested Class Summary
Nested Classes Modifier and Type 接口 描述 static class
Sequencer.SyncMode
SyncMode
对象表示MIDI音序器的时间概念可以与主设备或从设备同步的方式之一。-
Nested classes/interfaces inherited from interface javax.sound.midi.MidiDevice
MidiDevice.Info
-
-
Field Summary
Fields Modifier and Type Field 描述 static int
LOOP_CONTINUOUSLY
一个值,指示循环应该在无限期之后继续,而不是在特定循环数之后完成。
-
方法摘要
所有方法 接口方法 抽象方法 Modifier and Type 方法 描述 int[]
addControllerEventListener(ControllerEventListener listener, int[] controllers)
注册一个控制器事件侦听器,只要顺序程序处理所请求的类型或类型的控制更改事件,就会收到通知。boolean
addMetaEventListener(MetaEventListener listener)
注册元事件监听器,以便在序列中遇到元事件并由序列器处理时接收通知。int
getLoopCount()
获取播放次数。long
getLoopEndPoint()
获得循环的最终位置,以MIDI刻度。long
getLoopStartPoint()
获取循环的开始位置,以MIDI刻度。Sequencer.SyncMode
getMasterSyncMode()
获取此音序器的当前主同步模式。Sequencer.SyncMode[]
getMasterSyncModes()
获取此序列器支持的一组主同步模式。long
getMicrosecondLength()
获取当前序列的长度,以微秒表示,如果没有设置序列,则为0。long
getMicrosecondPosition()
获取序列中的当前位置,以微秒表示。Sequence
getSequence()
获取序列器当前正在操作的顺序。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()
指示音序器当前正在录制。boolean
isRunning()
指示排序器当前是否正在运行。void
recordDisable(Track track)
禁用记录到指定的轨道。void
recordEnable(Track track, int channel)
准备指定的轨道,用于记录在特定频道上收到的事件。int[]
removeControllerEventListener(ControllerEventListener listener, int[] controllers)
删除控制器事件侦听器对一种或多种类型的控制器事件的兴趣。void
removeMetaEventListener(MetaEventListener listener)
如果实际上是监听器被注册,则从该定序器的注册监听器列表中移除指定的元事件监听器。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()
停止录制,如果活动。-
Methods inherited from interface 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)
, 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)
-
stopRecording
void stopRecording()
停止录制,如果活动。 播放当前序列继续。- 异常
-
IllegalStateException
- 如果Sequencer
关闭 - 另请参见:
-
startRecording()
,isRecording()
-
isRecording
boolean isRecording()
- 结果
-
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
如果solo'd,false
如果没有
-
addMetaEventListener
boolean addMetaEventListener(MetaEventListener listener)
注册元事件监听器,以便在序列中遇到元事件并由序列器处理时接收通知。 如果例如此类序列器不支持元事件通知,则此方法可能会失败。- 参数
-
listener
- 收听者添加 - 结果
-
true
如果侦听器成功添加,否则为false
- 另请参见:
-
removeMetaEventListener(javax.sound.midi.MetaEventListener)
,MetaEventListener
,MetaMessage
-
removeMetaEventListener
void removeMetaEventListener(MetaEventListener listener)
如果实际上是监听器被注册,则从该定序器的注册监听器列表中移除指定的元事件监听器。- 参数
-
listener
- 要删除的元事件监听器 - 另请参见:
-
addMetaEventListener(javax.sound.midi.MetaEventListener)
-
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()
-
-