2014-12-10 12 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}; 

Участок спектра на Audacity дал мне Nagative значения, минимум на -72.7, поэтому я вычитают значение в каждой вершине с 72,7, а затем умножается на 10, чтобы получить указанные выше значения. Неправильно ли программирование? Не соответствуют ли значения содержания/тембра? Невозможно ли это сделать звук гитары-y без внесения конкретной модификации атаки и разложения в волну? Вся помощь приветствуется.

+0

так что 'int [] гитара должна быть уровнем для каждой из гармоник? – jaket

+0

Да. Поскольку я делясь на «итоговые», я думаю, что они просто должны быть в правильном соотношении. Правильно? –

+0

Да, это правильно. Вы взглянули на алгоритм Karplus-Strong? http://www.cs.princeton.edu/courses/archive/fall07/cos126/assignments/guitar.html – jaket

ответ

0

То, что дают музыкальные инструменты отличительные звуки представляет собой сочетание

  • сигнала, который, грубо говоря, относительную амплитуду различных гармоник
  • конверт, который является изменение амплитуды с течением времени - грубо говоря, у вас есть время, необходимое для того, чтобы звук достиг пикового уровня после его начала, количество времени, которое требуется, чтобы упасть с его пикового уровня на его устойчивый уровень, соотношение поддерживаемого уровень до пикового уровня, затем способ, в котором он разрушается от устойчивого уровня.

Они оба важны при разграничении одного инструмента от другого. Например, скрипка и труба имеют одинаковые или почти одинаковые формы волны, но очень разные конверты.

Ваш общий метод, похоже, фокусируется на форме волны и полностью игнорирует оболочку.

Возможно, вы можете получить дополнительную помощь по этому вопросу с другого сайта - возможно, с помощью обмена «физикой» или даже с обменом «музыкой». Но ваша проблема на данный момент не связана с программированием на Java.