Convertir archivos archivos APE a MP3 en Linux Ubuntu

Todo en la vida sucede en el último momento cuando ya no hay tiempo.  Hoy necesité de urgencia convertir archivos APE (Monkey’s Audio Code) a MP3 para que los pudieran reproducir normalmente.  En un búsqueda rápida no pude encontrar ninguna aplicación que realizara fácilmente la conversión.  Buscando con Linux encontré varios sitios con algunas sugerencias pero ninguna me funcionó, al menos incialmente.  Por eso decidí realizar esta breve compilación de los pasos a realizar para efectuar la conversión.

Obtener la distribución para Debian de Mac.  El sitio oficial de este en proyecto en SourceForge fue removido motivo por el cual no es fácil encontrar una distribución de esta aplicación.

$ wget http://members.iinet.net.au/~aidanjm/mac-3.99-u4_b3-1_i386.deb

Instalar el paquete recién descargado.

$ sudo dpkg -i mac-3.99-u4_b3-1_i386.deb

Instalar bchunk sólo si es necesaro separar las pistas de sonido (archivo CUE).

$ sudo apt-get install bchunk

Instalar lame para codificar el archivo MP3.

$ sudo apt-get install lame

Convertir el archivo.ape en wav.

$ mac archivo.ape archivo.wav -d

Separar las pistas según la información el archivo CUE (si es necesario).  pista es el prefijo con que se crearan los nombres de los archivos.

$ bchunk -w archivo.wav archivo.cue pista

Codificar el archivo WAV a MP3.

$ lame --preset extreme archivo.wav archivo.mp3

Es posible especificar la información de las etiquetas del MP3 si se desea.

lame --preset extreme --ta "Nombre del Artista" --tl "Nombre del Album" --tg "Genero" archivo.wav archivo.mp3

Para automatizar un poco el proceso, creé un script que ejecutado en un directorio convierte los archivos *.cue a archivos *.mp3.  No tiene en cuenta al archivo CUE.

#!/bin/sh

# Convert from APE to WAV
for f in *.ape
do
   mac "$f" "$f.wav" -d
done

# Convert from WAV to MP3
for f in *.wav
do
   lame --preset extreme "$f" "$f.mp3"
done

# Rename APE.WAV.MP3 to MP3
find . -name '*ape.wav.mp3*' | sort | while read FILE
do
   NEWFILE=`echo ${FILE} | sed 's/ape.wav.mp3/mp3/g;'`
   mv "${FILE}" "${NEWFILE}"
done

Enlaces:

Traducciones desde GTalk bots

Este año Google habilitó el servicio de traducción asistida a través de bots del servicio de GTalk.  Para utilizarlos se debe agregar como contacto la dirección del bot y posteriormente aceptarlo como contacto.

Las direcciones de los bots tienen el siguiente formato.

[lenguaje orígen] 2 [lenguaje destino]@bot.talk.google.com

Esto quiere decir que el bot que traduce de español a inglés es es2en@bot.talk.google.com y el que realiza el proceso contrario es en2es@bot.talk.google.com.

Las combinaciones de idiomas disponibles son las siguientes.

  1. Arabic – English:      ar2en      en2ar
  2. Bulgarian – English:     bg2en     en2bg
  3. Czech – English:     cs2en     en2cs
  4. Danish – English:     da2en     en2da
  5. German – English:     de2en     en2de
  6. German – French:     de2fr     fr2de
  7. Greek – English:     el2en     en2el
  8. Spanish – English:     es2en     en2es
  9. Finnish – English:     fi2en     en2fi
  10. French – English:     fr2en     en2fr
  11. Hindi – English:     hi2en     en2hi
  12. Croatian – English:     hr2en     en2hr
  13. Italian – English:     it2en     en2it
  14. Japanese – English:     ja2en     en2ja
  15. Korean – English:     ko2en     en2ko
  16. Dutch – English:     nl2en     en2nl
  17. Norwegian – English:     no2en     en2no
  18. Polish – English:     pl2en     en2pl
  19. Portuguese – English:     pt2en     en2pt
  20. Romanian – English:     ro2en     en2ro
  21. Russian – English:     ru2en     en2ru
  22. Swedish – English:     sv2en     en2sv
  23. Chinese – English:     zh2en     en2zh
  24. Traditional Chinese – English:     zh-hant2en     en2zh-hant
  25. Traditional Chinese – Chinese:     zh-hant2zh     zh2zh-hant

Este servicio se encuentra basado en el servicio de traducción de Google.

Enlaces:

Documentación de CodeIgniter en español

CodeIgniter es un framework MVC para el desarrollo de aplicaciones web.  Es una alternativa interesante ya que es útil, facilita el desarrollo pero a su vez es lo suficientemente desacoplado para no obligarle a utilizar nada que no se desee usar.  Entre sus ventajas se cuentan su velocidad, su buena documentación, tutoriales y el soporte de una comunidad de tamaño decente.

Si por alguna extraña razón, no es de su agrado la lectura de la documentación en inglés también puede elegir otros idiomas.  Encontré que hay dos proyectos que se encuentran traduciendo la documentación al español actualmente.

Para mas información consultar el sitio Wiki de CodeIgniter acerca del estado de los proyectos de traducción.

Utilizando el Wiimote con C#: parte II

HelloWii 0.1 screenshot
HelloWii 0.1 screenshot

Introducción.

