自分用メモ

https://wita.noyatsu.club/

PortAudioの使い方

The Synthesis Toolkit in C++とちがって,PortAudio(以下PA)は簡単にVisualStudio(VS)に導入できます.

流れ

  1. オーディオ処理が必要なときにPAのコールバック関数を記述します。
  2. PAライブラリを初期化し、オーディオI/O用のストリームを開きます。
  3. ストリームを開始します。 コールバック関数はバックグラウンドでPAによって繰り返し実行されます。(コールバックでは、inputBufferからオーディオデータを読み込んだり、outputBufferにデータを書き込んだりすることができます。)
  4. コールバックから1を返すか、stop関数を呼び出すことによってストリームを停止します。
  5. ストリームを閉じてライブラリを終了します。

のこぎり波を生成する例

PAをVSで使うには「portaudio.h」をインクルードする必要があります.作成するコールバック関数はintを返し,下で示すようなパラメータを受け入れるようなものでないとダメです.

typedef int PaStreamCallback(
const void *input,
void *output,
unsigned long frameCount,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData
);

以下が,のこぎり波を生成するサンプルです. 信号は-1.0と1.0の間でないとダメです.

#include <stdio.h>
#include <stdlib.h>
#include "portaudio.h"
#define SAMPLE_RATE (44100)
#define NUM_SECONDS (5)

typedef struct
{
float left_phase;
float right_phase;
}
paTestData;


static int patestCallback(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void *userData);
static paTestData data;
int main(void)
{
PaStream *stream;
PaError err;


/* PA初期化 */
if (err = Pa_Initialize() != paNoError) {
printf("PortAudio error: %s\n", Pa_GetErrorText(err));
return 1;
}


/* ストリームを開く */
/*
引数は,ポインタ,入力チャンネル数,出力チャンネル数,
出力のフォーマット,サンプリングレート,バッファごとのフレーム数,
コールバック関数名,コールバック関数を通るポインタ
*/
if (err = Pa_OpenDefaultStream(&stream, 0, 2, paFloat32, SAMPLE_RATE, 256, patestCallback, &data) != paNoError) {
printf("PortAudio error: %s\n", Pa_GetErrorText(err));
return 1;
}


/* ストリームを開始 */
if (err = Pa_StartStream(stream) != paNoError) {
printf("PortAudio error: %s\n", Pa_GetErrorText(err));
return 1;
}


/* 数秒待機 */
Pa_Sleep(NUM_SECONDS * 1000);


/* ストリームを停止 */
if (err = Pa_StopStream(stream) != paNoError) {
printf("PortAudio error: %s\n", Pa_GetErrorText(err));
return 1;
}


/* ストリームを閉じる */
if (err = Pa_CloseStream(stream) != paNoError) {
printf("PortAudio error: %s\n", Pa_GetErrorText(err));
return 1;
}


/* PA終了 */
if (err = Pa_Terminate() != paNoError) {
printf("PortAudio error: %s\n", Pa_GetErrorText(err));
return 1;
}
system("pause");
return 0;
}


static int patestCallback(const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData)
{
/* データを構造体にキャスト */
paTestData *data = (paTestData*)userData;
float *out = (float*)outputBuffer;
unsigned int i;
(void)inputBuffer; /* 使ってない変数による警告を避けるため */


for (i = 0; i<framesPerBuffer; i++)
{
*out++ = data->left_phase; /* 左 */
*out++ = data->right_phase; /* 右 */


/* のこぎり波を生成 */
data->left_phase += 0.01f;
/* 範囲を超えたらしたに下げる */
if (data->left_phase >= 1.0f) data->left_phase -= 2.0f;
/* 左右で音の高さが変わるように */
data->right_phase += 0.03f;
if (data->right_phase >= 1.0f) data->right_phase -= 2.0f;
}
return 0;
}

参考

PortAudio: PortAudio Tutorials

AtomでWindows Subsystem for Linux(WSL)を使う

AtomWindows Subsystem for Linux(WSL)を使う

 

1. パッケージ「platformio-ide-terminal」を入れる.

2. 上述のパッケージの設定ページの「Shell Arguments」を「C:\Windows\System32\bash.exe」にする.

(できない場合はエクスプローラでCドライブを開き「bash.exe」を検索して出てきたパスを入れればOK)

The Synthesis Toolkit in C++の導入メモ

The Synthesis Toolkit in C++(以下STK)の導入メモ

結局導入できなかったゴミ記事です。読まないことをお勧めします。

 

ディレクトリについて

src --- .cppファイルを含む

include --- ヘッダファイルを含む

rawwaves --- サウンドファイルを含む

doc --- ドキュメント

projects --- デモと例を組む

 

VisualStudio2015でのコンパイルの仕方

stk-4.x.x/projects/demo/demo.dspを無理やり開き,

現在のバージョンにコンバートする.

VSのプロジェクト->プロパティを選択

構成プロパティ / 全般 の「構成の種類」を「ライブラリファイル(.lib)」にする.

構成プロパティ/ C/C++ / コマンドライン を選択

下の方にある「追加のオプション(D)」の欄に「/FS」を指定

OKを押し,「Release」環境にてビルド.

そうしたらVisualStudioに付属の「開発者コマンドプロンプト」を開き

stk-4.x.x/projects/demo/Releaseに移動.

そこで

lib OUT:libstk.lib *.obj

を実行.すると見事にライブラリファイルが生成されます!

 

 

使いたいプロジェクトのプロパティを開いて,リンカー / 全般 の「追加のライブラリディレクトリ」に demo.lib があるディレクトリを追加.(あれだったら自分のプロジェクトファイルの下にdemo.libをstk.libとかにリネームして持ってきとくとわかりやすいかもですね)

つぎに リンカー / 入力 の「追加の依存ファイル」にdemo.lib(リネームしたならその名前)を追加.

C/C++ / コマンドラインオプションに「/MTd (or /MT) /FS」を追加して,Release環境にすると実行できます.「PDBファイルが見つからない」って言われますが…一応実行できます.(どうやらWindows/WOW64内の.dll群にはPDBファイルがないのは正常なようです)

※リアルタイム合成をしようとしたところ,動きませんでした.PortAudioの使用をお勧めします.

 

コマンドラインでのコンパイルの仕方

Windowsの場合, リアルタイム合成はDirectSound, ASIO, WASAPIで利用可能

MinGWコンパイラUnixコンパイル可能.(自分はWindows Subsystem for Linuxで実行)

GNU向けのシェルスクリプトが入っている.

 

STKの一番上のディレクトリで

autoconf

./configure -with-ds

 と実行するとMakeFileが生成される.(DirectSoundを使う場合)

(※これを実行するにはg++, CC, c++, cxxのいずれかと,libasound2-devがインストールされていないといけない)

そのほかのオプションは以下である.

–disable-realtime to only compile generic non-realtime classes
–enable-debug to enable various debug output
–with-alsa to choose native ALSA API support (default, linux only)
–with-oss to choose native OSS audio API support (linux only, no native OSS MIDI support)
–with-jack to choose native JACK API support (linux and Macintosh OS-X)
–with-core to choose Core Audio API support (Macintosh OS-X)
–with-asio to choose ASIO Audio API support (Windows)
–with-ds to choose Windows Direct Sound Audio API support (Windows)

 そして一番上のディレクトリで

make

すると,srcディレクトリの下にライブラリファイルである「libstk.a」が生成される.

 (※しかし「.aファイル」はVisualStudioでは使えない)