以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  难题一道,谁会啊?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=23863)


--  作者:烈火之炎
--  发布时间:11/2/2005 4:44:00 PM

--  难题一道,谁会啊?
具体问题是:用C语言实现LRC歌词的解析,就是将歌词与时间分开显示。
[ti:欧若拉]
[ar:张韶涵]
[al:欧若拉]
[by:www.jpwy.net]
[00:07.96]欧若拉
[00:14.75]作词:施立
[00:26.43]作曲:李天龙
[00:36.55]神秘北极圈
[00:37.50]阿拉斯加的山巅
[00:39.10]谁的脸
[00:40.35]出现海角的天边
[00:42.30]忽然的瞬间
[00:43.22]在那遥远的地点
[00:44.86]我看见
[00:45.92]恋人幸福的光点
[01:55.69][00:47.83]灵魂在招唤
[01:58.42][00:50.64]唱着古老陌生熟悉的歌谣
[02:01.33][00:53.60]天空在微笑
[02:03.75][00:56.26]我的世界缤纷闪耀
[03:14.60][02:06.90][00:59.16]爱是一道光
[03:16.22][02:08.37][01:00.56]如此美妙
[03:17.61][02:09.70][01:01.95]指引我们想要的未来
[03:20.42][02:12.52][01:04.84]魔力北极光
[03:21.70][02:13.89][01:06.18]奇幻的预言
[03:23.24][02:15.35][01:07.59]赶快去找不思议的爱
[03:26.02][02:18.27][01:10.46]爱是一道光
[03:27.43][02:19.66][01:11.90]如此美妙
[03:28.85][02:21.07][01:13.30]照亮我们勇气的未来
[03:31.65][02:23.89][01:16.12]魔力北极光
[03:33.02][02:25.28][01:17.42]传说的预言
[03:34.47][02:26.72][01:18.97]原来就是恋人的眼光
[02:55.61][01:24.56]music
[01:44.11]沉默一眨眼
[01:45.41]一万年外的光年
[01:47.21]我相信
[01:48.35]未来其实并不远
[01:50.08]哭泣的眼泪
[01:51.38]也是喜悦的赞美
[01:52.84]是因为有你能展翅高飞
[03:37.36][02:29.43]红橙黄绿蓝
[03:40.16][02:32.35]五彩的欧若拉
[03:42.96][02:35.22]爱就在心中
[03:45.79][02:37.98]相信就会存在
[03:48.68][02:40.83]红橙黄绿蓝
[03:51.42][02:43.60]美丽的欧若拉
[03:54.23][02:46.52]爱就在心中
[03:57.03][02:49.24]相信就是永远

(LRC歌词)


--  作者:烈火之炎
--  发布时间:11/2/2005 4:45:00 PM

--  
LRC的基本语法格式比较简单,其格式为“[标识名:值]”,而使用中最重要的就是下面两种标签(tag):

  ①标识标签(ID-tags):

  标识标签主要起注释作用,它又可分为以下几种:

  [ar:艺人名],可以在这里加上歌手信息;
  [ti:曲名],可以在这里加上歌曲信息;
  [al:专辑名],可以在这里加上音乐专辑的信息;
  [by:编者],可以在这里加上指编辑LRC歌词者的信息;

  以上四项在MP3播放时在歌词显示窗口是不显示的;

  [offset:时间补偿值] (其单位是毫秒),此项是用来进行长歌词显示速度补偿所用的。由于一些歌曲版本不同(如翻唱等),有时歌词的显示上可能整体上偏快或偏慢几秒。这时你无须重新编辑歌词,只要按小键盘上的“+"、“-"调整一下当前的显示速度即可。调整后,补偿的时间差信息会被自动添加到歌词中(格式为“[Offset:毫秒数]”)。以后就无须调整了。当LyricsMate自动向歌词内写入时间差补偿标记时,是按照一行一个时间标签的标准格式填写的,原歌词文件中没有标签的行将被忽略。正值表示整体提前,负值相反。

  ②时间标签(Time-tag):

   时间标签的格式通常为“[mm:ss]”(分钟数:秒数)。其中的分钟数和秒数必须是非负整数,比如“[12:34]”是有效的标签,而“[-12:3.4]”则是无效的标签。时间标签可以位于某行歌词中的任意位置。一行歌词可以包含多个时间标签(比如歌词中的迭句部分)。根据这些时间标签,歌词伴侣会按时间的先后顺序依次高亮显示歌词,从而实现卡拉OK功能。另外,时间标签无须排序。


--  作者:烈火之炎
--  发布时间:11/3/2005 2:18:00 PM

--  
没高手啊
--  作者:firstway
--  发布时间:12/2/2005 8:53:00 PM

--  
如果仅仅是把歌词分开
下面可以做到
注:ci.txt为前面歌词混和文件

------------------------------------
#include "stdio.h"
#include<string.h>

int main()
{
 FILE* fp;
 char* strp;
 char s[80];
 
 fp=fopen("ci.txt","r");
 if(fp==NULL) return 1;

 while(feof(fp)==0)
 {
  fgets(s,80,fp);
  strp=strrchr(s,']');
  
  if(strp!=NULL) printf("%s\n",strp+1);  
 }
 
 
 fclose(fp);
 return 0;
}
-------------------------------
这里是将歌词打印在屏幕,如果需要写入一个文件也容易改


--  作者:pennyliang
--  发布时间:12/3/2005 12:26:00 PM

--  
char s[80]; 请问80是什么意思?为什么是80而不是85或者90?

--  作者:firstway
--  发布时间:12/3/2005 12:41:00 PM

--  
当然大一点可以啦
只要每行字符不要大于这个数就可以了
--  作者:pennyliang
--  发布时间:12/3/2005 1:16:00 PM

--  
通常这样写是缺乏原理描述的,可以这样写
const int maxLineSize = 80;
char lineBuffer[maxLineSize ];


--  作者:firstway
--  发布时间:12/3/2005 1:20:00 PM

--  
以下是引用pennyliang在2005-12-3 13:16:00的发言:
通常这样写是缺乏原理描述的,可以这样写
const int maxLineSize = 80;
char lineBuffer[maxLineSize ];




that‘s good!
--  作者:pennyliang
--  发布时间:12/3/2005 1:21:00 PM

--  
另外这段语句也缺乏表达力,必须根据上下文去推测。
strp=strrchr(s,']');

可以改写成

string getSubStingUntileSepcifiedChar(string s, char sepcifiedChar)
{
     return strrchr(s,sepcifiedChar);
}


--  作者:pennyliang
--  发布时间:12/3/2005 1:26:00 PM

--  
另外一个问题就是,空行没有明显的规律,有的空3行,有的空2行。
其他格式上看还是很严谨的,是个不错的程序。
--  作者:firstway
--  发布时间:12/12/2005 10:37:00 AM

--  
还有一点:没有注释,呵呵。
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
109.375ms