chenjl1031ID:chenjl1031
2204次访问,排名2万外好友14人,关注者67
chenjl1031的文章
原创 6 篇
翻译 0 篇
转载 3 篇
评论 4 篇
最近评论
Chen8013:学习一个啦!

^_^
CJMF_001:谢谢你的分享,再去看一下我的帖子好吗?谢谢!
myjian:Line Input #FileNumber, MyValue '读取一行歌词到变量MyValue

//

不建议这样...反正文件很小,不如一次性读入内存,然后整个分析过程就在内存里面完成...
fly612:好东西,谢谢你的分享
文章分类
    收藏
      相册
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 LRC歌词分析函数收藏

      新一篇: PictureBox控件作播放时间进度条演示,不会闪烁,并且和Slider控件同步 | 旧一篇: 搜索音乐CD及VCD、DVD影碟的完整类模块

      特别声明:转载请用IP地址链接,严禁原文转载!

      发布我的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 

       

      发表于 @ 2007年12月20日 12:49:00|评论(loading...)|编辑

      新一篇: PictureBox控件作播放时间进度条演示,不会闪烁,并且和Slider控件同步 | 旧一篇: 搜索音乐CD及VCD、DVD影碟的完整类模块

      评论

      #myjian 发表于2007-12-21 15:23:19  IP: 117.45.197.*
      Line Input #FileNumber, MyValue '读取一行歌词到变量MyValue

      //

      不建议这样...反正文件很小,不如一次性读入内存,然后整个分析过程就在内存里面完成...
      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © chenjl1031(东方之珠)