Java音乐小程序

这篇博客介绍了如何使用JavaSound API创建一个MIDI音乐播放器,详细讲解了MIDI的工作原理、播放音乐的同时输出图形的功能实现,以及逐步完善程序的三个阶段。内容包括创建BeatBox,制作MIDI事件,加入监听事件,输出图形,并提供了程序代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建MIDI音乐播放器

构思

要完成这个程序,我们需要用到:

  • JavaSound API
  • 创建Swing GUI
  • 通过网络链接到其他计算机
  • 输入\输出数据

JavaSound API

MIDI

MIDI(Musical Instrument Digital Interface)乐器数字接口,也是不同电子发声装置沟通的标准协议。
MIDI数据表示执行的动作,但没有实际的声音,实际声音靠装置发出。

JavaSound的工作原理:

  1. 取得Sequencer并将它打开。
  2. 创建新的Sequence。
  3. 从Sequence中创建新的Track。
  4. 填入MidiEvent。
  5. 让Sequencer播放。

    import javax.sound.midi.*;
    
    public class MiniMiniMusicApp {
    
    public static void main(String[] args) {
        MiniMiniMusicApp mini = new MiniMiniMusicApp();
            mini.play();
        }
    
        public void play() {
    
            try {
                //取得Sequencer并将它打开
                Sequencer player = MidiSystem.getSequencer();
                player.open();
    
                //创建新的Sequence
                Sequence seq = new Sequence(Sequence.PPQ, 4);
    
                //从Sequence中创建新的Track
                Track track = seq.createTrack();
    
                //填入MidiEvent
                ShortMessage a = new ShortMessage();//创建Message
                a.setMessage(144, 1, 44, 100);//置入指令(类型,频道,音符,音量)
                MidiEvent noteOn = new MidiEvent(a, 1);//在第一拍启动a
                track.add(noteOn);
    
                ShortMessage b = new ShortMessage();
                b.setMessage(128, 1, 44, 100);
                MidiEvent noteOff = new MidiEvent(b, 16);//在16拍停止
                track.add(noteOff);
    
                //将Sequence送入Sequencer
                player.setSequence(seq);
    
                //让Sequencer播放
                player.start();
    
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    
    }
    

使用命令列表参数

import javax.sound.midi.*;

public class MiniMusicCmdLine {

    public static void main(String[] args) {
        MiniMusicCmdLine mini = new MiniMusicCmdLine();
        if (args.length < 2) {
            System.out.println("Don't forget the instrument and note args.");
        } else {
            int instrument = Integer.parseInt(args[0]);
            int note = Integer.parseInt(args[1]);
            mini.play(instrument, note);
        }
    }

    public void play(int instrument, int note) {
        try {
            //取得Sequencer并将它打开
            Sequencer player = MidiSystem.getSequencer();
            player.open();

            //创建新的Sequence
            Sequence seq = new Sequence(Sequence.PPQ, 4);

            //从Sequence中创建新的Track
            Track track = seq.createTrack();

            MidiEvent event =null;

            ShortMessage first = new ShortMessage();
            first.setMessage(192, 1, instrument, 0);
            MidiEvent changrInstrument = new MidiEvent(first, 1);
            track.add(changrInstrument);

            //填入MidiEvent
            ShortMessage a = new ShortMessage();
            a.setMessage(144, 1, note, 100);
            MidiEvent noteOn = new MidiEvent(a, 1);
            track.add(noteOn);

            ShortMessage b = new ShortMessage();
            b.setMessage(128, 1, note, 100);
            MidiEvent noteOff = new MidiEvent(b, 16);
            track.add(noteOff);

            //将Sequence送入Sequencer
            player.setSequence(seq);

            //让Sequencer播放
            player.start();

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}

在播放音乐的同时输出图形

需要实现的功能:

  • 制作一系列MIDI信息(事件)来播放任意钢琴音
  • 对事件注册一个监听者
  • 开始sequencer的播放操作
  • 每当监听者的事件处理程序被调用时,在面板上画出一个随机的方块并调用repaint

制作程序的三步:

  1. 简单的制作MIDI事件
  2. 注册并监听事件,但没有图形。从命令栏对应每一拍输出一个信息
  3. 在第二版上加上输出图形

制作一系列MIDI信息

import javax.sound.midi.*;

public class MiniMusicPlayer1 {

    public static void main(String[] args) {

        try {
            //创建并打开Sequencer
            Sequencer sequencer = MidiSystem.getSequencer();
            sequencer.open();

            //创建Sequence并track
            Sequence seq = new Sequence(Sequence.PPQ, 4);
            Track track = seq.createTrack();

            for (int i = 5; i < 61; i++) {
                track.add(makeEvent(144,1,i,100,i));
                track.add(makeEvent(128,1,i,100,i+2));
            }

            //开始播放
            sequencer.setSequence(seq);
            sequencer.setTempoInBPM(220);
            sequencer.start();
            } catch (Exception ex) { ex.printStackTrace(); }
    }

    public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值