public interface Sequencer extends MidiDevice
sequence
称为序 。
MIDI序列包含时间戳的MIDI数据列表,例如可能从标准MIDI文件读取。
大多数音序器还提供了创建和编辑序列的功能。
Sequencer
接口包括以下基本MIDI音序器操作的方法:
Sequencer
可以访问的对象直接或间接地支持以下操作:
Modifier and Type | Interface and Description |
---|---|
static class |
Sequencer.SyncMode
一个
SyncMode 对象表示MIDI音序器的时间概念可以与主设备或从设备同步的方式之一。
|
MidiDevice.Info
Modifier and Type | Field and Description |
---|---|
static int |
LOOP_CONTINUOUSLY
一个值,指示循环应该在无限期之后继续,而不是在特定循环数之后完成。
|
Modifier and Type | Method and Description |
---|---|
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()
停止录制,如果活动。
|
close, getDeviceInfo, getMaxReceivers, getMaxTransmitters, getReceiver, getReceivers, getTransmitter, getTransmitters, isOpen, open
static final int LOOP_CONTINUOUSLY
setLoopCount(int)
,
Constant Field Values
void setSequence(Sequence sequence) throws InvalidMidiDataException
即使Sequencer
关闭,也可以调用此方法。
sequence
- 要加载的序列。
InvalidMidiDataException
- 如果序列包含无效的MIDI数据,或不支持。
void setSequence(InputStream stream) throws IOException, InvalidMidiDataException
即使Sequencer
关闭,也可以调用此方法。
stream
- 包含MIDI文件数据的流。
IOException
- 如果在读取数据流期间发生I / O异常。
InvalidMidiDataException
- 如果流中遇到无效数据,或不支持流。
Sequence getSequence()
即使Sequencer
关闭,也可以调用此方法。
null
如果当前没有设置序列。
void start()
setLoopCount
。
之后,或者如果循环次数为0,播放将继续播放到序列的末尾。
该实现确保通过发送适当的控制器,俯仰弯曲和程序改变事件跳转到循环起点时,合成器达到一致状态。
IllegalStateException
- 如果
Sequencer
关闭。
setLoopStartPoint(long)
,
setLoopEndPoint(long)
,
setLoopCount(int)
,
stop()
void stop()
IllegalStateException
- 如果
Sequencer
关闭。
start()
,
isRunning()
boolean isRunning()
false
。
调用start()
或startRecording()
时,Sequencer开始运行。
isRunning
然后返回true
直到播放顺序完成或stop()
。
true
如果排序器正在运行,否则
false
void startRecording()
请注意,曲目不会默认启用录制。 为了录制MIDI数据,至少必须有一个音轨才能录制。
IllegalStateException
- 如果
Sequencer
关闭。
startRecording()
,
recordEnable(javax.sound.midi.Track, int)
,
recordDisable(javax.sound.midi.Track)
void stopRecording()
IllegalStateException
- 如果
Sequencer
关闭。
startRecording()
,
isRecording()
boolean isRecording()
false
。
当调用startRecording()
时, startRecording()
序器开始录制,然后返回true
,直到stop()
或stopRecording()
被调用。
true
如果音序器正在录音,否则为
false
void recordEnable(Track track, int channel)
track
- 将记录事件的轨道
channel
- 收到活动的频道。
如果为通道值指定了-1,则轨道将从所有通道接收数据。
IllegalArgumentException
- 如果轨道不是当前序列的一部分,则抛出。
void recordDisable(Track track)
track
- 禁止录制的曲目,或
null
禁用所有曲目的录制。
float getTempoInBPM()
getTempoFactor()
,
setTempoInBPM(float)
,
getTempoInMPQ()
void setTempoInBPM(float bpm)
bpm
- 每分钟节拍所需的新节奏
getTempoFactor()
,
setTempoInMPQ(float)
,
getTempoInBPM()
float getTempoInMPQ()
getTempoFactor()
,
setTempoInMPQ(float)
,
getTempoInBPM()
void setTempoInMPQ(float mpq)
mpq
- 所需的新节奏,以每秒四分音符为单位的微秒。
getTempoFactor()
,
setTempoInBPM(float)
,
getTempoInMPQ()
void setTempoFactor(float factor)
getTempoInMPQ()
和getTempoInBPM()
返回的值。
这些值表示缩放之前的速度。
请注意,使用外部同步时,速度系数无法调节。 在这种情况下, setTempoFactor
总是将速度系数设置为1.0。
factor
- 请求的速度标量
getTempoFactor()
float getTempoFactor()
setTempoFactor(float)
long getTickLength()
long getTickPosition()
setTickPosition(long)
void setTickPosition(long tick)
tick
- 所需的刻度位置
getTickPosition()
long getMicrosecondLength()
long getMicrosecondPosition()
getMicrosecondPosition
在界面
MidiDevice
setMicrosecondPosition(long)
void setMicrosecondPosition(long microseconds)
microseconds
- 以微秒为单位的期望位置
getMicrosecondPosition()
void setMasterSyncMode(Sequencer.SyncMode sync)
sync
。
sync
参数必须是getMasterSyncModes()
返回的支持的模式getMasterSyncModes()
。
sync
- 所需的主同步模式
Sequencer.SyncMode.INTERNAL_CLOCK
,
Sequencer.SyncMode.MIDI_SYNC
,
Sequencer.SyncMode.MIDI_TIME_CODE
,
getMasterSyncMode()
Sequencer.SyncMode getMasterSyncMode()
setMasterSyncMode(Sequencer.SyncMode)
,
getMasterSyncModes()
Sequencer.SyncMode[] getMasterSyncModes()
void setSlaveSyncMode(Sequencer.SyncMode sync)
sync
- 所需的从同步模式
Sequencer.SyncMode.MIDI_SYNC
,
Sequencer.SyncMode.MIDI_TIME_CODE
,
Sequencer.SyncMode.NO_SYNC
,
getSlaveSyncModes()
Sequencer.SyncMode getSlaveSyncMode()
setSlaveSyncMode(Sequencer.SyncMode)
,
getSlaveSyncModes()
Sequencer.SyncMode[] getSlaveSyncModes()
Sequencer.SyncMode.MIDI_SYNC
,
Sequencer.SyncMode.MIDI_TIME_CODE
,
Sequencer.SyncMode.NO_SYNC
void setTrackMute(int track, boolean mute)
getTrackMute(int)
。
track
- 曲目编号。
当前序列中的轨迹从0到序列中的轨道数减1。
mute
- 轨道的新静音状态。
true
意味着轨道应该被静音, false
意味着轨道应该取消静音。
getSequence()
boolean getTrackMute(int track)
track
- 曲目编号。
当前序列中的轨迹从0到序列中的轨道数减1。
true
如果静音,
false
如果没有。
void setTrackSolo(int track, boolean solo)
solo
是true
只有这个轨道和其他solo'd轨道会发出声音。
如果solo
是false
那么只有其他独奏的曲目会发出声音,除非没有轨道是独奏的,在这种情况下,所有未静音的曲目都会发出声音。
由于多种原因,此方法可能会失败。 例如,指定的轨道号可能对当前序列无效,或者定序器可能不支持此功能。 这需要验证此操作是否成功应该遵循这个调用与一个调用应用程序
。 getTrackSolo(int)
track
- 轨道号。
当前序列中的轨迹从0到序列中的轨道数减1。
solo
- 新的独奏状态的轨道。
true
意味着轨道应该是独奏的, false
意味着轨道不应该是独奏的。
getSequence()
boolean getTrackSolo(int track)
track
- 曲目编号。
当前序列中的轨迹从0到序列中的轨道数减1。
true
如果
true
,
false
如果没有。
boolean addMetaEventListener(MetaEventListener listener)
listener
-
listener
添加
true
如果听众成功添加,否则
false
removeMetaEventListener(javax.sound.midi.MetaEventListener)
, MetaEventListener
, MetaMessage
void removeMetaEventListener(MetaEventListener listener)
listener
- 要删除的元事件侦听器
addMetaEventListener(javax.sound.midi.MetaEventListener)
int[] addControllerEventListener(ControllerEventListener listener, int[] controllers)
controllers
参数指定,该参数应包含一组MIDI控制器编号。
(每个数字应在0到127之间,包括对应于各种类型的控制器的数字的MIDI 1.0规范。)
返回的数组包含MIDI控制器编号,侦听器现在将为其接收事件。 某些顺控程序可能不支持控制器事件通知,在这种情况下,阵列的长度为0.其他定序器可能支持某些控制器的通知,但并不全部。 可以重复地调用该方法。 每次返回的数组都会指示监听器将被通知的所有控制器,不仅是在该特定调用中请求的控制器。
listener
- 控制器事件侦听器添加到已注册的侦听器列表
controllers
- 请求更改通知的MIDI控制器号码
removeControllerEventListener(javax.sound.midi.ControllerEventListener, int[])
, ControllerEventListener
int[] removeControllerEventListener(ControllerEventListener listener, int[] controllers)
controllers
参数是与控制器相对应的MIDI数组数组,监听器不应再接收更改通知。
要从注册的听众列表中完全删除此侦听器,请传送null
以获取controllers
。
返回的数组包含MIDI控制器编号,侦听器现在将为其接收事件。
如果监听器不会收到任何控制器的更改通知,该数组的长度为0。
listener
- 老听众
controllers
- 应该取消更改通知的MIDI控制器号码,或
null
取消所有控制器
addControllerEventListener(javax.sound.midi.ControllerEventListener, int[])
void setLoopStartPoint(long tick)
起始点的值为0表示加载序列的开头。 起始点必须小于或等于终点,并且必须在加载序列的大小之内。
音序器的循环起始点默认为序列的开始。
tick
- 循环的起始位置,以MIDI刻度(从零开始)
IllegalArgumentException
- 如果请求的循环起始点无法设置,通常是因为它不在序列的持续时间之外,或者因为起始点在终点之后
setLoopEndPoint(long)
,
setLoopCount(int)
,
getLoopStartPoint()
,
start()
long getLoopStartPoint()
setLoopStartPoint(long)
void setLoopEndPoint(long tick)
结束点的值为-1表示序列的最后一个刻度。 否则,终点必须大于或等于起始点,并且必须在加载的序列的大小之内。
音序器的循环终点默认为-1,表示序列的结尾。
tick
- 循环的结束位置,以MIDI刻度(从零开始)或-1表示最后一个刻度
IllegalArgumentException
- 如果请求的循环点不能被设置,通常是因为它不在序列的持续时间之外,或者因为结束点在起始点之前
setLoopStartPoint(long)
,
setLoopCount(int)
,
getLoopEndPoint()
,
start()
long getLoopEndPoint()
setLoopEndPoint(long)
void setLoopCount(int count)
count
次,之后播放将继续播放到序列的末尾。
如果调用此方法时的当前位置大于循环终点,则回放将继续到序列结束而不进行循环,除非循环结束点随后更改。
一个count
值0禁用循环:回放将在循环结束点继续,并且不会循环回循环起始点。 这是一个音序器的默认值。
如果在循环过程中播放停止,则当前循环状态被清除; 后续的启动请求不受中断循环操作的影响。
count
- 播放应该从循环的结束位置循环回循环的起始位置的次数,或
LOOP_CONTINUOUSLY
,以指示循环应该继续直到中断
IllegalArgumentException
- 如果
count
为负,不等于
LOOP_CONTINUOUSLY
setLoopStartPoint(long)
,
setLoopEndPoint(long)
,
getLoopCount()
,
start()
int getLoopCount()
setLoopCount(int)
,
start()