你是否想过,用 Python 控制炫酷的硬件乐器?
pymonom (正确的 PyPI 名为 pymonome) 就是连接 Python 与 Monome 矩阵控制器的桥梁 。
它专为音乐人和交互设计师打造,能让你通过代码点亮 8x16 的 LED 网格,并实时响应按键。
本文将带你从零实战,用纯 Python 玩转这个极客玩具。
🔌 1. 连接设备:建立“通话”桥梁
pymonome 不直接驱动硬件,它依赖后台程序 serialosc 进行 UDP 通信 。我们需要编写一个异步事件循环,等待设备“敲门”。
这段代码初始化了 App 类,并监听着设备接入事件。一旦发现设备,就自动建立连接。
import asyncio, monome
classMyApp(monome.GridApp):
defon_grid_ready(self):
print("设备已连接!")
asyncdefmain():
app = MyApp()
serial = monome.SerialOsc()
serial.device_added_event.add_handler(lambdaid, type, port: asyncio.create_task(app.grid.connect("127.0.0.1", port)))
await serial.connect()
await asyncio.Future()
asyncio.run(main())
运行后,控制台输出:
设备已连接!
✨ 2. 点亮灯光:一键“百发百中”
连接成功后,开始实现核心交互:按下按钮,点亮对应位置的灯。
通过继承 GridApp 并重写 on_grid_key 方法,我们可以获得按键的坐标 (x, y) 和状态 (s)。
调用 led_set 即可让灯光随手指亮起 。
classLightShow(monome.GridApp):
defon_grid_key(self, x, y, s):
if s == 1: # 按下瞬间
self.grid.led_set(x, y, 1) # 1为亮,0为灭
print(f"坐标 ({x},{y}) 点亮")
# 连接部分复用上面的代码,仅需将 MyApp 替换为 LightShow
按下第一行第一列,输出:
坐标 (0,0) 点亮
灯光应声亮起!
🎨 3. 进阶绘制:打造“帧动画”
单个设置效率低,pymonome 提供了缓冲区机制。我们可以先在内存中构建整幅画面,再一次性发送到设备,实现复杂图案 。
GridBuffer 允许我们像操作画板一样操作 LED,通过 int 值控制亮度,最后 render 渲染,实现流畅动画。
classDrawArt(monome.GridApp):
defon_grid_ready(self):
buffer = monome.GridBuffer(self.grid.width, self.grid.height)
for x inrange(8): # 画一条对角线
buffer.led_level_set(x, x, 15) # 15为最高亮度
buffer.render(self.grid)
print("图案绘制完成!")
# 运行此类,网格上将显示一条从左上到右下的亮线
运行代码,你将看到:
图案绘制完成!
硬件上展现出明亮的对角线。
🚀 优势对比:小而美的存在
相比于 pygame 或 tkinter 等图形库,pymonome 的优势在于专一性:它专为 Monome 硬件优化,异步架构性能极佳 。
不过,其不足也很明显——没有物理设备就无法模拟运行,且仅支持这一种硬件。
建议配合官方模拟器使用,如果你是交互音乐爱好者,它绝对是不可多得的利器。
💬 写在最后
今天我们通过 pymonome 迈入了互动硬件编程的大门。从响应的“回声”到精美的画面,你会发现代码不仅能构建虚拟世界,更能点亮现实。
赶紧找一块 Monome 亲手试试吧!如果你有创意的作品,欢迎在评论区留言分享一下~