我录制了一个吉他弦,弹奏一个音符,然后取每个和声的振幅,并通过prgram(android)将其重新创建以产生类似的声音,但是声音听起来并不像吉他。

public void setToHarmonies(int[] harmonies, int frequency){
        int total = 0;
        int size = harmonies.length;
        for(int i=0; i<size; i++){
            total+=harmonies[i];
        }
        for(int i=0; i<numSamples; i++){
            samples[i] = 0;
        }
        float[] effHarm = new float[size];
        double[][] hwaves = new double[size][numSamples];
        for(int i=0; i<size; i++){
            effHarm[i] = ((float)(harmonies[i]-.2)) / (float)total;
            hwaves[i] = genSinWave(numSamples, frequency * i);


for(int e=0; e<numSamples; e++){
            samples[e] += effHarm[i] * hwaves[i][e] * Math.exp((float)((float)e / (float)15000) * -1);
        }
    }
}

public double[] genSinWave(int size, int freq){
    double[] samplesOut = new double[size];
    float period = (float)sampleRate / (float)freq;
    for(int i=0; i<samplesOut.length; i++){
        samplesOut[i] = Math.sin(2 * i * Math.PI / period);
    }
    return samplesOut;
}
private static final int[] guitar = {699, 602, 465, 407, 544, 457, 443, 307, 283, 357, 342, 224};

Audacity的频谱图给出了负值,最小值为-72.7,因此我从72.7减去每个峰值的值,然后乘以10得到上述值。编程错误吗?和声内容/音色值是否错误?如果不对波进行特定的攻击和衰减修改,是否没有办法使它听起来像吉他一样?感谢所有帮助。

最佳答案

赋予乐器独特声音的是

  • 波形,大致来说是各种谐波的相对振幅
  • 包络,它是振幅随时间的变化-大致来说,您已经掌握了声音在开始形成达到峰值水平所需的时间,以及从声音开始下降所需的时间峰值水平与其持续水平之比,即持续水平与峰值水平之比,然后是其从持续水平衰减的方式。

  • 这两者对于区分一种仪器和另一种仪器都很重要。例如,小提琴和小号往往具有相同或几乎相同的波形,但包络却大不相同。

    您的一般方法似乎集中在波形上,而完全忽略了包络。

    您可能可以从其他站点上获得更多帮助-也许是“物理”堆栈交换,甚至是“音乐”堆栈交换。但是,此时您的问题与Java编程无关。

    07-28 02:32