2012-02-04 8 views
10

Estoy tratando de encontrar documentación, tutoriales, ejemplos sobre cómo generar sonidos. Quiero decir, sin usar una biblioteca que oculte todas las cosas interesantes.Generando sonidos sin una biblioteca?

Soy interesante en sonido y quiero empezar a hacer algo con él, pero no sé por dónde empezar.

Corrígeme si me equivoco pero el nivel más bajo para generar sonido es uno de estos (DirectSound , CoreAudio, ALSA, OSS) según el sistema operativo. Entonces, ¿tengo que elegir un sistema operativo y aprender el sistema de sonido apropiado?

¿Realmente vale la pena o debería simplemente aprender una biblioteca que englobe todo lo anterior y ofrezca compatibilidad multiplataforma?

Tal vez esta pregunta no es muy clara y lo siento, pero resultó que ni siquiera sé lo que quiero. Solo estoy tratando de encontrar algo interesante para mi tesis.

+1

Deberías probar con SDL. –

+0

Esto no responde directamente a su pregunta, excepto que es un factoid interesante sobre un músico que hizo sonido con una computadora que no fue creada para hacer sonido: http://en.wikipedia.org/wiki/Aphex_Twin#ZX81_competition –

+0

@AlexReynolds Eso es inspirador. – kechapito

Respuesta

7

Aquí hay un ejemplo para comenzar.

// filename "wf.cpp" (simple wave-form generator) 

    #include <iostream> 
    #include <cmath> 
    #include <stdint.h> 

int main() 
    { 

    const double R=8000; // sample rate (samples per second) 
    const double C=261.625565; // frequency of middle-C (hertz) 
    const double F=R/256; // bytebeat frequency of 1*t due to 8-bit truncation (hertz) 
    const double V=127; // a volume constant 

    for (int t=0; ; t++) 
     { 
     uint8_t temp = (sin(t*2*M_PI/R*C)+1)*V; // pure middle C sine wave 
    // uint8_t temp = t/F*C; // middle C saw wave (bytebeat style) 
    // uint8_t temp = (t*5&t>>7)|(t*3&t>>10); // viznut bytebeat composition 
     std::cout<<temp; 
     } 

    } 

compilar y ejecutar en Linux a través de ALSA interfaz:

make wf && ./wf |aplay 

compilar y ejecutar en Linux a través de GStreamer interfaz:

make wf && ./wf |gst-launch-0.10 -v filesrc location=/dev/stdin ! 'audio/x-raw-int,rate=8000,channels=1,depth=8' ! autoaudiosink 

GStreamer reivindicaciones a ser multiplataforma . Su principal característica de interés es que puede crear (o usar los existentes) complementos para construir una línea de filtros de audio.

+0

Mi ejemplo utiliza 8 bits mono, pero puede modificarse fácilmente para usar otros formatos (por ejemplo, estéreo de 16 bits). – nobar

+0

Eso era lo que necesitaba. Gracias. – kechapito

+0

Reproduzca un CD: 'find/run/user/$ {USER}/gvfs/cdd * -iname" * .wav "-print0 | xargs -0 aplay' – nobar

5

En algunos sistemas Unix (ish), puede just write audio data to /dev/audio (or /dev/dsp) y se reproducirá. En los sistemas Linux modernos que usan ALSA, es posible que deba canalizarlo a aplay. En cualquier caso, sin embargo, no necesita usar ninguna biblioteca de sonido específica —, solo abra una secuencia de salida y escriba en ella. Así es como todos esos bytebeat one-liners lo hacen.

+0

+1. Visión general excelente de los bytebeaters aquí: http://www.metafilter.com/tags/bytebeat –

2

Es necesario para comunicarse con el hardware de audio, pero los tiempos en los que se puede hacer directamente son mucho más ...

puedo sugerir OpenAL?

2

Todas las otras respuestas solo sugieren alguna abstracción o biblioteca. Siempre existe la posibilidad de recurrir directamente al hardware. (Si esta es una buena idea es una pregunta completamente diferente y depende de usted decidir)

¿Puedo sugerir mirar el código del controlador de audio? El controlador Emu10k1 es solo un ejemplo disponible en las fuentes de Linux.

También vale la pena ver es lo siguiente: "Creating a Kernel Driver for the PC-Speaker"

también recuerdo los días en Amiga, donde un tío divertido creado un programa que (AB) utilizó el Floppy drive stepper motor as an audio output.