MidiSystem 类提供对已安装 MIDI 系统资源的访问,包括合成器、音序器和 MIDI 输入和输出端口等设备。一个典型的简单 MIDI 应用程序可能首先调用一个或多个 MidiSystem 方法来了解安装了哪些设备并获取该应用程序所需的设备。
该类还有用于读取包含标准 MIDI 文件数据或音库的文件、流和 URL 的方法。您可以查询 MidiSystem 以获取指定 MIDI 文件的格式。
您不能实例化 MidiSystem ;所有的方法都是静态的。
属性可用于指定默认 MIDI 设备。系统属性和属性文件都被考虑在内。 “sound.properties”属性文件是从特定于实现的位置(通常是 Java 安装目录中的 conf 目录)读取的。可选的“javax.sound.config.file”系统属性可用于指定将作为初始配置读取的属性文件。如果某个属性既作为系统属性又存在于属性文件中,则系统属性优先。如果未指定,则会在可用设备中选择合适的默认值。 Properties.load 中指定了属性文件的语法。下表列出了可用的属性键以及考虑它们的方法:
| 属性键 | 接口 | 受影响的方法 |
|---|---|---|
javax.sound.midi.Receiver |
Receiver |
getReceiver() |
javax.sound.midi.Sequencer |
Sequencer |
getSequencer() |
javax.sound.midi.Synthesizer |
Synthesizer |
getSynthesizer() |
javax.sound.midi.Transmitter |
Transmitter |
getTransmitter() |
MIDI device provider 类的完全限定名称。设备名称与 MidiDevice.Info 的 getName 方法返回的 String 相匹配。可以省略类名或设备名。如果仅指定了类名,则尾随散列标记是可选的。
如果指定了提供程序类,并且可以从已安装的提供程序中成功检索到它,则会从提供程序中检索 MidiDevice.Info 对象列表。否则,或者当这些设备不提供后续匹配项时,将从 getMidiDeviceInfo() 检索列表以包含所有可用的 MidiDevice.Info 对象。
如果指定了设备名称,则会搜索 MidiDevice.Info 对象的结果列表:将返回第一个具有匹配名称且其 MidiDevice 实现相应接口的对象。如果未找到匹配的 MidiDevice.Info 对象,或者未指定设备名称,则将返回结果列表中的第一个合适的设备。对于 Sequencer 和 Synthesizer,如果设备实现了相应的接口,则该设备是合适的;而对于 Receiver 和 Transmitter,如果设备既不实现 Sequencer 也不实现 Synthesizer 并且分别提供至少一个 Receiver 或 Transmitter,则该设备是合适的。
例如,当调用 getReceiver 时,值为 "com.sun.media.sound.MidiProvider#SunMIDI1" 的属性 javax.sound.midi.Receiver 将产生以下结果:如果类 com.sun.media.sound.MidiProvider 存在于已安装的 MIDI 设备提供程序列表中,则将返回名称为 "SunMIDI1" 的第一个 Receiver 设备。如果找不到,将返回来自该提供者的第一个 Receiver,无论名称如何。如果没有,则返回所有设备列表中名称为 "SunMIDI1" 的第一个 Receiver(由 getMidiDeviceInfo 返回),或者,如果未找到,则返回可在所有设备列表中找到的第一个 Receiver。如果同样失败,则会抛出 MidiUnavailableException。
-
方法总结
修饰符和类型方法描述static MidiDevicegetMidiDevice(MidiDevice.Info info) 获取请求的 MIDI 设备。static MidiDevice.Info[]获取一组信息对象,表示系统上可用的所有 MIDI 设备集。static MidiFileFormatgetMidiFileFormat(File file) 获取指定File的 MIDI 文件格式。static MidiFileFormatgetMidiFileFormat(InputStream stream) 获取指定输入流中数据的 MIDI 文件格式。static MidiFileFormatgetMidiFileFormat(URL url) 获取指定 URL 中数据的 MIDI 文件格式。static int[]获取系统提供文件写入支持的MIDI文件类型集。static int[]getMidiFileTypes(Sequence sequence) 获取系统可以从指定序列写入的 MIDI 文件类型集。static Receiver从外部 MIDI 端口或其他默认设备获取 MIDI 接收器。static SequencegetSequence(File file) 从指定的File获得一个 MIDI 序列。static SequencegetSequence(InputStream stream) 从指定的输入流中获取一个 MIDI 序列。static SequencegetSequence(URL url) 从指定的 URL 获取 MIDI 序列。static Sequencer获取默认Sequencer,连接到默认设备。static SequencergetSequencer(boolean connected) 获取默认Sequencer,可选择连接到默认设备。static SoundbankgetSoundbank(File file) 通过从指定的File读取它来构造一个Soundbank。static SoundbankgetSoundbank(InputStream stream) 通过从指定的流中读取它来构造一个 MIDI 声音库。static SoundbankgetSoundbank(URL url) 通过从指定的 URL 读取它来构造一个Soundbank。static Synthesizer获取默认合成器。static Transmitter从外部 MIDI 端口或其他默认源获取 MIDI 发送器。static booleanisFileTypeSupported(int fileType) 表示系统是否提供对指定MIDI文件类型的文件写入支持。static booleanisFileTypeSupported(int fileType, Sequence sequence) 指示是否可以从指示的序列写入指定文件类型的 MIDI 文件。static int写入表示 MIDI 文件类型的文件的字节流,该文件类型指示给提供的外部文件。static intwrite(Sequence in, int fileType, OutputStream out) 写入表示 MIDI 文件类型的文件的字节流,该文件类型指示给提供的输出流。
-
方法详情
-
getMidiDeviceInfo
获取一组信息对象,表示系统上可用的所有 MIDI 设备集。然后可以通过调用getMidiDevice使用返回的信息对象来获取相应的设备对象。- 返回:
-
一组
MidiDevice.Info对象,一个用于每个已安装的 MIDI 设备。如果没有安装这样的设备,则返回一个长度为 0 的数组。
-
getMidiDevice
获取请求的 MIDI 设备。- 参数:
info- 表示所需设备的设备信息对象- 返回:
- 请求的设备
- 抛出:
MidiUnavailableException- 如果请求的设备由于资源限制不可用IllegalArgumentException- 如果信息对象不代表系统上安装的 MIDI 设备NullPointerException- 如果info是null- 参见:
-
getReceiver
从外部 MIDI 端口或其他默认设备获取 MIDI 接收器。返回的接收器始终实现MidiDeviceReceiver接口。如果定义了系统属性
javax.sound.midi.Receiver或在文件“sound.properties”中定义,它用于标识提供默认接收器的设备。有关详细信息,请参阅class description。如果合适的 MIDI 端口不可用,则从已安装的合成器中检索接收器。
如果默认设备提供的本机接收器未实现
MidiDeviceReceiver接口,它将被包装在实现MidiDeviceReceiver接口的包装类中。相应的Receiver方法调用将转发给本机接收器。如果此方法成功返回,则隐式打开
MidiDeviceReceiver所属的(如果尚未打开)。可以通过在返回的Receiver上调用close来关闭隐式打开的设备。必须关闭所有打开的Receiver实例,以释放MidiDevice持有的系统资源。有关打开/关闭行为的详细描述,请参阅MidiDevice的类描述。- 返回:
- 默认的 MIDI 接收器
- 抛出:
MidiUnavailableException- 如果默认接收器由于资源限制不可用,或者系统中没有安装提供接收器的设备
-
getTransmitter
从外部 MIDI 端口或其他默认源获取 MIDI 发送器。返回的发送器始终实现MidiDeviceTransmitter接口。如果定义了系统属性
javax.sound.midi.Transmitter或在文件“sound.properties”中定义,它用于识别提供默认发射器的设备。有关详细信息,请参阅class description。如果默认设备提供的本机发送器未实现
MidiDeviceTransmitter接口,它将被包装在实现MidiDeviceTransmitter接口的包装类中。相应的Transmitter方法调用将被转发到本地发送器。如果此方法成功返回,则隐式打开
MidiDeviceTransmitter所属的(如果尚未打开)。可以通过在返回的Transmitter上调用close来关闭隐式打开的设备。所有打开的Transmitter实例都必须关闭,以释放MidiDevice持有的系统资源。有关打开/关闭行为的详细描述,请参阅MidiDevice的类描述。- 返回:
- 默认的 MIDI 发送器
- 抛出:
MidiUnavailableException- 如果默认发射器由于资源限制不可用,或者系统中没有安装提供发射器的设备
-
getSynthesizer
获取默认合成器。如果系统属性
javax.sound.midi.Synthesizer已定义或在文件“sound.properties”中定义,则用于识别默认合成器。有关详细信息,请参阅class description。- 返回:
- 默认合成器
- 抛出:
MidiUnavailableException- 如果由于资源限制合成器不可用,或者系统中没有安装合成器
-
getSequencer
获取默认Sequencer,连接到默认设备。返回的Sequencer实例连接到默认的Synthesizer,由getSynthesizer()返回。如果没有可用的Synthesizer,或者无法打开默认的Synthesizer,则sequencer连接到默认的Receiver,由getReceiver()返回。通过从Sequencer检索Transmitter实例并设置其Receiver来建立连接。关闭并重新打开音序器将恢复与默认设备的连接。此方法等同于调用
getSequencer(true)。如果系统属性
javax.sound.midi.Sequencer已定义或在文件“sound.properties”中定义,则用于识别默认音序器。有关详细信息,请参阅class description。- 返回:
- 默认音序器,连接到默认接收器
- 抛出:
MidiUnavailableException- 如果 sequencer 由于资源限制不可用,或者任何安装的MidiDevice都没有Receiver可用,或者系统中没有安装 sequencer- 参见:
-
getSequencer
获取默认Sequencer,可选择连接到默认设备。如果
connected为真,则返回的Sequencer实例连接到默认值Synthesizer,由getSynthesizer()返回。如果没有可用的Synthesizer,或者无法打开默认的Synthesizer,则sequencer连接到默认的Receiver,由getReceiver()返回。通过从Sequencer检索Transmitter实例并设置其Receiver来建立连接。关闭并重新打开音序器将恢复与默认设备的连接。如果
connected为假,则返回的Sequencer实例未连接,它没有打开Transmitters。为了在 MIDI 设备或Synthesizer上播放音序器,需要获取Transmitter并设置其Receiver。如果系统属性
javax.sound.midi.Sequencer已定义或在文件“sound.properties”中定义,则用于识别默认音序器。有关详细信息,请参阅class description。- 参数:
connected- 返回的Sequencer是否连接到默认的Synthesizer- 返回:
- 默认音序器
- 抛出:
MidiUnavailableException- 如果由于资源限制,sequencer 不可用,或者系统中没有安装 sequencer,或者如果connected为真,并且任何安装的MidiDevice都没有Receiver可用- 自从:
- 1.5
- 参见:
-
getSoundbank
public static Soundbank getSoundbank(InputStream stream) throws InvalidMidiDataException , IOException 通过从指定的流中读取它来构造一个 MIDI 声音库。流必须指向有效的 MIDI 音库文件。一般来说,MIDI 音库提供者可能需要从流中读取一些数据,然后才能确定他们是否支持它。这些解析器必须能够标记流,读取足够的数据以确定它们是否支持该流,如果不支持,则将流的读取指针重置为其原始位置。如果输入流不支持这个,这个方法可能会失败并返回IOException。- 参数:
stream- 声音库数据的来源- 返回:
- 声音库
- 抛出:
InvalidMidiDataException- 如果流没有指向系统识别的有效 MIDI 音库数据IOException- 如果加载音库时发生 I/O 错误NullPointerException- 如果stream是null- 参见:
-
getSoundbank
通过从指定的 URL 读取它来构造一个Soundbank。 URL 必须指向有效的 MIDI 音库文件。- 参数:
url- 声音库数据的来源- 返回:
- 声音库
- 抛出:
InvalidMidiDataException- 如果 URL 未指向系统识别的有效 MIDI 音库数据IOException- 如果加载音库时发生 I/O 错误NullPointerException- 如果url是null
-
getSoundbank
通过从指定的File读取它来构造一个Soundbank。File必须指向有效的 MIDI 音库文件。- 参数:
file- 声音库数据的来源- 返回:
- 声音库
- 抛出:
InvalidMidiDataException- 如果File没有指向系统识别的有效 MIDI 音库数据IOException- 如果加载音库时发生 I/O 错误NullPointerException- 如果file是null
-
getMidiFileFormat
public static MidiFileFormat getMidiFileFormat(InputStream stream) throws InvalidMidiDataException , IOException 获取指定输入流中数据的 MIDI 文件格式。该流必须指向系统可识别的文件类型的有效 MIDI 文件数据。此方法和/或其调用的代码可能需要从流中读取一些数据以确定其数据格式是否受支持。因此,实现可能需要标记流,读取足够的数据以确定其格式是否受支持,并将流的读取指针重置为其原始位置。如果输入流不允许这组操作,则此方法可能会失败并返回
IOException。只有安装的文件阅读器可以解析的文件类型才能成功执行此操作。如果没有安装兼容的文件阅读器,即使对于有效文件,它也可能会失败并显示
InvalidMidiDataException。如果安装了兼容的文件阅读器,它也会失败并显示InvalidMidiDataException,但在确定文件格式时会遇到错误。- 参数:
stream- 应从中提取文件格式信息的输入流- 返回:
-
描述 MIDI 文件格式的
MidiFileFormat对象 - 抛出:
InvalidMidiDataException- 如果流没有指向系统识别的有效 MIDI 文件数据IOException- 如果在访问流时发生 I/O 异常NullPointerException- 如果stream是null- 参见:
-
getMidiFileFormat
public static MidiFileFormat getMidiFileFormat(URL url) throws InvalidMidiDataException , IOException 获取指定 URL 中数据的 MIDI 文件格式。 URL 必须指向系统识别的文件类型的有效 MIDI 文件数据。只有安装的文件阅读器可以解析的文件类型才能成功执行此操作。如果没有安装兼容的文件阅读器,即使对于有效文件,它也可能会失败并显示
InvalidMidiDataException。如果安装了兼容的文件阅读器,它也会失败并显示InvalidMidiDataException,但在确定文件格式时会遇到错误。- 参数:
url- 应从中提取文件格式信息的 URL- 返回:
-
描述 MIDI 文件格式的
MidiFileFormat对象 - 抛出:
InvalidMidiDataException- 如果 URL 未指向系统识别的有效 MIDI 文件数据IOException- 如果在访问 URL 时发生 I/O 异常NullPointerException- 如果url是null- 参见:
-
getMidiFileFormat
public static MidiFileFormat getMidiFileFormat(File file) throws InvalidMidiDataException , IOException 获取指定File的 MIDI 文件格式。File必须指向系统识别的文件类型的有效 MIDI 文件数据。只有安装的文件阅读器可以解析的文件类型才能成功执行此操作。如果没有安装兼容的文件阅读器,即使对于有效文件,它也可能会失败并显示
InvalidMidiDataException。如果安装了兼容的文件阅读器,它也会失败并显示InvalidMidiDataException,但在确定文件格式时会遇到错误。- 参数:
file- 应从中提取文件格式信息的File- 返回:
-
描述 MIDI 文件格式的
MidiFileFormat对象 - 抛出:
InvalidMidiDataException- 如果File没有指向系统识别的有效 MIDI 文件数据IOException- 如果在访问文件时发生 I/O 异常NullPointerException- 如果file是null- 参见:
-
getSequence
public static Sequence getSequence(InputStream stream) throws InvalidMidiDataException , IOException 从指定的输入流中获取一个 MIDI 序列。该流必须指向系统可识别的文件类型的有效 MIDI 文件数据。此方法和/或其调用的代码可能需要从流中读取一些数据以确定其数据格式是否受支持。因此,实现可能需要标记流,读取足够的数据以确定其格式是否受支持,并将流的读取指针重置为其原始位置。如果输入流不允许这组操作,则此方法可能会失败并返回
IOException。只有安装的文件阅读器可以解析的文件类型才能成功执行此操作。如果没有安装兼容的文件阅读器,即使对于有效文件,它也可能会失败并显示
InvalidMidiDataException。如果安装了兼容的文件读取器,它也会失败并显示InvalidMidiDataException,但在从文件数据构造Sequence对象时遇到错误。- 参数:
stream- 应从中构造Sequence的输入流- 返回:
-
基于输入流中包含的 MIDI 文件数据的
Sequence对象 - 抛出:
InvalidMidiDataException- 如果流没有指向系统识别的有效 MIDI 文件数据IOException- 如果在访问流时发生 I/O 异常NullPointerException- 如果stream是null- 参见:
-
getSequence
从指定的 URL 获取 MIDI 序列。 URL 必须指向系统识别的文件类型的有效 MIDI 文件数据。只有安装的文件阅读器可以解析的文件类型才能成功执行此操作。如果没有安装兼容的文件阅读器,即使对于有效文件,它也可能会失败并显示
InvalidMidiDataException。如果安装了兼容的文件读取器,它也会失败并显示InvalidMidiDataException,但在从文件数据构造Sequence对象时遇到错误。- 参数:
url- 应从中构建Sequence的 URL- 返回:
-
基于 URL 指向的 MIDI 文件数据的
Sequence对象 - 抛出:
InvalidMidiDataException- 如果 URL 未指向系统识别的有效 MIDI 文件数据IOException- 如果在访问 URL 时发生 I/O 异常NullPointerException- 如果url是null
-
getSequence
从指定的File获得一个 MIDI 序列。File必须指向系统识别的文件类型的有效 MIDI 文件数据。只有安装的文件阅读器可以解析的文件类型才能成功执行此操作。如果没有安装兼容的文件阅读器,即使对于有效文件,它也可能会失败并显示
InvalidMidiDataException。如果安装了兼容的文件读取器,它也会失败并显示InvalidMidiDataException,但在从文件数据构造Sequence对象时遇到错误。- 参数:
file- 应该从中构建Sequence的File- 返回:
-
基于 File 指向的 MIDI 文件数据的
Sequence对象 - 抛出:
InvalidMidiDataException- 如果文件未指向系统识别的有效 MIDI 文件数据IOException- 如果发生 I/O 异常NullPointerException- 如果file是null
-
getMidiFileTypes
public static int[] getMidiFileTypes()获取系统提供文件写入支持的MIDI文件类型集。- 返回:
- 一组独特的文件类型。如果不支持任何文件类型,则返回长度为 0 的数组。
-
isFileTypeSupported
public static boolean isFileTypeSupported(int fileType) 表示系统是否提供对指定MIDI文件类型的文件写入支持。- 参数:
fileType- 查询写入能力的文件类型- 返回:
true如果支持文件类型,否则false
-
getMidiFileTypes
获取系统可以从指定序列写入的 MIDI 文件类型集。- 参数:
sequence- 查询 MIDI 文件类型支持的序列- 返回:
- 一组唯一支持的文件类型。如果不支持任何文件类型,则返回一个长度为 0 的数组。
- 抛出:
NullPointerException- 如果sequence是null
-
isFileTypeSupported
指示是否可以从指示的序列写入指定文件类型的 MIDI 文件。- 参数:
fileType- 查询写入能力的文件类型sequence- 查询文件写入支持的顺序- 返回:
true如果此序列支持文件类型,否则false- 抛出:
NullPointerException- 如果sequence是null
-
write
写入表示 MIDI 文件类型的文件的字节流,该文件类型指示给提供的输出流。- 参数:
in- 包含要写入文件的 MIDI 数据的序列fileType- 要写入输出流的文件的文件类型out- 文件数据应写入的流- 返回:
- 写入输出流的字节数
- 抛出:
IOException- 如果发生 I/O 异常IllegalArgumentException- 如果系统不支持文件格式NullPointerException- 如果in或out是null- 参见:
-
write
写入表示 MIDI 文件类型的文件的字节流,该文件类型指示给提供的外部文件。- 参数:
in- 包含要写入文件的 MIDI 数据的序列type- 要写入输出流的文件的文件类型out- 文件数据应写入的外部文件- 返回:
- 写入文件的字节数
- 抛出:
IOException- 如果发生 I/O 异常IllegalArgumentException- 如果系统不支持文件类型NullPointerException- 如果in或out是null- 参见:
-