C/C++で特定の周波数のサウンドを生成する方法を教えてください。私はUbuntu 10.04を使い、gccを使います。 TurboC for Windowsにはvoid sound(int frequency)
の機能があります。 gccに相当するものはありますか?ubuntuでgccを使って特定の周波数のサウンドを生成していますか?
答えて
以下は、指定された周波数の方形波を生成するPortAudioライブラリを利用したコードです。 Linuxの場合、gcc buzzer.c -o buzzer -lportaudio
でコンパイルしてください。 Windowsの場合も同様にコンパイルする必要があります。私はsound(int frequency)
がどのように正確に動作するのかわかりませんが、古いスタイルのブザーの使用をシミュレートできるはずです。 portaudio-devel
(またはUbuntuの場合はportaudio-dev?)パッケージが必要かもしれませんし、Pulse Audioの場合、あなたのレポにあるPortAudioの新しいバージョンかもしれません。それをコンパイルすることは問題ではありません。以下のコードをWTFPLライセンスの条件で使用することができます。 :-)(PortAudioの例から派生したものです)
#include <stdio.h>
#include <math.h>
#include "portaudio.h"
#include <stdint.h>
#include <unistd.h> // for usleep()
#define SAMPLE_RATE (44100)
#define FRAMES_PER_BUFFER (64)
typedef struct
{
uint32_t total_count;
uint32_t up_count;
uint32_t counter;
uint32_t prev_freq;
uint32_t freq;
} paTestData;
//volatile int freq = 0;
/* This routine will be called by the PortAudio engine when audio is needed.
** It may called at interrupt level on some machines so don't do anything
** that could mess up the system like calling malloc() or free().
*/
static int patestCallback(const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData)
{
paTestData *data = (paTestData*)userData;
uint8_t *out = (uint8_t*)outputBuffer;
unsigned long i;
uint32_t freq = data->freq;
(void) timeInfo; /* Prevent unused variable warnings. */
(void) statusFlags;
(void) inputBuffer;
for(i=0; i<framesPerBuffer; i++)
{
if(data->up_count > 0 && data->total_count == data->up_count) {
*out++ = 0x00;
continue;
}
data->total_count++;
if(freq != data->prev_freq) {
data->counter = 0;
}
if(freq) {
int overflow_max = SAMPLE_RATE/freq;
uint32_t data_cnt = data->counter % overflow_max;
if(data_cnt > overflow_max/2)
*out++ = 0xff;
else {
*out++ = 0x00;
}
data->counter++;
}
else {
data->counter = 0;
*out++ = 0;
}
data->prev_freq = freq;
}
return paContinue;
}
static PaStream *stream;
static paTestData data;
void buzzer_set_freq(int frequency)
{
data.up_count = 0; // do not stop!
data.freq = frequency;
}
void buzzer_beep(int frequency, int msecs)
{
data.total_count = 0;
data.up_count = SAMPLE_RATE * msecs/1000;
data.freq = frequency;
}
int buzzer_start(void)
{
PaStreamParameters outputParameters;
PaError err;
int i;
err = Pa_Initialize();
if(err != paNoError) goto error;
outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
outputParameters.channelCount = 1; /* stereo output */
outputParameters.sampleFormat = paUInt8; /* 32 bit floating point output */
outputParameters.suggestedLatency = Pa_GetDeviceInfo(outputParameters.device)->defaultLowOutputLatency;
outputParameters.hostApiSpecificStreamInfo = NULL;
err = Pa_OpenStream(
&stream,
NULL, /* no input */
&outputParameters,
SAMPLE_RATE,
FRAMES_PER_BUFFER,
paClipOff, /* we won't output out of range samples so don't bother clipping them */
patestCallback,
&data);
if(err != paNoError) goto error;
err = Pa_StartStream(stream);
if(err != paNoError) goto error;
return err;
error:
Pa_Terminate();
fprintf(stderr, "An error occured while using the portaudio stream\n");
fprintf(stderr, "Error number: %d\n", err);
fprintf(stderr, "Error message: %s\n", Pa_GetErrorText(err));
return err;
}
int buzzer_stop()
{
PaError err = 0;
err = Pa_StopStream(stream);
if(err != paNoError) goto error;
err = Pa_CloseStream(stream);
if(err != paNoError) goto error;
Pa_Terminate();
return err;
error:
Pa_Terminate();
fprintf(stderr, "An error occured while using the portaudio stream\n");
fprintf(stderr, "Error number: %d\n", err);
fprintf(stderr, "Error message: %s\n", Pa_GetErrorText(err));
return err;
}
void msleep(int d){
usleep(d*1000);
}
int main(void)
{
// notes frequency chart: http://www.phy.mtu.edu/~suits/notefreqs.html
buzzer_start();
buzzer_set_freq(261);
msleep(250);
buzzer_set_freq(293);
msleep(250);
buzzer_set_freq(329);
msleep(250);
buzzer_set_freq(349);
msleep(250);
buzzer_set_freq(392);
msleep(250);
buzzer_set_freq(440);
msleep(250);
buzzer_set_freq(494);
msleep(250);
buzzer_beep(523, 200);
msleep(250);
buzzer_stop();
return 0;
}
ライセンスでLOL。これは私が初めて見る時です。 btw良い例(ちょっと長い) –
すぐに使えるようになってすぐに動く時間は問題ありません。修理は必要ありません – NickSoft
私はこのようなことを永遠に見てきました。ありがとう! –
- 1. 特定のサウンド周波数を生成するには?
- 2. JavaScript WebAudioは複数の周波数でサウンドを生成します
- 3. MATLABで特定の周波数のパルス波を生成する方法
- 4. サウンド周波数検出?
- 5. アンドロイドで特定の周波数の音を再生する
- 6. ゼロ交差を使用してサウンドの周波数を取得する方法
- 7. アンドロイドでさまざまな周波数のサウンドを再生する方法は?
- 8. 生成された波形データを使用して.NETでサウンドを再生
- 9. スケールを使って周波数変数を更新する
- 10. 関数(周波数)を使って文字を数えよう
- 11. 現在再生中のサウンドの周波数を変更する(Android)
- 12. Verilogで特定の周波数の方形波を出力する
- 13. 高周波でNSTimerを使用していますか?
- 14. MATLABでデュアルトーン周波数をどのように生成しますか?
- 15. midiでプログラミングし、特定の周波数にチューニングするノート
- 16. javaのクリップライブラリを使って別の周波数で曲を再生することができます
- 17. オーディオサンプルの周波数はチャンネルに依存していますか?
- 18. Flash:アップロードされたサウンドのサウンド波形を生成/表示
- 19. 特定の周波数で画像を切り替えるC++
- 20. 特定の周波数、SDR、FFTで電力を得る
- 21. テーブルを修正して絶対周波数と相対周波数を得る
- 22. Pythonの特定の周波数値内でどのくらいのアクティビティが発生しているかを測定します。
- 23. AudioKitのAKHighPassFilterを使用して周波数をフィルタリングする
- 24. 周波数を変えて連続トーンを生成するにはどうしたらいいですか?
- 25. signal.spectrogram特定のセグメントの最大周波数を見つける
- 26. Rでビン周波数テーブルを生成するには?
- 27. 生のオーディオを録音してから周波数を取得するには?
- 28. AVRでインプットキャプチャを使用して周波数とデューティを測定する
- 29. FFTを使用して矩形波の周波数を見つける方法
- 30. スカラ:特定の単語とカウント周波数を一致
'sox'は、Linux上でサウンドを生成する方法であるため、探したい単語にする必要があります。 Wikipediaより:「Unixライクなシステムでは、SoX(再生コマンドとして)がシステムオーディオファイルプレーヤーとして一般的に提供されています。 – heltonbiker
このようなものは現在のISO C/C++標準スコープの外にあるので、ツールレックとして閉じることに投票するので、「どのライブラリを使用できるか」になります。 SDLバージョン:http://stackoverflow.com/questions/10110905/simple-wave-generator-with-sdl-in-c –