LRC 扩展语法

这是用于对LRC进行 WEB元素动态变更的扩展语法,暂时定义一下:

1. 基本语法规范:

[ti:这是曲目标题]
[ar:艺术家]
[by:作曲]
[offset:偏移时间(s)]
[defaults:key=value&key2=value2]
[tr:歌词过渡偏移时间(s),正数为提前,负数为错后]
[eg:effectGroup1=#s1,#s3,.class,#s4|effectGroup2=#s2,#textBars]
[mm:ss.xx]这些是歌词,没有同步效果
[mm:ss.xx]{#effectContainer:effectType:param1:param2:param3:timeParam}这些是有同步效果的歌词
[mm:ss.xx]{#effectContainer:effectType:param1:param2:param3:timeParam}
所有直接文本会被忽略

扩展LRC将兼容目前的LRC标签,同时新增 eg 和 tr 标签(Effect Group和Transition Delay)。

eg参数中,不同效果组以“|”(管道符)分隔,效果组的定义为“效果组识别ID=HTML单元1,HTML单元2…”。其中,效果组的ID必须为[a-zA-Z0-9]的字符,区分大小写。HTML单元可以是 #id 单元ID 或者 .class 单元的CSS类或者 tagname 某种标签(如 <textarea>)。播放器不要求支持 .class和tagname但是应该支持 #id

tr 参数为一个浮点小数,ss.xx,允许精确到 0.01s 。tr定义的是歌词发送的提前量,用来处理渐变效果所占用的时间。比如tr:1 则表示歌词会在其真正时间的1s前执行。定义为负值时则表示歌词错后时间执行,但是这个功能实际应用有限。

2.时间标签

时间标签格式如下[mm:ss.xx],mm表示分钟数。按惯例,不足10分钟则补 0( 01:00.00,02:05.98),但是这不是强制要求,超出99min的LRC文件播放器应该支持,虽然现实性并不强。ss.xx 表示精确到0.01s的时间,如果恰为整数秒,则也必须保留精度(如03.00),ss不得大于 59,xx则为0-99。时间标签不得重复,如果出现重复,播放器应该进行警告并选取任何的一次定义。

3.效果定义

效果的定义必须直接跟随时间定义,即 [mm:ss.xx]{效果定义}。效果语句由 {}括号括起,内部不允许嵌套任何的 “{”,“}” 符号。一个时间标签后面至多有一个效果定义(不允许 [mm:ss.xx]{效果1}{效果2})。括号内为效果参数,由 : 分隔。
效果定义一共有 6个参数,不随效果的变化而变化!少于或多于此数目的参数均视为非效果标签,播放器可以直接忽略。

第一个参数为作用对象,如果首位是 # 则表示直接作用于页面的某ID对象,在作用对象中不得使用.class和htmlTagName这样的标签,如果有必要请在Effect Group里面定义操作组。如果作用对象首位不是 # ,则表示效果正在对一个Effect Group作用。当对象定义为 “#” (后面没有任何其他字符),则表示“虚无的作用对象”,这是运行script时的默认定义。对虚无的对象进行transition或style或fade是无效且无效果的。

{#wrapper:transition:text:#fff:#000:20}//对 id="wrapper" 的页面对象进行效果
{myEffectGroup:transition:text:#fff:#000:20}//对 myEffectGroup的所有成员进行效果
{doesNotExist:transition:text:#fff:#000:20}//如果不存在这个Effect Group,播放器应该放弃执行这个效果

效果定义分为三类:
1. 色彩渐变

{#object:transition:entity[text,border,background]:start:end:speed}

色彩渐变允许定义页面上的元素进行色彩的渐变。由transition标记。

Entity定义了作用的方面:
text 表示渐变文字颜色
background 表示渐变背景色
border 表示渐变边框颜色
Entity不得组合使用,不应出现“:text,border:”的定义。

start和end是由 #起始的颜色HEX码,可以简写(省略起始的0),但是有的效果与HTML的定义的期待会不同。播放器在没有发现 # 的情况下,也应理解此定义为html颜色。播放器可以选择实现 rgb(0-255,-255,-255) 作为颜色定义,但是这不被要求,播放器可以选择忽略。

speed定义了渐变效果的速度,speed数值越大,速度越快。默认的渐变步数是20,所以speed应在0-20之间。有些播放器可以通过defaults 标签下定义 transitionStep 来改变这个数值,不过并不要求实现。

2.淡入淡出

{#object:fade:direction[in,out]:before-opacity:after-opacity:time}

淡入淡出允许LRC运行时改变页面的对象的透明度(opacity)。

direction 定义了in和out,in让对象的透明度由现有的数值变化为after-opacity,out则会让对象的透明度变化为 before-opacity。在透明度数值未定义的时候,默认选取渐变源的另一个opacity定义。

before-opacity和after-opacity数值0-100,超出视为无效定义,选取默认。

time是进行渐变的时间(0.001s),比如time=1表示0.001s渐变结束。time数值越大,渐变所需时间越长。time必须为正整数。

3.直接修改Style

{#object:style:styler:value:0:0}

修改Style允许歌词直接对元素的style进行修改。styler定义了DOM里面的style属性,比如 {#object:style:display:none:0:0}就可以定义 #object为不显示。

修改Style不支持渐变效果,所以后两个参数无效。

4.调用JS命令

{#:call:function-name:param1:param2:param3}

调用JS命令允许LRC在执行时调取页面的JS命令。这里必须定义object为 #(虚无对象)。function-name可以是页面上JS的function名称,不过这个并不一定在所有情况下都存在,用于用户个性化制定function。带有这个命令的LRC可能不能再所有的情况下发挥同样效果。如果没有该JS函数,此命令忽略。用户至多传输3个参数,不传输的参数请定义为null。参数中不得包含 { , } 或 : 。

调用JS可能会在某系统设置或者播放器下失效,也可能有播放器会屏蔽 eval 作为 function-name 。总之,各总情况下,不建议使用这个命令。

3. 处理错误和失败

理论上播放器应该忽略自己不认识的标签和动作设置。在可能的情况下,播放器不应把 {}内内容当作歌词,即使内容可能不符合效果定义的语法。对于重复时间标签,播放器可以选择拒绝执行,或者采用其中的任何一个时间标签。在出现标签内语法错误,如 eg 定义不合法,整个标签应按照错误处理,不应解析其正确部分。

eg的定义有覆盖盖追加性,比如

...
[eg:group1=#tag1,#tag2,#tag3|group2=#tag4,#tag5,#tag6]
[eg:group3=#tag6,#tag4|group1=#tag8]
...

播放器应理解为

...
[eg:group1=#tag8|group2=#tag4,#tag5,#tag6|group3=#tag6,#tag4]
...

对于双标签,播放器会理解为最长标签段:

...
[mm:ss.xx]{ 这是一个标签定义:参数:参数...:参数}{新的标签定义:参数...:参数 }
...

如果播放器可以理解标签,并发出JS命令,则错误处理将指派浏览器和JS代码进行。歧异语法将不会被追究,但是其性能和适用度不可判定。

至此,LRC扩展定义结束。

2 Comments

  1. […] 最后,大家也可以在这里回复共享自己的扩展LRC。有关扩展LRC的语法,请看“扩展LRC定义”。ABPlayer基本接受所有的规范。 此条目发表在 WordPress相关 | On WordPress, 开源项目 | OSProjects, 网络编程 | Network Coding 分类目录,贴了 ABP, AmbiencePlayer, 氛围播放器, 测试, 环境播放器 标签。将固定链接加入收藏夹。 ← 《鸟之诗》 —— AmbiencePlayer RC1预发布测试 […]

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注