Estoy trabajando en un proyecto que genera música. Permite al usuario seleccionar una amplia variedad de afinaciones (n-EDO hasta 49000, etc).
Tengo dos métodos implementados hasta ahora y ambos se basan en MIDI.
Usando el estándar de afinación MIDI, envío un sysreq con cada nota correspondiente a la frecuencia de audio requerida para la afinación. El problema, y esto podría ser solo un problema con Timidity, es que solo puedo tener una nota sonando a la vez, punto. En todos los canales. Solo una nota.
Usar la inflexión de tono MIDI que, debido a que la inflexión de tono se aplica a todas las notas en un canal determinado, significa que solo puede tocar 16 notas a la vez (dado que desea que cada nota tenga su propia inflexión de tono).
Ok, aquí es donde se pone extraño. Usando el enfoque MTS obtengo 16,384 tonos entre la nota base y el siguiente semitono. Por ejemplo, entre C y C# hay 16.384 notas.
Con pitch bend obtengo 16.384 estirados entre dos tonos completos (cuatro semitonos). Comenzando con la nota base, obtiene +8192 tonos hasta el siguiente tono completo o -8192 tonos hasta el siguiente tono completo inferior.
Por lo tanto, ambos enfoques usan 16 384 valores, pero la inflexión de tono se extiende a lo largo de dos tonos completos, mientras que el método MTS se comprime a solo un semitono.
Como evidencia, aquí hay una salida de mi programa que muestra los valores de pitch bend y sysreq calculados y que producen exactamente el mismo resultado:
note: 1 pitch = 60 bend = 0.0 sysreq_value = 0.0
note: 2 pitch = 60 bend = 2048.0 sysreq_value = 8192.0
note: 3 pitch = 60 bend = 4096.0 sysreq_value = 16384.0
La nota 3 es equivalente al tono 61 en ambos enfoques, siendo la nota 2 un cuarto de tono.
Mis preguntas, ¿tiene sentido mi análisis? ¿Y es posible decirle a Timidity (o a cualquier reproductor MIDI) que use los 16.384 valores de pitch bend solo para un semitono, como una especie de comando sysreq al comienzo del archivo? Claramente, Timidity tiene la capacidad de usar 16,384 entre cada semitono, solo es cuestión de convencerlo.
Actualización: ahora parece que Fluidsynth puede usar hasta 256 canales, por lo que resuelve uno de mis problemas. Aparentemente, no es compatible con MTS, por lo que tendría que usar pitch bend con él, pero ahora la pregunta se aplica a Fluidsynth: ¿hay alguna manera de decirle que use 16,384 valores para las notas entre semitonos?
Puede cambiar el rango de la inflexión de tono usando mensajes RPN. Consulte http://www.midikits.net/midi_analyser/pitch_bend.htm , o busque en Google "establecer rango de inflexión de tono MIDI" si ese enlace desaparece por algún motivo.
La inflexión de tono afecta a todas las notas de un canal MIDI. Si desea tener más polifonía que 16 (una nota por canal) mientras usa la inflexión de tono de una manera para la que no fue diseñada, la solución más fácil probablemente sea usar varios reproductores MIDI en paralelo y combinar la salida de audio.
Es posible que desee considerar configurar toda la configuración de reproducción dentro de un host VST.
Tenga en cuenta que, aunque en teoría puede especificar cambios de tono y comandos de afinación con gran precisión, no hay garantía de que el jugador interprete los comandos con la misma precisión. Algunos músicos redondearán el tono a la centésima más cercana, es decir, 100 pasos por semitono o 1200 pasos por octava.
Alternativamente, genere los sonidos usted mismo con algo como https://en.wikipedia.org/wiki/Csound .
Esteban Hazel
bfootdav
Esteban Hazel
bfootdav
Esteban Hazel