忍者ブログ

2024-03-29(Fri)

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2006-10-27(Fri)

VB6 音量調節の仕方 Wav 2

 さて、困ったことになった、Waveの音量調節。

 MCIコマンドではデバイスによっては使えたり使えなかったり・・・。

 ちなみに私の環境では使えないということが分かった以上、もうどうすることもできなかった・・・。

 そんななか、ようやく見つけたマイクロソフトのページ。

Visual Basic からのサウンド ファイルの音量を制御する方法

これでできるだろうか・・・

拍手[0回]

 ただ、このページ。英語をそのまま機械で翻訳しているので、なんのこっちゃよくわからない。

 しかも、肝心のソースの解説は翻訳されずに英語のままときたもんだ。

 正直、よくわからない。とにかく作るのみ。formにスライダーとボタンをつける。
スライダーはボリューム。そしてボタンを押下すると音がなるというもの。

 まずは、APIの関数

まず、音量を取得する関数。
Declare Function waveOutGetVolume Lib "winmm.dll" (ByVal wDeviceID As Integer, dwVolume As Long) As Integer
ちなみに、マイクロソフトのページでは、"dll"の指定は"MMSYSTEM.dll"となっているが、これでは動かない。というより、ないのである。必ず、"winmm.dll"と指定しよう。

そして、音量をセットする関数。これは、左右の音量をセットする形になっている。
Declare Function waveOutSetVolume Lib "winmm.dll" (ByVal wDeviceID As Integer, ByVal dwVolume As Long) As Integer

次に、waveを出力する関数。
Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

waveOutGetVolumeでは、左右両方の音量が一つの変数に格納されるので、まずは左右別々の値にしなくてはいけない。

Dim Pub_onryo As Long  '音量
Dim Def_onryo As Long  'このシステムの元の音量
Dim Pub_vol            '音声出力時に使うもの。
Dim CurrentVolLeft As Long       '元の左の音量
Dim CurrentVolRight As Long   '元の右の音量
Dim ret                 As Integer

Private Sub Form_Load()
'元の音量の取得
   ret = waveOutGetVolume(0, Def_onryo)
   CurrentVolLeft = Def_onryo And &HFFFF&
   CurrentVolRight = ((Def_onryo And &HFFFF0000) / &H10000) And &HFFFF&
End Sub


ちなみに、音量はすべて16進数で示されている。無音は 0 そして最大値はFFFFとなっている。
FFFFは数字に直すと、65535だ。
スライダーのプロパティに最大値は65535として、値を 設定してやること。スライダーの値そのまま
を音量とする。

Private Sub Slider1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Pub_onryo = Slider1.Value
    Call set_onryo
End Sub

set_onryoで、音量をセットする。

Sub set_onryo()
'システム音量の変更
   Pub_vol = Hex$(Pub_onryo) & Hex$(Pub_onryo)
   ret = waveOutSetVolume(0, "&H" & Pub_vol)
 End Sub

ボタンをクリックしたら音声を出力
Private Sub BT_WAV_Click()
    fnm="bgm.wav"
    ret = sndPlaySound(fnm, SND_ASYNC)   
End Sub

出来ました\(^o^)/
本当はもっと複雑なロジックですが、わかりやすくするために、必要な処理のみ書きました。
ちなみに、終わるときには、音量を元にもどすことを忘れずに。

Private Sub Form_Unload(Cancel As Integer)

     ret = waveOutSetVolume(0, Def_onryo)

End Sub

あぁ、よかった。これで眠れる。

 

PR

この記事にコメントする

Name
Title
Mail
URL
Comment
Pass
Pictgram
Vodafone絵文字 i-mode絵文字 Ezweb絵文字

ByRef

2011-05-18 13:22

Declare Function waveOutGetVolume Lib "winmm.dll" (ByVal wDeviceID As Integer, ByRef dwVolume As Long) As Integer

GET関数の戻り値がBYVALになっています。

この記事へのトラックバック

この記事にトラックバックする

Amazon

PR

情報サービス

楽天

ソフト関連

メーカー直販PC

周辺機器

ランキング

プロフィール

HN:
NORI
性別:
男性
趣味:
車でどこへでも
自己紹介:
文学部卒業ながら、ひょんなことからシステム会社に就職。
しかしながらあまりの激務に退職。もうシステム系はいやだと思っていたが、ひょんなことから企業の電算室に勤務することとなる。

カレンダー

02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

ブログ内検索

Google
Web ブログ内

最新TB

アクセス解析