2016-02-29 79 views
1

我剛剛編碼垃圾音樂播放器。每次我們給它2個整數:「樂器」和「節點」,它將播放該樂器的節點。很簡單。 我試過了,但即使我改變了「儀器」(改變了輸入INT),只有鋼琴的聲音註釋播放.. 的代碼如下:爲什麼我只能得到鋼琴音符(Java)?

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

回答

0

首先,你必須瞭解和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(); 
    } 

} 

注意我已經使用了SynthesizerMidiChannel

+0

非常感謝! –