我们为家人所做的事情,嗯? 有时我想知道我为什么要这样做,这已经不是我的完美主义第一次导致我做的工作远超任务最初的要求。
我的岳父大约在一年前找到我,因为他所在的教堂正在上演《悲惨世界》。 为了让它比前一年更大更好,他购买了一些灯光和一个灯光控制台,并希望我能操作它们。“当然!” 我说。“这有多难?” 然后他描述了他对其中一个场景的设想:一场大型战斗,灯光闪烁; 你知道,真的很刺激! “酷,”我说,并在不知不觉中同意了。
我第一次坐下来操作他购买的灯光控制台:一个小型、低端、多通道 DMX-512。 它有能力容纳数百个场景、淡入淡出,甚至还有一个不错的慢速转轮。 我很兴奋! 尽管手册显然翻译得很差,而且控制台需要按下一连串按钮才能做一些事情,但我还是坚持了下来。 我创建了一个类似战斗的场景,认为从我认为最困难的部分开始是明智的。 我给我的岳父看了看,看到了他失望的表情。“这只是一个测试,”我赶紧指出。“当然,真正的东西会看起来好得多。” 他走开了。 哎呀。
我开始思考场景的问题。 它不够随机……它需要看起来更随机。 我决定,如果我可以生成足够多的场景,让灯光在某些路径上移动,我就可以使用内置的推子在它们之间快速淡入淡出,一切都会好起来的。 对吧? 生成场景信息很难。 正是在那时,我在这项工作中使用了我的第一个开源工具: Blender!
我使用 Blender 中的动画曲线在一个场景中玩灯光,并生成令人信服的战斗外观和感觉。 然后我写了一些 Python Blender 内部的脚本将动作导出到 CSV,为我提供每个场景的列数据,然后我可以将其编程到控制台中。 我终于感觉我有所进展了。
如果不是因为仅仅编程这东西就足以引起压力(除了我给自己造成重复性劳损的感觉),并且一个滑块应该控制 0.2 秒到 30 秒的时间(我的意思是真的吗?!),结果就不那么理想了。 它看起来就是不对劲。 叹息。 我想,如果我能完全控制它就好了。 如果我可以用 Python 编程这些灯就好了。
我的思绪飘忽不定,一个家伙躺在沙滩上的躺椅上用 Python 编程他的 DMX-512 照明的景象浮现在脑海中。“他看起来真幸福,”我想。 我必须拥有他所拥有的。
我和我的姐夫聊了聊,他也是一位技术爱好者,我还要补充一点,他已经承担了混音的工作。 我们认为购买 USB DMX-512 接口是一项值得的投资。 我们买了一个,大概是控制台成本的一半,我开始探索在 Linux 上控制 DMX-512 的选项。 我找到了一些应用程序,但它们中的大多数似乎从一开始就基于静态场景。 我也有一种隐隐约约的感觉,这个项目会扩展、发展并遭受范围蔓延。
找不到任何应用程序可以满足我对我的操作系统上的可用性或功能的需求,我决定自己编写一个。 我找到了开放照明架构 (OLA),在对黑名单模块进行了一些调整后,我得到了一个很小的 Python 脚本,它可以将数据发送到灯光并打开和关闭它们。 我欣喜若狂。 现在我只需要编写一个完整的系统来实现梦想。
我从小处着手,考虑什么是绝对必要的。 我想要一种通用的格式来存储场景。 灯光控制台让我困扰的一件事是缺乏备份。 如果控制台出现故障,我所有珍贵的场景都可能被清除。 数小时的潜在工作被浪费了。 不。 这不是一个选项。 我选择了开放格式 YAML 用于我的场景。 我在日常工作中经常使用它,它似乎很适合。
很快我就能够以一种理智的方式在两个场景之间淡入淡出,在每个灯光的每个通道值之间进行插值。 这意味着,如果灯光 1 上的亮度通道在场景 1 中为 50%,在场景 2 中为 75%,则软件会在指定的时间段内从一个线性斜坡到另一个。 优秀!
然后我开始向通道添加修改器。 这是我在 Blender 中看到的东西。 数据的动画通道(手臂骨骼弯曲、相机 x 轴平移)可以有关键帧,但它们也可以应用修改器来生成噪声或其他效果。 我向我的项目添加了一些基本的修改器,很快我就有了 cos/sin,使灯光上的倾斜/平移通道呈圆形运动。 然后,我使用样条曲线添加了航点修改器,使通道能够在不同时间点平稳地转到不同的值。 一切都在稳步进展。
不在教堂时处理灯光很有挑战性。 很难可视化场景的外观,所以我再次求助于 Blender,向应用程序添加了一个简单的 HTTP API,并要求 Blender 例行查询和更新我在场景中设置的灯光。 这使我能够演示我的照明并查看发生了什么。
早期可视化演示
舞台上增加了一台烟雾机。“你能用你的东西控制它吗?” 有人问我。“是的,我想,”我回答。 由于非常简洁和极简的 UI,只有场景控件,没有灯光的通道推子。 因此,控制烟雾意味着将一些值烘焙到场景中。 烟雾不仅是一种非免费商品,而且表演者往往在你以测试的名义用烟雾淹没他们时会感到非常沮丧。 我可以使用其中一个航点修改器,但并不真的希望每次我进入该场景时都触发它。
我需要另一种控制它的方法。 我的思绪飘忽不定。“如果我可以使用 WiiMote 来做到这一点,那不是很好吗?” 然后我突然想到。“我为什么不能呢?” 我转向了 cwiid 库,拿起一个在休息室里闲置的 WiiMote 控制器,并充分利用它。 很快,烟雾机通道就有一个 WiiMote 修改器,允许我抬起控制器,用浓浓的烟雾笼罩表演者。
控制器的音调与灯光 1、2、3、4 的整体亮度相关。控制器的滚动与灯光 1、4 上的蓝色量以及灯光 2 和 4 上的倾斜度相关。
被冲昏头脑,我添加了动态 GTK 从 YAML 配置生成通道滑块的 UI,这意味着我可以切换到不同的通道并覆盖它们。 我这样做是件好事,因为表演者似乎从来没有每天晚上都使用相同的麦克风。 吸取教训。 现在我可以对这些变化做出反应,手动升降灯光,就像使用控制台一样。
三场演出来了又走了。 充满 sin/cos 和新的随机修改器的战斗场景看起来很壮观。 加上我的姐夫组合在一起的音频,我们感觉很不错。
战斗场景演示
快进到一年后。 我明天要进行一场演出,我的姐夫刚刚问我,“有没有办法让你的系统播放声音,这样我们就不必一起触发它们了?” “当然,”我回答。 现在它可以了,多亏了 GStreamer。 它还可以根据波的幅度控制通道,这为我提供了一种将战斗场景中的爆炸与灯光移动同步的方法。 谢谢, SciPy!
那么这里的要点是什么? 如果没有开源,我永远、永远无法完成这个项目。 我将不得不编写或购买 WiiMote 驱动程序、DMX-512 驱动程序、DMX 路由和控制后端、可视化软件、配置标准、UI 生成。 开源给了我三样东西,这三样东西都是非常宝贵的。
- 它让我可以访问所有这些东西,以便我可以专注于编写将它们组合在一起的粘合剂。
- 它让我能够不断更新和添加到我的弗兰肯项目中,毫无疑问,有一天我会重写并发布它。
- 它让我的岳父高兴......目前是这样。
如果没有开源,我就会陷入语无伦次的、重复性劳损的混乱状态,嘟囔着关于需要按住场景按钮三秒钟,然后再按程序按钮和清除按钮的组合。
我认为开源只是拯救了我的生命,并在它这样做的时候给了我一次非常棒的体验。
2 条评论