五个工程,横跨一年半(2014-10 → 2016-04),是这批归档里迭代最勤的一条线:

2014-10-25  其他/lrc.e                        8,349   LRC 歌词制作器
2016-01-10  播放器/音乐播放器/对照.e           7,203   惜缘音乐盒子
2016-01-10  播放器/音乐播放器16.01版源码.e    30,239
2016-03-25  播放器/音乐播放器内测.e           72,627   主力版
2016-04-12  播放器/LOL专用精便小巧播放器.e     2,962

读法在旗舰篇。这篇讲一件我在做筛选时才想明白的事。


方法点:先看分布,再看内容

音乐播放器内测.e 扫出 1,066 条串 —— 是同类小工程的十几倍。第一眼会觉得"这个工程信息量真大"。

把偏移排出来才知道不是:

0     ── 7,518    窗体定义 + 全部界面文案       ← 真信号
7,518 ── 18,900   ████████████████████████     ← 图像资源(346 条)
18,900── 19,400   常量1 / 声音1 / 支持库名      ← 真信号
19,400── 30,000+  ████████████████████████     ← 还是图像资源(316 条)

中间那一大段的产出长这样:

 7518  灋灋灋灋灋灋灋灋灋构箋{{ccdRSSQQQ悗帪灋灋灋灋灋
 7582  詭eee///;;;===@??bbb
 7630  詭]]]GGG;;;@@@===LKK
 8200  詭///===HHGywx
 9476  眄磲後枛枅増槝槧牋灋潕媼poqj}y敳懕睅旯楁☉印斂牄瑹
24000  渢s渢s渢s渢s虐
24144  xB?xB?偎蕏B?xB?

数出来:偏移 7,518–18,900 之间有 346 条,19,400–30,000 之间有 316 条,合计 662 / 1,066 ≈ 六成二。

看这些串对应的原始字节就很清楚。灋 的 GBK 编码是 9E 9E,所以 灋灋灋灋 就是 9E 9E 9E 9E… 一段恒定字节;渢s渢s 是 9C 74 73 三字节循环。位图的平坦区(纯色背景、调色板填充)正好就是这种形态,而它们在 GBK 规则下全部合法,我的扫描器一条不漏地收了。

也就是说:1,066 条里六成是我自己界面的图标和背景图。

这件事的教训很通用:串在哪个偏移区间,比串写了什么更能告诉你它是什么。 同样的字符串,出现在窗体定义区就是文案,出现在资源区就是巧合。所以我后面所有工程的读法都改成先画一张偏移分布图,再决定读哪一段 —— 而不是从第一条串开始硬筛。

对照.e(7,203 字节,190 条串)里也能一眼看出这个问题:0–1,600 是窗体,1,600–4,700 全是一张图,4,700 之后才是支持库和事件名。中间那张图(或那批图)贡献了 153 条 / 190 条。


一、歌词制作器比播放器早一年半

3112  lrc歌词制作器
3577  歌词创编辑框
3857  歌词创建人:
5343  停止计时按钮
5462  停止计时
5498  时间
5707  插入时间按钮
5826  插入时间
6204  无限循环
6930  超过最大时间,请换更短的歌曲!

lrc.e(2014-10)不是播放器,是一个给歌词打时间戳的工具:放歌、按 插入时间 写下 [00:12.34]、停止计时,还要处理"歌比歌词长/短"的情况。

超过最大时间,请换更短的歌曲! 这句报错说明它的实现是先固定一个总时长数组,超了就报,而不是动态扩容 —— 2014 年我会写的数组处理水平。

这条线比我以为的更早:我先有了解析/生成 LRC 的兴趣,一年半以后才做出能放歌的界面。 而且注意 歌词创建人: —— 这个工具从一开始就打算把成品发给人看,不只是自己听歌用。


二、对照.e 是一个带广告语的播放器

4715  标题
4853  "微软雅黑
4890  惜缘音乐盒子-听音乐用惜缘
 826  进度条1
 940  媒体播放
1055  时钟
1166  通用对话框
1375  开始
1486  选择歌曲u
1522  图片框1
5297  窗口程序集_启动窗口
5388  _图片框1_鼠标左键被按下
5606  _开始_被单击
5657  文件名
5676  总时间
6123  _时钟_周期事件

窗口标题是 「惜缘音乐盒子-听音乐用惜缘」 —— 一个我自己给自己产品写的 slogan,字体还特意设成微软雅黑。

技术上它很简单:媒体播放 组件放歌,进度条1 显示,时钟 周期更新 文件名 和 总时间。文件名叫 对照.e,说明它是拿来和另一个版本做 A/B 的 —— 但 2016-01-10 这天它和 音乐播放器16.01版源码.e 是同一天改的,所以"对照"更可能是我当时给一份实验性写法起的名字,不是正式的 A/B。

