2011-05-12 5 views
6

J'ai construit une version d'application autonome d'un projet qui jusqu'à présent était juste un VST/audiounit. Je fournis un support audio via rtaudio.entrée midi en temps réel et synchronisation avec l'audio

Je voudrais ajouter le support MIDI en utilisant rtmidi mais je ne vois pas comment synchroniser les parties audio et MIDI. En mode VST/audiounit, je suis habitué aux événements MIDI qui ont un horodatage indiquant leur décalage dans les échantillons depuis le début du bloc audio. Rtmidi fournit un temps delta en secondes depuis l'événement précédent, mais je ne sais pas comment je devrais saisir ces événements et comment je peux calculer leur temps par rapport à l'échantillon actuel dans le fil audio.

Comment les hôtes du plugin font-ils cela?

Je peux comprendre comment les événements peuvent être précis lors de la lecture, mais on ne sait pas exactement comment ils peuvent être précis lors de l'utilisation d'une entrée en temps réel.

rtaudio me donne une fonction de rappel. Je vais courir à une taille de bloc faible (32 échantillons). Je suppose que je passerai un pointeur vers une instance rtmidi en tant que partie userdata du rappel, puis j'appellerai midiin-> getMessage (& message); à l'intérieur du rappel audio, mais je ne suis pas sûr si cela est sensible au fil.

Un grand merci pour tous les conseils que vous pouvez me donner

+0

Le MIDI ne sera jamais précis, ni nécessaire. Les données MIDI sont relativement lentes. – Brad

Répondre

5

Dans votre cas, vous n'avez pas besoin de vous en inquiéter. Votre programme devrait envoyer les événements MIDI au plugin avec un horodatage de zéro dès qu'ils arrivent. Je pense que vous avez peut-être mal compris l'idée qui sous-tend ce que signifie «échantillon exact». Comme @Brad noté dans son commentaire à votre question, MIDI est en effet très lent. Mais ce n'est qu'une partie du problème ... lorsque vous travaillez dans un environnement basé sur des blocs, les événements MIDI entrants ne peuvent pas être traités par le plugin avant le début d'un bloc. Lorsque les ordinateurs étaient plus lents et que les tailles de bloc de 512 (ou dieu forbid,> 1024) étaient courantes, cela introduisait une quantité de latence non triviale qui faisait que l'arrangement ne sonnait pas comme "serré". Les séquenceurs ont donc trouvé une façon intelligente de contourner ce problème. Étant donné que les événements MIDI sont déjà connus à l'avance, ces événements peuvent être envoyés à l'instrument un bloc plus tôt avec un décalage dans les exemples de trames. Le plugin reçoit alors ces événements au début du bloc, et ne sait pas commencer à les traiter réellement jusqu'à ce que des échantillons N soient passés. C'est ce que "sample exact" signifie dans les séquenceurs. Toutefois, s'il s'agit d'une entrée en direct d'un clavier ou d'un autre appareil MIDI, il est impossible de "planifier" ces événements. En fait, au moment où vous les recevez, l'horloge tourne déjà! Par conséquent, ces événements doivent être envoyés au plugin au début du bloc suivant avec un décalage de 0. Séquenceurs tels que Ableton Live, qui permettent à un plugin de recevoir simultanément des événements pré-séquencés et en direct, il suffit d'envoyer des événements en direct avec un décalage de 0 images.

Étant donné que vous utilisez une très petite taille de bloc, le pire scénario est une latence de 0,7 ms, ce qui n'est pas si mal du tout. Dans le cas de rtmidi, l'horodatage ne représente pas un décalage que vous devez planifier autour, mais plutôt l'heure à laquelle l'événement a été capturé. Mais puisque vous avez seulement l'intention de recevoir des événements en direct (vous ne sont pas écrivant un séquenceur, êtes-vous?), Vous pouvez simplement passer tout MIDI entrant au plugin tout de suite.

+0

merci nik, qui le rend plus clair. Je l'ai eu le travail – olilarkin