public interface Sequencer
回放 MIDI
的硬件或软件设备就是所谓的 sequencer。MIDI sequence 包含加了时间戳的 MIDI 数据列表,例如可从标准 MIDI 文件读取的数据。多数 sequencer 还提供创建和编辑 sequence 的功能。 sequence
Sequencer
接口包括用于以下基本 MIDI sequencer 操作的方法:
Sequencer
可访问的对象支持以下操作:
Sequencer.SyncMode
,
addMetaEventListener(javax.sound.midi.MetaEventListener)
,
ControllerEventListener
,
Receiver
,
Transmitter
,
MidiDevice
嵌套类摘要 | |
---|---|
static class |
Sequencer.SyncMode SyncMode 对象表示 MIDI sequencer 的时间标记可与主或从设备同步的方式之一。 |
从接口 javax.sound.midi.MidiDevice 继承的嵌套类/接口 |
---|
MidiDevice.Info |
字段摘要 | |
---|---|
static int |
LOOP_CONTINUOUSLY 一个值,指示循环应无限继续而不是在执行完特定次数的循环后停止。 |
方法摘要 | |
---|---|
int[] |
addControllerEventListener(ControllerEventListener listener, int[] controllers) 注册一个控件事件侦听器,以便在 sequencer 处理所请求的一种或多种类型的控制更改事件时接收通知。 |
boolean |
addMetaEventListener(MetaEventListener listener) 注册一个元事件侦听器,以便在 sequence 中遇到元事件并由此 sequencer 处理时接收通知。 |
int |
getLoopCount() 获得回放的重复次数。 |
long |
getLoopEndPoint() 获得循环的结束位置,以 MIDI 节拍为单位。 |
long |
getLoopStartPoint() 获得循环的起始位置,以 MIDI 节拍为单位。 |
Sequencer.SyncMode |
getMasterSyncMode() 获得此 sequencer 的当前主同步模式。 |
Sequencer.SyncMode[] |
getMasterSyncModes() 获得此 sequencer 支持的主同步模式集。 |
long |
getMicrosecondLength() 获得当前 sequence 的长度,用微秒表示,如果未设置 sequence,则为 0。 |
long |
getMicrosecondPosition() 获得 sequence 中的当前位置,用微秒表示。 |
Sequence |
getSequence() 获得 Sequencer 当前所操作的 sequence。 |
Sequencer.SyncMode |
getSlaveSyncMode() 获得此 sequencer 的当前从同步模式。 |
Sequencer.SyncMode[] |
getSlaveSyncModes() 获得此 sequencer 支持的从同步模式集。 |
float |
getTempoFactor() 返回 sequencer 的当前速度因子。 |
float |
getTempoInBPM() 获得当前的速度,用每分钟的拍数表示。 |
float |
getTempoInMPQ() 获得当前的速度,用每四分音符的微秒数表示。 |
long |
getTickLength() 获得当前 sequence 的长度,用 MIDI 节拍数表示,如果未设置 sequence,则为 0。 |
long |
getTickPosition() 获得 sequence 的当前位置,用 MIDI 节拍数表示。 |
boolean |
getTrackMute(int track) 获得轨道的当前静音状态。 |
boolean |
getTrackSolo(int track) 获得轨道的当前 solo 状态。 |
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) 设置此 sequencer 使用的定时信息源。 |
void |
setMicrosecondPosition(long microseconds) 设置 sequence 中的当前位置,用微秒表示 |
void |
setSequence(InputStream stream) 设置 sequencer 所操作的当前 sequence。 |
void |
setSequence(Sequence sequence) 设置 sequencer 所操作的当前 sequence。 |
void |
setSlaveSyncMode(Sequencer.SyncMode sync) 设置此 sequencer 的从同步模式。 |
void |
setTempoFactor(float factor) 根据所提供的 factor 按比例提高 sequencer 的实际回放速度。 |
void |
setTempoInBPM(float bpm) 设置速度,以每分钟的拍数为单位。 |
void |
setTempoInMPQ(float mpq) 设置速度,以每四分音符的微秒数为单位。 |
void |
setTickPosition(long tick) 设置当前 sequencer 位置,以 MIDI 节拍数为单位。 |
void |
setTrackMute(int track, boolean mute) 设置轨道的静音状态。 |
void |
setTrackSolo(int track, boolean solo) 设置轨道的 solo 状态。 |
void |
start() 开始回放当前已加载 sequence 中的 MIDI 数据。 |
void |
startRecording() 开始录制和回放 MIDI 数据。 |
void |
stop() 停止录音(如果处于活动状态)及当前已加载 sequence(如果有)的回放。 |
void |
stopRecording() 停止录制(如果处于活动状态)。 |
从接口 javax.sound.midi.MidiDevice 继承的方法 |
---|
close, getDeviceInfo, getMaxReceivers, getMaxTransmitters, getReceiver, getReceivers, getTransmitter, getTransmitters, isOpen, open |
字段详细信息 |
---|
static final int LOOP_CONTINUOUSLY
setLoopCount(int)
,
常量字段值
方法详细信息 |
---|
void setSequence(Sequence sequence) throws InvalidMidiDataException
此方法即使在 Sequencer
关闭时也可调用。
sequence
- 要加载的 sequence。
InvalidMidiDataException
- 如果该 sequence 包含无效的 MIDI 数据或不受支持的数据。
void setSequence(InputStream stream) throws IOException, InvalidMidiDataException
此方法即使在 Sequencer
关闭时也可调用。
stream
- 包含 MIDI 文件数据的流。
IOException
- 如果读取流时发生 I/O 异常。
InvalidMidiDataException
- 如果在流中遇到无效数据,或者流不受支持。
Sequence getSequence()
此方法即使在 Sequencer
关闭时也可调用。
null
。
void start()
setLoopCount
中设置的重复次数。此后,如果循环计数为 0,则回放将继续播放直到 sequence 末尾。
该实现确保合成器在跳转到循环开始点时通过发送合适的控件、弯音和程序更改事件来保持一致的状态。
IllegalStateException
- 如果
Sequencer
已关闭。
setLoopStartPoint(long)
,
setLoopEndPoint(long)
,
setLoopCount(int)
,
stop()
void stop()
IllegalStateException
- 如果
Sequencer
已关闭。
start()
,
isRunning()
boolean isRunning()
false
。Sequencer 在调用
start()
或
startRecording()
之一时开始运行。然后
isRunning
返回
true
,直到 sequence 的回放完成或调用了
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
。Sequencer 在
startRecording()
调用时开始录制,然后在调用
stop()
或
stopRecording()
前,此方法返回
true
。
true
;否则返回
false
void recordEnable(Track track, int channel)
track
- 要录制事件的轨道
channel
- 接收其上事件的通道。如果通道值指定为 -1,则轨道将从所有通道接收数据。
IllegalArgumentException
- 如果 track 不是当前 sequence 的一部分。
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()
Sequence
中的定时精度确定。)
setTickPosition(long)
void setTickPosition(long tick)
tick
- 所需的节拍位置
getTickPosition()
long getMicrosecondLength()
long getMicrosecondPosition()
MidiDevice
中的
getMicrosecondPosition
setMicrosecondPosition(long)
void setMicrosecondPosition(long microseconds)
microseconds
- 所需的位置,以微秒为单位
getMicrosecondPosition()
void setMasterSyncMode(Sequencer.SyncMode sync)
sync
的值。
sync
参数必须是所支持的模式之一,如
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
参数必须是所支持的模式之一,如
getSlaveSyncModes()
返回的结果。
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
- 轨道号。当前 sequence 中的轨道从 0 到 sequence 中的轨道数减 1 来编号。
mute
- 轨道的新静音状态。
true
表示轨道应静音,
false
表示轨道应为非静音。
getSequence()
boolean getTrackMute(int track)
track
- 轨道号。当前 sequence 中的轨道从 0 到 sequence 中的轨道数减 1 来编号。
true
;如果未静音,则返回
false
。
void setTrackSolo(int track, boolean solo)
solo
为
true
,则只有此轨道及其他 solo 轨道可发声。如果
solo
为
false
,则只有其他 solo 轨道可发声,如果没有任何 solo 轨道,则所有非静音轨道都发声。
此方法可能由于某些原因而失败。例如,所指定的轨道号可能对于当前 sequence 无效,或者 sequencer 可能不支持此功能。需要验证此操作是否成功的应用程序应在此调用后调用
。 getTrackSolo(int)
track
- 轨道号。当前 sequence 中的轨道从 0 到 sequence 中的轨道数减 1 来编号。
solo
- 轨道的新 solo 状态。
true
表示轨道应为 solo,
false
表示轨道应为非 solo。
getSequence()
boolean getTrackSolo(int track)
track
- 轨道号。当前 sequence 中的轨道从 0 到 sequence 中的轨道数减 1 来编号。
true
;如果不是,则返回
false
。
boolean addMetaEventListener(MetaEventListener 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 控件号,侦听器将从现在开始接收其事件。有些 sequencer 可能不支持控件事件通知,这种情况下数组长度为 0。其他 sequencer 可能支持某些控件的通知,但不是全部。此方法可重复调用。每次调用时,返回的数组都指示侦听器将接收其通知的所有控件,而不仅仅是在该特定调用中请求的控件。
listener
- 要添加到已注册侦听器列表中的控件事件侦听器
controllers
- 为其请求更改通知的 MIDI 控件号
removeControllerEventListener(javax.sound.midi.ControllerEventListener, int[])
,
ControllerEventListener