Antes de publicar el código fuente del HelloWii, decidí hacer un poco de refactory obteniendo los siguientes productos y conclusiones.

  • La clase WiiController que es un recubrimiento (wrapper) de la librería WiimoteLib y que simplifica su acceso.  Está desarrollada en C#.
  • Se utilizó el patrón observador (interfaz WiiControllerObserver) para permitirle a los interesados registrarse con el control para ser notificados de sus cambios de estado.  De igual manera es posible obtener información de este por demanda.
  • Si el observador es el mismo componente de UI (Form por ejemplo) es recomendable remover el registro del observador (unregisterObserver) antes de cerrar/destruír la componente/aplicación y evitar así excepciones generadas durante intentos de actualización mientras se cierra el componente.
  • Se adaptó la aplicación de demostración para utilizar a un objeto WiiController como interfaz en lugar de utilizar a la librería directamente.
  • Con el rediseño se esperaba evitar el problema del cross-threading pero no fue posible.

Como se mencionó no fue posible obviar la situación generada por la ejecución de instrucciones entre distintos hilos: la interfaz de usuario y la librería de acceso al wiimote que genera los problemas y explicación ya fueron expuestos.  Sin embargo, revisando el foro de WiimoteProject encontré que es posible indicarle al componente visual de .NET que se encuentre accediendo a la librería (inclusive indirectamente a través de WiiController) que ignore este tipo de accesos ilegales entre hilo al evitando su revisión, esto se logra agregando la siguiente instrucción al constructor del componente.

CheckForIllegalCrossThreadCalls = false;

API de la clase WiiController.

La clase WiiController cuenta con los siguientes métodos.

  • public void connect() – Creates the conexion with the wiimote.
  • public void disconnect() – Makes the disconnection of the wiimote..
  • public bool isConnected() – Checks if the wiimote has been already connected..
  • public void refreshStatus(WiimoteState source) – Updates the references to the internal information of the wiimote.
  • public void setReportType(WiimoteLib.InputReport type) – Selects the the type of information report that is expected from the controller.
  • public float getBattery() – Gets the battery level of the wiimote.
  • public String getId() – Gets the ID of the controller.
  • public bool[] getAllButtonsStatus() – State of all buttons of the wiimote.
  • public bool getButtonStatus(String name) – The status of a button on the wiimote.
  • public bool[] getAllLedsStatus() – The status of all leds of the wiimote.
  • public bool getLedStatus(int id) – The status of an individual led.
  • public void setLeds(bool l1, bool l2, bool l3, bool l4) – Change the state of the wiimote’s leds.
  • public void setLeds(bool[] leds) – Change the state of the wiimote’s leds.
  • public void turnLed(int index, bool status) – Change the state of an individual led.
  • public int[] getAcceleration() – Obtains the acceleration of the wiimote.
  • public int getAcceleration(String axis) – Obtains the acceleration of the wiimote.
  • public bool isRumbling() – Checks if the rumbling device is active.
  • public void rumble(bool status) – Change the state of the wiimote’s rumbling device.
  • public bool isObserver(WiiControllerObserver observer) – Checks if an observer is already registered.
  • public bool registerObserver(WiiControllerObserver observer) – Register a new observer on the controller.
  • public bool unregisterObserver(WiiControllerObserver observer) – Unregister an observer from the controller.
  • public bool isExtensionConnected() – Checks if a wiimote’s extension is connected.
  • public String getExtensionTypeConnected() – Get the type name of the connected extension.
  • public int[] getNunchukAcceleration() – Get the acceleration of the nunchuk extension.
  • public int getNunchukAcceleration(String axis) – Get the acceleration of the nunchuk extension.
  • public bool[] getAllNunchukButtonsStatus() – Get the state of the buttons on the nunchuk extension.
  • public bool getNunchukButtonStatus(String name) – Get the state of a button on the nunchuk extension.
  • public int[] getNunchukJoystick() – Get the joystick state on the nunchuk extension.
  • public int getNunchukJoystick(String axis) – Get the joystick value on a selected axis from the nunchuk extension.

Para mas información acerca del API de la clase y de su respectiva utilización consulte la documentación del código fuente inmersa en el archivo WiiController.cs y en WiiForm.cs (aplicación de demostración).

Registrar observadores.

Para registrarse como observador de eventos del wiimote la clase debe implementar la interfaz jimezam.wii.controller.WiiControllerObserver.  Esta interfaz obliga a que se implementen los siguientes métodos.

  • void update() – Invoked when the status of the wiimote is changed.
  • void updateExtension() -Invoked when an extension is connected/disconnected to the wiimote.

La manipulación del registro de un observador se realiza utilizando los métodos registerObserver y unregisterObserver de la clase WiiController descritos anteriormente.

Enlaces.

Selección de Debug/Release en Visual C# Express 2008

Esta semana, gracias a las pruebas con el Wiimote he vuelto a trabajar con C#, esta vez con utilizando el Visual C# Express 2008.  Encontré un problema, cuando quise generar la versión final de la aplicación no pude encontrar la opción que me permitiera elegir entre las presentaciones Debug/Release del ejecutable generado.

Buscando en Internet encontré que hay dos formas de hacerlo.

  1. Presionando F5 se construye el ejecutable en modo Debug, presionando CTRL+F5 se construye el ejecutable en modo Release.
  2. Si realmente se desea tener visible el menú que le permita seleccionar el modo del ejecutable y la CPU objetivo realice los siguientes pasos.
  • Elija el menú Tools > Options.
  • Seleccione la casilla de verificación Show all settings en la parte inferior izquierda.
  • Seleccione la rama Projects and solutions > General.
  • Selecciona la casilla de verificación Show advanced build configurations.
  • Presione el botón OK para aceptar los cambios.

debug-release-bar