Синтезатор Java MIDI - не могу менять инструменты - PullRequest
10 голосов
/ 03 февраля 2011

Я не могу заставить инструмент поменяться.Я переключаю значение инструмента, но ничего не получаю на выходе.Я могу заставить играть только на пианино, независимо от того, какую ценность я стараюсь.Вот простой код ниже.У кого-нибудь есть предложения?Или я упускаю фундаментальный объект инструмента?

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

    }
} 

Ответы [ 3 ]

12 голосов
/ 03 февраля 2011

Вы должны указать канал, чтобы использовать инструмент.Я признаю, что никогда не использовал MIDI в Java, но что-то вроде mc.programChange(instr.getPatch().getProgram()) звучит многообещающе.

4 голосов
/ 10 мая 2011

Для игры на ударных инструментах вы должны использовать канал 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));

тогда каждая добавленная вами нота будет звучать с перкуссией.

0 голосов
/ 07 августа 2018

Вам необходимо отправить событие изменения программы в секвенсор. Как? Отправить короткое сообщение.

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). Также предлагаю изучить миди события. События - это то, как миди воспроизводит ноты, останавливает ноты, меняет инструменты, меняет темп, меняет контроль и т. Д. Я провел 2 года, используя миди-программу.

...