es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Haz que la distancia entre las notas musicales vecinas sea la misma (aplicación similar al Theremin).

Estoy creando una aplicación similar a un Theremin en Unity (C#).

Tengo el eje horizontal X, en el cual se puede hacer clic (con un mouse o con el dedo en un teléfono inteligente).
Este eje X determina la frecuencia que se reproducirá.
El usuario especificará el rango de frecuencia de la placa (eje X), digamos desde la frecuencia 261.63 (nota C4) hasta 523.25 (nota C5).

Calcularé x_position_ratio, que es un número entre 0 y 1 que determina dónde hizo clic el usuario en el eje X (0 representa la posición más a la izquierda (nota C4 en este ejemplo) y 1 representa la posición más a la derecha (nota C5)).

A partir de esto, calcularé la frecuencia a reproducir utilizando la siguiente ecuación:

“`C#
float freqRange = maxFreq – minFreq;
float frequency = (x_position_ratio * freqRange) + minFreq;


Luego reproduciré la `frequency`. Funciona perfectamente. Si dibujo las notas en la placa (eje X), podemos ver que a mayor frecuencia, mayor es el salto entre las 2 notas. ```C# // Dibujando solo la nota A4 para demostrar el código float a4 = 440.0f // frecuencia de la nota A4 float x_position = (a4 - minFreq) / freqRange;

loc_x_position indica la posición de la nota en el eje X, entre 0 y 1.

Ver imagen de salida

Pregunta:

Me gustaría que el salto entre 2 notas sea el mismo (lineal en lugar de exponencial, si entiendes a lo que me refiero). Encontré la ecuación en Wikipedia Frecuencias de teclas de piano, pero es para las teclas. Quiero que sea para cada frecuencia y no logro entender cómo implementarla en los dos ejemplos de código que publiqué.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para hacer que el salto sea lineal en lugar de exponencial, puedes usar la ecuación de la página de Wikipedia que encontraste y adaptarla a tus necesidades. La ecuación es:

    f_n = f_0 * (a)^n

    Donde f_n es la frecuencia de la n-ésima nota, f_0 es la frecuencia de la primera nota (en tu caso, la nota C4), a es la raíz 12-ésima de 2 (aproximadamente 1.059463) y n es el número de medio tonos entre la primera nota y la n-ésima nota.

    Para adaptar esta ecuación a tu caso de uso, primero puedes calcular el número de medio tonos entre la frecuencia mínima y la frecuencia que deseas reproducir:

    “`c#
    float medioTono = Mathf.Log(frecuencia / frecMin, 1.059463f); // utiliza Mathf.Log para calcular el logaritmo base a


    Luego, puedes convertir este número de medio tonos en una proporción entre 0 y 1 dividiéndolo por el número total de medio tonos entre la frecuencia mínima y máxima: ```c# float totalMediosTonos = Mathf.Log(frecMax / frecMin, 1.059463f); float proporcionMediosTonos = medioTono / totalMediosTonos;

    Finalmente, puedes usar esta proporción para calcular la posición de la nota en el eje X:

    c#
    float posicionXNota = proporcionMediosTonos * (posicionMax - posicionMin) + posicionMin; // asumiendo que has definido posicionMin y posicionMax como las posiciones mínima y máxima en el eje X donde se pueden colocar las notas

    Esto debería darte un espaciado lineal entre las notas en lugar de un espaciado exponencial.

Comments are closed.