Pergunta

((Resposta selecionado -. Consulte Editar 5 abaixo))

Eu preciso escrever um gerador de rosa ruído simples em C #. O problema é que eu nunca tinha feito qualquer trabalho áudio antes, então eu não sei como interagir com a placa de som, etc. eu sei que eu quero ficar longe de usar DirectX, principalmente porque eu não quero baixar um SDK massiva apenas para este pequeno projeto.

Então, eu tenho dois problemas:

  1. Como faço para gerar ruído rosa?
  2. Como posso transmiti-lo à placa de som?

Editar : I realmente quer fazer um gerador de ruído rosa ... Eu estou ciente que há outras maneiras de resolver o problema de raiz. =)

Editar 2 : Nossos blocos de firewall streaming de áudio e vídeo - caso contrário, eu tinha acabado de ir para a www .simplynoise.com como sugerido nos comentários. : (

Editar 3 : Eu tenho a geração de ruído branco para baixo, assim como o envio de saída para a placa de som - agora tudo que eu preciso saber é como transformar o ruído branco em ruído rosa. Oh - e eu não quero fazer um loop um arquivo wav porque cada aplicativo que eu tentei usar para looping termina com um pequeno intervalo entre loops, que é chocante o suficiente para ter me levou nessa direção, em primeiro lugar ...

Editar 4 : ... Eu estou surpreso que tantas pessoas tenham saltou para muito explicitamente não responder a uma pergunta. Eu provavelmente teria obtido uma resposta melhor se eu menti sobre por que eu preciso de ruído rosa ... Esta questão é mais sobre como gerar e transmitir dados à placa de som do que é sobre que tipo de fones de ouvido que eu deveria estar usando. Para o efeito Eu editei os detalhes do fundo - você pode ler sobre isso no edições ...

Editar 5 : Eu selecionei a resposta de Paulo abaixo porque a ligação que ele forneceu me deu a fórmula para converter o ruído branco (que é facilmente gerado por um gerador de números aleatórios) em ruído rosa. Além disso, eu usei entrada CodeProject de Ianier Munoz "Programação de efeitos de áudio em C #" para aprender como gerar, modificar e dados de saída de som para a placa de som. Obrigado rapazes por sua ajuda. =)

Foi útil?

Solução

Talvez você pode converter o código C / C ++ aqui para C #:

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

A maneira mais fácil de obter o som para a placa de som é gerar um wav (cuspir alguns cabeçalhos hardcoded e dados, então amostra). Então você pode jogar o arquivo .wav.

Outras dicas

Pink ruído é apenas ruído branco colocado através de um -3dB / oitava LPF. Você pode gerar ruído branco usando rand () (ou qualquer função que gera números aleatórios uniformemente).

Streaming de material para a placa de som é razoavelmente trivial, enquanto você tem o Google acessível. Se você optar por evitar DirectX, considere o uso PortAudio ou ASIO para interface com a placa de som ... embora eu acho que você vai ter que usar C ++ ou C.

Além disso, por tempo de CPU resíduos gerá-la? Loop de um arquivo WAV maldito!

pouco tarde para isso perceber que eu, mas quem vem através dele para respostas devem saber que o ruído rosa é o ruído branco com -3dB / oitava, não -6 como dito acima, que na verdade é o ruído marrom.

Não é realmente uma resposta à sua pergunta, mas você não pode simplesmente ouvir música, de preferência com algum ruído cancelando auscultadores?

Aqui está um exemplo do que os olhares de rosca reprodução like. Estou usando DirectSound para criar uma SecondaryBuffer onde as amostras são escritos. Como você pode ver que é bastante simples:

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

Se você precisar de mais detalhes sobre como ele funciona eu vou ser feliz para ajudar.

Como uma maneira rápida e suja de fazê-lo, como sobre apenas looping um wav ruído rosa em seu leitor de áudio? (Sim, eu sei que parte da diversão é fazer isso sozinho ....)

E sobre uma amostra .mp3 do Pink Noise em repetir?

Você pode usar Audacity para gerar o máximo de ruído rosa como você quer, e depois repeti-la.

Ou você poderia cavar o código-fonte e ver como o Audacity faz a geração de ruído rosa.

Aqui está uma maneira muito simples para criar ruído rosa, que apenas resume muitas ondas espaçadas logaritmicamente à parte, juntos! Pode ser muito lento para os seus propósitos, se você deseja que o som criado em tempo real, mas ainda a otimização é certamente possível (por exemplo: uma função mais rápido cosseno).

As funções gera uma matriz de dupla com valores de -1 a 1. Isto representa os mais baixos e mais altos pontos em forma de onda, respectivamente.

O parâmetro quality representa o número de ondas produzidas para fazer o som. Acho 5000 ondas (cerca de 40 intervalos por semitom) é apenas sobre o limite onde não é possível detectar qualquer melhoria visível com valores mais elevados, mas para estar no lado seguro, você pode (opcionalmente) aumentar para cerca de 10.000 ondas ou superior . Além disso, de acordo com a Wikipedia, 20 hertz é em torno do limite inferior da percepção humana em termos do que podemos ouvir, mas você pode mudar isso também, se quiser.

Observe o som fica mais silencioso, com um valor quality maior devido a razões técnicas, de modo que você pode (opcionalmente) quer ajustar o volume através do parâmetro 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;
}

Eu não posso falar sobre C #, mas você pode ser melhor fora com um bom auscultadores de cancelamento de ruído e do seu mp3 favorito.

Se você estiver no Linux, você pode usar SOX (você pode tê-lo já, tente o comando play).

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top