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

この記事をシェアする

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

関連記事

Meteoric Streamについて

管理人

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