zoukankan      html  css  js  c++  java
  • 跟着音乐节奏随机的产生不同颜色形状的图形

    import javax.sound.midi.*;
    import javax.swing.*;
    
    public class miniplayer1{
        Panel panel;
        JFrame frame;
        public  MidiEvent  MakeEvent(int comd,int chan,int note,int vol,int tick){
            MidiEvent event;
            event = null;
            try{
                ShortMessage a = new ShortMessage();
                a.setMessage(comd, chan, note, vol);
                event = new MidiEvent(a,tick);
            }catch(Exception ex){}
            
            return event;
        }
        
        public void setGui(){
            frame = new JFrame("My music App");
            panel = new Panel();
            
            frame.getContentPane().add(panel);
            frame.setBounds(100, 100, 200, 200);
            frame.setVisible(true);
        }
        public void go(){
            setGui();
            try{
                Sequencer sequencer = MidiSystem.getSequencer();
                sequencer.open();
                
                int [] eventIwant = {127};
                sequencer.addControllerEventListener(panel,eventIwant);
                Sequence seq = new Sequence(Sequence.PPQ,4);
                Track track = seq.createTrack();
                
                for(int i = 5; i < 200; i += 4){
                    int 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+3));
                }
                
                sequencer.setSequence(seq);
                sequencer.setTempoInBPM(220);
                sequencer.start();
            }
                
                catch(Exception ex){}
        }
        
        public void controlChange(ShortMessage event){
            System.out.println("la ");
        }
        
        
    }
    View class miniplayer1
    import javax.swing.*;
    import javax.sound.midi.*;
    import java.awt.*;
    
    public class Panel extends JPanel implements ControllerEventListener{
        boolean msg = false;
        
        public void controlChange(ShortMessage a){
            msg = true;
            repaint();
        }
        
        public void paintComponent(Graphics g){
            if(msg){
                int red = (int)(Math.random() * 127);
                int gre = (int)(Math.random() * 127);
                int blue = (int)(Math.random() * 127);
                
                Color color = new Color(red,gre,blue);
                g.setColor(color);
                
                int x = (int)(Math.random() * 40) + 10;
                int y = (int)(Math.random() * 40) + 10;
                int ht = (int)(Math.random() * 120) + 10;
                int wid = (int)(Math.random() * 120) + 10;
                
                g.fillRect(x, y, wid, ht);
                msg = false;
            }
        }
    }
    View class Panel
    public class Test {
        
        public static void main(String[] args) {
            miniplayer1 play = new miniplayer1();
            play.go();
        }
    
    }
    View class TestDrive

    Sequencer(相当于CD播放器)是按照tick(拍)依次检查,1到2到3...

    建立一个Sequence的对象seq,给seq的track依次加入MidiEvent

    在miniplayer1类中for循环解释为:

    向track中加入某个音调的noteOn事件和noteOff事件

    中间行向track中加入127类型事件,并且设置在noteOn的同一拍执行

    sequencer.addControllerEventListener(panel,eventIwant)表示:

    panel想要127事件,当事件源sequencer向panel传递信息,让其repaint

    msg的存在是为了让第一次frame被setVisible时不作图

  • 相关阅读:
    为什么大多数IOC容器使用ApplicationContext,而不用BeanFactory
    重温Java泛型,带你更深入地理解它,更好的使用它!
    看完了这篇,面试的时候人人都能单手撸冒泡排序!
    JAVA基础4---序列化和反序列化深入整理(Hessian序列化)
    VS Code 变身小霸王游戏机!
    equals()方法和hashCode()方法详解
    openFeign远程调用时使用Mybatis-plus的IPage接口进行返回分页数据失败的记录
    通过express快速搭建一个node服务
    UML 类图
    jdk命令行工具系列——检视阅读
  • 原文地址:https://www.cnblogs.com/gabygoole/p/4916044.html
Copyright © 2011-2022 走看看