Question

((Réponse sélectionnée - voir Édition 5 ci-dessous.))

Je dois écrire un simple générateur de bruit rose en C #. Le problème, c'est que je n'avais encore jamais travaillé audio, alors je ne sais pas comment interagir avec la carte son, etc. Je sais que je ne veux pas utiliser DirectX, principalement parce que je ne veux pas pour télécharger un SDK massif juste pour ce petit projet.

J'ai donc deux problèmes:

  1. Comment générer du bruit rose?
  2. Comment puis-je le diffuser sur la carte son?

Modifier : je veux vraiment créer un générateur de bruit rose ... Je suis conscient qu'il existe d'autres moyens de résoudre le problème fondamental. =)

Modifier 2 : notre pare-feu bloque la diffusion audio et vidéo en continu. Sinon, je voudrais simplement aller à www. .simplynoise.com comme suggéré dans les commentaires. : (

Modifier 3 : la génération de bruit blanc est désactivée, ainsi que l'envoi de la sortie vers la carte son. Il ne me reste plus qu'à savoir comment transformer le bruit blanc en bruit rose. Oh, et je ne veux pas créer de boucle dans un fichier wav, car chaque application que j'ai essayé d'utiliser en boucle se termine par une toute petite rupture entre les boucles, ce qui est suffisamment choquant pour m'avoir incité à aller dans cette direction. ...

Modifiez 4 : ... je suis surpris que tant de gens se soient immiscés de manière très explicite pour ne pas répondre à une question. J'aurais probablement obtenu une meilleure réponse si j'avais menti sur la raison pour laquelle j'avais besoin de bruit rose ... Cette question porte davantage sur la façon de générer et de diffuser des données sur la carte son que sur le type de casque que je devrais utiliser. À cette fin, j'ai supprimé les détails de l'arrière-plan - vous pouvez en lire plus dans les modifications ...

Éditer 5 : j'ai sélectionné la réponse de Paul ci-dessous, car le lien qu'il a fourni m'a fourni la formule permettant de convertir le bruit blanc (qui est facilement généré via le générateur de nombres aléatoires) en bruit rose. De plus, j'ai utilisé l'entrée CodeProject de Ianier Munoz & Quot; Programmation des effets audio en C # " pour apprendre à générer, modifier et exporter des données audio sur la carte son. Merci les gars pour votre aide. =)

Était-ce utile?

La solution

Peut-être pouvez-vous convertir le code C / C ++ ici en C #:

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

Le moyen le plus simple d’alimenter le son sur la carte son est de générer un fichier wav (cracher des en-têtes codés en dur puis échantillonner des données). Ensuite, vous pouvez lire le fichier .wav.

Autres conseils

Le bruit rose n’est qu’un bruit blanc transmis par un filtre passe-bas de -3dB / octave. Vous pouvez générer du bruit blanc en utilisant rand () (ou toute fonction générant des nombres uniformément aléatoires).

La diffusion de données sur la carte son est relativement simple, à condition que Google soit pratique. Si vous choisissez d’éviter DirectX, envisagez d’utiliser PortAudio ou ASIO pour l’interface avec la carte son ... bien que je pense que vous allez devoir utiliser C ++ ou C.

En dehors de cela, pourquoi perdre du temps CPU à le générer? Bouclez un fichu fichier WAV!

Je me rends compte un peu tard, mais tous ceux qui y trouveront une réponse doivent savoir que le bruit rose est un bruit blanc avec -3 dB / octave, et non -6 comme indiqué ci-dessus, qui est en réalité un bruit brun.

Ce n'est pas vraiment une réponse à votre question, mais ne pouvez-vous pas simplement écouter de la musique, idéalement avec des écouteurs antibruit?

Voici un exemple du fil de lecture. J'utilise DirectSound pour créer un SecondaryBuffer où les échantillons sont écrits. Comme vous pouvez le constater, c'est assez simple:

    /// <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();
    }

Si vous souhaitez plus de détails sur son fonctionnement, je serai ravi de vous aider.

En guise de solution rapide et délicate, pourquoi ne pas mettre en boucle un bruit rose wav dans votre lecteur audio? (Oui, je sais qu'une partie de l'amusement est de le faire vous-même ....)

Qu'en est-il d'un échantillon .mp3 de Pink Noise en répétition?

Vous pouvez utiliser Audacity pour générer autant de bruit rose que vous le souhaitez, puis répétez-le.

Vous pouvez également explorer le code source et voir comment Audacity génère le bruit rose.

Voici un moyen très simple de créer un bruit rose, qui consiste simplement à résumer de nombreuses vagues espacées de manière logarithmique! Si vous souhaitez que le son soit créé en temps réel, cela risque d’être trop lent, mais une optimisation supplémentaire est certainement possible (par exemple: une fonction de cosinus plus rapide).

La fonction génère un tableau double avec des valeurs comprises entre -1 et 1. Cela représente respectivement les points les plus bas et les plus hauts de la forme d'onde.

Le paramètre quality représente le nombre d’ondes produites pour produire le son. Je trouve que 5000 vagues (environ 40 intervalles par demi-ton) est à peu près le seuil où je ne peux détecter aucune amélioration notable avec des valeurs plus élevées, mais pour être sûr, vous pouvez (éventuellement) l'augmenter à environ 10 000 vagues ou plus. . En outre, selon Wikipedia, 20 hertz correspond à la limite inférieure de la perception humaine en termes de ce que nous pouvons entendre, mais vous pouvez également changer cela si vous le souhaitez.

Notez que le son devient plus calme avec une volumeAdjust valeur supérieure pour des raisons techniques. Vous pouvez donc (éventuellement) régler le volume via le paramètre <=>.

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;
}

Je ne peux pas parler de C #, mais vous aurez peut-être intérêt à utiliser de bons écouteurs antibruit et vos fichiers MP3 préférés.

Si vous êtes sous Linux, vous pouvez utiliser SOX (vous l’avez peut-être déjà, essayez la commande play).

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top