レコンポーザ形式ファイルをSMF形式に
<これでmciSendStringでの再生が可能に!!>
レコンポーザ形式ファイルとは? |
DOS時代からシーケンサーソフトの標準といわれるレコンポーザ特有のファイルフォーマット。拡張子は"rcp", "r16", "r32", "g16", "g32"などとなる。しかしWindowsは直接はこの形式のファイルをサポートしていないためmciSendStringなどで再生する場合はSMFファイル(拡張子が"mid"のファイル)に変換する必要がある。
必要なソフト |
ファイルを変換するためにTMIDIPlayerの作者として有名なふみぃさんのRCPCV.DLLを使用します。ふみぃさんのホームページ「ふみぃのソフトウェア工房」からダウンロードしておいてください。
宣 言 |
Declare Function rcpcvConvertFile Lib "rcpcv.dll" (ByVal FileName As String, ByVal callbackType As
Long, ByVal callback As Long, ByVal wMessage As Long, ByVal dwUser As Long) As Long Declare Sub rcpcvDeleteObject Lib "rcpcv.dll" (ByVal Handle As Long) Declare Function rcpcvSaveSMF Lib "rcpcv.dll" (ByVal HRCPCV As Long, ByVal FileName As String) As Long Declare Function rcpcvGetOriginalFileType Lib "rcpcv.dll" (ByVal HRCPCV As Long) As Long Declare Function rcpcvGetCopyright Lib "rcpcv.dll" () As Long Declare Function rcpcvGetVersionMajor Lib "rcpcv.dll" () As Long Declare Function rcpcvGetVersionMinor Lib "rcpcv.dll" () As Long |
サ ン プ ル プ ロ グ ラ ム |
まずフォームモジュールと標準モジュールを追加し以下のコードを張り付けて下さい。次にコマンドボタンと状況表示用のラベルをフォームに張り付けて下さい。そして実行してください。なお絶対にフォームのXボタンで終了するようにしてください。VB環境内の停止ボタンで終了すると、ページ違反が起こります。
動作確認:Visual Basic 5.0(Visual Basic 4.0では動作しません(AddressOfを使用)),Windows98
フォームモジュール(Form1) |
Option Explicit Private Declare Function rcpcvConvertFile Lib "rcpcv.dll" (ByVal FileName As String, ByVal callbackType As Long, ByVal callback As Long, ByVal wMessage As Long, ByVal dwUser As Long) As Long Private Declare Sub rcpcvDeleteObject Lib "rcpcv.dll" (ByVal Handle As Long) Private Declare Function rcpcvSaveSMF Lib "rcpcv.dll" (ByVal HRCPCV As Long, ByVal FileName As String) As Long Private Declare Function rcpcvGetOriginalFileType Lib "rcpcv.dll" (ByVal HRCPCV As Long) As Long Private Declare Function rcpcvGetVersionMajor Lib "rcpcv.dll" () As Long Private Declare Function rcpcvGetVersionMinor Lib "rcpcv.dll" () As Long Private Const RCPCV_FORMATTYPE_RCM20 = 1 Private Const RCPCV_FORMATTYPE_RCM25F = 2 Private Const RCPCV_FORMATTYPE_RCM25G = 3 Private Const RCPCV_FORMATTYPE_RCFW95 = 4 Private Function RCPConvert(rcpcvfile As String, midcvfile As String) As Long Dim cvhnd As Long, cvtype As Long cvhnd = rcpcvConvertFile(rcpcvfile, 1, Form1.hWnd, &HFFF, 0) cvtype = rcpcvGetOriginalFileType(cvhnd) rcpcvSaveSMF cvhnd, midcvfile rcpcvDeleteObject cvhnd RCPConvert = cvtype End Function Private Function RCPGetVersion() As String Dim mi As Long, ma As Long ma = rcpcvGetVersionMajor mi = rcpcvGetVersionMinor RCPGetVersion = Trim(Str(ma)) & "." & Trim(Str(mi)) End Function Private Sub Command1_Click() Dim rcp As String, mid As String Dim ret As Long rcp = InputBox("コンバートするRCPファイルを入力してください") mid = InputBox("コンバート先のMIDファイルを入力してください") ret = RCPConvert(rcp, mid) Select Case ret Case RCPCV_FORMATTYPE_RCM20 MsgBox "このファイルはRCM ver2.0 (RCP)" Case RCPCV_FORMATTYPE_RCM25F MsgBox "このファイルはRCM ver2.5F以前 (RCP,R36)" Case RCPCV_FORMATTYPE_RCM25G MsgBox "このファイルはRCM ver2.5G以後 (G36)" Case RCPCV_FORMATTYPE_RCFW95 MsgBox "このファイルはRCM for Windows 95 (G36)" Case Else MsgBox "ファイル読み込みエラー" End Select End Sub Private Sub Form_Load() StartMsg MsgBox RCPGetVersion, , "RCPCV.DLLのバージョン" End Sub Private Sub Form_Unload(Cancel As Integer) ExitMsg End Sub |
標準モジュール |
Option Explicit Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal PWF&, ByVal hWnd&, ByVal Msg&, ByVal wParam&, lParam As RCPCVDATA) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&) As Long Public Const GWL_WNDPROC = (-4) Dim oad As Long Public Type RCPCVDATA track As Long '変換中のトラック番号を示す tracks As Long 'トラック総数 percent As Long '進行状況 (0-99) dwUser As Long 'インスタンス判別用 End Type Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, lParam As RCPCVDATA) As Long Dim rets As String Select Case uMsg Case &HFFF Form1.Label2.Caption = "変換中のトラック番号:" & Str(lParam.track) & Chr(13) & _ "トラック総数:" & Str(lParam.tracks) & Chr(13) & _ "進行状況:" & Str(lParam.percent) & "%" Case Else WindowProc = CallWindowProc(oad, hWnd, uMsg, wParam, lParam) End Select End Function Public Sub StartMsg() oad = SetWindowLong(Form1.hWnd, GWL_WNDPROC, AddressOf WindowProc) End Sub Public Sub ExitMsg() SetWindowLong Form1.hWnd, GWL_WNDPROC, oad End Sub |