Unity3D中基于声音和音乐的环境生成

注解


大家好 本文是有关基于音乐和声音生成内容的系列文章的第一篇。 实际上,这种生成是一项相当复杂的技术任务,因此,本材料将是介绍性的,更加侧重于游戏设计和对该主题的一般理解,之后,我们将沉浸于该主题的技术方面。



在本文中,我们将考虑一种特定的游戏类型,其中基于声音和音乐生成内容。 这里不会给出声音的一般理论,但是您可以在材料中找到信息源的链接以及对我们将要使用的术语的简要说明。 该材料尽管包含有关声音理论和编程的技术信息,但是为新手读者设计的。 这些插图是独立制作的,由于我不是艺术家,所以请不要认真对待它们,仅在更好地理解材料时才需要使用它们。 祝您阅读愉快!


引言


对于我个人而言,基于视频游戏中音乐的程序生成是一个始终被某种神秘感笼罩的话题。 声音形式不仅可视化而且直接影响游戏玩法,这是令人难以置信的。 一切看起来都很奇特,但真可笑。 这就是为什么这类游戏拥有少量但稳定的用户。 Steam为这些游戏添加了单独的标签:“基于音乐的生成”和“节奏游戏”。 目前,虽然有更多使用这种机制的游戏,但可以在大约200个项目中找到这些标签。


实际上,基于声音的生成为游戏的发展提供了无限的空间,但是到目前为止,这种想法仍然是独立项目的命运,而在AAA游戏(《吉他英雄》除外)中,由于其游戏的不稳定性和异常性,此类实验不适用。 。


好项目的例子


在继续讲究基于声音的生成的本质(不要与声音生成混淆!)之前,我想举一些使用类似机制的成功游戏的例子。 如果您还没有演奏过,请尝试! 您可能以前从未见过。 其中许多项目都获得了玩家和媒体的奖项。


严格来说,纯生成仅在Audiosurf中使用。 在其余游戏中,我使用其一个或另一个元素。 有些游戏更专注于跟踪位,有些则更关注轨迹的大小,等等。


此类项目很难通过屏幕截图或说明进行评估,因此,如果您没有时间玩,只需在YouTube上观看视频即可。


音频冲浪



对于许多玩家而言,Audiosurf是第一个使用基于音乐的内容生成的游戏。 该项目由Dylan Fiterer公司Invisible Handlebar的独立开发商创建。 当Audiosurf出现在Steam上时,这个市场才刚刚开始发展,而目前的惊人增长率仍然遥不可及。 Audiosurf看起来非常新鲜且不常见,此外,它是Steam上的第一款游戏(Valve游戏除外),其中包含成就!


Audiosurf的口号“骑您的音乐”非常准确地反映了游戏玩法:在您的音乐曲目的基础上,创建了您需要驾驶的曲目。 游戏考虑了音轨的速度,动态变化(音量的增加和减少)和位。 在其中,您可以使用不同类型的音乐,并将它们与不同的游戏模式结合在一起。 此外,每首曲目都有自己的记录表,您可能会惊讶地发现还有十多人在听您喜欢的“ Undeground Death Metal”。



不幸的是,在静态方面Audiosurf没有被察觉。 需要玩。


说到游戏玩法,Audiosurf很棒。 例如,如果音轨从安静的开头开始,您的船就缓慢地爬上山,但是当音乐质感变得更加饱和和浓郁时,速度就会增加并且您总是会俯冲。 所谓的Drop感觉特别好,在此过程中,声音在开发过程中“中断”,然后在高潮时返回。 多种多样的架子鼓可以将您的足迹变成多山的道路,并影响特价商品。 效果。 此外,传递生成的跟踪时必须收集的块也位于该位的下方。


自游戏发布以来已经过去了10年,但它在玩家中仍然很受欢迎。 此刻,游戏的两个部分发布了,开发人员Dylan Fitterer继续发展自己的想法,并创建了Audioshield,在这里您可以抵挡虚拟现实的冲击。


我们建议您在以下曲目上播放:


  • 羽绒系统-杂碎!
  • 马丁·加里克斯-动物
  • Skrillex-班加朗

