所以,稍後我正在研究一個波形發生器應用程序,並且遇到了一些問題,但是Kenny Winker是一個真正的救生員,並且幫助我基本上掌握了一切。然而,最終我遇到的一個問題是,每當我改變我使用的頻率的值(並且在我改變音量值時的程度較小)時,我最終會看到這些醜陋的「彈出「噪音。這是一個問題,因爲整個問題的關鍵是能夠用滑塊順利地改變波的頻率和音量,聽起來像紙張弄皺可能會毀掉這種效果。這是控制音量/頻率的OSStatus代碼。如何在使用remoteIO生成iPhone音頻時防止爆音?
OSStatus playbackCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData) {
SlidersViewController *me = (SlidersViewController *)inRefCon;
static int phase = 1;
for(UInt32 i = 0; i < ioData->mNumberBuffers; i++) {
int samples = ioData->mBuffers[i].mDataByteSize/sizeof(SInt16);
SInt16 values[samples];
float waves;
for(int j = 0; j < samples; j++) {
waves = 0;
waves += sin(kWaveform * me.fr1 * phase)*(me.vol1);
waves += sin(kWaveform * me.fr2 * phase)*(me.vol2);
waves += sin(kWaveform * me.fr3 * phase)*(me.vol3);
waves *= sin(kWaveform * (me.fr4/100) * phase)*(me.vol4);
waves *= 32500/4;
values[j] = (SInt16)waves;
values[j] += values[j]<<16;
phase++;
}
memcpy(ioData->mBuffers[i].mData, values, samples * sizeof(SInt16));
}
return noErr;}
正如你可能會看到,在OBJ-C變量 「FR1」 - 「FR4」 控制頻率,而 「VOL1」 到 「VOL4」 控制幅度。每次更新這些值
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {}
或
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {}
被觸發。有關如何解決這個問題的任何想法讓它聽起來更流暢? 謝謝!
我對如何實現這個有點困惑。我有一個類似的想法,即做currentFrequency = oldFrequency +((newFrequency-oldFrequency)*(currentPhase/sampleRate)),但我一直在堅持。你能告訴我如何實現你的deltaPhase方法嗎?謝謝! – wyager 2010-12-11 04:39:47
好吧,仍然沒有運氣......要麼用我的技術,要麼嘗試使用你的deltaPhase方法。我被困在這裏。 – wyager 2010-12-11 17:59:44
@wyager:你是否從內部循環中刪除所有相位相乘?你不需要任何,只有增加,除了可能的音量縮放。 – hotpaw2 2010-12-11 18:58:33