レコンポーザ形式ファイルを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

トップに戻る
Visual Basicワンポイントテクニック目次に戻る

PC用眼鏡【管理人も使ってますがマジで疲れません】 解約手数料0円【あしたでんき】 Yahoo 楽天 NTT-X Store

無料ホームページ 無料のクレジットカード 海外格安航空券 ふるさと納税 海外旅行保険が無料! 海外ホテル