- 所有超接口:
-
AutoCloseable
,MidiDevice
sequence
的硬件或软件设备称为序列器。MIDI 序列包含时间戳 MIDI 数据的列表,例如可以从标准 MIDI 文件中读取的数据。大多数序列器还提供用于创建和编辑序列的功能。
Sequencer
接口包括以下基本 MIDI 序列器操作的方法:
- 从 MIDI 文件数据获取序列
- 开始和停止播放
- 移动到序列中的任意位置
- 更改播放速度(速度)
- 将播放与内部时钟或接收到的 MIDI 消息同步
- 控制另一个设备的定时
Sequencer
可以访问的对象进行:
- 通过添加或删除单个 MIDI 事件或整个轨道来编辑数据
- 静音或独奏序列中的单个轨道
- 在播放序列时通知监听器对象遇到的任何元事件或控制变化事件
- 参见:
-
Nested Class Summary
Modifier and TypeInterfaceDescriptionstatic class
SyncMode
对象表示 MIDI 序列器的时间概念如何与主设备或从设备同步的一种方式。Nested classes/interfaces declared in interface javax.sound.midi.MidiDevice
MidiDevice.Info
-
Field Summary
-
Method Summary
Modifier and TypeMethodDescriptionint[]
addControllerEventListener
(ControllerEventListener listener, int[] controllers) 注册控制器事件监听器,以便在序列器处理所请求类型的控制变化事件时接收通知。boolean
addMetaEventListener
(MetaEventListener listener) 注册元事件监听器,以便在序列中遇到元事件并由序列器处理时接收通知。int
获取播放重复次数。long
获取循环结束位置,以 MIDI 刻度表示。long
获取循环开始位置,以 MIDI 刻度表示。获取此序列器的当前主同步模式。获取此序列器支持的主同步模式集。long
获取当前序列的长度,以微秒表示,如果未设置序列则为 0。long
获取序列中的当前位置,以微秒表示。获取 Sequencer 当前操作的序列。获取此序列器的当前从同步模式。获取序列器支持的从同步模式集。float
返回序列器的当前速度因子。float
获取当前速度,以每分钟节拍数表示。float
获取当前速度,以每四分音符的微秒数表示。long
获取当前序列的长度,以 MIDI 刻度表示,如果未设置序列则为 0。long
获取序列中的当前位置,以 MIDI 刻度表示。boolean
getTrackMute
(int track) 获取轨道的当前静音状态。boolean
getTrackSolo
(int track) 获取轨道的当前独奏状态。boolean
指示 Sequencer 当前是否正在录制。boolean
指示 Sequencer 当前是否正在运行。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
设置此序列器使用的时间信息源。void
setMicrosecondPosition
(long microseconds) 设置序列器的当前位置,以微秒表示。void
setSequence
(InputStream stream) 设置序列器当前操作的当前序列。void
setSequence
(Sequence sequence) 设置序列器当前操作的当前序列。void
设置序列器的从同步模式。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
开始录制和播放 MIDI 数据。void
stop()
停止录制(如果活动)和当前加载的序列的播放(如果有)。void
停止录制(如果活动)。Methods declared in interface javax.sound.midi.MidiDevice
close, getDeviceInfo, getMaxReceivers, getMaxTransmitters, getReceiver, getReceivers, getTransmitter, getTransmitters, isOpen, open
-
Field Details
-
LOOP_CONTINUOUSLY
static final int LOOP_CONTINUOUSLY表示循环应该无限继续而不是在特定循环次数后完成。- 自 JDK 版本:
- 1.5
- 参见:
-
-
Method Details
-
setSequence
设置序列器当前操作的当前序列。即使
Sequencer
已关闭,也可以调用此方法。- 参数:
-
sequence
- 要加载的序列 - 抛出:
-
InvalidMidiDataException
- 如果序列包含无效的 MIDI 数据,或不受支持
-
setSequence
设置序列器当前操作的当前序列。流必须指向 MIDI 文件数据。即使
Sequencer
已关闭,也可以调用此方法。- 参数:
-
stream
- 包含 MIDI 文件数据的流 - 抛出:
-
IOException
- 如果在读取流时发生 I/O 异常 -
InvalidMidiDataException
- 如果在流中遇到无效数据,或流不受支持
-
getSequence
Sequence getSequence()获取 Sequencer 当前操作的序列。即使
Sequencer
已关闭,也可以调用此方法。- 返回:
-
当前序列,如果当前未设置序列则返回
null
-
start
void start()开始播放当前加载的序列中的 MIDI 数据。播放将从当前位置开始。如果播放位置达到循环结束点,并且循环计数大于 0,则播放将在使用setLoopCount
设置的重复次数后恢复到循环开始点。之后,或者如果循环计数为 0,则播放将继续播放到序列的结尾。实现确保在跳转到循环开始点时将合成器带到一致状态,通过发送适当的控制器、音高弯曲和程序更改事件。
- 抛出:
-
IllegalStateException
- 如果Sequencer
已关闭 - 参见:
-
stop
void stop()停止录制(如果活动),以及当前加载的序列的播放(如果有)。- 抛出:
-
IllegalStateException
- 如果Sequencer
已关闭 - 参见:
-
isRunning
boolean isRunning()指示 Sequencer 当前是否正在运行。默认为false
。当调用start()
或startRecording()
时,Sequencer 开始运行。然后,直到播放序列完成或调用stop()
,isRunning
将返回true
。- 返回:
-
如果 Sequencer 正在运行,则返回
true
,否则返回false
-
startRecording
void startRecording()开始录制和播放 MIDI 数据。数据将记录到所有已启用的轨道,对于启用了的通道,数据将记录到这些通道上。录制从序列器的当前位置开始。已在轨道中的任何事件将在录制会话的持续时间内被覆盖。当前加载的序列(如果有)的事件将与录制期间接收到的消息一起传递到序列器的发射器。请注意,默认情况下,轨道未启用录制。为了录制 MIDI 数据,至少必须专门启用一个轨道以进行录制。
- 抛出:
-
IllegalStateException
- 如果Sequencer
已关闭 - 参见:
-
stopRecording
void stopRecording()停止录制,如果正在进行中。当前序列的播放将继续。- 抛出:
-
IllegalStateException
- 如果Sequencer
已关闭 - 参见:
-
isRecording
boolean isRecording()指示Sequencer
当前是否正在录制。默认值为false
。当调用startRecording()
时,Sequencer
开始录制,然后在调用stop()
或stopRecording()
之前返回true
。- 返回:
-
如果
Sequencer
正在录制,则为true
,否则为false
-
recordEnable
为接收特定通道上的事件而准备指定的轨道进行录制。一旦启用,当录制处于活动状态时,轨道将接收事件。- 参数:
-
track
- 将记录事件的轨道 -
channel
- 将接收事件的通道。如果通道值为-1,则轨道将接收来自所有通道的数据。 - 抛出:
-
IllegalArgumentException
- 如果轨道不是当前序列的一部分
-
recordDisable
禁用对指定轨道的录制。事件将不再记录到此轨道中。- 参数:
-
track
- 要禁用录制的轨道,或null
以禁用所有轨道的录制
-
getTempoInBPM
float getTempoInBPM()获取当前的速度,以每分钟节拍数表示。播放速度的实际速度是返回值和速度因子的乘积。- 返回:
- 每分钟节拍数的当前速度
- 参见:
-
setTempoInBPM
void setTempoInBPM(float bpm) 设置每分钟的速度。播放速度的实际速度是指定值和速度因子的乘积。- 参数:
-
bpm
- 每分钟的新速度 - 参见:
-
getTempoInMPQ
float getTempoInMPQ()获取当前的速度,以每四分音符的微秒数表示。播放速度的实际速度是返回值和速度因子的乘积。- 返回:
- 每四分音符的当前速度的微秒数
- 参见:
-
setTempoInMPQ
void setTempoInMPQ(float mpq) 设置每四分音符的速度。播放速度的实际速度是指定值和速度因子的乘积。- 参数:
-
mpq
- 每四分音符的新速度的微秒数 - 参见:
-
setTempoFactor
void setTempoFactor(float factor) 通过提供的因子调整Sequencer
的实际播放速度。默认值为1.0。值为1.0表示自然速率(序列中指定的速度),2.0表示两倍速,依此类推。速度因子不会影响getTempoInMPQ()
和getTempoInBPM()
返回的值。这些值表示缩放之前的速度。请注意,在使用外部同步时无法调整速度因子。在这种情况下,
setTempoFactor
始终将速度因子设置为1.0。- 参数:
-
factor
- 请求的速度标量 - 参见:
-
getTempoFactor
float getTempoFactor()返回Sequencer
的当前速度因子。默认值为1.0。- 返回:
- 速度因子
- 参见:
-
getTickLength
long getTickLength()获取当前序列的长度,以MIDI滴答表示,如果未设置序列则为0。- 返回:
- 滴答中序列的长度
-
getTickPosition
long getTickPosition()获取当前序列中的位置,以MIDI滴答表示。 (滴答的持续时间由速度和存储在Sequence
中的时间分辨率共同确定。)- 返回:
- 当前滴答
- 参见:
-
setTickPosition
void setTickPosition(long tick) 设置MIDI滴答中的当前Sequencer
位置。- 参数:
-
tick
- 所需的滴答位置 - 参见:
-
getMicrosecondLength
long getMicrosecondLength()获取当前序列的长度,以微秒表示,如果未设置序列则为0。- 返回:
- 微秒中序列的长度
-
getMicrosecondPosition
long getMicrosecondPosition()获取当前序列中的位置,以微秒表示。- 指定者:
-
getMicrosecondPosition
在接口MidiDevice
- 返回:
- 微秒中的当前位置
- 参见:
-
setMicrosecondPosition
void setMicrosecondPosition(long microseconds) 设置当前位置,以微秒表示。- 参数:
-
microseconds
- 期望的微秒位置 - 参见:
-
setMasterSyncMode
设置此Sequencer
使用的时间信息源。Sequencer
与主时钟同步,主时钟可以是内部时钟、MIDI时钟或MIDI时间码,具体取决于sync
的值。sync
参数必须是由getMasterSyncModes()
返回的受支持模式之一。- 参数:
-
sync
- 所需的主同步模式 - 参见:
-
getMasterSyncMode
Sequencer.SyncMode getMasterSyncMode()获取此Sequencer
的当前主同步模式。- 返回:
- 当前主同步模式
- 参见:
-
getMasterSyncModes
Sequencer.SyncMode[] getMasterSyncModes()获取此Sequencer
支持的主同步模式集。- 返回:
- 可用的主同步模式
- 参见:
-
setSlaveSyncMode
- 参数:
-
sync
- 所需的从属同步模式 - 参见:
-
getSlaveSyncMode
Sequencer.SyncMode getSlaveSyncMode()获取此Sequencer
的当前从属同步模式。- 返回值:
- 当前从属同步模式
- 参见:
-
getSlaveSyncModes
Sequencer.SyncMode[] getSlaveSyncModes()获取序列器支持的从属同步模式集合。- 返回值:
- 可用的从属同步模式
- 参见:
-
setTrackMute
void setTrackMute(int track, boolean mute) 设置轨道的静音状态。此方法可能因多种原因而失败。例如,指定的轨道号可能对当前序列无效,或者序列器可能不支持此功能。需要验证此操作是否成功的应用程序应在此调用后调用getTrackMute(int)
。- 参数:
-
track
- 轨道号。当前序列中的轨道编号从0到序列中轨道数减1。 -
mute
- 轨道的新静音状态。true
表示应该静音轨道,false
表示应该取消静音轨道。 - 参见:
-
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
表示应该取消独奏轨道。 - 参见:
-
getTrackSolo
boolean getTrackSolo(int track) 获取轨道的当前独奏状态。所有未独奏的轨道的默认独奏状态为false。如果指定的轨道未被独奏,则此方法应返回false。这适用于序列器不支持轨道独奏,以及指定的轨道索引无效的情况。- 参数:
-
track
- 轨道号。当前序列中的轨道编号从0到序列中轨道数减1。 - 返回值:
-
如果独奏则为
true
,如果未独奏则为false
-
addMetaEventListener
注册元事件监听器,以便在序列中遇到元事件并由序列器处理时接收通知。如果例如,此类序列器不支持元事件通知,则此方法可能失败。- 参数:
-
listener
- 要添加的监听器 - 返回值:
-
如果成功添加监听器则为
true
,否则为false
- 参见:
-
removeMetaEventListener
从此序列器的已注册监听器列表中移除指定的元事件监听器,如果实际上该监听器已注册。- 参数:
-
listener
- 要移除的元事件监听器 - 参见:
-
addControllerEventListener
注册控制器事件监听器,以便在序列器处理请求类型或类型的控制器事件时接收通知。类型由controllers
参数指定,该参数应包含一个MIDI控制器编号的数组。(每个编号应在0到127之间,包括0和127。有关对应于各种控制器类型的编号,请参阅MIDI 1.0规范。)返回的数组包含现在监听器将接收事件的MIDI控制器编号。某些序列器可能不支持控制器事件通知,在这种情况下,数组的长度为0。其他序列器可能支持某些控制器的通知,但不支持全部。可以重复调用此方法。每次调用时,返回的数组指示监听器将收到通知的所有控制器,而不仅仅是在特定调用中请求的控制器。
- 参数:
-
listener
- 要添加到已注册监听器列表中的控制器事件监听器 -
controllers
- 请求更改通知的MIDI控制器编号 - 返回值:
- 现在将向指定监听器报告所有MIDI控制器的编号
- 参见:
-
removeControllerEventListener
移除控制器事件监听器对一个或多个类型的控制器事件的兴趣。controllers
参数是一个与控制器对应的MIDI编号数组,表示监听器不再接收更改通知的控制器。要完全从已注册监听器列表中删除此监听器,请为controllers
传入null
。返回的数组包含现在监听器将接收事件的MIDI控制器编号。如果监听器不会接收任何控制器的更改通知,则数组的长度为0。- 参数:
-
listener
- 旧监听器 -
controllers
- 应取消更改通知的MIDI控制器编号,或者为所有控制器取消传入null
- 返回值:
- 现在将向指定监听器报告所有MIDI控制器的编号
- 参见:
-
setLoopStartPoint
void setLoopStartPoint(long tick) 设置将在循环中播放的第一个MIDI滴答。如果循环计数大于0,则在达到循环结束点时播放将跳转到此点。起始点为0表示加载序列的开头。起始点必须小于或等于结束点,并且必须落在加载序列的范围内。
序列器的循环起始点默认为序列的开头。
- 参数:
-
tick
- 循环的起始位置,以MIDI滴答为单位(从零开始) - 抛出:
-
IllegalArgumentException
- 如果无法设置请求的循环起始点,通常是因为它超出了序列的持续时间或因为起始点在结束点之后 - 自:
- 1.5
- 参见:
-
getLoopStartPoint
long getLoopStartPoint()获取循环的开始位置,以MIDI滴答为单位。- 返回值:
- 循环的开始位置,以MIDI滴答为单位(从零开始)
- 自:
- 1.5
- 参见:
-
setLoopEndPoint
void setLoopEndPoint(long tick) 设置将在循环中播放的最后一个MIDI滴答。如果循环计数为0,则循环结束点不起作用,播放将继续播放到达循环结束点时。结束点为-1表示序列的最后一个滴答。否则,结束点必须大于或等于起始点,并且必须落在加载序列的范围内。
序列器的循环结束点默认为-1,表示序列的结尾。
- 参数:
-
tick
- 循环的结束位置,以MIDI滴答数(从零开始)表示,或者为-1表示最终滴答数 - 抛出:
-
IllegalArgumentException
- 如果无法设置请求的循环点,通常是因为超出了序列的持续时间或者结束点在起始点之前 - 自版本:
- 1.5
- 另请参阅:
-
getLoopEndPoint
long getLoopEndPoint()获取循环的结束位置,以MIDI滴答数表示。- 返回:
- 循环的结束位置,以MIDI滴答数(从零开始)表示,或者为-1表示序列的结束
- 自版本:
- 1.5
- 另请参阅:
-
setLoopCount
void setLoopCount(int count) 设置循环播放的重复次数。当播放位置达到循环结束点时,它将循环返回到循环起始点count
次,之后播放将继续播放到序列的结束。如果在调用此方法时的当前位置大于循环结束点,则播放将继续到序列的结束而不会循环,除非后续更改了循环结束点。
count
值为0将禁用循环:播放将继续到循环结束点,而不会循环回到循环起始点。这是一个序列器的默认设置。如果在循环过程中停止播放,则当前循环状态将被清除;后续的开始请求不受中断的循环操作影响。
- 参数:
-
count
- 播放应该从循环的结束位置回到循环的起始位置的次数,或者LOOP_CONTINUOUSLY
表示循环应该持续直到中断 - 抛出:
-
IllegalArgumentException
- 如果count
为负且不等于LOOP_CONTINUOUSLY
- 自版本:
- 1.5
- 另请参阅:
-
getLoopCount
int getLoopCount()获取播放的重复次数。- 返回:
- 播放到序列结束后的循环次数
- 自版本:
- 1.5
- 另请参阅:
-