在评论中分享您最喜欢的Audiosurf曲目!


可以在Steam上购买该游戏。


跳动危险


在这个项目中,创作者掌握了Shoot'em的标准机制,并在其中添加了对您的音乐曲目的分析。 原来很酷。 音乐影响着一切:飞船的力量,对手的数量,游戏的整体速度。 最重要的是,可以从音乐中感受到游戏的乐趣,从静音到强大的声音都有急剧的过渡,然后屏幕上的效果就爆炸了,飞船开始发出巨大的光芒。


该游戏具有相当丰富的机制,多种模式和庞大的boss。 一般来说,您需要的所有乐趣!



我们建议您在以下曲目上播放:


  • 神童-侵略者必死!
  • 感染蘑菇-黑沙瓦玛的传说
  • 傻瓜朋克-联络

在评论中写下跟踪您最想消灭敌舰的评论!


可以在Steam上购买该游戏。


Soundodger +


游戏是Beat Hazzard和流行的Super Hexagon的混合体。 游戏玩法的本质是您需要躲避其活动取决于音乐曲目的对象。 该过程非常复杂,因此-非常令人兴奋。



可以在Steam上购买该游戏。


死灵舞者的地穴


疯狂准确地传递节奏并使您在游戏手柄上跳舞的游戏。 NecroDancer的地穴是一个Roguelike项目,您和怪物都必须严格遵循音乐。 如果您不喜欢节奏,则移动时游戏会罚款您。 整个位置同时跳动,产生不真实的气氛。 配乐由著名的丹尼·巴拉诺斯基(Danny Baranowsky)撰写(超级肉童,以撒的结合)。 顺便说一句,游戏支持跳舞毯!



可以在Steam上购买该游戏。


几何破折号


这是一个非常顽固的跑步者,您不仅要依靠自己的反应,还要依靠节奏感,因为所有障碍都已被克服,并且在赛道尽头(如果可以到达),您已经在直觉上前进了。 严格来说,没有这种生成,但是开发人员使用音乐曲目的分析来更好地构建该级别。



像该类型的几乎所有游戏一样,Geometry Dash看起来非常明亮


可以在Steam上购买该游戏。


Beatbuddy:监护人的故事


一种华丽的音乐平台游戏,其动作发生在水下世界中,生活在明亮的电子摇摆下。 游戏中的每个生物都会产生自己的声音。 Krabik拍打快节奏,海葵负责枪管……同时,主角可以影响世界上的居民并改变音乐和游戏玩法本身。 在游戏中,使用了Parov Stelar,Austin Wintory,Sabrepulse和La Rochelle Band等音乐家的曲目。



可以在Steam上购买该游戏。


在受到优秀项目的启发之后,我们可以继续研究“这一切如何运作?”这一问题。


基本声音选项


模拟音频选项


由于选择的主题不太简单,并且包含许多技术方面的内容,因此我决定不用理论充实本文,而是定义基本概念。 如果您想更深入地研究声音理论,那么在Habr上有很多关于该主题的文章。 在本文的结尾,您将找到许多有用的链接。


声音的基本参数将包括以下内容:


  • 声波频率或音高,Hz
  • 声波幅度或音量,dB
  • 衰减系数是幅度随时间减小的速率。
  • 波形-声波的一般视图。 使用此参数,您可以将声音分为几组(锐利,平滑,噪点等)。

为了清楚起见,我在以下图表中引用了声波的主要特征(未设置单位,我深表歉意):



大声响



声音安静,振幅较小



高音高,高频



声音低,频率低



声音大而响(请注意耳朵!)


通常,此数据足以充分了解什么是声音并继续前进。 但是,如果您对此主题感兴趣,那么您当然需要更深入地研究它。


数字音频选项


在编写游戏和其他程序时,我们将使用声音的数字形式。 数字声音是通过采样(分为几个时间点),量化(四舍五入到一定水平)和编码(实际上是将声音变成零和一)获得的。 您可以在文章“声音理论”中找到有关此主题的很多信息 您需要了解声音才能使用它。 体验我真正喜欢的Yandex.Music 。 在这里,您将找到有关测量体积的信息以及我将提到的过滤器的描述。


