iOS正弦波生成-听得见的咔嗒声 [英] iOS sine wave generation - audible clicking
本文介绍了iOS正弦波生成-听得见的咔嗒声的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在为iOS创建一个合成器。在玩转并尝试学习核心音频之后,我遇到了一个无法解决的问题。我的正弦波会按固定间隔发出咔嗒声,我猜这与相位有关。我看过有关该主题的几本指南和书籍,所有都表明我做得正确。
I am in the process of creating a synthesiser for iOS. After playing around and attempting to learn core audio, I have encountered a problem that I cannot get my head around. My sine wave makes a clicking noise on regular intervals, which Im guessing is related to the phase. I have looked at several guides and books on the subject, and all suggest that I am doing it correctly.
如果有人愿意为我看我的代码
If anybody would be so kind to look at my code for me it would be greatly appreciated.
static OSStatus renderInput(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{
// Get a reference to the object that was passed with the callback
// In this case, the AudioController passed itself so
// that you can access its data.
AudioController *THIS = (AudioController*)inRefCon;
// Get a pointer to the dataBuffer of the AudioBufferList
AudioSampleType *outA = (AudioSampleType *)ioData->mBuffers[0].mData;
float freq = THIS->Frequency;
float phase = THIS->sinPhase;
float envValue;
float sinSignal;
// The amount the phase changes in single sample
double phaseIncrement = 2 * M_PI * freq / kGraphSampleRate;
// Loop through the callback buffer, generating samples
for (UInt32 i = 0; i < inNumberFrames; ++i) {
sinSignal = sin(phase);
envValue = THIS->env.tick();
// Put the sample into the buffer
// Scale the -1 to 1 values float to
// -32767 to 32767 and then cast to an integer
outA[i] = (SInt16)(((sinSignal * 32767.0f) / 2) * envValue);
phase = phase + phaseIncrement;
if (phase >= (2 * M_PI * freq)) {
phase = phase - (2 * M_PI * freq);
}
}
// Store the phase for the next callback.
THIS->sinPhase = phase;
return noErr;
}
推荐答案
该阶段可能因错误而溢出点
The phase can overflow on wrong point
替换为:
if (phase >= (2 * M_PI * freq)) {
phase = phase - (2 * M_PI * freq);
}
with
if (phase >= (2 * M_PI)) {
phase = phase - (2 * M_PI);
}
这篇关于iOS正弦波生成-听得见的咔嗒声的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文