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.
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é.
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 lan
-é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) yn
es el número de medio tonos entre la primera nota y lan
-é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
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.