-
- 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 classSequencer.SyncModeSyncMode对象表示MIDI音序器的时间概念可以与主设备或从设备同步的方式之一。-
Nested classes/interfaces inherited from interface javax.sound.midi.MidiDevice
MidiDevice.Info
-
-
Field Summary
Fields Modifier and Type Field 描述 static intLOOP_CONTINUOUSLY一个值,指示循环应该在无限期之后继续,而不是在特定循环数之后完成。
-
方法摘要
所有方法 接口方法 抽象方法 Modifier and Type 方法 描述 int[]addControllerEventListener(ControllerEventListener listener, int[] controllers)注册一个控制器事件侦听器,只要顺序程序处理所请求的类型或类型的控制更改事件,就会收到通知。booleanaddMetaEventListener(MetaEventListener listener)注册元事件监听器,以便在序列中遇到元事件并由序列器处理时接收通知。intgetLoopCount()获取播放次数。longgetLoopEndPoint()获得循环的最终位置,以MIDI刻度。longgetLoopStartPoint()获取循环的开始位置,以MIDI刻度。Sequencer.SyncModegetMasterSyncMode()获取此音序器的当前主同步模式。Sequencer.SyncMode[]getMasterSyncModes()获取此序列器支持的一组主同步模式。longgetMicrosecondLength()获取当前序列的长度,以微秒表示,如果没有设置序列,则为0。longgetMicrosecondPosition()获取序列中的当前位置,以微秒表示。SequencegetSequence()获取序列器当前正在操作的顺序。Sequencer.SyncModegetSlaveSyncMode()获取此定序器的当前从同步模式。Sequencer.SyncMode[]getSlaveSyncModes()获取音序器支持的一组从属同步模式。floatgetTempoFactor()返回音序器的当前速度因子。floatgetTempoInBPM()获得当前节奏,以每分钟的节拍表示。floatgetTempoInMPQ()获得当前的节奏,以每季度的微秒表示。longgetTickLength()获取当前序列的长度,以MIDI刻度表示,如果没有设置序列,则为0。longgetTickPosition()获取序列中的当前位置,以MIDI刻度表示。booleangetTrackMute(int track)获取当前静音状态的轨道。booleangetTrackSolo(int track)获得目前的独奏状态。booleanisRecording()指示音序器当前正在录制。booleanisRunning()指示排序器当前是否正在运行。voidrecordDisable(Track track)禁用记录到指定的轨道。voidrecordEnable(Track track, int channel)准备指定的轨道,用于记录在特定频道上收到的事件。int[]removeControllerEventListener(ControllerEventListener listener, int[] controllers)删除控制器事件侦听器对一种或多种类型的控制器事件的兴趣。voidremoveMetaEventListener(MetaEventListener listener)如果实际上是监听器被注册,则从该定序器的注册监听器列表中移除指定的元事件监听器。voidsetLoopCount(int count)设置循环播放次数。voidsetLoopEndPoint(long tick)设置将在循环中播放的最后一个MIDI刻度。voidsetLoopStartPoint(long tick)设置将在循环中播放的第一个MIDI刻度。voidsetMasterSyncMode(Sequencer.SyncMode sync)设置此音序器使用的定时信息的来源。voidsetMicrosecondPosition(long microseconds)设置序列中的当前位置,以微秒表示。voidsetSequence(InputStream stream)设置序列发生器工作的当前序列。voidsetSequence(Sequence sequence)设置序列发生器工作的当前序列。voidsetSlaveSyncMode(Sequencer.SyncMode sync)设置定序器的从同步模式。voidsetTempoFactor(float factor)按照提供的因素来调整音序器的实际播放速度。voidsetTempoInBPM(float bpm)设置每分钟节拍的速度。voidsetTempoInMPQ(float mpq)设置每四分之一音符的微秒速度。voidsetTickPosition(long tick)以MIDI刻度设置当前音序器的位置。voidsetTrackMute(int track, boolean mute)设置轨道的静音状态。voidsetTrackSolo(int track, boolean solo)设置轨道的独奏状态。voidstart()在当前加载的序列中开始播放MIDI数据。voidstartRecording()开始录制和播放MIDI数据。voidstop()停止录制,如果有效,并播放当前加载的序列(如果有)。voidstopRecording()停止录制,如果活动。-
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()
-
-