• 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混音,但是不改变声音,仅用来读取声音。

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

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

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

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

     11

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

    最后,附上GITHUB源码地址

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

  • 相关阅读:
    Sublime3插件安装
    MyEclipse安装后的配置
    JDK 安装与环境变量配置
    Oracle 索引
    Java中间缓存变量机制
    数据库常见考题查询SQL
    python可视化---饼图
    python可视化---直方图的不同形状
    python可视化---堆积直方图
    python可视化---阶梯图step()
  • 原文地址:https://www.cnblogs.com/crazylights/p/3959908.html
Copyright © 2020-2023  润新知