سؤال

((الجواب المختار - راجع تحرير 5 أدناه.))

أحتاج إلى كتابة بسيطة الوردي-مولد الضوضاء في C#.المشكلة أنني لم أفعل أي صوت العمل من قبل ، لذلك أنا لا أعرف كيفية التفاعل مع بطاقة الصوت ، الخ.أنا أعرف أن أريد البقاء بعيدا عن استخدام DirectX, لأن معظمهم لا تريد تحميل ضخمة SDK فقط لهذا المشروع الصغير.

لذلك لدي مشكلتين:

  1. كيف يمكنني إنشاء الوردي الضوضاء ؟
  2. كيف يمكنني تيار إلى بطاقة الصوت?

تحرير:أنا حقا تريد أن تجعل من الضوضاء الوردي مولد...أنا مدرك أن هناك طرق أخرى لحل جذور المشكلة.=)

تحرير 2:جدار الحماية لدينا كتل تدفق الصوت والفيديو - وإلا كنت مجرد الذهاب إلى www.simplynoise.com كما اقترح في التعليقات.:(

تحرير 3:لقد حصلت على توليد الضوضاء البيضاء إلى أسفل ، وكذلك إرسال الإخراج إلى بطاقة الصوت - الآن كل ما تحتاج إلى معرفته هو كيفية تحويل الضوضاء البيضاء إلى الضوضاء الوردي.يا - لا أريد أن حلقة ملف wav لأن كل تطبيق حاولت استخدام حلقات ينتهي صغيرة في الحلقات ، وهو التنافر يكفي أن يكون دفعني في هذا الاتجاه في المقام الأول...

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

تحرير 5:لقد اخترت إجابة بولس أدناه لأن الرابط قدم أعطاني صيغة لتحويل الضوضاء البيضاء (الذي هو بسهولة عن طريق مولد رقم عشوائي) إلى الضوضاء الوردي.بالإضافة إلى هذا Ianier مونوز CodeProject دخول "البرمجة التأثيرات الصوتية في C#" لمعرفة كيفية إنشاء وتعديل إخراج الصوت البيانات إلى بطاقة الصوت.شكرا لكم على مساعدتكم.=)

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

المحلول

ربما يمكنك تحويل C/C++ code here to C#:

http://www.firstpr.com.au/dsp/pink-noise/

أسهل طريقة للحصول على الصوت بطاقة الصوت هو توليد wav (بصق بعض ضمنية الرؤوس ثم بيانات العينة).ثم يمكنك أن تلعب .ملف wav.

نصائح أخرى

الضوضاء الوردي هو مجرد الضوضاء البيضاء من خلال وضع -3dB/أوكتاف دبا.يمكنك توليد الضوضاء البيضاء باستخدام راند() (أو أي وظيفة أن يولد موحد أرقام عشوائية).

وتدفق الأشياء إلى كرت الصوت معقول تافهة ، طالما لديك جوجل مفيد.إذا اخترت لتجنب دايركت, النظر في استخدام PortAudio أو اسيو من أجل التواصل مع كرت الصوت...على الرغم من أنني أعتقد أنك سوف تضطر إلى استخدام C++ أو C.

بخلاف ذلك, لماذا إضاعة الوقت وحدة المعالجة المركزية توليد ذلك ؟ حلقة اي ملف WAV!

قليلا في وقت متأخر إلى هذا وأنا أدرك ، ولكن أي شخص يأتي عبر ذلك عن إجابات ينبغي أن نعلم أن الضوضاء الوردي هو الضوضاء البيضاء مع -3dB/اوكتاف, لا -6 كما ذكر أعلاه, الذي هو في الواقع البني الضوضاء.

ليست إجابة على سؤالك, ولكن لا يمكنك فقط الاستماع إلى بعض الموسيقى ، من الناحية المثالية مع بعض الضوضاء إلغاء سماعات الرأس ؟

