메모를 연주하는 기타 문자열을 녹음 한 다음 각 하모니의 진폭을 취하여 프롤로그 (안드로이드)를 통해 유사한 사운드를 다시 만들었지 만 소리가 나지 않습니다 기타처럼. 대담에생생한 오디오를 통해 하모니로 기타 문자열 다시 만들기
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에서 각각 피크 값을 뺀다. 프로그래밍이 잘못 되었습니까? 하모니 컨텐츠/음색 값이 잘못 되었습니까? 웨이브에 특정한 공격과 쇠퇴 수정을하지 않고 기타를 연주 할 수있는 방법이 없습니까? 모든 도움을 주시면 감사하겠습니다.
그래서'int [] guitar'는 각 고조파의 레벨을 의미합니까? – jaket
예. 내가 "합계"로 나눌 때, 나는 그들이 올바른 비율이어야한다고 생각합니다. 권리? –
예, 맞습니다. Karplus-Strong 알고리즘을 보셨습니까? http://www.cs.princeton.edu/courses/archive/fall07/cos126/assignments/guitar.html – jaket