Frecuencia resultante si se tocan 3 notas armónicas (un acorde)

Si conozco la frecuencia de las notas individuales que se tocan (supongamos D, F# y A), ¿cómo determino la frecuencia final si se tocan (casi) simultáneamente como un acorde?

Para poner el problema en contexto, estoy escribiendo un programa donde las entradas del usuario se clasifican y los acordes se tocan como salida. Mi conocimiento de programación es limitado (mis títulos son en bioquímica y neurociencia), y el archivo de ayuda me dio las siguientes opciones:

  1. Reproducir una frecuencia
  2. Usar una grabación para la reproducción

Como no deseo usar la segunda opción, me preguntaba cómo calcular la frecuencia resultante o representar matemáticamente el sonido resultante. Si alguien pudiera explicar la teoría detrás de esto o publicar un enlace para lo mismo, estaría especialmente agradecido.

Me parece que la superposición se aplicaría aquí.
si puede escribir un programa que genere una muestra con una frecuencia / nota, comience con eso y luego, para hacer un acorde, solo genere tres muestras y súmelas.
Gracias KyleKanos y @BjornW. Supongo que ambos están sugiriendo algo similar: sumar las frecuencias. ¡Suena bastante simple! Si realmente no suena bien (como señala wikipedia, "Debido a que los sistemas físicos generalmente son solo aproximadamente lineales, el principio de superposición es solo una aproximación del comportamiento físico real"), es posible que deba intentar agregar algo más complejo, como sugerido por ja72.
si observas el ámbito de la música electrónica, los sintetizadores, etc., que constituyen la mayor parte de la música popular hoy en día, probablemente el 99% de estos solo suman las notas. algunas simulaciones dedicadas de, por ejemplo, bajo o piano, pueden agregar interacciones... pero, por lo demás, la mayoría de las no linealidades musicales se colocan después de la superposición, como en la distorsión de un amplificador de guitarra eléctrica, por ejemplo.

Respuestas (4)

Aquí hay un ejemplo de trabajo mínimo de un programa de python que genera un .wavarchivo con una tríada mayor de 440:550:660 Hz usando ondas sinusoidales. Su entrada de usuario podría usarse para generar cualquier frecuencia para el acorde.

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"
Supongo que es consciente de que, en una afinación igualmente templada, las principales frecuencias de la tríada no son exactamente las proporciones racionales entre los miembros de ( 4 , 5 , 6 ) sino que son las proporciones entre ( 1 , 2 1 3 , 2 7 12 ) , y así más como ( 4 , 5.04 , 5.993 ) .
Absolutamente. También soy consciente de la afinación estirada en los pianos, porque los sobretonos de octava no son perfectos. Por cierto, ¿alguna vez has escuchado instrumentos electrónicos de 10 tet? Totalmente extraño.

Bueno, pides un "sonido resultante" pero, de hecho, cuando tocas una nota, por ejemplo A4, no solo suena un sonido.

En teoría, una onda se puede representar como un seno, una simple oscilación. Por ejemplo, una onda que se propaga en una cuerda puede tener la siguiente forma:

y ( X , t ) = A pecado ( 2 π F t k X )

Dónde F es la frecuencia de su sonido (A4 = 440 Hz, por ejemplo) y k está relacionado con las propiedades de la cuerda, como la densidad.

En una cuerda ideal, se puede propagar una sola onda de ese tipo. Esta onda corresponde a un modo de vibración (el número de ciclos de la onda). Sin embargo, en una cuerda real, cuando tocas un violín, por ejemplo, muchos modos de vibración vibran al mismo tiempo. ¿Cuáles? El correspondiente a la serie armónica .

Eso significa que cuando toca, por ejemplo, una nota A, el 440 A vibra muy fuerte. Pero también los A5 y E5, y C#5, en menor intensidad (y muchas más frecuencias, con menor intensidad). Entonces, cuando tocas una nota, escuchas más de un sonido. Esta es la diferencia entre piano y violín, por ejemplo. Si ves qué frecuencias suenan y cuál es su intensidad cuando tocas A, te darás cuenta de que hay diferencias. Es por eso que cada instrumento tiene su propia onda de sonido. Para tener un sonido realista hay que intentar imitar el espectro de un instrumento, lo cual es realmente difícil (y por eso se usan mucho las grabaciones de instrumentos reales).

En un acorde, no solo obtienes la suma de todos los armónicos de cada sonido, sino una superposición de ellos, lo que hace que la cosa sea aún más compleja. Por ejemplo, en una orquesta, pueden surgir "armónicos no deseados" cuando los metales tocan un acorde grande. La superposición de sonidos puede dar intensidad a una frecuencia que no está en el acorde, haciendo que suene horrible. Los buenos compositores saben cómo evitar estas cosas mediante una correcta conducción de la voz.

El ejemplo que alguien dio en Python será funcional y obtendrás un buen sonido, porque la frecuencia fundamental es la más importante. Tenga en cuenta que el ejemplo escribe cada sonido como una onda sinusoidal simple. Pero las olas reales son algo más complejas. Puedes intentar aproximar los sonidos reales como una suma de las frecuencias de la serie armónica, usando senos. Y luego combine esto para crear un acorde. Para ello (¡no es fácil!) puedes leer sobre las Series de Fourier .

Solo para su curiosidad, estas ondas complejas se denominan paquetes de ondas y los armónicos se pueden analizar mediante el análisis de Fourier. En Neurociencia puede ser útil para analizar señales eléctricas del cerebro ;D

Un acorde no tiene una sola frecuencia, ya que consta de tres notas de diferentes frecuencias que se tocan al mismo tiempo. Puede que te suene como una sola nota ya que las tres frecuencias que componen los acordes tienen que estar en armonía.

Si desea tocar una determinada melodía o canción usando solo frecuencias individuales, le sugiero que solo toque la nota raíz de cada acorde en lugar del acorde completo. Esto le brinda los típicos tonos de llamada monótonos de los años 90.

Desafortunadamente, no creo que usar solo la nota raíz sirva para mi propósito, por lo que no probaré la sugerencia de @ JgL. Pero tienes mi agradecimiento.
¿Puedes explicar lo que estás tratando de hacer? ¿Parece que está tratando de tocar una melodía con un programa que solo puede dar una frecuencia como salida?
Tomo una serie de entradas eléctricas relativamente aleatorias en tiempo real y las clasifico a medida que entran. Dependiendo de la clasificación, sonará un acorde. Por lo tanto, como habrás adivinado, espero tocar una melodía compuesta por una serie de acordes. La razón por la que no deseo usar notas individuales/raíz es porque tienden a sonar horrible cuando se conectan al azar, sin embargo, una serie de acordes rara vez suena mal y no quiero poner mucha teoría musical en el programa para hacer la computadora "compone" activamente una melodía. Pienso en ello como rasguear una guitarra al azar o tocar un violín al azar.

Sabes que una sola nota en un instrumento contiene múltiples frecuencias y armónicos. La forma de onda nunca es una onda sinusoidal ideal que transporta una frecuencia. Así que la combinación de dos notas se puede hacer con una integral de convolución .

Convierte cada nota al dominio de la frecuencia a través de una transformada de Fourier y combina las señales usando la integral de convolución. Al final tienes el espectro de frecuencia del sonido resultante.

Gracias por tu sugerencia. Lo probaré si la sugerencia de @KyleKanos sobre el uso de la superposición no funciona. ¡Las integrales de convolución suenan bastante complicadas!