mciSendStringおよびmciSendCommandで、音楽演奏処理を高速化するには? – 固定ページ 2 – プログラミング – Home

通知
すべてクリア

[解決済] mciSendStringおよびmciSendCommandで、音楽演奏処理を高速化するには?

固定ページ 2 / 3

επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

「切り替えに時間がかかる」
→切り替えを処理の途中に挟むわけにはいかない
→あらかじめ読んでおけばいいんじゃない?
てことで。

もちろんこれでうまくいくかはわからんですが、
「やってみたくない」なら勝手にしろ、です。


返信引用
まに
 まに
(@まに)
ゲスト
結合: 18年前
投稿: 78
Topic starter  

επιστημηさんのご提案は、「Midiファイルの読み込みを、BGM切り替えの都度行
うか?一度だけ行うか?」の違いですね?
現状、切り替えの都度行っているので、もし一度で済むのであれば全体的には処理時間の
短縮が図れます。(それが可能かどうかは、調査が必要ですが。)
しかし、Midiファイルの読み込み処理時間そのものを短縮させたいので、申し訳ないです
が根本的な解決策にはならないと思います。
他の方法を検討してみます。

ITOさん
>「根拠を示す」ためには、マイクロソフトのサイトなりのくつがえせない証拠が必要で
すね。
根拠にも、「程度」ってのがありますよね?
そこまで厳密な根拠は求めてません。
「試す価値がある」と言える根拠を求めています。
現状、「試しても無駄」と思える根拠の方が、勝ってますよね?


返信引用
ホウジョウウサギ
 ホウジョウウサギ
(@ホウジョウウサギ)
ゲスト
結合: 18年前
投稿: 73
 

横から失礼しますが…
喧嘩腰(?)になる前に,本当に問題としていることが何なのか?を
はっきりさせたほうがよいのではないでしょうか?

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をロード…
みたいな.


返信引用
わんこ
 わんこ
(@わんこ)
ゲスト
結合: 23年前
投稿: 10
 

http://www.activebasic.com/forum/viewtopic.php?t=99&sid=9dc2affab12b65c1d2f12695c7281fa9

この人と同じような現象でしょうか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> Midiファイルの読み込み処理時間そのものを短縮させたいので、申し訳ないです

が根本的な解決策にはならないと思います。

後出しジャンケンかよー orz

> 問題点は、「BGMの切り替えに処理時間がかかってしまう」という点です。

って言うたやんかー...


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>「試す価値がある」と言える根拠を求めています。
> 現状、「試しても無駄」と思える根拠の方が、勝ってますよね?

うーーん、
「試しても無駄」なら試さなければいいだけです。
 そういうきつい断り方でなくでなく、
  「せっかく意見をもらいましたが、もう少し検討します。」
 というような穏やかな断り方をかんえたほうがいいですね。
 
 試す価値がある/ないは、まにさんの勝手の判断です。
  「試す価値がないので試しません。」
 のまにさんの一言で終わりです。
そこに他人から「根拠」を要求するのはおかしいですね。

>ということは、「デバイスのオープン処理そのものに時間がかかっているのではなく、
>Midiファイルの読み込みに時間がかかっている」と推測されます。
 これに、試す価値があるというのであれば試して、結果を掲示して意見を
求めたらどうでしょうか。

 
 


返信引用
そろそろ
 そろそろ
(@そろそろ)
ゲスト
結合: 12年前
投稿: 1
 

解決方法が知りたいのか原因が知りたいのかどっちなんでしょう
解決方法なら試してみないといけませんし、原因が知りたいなら
インシデントでも使ってMSに聞けということでしょう。
論破?した所で回答者には痛くも痒くもありませんし。

#楽しいレスのせいで結構損しているような気がしてますけど
#まぁ自分で解決すれば良いんじゃないですかね。


返信引用
まに
 まに
(@まに)
ゲスト
結合: 18年前
投稿: 78
Topic starter  

根本的解決は、「Midi再生に要する処理時間を短縮させること」です。
その解決策を探る手がかりになるのであれば、なぜ処理時間がかかるのか、その原因も知
りたいです。
たとえ根本的解決策でなくとも、要はユーザーに待ち時間を感じさせなければいいわけな
ので、
επιστημηさん、ホウジョウウサギさんご提案の方法は、その一つの手段ですね。

