首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Midi文件到midi事件

Midi文件到midi事件
EN

Stack Overflow用户
提问于 2015-01-10 07:16:23
回答 2查看 819关注 0票数 3
代码语言:javascript
复制
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 Notes,如何导入midi文件并使其根据导入的midi文件绘制图形。如何将midi文件转换为短消息?

EN

回答 2

Stack Overflow用户

发布于 2015-01-10 11:06:49

我直接从医生那拿来的:

代码语言:javascript
复制
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.
}

如果你想及时回放它,你可以这样做:

代码语言:javascript
复制
Sequence sequence = MidiSystem.getSequence(...); // either a File or InputStream
sequencer.setSequence(sequence);
sequencer.start();
票数 3
EN

Stack Overflow用户

发布于 2015-01-10 10:05:42

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

您应该能够编写自己的“渲染器”,将相关的值(注释等)到一个按时间索引的列表中,然后回放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27870826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档