//绘制版面的内部类
class MyDrawPanel extends JPanel implements ControllerEventListener//这个面板也是监听者
{
boolean msg = false;//获知事件时才会真
public void ControlChange(ShortMessage event)
{
msg=true;//获知事件时设为真并调用重绘程序
repaint();
}
public void paintComponent(Graphics g)
{
if(msg)//应为也有其他程序会引发重绘,所以要判断是否为ControllerEvent所引发的
{
//产生随机的颜色并画出方框
Graphics2D g2=(Graphics2D)g;
int r=(int)(Math.random()*250);
int gr=(int)(Math.random()*250);
int b=(int)(Math.random()*250);
g.setColor(r,gr,b);
int hr=(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,hr);
msg=false;
}
}
}
import javax.sound.midi.*;//最终版
import java.io.*;
import javax.swing.*;
import java.awt.*;
public class MiniMusicPlayer3
{
static JFrame f=new JFrame("My First Music Video");
static MyDrawPanel ml;
public static void main(String [] args)
{
MiniMusicPlayer3 mini=new MiniMusicPlayer3();
mini.go();
}
public void setUpGui()
{
ml=new MyDrawPanel();
f.setContentPane(ml);
f.setBounds(30,30,300,300);
f.setVisible(true);
}
public void go()
{
setUpGui();
try
{
Sequencer sequencer=MidiSystem.getSequencer();
sequencer.open();
sequencer.addControllerEventListener(ml,new int[] {127});
Sequence seq=new Sequence(Sequence.PPQ,4);
Track track=seq.createTrack();
int r=0;
for(int i=0;i<60;i++)
{
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));
}
sequencer.setSequence(seq);
sequencer.setTempoInBPM(120);
sequencer.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,one,two);
event = new MidiEvent(a,tick);
}catch(Exception e){}
return event;
}
class MyDrawPanel extends JPanel implements ControllerEventListener
{
boolean msg=false;
public void controlChange(ShortMessage g)
{
msg=true;
repaint();
}
public void paintComponent(Graphics g)
{
if(msg)
{
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,ht);
msg=false;
}
}
}
}