私はCでレトロなスタイルのゲームのエンジンに取り組んでいます。コードからチップサウンドを生成するサウンドライブラリを探しています...音楽を作成するためのエンジン用の独自のシンプルなチップチューントラッカーを作成したいと考えています。そのようなものは存在しますか?
プロジェクトで.nsfファイルを使用するためのライブラリにも興味があります。
開発にはLinuxを使用しています。
私はCでレトロなスタイルのゲームのエンジンに取り組んでいます。コードからチップサウンドを生成するサウンドライブラリを探しています...音楽を作成するためのエンジン用の独自のシンプルなチップチューントラッカーを作成したいと考えています。そのようなものは存在しますか?
プロジェクトで.nsfファイルを使用するためのライブラリにも興味があります。
開発にはLinuxを使用しています。
回答:
おそらく正解ではないかもしれませんが、ここにさまざまなオーディオエンジンのライブラリがあります
(オーディオライブラリの2番目のセグメントまで下にスクロールします)
12個のエンジンのうち少なくとも9個はCに対応しています。それらのほとんどはトラッカーファイルもサポートしています。これはnsf(これらはNES音楽ファイルだと思います)ファイルとそれほど変わらない。
もちろん可能ですが、「素敵」に聞こえるようにするのは簡単なことではありません。
Linuxでそれを行う方法はわかりませんが、PCMバッファーを再生できる場合は、必要なことをすべて満たすだけです。
したがって、バッファがモノラルの符号付き16ビットサンプルで毎秒44100サンプルで再生されるように設定されているとすると、純粋な(正弦波)A4サウンド(440 Hz)の作成は次のように簡単です。
int16_t buffer[44100];
float frequency = 440.0f;
float sampling_ratio = 44100.0f;
float amplitude = 0.5f;
float t;
for (int i = 0; i < 44100; i++)
{
float theta = ((float)i / sampling_ratio) * PI;
buffer[i] = (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
}
ただし、このサウンドはあなたの興味にとっておそらく鈍いものなので、もっと複雑なことをしなければなりません。一般に、サウンド合成には2つのタイプがあります。加算と減算です。他にもたくさんありますが、これらの2つはおそらく最も単純なものです。今日は加算合成についてお話します。
アディティブシンセシスについては、ここで行ったのと同じことを行いますが、1つの振幅で1つの周波数を使用するのではなく、いくつかの波を加算します。これは、ピアノの複数のキーを同時に押すのと同じです。したがって、コードを次のように変更します。
void add_sine_wave(int16_t* buffer, int buffer_length, float frequency, float sampling_ratio, float amplitude)
{
for (int i = 0; i < buffer_length; i++)
{
float theta = ((float)i / sampling_ratio) * M_PI;
// make sure to correct for overflows and underflows
buffer[i] += (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
}
}
次のように使用します。
int16_t buffer[44100];
memset(buffer, 0, sizeof(buffer));
// Create an A Major chord
add_sine_wave(buffer, 44100, 440.0f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 554.37f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 659.26f, 44100.0f, 0.5f);
ちなみに、ここから周波数を取得しています(平均律を使用していますが 、 他にもたくさんのチューニングがあります)。
これまでは正弦波しか使用していませんでしたが、古いシンセサイザは方形波、三角波、のこぎり波もサポートしており、それぞれに興味深いサウンドプロパティがあります。これらの実装は非常に簡単です。
作成できるサウンドの種類を増やすためにできるその他のことは次のとおりです。
ここでのポイントは、テクニック自体はそれほど難しいものではないので、実際にそれらを抽象化するためのライブラリは必要ないということです。それらを使用して、難しいことを面白いサウンドを作成しています。
最後に一言。このようなサウンドを試す場合、データをWAVファイルに保存し、Audacityなどのソフトウェアで視覚化すると非常に便利です。そうすれば、自分がやっていることをより明確に見ることができます。
short
キャストする前に、値がa に収まることを確認してくださいshort
。
ブラッグのオーディオライブラリを個人的に推薦できます。あなたにとって特に興味深いものは彼のBlip_Bufferです。
Blarggのサイトにはいくつかの「レトロ」オーディオシンセサイザーがあり、私は彼のGame_Music_Emuを積極的に使用して、書いているロックマンクローンでNSFファイルを再生しています。
ライブラリの多くはC ++で記述されていますが、一部はCインターフェイスも提供しています。