「切り替えに時間がかかる」
→切り替えを処理の途中に挟むわけにはいかない
→あらかじめ読んでおけばいいんじゃない?
てことで。
もちろんこれでうまくいくかはわからんですが、
「やってみたくない」なら勝手にしろ、です。
επιστημηさんのご提案は、「Midiファイルの読み込みを、BGM切り替えの都度行
うか?一度だけ行うか?」の違いですね?
現状、切り替えの都度行っているので、もし一度で済むのであれば全体的には処理時間の
短縮が図れます。(それが可能かどうかは、調査が必要ですが。)
しかし、Midiファイルの読み込み処理時間そのものを短縮させたいので、申し訳ないです
が根本的な解決策にはならないと思います。
他の方法を検討してみます。
ITOさん
>「根拠を示す」ためには、マイクロソフトのサイトなりのくつがえせない証拠が必要で
すね。
根拠にも、「程度」ってのがありますよね?
そこまで厳密な根拠は求めてません。
「試す価値がある」と言える根拠を求めています。
現状、「試しても無駄」と思える根拠の方が、勝ってますよね?
横から失礼しますが…
喧嘩腰(?)になる前に,本当に問題としていることが何なのか?を
はっきりさせたほうがよいのではないでしょうか?
2013/03/11(月) 21:21:46 の発言では,
>問題点は、「BGMの切り替えに処理時間がかかってしまう」という点です。
とおっしゃられていて,私がこの文面を読んだ感じでは,例えば
{ゲームか何かでシーンの切り替え時にBGMを変えたいが,そのときに毎回数秒程度固
まってしまう}
という類のことを問題にしているように見受けました.
(Win98時代のフリーソフトなんかをXPとかで動かしたりするとこの現象に出くわしたりし
ますね)
おそらく他の方々もこのような受け取り方をされており,アイデアが示されています.
しかしながら,2013/03/13(水) 21:42:42 では,
>Midiファイルの読み込み処理時間そのものを短縮させたい
のであって,
「全体的な処理時間の短縮」が目的なのではない,と.つまり結局のところ
{アプリケーション開始時刻~初回のBGMの演奏開始時刻 までの時間}を問題にしてい
る,ということでしょうか?
仮に後者なのだとして,
>Midiファイルのサイズが大きいほど時間がかかり
ということであって,かつ,他の方々が示しているような先行ロードを行った場合に演奏
するMIDIの切り替えがノータイムでスムーズにいくのであれば…
(MIDIファイルがこういうことができるのかどうかわかりませんが)
演奏したいMIDIファイルをいくつかに細切れにしておけばどうでしょう?
例えば{A,B,C}に3分割したとして,
・Aをロード(分割前の1/3の時間で済む?)→演奏開始
・Aの演奏中に別途Bをロードしておく
・Aの演奏終了時にBの演奏を開始(切り替え)
・Bの演奏中に別途Cをロード…
みたいな.
> Midiファイルの読み込み処理時間そのものを短縮させたいので、申し訳ないです
が根本的な解決策にはならないと思います。
後出しジャンケンかよー orz
> 問題点は、「BGMの切り替えに処理時間がかかってしまう」という点です。
って言うたやんかー...
>「試す価値がある」と言える根拠を求めています。
> 現状、「試しても無駄」と思える根拠の方が、勝ってますよね?
うーーん、
「試しても無駄」なら試さなければいいだけです。
そういうきつい断り方でなくでなく、
「せっかく意見をもらいましたが、もう少し検討します。」
というような穏やかな断り方をかんえたほうがいいですね。
試す価値がある/ないは、まにさんの勝手の判断です。
「試す価値がないので試しません。」
のまにさんの一言で終わりです。
そこに他人から「根拠」を要求するのはおかしいですね。
>ということは、「デバイスのオープン処理そのものに時間がかかっているのではなく、
>Midiファイルの読み込みに時間がかかっている」と推測されます。
これに、試す価値があるというのであれば試して、結果を掲示して意見を
求めたらどうでしょうか。
解決方法が知りたいのか原因が知りたいのかどっちなんでしょう
解決方法なら試してみないといけませんし、原因が知りたいなら
インシデントでも使ってMSに聞けということでしょう。
論破?した所で回答者には痛くも痒くもありませんし。
#楽しいレスのせいで結構損しているような気がしてますけど
#まぁ自分で解決すれば良いんじゃないですかね。
根本的解決は、「Midi再生に要する処理時間を短縮させること」です。
その解決策を探る手がかりになるのであれば、なぜ処理時間がかかるのか、その原因も知
りたいです。
たとえ根本的解決策でなくとも、要はユーザーに待ち時間を感じさせなければいいわけな
ので、
επιστημηさん、ホウジョウウサギさんご提案の方法は、その一つの手段ですね。
ちなみに「BGM切り替え」とは、「初回BGM演奏時」も含みます。
3月11日の書き込みはそういう意味で言ったのですが、混乱を招く表現でした。失礼しま
した。
ただ、プログラム起動と同時にBGMを再生したいので、επιστημηさんご提案の方
法ではちょっと…。
わんこさんのリンク先、拝見しました。そうです、この方と同じ問題です。
ですが試してみましたが、うまく行きませんでした。
MPEGVideoデバイスの指定「Midi.lpstrDeviceType = MPEGVideo;」をやってみたのです
が、
「指定されたファイル名拡張子からデバイス種別を判断できません」というエラーになり
ます。
「ファイル名拡張子」と言ってるということは、「mpegなら再生できる」ということか?
と思い、
ネットから拡張子「mpg」のファイルをダウンロードし試してみましたが、結果は同じで
した。
おそらく「MPEGVideo」という文字が認識されてないのではと思います。
自分でも調べてみたのですが、どうやらMCIは高水準のコントロールのようです。
時間がかかってしまうのはそのせいかもしれませんね。
ということは、低水準のコントロールを使えば解決するのではないかと考えています。
もう少し調べてみます。
midiは言わば楽譜だから相応の処理が必要かと思う。
一旦音、すなわちwavに変換しちまえば速度的には改善
されるハズなんだけども、その解はナシですか?
簡単に再現できる最低限のソースを提示して頂いた方が
なんとなく早道な気がするのですけど。
あとOSとかVSのバージョンとか
>→あらかじめ読んでおけばいいんじゃない?
に対して、
>ただ、プログラム起動と同時にBGMを再生したいので、επιστημηさんご提案の
方法ではちょっと…。
と返しているわけだから
プログラム起動時の初期化のための時間なしで
たとえば、exeファイルをダブルクリックした直後に、大きいサイズのmidiを鳴らしたい
ってことか…
mciでのMIDI再生は遅いというのはどうすることも出来なく、
早くしたい場合は自力でmidファイルを読み込んで解析して
MIDI APIを使って再生する必要があるそうです
参考
ttp://eternalwindows.jp/winmm/midi/midi00.html
辿って全部読んでください
やらなければいけない事は全て書いてあると思います
tarouさん、リンク先ご提示、ありがとうございます。まさに求めていた情報です。リン
ク先、印刷してざっと拝読しました。
確かに、このサイトには「MCIは高水準のため時間がかかる」と明言してありますね。と
はいえ低水準でやるとなると、MIDIの中身を解析して自分で音を鳴らす…そこまでやらな
いとならないとは…!!ざっと読んでみたけど、挫折しそうです……。そこまでしてBGM演奏
を高速化するかどうか…悩むところです。
疑問なんですが、自作ソフトで音を鳴らす他の方々は、皆そこまでなさってらっしゃるん
でしょうか…?
自作ソフトに組み込むのではなく、Midi演奏専用のソフトが、あればいいんですけどね。
そのソフトを別途起動し、BGM演奏はすべてそのソフトにまかせる。あとは「どの曲を再
生しろ」「停止しろ」「終了しろ」という指示をWindowsメッセージで送ってやればいい
だけ。せめて、そんなソフトが、あってもよさそうなもんなんですけど、ないものなんで
しょうか?
まぁそれがMCIなんでしょうけど、あの処理時間の遅さは致命的ですからね。
> そこまでしてBGM演奏を高速化するかどうか…悩むところです。
いやだから、そこまでしてMIDIじゃなきゃあかんですか?
>疑問なんですが、自作ソフトで音を鳴らす他の方々は、皆そこまでなさってらっしゃる
>んでしょうか…?
んー
MIDIの演奏にこだわる人は、MIDI-APIを使っていますね。
普通は、MCI使うか、επιστημηさんの意見どおりWAVファイルに変換して
WAVファイルを再生するかですね。
ゲーム系ならダイレクトサウンド関連を使うのだと思います。
ただmidiファイルが使えるは確認ください。
>まぁそれがMCIなんでしょうけど、あの処理時間の遅さは致命的ですからね。
>Midiファイルのサイズが大きいほど時間がかかり、60KBで約3秒ほどです。
まぁー高水準なら仕方ないのではないでしょうか。
MIDIファイルを解析してMIDI-APIを使ってリアルタイムで演奏することを考えると、
60KBで3秒はいいせんいっているのではないでしょうか。
>Windows Media Playerで再生するときは、100KB以上あるファイルも、すぐに演奏始ま
>るのに…。
Windows Media Player SDKを使ってるのはどうですか。
http://msdn.microsoft.com/ja-jp/library/dd148616.aspx