Vista general del Paquete Sampled (Parte 4 de 4)

¿Qué es una Línea?

La metáfora de una consola físca de mezcla es también útil para entender el concepto de línea de la API Java Sound.

Una línea es un elemento "filtro" del audio digital- esto es, una senda para mover el audio dentro o fuera del sistema. Usualmente una línea es una senda dentro o fuera del mezclador (a pesar de que técnicamente el mezclador por si mismo ya es un tipo de línea).

La puertos de entrada y salida de audio son líneas. Estos son análogos a los micrófonos y parlantes conectados a una consola de mezcla física. Otro tipo de línea es la senda de datos a través de la cual una aplicación puede obtener audio de entrada desde, o enviar audio de salida a, un mezclador. Estas sendas de datos son análogos a las pistas de una grabadora multipista conectada a la consola de mezcla física.

Una de las diferencias entre las líneas en la API Java Sound y estas en un mezclador físico es que los datos de audio que fluyen a través de una línea en la API Java Sound pueden ser mono o multicanal (por ejemplo, estéreo). En contraste, cada uno de las entradas y salidas del mezclador físico es típicamente un canal simple de sonido. Para obtener dos o más canales de salida desde un mezclador físico, dos o más salidas físicas se usan normalmente (por lo menos en el caso del sonido análogo: un enchufe hembra de salida digital es a menudo multicanal). En la API Java Sound, el número de canales en una línea es especificado por el AudioFormat de los datos que actualmente fluye a través de la línea.

Vamos a exmaninar ahora algunos tipos específicos de líneas y mezcladores. El siguiente diagrama muestra diferentes tipos de líneas en un sistema de salida de audio simple que podría ser aprte de una implementación de la API Java Sound:




Una posible configuración de líneas para la salida de audio

traducido desde http://java.sun.com/docs/books/tutorial/sound/sampled-overview.html
Copyright © 1995-2009 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, California 95054, U.S.A. All rights reserved.

Vista general del Paquete Sampled (Parte 3 de 4)

¿Qué es un Mezclador?

Muchas interfaces de programación de aplicaciones (APIs) para el sonido usan la noción de un dispositivo de audio. Un dispositivo es a menudo una interfaz de software a un dispositivo de entrada/salida. por ejemplo, un dispositivo de entrada de sonido quizás represente las capacidades de entrada de una tarjeta de sonido, incluyendo una entrada de micrófono, una entrada análoga de nivel de línea, y posiblemente una entrada de audio digital.

En la API Java Sound, los dispositivos son representados por objetos Mixer. El propósito de un mixer es manejar uno o más flujos de entrada de audio y uno o más flujos de salida de audio. En el caso típico, en realidad mezcla múltiples flujos de llegada juntos en un solo flujo que sale. Un objeto Mixer puede representar las capacidades de mezcla de sonido de un dispositivo físico como lo es una tarjeta de sonido, la cual quizás necesite mezclar el sonido de llegada en el computador desde varias entradas, o el sonido que viene desde aplicaciones y que va a las salidas.

Alternativamente, un objeto Mixer puede representar las capacidades de mezcla de sonido que son implementadas enteramente en el software, sin ningún interfaz inherente a los dispositivos físicas.

En la API Java Sound, un componente como una entrada micrófono en una tarjeta de sonido no es por si mismo considerado un dispositivo - esto es, un mixer - pero es más bien un puerto dentro o fuer del mixer. Un puerto típicamente provee un flujo simple de audio dentro o fuera del mixer (a pesar de que el flujo puede ser multicanal, como estéreo). El mezclador quizás tenga varios puertos. Por ejemplo, un mixer que representa las capacidades de salida de una tarjeta de sonido quizás mezcle varios flujos de audio juntos, y luego enviar la señal mezclada a ninguno a todo de los varios puertos de salida conectados al mixer. Estos puertos de salida podrían ser (por ejemplo) un jack de audífonos, un parlante incorporado, o una salida de nivel de línea.

