《Divinuet》的互動音樂系統 – 第 1 部分
《Divinuet》是一款針對 PC 和 Mac 平臺開發的塔羅牌遊戲,它可以依據牌面解讀結果為玩家提供別具情致的音樂體驗。如果你對塔羅牌不熟悉,建議參閱一下這篇文章。至於 Divinuet 這個名字,其實是我機智的朋友格韋爾 (M Gewehr) 幫忙取的,它融合了 divination (占卜)和 minuet (小步舞曲)兩個詞的意思。
遊戲大致分為兩個環節:占卜(“the reading phase”,還可再細分為洗牌、發牌、開牌、解讀)和生成(“the generative phase”,遊戲依據牌面組合及順序生成不同的音樂和畫面)。在這篇博文中,我想先著重探討一下占卜環節當中播放的音樂。主要是因為生成環節的音樂系統還有一些細節尚待完善,而且把所有內容都放在一起說的話篇幅會顯得太過冗長。不過別擔心,稍後我會再寫一篇博文來專門介紹生成環節的音樂設計。
音樂
在占卜環節,將以牌面朝下的形式發三張牌。在翻開每張牌時都會揭示牌面含義,並針對這張牌播放一小段主題音樂(長約 45 秒)。整副塔羅牌共有 78 張,所以要創作 78 段主題。
可是,中間過程怎麼處理呢?比方說,正在發牌或者正要翻開下一張牌。什麼聲音都沒有的話聽起來肯定會很乏味,所以有必要在牌面主題(card theme)前後插入間奏音樂(interlude)。不過在確定接下來要播放哪段牌面主題的情況下,要怎樣創作間奏音樂來實現平滑的過渡呢?
最簡單的方法是所有牌面主題全部採用一個調,這樣的話直接把間奏音樂設為同樣的調就行了。但是,我並不想那麼做。因為玩家十有八九會因為缺少變化而感到枯燥乏味,而且牌面所蘊含的寓意和心境也得不到充分的體現。要是非得這麼創作 78+ 段樂曲,恐怕我自己都會覺得很沒意思。最終,我選擇了自己在創作互動音樂時常用的一種方法:將創作要用的調限制在有限的幾個調之內,而這些調相互之間存在共同音。具體來說,就是把大多數牌面主題均採用 Bb 調或 Eb 調來寫作(調式方面可以是大調、小調、Dorian 或者其他調式),只有極少數例外(稍後我會詳細說明)。
說回間奏音樂,其必須能夠平滑地過渡到上述音調的牌面主題。而且,最好有別於大調和小調。因為占卜結果可能會呈現出很多不同的心境,我不希望間奏音樂和牌面主題在這方面發生衝突。為此,我選擇了牌面主題最有可能用到的 4 個調(Bb 大調、Bb 小調、Eb 大調和 Eb 小調),並確定了它們的共同音(Bb、C、Eb 和 F)。然後,間奏音樂從頭到尾就只用這些音符來寫作。
對於間奏音樂,我結合運用了縱向分層和橫向分段的作曲方式。先來說說縱向分層。為此,我專門設定了 3 個分層:High、Middle 和 Low。其中 Middle 分層是段簡短的一小節無限重複的 Piano 樂句(前面 2 個 Bb與F 構成的四分音符,後面 2 個 Bb與Eb 構成的四分音符)。所有間奏音樂都將圍繞該分層構建。
當然,僅僅只是聽這麼一段樂曲肯定會感到特別無聊。所以,我們要藉助 Low 和 High 分層來使間奏音樂更加富有變化。對於這種情況,需要運用橫向分段作曲方式來加以實現。為此,我製作了一些簡短的一小節樂句。它們全都只用 Bb、C、Eb 和 F 音符,不過分別採用了不同的樂器來演奏。這裡有幾個例子,我們來看一下(為簡單起見,我把 Bass Clarinet 樂句設為了音樂會音高A=440Hz)。
整段迴圈的長度只有一小節。對於播放的每一小節音樂,都會隨機播放一段 High 和一段 Low 樂曲。在 Wwise 中看起來就像這樣:
所有分層被放在了同一 Music Segment 中,對應的 High、Middle 和 Low 音軌會同步播放。其中 Middle 音軌只有一段簡短的 Piano 樂句,所以每次都會播放。High 和 Low 音軌被設為了 Random Step 型別,由多個子音軌組成。這兩條音軌還分別包含有一條空白子音軌。也就是說,在播放每段迴圈的時候,High 和 Low 樂曲都有可能是沒有聲音的。這樣間奏音樂會更加富有變化一些。
不過我確實遇到了一個問題,就是有些 High 和 Low 樂曲只播放一小節就會停止,感覺稍微有點突兀。針對這種情況,我特地在樂曲結尾插入了一個附加音符,來讓它在下一小節的第一拍開始播放,並將其作為post-exit編到了 Wwise 中。
下面是合在一起之後的效果,不妨試聽一下。注意,裡面的 Music Playlist Container 其實包含了兩個 Music Segment:Interlude_Intro(單次播放)和 Interlude(無限迴圈)。其中 Interlude_Intro 只有一段簡短的一小節 MidPiano 樂句。也就是說,間奏音樂每次都會先播放這段 Piano 樂句,分層的其他器樂內容在一小節之後才會切入進來。在 Demo 視訊中,我們可以聽到前面展示的 Piano、Bass Clarinet、Violin 和 Flute 以及其他一些樂器演奏的樂曲。
(國內觀賞視訊通道)
在從間奏音樂過渡到牌面主題的時候,我遇到了跟前面類似的問題:MidPiano 樂曲有時會突然停止,顯得不夠連貫。為此,我特地在每段牌面主題的第一小節插入了採用鋼琴演奏的 Bb + F 或 Bb + Eb 音符,來順暢地承接前面的 Piano 樂曲。下面擷取了兩段由間奏音樂過渡到 TheHighPriestess 牌面主題的音訊,我們來對比一下插入附加音符之前和之後的效果。
剛開始我試了一下把上述附加音符編到 Wwise 中,後來發現直接將其渲染到牌面主題的音訊檔案中反而更容易些。在插入這些附加音符的時候,我還發現其實可以酌情考慮採用 Eb 和 Bb 以外的音調,但前提是第一和絃中要包含 Bb + F 或 Bb + Eb 音符。就拿 AceOfCups 牌面主題來說,我想讓它聽起來有點法國印象派樂曲的味道。於是就選擇了 C 小調七和絃作為開頭,使用了其中的四個音符:C、Eb、G 和 Bb。
下面是合在一起之後的效果,不妨試聽一下。這段視訊展示了遊戲原型裡的占卜環節,不過目前只構建了一個非常簡單的框架,最終作品中會包含更多畫面之類的元素。在視訊開頭,除了間奏音樂和牌面主題,還可以聽到一段簡短的 Synth Pad 樂曲,用以實現 Game State 之間的過渡。
(國內觀賞視訊通道)
仔細聽的話不難發現,在播放牌面主題之後馬上回到了間奏音樂。對此,有個朋友建議我在當中(牌面主題與間奏音樂之間)插入一些音樂,來讓玩家有時間思考牌面含義。這主意挺不錯,我打算製作幾段簡短、輕柔的 Synth Pad 樂曲,來讓它隨著牌面花色變換。
實現
在構建好音樂系統之後,必須想清楚如何將其有效地運用到遊戲中。同樣,在此我們只著重探討遊戲的占卜環節,暫不深究各種 Game State 之間的音樂變換或是占卜環節以外的話題。
首先,我建立了一個 "DuringReading"( “占卜中”) State Group,並在其中新增了與牌面主題和間奏音樂對應的 State。藉此,來確定在占卜環節的任意給定時刻播放哪段樂曲。目前我只完成了 10 種牌面的音樂設計,不過最終作品中將會涵蓋所有的牌面。
接著,我建立了一個 "Reading" ( “占卜”) Switch Container,並將牌面主題和間奏音樂分別放在了不同的 Music Playlist Container 中。隨後,又把各個 Music Playlist Container 與對應的 State 關聯了起來。
最後,我在 Wwise 中建立了與牌面主題和間奏音樂對應的 Event。在占卜環節的開頭,每次都會先播放一段間奏音樂。這時會傳送第一個 Event,來直接將 State 設為 Interlude,並通過 Play 動作觸發相應的樂曲(不過這只是暫時的,最終遊戲將由主選單開始,到時會先播放選單音樂)。之後會根據開牌結果傳送其餘 Event,來播放牌面主題並切換回間奏音樂。比方說,當前正在解讀 Ace Of Cups。這時會先將 State 設為 AceOfCups,然後延遲 5 秒再切換回 Interlude。
除此之外,我還對占卜音樂的過渡進行了如下設定:在 State 發生變化時,直至到達當前所播 Music Segment 的 Exit Cue,才會過渡到與新 State 對應的 Music Playlist Container。其中,Exit Cue 設在樂曲的末尾(如有混響尾音,則作為post-exit予以播放)。所以,就算 State 在 5 秒之後發生了變化,也不會在樂曲播完之前就切換回間奏音樂。
在此,我要先感謝一下我的程式設計師朋友索爾·魯茲 (Sol Lutze)。他先是幫忙構建了遊戲的基本框架,然後又在 Unity 中編寫了一些程式碼,讓我可以將指令碼化物件(scriptable object)輕鬆應用於各種牌面。如此一來,便不必再單獨為每種牌面建立一個遊戲物件(這樣會佔用大量的記憶體),只需從指令碼化物件中提取資料並填充到空白模板中即可。指令碼化物件包含很多資料(比如牌面是哪種花色、為畫面選用哪張圖片、要顯示哪些含義內容),不過這裡只有 musicEvent 資料欄位跟我們目前討論的問題有關。
下圖是實際指令碼中的內容。我圈出了關鍵的兩行程式碼。
using AK; 告知指令碼接下來要使用一些 Audiokinetic 程式碼;public AK.Wwise.Event musicEvent; 告知其允許選擇 Wwise 中所建立的 Event,以便與指令碼化物件進行關聯。
經過上述設定之後,只需在 Unity 中單擊與指令碼化物件關聯的 Music Event,系統便會直接列出 Wwise Event 來供我快速選擇。
另外,索爾還設定了一系列 Game State 來告知遊戲當前正在執行的操作(發牌、開牌、解讀…),從而確定何時播放牌面主題或是間奏音樂。其中比較關鍵的是表示當前正在顯示牌面含義的 ReadingCard。該 Game State 會呼叫一個名為 ReadCard 的函式。針對這種情況,我向該函式新增了一行程式碼,來告知其傳送與所解讀牌面關聯的 Event。
簡而言之,這行程式碼的含義就是告知指令碼針對牌面選擇併傳送名為 musicEvent 的 Wwise Event。比方說,當前正在解讀 Ace Of Cups。在這種情況下,會首先將 State 切換為 AceOfCups,來由間奏音樂過渡到對應的牌面主題。然後延遲 5 秒再恢復為 Interlude,以在播完牌面主題後切換回間奏音樂。也就是說,我們並不需要另外建立一個 Event 來實現後半部分操作。
我們再來看看遊戲視訊,體驗下實際的視聽效果。
(國內觀賞視訊通道)
在前面談到索爾所做的工作時,估計你也發現了,我並不是一名專業的程式設計師。事實上,我從來沒有特地參加過類似的培訓。好在網上有很多免費的資源,讓我學到了不少 C# 程式設計知識。就拿 Unity 來說,其官網上就有好些精彩的 C# 教程。如果你對程式設計感興趣,建議先到網上查一查,看看有什麼免費資源。
對於占卜環節當中播放的音樂,我目前做的差不多也就這些了。在完成整個遊戲之後,情況可能會大不相同。不過,我對現在為止取得的成果還是挺滿意的。
對於想自己製作遊戲的音訊開發者,我覺得不妨放開手腳大膽地去試試。有些技能在平時工作中未必用得到,業餘時間拿來練練手不是挺好的嘛。想用 Unity 或是 Unreal 都行。網上有很多免費教程,可以一邊學一邊實踐。
最後,我要給自己的專案做個小小的宣傳。《Divinuet》目前正在 Indiegogo 上籌集資金(當然,我可以獨立地完成開發。但是,若能找些人來幫忙,肯定會更輕鬆一些。這樣也能把遊戲做得更好)。如果你對這款遊戲感興趣,請點選此處瞭解募資活動。
梅根·卡恩斯 (MEGAN CARNES)
作曲家、遊戲開發者
梅根·卡恩斯 (Megan Carnes) 是一名來自洛杉磯的作曲家、遊戲開發者。她對互動音樂和生成音樂比較感興趣,目前開發有《inter-view》和《Divinuet》兩款音樂遊戲。據悉,稍後推出的獨立 2D 平臺遊戲《A Crooked Heart》也將由她作曲。同時,她還是 Game Audio LA 的聯合發起人。
megancarnesmusic.com/
megancarnes.itch.io/
@megancomposer
來源:audiokinetic
原文:https://blog.audiokinetic.com/zh/the-interactive-music-systems-of-divinuet-part-1/
相關文章
- 《Divinuet》的互動音樂系統 – 第 2 部分
- WirMusic音樂系統
- SmallerAPK,第1部分:APK的剖析APK
- WebSphere Process Server 流量管理,第 1 部分WebServer
- [譯] 使用深度學習自動生成 HTML 程式碼 - 第 1 部分深度學習HTML
- Spring 的優秀工具類盤點第 1 部分Spring
- 移動網頁設計9大原則——第1部分網頁
- 架構設計師與SOA, 第 1 部分架構
- mORMot模糊概念--FormatSQL-第1部分ORMSQL
- [開發教程]第1講:Bootstrap使用者介面與互動架構boot架構
- 遊戲音訊存檔 | 第 1 部分:基本情況遊戲音訊
- 整合 WebSphere Process Server 與 SCA 功能包,第 1 部分WebServer
- 通用執行緒:Awk 例項,第 1 部分(轉)執行緒
- Vim 實用技術,第 1 部分: 實用技巧
- SOA 環境中的測試驅動的開發,第 1 部分: 測試資料對映
- 13 款驚豔的 Node.js 框架——第1部分Node.js框架
- 如何把你的樹莓派變成一個 HiFi 音樂系統樹莓派
- Django入門指南-第1部分(環境搭建)Django
- 如何構建一個多人(.io) Web 遊戲,第 1 部分Web遊戲
- [譯] 除錯 RxJS 第1部分: 工具篇除錯JS
- 在Docker Swarm上部署Apache Storm:第1部分DockerSwarmApacheORM
- Windows 到 Linux 之旅:第 1 部分. Linux 思想(轉)WindowsLinux
- 關於 Java Collections API 您不知道的 5 件事,第 1 部分JavaAPI
- 第1章 好的推薦系統
- Flutter第5天--佈局例項+操作互動Flutter
- 《TCP/IP詳解卷1:協議》第19章 TCP的互動資料流-讀書筆記TCP協議筆記
- 【譯】什麼是SOLID原則(第1部分)Solid
- [譯] Xcode 和 LLDB 高階除錯教程:第 1 部分XCodeLLDB高階除錯
- 輕鬆學習 JavaScript——第 1 部分:瞭解 let 語句JavaScript
- Webpack 系列第 3 部分Web
- [Flutter翻譯]Flutter Anatomy - 佈局內部的第1部分Flutter
- Java XML和JSON:Java SE的文件處理,第1部分JavaXMLJSON
- [譯]使用 Rust 開發一個簡單的 Web 應用,第 1 部分RustWeb
- 預示敏捷方法走偏的15個標誌——第1部分敏捷
- 使用感測器監控的 Smarter Planet 解決方案,第 1 部分
- 第 1 章 推薦系統的時代背景
- 如何有效學習互動設計1
- 真人大屏互動系統,打造數字互動新體驗!