特斯拉灯光秀Light Show Creator开发手记(一)

特斯拉在2021年的圣诞更新中,推出了全系灯光秀(LightShow)功能,灯光秀除了车内默认的版本,还可以自定义模式。我当时也第一时间尝试了下,但觉得太难编辑了,于是就有了新想法。

1. Idea来源

特斯拉官方推荐的一款开源软件叫:xLights,这是一款专业的编辑灯光表演的软件,导入特斯拉提供的模板和音乐,即可开始编辑自己的灯光秀。

xLights的编辑过程比较繁琐,需要一帧一帧的去编辑,而且编辑完还得运行个脚本来检查生成的文件是否合法,因为特斯拉对灯光序列有严格的限制,也是以防车灯被烧坏。整个过程费时又费力,我就在想,有没有办法简化这个过程呢,最好是能导入音乐就能一键生成。于是我萌发了开发一个APP的想法。

2. 前期准备

第一步,也是最重要的一步,我需要分析这个项目的可行性,也就是说我是否能够生成跟xLight一样的规范的fseq序列帧文件以供车辆识别,这个文件是二进制的,需要逐个字节去分析它的含义。

通过特斯拉官方提供的检查脚本,我们可以大致反推出fseq格式的基本含义,由前半部分的头定义和后半部分序列帧(每个车灯的开关/亮度)组成。

为了验证我的想法,我拿特斯拉官方的例子做实验,官方的例子一共有3个文件:

  • lightshow.wav(这个是音乐文件,不管它)
  • lightshow.xsq(这个是xLights的工程文件,也就是序列帧的xml格式)
  • lightshow.fseq(这个是序列帧的二进制格式,由xLights导出给车辆用的)

我的做法是,把xsq工程里的序列帧数据导入到我的APP里,然后再导出新的fseq文件,再拿这个新fseq和xLights导出的fseq逐个字节比对,直到二者一个字节不差。这也就意味着我的APP也能导出跟xLights一样能让特斯拉识别的序列帧。

3. 前期开发

当在实车上测试过导出格式没问题之后,接下来就是着手开发核心功能了:一键自动生成。

其实原理也特别简单,只要把音乐的音轨找出来,把整个音域分成n等分,然后把它们均等分配到每个车灯上,当达到一个阈值时,把车灯亮起,否则关掉。有点像音乐播放器里跳动的音谱。

4. 开发其它辅助功能

有些音乐的节奏和频率比较快,很容易超过限制,因此我还加入了一些参数设计,可供用户按需调节。

  • 步进时间:就是每帧的时长, 越大越省内存
  • 节奏敏感度:对音乐节奏的敏感度,理论上越小越省内存
  • 节拍时长:每次车灯亮起的最大时长,越大越省内存
  • 雾灯开关(标续的Model 3和Model Y是没有前雾灯的,把这个选项关掉效果更加)

为了防止超出内存使用上限,我把特斯拉提供的python脚本复刻一分到我的APP里,在一边录制的时候一边检查使用率并实时显示出供用户参考,超出就不给导出。

5. 上架应用商店

目前APP已在在苹果App Store和Google Play上架

6. 后续迭代计划

  • 支持mac版
  • 支持手动编辑模式
  • 支持录音功能

我还上传了一些用creator录制的灯光秀到github, 都是一些有意思的BGM,大佬们不嫌弃的话下载拿去用~
https://github.com/zhandouxiaojiji/tesla-light-show