创建MIDI音乐播放器
要完成这个程序,我们需要用到:
- JavaSound API
- 创建Swing GUI
- 通过网络链接到其他计算机
- 输入\输出数据
JavaSound API
MIDI
MIDI(Musical Instrument Digital Interface)乐器数字接口,也是不同电子发声装置沟通的标准协议。
MIDI数据表示执行的动作,但没有实际的声音,实际声音靠装置发出。
JavaSound的工作原理:
- 取得Sequencer并将它打开。
- 创建新的Sequence。
- 从Sequence中创建新的Track。
- 填入MidiEvent。
让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
制作程序的三步:
- 简单的制作MIDI事件
- 注册并监听事件,但没有图形。从命令栏对应每一拍输出一个信息
- 在第二版上加上输出图形
制作一系列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