Java MIDI 合成器 - 无法更换乐器

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4881541/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 08:26:46  来源:igfitidea点击:

Java MIDI Synthesizer - Can't change instruments

javamidi-instrument

提问by Matt

I can't seem to get the instrument to change. I switch the value of the instrument but get nothing different on the output. I can only get a piano instrument to play no matter what value I try. Here is the simple code below. Does anyone have any suggestions? Or am I missing a fundamental of the instrument object?

我似乎无法改变乐器。我切换了仪器的值,但输出没有任何不同。无论我尝试什么价值,我都只能得到钢琴乐器。下面是简单的代码。有没有人有什么建议?或者我是否缺少仪器对象的基础知识?

import javax.sound.midi.*;
//import javax.sound.*;

public class Drum {
    static int instrument = 45;
    static int note = 100;
    static int timbre = 0;
    static int force = 100;
    public static void main(String[] args) {        
        Synthesizer synth = null;
        try {
            synth = MidiSystem.getSynthesizer();
            synth.open();
        }
        catch (Exception e) {
            System.out.println(e);
        }
        Soundbank soundbank = synth.getDefaultSoundbank();
        Instrument[] instr = soundbank.getInstruments();
        synth.loadInstrument(instr[instrument]);    //Changing this int (instrument) does nothing
        MidiChannel[] mc = synth.getChannels();
        mc[4].noteOn(note, force);
        try { Thread.sleep(1000); } 
        catch(InterruptedException e) {}
        System.out.println(instr[instrument].getName());

        synth.close();

    }
} 

回答by Matti Virkkunen

You need to tell the channel to use the instrument. I admit I've never used MIDI in Java, but something like mc.programChange(instr.getPatch().getProgram())sounds promising.

您需要告诉频道使用该仪器。我承认我从未在 Java 中使用过 MIDI,但mc.programChange(instr.getPatch().getProgram())听起来很有希望。

回答by jfp

To play the percussion instruments you have to use the channel 10, that channel is used only for percussion instruments. (http://en.wikipedia.org/wiki/General_MIDI)

要演奏打击乐器,您必须使用通道 10,该通道仅用于打击乐器。(http://en.wikipedia.org/wiki/General_MIDI)

For example:

例如:

int instrument = 36;

Sequence sequence = new Sequence(Sequence.PPQ, 1);

Track track = sequence.createTrack();


ShortMessage sm = new ShortMessage( );
sm.setMessage(ShortMessage.PROGRAM_CHANGE, 9, instrument, 0); //9 ==> is the channel 10.
track.add(new MidiEvent(sm, 0));

then every note you add it will sound with percussion.

那么你添加的每个音符都会有打击乐的声音。

回答by Noah the Epic Guy

You need to send a program change event to the sequencer. How? Send a short message.

您需要向音序器发送程序更改事件。如何?发送一条短消息。

sound.setMessage(ShortMessage.PROGRAM_CHANGE, channel, instrument, channel);
            long timeStam1p = -1;
            Receiver rcv1r = MidiSystem.getReceiver();
            rcv1r.send(sound, timeStam1p);
            sound.setMessage(ShortMessage.NOTE_ON, channel, note, velocity);
            long timeStamp = -1;
            Receiver rcvr = MidiSystem.getReceiver();
            rcvr.send(sound, timeStamp);

Variables are channel (int) note (int), instrument (int), velocity (int). Also, I suggest to learn midi events. Events are how a midi plays notes, stops notes, change instruments, tempo change, control changes, etc. I spent 2 years using a midi program.

变量是通道(int)音符(int)、乐器(int)、力度(int)。另外,我建议学习midi事件。事件是 MIDI 播放音符、停止音符、改变乐器、速度改变、控制改变等的方式。我花了 2 年时间使用 MIDI 程序。