JavaプログラムにMIDI音楽を再生する機能を追加する実現方法の詳細

3616 ワード

JAVAはマルチメディアの処理の方面で确かに优位ではありませんて、しかし私达はプログラムの中で时にはまたいくつかの音楽を必要として、もし放送する音楽は
wavなどの波形オーディオファイルは、大きくなるとバックミュージックがMIDIになるのがベストですが、ネット上ではMIDIのチュートリアルが簡単な言葉の例がたくさん放送されています.
リソースの解放は考慮されておらず、プログラムが長期にわたって実行されると、メモリが消費されるほど多くなり、最後に1つ投げ出されます.
java.lang.OutOfMemoryError..MIDIの放送では、一つのクラスが重要です.それは
MidiSystem類は、MIDI放送装置全体などの管理を担当していますが、実は
Seqencerは、MIDIシーケンスを再生するためのMIDI再生設定です.もう一つのクラスは
Seqenceは、MIDIのシーケンスであり、MIDIのシーケンスは自分でプログラムによって生成されてもよいし、ファイルやURLから読み取ることもできる.
 
  
package test1;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Hashtable;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
public class Test5 implements Runnable{
    private Sequencer midi;
    private String[] names={"1.mid","2.mid","3.mid","4.mid","5.mid"};
    private int i;
    private Map map;
    public Test5(){
        initMap();
        new Thread(this).start();
    }
    private void initMap(){
        try {
            map = new Hashtable();
            midi = MidiSystem.getSequencer(false);
            midi.open();
            for (String s : names) {
                try {
                    Sequence s1 = MidiSystem.getSequence(new File(s));
                    map.put(s, s1);
                } catch (InvalidMidiDataException ex) {
                    Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } catch (MidiUnavailableException ex) {
            Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
    private void createPlayer(String name){
        try {
            Sequence se=map.get(name);
            midi.setSequence(se);
            midi.start();

        }catch (InvalidMidiDataException ex) {
            Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
    public void run(){
        while(true){
            try {
                System.out.println(" ."+(++i));
                String name=names[(int)(Math.random()*names.length)];
                createPlayer(name);
                Thread.sleep(10000);

            } catch (InterruptedException ex) {
                Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    public static void main(String[] args) {
        new Test5();
    }
}

ここで重要なのは、プログラムが実行されている間に、1つだけ
Seqencerでいいです.私は以前プログラムの中で再生するたびに生成しました.
Seqencer、その時私はすべてそれを呼び出したと思っていたからです.
close()メソッドですが、まだ開けられますか?実際には再び開くこともできます.このような思考がプログラムを最終的にメモリオーバーフローでクラッシュさせます.