Koreography
m.Waveform Visualization Controls
(8)Sample Sync Music Player [Experimental]
一、Koreographer的介绍
Koreographer是一款游戏开发工具和Unity插件,可以简化视频游戏中同步音乐和动作的过程。它的简单编辑界面允许Unity开发者将节奏、节拍、音符、音量和其他动态音乐映射到游戏中的事件。游戏中的任何元素都可以进行韩国语编辑:动画、音效,甚至是游戏逻辑。Koreographer可以用于创建节奏游戏,使任何游戏更具电影效果,用音乐增强游戏环境,并创建新的控制和音乐驱动的游戏玩法。
Koreographer的核心是“事件系统”。当音乐或声音在游戏中播放时,Koreographer系统将Koreography Events报告给任何注册收听的组件或系统。Koreographer还利用存储在Koreography中的节奏信息,为脚本提供音乐时间轴。这个音乐时间轴可以用来驱动动画和其他系统,以保持时间感觉音乐。
开发人员使用 Koreographer 来创建节奏游戏,使任何游戏更具电影感,通过音乐增强游戏环境,以及创建新的控件和音乐驱动的游戏玩法。
-
轻松创建节奏游戏、启用口型同步或为音频添加字幕
-
将游戏内事件精确同步到游戏音乐中的不同点
-
快速创建基于音乐的新游戏玩法和效果
1.普通版和专业版的区别
(1)普通版
价格:50$
功能:
<1>特定于示例的事件同步
<2>支持所有Unity平台
<3>强大的基于unity的事件编辑器和运行
<4>完整的Demo演示场景
<5>Payload事件类型(Floating point, integer, curve, text, and number)
<6>playMaker集成
(2)专业版
价格:195$
功能:
<1>特定于示例的事件同步
<2>支持所有Unity平台
<3>强大的基于unity的事件编辑器和运行
<4>完整的Demo演示场景
<5>Payload事件类型(Floating point, integer, curve, text, numberspectrum, color, and color gradient)
<6>Payload自定义访问
<7>自动生成事件
<8>MIDI转换器
<9>PlayMaker集成(PlayMaker 采用更高级的策略,借助状态、动作和事件来提供一个直观的结构并助你快速构建行为。这实际上使非程序员和程序员两者都能够更快地、更高效地制作。)
<10>TazmanAudio集成(可以在项目的任何阶段为部分项目,完整项目或有针对性的解决方案提供音频程序员,从简单的实施到完整的设计或研发。)
<11>SECTRSectrAudio集成(SECTR AUDIO为Unity带来了最新的、尖端的音频制作工具和技术,包括一套无与伦比的编辑器扩展和运行时组件,让您轻松创建丰富、复杂、高效的音景。)
<12>MasterAudio集成(Master Audio的是一个整体解决方案,所有的丰富的游戏音频需求。内置的音乐闪避,手动和自动的声音触发真正的随机声音变化,音频汇集全3D声音功能。支持所有出口的手机游戏平台,具有一流的性能。)
<13>Wwise集成(为交互式体验和实时执行技术提供动力,Wwise提供了一套完整的设计和开发工具,无论您的项目规模如何,都可以轻松创建原型并将您的音频创意愿景变为现实。)
<14>FMOD集成(一种端到端解决方案,用于为任何游戏添加声音和音乐。使用 FMOD Studio 创作工具构建自适应音频,并使用FMOD引擎在游戏中播放,作为 Unity 音频系统的完全替代品)
<15>Koreographer源代码访问
2.功能
(1)简化同步过程
对于大多数游戏开发人员来说,将图形、游戏事件和用户交互与音乐同步超出了范围且耗时,通常需要声学技术和特殊的音频设计师。Koreographer 的可视化创作界面和游戏内事件系统使任何开发人员都能快速轻松地:
-
将游戏参数与音乐中的指定速度、节拍或节奏联系起来
-
使用精确定时为音频文件创建字幕或歌词
-
创作口型同步或动画以匹配您的音频
(2)实现新的音乐和游戏体验
为您的游戏添加音乐,为玩家提供新的游戏玩法或电影剧情。Koreographer 允许开发人员将动作嵌入到音乐中。通过在我们的数字编舞系统中进行一些基本的创作,您可以:
-
快速创建节拍匹配游戏
-
探索由音乐驱动的游戏机制
-
让音乐成为游戏的核心部分
(3)增强音乐,不要牺牲游戏性能
保持 CPU 周期,以增强图形和流畅的游戏体验。Koreographer 的音乐同步方法消除了实时音乐处理,让您的游戏以最佳性能运行。
(4)始终保持同步
Koreographer 的同步引擎输出轻量级元数据文件,这些文件可以跟踪时间,而不管引入可变性的系统如何。这解决了由最低规格的机器和可变的游戏帧率导致的音频延迟问题。无需再花时间调试脚本和调整算法来解决跨平台的延迟和其他音频错误。
二、Koreographer的下载
Koreographer官网:Sonic Bloom (koreographer.com)
UNITY ASSET STORE:
普通版:Koreographer | 音效 | Unity Asset Store
专业版:Koreographer Professional Edition | 音效 | Unity Asset Store
个人仅作学习,商用的话还是买人家的正版较好,提供免费的:
百度网盘:链接:Koreographer V1.6.0-百度网盘 提取码:asdf
蓝奏云:链接:Koreographer V1.6.0-蓝奏云 密码:asdf
三、Koreographer快速开始
1.快速开始
导入Koreographer.unitypackage后会发现,鼠标右键的Create多出了两个选项,
创建一个Koreography和KoreographyTrack,如下图所示:
把音乐/音频拖进图所示的位置,
然后打开Koreography Editor,
可以看见Koreography Editor和Inspector的属性是一样的,
给Track Event ID 一个id ,我这里命名为:TestEventID,可以看见Koreography Track 的 Track ID也是同时变化的,
现在开始给音乐/音频K帧(就是当音乐播放到这一个点的时候,开始执行逻辑,如实例化物体等。。),点击播放音乐/音频,然后再播放过程中选择自己需要的音乐到达的位置执行逻辑,再播放过程中按E键或者是Enter键都可以直接K帧,如下图所示,当音轨中间有红色的一条一条的红杠。
这时候我们可以看见Koreography Track中 Event List多了41个事件,每当播放到K了帧的地方就会调用逻辑。
在场景创建一个名为 Koreographer的空物体,
然后在Inspector面板添加Koreographer和Simple Music Player组件和一个EventSubscriber 脚本,将创建的Koreography拖进所选位置,如图所示:
我们需要把AudioSource的 Play On Awake 取消勾选。
EventSubscriber.cs 实现预期效果是当音乐播放实例化随机颜色的方块,代码如下:
using SonicBloom.Koreo;
using UnityEngine;
public class EventSubscriber : MonoBehaviour
{
public GameObject insGO;
Color[] colors = new Color[] { Color.black, Color.blue, Color.gray, Color.green, Color.red };
// Use this for initialization
void Start()
{
//RegisterForEvents(string eventID, KoreographyEventCallback callback)
//第一个参数是我们上面命名的Track Event ID 例如我的是 TestEventID
Koreographer.Instance.RegisterForEvents("TestEventID", FireEventDebugLog);
}
void FireEventDebugLog(KoreographyEvent koreoEvent)
{
insGO = Instantiate(insGO);
insGO.transform.position = Vector3.zero;
insGO.GetComponent<MeshRenderer>().material.color = colors[Random.Range(0, 5)];
Debug.Log("Koreography Event Fired.");
}
}
2.功能介绍
(1)Koreography
将AudioClip与一组KoreographyTrack和一个Tempo Map(通过Tempo Sections定义)关联起来的资产
Source Clip:需要用到的音乐/音频
Sample Rate(采样率):
Ignore Latency Offset:忽略时延偏移
Tempo Sections(节奏部分):
- Section Name:片段名字
- Start Sample:开始
Tracks(轨道):存放KoreographyTrack
可以看见,我们的轨道可以添加很多个轨道,那么这个是什么意思?在轨道里面的标记符执行每一个轨道事件,
那么我们可以想象一下,如果是我们在这个标点符的地方要执行多次回调函数呢?在RegisterForEvents 方法中,每一个注册的事件只执行一次回调方法,当我们需求改变了,比如说需要在一个标记符内,生成几个或者更多的物体,
可以看见我这里添加了五个轨道进去,当然它们的事件标记都是一样的,所以可以在一个节拍起来的时候,一次性回调方法进行5次。
简单来说就是,Trans集合可以让你的游戏变得更加有趣多化, 每个KoreographyTrack可以自定义不同时候执行回调函数。
好比如我上一个节拍所有的KoreographyTrack都有事件,但是下一个节拍就有一个KoreographyTrack少一个事件,它们都是同步执行的。
注意:当我们新建一个KoreographyTrack的时候我们也是需要在RegisterForEvents方法中注册事件的。
①Koreography类属性
SourceClip:获取或设置与此Koreography关联的AudioClip。注意:这将清除任何以前的SourceClipPath设置。
在源码中,要设置SourceClip的话,AudioClip和SourceClipPath清空。
SourceClipPath:获取或设置与此录音记录关联的音频文件的路径。注意:这将清除任何以前的SourceClip设置。
在源码中,要设置SourceClipPath的话,AudioClip和SourceClipPath清空。
SourceClipName:获取与此Koreography关联的源剪辑或音频文件的名称。
SampleRate:获取或设置编写Koreography Tracks所依据的音频数据的采样率。这在编辑时和运行时之间可能有所不同。
IgnoreLatencyOffset:获取或设置一个值,该值指示此Koreography是否应忽略任何配置的延迟或延迟偏移量。
Tracks:返回Koreography Tracks内部列表的副本。这授予对配置轨道的访问权限,但不允许编辑内部轨道列表本身。
②Koreography类方法
CheckTrackListIntegrity():检查内部Koreography Track列表的完整性,删除所有空项。(如果在此操作期间对列表进行了更改,则为True,否则为false。)
CheckTempoSectionListIntegrity():检查内部节拍部分列表的完整性,删除任何空项。(如果在此操作期间对列表进行了更改,则为True,否则为false。)
OverwriteTempoSections(List<TempoSectionDef> newSections):完全取代当前配置的节奏部分列表与传入的一个。(参数:要覆盖当前列表的节列表)
GetIndexOfTempoSection(TempoSectionDef sectionDef):获取给定节拍部分的索引,节拍部分的索引,如果找不到-1。
InsertTempoSectionAtIndex(int idxToInsert):在给定索引处用默认值创建一个新的节拍段并返回它。
RemoveTempoSectionAtIndex(int idxToRemove):移除所提供索引处的TempoSection,如果删除了节拍部分,则为true,否则为false。
RemoveTempoSection(TempoSectionDef sectionDef):从Koreography中移除给定的节拍部分,如果删除了节拍部分,则为true,否则为false。
GetTempoSectionNames():获取所有已配置的节奏部分的名称,一个字符串数组,其中包含Koreography中节拍节的配置名称(如果有的话)。
GetTempoSectionAtIndex(int sectionIdx):获得给定索引的节奏部分,返回在给定索引中找到的节拍部分(如果有的话)。
GetNumTempoSections():获取节拍部分的数量,返回节拍小节的总数。
EnsureTempoSectionOrder():通过配置的StartSample对Koreography中的Tempo部分进行排序,确保正确的顺序。
CanAddTrack(KoreographyTrack track):确定是否可以将曲目添加到Koreography中。如果Koreography中已经存在具有相同事件ID的另一个Koreography Track,则无法添加Koreography Track,如果可以添加轨道,则为true,否则为false。
AddTrack(KoreographyTrack track):将曲目添加到Koreography中,如果添加了track,则为True,否则为false。
RemoveTrack(KoreographyTrack track):从Koreography中删除Koreography Track轨道。
RemoveTrack(string eventID):从Koreography中删除与eventID匹配的事件ID的Koreography Track。
GetEventIDs():返回一个字符串数组,其中包含Koreography中所有Koreography track的事件id。
GetTrackByID(string eventID):返回事件ID与eventID匹配的Koreography Track。
GetTrackAtIndex(int trackIdx):获取在trackIdx上的Koreography Track。
GetIndexOfTrack(KoreographyTrack track):获取内部Koreography track列表中track的索引。
HasTrack(KoreographyTrack track):确定轨道是否存在于Koreography中。
GetNumTracks():获取Koreography中的Koreography track的数量。
DoesTrackWithEventIDExist(string eventID):检查事件ID为eventID的Koreography Track是否存在。
ResetTimings():重置内部跟踪采样时间。
GetBeatTimeDelta(int subdivisions = 1):获取当前更新传递所表示的Beats中的时间量,返回当前更新传递在Beats中所代表的时间。
GetLatestSampleTime():获取当前更新传递的示例中的时间。
GetLatestSampleTimeDelta():获取当前更新传递所表示的样本中的时间量。
GetBeatTimeFromSampleTime(int sampleTime, int subdivisions = 1):用subdivision指定的subdivision值将sampleTime从Sample Time转换为Beat Time,返回节拍时间相当于sampleTime。
GetSampleTimeFromBeatTime(double beatTime, int subdivisions = 1):用细分指定的细分值将beatTime从Beat Time转换为Sample Time。
GetMeasureTimeFromSampleTime(int sampleTime):将sampleTime从采样时间转换为测量时间。
GetSampleTimeFromMeasureTime(double measureTime):将measureTime从Measure Time转换为Sample Time。
GetSampleTimeFromMeasureTime(int measure):将测量时间转换为采样时间。
GetBeatCountInMeasureFromSampleTime(int sampleTime):获取由sampleTime表示的度量内的节拍时间。
GetSamplesPerBeat(int checkSample, int subdivisions = 1):返回checkSample指定位置的节拍内的采样数,并使用subdivision指定的节拍值。
GetBPM(int checkSample):返回checkSample指定位置的每分钟节拍数。
GetSampleOfNearestBeat(int checkSample, int subdivisions = 1):获取离checkSample最近的节拍的样本位置。
GetTempoSectionForSample(int checkSample):获取包含checkSample的节拍部分。
GetTempoSectionIndexForSample(int checkSample):获取节拍部分列表中包含checkSample的节拍部分的索引。
UpdateTrackTime(int startTime, int endTime, DeltaSlice deltaSlice):事件触发过程的一部分。这将触发所有已配置的Koreography Tracks(包括)中属于startTime和endTime指定范围内的所有Koreography Events。
(2)KoreographyTrack
沿着音频时间轴定义的KoreographyEvents序列。
EventList对应的就是Koreography Editor Tran Setting 中设置的事件集合。当我们点开Element的时候可以看见有两个值可以调节,
我们可以让回调的的时间更加贴合音乐/音频的节奏,什么意思呢,其实就是将轨道的事件执行时间更加细化,
当我们直接按E键或者Enter键K帧的时候,我们只能K到一条条竖者的白线上,但是我们的节拍又不在白线上的话,就会显的游戏节拍混乱, 在没有调节的情况下是在白条上,
然后我们只需要调节一下下方的参数就可以将事件对准着我们的节拍了,只不过需要做的工作特别繁琐。
(4)Koreography Editor
Window界面也多了两个选项。
Koreography Settings
①Koreography
当前加载的Koreography 。
②New Koreography
打开一个对话框,以创建和加载新的Koreography资产。
③“?”
打开Koreographer帮助面板。
④AudioClip
与当前加载的Koreography相关联的AudioClip。
⑤Tempo Section Settings
定义/配置与Koreography音频。
a.Tempo Section to Edit
当前选择的节拍部分。
b.Section Name
当前选择的节拍段的名称,您可以使用此控件重命名当前选定的部分,节拍段名称不必是唯一的。
c.Delete
删除当前选择的节拍部分,只有当存在多个节拍段时,才能删除节拍段。
d.Insert New Before
在当前选定的节奏部分之前插入一个新的节奏部分。
e.Insert New After
在当前选定的节奏部分之后插入一个新的节奏部分。
f.Start Sample
当前节拍部分音频数据的第一个样本,第一个节拍部分必须有一个开始样本0。
g.Tempo
节奏部分的音乐速度,通常以每分钟跳动数计算。
h.BPM/Samples Per Beat
决定如何显示速度值——要么是Beats Per Minute,要么是Samples Per Beat。
i.Beats Per Measure
当前节拍部分中每小节(或每小节)的节拍数。
j. Starts New Measure
这个节拍部分是否开始一个新小节(小节),这将有效地立即重置节拍计数,这对于突然转换、剪切或在文件开始处考虑沉默时非常有用。
⑥Track Settings
创建/配置Koreography轨道的设置和控件,特别是与Koreography相关的。
a.Track to Edit
此下拉列表将列出加载到当前韩国语的所有Koreography曲目,这里的Koreography track由它们的Event ID标识,而不是资产文件的名称,所选Koreography Track的内容将在UI的Koreography Track Settings部分中显示和编辑。
b.Track Event ID
当前选定的Koreography Track的事件ID
c.Load
将现有的Koreography Track加载到Koreography中。
d.New
打开一个对话框,以创建新的Koreography Track并将其与当前的Koreography。
e.Remove
从当前Koreography中删除当前选定的Koreography Track。这不会删除资产文件。
Koreography Track Settings
此部分中的字段、控件和显示使您能够创建、编辑和可视化在Track to edit字段中选择的Koreography Track的内容,本节还包含允许您控制AudioClip的播放以协助编辑的控件。请参阅键盘快捷键部分了解一些韵母。
①UI Elements
a.Playback Controls
b.V
c.Event Interaction Mode
确定如何解释波形显示上的鼠标输入。所有模式都遵循抓拍设置,任选其一:
d.Event Creation Mode
指示编辑器应该如何创建新事件,任选其一
e.Payload Mode
f.Analyze
g.Zoom
h.Snap To Beat
i.Divide beat by
j.Auto Scroll
指示Koreography Editor是随音频播放及时滚动波形显示,还是将其保留在当前位置。
k.Playback Volume
l.Speed
m.Waveform Visualization Controls
Koreography Event Settings
除非选择了一个或多个Koreography Events,否则此部分为空白。关于事件的可配置详细信息将出现在本节中。当选择单个事件时,“selected event Settings”标题右侧的括号中会显示一个数字。这个数字是所选事件在Koreography Track的内部列表中的索引位置。
a.Delete Event
b.Payload
c.Start Sample Location
d.End Sample Location
(5)Koreographer
在您希望系统接收Koreography Event通知的任何场景中都需要Koreographer脚本。在内部,Koreographer类遵循懒汉单例设计模式:当Koreographer组件启动时,它将自己设置为Koreographer实例。这允许为最常见的用例轻松访问Koreographer组件API。
Koreographer类只遵循懒汉单例模式,这一点很重要:您可以在同一个场景中轻松运行两个或更多Koreographer组件。每个实例都将在初始化期间覆盖静态单例“Instance”引用。这意味着静态Koreographer类api将只到达要初始化的最后一个Koreographer实例。但是,您可以使用直接引用来区分Koreographer实例。
Loaded Koreography:加载的Koreography:要在启动时加载的Koreography数据列表。如果您的音频播放器没有为您加载Koreography,这是有用的。
(6)Simple Music Player
(7)Multi Music Player
- Koreography: 为该层加载Koreography。Koreography记录将被加载到静态Koreography记录实例中,Koreography记录中的AudioClip将用于播放。
- Audio Clip: 不加载Koreography -简单地播放AudioClip。
- Optional: 本节中的设置是可选的。
- Name: 为图层添加一个名称。这用于重命名检查器列表中的音乐层条目。在上面的截图中,这个值将取代“Element O”。
- Audio Source: 一个对AudioSource组件的引用,这个音乐层应该使用它来播放
①MultiMusicPlayer类属性
Pitch:获取或设置音高。
Loop:获取或设置一个值,该值指示音频是否应该循环。
Volume:一次将音量设置为所有AudioSources。
IsPlaying:获取一个值,该值指示音频是否正在播放(暂停/停止)。
②MultiMusicPlayer类方法
(8)Sample Sync Music Player [Experimental]
Sample Sync Music Player仅与Koreographer Pro一起提供。当Multi Music Player尝试以同步的方式播放多个音频层时,Sample Sync Music Player保证了样本特定的同步。这个播放器是实验性的,这意味着它还没有经过严格的测试(对于绝大多数用例,Multi Music player已经被证明是完全足够的),并且在支持方面是一个极低的优先级。
Sample Sync Music Player的工作原理是加载所有图层的音频数据,并在播放时将它们组合起来。这保持了以(可能相当多的)内存使用为代价独立改变层体积的灵活性。
为了使系统正常工作,必须添加单独的音频总线组件。这个音频总线组件代表了采样同步音乐播放器和Unity的底层音频系统之间的连接。

- Audio Layer Settings:
- Koreo: 用于Koreography和音频回放的Koreography。
- Clip: 用于音频播放的AudioClip。
- Volume:这个音频层的初始音量。