อยากเขียนโปรแกรมสำหรับร้องเพลงคาราโอเกะบนลีนุกมานานแย้ว
แต่พบว่า ไฟล์ cur ของ nick karaoke นี่มัน มัน มัน
มันไม่เป็นมาตรฐาน คือ เมืองนอกเขามักใช้ไฟล์ .kar กัน
แต่ใน nick ใช้ .cur กับ .lyr แทน
หาแทบตายว่า cur มันเก็บข้อมูลยังไง โชคดีไปเจอมา
จดไว้ จดไว้
//////////// ข้อความจากเว็บของ Nick karaoke
|
หรือ ปาดเนื้อเพลง เวลาอ่านค่าจาก ไฟล์ ต้องอ่าน มา 2 Byte ต่อกัน ุกครั้งที่มีการเลื่อนของตัวอักษร ที่เลือกว่าปาดเนื้อเพลง โปรแกรม Karaoke จะเก็บค่าเวลาลงใน File นี้ ดดยดูว่า ณขณะนั้น MIDI Time เป็นเท่าไร ว่าถึงเวลาที่ต้องปาดเนื้อไปที่ตัวอักษรต่อไปหรือยัง โดยเปรัยบเทียบกับค่าใน CUR นี้ เช่นมีเพลงที่เนื้อเพลง 10 บรรทัด 250 ตัวอักษร จะมี CUR ประมาณ 250+10 ( ไม่รวม 4 บรรทัดแรก ) บรรทัดที่ 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 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 |
// จะได้มีกำลังใจลองทำซักทีโปรแกรมคาราโอเกะ ฮา ฮา ฮ่า
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
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