รูปแบบไฟล์ CUR ของ nick karaoke


อยากเขียนโปรแกรมสำหรับร้องเพลงคาราโอเกะบนลีนุกมานานแย้ว
แต่พบว่า ไฟล์ cur ของ nick karaoke นี่มัน มัน มัน
มันไม่เป็นมาตรฐาน คือ เมืองนอกเขามักใช้ไฟล์ .kar กัน
แต่ใน nick ใช้ .cur กับ .lyr แทน
หาแทบตายว่า cur มันเก็บข้อมูลยังไง โชคดีไปเจอมา
จดไว้ จดไว้
//////////// ข้อความจากเว็บของ Nick karaoke

How to Read .CUR, .LYR, .MID
  • .CUR เป็น MIDI Time Step ที่ผมออกแบบไว้เอง เป็น ข้อมูลแบบ WORD ( 2 Byte ) ต่อกันในแบบ Binary ไฟล์ เป็น Step ที่มีการลาก
    หรือ ปาดเนื้อเพลง เวลาอ่านค่าจาก ไฟล์ ต้องอ่าน มา 2 Byte ต่อกัน
  • โปรแกรมตัวอย่างข้างล่างนี้ จะดึงข้อมูลมาทีละ Byte แล้วมาต่อกัน เป็นค่าเวลา แล้วเก็บในตัวแปร ที่เตรียมไว้ในแบบ Array

  • ุกครั้งที่มีการเลื่อนของตัวอักษร ที่เลือกว่าปาดเนื้อเพลง โปรแกรม
    Karaoke จะเก็บค่าเวลาลงใน File นี้ ดดยดูว่า ณขณะนั้น MIDI Time
    เป็นเท่าไร
  • เวลาที่โปรแกรม karaoke เล่นเพลง ก็จะคอย ตรวจเวลาใน MCI
    ว่าถึงเวลาที่ต้องปาดเนื้อไปที่ตัวอักษรต่อไปหรือยัง
    โดยเปรัยบเทียบกับค่าใน CUR นี้
  • การปาดเนื้อจะนัดทุกตัวอักษร สระ และรวมนับการขึ้นบรรทัดด้วย
    เช่นมีเพลงที่เนื้อเพลง 10 บรรทัด 250 ตัวอักษร จะมี CUR ประมาณ 250+10 (
    ไม่รวม 4 บรรทัดแรก )
  • .LYR เป็o Text ไฟล์ธรรมดา บรรทัดที่ 1 เก็บชื่อเพลง,
    บรรทัดที่ 2 เก็บชื่อศิลปิน , บรรทัดที่ 3 เก็บ Key เพลง , บรรทัดที่ 4
    ไม่ใช้, บรรทัดที่ 5 – บรรทัดสุดท้าย เป็นเนื้อเพลง เมื่อประกอบกับ MIDI
    ก็จะเป็น KARAOKE , MIDI ไม่ต้องทำอะไรมาก ใช้ WINMCI
    เปิดก็จะใช้ได้เลยครับ สำหรับวิธีเปิด .CUR, .LYR ผมได้คัดลอก Code
    ให้มาลองดูเป็นตัวอย่างข้างล่างนี้แล้ว เพื่อจะได้เป็นประโยชน์กับ
    บางท่านที่สนใจในการเปิดอ่านไฟล์เหล่านี้ เขียนไว้เป็น VB นะครับ
    เป็นตัวอย่างเล็กๆ ที่ ใช้อ่านไฟล์ มาเก็บไว้ในตัวแปร Array ไว้

    Indent อาจจะไม่ดีนะครับ เพราะผมไม่ได้ใส่ Space ให้

    Sub LoadCursor()

    ‘— Load Cursor

    ตัวแปร Tmpb1, Tmpb1 เป็น Byte อ่าน Data จาก CUR ที่ละ Byte มาประกอบกันเป็น WORD

    Dim Tmpb1 as byte, tmpb2 as Byte

    ReDim Cursor(0) ‘เตรียม Array สำหรับเก็บค่าเวลา

    filenum = FreeFile ‘เตรียมเปิด File ดดยกำหนดเลขที่ไฟล์ว่าง

    Open CursorPath & “\” & SongStr & “.cur” For Random As filenum Len = 1

    totalLine = 0

    If Err = 0 Then

    Do Until EOF(filenum)

    Get filenum, , tmpb1 ‘Byte ที่ 1

    Get filenum, , tmpb2 ‘Byte ที่ 2

    If Not (Asc(tmpb2) = 255) Then ‘ท้ายไฟล์ Byte ที่เป็นเลขคู่ จะมีค่าเป็น &HFF

    ReDim Preserve Cursor(totalLine + 1) ‘ขยาย Array สำหรับเก็บค่าเวลา

    ‘ใส่ ASC
    เพื่อถอดค่าที่อ่านมาได้เป็นตัวเลข เพราะค่า Byte ที่อ่านมาได้จะเป็น
    ตัวอักษรขนาด 1 Byte แล้วคูณด้วย 256 หรือ Shift 16 Bit

    Cursor(totalLine) = Asc(tmpb1) + Asc(tmpb2) * 256

    totalLine = totalLine + 1

    End If

    Loop

    Close #filenum

    End If

    End Sub

    Sub LoadLyrics()

    ‘— Load Lyrics

    filenum = FreeFile

    Open LyricPath & “\” & SongStr & “.lyr” For Input As filenum

    totalLine = 0

    repi = -1

    If Err = 0 Then

    Do Until EOF(filenum)

    ReDim Preserve Lyric(totalLine + 1)

    Line Input #filenum, tmpstr

    Lyric(totalLine) = tmpstr

    totalLine = totalLine + 1

    Loop

    Close #filenum

    End If

    End Sub

  • // จะได้มีกำลังใจลองทำซักทีโปรแกรมคาราโอเกะ ฮา ฮา ฮ่า

    2 thoughts on “รูปแบบไฟล์ CUR ของ nick karaoke

    1. MIDI Time = เวลาที่เริ่มเล่นเพลงจนจบ หน่วยเป็น วินาที
      Tempo = ความช้า-เร็วของเพลง หน่วยเป็น Beats per minute (BPM)
      ถ้าใช้ bassmidi.dll ต้องใช้ 60,000,000 microseconds in a minute. เป็นตัวตั้ง แล้วใช้ค่าที่ถอดมาหาร
      CurTime = ค่าเวลาที่ อ.อุทัย ใช้ในการเก็บข้อมูลไฟล์ .cur สำหรับใช้งานกับ NCN Pro
      24 = MIDI clocks in each quarter note ค่าทั่วไปของไฟล์มาตรฐาน MIDI
      60 = คิดที่ค่าเวลาต่อนาที (60 วินาที่)

      สูตร CurTime = MIDI Time * Tempo * 24 / 60

    2. Option Explicit

      Private Declare Function SendMessage Lib “USER32″ Alias “SendMessageA” (ByVal hWnd As Long, _
      ByVal wMsg As Long, ByVal wParam As Long, lparam As Any) As Long

      Private Type RECT
      Left As Long
      top As Long
      Right As Long
      Bottom As Long
      End Type

      Const CCM_FIRST = &H2000
      Const CCM_SETBKCOLOR = (CCM_FIRST + 1)
      Const SB_SETBKCOLOR = CCM_SETBKCOLOR
      Const PBM_SETBKCOLOR = CCM_SETBKCOLOR
      Const WM_USER = &H400
      Const PBM_SETBARCOLOR = (WM_USER + 9)

      Const PI = 3.14159265

      Dim fx(10) As Long
      Dim p As BASS_DX8_PARAMEQ
      Dim k As Integer, mVol As Integer
      Dim Cursor() As Long, Lyric() As String
      Dim CursorX As Single, CursorY As Single
      Dim playTime As Double, curTime As Double
      Dim NewSFont As Long, b As Single
      Dim Tempo As Single, lenTime As Long

      Private Sub Form_Load()
      Dim IngResult As Long

      IngResult = SendMessage(StatusBar1.hWnd, SB_SETBKCOLOR, 0, ByVal RGB(50, 200, 50))
      IngResult = SendMessage(ProgressBar1.hWnd, PBM_SETBKCOLOR, 0, ByVal RGB(0, 205, 180))
      IngResult = SendMessage(ProgressBar2.hWnd, PBM_SETBKCOLOR, 0, ByVal RGB(0, 205, 180))
      IngResult = SendMessage(ProgressBar1.hWnd, PBM_SETBARCOLOR, 0, ByVal RGB(255, 0, 0))
      IngResult = SendMessage(ProgressBar2.hWnd, PBM_SETBARCOLOR, 0, ByVal RGB(255, 0, 0))

      Frame1.top = Screen.Height – Frame1.Height – 800
      Frame2.top = Frame1.top
      Frame3.top = Frame1.top
      File1.top = Frame1.top
      File1.Left = Screen.Width – File1.Width – 100
      File1.Height = Frame1.Height
      sldPosition.top = Screen.Height – sldPosition.Height – 800
      sldPosition.Left = Frame1.Width + Frame2.Width + Frame3.Width + 500
      Frame4.top = Frame1.top
      Frame4.Left = sldPosition.Left
      Picture1.BackColor = RGB(0, 100, 180)
      Picture1.Left = 0
      Picture1.top = 1400
      Picture1.Width = Screen.Width
      Picture1.Height = Screen.Height – 2400 – Frame1.Height
      List1.top = 100
      List1.Left = Screen.Width – List1.Width – 100
      Command1.top = sldPosition.top – Command1.Height – 100
      Command2.top = Command1.top
      Command3.top = Command1.top
      Command1.Left = sldPosition.Left
      Command2.Left = sldPosition.Left + Command1.Width + 20
      Command3.Left = sldPosition.Left + sldPosition.Width – Command3.Width

      NewSFont = BASS_MIDI_FontInit(App.Path & “\SoundFont\WSF_User Bank_Mini.SF2″, 0)
      If (NewSFont And NewSFont Font_) Then
      Dim sf As BASS_MIDI_FONT
      sf.font = NewSFont
      sf.preset = -1 ‘ use all presets
      sf.bank = 0 ‘ use default bank(s)

      Call BASS_MIDI_StreamSetFonts(0, sf, 1) ‘ set default soundfont
      Call BASS_MIDI_StreamSetFonts(chan, sf, 1) ‘ set for current stream too
      Call BASS_MIDI_FontFree(Font_) ‘ free old soundfont

      Font_ = NewSFont
      End If

      Option1.value = True
      File1.Path = App.Path & “\NCN\Song”
      File1.Pattern = “*.mid”
      File2.Path = App.Path & “\SoundFont”
      File2.Visible = False
      For k = 0 To File2.ListCount – 1
      Combo1.AddItem File2.List(k)
      Next k

      End Sub

      Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
      If Button = 2 Then Me.PopupMenu mnuPopup
      End Sub

      Private Sub Form_Unload(Cancel As Integer)
      Dim Response

      Response = MsgBox(“·èÒ¹µéͧ¡ÒÃÍÍ¡¨Ò¡â»Ãá¡ÃÁãªèËÃ×ÍäÁè?”, vbQuestion + vbYesNo, “SF KaraOKE”)
      If Response = vbYes Then
      Call BASS_ChannelStop(chan)
      Call BASS_Free ‘ free BASS
      Call BASS_PluginFree(0)
      End If
      End Sub

      Private Sub Form_Initialize()
      ‘ change and set the current path, to prevent from VB not finding BASS.DLL
      ChDrive App.Path
      ChDir App.Path

      ‘ check the correct BASS was loaded
      If (HiWord(BASS_GetVersion) BASSVERSION) Then
      Call MsgBox(“An incorrect version of BASS.DLL was loaded”, vbCritical)
      End
      End If

      ‘ setup output – default device, 44100hz, stereo, 16 bits
      If (BASS_Init(-1, 44100, 0, Me.hWnd, 0) = 0) Then
      Call Error_(“Can’t initialize device”)
      End
      End If

      ‘ get default font (ct4mgm.sf2/ct2mgm.sf2 if available)
      Dim sf As BASS_MIDI_FONT
      If (BASS_MIDI_StreamGetFonts(0, sf, 1)) Then Font_ = sf.font

      ‘ load optional plugins for packed soundfonts (others may be used too)
      Call BASS_PluginLoad(“bassflac.dll”, 0)
      Call BASS_PluginLoad(“basswv.dll”, 0)

      End Sub

      Private Sub Combo1_Click()
      NewSFont = BASS_MIDI_FontInit(App.Path & “\SoundFont\” & Combo1.text, 0)
      If (NewSFont And NewSFont Font_) Then
      Dim sf As BASS_MIDI_FONT
      sf.font = NewSFont
      sf.preset = -1 ‘ use all presets
      sf.bank = 0 ‘ use default bank(s)

      Call BASS_MIDI_StreamSetFonts(0, sf, 1) ‘ set default soundfont
      Call BASS_MIDI_StreamSetFonts(chan, sf, 1) ‘ set for current stream too
      Call BASS_MIDI_FontFree(Font_) ‘ free old soundfont

      Font_ = NewSFont
      End If
      End Sub

      Private Sub Command1_Click()
      Call BASS_ChannelPlay(chan, BASSFALSE)
      End Sub

      Private Sub Command2_Click()
      Call BASS_ChannelStop(chan)
      Command1.SetFocus
      End Sub

      Private Sub Command3_Click()
      Dim Response

      Response = MsgBox(“·èÒ¹µéͧ¡ÒÃÍÍ¡¨Ò¡â»Ãá¡ÃÁãªèËÃ×ÍäÁè?”, vbQuestion + vbYesNo, “SF KaraOKE”)
      If Response = vbYes Then
      Call BASS_ChannelStop(chan)
      Call BASS_Free ‘ free BASS
      Call BASS_PluginFree(0)
      End
      End If
      End Sub

      Private Sub File1_Click()
      Picture1.Cls

      tmrMidiTest.Enabled = True
      tmrMidiTest.Interval = 1

      Call BASS_StreamFree(chan) ‘ free old stream before opening new
      lblLyrics.Caption = “” ‘ clear lyrics display

      chan = BASS_MIDI_StreamCreateFile(BASSFALSE, StrPtr(File1.Path & “\” & File1.filename), 0, 0, BASS_STREAM_AUTOFREE Or IIf(chkFX.value, 0, BASS_MIDI_NOFX), 0)

      If Option1.value = True Then Call Read_NCN
      If Option3.value = True Then Call Read_RMS

      ‘ it ain’t a MIDI
      If chan = 0 Then
      lblTitle.Caption = “”
      Call Error_(“Can’t play the file”)
      Exit Sub
      End If

      mVol = BASS_MIDI_StreamGetEvent(chan, 8, MIDI_EVENT_VOLUME)

      lenTime = BASS_ChannelBytes2Seconds(chan, BASS_ChannelGetLength(chan, BASS_POS_BYTE))

      sldPosition.max = lenTime
      sldPosition.value = 0

      For k = 0 To 9
      fx(k) = BASS_ChannelSetFX(chan, BASS_FX_DX8_PARAMEQ, 0)
      Next k
      p.fGain = 0
      p.fBandwidth = 18
      Call UpdateEQ

      ‘ clear lyrics buffer and set lyrics syncs
      Lyrics = Empty

      Dim mark As BASS_MIDI_MARK
      If (BASS_MIDI_StreamGetMark(chan, BASS_MIDI_MARK_LYRIC, 0, mark)) Then ‘ got lyrics
      Call BASS_ChannelSetSync(chan, BASS_SYNC_MIDI_LYRIC, 0, AddressOf LyricSync, BASS_MIDI_MARK_LYRIC)
      ElseIf (BASS_MIDI_StreamGetMark(chan, BASS_MIDI_MARK_TEXT, 20, mark)) Then ‘ got text instead (over 20 of them)
      Call BASS_ChannelSetSync(chan, BASS_SYNC_MIDI_TEXT, 0, AddressOf LyricSync, BASS_MIDI_MARK_TEXT)
      End If

      Label2.Caption = BASS_MIDI_StreamGetMark(chan, BASS_MIDI_MARK_TIMESIG, 3, mark) & “/” & BASS_MIDI_StreamGetMark(chan, BASS_MIDI_MARK_KEYSIG, 0, mark)

      Call BASS_ChannelSetSync(chan, BASS_SYNC_END, 0, AddressOf EndSync, 0)
      Call BASS_ChannelPlay(chan, BASSFALSE)

      If Option1.value = True Then
      b = 0
      CursorX = 0
      CursorY = 3
      End If

      End Sub

      ‘ display error dialogs
      Sub Error_(ByVal es As String)
      Call MsgBox(es & vbCrLf & vbCrLf & “(error code: ” & BASS_ErrorGetCode & “)”, vbExclamation, “Error”)
      End Sub

      Private Sub chkFX_Click()
      If (chkFX.value = vbChecked) Then
      Call BASS_ChannelFlags(chan, 0, BASS_MIDI_NOFX) ‘ Enable FX
      Else
      Call BASS_ChannelFlags(chan, BASS_MIDI_NOFX, BASS_MIDI_NOFX) ‘ Disable FX
      End If
      End Sub

      Private Sub btnReplace_Click()
      On Local Error Resume Next ‘ in case Cancel was pressed

      CMD.CancelError = True
      CMD.flags = cdlOFNExplorer Or cdlOFNFileMustExist Or cdlOFNHideReadOnly
      CMD.filter = “Soundfonts (sf2/sf2pack)|*.sf2*.sf2pack|All files|*.*”
      CMD.ShowOpen

      ‘ if cancel was pressed, exit the procedure
      If Err.Number = 32755 Then Exit Sub

      NewSFont = BASS_MIDI_FontInit(App.Path & “\Rock11e.sf2″, 0)
      If (NewSFont And NewSFont Font_) Then
      Dim sf As BASS_MIDI_FONT
      sf.font = NewSFont
      sf.preset = -1 ‘ use all presets
      sf.bank = 0 ‘ use default bank(s)

      Call BASS_MIDI_StreamSetFonts(0, sf, 1) ‘ set default soundfont
      Call BASS_MIDI_StreamSetFonts(chan, sf, 1) ‘ set for current stream too
      Call BASS_MIDI_FontFree(Font_) ‘ free old soundfont

      Font_ = NewSFont
      End If
      End Sub

      Private Sub frameLyrics_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
      Combo1.Visible = False
      End Sub

      Private Sub frameSoundfont_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
      Combo1.Visible = True
      End Sub

      Private Sub mnuAbout_Click()
      MsgBox “µÑÇÍÂèÒ§¡ÒÃÍèÒ¹¤èÒàÇÅÒ¨Ò¡ NCN Karaoke Pro” & vbCrLf & “CurTime = MidTime * Tempo * 24 / 60″ & vbCrLf & vbCrLf & Space(50) & “kxth10@gmail.com”, vbExclamation + vbOKOnly, “SF KaraOKE”
      End Sub

      Private Sub mnuExit_Click()
      Dim Response

      Response = MsgBox(“·èÒ¹µéͧ¡ÒÃÍÍ¡¨Ò¡â»Ãá¡ÃÁãªèËÃ×ÍäÁè?”, vbQuestion + vbYesNo, “SF KaraOKE”)
      If Response = vbYes Then
      Call BASS_ChannelStop(chan)
      Call BASS_Free ‘ free BASS
      Call BASS_PluginFree(0)
      End
      End If

      End Sub

      Private Sub Option1_Click()
      File1.Path = App.Path & “\NCN\Song”
      File1.Pattern = “*.mid”
      Picture1.Visible = True
      End Sub

      Private Sub Option2_Click()
      File1.Path = App.Path & “\KAR”
      File1.Pattern = “*.kar”
      Picture1.Visible = False
      End Sub

      Private Sub Option3_Click()
      File1.Path = App.Path & “\RMS”
      File1.Pattern = “*.mid”
      Picture1.Visible = True
      End Sub

      Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
      If Button = 2 Then Me.PopupMenu mnuPopup
      End Sub

      Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
      Combo1.Visible = False
      End Sub

      Private Sub sldPosition_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
      tmrMidiTest.Enabled = False
      End Sub

      Private Sub sldPosition_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

      Call BASS_ChannelSetPosition(chan, BASS_ChannelSeconds2Bytes(chan, sldPosition.value), BASS_POS_BYTE)

      Lyrics = “” ‘ clear lyrics
      lblLyrics.Caption = “”
      tmrMidiTest.Enabled = True
      End Sub

      Private Sub Slider1_Scroll(index As Integer)
      Call UpdateEQ
      Slider1(index).text = -1 * Slider1(index).value
      End Sub

      Private Sub UpdateEQ()
      If (BASS_ChannelIsActive(chan) = BASS_ACTIVE_PLAYING) Then
      p.fCenter = 85 ‘ bass [80hz]
      Call BASS_FXSetParameters(fx(0), p)
      p.fCenter = 125 ‘ bass [125hz]
      Call BASS_FXSetParameters(fx(1), p)
      p.fCenter = 250 ‘ bass [250hz]
      Call BASS_FXSetParameters(fx(2), p)
      p.fCenter = 500 ‘ midbass [500hz]
      Call BASS_FXSetParameters(fx(3), p)
      p.fCenter = 750 ‘ mid [800hz]
      Call BASS_FXSetParameters(fx(4), p)
      p.fCenter = 1000 ‘ mid [1khz]
      Call BASS_FXSetParameters(fx(5), p)
      p.fCenter = 3000 ‘ mid [3khz]
      Call BASS_FXSetParameters(fx(6), p)
      p.fCenter = 6000 ‘ midtreb [6khz]
      Call BASS_FXSetParameters(fx(7), p)
      p.fCenter = 11000 ‘ treb [12khz]
      Call BASS_FXSetParameters(fx(8), p)
      p.fCenter = 15900 ‘ treb [16khz]
      Call BASS_FXSetParameters(fx(9), p)
      For k = 0 To 9
      Call BASS_FXGetParameters(fx(k), p)
      p.fGain = 5 – Slider1(k).value
      Call BASS_FXSetParameters(fx(k), p)
      Next k
      End If
      End Sub

      Private Sub Slider2_Scroll(index As Integer)
      ‘ kick
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(35, 127 – Slider2(0).value))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(36, 127 – Slider2(0).value))
      ‘ snare
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(38, 127 – Slider2(1).value))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(40, 127 – Slider2(1).value))
      ‘ Tom
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(48, 127 – Slider2(2).value))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(50, 127 – Slider2(2).value))
      ‘ hi-hat
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(42, 127 – Slider2(3).value))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(44, 127 – Slider2(3).value))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(46, 127 – Slider2(3).value))
      ‘ cymbal
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(49, 127 – Slider2(4).value))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(52, 127 – Slider2(4).value))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(55, 127 – Slider2(4).value))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(57, 127 – Slider2(4).value))
      ‘ ride cymbal
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(51, 127 – Slider2(5).value))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_LEVEL, MakeWord(59, 127 – Slider2(5).value))

      Slider2(index).text = 127 – Slider2(index).value
      End Sub

      Function MakeWord(LoByte As Byte, HiByte As Byte) As Integer
      If HiByte And &H80 Then
      MakeWord = ((HiByte * &H100&) + LoByte) Or &HFFFF0000
      Else
      MakeWord = (HiByte * &H100) + LoByte
      End If
      End Function

      Private Sub Slider3_Scroll()
      Call BASS_SetVolume((127 – Slider3.value) / 127)
      Slider3.text = 127 – Slider3.value
      Label5.Caption = Slider3.text
      End Sub

      Private Sub tmrMidiTest_Timer()
      On Error Resume Next

      If Check2.value = 1 Then
      Call BASS_MIDI_StreamEvent(chan, 0, MIDI_EVENT_MASTERVOL, 0)
      Else
      Call BASS_MIDI_StreamEvent(chan, 0, MIDI_EVENT_MASTERVOL, (127 – Slider3.value) * 16383 / 127)
      End If

      sldPosition.value = BASS_ChannelBytes2Seconds(chan, BASS_ChannelGetPosition(chan, BASS_POS_BYTE)) ‘ update position

      If (BASS_ChannelIsActive(chan) = BASS_ACTIVE_PLAYING) Then
      Tempo = 60000000 \ BASS_MIDI_StreamGetEvent(chan, 0, MIDI_EVENT_TEMPO)
      ProgressBar1.value = LoWord(BASS_ChannelGetLevel(chan)) ‘ Left Level
      ProgressBar2.value = HiWord(BASS_ChannelGetLevel(chan)) ‘ Right Level
      Label9.Caption = “Tempo ” & Tempo & ” BPM.”

      If Check1.value = 1 Then
      Call BASS_MIDI_StreamEvent(chan, 8, MIDI_EVENT_VOLUME, 0)
      Else
      Call BASS_MIDI_StreamEvent(chan, 8, MIDI_EVENT_VOLUME, mVol)
      End If

      Call UpdateEQ

      Dim text As String
      text = “no soundfont”

      Dim i As BASS_MIDI_FONTINFO
      If (BASS_MIDI_FontGetInfo(Font_, i)) Then
      text = “Name : ” & VBStrFromAnsiPtr(i.name) & vbCrLf & “Loaded : ” & i.samload & ” / ” & i.samsize
      End If
      lblSoundfont.Caption = text

      playTime = BASS_ChannelBytes2Seconds(chan, BASS_ChannelGetPosition(chan, BASS_POS_BYTE))
      curTime = Int(playTime * Tempo * 24 / 60) ‘ Cursor(b) Then

      CursorX = CursorX + 1
      b = b + 1
      dY = Picture1.Height * 2 / 5
      fSize = Picture1.Width \ 250
      Picture1.font = “EucrosiaUPC”
      Picture1.FontSize = fSize
      Picture1.ForeColor = RGB(255, 255, 255)
      Picture1.FontBold = True
      Picture1.CurrentY = dY
      Picture1.CurrentX = (Picture1.Width – Picture1.TextWidth(Lyric(CursorY))) / 2
      Picture1.Print Lyric(CursorY)

      Picture1.FontSize = fSize – 10
      Picture1.CurrentY = dY + Picture1.FontSize * 28
      Picture1.CurrentX = (Picture1.Width – Picture1.TextWidth(Lyric(CursorY + 1))) / 2
      Picture1.Print Lyric(CursorY + 1)

      Dim c As Integer
      For c = 1 To 90 Step 10
      Picture1.FontSize = fSize
      Picture1.ForeColor = RGB(0, 0, 0)
      Picture1.CurrentY = dY + c
      Picture1.CurrentX = ((Picture1.Width / 2) – ((Picture1.TextWidth(Lyric(CursorY)) / 2) + (Picture1.TextWidth(Lyric(CursorY)) / 2)) + (Picture1.TextWidth(Lyric(CursorY)) / 2)) + c
      Picture1.Print Left$(Lyric(CursorY), CursorX + 1)
      Next c
      For c = 1 To 360 Step 18
      Picture1.FontSize = fSize
      Picture1.ForeColor = RGB(0, 255, 0)
      Picture1.CurrentY = dY + 3 * 300 * Sin(c) * PI / 180
      Picture1.CurrentX = ((Picture1.Width / 2) – ((Picture1.TextWidth(Lyric(CursorY)) / 2) + (Picture1.TextWidth(Lyric(CursorY)) / 2)) + (Picture1.TextWidth(Lyric(CursorY)) / 2)) + 3 * 300 * Cos(c) * PI / 180
      Picture1.Print Left$(Lyric(CursorY), CursorX + 1)
      Next c

      Picture1.FontSize = fSize
      Picture1.CurrentY = dY
      Picture1.ForeColor = RGB(255, 50, 50)
      Picture1.CurrentX = ((Picture1.Width / 2) – ((Picture1.TextWidth(Lyric(CursorY)) / 2) + (Picture1.TextWidth(Lyric(CursorY)) / 2)) + (Picture1.TextWidth(Lyric(CursorY)) / 2))
      Picture1.Print Left$(Lyric(CursorY), CursorX + 1)

      List1.ListIndex = List1.ListIndex + 1

      If CursorX = Len(Lyric(CursorY)) + 1 Then
      CursorY = CursorY + 1

      Picture1.AutoRedraw = True
      Picture1.Cls
      Picture1.FontSize = fSize – 50
      Picture1.CurrentY = 400
      Picture1.CurrentX = 500
      Picture1.Print Lyric(0) & ” -> ” & Lyric(1)

      Picture1.FontBold = True
      Picture1.FontSize = fSize
      Picture1.ForeColor = RGB(255, 255, 255)
      Picture1.FontBold = True
      Picture1.CurrentY = dY
      Picture1.CurrentX = (Picture1.Width – Picture1.TextWidth(Lyric(CursorY))) / 2
      Picture1.Print Lyric(CursorY)

      Picture1.FontSize = fSize – 10
      Picture1.CurrentY = dY + Picture1.FontSize * 28
      Picture1.CurrentX = (Picture1.Width – Picture1.TextWidth(Lyric(CursorY + 1))) / 2
      Picture1.Print Lyric(CursorY + 1)

      CursorX = 0

      End If

      End If

      StatusBarProgress StatusBar1, 1, (10000 * playTime / lenTime) / 100
      StatusBar1.Panels(1).text = Format((10000 * playTime / lenTime) / 100, “##0.0″) & “%”
      Label6.Caption = playTime \ 60 & “:” & Format(playTime Mod 60, “00″)
      Label8.Caption = Space(2) & lenTime \ 60 & “:” & Format(lenTime Mod 60, “00″) & Space(2)
      StatusBar1.Panels(2).text = “Cursor Time = MIDI Time (sec) * Tempo * 24 / 60″ & ” —> ” & curTime & ” = ” & Format(BASS_ChannelBytes2Seconds(chan, BASS_ChannelGetPosition(chan, BASS_POS_BYTE)), “##.##”) & ” * ” & Tempo & ” * 24 / 60″

      ‘ Snare tune
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_COARSETUNE, MakeWord(38, 64 + Slider4.value))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_COARSETUNE, MakeWord(40, 64 + Slider4.value))
      ‘ Snare Reverb
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_REVERB, MakeWord(38, Slider5.value))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_REVERB, MakeWord(40, Slider5.value))

      ‘—————— Drum Pan ————————————————
      ‘ kick
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(35, 64))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(36, 64))
      ‘ snare
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(38, 44))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(40, 44))
      ‘ tom
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(41, 122))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(43, 122))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(45, 94))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(47, 94))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(48, 5))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(50, 44))
      ‘ hi-hat
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(42, 44))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(44, 44))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(46, 44))
      ‘ cymbal
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(49, 122))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(55, 24))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(49, 122))
      ‘ ride
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(51, 94))
      Call BASS_MIDI_StreamEvent(chan, 9, MIDI_EVENT_DRUM_PAN, MakeWord(59, 94))

      End If

      If (BASS_ChannelIsActive(chan) = BASS_ACTIVE_STOPPED) Then
      Call BASS_MIDI_StreamEvent(chan, 0, MIDI_EVENT_RESET, 0)
      End If

      End Sub

      ‘ get file name from file path
      Function GetFileName(ByVal fp As String) As String
      GetFileName = Mid(fp, InStrRev(fp, “\”) + 1)
      End Function

      Private Sub Read_NCN()
      Dim Byte1 As Byte, Byte2 As Byte, i As Single, j As Integer, z As Single, n As Single

      On Error Resume Next

      ‘Read Cursor file
      i = 0
      Open App.Path & “\NCN\Cursor\” & Left(File1.filename, Len(File1.filename) – 4) & “.cur” For Random As #1 Len = 1
      Do While Not EOF(1)
      Get #1, , Byte1
      Get #1, , Byte2
      If Not Byte2 = 255 Then
      ReDim Preserve Cursor(i)
      Cursor(i) = Byte1 + Byte2 * 256
      i = i + 1
      End If
      Loop
      Close #1

      ‘Read Lyric file
      i = 0
      Open App.Path & “\NCN\Lyrics\” & Left(File1.filename, Len(File1.filename) – 4) & “.lyr” For Input As #2
      Do While Not EOF(2)
      ReDim Preserve Lyric(i)
      Line Input #2, Lyric(i)
      i = i + 1
      Loop
      Close #2

      ‘ add lyric & curtime to listbox
      z = 0
      List1.Clear
      For i = 4 To UBound(Cursor)
      For j = 0 To Len(Lyric(i))
      If j = 0 Then
      List1.AddItem Space(10) & “/” & vbTab & ” : ” & Cursor(z)
      z = z + 1
      Else
      List1.AddItem Space(10) & Mid(Lyric(i), j, 1) & vbTab & ” : ” & Cursor(z)
      z = z + 1
      End If
      Text1.text = Text1.text & vbCrLf & Cursor(z)
      Next j
      Next i
      List1.ListIndex = 0
      End Sub

      Private Sub Read_RMS()
      Dim Byte1 As Byte, Byte2 As Byte, i As Single, j As Integer, z As Single
      Dim tmpLyr As String, Lyr As String
      Dim tmpCur As String, Cur As String
      Dim Bytes() As Byte, fileLength As Long

      On Error Resume Next

      Dim MidiTxt As String
      Dim b As Single, cn As Single
      Dim tmp1 As Single, k As Single

      ‘Read Cursor

      Open App.Path & “\RMS\” & Left(File1.filename, Len(File1.filename) – 4) & “.mid” For Binary As #1
      MidiTxt = Space(LOF(1))
      Get #1, , MidiTxt
      Close #1

      List3.Clear
      k = InStr(1, MidiTxt, “Cursor”) + 14
      k = InStr(k, MidiTxt, Chr(&H2) + Chr(&H1)) + 2
      For b = k To Len(MidiTxt) Step 6
      If Asc(Mid(MidiTxt, b, 1)) > 2 Then
      If b = k Then
      List3.AddItem Asc(Mid(MidiTxt, b, 1))
      tmp1 = Asc(Mid(MidiTxt, b, 1))
      Else
      List3.AddItem Asc(Mid(MidiTxt, b, 1)) + tmp1
      tmp1 = Asc(Mid(MidiTxt, b, 1)) + tmp1
      End If
      Text1.text = Text1.text & vbCrLf & List3.List(List3.ListCount – 1)
      End If
      Next b
      cn = 0
      For k = 0 To List3.ListCount – 1
      ReDim Preserve Cursor(cn + 2)
      Cursor(cn) = Int(Val(List3.List(k)) / 4) Mod 256
      Cursor(cn + 1) = Int(Val(List3.List(k)) / 4) \ 256
      cn = cn + 2
      Next k

      ‘Read Lyric file
      i = 0
      List2.Clear
      Open App.Path & “\RMS\” & Left(File1.filename, Len(File1.filename) – 4) & “.txt” For Input As #2
      Do While Not EOF(2)
      Line Input #2, tmpLyr
      List2.AddItem tmpLyr
      Loop
      Close #2

      Dim m As Integer, tmpTxt As String
      For m = 4 To List2.ListCount – 1
      ReDim Preserve Lyric(i)
      If (m > 10) And (List2.List(m) = “”) Then Exit Sub
      tmpTxt = Replace(List2.List(m), “(“, “”)
      tmpTxt = Replace(tmpTxt, “)”, “”)
      If i = 0 Then
      If Len(List2.List(3)) > 2 Then
      Lyric(0) = tmpTxt & ” ( ” & Trim(Mid(List2.List(3), 3, 4)) & ” )”
      Else
      Lyric(0) = tmpTxt
      End If
      ElseIf i = 2 Then
      Lyric(2) = Trim(Mid(List2.List(3), 3, 4))
      Else
      Lyric(i) = tmpTxt
      End If
      i = i + 1
      Next m

      ‘ add lyric & curtime to listbox
      z = 0
      List1.Clear
      For i = 0 To UBound(Lyric)
      For j = 0 To Len(Lyric(i))
      If j = 0 Then
      List1.AddItem Space(10) & “/” & vbTab & ” : ” & Cursor(z)
      z = z + 1
      Else
      List1.AddItem Space(10) & Mid(Lyric(i), j, 1) & vbTab & ” : ” & Cursor(z)
      z = z + 1
      End If
      Next j
      Next i
      List1.ListIndex = 0

      End Sub

      Function StatusBarProgress(sbStatus As StatusBar, vPannel As Variant, ByVal lPercentComplete As Long, Optional lColor As OLE_COLOR = vbBlue) As Boolean

      Const WM_USER = &H400, SB_GETRECT = (WM_USER + 10)
      Dim tRect As RECT, fPercent As Single, lLenBar As Long
      Static oPict As PictureBox

      On Error GoTo ErrFailed
      If oPict Is Nothing Then
      ‘Create a hidden image on the form
      Set oPict = sbStatus.Parent.Controls.Add(“VB.PictureBox”, “DynamicPictureBox”)
      oPict.AutoRedraw = True
      End If

      fPercent = lPercentComplete / 100

      ‘Get the panel coordinates
      SendMessage sbStatus.hWnd, SB_GETRECT, sbStatus.Panels(vPannel).index – 1, tRect

      With oPict
      ‘Resize image
      lLenBar = fPercent * (tRect.Right – tRect.Left + 2) * Screen.TwipsPerPixelX
      .Move 0, 0, lLenBar, (tRect.Bottom – tRect.top + 1) * Screen.TwipsPerPixelY
      ‘Set the image backcolor
      .BackColor = lColor
      ‘Set the panels image to the picture box image
      sbStatus.Panels(vPannel).AutoSize = sbrNoAutoSize
      Set sbStatus.Panels(vPannel).Picture = .Image
      End With

      StatusBarProgress = True

      Exit Function

      ErrFailed:
      Debug.Print “Error in StatusBarProgress: ” & Err.Description
      Debug.Assert False
      StatusBarProgress = False

      End Function

    ใส่ความเห็น

    Fill in your details below or click an icon to log in:

    WordPress.com Logo

    You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

    Twitter picture

    You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

    Facebook photo

    You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

    Connecting to %s