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!