跳至內容
GitHub 儲存庫 論壇 RSS 新聞提要

與貢獻者 Remilia Scarlet 的訪談

Beta Ziliani Remilia Scarlet

Remilia Scarlet 一直以來都將 Crystal 用於她的音訊專案。我們向她詢問了這方面的經驗,以下是她的回答

簡單介紹一下你自己。Remilia 是誰?

我是一位開源開發者,多年來使用過相當多的程式語言。我主要開發命令列工具,但最近我也對音訊程式設計產生了興趣。

你既是 Lisper 也是 Crystalist。這是一個奇怪的程式語言組合!是什麼讓你接觸到 Lisp,又是什麼讓你接觸到 Crystal?

我對 Common Lisp 的興趣始於 2000 年代中期,純粹是出於好奇。我一直在閱讀關於這個語言有多棒的文章,並且覺得我當時正在開發的程式可以從中受益。所以,我坐下來,下定決心「直到我可以用 Lisp 編寫一個非平凡的程式之前,我絕不停止」,然後就從那裡開始了。最終,它成為我最喜歡的程式語言之一。至於 Crystal,幾年前我一直在尋找一種可以提供我需要的效能,但可以產生較小二進位檔的語言,並且如果其他人想為我的專案貢獻,可以更容易上手(當時我認識的人中只有我會使用 Lisp)。在一番維基百科搜尋後,我發現 Crystal 非常符合我的需求。現在,我會說它們並列為我最喜歡的程式語言。

有時你先用 Lisp 做一個原型,然後再用 Crystal 重寫,是這樣嗎?

是的,沒錯。部分原因只是因為我使用 Common Lisp 的歷史。我已經習慣了它的即時性,尤其是在與一個名為 Slime 的 Emacs 模式結合使用時。你不僅僅擁有一個 REPL,還擁有一個具有完整編譯器和基於映像開發的即時編碼環境。我只需將游標放在一個函式中,按下 C-c,它就會將該函式重新編譯為原生程式碼,即使程式正在執行。因此,它大大縮短了調整 -> 編譯 -> 測試的流程。Common Lisp 在功能和範例方面都與 Crystal 非常接近,因此在它們之間切換對我來說也不是太大的問題。

然而,我的 Lisp 程式碼在大多數情況下都只是作為一個原型,因為我的 Lisp 程式碼永遠不像 Crystal 那樣具有記憶體效率。在大多數情況下,我發現從最初的 Lisp 原型轉到 Crystal,記憶體使用量會減少大約 50-75%。發布一個可以讓人下載和編譯的原始碼儲存庫也不像使用 Shards 那樣乾淨,即使是這樣,我也不認為大多數想要編譯自己軟體的用戶都了解各種 Lisp 編譯器的特性。因此,實際上,在大多數情況下,Crystal 對我來說在原型階段之後更有意義。

此外,使用 Common Lisp 建置的 Hello World 二進位檔約為 42mb(並且不能使用 strip 壓縮),而使用 Crystal 的 Hello World 只有約 300k。

請告訴我們你最自豪的三個專案。

我認為我現在最自豪的三個專案是 Benben,一個用於播放名為 VGM 的音樂格式的播放器;midi123,一個可以使用 SoundFonts 進行音訊合成的命令列 MIDI 播放器;以及 RemiAudio,一個它們之間共享的通用音訊處理函式庫。

你在 Benben 中加入了音訊晶片組。那背後的故事是什麼?

是的!所以大多數音訊檔(WAV、MP3 等)都只是儲存錄製的音訊樣本,無論是直接的 PCM 格式還是壓縮格式。VGM 檔案的不同之處在於,它們會記錄發送到各種聲音晶片的原始命令,以讀取和寫入暫存器值。要回放它們,你需要為這些聲音晶片建立某種類型的模擬器。Benben 使用其後端函式庫 YunoSynth 實作這些模擬器。在 80 年代和 90 年代開發了相當多的聲音晶片,用於街機遊戲以及家用遊戲機和電腦。它們的範圍從簡單的「在指定時間回放此樣本」晶片,到使用頻率調變合成來即時產生聲音的完整合成器晶片。VGM 格式支援許多這些晶片,我一直在將 MAME 專案中的這些晶片模擬器移植到 YunoSynth/Benben。

