0

MIDIサウンドの再生をトリガーするアニメーションを含むJavaアプレットを作成しています。サウンドは、独自のスレッドを開始する次のクラスによって再生されます。とにかく、サウンドの再生中、アプレットのアニメーションは一時停止されます。ここで何が悪かったのかわかりません。新しく割り当てられたスレッドが原因でアニメーションが一時停止しないと思います...

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.midi.MidiChannel;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Synthesizer;

public class ChromaticSynth implements Runnable{
    //vars
    private Synthesizer synth;
    private MidiChannel mchannel;
    private int playNote;
    private Thread myThread;

    //constructor
    public ChromaticSynth(int playNote){
        try {
            synth=MidiSystem.getSynthesizer();
            synth.open();
            mchannel=synth.getChannels()[0];
            this.playNote=playNote;

            myThread=new Thread(this);
            myThread.start();
        } catch (MidiUnavailableException ex) {
            Logger.getLogger(ChromaticSynth.class.getName()).log(Level.SEVERE, null, ex);
        }


     }

    //play sound
    public void run(){
        mchannel.noteOn(playNote,50);
    }
}

ChromaticSynthクラスは、次のように使用されます(コードを関連する部分に縮小します)。

import chromatic.ChromaticSynth;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;

public class ChromaticPanel extends JPanel{
    //vars
    ...

    //constructor
    public ChromaticPanel(){
        super();
        ...
    }

    //paint
    protected void paintComponent(Graphics g){

        super.paintComponent(g);

       //draw something
        g.setColor(Color.white);
        g.draw(...);

       if(noteshouldbeplayed)
            ChromaticSynth cs=new ChromaticSynth(playNote);                    

    }


}

Panelのrepaint()-メソッドは、アニメーションをペイントするために、ChromaticPanelを含むJFrameのjavax.swing.Timerによって繰り返し呼び出されます。

あなたの助けのためのthx!

4

0 に答える 0