2014-12-10 8 views
0

메모를 연주하는 기타 문자열을 녹음 한 다음 각 하모니의 진폭을 취하여 프롤로그 (안드로이드)를 통해 유사한 사운드를 다시 만들었지 만 소리가 나지 않습니다 기타처럼. 대담에생생한 오디오를 통해 하모니로 기타 문자열 다시 만들기

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에서 내게 최소 nagative 값 준하므로 I는 상기 값을 얻기 위해 (10)을 곱하여, 72.7에서 각각 피크 값을 뺀다. 프로그래밍이 잘못 되었습니까? 하모니 컨텐츠/음색 값이 잘못 되었습니까? 웨이브에 특정한 공격과 쇠퇴 수정을하지 않고 기타를 연주 할 수있는 방법이 없습니까? 모든 도움을 주시면 감사하겠습니다.

+0

그래서'int [] guitar'는 각 고조파의 레벨을 의미합니까? – jaket

+0

예. 내가 "합계"로 나눌 때, 나는 그들이 올바른 비율이어야한다고 생각합니다. 권리? –

+0

예, 맞습니다. Karplus-Strong 알고리즘을 보셨습니까? http://www.cs.princeton.edu/courses/archive/fall07/cos126/assignments/guitar.html – jaket

답변

0

악기에게 특유의 소리를 제공 것은 대략 다양한 고조파 시간에 따른 진폭의 변화가

  • 봉투의 상대적인 크기를 말하는

    • 파형의 조합 대략적으로 말하면 사운드가 시작된 후 최고 레벨까지 올라가는 데 걸리는 시간이 있습니다. 최고 레벨에서 지속 레벨로 떨어지는 데 걸리는 시간, 지속되는 사운드의 비율 레벨에서 피크 레벨로, 그런 다음 지속 레벨에서 쇠퇴하는 방식으로 변경됩니다.

    하나의 계측기를 다른 계측기와 구별하는 데있어서 중요합니다. 예를 들어 바이올린과 트럼펫은 동일하거나 거의 동일한 파형을 가지지 만 봉투는 매우 다릅니다.

    일반적인 방법은 파형에 초점을 맞추고 봉투 전체를 무시하는 것 같습니다.

    아마도 "물리"스택 교환 또는 "음악"스택 교환과 같은 다른 사이트에서 더 많은 도움을받을 수 있습니다. 하지만이 시점에서 당신의 문제는 Java 프로그래밍과 관련이 없습니다.