ページ 1 / 1
再生しながら音量変更
Posted: 2012年5月07日(月) 22:08
by だんごさん
こんばんは。
私の書いたプログラムが間違っている可能性が大きいのは承知の上で、聞いてください。
音楽(mp3)の再生をある関数の中で行うと、関数を出てもBGMは鳴り続けると思います。
その時の音量は最大だとします。
ある関数(例えば設定画面の部分)で音量を変更したい場合、あるキーが押されると
ChangeVolumeSoundMem(音量を変更する関数)の値を減らすとします。
ただしその時、音楽を流す関数を別の関数で呼び出していたので、音量はもちろん変わりません。
ChangeVolumeSoundMemは音楽を再生する前に呼び出す必要があるからです。
そこで私はお試し半分でその音量を変更する関数(設定画面の部分)に、CheckSoundMem(再生中か調べる)で
音楽が流れていない時は、そのBGMを流す…というプログラムを書いてみました。
すると音量の値が減るにつれてBGMの音量も減って行きました。
ただしその時、音量の値が減ってもBGMは少しずつ音量が減り、音量0に近づくにつれて
いきなり音量が減る具合でした。
さて…音量が変わるからこれでいいやと思ってはいたものの…
さすがにプログラムとしておかしい、また四聖龍神録Plusで音量を変える時は値が減るに比例してきちんと音量が
減っている、ということから正しくないと判断しました(最初から思ってましたが・・・)
何かとプログラムを書いていたので正しい書き方があやふやになってきました。
音楽の音量を再生しながら変更するにはどうされますか?
Re: 再生しながら音量変更
Posted: 2012年5月07日(月) 23:48
by トクメイ
だんごさん さんが書きました:
何かとプログラムを書いていたので正しい書き方があやふやになってきました。
音楽の音量を再生しながら変更するにはどうされますか?
プログラムを見ていないのでよく全体像がつかめてませんので間違ってたらすいません。
リファレンスには
宣言 int ChangeVolumeSoundMem( int VolumePal , int SoundHandle ) ;
概略 メモリに読みこんだ音声データの再生にボリュームを設定する
引数 int VolumePal : 設定する音量( 0 ~ 255 )
int SoundHandle : 音量を設定する音の識別番号(サウンドハンドル)
戻り値 0:成功
-1:エラー発生
解説 再生する音の音量を設定します。0は無音、255で 最大音量です。
音を再生中でも音量の変更は可能です。
と書かれています。ですので再生中でも問題ないと思うのですが。
Re: 再生しながら音量変更
Posted: 2012年5月08日(火) 00:42
by だんごさん
あら?そうでしたか…では音量が変わらなかったのはなぜなんでしょう。
とりあえず今はプログラミングできる環境ではないので明日やってみます。
Re: 再生しながら音量変更
Posted: 2012年5月08日(火) 01:00
by 紫電
もしかしたら、ソースの引数が違うかもwですw
Re: 再生しながら音量変更
Posted: 2012年5月12日(土) 09:08
by だんごさん
すみません、明日とか言ってましたが今プログラミングができるようになり、
だんごさん さんが書きました:そこで私はお試し半分でその音量を変更する関数(設定画面の部分)に、CheckSoundMem(再生中か調べる)で音楽が流れていない時は、そのBGMを流す…というプログラムを書いてみました。
の部分を消して、ChangeVolumeSoundMemだけにしてみました。
すると音量は変更できました。
ところが
だんごさん さんが書きました:ただしその時、音量の値が減ってもBGMは少しずつ音量が減り、音量0に近づくにつれていきなり音量が減る具合でした。
が治っていませんでした。これはプログラム上の問題とはあまり思えないのですがどうでしょう・・・?
Re: 再生しながら音量変更
Posted: 2012年5月12日(土) 22:38
by トクメイ
だんごさん さんが書きました:
だんごさん さんが書きました:ただしその時、音量の値が減ってもBGMは少しずつ音量が減り、音量0に近づくにつれていきなり音量が減る具合でした。
が治っていませんでした。これはプログラム上の問題とはあまり思えないのですがどうでしょう・・・?
う~ん。なんとも言いようがないですね。
プログラム上の問題かどうかをプログラムを見ずして判断することは誰であっても難しいと思われます。
ただまぁ予想としては「あるキーが押されると音量を減らすプログラム」を書いているということなんでキー入力に関する処理に原因があるように思われます。
(例えばCheckHitKey()だけで単純にキー入力を分岐させ音量変更させているとかですかね...)
Re: 再生しながら音量変更
Posted: 2012年5月16日(水) 17:06
by だんごさん
トクメイ さんが書きました:ただまぁ予想としては「あるキーが押されると音量を減らすプログラム」を書いているということなんでキー入力に関する処理に原因があるように思われます。(例えばCheckHitKey()だけで単純にキー入力を分岐させ音量変更させているとかですかね...)
明らかに当てはまっていたので、ソースを書き変えようとしましたが変わらず・・・。
つまりどのように書きかえれば良いのでしょうか?
ヒントをお願いします。
Re: 再生しながら音量変更
Posted: 2012年5月16日(水) 17:12
by softya(ソフト屋)
簡易版で良いので問題を再現できるコードを貼ってもらえば解決は早いと思います。
Re: 再生しながら音量変更
Posted: 2012年5月16日(水) 17:26
by だんごさん
コード:
if( Key[ KEY_INPUT_RIGHT]>=1 ){
BGM_volum++;
if(BGM_volum>=255)BGM_volum = 255;
sw_so.BGMvol = BGM_volum;
}
こんな感じですかね?これはうまくいかないソースですね。
音量を変える関数はこの後に呼び出しています。
Re: 再生しながら音量変更
Posted: 2012年5月16日(水) 17:32
by softya(ソフト屋)
部分的では意味が無いので、それだけで動作する簡易的なプログラムを見せていただきたいです。
softya(ソフト屋) さんが書きました:簡易版で良いので問題を再現できるコードを貼ってもらえば解決は早いと思います。
今のやりとりが続いても答えにたどり着ける可能性は低いと思いましたので提案しましたが作る時間的な余裕は無いのでしょうか?
Re: 再生しながら音量変更
Posted: 2012年5月16日(水) 18:18
by だんごさん
申し訳ありませんでした。
コード:
#include "DxLib.h"
void ChangeVol(int Vol);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int sound;
//ウィンドウモードで…
ChangeWindowMode( TRUE );
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
//データをロード
sound = LoadSoundMem("data.mp3");
//再生~
PlaySoundMem( sound , DX_PLAYTYPE_LOOP , TRUE );
//音量変更ループ ↓ESCで脱出
while( ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ClearDrawScreen() == 0 )
{
ChangeVol( sound );
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
//音量を変更する関数
int BGM_volum = 255;
void ChangeVol(int Vol)
{
// 右キーが押されている間
if( CheckHitKey( KEY_INPUT_RIGHT ) >=1 )
{
//音量を上げる
BGM_volum++;
//255を超えてたら255を代入
if(BGM_volum >= 255)BGM_volum = 255;
}
// 左キーが押されている間
else if( CheckHitKey( KEY_INPUT_LEFT ) >=1 )
{
//音量を下げる
BGM_volum--;
//0を超えていたら0を代入
if(BGM_volum <=0 )BGM_volum = 0;
}
//BGMの音量を変更
ChangeVolumeSoundMem( BGM_volum * 80 / 100 , Vol );
DrawFormatString( 0, 0, GetColor(255,255,255), "%d" , BGM_volum);
ScreenFlip();
}
これでどうでしょう?動くかはテストしました。
実際とはちょこっと違いますが、関数の使い方などは大体似ています。
Re: 再生しながら音量変更
Posted: 2012年5月16日(水) 18:35
by softya(ソフト屋)
聴感上の音量は直線に変化するわけではないので、こんなモノだと思います。
ただ、なぜChangeVolumeSoundMemで80%の音量に補正しているんでしょうか?
[補足] そのせいで余計変化度合いが少なくなっています。
Re: 再生しながら音量変更
Posted: 2012年5月16日(水) 18:48
by だんごさん
softya(ソフト屋) さんが書きました:ただ、なぜChangeVolumeSoundMemで80%の音量に補正しているんでしょうか?[補足] そのせいで余計変化度合いが少なくなっています。
あ、それはサンプルプログラムからコピペしてたものでした;
それと自分のソースを見直していたら、どうやらBGM_VOlの値(BGMのボリューム)を
割っていたようで・・・
お恥ずかしいミスでご迷惑をおかけしました、すみません。
よって割る行為を無くしてみまして、正常になるようになりました。
ありがとうございました。