ちなみに「BGM切り替え」とは、「初回BGM演奏時」も含みます。
3月11日の書き込みはそういう意味で言ったのですが、混乱を招く表現でした。失礼しま
した。
ただ、プログラム起動と同時にBGMを再生したいので、επιστημηさんご提案の方
法ではちょっと…。

わんこさんのリンク先、拝見しました。そうです、この方と同じ問題です。
ですが試してみましたが、うまく行きませんでした。
MPEGVideoデバイスの指定「Midi.lpstrDeviceType = MPEGVideo;」をやってみたのです
が、
「指定されたファイル名拡張子からデバイス種別を判断できません」というエラーになり
ます。
「ファイル名拡張子」と言ってるということは、「mpegなら再生できる」ということか?
と思い、
ネットから拡張子「mpg」のファイルをダウンロードし試してみましたが、結果は同じで
した。
おそらく「MPEGVideo」という文字が認識されてないのではと思います。

自分でも調べてみたのですが、どうやらMCIは高水準のコントロールのようです。
時間がかかってしまうのはそのせいかもしれませんね。
ということは、低水準のコントロールを使えば解決するのではないかと考えています。
もう少し調べてみます。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

midiは言わば楽譜だから相応の処理が必要かと思う。
一旦音、すなわちwavに変換しちまえば速度的には改善
されるハズなんだけども、その解はナシですか?


返信引用
そもそも
 そもそも
(@そもそも)
ゲスト
結合: 12年前
投稿: 1
 

簡単に再現できる最低限のソースを提示して頂いた方が
なんとなく早道な気がするのですけど。
あとOSとかVSのバージョンとか


返信引用
Ryo
 Ryo
(@Ryo)
ゲスト
結合: 23年前
投稿: 252
 

>→あらかじめ読んでおけばいいんじゃない?

に対して、

>ただ、プログラム起動と同時にBGMを再生したいので、επιστημηさんご提案の
方法ではちょっと…。

と返しているわけだから

プログラム起動時の初期化のための時間なしで
たとえば、exeファイルをダブルクリックした直後に、大きいサイズのmidiを鳴らしたい
ってことか…


返信引用
tarou
 tarou
(@tarou)
ゲスト
結合: 21年前
投稿: 8
 

mciでのMIDI再生は遅いというのはどうすることも出来なく、
早くしたい場合は自力でmidファイルを読み込んで解析して
MIDI APIを使って再生する必要があるそうです

参考
ttp://eternalwindows.jp/winmm/midi/midi00.html

辿って全部読んでください
やらなければいけない事は全て書いてあると思います


返信引用
まに
 まに
(@まに)
ゲスト
結合: 18年前
投稿: 78
Topic starter  

tarouさん、リンク先ご提示、ありがとうございます。まさに求めていた情報です。リン
ク先、印刷してざっと拝読しました。

確かに、このサイトには「MCIは高水準のため時間がかかる」と明言してありますね。と
はいえ低水準でやるとなると、MIDIの中身を解析して自分で音を鳴らす…そこまでやらな
いとならないとは…!!ざっと読んでみたけど、挫折しそうです……。そこまでしてBGM演奏
を高速化するかどうか…悩むところです。
疑問なんですが、自作ソフトで音を鳴らす他の方々は、皆そこまでなさってらっしゃるん
でしょうか…?

自作ソフトに組み込むのではなく、Midi演奏専用のソフトが、あればいいんですけどね。
そのソフトを別途起動し、BGM演奏はすべてそのソフトにまかせる。あとは「どの曲を再
生しろ」「停止しろ」「終了しろ」という指示をWindowsメッセージで送ってやればいい
だけ。せめて、そんなソフトが、あってもよさそうなもんなんですけど、ないものなんで
しょうか?
まぁそれがMCIなんでしょうけど、あの処理時間の遅さは致命的ですからね。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

> そこまでしてBGM演奏を高速化するかどうか…悩むところです。

いやだから、そこまでしてMIDIじゃなきゃあかんですか?


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>疑問なんですが、自作ソフトで音を鳴らす他の方々は、皆そこまでなさってらっしゃる
>んでしょうか…?
んー
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


返信引用
固定ページ 2 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました