HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
1224
Hiroaki SoftwareMIDIファイルの曲名の取得について23解決


Hiroaki Software

リンク

2008/12/24(Wed) 15:00:22|NO.21842

MIDIファイルの曲名をしようと思いMCIで曲名を取得しようとすると
システム変数statにエラーを示す値(まあ数値ですが・・・)が
代入されてMIDIファイルの取得ができません
ちなみに100%取得できません。
MIDIファイルの曲名を取得する方法ってありませんか?
もしかしてWIN32 APIを使うのかな?
実は僕高校1年生です。
WIN32 APIについて詳しくありません。
使用できるといえば
kernel32.dllのGetVersionExAとuser32.dllのMessageBoxAのみです。

質問内容を再度書きます
MIDIファイルの曲名を取得する方法を教えてほしいということです。



この記事に返信する


Hiroaki Software

リンク

2008/12/24(Wed) 15:33:04|NO.21849

ちなみに何度もぐぐってみましたが見つかりません。
それとサンプルスクリプトもお願いします。

あっそれとWIN32 APIについて詳しくないだけですので
サンプルスクリプトをあげてもらえばその命令について調べることができます。



SYAM

リンク

2008/12/24(Wed) 15:59:07|NO.21852

完璧 ではないと思いますが、
ファイル中で0x03ff が最初に出現する箇所の直後の 1バイトが タイトル文字列の長さ(バイト数)になっていて、その次からがタイトル文字列データになっている“はず”です。
なので
ファイル先頭から wpeekで 0x03ff が最初に出現する箇所を探し、
その次に続く1バイトを peek で取得して、
さらにその次からのデータを 先の1バイトの数値ぶんだけmemcpyで取得する
…で、なんとかなる“かもしれません”。

というのは
たいていは先頭にタイトルが来ると思いますが、この探しかただけだとトラック名なんかも引っかかっちゃうんですよね…



SYAM

リンク

2008/12/24(Wed) 16:02:47|NO.21853

訂正。 ファイル中に出現するのは ff 03 というパターンですね。
wpeek で探すときには 0x03ffでイイのですが説明としては間違いでした。



Hiroaki Software

リンク

2008/12/24(Wed) 16:15:54|NO.21854

