MIDI 文件到 MIDI 事件


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 文件转换为短消息?

我直接从文档中获取:

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();
你可以

试试JFugue。它的官方用途与音乐创作/播放特别相关,但它确实有一个 MIDI 阅读库,不仅可以收集短消息,还可以将它们转换为更具可读性的格式。

您应该能够编写自己的"渲染器",将相关值(注释等)放入按时间索引的列表中,然后播放。

最新更新