2014-12-10 42 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編程無關。