programación - manual completo de c++ pdf
Aprendiendo a trabajar con audio en C++ (16)
¡No me escuches! ¡Podría estar equivocado!
No programo C ++, pero estoy de acuerdo con Jalf en que es difícil para los principiantes, hay muchas cosas que tienen que hacerse de forma manual que otros idiomas harán por ti automáticamente, como la asignación de memoria, la recolección de basura, etc. también son correctos al decir que C ++ no conoce el audio, y que otros idiomas tienen capacidades de audio integradas desde cero. Sin embargo, en general, la mayoría de estos son capacidades bastante básicas: abrir y reproducir archivos, enviar la barra de reproducción a diferentes partes del archivo, ajustar el panorama y el volumen, tal vez extraer datos de eq.
Pero ... supongo que quieres profundizar un poco más y realmente dar forma al sonido, ya sea a través de la síntesis o los efectos, y que quieres hacer estas cosas en lugar de solo agregarlas. Te animo a que veas VST y VSTi, pero esta es el área de C ++ (la biblioteca JUCE, increíblemente impresionante) y el trabajo duro, pero si quieres crear tu propio producto, entonces podría ser el camino. de lo contrario, como otros han sugerido CSound, Max, Cycling y tal vez el procesamiento podría ser de interés. software como Reaktor le permite parchear componentes modulares con mucha menos codificación (si la hay).
ve y echa un vistazo a algunos de los foros en KVRAudio, hay algunos héroes que desarrollaron freeware clásico antiguo como Hammerhead, y luego otro software independiente como Fruity Loops, Rebirth, Tuareg, Audiomulch, etc.
Creo que aprender sobre VST y C ++ es lo mejor, pero será un largo camino con dolor y angustia, y a menos que desee crear una pieza de software independiente o un complemento para otra pieza de software (aparte de Csound, etc.), será decepcionante.
Creo.
Mi título fue en ingeniería de audio, pero soy bastante nuevo en programación. Me gustaría aprender a trabajar con audio en un entorno de programación, en parte para que pueda aprender C ++ mejor a través de proyectos interesantes.
En primer lugar, ¿C ++ es el lenguaje adecuado para esto? ¿Hay alguna razón por la que no debería usarlo? He oído hablar de Soundfile y algunas otras bibliotecas, ¿qué recomendarías?
Finalmente, ¿alguien sabe de algún buen tutorial sobre este tema? Aprendí lo básico de DSP: ¡solo quiero programarlo!
EDITAR: uso Windows. Me gustaría jugar con cosas en tiempo real, un poco como Max / MSP pero con más control.
¿C ++ es el lenguaje correcto? Eso depende completamente del contexto. Si necesita conectar su código a otra aplicación, marco o lo que sea, probablemente tenga que usar cualquier lenguaje para el que esté hecho el marco.
Si estás haciendo tu propia aplicación independiente? Probablemente no. Hay varias razones por las que sugeriría que vaya con otro idioma:
- C ++ no es muy adecuado para principiantes. Si su objetivo es aprender programación a través de estos proyectos, vaya con un lenguaje que sea más receptivo a "aprender haciendo". C ++ está lleno de trampas y cosas que "parecen funcionar", hasta que un día no lo hacen. Agregue a esto una sintaxis horriblemente compleja y algunas expresiones idiomáticas y técnicas bastante complejas que debe dominar para solucionar las peculiaridades del lenguaje que simplemente no son problemas en casi cualquier otro idioma, y usted tiene una buena fuente de errores y frustraciones, y No mucho mas.
- C ++ no tiene concepto de "audio". C ++ no cuenta con ningún tipo de soporte para grabar, procesar o reproducir audio, cargar o guardar archivos de audio o cualquier otra cosa. La mayoría de los idiomas modernos tienen algún tipo de soporte de audio integrado en el lenguaje estándar (al menos la capacidad de cargar y reproducir archivos mp3 y otros conceptos básicos). En C ++, todo esto tendrá que hacerse a través de bibliotecas de terceros y códigos específicos del SO.
Si tiene una elección real de idioma, yo diría que busque algo como Python o C #. Son más fáciles de aprender, vienen con mucha más funcionalidad de fábrica y hacen que sea mucho más difícil dispararse en el pie. No recomendaría C ++ a alguien que no sea un programador experimentado.
C ++ puede ser un excelente lenguaje para procesar audio, utilizo el framework Marsias , un paquete multiplataforma que le permite realizar tareas complicadas en el procesamiento de señales de audio, recuperación de información de música y aprendizaje automático de manera muy sencilla. También es muy rápido y puede realizar muchas tareas complicadas en tiempo real, a diferencia de muchos otros paquetes. En las pruebas que hemos realizado, Marsias puede ser cientos de veces más rápido que Matlab.
Para empezar, aquí hay un código. Digamos que querías reproducir un archivo de audio, para esto, crearías una red en Marsyas que se ve así:
- Serie
- SoundFileSource
- Ganancia
- AudioSink
Marsyas usa un modelo de parche implícito, que es algo así como el parche explícito que ves en Max / MSP, pero no tienes que dibujar cables entre los objetos, simplemente los colocas en contenedores y los cables se crean automáticamente. El objeto Serie arriba contiene un SoundFileSource, que alimenta un archivo de audio, luego lo pasa a una Ganancia, que le permite cambiar el volumen del audio, y luego lo alimenta a un AudioSink, que reproduce el archivo de audio en sus parlantes.
El C ++ para crear esta red es muy simple:
MarSystem* playbacknet = mng.create("Series", "playbacknet"); playbacknet->addMarSystem(mng.create("SoundFileSource", "src")); playbacknet->addMarSystem(mng.create("Gain", "gt")); playbacknet->addMarSystem(mng.create("AudioSink", "dest")); // Set the SoundFileName playbacknet->updctrl("SoundFileSource/src/mrs_string/filename",inAudioFileName); // Turn on the audio output playbacknet->updctrl("AudioSink/dest/mrs_bool/initAudio", true); while (playbacknet->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->isTrue()) { playbacknet->tick(); }
Las primeras cuatro líneas crean el MarSystem que procesa tu audio. El objeto Serie, que contiene todo lo demás, se crea primero, y luego se le agregan SoundFileSource, Gain y AudioSink.
La siguiente línea establece el nombre de archivo de SoundFileSource, le daría el nombre del archivo .wav, .au, .aiff o .mp3 que desea procesar aquí.
Luego enciendes AudioSource, que le dice a tu tarjeta de sonido que empiece a reproducir el sonido actualizando el control "initAudio" de AudioSource. El ciclo while luego se repite siempre que SoundFileSource tenga datos de audio.
Puedes ver que este simple ejemplo es realmente fácil de hacer, pero el verdadero poder de Marsias es cuando quieres hacer tareas más complicadas. Por ejemplo, para hacer una FFT, simplemente harías:
MarSystem* net = mng.create("Series", "net"); net->addMarSystem(mng.create("SoundFileSource", "src")); net->addMarSystem(mng.create("Spectrum", "spectrum")); net->addMarSystem(mng.create("PowerSpectrum", "powerspectrum")); while (playbacknet->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->isTrue()) { cout << net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>() << endl; }
Para estimar la frecuencia fundamental de una fuente de audio, harías algo como:
MarSystem* net = mng.create("Series", "series"); net->addMarSystem(mng.create("AudioSource", "src")); net->addMarSystem(mng.create("AubioYin", "yin")); while (playbacknet->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->isTrue()) { cout << net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>() << endl; }
Este último leerá en audio en tiempo real desde su tarjeta de sonido y ejecutará el poderoso algoritmo de detección de tono YIN en él. Dulce, ¿eh?
Para obtener más códigos, consulte el sitio web de Marsyas , especialmente consulte la documentation .
C podría ser una mejor opción que C ++ para audio, particularmente si desea hacer cualquier DSP.
- La mayoría de los libros de referencia de audio y DSP prácticos usan C para ejemplos de código
- La mayoría de las bibliotecas de audio / DSP están escritas en C (o al menos tienen una API de C)
- C ++ aumenta en gran medida la curva de aprendizaje en comparación con C, pero no agrega muchos beneficios para el trabajo de audio / DSP (el OOP no es particularmente relevante para el código de bajo nivel / tiempo real)
No hay nada "incorrecto" en el aprendizaje de C ++, por supuesto, y no le impedirá comprender y usar el código C (ya que C ++ es principalmente un superconjunto de C), es solo que usted estará listo y funcionando mucho más rápido con C, y siempre puede pasar a C ++ más tarde si así lo desea.
Dependiendo de tus necesidades, tal vez R sea un lenguaje más fácil. Lo estoy usando desde hace un año, hace análisis estadísticos, gráficos, mapas y análisis de sonido también. Con las bibliotecas png, tuneR y seewave necesita una línea para leer un .wav, otra para obtener la matriz de datos, y otra para ponerla en una imagen png o verla en la pantalla. Los puntos de estar diseñados para analizar datos y ser más fácil de usar son dos ventajas para mí. Por ejemplo, R numera las tablas y matrices comenzando desde 1, no como la mayoría de los lenguajes de programación. Hace que nuestro cerebro humano se sienta mucho más cómodo con los scripts ya complicados. Creo que deberías echarle un vistazo: http://www.r-project.org/
¡Buena suerte!
Echa un vistazo a Audacity . Es un editor de audio de código abierto multiplataforma (Linux, OS X y Windows) escrito en C ++. No sé en qué nivel están sus habilidades de GUI, pero el código que trata con el trabajo de audio debería ser bastante fácil de distinguir del código wxWidgets (GUI).
En Windows, busque tutoriales en DirectSound.
En Linux hay una variedad de bibliotecas y métodos para acceder a las tarjetas de sonido, la más sencilla de las cuales es simplemente abrir un archivo en el dispositivo y usar ioctrl para establecer la velocidad, etc.
Si proporciona más información sobre el medio ambiente, es posible que tengamos mejores recomendaciones.
-Adán
Muchas buenas sugerencias aquí. Además, sugeriría consultar el Jack Audio Toolkit, el framework JUCE, y aprender a portar el código C desde librerías de síntesis como Csound. El "Libro de programación de audio" también es bueno para eso.
Re C vs C ++, creo que encontrará que en el trabajo de audio, la parte de C ++ a menudo es realmente chrome para la administración de código. Los bits DSP son todos matemática de procedimiento de bajo nivel en señales, por lo que es probable que sean llamadas C y realmente no importa para ese lado de las cosas si usas C o C ++. Muchos proyectos de audio C ++ son esencialmente solo C en las tripas de audio.
hth!
No tengo mucha experiencia en la creación de aplicaciones de audio para mí, pero si estuviera en su posición, jugaría a crear el primer instrumento de tecnología de estudio virtual de VSTi. Por lo que sé, Steinberg ha lanzado un SDK de C ++ para esto y creo que sería un buen punto de partida si desea acceder a las aplicaciones de diseño de sonido.
Para responder a su segunda pregunta, consulte este libro: Diseño de plug-ins de efectos de audio en C ++: con la teoría del procesamiento digital de señales de audio de Will Pirkle.
El libro pasa por un DSP básico y le explica cómo crear complementos de audio. Codificará en C ++ pero no será difícil porque el libro sugiere que descargue un marco, RACKAFX, que maneja todos los eventos GUI. Todo lo que tendrá que hacer es concentrarse en escribir las fórmulas y almacenar los datos en los canales correctos.
¡Buena suerte!
Puede usar un archivo .wav usando algún comando.
Ese comando es PlaySound("C://SOUNDS//example.WAV", NULL, SND_ASYNC);
Realmente depende del tipo de trabajo de audio que desee hacer. Si desea implementar audio para un juego, C ++ es el idioma correcto. Hay muchas bibliotecas alrededor, OpenAL es genial, gratuito y multiplataforma. También utilicé DirectSound y Fmod con gran éxito. Échales un vistazo, todo depende de tus necesidades.
Si decides usar C ++, entonces vale la pena mencionar The Synthesis Toolkit . Lo uso para un proyecto escolar y es muy útil, desarrollado en stanford university, crossplatform (win, mac y linux), gratuito y de código abierto. Un extracto de la página wikipedia en él:
Las versiones de las clases de instrumentos STK se han integrado en ChucK, Csound, Cmix en tiempo real, Max / MSP (como parte de PeRColate) y SuperCollider.
Tienen muchos testcode incluidos + en el sitio son algunos tutoriales para comenzar con su biblioteca. (Pero usted debe saber algo de C ++, por supuesto)
STK tiene algunos archivos de audio classed to read / write (y archivos matlab), audio / midi io en tiempo real, algunos algoritmos básicos (uso basado en funciones similares de matlab), ...
Otra opción obvia y, probablemente, el entorno más utilizado para aprender / probar dsp cosas es Matlab (o octave libre, pero no lo he usado antes). A veces pruebo cosas en Matlab antes de implementarlo en C ++.
EDITAR: En el último año he estado usando JUCE que es una biblioteca de C ++ bastante genial centrada en la programación de audio en C ++, aunque se inclina más hacia algo como QT. Uno de sus desarrolladores (Timur Doumler) tiene una agradable charla sobre audio en tiempo real con C ++ y JUCE en CppCon 2015, definitivamente vale la pena echarle un vistazo, incluso si no terminas usando JUCE: https://youtu.be/boPEO2auJj4
Si ya aprendió los conceptos básicos de DSP, recomendaría Analog Devices Blackfin Processors . Puede usar tanto C como C ++, y proporcionan una cantidad de ejemplos de audio para que pueda comenzar. Proporcionan suficiente código para leer el audio en la placa, procesarlo y volver a reproducirlo.
A partir de esto, puede aplicar cualquier tipo de filtro u otro procesamiento que desee. Utilicé el BF533 Ez-Kit Lite en combinación con un panel LCD en serie para hacer un ecualizador de audio para un proyecto una vez. ¡Fue una gran experiencia de aprendizaje y muy divertida!
Si ya tiene algunos conocimientos de DSP, estos tutoriales muestran cómo convertir el código DSP en un programa terminado, incluidos los controles de GUI. Comienza con una distorsión simple y luego pasa a la síntesis, etc.
Básicamente se escribe un código que se puede construir como un .exe independiente o como un plugin VST para hosts como Cubase o Ableton Live.
Si quieres enfocarte en el procesamiento del sonido real (a diferencia de todo el crud con el que se cargan las aplicaciones de GUI), verificaría CSound . Eso le da una languga basada en archivos de texto que le permite construir casi cualquier dispositivo de audio virtualmente de lo que llaman códigos de operación, pero también tiene el código fuente en el que puede profundizar para ver los algoritmos reales que representan los códigos de operación.