【问题标题】:Java MIDI Synthesizer - Can't change instrumentsJava MIDI 合成器 - 无法更改乐器
【发布时间】:2011-02-03 00:28:09
【问题描述】:

我似乎无法改变乐器。我切换了仪器的值,但输出没有任何不同。无论我尝试什么价值,我都只能得到一个钢琴乐器来演奏。这是下面的简单代码。有没有人有什么建议?还是我错过了仪器对象的基本原理?

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();

    }
} 

【问题讨论】:

标签: java midi-instrument


【解决方案1】:

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

【讨论】:

  • 那是正确的。我需要 programChange 命令。因此,例如,我使用了 mc[4].programChange(0, instrument);我现在可以更换乐器,但看起来打击乐器并没有真正在演奏。我需要看看这有什么关系。我想我有一些出发点。谢谢大家!
【解决方案2】:

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

例如:

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));

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

【讨论】:

    【解决方案3】:

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

    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);
    

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

    【讨论】:

      猜你喜欢
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      相关资源
      最近更新 更多