سؤال

هذا الكود البسيط لا يصدر أي صوت على بعض الأجهزة التي استخدمتها لاختباره.أقوم بتشغيل الكود من داخل Eclipse، لكني حاولت أيضًا استخدام سطر الأوامر دون جدوى.

public static void main(String[] args)
{
    try {
        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();

        MidiChannel[] channels = synthesizer.getChannels();

        channels[0].noteOn(60, 60);
        Thread.sleep(200);
        channels[0].noteOff(60);

        synthesizer.close();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}

أنا قادر على الحصول على الصوت بنجاح عن طريق الحصول على مُسلسل، وإضافة أحداث MIDI إلى التسلسل، وتشغيل التسلسل، لكنني أحاول القيام ببعض تأثيرات الموسيقى في الوقت الفعلي، والتي لا يدعمها مُسلسِل.

أيه أفكار؟

تحرير مع الحل: لقد اتضح أن المشكلة تكمن في أن JRE، افتراضيًا، لا يأتي مزودًا ببنك صوت (من المثير للاهتمام إذن أن استخدام جهاز التسلسل نجح، ولكن استخدام المُركِّب لم ينجح).شكرًا، com.thejmc!

لحل المشكلة، أنا تم تنزيل soundbank من java.sun.com ووضعه في (على نظام التشغيل WinXP) C:\Program Files\jre1.6.0_07\lib\audio (كان عليه إنشاء مجلد الصوت).

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

المحلول

لا تشتمل بعض عمليات تثبيت JRE على JavaSound soundbank.gm (من أجل توفير المساحة) لذلك لن يكون للكود الخاص بك مصدر صوت لتشغيله على تلك الأجهزة.

التحقق من وجود بنك الصوت على الأجهزة التي لا تعمل.يمكنك أيضًا وضع بنك الصوت في نفس الدليل الذي يوجد به ملف .class الخاص بك وسيقوم بالعثور عليه.

من الممكن إضافة بنك الصوت أو ترقية تثبيت Java على هذا الجهاز - أعلم أن الألم الناتج عن عدم الاتساق :)

نصائح أخرى

هل حاولت استخدام قناة مختلفة؟ربما هذه المناقشة سيجعلك أقرب إلى الحل..

لقد اختبرت الكود الخاص بك على جهازي (Windows XP، JRE 1.6) وهو يقوم بتشغيل النوتات الموسيقية.ربما مجرد ملاحظة واحدة قليلة جدًا لسماعها.حاول إضافة المزيد من الملاحظات.حاول أيضًا ضبط مستوى الصوت على مستوى أعلى.

تحتاج فقط إلى إجراء نوم إضافي واحد قبل إغلاق آلة النطق:

public static void main(String[] args)
{
    try {
        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();

        MidiChannel[] channels = synthesizer.getChannels();

        channels[0].noteOn(60, 60);
        Thread.sleep(200);
        channels[0].noteOff(60);
        Thread.sleep(200);

        synthesizer.close();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top