HSP2.xで、MIDIファイルのヘッダ情報を調べるモジュール
Hot Soup Processor 2.x系で動作する、MIDIヘッダ解析モジュールです。
需要があればHSP3用も公開します。
・・・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
;#############################
;# 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
この記事をシェアする
関連記事
- ・HSP2.xで、LHA書庫の圧縮と解凍を実現するモジュール
要loadlib&llmod - ・HSP2.xで、HTMLファイル内のリンク先を列挙するサンプルコード(モジュール付き)
- ・HSP2.x系で、ファイルパスから、ファイル名やフォルダ名を取得するサンプルモジュール
- ・HSP2.x系で、アルファベットの大文字と小文字を相互変換するサンプルモジュール
- ・HSP2.x系で、平方根の近似値を整数で取得するサンプルモジュール
- ・HSP2.x系で、getkey、stick命令のキー番号を取得・表示するサンプルコード
- ・HSP2.x系で、円の中心に向かってグラデーションをかけるサンプルコード
- ・HSP2.x系用 ベンチマークプログラム ソースコード
- ・HSP2.xでMDIウインドウを作成するサンプルコード
要loadlib&llmod