OC源代码 歌词解析——王菲的《传奇》 传奇源代码

歌词file:[ti:传奇][ar:王菲]
[00:03.50]传奇[00:19.10]作词:刘兵 作曲:李健[00:20.60]演唱:王菲[00:26.60][04:40.75][02:39.90][00:36.25]只是因为在人群中多看了你一眼[04:49.00][02:47.44][00:43.69]再也没能忘掉你容颜[02:54.83][00:51.24]梦想着偶然能有一天再相见[03:02.32][00:58.75]从此我开始孤单思念[03:08.15][01:04.30][03:09.35][01:05.50]想你时你在天边[03:16.90][01:13.13]想你时你在眼前[03:24.42][01:20.92]想你时你在脑海[03:31.85][01:28.44]想你时你在心田[03:38.67][01:35.05][04:09.96][03:39.87][01:36.25]宁愿相信我们前世有约[04:16.37][03:46.38][01:42.47]今生的爱情故事 不会再改变[04:24.82][03:54.83][01:51.18]宁愿用这一生等你发现[04:31.38][04:01.40][01:57.43]我一直在你身旁 从未走远[04:39.55][04:09.00][02:07.85]首先分析一下这个歌词,每句歌词对应好几个时间,每个时间不只是一秒的时间,而是一段时间。你有什么思路呢?分割分割再分割,然后用字典键值对,根据时间输出歌词,额,这个方法是不是谈麻烦了。【代码】//LrcEach.h#import@interface LrcEach : NSObject@prooerty float seconds;@property NSString * lrcEach;@end//LrcEach.m#import "LrcEach.h"@implementation LrcEach@end//LrcMessage.h#import@interface LrcMassage :NSObject@property NSString * ar;@property NSString * ti;@property NSString * al;@property NSString * by;@property float offset;@end//LrcMassage.m#import "LrcMassage.h"@implementation LrcMassage-(NSString *)description{return [NSStringstringWithFormat:@"n艺人:%@n曲名:%@n专辑:%@n作曲:%@n",_ar,_ti,_al,_by];}@end//LrcManager.h@class LrcMassage;@interface LrcManager : NSObject@property (readonly) LrcMassage *message;-(id)initWithFile:(NSString *)path;-(NSString *)lrcInTime:(float)time;+(void)test;@end//LrcManager.m#import "LrcManager.h"#import "LrcEach.h"#import "LrcMassage.h"
//@interface PSBLrcManager ()//{// NSMutableArray *_array; //存储解析得到的单词//}//@end//匿名类别中声明的成员变量和方法,不对外公开,只能被当前类的成员方法调用。
@implementation LrcManager{ NSMutableArray * _array; //存储解析得到的单词// LrcMassage * _message; //存储信息}
- (id)initWithFile:(NSString *)path{ if (self = [super init]){ _array = [[NSMutableArray alloc] init]; _message = [[LrcMassage alloc] init]; //解析相关路径的文件 [self paserLrcFile:path]; } return self;}


//歌词其实就是一个LRC文件,里面存放了所有的歌词////类似于//[ti:传奇]//[ar:王菲]////[00:03.50]传奇//[00:19.10]作词:刘兵 作曲:李健//[00:20.60]演唱:王菲//[00:26.60]//[04:40.75][02:39.90][00:36.25]只是因为在人群中多看了你一眼//[04:49.00]
//解析相关路径的文件,将歌词存储到数据模型中,再将数据模型存储到数组中- (void)paserLrcFile:(NSString *)path{ //读取文件 NSString * contents =[self readFile:path]; //解析歌词内容 [selfpaserLrcFileContents:contents]; //数组排序 [self sortArray];}
//读取文件,返回文件内容- (NSString *)readFile:(NSString *)path{ NSString * contents =[[NSString alloc] initWithContentsOfFile:pathencoding:NSUTF8StringEncoding error:nil]; return contents;}
//解析歌词内容- (void)paserLrcFileContents:(NSString *)contents{ //使用回车分割 NSArray * contentArray =[contents componentsSeparatedByString:@"n"]; //遍历每一行字符串 for (NSString * contentin contentArray) { //跳过空字符串 if ([content isEqualToString:@""] == YES){ continue; } //判断这一行是否以@"[0"开头 if ([content hasPrefix:@"[0"] == YES) { //解析这句歌词,存入歌词单句的数据模型中 [selfpaserLrcEach:content]; }else if([content hasPrefix:@"["] == YES){ [selfpaserLrcMessage:content]; } }}
//解析一句歌词,存入数据模型- (void)paserLrcEach:(NSString *)lrcEach{ //字符串分割 以]为分割符 NSArray * lrcArray =[lrcEach componentsSeparatedByString:@"]"]; for (NSString * lrc inlrcArray) { if ([lrc hasPrefix:@"["] == YES) { //获取秒数 floatseconds = [self sencondsForTime:lrc]; //创建数据模型 PSBLrcEach* each = [[PSBLrcEach alloc] init]; each.seconds = seconds; each.lrcEach = lrcArray[lrcArray.count - 1]; //将数据模型,存入数组 [_arrayaddObject:each]; } }}

//解析曲目的信息- (void)paserLrcMessage:(NSString *)message{ NSArray * messageArray =[message componentsSeparatedByCharactersInSet:[NSCharacterSetcharacterSetWithCharactersInString:@"[:]"]]; if ([messageArray[1]isEqualToString:@"ar"]) { _message.ar = messageArray[2]; }elseif([messageArray[1] isEqualToString:@"ti"]){ _message.ti = messageArray[2]; }elseif([messageArray[1] isEqualToString:@"al"]){ _message.al = messageArray[2]; }elseif([messageArray[1] isEqualToString:@"by"]){ _message.by = messageArray[2]; }elseif([messageArray[1] isEqualToString:@"offset"]){ _message.offset = [messageArray[2]floatValue]; }
}
//给一个时间字符串,返回对应的秒数- (float)sencondsForTime:(NSString *)time{ //[00:15.26 NSArray * timeArray =[time componentsSeparatedByCharactersInSet:[NSCharacterSetcharacterSetWithCharactersInString:@"[:"]]; //取出分 float minute =[timeArray[1] floatValue]; //取出秒 float seconds =[timeArray[2] floatValue]; return minute * 60 +seconds;}

//数组排序- (void)sortArray{ for (int i = 0; i <_array.count - 1; i++) { for (int j = 0; j < _array.count - 1 - i;j++) { if([_array[j] seconds] > [_array[j + 1] seconds]) { [_arrayexchangeObjectAtIndex:j withObjectAtIndex:j + 1]; } } }}
- (NSString *)lrcInTime:(float)time{ for (NSInteger i =_array.count - 1; i >= 0; i--) { if ([_array[i] seconds] < time) { return[_array[i] lrcEach]; } } return nil;}
#define PATH @"/Users/pansongbiao/Downloads/qfile-4.txt"
+ (void)test{ LrcManager * manager =[[LrcManager alloc] initWithFile:PATH]; int i = 0; while (i++ < 200){ system("clear"); NSLog(@"%@",manager.message); NSLog(@"n%@", [manager lrcInTime:i]); sleep(1); } }
【OC源代码】歌词解析——王菲的《传奇》 传奇源代码

@end//main.m#import#import "LrcManager.h"
int main(int argc, const char * argv[]){
@autoreleasepool { [LrcManager test]; } return 0;}

  

爱华网本文地址 » http://www.aihuau.com/a/25101010/34472.html

更多阅读

王菲资料,王菲图片,王菲的微博地址 王菲微博图片

王菲资料王菲,中国著名女歌手、影视演员,其演唱的《红豆》《但愿人长久》等歌曲至今依然拥有广泛的传唱度。王菲独特的嗓音以及她创造的“菲式”唱法使其在整个亚洲地区和华人世界拥有很高的知名度,她也是首位登上时代杂志封面的华人歌

王粲的《登楼赋》 登楼赋 阅读答案

【说明】赋是一种介于诗歌和散文之间的文学体裁。“铺陈其事”是它的主要表现手法,并具有一定的音律节奏。赋发生在战国末期,风行于两汉,到南北朝时日趋散文化和骈俪化。赋在它的发展过程中,出现过一些变体,王粲的《登楼赋》就属于所谓骚

杨澜访谈录:王菲的人生哲学

近期的杨澜访谈录,请来了王菲李亚鹏夫妇。王菲的复出成为近来最热的一个话题之一。王菲一直被视为娱乐圈的异类,因为凛然的个性,因为随心所欲的心态。退隐前的她,说的最多的是顺其自然。她崇尚这样的生活态度。而归来的她,依旧顺其自然,但

声明:《OC源代码 歌词解析——王菲的《传奇》 传奇源代码》为网友梦毁少年分享!如侵犯到您的合法权益请联系我们删除