Cがコードからサウンドサンプルを生成するためのサウンドライブラリはありますか?[閉まっている]


10

私はCでレトロなスタイルのゲームのエンジンに取り組んでいます。コードからチップサウンドを生成するサウンドライブラリを探しています...音楽を作成するためのエンジン用の独自のシンプルなチップチューントラッカーを作成したいと考えています。そのようなものは存在しますか?

プロジェクトで.nsfファイルを使用するためのライブラリにも興味があります。

開発にはLinuxを使用しています。


この質問は、「どのテクノロジーを使用するか」というカテゴリーに該当すると思います。通常、これらのニッチな要求は応答の大きなリストを生成しませんが、それは建設的ではないと思います。
MichaelHouse

さて、問題は何も見つけられないようです。どこから始めればよいのかもわかりません...私が見つけたすべてのライブラリは、.wavなどのファイルからのロードに焦点を当てています。.modまたは.xmモジュールをロードするだけであれば、libmikmodを使用できますが、それは私がやりたいことではありません。
rzrscm 2013年

これは本当にゲーム開発に該当するとは思いません。ゲームよりも一般的なメディアです。
PixelArtDragon 2013年

より一般的な背景とリソースについては、「modトラッカー」または「デモシーントラッカー」を検索してみてください。
Patrick Hughes

1
私は個人的にこの質問を良い質問だと思います。私はレトロなスタイルのゲームをプログラミングするのが好きなので、あいまいなコミュニティに参加していなければ、このようなもののためのリソースを見つけることは困難です。
ザックザヒューマン

回答:


3

おそらく正解ではないかもしれませんが、ここにさまざまなオーディオエンジンのライブラリがあります

(オーディオライブラリの2番目のセグメントまで下にスクロールします)

12個のエンジンのうち少なくとも9個はCに対応しています。それらのほとんどはトラッカーファイルもサポートしています。これはnsf(これらはNES音楽ファイルだと思います)ファイルとそれほど変わらない。


16

もちろん可能ですが、「素敵」に聞こえるようにするのは簡単なことではありません。

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);

ちなみに、ここから周波数を取得しています平均律を使用していますが にもたくさんチューニングがあります)。

これまでは正弦波しか使用していませんでしたが、古いシンセサイザは方形波、三角波のこぎり波もサポートしており、それぞれに興味深いサウンドプロパティがあります。これらの実装は非常に簡単です。

作成できるサウンドの種類を増やすためにできるその他のことは次のとおりです。

  1. 振幅変調:バッファ全体で波の振幅を変更する
  2. 周波数変調:バッファ全体の波の周波数を変更する
  3. リバーブ:バッファー内のサンプルの形状と位置を変更して、サンプルを繰り返します。それ自体は非常に複雑なトピックです。
  4. エンベロープ:サンプルの振幅を変更して、サンプルの寿命を延ばします

ここでのポイントは、テクニック自体はそれほど難しいものではないので、実際にそれらを抽象化するためのライブラリは必要ないということです。それらを使用して、難しいことを面白いサウンドを作成しています。

最後に一言。このようなサウンドを試す場合、データをWAVファイルに保存し、Audacityなどのソフトウェアで視覚化すると非常に便利です。そうすれば、自分がやっていることをより明確に見ることができます。


自分を転がすための+1。NSFをサポートするLinuxライブラリは多くありません。しかし、ここでの仕様です:webcache.googleusercontent.com/...
michael.bartnett

情報ありがとうございます。プロジェクトで.nsfファイルを作成することにこだわるかもしれません。今、サウンドを適切に鳴らすために必要な量を理解しているからです。
rzrscm 2013年

+1私はこの質問へのどんな答えでも退屈だと思いました。AM / FMについてはよく知りませんが、通常、減算合成の場合と同様に、波は最初にフィルターに送られます。また、複数のピアノ音符の例は正しいですが、より良い例は1つの音符だけです。単一のピアノの音はそれに音色を与える複数の倍音を作成します。ピアノは5つ以上の波を追加して作成しますが、ほとんどのシンセでは2または3で問題ありません。
トニー・

「add_sine_wave」関数でオーバーフローをチェックする正しい方法は何ですか?
eadmaster 2014年

@eadmaster:私はクリッピングを意味した。にshortキャストする前に、値がa に収まることを確認してくださいshort
パンダパジャマ2014年

4

チップチューンサウンドエフェクトには、明確な答えが1つあります。それはsfxrです。

これは、サンプルの生成に使用できるスタンドアロンアプリケーションですが、ソースコードをコードに統合したい場合は、ソースコードも利用できます。


3

ブラッグのオーディオライブラリを個人的に推薦できます。あなたにとって特に興味深いものは彼のBlip_Bufferです。

Blarggのサイトにはいくつかの「レトロ」オーディオシンセサイザーがあり、私は彼のGame_Music_Emuを積極的に使用して、書いているロックマンクローンでNSFファイルを再生しています。

ライブラリの多くはC ++で記述されていますが、一部はCインターフェイスも提供しています。


間違いなくこれらのいくつかを試すつもりです...私はNESゲームのルックアンドフィールをエミュレートすることを目的としたゲームエンジンに取り組んでいるので、それらは私が探しているものかもしれません。
rzrscm 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.