Para entender la noción de un mixer en la API Java Sound, ayuda visualizar una consola de mezcla física, como las usadas en los conciertos en vivo y en los estudios de grabación.




Una consola de mezcla física

Un mezclador físico tiene "franjas" (tambien llamadas "slices"), cada una representa una senda a través de la cual una señal simple de audio irá dentro del mezclador para procesarse. Una franja tiene perillas y otros controles con los cuales puedes controlar el volumen y el balance (lugar en la imagen estéreo) de la señal en dicha franja. Además, el mezclador puede tener un bus separado para efectos como reverberación, y este bus puede ser conectado a una unidad de reverberación interna o externa. Cada franja tiene un potenciómetro que controla cuanto de aquella señal va dentro de la mezcla reverberada. La mezcla reverberada ("humeda") es luego mezclada con la señal "seca" desde las franjas. un mezclador físico envía esta mezcla final a un bus de salida, el cual típicamente va a una grabadora (o a sistema de grabación basado en discos) y/o parlantes.

Imaginemos un concierto en vivo que está siendo grabado en estéreo. Los cables (o conexiones inalámbricas) llegan desde muchos micrófonos e instrumentos eléctricos en escena que están conectados dentro de las entradas de la consola de mezcla. Cada entrada va a una franja separada del mixer, como en la ilustración, El ingeniero de sonido decide la configuración de la ganancia, balance, y controles de reverberación. La salida de todas las franjas y la unidad de reverberación son mezcladas juntas en dos canales. Estos dos canales van a dos salidas del mixer,
dentro del cual los cables que conectan la entrada la grabadora estéreo están enchufados. Los dos canales son posiblemente enviados vía un amplificador a los parlantes en el salń, dependiendo del tipo de música y el tamaño del salón.

Ahora imagina un estudio de grabación, en el cual cada instrumento o cantante es grabado en una pista separada de una grabadora multipista. Después de que los instrumentos y cantantes han sido grabados, En ingeniero en grabación presenta un "mixdown" para combinar todas las pistas en cinta dentro de una grabación de dos canales (estéreo) que puede ser distribuida en discos compactos. En este caso, la entrada de cada una de las franjas del mixer no es un micrófono, pero sí una pista de la grabación multipista. una vez más, el ingeniero puede usar controles en las franjas para decidir cada volumen de las pistas, balance, y monto de reverberación. Las salidas del mixer van una vez mas a una grabadora y a los parlantes estéreo, como en el ejemplo del concierto en vivo.

Estos dos ejemplos muestras dos usos diferentes de un mixer: capturar múltiples canales de entrada, combinarlas dentro de menos pistas, y salvar la mezcla, o reproducir múltiples pistas mientras se mezclan a menos pistas.

En la API Java Sound, un mixer puede similarmente ser usado para la salida (audio de captura) o entrada (audio de reproducción). En el caso de la entrada, la fuente desde la cual el mezclador obtiene el audio para la mezcla es una o más puerto de entrada. El mixer envía los flujos de audio capturados y mezclado a su objetivo, el cual es un objeto con un buffer desde el cual una aplicación puede recuperar estos datos de audio mezclado. En el caso de la salida de audio, la situación es inversa. La fuente de audio del mixer es uno o más objetos que contienen buffers dentro de los cuales una o más aplicaciones escriben sus datos de sonidos; y el objetivo del mezclador es uno o más puertos de salida.

traducido desde http://java.sun.com/docs/books/tutorial/sound/sampled-overview.html
Copyright © 1995-2009 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, California 95054, U.S.A. All rights reserved.

Vista general del Paquete Sampled (Parte 2 de 4)

¿Qué son los Datos de Audio con Formato?

Los Datos de Audio con Formato se refieren al sonido que está en cualquier formato de un número de formatos estándar. La API Java Sound distingue entre formatos de datos y formatos de archivo.

Formatos de Datos