هنا هو مثال على ما تشغيل مؤشر ترابط يبدو.أنا باستخدام دايركت لإنشاء SecondaryBuffer حيث العينات مكتوبة.كما يمكنك أن ترى أنها واضحة جدا:

    /// <summary>
    /// Thread in charge of feeding the playback buffer.
    /// </summary>
    private void playbackThreadFn()
    {
        // Begin playing the sound buffer.
        m_playbackBuffer.Play( 0, BufferPlayFlags.Looping );

        // Change playing state.
        IsPlaying = true;

        // Playback loop.
        while( IsPlaying )
        {
            // Suspend thread until the playback cursor steps into a trap...
            m_trapEvent.WaitOne();

            // ...read audio from the input stream... (In this case from your pink noise buffer)
            Input.Collect( m_target, m_target.Length );

            // ...calculate the next writing position...
            var writePosition = m_traps[ ((1 & m_pullCounter++) != 0) ? 0 : 1 ].Offset;

            // ...and copy audio to the device buffer.
            m_playbackBuffer.Write( writePosition, m_deviceBuffer, LockFlag.None );
        }

        // Stop playback.
        m_playbackBuffer.Stop();
    }

إذا كنت بحاجة إلى المزيد من التفاصيل حول كيف يعمل سأكون سعيدا للمساعدة.

باعتبارها وسيلة سريعة وقذرة أن تفعل ذلك, ماذا عن حلقات الضوضاء الوردي wav في الصوت لاعب ؟ (نعم, أنا أعرف جزء من متعة هو أن تجعل من نفسك....)

ماذا عن .mp3 عينة من الضوضاء الوردي على التكرار ؟

هل يمكن استخدام الجرأة لتوليد أكبر قدر من الضوضاء الوردي كما تريد ، ثم كرر ذلك.

أو يمكن حفر في التعليمات البرمجية المصدر و انظر كيف الجرأة لا الضوضاء الوردي جيل.

هنا هو طريقة بسيطة جدا لخلق الضوضاء الوردي الذي يلخص الكثير من موجات متباعدة لها على حدة ، معا!قد تكون بطيئة جدا لأغراض الخاصة بك إذا كنت تريد الصوت التي تم إنشاؤها في الوقت الحقيقي ، ولكن مزيد من التحسين هو بالتأكيد ممكن (هـ.g:أسرع الدالة جيب التمام).

وظائف المخرجات المزدوجة مجموعة مع القيم من -1 إلى 1.وهذا يمثل أدنى وأعلى نقطة في الموجي على التوالي.

على quality المعلمة يمثل عدد موجات تنتج لجعل الصوت.أجد 5000 موجات (حوالي 40 فترات لكل نعمة) هو مجرد عن عتبة حيث لا أستطيع الكشف عن أي تحسن ملحوظ مع أعلى القيم ، ولكن أن تكون على الجانب الآمن ، يمكن (اختياريا) زيادة هذه النسبة إلى حوالي 10 ، 000 موجات أو أعلى.أيضا, وفقا ويكيبيديا ، 20 هيرتز حول الحد الأدنى من الإدراك البشري من حيث ما يمكن أن يسمع ولكن يمكنك تغيير هذا أيضا إذا كنت تريد.

ملاحظة الصوت اكثر هدوءا مع ارتفاع quality قيمة لأسباب فنية ، لذلك قد (اختياريا) ترغب في ضبط مستوى الصوت عن طريق volumeAdjust معلمة.

public double[] createPinkNoise(double seconds, int quality=5000, double lowestFrequency=20, double highestFrequency = 44100, double volumeAdjust=1.0)
{
    long samples = (long)(44100 * seconds);
    double[] d = new double[samples];
    double[] offsets = new double[samples];
    double lowestWavelength = highestFrequency / lowestFrequency;
    Random r = new Random();
    for (int j = 0; j < quality; j++)
    {
        double wavelength = Math.Pow(lowestWavelength, (j * 1.0) / quality)  * 44100 / highestFrequency;
        double offset = r.NextDouble() * Math.PI*2;     // Important offset is needed, as otherwise all the waves will be almost in phase, and this will ruin the effect!
        for (int i = 0; i < samples; i++)
        {
            d[i] += Math.Cos(i * Math.PI * 2 / wavelength + offset) / quality * volumeAdjust;
        }
    }
    return d;
}

أنا لا أستطيع أن أتكلم عن C#, ولكن قد تكون أفضل حالا مع بعض الضوضاء الغاء سماعات الرأس المفضلة mp3.

إذا كنت على لينكس ، يمكنك استخدام الجوارب (قد يكون ذلك بالفعل ، في محاولة play الأوامر).

play -t sl - synth 3 pinknoise band -n 1200 200 tremolo .1 40 < /dev/zero

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