关于数字信号,我们需要了解的主要内容是:


  1. 采样率-表征声音将被数字化的精度。 例如,当我们说采样率为44.1 kHz时,这意味着在一秒钟内对信号进行了44,100次测量。 今天,最常见的采样率是44.1 kHz和48 kHz。


  2. 数字信号的位深度-表征“适合”数字信号的动态范围的范围。 它以位为单位,通常为16、24和32位。 动态范围是最大声音和最安静声音之间的差异,以分贝表示。 例如,对于8位信号为48 dB,对于16位信号为96 dB,对于24位信号为144 dB,对于32位信号为192 dB。


  3. 比特率是2002年所有互联网用户下载音乐时看到的。 比特率是每单位时间用于传输或处理数据的位数。 在使用质量损失的压缩的流式视频和音频格式(例如MPEG和MP3)中,参数“比特率”表示流的压缩程度。



音乐文件中的元数据


除了声音参数本身之外,我们还可以使用声音文件本身中隐藏的信息。 此信息通常称为标签,每种文件格式都有其自己的标签格式。 我们将讨论最常见的mp3文件。


使用现成的库,例如使用TagLib ,最容易读取标签。


mp3格式在其ID3结构中包含元数据,我们可以在其中存储很多信息。 ID3格式有多种选择,但我们将讨论ID3 v2.3,您可以在其中存储大多数数据。 在有用的信息中,您需要注意: 名称,录制年份,类型,BPM(每分钟的节拍数),曲目持续时间 。 这些字段在生成内容时如何为我们提供帮助? 如果BPM一切都清楚,它会一直在生成过程中使用,我们将分别讨论它,那么为什么我们需要其他领域? 在这里,您需要发挥想象力。


例如,我们阅读类型和年份。 首先,我们需要处理一些信息。 为简单起见,我们仅考虑英语。 MP3标签(和其他标签)通常是手动填写的,从这里开始遵循不同的流派拼写,标点符号等。 最好将结果标签设为单一格式,以便与其他标签比较。 建议删除所有标点符号,空格并将字符串转换为小写。 可以使用正则表达式来完成。


经过这样的操作,比较歌曲的流派将更加容易。 接下来,您将需要基于某些来源创建流派基础,并通过它来编译标签数据库。 这是所有流派列表的示例: musicgenreslist.com 。 自然,您只需要选择最基本的。


我没有回答,为什么会有这样的困难? 我将举一些例子(非常简化)。
根据流派,我们可以:


  • 更改位置(岩石-阴沉的森林,电子音乐-空间,乡村-沙漠,流行音乐-城市等)
  • 改变角色
  • 更换敌人等


基于标签rock,electro,pop的字符示例。


然后,您可以提出任何建议! 专辑发行年份:1960-1970年? 将角色打扮成这一时期的衣服。 追踪时长10分钟? 让您的“音乐产生的蛇”拥有长长的尾巴。 有很多机会,总有机会给玩家带来惊喜。


音频文件在Unity中的表示形式



一切似乎都很简单...


Unity具有用于处理声音的几个主要组件:


  • 音频侦听器(侦听器)的行为类似于麦克风。 它接收来自场景中任何声音源(音频源)的输入,并通过扬声器播放声音。 对于大多数应用程序,将侦听器添加到主摄像机(主摄像机对象)是有意义的。
  • 音频源在场景中播放音频剪辑。 如果音频剪辑是3D剪辑,则源将在空间中的给定位置播放,并且将根据距离而静音。
  • 音频剪辑(片段)包含音频源中使用的音频数据。 Unity支持单声道,立体声和多声道音频资产。 Unity可以导入以下文件类型:.aif,.wav,.mp3和.ogg。


如果您沉迷于声音处理,则需要直接与音频剪辑进行交互。 音频剪辑包含一组可以读取和覆盖的声帧(样本)。 借助此(以及Matan堆),您可以确定音轨的参数并制作音效。


音乐曲目设置


因此,我们从自己的足迹中读取了一些初始数据,从而获得了第一批产品。 现在,您可以继续进行更困难的部分。 我们需要了解我们可以确定轨迹的哪些动态参数,以及如何在游戏过程中使用它们。 部分材料基于Parallelcube工作室博客。 这些家伙为Unreal Engine制作资产和教程,这要归功于他们。


