[ English | Español | Pyccκuú ] |
uFMOD es una librería para reproducir música en formato XM, desarrollada completamente en lenguaje ensamblador. Es perfecta para aplicaciones de tamaño y tiempo crítico, libre de defectos audibles, altamente confiable, fácil de usar, de código fuente abierto y multiplataforma. Permite reproducir ficheros y arreglos estáticos en memoria. Es capaz de reproducir inclusive ficheros corruptos y/o modificados. Ejemplos de uso disponibles para los siguientes compiladores: GCC, Tcl/Tk, FreePascal, FASM, NASM y GAS.
La versión para Unix/BSD ha sido probada sobre FreeBSD y Linux (hay una versión exclusiva para Linux con muchas ventajas adicionales a las disponibles en la presente). Sin embargo, ésta debe funcionar también en la mayoría de los otros sistemas operativos derivados de Unix, siempre y cuando se cumplan los siguientes requisitos:
Lo primero que hay que hacer luego de descargar ufmod-X.YZ-unix.tar.gz
y descomprimirlo en un directorio de su elección, es enlazar (o linquear) las herramientas (ya que probablemente querrá usarlas mas adelante). Simplemente desplacese hasta el directorio, donde ha desempaquetado uFMOD y ejecute los siguientes comandos:
gcc -nostdlib eff.o -lc -o eff gcc -nostdlib xmstrip.o -lc -o xmstripNo se recomienda invocar el linker
ld
diréctamente en vez de gcc
. Si llega a obtener errores de linker, puede descargar del SVN el código fuente completo de las herramientas (ver enlace mas adelante) y recompilarlas. Si no desea usar las herramientas, puede saltarse este paso. Consulte la siguiente sección para conocer el propósito de EFF y XMStrip.Hay 2 herramientas gratuitas para usar con uFMOD: XMStrip y Eff. Ambas son aplicaciones de consola, pero también se pueden ejecutar a través de una interfaz gráfica (GUI), desarrollada en Tcl/Tk: effgui y xmstripgui respectivamente. En la mayoría de los entornos Unix basta con hacer doble clic sobre el script ejecutable para iniciar el intérprete de Tcl/Tk y comenzar a ejecutar el script seleccionado, asumiendo que Tcl/Tk ha sido correctamente instalado. A veces, es necesario ingresar el comando wish ./<nombre>
en un emulador de terminal o efectuar una secuencia de pasos mas compleja para poder ejecutar dichos scripts. Por ejemplo, en FreeBSD es necesario especificar la versión de Tk, así: wish8.5 ./<nombre>
, asumiendo que se trata de Tk8.5. Una mejor alternativa consiste en hacer que wish
sea un enlace simbólico a la versión instalada de Tk más reciente. El modo GUI es bastante intuitivo. Vamos a exponer el modo de consola.
SVN | Código fuente completo disponible | |
XMStrip recibe un fichero XM como entrada, modifica su contenido para minimizar el tamaño, sin que esto afecte la calidad del sonido. Concretamente, XMStrip elimina los datos no utilizados (instrumentos y patrones redundantes, comentarios, etc.) y agrupa los patrones de notas para optimizar el tiempo de lectura y procesamiento del XM. Al ingresar ./xmstrip
obtenemos la siguiente respuesta:
USAGE: xmstrip [options] file [output] file - input file name. output - optional output file name. options: -c - clean only (don't strip) When [output] is not specified, XMSTRIP attempts to overwrite the input. If file name contains spaces, enclose it in "". |
Si no especifica el nombre del fichero de salida, XMStrip intentará sobreescribir el fichero de entrada. Si el nombre del fichero contiene espacios, enciérrelo entre comillas dobles ("").
Tenga presente, que otros reproductores de XM, probablemente, rechacen los ficheros producidos por XMStrip. Especifique -c para 'recuperar' un fichero así o símplemente para procesar un fichero normal que desea poder usar en otros reproductores de XM.
Eff es útil para los usuarios avanzados, que desean ahorrar hasta el último byte en sus aplicaciones. La idea es extraer sólo aquellas opciones que realmente se van a usar en la aplicación, recompilar la librería uFMOD y obtener el menor tamaño posible. Comencemos abriendo una sesión de terminal y escribiendo ./eff
para obtener el siguiente resúmen:
USAGE: eff [options] file file - input file name options: /Dm - generate a masm32/tasm dump /Dd - generate a Pascal (Delphi) dump /Dc - generate a C/C++ dump /Ds - generate an RCDATA resource dump /Di - disable infoAPI: uFMOD_GetStats, uFMOD_GetRowOrder, uFMOD_GetTitle and uFMOD_GetTime /Dp - disable uFMOD_Pause, uFMOD_Resume and XM_SUSPENDED /Dv - disable volume control /Dj - disable Jump2Pattern /Df - disable loading XM from file /Dl - disable XM_NOLOOP /M - mark & clear unused chunks of data in a masm32/tasm compatible dump |
Como puede ver, el último parametro es el nombre del fichero XM que se va a usar con la aplicación. Opciones adicionales:
id RCDATA "nombre_de_fichero"
. No tiene mayor utilidad en Unix.eff /Dmpvjfl /M ejemplo.xm
eff /M /Dm /Dp /Dv /Dj /Df /Dl ejemplo.xm
eff -M -Dmpvjfl ejemplo.xm
Cualquiera de estas sentencias produce un volcado en lenguaje ensamblador con todos los 'huecos' delimitados y rellenos con ceros por defecto. El fichero de cabecera EFF.INC recopila los efectos XM que realmente se utilizan en el fichero XM dado, más algunas banderas adicionales para deshabilitar las funciones de pausar/reanudar, control de volumen, Jump2Pattern, soporte para ficheros y XM_NOLOOP. Copie EFF.INC en ufmodlib/src/ y recompile la librería. Consulte la sección siguiente para mayor información sobre cómo recompilar uFMOD. Acaba de compilar su propia versión ultraoptimizada de uFMOD, pero recuerde que ésta contiene un subconjunto de efectos XM. Entonces, ¡sólo servirá para reproducir correctamente el fichero XM especificado como parámetro!
Es necesario volver a compilar la librería luego de usar Eff y para habilitar ciertas funciones especiales (ver tabla Opciones mas adelante). Algunas personas querrán modificar el código fuente de la librería, para poner a prueba sus conocimientos en lenguaje ensamblador o por cualquier otra razón. Bueno, la siguiente información les podrá servir.
El código fuente completo se encuentra en el subdirectorio ufmodlib/src/:
Makefile | Comentarios |
Makefile | GNU Make |
MakeBSD | BSD Make |
make.bat | Este es un fichero de procesamiento por lotes para compilar uFMOD para Unix desde Win32. |
Abra el makefile o el fichero de procesamiento por lotes en un editor de texto plano. Todo lo contenido entre las siguientes líneas:
*** CONFIG STARTy
*** CONFIG ENDes configurable. Un paso adicional se debe realizar al compilar la librería desde Win32 (ignore el siguiente recuadro, si está compilando en Unix):
Pathes
. Una de las opciones dice:SET UF_NASM=\nasmSi Ud. tiene instalado NASM, asegúrese de que el camino allí especificado apunte exactamente a la ubicación de nasmw.exe. Supongamos que NASM se encuentra instalado en
D:\TOOLS\NASM
. Entonces, vamos a modificar el camino de la siguiente forma:SET UF_NASM=D:\TOOLS\NASMNo todos los caminos deben ser configurados correctamente para recompilar la librería. Por ejemplo, si Ud. prefiere usar FASM como el ensamblador por defecto, no es necesario configurar el camino de NASM. El camino en UF_ARCH incluye el nombre de fichero:
SET UF_ARCH=arar.exe debe estar en una de las carpetas incluidas en la variable de entorno PATH. Si no, es necesario especificar el camino completo. Supongamos que el camino correcto es
C:\Archivos de programa\BlitzMax\bin\ar.exe
. Entonces, modifiquemos el valor de UF_ARCH:SET UF_ARCH=C:\Archivos de programa\BlitzMax\bin\ar.exeAsegúrese de que todos los caminos necesarios para recompilar la librería sean correctos.
Opción | Descripción | Valores disponibles |
UF_RAMP | Esta opción controla el acoplador de volúmen (interpolación). Esto sirve para suprimir cierto tipo de defecto de sonido conocido como clic, común en música sintetizada. Sin embargo, la interpolación en algunos casos puede generar distorsión. STRONG (fuerte) es el valor por defecto, recomendado para la mayoría de las aplicaciones. En este modo, el acoplador detecta variaciones de volúmen y las suaviza mediante interpolación lineal de 32 etapas. En modo WEAK (débil) hay sólo 16 etapas. WEAK es menos efectivo que STRONG, pero la probabilidad de distorsión también es menor. NONE deshabilita el acoplador. Si no hay interpolación, no puede haber distorsión, pero los clics quedarían al descubierto, a menos que el contenido del XM se encuentre perfectamente balanceado. | NONE, WEAK, STRONG |
UF_FREQ | Frecuencia de muestreo (en Hz). 44100 era el valor por defecto hasta uFMOD v1.20. Este valor resulta de utilidad sólo para compatibilidad con Unix/Linux embebido en QEMU. 48KHz produce mejores resultados en la mayoría de las tarjetas de sonido y consume menos recursos del sistema. Por eso, 48000 es el nuevo valor por defecto, recomendado para la mayoría de las aplicaciones. 22050 es para los que aún sienten nostalgia por los tiempos de Amiga... | 22050, 44100, 48000 |
UF_FMT | Indica si la librería se debe generar en formato de archivo estático (lib*.a) o en formato de código objeto plano (*.o). El ejemplo para FreePascal utiliza un archivo estático, mientras que todos los demás ejemplos emplean ficheros de código objeto. | OBJ, LIB |
UF_ASM | Ensamblador. La librería uFMOD se puede compilar con FASM o con NASM. Escoja su favorito :) | FASM, NASM |
UF_MODE | NORMAL es el valor por defecto. No tiene nada de especial. UNSAFE deshabilida la comprobación de validez del formato XM a la hora de cargar el fichero. Si Ud. está seguro de que todos los ficheros XM están correctos (puede verificarlos con Eff o con XMStrip), puede recompilar uFMOD en modo UNSAFE para reducir el tamaño de la librería y el tiempo de carga. Tenga en cuenta que ¡Un XM corrupto podría ocasionar un fallo en modo UNSAFE! Al compilar uFMOD en modo BENCHMARK se habilita un indicador de rendimiento, el cual registra el número exacto de ciclos de reloj que cuesta generar poco más de 21 ms de audio a 48 KHz. Este modo es útil para comparar el rendimiento de diferentes versiones de uFMOD. El modo BENCHMARK se encuentra disponible sólo en C, FASM, NASM y GAS. | NORMAL, UNSAFE, BENCHMARK |
Si utiliza el fichero Makefile, sólo debe ejecutar Make para compilar la librería: make
o make -f MakeBSD
.
Ejecute el makefile o el fichero de procesamiento por lotes para generar la librería. ¡Eso es todo!
Ejemplos de uso para cada compilador se encuentran en directorios separadas.
Dir | Compilador | Comentarios |
TclTk | Tcl/Tk | Reproductor XM con interfáz gráfica. |
Gcc | GNU C | Ejemplo de uso de la función Jump2Pattern con interfáz gráfica usando GTK. Utiliza un XM compuesto de varias pistas, proporcionado por Kim (también conocido como norki). Consulte la sección siguiente para mayor información sobre pistas compuestas y la función Jump2Pattern. |
Fasm | Flat Assembler | |
Nasm | Netwide Assembler | |
Gas | GNU Assembler | |
FreePascal | FreePascal | Probado con FPC v2.0.4. |
Cómo lograr un ejecutable más compacto
Utilice Eff para optimizar la librería uFMOD y hacerla mas pequeña.
Si desea embeber la pista XM directamente en el ejecutable, puede intentar primero optimizar el fichero XM. Modplug Player permite comprimir un fichero XM usando ADPCM, ¡pero es un tipo de compresión con pérdidas! Utilice XMStrip para optimización sin pérdidas (en términos de calidad del sonido.)
Si tiene plena certeza de que todos los XM que va a reproducir la aplicación son válidos (ninguno puede estar corrupto o modificado), recompile la librería en modo UNSAFE.
Utilice strip y sstrip para remover datos innecesarios en la estructura del ejecutable, introducidos por el compilador/linker. A veces, secciones completas pueden ser suprimidas sin afectar la integridad del ejecutable.
Empaquetadores, como UPX, logran reducir el tamaño del ejecutable.
Hay mas pautas de optimización en el siguiente artículo de Brian Raiter: "A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux". (La mayoría de las pautas allí expuestas son aplicables también en FreeBSD.)
Ahora veamos otra técnica interesante para minimizar el tamaño de los ficheros XM:
Es posible unir varias pistas XM en un solo fichero compuesto. Ya que es posible compartir los instrumentos entre las pistas en el fichero compuesto, el tamaño resultante de este fichero puede ser mucho menor que la suma de los tamaños de los ficheros por separado. Aún sin compartir los instrumentos el tamaño debe ser menor, puesto que sólo se usa un único ejemplar de cabecera XM. Veamos un ejemplo con 3 ficheros XM:
Fichero 1 : CABECERA_XM1 P11 P12 P13 I11 I12 Fichero 2 : CABECERA_XM2 P21 P22 P23 P24 I21 I22 I23 I24 Fichero 3 : CABECERA_XM3 P31 I31Leyenda: CABECERA_XMn es la cabecera del n-ésimo fichero. Pni es el i-ésimo patrón del n-ésimo fichero. Ini es el i-ésimo instrumento del n-ésimo fichero.
Primero, vamos a unir los 3 ficheros en uno solo sin compartir los instrumentos:
Fichero 4 : CABECERA_XM4 P11 P12 P13 P21 P22 P23 P24 P31 I11 I12 I21 I22 I23 I24 I31Supongamos que I12 es muy similar o identico a I23 y que I24 es igual que I31. Podemos modificar P2n para hacer que utilicen I12 en vez de I23 y enlazar P31 con I24. Entonces, podremos eliminar I23 e I31:
Fichero 4 : CABECERA_XM4 P11 P12 P13 P21 P22 P23 P24 P31 I11 I12 I21 I22 I24Al final tendrá que modificar los comandos de ciclos y saltos de patrones y las referencias a instrumentos en los "ficheros" 2 y 3. Obviamente, también es posible unir apenas 2 o más de 3 ficheros, aunque el formato XM establece límites para el número máximo de patrones e instrumentos en un fichero. Esa es, en general, la idea. Es necesario saber usar un tracker para realizar todas estas operaciones sobre un fichero XM. Una vez unidas todas las pistas en un fichero compuesto, podrá iniciar la reproducción con un único llamado a uFMOD_PlaySong y "activar" las pistas por separado con llamados a uFMOD_Jump2Pattern. Por ejemplo, uFMOD_Jump2Pattern(3) pasaria a reproducir la segunda pista, uFMOD_Jump2Pattern(7) saltaria a la tercera y uFMOD_Jump2Pattern(0) regresaria a la primera. Los indices exactos en cada caso dependen de los patrones asignados con el tracker. En Gcc/ hay un ejemplo practico.
El uso de Jump2Pattern tiene otra ventaja: la conmutación de pistas se realiza mucho más rápido (casi de inmediato) que el proceso habitual de parar la pista actual y cargar una pista nueva. Por lo tanto, puede usar esta técnica cuando necesite conmutar las pistas de audio de la manera más rápida posible.
P: ¿Es uFMOD gratis para cualquier tipo de uso, incluido el comercial?
R: Si, actualmente así es.
P: ¿En donde puedo conseguir música en formato XM?
R: En The Mod Archive hay un enorme archivo de música gratis en formatos XM, IT, S3M y MOD. Puede usar el Open Modplug Tracker para convertir ficheros IT, S3M y MOD a formato XM sin perder la calidad. Hay muchos compositores talentosos en la red dispuestos a compartir su música de manera gratuita. ¡Pero no olvide el copyright!
P: ¿Existe alguna relación entre el proyecto uFMOD y las librerías FMOD y/o miniFMOD de Firelight Technologies®?
R: Ya no. Hasta el año 2004 uFMOD se basó en el código fuente abierto de la librería miniFMOD. Desde ese entonces, el código fuente de uFMOD fue completamente reescrito, optimizado y depurado. También fueron agregadas muchas funciones nuevas. Por lo tanto, la versión actual de uFMOD no tiene relación alguna con FMOD o miniFMOD.
P: Algunas librerías aseguran incrementar el tamaño del ejecutable en N kilobytes. ¿En cuanto se incrementa el tamaño de un ejecutable con uFMOD?
R: No es posible establecer un valor exacto, ya que el tamaño depende de muchos factores, a saber: funciones usadas (en especial, si se utiliza la herramienta EFF), código de la aplicación principal, tamaño del fichero XM (cuando el XM es embebido en el ejecutable). También depende de las opciones del linker. Compile uno de los ejemplos incluidos y verifique su tamaño.
P: ¿En dónde puedo conseguir la especificación oficial del formato XM?
R: No existe especificación oficial actualizada. En cambio, puede estudiar el documento "The Unofficial XM File Format Specification: FastTracker II, ADPCM and Stripped Module Subformats" (sólo en inglés). Este documento describe la mayoría de los aspectos relevantes del formato XM original, al igual que todas las extensiones extraoficiales actualmente soportadas por uFMOD. Los códigos fuente de ModPlug (en C++) sirven de referencia sobre formatos derivados del MOD, XM, IT, S3M y muchos otros.
antarman, Barracuda, bogrus, chris_b, cresta, dododo, flaith, Four-F, GL#0M, norki, q_q, ReSampled, S_T_A_S_, voodooattack y yoxola por reportar errores, sugerir nuevas ideas, aportar ejemplos de uso y de otras formas ayudarnos a mejorar uFMOD.
[WASM.RU], CelerSMS y SourceForge.net por el soporte y hosting.
Copyright
Los códigos fuente y ficheros binarios de uFMOD © 2005 - 2022 Asterix y Quantum.
Todos los derechos reservados.
Pistas de ejemplo:
¿Desea reportar un error? ¿Tiene preguntas o sugerencias? ¿Está desarrollando un gran proyecto usando uFMOD? Por favor, mantenganos al tanto: ufmod@users.sf.net |