Windowsソフト、iPhoneアプリ、ゲーム音楽素材の「Meteoric Stream」 -> 資料室 -> HSP2 -> HSP2.xで、MIDIファイルのヘッダ情報を調べるモジュール

HSP2.xで、MIDIファイルのヘッダ情報を調べるモジュール

Hot Soup Processor 2.x系で動作する、MIDIヘッダ解析モジュールです。
需要があればHSP3用も公開します。
・・・MIDI自体の需要が薄れていますが(爆)

#module "MIDI_Infomation_Header_for_HSP" ;############################# ;# IsMidi - MIDIファイルかどうかを調べる ;# ;# ●書式 ;# IsMidi "string" ;# ●引数 ;# "string":ファイル名(255文字以下) ;# ●戻り値 ;# stat:0=NO 1=YES ;# ●説明 ;# MIDIであるかどうかを調べ、 ;# MIDIの場合は1、そうでない場合は0を、 ;# statに返します。MACバイナリ非対応。 ;# (実際は、MThdヘッダの存在を ;# 確認するだけです。) ;############################# #deffunc IsMidi str mref file, 32 mref st, 64 exist file if strsize == -1{ st = 0 return } head="" bload file, head, 4, 0 if head != "MThd"{ st = 0 } else{ st = 1 } return ;############################# ;# GetMidiHeader - MIDIヘッダ情報を取得 ;# ;# ●書式 ;# GetMidiHeader p1, "string" ;# ●引数 ;# p1=変数:結果を格納する数値型配列変数 ;# "string":ファイル名(255文字以下) ;# ●戻り値 ;# stat:成功=1 ファイルが存在しない=0 ;# MIDIでは無い=0 ;# ●説明 ;# MThdヘッダから情報を得て、 ;# 数値型変数p1に結果を格納します。 ;# 取得される情報は、以下の通り。 ;# p1.0 = MThdヘッダ ;# p1.1 = データ長(6) ;# p1.2 = フォーマット(0 or 1) ;# p1.3 = トラック数 ;# p1.4 = 時間単位 ;# statについては、戻り値の説明を参照。 ;# (Macバイナリ非対応) ;############################# #deffunc GetMidiHeader val, str mref value, 48 mref file, 33 mref st, 64 ;ファイルの存在を調べる exist file if strsize == -1{ st = 0 return } ;ファイルを読み込む str buf if strsize > 64{ sdim buf, strsize + 1 } bload file, buf, strsize ;読み込むデータのサイズ情報を配列化 load_data = 4, 4, 2, 2, 2, 0 ;データ読み込み idx = 0 repeat c = cnt if load_data.c == 0 : break i = 0 repeat load_data.c / 2 peek p , buf, idx + (cnt * 2) peek p.1, buf, idx + (cnt * 2) + 1 p = (p << 8) + p.1 i += p << (load_data.c / 4 - cnt * 16) loop idx + load_data.c value.c = i loop ;MThdヘッダかどうか調べる。 mthd = ('M' << 24) + ('T' << 16) + ('h' << 8) + ('d' << 0) if value.0 != mthd{ st = 0 } else{ st = 1 } return ;############################# ;# GetMidiAuthor - MIDI著作権情報を取得 ;# ;# ●書式 ;# GetMidiAuthor p1, "string" ;# ●引数 ;# p1=変数:結果を格納する文字列型変数 ;# "string":ファイル名(255文字以下) ;# ●戻り値 ;# stat:成功=0以外 ;# ●説明 ;# MIDIから著作権情報を取り込んで、 ;# 結果をp1に格納します。 ;# ファイル全体を検索して処理する為、 ;# 低速ですので、通常はMCI命令を ;# 使用して下さい。 ;# (Macバイナリ非対応) ;############################# #deffunc GetMidiAuthor val, str mref dat, 24 mref file, 33 mref st, 64 dat = "" flg = 0 ;ファイルの存在を調べる exist file if strsize == -1{ st = 0 return } ;ファイルを読み込む str buf if strsize > 64{ sdim buf, strsize + 1 } bload file, buf, strsize c = 0 repeat strsize wpeek p, buf, c if p == $02ff{ c + 2 i = 0 ;可変長数値の取得 repeat peek p, buf, c if (p & $80) == 0 : i += p : break i += p - $80 c++ loop ;テキスト情報取得 c++ s = "" : k = "" repeat i peek p, buf, c str s poke k, 0, p s += k c++ loop dat = s flg = 1 } if flg : break c++ loop st = flg return ;############################# ;# GetMidiAuthorLength - 著作権情報の長さを取得 ;# ;# ●書式 ;# GetMidiAuthorLength "string" ;# ●引数 ;# "string":ファイル名(255文字以下) ;# ●戻り値 ;# stat:成功=0以外 ;# ●説明 ;# 著作権情報の文字列の長さを取得し、 ;# statに返します。 ;# (Macバイナリ非対応) ;############################# #deffunc GetMidiAuthorLength str mref file, 32 mref st, 64 len = 0 flg = 0 ;ファイルの存在を調べる exist file if strsize == -1{ st = 0 return } ;ファイルを読み込む str buf if strsize > 64{ sdim buf, strsize + 1 } bload file, buf, strsize c = 0 repeat strsize wpeek p, buf, c if p == $02ff{ c + 2 i = 0 ;可変長数値の取得 repeat peek p, buf, c if (p & $80) == 0 : i += p : break i += p - $80 c++ loop flg = 1 len = i } if flg : break c++ loop st = len return #global ;############################# ;# 以下はテストプログラムです。 ;############################# r = 320, 200 screen 0, r, r.1, 0, dispx - r >> 1, dispy - r.1 >> 1 title "MIDIテストプログラム" sdim fname, $2710 sdim msg, $2710 mesbox msg, r, r.1 - 20, 2 objsize r, 20 button "MIDIファイル選択", *open stop *open dialog "mid", 16 if stat == 0 : stop fname = refstr IsMidi fname if stat{ msg = "ファイルタイプ:MIDIファイル\n" } else{ msg = "ファイルタイプ:不明\n" } GetMidiHeader inf, fname msg += "データ長:" + inf.1 + "\n" msg += "フォーマット:" + inf.2 + "\n" msg += "トラック数:" + inf.3 + "\n" msg += "時間単位:" + inf.4 + "\n" GetMidiAuthorLength fname if stat{ str author if stat > 64 : sdim author, stat GetMidiAuthor author, fname msg += "著作権:" + author + "\n" } else{ msg += "著作権:なし\n" } objprm 0, msg stop

最初に記事を書いた日:2017/10/30

この記事をシェアする

このエントリーをはてなブックマークに追加

関連記事

資料室のトップに戻る
Windowsソフト、iPhoneアプリ、ゲーム音楽素材の「Meteoric Stream」 -> 資料室 -> HSP2 -> HSP2.xで、MIDIファイルのヘッダ情報を調べるモジュール
▲Top English