2014-12-10 65 views
0

我录制了一个弹奏吉他弦的音符,然后拿出每个和声的振幅,并通过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}; 

上无畏的频谱图给我性否定值,最低为-72.7,所以我从72.7减去的值在每一个峰值,然后乘以10来获得上述值。编程错了吗?和声内容/音色值是否错误?是否没有办法让它发出吉他音,而不对波做出特定的攻击和衰减修改?所有的帮助表示赞赏。

+0

那么'int []吉他是否意味着每个谐波的电平? – jaket 2014-12-10 23:36:43

+0

是的。由于我除以“总数”,我认为他们只需要处于正确的比例。对? – 2014-12-10 23:42:04

+0

是的,这是正确的。你有没有看过Karplus-Strong算法? http://www.cs.princeton.edu/courses/archive/fall07/cos126/assignments/guitar.html – jaket 2014-12-10 23:51:14

回答

0

,给乐器独特的声音的事情是

  • 波形,其粗略地讲的各种谐波
  • 包络,这是振幅随时间的变化的相对幅度的组合 - 大致来说,您已经掌握了声音在开始达到峰值水平所需的时间,从峰值水平下降到持续水平所需的时间,持续时间的比率水平到高峰水平,然后从持续水平衰减的方式。

这些对区分一种仪器和另一种仪器都很重要。例如,小提琴和喇叭倾向于具有相同或几乎相同的波形,但信封非常不同。

您的一般方法似乎将重点放在波形上,而完全忽略信封。

您可能可以从不同的网站获得更多帮助 - 也许是“物理”堆栈交换,甚至是“音乐”堆栈交换。但是你现在的问题与Java编程无关。