注æ
ãã®ãã¼ã¸ã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ è¦ã§ãã ãµã¤ã³ã¤ã³ã¾ãã¯ãã£ã¬ã¯ããªã®å¤æ´ã試ããã¨ãã§ãã¾ãã
ãã®ãã¼ã¸ã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ è¦ã§ãã ãã£ã¬ã¯ããªã®å¤æ´ã試ããã¨ãã§ãã¾ãã
XAudio2 ã«ãã Windows 8 ã®ãµã¦ã³ãçæ
ã³ã¼ã ãµã³ãã«ããã¦ã³ãã¼ããã
Windows 8 åãã® Windows ã¹ã㢠ã¢ããªã§ã¯ãMediaElement ã¯ã©ã¹ã使ã£ã¦ MP3 ã WMA ã®ãµã¦ã³ã ãã¡ã¤ã«ãç°¡åã«åçã§ãã¾ãããã®ã¯ã©ã¹ã«ããµã¦ã³ã ãã¡ã¤ã«ã® URL ã¾ãã¯ã¹ããªã¼ã ãæå®ããã ãã§ããWindows ã¹ã㢠ã¢ããªããã¯ããããªããªã¼ãã£ãªãå¤é¨ããã¤ã¹ã«ã¹ããªã¼ãã³ã°ããããã® Play To API ã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãã
ãããããã£ã¨é«åº¦ãªãªã¼ãã£ãªå¦çãå¿ è¦ãªå ´åã¯ã©ãããã°ããã§ãããããã¨ãã°ããã¼ãã¦ã§ã¢ã«ãªã¼ãã£ãª ãã¡ã¤ã«ãèªã¿è¾¼ãéã«ã³ã³ãã³ããå å·¥ãããããµã¦ã³ããåçã«çæããããããããªå ´åã§ãã
Windows ã¹ã㢠ã¢ããªã§ã¯ãDirectX ã使ã£ã¦ãã®ãããªé«åº¦ãªå¦çãå®è¡ã§ãã¾ããWindows 8 ã¯ããµã¦ã³ãã®çæã¨å¦çç¨ã« 2 ã¤ã® DirectX ã³ã³ãã¼ãã³ã (Core Audio 㨠XAudio2) ããµãã¼ããã¾ãã大æãããªæ§æ³ã®ä¸ã§ã2 ã¤ã¨ãã©ã¡ããã¨ããã°ä½ã¬ãã«ã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ãããã ããCore Audio 㯠XAudio2 ããããã«ä½ã¬ãã«ã§ããªã¼ãã£ãª ãã¼ãã¦ã§ã¢ã¨å¯æ¥ãªçµã³ä»ããå¿ è¦ã¨ããã¢ããªã±ã¼ã·ã§ã³ã対象ã¨ãã¦ä½æããã¦ãã¾ãã
XAudio2 㯠DirectSound 㨠Xbox XAudio ã©ã¤ãã©ãªã«ä»£ãããã®ã§ãWindows ã¹ã㢠ã¢ããªã«ãµã¦ã³ãã«ããè峿·±ã仿ããå¿ è¦ã«ãªã£ãã¨ãã®ããããæåã®é¸æè¢ã§ããXAudio2 ã¯ä¸»ã«ã²ã¼ã ã対象ã¨ãã¦ãã¾ãããããã ãã«ã¨ã©ã¾ããã鳿¥½å¶ä½ããã¸ãã¹ ã¦ã¼ã¶ã¼ã楽ãã¾ããæå¿«ãªãµã¦ã³ããªã©ãããæ¬æ ¼çãªç¨éã«ã使ç¨ã§ãã¾ãã
XAudio2 ãã¼ã¸ã§ã³ 2.8 㯠Windows 8 ã®çµã¿è¾¼ã¿ã³ã³ãã¼ãã³ãã§ããXAudio2 ããã°ã©ãã³ã° ã¤ã³ã¿ã¼ãã§ã¤ã¹ã¯ãDirectX ã®ä»ã®ããã°ã©ãã³ã° ã¤ã³ã¿ã¼ãã§ã¤ã¹ã¨åæ§ãCOM ãåºç¤ã«ãã¦ãã¾ããWindows 8 ã§ãµãã¼ãããã¦ããããã°ã©ãã³ã°è¨èªã§ããã°ãçè«ä¸ XAudio2 ã¸ã®ã¢ã¯ã»ã¹ã¯å¯è½ã§ãããXAudio2 ãæãèªç¶ãã¤å®¹æã«æ±ããè¨èªã¯ C++ ã§ãããµã¦ã³ãã®æä½ã«ã¯ãå¤ãã®å ´åãé«ãããã©ã¼ãã³ã¹ã®ã³ã¼ããæ±ããããããããã®ç¹ã§ã C++ ã¯åªãã鏿è¢ã§ãã
åãã¦ã® XAudio2 ããã°ã©ã
ã§ã¯ã¾ã XAudio2 ã使ã£ã¦ããã¿ã³ãã¯ãªãã¯ããã¨ã·ã³ãã«ãª 5 ç§éã®ãµã¦ã³ããåçããããã°ã©ã ãè¨è¿°ãã¦ã¿ã¾ããããWindows 8 㨠DirectX ã®ããã°ã©ãã³ã°ãåãã¦ã®æ¹ããããããããªãã®ã§ãå°ããã£ããé²ãã¾ãã
Windows ã¹ã㢠ã¢ããªã®ä½æã«é©ãããã¼ã¸ã§ã³ã® Visual Studio ãã¤ã³ã¹ãã¼ã«ããã¦ãããã®ã¨ãã¾ãã[æ°ããããã¸ã§ã¯ã] ãã¤ã¢ãã° ããã¯ã¹ã§ãå·¦å´ã® [Visual C++] 㨠[Windows ã¹ãã¢] ãã¯ãªãã¯ãã使ç¨å¯è½ãªãã³ãã¬ã¼ãã®ãªã¹ãã®ä¸ãã [æ°ããã¢ããªã±ã¼ã·ã§ã³ (XAML)] ãã¯ãªãã¯ãã¾ããä»åã¯ããã¸ã§ã¯ãã«ãSimpleAudioãã¨ããååãä»ãã¾ãããã®è¨äºã®ãã¦ã³ãã¼ã ã³ã¼ãã«ããã®ååã®ããã¸ã§ã¯ããããã¾ãã
XAudio2 ã使ç¨ããå®è¡å¯è½ãã¡ã¤ã«ããã«ãããéã«ãããã°ã©ã 㨠xaudio2.lib ã¤ã³ãã¼ã ã©ã¤ãã©ãªã¨ããªã³ã¯ããå¿ è¦ãããã¾ãã[ããã¸ã§ã¯ã] ã¡ãã¥ã¼ã® 1 çªä¸ã®ã¡ãã¥ã¼é ç®ãã¯ãªãã¯ããããã½ãªã¥ã¼ã·ã§ã³ ã¨ã¯ã¹ããã¼ã©ã¼ã®ããã¸ã§ã¯ãåãå³ã¯ãªãã¯ãã¦ãã [ããããã£] ãã¯ãªãã¯ãããã¨ã§ã[(ããã¸ã§ã¯ãå) ãããã㣠ãã¼ã¸] ãã¤ã¢ãã° ããã¯ã¹ãéãã¾ããå·¦å´ã®åã§ã[æ§æããããã£] ãã¯ãªãã¯ãã¦ããã[ãªã³ã«ã¼]ã[å ¥å] ã®é ã«ã¯ãªãã¯ãã¾ãã[追å ã®ä¾åãã¡ã¤ã«] ( 1 çªä¸ã®é ç®)ãå°ããç¢å°ã®é ã«ã¯ãªãã¯ãã¾ãã[ç·¨é] ãã¯ãªãã¯ããããã¹ã ããã¯ã¹ã«ãxaudio2.libãã¨å ¥åãã¾ãã
xaudio2.h ãããã¼ ãã¡ã¤ã«ãåç §ãããããpch.h ãã¡ã¤ã«ã®ããªã³ã³ãã¤ã«æ¸ã¿ãããã¼ã®ãªã¹ãã«ä¸è¨ã®ã¹ãã¼ãã¡ã³ãã追å ãã¾ãã
#include <xaudio2.h>
MainPage.xaml ãã¡ã¤ã«ã«ã¯ãXAudio2 API ã®æä½ä¸ã«ããã°ã©ã ã§çºçããå¯è½æ§ã®ããã¨ã©ã¼ã表示ããããã® TextBlock ã¨ããµã¦ã³ãåçç¨ã® Button ã追å ãã¾ããããã®è¿½å ãå³ 1 ã«ç¤ºãã¾ãã
å³ 1 SimpleAudio ã® MainPage.xaml ãã¡ã¤ã«
<Page x:Class="SimpleAudio.MainPage" ... >
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Name="errorText"
FontSize="24"
TextWrapping="Wrap"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
<Button Name="submitButton"
Content="Submit Audio Button"
Visibility="Collapsed"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Click="OnSubmitButtonClick" />
</Grid>
</Page>
MainPage.xaml.h ãããã¼ ãã¡ã¤ã«ã®ä¸»è¦é¨åãå³ 2 ã«ç¤ºãã¾ããä»å OnNavigatedTo ã¡ã½ããã¯ä½¿ç¨ããªãã®ã§ããã®å®£è¨ã¯åé¤ãã¦ãã¾ããããã§ã¯ãããã°ã©ã ã§ XAudio2 ã使ç¨ããããã«å¿ è¦ãª 4 ã¤ã®ãã£ã¼ã«ãã¨ããã¿ã³ã® Click ãã³ãã©ã¼ã宣è¨ãã¦ãã¾ãã
å³ 2 SimpleAudio ã® MainPage.xaml.h ãããã¼ ãã¡ã¤ã«
namespace SimpleAudio
{
public ref class MainPage sealed
{
private:
Microsoft::WRL::ComPtr<IXAudio2> pXAudio2;
IXAudio2MasteringVoice * pMasteringVoice;
IXAudio2SourceVoice * pSourceVoice;
byte soundData[2 * 5 * 44100];
public:
MainPage();
private:
void OnSubmitButtonClick(Platform::Object^ sender,
Windows::UI::Xaml::RoutedEventArgs^ args);
};
}
XAudio2 ã使ç¨ãããã¹ã¦ã®ããã°ã©ã ã¯ãIXAudio2 ã¤ã³ã¿ã¼ãã§ã¤ã¹ãå®è£ ãããªãã¸ã§ã¯ãã使ããå¿ è¦ãããã¾ã (ãªãã¸ã§ã¯ãã¯ç°¡åã«ä½æã§ãããã¨ããã®å¾ç¤ºãã¾ã)ãIXAudio2 㯠COM ã®èå㪠IUnknown ã¯ã©ã¹ããæ´¾çãã¦ãããããæ¬è³ªçã«åç §åæ°ãã«ã¦ã³ãããã¾ãããã®ãããIXAudio2 ç¬èªã®ãªã½ã¼ã¹ãããã°ã©ã ããåç §ãããªããªã£ãæç¹ã§èªåçã«åé¤ããã¾ããMicrosoft::WRL åå空éã® ComPtr (COM ãã¤ã³ã¿ã¼) ã¯ã©ã¹ã¯ãCOM ãªãã¸ã§ã¯ãã¸ã®ãã¤ã³ã¿ã¼ããåç §åæ°ã追跡ãã "ã¹ãã¼ã ãã¤ã³ã¿ã¼" ã«å¤æãã¾ããWindows ã¹ã㢠ã¢ããªã§ COM ãªãã¸ã§ã¯ããæä½ããå ´åã¯ãComPtr ã¯ã©ã¹ãå©ç¨ããæ¹æ³ããå§ããã¾ãã
ç°¡å㪠XAudio2 ããã°ã©ã ã§ãªããã°ãIXAudio2MasteringVoice ã¤ã³ã¿ã¼ãã§ã¤ã¹ã¨ IXaudio2SourceVoice ã¤ã³ã¿ã¼ãã§ã¤ã¹ãå®è£ ãããªãã¸ã§ã¯ãã¸ã®ãã¤ã³ã¿ã¼ãå¿ è¦ã«ãªãã¾ããXAudio2 ã®ç¨èªã§ã¯ã"ãã¤ã¹" ã¯ãªã¼ãã£ãª ãã¼ã¿ã®çæã夿´ãè¡ã 1 ã¤ã®ãªãã¸ã§ã¯ãã§ãããã¹ã¿ã¼ ãã¤ã¹ã¨ã¯ãæ¦å¿µçã«ã¯ãµã¦ã³ã ãããµã¼ã§ãåå¥ã®ãã¤ã¹ããã¹ã¦ã¾ã¨ããããããµã¦ã³ãçæãã¼ãã¦ã§ã¢åãã«æºåãã¾ãããã®ãããªãã¤ã¹ã¯ 1 ã¤ã ã使ç¨ãã¾ãããåå¥ã®ãµã¦ã³ããçæããã½ã¼ã¹ ãã¤ã¹ã¯æ°å¤ã使ç¨ããå ´åãããã¾ã (ã½ã¼ã¹ ãã¤ã¹ã«ãã£ã«ã¿ã¼å¦çãã¨ãã§ã¯ãå¦çãé©ç¨ããæ¹æ³ãããã¾ã)ã
IXAudio2MasterVoice ãã¤ã³ã¿ã¼ã¨ IXAudio2SourceVoice pointers ãã¤ã³ã¿ã¼ã«ã¯åç §ã«ã¦ã³ã¿ã¼ããªãããã®æå¹æé㯠IXAudio2 ãªãã¸ã§ã¯ãã«ãã£ã¦ç®¡çããã¾ãã
5 ç§éã®ãµã¦ã³ã ãã¼ã¿ç¨ã«æ¬¡ã®ããã«å¤§ããªé åãå«ãã¦ãã¾ãã
byte soundData[5 * 2 * 44100];
å®éã®ããã°ã©ã ã§ã¯ããã®ããã«å¤§ããªãµã¤ãºã®é åã¯å®è¡æã«å²ãå½ã¦ãå¿ è¦ãªããªã£ããã¡ã¢ãªããåé¤ããã¨ããã§ããããã®ãããªæ¹æ³ãã¨ã£ãçç±ã¯ããã«ãããã¾ãã
é åã®ãµã¤ãºã¯ã©ã®ããã«è¨ç®ããã®ã§ããããXAudio2 ã¯å§ç¸®ãªã¼ãã£ãªããµãã¼ããã¾ããããµã¦ã³ããçæããããã°ã©ã ã®å¤§åã¯ãã«ã¹ç¬¦å·å¤èª¿ (PCM) æ¹å¼ã使ç¨ãã¦ãã¾ããPCM ã®é³æ³¢ã¯ãåºå®ãµã³ããªã³ã° ã¬ã¼ãã®åºå®ãµã¤ãºã®å¤ã§è¡¨ããã¾ãã鳿¥½ CD ã®å ´åããµã³ããªã³ã° ã¬ã¼ã㯠1 ç§ããã 44,100 åã§ããã¹ãã¬ãªæ¹å¼ã§ã¯ 1 ãµã³ãã«ããã 2 ãã¤ãã使ç¨ãã¾ãããã®çµæã1 ç§ã®ãªã¼ãã£ãª ãã¼ã¿ã¯åè¨ 176,400 ãã¤ãã«ãªãã¾ã (ã¢ããªã±ã¼ã·ã§ã³ã«ãµã¦ã³ããåãè¾¼ãã¨ãã¯ãå§ç¸®ãããã¨ããå§ããã¾ããXAudio2 㯠ADPCM ããµãã¼ããã¾ããã¾ã Media Foundation ã¨ã³ã¸ã³ã§ã¯ WMA 㨠MP3 ããµãã¼ããã¾ã)ã
ä»åã®ããã°ã©ã ã§ãããµã³ããªã³ã° ã¬ã¼ãã 44,100 åã¨ãã1 ãµã³ãã«ããã 2 ãã¤ãã®å®¹éã使ç¨ããã¨ããè¨ç®ãæ¡ç¨ãã¾ããããããã£ã¦ãC++ ã§ã¯ãåãµã³ãã«ã short ã«ãã¾ããä»åã¯ã¢ãã©ã« ãµã¦ã³ãã使ãããã1 ç§éã®ãªã¼ãã£ãªã«ã¯ 88,200 ãã¤ãå¿ è¦ã§ããé åã®ã¡ã¢ãªã®å²ãå½ã¦ã¯ã5 ç§éãªã®ã§ãã® 5 åã§ãã
ãªãã¸ã§ã¯ãã®ä½æ
MainPage.xaml.cpp ãã¡ã¤ã«ã®å¤ãã®é¨åãå³ 3 ã«ç¤ºãã¦ãã¾ããXAudio2 ã®åæåã¯ãã¹ã¦ MainPage ã³ã³ã¹ãã©ã¯ã¿ã¼ã§è¡ã£ã¦ãã¾ããã¾ã XAudio2Create ãå¼ã³åºãã¦ãIXAudio2 ã¤ã³ã¿ã¼ãã§ã¤ã¹ãå®è£ ãããªãã¸ã§ã¯ãã¸ã®ãã¤ã³ã¿ã¼ãåå¾ãã¾ããããã XAudio2 ã使ç¨ããæåã®æé ã§ããä¸é¨ã® COM ã¤ã³ã¿ã¼ãã§ã¤ã¹ã¨ã¯ç°ãªããCoCreateInstance ãå¼ã³åºãå¿ è¦ã¯ããã¾ããã
å³ 3 MainPage.xaml.cpp
MainPage::MainPage()
{
InitializeComponent();
// Create an IXAudio2 object
HRESULT hr = XAudio2Create(&pXAudio2);
if (FAILED(hr))
{
errorText->Text = "XAudio2Create failure: " + hr.ToString();
return;
}
// Create a mastering voice
hr = pXAudio2->CreateMasteringVoice(&pMasteringVoice);
if (FAILED(hr))
{
errorText->Text = "CreateMasteringVoice failure: " + hr.ToString();
return;
}
// Create a source voice
WAVEFORMATEX waveformat;
waveformat.wFormatTag = WAVE_FORMAT_PCM;
waveformat.nChannels = 1;
waveformat.nSamplesPerSec = 44100;
waveformat.nAvgBytesPerSec = 44100 * 2;
waveformat.nBlockAlign = 2;
waveformat.wBitsPerSample = 16;
waveformat.cbSize = 0;
hr = pXAudio2->CreateSourceVoice(&pSourceVoice, &waveformat);
if (FAILED(hr))
{
errorText->Text = "CreateSourceVoice failure: " + hr.ToString();
return;
}
// Start the source voice
hr = pSourceVoice->Start();
if (FAILED(hr))
{
errorText->Text = "Start failure: " + hr.ToString();
return;
}
// Fill the array with sound data
for (int index = 0, second = 0; second < 5; second++)
{
for (int cycle = 0; cycle < 441; cycle++)
{
for (int sample = 0; sample < 100; sample++)
{
short value = sample < 50 ? 32767 : -32768;
soundData[index++] = value & 0xFF;
soundData[index++] = (value >> 8) & 0xFF;
}
}
}
// Make the button visible
submitButton->Visibility = Windows::UI::Xaml::Visibility::Visible;
}
void MainPage::OnSubmitButtonClick(Object^ sender,
RoutedEventArgs^ args)
{
// Create a button to reference the byte array
XAUDIO2_BUFFER buffer = { 0 };
buffer.AudioBytes = 2 * 5 * 44100;
buffer.pAudioData = soundData;
buffer.Flags = XAUDIO2_END_OF_STREAM;
buffer.PlayBegin = 0;
buffer.PlayLength = 5 * 44100;
// Submit the buffer
HRESULT hr = pSourceVoice->SubmitSourceBuffer(&buffer);
if (FAILED(hr))
{
errorText->Text = "SubmitSourceBuffer failure: " + hr.ToString();
submitButton->Visibility =
Windows::UI::Xaml::Visibility::Collapsed;
return;
}
}
IXAudio2 ãªãã¸ã§ã¯ãã使ããããCreateMasteringVoice ã¡ã½ãã㨠CreateSourceVoice ã¡ã½ããã«ããããããã¼ ãã¡ã¤ã«ã§ãã£ã¼ã«ãã¨ãã¦å®ç¾©ããå¥ã® 2 ã¤ã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã¸ã®ãã¤ã³ã¿ã¼ãåå¾ãã¾ãã
CreateSourceVoice ã®å¼ã³åºãã«ã¯ WAVEFORMATEX æ§é ä½ãå¿ è¦ã§ãããã㯠Win32 API ã§ãªã¼ãã£ãªãæ±ã£ããã¨ã®ããéçºè ã«ã¯ããªãã¿ã®æ§é ä½ã§ãããã®æ§é ä½ã§ã¯ãä»åã®ç¹å®ã®ãã¤ã¹ã«ä½¿ç¨ãããªã¼ãã£ãª ãã¼ã¿ã®æ§è³ªãå®ç¾©ãã¾ã (ç°ãªãã½ã¼ã¹ ãã¤ã¹ã«ã¯ç°ãªãå½¢å¼ã使ç¨ã§ãã¾ã)ãPCM ã®å ´åãé¢ä¿ããã®ã¯ãµã³ããªã³ã° ã¬ã¼ã (ãã®ä¾ã§ã¯ 44,100)ãåãµã³ãã«ã®ãµã¤ãº (2 ãã¤ãã¾ã㯠16 ããã)ããã£ã³ãã«æ° (ããã§ã¯ 1) ã® 3 ã¤ã®æ°å¤ã§ããä»ã®ãã£ã¼ã«ãã¯ä»¥ä¸ã®ããã«ãã¾ããnBlockAlign ãã£ã¼ã«ã㯠nChannels*wBitsPerSample/8ãnAvgBytesPerSec ãã£ã¼ã«ã㯠nSamplesPerSec*nBlockAlign ã«ãã¾ãããã®ä¾ã§ã¯ããã£ã¼ã«ãã®å¤ããã¹ã¦æç¢ºãªæ°å¤ã§ç¤ºãã¦ãã¾ãã
IXAudio2SourceVoice ãªãã¸ã§ã¯ããåå¾ãããããªãã¸ã§ã¯ãã® Start ã¡ã½ãããå¼ã³åºããã¨ãã§ãã¾ãããã®æç¹ã§ XAudio2 ã¯ãæ¦å¿µçã«ãµã¦ã³ããåçãã¦ãã¾ãããããã§ã¯å®éã«åçãããªã¼ãã£ãª ãã¼ã¿ãæå®ãã¦ãã¾ãããStop ã¡ã½ããã使ç¨ã§ããå®éã®ããã°ã©ã ã§ã¯ãã® 2 ã¤ã®ã¡ã½ããã使ã£ã¦ãµã¦ã³ãã®åçã¨åæ¢ãè¡ãã¾ãã
ä¸è¨ã® 4 ã¤ã®å¼ã³åºãã¯ãã³ã¼ãã«ç¤ºãã»ã©åç´ã§ã¯ããã¾ãããã©ã®å¼ã³åºãã«ã追å ã®å¼æ°ãããã¾ãããã©ã®å¼æ°ã«ãæå¹ãªæ¢å®å¤ãå®ç¾©ããã¦ãããããããã§ã¯ãã®æ¢å®å¤ãåç´ã«ãã®ã¾ã¾å©ç¨ãããã¨ã«ãã¦ãã¾ãã
DirectX ã®ã»ã¼ãã¹ã¦ã®é¢æ°ãã¡ã½ããã®å¼ã³åºãã§ã¯ãæåã失æãã示ã HRESULT å¤ãè¿ããã¾ãããã®ãããªã¨ã©ã¼ã®å¯¾å¦ã«ã¯ãã¾ãã¾ãªæ¹æ³ãããã¾ãããä»åã¯åã« XAML ãã¡ã¤ã«ã§å®ç¾©ãã TextBlock ã使ã£ã¦ã¨ã©ã¼ ã³ã¼ãã表示ãããã以ä¸å¦çãè¡ããªããã¨ã«ãã¾ããã
PCM ãªã¼ãã£ãª ãã¼ã¿
ã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ soundData é åã«ãªã¼ãã£ãª ãã¼ã¿ãè¨å®ããã¨ããã§çµãã£ã¦ãã¾ãããå®éã«ã¯ãã¿ã³ãæ¼ãããã¾ã§ãã®é å㯠IXAudio2SourceVoice ã«æ¸¡ããã¾ããã
ãµã¦ã³ãã¨ã¯æ¯åã§ã人éã¯ç©ºæ°ä¸ã§ã¯ãããã 20 Hz (ãµã¤ã¯ã«æ°/ç§) ãã 20,000 Hz ã®æ¯åãèãåããã¨ãã§ãã¾ãããã¢ãã®ã¡ããã©ä¸å¤®ã«ãããã®é³ã¯ç´ 261.6 Hz ã§ãã
44,100 Hz ã®ãµã³ããªã³ã° ã¬ã¼ã㨠16 ããã (2 ãã¤ã) ã®ãµã³ãã«æ°ã使ç¨ãããã¢ãã® 1 çªé«ãé³ã®å¨æ³¢æ°ãã¡ãã£ã¨è¶ ãã 4,410 Hz ã®æ³¢å½¢ã®ãªã¼ãã£ãª ãã¼ã¿ãçæããã¨ãã¾ãããã®ãããªæ³¢å½¢ã®åãµã¤ã¯ã«ã«ã¯ã16 ãããã®ç¬¦å·ä»ãæ°å¤ã®ãµã³ãã«ã 10 åå¿ è¦ãªã®ã§ããã®ãã㪠10 åã®å¤ã®ãµã³ãã«ãããµã¦ã³ã 1 ç§ããã 4,410 åç¹°ãè¿ããããã¨ã«ãªãã¾ãã
卿³¢æ° 441 Hz ã®æ³¢å½¢ã§ã¯ã100 åã®ãµã³ãã«ãã¬ã³ããªã³ã°ããã¾ãããã®å¨æ³¢æ° 441 Hz ã¯ããã¢ãããã¥ã¼ãã³ã°ããéã®åºæºã¨ãªã 440 Hz (ãã¢ãã§ã¯ä¸å¤®ã®ãã®ä¸ã®ã©ã®é³) ã«é常ã«è¿ã卿³¢æ°ã§ãã卿³¢æ° 441 Hz ã®æ³¢å½¢ã§ã¯ããã®ãµã¤ã¯ã«ããµã¦ã³ã 1 ç§ããã 441 åç¹°ãè¿ããããã¨ã«ãªãã¾ãã
PCM ã§ã¯ãµã³ããªã³ã° ã¬ã¼ããä¸å®ã«ãªããããä½å¨æ³¢æ°ã®ãµã¦ã³ãã®æ¹ãé«å¨æ³¢æ°ã®ãµã¦ã³ãã«æ¯ã¹ã¦é«ãè§£å度ã§ãµã³ããªã³ã°ããã³ã¬ã³ããªã³ã°ãããããã«æãã¾ãããã®èãã§åé¡ãªãã§ãããããããã 10 åã®ãµã³ãã«ãã¬ã³ããªã³ã°ãã 4,410 Hz ã®æ³¢å½¢ã®æ¹ãã441 Hz ã®æ³¢å½¢ãããé³ã®ã²ãã¿ã大ãããªãã®ã§ããããã
PCM ã§ã¯ããµã³ããªã³ã° ã¬ã¼ãã®ååãè¶ ãã卿³¢æ° (ãã«ç ç©¶æã®æè¡è ããªã¼ã»ãã¤ãã¹ãã«ã¡ãªãã§å½åãããããããããã¤ãã¹ã卿³¢æ°) ã§éååã®ã²ãã¿ãèµ·ãããã¨ããããã¾ãã44,100 Hz ã®ãµã³ããªã³ã° ã¬ã¼ãã CD ãªã¼ãã£ãªã«æ¡ç¨ãããçç±ã® 1 ã¤ã¯ããã¤ãã¹ã卿³¢æ°ã 22,050 Hz ã§ã人éã®è´è¦ã®éçãç´ 20,000 Hz ã ã£ãããã§ããã¤ã¾ãã44,100 Hz ã®ãµã³ããªã³ã° ã¬ã¼ãã§ã¯ãéååã®ã²ãã¿ã人éã«ã¯ç¥è¦ããã¾ããã
SimpleAudio ããã°ã©ã ã§ã¯ãã¢ã«ã´ãªãºã çã«ã·ã³ãã«ãªæ³¢å½¢ (卿³¢æ° 441 Hz ã®ç©å½¢æ³¢) ãçæããã¾ãã1 ãµã¤ã¯ã«ããã 100 åã®ãµã³ãã«ãããã¾ããåãµã¤ã¯ã«ã§ã¯ãæåã® 50 åã®ãµã³ãã«ãæ£ã®æå¤§å¤ (short åã®æ´æ°ã®å ´å㯠32,767)ãæ¬¡ã® 50 åã®ãµã³ãã«ãè² ã®æå¤§å¤ (-32,768) ã§ããããã short å¤ã byte é åã«æ ¼ç´ããã¨ãã¯ãä¸ä½ãã¤ãããå ã«æ ¼ç´ããå¿ è¦ãããã¾ãã
soundData[index + 0] = value & 0xFF;
soundData[index + 1] = (value >> 8) & 0xFF;
ãã®æç¹ã§ãã¾ã å®éã«ã¯åçããã¾ãããåçã¯ãã¿ã³ã® Click ãã³ãã©ã¼ã§è¡ãã¾ããXAUDIO2_BUFFER æ§é ä½ã使ç¨ãã¦ããµã³ãã«åæ°ã¨ãã¦æå®ããããã¤ãæ°ã¨åçæéãæã¤ãã¤ãé åãåç §ãã¾ãããã®ãããã¡ã¼ã IXAudio2SourceVoice ãªãã¸ã§ã¯ãã® SubmitSourceBuffer ã¡ã½ããã«æ¸¡ãã¾ããStart ã¡ã½ããã (ä»åã®ä¾ã®ããã«) æ¢ã«å¼ã³åºããã¦ãã¦ããã°ãããã«ãµã¦ã³ãã®åçãå§ã¾ãã¾ãã
è¨ãã¾ã§ãããã¾ãããããµã¦ã³ãã¯éåæã«åçããã¾ããSubmitSourceBuffer å¼ã³åºãããã¯ããã«å¾©å¸°ãããµã¦ã³ã ãã¼ãã¦ã§ã¢ã«ãã¼ã¿ãéãè¾¼ãå®éã®å¦çã¯å¥ã®ã¹ã¬ããã§è¡ããã¾ããSubmitSourceBuffer ã«æ¸¡ãã XAUDIO2_BUFFER ã¯ãå¼ã³åºãã®çµäºå¾ (ãã®ããã°ã©ã ã§ã¯ Click ãã³ãã©ã¼ãçµäºãããã¼ã«ã«å¤æ°ãã¹ã³ã¼ãå¤ã«ãªã£ãã¨ã) ã«ç ´æ£ãããã¨ãã§ãã¾ãããã ããå®éã®ãã¤ãé åã¯ã¢ã¯ã»ã¹å¯è½ãªã¡ã¢ãªå ã«æ®ã£ã¦ããå¿ è¦ãããã¾ããå®éãããã°ã©ã ã§ã¯ãµã¦ã³ãã®åçä¸ã«ãã®ãããªãã¤ãåãæä½ã§ãã¾ãããã ããããã°ã©ã ã§ãµã¦ã³ã ãã¼ã¿ãåçã«çæããã¨ããããã£ã¨åªããææ³ (ã³ã¼ã«ãã㯠ã¡ã½ãããå¿ è¦) ãããã¾ãã
ãµã¦ã³ããçµäºããã¿ã¤ãã³ã°ã夿ããã³ã¼ã«ããã¯ã使ç¨ããªãã®ã§ããã°ãããã°ã©ã ã®å®è¡ä¸ã¯ soundData é åãä¿æããå¿ è¦ãããã¾ãã
ãã¿ã³ãè¤æ°åã¯ãªãã¯ãããã¨ãã§ãã¾ããåå¼ã³åºãã§ã¯ãåã®ãããã¡ã¼ã®çµäºæã«åçãããå¥ã®ãããã¡ã¼ã广çã«ãã¥ã¼ã«ç»é²ããã¾ããããã°ã©ã ãããã¯ã°ã©ã¦ã³ãã«ç§»åããã¨ããµã¦ã³ãã¯ãã¥ã¼ãç¶æ ã«ãªãã¾ãããåçã¯ãã¥ã¼ãç¶æ ã§ç¶è¡ããã¾ããã¤ã¾ãããã¿ã³ãã¯ãªãã¯å¾ãããã°ã©ã ãå°ãªãã¨ã 5 ç§éããã¯ã°ã©ã¦ã³ãã«ç§»åããã¨ãããã°ã©ã ããã©ã¢ã°ã©ã¦ã³ãã«æ»ãã¦ãä½ãåçããã¾ããã
ãµã¦ã³ãã®ç¹æ§
æ¥å¸¸çæ´»ã§è³ã«ãããµã¦ã³ãã¯ãããã¤ãã®ç°ãªã鳿ºããåæã«çºãããããããããªãè¤éã§ããããããå ´åã«ãã£ã¦ã¯ãç¹ã«é³æ¥½ãµã¦ã³ããæ±ãã¨ãã¯ãããããªç¹æ§ã ãã§åå¥ã®é³è²ãå®ç¾©ã§ãã¾ãã
- æ¯å¹ : è´è¦ã«ã¯é³éã¨ãã¦ç¥è¦ããã¾ãã
- 卿³¢æ°: é³ç¨ã¨ãã¦ç¥è¦ããã¾ãã
- 空é: è¤æ°ã®ã¹ãã¼ã«ã¼ã§ãªã¼ãã£ãªãåçããã¤ã¡ã¼ã¸ã§ãã
- é³è³ª: ãµã¦ã³ãã§ã¯åé³ã®æ··åã«é¢é£ãã¾ãããã¨ãã°ããã©ã³ãããã¨ãã¢ãã®èããæ¹ã®éãã表ç¾ãã¾ãã
SoundCharacteristics ããã¸ã§ã¯ãã§ã¯ãããã 4 ã¤ã®ç¹æ§ã®ä¾ãåå¥ã«ç¤ºãã¾ããSimpleAudio ããã¸ã§ã¯ãã¨åæ§ã«ãµã³ãã« ã¬ã¼ã 44,100ããµã³ãã«åæ° 16 ãããã使ãã¾ãããã¹ãã¬ãª ãµã¦ã³ããçæãã¾ãã2 ãã£ã³ãã«ã®ãµã¦ã³ãã®å ´åããã¼ã¿ãã¤ã³ã¿ã¼ãªã¼ãããå¿ è¦ãããã¾ããã¤ã¾ããå·¦å´ã®ãã£ã³ãã«ã«ã¯æåã® 16 ããã ãµã³ãã«ãå³å´ã®ãã£ã³ãã«ã«ã¯æ¬¡ã® 16 ããã ãµã³ãã«ãé ç½®ãã¾ãã
SoundCharacteristics ã® MainPage.xaml.h ãããã¼ ãã¡ã¤ã«ã§ã¯æ¬¡ã®å®æ°ãå®ç¾©ãã¾ãã
static const int sampleRate = 44100;
static const int seconds = 5;
static const int channels = 2;
static const int samples = seconds * sampleRate;
ãµã¦ã³ã ãã¼ã¿ç¨ã« 4 ã¤ã®é åãå®ç¾©ãã¾ãããbyte åã§ã¯ãªã short åã«ãã¾ãã
short volumeSoundData[samples * channels];
short pitchSoundData[samples * channels];
short spaceSoundData[samples * channels];
short timbreSoundData[samples * channels];
short é åã使ãã¨ã16 ãããæ³¢å½¢ã®å¤ãååãã¤ã«åå²ããå¿ è¦ããªããããåæåã容æã«ãªãã¾ãããµã¦ã³ã ãã¼ã¿ãéä¿¡ããã¨ãã«ãç°¡åãªãã£ã¹ãã使ç¨ãã¦ãXAUDIO2_BUFFER ã§é åãåç §ã§ãã¾ãããã®ããã°ã©ã ã§ã¯ã¹ãã¬ãªã使ç¨ãã¦ããããããããã®é å㯠SimpleAudio ã®é åã® 2 åã®ãã¤ãæ°ã«ãªãã¾ãã
ãããã® 4 ã¤ã®é åã¯ãã¹ã¦ãMainPage ã³ã³ã¹ãã©ã¯ã¿ã¼ã§åæåãã¾ããé³éã®ãã¢ã®å ´åã441 Hz ã®ç©å½¢æ³¢ã使ç¨ãããã¨ã¯å¤ããã¾ããããé³éãã¼ãããå§ã¾ããæåã® 2 ç§éã¯å¾ã ã«ä¸ããããã®å¾æå¾ã® 2 ç§éã§ç·©ããã«ä¸ããã¾ããå³ 4 ã« volumeSoundData ãåæåããã³ã¼ãã示ãã¾ãã
å³ 4 SoundCharacteristics ã®é³éãå¤ãããµã¦ã³ã ãã¼ã¿
for (int index = 0, sample = 0; sample < samples; sample++)
{
double t = 1;
if (sample < 2 * samples / 5)
t = sample / (2.0 * samples / 5);
else if (sample > 3 * samples / 5)
t = (samples - sample) / (2.0 * samples / 5);
double amplitude = pow(2, 15 * t) - 1;
short waveform = sample % 100 < 50 ? 1 : -1;
short value = short(amplitude * waveform);
volumeSoundData[index++] = value;
volumeSoundData[index++] = value;
}
é³éã«å¯¾ãã人éã®èããæ¹ã¯å¯¾æ°è¡¨ç¾ã«ãªãã¾ããæ¯åæ³¢å½¢ã®æ¯å¹ ã 2 åã«ãããã¨ãã¨ã¯ãé³éã 6 dB ä¸ãã¦ãããã¨ã«ç¸å½ãã¾ã (ãªã¼ãã£ãª CD ã«ä½¿ããã¦ãã 16 ãããã®æ¯å¹ ã¯ãã¤ããã㯠ã¬ã³ã¸ 96 ãã·ãã«ã§ã)ãå³ 4 ã§ç¤ºããé³éãå¤åãããã³ã¼ãã§ã¯ã0 ãã 1 ã«ç´ç·çã«å¢å ãããã®å¾ 0 ã«æ»ãããã«æ¸å°ãã¦ããå¤ t ãæåã«è¨ç®ãã¦ãã¾ããamplitude 夿°ã¯ãpow 颿°ã使ã£ã¦è¨ç®ããå¤ã 0 ï½ 32,767 ã®ç¯å²ã«åãã¾ãããã®å¤ãã1 ã¾ã㯠-1 ã®å¤ãæã¤ç©å½¢æ³¢ã«ä¹ç®ããçµæãé åã« 2 å追å ãã¾ãã1 åç®ã¯å·¦ã®ãã£ã³ãã«ã2 åç®ã¯å³ã®ãã£ã³ãã«ç¨ã§ãã
卿³¢æ°ã«å¯¾ãã人éã®èããæ¹ã対æ°è¡¨ç¾ã«ãªãã¾ããä¸çã®é³æ¥½ã®å¤ãã¯ãé³ç¨ããªã¯ã¿ã¼ãééã§ç·¨æããã1 ãªã¯ã¿ã¼ãä¸ããã¨å¨æ³¢æ°ã 2 åã«ãªãã¾ãããè¹ã®å½¼æ¹ã« (Somewhere over the Rainbow)ãã®ã³ã¼ã©ã¹ã®æåã® 2 é³ã®ãã¹ ãã¼ãã¨ã½ãã©ã ãã¼ãã®é³ç¨ã®å·®ã¯ã¡ããã© 1 ãªã¯ã¿ã¼ãã«ãªãã¾ããå³ 5ã«ç¤ºãã³ã¼ãã§ã¯ã(é³éã®ä¾ã¨åæ§ã«) 0 ãã 1 ã«åãããã¾ã 0 ã«æ»ã ï½ ã®å¤ã«åºã¥ãã¦ã220 ï½ 880 ã® 2 ãªã¯ã¿ã¼ãã®ç¯å²ã§é³ç¨ãå¤ãã¦ãã¾ãã
å³ 5 SoundCharacteristics ã®å¨æ³¢æ°ãå¤ãããµã¦ã³ã ãã¼ã¿
double angle = 0;
for (int index = 0, sample = 0; sample < samples; sample++)
{
double t = 1;
if (sample < 2 * samples / 5)
t = sample / (2.0 * samples / 5);
else if (sample > 3 * samples / 5)
t = (samples - sample) / (2.0 * samples / 5);
double frequency = 220 * pow(2, 2 * t);
double angleIncrement = 360 * frequency / waveformat.nSamplesPerSec;
angle += angleIncrement;
while (angle > 360)
angle -= 360;
short value = angle < 180 ? 32767 : -32767;
pitchSoundData[index++] = value;
pitchSoundData[index++] = value;
}
以åã®ä¾ã§ã卿³¢æ°ã 441 Hz ã«ããã®ã¯ããµã³ããªã³ã° ã¬ã¼ã 44,100 ãå²ãåããããã§ããä¸è¬ã«ãµã³ããªã³ã° ã¬ã¼ãã¯å¨æ³¢æ°ã®æ´æ°åã«ã¯ãªããªãããã1 ãµã¤ã¯ã«ãããã®ãµã³ãã«æ°ã¯æ´æ°ã«ãªãã¾ããããã®ããã°ã©ã ã§ã¯æµ®åå°æ°ç¹å¤æ°ã® angleIncrement ã管çãã¦ãã¾ãããã®å¤æ°ã¯å¨æ³¢æ°ã«æ¯ä¾ãã¦ã0 ï½ 360 度ã®ç¯å²ã§è§åº¦ãä¸ããã®ã«ä½¿ç¨ãã¦ãã¾ãããã®è§åº¦ã®å¤ã¯ããã®å¾æ³¢å½¢ãæ§ç¯ããã®ã«ä½¿ç¨ãã¾ãã
空éã®ãã¢ã§ã¯ããµã¦ã³ãã®ãã£ã³ãã«ãä¸å¤®ããå·¦ãæ¬¡ã«å³ããã®å¾ä¸å¤®ã¸ã¨ç§»åãã¾ããé³è³ªã®ãã¢ã§ã¯ã波形ã 441 ï¼¨ï½ ã®æ£å¼¦æ²ç·ããå§ãã¾ããæ£å¼¦æ²ç·ã¯ãæ¯åã®æãåºæ¬çãªç¨®é¡ã®æ°å¦è¡¨ç¾ã§ãå¤ä½ã«åæ¯ä¾ããåãæ±ãã微忹ç¨å¼ã®è§£ã§ãããã®ä»ã®å¨ææ³¢å½¢ã¯ãã¹ã¦ã調波ãå«ã¿ã¾ããèª¿æ³¢ãæ£å¼¦æ³¢ã§ããã卿³¢æ°ã¯åºæ¬å¨æ³¢æ°ã®æ´æ°åã«ãªãã¾ããé³è³ªã®ãã¢ã§ã¯ããµã¦ã³ãã®èª¿åæ§ãå¢å ããªãããæ³¢å½¢ãæ£å¼¦æ³¢ããä¸è§æ³¢ãç©å½¢æ³¢ã鏿¯ç¶æ³¢ã¸ã¨æ»ããã«å¤ãã¦ãã¾ãã
大ããªæ§æ³ã«åãã¦
ä»å㯠1 ã¤ã® IXAudio2SourceVoice ãªãã¸ã§ã¯ãã®ãµã¦ã³ã ãã¼ã¿ãçæãã¦ãé³éãé³ç¨ã空éãé³è³ªãå¶å¾¡ããæ¹æ³ã®ãã¢ãè¡ã£ãã ãã§ããããã®ãªãã¸ã§ã¯ãèªä½ã«ã¯é³éã空éãããã³å¨æ³¢æ°ã夿´ã§ããã¡ã½ãããããã¾ã (3D ç©ºéæ©è½ããµãã¼ãããã¾ã)ãåã ã®é³è²ã®ãããã¯ã 1 ã¤ã®ã½ã¼ã¹ ãã¤ã¹ã«çµã¿åãããè¤åãµã¦ã³ã ãã¼ã¿ãçæãããã¨ãå¯è½ã§ãããè¤æ°ã® IXAudio2SourceVoice ãªãã¸ã§ã¯ãã使ãã¦ãåããã¹ã¿ã¼ ãã¤ã¹ã§ããããã¾ã¨ãã¦åçãããã¨ãå¯è½ã§ãã
ã¾ããXAudio2 ã§ã¯ããã£ã«ã¿ã¼ããåé¿ãã¨ã³ã¼ãªã©ã®ã¨ãã§ã¯ããå®ç¾©ã§ãã IXAudioSubmixVoice ã¤ã³ã¿ã¼ãã§ã¤ã¹ãå®ç¾©ãã¾ãããã£ã«ã¿ã¼ã«ã¯æ¢åã®é³è²ã®é³è³ªãåçã«å¤åãããæ©è½ããããé åçã§å®ç¨çãªé³æ¥½ãµã¦ã³ããä½ãã®ã«ã¨ã¦ãå½¹ç«ã¡ã¾ãã
ãããããä»åã® 2 ã¤ã®ããã°ã©ã ã§ç¤ºããå å®¹ãæ ¹æ¬çã«å¼·åããã«ã¯ãXAudio2 ã®ã³ã¼ã«ããã¯é¢æ°ãå©ç¨ããå¿ è¦ãããã¾ããä»åã® 2 ã¤ã®ããã°ã©ã ã§è¡ã£ãããã«ã大容éã®ãµã¦ã³ã ãã¼ã¿ã®åæåã¨å²ãå½ã¦ãè¡ãã®ã§ã¯ãªããããã°ã©ã ã«ã¨ã£ã¦ã¯åçã®ç´åã«ãµã¦ã³ã ãã¼ã¿ãåçã«çæããæ¹ãé©åã§ãã
Charles Petzold 㯠MSDN ãã¬ã¸ã³ã®è¨äºãé·æã«ããã£ã¦æ å½ãã¦ãããWindows 8 åãã®ã¢ããªã±ã¼ã·ã§ã³éçºã«ã¤ãã¦ã®æ¸ç±ãProgramming Windows, 6th editionã (OâReilly Mediaã2012 å¹´) ã®èè ã§ãããã¾ãã彼㮠Web ãµã¤ã㯠charlespetzold.comãè±èª ã§ãã
ãã®è¨äºã®ã¬ãã¥ã¼ã«ååãã¦ãããæè¡ã¹ã¿ããã® Scott Selfon ã«å¿ããæè¬ãããã¾ãã