SYAM様
説明だけではわからん。
サンプルスクリプトをお願いします (申し訳ありません



SYAM

リンク

2008/12/24(Wed) 16:36:08|NO.21859

説明の後半には、
必要な命令をスクリプトで使う順に、それに与えるデータと取得するデータの内容を添えて説明してあります。
これは、日本語で書いてあるというだけでスクリプト同然の内容です。
これが分からないというなら、この方法は無理でしょう。



Hiroaki Software

リンク

2008/12/24(Wed) 17:25:19|NO.21862

曲名のあるMIDIファイルをbloadで変数に読み込んで
0x03ffがあるか見てみたのですが見当たりません
て言うかstrlenで文字数を調べてみるとなぜか4文字!?



SYAM

リンク

2008/12/24(Wed) 17:39:54|NO.21864

bloadの第3パラメータの省略は、自動的にファイルに合わせたバッファを確保するのではなく、読み出すバイト数をバッファの大きさに合わせるんです。
宣言してない変数はサイズが4なので、それに合わせちゃってるんだと思います。
※わたしもヘルプ読んで引っかかりましたorz
先にexist命令でファイルのサイズを調べて、その大きさをsdim命令に指定してバッファを確保してみてください。



Hiroaki Software

リンク

2008/12/24(Wed) 17:52:37|NO.21865

だめです。
とりあえずMidファイルを渡しますので曲名を確認してください。
Mid File: http://hiroaki2008.ktkr.net/download/natunohi.mid
一応曲名:夏の日の贈り物 (混声二部 合唱)
もし取得できたら教えてください。



SYAM

リンク

2008/12/24(Wed) 18:01:21|NO.21867

できました…



Hiroaki Software

リンク

2008/12/24(Wed) 18:04:25|NO.21868

ファイルの読み込みはbloadですかnoteloadですか?
それともその他?
それと読み込み先は文字列型変数ですよね?



SYAM

リンク

2008/12/24(Wed) 19:10:49|NO.21871

bloadです。文字列変数を使います。


dialog "",16 if stat != 1:end loadname = refstr exist loadname loadlen = strsize sdim loadbuf,loadlen bload loadname,loadbuf name = "Unidentified." repeat loadlen-2 if (wpeek(loadbuf,cnt) == 0x03ff) { idx = cnt + 2 namesize = peek(loadbuf,idx) sdim name,namesize + 1 memcpy name,loadbuf,namesize,0,idx+1 break } loop mes name

苦労されてる様子なので動くものを貼ります。
標準MIDIファイルの仕様を半端に利用しているので、もしかしたら変なのが読みだされるかもしれませんし、下手すると間違った部分がたまたま読みだされるかもしれません。(たぶん無いはずですが)



Hiroaki Software

リンク

2008/12/24(Wed) 21:00:40|NO.21875

サンプルありがとうございます。きちんと動きました。
サンプルの方なのですが、自作のメディアプレーヤーの際に使用させてもらいます。

---------------------------------------------------------------------------
ところでSYAM様
http://hsp.tv/play/pforum.php?mode=all&num=21779

>単刀直入に質問されてますので、思ったことを単刀直入に書きます。
>ケチつけられるのがイヤならこんなスレッドは立てないであろうと見込んで。
と書き始めた方ですよね。
「サンプル表示」のHTMLの件なのですがそのサンプル書き換えました。
詳しくは
http://hsp.tv/play/pforum.php?mode=all&num=21779
で説明します。
--------------------------------------------------------------------
今回はありがとうございました。

でこのページを見てみると
僕とSYAM様だけしか参加せずに解決してしまいましたね (半笑い
以上



SYAM

リンク

2008/12/24(Wed) 21:21:32|NO.21878

Good job ;-)


ちなみに、またしても説明にミスがありました。

>strlenで文字数を調べてみるとなぜか4文字!?

についてですが、bloadの読込先の変数をsdimで宣言していなかったなら、メモリを 4 バイト確保されるようなことを書きました。
たしかに 4 バイト確保されますが数値型変数になってるのでstrlenではエラーになってたはずですね。
strlenで 4 バイトになっていたのは、別の理由です。

文字列は、文字コード 0x00 で終端になるものと決まっています。
文字列でないデータを無理に文字列扱いすると、 0x00 が最初に出てきたところでデータの終わりと勘違いします。

で、標準MIDIデータは「文字列」ではないので、終端以外にもいっぱい 0x00 というデータが含まれています。
標準MIDIデータだと 5 バイト目に 0x00 が来るようになってるので、文字列として扱ってしまうと 4 バイトしかないように見えてしまうわけです。
実際にはちゃんと読み込んでいます。
デバッグウインドウの「メモリダンプ」で確認できます。



Hiroaki Software

リンク

2008/12/24(Wed) 21:26:42|NO.21880

SYAM様
実は最初から
sdim 変数名,65000

で変数を初期化していたのです。 >文字列は、文字コード 0x00 で終端になるものと決まっています。 についてはHSPのマニュアルのHSP ver3文字列のひみつ(TIPS)のページで確認済みです



Hiroaki Software

リンク

2008/12/24(Wed) 21:29:42|NO.21881

あ、聞き忘れました。
この掲示板上のどのスレッドのページでもあなたの書き込みをみます(1部を除く)
そこで質問
SYAM様はHSPの使用歴は2008/12/24の地点で何年目ですか?
まあ少し気になったので・・・。



Kpan

リンク

2008/12/24(Wed) 21:30:19|NO.21882

別の方法ということで。(切り出しはgetstr命令でもOK


dialog "mid", 16 if stat = 0 : stop notesel buf noteload refstr, $100 ; テキトー repeat strsize if peek(buf, cnt) = $FF { if peek(buf, cnt + 1) = $03 { position = cnt break } continue } loop



SYAM

リンク

2008/12/25(Thu) 02:43:36|NO.21890

※問題は解決したよーなのであまり長くなるようなら雑談でスレッド立てるほうがよいと思います。
えーと…あんまり覚えてないですが初めてHSPを触ったのは2000年頃だったはずです。たぶん。。



Hiroaki Software

リンク

2008/12/25(Thu) 11:30:25|NO.21900

Kpan様
あなたのサンプルを実行しても曲名が出てきません。
というかそれらしき変数が見当たりません



SYAM

リンク

2008/12/25(Thu) 12:46:05|NO.21911

曲名が ファイル内の どこにあるか を割り出すところまでは やってありますね。



Hiroaki Software

リンク

2008/12/25(Thu) 12:53:01|NO.21914

まあ本編の問題は解決したが
Kpan様のサンプル(NO.21882)に関する問題ができたー(おいおい
このサンプルの続きで誰か曲名を出すところまでやってもらえませんかー?

曲名が出なければサンプルと言えないので・・・(=このスレッドでは)



SYAM

リンク

2008/12/25(Thu) 13:11:37|NO.21915

理解する気のない人には、これ以上のサンプルなぞ無駄です。
なぜ読まないのですか。
せっかくのサンプルを。



Hiroaki Software

リンク

2008/12/25(Thu) 13:22:28|NO.21916

SYAM様
ところでNO.21875に書いた
http://hsp.tv/play/pforum.php?mode=all&num=21779
の件で
書き換えたサンプル確認しました?
おっとこの回答は
http://hsp.tv/play/pforum.php?mode=all&num=21779
で結構です



p

リンク

2008/12/25(Thu) 17:06:26|NO.21930

midiファイルもといバイナリファイルを理解してないのかなと思った。
適当なバイナリエディタでmidiファイルを覗いて曲名がどこにあるのか
探してみると、サンプルが理解できる…かな。



ONION software Copyright 1997-2023(c) All rights reserved.