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:
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.
Aquí hay un ejemplo de trabajo mínimo de un programa de python que genera un .wav
archivo 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"
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:
Dónde es la frecuencia de su sonido (A4 = 440 Hz, por ejemplo) y 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.
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.
kyle kanos
bjornw
R2B2
bjornw