再生しながら音量変更

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
だんごさん
記事: 273
登録日時: 13年前

再生しながら音量変更

#1

投稿記事 by だんごさん » 13年前

こんばんは。
私の書いたプログラムが間違っている可能性が大きいのは承知の上で、聞いてください。
音楽(mp3)の再生をある関数の中で行うと、関数を出てもBGMは鳴り続けると思います。
その時の音量は最大だとします。
ある関数(例えば設定画面の部分)で音量を変更したい場合、あるキーが押されると
ChangeVolumeSoundMem(音量を変更する関数)の値を減らすとします。
ただしその時、音楽を流す関数を別の関数で呼び出していたので、音量はもちろん変わりません。
ChangeVolumeSoundMemは音楽を再生する前に呼び出す必要があるからです。

そこで私はお試し半分でその音量を変更する関数(設定画面の部分)に、CheckSoundMem(再生中か調べる)で
音楽が流れていない時は、そのBGMを流す…というプログラムを書いてみました。
すると音量の値が減るにつれてBGMの音量も減って行きました。

ただしその時、音量の値が減ってもBGMは少しずつ音量が減り、音量0に近づくにつれて
いきなり音量が減る具合でした。

さて…音量が変わるからこれでいいやと思ってはいたものの…
さすがにプログラムとしておかしい、また四聖龍神録Plusで音量を変える時は値が減るに比例してきちんと音量が
減っている、ということから正しくないと判断しました(最初から思ってましたが・・・)

何かとプログラムを書いていたので正しい書き方があやふやになってきました。
音楽の音量を再生しながら変更するにはどうされますか?
 Dango San

トクメイ

Re: 再生しながら音量変更

#2

投稿記事 by トクメイ » 13年前

だんごさん さんが書きました: 何かとプログラムを書いていたので正しい書き方があやふやになってきました。
音楽の音量を再生しながら変更するにはどうされますか?
プログラムを見ていないのでよく全体像がつかめてませんので間違ってたらすいません。

リファレンスには

宣言 int ChangeVolumeSoundMem( int VolumePal , int SoundHandle ) ;

概略 メモリに読みこんだ音声データの再生にボリュームを設定する

引数 int VolumePal  : 設定する音量( 0 ~ 255 )
int SoundHandle : 音量を設定する音の識別番号(サウンドハンドル)
戻り値  0:成功
  -1:エラー発生

解説  再生する音の音量を設定します。0は無音、255で 最大音量です。
 音を再生中でも音量の変更は可能です。


と書かれています。ですので再生中でも問題ないと思うのですが。

だんごさん
記事: 273
登録日時: 13年前

Re: 再生しながら音量変更

#3

投稿記事 by だんごさん » 13年前

あら?そうでしたか…では音量が変わらなかったのはなぜなんでしょう。

とりあえず今はプログラミングできる環境ではないので明日やってみます。
 Dango San

紫電
記事: 14
登録日時: 13年前

Re: 再生しながら音量変更

#4

投稿記事 by 紫電 » 13年前

もしかしたら、ソースの引数が違うかもwですw

だんごさん
記事: 273
登録日時: 13年前

Re: 再生しながら音量変更

#5

投稿記事 by だんごさん » 13年前

すみません、明日とか言ってましたが今プログラミングができるようになり、
だんごさん さんが書きました:そこで私はお試し半分でその音量を変更する関数(設定画面の部分)に、CheckSoundMem(再生中か調べる)で音楽が流れていない時は、そのBGMを流す…というプログラムを書いてみました。
の部分を消して、ChangeVolumeSoundMemだけにしてみました。
すると音量は変更できました。
ところが
だんごさん さんが書きました:ただしその時、音量の値が減ってもBGMは少しずつ音量が減り、音量0に近づくにつれていきなり音量が減る具合でした。
が治っていませんでした。これはプログラム上の問題とはあまり思えないのですがどうでしょう・・・?
 Dango San

トクメイ

