2015-01-09 20 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; 
      } 
     } 
    } 

} 

Bu kod her midi olay için rastgele grafik yapar, ben sadece midi dosyasını içe nasıl, burada midi Notlar kurmak ve onu ithal midi dosyasına göre grafik çizmek yapmak zorunda. Midi dosyasını kısa mesajlara nasıl dönüştürebilirsiniz?Midi dosyası

cevap

0

JFugue deneyebilirsiniz. Bu resmi amaç özellikle müzik kompozisyonu/çalma ile ilgilidir, ancak sadece kısa mesajları toplayan ama onları çok daha okunabilir bir biçime dönüştüren bir MIDI okuma kütüphanesine sahiptir. İlgili değerleri (notlar, vb.) Zamana göre indekslenmiş bir listeye koyan ve sadece oynatılan kendi "işleyicinizi" yazabilmeniz gerekir.

3

Doğruca dokümanlardan bunu alacağım:

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. 
} 

senin böyle bir şey yapabileceğini geri zaman içinde oynamaya çalışıyor ise:

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