「听音乐用惜缘」这句话我完全没印象。 这就是归档旧代码最有价值的部分:你会遇到一个自己造过、但彻底忘掉的东西。它也不在最终版里 —— 主力版 音乐播放器内测.e 的标题就叫 音乐播放器(。


三、主力版:备注里写着「作者:神马???」

 272  音乐播放器(
 286  欢迎使用本软件
 302  @备注:
 310  作者:神马???
1111  音乐播放器
1153  通用对话框2
1365  按钮8
1477  暂停播放音乐
1517  添加文件夹
1634  添加文件夹l        ← 越界伪影
1672  时钟1
1784  滑块条1
2033  弹出主程序
2116  播放
2195  无限循环1
2218  无限循环
2275  随机播放1
2298  随机播放
2355  关闭主程序
2550  缩小到托盘
2588  透明标签
2707  点我收起历史记录~
2864  停止
3008  下一首
3042  地址10
 ...  地址9 … 地址1
4973  顺序播放o
5009  媒体播放
5282  选择音乐
5476  下一首歌随机播放
5730  选择框1
5908  分组框1
6030  您曾经播放的歌的地址:
6244  您的固定文件夹地址:无
6466  固定文件夹地址:
6878  您正在播放的歌的地址:
7100  歌曲地址:
7258  换歌n
7414  图标

几条值得说的:

@备注: + 作者:神马??? —— 这是易语言工程属性里的"备注"字段。到 2016 年 3 月我还没给自己的软件想好署名。这条我一个字没改,原样发出来。

无限循环1 / 随机播放1 和 无限循环 / 随机播放 是成对的 —— 前者是 超级按钮 的按下态图。也就是说三种播放模式(顺序 / 循环 / 随机)我各做了一套选中/未选中图片,这是当时唯一会的"高亮当前选项"的做法。

地址1..地址10 是 10 个控件,不是数组。16.01 版只有 地址1..地址4,事件处理函数写得清清楚楚:

_地址1_鼠标左键被按下
_地址1_鼠标右键被按下
_地址2_鼠标左键被按下
...
播放内容
随机程序 / 随机数 / 播放ING / 写到历史记录

左键播放、右键大概是移除。10 个槽位、每人写一个事件函数 —— 这就是我当时处理"列表"的方式:没有列表控件,用一排同名编号的标签凑。

历史与固定目录:您曾经播放的歌的地址:、固定文件夹地址:、您的固定文件夹地址:无。“无"是默认值直接写死在界面上。点我收起历史记录~ 说明历史记录是一块可折叠面板,写到历史记录 是它的写入动作。

托盘三件套:缩小到托盘 / 弹出主程序 / 关闭主程序 —— 右键托盘菜单的标准三项。透明标签 说明界面上有一层用透明标签做的覆盖层(当时做圆角/贴图界面的通用土办法)。

滑块条1 是进度/音量。没有留下音量相关文案,所以我更倾向它是进度条。

硬编码的测试歌

16.01 版里扫到一条:

\Dj Mr.An 社会摇 第四季.mp3

一个相对路径。也就是说 2016-01 那一版的代码里,我把当时在听的一首歌的路径直接写死了当测试数据 —— 后来才有 添加文件夹。这种痕迹没法造假,也不会出现在任何设计文档里。

(这首歌不是我写的,仓库里只有源码容器,没有任何 mp3。)


四、LOL 专用版:2,962 字节、3 条串

这个是最小的一版:

 952  mp3歌曲(*.mp3)
1831  __启动窗口_可否被关闭
1976  是否关闭本程序?
2492  选文件播放歌曲软件.exe

三个串就是它的全部:一个文件过滤器、一个窗口关闭事件的重写、一句确认。

__启动窗口_可否被关闭 是易语言里少数能改变默认行为的事件之一 —— 返回假就不关。它唯一的用途就是拦住误关。结合编译产物名字 选文件播放歌曲软件.exe:功能就是"选个 mp3,放,别的什么都不做”。

为什么要单独做一版:它的工程名和编译目标名都写着 LOL。2016 年 LOL 的全屏模式会把窗口压在最上层,普通播放器要么看不见、要么一切出去就掉帧。所以我需要一个开起来不挡路、关掉要有确认的极简壳子 —— 一个 3 KB 的、专门为了在游戏旁边听歌写的软件。(这段是我根据目录名和它的三个串反推的动机,不是我当时写下的说明。)这是这五个工程里我最喜欢的一个,因为它有一个非常具体的问题要解决,而它的解决方案是"把别的全删掉"。


五、没发出来的东西

  • 配套的 72 MB mp3 和 data1..9 数据文件 —— 音乐不是我写的,没权利发。仓库里只有 5 个 .e 容器。
  • 6 个编译产物 exe(播放器内测16.01/16.02/16.03/16.031、播放器16.01、LOL专用),体积 561 KB – 815 KB。这些 exe 的体积差比源码的体积差更能说明我改了多少次 —— 但我没收录,只是记在这里。

仓库

https://cnb.cool/t1mmoc/tspace/eyuyan/lp-music-player