Un formato de datos te dice como interpretar una serie de bytes de datos de audio muestreado "sin refinar", como muestras que ya han sido leídas desde un archivo de sonido, o muestras que han sido capturadas desde la entrada de micrófono. Quizás necesites saber, por ejemplo, cuántos bits constituyen una muestra (la representación del instante mas corto de sonido), y similarmente quizás necesites saber la velocidad de la muestra de sonido (qué tan rápido las muestras se supone que se encuentran unas con otras). Cuando se configura una reproducción o captura, especificas el formato de datos del sonido que estás capturando o reproduciendo.

En la API Java Sound, un formato de datos es representados por un objeto AudioFormat, el cuál incluye los siguientes atributos:

  • Técnica de codificación, usualmente modulación por pulsos codificados (en inglés PCM)
  • Número de canales (1 para mono, 2 para estéreo, etc.)
  • Velocidad de muestra (número de muestras por segundo, por canal)
  • Número de bits por muestra (por canal)
  • Velocidad de marco
  • Tamaño de marco en bytes
  • Orden de los bytes (big-endian o little-endian)

  • PCM es un tipo de codificación de la onda de sonido. La API Java Sound incluye 2 codificaciones PCM que usan cuantización linear de amplitud, y valores enteros con y sin signo. Cuantización linear quiere decir que el número guardado en cada muestreo es directamente proporcional (excepto por cualquier distorsión) a la presión del sonido original en dicho instante-y similarmente proporcional al desplazamiento de un altavoz o tímpano que está vibrando con el sonido en el mismo instante. Los discos compactos por ejemplo, usan un sonido codificado PCM lineal. la codificación mu-law y la codificación a-law son codificaciones comunes no lineales que proveen un version mas comprimida de datos de audio; estas codificaciones son típicamente usadas para la telefonía o grabaciones de conversaciones. Una codificación no lineal traza un mapa de la amplitud del sonido original para al valor guardado usando una función no lineal, la cual puede ser designada para dar mayor resolución de amplitud a sonidos suaves mas que a sonidos fuertes.

    Un marco contiene los datos de todos los canales en un tiempo particular. Para los datos codificados en PCM, el marco es simplemente el conjunto de muestras simultáneas
    en todos los canales, para un dado intante en el tiempo, sin ninguna información adicional. En este caso, la velocidad de marco es igual a la velocidad de muestra, y el tamaño de marco en bytes es el número de canales multiplicado por el tamaño de muestra en bits, dividido por le número de bits en un byte.

    Para otros tipos de codificación, un marco debe contener información adicional junto a las muestras, y la velocidad de marco quizás sea completamente diferente de la velocidad de muestra. Por ejemplo, consideremos la codificación MP3 (MPEG-1 Audio Layer 3), la cual no esta explícitamente mencionada en la versión actual de la API Java Sound, pero la cual prodría ser soportada por medio de una impletancion de la API Java Sound o por prestación de servicios por parte de terceros. En MP3, cada marco contiene un fardo de datos comprimidos por una serie de muestras, no solo una muestra por canal, debido a que cada marco encapsula una serie complete de muestras, la velocidad de marco es menor a la velocidad de muestra. El marco contiene además una cabecera. A pesar de la cabecera, el tamaño del marco en bytes es menor al tamaño en bytes del número equivalente de marcos PCM. (Después de todo, el propósito de MP3 es ser más compacto que los datos PCM.) Para tal codificación, la velocidad de muestra y el tamaño de muestra se refeieren a los datos PCM que el sonido codificado eventualmente serán convertidos antes de ser entregados a un convertidos análogo-digital (DAC, en inglés).

    Formatos de Archivo

    Un formato de archivo especifica la estructura de un archivo de sonido, incluyendo no solo el formato de los datos de audio sin refinar en el archivo, sino que también otra información que puede ser almacenada en el archivo. Los archivos de sonido vienen en varios estándares, como los es WAVE (también conocido como WAV, y a menudo asociado a los PCs), AIFF (a menudo asociado con los Macintosh), y AU (a menudo asocioado con los sistemas UNIX). Los diferentes tipos de archivos de audio tienen diferentes estructuras. Por ejemplo, quizás tengan un arreglo de datos distinto en la "cabecera" del archivo. Una cabecera contiene información descriptiva que típicamente precede a las muestras de audio del archivo actual, a pesar de que algunos formatos de archivo permitan "pedazos" sucesivos de datos de audio y descipción. La cabecera incluye un especificación del formato de datos que fue usado para almacenar el audio en el archivo de sonido. Cualquiera de estos tipos de sonido puede contener varios formatos de datos (a pesar de que usualmente hay solo un formato de dato dentro de un archivo dado), y el mismo formato de datos puede ser usado en archivos que tengan distintos formatos de archivo.

    En la API Java Sound, un formato de archivo es representado por un objecto AudioFileFormat el cual contiene:

  • El tipo de archivo (WAVE, AIFF, etc.)
  • El largo del archivo en bytes
  • El largo, en marcos, de los datos de audio contenidos en el archivo
  • Un objeto AudioFormat que especifica el formato de datos de los datos de audio contenidos en el archivo

  • La clase AudioSystem provee de métodos para lee y escribir sonidos en diferentes formatos de archivo, y para convertir entre distintos formatos de datos. Algunos de los métodos que te dejan acceder a los contenidos del archivo a través de un tipo de flujo llamado un AudioInputStream. Un AudioInputStream es una subclase de la clase InputStream, la cual encapsula una serie de bytes que pueden ser leídos secuencialmente. A su superclase, la clase AudioInputStream agrega conocimiento del formatos de datos de audio de los bytes (representado por un objeto AudioFormat). Gracias a la lectura de un archivo de sonido como un AudioInputStream, obtiene acceso inmediato a las muestras, sin tener que preocuparte acerca de la estructura del archivo de sonido (su cabecera,trozos,etc.). Una simple invocación de método te da toda la información que necesitas acerca de el formato de datos y el tipo de archivo

    traducido desde http://java.sun.com/docs/books/tutorial/sound/sampled-overview.html
    Copyright © 1995-2009 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, California 95054, U.S.A. All rights reserved.

    Vista general del Paquete Sampled (Parte 1 de 4)

    El paquete javax.sound.sampled es fundamentalmente corcernido con el transporte de audio — en otras palabras, la API Java Sound se enfoca en la reprocucción y la captura. La tarea cental que la API Java Sound dirige es como mover bytes o datos de audio formateados dentro y fuera del sistema. Esta tarea envuelve abrir los dispositivos de entrada y salida y administrar los buffers que llegan llenos con los datos de sonido en tiempo real. Esto también puede envolver mezclar múltiples flujos de audio dentro de un solo flujo (de entrada o salida). El transporte del sonido dentro o fuera del sistema tiene que ser correctamente manejado cuando el usuario pida que el flujo de sonido sea iniciado, pausado, resumido, o detenido.

    Para dar soporte a este foco en la entrada o salida básica de audio, la API Java Sound provee métodos de conversión entre varios formatos de datos de audio, y para leer y escribir tipos comunes de archivos de sonido. Sin embargo, esto no intenta ser un exhaustivo juego de herramientas de archivos de audio. Una implementación particular de la API Java Sound no necesita soportar un amplio conjunto de tipos de archivo o conversiones de formato de datos. El servicio de prestación por parte de terceros puede suplir módulos que se "enchufan" a una implementación existente para soportar tipos de archivos adicionales y conversiones.

    *La API Java Sound puede manejar el tranporte de audio en un flujo, en modo con buffer, y en un modo de memoria interna, sin buffer*. "Flujo" es usado aquí en el sentido general para referise al manejo en tiempo real de bytes de audio; no se refiere a lo específico, el famoso caso de enviar audio en internet en cierto formato. En otras palabras, un flujo de audio es simplemente un conjunto continuo de bytes de audio que llegan mas o menos a la misma velocidad a la que están siendo manejados (reproducidos, grabados, etc.). Las operaciones en los bytes comienzan antes de que todos los datos hayan llegado. En el modelo de flujo, particularmente en el caso de la entrada de audio más que en la salida, no vas conocer necesariamente en avance cuán largo es el sonido y cuando terminará de llegar. Simplemente manejas un buffer de datos de audio a la vez, hasta que la operación sea detenida. En el caso de la salida de audio (reproducción), también necesitas un buffer para los datos si el sonido qur quieres reproducir es muy largo para cuadrarlo en la memoria todo de una vez. En otras palabras repartes tus bytes de audio al motor de sonido en trozos, y este tendrá el cuidado de reproducir cada muestra al tiempo que corresponda. Los mecanismos que proveen esto hacen fácil el saber cuantos datos entregar en cada trozo.

    La API Java Sound también permite el transporte sin buffer en el caso de la reproducción solamente, asumiento que ya tienes todos los datos de audio a mano y que ellos no son tan largos para ajustarlos en la memoria. En esta situación, no hay necesidad para la aplicación de dar buffer al audio, aunque con buffer, el enfoque en tiempo real sigue disponible si se desea. En vez de esto, el sonido entero puede ser precargado de una vez dentro de la memoria para una reproducción interna, debido a que todos los datos de sonido son cargados en avance, la reproducción puede comenzar inmediatamente — por ejemplo, tan pronto como el usuario presione el botón de inicio. Esto puede ser una ventaja comparado con el modelo con buffer donde la reproducción tiene que esperar al primer buffer que se llene. además, el modelo -de memoria interna- sin buffer permite a los sonidos ponerlos fácilmente en búcle (ciclo) o configurar posiciones arbitrarias en los datos.

    Para reproducir o capturar sonido usando la API Java Sound, neceseitas por lo menos tres cosas; datos de audio formateado, un mezclador, y una línea. Lo que viene provee una vista general de estos conceptos.

    traducido desde http://java.sun.com/docs/books/tutorial/sound/sampled-overview.html
    Copyright © 1995-2009 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, California 95054, U.S.A. All rights reserved.

    Guía: Sonido (Parte 4 de 4)

    Interfaz de Prestación de Servicios

    Los paquetes javax.sound.sampled.spi y javax.sound.midi.spi contienen APIs que permiten a los desarrolladores de software crear nuevos recursos de audio o MIDI que puedn ser proveídos por separado al usuario y "enchufados" a una implementación existente de la API Java Sound. Estos son algunos ejemplos de servicios (recursos) que pueden ser añadidos en esta manera:

  • Un mezclador de audio
  • Un sintetizador MIDI
  • Un analizador de archivos que pueda leer o escribir un nuevo tipo de audio o archivo MIDI
  • Un conversor que traduzca entre distintos formatos de datos de sonido

  • En algunos casos, los servicions son interfaces de software para las capacidades de dispositivos físicos, como tarjetas de sonido, el prestador de servicios debería ser el mismo que el vendedor del hardware. En otros casos, los servicios existen puramente en el software. Por ejemplo, un sintetizador o mezclador podría ser una interfaz a un chip en una tarjeta de sonido, o podría ser implementado sin ningún soporte en hardware en absoluto.

    Una implementación de la API Java Sound contiene un conjunto básico de servicios, pero los paquetes de la interfaz de prestación de servicios (SPI en inglés) permiten a terceras partes crear nuevos servicios. Estar terceras partes son integradas al sistema de la misma forma que los servicios incorporados. la clase AudioSystem y la clase MidiSystem actúan como coordinadores de que dejan a las aplicaiones acceder a los servicios de manera explícita o implícita. A menudo la existencia de una servicio es totalmente transparente a una aplicación que la usa. El mecanismo prestador de servicios beneficia a los usuarios de aplicaciones basadas en la API Java Sound, por que nuevas características de sonido pueden ser añadidas a un programa sin requerir una nueva salida al mercado del JDK o del entorno en tiempo de ejecución, y en muchos casos, incluso sin requerir una nueva salida al mercado de la aplicación misma.

    traducido desde http://java.sun.com/docs/books/tutorial/sound/index.html
    Copyright © 1995-2009 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, California 95054, U.S.A. All rights reserved.