私はT-Matsuoさんの mp3infp を使わせてもらってます。
http://win32lab.com/fsw/mp3infp/
(mp3infp.dllのみで大丈夫です。)
#include "mp3infp_ExportFunc_HSP.as"
mp3infp_GetVer
ver = int(strf("%x",stat)) ;(16進数の値を文字列化し、さらに数値化[0x250→"250"→250])
mes strf("mp3infp Ver.%d.%d" ,ver/100, ver\100)
dialog "",16
if stat = 0 :end
_refstr = refstr
mp3infp_Load 0, varptr(_refstr)
if stat == -1 : mes "読み込み失敗"
//szValueName末尾
szValueName_End = ""
mp3infp_GetType
if stat == MP3INFP_FILE_MP3 { ;MP3の場合、szValueName末尾が変化
mp3infp_mp3_GetTagType
repeat 1
if stat & 2 :szValueName_End = "_v2" :break ;ID3v2
if stat & 4 :szValueName_End = "_rmp" :break ;RiffSIF
if stat & 1 :szValueName_End = "_v1" :break ;ID3v1
szValueName_End = "_x" :break ;タグ用データ領域を持たないMP3
loop
if szValueName_End = "_x" : mes "タグ用データ領域を持たないMP3です" :stop
}
sdim buf, 256
//タイトル取得
szValueName = "INAM" + szValueName_End
mp3infp_GetValue varptr(szValueName), varptr(bufp)
if stat!=0 : dupptr buf, bufp, 256, 2 :mes "タイトル : " + buf
//アーティスト取得
szValueName = "IART" + szValueName_End
mp3infp_GetValue varptr(szValueName), varptr(bufp)
if stat!=0 : dupptr buf, bufp, 256, 2 :mes "アーティスト : " + buf
//アルバム取得
szValueName = "IPRD" + szValueName_End
mp3infp_GetValue varptr(szValueName), varptr(bufp)
if stat!=0 : dupptr buf, bufp, 256, 2 :mes "アルバム : " + buf
//他のszValueName値は"mp3infp_ExportFunc_HSP.as"を参照
ちょっと取得の仕方が独特な感じですが、概ね上記のような手順で取得します。
下記のコードを"mp3infp_ExportFunc_HSP.as"としてファイル保存して#includeして使ってください。
他命令の使い方や詳細は"mp3infp_ExportFunc_HSP.as"に書いてあるのでそちらを見てください。
//mp3infp_ExportFunc.h をHSP用に書き直したものです。
#ifndef _MP3INFP_EXPORT_FUNC_H
#define _MP3INFP_EXPORT_FUNC_H
#uselib "mp3infp.dll"
/*=======================================================================================
名前: mp3infp_GetVer
概要: mp3infpのバージョンを取得する
引数: なし
戻値: DWORD バージョン情報
Ver.2.11 = 0x0211
備考:
対応: Ver2.11〜
*/
#func global mp3infp_GetVer "mp3infp_GetVer"
/*=======================================================================================
名前: mp3infp_ViewPropEx
概要: mp3infpに対応したファイル形式のプロパティを開く(モーダルダイアログ版)
説明: 指定ファイルのプロパティをmp3infpのタブをアクティブにして開きます
※シェルエクステンションを使用せずにmp3infp.dll単独の動作となります
※シェルエクステンション標準のプロパティページは表示されません
引数:
IN HWND hWnd 呼び出し元ウインドウハンドル
呼び出し元ウインドウ上にダイアログを表示します
NULLならデスクトップを指定したとみなします
IN char *szFileName 対象ファイル名をフルパスで指定。
IN DWORD dwPage ・mp3infpの何ページ目をアクティブにするか指定する(0=ID3v1 / 1=ID3v2 / 2=RiffSIF / 3=APE(Ver2.47))
・タグを含まないmp3の場合のみ有効
・タグを含む場合はID3v2/APE/RiffSIF/ID3v1の順で検索して、最初に見つかったタグをアクティブにします
IN BOOL modeless TRUEならプロパティを表示したまま制御を返します。戻り値にはプロパティのウインドウハンドルが入ります。
FALSEならプロパティを閉じるまで制御を返しません。
DWORD param1 未使用(0を指定してください)
DWORD param2 未使用(0を指定してください)
戻値: int 成功=0以上/失敗=-1
対応: Ver2.48〜
*/
#func global mp3infp_ViewPropEx "mp3infp_ViewPropEx" int,int,int,int,int,int
/*=======================================================================================
名前: mp3infp_ViewProp
概要: mp3infpに対応したファイル形式のプロパティを開く
説明: 指定ファイルのプロパティをmp3infpのタブをアクティブにして開きます
引数:
IN HWND hWnd 呼び出し元ウインドウハンドル
IN char *szFileName 対象ファイル名をフルパスで指定。
IN DWORD dwPage ・mp3infpの何ページ目をアクティブにするか指定する(0=ID3v1 / 1=ID3v2 / 2=RiffSIF / 3=APE(Ver2.47))
・タグを含まないmp3の場合のみ有効
・タグを含む場合はID3v2/APE/RiffSIF/ID3v1の順で検索して、最初に見つかったタグをアクティブにします
戻値: BOOL 成功=TRUE/失敗=FALSE
対応: Ver2.00〜
*/
#func global mp3infp_ViewProp "mp3infp_ViewProp" int,int,int
/*=======================================================================================
名前: mp3infp_Load
概要: タグ情報をロードする
引数:
IN HWND hWnd 呼び出し元ウインドウを指定します。無い場合はNULL。
IN const char *szFileName 対象ファイル名をフルパスで指定。
戻値: DWORD
-1=ロード失敗
ERROR_SUCCESS=成功
(その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応: Ver2.26〜
*/
#func global mp3infp_Load "mp3infp_Load" int, int
/*=======================================================================================
////////////////////////////////////////////////////////////////////
表1 mp3infp_GetValue()/mp3infp_SetValue()でszValueNameに指定する名前一覧
////////////////////////////////////////////////////////////////////
[共通](※1)
ファイル名 "FILE" (v2.41〜)
拡張子 "FEXT" (v2.41〜)
パス "PATH" (v2.41〜)
サイズ(byte単位) "SIZ1" (v2.41〜)
サイズ(Kbyte単位) "SIZK" (v2.41〜)
サイズ(Mbyte単位) "SIZM" (v2.41〜)
[MP3] ID3v1 ID3v2 RiffSIF APE
フォーマット(※1) "AFMT" "AFMT" "AFMT" "AFMT"
演奏時間(※1) "TIME" "TIME" "TIME" "TIME"
タイトル "INAM_v1" "INAM_v2" "INAM_rmp" "INAM_APE"
アーティスト "IART_v1" "IART_v2" "IART_rmp" "IART_APE"
アルバム "IPRD_v1" "IPRD_v2" "IPRD_rmp" "IPRD_APE"
コメント "ICMT_v1" "ICMT_v2" "ICMT_rmp" "ICMT_APE"
作成日 "ICRD_v1" "ICRD_v2" "ICRD_rmp" "ICRD_APE"
ジャンル "IGNR_v1" "IGNR_v2" "IGNR_rmp" "IGNR_APE"
(ID3v2/RiffSIF)
著作権 "ICOP_v2" "ICOP_rmp"
ソフトウェア/エンコーダ "ISFT_v2" "ISFT_rmp"
(ID3v2)
作曲 "COMP_v2"
Orig.アーティスト "OART_v2"
URL "URL_v2"
エンコードした人 "ENC2_v2"
(RiffSIF)
ソース "ISRC_rmp"
エンジニア "IENG_rmp"
(ID3v1/2)
トラック番号 "TRACK_v1" "TRACK_v2" "TRACK_APE"
[WAV]
フォーマット(※1) "AFMT"
演奏時間(※1) "TIME"
タイトル(※2) "INAM"
タイトル(※2) "ISBJ"
アーティスト "IART"
アルバム "IPRD"
コメント "ICMT"
作成日 "ICRD"
ジャンル "IGNR"
著作権 "ICOP"
ソフトウェア "ISFT"
ソース "ISRC"
エンジニア "IENG"
[AVI]
音声フォーマット(※1) "AFMT"
映像フォーマット(※1) "VFMT"
時間(※1) "TIME"
タイトル(※2) "INAM"
タイトル(※2) "ISBJ"
アーティスト "IART"
コメント "ICMT"
作成日 "ICRD"
ジャンル "IGNR"
著作権 "ICOP"
ソフトウェア "ISFT"
ソース "ISRC"
エンジニア "IENG"
AVIバージョン "AVIV" (v2.37〜)
[VQF]
フォーマット(※1) "AFMT"
演奏時間(※1) "TIME"
タイトル "INAM"
アーティスト "IART"
コメント "ICMT"
著作権 "ICOP"
保存名 "FILE"
[WMA]
音声フォーマット(※1) "AFMT"
映像フォーマット(※1) "VFMT"
時間(※1) "TIME"
タイトル "INAM"
トラック "TRACK"
アーティスト "IART"
アルバム "IPRD"
コメント "ICMT"
作成日 "ICRD"
ジャンル "IGNR"
著作権 "ICOP"
URL(Album) "URL1"
URL(関連) "URL2"
[OGG]
フォーマット(※1) "AFMT"
演奏時間(※1) "TIME"
タイトル "INAM"
アーティスト "IART"
アルバム "IPRD"
コメント "ICMT"
作成日 "ICRD"
ジャンル "IGNR"
トラック番号 "TRACK"
[APE]
フォーマット(※1) "AFMT"
演奏時間(※1) "TIME"
タイトル "INAM"
アーティスト "IART"
アルバム "IPRD"
コメント "ICMT"
作成日 "ICRD"
ジャンル "IGNR"
トラック番号 "TRACK"
[MP4] (v2.53〜)
音声フォーマット(※1) "AFMT"
映像フォーマット(※1) "VFMT"
タイトル "INAM"
アーティスト "IART"
アルバム "IPRD"
グループ "IGRP"
作曲 "COMPOSER"
ジャンル "IGNR"
トラック番号1 "TRACK1" (1以上の数値)
トラック番号2 "TRACK2" (1以上の数値)
ディスク番号1 "DISC1" (1以上の数値)
ディスク番号2 "DISC2" (1以上の数値)
テンポ "BPM" (数値)
作成日 "ICRD" (4桁の数値 例:"2004")
コンピレーション "COMPILATION" ("1" or "0")
コメント "ICMT"
ツール "TOOL"
(※1)mp3infp_SetValue()では利用できません。
(※2)mp3infpではロード時にINAMを優先、無ければISBJを表示。セーブ時にはISBJを削除、INAMを保存します。
*/
#define global MP3INFP_FILE_UNKNOWN 0x00
#define global MP3INFP_FILE_MP3 0x01
#define global MP3INFP_FILE_WAV 0x02
#define global MP3INFP_FILE_AVI 0x03
#define global MP3INFP_FILE_VQF 0x04
#define global MP3INFP_FILE_WMA 0x05
#define global MP3INFP_FILE_OGG 0x07
#define global MP3INFP_FILE_APE 0x08
#define global MP3INFP_FILE_MP4 0x09
/*=======================================================================================
名前: mp3infp_GetType
概要: ファイルの種類を取得する
補足: mp3infp_Load()の後に呼び出してください
引数: なし
戻値: DWORD
#define MP3INFP_FILE_UNKNOWN 0x00
#define MP3INFP_FILE_MP3 0x01
#define MP3INFP_FILE_WAV 0x02
#define MP3INFP_FILE_AVI 0x03
#define MP3INFP_FILE_VQF 0x04
#define MP3INFP_FILE_WMA 0x05
#define MP3INFP_FILE_OGG 0x07
#define MP3INFP_FILE_APE 0x08
対応: Ver2.26〜
#define MP3INFP_FILE_MP4 0x09
対応: Ver2.53〜
*/
#func global mp3infp_GetType "mp3infp_GetType"
/*=======================================================================================
名前: mp3infp_GetValue
概要: タグ情報を取得する
補足: mp3infp_Load()の後に呼び出してください
引数:
IN const char *szValueName タグの種類を示す名前(表1を参照)
OUT char **buf タグ情報を示すバッファのポインタを受け取るポインタ
戻値: BOOL 成功=TRUE/失敗=FALSE
対応: Ver2.26〜
*/
#func global mp3infp_GetValue "mp3infp_GetValue" int,int
#define global MP3INFP_HAS_MP3_ID3V1 0x00000001
#define global MP3INFP_HAS_MP3_ID3V2 0x00000002
#define global MP3INFP_HAS_MP3_RIFFSIF 0x00000004
#define global MP3INFP_HAS_MP3_ID3V1_0 0x00000008 // v2.43〜
#define global MP3INFP_HAS_MP3_ID3V1_1 0x00000010 // v2.43〜
#define global MP3INFP_HAS_MP3_ID3V2_2 0x00000020 // v2.43〜
#define global MP3INFP_HAS_MP3_ID3V2_3 0x00000040 // v2.43〜
#define global MP3INFP_HAS_MP3_ID3V2_4 0x00000080 // v2.43〜
#define global MP3INFP_HAS_MP3_APEV1 0x00000100 // v2.47〜
#define global MP3INFP_HAS_MP3_APEV2 0x00000200 // v2.47〜
/*=======================================================================================
名前: mp3infp_mp3_GetTagType
概要: mp3が持っているタグの種類を取得する
補足: mp3infp_Load()の後に呼び出してください
引数: なし
戻値: DWORD (OR)
#define MP3INFP_HAS_MP3_ID3V1 0x00000001
#define MP3INFP_HAS_MP3_ID3V2 0x00000002
#define MP3INFP_HAS_MP3_RIFFSIF 0x00000004
#define MP3INFP_HAS_MP3_ID3V1_0 0x00000008 // v2.43〜
#define MP3INFP_HAS_MP3_ID3V1_1 0x00000010 // v2.43〜
#define MP3INFP_HAS_MP3_ID3V2_2 0x00000020 // v2.43〜
#define MP3INFP_HAS_MP3_ID3V2_3 0x00000040 // v2.43〜
#define MP3INFP_HAS_MP3_ID3V2_4 0x00000080 // v2.43〜
#define MP3INFP_HAS_MP3_APEV1 0x00000100 // v2.47〜
#define MP3INFP_HAS_MP3_APEV2 0x00000200 // v2.47〜
対応: Ver2.27〜
*/
#func global mp3infp_mp3_GetTagType "mp3infp_mp3_GetTagType"
/*=======================================================================================
名前: mp3infp_SetConf
概要: mp3infpの動作設定
引数: IN char *tag 設定項目(表2参照)
IN char *val 設定値(表2参照)
戻値: BOOL 成功=TRUE/失敗=FALSE
対応: Ver2.42〜
補足: ・他のプロセスのmp3infp.dll/シェル拡張のmp3infpには影響しない
・設定内容は保存されない
*/
#func global mp3infp_SetConf "mp3infp_SetConf" int,int
/*=======================================================================================
////////////////////////////////////////////////////////////////////
mp3infp_SetConf()指定する設定項目・値一覧
////////////////////////////////////////////////////////////////////
[Waveファイルのコーデック名称の取得方法](Ver2.42〜)
(項目名)
"wave_CodecFind"
(値)
"0"(default) mp3infp内蔵辞書 → Windows APIを利用の順で検索(高速)
"1" Windows APIを利用 → 自力解析の順で検索(低速)
"2" mp3infp内蔵辞書(高速)
"3" Windows APIを利用(低速)
[Aviファイルのコーデック名称の取得方法](Ver2.42〜)
(項目名)
"avi_CodecFind"
(値)
"0"(default) mp3infp内蔵辞書 → Windows APIを利用の順で検索(高速)
"1" Windows APIを利用 → 自力解析の順で検索(低速)
"2" mp3infp内蔵辞書(高速)
"3" Windows APIを利用(低速)
[ID3v1で拡張ジャンルを使用する](Ver2.43〜)
(項目名)
"mp3_UseExtGenre"
(値)
"0"(default) 無効
"1" 有効
[ID3v2で文字列をUnicodeで書き込む](Ver2.43〜)
(項目名)
"mp3_ID3v2Unicode"
(値)
"0"(default) 無効
"1" 有効
[ID3v2を非同期化する](Ver2.43〜)
(項目名)
"mp3_ID3v2Unsync"
(値)
"0" 無効
"1"(default) 有効
[保存時のID3v2バージョン](Ver2.43〜)
※この設定値はmp3infp_Load()の実行によって上書きされます。
(項目名)
"mp3_SaveID3v2Version"
(値)
"2.2" ID3v2.2
"2.3"(default) ID3v2.3
"2.4" ID3v2.4
*/
/*=======================================================================================
名前: mp3infp_SetValue
概要: タグ情報を設定する
補足: mp3infp_Load()の後に呼び出してください
引数:
IN const char *szValueName タグの種類を示す名前(表1を参照)
IN const char *buf タグ情報を示す文字列
戻値: DWORD
-1=失敗
ERROR_SUCCESS=成功
対応: Ver.2.43〜
*/
#func global mp3infp_SetValue "mp3infp_SetValue" str,str
/*=======================================================================================
名前: mp3infp_Save
概要: タグ情報を保存する
補足: mp3infp_Load()の後に呼び出してください
引数: IN const char *szFileName 対象ファイル名をフルパスで指定。
戻値: DWORD
-1=失敗
-2=2Gバイトを超えるファイルを扱うことはできません。(WAVファイルのみ)
ERROR_SUCCESS=成功
(その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応: Ver.2.43〜
*/
#func global mp3infp_Save "mp3infp_Save" int
/*=======================================================================================
名前: mp3infp_mp3_MakeId3v1
概要: ID3TAG V1を作成する
補足: mp3infp_Load()の後に呼び出してください
変更は直ちに反映されます
mp3ファイルにのみ利用してください(wavファイルは対象外)
引数: IN char *szFileName 対象ファイル名をフルパスで指定。
戻値: DWORD
-1=失敗
ERROR_SUCCESS=成功
(その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応: Ver.2.43〜
*/
#func global mp3infp_mp3_MakeId3v1 "mp3infp_mp3_MakeId3v1" int
/*=======================================================================================
名前: mp3infp_mp3_DelId3v1
概要: ID3TAG V1を削除する
補足: mp3infp_Load()の後に呼び出してください
変更は直ちに反映されます
mp3ファイルにのみ利用してください(wavファイルは対象外)
引数: IN char *szFileName 対象ファイル名をフルパスで指定。
戻値: DWORD
-1=失敗
ERROR_SUCCESS=成功
(その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応: Ver.2.43〜
*/
#func global mp3infp_mp3_DelId3v1 "mp3infp_mp3_DelId3v1" int
/*=======================================================================================
名前: mp3infp_mp3_MakeId3v2
概要: ID3TAG V2を作成する
補足: mp3infp_Load()の後に呼び出してください
変更は直ちに反映されます
mp3ファイルにのみ利用してください(wavファイルは対象外)
引数: IN char *szFileName 対象ファイル名をフルパスで指定。
戻値: DWORD
-1=失敗
ERROR_SUCCESS=成功
(その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応: Ver.2.43〜
*/
#func global mp3infp_mp3_MakeId3v2 "mp3infp_mp3_MakeId3v2" int
/*=======================================================================================
名前: mp3infp_mp3_DelId3v2
概要: ID3TAG V2を削除する
補足: mp3infp_Load()の後に呼び出してください
変更は直ちに反映されます
mp3ファイルにのみ利用してください(wavファイルは対象外)
引数: IN char *szFileName 対象ファイル名をフルパスで指定。
戻値: DWORD
-1=失敗
ERROR_SUCCESS=成功
(その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応: Ver.2.43〜
*/
#func global mp3infp_mp3_DelId3v2 "mp3infp_mp3_DelId3v2" int
/*=======================================================================================
名前: mp3infp_mp3_MakeRMP
概要: mp3形式からRMP形式に変換する
補足: mp3infp_Load()の後に呼び出してください
変更は直ちに反映されます
mp3ファイルにのみ利用してください(wavファイルは対象外)
引数: IN char *szFileName 対象ファイル名をフルパスで指定。
戻値: DWORD
-1=失敗
ERROR_SUCCESS=成功
(その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応: Ver.2.43〜
*/
#func global mp3infp_mp3_MakeRMP "mp3infp_mp3_MakeRMP" int
/*=======================================================================================
名前: mp3infp_mp3_DelRMP
概要: RMP形式からmp3形式に変換する
補足: mp3infp_Load()の後に呼び出してください
変更は直ちに反映されます
mp3ファイルにのみ利用してください(wavファイルは対象外)
引数: IN char *szFileName 対象ファイル名をフルパスで指定。
戻値: DWORD
-1=失敗
ERROR_SUCCESS=成功
(その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応: Ver.2.43〜
*/
#func global mp3infp_mp3_DelRMP "mp3infp_mp3_DelRMP" int
/*=======================================================================================
名前: mp3infp_mp3_MakeApeTag
概要: APE Tagを作成する
補足: mp3infp_Load()の後に呼び出してください
変更は直ちに反映されます
mp3ファイルにのみ利用してください(wavファイルは対象外)
引数: IN char *szFileName 対象ファイル名をフルパスで指定。
戻値: DWORD
-1=失敗
ERROR_SUCCESS=成功
(その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応: Ver.2.47〜
*/
#func global mp3infp_mp3_MakeApeTag "mp3infp_mp3_MakeApeTag" int
/*=======================================================================================
名前: mp3infp_mp3_DelApeTag
概要: APE Tagを削除する
補足: mp3infp_Load()の後に呼び出してください
変更は直ちに反映されます
mp3ファイルにのみ利用してください(wavファイルは対象外)
引数: IN char *szFileName 対象ファイル名をフルパスで指定。
戻値: DWORD
-1=失敗
ERROR_SUCCESS=成功
(その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応: Ver.2.47〜
*/
#func global mp3infp_mp3_DelApeTag "mp3infp_mp3_DelApeTag" int
#endif //_MP3INFP_EXPORT_FUNC_H
現在は、他の方が開発を引き継いでUnicode版に対応させたものもあるようです。