gpt4 book ai didi

iOS:将 OpenAL 的变调和管道输出输出到缓冲区

转载 作者:可可西里 更新时间:2023-11-01 05:42:42 25 4
gpt4 key购买 nike

我最近发现在 iOS 中可以使用 OpenAL 进行音高转换。

我正在查看 Hollance 的音库播放器。它吸收了 15 个左右散布在整个范围内的钢琴音符,并通过找出它最接近哪个样本来播放任何音符,并将该样本的音高移动适当的量。这是执行此操作的代码:

- (void) noteOn: (int) midiNoteNumber 
gain: (float) gain
{
if (!initialized)
{
NSLog(@"SoundBankPlayer is not initialized yet");
return;
}

int sourceIndex = [self findAvailableSource];
if (sourceIndex != -1)
{
alGetError(); // clear any errors

Note* note = notes + midiNoteNumber;
if (note->bufferIndex != -1)
{
Buffer* buffer = buffers + note->bufferIndex;
Source* source = sources + sourceIndex;

source->noteIndex = midiNoteNumber;

alSourcef(source->sourceId, AL_PITCH, note->pitch / buffer->pitch);
alSourcei(source->sourceId, AL_LOOPING, AL_FALSE);
alSourcef(source->sourceId, AL_REFERENCE_DISTANCE, 100.0f);
alSourcef(source->sourceId, AL_GAIN, gain);

float sourcePos[] = { note->panning, 0.0f, 0.0f };
alSourcefv(source->sourceId, AL_POSITION, sourcePos);

alSourcei(source->sourceId, AL_BUFFER, AL_NONE);
alSourcei(source->sourceId, AL_BUFFER, buffer->bufferId);
ALenum error;
if ((error = alGetError()) != AL_NO_ERROR)
{
NSLog(@"Error attaching buffer to source: %x", error);
return;
}

alSourcePlay(source->sourceId);
if ((error = alGetError()) != AL_NO_ERROR)
{
NSLog(@"Error starting source: %x", error);
return;
}
}
}
}

你可以看到这条线进行了音高转换:

        alSourcef(source->sourceId, AL_PITCH, note->pitch / buffer->pitch);

不幸的是,这不利于同时播放一堆音符,因为它占用太多 CPU。它是动态变调的。

我想要的是为每个钢琴音符创建一个缓冲区,并使用这种音高变换技术填充这些缓冲区。但我看不出如何让 openAL 将声音播放到缓冲区中,而不是通过扬声器播放。

有什么方法可以通过管道输出 alSourcePlay(source->sourceId);

进入缓冲区?

如果我不能这样做,我有什么选择?我曾尝试使用 DSPDimension 文章中的 smbPitchShift,但保真度不高:钢琴音符的起音阶段确实丢失了。我想我可以使用 Dirac3 的免费版本...(目前我没有钱购买完整版本,但我认为免费版本允许 Mono 处理,所以我可以破解它)。还有其他选择吗?

编辑:此后我测试了 Dirac3,它也有同样的问题。似乎笼罩住了攻击。 OpenAL 的变调器似乎以某种方式做了一些 Dirac3 做不到的事情。

最佳答案

alSourcePlayv 允许您同时播放多个源 - 源的最大数量取决于平台,但在 iOS 上为 32(在 apple 核心音频列表中回答,这里是为了完整性)

关于iOS:将 OpenAL 的变调和管道输出输出到缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4364901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com