当前位置: 首页 >> 程序设计 >> LRC歌词分析函数
 

LRC歌词分析函数

作者:      来源:http://blog.csdn.net/chenjl1031     发表时间:2007-12-20     浏览次数:      字号:    

发布我的LRC歌词分析函数。这是我现在1.8版本全功能播放器所使用的最新功能。要想歌曲、歌词同步播放,其关键有2点:1、什么时候显示歌词?按照播放时间将相应的歌词快速取出来。2、歌曲、歌词还必须匹配:即3分10秒的歌曲,你就得去找3分10秒的歌词,而不是3分15秒的歌词。


'******************************************************************************************
'*                              Module1.bas                                               *
'* 调用成功(分析歌词成功)后:LyricsAlalysys=True,并返回排好序的歌词数组LRCgeci,           *
'* 以及歌曲名GeMing、歌手GeShou、专辑ZhuanJi、编者GeCiFrom;否则返回LyricsAlalysys=False     *
'* 最后一个FOR循环是对歌词排序,歌词排序是同步播放的关键!                                    *
'*                     特别声明:转载请用IP地址,严禁原文转载!                              *
'*                     作者:Chenjl1031(东方之珠)                                          *
'******************************************************************************************
Option Explicit
'处理LRC歌词
Public LRCgeci() As String 'LRC歌词按行存放在数组中
Public iDimention As Integer
Public GeMing As String, GeShou As String, ZhuanJi As String, GeCiFrom As String
Public LrcOffset As String 'LRC歌词时间偏移量

