3
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;
            }
        }
    }

}

This code makes random graphics for each midi event, i have to set up midi Notes here, how i can just import midi file and make it draw graphics according to imported midi file. How to convert midi file to short messages?

Jonik
  • 141
  • 3
  • 14

2 Answers2

3

I'm taking this straight from the docs:

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

If your trying to play it back in time you could do something like this:

Sequence sequence = MidiSystem.getSequence(...); // either a File or InputStream
sequencer.setSequence(sequence);
sequencer.start();
jaket
  • 9,140
  • 2
  • 25
  • 44
  • The method is getTrack(). Source: https://docs.oracle.com/javase/7/docs/api/javax/sound/midi/Sequence.html – chikitin Jan 25 '19 at 06:00
0

You might try JFugue. It's official purpose is specifically related to music composition/playing, but it does have a MIDI reading library that not only gathers short messages but converts them into a much more readable format.

You should be able to write your own "renderer" that puts relevant values (notes, etc.) into a list indexed by time and just play back.

k_g
  • 4,333
  • 2
  • 25
  • 40