Existe uma biblioteca de sons para o C gerar amostras de som a partir do código? [fechadas]


10

Estou trabalhando em um mecanismo para um jogo de estilo retro em C. Estou procurando uma biblioteca de sons que produza sons de chip a partir do código ... Quero criar meu próprio rastreador de chiptune para o mecanismo criar música. Será que tal coisa existe?

Eu também estaria interessado em uma biblioteca para usar arquivos .nsf no meu projeto.

Estou usando o Linux para desenvolvimento.


Penso que esta questão se enquadra na categoria "Que tecnologia usar". Embora, normalmente, essas solicitações de nicho não gerem uma grande lista de respostas, acho que não é construtivo.
MichaelHouse

Bem, o problema é que não consigo encontrar nada. Nem sei por onde começar ... Todas as bibliotecas que encontrei se concentram no carregamento de arquivos como .wav. Posso usar a libmikmod se quiser apenas carregar um módulo .mod ou .xm, mas não é isso que quero fazer.
Rjrscm

Eu não acho que isso realmente se enquadra no desenvolvimento de jogos. É uma mídia mais geral do que jogos.
precisa saber é o seguinte

Tente pesquisar por "mod tracker" ou talvez "demoscene tracker" para obter um plano de fundo e recursos mais gerais.
Patrick Hughes

1
Pessoalmente, acho essa pergunta uma boa pergunta. Como gosto de programar jogos em estilo retrô, é difícil encontrar recursos para coisas como essa sem fazer parte de uma comunidade obscura.
Zack The Human

Respostas:


3

Provavelmente não é uma resposta correta, mas aqui está uma biblioteca de vários mecanismos de áudio

(Role para baixo até o segundo segmento para bibliotecas de áudio)

Pelo menos 9 dos 12 mecanismos acompanham o C. A maioria deles também suporta arquivos rastreadores. O que não é tão diferente dos arquivos nsf (presumo que sejam arquivos de música NES).


16

Claro que você pode, não é trivial fazê-lo parecer "legal".

Não sei como fazê-lo no Linux, mas se você pode reproduzir um buffer PCM, basta preenchê-lo com o que quiser.

Portanto, supondo que seu buffer esteja configurado para reprodução em amostras mono e assinadas de 16 bits, a 44100 amostras por segundo, criar um som A4 puro (sinusoidal) A4 (440 Hz) é tão simples quanto

int16_t buffer[44100];
float frequency = 440.0f;
float sampling_ratio = 44100.0f;
float amplitude = 0.5f;
float t;
for (int i = 0; i < 44100; i++)
{
    float theta = ((float)i / sampling_ratio) * PI;
    buffer[i] = (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
}

No entanto, esse som provavelmente é muito chato para seus interesses, então você precisa fazer algumas coisas mais complicadas. Em geral, existem dois tipos de síntese sonora: Aditivo e Subtrativo . Existem muitos outros, mas esses dois são provavelmente os mais simples. Hoje vou falar sobre síntese aditiva.

Para síntese aditiva, você faz o mesmo que eu fiz lá em cima, mas em vez de usar apenas uma frequência em uma amplitude, você adiciona várias ondas. É como pressionar várias teclas em um piano ao mesmo tempo. Então você modifica seu código para algo parecido com isto:

void add_sine_wave(int16_t* buffer, int buffer_length, float frequency, float sampling_ratio, float amplitude)
{
    for (int i = 0; i < buffer_length; i++)
    {
        float theta = ((float)i / sampling_ratio) * M_PI;
        // make sure to correct for overflows and underflows
        buffer[i] += (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
    }
}

e use-o assim:

int16_t buffer[44100];
memset(buffer, 0, sizeof(buffer));
// Create an A Major chord
add_sine_wave(buffer, 44100, 440.0f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 554.37f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 659.26f, 44100.0f, 0.5f);

By the way, eu estou começando minhas frequências a partir daqui (estou usando o temperamento igual , mas há muitos de outras afinações disponíveis).

Observe que até agora eu só uso ondas senoidais, mas os sintetizadores antigos também suportam ondas quadradas , triangulares e de serra , cada um com suas próprias propriedades sonoras interessantes. Implementá-las é bem simples.

Outras coisas que você pode fazer para aumentar a variedade de sons que você pode criar são:

  1. Modulação de amplitude : Alterando a amplitude da onda em todo o buffer
  2. Modulação de frequência : Alterando a frequência da onda em todo o buffer
  3. Reverb : Repetir uma amostra alterando sua forma e posição no buffer. É um tópico muito complexo.
  4. Envelope : Alterando a amplitude de uma amostra para dar mais vida

O ponto aqui é que as técnicas em si não são muito difíceis, então você realmente não precisa de uma biblioteca para abstraí-las para você. É usá-los para criar sons interessantes, o que é difícil.

Uma nota final. Ao experimentar um som como esse, pode ser realmente útil salvar seus dados em arquivos WAV e visualizá-los em alguns softwares como o Audacity. Dessa forma, você pode ver o que está fazendo com mais clareza.


+1 por rodar o seu próprio. Não estou vendo muitas bibliotecas Linux compatíveis com NSF. Mas, aqui está a especificação: webcache.googleusercontent.com/...
michael.bartnett

Obrigado pela informação. Eu posso continuar criando arquivos .nsf para o meu projeto agora que percebo o quanto eu precisaria colocar para que os sons soassem corretamente.
Rjrscm

+1 Presumi que qualquer resposta a essa pergunta seria tediosa. Eu não sei muito sobre AM / FM, mas geralmente as ondas são roteadas para um filtro primeiro, como na síntese subtrativa. Além disso, seu exemplo de várias notas de piano está correto, um exemplo melhor seria apenas uma nota! Uma única nota de piano cria vários harmônicos, o que lhe dá timbre. Um piano criará> 5 ondas adicionadas, enquanto na maioria dos sintetizadores 2 ou 3 será bom.
Tony

qual é a maneira correta de verificar estouros na função "add_sine_wave"?
Eadmaster 30/10

@ master: eu quis dizer recorte. Verifique se o valor se encaixa em a shortantes de convertê-lo em a short.
Panda Pyjama

4

Para efeitos sonoros de chiptune, há uma resposta definitiva: sfxr .

É um aplicativo independente que você pode usar para gerar amostras, mas o código-fonte também está disponível, caso você queira integrá-lo ao seu código.


3

Eu pessoalmente posso recomendar as bibliotecas de áudio de Blargg . Algo que pode ser de particular interesse para você é o Blip_Buffer dele .

O site de Blargg possui vários sintetizadores de áudio "retrô", e eu estou usando ativamente seu Game_Music_Emu para reproduzir arquivos NSF em um clone de Mega Man que estou escrevendo.

Muitas das bibliotecas são escritas em C ++, mas algumas também fornecem uma interface C.


Definitivamente vou tentar algumas delas ... Elas podem ser exatamente o que estou procurando, pois estou trabalhando em um mecanismo de jogo que visa imitar a aparência de um jogo NES.
Rjrscm
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.