Почему я получил только звуковую ноту пианино (Java)?

Я только что написал кодовый музыкальный проигрыватель. Каждый раз, когда мы даем ему 2 дюйма: "Инструмент" и "Узел", он будет играть на узле этого инструмента. Очень просто. Я попробовал это, но даже если я изменил "инструмент" (изменил входное значение int), только звуковая нота пианино играет.. Код ниже:

package edu.swing.beatbox;

import java.util.Scanner;

import javax.sound.midi.*;

public class MiniMusic {

    public void play(int instrument, int note) {
        try {

            Sequencer player = MidiSystem.getSequencer();
            player.open();
            Sequence seq = new Sequence(Sequence.PPQ, 4);
            Track track = seq.createTrack();

            MidiEvent event = null;

            ShortMessage first = new ShortMessage();
            first.setMessage(192, 1, instrument, 0);
            MidiEvent changeInstrument = new MidiEvent(first, 1);
            track.add(changeInstrument);

            ShortMessage a = new ShortMessage();
            a.setMessage(144, 1, note, 100);
            MidiEvent noteOn = new MidiEvent(a, 1);
            track.add(noteOn);

            ShortMessage b = new ShortMessage();
            a.setMessage(128, 1, note, 100);
            MidiEvent noteOff = new MidiEvent(b, 3);
            track.add(noteOff);

            player.setSequence(seq);
            player.start();

        } catch (Exception exc) {
            exc.printStackTrace();
        }
    }

    public static void main(String[] args) {
        int instrument, note;
        MiniMusic mini = new MiniMusic();

        while (true) {
            Scanner inp = new Scanner(System.in);
            System.out.print("Instrument (0 --> 127) : "); instrument = inp.nextInt();
            System.out.print("Note (0 --> 127) : "); note = inp.nextInt();
            mini.play(instrument, note);
        }
    }
}

1 ответ

Во-первых, вы должны понимать MIDI и как он работает:

и играть музыкальные ноты:

import javax.sound.midi.MidiChannel;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Synthesizer;
import java.util.Scanner;

public class MidiPlayer {

    private static final int DEFAULT_INSTRUMENT = 1;

    private MidiChannel channel;

    public MidiPlayer() throws MidiUnavailableException {
        this(DEFAULT_INSTRUMENT);
    }

    public MidiPlayer(int instrument) throws MidiUnavailableException {
        channel = getChannel(instrument);
    }

    public void setInstrument(int instrument) {
        channel.programChange(instrument);
    }

    public int getInstrument() {
        return channel.getProgram();
    }

    public void play(final int note) {
        channel.noteOn(note, 50);
    }

    public void release(final int note) {
        channel.noteOff(note, 50);
    }

    public void play(final int note, final long length) throws InterruptedException {
        play(note);
        Thread.sleep(length);
        release(note);
    }

    public void stop() {
        channel.allNotesOff();
    }

    private static MidiChannel getChannel(int instrument) throws MidiUnavailableException {
        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();
        return synthesizer.getChannels()[instrument];
    }

    public static void main(String[] args) throws Exception {
        MidiPlayer player = new MidiPlayer();
        Scanner scanner = new Scanner(System.in);
        int note;
        while (!Thread.currentThread().isInterrupted()) {
            System.out.print("Note (1..127) : ");
            note = scanner.nextInt();
            player.play(note, 100);
        }
        scanner.close();
    }

}

обратите внимание, что я использовал Synthesizer а также MidiChannel,

Другие вопросы по тегам