Результирующая частота при воспроизведении 3 гармонических нот (аккорда)

Если я знаю частоту воспроизведения отдельных нот (допустим, D, F# и A), как мне определить окончательную частоту, если они воспроизводятся (почти) одновременно как аккорд.

Чтобы поставить проблему в контекст, я пишу программу, в которой пользовательский ввод классифицируется, а аккорды воспроизводятся в качестве вывода. Мои познания в области программирования ограничены (мои степени в области биохимии и неврологии), и файл справки дал мне следующие варианты:

  1. Воспроизвести частоту
  2. Использовать запись для воспроизведения

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

Мне кажется, что суперпозиция здесь применима.
если вы можете написать программу, которая генерирует сэмпл с одной частотой/нотой, начните с этого, а затем, чтобы создать аккорд, просто сгенерируйте три семпла и сложите их вместе.
Спасибо KyleKanos и @BjornW. Я полагаю, вы оба предлагаете что-то подобное: добавить частоты. Звучит достаточно просто! Если это звучит не очень хорошо (как указывает Википедия: «Поскольку физические системы, как правило, лишь приблизительно линейны, принцип суперпозиции является лишь приближением к истинному физическому поведению»), мне, возможно, придется попробовать добавить что-то более сложное, как предложил ja72.
если вы посмотрите на область электронной музыки, синтезаторов и т. д., которые в настоящее время составляют большую часть популярной музыки, вероятно, 99% из них просто складываются из нот. некоторые специальные симуляции, скажем, баса или фортепиано могут добавить взаимодействия ... но в остальном большинство нелинейностей в музыкальном плане помещаются после суперпозиции, как, например, в искажении усилителя электрогитары.

Ответы (4)

Вот минимальный рабочий пример программы на 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 , 5 , 6 ) но вместо этого отношения между ( 1 , 2 1 3 , 2 7 12 ) , а так больше похоже ( 4 , 5.04 , 5.993 ) .
Абсолютно. Я также знаю о растянутой настройке фортепиано, потому что октавные обертоны не идеальны. Кстати, вы когда-нибудь слышали электронные 10-тетовые инструменты? Совершенно странно.

Ну, вы просите "результирующий звук", а на самом деле при воспроизведении ноты, например А4, воспроизводится не один звук.

Теоретически волну можно представить как синусоиду, простое колебание. Например, волна, распространяющаяся по струне, может иметь следующий вид:

у ( Икс , т ) "=" А грех ( 2 π ф т к Икс )

Где ф частота вашего звука (например, A4 = 440 Гц) и к связано со свойствами струны, такими как плотность.

В идеальной струне может распространяться одна волна этого типа. Эта волна соответствует моде вибрации (количество циклов волны). Однако на настоящей струне, например, когда вы играете на скрипке, одновременно вибрирует множество мод колебаний. Какие? Соответствующий гармоническому ряду .

Это означает, что при воспроизведении, например, ноты A, 440 A вибрирует очень сильно. Но также и A5, и E5, и C#5 с меньшей интенсивностью (и многие другие частоты с меньшей интенсивностью). Поэтому, когда вы играете ноту, вы слышите более одного звука. В этом, например, разница между фортепиано и скрипкой. Если вы увидите, какие частоты звучат и какова их интенсивность, когда вы играете ля, вы поймете, что есть различия. Вот почему каждый инструмент имеет свою правильную звуковую волну. Чтобы иметь реалистичный звук, вы должны попытаться имитировать спектр инструмента, что действительно сложно (поэтому очень часто используются записи реальных инструментов).

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

Пример, который кто-то дал на Python, будет функциональным, и вы получите хороший звук, потому что основная частота является наиболее важной. Обратите внимание, что в примере каждый звук записывается как простая синусоида. Но настоящие волны представляют собой нечто более сложное. Вы можете попытаться аппроксимировать реальные звуки как сумму частот гармонического ряда, используя синусы. А затем объедините это, чтобы создать аккорд. Для этого (это непросто!) можно прочитать о рядах Фурье .

Только для вашего любопытства, эти сложные волны называются волновыми пакетами, и гармоники могут быть проанализированы с помощью анализа Фурье. В неврологии может быть полезно анализировать электрические сигналы мозга ;D

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

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

К сожалению, я не думаю, что использование только основного примечания будет служить моей цели, поэтому я не буду пробовать предложение @JgL. Но прими мою благодарность.
Можете ли вы объяснить, что вы пытаетесь сделать? Похоже, вы пытаетесь воспроизвести мелодию с помощью программы, которая может выдавать только одну частоту на выходе?
Я беру серию относительно случайных электрических входов в реальном времени и классифицирую их по мере поступления. В зависимости от классификации будет играть аккорд. Следовательно, как вы уже догадались, я собираюсь сыграть мелодию, состоящую из ряда аккордов. Причина, по которой я не хочу использовать отдельные/основные ноты, заключается в том, что они имеют тенденцию звучать ужасно при случайном включении, однако последовательность аккордов редко звучит грязно, и я не хочу вводить в программу много музыкальной теории, чтобы сделать компьютер активно «сочиняет» мелодию. Я думаю об этом как о случайной игре на гитаре и случайной игре на скрипке.

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

Вы преобразуете каждую ноту в частотную область с помощью преобразования Фурье и объединяете сигналы с помощью интеграла свертки. В итоге у вас есть частотный спектр результирующего звука.

Спасибо за ваше предложение. Я попробую, если предложение @KyleKanos об использовании суперпозиции не сработает. Интегралы свертки звучат довольно запутанно!