正文
音乐之声——midi制作原理
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
实际发出声音需要4项必备的条件
1 发生的装置
Sequencer 把sequencer想成CD播放机
(plays)
2 要演奏的乐曲
Sequence sequence就好像是单曲CD
(has a)
3 带有乐曲的信息记录
Track track可比喻是单曲CD上唯一歌曲的信息
(holds)
4 乐曲的音符等信息
MidiEvent 可悲唱盘理解的信息数据
另外还需5个步骤
1 取得Sequencer并将它打开
Sequencer player = MidiSystem.getSequencer();
player.open();
2 创建新的Sequence
Sequence seq = new Sequence(tingming, 4);
3 从Sequence中创建新的Track
Track t = seq.createTrack();
4 填入MidiEvent并让Sequence播放
t.add(myMidiEvent1);
player.setSequence(seq);
5 按下Play键
player.start();
制作MidiEvent(乐曲信息)
MidiEvent是由Message加上发音时机所组成的。Message是执行的内容,MidiEvent是执行的时机。
1 创建Message
ShortMessage a = new ShortMessage();
2 置入指令
a.setMesage(144, 1, 44, 100); // 这代表发出44音
3 用Message创建MidiEvent
MidiEvent noteOn = new MidiEvent(a, 1); //在第一拍启动a这个Message
4 将MidiEvent加到Track中
track.add(noteOn);
Track带有全部的MidiEvent对象Sequence会根据事件的时间组织它们,然后Sequencer会根据此顺序操作,例如和弦声音或不同乐器的声音。
setMessage的含义
void javax.sound.midi.ShortMessage.setMessage(int command, int channel, int data1, int data2) throws InvalidMidiDataException
comand: 信息类型。如144代表打开,128代表关闭。
channel: 频道。每个频道代表不同的演奏者。如1号代表吉他,2号是Bass。
data1: 要发出的音符。从0~127代表不同的声高。
data2: 音道。用多大的音道按下?0几乎听不到,100算是差不多。
如果要对NOTE OFF的事件做些音长的变化,可如下操作:
b.setMesage(144, 1, 44, 100);
MidiEvent noteOff = new MidiEvent(b, 3);
参考源码
克劳汀幻想曲-midi键盘带伴奏版
滴答(guitar)
大海