Dos notas midi consecutivas del mismo tono que se comportan mal

Actualmente estoy escribiendo un programa haskell que imita el juego de un guitarrista humano y escupe eventos Midi. Como guitarra, estoy usando una Telecaster muestreada en Fluidsynth/Qsynth.

Para imitar un deslizamiento hacia arriba, uso pitch-bend, pero también quería agregar un poco de "punteo" cuando el dedo se mueve por un traste. Para mi sorpresa, tuve que darme cuenta de que cuando toco dos notas consecutivas del mismo tono en el mismo canal, la segunda nota silencia a la primera.

¿Es este el comportamiento esperado? ¿Es esto lo que esperarías del estándar Midi? ¿O es que Fluidsynth se está portando mal?

Debería ser Fluidsynth, ¿alguien sabe qué podría hacer para convencerlo de que NOTE_ON significa NOTE_ON y no NOTE_OFF seguido de NOTE_ON?

Tu instrumento virtual podría estar intentando simular una guitarra real. Aunque este es principalmente el comportamiento del piano.

Respuestas (3)

Eso es bastante común. Mi sintetizador también hace eso.

Las notas superpuestas son un área gris en midi.

Pero la mayoría de los sintetizadores realizan un noteoff implícito cuando aparece un noteon en ese canal.

Si desea que permanezca encendido, póngalos en canales separados. Eso generalmente hará el truco.

Midi está diseñado principalmente para piano. Y encuentra mucha notación que muestra un acorde para todo el compás con notas de melodía superpuestas.

Entonces, tan pronto como toques una nota de la melodía en la misma nota que el acorde... Bueno, el piano tiene una tecla para tocar esa nota, por lo que debe amortiguarse antes de que puedas escuchar la superpuesta.

Por lo general, la forma en que se hace la guitarra sobre midi es que tiene un canal por cuerda de guitarra.

Sí, estoy usando un canal por cadena, pero eso no me salvó de este problema en particular. En caso de que tenga otras ideas (es decir, no midi) sobre cómo producir sonidos de guitarra, me encantaría escucharlas.
oh sí. mmm. Entonces, la situación es que tienes un acorde, digamos C, E, G tocando para un compás con un arpegio en, digamos, el segundo cuarto de nota en cada qnote para el mismo C, E, G, ¿verdad? Si piensa en cómo tocaría eso en vivo, las notas de arpegio necesitarían recoger la duración restante del acorde superpuesto. Así que supongo que si quieres notas superpuestas cortas, necesitarás 2 canales para cada cuerda de guitarra si no quieres preocuparte por cómo se tocará en vivo. Un canal para la cuerda y otro canal para superposiciones en la misma cuerda.
No creo que las notas superpuestas sean un área particularmente gris. La combinación (número de canal + número de nota) es el único medio de designar notas particulares para ser canceladas; por lo tanto, si es necesario cancelar una nota en un tono dado mientras se sostiene otra, las dos notas deben estar en canales separados.
@StephenHazel: el controlador de sostenido funciona en algunas situaciones.

No estoy completamente seguro de entender lo que está sucediendo, pero he experimentado cosas similares antes. Si está tratando de deslizarse hacia una nota, puede usar una nota adyacente doblada hacia ella. Por lo tanto, si se desliza hacia arriba hasta un G, en lugar de usar la inflexión de tono para que el G comience plano y se incline hacia arriba, puede usar un F # que comience sostenido e inclínelo hacia G, luego ataque el G.

La respuesta de Stephen es muy buena y brinda una resolución mucho más amplia al problema de la guitarra MIDI, pero puede requerir un poco de trabajo adicional y una comprensión más profunda. No estoy seguro de cómo se programaría esto y si sería capaz o no de capturar efectivamente el rendimiento con un controlador, es decir, puede haber mucha más programación.

¿Qué quieres decir con "arrancar"? ¿Por qué necesita activar la nota de nuevo?

Supongo que te refieres al cambio en el sonido que induce el deslizamiento a través de un traste. Estoy pensando en la dinámica de la diapositiva, y realmente no tiene mucho sentido simularla como una nueva nota. Creo que tiene más sentido pensar en ello como un cambio en el sonido actual y no como un sonido nuevo.

Lo que está haciendo el deslizamiento a través de un traste es un poco de excitación para la cuerda, pero se suma al estado actual de la envolvente del sonido. Por eso tiene sentido pensar en ello como un cambio de amplitud, rápido en su ascenso, más lento en su descenso.

Puede modular el sonido para que cambie cuando alcance el estado de "pluck". Tal vez lo que realmente desea es una amplitud más alta durante el estado de "arranque" y una amplitud más baja cuando el sonido pasa el estado de "arranque".

Durante el estado de la diapositiva, cada cambio de semitono (cada vez que la diapositiva pasa a través de un traste) debe desencadenar una modulación, tal vez una envolvente o tal vez un LFO de diente de sierra invertido de un solo ciclo, que da forma a la dinámica de amplitud (¿y quizás al timbre?) como un deslizarse a través de un traste sería.

Punto valido. ¿Sabes cómo podría lograr esto a través de midi? El volumen y el timbre se pueden hacer a través de controladores. Pero, ¿y el sobre? ¿Y si la cuerda no suena actualmente? Todavía escucharía el ruido del traste ("pluck").
@MartinDrautzburg La envolvente (u otra modulación de su elección) se puede aplicar mediante multiplicación. Si la cuerda no está sonando actualmente, la amplitud será 0, por lo tanto, cualquier modulación resultará en un cambio en la amplitud de 0. El ruido del traste no se escuchará si la cuerda no está sonando actualmente.
@MartinDrautzburg No conozco los detalles de las herramientas que está utilizando (el programa haskell o el sintetizador), por lo que no conozco la mecánica de comunicación que tiene disponible. Lo que necesita son mensajes MIDI que activen eventos en el sintetizador, que activen cambios en la amplitud y/o el timbre. Tal vez las herramientas que tiene no proporcionen estas opciones.
@MartinDrautzburg También podría ir con la creación de nuevos sonidos, pero el nuevo sobre es una fracción del sobre original durante el estado de diapositiva. De esa manera, cada cambio de semitono durante el estado de deslizamiento generaría un aumento repentino en la amplitud, pero un poco más bajo cada vez que se alcance un nuevo traste, simulando la energía perdida de la cuerda, diferente de cuando excitas la cuerda punteándola.
Esperaría que cualquier traducción razonable de guitarra a MIDI use un canal por cuerda. Si se hace eso, se pueden realizar martillazos, pull-offs, etc., ya sea con varias combinaciones de controles de portamento y pitch-bend, o designando ciertos valores de velocidad con significados "especiales" (de modo que, por ejemplo, una "nota sobre" velocidad de 2 representaría un dedo con trastes que no fue acompañado por un punteo).
@supercat Todas mis sugerencias se basan en esa suposición.