zoukankan      html  css  js  c++  java
  • 音乐之声——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) 

      大海

  • 相关阅读:
    python装饰器执行机制
    蓝桥网试题 java 基础练习 十进制转十六进制
    蓝桥网试题 java 基础练习 十六进制转十进制
    蓝桥网试题 java 基础练习 十六进制转八进制
    蓝桥网试题 java 基础练习 数列排序
    蓝桥网试题 java 入门训练 A+B问题
    蓝桥网试题 java 入门训练 序列求和
    蓝桥网试题 java 入门训练 圆的面积
    蓝桥网试题 java 入门训练 Fibonacci数列
    贪心算法
  • 原文地址:https://www.cnblogs.com/ioveNature/p/6644495.html
Copyright © 2011-2022 走看看