Re: 再生しながら音量変更

#6

投稿記事 by トクメイ » 13年前

だんごさん さんが書きました:
だんごさん さんが書きました:ただしその時、音量の値が減ってもBGMは少しずつ音量が減り、音量0に近づくにつれていきなり音量が減る具合でした。
が治っていませんでした。これはプログラム上の問題とはあまり思えないのですがどうでしょう・・・?
う~ん。なんとも言いようがないですね。
プログラム上の問題かどうかをプログラムを見ずして判断することは誰であっても難しいと思われます。

ただまぁ予想としては「あるキーが押されると音量を減らすプログラム」を書いているということなんでキー入力に関する処理に原因があるように思われます。
(例えばCheckHitKey()だけで単純にキー入力を分岐させ音量変更させているとかですかね...)

だんごさん
記事: 273
登録日時: 13年前

Re: 再生しながら音量変更

#7

投稿記事 by だんごさん » 13年前

トクメイ さんが書きました:ただまぁ予想としては「あるキーが押されると音量を減らすプログラム」を書いているということなんでキー入力に関する処理に原因があるように思われます。(例えばCheckHitKey()だけで単純にキー入力を分岐させ音量変更させているとかですかね...)
明らかに当てはまっていたので、ソースを書き変えようとしましたが変わらず・・・。

つまりどのように書きかえれば良いのでしょうか?
ヒントをお願いします。
 Dango San

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 再生しながら音量変更

#8

投稿記事 by softya(ソフト屋) » 13年前

簡易版で良いので問題を再現できるコードを貼ってもらえば解決は早いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

だんごさん
記事: 273
登録日時: 13年前

Re: 再生しながら音量変更

#9

投稿記事 by だんごさん » 13年前

コード:

		if( Key[ KEY_INPUT_RIGHT]>=1 ){
				BGM_volum++;
				if(BGM_volum>=255)BGM_volum = 255;
				sw_so.BGMvol = BGM_volum;
			}
こんな感じですかね?これはうまくいかないソースですね。
音量を変える関数はこの後に呼び出しています。
 Dango San

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 再生しながら音量変更

#10

投稿記事 by softya(ソフト屋) » 13年前

部分的では意味が無いので、それだけで動作する簡易的なプログラムを見せていただきたいです。
softya(ソフト屋) さんが書きました:簡易版で良いので問題を再現できるコードを貼ってもらえば解決は早いと思います。
今のやりとりが続いても答えにたどり着ける可能性は低いと思いましたので提案しましたが作る時間的な余裕は無いのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

だんごさん
記事: 273
登録日時: 13年前

Re: 再生しながら音量変更

#11

投稿記事 by だんごさん » 13年前

申し訳ありませんでした。

コード:

#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();


}
これでどうでしょう?動くかはテストしました。

実際とはちょこっと違いますが、関数の使い方などは大体似ています。
 Dango San

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 再生しながら音量変更

#12

投稿記事 by softya(ソフト屋) » 13年前

聴感上の音量は直線に変化するわけではないので、こんなモノだと思います。
ただ、なぜChangeVolumeSoundMemで80%の音量に補正しているんでしょうか?
[補足] そのせいで余計変化度合いが少なくなっています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

だんごさん
記事: 273
登録日時: 13年前

Re: 再生しながら音量変更

#13

投稿記事 by だんごさん » 13年前

softya(ソフト屋) さんが書きました:ただ、なぜChangeVolumeSoundMemで80%の音量に補正しているんでしょうか?[補足] そのせいで余計変化度合いが少なくなっています。
あ、それはサンプルプログラムからコピペしてたものでした;


それと自分のソースを見直していたら、どうやらBGM_VOlの値(BGMのボリューム)を
割っていたようで・・・
お恥ずかしいミスでご迷惑をおかけしました、すみません。
よって割る行為を無くしてみまして、正常になるようになりました。
ありがとうございました。
 Dango San

閉鎖

“C言語何でも質問掲示板” へ戻る