サウンドプログラミングの部屋。上に行くほど新しい。
ダウンロードは ⇒ 001_keyboardsynth.zip
息抜き。XAudio2そういえば触ってなかったなーもう落ち着いたっしょ、と思ったので作った。
XAudio2でプログラム中にサンプル音源を作って鳴らすやつ。例のごとくASDFキーで音が鳴ります。
さらにさらにSPACEキーで音色がある程度ランダムに変わります。Autogunみたいなのを作りたかった。
0.CoInitializeExをCOINIT_MULTITHREADEDで初期化してあげます。これが無いとCreate系が全部失敗するので注意!!
↓
1.IXAudio2のinstance作って初期化します。
↓
2.IXAudio2からIXAudio2MasteringVoiceを作ります。
IXAudio2MasteringVoice -> OutputDeviceという感じになる。遊ぶ程度なら後はこのinstanceは放置することになる。
↓
3.IXAudio2からIXAudio2SourceVoiceを作ります。
IXAudio2SourceVoiceはオーディオデータを再生するためのバッファへのポインタや再生するときの速度だったりをコントロールするdescriptorです。
1バッファに1Voice紐づいている、という感じではないです。DirectSoundの場合はサウンドデータをCreateSoundBufferで作っていましたが、
XAudio2の場合はシステムメモリに構築したサウンドデータを指してあげるだけで音を鳴らす準備ができます。
↓
4.WaveDataを作ります。ファイルから読み込ませるなどはしていなくて、適当に波形データを作成しています。
↓
5.IXAudio2SourceVoiceを使って音を鳴らします。
IXAudio2SourceVoice->SubmitSourceBufferで、XAUDIO2_BUFFER構造体を使ってバッファ情報を渡してあげて、IXAudio2SourceVoice->Play()で再生できます。ここではピッチを変更しています。
注意としては、再度同じバッファを使って再生するときはStop -> FlushSourceBuffersで送信済みのバッファを破棄してから再生を行うこと。
また、公式の解説では、XAUDIO2_BUFFER構造体を使って渡したデータの先を見ているので必ずStop -> FlushSourceBuffersの手順をしてからバッファを変更します。
↓
6.エンジョイ!
XAudio2は情報がまとまっていないAPIでSDKによってエフェクト周りのstruct周りのメンバが変わってたりで互換性なかったりするっぽいので、
このまま動いたーって手放しで喜べない気もするけどどうなんでしょうね。
DirectSoundよりもこちらで遊んだほうがよさそうなきはするけどはてさて。
[参考サイト]
[1: XAudio2 Microsoft公式]
https://docs.microsoft.com/ja-jp/windows/desktop/xaudio2/xaudio2-apis-portal
※日本語もあるにはあるけど情報が古い(Win10向けの更新がされていない箇所がちらほら)
[2: XAudio2 API]
https://docs.microsoft.com/en-us/windows/desktop/api/_xaudio2/
※API群。
[3: XAudio2 DirectXTK]
https://github.com/Microsoft/DirectXTK/tree/master/Audio
※サンプル複雑なので、1のGetting Startedが一番楽な気がする。
なんかうごかないときは公式を見たほうがお作法を理解できるので良い。
ダウンロードは ⇒ rebeffect.zip
息抜き。ギターとかマイクをつなげて音鳴らしてみてください。
いろいろ調整したけど正直レイテンシがひどすぎて使い物にならない。
ワサピつかってみたい。
バッファのつかいかたが間違っているのか良く分からない状態になっている。
かけているのはリバーブとディレイだけ。
ダウンロードは ⇒ kpsnd.zip
息抜き。物理モデルでモデルウードとかリュートとかあっち方面の音色目指し。
https://ccrma.stanford.edu/~jos/pasp/Karplus_Strong_Algorithm.html
http://htanaka.net/tanaka_hp/electronics/synth/pluck/pluck.html
ギター触ったことある人はわかるけど、素のままのギターって相当しょぼい音色しか出ない。
なので、ホールの選定からやるという恐ろしさ。
なので適当なコムかましてそれらしい感じで。
waveOutOpenのCALLBACK_EVENTとか変なの使ってる。
ダウンロードは ⇒ mds.zip
全然何もできてなかったので息抜き。
適当にいじってDirectSoundで遊ぶ。ASDFキーで音なります。
SetNotificationPositionsはできる子。大抵のサンプルはThread立てて遊んでるけど、
こんな感じで適当に使うこともできる。
これまで作ったの適当に突っ込む。いい加減な実装でもLPF大事。
アルペジオをホールっぽいので鳴らすとなんか違和感。
リバーブは大げさにかけてる。
ダウンロードは ⇒ s_wasapi.zip
ソウスは ⇒ wasapi.cpp
WASAPIで適当に音ならし。スペースキーでいい加減に音がなります。
注意 : 排他モードは使う人が責任もってソース変えて使う。
Volume満載でスピーカー破壊する可能性があるので本サンプルではSharedにしとります。
Vista / Win7以降じゃないと動きません。
サンプルは本家の以下参考。というか大体そのまま。
(MSDN)Rendering a Stream
(MSDN)Exclusive-Mode Streams
排他で動作させるなら、フォーマットキチン見て、その通りにFillしないと耳とスピーカーを破壊して終わる。
なので各自機材とプロパティに合わせて変更しないといけない。
以下ハマった個所掲載。
[ハマった0]
(MSDN)IAudioClient::Initialize method
[in] const WAVEFORMATEX *pFormatの解説。(or WAVEFORMATEXTENSIBLE)っての。
[ハマった1]
以下の個所を適当に排他モードとか設定しないと駄目。
[ハマった2]
これはドキュメント読み不足だったんだけど、MSDNのAPIのバッファ長さ解説によく出てくるFrame(s)というのは
とれたバッファのnBlockAlignの数の事。
単にBytes出すなら、32bit Float 2chのフォーマットで再生したらnBlockAlignはsizeof(float) * ch = 8 [Bytes]なので
Frames * 8でBytesが出る。実際には使用しないんだけど勘違いしないように(ちゃんとドキュメント読めという話)
[ハマった3]
IAudioClientのGetMixFormatで取得できるのはSharedのフォーマット(ちゃんとドキュメント読め)
排他はちゃんとサポートしているか適当にやること(か、GetDefaultAudioEndpointじゃなくEnumから取得する)
このAPI、初期化が面倒なだけでStreamの制限あんまりなくてwaveXXX系よりはだいぶ使いやすい気もする。
フォーマット解釈する個所さえきちんと作れば具合が良いんだと思う。
あとバッファの長さ要求する時に、実際にはバッファ処理が間に合わないケースがあるだろうから、
レイテンシ犠牲にしてGetDevicePeriodで取得した値からもうちょっとマージン持たせるのが良さそう。
ダウンロードは ⇒ reverbsnd.zip
勉強用にSchroederのリバーブを適当に。きちんとした推奨パラメータは使用していない。
オシレータも適当。waveOutOpenでCALLBACK_FUNCTIONつかって適当。
適当にしちゃいけないのはコムフィルタのサンプリング数で素数でタップばらばらに設定しないと
スペクトルがかぶってとんでもない音になります。
参考サイト : http://www.ari-web.com/service/soft/reverb-2.htm
図面の素のままだとあまりにも金属的なので隣接する波形つまんで適当に平滑化している。
Allpass側難し。
F5ホールドで元の音だけになる。
なんかキンキンした音聞こえるしそのままじゃ使えないけどインチキリッチにはなる。
参考サイトにあるようにディレイと一緒に使うと割とそこそこ聞こえる。
ダウンロードは ⇒ dsampler.zip
リハビリと息抜き。ASDFキーでON, QWERでオフ。UPでピッチアップ、DOWNでピッチダウン、LEFT/RIGHTで音色変更。
エンベロープ無いのでサンプル頼り。
サンプルは適当なwavをcopy /b *.wav samples って感じで素のwavファイルつなげて作る。
以前waveOutOpen(&data.hwo, WAVE_MAPPER, &data.wfx, (DWORD)sound_callback, (DWORD)this, CALLBACK_FUNCTION);って感じで
コールバック渡して再生するのやったんだけど、リアルタイムでtable位置処理すると割と面倒で280line程度になったので没った。
このsamplerは110Line程度で適当なサンプル再生できるのでスケッチ時に使う。
んが逆再生もできなければdetuneもかけれないから自由効かない。
サンプルに詰まってる波形は処理甘いのでヒスったりクリックしている。
自分用。音色確認。
エンベロープは慎重に作らないといけないらしいのでまだ未実装(実装できないだけ)
biyon1.zip
こりずにシンセ。
適当に有名曲だけど参考程度に。
twitter上でとある方にアドバイスもらってデチューンかけてみた。
meritori_snd_stereo_d.zip
マキシマイザとか作れればいいんだけどね。
デチューンなしはこちら。
meritori_snd_stereo.zip
snd_mono.zip
こりずに音を鳴らす実験。音は控えめ。適当にnote変えていんちきミニマルっぽくしてる。
むずかしい。
↓参考。
http://kioku.sys-k.net/tips/lec6.html
fmsnd.cpp
synth.cpp
メモ用。いんちきシンセお遊びソース。DirectSoundでなります(音量注意)
コンパイルにはDirectX9SDKとVCExpress必要。
アイディアや基本的な仕組みはは2chのメガデモスレに投下されたelevatedの音部分逆アセです。
upした人ありがとう!
tmml.cpp
適当に作った上のファイル用のTrackerMMLパターン作成ツール。いい加減。仕様はソースを見る。
wav.cpp
メモ用。WAV形式取得さん。