音频播放,创建淡入/淡出的嵌套循环

时间:2010-03-07 21:17:30

标签: c audio fade playback synthesis

这里的第一次海报。

关于在此处设置循环的快速问题。我想为主循环的前1/3设置一个for循环,它将从.00001增加一个值或类似于1.所以我可以使用它来乘以一个样本变量,以便创建一个淡入这个简单的音频文件播放程序。

到目前为止,它已经变得有点头疼,任何帮助都非常接受。

for(i=0; i < end && !feof(fpin); i+=blockframes) 
{ 
    samples = fread(audioblock, sizeof(short), blocksamples, fpin); 
    frames = samples; 
    for(j=0; j < frames; j++)
    {   
        for (f = 0; f< frames/3 ;f++)
        {
            fade = fade--;
        } 
    output[j] = audioblock[j]/fade;
    }

    fwrite(output,sizeof(short), frames, fpoutput); 
} 

道歉, 到目前为止,我已经成功阅读并重写了该文件。我的问题是我试图想出一种方法来循环变量'fade',所以它增加或减少到1,所以我可以修改输出变量。

我想说3个阶段: 1.从0到帧/ 3,将乘法因子从.0001增加到1 2.从第1/3帧到第2/3帧不做任何事情(乘以1)和 3.使因子再次降低至1以下,以使输出变量减小回原点。

如何创建一个循环来增加和减少外部循环中的这些值?

3 个答案:

答案 0 :(得分:2)

我认为你认为自己陷入了困境。无需创建嵌套循环来修改渐变增益,您可以通过循环简单地跟踪它并在必要时进行调整。另外,你的框架/样本的变量命名对我来说似乎有点混乱,我希望我有一个正确。

float fadeTime = 0.5f;
float outputGain = 0.0f;
float gainProgressionPerSample = 1.0f/(fadeTime*SAMPLERATE);
float fadeInStop = fadeTime*SAMPLERATE;
float fadeOutBegin;

for(i=0; i < end && !feof(fpin); i+=blockframes) 
{ 
    samples = fread(audioblock, sizeof(short), blocksamples, fpin); 
    fadeOutBegin = samples - fadeTime*SAMPLERATE;
    for(j=0; j < samples; j++)
    {
       if (j < fadeInStop)   
       {
         outputGain += gainProgressionPerSample;
       }
       // else is not used intentionally to allow fade in/out blending for short tracks
       if (j > fadeOutBegin)
       {
         outputGain -= gainProgressionPerSample;
       }
       output[j] = audioblock[j]*outputGain;
    }

    fwrite(output,sizeof(short), samples, fpoutput); 
} 

答案 1 :(得分:0)

我的第一个观察结果:

fade = fade--;

不起作用,因为它等同于

int temp = fade - 1;
fade = fade;

这是后增量运算符的工作方式。所以你应该写一下

fade--;

代替(或--fade - 无论你喜欢什么: - )。

然后你应该建立你的循环:

for(j=0; j < frames/3; j++)
{   
    fade--;
    output[j] = audioblock[j]/fade;
}
for( ; j < 2*frames/3; j++)
{   
    output[j] = audioblock[j]/fade;
}
for( ; j < frames; j++)
{   
    fade++;
    output[j] = audioblock[j]/fade;
}

答案 2 :(得分:0)

在现代处理器中,没有真正的理由不使用浮点数学。它更准确,性能与整数数学大致相同。如果您使用浮点数,则没有理由不将所有临时变量都设置为双精度数。将它们声明为浮动实际上会降低性能。

此代码将为您提供超过(帧/ 3)样本的线性淡入淡出

double gain = 0.0f;
double deltaGain = (1.0 - gain)/(frames/3);
for (int i=0; i < end && !feof(fpin); i += blockframes) 
{ 
    samples = fread(audioblock, sizeof(short), blocksamples, fpin); 

    j = 0;
    // do the fade in.
    for ( ; j < samples; ++j)
    {
       gain += deltaGain; // adjust the gain
       if (gain >= 1.0)
          break;

       output[j] = (short)(audioblock[j] * gain);
    }

    // copy the remainder.
    for ( ; j < samples; ++j)
       output[j] = audioblock[j];

    fwrite(output,sizeof(short), samples, fpoutput); 
} 

基本技巧是预先计算增益乘数的起点和终点,然后除(结束 - 开始)/步骤以获得每个样本的增益应该改变的量。然后在你的内循环中,调整增益只是一个补充。只需在内环中添加两个加法就可以获得x平方增益曲线。 x-squared是对数渐变的合理近似值,其中声音更自然,因为我们的耳朵听到了对数刻度。