如何使用 Wolfram 語言和 Unity 遊戲引擎構建虛擬鋼琴

2022-01-09 WOLFRAM

本文譯自博客:https://blog.wolfram.com/2019/06/06/how-i-built-a-virtual-piano-with-the-wolfram-language-and-the-unity-game-engine/

您知道什麼比學鋼琴更難嗎?在沒有鋼琴,也沒有任何音樂理論知識的情況下學習鋼琴。對我來說,買一架真正的鋼琴是不可能的。我沒有資金,大學的小公寓也沒有空間放鋼琴。很自然地,看起來我必須自己構建一個鋼琴——當然是數位化的。幸運的是,我有Mathematica、Unity和幾個小時的空閒時間。因為使用Wolfram 語言 (https://wolfr.am/10mTqMAq6) 和UnityLink (https://wolfr.am/10mTnjzOC)在 Unity 中工作非常快速和高效,所以我創建了一個可演奏的鋼琴部分,甚至在這個過程中學習了一些音樂理論。

首先,我確定建造鋼琴需要以下條件:

每個音符的音頻

鋼琴鍵的幾何形狀

可攜式、交互式、實時渲染音頻和 3D 物理引擎

前兩個可以在 Wolfram 語言中輕鬆完成。至於最後一個,我選擇使用新引入的 UnityLink — Wolfram 語言和實時開發平臺 Unity 之間的強大連結。使用 UnityLink,現在可以結合Wolfram語言在渲染、音頻和物理方面令人印象深刻的模擬優勢與 Unity 將這三者有效地打包到 Web、桌面、移動和控制臺平臺的獨立應用程式中相結合。

在深入研究代碼之前,讓我們先了解一下鋼琴和它演奏的音符的一些背景知識。了解實體鋼琴背後的理論將幫助我們更好地在 Unity 中以數字方式重新創建它。

鋼琴的起源可以追溯到 18 世紀早期的義大利,它是由Bartolomeo Cristofori發明的。從那時起,它經歷了許多設計更改,最終形成了(大部分)標準化的按鍵配置。

現代鋼琴共有 88 個鍵,其中 52 個是白色的,用於演奏自然音符(A、B、C、D、E、F 和 G)。剩餘的36個鍵是黑色的,用於演奏所述記號(A♯/ B♭,C♯/ d♭,D♯/ E♭,F♯/ G♭和G♯/ A♭)。♯ 和 ♭ 符號分別代表尖銳和平坦。在這裡您可以看到所有 88 個鍵,並標有相應的音符:

音符可以進一步分為八度,每個八度包含 12 個鍵。具有相同音符但處於不同八度的兩個鍵將具有不同的音高。鋼琴的八度在此圖中用顏色編碼:

鋼琴包含七個完整的八度音程,末端有四個額外的鍵。這些額外的鍵允許在所有七個八度音階中演奏 A 小調和 C 大調的音階。

在這篇博文中,為簡單起見,我將專注於單個音階(按順序排列的音符),但您可以應用此方法來創建整個鋼琴。讓我們使用最常見的音階之一——C大調音階。此音階僅包含按 C、D、E、F、G、A 和 B 順序排列的自然音符。可以選擇任何 C 音符作為音階的開始。在這裡,我將使用第四個八度音階中的 C 音符(也稱為 C4 或中間 C):

如果您仔細觀察,您會發現我們鋼琴的這一小節包含所有七個自然音符和所有五個臨時音符。請注意,我還在音階中包含了下一個八度音階 (C5) 的 C 鍵,因為這有助於「四捨五入」音階:


哇!有了背景,我終於可以進入代碼了。為了獲得鋼琴鍵的聲音,我使用符號SoundNote,它可以從大量樂器中生成任何音符。對於單個音符,您只需為其指定音符名稱、持續時間和樂器。當包裹在Audio 中時,它會創建一個可以直接在筆記本中播放的音頻對象:

要獲得特定八度的音符,您只需將八度數字連接到音符名稱的末尾。例如,我可以使用此處顯示的代碼獲得第四個八度音階中的所有自然音符:

鋼琴鍵的確切形狀和尺寸因製造商而異。我選擇通過將每個鍵近似為稜鏡來保持簡單。使用稜鏡的好處是我只需要指定基礎多邊形並向上擠壓。但是,確保沒有鍵重疊需要五個基本多邊形變體:

剩下的就是將基本多邊形轉換為 3D 稜鏡。這可以使用RegionProduct將多邊形乘以具有給定高度的線段輕鬆完成:

現在我有了音頻和幾何圖形,是時候在 Unity 中將它們組合起來製作一架工作的鋼琴了。正如我之前提到的,這可以通過 UnityLink 實現。

安裝 Unity 後,加載 UnityLink 就像單個函數調用一樣簡單:

我首先打開一個新的 Unity 項目,我將其命名為「 MyPiano 」:

項目打開後,我現在可以從 Unity 發送和接收數據。我最終希望在Scene中創建我的鋼琴——一個 3D 環境,可以充當菜單、遊戲關卡或 Unity 應用程式的任何其他不同部分。但是在我創建我的Scene之前,我必須首先將我之前創建的音頻和幾何內容傳輸到 Unity。添加後,我將可以在我的 Scene 中自由使用它。

雖然不是必需的,但最好使用項目資產目錄中的子目錄來組織您的 Unity 項目。該 Assets 目錄包含所有在項目中使用的資產(紋理,音頻剪輯,網格等)。在此處顯示的行中,我使用CreateUnityAssetDirectory在Assets目錄中創建了五個目錄:

現在我開始傳輸音頻。為此,我將每個音符的音頻傳遞給函數CreateUnityAudioClip,該函數會自動將其轉換為 Unity 的 AudioClip 對象並將其存儲在Assets目錄中。這些AudioClip對象在 Wolfram 語言中表示為UnityAudioClip表達式:

接下來,我轉移了鋼琴鍵的幾何形狀。然而,這一次,我使用CreateUnityMesh自動將我的MeshRegions轉換為 Unity 的Mesh對象,在 Wolfram 語言中表示為UnityMesh表達式。

我做了一些類似的事情來創建一個黑白材料,以及一個腳本組件來控制用戶與鋼琴鍵的交互。為簡潔起見,我省略了這些,但可以在這篇文章的可下載筆記本中找到完整的代碼。

轉移所有資產後,我終於可以為我的鋼琴製作場景了。我首先創建一個新的默認場景:

如果您不熟悉 Unity,這裡是Scenes的簡要說明。Scenes包含遊戲對象,而遊戲對象又充當組件的容器。您可以將場景視為環境,將遊戲對象視為該環境中的事物,將組件視為這些事物的行為。

在我的鋼琴場景中,我將為每個鍵製作一個遊戲對象。然後,我會將我之前創建的腳本組件附加到這些遊戲對象中的每一個,以便在用戶與它們交互時它們會發出聲音並移動。

我可以一次添加一個鍵;然而,這將被證明是乏味的,並且在未來難以擴展。相反,我在兩個列表中定義了有關每個白鍵和每個黑鍵的信息。然後我可以遍歷這些列表以自動創建每個鍵。對於每個鍵,我指定了它對應的計算機鍵盤鍵、它應該播放的音符以及它應該使用的網格索引。請注意,黑鍵的網格索引被隱式假定為 5:

為了保持我的場景井井有條,我還將我的所有鍵分組到一個名為 「Piano Scale」 的主遊戲對象下:

我首先遍歷所有的白鍵:

接下來是黑鍵:

對於每個鍵,我使用CreateUnityGameObject創建一個具有適當網格的遊戲對象。設置這個遊戲對象的位置後,我通過將遊戲對象和腳本名稱傳遞給CreateUnityComponent來附加我之前創建的自定義腳本。我通過指定該鍵的鍵碼和音頻剪輯來完成。

就像那樣,我有一架可以工作的(部分)鋼琴。然而,它看起來並不像它想像的那麼好。為了解決這個問題,我調整了物體材質以及照明和相機(可下載筆記本中的完整代碼)。有了這個,我們得到了最終的結果:

現在看起來好多了!在繼續之前,我還想通過調用SaveUnityScene來保存我剛剛對場景所做的所有更改:

為了在 Unity 編輯器中測試鋼琴,我可以使用UnityPlay和UnityStop在Play和Edit模式之間切換。當我對結果感到滿意時,我可以使用 UnityBuild (https://reference.wolfram.com/language/UnityLink/ref/UnityBuild.html) 將項目構建為獨立應用程式。

以下命令將自動將項目構建到我當前平臺 (macOS) 的項目目錄中的文件中:

構建成功後,我可以立即打開並彈奏我的鋼琴應用程式:

在 Unity 中工作的優勢之一是它能夠構建到眾多平臺而無需更改您的代碼。如果您可以在某個平臺上玩遊戲,那麼 Unity 很可能可以為其構建內容。

它甚至可以構建為在 Web 瀏覽器中運行。嘗試一下!

鋼琴的這一小部分可以輕鬆擴展為完整的鋼琴鍵盤。SoundNote (https://reference.wolfram.com/language/ref/SoundNote.html.zh?source=wechat) 中提供了 160 多種風格和打擊樂器,您還可以構建其他樂器,甚至將它們組合成一個合成器。

要開始使用 Wolfram 語言中的 UnityLink,請訪問在線文檔頁面 (https://reference.wolfram.com/language/UnityLink/guide/UnityLink.html?source=wechat) 或嘗試示例項目 (https://reference.wolfram.com/language/UnityLink/guide/SampleProjects.html?source=wechat) 之一。您可以使用內置界面 (https://www.wolfram.com/language/12/built-in-interface-to-unity-game-engine/index.html.zh?source=wechat) 做很多事情,我期待看到您在 Wolfram 社區 (https://community.wolfram.com/)上提出的項目!

版本 12 ( (https://www.wolfram.com/language/new-in-12/index.html.zh?source=wechat)) 為 Wolfram 語言帶來了許多主要的新領域,包括與 Unity 遊戲引擎的無縫接口。立即在桌面或 Wolfram Cloud 中使用Wolfram|One 或 Mathematica 開始編碼。


點擊「閱讀原文」上 Wolfram 官網了解更多!

本文由Wolfram中國代理商:北京哲想軟體有限公司 翻譯

北京哲想軟體郵箱:sales@cogitosoft.com

銷售(俞先生)聯繫方式:+86(010)68421378

微信:18610247936     QQ:368531638

Wolfram 網店:https://store.wolfram.com/catalog/

創建 Wolfram ID 登錄掃碼下載試用版:

Wolfram Mathematica: 

https://www.wolfram.com/mathematica/trial/

Wolfram System Modeler: 

https://www.wolfram.com/system-modeler/trial/

有關軟體購買和使用的問題,歡迎聯繫:

 info-china@wolfram.com

相關焦點

  • 在Unity遊戲引擎中使用RLlib進行強化學習
    在此博客文章中,我們將在Unity3D遊戲引擎中訓練不同的代理,從而觀察它們的笨拙行為會隨著時間的推移變得越來越複雜和聰明。我們將使用Ray RLlib(一種流行的開源增強學習庫)與Unity的ML-Agents Toolkit結合使用,為我們介紹繁重的部分。強化學習到底是什麼?
  • Wolfram語言新書| 微積分、Wolfram|Alpha、應用工程和系統建模
    通過這本書,您將學習如何:快速創建將計算、圖形、交互式示例和注釋結合在一起的筆記本。自由格式的輸入並獲得各種計算的解決方案(例如算術、代數、微積分、線性代代數)。訪問分步解決方案,下一步建議以及相關計算。創建帶有控制項的2D,3D和交互式圖形,以動態更改參數。在以後的計算中使用以前的結果,分配變量並定義函數。
  • 對話新經濟人物|Unity張俊波:遊戲引擎讓虛擬技術創造現實價值
    張俊波告訴記者,遊戲引擎的工作是將遊戲開發中大量非創意、非遊戲內容的製作由交給機器執行,讓開發者可以專注做遊戲創意。目前市面上,除了Unity3D之外,寒霜引擎、起源引擎等通用引擎逐漸佔據了市場的重要份額。其背後是出於節約成本、縮短周期和降低風險這三方面的考慮,越來越多的開發者傾向於使用第三方的現成引擎製作自己的遊戲。這意味著一個龐大的引擎授權市場正在形成。
  • 遊戲引擎是什麼?它與遊戲和程式語言是什麼關係? - 麥大麥
    先給出遊戲引擎的定義把:遊戲引擎是指一些已編寫好的可編輯電腦遊戲系統或者一些互交式實時圖像應用程式的核心組件。這些系統為遊戲設計者提供各種編寫遊戲所需的各種工具,其目的在於讓遊戲設計者能容易和快速地做出遊戲程序而不用由零開始。
  • Unity和UE4兩大遊戲引擎,你該如何選擇?
    Unity和UE4都是遊戲引擎,所謂遊戲引擎就是集成了複雜功能的遊戲開發軟體,他們幫我們實現了複雜的底層邏輯,比如:物理系統,粒子系統,尋路系統,圖形渲染等等。Unity和UE4他們都可以製作如:3D遊戲、2D遊戲、VR(虛擬實境)遊戲、AR(增強現實)遊戲等     說直白點,只要是遊戲他倆都能做。
  • 《Wolfram 語言入門》在線視頻以及互動課程
    47 集短視頻幫您快速掌握 Wolfram 語言的奧秘:https://www.wolfram.com/broadcast/channels/eiwl.html.zh無需任何編程經驗,跟著Wolfram專家隨學隨用,在Wolfram Cloud 中直接編程練習,驗證所學。
  • 主流遊戲引擎都是用什麼語言來開發?
    1.unity 3d這是目前最火的遊戲引擎之一,像王者榮耀和仙劍六都是unity 3d開發的,這個引擎開發效率很高。這個引擎要用C#來開發。2.虛幻引擎如果說unity 3d是第一的遊戲引擎的話,那虛幻引擎能稱第二。這是一個開源的引擎,它製作的遊戲在畫質上比unity 3d精美的多,但開發效率不如unity 3d。《絕地求生》就是這個引擎開發的。
  • Unity遊戲,來小站學
    這是一條硬核廣告。
  • 新手如何從零開始學習unity
    自從 unity5發布免費過後,有很多獨立遊戲開發者轉向unity遊戲開發,unity的優勢就是多終端跨平臺打包,入門也快,很多人感覺自己的英文不好,就覺得學不會,其實這是一個誤區,unity的界面雖然是英文的,但是它的窗口就只有那麼幾個,用的次數多了,也就自然的熟練了,那麼新手該如何從零開始學習unity呢?
  • 3D場景編輯導出-LayaAir引擎Unity插件使用詳解
    上一篇是面向零3D基礎的《科普:零基礎了解3D遊戲開發》。這篇是學習LayaAir3D引擎的入門級必讀文章,也可以作為使用LayaAir引擎開發3D項目美術同學隨時查閱的手冊。由於LayaAir引擎當前是依託於Unity工具編輯3D場景並導出資源的,那Unity中到底是哪些功能可以用,哪些功能不可用,本文會進行全面和系統的介紹。
  • unity3d遊戲引擎開發的遊戲都有哪些?
    Unity3d是目前主流的遊戲開發引擎,它提供了一個整合的編輯器、跨平臺發布、地形編輯、著色器,腳本,網絡,物理,版本控制等特性。Unity3d可以開發桌面版、web版、手機版的遊戲,是一個非常理想的三維遊戲開發平臺。
  • 3D 引擎 Unity 2020.1發布,遊戲虛擬變成現實
    此版本帶來了許多新功能和改進。這位官員說,這些更改使Unity工作流程更加直觀,並提高了工作效率。但是,Unity 2019 LTS仍然是正式推薦在生產環境中使用的推薦版本。Unity 2020.1的主要更新包括改進的程序包管理器,改進的Unity編輯器和其他編程器工具,以簡化遊戲開發體驗,改進的2D動畫性能,改進的圖形處理和可縮放的質量,GPU和CPU燈光映射器還改善了採樣並改進了AR平臺等例如,在2020.1中,Unity向編輯器添加了對高動態範圍顯示(HDR)的支持。
  • Stephen Wolfram:如何訓練孩子們的計算思維( IV)
    嗯,在今天的世界,他們都使用計算機或者智慧型手機,從小就耳濡目染各種計算活動。也許他們正在製作和編輯視頻,也許正在構造遊戲組件,所有這類活動都是計算思維的初期形式。早在1960 年代,一個大膽的實驗從 Logo 開始。我聽說最初的設想是構造 50 個"微世界",讓孩子們可以用計算機來進行試驗。
  • 我是如何學習遊戲引擎的?
    比如C++,有《C++ Primer》《Effective C++》《C++語言的設計和演化》入門和拓展,進階有《C++Template》《深入探索C++對象模型》《More Effective C++》,虛幻引擎裡面的C++是經過魔改的,如果你專注於寫遊戲邏輯,確實用不到太多的C++特性,但考慮到未來的成長還是要儘可能深入。
  • 一位老師眼中的Wolfram——教師不可不知的超級知識引擎(深圳林文峰)
    我並不是數學、或某一學科的老師,所以對其本身的功能並未特別上心,也沒有親身使用體驗。那麼,wolfram在一個老師的眼中,到底是什麼樣呢?深圳南山後海小學林文峰老師專門對wolfram進行了研究和體驗,並撰寫了文章,更加詳盡地介紹了在學科教學中各種可能的應用前景,那真是一個叫人心動哎!
  • Facebook將追隨Valve和微軟,推薦遊戲引擎使用OpenXR
    來源:新浪VR Facebook現在建議遊戲引擎通過OpenXR標準支持Oculus頭顯,而不是其專有的SDK(軟體開發工具包)。 大多數VR遊戲都是用Unity和Unreal遊戲引擎製作的。
  • 12/16 - 12/22|Wolfram 語言和 Mathematica 軟體求解符號數值解系列中文講座
    澳大利亞維多利亞州課程大綱制定者之一,墨爾本的卡羅琳·奇斯霍爾姆天主教學院,數學系主任科林·查普曼(Colin      Chapman)將手把手教大家如何使用 Wolfram System Modeler 構建和仿真分壓和分流的電路,同時使用      Mathematica 進行操縱與可視化。
  • Unity「出圈」:遊戲引擎的技術革新和跨界商機
    世界上近乎一半的遊戲都是使用Unity製作的,尤其是在移動遊戲開發上,Unity是最受歡迎的遊戲引擎。特別是在其發展壯大之後,Unity引擎實現高度模塊化開發,做出了很多高畫質的手遊案例,同時推出高清渲染管線技術,攻堅大型遊戲巨作,包括目前正在國外公開宣傳的《第三代》,和正在研發中的《奇異世界:靈魂風暴》,後者計劃隨著PS5的發售同步發行。
  • unity的自學之旅
    從小熱愛遊戲的我,走上了獨立遊戲開發的道路,因為大學是計算機專業,所以學到了一些程式語言,數據結構等等。 又幸運的第一份工作就是手遊開發。所以有幸一隻腳踏進了遊戲開發的大門。一開始是手遊開發,使用的cocos2D-lua,開發一些休閒的小遊戲,比如類似黃金礦工的那種,只不過把裡面的礦石,做成了一些魚類,成了一款釣魚的小遊戲,還有射擊類和回合制的。買了一些關於lua語言的還有古納於cocos2D-lua的書籍。
  • 12/16-12/22 Wolfram系列講座觀看指南:涵蓋偏微分方程求解&符號和數值計算等
    >澳大利亞維多利亞州課程大綱制定者之一,墨爾本的卡羅琳·奇斯霍爾姆天主教學院,數學系主任科林·查普曼(Chapman)將手把手教大家如何使用 Wolfram System Modeler 構建和仿真分壓和分流的電路,同時使用      Mathematica 進行操縱與可視化。