用 Punchbox 制作 DIY 音乐盒卡片

现在任何人都可以制作音乐盒打孔卡片。
211 位读者喜欢这篇文章。
Bird singing and music notes

Internet Archive 图书图片;由 Opensource.com 修改。CC BY-SA 4.0

我喜欢将音乐和编码结合起来的机会。我曾参与过一些与音乐相关的个人项目,从使用网络流量制作音乐到电子鼓的自动伴奏系统。最近,我亲爱的妻子送给我一个漂亮的、可编程的音乐盒作为我的生日礼物。你在一张卡片上打出音符,然后摇动音乐盒来播放乐曲。

音乐盒附带了几张大约 70 厘米(27 英寸)长的卡片。卡片上印有网格系统,因此您可以测量时域并知道您选择的是哪个音符。但是,我不确定自己盲目打孔的能力——而且我也有点不耐烦。抱歉。我知道,我知道,好事多磨,但如果我可以少等一会儿,有什么坏处呢,对吧?

所以我提出了一个疯狂的想法。与其测量所有这些东西,并在我打错地方导致整首歌被毁时经历那些疯狂的时刻,不如让事情的风险稍微降低一点?如果我可以引入一台好的旧计算设备来帮助我呢?如果我的小型计算设备可以在卡片上绘制我需要打的所有点呢?

我的需求

我开始思考成为 Punchbox(一个简单易用的音乐盒卡片创建器)的要求。我希望这个软件做什么?音乐盒不能播放每一个音符——它只能播放特定调的音符。当然,音乐的伟大之处在于它可以转调到任何调。因此,如果软件可以自动将歌曲转调到最佳调,那就太好了。我还希望它是准确的——线条清晰。所以它必须是基于矢量的图像。

我该如何将音符编程到其中?考虑到某些音符可能需要更改才能为一首乐曲创建新的编排,编辑它们并快速听到更改的最佳方式是什么? MIDI 似乎是一个明显的选择。它允许我快速更改音符,并在打印之前通过合成器播放 MIDI 来获得即时反馈。

不幸的是,音乐盒的卡纸太厚,无法穿过我的打印机,所以我决定将音乐打印在纸上,将其贴在卡片上,使用纸张来引导我打孔,然后从卡片上取下纸张。

Output from Punchbox music box software

开发工具

我使用 Python 编程,所以我选择了 Mido 作为 MIDI 库,因为它具有我需要的功能。我还选择了 Svgwrite 作为我的 SVG 矢量绘图库,以及 PyYAML 用于配置。从一开始,我就决定要制作一个任何人都可以使用的工具,所以我选择了 Click 作为命令行工具包。

在开发工具的过程中,我意识到许多其他的配置选项对人们来说也会很有用。我添加了定义多个音乐盒的功能,包括音符音高(触发器之间的物理距离)、音符碰撞距离(再次触发音符之前需要多长时间)、可用音符(以 MIDI 音符值表示)以及反转音符顺序(从右到左或从左到右)的功能。

使用打印纸提出了另一个问题。穿过音乐盒的纸条有时可能长达几米,但我的打印机最多只能打印 A4(27.9 厘米,接近信纸尺寸)。我决定对纸条进行分页——但分页需要一种对齐纸条的方法。所以我添加了标记到页面。该系统正确地识别出页面上可以容纳多少个“谱表”,并相应地进行分页。

我添加了一个除数以实现按时间缩放曲调(使其更快或更慢)、纸张边距、标记大小(用于对齐纸条)和字体大小(用于对纸条编号和添加文件名)。

我最喜欢的功能之一是自动转调。它获取音符,运行检查以查看音乐盒上表示了多少音符,并运行一系列转调以查看是否可以找到完美的转调(其中表示了所有音符)。如果找不到完美的转调,它会选择最好的一个。当我打印页面时,它会用红色突出显示任何不合适的音符。这允许我检查表格,并将其与 Rosegarden 等软件中的 MIDI 交叉引用,以删除或移动音符。

测试

我花了一年左右的时间使用该工具添加所有这些功能。但也许最美好的时刻是我将第一张纸放入我的音乐盒时。在我使用 Punchbox 打印并打孔我的第一张纸条之前,我没有对其进行任何测试。

第一次几乎让我热泪盈眶。莫扎特,甜蜜地,轻轻地在最完美的小音乐盒上演奏。完美!没有时间和音高的错误。谢谢你,开源——没有 Mido、Svgwrite、PyYAML 和 Click,这个项目是不可能实现的。

User profile image.
Peter 是一位充满热情的开源爱好者,在过去的 10 年里一直在推广和使用开源产品。他曾在许多不同的领域做过志愿者,从 Ubuntu 社区开始,然后进入音频制作领域,后来又进入写作领域。

评论已关闭。

Creative Commons License本作品采用 Creative Commons Attribution-Share Alike 4.0 International License 授权。
© . All rights reserved.