我想将一个电路连接到我的计算机,该计算机使用音频输出作为交流电流,通过某些频率,然后将其整流为几个LED,所以如果我编写一个程序,让你创建一个特定的模式和要点亮的LED组合,它会输出特定频率的声音。
如何使用C ++以特定频率播放声音?
可能的?
答案 0 :(得分:1)
你可以用OpenAL做到这一点。
您需要生成一个包含代表所需输出的PCM编码数据的数组,然后使用所需的采样频率和格式调用阵列上的alBufferData()。有关alBufferData()函数所需的格式,请参见OpenAL Programmers Guide的第21页。
例如,以下代码播放100hz音色。
#include <iostream>
#include <cmath>
#include <al.h>
#include <alc.h>
#include <AL/alut.h>
#pragma comment(lib, "OpenAL32.lib")
#pragma comment(lib, "alut.lib")
int main(int argc, char** argv)
{
alutInit(&argc, argv);
alGetError();
ALuint buffer;
alGenBuffers(1, &buffer);
{
// Creating a buffer that hold about 1.5 seconds of audio data.
char data[32 * 1024];
for (int i = 0; i < 32 * 1024; ++i)
{
// get a value in the interval [0, 1) over the length of a second
float intervalPerSecond = static_cast<float>(i % 22050) / 22050.0f;
// increase the frequency to 100hz
float intervalPerHundreth = fmod(intervalPerSecond * 100.0f, 1.0f);
// translate to the interval [0, 2PI)
float x = intervalPerHundreth * 2 * 3.14159f;
// and then convert back to the interval [0, 255] for our amplitude data.
data[i] = static_cast<char>((sin(x) + 1.0f) / 2.0f * 255.0f);
}
alBufferData(buffer, AL_FORMAT_MONO8, data, 32 * 1024, 22050);
}
ALuint source;
alGenSources(1, &source);
alSourcei(source, AL_BUFFER, buffer);
alSourcePlay(source);
system("pause");
alSourceStop(source);
alDeleteSources(1, &source);
alDeleteBuffers(1, &buffer);
alutExit();
return 0;
}