public interface Synthesizer
Synthesizer 生成声音。这通常发生在某个 Synthesizer 的 MidiChannel 对象直接或通过 Synthesizer 对象接收到 noteOn 消息时。很多 Synthesizer 都支持 Receiver,通过后者可将 MIDI 事件发送至 Synthesizer。这种情况下,Synthesizer 通常的响应是发送一个相应的消息至合适的 MidiChannel,如果事件不是 MIDI 通道消息之一,则自己处理该事件。
Synthesizer 接口包括可从音库加载和卸载乐器 (instrument) 的方法。一个乐器就是用于合成某种声音类型的规范,无论这种声音模仿的是传统乐器还是某种音效或其他想象出来的声音。音库是通过库和程序号组织的一组乐器(通过乐器的 Patch 对象)。不同的 Synthesizer 类可实现不同的声音合成技巧,这意味着某些乐器可以与给定的合成器兼容,而另一些则不行。同样,合成器可以为乐器保留有限的内存量,这意味着不是每种合成器都可使用每种音库和乐器,即使合成技术兼容时也是如此。要查看取自某种音库的乐器是否可由给定的合成器演奏,可调用 Synthesizer 的 isSoundbankSupported 方法。
“加载”乐器意味着该乐器可用于合成音符。乐器加载至由其 Patch 对象指定的库和程序位置。加载并不一定意味着后续演奏的音符将立即具有此新加载乐器的声音。要使乐器演奏音符,某个合成器的 MidiChannel 对象必须接收(或已经接收)可使该特定乐器的库和程序号被选中的程序更改消息。
MidiSystem.getSynthesizer(),
Soundbank,
Instrument,
MidiChannel.programChange(int, int),
Receiver,
Transmitter,
MidiDevice
| 嵌套类摘要 |
|---|
| 从接口 javax.sound.midi.MidiDevice 继承的嵌套类/接口 |
|---|
MidiDevice.Info |
| 方法摘要 | |
|---|---|
Instrument[] |
getAvailableInstruments() 获得该合成器随附的乐器列表。 |
MidiChannel[] |
getChannels() 获得此合成器控制的一组 MIDI 通道。 |
Soundbank |
getDefaultSoundbank() 获得合成器的默认音库(如果合成器存在)。 |
long |
getLatency() 获得此合成器导致的处理延迟,用微秒表示。 |
Instrument[] |
getLoadedInstruments() 获得当前加载到此 Synthesizer 中的乐器列表。 |
int |
getMaxPolyphony() 获得此合成器可同时发声的最大音符数。 |
VoiceStatus[] |
getVoiceStatus() 获得由此合成器生成的声音的当前状态。 |
boolean |
isSoundbankSupported(Soundbank soundbank) 通知调用者此合成器是否能够从指定的音库加载乐器。 |
boolean |
loadAllInstruments(Soundbank soundbank) 将指定 Soundbank 中包含的所有乐器加载到 Synthesizer 中。 |
boolean |
loadInstrument(Instrument instrument) 让特定的乐器可用于合成。 |
boolean |
loadInstruments(Soundbank soundbank, Patch[] patchList) 从指定 Soundbank 加载指定修补程序所引用的乐器。 |
boolean |
remapInstrument(Instrument from, Instrument to) 重新映射一个乐器。 |
void |
unloadAllInstruments(Soundbank soundbank) 卸载指定 Soundbank 中包含的所有乐器。 |
void |
unloadInstrument(Instrument instrument) 卸载特定的乐器。 |
void |
unloadInstruments(Soundbank soundbank, Patch[] patchList) 从指定的 MIDI 音库中卸载指定修补程序所引用的乐器。 |
| 从接口 javax.sound.midi.MidiDevice 继承的方法 |
|---|
close, getDeviceInfo, getMaxReceivers, getMaxTransmitters, getMicrosecondPosition, getReceiver, getReceivers, getTransmitter, getTransmitters, isOpen, open |
| 方法详细信息 |
|---|
int getMaxPolyphony()
getVoiceStatus()
long getLatency()
尽管延迟用微秒表示,但合成器实际延迟测量值的变化范围可能远大于此精度所建议的时间(微秒)。例如,合成器最坏的情况下可能延迟几个毫秒或更多。
MidiChannel[] getChannels()
MidiChannel,可接收该通道号上发送的 MIDI 消息。
MIDI 1.0 规范提供 16 个通道,所以此方法返回一个至少有 16 个元素的数组。但是,如果此合成器不使用所有的 16 个通道,则数组中的某些元素可能为 null,所以应在使用前检查每个元素。
Synthesizer 管理的
MidiChannel 对象数组。有些数组元素可能为
null。
VoiceStatus[] getVoiceStatus()
Synthesizer 类未提供声音信息,则返回的数组长度将始终为 0。否则其长度始终等于声音总数,与
getMaxPolyphony() 的返回结果一样。(有关合成器声音的说明,请参阅
VoiceStatus 类描述。)
VoiceStatus 对象数组,该对象提供关于相应合成器声音的信息
getMaxPolyphony(),
VoiceStatus
boolean isSoundbankSupported(Soundbank soundbank)
IllegalArgumentException。
soundbank - 查询其是否受支持的音库
true,否则返回
false
loadInstruments(javax.sound.midi.Soundbank, javax.sound.midi.Patch[]),
loadAllInstruments(javax.sound.midi.Soundbank),
unloadInstruments(javax.sound.midi.Soundbank, javax.sound.midi.Patch[]),
unloadAllInstruments(javax.sound.midi.Soundbank),
getDefaultSoundbank()
boolean loadInstrument(Instrument instrument)
Patch 对象指定的修补程序位置,所以如果接收到(或已经收到)导致该修补程序被选中的程序更改消息,则使用
instrument 的声音演奏随后的音符。如果已加载指定的乐器,则此方法不执行任何操作并返回
true。
该乐器必须是此 Synthesizer 支持的音库的一部分。(可以使用 Instrument 的 getSoundbank 方法和 Synthesizer 的 isSoundbankSupported 方法验证。)
instrument - 要加载的乐器
true,如果乐器无法加载(例如,合成器内存不足无法加载),则返回
false
IllegalArgumentException - 如果此
Synthesizer 不支持指定乐器的音库
unloadInstrument(javax.sound.midi.Instrument),
loadInstruments(javax.sound.midi.Soundbank, javax.sound.midi.Patch[]),
loadAllInstruments(javax.sound.midi.Soundbank),
remapInstrument(javax.sound.midi.Instrument, javax.sound.midi.Instrument),
SoundbankResource.getSoundbank(),
MidiChannel.programChange(int, int)
void unloadInstrument(Instrument instrument)
instrument - 要卸载的乐器
IllegalArgumentException - 如果此
Synthesizer 不支持指定乐器的音库
loadInstrument(javax.sound.midi.Instrument),
unloadInstruments(javax.sound.midi.Soundbank, javax.sound.midi.Patch[]),
unloadAllInstruments(javax.sound.midi.Soundbank),
getLoadedInstruments(),
remapInstrument(javax.sound.midi.Instrument, javax.sound.midi.Instrument)
boolean remapInstrument(Instrument from, Instrument to)
to 将替换乐器
from。
from 位于库号 2,即程序号 11 的位置,则重新映射导致该库和程序位置被
to 所占用。
from 被卸载。
通过调用 loadInstrument(javax.sound.midi.Instrument)、loadInstruments(javax.sound.midi.Soundbank, javax.sound.midi.Patch[]) 或 loadAllInstruments(javax.sound.midi.Soundbank) 之一,可以取消对重载乐器 from 的重新映射。
from - 要替换的
Instrument 对象
to - 用来替换旧乐器的
Instrument 对象,应该将它加载到合成器中
true,如果合成器没有实现此功能,则返回
false
IllegalArgumentException - 如果乐器
from 或乐器
to 不受合成器的支持,或者没有加载乐器
to
NullPointerException - 如果
from 或
to 参数使用 null 值
loadInstrument(javax.sound.midi.Instrument),
loadInstruments(javax.sound.midi.Soundbank, javax.sound.midi.Patch[]),
loadAllInstruments(javax.sound.midi.Soundbank)
Soundbank getDefaultSoundbank()
null。
isSoundbankSupported(javax.sound.midi.Soundbank)
Instrument[] getAvailableInstruments()
注意,不能使用此方法查找当前加载到合成器中的乐器;如果要查找,可使用 getLoadedInstruments()。此方法也不指示可加载到合成器中的所有乐器;它仅指示合成器随附的乐器子集。要了解是否可加载另一个乐器,可以调用 isSoundbankSupported(),如果支持该乐器的 Soundbank,则可尝试加载该乐器。
Instrument[] getLoadedInstruments()
Synthesizer 中的乐器列表。
loadInstrument(javax.sound.midi.Instrument),
getAvailableInstruments(),
Soundbank.getInstruments()
boolean loadAllInstruments(Soundbank soundbank)
Soundbank 中包含的所有乐器加载到
Synthesizer 中。
soundbank - 将被加载乐器的
Soundbank
true;如果有乐器无法加载(例如,
Synthesizer 没有足够的内存),则返回
false
IllegalArgumentException - 如果所请求的音库与此合成器不兼容。
isSoundbankSupported(javax.sound.midi.Soundbank),
loadInstrument(javax.sound.midi.Instrument),
loadInstruments(javax.sound.midi.Soundbank, javax.sound.midi.Patch[])
void unloadAllInstruments(Soundbank soundbank)
Soundbank 中包含的所有乐器。
soundbank - 包含要卸载的乐器的音库
IllegalArgumentException - 如果不支持该音库。
isSoundbankSupported(javax.sound.midi.Soundbank),
unloadInstrument(javax.sound.midi.Instrument),
unloadInstruments(javax.sound.midi.Soundbank, javax.sound.midi.Patch[])
boolean loadInstruments(Soundbank soundbank, Patch[] patchList)
Soundbank 加载指定修补程序所引用的乐器。每个
Patch 对象都指示一个库和程序号;具有匹配的
Patch 的
Instrument 将被加载至该库和程序位置。
soundbank - 包含要加载的乐器的
Soundbank
patchList - 应为其加载乐器的修补程序列表
true,如果有乐器无法加载(例如,
Synthesizer 没有足够的内存),则返回
false
IllegalArgumentException - 如果不支持该音库。
isSoundbankSupported(javax.sound.midi.Soundbank),
Instrument.getPatch(),
loadAllInstruments(javax.sound.midi.Soundbank),
loadInstrument(javax.sound.midi.Instrument),
Soundbank.getInstrument(Patch),
Sequence.getPatchList()
void unloadInstruments(Soundbank soundbank, Patch[] patchList)
soundbank - 包含要卸载的乐器的音库
patchList - 应为其卸载乐器的修补程序列表
IllegalArgumentException - 如果不支持该音库。
unloadInstrument(javax.sound.midi.Instrument),
unloadAllInstruments(javax.sound.midi.Soundbank),
isSoundbankSupported(javax.sound.midi.Soundbank),
Instrument.getPatch(),
loadInstruments(javax.sound.midi.Soundbank, javax.sound.midi.Patch[])