Я записал гитарную струну, играющую ноту, затем взял амплитуды каждой гармонии и поместил ее через программу (андроид), чтобы воссоздать подобный звук, но звук не звучит как гитара.Воспроизведение гитарной струны с гармониями через сырое аудио
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 дал мне Nagative значения, минимум на -72.7, поэтому я вычитают значение в каждой вершине с 72,7, а затем умножается на 10, чтобы получить указанные выше значения. Неправильно ли программирование? Не соответствуют ли значения содержания/тембра? Невозможно ли это сделать звук гитары-y без внесения конкретной модификации атаки и разложения в волну? Вся помощь приветствуется.
так что 'int [] гитара должна быть уровнем для каждой из гармоник? – jaket
Да. Поскольку я делясь на «итоговые», я думаю, что они просто должны быть в правильном соотношении. Правильно? –
Да, это правильно. Вы взглянули на алгоритм Karplus-Strong? http://www.cs.princeton.edu/courses/archive/fall07/cos126/assignments/guitar.html – jaket