Public Function LyricsAlalysys(LyricsName As String) As Boolean 'LRC歌词分析函数
      
       Dim FileNumber As Integer, FileCount As Integer, i As Integer, j As Integer, K As Long, L As Integer
       Dim TimeLabelLength As Integer '时间标签的长度
       Dim Chenjl1031 As Boolean
       Dim MyValue As String
       Dim sRow As String
       Dim TimeLabel As String
       Dim miniute As String, second As String, msecond As String 'miniute代表分,second代表秒,msecond代表毫秒
       Dim s1 As String, s2 As String
       On Error Resume Next
       GeMing = "未知"  '存放歌曲名
       GeShou = "未知" '存放歌手名字
       ZhuanJi = "未知"  '存放专辑名字
       GeCiFrom = "未知"  '存放歌词来自何处,即编者
       '打开LRC歌词文件LyricsName
       FileCount = 0: j = 0: TimeLabelLength = 0: Chenjl1031 = True
       If Dir(Player.MyPath & "Lyrics\" & LyricsName & ".lrc") <> "" Then
          LyricsAlalysys = True
          LrcOffset = "0"  '存放歌词偏移量
          FileNumber = FreeFile
          Open (Player.MyPath & "Lyrics\" & LyricsName & ".lrc") For Input As #FileNumber '打开文件,从中读取LRC歌词
          Do While Not EOF(FileNumber)
              Line Input #FileNumber, MyValue '读取一行歌词到变量MyValue
              MyValue = Trim(MyValue)
              For i = 1 To Len(MyValue)
                  sRow = Mid(MyValue, i, 1)
                  If sRow = "[" Then
                     FileCount = FileCount + 1 'FileCount计数用来确定歌词有多少行
                     L = i + 1
                     sRow = Mid(MyValue, L, 1)
                     If IsNumeric(sRow) Then
                        Do While Chenjl1031
                           sRow = Mid(MyValue, L + 1, 1)
                           If IsNumeric(sRow) Or sRow = ":" Or sRow = "." Then
                              TimeLabelLength = TimeLabelLength + 1
                           End If
                           If sRow = "]" Then TimeLabelLength = TimeLabelLength + 3: Chenjl1031 = False: Exit Do
                           L = L + 1
                        Loop
                     End If
                  End If
              Next
              '处理LRC歌词头
              If InStr(LCase(MyValue), "[ti:") > 0 Then
                 i = InStr(LCase(MyValue), "[ti:")
                 Mid(MyValue, i, 4) = "    "
                 MyValue = Mid(MyValue, 2, Len(MyValue) - 2)
                 GeMing = IIf(Trim(MyValue) <> "", Trim(MyValue), "未知") '存放歌曲名
                 j = j + 1
              End If
              If InStr(LCase(MyValue), "[ar:") > 0 Then
                 i = InStr(LCase(MyValue), "[ar:")
                 Mid(MyValue, i, 4) = "    "
                 MyValue = Mid(MyValue, 2, Len(MyValue) - 2)
                 GeShou = IIf(Trim(MyValue) <> "", Trim(MyValue), "未知") '存放歌手名字
                 j = j + 1
              End If
              If InStr(LCase(MyValue), "[al:") > 0 Then
                 i = InStr(LCase(MyValue), "[al:")
                 Mid(MyValue, i, 4) = "    "
                 MyValue = Mid(MyValue, 2, Len(MyValue) - 2)
                 ZhuanJi = IIf(Trim(MyValue) <> "", Trim(MyValue), "未知") '存放专辑名字
                 j = j + 1
              End If
              If InStr(LCase(MyValue), "[by:") > 0 Then
                 i = InStr(LCase(MyValue), "[by:")
                 Mid(MyValue, i, 4) = "    "
                 MyValue = Mid(MyValue, 2, Len(MyValue) - 2)
                 GeCiFrom = IIf(Trim(MyValue) <> "", Trim(MyValue), "未知") '存放歌词来自何处
                 j = j + 1
              End If
              If InStr(LCase(MyValue), "[offset:") > 0 Then
                 i = InStr(LCase(MyValue), "[offset:")
                 Mid(MyValue, i, 8) = Space(8)
                 MyValue = Mid(MyValue, 2, Len(MyValue) - 2)
                 LrcOffset = IIf(Trim(MyValue) <> "", Trim(MyValue), "0") '存放歌词偏移量
                 j = j + 1
              End If
          Loop
          Close #FileNumber
          ReDim LRCgeci(Trim(Str(FileCount - j - 1))) '重新定义实际歌词的行数数组,有FileCount - j个元素
         

          '处理LRC歌词文本         
          FileCount = 0
          FileNumber = FreeFile
          Open (Player.MyPath & "Lyrics\" & LyricsName & ".lrc") For Input As #FileNumber '打开文件,从中读取LRC歌词
          Do While Not EOF(FileNumber)
              Line Input #FileNumber, MyValue '读取一行歌词到变量MyValue
              MyValue = Trim(MyValue)
              sRow = Mid(MyValue, 2, 2)
              j = 0: i = 0
              If IsNumeric(sRow) Then '判断是否时间标签行
                 i = i + 1
                 Do While True
                    j = j + TimeLabelLength
                    sRow = Mid(MyValue, j + 2, 2)
                    If IsNumeric(sRow) Then  '判断是否时间标签行
                       i = i + 1 'i累加后即为每一行时间标签的个数
                    Else
                       Exit Do
                    End If
                 Loop
                
                 For j = 1 To i 'Step 1
                     TimeLabel = Mid(MyValue, (j - 1) * TimeLabelLength + 1, TimeLabelLength)
                     If TimeLabelLength > 2 Then miniute = Mid(TimeLabel, 2, 2)
                     If TimeLabelLength > 5 Then second = Mid(TimeLabel, 5, 2)
                     If TimeLabelLength > 8 Then msecond = Mid(TimeLabel, 8, 2)                    
                     K = Val(miniute) * 60000 + Val(second) * 1000 + Val(msecond) - Val(LrcOffset)
                     s1 = Trim(Str(K))
                     If Len(s1) = 1 Then s2 = "[0000000" & s1 & "]"
                     If Len(s1) = 2 Then s2 = "[000000" & s1 & "]"
                     If Len(s1) = 3 Then s2 = "[00000" & s1 & "]"
                     If Len(s1) = 4 Then s2 = "[0000" & s1 & "]"
                     If Len(s1) = 5 Then s2 = "[000" & s1 & "]"
                     If Len(s1) = 6 Then s2 = "[00" & s1 & "]"
                     If Len(s1) = 7 Then s2 = "[0" & s1 & "]"
                     If Len(s1) >= 8 Then s2 = "[" & s1 & "]"                    
                     LRCgeci(Trim(Str(FileCount))) = Trim(s2 & Mid(MyValue, i * TimeLabelLength + 1, Len(MyValue) - (i * TimeLabelLength)))  'i代表时间标签的个数                    
                     FileCount = FileCount + 1
                 Next
                
                
              End If
          Loop
          iDimention = FileCount - 1
          Close #FileNumber
         
          '冒泡排序
          For i = 0 To FileCount - 2
              For j = 0 To FileCount - 2 - i
                  If Val(Mid(LRCgeci(j), 2, 8)) > Val(Mid(LRCgeci(j + 1), 2, 8)) Then
                     sRow = LRCgeci(j)
                     LRCgeci(j) = LRCgeci(j + 1)
                     LRCgeci(j + 1) = sRow
                  End If
              Next j
          Next i
         
       Else
          LyricsAlalysys = False
       End If     
      
End Function 

 

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •