音乐录像带第三版之与音乐同步输出图形

//绘制版面的内部类
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;
			}
		}

	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值