跳到内容
GitHub 仓库 论坛 RSS-新闻订阅

与贡献者 Remilia Scarlet 的访谈

Beta Ziliani Remilia Scarlet

Remilia Scarlet 一直在她的音频项目中使用 Crystal。我们询问了她这段经历,以下是她的说法。

关于你的一些信息。Remilia 是谁?

我是一名开源开发者,多年来使用过很多语言。我主要做命令行工具,但最近也对音频编程产生了兴趣。

你既是 Lisper 又是 Crystalist。这两种语言的搭配很奇怪!是什么让你开始使用 Lisp,又是什么让你开始使用 Crystal 的?

我对 Common Lisp 的兴趣始于 2000 年代中期,纯粹出于好奇。我一直读到关于这门语言有多棒的文章,并认为我当时正在做的程序可以从它中受益。所以,我坐下来,决定“我不会停下来,直到我能用 Lisp 写出一个非平凡的程序”,然后就这样开始。最终,它成为了我最喜欢的语言之一。几年前,我一直在寻找一种能够提供我需要的性能,但又能生成更小的二进制文件,而且更容易让其他人为我的项目做出贡献的语言(当时只有我知道有人使用 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,一种可以使用 SoundFont 进行音频合成的命令行 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 的游戏系列。我最喜欢的角色之一是一个名叫 Remilia 的吸血鬼女士。多年前,我开始在网上使用这个名字,并且已经习惯了它,以至于我把它当作我的真实姓名。我想我有点认同她 lol。我的真实姓名是 Alexa。用 Remilia 这个名字也意味着,有人叫我不会触发他们的亚马逊 Alexa 设备。

回到你的项目,你知道有人在使用它们吗?

我不知道有人使用我最近的音频相关项目。我希望这种情况能够改变,因为它们背后的库可能是视频游戏中音乐回放的不错选择。

你是说,用于用 Crystal 制作的视频游戏吗?

是的,没错!我已经用 Crystal 制作了一些原型引擎,以及一个未完成的 Doom 移植,根据我在这些方面的经验,我觉得它可能非常适合用来编写视频游戏。

我记得你的 Doom 移植!你在那里做了一些定制的关卡,对吧?

是的!我从 90 年代中期就开始为 Doom 制作关卡,而且从我还是个孩子的时候起,编写我自己的 Doom 移植就一直在我的愿望清单上。

未来前景如何?

Benben 可能会成为我未来的一段时间的重点项目。让它支持 VGM 格式支持的大多数或所有芯片是该项目的关键目标。我还想将一些前端功能移植到 midi123 中,因为这两个前端在内部非常相似。除此之外,我正在考虑做一个真正的复古风格的游戏,可能是一款 FPS 或一款纵向卷轴射击游戏。

Crystal 的电子游戏故事还有待开发。我猜想现在 Windows 支持即将到来,这条线将会促进发展。或者至少,根据我的经验,游戏玩家使用 Windows ...

我希望如此,是的!我认为它非常适合游戏开发,因为它性能出色,而且很容易上手。

我们可以在哪里找到更多关于你的信息?

我有一个 个人网页,在那里你可以找到我所有的项目。作为预告,你可以在 这段视频 中听到用 midi123 演奏的猴岛的秘密。