Если я знаю частоту воспроизведения отдельных нот (допустим, D, F# и A), как мне определить окончательную частоту, если они воспроизводятся (почти) одновременно как аккорд.
Чтобы поставить проблему в контекст, я пишу программу, в которой пользовательский ввод классифицируется, а аккорды воспроизводятся в качестве вывода. Мои познания в области программирования ограничены (мои степени в области биохимии и неврологии), и файл справки дал мне следующие варианты:
Поскольку я не хочу использовать второй вариант, мне было интересно, как рассчитать результирующую частоту или математически представить результирующий звук. Если кто-то может объяснить теорию, стоящую за этим, или опубликовать ссылку на то же самое, я был бы особенно благодарен.
Вот минимальный рабочий пример программы на Python, которая генерирует .wav
файл с мажорной триадой 440:550:660 Гц, используя синусоидальные волны. Ваш пользовательский ввод может быть использован для генерации любых частот для аккорда.
import math, wave, array
duration = 1 # seconds
freq1 = 440 # tonic (Hz) (frequency of the sine waves)
freq2 = 550 # 2nd note
freq3 = 660 # 3nd note
amp1 = 0.2 # amplitude of freq1; sum of amplitudes should be <= 1
amp2 = 0.2 # amplitude of freq2
amp3 = 0.2 # amplitude of freq 3
volume = 100 # percent
data = array.array('h') # signed short integer (-32768 to 32767) data
sampleRate = 44100 # of samples per second (standard)
numChan = 1 # of channels (1: mono, 2: stereo)
dataSize = 2 # 2 bytes because of using signed short integers => bit depth = 16
numSamplesPerCyc = int(sampleRate / freq1)
numSamples = sampleRate * duration
factor=2*math.pi/sampleRate
for i in range(numSamples):
sample = 32767 * float(volume) / 100
sample *= amp1*math.sin(factor*freq1* i)+ amp2*math.sin(factor*freq2*i)+amp3*math.sin(factor*freq3*i)
data.append(int(sample))
f = wave.open('SineWave_' + str(freq1) + 'Hz.wav', 'w')
f.setparams((numChan, dataSize, sampleRate, numSamples, "NONE", "Uncompressed"))
f.writeframes(data.tostring())
f.close()
print "Done"
Ну, вы просите "результирующий звук", а на самом деле при воспроизведении ноты, например А4, воспроизводится не один звук.
Теоретически волну можно представить как синусоиду, простое колебание. Например, волна, распространяющаяся по струне, может иметь следующий вид:
Где частота вашего звука (например, A4 = 440 Гц) и связано со свойствами струны, такими как плотность.
В идеальной струне может распространяться одна волна этого типа. Эта волна соответствует моде вибрации (количество циклов волны). Однако на настоящей струне, например, когда вы играете на скрипке, одновременно вибрирует множество мод колебаний. Какие? Соответствующий гармоническому ряду .
Это означает, что при воспроизведении, например, ноты A, 440 A вибрирует очень сильно. Но также и A5, и E5, и C#5 с меньшей интенсивностью (и многие другие частоты с меньшей интенсивностью). Поэтому, когда вы играете ноту, вы слышите более одного звука. В этом, например, разница между фортепиано и скрипкой. Если вы увидите, какие частоты звучат и какова их интенсивность, когда вы играете ля, вы поймете, что есть различия. Вот почему каждый инструмент имеет свою правильную звуковую волну. Чтобы иметь реалистичный звук, вы должны попытаться имитировать спектр инструмента, что действительно сложно (поэтому очень часто используются записи реальных инструментов).
В аккорде вы получаете не только сумму всех гармоник каждого звука, но и их суперпозицию, что делает вещь еще более сложной. Например, в оркестре могут возникать «нежелательные гармоники», когда металлы играют большой аккорд. Наложение звуков может придать интенсивность частоте, которой нет на аккорде, что сделает ее ужасное звучание. Хорошие композиторы знают, как этого избежать правильным голосовым дирижированием.
Пример, который кто-то дал на Python, будет функциональным, и вы получите хороший звук, потому что основная частота является наиболее важной. Обратите внимание, что в примере каждый звук записывается как простая синусоида. Но настоящие волны представляют собой нечто более сложное. Вы можете попытаться аппроксимировать реальные звуки как сумму частот гармонического ряда, используя синусы. А затем объедините это, чтобы создать аккорд. Для этого (это непросто!) можно прочитать о рядах Фурье .
Только для вашего любопытства, эти сложные волны называются волновыми пакетами, и гармоники могут быть проанализированы с помощью анализа Фурье. В неврологии может быть полезно анализировать электрические сигналы мозга ;D
У аккорда нет единой частоты, так как он состоит из трех нот разной частоты, играемых одновременно. Для вас это может звучать как одна нота, поскольку три частоты, составляющие аккорды, должны быть в гармонии.
Если вы хотите сыграть определенную мелодию или песню, используя только отдельные частоты, я бы посоветовал вам играть только основную ноту каждого аккорда, а не полный аккорд. Это дает вам типичные монотонные звуки мелодии 90-х годов.
Вы знаете, что одна нота инструмента содержит несколько частот и гармоник. Форма волны никогда не бывает идеальной синусоидой, несущей одну частоту. Таким образом, объединение двух нот может быть выполнено с помощью интеграла свертки .
Вы преобразуете каждую ноту в частотную область с помощью преобразования Фурье и объединяете сигналы с помощью интеграла свертки. В итоге у вас есть частотный спектр результирующего звука.
Кайл Канос
БьорнВ
R2B2
БьорнВ