Unity3D音乐音效研究-MIDI与波表

其实音乐音效这个命题本身没什么好研究的。

Unity3D提供了丰富的结构和使用方式,足够使用了。

但是我有一些小小的想法和需求,一般的Unity资料并没有给我答案。

  1. 一个是容量要小。MP3、OGG的高音质压缩一分钟一M多,多放几首背景音乐就顶不住了。

  2. 一个是资源和主程序分离,方便更新,别和我提AssetBundle,这东西的平台不兼容性,完全是在增加麻烦。
  3. 还有就是想要一个示波器

像这样的就行了。

问题1、最小不过MIDI,MIDI是乐曲的原始信息,本地合成,1M多MP3不过一分钟,MIDI录一个小时也用不到1M。

这个问题就决定用MIDI来解决。

但MIDI的音色库也不小,一查动辄几十兆上百兆的音色库。

就简单的了解了一下MIDI的发展过程。

其实下面的文字我完全不知道他们在说什么,只是抄来的

1981年产生,作为一种设备连接标准,像USB那种东西。不过是专门为音乐而设计的。

1991年形成标准,制定了128种标准乐器。

第一块声卡 sound blaster 使用FM(频率调变)技术合成MIDI声音。

FM这种技术不需要什么内存,我就发现了这一点。

后来内存不是问题了,就发展出了波表合成技术GM,每种乐器的音色都是录制而来的,每个乐器都要录很多,再配合规则合成。

波表就比较费内存了,windows自带的那个波表有4M,网上很容易找到几十上百兆的波表

MIDI只能产生乐器效果,对于挑剔的耳朵来说,还是用OGGMP3之类能完美模拟声音的方式吧。

FM的声音效果按今天的标准来说可能有些惨不忍睹,管他呢,能提供MP3 百分之一的容量,还没有什么副作用。

各位自取所需吧,我反正是打算做点8bit风格的东西,FM够用。

那我们解决这个容量问题的关键就是找一个能用FM技术播放MIDI的东西。

然后就找到了http://forum.unity3d.com/threads/unitysynth-full-xplatform-midi-synth.130104/

FM播放所需的数据只有几百字节。

它提供了播放MIDI所需的一切,可以用FM技术合成,也可以用波表技术合成。

最关键的,它提供了一个例子,让我知道Unity怎么用DSP混音,这样最后一环就通了,可以用DSP去播放合成出来的声音。

问题2、资源和主程序分离

由于c#synth是完全从声音合成做起的,所以他不依赖任何库,这为跨平台提供了得天独厚的条件,可以说本来就是跨平台的。

我们找到的那个方案有一些无伤大雅的小bug,我已经修改了可以跨平台了。我还放了一个webplayer版本。

http://moshan.co/game?id=53,你可以打开看一看,内置了几十首midi,连主程序也只有200K

ogg虽然解码器也是开源的,但是我并没有找到c#的版本,如果要用ogg去做跨平台的播放,工作量可能不小。

Wav虽然不开源,但是wav pcm方式保存时格式非常简单,很容易实现。问题是wav容量比较尴尬,做音效可以,做音乐可舍不得用wav存。

问题3、示波器

这个问题其实我也不懂,硬着头皮搞出来的。

我就大概知道频率分析要用到傅里叶变换。

然后刚好前面学会了unity怎么用DSP混音。

那就加一个DSP混音,但是不改变声音,仅用来读取声音。

然后把每次得到的声音时域值域输入,拿傅里叶变换计算一下。就得到频域值域的输出。

然后把输出按我们想要观测的频率取出几个值。。。

好吧,其实时域值域频域我都不知道我到底理解对了没有,如果我前面乱讲,当我没讲过,这些年也没怎么接触过傅里叶变换啊。

反正最后弄出了这么个效果

拿到这串数字做什么效果都可以,我只是简单的用GUI.Button 画了些变换的棍子。

最后,附上GITHUB源码地址

https://github.com/lightszero/BlockFun/tree/master/unity/MidiPlayer

时间: 2024-09-06 08:05:25

Unity3D音乐音效研究-MIDI与波表的相关文章

Unity3D音乐音效学习笔记

对于Unity3D的音乐音效这块一直没有好好的看过,现在准备好好的研究一下,并作为一个笔记记录下. 支持格式 在游戏中,一般存在两种音乐,一种是时间较长的背景音乐,一种是时间较短的音效(比如按钮点击,开枪音效等). Unity3D支持下面几种音乐格式: AIFF:适用于较短的音乐文件可用作游戏打斗音效 WAV:适用于较短的音乐文件可用作游戏打斗音效 MP3:适用于较长的音乐文件可用作游戏背景音乐 OGG:适用于较长的音乐文件可用作游戏背景音乐 音乐组件 Unity3D中对音乐进行了封装,总体来说

