模块 java.desktop

类 MidiSystem

java.lang.Object
javax.sound.midi.MidiSystem

public class MidiSystem extends Object
MidiSystem 类提供对已安装 MIDI 系统资源的访问,包括合成器、音序器和 MIDI 输入和输出端口等设备。一个典型的简单 MIDI 应用程序可能首先调用一个或多个 MidiSystem 方法来了解安装了哪些设备并获取该应用程序所需的设备。

该类还有用于读取包含标准 MIDI 文件数据或音库的文件、流和 URL 的方法。您可以查询 MidiSystem 以获取指定 MIDI 文件的格式。

您不能实例化 MidiSystem ;所有的方法都是静态的。

属性可用于指定默认 MIDI 设备。系统属性和属性文件都被考虑在内。 “sound.properties”属性文件是从特定于实现的位置(通常是 Java 安装目录中的 conf 目录)读取的。可选的“javax.sound.config.file”系统属性可用于指定将作为初始配置读取的属性文件。如果某个属性既作为系统属性又存在于属性文件中,则系统属性优先。如果未指定,则会在可用设备中选择合适的默认值。 Properties.load 中指定了属性文件的语法。下表列出了可用的属性键以及考虑它们的方法:

MIDI 系统属性键
属性键 接口 受影响的方法
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.InfogetName 方法返回的 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

  • 方法详情

    • getMidiDeviceInfo

      public static MidiDevice.Info [] getMidiDeviceInfo()
      获取一组信息对象,表示系统上可用的所有 MIDI 设备集。然后可以通过调用 getMidiDevice 使用返回的信息对象来获取相应的设备对象。
      返回:
      一组 MidiDevice.Info 对象,一个用于每个已安装的 MIDI 设备。如果没有安装这样的设备,则返回一个长度为 0 的数组。
    • getMidiDevice

      public static MidiDevice  getMidiDevice(MidiDevice.Info  info) throws MidiUnavailableException
      获取请求的 MIDI 设备。
      参数:
      info - 表示所需设备的设备信息对象
      返回:
      请求的设备
      抛出:
      MidiUnavailableException - 如果请求的设备由于资源限制不可用
      IllegalArgumentException - 如果信息对象不代表系统上安装的 MIDI 设备
      NullPointerException - 如果 infonull
      参见:
    • getReceiver

      public static Receiver  getReceiver() throws MidiUnavailableException
      从外部 MIDI 端口或其他默认设备获取 MIDI 接收器。返回的接收器始终实现 MidiDeviceReceiver 接口。

      如果定义了系统属性 javax.sound.midi.Receiver 或在文件“sound.properties”中定义,它用于标识提供默认接收器的设备。有关详细信息,请参阅 class description

      如果合适的 MIDI 端口不可用,则从已安装的合成器中检索接收器。

      如果默认设备提供的本机接收器未实现 MidiDeviceReceiver 接口,它将被包装在实现 MidiDeviceReceiver 接口的包装类中。相应的 Receiver 方法调用将转发给本机接收器。

      如果此方法成功返回,则隐式打开 MidiDevice Receiver 所属的(如果尚未打开)。可以通过在返回的 Receiver 上调用 close 来关闭隐式打开的设备。必须关闭所有打开的 Receiver 实例,以释放 MidiDevice 持有的系统资源。有关打开/关闭行为的详细描述,请参阅 MidiDevice 的类描述。

      返回:
      默认的 MIDI 接收器
      抛出:
      MidiUnavailableException - 如果默认接收器由于资源限制不可用,或者系统中没有安装提供接收器的设备
    • getTransmitter

      public static Transmitter  getTransmitter() throws MidiUnavailableException
      从外部 MIDI 端口或其他默认源获取 MIDI 发送器。返回的发送器始终实现 MidiDeviceTransmitter 接口。

      如果定义了系统属性 javax.sound.midi.Transmitter 或在文件“sound.properties”中定义,它用于识别提供默认发射器的设备。有关详细信息,请参阅 class description

      如果默认设备提供的本机发送器未实现 MidiDeviceTransmitter 接口,它将被包装在实现 MidiDeviceTransmitter 接口的包装类中。相应的 Transmitter 方法调用将被转发到本地发送器。

      如果此方法成功返回,则隐式打开 MidiDevice Transmitter 所属的(如果尚未打开)。可以通过在返回的 Transmitter 上调用 close 来关闭隐式打开的设备。所有打开的 Transmitter 实例都必须关闭,以释放 MidiDevice 持有的系统资源。有关打开/关闭行为的详细描述,请参阅 MidiDevice 的类描述。

      返回:
      默认的 MIDI 发送器
      抛出:
      MidiUnavailableException - 如果默认发射器由于资源限制不可用,或者系统中没有安装提供发射器的设备
    • getSynthesizer

      public static Synthesizer  getSynthesizer() throws MidiUnavailableException
      获取默认合成器。

      如果系统属性 javax.sound.midi.Synthesizer 已定义或在文件“sound.properties”中定义,则用于识别默认合成器。有关详细信息,请参阅 class description

      返回:
      默认合成器
      抛出:
      MidiUnavailableException - 如果由于资源限制合成器不可用,或者系统中没有安装合成器
    • getSequencer

      public static Sequencer  getSequencer() throws MidiUnavailableException
      获取默认 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

      public static Sequencer  getSequencer(boolean connected) throws MidiUnavailableException
      获取默认 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 - 如果 streamnull
      参见:
    • getSoundbank

      public static Soundbank  getSoundbank(URL  url) throws InvalidMidiDataException , IOException
      通过从指定的 URL 读取它来构造一个 Soundbank。 URL 必须指向有效的 MIDI 音库文件。
      参数:
      url - 声音库数据的来源
      返回:
      声音库
      抛出:
      InvalidMidiDataException - 如果 URL 未指向系统识别的有效 MIDI 音库数据
      IOException - 如果加载音库时发生 I/O 错误
      NullPointerException - 如果 urlnull
    • getSoundbank

      public static Soundbank  getSoundbank(File  file) throws InvalidMidiDataException , IOException
      通过从指定的 File 读取它来构造一个 SoundbankFile 必须指向有效的 MIDI 音库文件。
      参数:
      file - 声音库数据的来源
      返回:
      声音库
      抛出:
      InvalidMidiDataException - 如果 File 没有指向系统识别的有效 MIDI 音库数据
      IOException - 如果加载音库时发生 I/O 错误
      NullPointerException - 如果 filenull
    • getMidiFileFormat

      public static MidiFileFormat  getMidiFileFormat(InputStream  stream) throws InvalidMidiDataException , IOException
      获取指定输入流中数据的 MIDI 文件格式。该流必须指向系统可识别的文件类型的有效 MIDI 文件数据。

      此方法和/或其调用的代码可能需要从流中读取一些数据以确定其数据格式是否受支持。因此,实现可能需要标记流,读取足够的数据以确定其格式是否受支持,并将流的读取指针重置为其原始位置。如果输入流不允许这组操作,则此方法可能会失败并返回 IOException

      只有安装的文件阅读器可以解析的文件类型才能成功执行此操作。如果没有安装兼容的文件阅读器,即使对于有效文件,它也可能会失败并显示 InvalidMidiDataException。如果安装了兼容的文件阅读器,它也会失败并显示 InvalidMidiDataException,但在确定文件格式时会遇到错误。

      参数:
      stream - 应从中提取文件格式信息的输入流
      返回:
      描述 MIDI 文件格式的 MidiFileFormat 对象
      抛出:
      InvalidMidiDataException - 如果流没有指向系统识别的有效 MIDI 文件数据
      IOException - 如果在访问流时发生 I/O 异常
      NullPointerException - 如果 streamnull
      参见:
    • 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 - 如果 urlnull
      参见:
    • 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 - 如果 filenull
      参见:
    • 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 - 如果 streamnull
      参见:
    • getSequence

      public static Sequence  getSequence(URL  url) throws InvalidMidiDataException , IOException
      从指定的 URL 获取 MIDI 序列。 URL 必须指向系统识别的文件类型的有效 MIDI 文件数据。

      只有安装的文件阅读器可以解析的文件类型才能成功执行此操作。如果没有安装兼容的文件阅读器,即使对于有效文件,它也可能会失败并显示 InvalidMidiDataException。如果安装了兼容的文件读取器,它也会失败并显示 InvalidMidiDataException,但在从文件数据构造 Sequence 对象时遇到错误。

      参数:
      url - 应从中构建 Sequence 的 URL
      返回:
      基于 URL 指向的 MIDI 文件数据的 Sequence 对象
      抛出:
      InvalidMidiDataException - 如果 URL 未指向系统识别的有效 MIDI 文件数据
      IOException - 如果在访问 URL 时发生 I/O 异常
      NullPointerException - 如果 urlnull
    • getSequence

      public static Sequence  getSequence(File  file) throws InvalidMidiDataException , IOException
      从指定的 File 获得一个 MIDI 序列。 File 必须指向系统识别的文件类型的有效 MIDI 文件数据。

      只有安装的文件阅读器可以解析的文件类型才能成功执行此操作。如果没有安装兼容的文件阅读器,即使对于有效文件,它也可能会失败并显示 InvalidMidiDataException。如果安装了兼容的文件读取器,它也会失败并显示 InvalidMidiDataException,但在从文件数据构造 Sequence 对象时遇到错误。

      参数:
      file - 应该从中构建 SequenceFile
      返回:
      基于 File 指向的 MIDI 文件数据的 Sequence 对象
      抛出:
      InvalidMidiDataException - 如果文件未指向系统识别的有效 MIDI 文件数据
      IOException - 如果发生 I/O 异常
      NullPointerException - 如果 filenull
    • getMidiFileTypes

      public static int[] getMidiFileTypes()
      获取系统提供文件写入支持的MIDI文件类型集。
      返回:
      一组独特的文件类型。如果不支持任何文件类型,则返回长度为 0 的数组。
    • isFileTypeSupported

      public static boolean isFileTypeSupported(int fileType)
      表示系统是否提供对指定MIDI文件类型的文件写入支持。
      参数:
      fileType - 查询写入能力的文件类型
      返回:
      true 如果支持文件类型,否则 false
    • getMidiFileTypes

      public static int[] getMidiFileTypes(Sequence  sequence)
      获取系统可以从指定序列写入的 MIDI 文件类型集。
      参数:
      sequence - 查询 MIDI 文件类型支持的序列
      返回:
      一组唯一支持的文件类型。如果不支持任何文件类型,则返回一个长度为 0 的数组。
      抛出:
      NullPointerException - 如果 sequencenull
    • isFileTypeSupported

      public static boolean isFileTypeSupported(int fileType, Sequence  sequence)
      指示是否可以从指示的序列写入指定文件类型的 MIDI 文件。
      参数:
      fileType - 查询写入能力的文件类型
      sequence - 查询文件写入支持的顺序
      返回:
      true 如果此序列支持文件类型,否则 false
      抛出:
      NullPointerException - 如果 sequencenull
    • write

      public static int write(Sequence  in, int fileType, OutputStream  out) throws IOException
      写入表示 MIDI 文件类型的文件的字节流,该文件类型指示给提供的输出流。
      参数:
      in - 包含要写入文件的 MIDI 数据的序列
      fileType - 要写入输出流的文件的文件类型
      out - 文件数据应写入的流
      返回:
      写入输出流的字节数
      抛出:
      IOException - 如果发生 I/O 异常
      IllegalArgumentException - 如果系统不支持文件格式
      NullPointerException - 如果 inoutnull
      参见:
    • write

      public static int write(Sequence  in, int type, File  out) throws IOException
      写入表示 MIDI 文件类型的文件的字节流,该文件类型指示给提供的外部文件。
      参数:
      in - 包含要写入文件的 MIDI 数据的序列
      type - 要写入输出流的文件的文件类型
      out - 文件数据应写入的外部文件
      返回:
      写入文件的字节数
      抛出:
      IOException - 如果发生 I/O 异常
      IllegalArgumentException - 如果系统不支持文件类型
      NullPointerException - 如果 inoutnull
      参见: