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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1205
Sado再生位置を取得(mciの取得位置のズレ?、ds_getpからミリ秒への換算、など)15解決


Sado

リンク

2015/12/5(Sat) 00:02:24|NO.73412

以前にも似たような質問をさせていただきましたが、
またも自己解決の難しい問題が発生してしまいました。

mciにて、
使用曲のbpm/step(1小説の音符数?)から譜面進行度を求めて
リズムゲーム等に利用しようと思いました。
しかし、一時停止(ポーズ)の処理を挟む度に譜面進行度がズレてしまうのです。

;譜面進行度計算の部分 mci "status "+mci_playalias+" position" ms = stat - ms_shift ;setpos=stat fbt=bpm*ms/60/1000 ibt=int(fbt) ibta=(ibt+ibt_shift)/step ibtb=(ibt+ibt_shift)\step


これはmciの仕様なのではないかと、dmmstatに乗り換えようと試してみたところ
0.25秒毎でしか取得できず、ibtbの値が大雑把になってしまいます。
なので、プラグイン(HSP DirectSound Extension v2.20)を利用してみたところ、
今度は取得した値がbyte単位?で、ミリ秒に換算出来ず、正しい値にならないような…

;bpm160,step16,ビットレート188(kbps)の曲 ;この式だと微妙にずれる fbt=0.0 : ms=0.0 : ibt_shift=-6 ds_getp 0 : bytepos=stat ms=double(bytepos)/188000 fbt=(160.0*4)*ms/60 ibt=int(fbt)+ibt_shift ibta=ibt/16 ibtb=ibt\16


mciなら、一時停止の処理を挟んでも、取得する値が正しくなるようにする方法を
ds_~なら、ミリ秒への換算方法を
教えていただけませんか……



この記事に返信する


Sado

リンク

2015/12/5(Sat) 00:06:44|NO.73413

>今度は取得した値がbyte単位?で、ミリ秒に換算出来ず、正しい値にならないような…
>;bpm160,step16,ビットレート188(kbps)の曲
>;この式だと微妙にずれる
「微妙にずれる」は
時間経過するほどズレが大きくなる、という意味です。

説明が少し抜けていました…



kanamaru

リンク

2015/12/5(Sat) 07:24:00|NO.73416

この掲示板には、mciで作られた音楽プレイヤーが公開されてたはずです。
それを見ればわかると思いますが、わざわざbpmなどから計算しなくても、
音楽が何分流れたのかが取得できますし、音楽全体の長さも取得して、
進行度を今まで流れた長さ÷音楽全体の長さで求められると思います。



kanamaru

リンク

2015/12/5(Sat) 07:47:27|NO.73418

探してみたところ、
http://hsp.tv/play/pforum.php?mode=all&num=72553
が参考になりそうです。
ためしに、mci_playaliasにエイリアスが代入されているとして、

mci "status "+mci_playalias+" length" alllength=stat mci "status "+mci_playalias+" position" nowlength=stat sinnkodo=1.0*nowlength/alllength
でsonnkodoに進行度が代入されていると思います。
もし、進行度についての理解が違うようであれば教えてください。



kanamaru

リンク

2015/12/5(Sat) 08:16:56|NO.73419

書き忘れてましたが、
単位はミリ秒で計算しています。



Sado

リンク

2015/12/5(Sat) 13:04:17|NO.73425

回答ありがとうございます。
譜面進行度は経過時間(秒や分)を一小節に置ける最大音符数(DETUNEのソフトで言うstep数)で
割って求めたものです。
その為、作曲ソフト上で再生した場合の譜面の位置を求めるためには
曲全体の長さ(ms?)で割るのではなくて、bpmやstepを調べてくる必要があります。
あれ、あってるかな、自信無くなってきた。




mciでの譜面進行度(何小節目のどの部分か)は、通常時は正しく計算できるのですが
ポーズ画面等の処理を挟む度に(mci"stopからのmci"play)
計算して求められる譜面進行度がズレてしまう問題を解決したいです。
これの原因が計算式にあるのか、一時停止処理時にmciに送るべきコマンドが別にあるのか。

mciがだめなら、direct soundで再生位置を取得しようと考えています。
でも再生位置(byteらしき単位)をビットレート(kbps)で割っても秒単位にならない(ミリ秒ですら無い)



Sado

リンク

2015/12/5(Sat) 13:12:59|NO.73426

ああ、また日本語が足らない…
>mciでの譜面進行度(何小節目のどの部分か)は、通常時は正しく計算できるのですが
>ポーズ画面等の処理を挟む度に(mci"stopからのmci"play)
>計算して求められる譜面進行度がズレてしまう問題を解決したいです。
この場合のズレは、以降の譜面進行度がまるごとずれてしまう。シフトするという意味のつもりです。



Sado

リンク

2015/12/5(Sat) 13:42:14|NO.73430

連投すみません
>kanamaruさん
譜面進行度が何かうまく伝えられないので、作って見舞いsた。
サンプル曲のbpmとstepは分からないので、適当に調整してみました…

#include "hspogg.as" mes "HSPOGG Sound Test" mes "---------------------------" mes "Music 'Matchbox parking'" mes "作曲:onitama 編曲:arStudio" mes "少し改ざん:Sado" mes "---------------------------" dmmini dmmload dir_exe+"\\sample\\demo\\oot06.ogg",1 ; oggファイル読み込み dmmloop 1,671328 ; ループポイント設定 button "OGG",*bbb button "STOP",*ccc button "END",*bye *www dmmstat dd,1,$100 ; 再生フラグを取得 //曲データ(bpmやstep)が分からないので譜面進行度は変な値になるかも bpm=double(140*4);*4はbpmの値とは関係なく何故か必要 step=16.0 ms=dd : fbt=0.0 fbt=bpm*ms/60;/1000 ibt=int(fbt) ibta=ibt/step ibtb=ibt\step title "ms="+dd+" ibta/b "+ibta+"/"+ibtb await 20 goto *www *bbb dmmplay 1 ; 再生 dmmstat dd,1,$101 ; 再生フラグを取得 mes "Total:"+dd goto *www *ccc dmmstop -1 ; 停止 goto *www *bye dmmbye end



kanamaru

リンク

2015/12/5(Sat) 13:46:39|NO.73431

そうですか。
じゃあdirect soundの方なんですが、、
kbpsってキロビットパーセカンドのことらしいので、
bytes per secoundをキロビットに変換します。(byteは速度ではないので、多分これでいい)
1byte per secound=8bit per secound=8*10^-3kbit per secound
なので、

fbt=0.0 : ms=0.0 : ibt_shift=-6 ds_getp 0 : bytepos=stat ms=double(bytepos)*8*0.001/188000 fbt=(160.0*4)*ms/60 ibt=int(fbt)+ibt_shift ibta=ibt/16 ibtb=ibt\16
でどうでしょうか?
勘違いだったらすいません。




Sado

リンク

2015/12/5(Sat) 14:07:15|NO.73433

あ、、direct soundの方は単位を間違えて計算してただけみたいですね
馬鹿丸出しで恥ずかしい…

となると、mciの一時停止後の復帰で、取得再生位置がズレる(シフトする)問題は
何なんだろう???



kanamaru

リンク

2015/12/5(Sat) 19:11:35|NO.73448

調べてみました。
http://nade.jp-pro.net/bbs/bbs3/cbbs.cgi?mode=one&number=8592&type=8583&space=30&no=0
を参考に出来ませんか?
同じような症状の解決法がわかります。
direct soundでやるなら、話は別ですが。



Sado

リンク

2015/12/5(Sat) 22:18:41|NO.73463

いいえ、デバイスタイプをMPEGvideoと指定しても特に変化はありません…

なぜだろう、stopを送信した後にplayを実行すると、
必ず音声とstatus alias positionの値がずれる。
この処理を繰り返すと、どうしようもないくらいにズレる。

kanamaruさんの環境ではmciのズレは確認できましたか??
僕の環境でだけというなら、自分のプログラムが原因だと、バグ修正に身が入るのですが…
どうもmciの問題だと思えてならない…



Sado

リンク

2015/12/5(Sat) 22:49:55|NO.73466

一応、サンプル貼っておきますね。
サークルのものをそのまま引用させて頂いているので、スレの解決後に削除します。
https://www.dropbox.com/s/4hwbowr2b3fe093/mci_ibt_test.zip?dl=0


ESCキーで一時停止/再生
一時停止を数回した場合と、そのまま再生させた時、
ibta=12小節目の赤く光る処理がタイミングが変わることを確認してください。

これが、僕の言うところの、「譜面進行度のズレ」です。



A.C

リンク

2015/12/5(Sat) 23:25:10|NO.73467

こんにちは。

おそらくですがMP3がVBRでエンコードされているのが問題だと思います。
一時停止→再生したときに再生位置がずれているようです。
(この状態だと正しい再生位置が取得できない?)
試しにCBRでエンコードしてみるととくにずれを感じなかったので試してみてください。



Sado

リンク

2015/12/5(Sat) 23:54:43|NO.73468

>A.Cさん
ズレが解消されました!
まだまだ勉強不足だったようですね、もう、何が何だか分からなくなってきました…
おとなしくテスト勉強でもするか…


■備忘録(お馬鹿な自分へ)
http://michisugara.jp/archives/2013/encmode.html
mciで再生位置を取得する際に、VBRでエンコードしているとズレる。(一時停止などで)
Xmedia Recoderなどで「固定ビットレート(CBR)」で変換すること



空気

リンク

2015/12/7(Mon) 11:52:24|NO.73484

余談ですが、
CBRがVBRの音質に勝ることは基本的にないので。
容量を特に気にしないのであれば、
ビットレートは320k以上に設定した方がいいかと思われます。

VBRのイメージ
http://nagamochi.info/src/up157439.png.html

CBRのイメージ
http://nagamochi.info/src/up157438.png.html

http://michisugara.jp/archives/2013/encmode.html
より転載(転載OKだったので)



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