Unity3d之音效播放和调用手机震动

http://blog.csdn.net/sunshine_1984/article/details/12943979 今天研究了下Unity3d音效播放相关内容,整理下实现细节. 1,添加音效文件到Assets/Resources目录,我这里添加到Assets/Resources/audio目录了. 2,新建C# Script命名为audio 3,编写audio.cs代码如下(里面注释很清楚了): using UnityEngine;using System.Collections; publ

【转载】音乐检索研究现状:

音乐检索研究现状: 从搜索的目标分,主要可分为两大类:SEARCHING SYMBOLIC DATA,SEARCHING AUDIO DATA.我对这两类的理解是:前者是检索乐谱:后者则是检索音频. SEARCHING SYMBOLIC DATA 1           String-based methods for monophonic melodies 由于这种方式最终是把音乐转化成一种字符串的形式,因此后期的检索就可以用到很多字符串比较的算法,比如计算编辑距离,寻找最长公共子串,找到一个

cocos2dx基础篇(19)——音乐音效SimpleAudioEngine

[唠叨] 本节比较简单,主要讲讲cocos2dx引擎中的音乐音效. [致谢] http://gl.paea.cn/contents/f86d1f6e2a52e7ea.html [术语] 单例类:说的通俗一点,它就是一个全局静态类.第一次调用时会创建一个全局静态对象,整个游戏的运行过程中会一直存在,全局都可以访问. [SimpleAudioEngine] 音乐音效是每个游戏中不可或缺的部分,一个好的声音会给玩家留下深刻的印象,当一听到游戏的声音,就会不自觉得说出游戏的名称来.就像<中国好声音>一

Quick-cocos2d-x3.3 Study (二十)--------- 音乐音效

音乐音效 接下来,我们来给游戏添加背景音乐和音效. 首先我们要知道的是,Quick 引擎封装了一套与声音相关的 audio 模块,我们可以通过它方便的调用声音相关的 API 来控制声音.audio 模块提供了众多的方法和属性,比如预加载.播放.暂停.停止.恢复声音等等. 我们还需知道,游戏中的声音背引擎分为了两种:一种是Music(指背景音乐),另一种则是Sound(指游戏音效,也就是除了背景音乐以外的声音). 下面是一些控制背景音乐相关的常用 API: 预载入一个音乐文件:audio.prel

cocos2dx2.2添加音乐音效以及设置音量

cocos2dx2.2添加音乐音效以及设置音量(非原创) cocos2d-x使用SimpleAudioEngine类作为实现跨平台的音乐引擎,首先需要引入头文件. 对于声音文件,我们可以提前加载,这样会提高游戏的执行效率,但却会增加内存消耗,编码时,我们需要根据实际情况决定是否要进行预加载处理. 好了,我们写一个例子先,同样还是新建一个Music项目. 1.引入头文件以及相应的库 #include "cocos2d.h"   #include "SimpleAudioEngi

音乐与动漫及游戏的关系--游戏动漫音乐音效制作 分贝块

良好音乐音效在动漫游戏中是相当重要的,让音乐来增加动画的表达效果而不是仅仅辅助动画,在公众的眼里,新的.富有表现性的音乐应该和动画造型一起出现在我们的电影中并不断为气氛.地点和场景提供支持和节奏. 音乐可以解释任何视觉效果,当音乐成为动画的一部分,环境就会让人觉得更加清洁和庄严.在伴随音乐的烘托下,峡谷中雷暴的轰鸣就形成了视觉上逐渐增强的效果. 好的高质量的游戏动漫配乐音乐音效制作方就显得十分的重要 与制作普通的主题曲.校歌.专辑有所不同的是,在对游戏配乐进行创作的时候,更加需要注重产品的细分,

音乐检索MIR &#187; 音乐检索研究中使用的工具

音乐检索MIR » 音乐检索研究中使用的工具 工欲善其事,必先利其器.最近在ISMIR邮件列表上大家把自己知道的MIR工具都列了一遍,我整理成这篇文章. jMIR是一个工具集.能够对音频.曲谱.歌词等进行特征提取,挖掘并分析元数据.并基于Weka添加了机器学习模块.这个倒是经常用,不过只是用来提取音频特征. Yaafe是有效的特征提取程序库. Aubio特征提取不多,主要做鼓点.音高.起始点(onset)检测. CLAM是一个无所不包的框架. Scikits-learn是基于python的工具.

Unity3D 连接MySQL数据库笔记3-SQL建表

打开  Navicat MySQL管理工具 连接到数据库 选择 test 数据库 点击 查询 输入对应的 sql命令 create table tuser( uname varchar(20) not null primary key, upwd varchar(20) not null ); create table p_info( pkey varchar(15) not null primary key, pname varchar(20) not null, psex varchar(2