本文譯自博客: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 官網了解更多!
北京哲想軟體郵箱: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