你還缺少很多嗎?是什麼讓你開始這個專案的?

我仍然缺少大約十幾個晶片,其中一些晶片共享一個通用的模擬核心。我預計這些晶片的移植需要更長的時間,因為它們複雜得多。將它們延後到稍後移植也很有幫助,因為這意味著我現在在移植模擬核心方面有了更多的經驗。但就目前而言,我估計 Benben 現在已經可以播放大約一半的 VGM 檔案了。

我開始這個專案主要是出於對舊電子遊戲音樂的熱愛,部分原因是從未對官方的命令列 VGM 播放器感到完全滿意。我覺得我可以編寫一個更好的播放器,但我也沒有打算編寫純 C 或 C++ 程式碼。Crystal 看起來非常適合,因為它的速度和功能很強大。我本可以僅僅為官方的 VGM 函式庫編寫 Crystal 綁定,但那聽起來沒有編寫 100% 原生 Crystal 移植那麼有趣。

根據你目前使用 Crystal 開發某種底層程式的經驗,編寫這樣的 Crystal 程式的優點和缺點是什麼?

哦,我非常喜歡使用 Crystal 來處理這類事情。Crystal 中的型別系統,尤其是型別聯集,給人一種非常舒適的感覺,幾乎就像它是一種動態語言。我可以編寫快速的實驗性程式碼,而無需擔心型別,並且仍然可以從中獲得良好的效能。稍後,我可以採用我的初始程式碼並使用型別註釋來加強它。此外,它在其標準函式庫中提供了許多高階工具,但從不會阻止我為了在罕見的情況下操作指標。基本上,我認為它是高階和低階程式設計語言之間的完美平衡。

到目前為止,我遇到的唯一缺點是一些錯誤訊息有時有點難以理解。但是自 0.3x 版本以來,這些訊息已經好很多了,我確信它們會隨著時間的推移而改進。

完全不相關,並且是個人問題:為什麼是 Remilia Scarlet?

哦,這個名字嗎?我是名為東方 Project 的遊戲系列的忠實粉絲。我最喜歡的角色之一是一位名叫蕾米莉亞的吸血鬼女士。我多年前開始在網路上使用這個名字,並且已經習慣了,所以我乾脆將它當作我的真實姓名。我想我有點認同她了。我的真實姓名是 Alexa。使用 Remilia 作為名字也意味著有人叫我時不會觸發他們的 Amazon Alexa 裝置。

回到你的專案,你知道是否有人在使用它們嗎?

我不知道是否有人在使用我最近的音訊相關專案。我希望這種情況會改變,因為它們背後的函式庫可能是電子遊戲中播放音樂的好選擇。

你指的是用 Crystal 製作的電子遊戲嗎?

是的,沒錯!我用 Crystal 製作了一些原型引擎,以及一個未完成的 Doom 移植版,並且根據我的經驗,我覺得它可能是一個很棒的電子遊戲開發語言。

我記得你移植的 Doom!你在那裡做了一些自製的關卡,對吧?

是的!我從 90 年代中期開始製作 Doom 關卡,並且自從我還是個孩子時,編寫自己的 Doom 移植版就一直在我的人生清單上。

未來的展望是什麼?

Benben 很可能是我近期內的主要專案。讓它支援 VGM 格式所支援的大部分或所有晶片是該專案的一個主要目標。我也想將它的一些前端功能移植回 midi123,因為它們的內部前端非常相似。除此之外,我正在考慮製作一款真正的復古風格遊戲,可能是第一人稱射擊遊戲或垂直射擊遊戲。

Crystal 的電子遊戲故事尚未開發。我猜現在 Windows 支援幾乎完成,這方面將會有所提升。或者至少,我的經驗是遊戲玩家使用 Windows…

我希望如此,是的!我認為它將是一個很棒的遊戲開發語言,因為它的效能非常棒,而且也很容易上手。

我們可以在哪裡找到更多關於你的資訊?

我有一個 個人網頁,你可以在那裡找到我所有的專案。作為一個預告,你可以在 這個影片 中聽到使用 midi123 播放的猴島的秘密。