سؤال

أنا أتطلع إلى صنع بعض البرامج التي تجعل وظيفة لوحة المفاتيح مثل البيانو (على سبيل المثال ، يضغط المستخدم على مفتاح "W" ويلعب مكبرات الصوت ملاحظة D). ربما سأستخدم Openal. أنا أفهم أساسيات الصوت الرقمي ، لكن تشغيل الصوت في الوقت الفعلي استجابةً للضغط الرئيسي يشكل بعض المشكلات التي أواجه مشكلة في حلها.

هذه هي المشكلة: دعنا نقول أن لدي 10 مخازن مؤقتة للصوت ، وكل مخزن مؤقت يحمل ثانية واحدة من بيانات الصوت. إذا اضطررت إلى ملء المخازن المؤقتة قبل أن يتم لعبها من خلال مكبرات الصوت ، فسوف أقوم بملء المخازن المؤقتة واحدة أو ثانيتين قبل لعبها. هذا يعني أنه عندما يحاول المستخدم تشغيل ملاحظة ، سيكون هناك تأخير أو ثانيتين بين الضغط على المفتاح والملاحظة التي يتم تشغيلها.

كيف تتجول في هذه المشكلة؟ هل تجعل المخازن المؤقتة صغيرة قدر الإمكان ، وملءها في وقت متأخر قدر الإمكان؟ هل هناك بعض الخدعة التي أفتقدها؟

هل كانت مفيدة؟

المحلول

لا تستخدم معظم توليفات البرامج المخازن المؤقتة على الإطلاق.

إنهم يستخدمون فقط رينغوفر واحد صغير يتم لعبه باستمرار.

سوف يقوم مؤشر ترابط ذي أولوية عالية بقدر ما يمكن التحقق من موقع التشغيل الحالي وملء الجزء المجاني (على سبيل المثال الجزء الذي تم تشغيله منذ آخر مرة كان فيها مؤشر ترابطك) من Ringbuffer مع بيانات الصوت.

سيعطيك هذا زمنًا ثابتًا مرتبطًا فقط بحجم عصر الحلقة الخاص بك ومزمن الناتج الخاص بعسم الصوت الخاص بك (عادة ليس كثيرًا).

يمكنك خفض الكمون الخاص بك أكثر:

في حالة وجود ملاحظة جديدة يجب تشغيلها (على سبيل المثال ، قام المستخدم بالضغط للتو على مفتاح) ، يمكنك التحقق من موضع التشغيل الحالي داخل مختلقي الحلقة ، وأضف بعض العينات للسلامة ، ثم إعادة تقديم بيانات الصوت باستخدام الصوت الجديد- الإعدادات المطبقة.

يصبح هذا أمرًا صعبًا إذا كان لديك تأثيرات قائمة على الوقت (خطوط التأخير ، تردد وما إلى ذلك) ، لكنه قابل للتنفيذ. ما عليك سوى تتبع آخر 10 حالات من التأثيرات القائمة على وقتك في كل ميلي ثانية أو نحو ذلك. هذا سيجعل من الممكن استعادة 10 مللي ثانية في الوقت المناسب.

نصائح أخرى

مع Winapi ، يمكنك فقط الحصول على هذا الوقت من حيث الكمون. عادة لا يمكنك الحصول على أقل من 40-50 مللي ثانية وهو أمر سيء للغاية. يتمثل الحل في تنفيذ دعم ASIO في تطبيقك ، وجعل المستخدم يقوم بتشغيل شيء مثل ASIO4ALL في الخلفية. هذا يؤدي إلى انخفاض الكمون إلى 5 مللي ثانية ولكن بتكلفة: لا يمكن للتطبيقات الأخرى تشغيل الصوت في نفس الوقت.

أنا أعرف هذا لأنني مستخدم FL Studio.

الحل هو المخازن المؤقتة الصغيرة ، مملوءة بشكل متكرر بخيط في الوقت الحقيقي. مدى صغر حجم المخازن المؤقتة (أو مدى امتلاءك للمخزن المؤقت مع مختصر الحلقة) مقيد بجدولة الكمون لنظام التشغيل الخاص بك. من المحتمل أن تجد 10 مللي ثانية مقبولة.

هناك بعض مسلسلات سيئة هنا للمبتدئين - خاصة فيما يتعلق ببنية البرمجيات وسلامة مؤشرات الترابط.

يمكنك محاولة إلقاء نظرة على يوس - وهو إطار عمل عبر المنصات لكتابة برامج الصوت ، وعلى وجه الخصوص - الإضافات الصوتية مثل Softsynths والتأثيرات. ويشمل برنامج لكل من العينة المكونات والمضيفين. في المضيف يتم التعامل مع المشكلات المتعلقة بالخيوط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top