この操作を覚えれば、モノラルサウンドで簡易3Dサウンドが出来ます。
using System; using System.Windows.Forms; using System.IO; using System.Drawing; using Microsoft.DirectX.DirectSound; using DS = Microsoft.DirectX.DirectSound; using System.Runtime.InteropServices; using System.Threading; namespace Sound2 { /// <summary> /// Class1 の概要の説明です。 /// </summary> public class SoundForm:Form { private Device device_; private DS.SecondaryBuffer secondaryBufferA_; //開くファイル private string fileName =@"i:\temp\test3.wav"; private System.Windows.Forms.TrackBar volumeTrackBar; private System.Windows.Forms.TrackBar panTrackBar; public SoundForm() { InitializeComponent(); volumeTrackBar.ValueChanged+=new EventHandler(volumeTrackBar_ValueChanged); panTrackBar.ValueChanged+=new EventHandler(panTrackBar_ValueChanged); this.Text="DirectSound"; DSInitialize(); } protected override void Dispose( bool disposing ) { if( disposing ) { if(secondaryBufferA_ != null) { secondaryBufferA_.Stop(); secondaryBufferA_.Dispose(); } if(device_ != null) { device_.Dispose(); } } base.Dispose( disposing ); } private void InitializeComponent() { this.volumeTrackBar = new System.Windows.Forms.TrackBar(); this.panTrackBar = new System.Windows.Forms.TrackBar(); ((System.ComponentModel.ISupportInitialize) (this.volumeTrackBar)).BeginInit(); ((System.ComponentModel.ISupportInitialize) (this.panTrackBar)).BeginInit(); this.SuspendLayout(); // // volumeTrackBar // this.volumeTrackBar.LargeChange = 250; this.volumeTrackBar.Location = new System.Drawing.Point(16, 24); this.volumeTrackBar.Maximum = 0; this.volumeTrackBar.Minimum = -10000; this.volumeTrackBar.Name = "volumeTrackBar"; this.volumeTrackBar.Size = new System.Drawing.Size(264, 42); this.volumeTrackBar.TabIndex = 0; this.volumeTrackBar.TickFrequency = 1000; // // panTrackBar // this.panTrackBar.LargeChange = 500; this.panTrackBar.Location = new System.Drawing.Point(16, 88); this.panTrackBar.Maximum = 10000; this.panTrackBar.Minimum = -10000; this.panTrackBar.Name = "panTrackBar"; this.panTrackBar.Size = new System.Drawing.Size(256, 42); this.panTrackBar.TabIndex = 1; this.panTrackBar.TickFrequency = 1000; // // SoundForm // this.AutoScaleBaseSize = new System.Drawing.Size(5, 12); this.ClientSize = new System.Drawing.Size(292, 273); this.Controls.Add(this.panTrackBar); this.Controls.Add(this.volumeTrackBar); this.Name = "SoundForm"; ((System.ComponentModel.ISupportInitialize) (this.volumeTrackBar)).EndInit(); ((System.ComponentModel.ISupportInitialize) (this.panTrackBar)).EndInit(); this.ResumeLayout(false); } private void DSInitialize() { device_ =new Device(); //協調レベルの設定 device_.SetCooperativeLevel(this,CooperativeLevel.Normal); //バッファについての情報設定クラス BufferDescription desc=new BufferDescription(); desc.ControlVolume =true; desc.ControlPan =true; //セカンダリバッファを作成 secondaryBufferA_ = new SecondaryBuffer(fileName,desc,device_); secondaryBufferA_.Play(0,0); } private void volumeTrackBar_ValueChanged(object sender, EventArgs e) { secondaryBufferA_.Volume = volumeTrackBar.Value; } private void panTrackBar_ValueChanged(object sender, EventArgs e) { secondaryBufferA_.Pan = panTrackBar.Value; } } public class Program { public static void Main() { Application.Run(new SoundForm()); } } }
DirectSoundではバッファで使いたい機能をあらかじめ使うと宣言する必要があります。今回は「volume(音量)」と「pan(左右バランス)」をいじりたいのでソースコードの通りtrueにしています。
バッファについているVolumeプロパティで変更できます。値は減衰率を表し範囲は「-10000~0」です。0が一番大きな音でdBの1/100単位で設定します。とりあえずいじってみてください。100dB減衰された音は事実上無音になります。
左右のチャンネル間相対ボリュームを表します。値は-10000~10000で、ボリュームと同じくdBの1/100単位です。「-」側に行くと左側に音が寄ります。0が中央です。