首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java MIDI合成器-无法更换乐器

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

Stack Overflow用户
提问于 2011-02-03 08:28:10
回答 3查看 10.8K关注 0票数 11

我好像不能把乐器换掉。我切换了仪器的值,但在输出上没有什么不同。我只能得到一个钢琴乐器演奏,无论我尝试什么价值。下面是简单的代码。有人有什么建议吗?或者我遗漏了instrument对象的一个基本要素?

代码语言:javascript
复制
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();

    }
} 
EN

回答 3

Stack Overflow用户

发布于 2011-02-03 08:34:16

您需要告诉通道使用该仪器。我承认我从来没有在Java语言中使用过MIDI,但是像mc.programChange(instr.getPatch().getProgram())这样的东西听起来很有前途。

票数 14
EN

Stack Overflow用户

发布于 2011-05-10 22:35:30

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

例如:

代码语言:javascript
复制
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));

然后,你添加的每个音符都会带有打击乐的声音。

票数 5
EN

Stack Overflow用户

发布于 2018-08-08 03:33:31

您需要向sequencer发送程序更改事件。多么?发送短消息。

代码语言:javascript
复制
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如何播放音符,停止音符,改变乐器,节拍改变,控制改变等。我花了两年的时间使用midi程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4881541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档