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

特斯拉在2021年的圣诞更新中，推出了全系灯光秀（LightShow）功能，灯光秀除了车内默认的版本，还可以自定义模式。我当时也第一时间尝试了下，但觉得太难编辑了，于是就有了新想法。 Idea来源 特斯拉官方推荐的一款开源软件叫:xLights，这是一款专业的编辑灯光表

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

![](/media/33fc2e57/preview.gif)

# Idea来源
特斯拉官方推荐的一款开源软件叫:xLights，这是一款专业的编辑灯光表演的软件，导入特斯拉提供的模板和音乐，即可开始编辑自己的灯光秀。
![](/media/33fc2e57/xlights_overview.png)
xLights的编辑过程比较繁琐，需要一帧一帧的去编辑，而且编辑完还得运行个脚本来检查生成的文件是否合法，因为特斯拉对灯光序列有严格的限制，也是以防车灯被烧坏。整个过程费时又费力，我就在想，有没有办法简化这个过程呢，最好是能导入音乐就能一键生成。于是我萌发了开发一个APP的想法。

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

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

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

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

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

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

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

# 开发其它辅助功能
有些音乐的节奏和频率比较快，很容易超过限制，因此我还加入了一些参数设计，可供用户按需调节。
+ 步进时间：就是每帧的时长， 越大越省内存
+ 节奏敏感度：对音乐节奏的敏感度，理论上越小越省内存
+ 节拍时长：每次车灯亮起的最大时长，越大越省内存
+ 雾灯开关（标续的Model 3和Model Y是没有前雾灯的，把这个选项关掉效果更加）

![](/media/33fc2e57/screenshot1.png)


为了防止超出内存使用上限，我把特斯拉提供的python脚本复刻一分到我的APP里，在一边录制的时候一边检查使用率并实时显示出供用户参考，超出就不给导出。
![](/media/33fc2e57/validate.png)


# 上架应用商店
目前APP已在在苹果App Store和Google Play上架
+ [Apple Stop](https://apps.apple.com/us/app/light-show-creator/id6446385602)
+ [Google Play](https://play.google.com/store/apps/details?id=com.coding1024.tslshow)


# 后续迭代计划
+ 支持mac版
+ 支持手动编辑模式
+ 支持录音功能

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