使用 Bytebed 编程环境,通过 M5Stack 卡片上的单行代码,体验实时音频合成与算法音乐
Bytebed 是一款专为嵌入式微控制器(如 M5Stack Cardputer)设计的 bytebeat 虚拟机。它将 bytebeat 编译为字节码,并在运行时即时执行 bytebeat 程序。
以往的微控制器字节节奏播放器都是静态的,每次修改都需要重新烧录字节节奏算法,这种方式效率低,不利于对字节节奏算法和数字音频合成进行实验。Bytebed 是一种全新的生动方式,用于演奏和探索字节节奏的世界。
Bytebed 的功能
Bytebed 最初是一个用于 bytebeat 的简单字节码虚拟机。其主要功能仍然是实时支持解释和播放经典的 bytebeat 音乐。此外,它还具备更丰富且具有实验性的功能,例如:
•双语法:使用 Tab 键在中缀和后缀之间动态切换
•可选的浮点数支持:无需 while 或 for,只需 map 和 reduce
•类似 JS 的箭头函数
•字符串被解释为 Base 62 数字数组
•用于延迟、反馈等的魔法全局变量和数组
•前缀模式下类似于 Forth 的栈操作符(dup, swap, over, rot)
•注释 // 和 /* */
•语法验证器和错误提示信息
硬件组件
•M5Stack Cardputer-Adv
•M5Stack Cardputer
•M5Stack Cardputer 配合 M5StampS3 v1.1
软件应用和在线服务
•M5Stack M5Burner
多年来,bytebeat已发展为floatbeat及其他变体,并在网络上分享了大量有趣的单行代码程序。bytebeat是一种有趣的方式,可用于探索声音并学习二进制运算。进一步尝试floatbeat,有助于理解基本算术,以及数学与音乐、声音合成和数字信号处理之间的关系。
这一切始于几个月前,当时我偶然发现了一款由Ate Bit的4mat开发的23字节C-64演示程序《Wallflower》,它在任何平台上都未曾见过如此小尺寸的作品。虽然程序存在一些漏洞,但其音乐结构却远远超越了它的体积限制。我开始自行尝试,最终编写出一个16字节的VIC-20程序,其音乐输出让我彻底惊叹。我在之前的博客文章《16字节的边界》中记录了这些发现,并探讨了其中的原因。
一段时间后,我以更科学的态度重新开始了实验。为了更好地理解其中的原理,我需要一个更简单、更纯粹的环境——一个没有8位声卡和处理器那些随意的特性和隐藏复杂性的系统。我选择用简短的C语言程序来生成原始PCM音频数据。此前我曾写过一些小型的“/dev/dsp softsynths”程序,甚至在20世纪90年代末还将其嵌入过邮件或Usenet签名中。然而,这次我所实验的程序将比以往更短,也更少经过精心设计。
我决定重现之前8位实验中的核心内容:一个音高由包含位移和逻辑运算的函数控制的波形发生器。对于/dev/dsp程序而言,最简单的波形是锯齿波。一个简单的for(;;)putchar(t++)循环可以生成周期为256字节的锯齿波,在默认采样率为8000 Hz时,频率为31.25 Hz。音高可以通过乘法进行调整:t++*2相当于升高一个八度,t++*3则比前一个高出7个半音,而t++*(t>>8)会产生上升的声音。经过几次尝试后,我得到了一个想要在IRC频道分享的东西:
Bytebed 是一种新编程语言,灵感源自经典的 C 语言风格的字节节奏(bytebeat)和 JavaScript 的浮点节奏(floatbeat)。该语言采用双解释器,支持标准的前缀表达式以及全新的基于函数栈的后缀表示法。系统允许用户在运行时自由切换前缀与后缀语法,从而同时学习字节节奏、浮点节奏、声音合成,以及一种略显神秘的 Bytebed 栈式语言。
Bytebed 将卡普特(cardputer)通过音频合成补丁以及卡普特键盘或 IMU 六轴运动传感器来控制音频输出,将其转变为实时编程乐器。此外,还可以使用 MIDI 控制由卡普特生成的声音,例如通过外部 MIDI 键盘、音序器或 SuperCollider、Sonic Pi 等软件实现。
Bytebed 运行在 M5Stack Cardputer 或 Cardputer Advanced 上。可通过 M5Burner 安装 Bytebed,或使用 platform.io 从源码构建。专为 M5Stack 卡型电脑设计的 Bytebeat 虚拟机。在ESP32板上使用i2s API运行bytebeat可以很简单:
上传到你的ESP板上,咔嚓!你就能听到经典的节拍了。
Bytebed 的 Wasm 版本也可在浏览器中运行。在线版本可用于共享补丁,并支持通过 MIDI 或手机陀螺仪进行字节节奏的序列化播放。
本文编译自hackster.io