可以区分以下任务:


  • 定义镜筒以触发特殊效果
  • 确定轨道中的安静时刻
  • 使用此数据构建关卡
  • 使用此数据来创建效果

检测轨道中的脚鼓,并使用此声音作为触发器。


为了开始确定音轨的参数,您需要选择音乐。 为了使工作更轻松,您需要一个轨道,其中有明显的发条盒,最好是音量急剧变化的轨道。 我选择了轨道Perturbator-Future Club ,您可以在游戏热线迈阿密2:错误的号码中听到。


这是该曲目条目的简短分析(音频曲目已特别缩短)



  1. 所谓淡入或引入。 此时,音轨的音量会增加。
  2. 主要的冲击力出现-枪管。 在音轨的视觉表示上,很容易读取枪管出现的瞬间。 另外,背景合成器在这里发声,并且其噪音在轨道上可见。 如果轨道没有被压缩,它将更加清晰。 ( 此处有关压缩的详细信息)
  3. 出现了一个附加的合成器,它会稍微削弱镜筒视觉表示的清晰度
  4. 曲目中亮点之前出现的暂停(放下)。
  5. 在主体部分,除了炮管之外,还出现了低音合成器,它极大地扭曲了信号的视觉表示,但炮管仍然可以区分。

因此,我们的主要任务是确定枪管发出声音的时间。 这是一项相当困难的任务,为此通常使用特殊的音频库。 请记住,如果有现成的选择,并且您的目标是产生效果,而不是研究垫子。 部分,采取现成的选择。 如果您的游戏有预算和额外的25美元,则可以从开发商3y3net购买一种特殊资产,称为Beat Detection 。 另外,您可以考虑从开发人员Allan Pichardo那里获得不错的选择。 如果您想了解此类算法的工作原理,那么当然请自己从头开始编写。


正如我们从音轨中看到的那样,节拍总是可以通过声音水平来清楚地区分。 这就是它的本质。 音乐家专门处理和压缩轨道,以使节拍不会被其他声音所阻塞,并且其位置会位于轨道的频率范围内。 该位总是比平均音量(平均)高。 如果声音大于某个阈值(阈值),那么我们只要看一下声波的图形显示,就可以自信地说“是的,这有点!”。



我想在另一篇文章中给出更详细的技术描述和特定的算法来确定一些内容(稍后会发布),因为该主题大大超出了本文的范围。 简而言之,在这种算法中,声音首先通过滤波器以使其易于处理,然后再分析声能的动力学。 这是这种算法的一个示例(注意,matlab!)


可以在本文中找到此算法的完整数学描述: 心跳检测器算法的设计和实现


因此,让我们想象一下,我们能够编写一个脚本,该脚本实时确定桶踢的时间。 此外,借助该算法,我们还可以确定一般的BPM,并了解主要节奏在哪里“跳动”。 我们如何处理收到的信息?


您可以以Beathazard为例,并确保对于每一次主要节奏,我们的船都使用普通的常规激光进行射击,当枪管命中时,我们将使用超级激光进行射击。 它看起来像这样:



此外,我们可以添加更多特价商品。 效果。 并使电平随位一起跳动:



与实时确定位的算法相同,我们可以用来计算BPM(每分钟的心跳数或每分钟的心跳数)。 BPM信息可用于例如生成难度级别和计算奖励积分。 如果曲目速度很快(150-180 BMP),则玩家会获得X5奖励,依此类推。


确定轨道中的安静时刻


确定响亮和安静时刻的一种方法是使用低通滤波器处理音轨并获得音量的移动平均值。 之后,我们可以使用方便的格式保存此音量级别,例如,以float数组的形式保存。


, . , , , . , . , .



.


, , , , ( ). , , 2D-? . :



3D, 2D . , Audiosurf , .



Elastomania, ? !?


, , , - .


结论


, , . , , , , . , , , . , , . Unity. !



有用的链接


Source: https://habr.com/ru/post/zh-CN429872/


All Articles