Вы можете сделать это с синусоидой, как вы сказали, которую вы бы определили с помощью функций sin. Создайте буфер так долго, как вам нужен звук в сэмплах, например:
// 1 second chirp
float samples[44100];
Затем выберите начальную частоту и конечную частоту, которую вы, вероятно, хотите, чтобы начало было выше, чем конец, что-то вроде:
float startFreq = 1400;
float endFreq = 1100;
float thisFreq;
int x;
for(x = 0; x < 44100; x++)
{
float lerp = float(float(x) / 44100.0);
thisFreq = (lerp * endFreq) + ((1 - lerp) * startFreq);
samples[x] = sin(thisFreq * x);
}
Как-то так.
А если вы хотите гудение или другой звук, используйте различные формы волны - создайте их так, чтобы они работали очень похоже на грех, и вы можете использовать их взаимозаменяемо. Таким образом, вы могли бы создать saw () sqr () tri (), и вы могли бы делать такие вещи, как объединять их в более сложные или разнообразные звуки
========================
Редактировать -
Если вы хотите играть, вы должны иметь возможность что-то делать в этом направлении, используя OpenAL. Важно использовать OpenAL или аналогичный iOS API для воспроизведения необработанного буфера.
alGenBuffers (1, &buffer);
alBufferData (buffer, AL_FORMAT_MONO16, buf, size, 8000);
alGenSources (1, &source);
ALint state;
// attach buffer and play
alSourcei (source, AL_BUFFER, buffer);
alSourcePlay (source);
do
{
wait (200);
alGetSourcei (source, AL_SOURCE_STATE, &state);
}
while ((state == AL_PLAYING) && play);
alSourceStop(source);
alDeleteSources (1, &source);
delete (buf)
}