2017-01-04 5 views
1

나는 하나의 이벤트마다 사각형을 만들고 화면을 다시 칠하는 음악 응용 프로그램을 만들고 있습니다. 이벤트는 사운드입니다. sound.midi API로 사운드를 생성했습니다. 그러나, 내가 응용 프로그램을 실행하면 사각형이 창에 나타나지 않습니다! 누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까? DrawPanel 클래스paintComponent의 EventListener

import javax.sound.midi.*; 
import java.io.*; 
import javax.swing.*; 
import java.awt.*; 

public class BeatBoxProject { 

static JFrame f = new JFrame ("My first mucic video"); 
static DrawPanel m1; 

public static void main(String[] args) { 
BeatBoxProject mini = new BeatBoxProject(); 
mini.go(); 
} 

public void setUpGui(){ 
m1 = new DrawPanel(); 
f.setContentPane(m1); 
f.setBounds(30, 30, 300, 300); 
f.setVisible(true); 
} 

public void go(){ 
setUpGui(); 

try{ Sequencer player = MidiSystem.getSequencer(); 
player.open(); // we need the open the sequencer 

player.addControllerEventListener(m1, new int [] {127}); 

Sequence seq = new Sequence(Sequence.PPQ, 4); 
Track track = seq.createTrack(); 

int r = 0;       
for (int i = 0; i < 60; i+=4) { 

r = (int) ((Math.random()*50)+ 1); 
track.add(makeEvent(144,1,r,100,i)); 
track.add(makeEvent(176,1,127,0,i)); 
track.add(makeEvent(128,1,r,100,i+2)); 

} 
player.setSequence(seq); // lets put the disk into the player 
player.setTempoInBPM(120); // lets set the beat(beat per minutes) 
player.start(); 


}catch (Exception ex){ 

     ex.printStackTrace(); 
} 
} 



public static MidiEvent makeEvent (int comd, int chan, int one, int two, int tick){ 


MidiEvent event = null; 

try{ 
ShortMessage a = new ShortMessage(); 
a.setMessage(comd, chan, two, two); 
event = new MidiEvent(a,tick); 
}catch(Exception e) {} 
return event; 
} 
} 

그리고 여기에 있습니다 : : 여기

내 주요 클래스입니다

import javax.sound.midi.ControllerEventListener; 
import java.awt.*; 
import javax.sound.midi.ShortMessage; 
import javax.swing.*; 

public class DrawPanel extends JPanel implements ControllerEventListener { 

boolean msg = false; // its false unles we gonna have an event 

public void controlChange(ShortMessage event) { 
    msg = true; 
    repaint(); 
} 


public void paintComponent (Graphics g){ 
if (msg){ // wee need the msg because other thing can repaint the panel but we only want when event occurs 

Graphics2D g2 = (Graphics2D) g;  

int r = (int) (Math.random()* 250); 
int gr = (int) (Math.random()* 250); 
int b = (int) (Math.random()* 250); 


g.setColor(new Color(r,gr,b)); 

int ht = (int) ((Math.random()*120) +10); 
int width = (int) ((Math.random()*120) +10); 

int x = (int) ((Math.random()*40) +10); 
int y = (int) ((Math.random()*40) +10); 

g.fillRect(x, y, width, HEIGHT); 
msg=false; 

} 
} 
} 

답변

1

변경

player.addControllerEventListener(m1, new int [] {127}); 

player.addControllerEventListener(m1, new int [] {0});