实际发出声音需要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)

大海

音乐之声——midi制作原理的更多相关文章

  1. php框架的制作原理

    php框架的制作原理 (2012-08-16 14:25:55) 转载▼ 标签: php框架制作 杂谈 分类: php index.php 主入口文件 <?php  define('ISEXIS ...

  2. 【AS3 Coder】任务九:游戏新手引导的制作原理(上)

    使用框架:AS3任务描述:了解游戏中新手的制作原理及流程 难度:3 本章源码下载:http://www.iamsevent.com/zb_users/UPLOAD/GuideManager/Test1 ...

  3. 【AS3 Coder】任务九:游戏新手引导的制作原理(下)

    在上一篇教程中,我们了解了一套我自创的新手引导管理框架的使用原理,那么在本篇教程中,我们将考虑新手引导制作中可能遇到的一些棘手问题及探讨其解决方案.Are you ready my baby? Let ...

  4. 虎扯:纯css3各方向小三角的制作原理分析

    入驻博客园两个月之后的第一篇随笔,希望能够做到三个原则: One:不浪费自己的时间, Tow:不浪费读者的时间, 第三就是希望有缘的朋友们多多指教,共度前端快乐的大坑!!! 咱们今天来做一个居家旅行必 ...

  5. 一文读懂充电宝usb接口电路及制作原理详细

    转自:http://www.elecfans.com/dianlutu/dianyuandianlu/20180511675801.html USB充电器套件,又名MP3/MP4充电器,输入AC160 ...

  6. transition:all 0.5s linear;进度条动画效果 制作原理

    Html: <span class="progress"><b ><i></i></b><em>50< ...

  7. MIDI制作的相关软件

    Native Instruments Kontakt(音乐采样器) fl studio 12 v12.5.0.59 汉化版水果   http://xiazai.flstudiochina.com/wm ...

  8. CSS3系列之3D制作

    一.序 博主最近这些天,突发奇想的想研究一下CSS3的东西,从而提升一下CSS的能力,在学习的过程中发现其实CSS3是一个挺复杂的东西,深入的研究,你可能会涉及到初中的光学理论来帮助理解一些概念,同时 ...

  9. rpm包制作(待实验)

    作者:firefoxbug 时间:July 18, 2014 rpm包命名规范 对于rpm包的命名符合如下规范. %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm N ...

随机推荐

  1. Solr学习笔记1(V7.2)

    下载压缩包http://archive.apache.org/dist/lucene/,解压后放到某一盘符下面 Windows下启动命令 :\solr-7.2.0>bin\solr.cmd st ...

  2. 运行android程序的时分出现了No compatible targets were found.Do you wish to.

    这个错误是说明没有android虚拟机,那么新建一个就OK了. 假如出现了这个状况,就点击yes,然后new一个. 具体方案如下,(可自定义.仅供参考)

  3. [知了堂学习笔记]_集合接口list与集合接口set的区别

    在Java中 除了 Map以外的集合的根接口都是Collection接口,而在Collection接口的子接口中,最重要的莫过于List和Set集合接口. 今天我们就来谈谈List集合接口与Set集合 ...

  4. Java 获取年月日方法

    package com.ob; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util ...

  5. linux的crash之hardlock排查记录

    3.10.0-327的内核,crash记录如下: KERNEL: vmlinux DUMPFILE: vmcore [PARTIAL DUMP] CPUS: 48 DATE: Wed Oct 18 2 ...

  6. extends Thread 与 implements Runnable 的区别

    http://blog.csdn.net/zhikun518/article/details/7526298 1.通过实现Runnable接口创建线程 (1).定义一个类实现Runnable接口,重写 ...

  7. 2017-07-09(tar who last)

    tar gzip ,bzip2对于文件目录压缩支持有限,所以出现了tar命令 tar [选项]  打包文件名  源文件 -c 打包 -v 显示过程 -f 指定打包文件名 -x 解包 -z 压缩成.ta ...

  8. 如何使用 volatile, synchronized, final 进行线程间通信

    原文地址:https://segmentfault.com/a/1190000004487149.感谢作者的无私分享. 你是否真正理解并会用volatile, synchronized, final进 ...

  9. 函数式编程--lambda表达式对比匿名内部类

    从前面的整理中我们看出了,Lambda表达式其实是匿名内部类的一种简化,因此它可以部分取代匿名内部类. 1,Lambda表达式与匿名内部类存在如下相同点: 1),Lambda表达式与匿名内部类一样,都 ...

  10. MySQL基于binlog主从复制

    MySQL复制介绍 默认情况 下复制是异步进行的,从库也不需要一直连接到主库来同步数据 MySQL复制的数据粒度可以是主实例上所有的数据库,也可以是指定的一个或多个数据库 ,也可以是一个数据库里的指定 ...