项目亮点
💻 瞬间启动的Python电脑Tulip摒弃了复杂的操作系统,通电后秒速进入Python交互环境。这就像拿起了计算器一样简单,但却能运行强大的Python代码。
🎵 内置专业级音乐合成器集成的AMY合成器支持120个振荡器,能模拟Juno-6和DX-7等经典合成器音色,也支持加载PCM采样。你可以完全用Python代码控制每一个音符、音色和效果。
🎨 流畅的图形编程体验搭载7英寸1024×600触摸屏,基于LVGL图形库实现30FPS的流畅图形渲染。支持精灵、滚动背景、PNG图片加载和完整的UI控件,用几行Python就能创建交互界面。
🔌 丰富的硬件接口提供立体声音频输出、I2C连接器、MIDI输入/输出、双USB接口和Wi-Fi连接。可以连接键盘、MIDI设备、传感器,甚至能通过Alles Mesh控制多扬声器阵列。
🌐 零门槛的Web模拟器无需购买硬件,直接在浏览器中体验完整的Tulip环境。Web版本保留了核心的音乐合成、图形编程和Python环境,是入门探索的最佳方式。
解决什么痛点?
想象一下这样的场景:你想创作一段电子音乐,同时为它配上一个可视化界面。传统的做法是:在电脑上打开专业的音乐制作软件学习复杂的操作,再用另一个软件编写界面代码,整个过程被各种软件、配置和兼容性问题分散注意力。
这就是Tulip要解决的问题。它把音乐合成、图形编程和物理计算集成到一个即开即用的便携设备中,让你专注于创作本身而不是工具链。一位音乐制作人可以直接在Tulip上编写Python代码生成复杂的和弦进行,同时用触摸屏创建一个实时频谱可视化器,整个过程完全在同一个环境中完成,灵感不会被中断。
Tulip的另一个核心设计哲学是“有趣的限制”。它没有网络浏览器、没有社交媒体应用,甚至没有文件管理器——这看似是缺点,实则是为了避免分心。就像画家面对空白画布,限制反而能激发创造力。你只能通过Python与设备交互,这种单一性让你深入理解从音符到声音、从像素到图像的每一个环节。
手把手教程
第一步:获取你的Tulip环境
你有两种方式开始Tulip之旅:
- 购买硬件设备($59)访问tulip.computer从Makerfabs订购,获得完整的便携体验。
- 使用Web模拟器(免费)
Web模拟器几乎完整复现了硬件功能,包括Python环境、AMY合成器和LVGL图形库,是绝佳的入门选择。
第二步:编写你的第一个音乐程序
让我们从一段简单的音乐代码开始。在Tulip的代码编辑器中输入以下内容:
import amy# 初始化AMY合成器并开始实时播放amy.live()# 播放一个C大和弦(C、E、G)amy.send(osc=0, note=60, vel=0.7) # C4amy.send(osc=1, note=64, vel=0.7) # E4amy.send(osc=2, note=67, vel=0.7) # G4# 等待2秒后停止import timetime.sleep(2)amy.send(osc=0, vel=0)amy.send(osc=1, vel=0)amy.send(osc=2, vel=0)
点击运行按钮,你立刻就能听到一个美妙的C大和弦!AMY合成器默认使用Juno-6风格的音色,但你也可以通过patch参数切换到300多种内置音色中的任意一个。
第三步:创建交互式图形界面
现在让我们结合触摸屏,创建一个简单的音乐键盘界面:
import lvgl as lvimport amy# 初始化LVGL显示lv.init()scr = lv.screen_active()# 创建按钮样式style_btn = lv.style_t()style_btn.set_bg_color(lv.color_hex(0x3498db))style_btn.set_radius(10)# 定义音阶的音符notes = [60, 62, 64, 65, 67, 69, 71, 72] # C大调音阶note_names = ["C", "D", "E", "F", "G", "A", "B", "C"]# 为每个音符创建一个按钮for i, (note, name) inenumerate(zip(notes, note_names)): btn = lv.button(scr) btn.set_size(60, 120) btn.set_pos(10 + i*65, 200) btn.add_style(style_btn, 0) label = lv.label(btn) label.set_text(name) label.center()# 按钮按下时播放音符,释放时停止defmake_callback(note):defon_event(e):if e.get_code() == lv.EVENT.PRESSED: amy.send(osc=0, note=note, vel=0.8)elif e.get_code() == lv.EVENT.RELEASED: amy.send(osc=0, vel=0)return on_event btn.add_event_cb(make_callback(note), lv.EVENT.ALL, None)# 添加标题title = lv.label(scr)title.set_text("Tulip 音乐键盘")title.set_pos(300, 50)title.set_style_text_font(lv.font_montserrat_24, 0)
这段代码创建了一个8键的音乐键盘,点击每个按键会播放对应的音符。你可以立即在Tulip的触摸屏上演奏简单的旋律。
第四步:连接外部设备
Tulip的真正强大之处在于它的硬件扩展能力。让我们连接一个I2C温度传感器,让音乐随温度变化:
from machine import I2C, Pinimport amyimport time# 初始化I2C总线(Tulip的I2C引脚为21-SDA, 22-SCL)i2c = I2C(0, sda=Pin(21), scl=Pin(22), freq=100000)# 扫描I2C设备devices = i2c.scan()print("找到的I2C设备:", [hex(addr) for addr in devices])# 假设温度传感器地址为0x48TEMP_SENSOR_ADDR = 0x48defread_temperature():# 读取温度数据(具体协议根据传感器型号调整) data = i2c.readfrom(TEMP_SENSOR_ADDR, 2) temp = (data[0] << 8 | data[1]) / 256.0return temp# 根据温度生成音乐amy.live()last_note = 60whileTrue: temp = read_temperature()# 温度每变化2度,音符变化半音 note = 60 + int((temp - 20) / 2) # 以20°C为基准if note != last_note: amy.send(osc=0, vel=0) # 停止前一个音符 amy.send(osc=0, note=note, vel=0.6) last_note = noteprint(f"温度: {temp:.1f}°C, 音符: {note}") time.sleep(1)
这个程序将物理世界的温度变化转化为音乐变化,展示了Tulip在物理计算和音乐结合方面的独特能力。
同类项目对比
从表格中可以看出,Tulip在创意编程和多媒体集成方面具有独特优势。它不像树莓派那样“万能”,但在音乐创作和交互艺术领域提供了高度集成的专业工具链。对于那些想要快速将创意转化为可交互的音乐视觉作品的开发者来说,Tulip减少了大量的底层配置工作。
深入探索:打造你自己的游戏
让我们用一个完整的游戏示例结束本文。这是一个简单的“接音符”游戏,结合了Tulip的音乐和图形能力:
import lvgl as lvimport amyimport randomimport time# 初始化lv.init()scr = lv.screen_active()amy.live()# 游戏状态player_x = 400score = 0notes = []# 创建玩家(一个矩形)player = lv.obj(scr)player.set_size(80, 20)player.set_pos(player_x, 450)player.set_style_bg_color(lv.color_hex(0x2ecc71), 0)# 分数显示score_label = lv.label(scr)score_label.set_text(f"分数: {score}")score_label.set_pos(20, 20)# 游戏主循环defgame_loop():global player_x, score, notes# 随机生成新音符if random.random() < 0.05: note_x = random.randint(50, 750) note = lv.obj(scr) note.set_size(30, 30) note.set_pos(note_x, 0) note.set_style_bg_color(lv.color_hex(0xe74c3c), 0) note.set_style_radius(lv.RADIUS_CIRCLE, 0) notes.append({"obj": note, "x": note_x, "y": 0})# 播放对应位置的音高 pitch = 60 + int((note_x - 50) / 700 * 24) amy.send(osc=len(notes)-1, note=pitch, vel=0.3)# 更新音符位置for i, note_info inenumerate(notes[:]): note_info["y"] += 5 note_info["obj"].set_y(note_info["y"])# 检测碰撞if (note_info["y"] > 430and note_info["y"] < 470andabs(note_info["x"] - player_x) < 50): score += 10 score_label.set_text(f"分数: {score}") note_info["obj"].delete() notes.remove(note_info) amy.send(osc=i, vel=0) # 停止该音符# 播放得分音效 amy.send(osc=10, note=72, vel=0.5, patch=130)elif note_info["y"] > 500: # 音符落地 note_info["obj"].delete() notes.remove(note_info) amy.send(osc=i, vel=0)# 控制玩家移动 indev = lv.indev_get_act()if indev: point = lv.point_t() indev.get_point(point)if point.x > 100: # 简单触摸控制 player_x = point.x - 40 player.set_x(player_x)# 设置定时器每50ms更新一次游戏timer = lv.timer_create(lambda timer: game_loop(), 50, None)# 添加游戏说明instructions = lv.label(scr)instructions.set_text("触摸屏幕控制滑块,接住下落的音符!")instructions.set_pos(250, 100)
这个简单游戏展示了Tulip如何将触摸交互、实时图形和动态音乐生成无缝结合。每个下落的音符都有对应的音高,接到音符时会有得分音效,创造了多感官的游戏体验。
结语
Tulip创意电脑重新定义了“创作工具”的概念。它不是一个冰冷的开发板,也不是一个复杂的音乐工作站,而是一个激发创意的伴侣。通过将Python的简洁性、专业合成器的表现力和触摸屏的互动性融合在一个59美元的设备中,它降低了创意编程的门槛。
无论是音乐人想要尝试算法作曲,教育者寻找有趣的编程教学工具,还是创客想要制作独特的交互装置,Tulip都提供了一个完整、集成的解决方案。更重要的是,它背后的开源理念意味着你不仅可以使用它,还可以理解它、修改它、扩展它。
正如项目创始人Brian Whitman所说:“Tulip的约束和单一焦点应该帮助你创作出令人惊叹的创意作品。”在这个充满分心的数字时代,有时限制反而是最强大的创造工具。
准备好开始你的Tulip创意之旅了吗?从浏览器访问Tulip Web写下第一行代码,或者订购一台属于自己的硬件设备,探索代码、音乐和图形交汇处的无限可能。