2011-05-12 26 views
6

Şu ana kadar bir VST/ses birimi olan bir projenin bağımsız bir uygulama sürümünü oluşturdum. Ses desteği rtaudio aracılığıyla sağlıyorum.gerçek zamanlı midi giriş ve sesle senkronizasyon

rtmidi numaralı telefonu kullanarak MIDI desteği eklemek istiyorum ancak ses ve MIDI parçalarını nasıl eşitleyeceğimi açıklamıyorum.

VST/ses birimi ülkesinde, ses bloğunun başlangıcından itibaren örneklerde ofsetlerini belirten bir zaman damgası olan MIDI olayları için kullanılır.

rtmidi önceki etkinliğe beri saniyede bir delta süresi sağlar, ancak ben bu etkinlikleri kapmak nasıl ve ses dizisindeki güncel örneğe göre vakitlerini nasıl çalıştığını emin değilim.

Eklenti ana makineleri bunu nasıl yapıyor?

Olayların örnek üzerinde nasıl doğru örnek olabileceğini anlayabiliyorum, ancak gerçek zamanlı girişi kullanırken örneklerin nasıl doğru olabileceğini açık değil.

rtaudio bana bir geri arama işlevi verir. Düşük blok büyüklüğünde (32 örnek) çalışacağım. Sanırım bir rtmidi örneğine geriçağırımın userdata kısmı olarak bir işaretçi gönderirim ve midiin-> getMessage (& mesajı); Sesli geri arama içinde, ama bu iplik duyarlı olup olmadığından emin değilim. Eğer durumda bana

+0

MIDI asla örnek doğru olmayacak, ne de olması gerekecek. MIDI verileri nispeten yavaştır. – Brad

cevap

5

verebilir herhangi ipuçları için

çok teşekkürler, bu konuda endişelenmenize gerek yoktur. Programınız, MIDI olaylarını, geldikleri anda sıfırın bir zaman damgasıyla eklentiye göndermelidir. Sanırım "örnek doğru" olmanın ne anlama geldiğinin ardında yatan fikri yanlış anladınız.

@Brad, sorunuza yaptığı yorumda belirtildiği gibi, MIDI gerçekten çok yavaş. Ama bu sorunun sadece bir kısmı ... blok tabanlı bir ortamda çalışırken, gelen MIDI olayları bir blok başlangıcı olana kadar eklenti tarafından işlenemez. Bilgisayarlar daha yavaş ve 512 (ya da Tanrı korusun,> 1024) blok boyutları yaygın olduğunda, bu, önemsiz miktarda bir gecikmeyi ortaya çıkardı; Bu nedenle sıralayıcılar bu problemi aşmanın akıllıca bir yolunu buldular. MIDI olayları zaten önceden bilindiğinden, bu olaylar, örnek çerçevelerinde bir ofset ile enstrümana erken bir blok halinde gönderilebilir. Eklenti daha sonra bu olayları bloğun başlangıcında alır ve N örnekleri geçene kadar gerçekten işlemeye başlamamayı bilir. Bu "örnek doğru" ifadesi, sıralayıcılarda anlamına gelir. Ancak, bir klavye veya başka bir MIDI aygıtından gelen canlı girişle uğraşıyorsanız, bu olayları "zamanlamak" için bir yol yoktur. Üste | Aslında, onları aldığınız an, saat zaten geçiyor! Bu nedenle, bu olayların sadece bir sonraki satırın başlangıcında eklentiye gönderilmesi gerekmektedir. Ableton Live gibi, bir eklentinin aynı anda hem önceden hem de canlı olarak alınmasını sağlayan sıralamalar, herhangi bir canlı olayı gönderir. 0 kareli bir ofset.

Çok küçük bir blok boyutu kullandığınızdan, en kötü durum senaryosu .7ms gecikme süresidir, bu da hiç de kötü değildir. Rtmidi durumunda, zaman damgası, zamanlamak için gereken bir sapma değil, olayın yakalandığı süreyi temsil eder. Ancak sadece canlı etkinlikler almayı planladığınızdan (, bir sıralayıcı yazıyorsanız, değil misiniz?), Gelen MIDI'ları hemen eklentiye aktarabilirsiniz.

+0

Teşekkürler nik, bu daha net hale getirir. çalıştım – olilarkin

İlgili konular