Inflexión de tono MIDI frente a estándar de afinación MIDI: microtonos

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.

  1. 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.

  2. 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?

fluidsynth sí afina notas. Puede que no siga MTS exactamente, pero recuerdo haber visto un código que ajusta.
Sí, lo hubiera pensado así. Le he preguntado a la lista de correo dos veces sin resultados.
Suena como si quisieras escribir tu propio sintetizador de todos modos. descarga la fuente y descúbrelo. ¿Quizás convertirlo en bfootdavSynth?
¡Dios no! Soy un programador pésimo, pero me imagino que cualquier idea que tenga sobre software de música al menos 1000 buenos programadores ya la han tenido y la han resuelto. Solo es cuestión de encontrar el software y descubrir cómo usarlo.
bueno está bien. fluidsynth tiene parámetros de línea de comando kajillion. Mi apuesta es que una de ellas es un archivo de configuración de texto con las afinaciones. pero no hay garantías de que FluidSynth los use correctamente. Esa lista de correo electrónico es lo único que tienes. Los molestaría de nuevo. Creo que un tipo llamado Dave es el mejor. Podría enviarle un correo electrónico directamente si puede encontrar su correo electrónico allí. Buena suerte.

Respuestas (1)

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 .

Gracias alephzero, ahora solo necesito averiguar cómo enviar correctamente esos comandos a mi archivo MIDI. Y dado que FS le permite usar hasta 256 canales, eso prácticamente soluciona la limitación de 16 canales. Y aunque haré que los archivos MIDI estén disponibles, la mayoría de los usuarios solo usarán los archivos de audio generados por FS, por lo que si es preciso, también lo serán los archivos de audio. Estuve investigando Csound hoy y, aunque es intimidante, podría ser una buena solución. Sin embargo, necesitaría construir una colección de instrumentos sintetizados para reemplazar General MIDI.
Envía datos RPN (Número de parámetro registrado) enviando CC 101 y CC 100 para los bits alto y bajo del número de parámetro, luego CC6 para el valor de datos. Pitch bend es RPN #0, por lo que acaba de enviar CC 101,0, CC 100,0, CC6, rango en semitonos . Para "desactivar" la escucha de la entrada RPN en caso de que envíe accidentalmente otro CC6, envíe CC101, 127, CC 100, 127. Parece que FluidSynth usa múltiples puertos MIDI (hasta 16) si desea más de 16 canales . Es posible que necesite algún software de cable MIDI virtual (por ejemplo , tobias-erichsen.de/software/loopmidi.html ) para conectarse a varios puertos MIDI.
He estado jugando con los códigos de control y aparentemente el valor que envías a CC6 va tanto por encima como por debajo de la nota. Entonces, un semitono de 1 te da 8192 tonos entre cada semitono (16384 dividido por dos direcciones). Lo que es interesante es que al usar el estándar de afinación MIDI con Timidity obtendrás todos los valores de 16384 en una dirección, lo que significa 16384 entre cada semitono. No tengo que tener ese nivel de resolución, pero ahora tengo curiosidad por saber cómo conseguirlo.