一、静态makeEvent()方法
package MusicePlayer;
import javax.sound.midi.*;
public class ManiMusicPlayer1 {
public static void main(String[] args) {
try {
Sequencer sequencer= MidiSystem.getSequencer();
sequencer.open();
Sequence sequence=new Sequence(Sequence.PPQ,4);
Track track=sequence.createTrack();
for (int i = 0; i < 61; i+=4) {
track.add(makeevent(144,1,i,100,i));
track.add(makeevent(128,1,i,100,i+2));
}
sequencer.setSequence(sequence);
sequencer.setTempoInBPM(220);
sequencer.start();
}catch (Exception e){
e.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 (InvalidMidiDataException e) {
e.printStackTrace();
}
return event;
}
}
二、注册并取得ControllerEvent方法
package MusicePlayer;
import javax.sound.midi.*;
public class MiniMusicPlayer2 implements ControllerEventListener {
public static void main(String[] args) {
MiniMusicPlayer2 mini=new MiniMusicPlayer2();
mini.go();
}
public void go() {
try {
Sequencer sequencer= MidiSystem.getSequencer();
sequencer.open();
int[] eventsIWant={127};
sequencer.addControllerEventListener(this,eventsIWant);
Sequence sequence=new Sequence(Sequence.PPQ,4);
Track track=sequence.createTrack();
for (int i = 0; i < 61; i+=4) {
track.add(makeevent(144,1,i,100,i));
track.add(makeevent(176,1,127,0,i));
track.add(makeevent(128,1,i,100,i+2));
}
sequencer.setSequence(sequence);
sequencer.setTempoInBPM(220);
sequencer.start();
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void controlChange(ShortMessage event) {
System.out.println("la");
}
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 (InvalidMidiDataException e) {
e.printStackTrace();
}
return event;
}
}
三、与音乐同步输出图形
package MusicePlayer;
import javax.sound.midi.*;
import javax.swing.*;
import java.awt.*;
public class MiniMusicPlayer3 implements ControllerEventListener {
static JFrame f=new JFrame("My First Music Video");
static MyDrawPanel m1;
public static void main(String[] args) {
MiniMusicPlayer3 mini=new MiniMusicPlayer3();
mini.go();
}
public void setUpGui(){
m1=new MyDrawPanel();
f.setContentPane(m1);
f.setBounds(30,30,300,300);
f.setVisible(true);
}
public void go() {
setUpGui();
try {
Sequencer sequencer= MidiSystem.getSequencer();
sequencer.open();
int[] eventsIWant={127};
sequencer.addControllerEventListener(m1,eventsIWant);
Sequence sequence=new Sequence(Sequence.PPQ,4);
Track track=sequence.createTrack();
int r=0;
for (int i = 0; i < 61; 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));
}
sequencer.setSequence(sequence);
sequencer.setTempoInBPM(220);
sequencer.start();
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void controlChange(ShortMessage event) {
}
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 (InvalidMidiDataException e) {
e.printStackTrace();
}
return event;
}
class MyDrawPanel extends JPanel implements ControllerEventListener{
boolean msg=false;
@Override
public void controlChange(ShortMessage event) {
msg=true;
repaint();
}
public void paintComponent(Graphics g){
if (msg){
Graphics2D g2= (Graphics2D) g;
int r= (int) (Math.random()*255);
int gr= (int) (Math.random()*255);
int b= (int) (Math.random()*255);
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,ht,width);
msg=false;
}
}
}
}