2015-01-09 132 views
6
import javax.sound.midi.*; 
import javax.swing.*; 
import java.awt.*; 

/** 
* Created by Jonik on 09.01.2015. 
*/ 
public class MiniMusicPlayer1 { 
    static JFrame f = new JFrame("My first video clip"); 
    static MyDrawPanel ml; 
    int t = 2; 

    public static void main(String[] args) { 
     MiniMusicPlayer1 mini = new MiniMusicPlayer1(); 
     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+=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(seq); 
      sequencer.start(); 
      sequencer.setTempoInBPM(120); 
     } catch (Exception ex){ ex.printStackTrace();} 
    } 
    public 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 ex) {} 
     return event; 
    } 
    public class MyDrawPanel extends JPanel implements ControllerEventListener { 
     boolean msg = false; 
     public void controlChange(ShortMessage event){ 
      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); 

       if (t%2== 0) 
       { 
        g.fillOval(x,y,ht, width); 

       } 
       else 
       { 
        g.fillRect(x,y,ht, width); 

       } 
       t++; 
       msg = false; 
      } 
     } 
    } 

} 

此代碼爲每個midi事件製作隨機圖形,我必須在這裏設置midi註釋,我如何導入midi文件並根據導入的midi文件繪製圖形。如何將MIDI文件轉換爲短消息?Midi文件到midi事件

回答

0

你可以試試JFugue。它的官方目的是專門與音樂作曲/播放有關,但它確實有一個MIDI閱讀庫,它不僅收集短信息,而且還將其轉換爲更具可讀性的格式。

您應該可以編寫自己的「渲染器」,將相關值(註釋等)放入按時間索引的列表中,然後回放。

3

我採取這一直接從文檔:

Sequence sequence = MidiSystem.getSequence(...); // either a File or InputStream 
Track track0 = sequence.getTracks[0]; 
for (int i = 0 ; i < track0.size() ; i++) 
{ 
    MidiEvent event = track0.get(i); 
    // do your processing here. 
} 

如果你想發揮它回到過去,你可以做這樣的事情:

Sequence sequence = MidiSystem.getSequence(...); // either a File or InputStream 
sequencer.setSequence(sequence); 
sequencer.start();