11

楽器を変える気になれません。楽器の値を切り替えましたが、出力に違いはありません。どんな値を試しても、ピアノの楽器しか演奏できません。以下に簡単なコードを示します。誰か提案はありますか?または、インストゥルメント オブジェクトの基本要素が欠落していますか?

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

    }
} 
4

3 に答える 3

14

楽器を使用するようにチャネルに指示する必要があります。Java で MIDI を使用したことがないことは認めますが、mc.programChange(instr.getPatch().getProgram())有望に思えます。

于 2011-02-03T00:34:16.303 に答える
5

打楽器を演奏するには、チャンネル 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));

その後、追加するすべての音符がパーカッションで鳴ります。

于 2011-05-10T14:35:29.953 に答える