如何知晓Java Sequencer中乐器编号对应的具体乐器?
MIDI PROGRAM_CHANGE 乐器编号映射表
官方通用标准:General MIDI (GM) 规范
几乎所有MIDI设备、软件(包括Java Sequencer)都遵循General MIDI (GM) 标准,该规范明确定义了0-127号乐器编号对应的具体乐器/音效,分为16组(每组8个编号):
- 0-7:钢琴类(0=大钢琴,1=明亮钢琴,2=电钢琴1,3=电钢琴2,4=颤音琴,5=立式钢琴,6=电钢琴3,7=古钢琴)
- 8-15:色彩打击乐(8=钟琴,9=木琴,10=钢片琴,11=马林巴,12=颤音琴,13=管钟,14=扬琴,15=桑巴铃)
- 16-23:风琴类(16=拉杆风琴,17=打击风琴,18=摇滚风琴,19=教堂风琴,20=簧风琴,21=口琴,22=手风琴,23=探戈手风琴)
- 24-31:吉他类(24=尼龙弦吉他,25=钢弦吉他,26=爵士电吉他,27=清音电吉他,28=闷音电吉他,29=失真电吉他,30=吉他泛音,31=原声贝斯)
后续组还包含贝斯、弦乐、铜管、木管、合成器、音效等类别,完整的128个编号对应关系可通过GM规范定义或Java API直接获取。
用Java API直接获取官方名称
你可以通过javax.sound.midi提供的API直接获取每个编号对应的官方标准乐器名称,无需手动查表:
import javax.sound.midi.*; public class MidiInstrumentLookup { public static void main(String[] args) { try { Synthesizer synthesizer = MidiSystem.getSynthesizer(); synthesizer.open(); Instrument[] instruments = synthesizer.getAvailableInstruments(); for (Instrument instr : instruments) { Patch patch = instr.getPatch(); // PROGRAM_CHANGE的instrument参数对应patch的program值(0-127) int programNumber = patch.getProgram(); String officialName = instr.getName(); System.out.printf("乐器编号 %d: %s%n", programNumber, officialName); } synthesizer.close(); } catch (MidiUnavailableException e) { e.printStackTrace(); } } }
扩展规范(可选)
如果需要更丰富的音效,部分设备支持Roland GS或Yamaha XG扩展规范,这些是GM的超集,包含更多乐器和音效编号,但基础开发场景下GM规范已足够覆盖绝大多数需求。
内容的提问来源于stack exchange,提问作者Sergey Zolotarev
相关产品推荐
相关产品推荐

