chakokuのブログ(rev4)

日々のごった煮ブログです

(ご参考)SharpDX.XAudio2による440Hzの再生サンプル

SharpDX.XAudio2によりSin波(440Hz)を再生させるサンプルソースをご参考に貼り付けます。
このままコンパイルしてもSharpDXがないのでエラーになります。SharpDXはMS VisualStdioのパッケージ管理ツール(NuGet PackageManager)を使ってお使いのPC環境にインストールしてからビルトしてください。

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SharpDX.XAudio2;
using SharpDX.Multimedia;
using SharpDX.IO;
using SharpDX;

namespace SinWaveTest
{
    public partial class Form1 : Form
    {

        XAudio2 xaudio2;
        MasteringVoice masteringVoice;
        SourceVoice sourceVoice;
        DataStream dataStream;
        int bufferSize;
        AudioBuffer audioBuffer;
        WaveFormat waveFormat;
        const int PLAYTONE = 440;  // play A440 Hz
        const int PLAYSEC = 100; // data for 100msec
        const int SAMPLING = 44100; // sampling rate
        const int BITDEPTH = 16;
        const int CHANNELS = 1;
        bool isPlaing = false;

        int numberOfSamples = 0;

        public Form1()
        {
            InitializeComponent();
            soundSetup();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            if (!isPlaing)  // check playing or not.. Unskilful coding.. mmm
            {
                sourceVoice.Start();  
                isPlaing = true;
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            // stop
            sourceVoice.Stop();
            isPlaing = false;
        }

        void soundSetup()
        {
            xaudio2 = new XAudio2();
            masteringVoice = new MasteringVoice(xaudio2);
            waveFormat = new WaveFormat(SAMPLING, BITDEPTH, CHANNELS);
            sourceVoice = new SourceVoice(xaudio2, waveFormat);
            bufferSize = waveFormat.ConvertLatencyToByteSize(PLAYSEC);
            dataStream = new DataStream(bufferSize, true, true);
            numberOfSamples = bufferSize / waveFormat.BlockAlign;
            audioBuffer = new AudioBuffer
            {
                Stream = dataStream,
                Flags = BufferFlags.EndOfStream,
                AudioBytes = bufferSize,
                LoopCount = AudioBuffer.LoopInfinite
            };
            generateSinWave(PLAYTONE); // 440Hz
            sourceVoice.SubmitSourceBuffer(audioBuffer, null);
        }
        void generateSinWave(int freq)
        {
            Int16 value;
            dataStream.Position = 0;
            for (int i = 0; i < numberOfSamples; i++)
            {
                    value = (Int16)(Math.Sin(2 * Math.PI * freq * i / waveFormat.SampleRate) * System.Int16.MaxValue);
                    dataStream.Write(value);
            }
        }

    }

}

NuGet PackageManagerでSharpDXをローカルにインストールしているところ

サンプルを実行した画面(上記はForm.csだけなので、プロジェクトの各種設定が必要ですが。。)


■引用先
あちこちのサイトからSharpDXのサンプルを引用させていただきました。情報ありがとうございます。どのサイトから引用したか?は下記の記事を参照ください。
http://d.hatena.ne.jp/chakoku/20150815/1439623261
DirectSoundで音を出す(C#)→かなり難航→SharpDXを使うと良さそうだ