¿Cómo puedo reproducir un archivo midi desde la terminal?

29

Estoy buscando la aplicación de línea de comandos más simple (o una herramienta integrada en Mavericks que no conozco) para reproducir un archivo midi desde el terminal. Tan simple como sea posible, algo así play myfile.mid.

Contexto: estoy jugando con midi en Python y necesito algo que pueda iniciar desde un script. Sin GUI, sin ventanas, solo reproducción. Debe aceptarse desde el script de Python para ser aceptado, pero cualquier cosa que funcione en la terminal debería serlo.

DCS
fuente

Respuestas:

36

Esto resultó ser un problema más complicado de lo que originalmente esperaba.

QuickTime X no puede reproducir archivos MIDI, aunque QuickTime 7 sí.

Hasta donde puedo decir, eso significa que no hay una solución "incorporada" para reproducir archivos MIDI en Mac OS X (por ejemplo, afplayno funciona). Por lo tanto, creo que cualquier solución implicará descargar e instalar algún otro programa.

Opción n. ° 1: descargue e instale QuickTime 7, que todavía funciona bien en Mavericks, y luego puede reproducir archivos midi de la siguiente manera:

open -a QuickTime\ Player\ 7 /path/to/your/file.mid 

sin embargo, eso solo se reproducirá automáticamente si el usuario ha habilitado esa preferencia, que creo que está desactivada de forma predeterminada.

Opción # 2: usar FluidSynth

Para instalarlo, debe usar Fink, MacPorts o (mi recomendación) Homebrew. Una vez que se instala Homebrew, escriba esto en la Terminal:

brew install fluidsynth

(El comando de MacPorts sería sudo port install fluidsynthy el de Fink sería fink install fluidsynth).

Sin embargo, la descarga fluidsynthsolo te lleva a la mitad. Entonces necesita un archivo "SoundFont", del que nunca había oído hablar antes. Hay información sobre ellos aquí.

Descargué uno de S. Christian Collins llamado "GeneralUser", que es gratis. La versión actual (a partir del 27/11/2013) es FluidSynth versión 1.44 . {Si ese enlace directo se rompe en el futuro, use el enlace anterior que lo llevará a la página web normal de GeneralUser.}

Una vez que haya descargado y descomprimido eso, tendrá una serie de archivos que incluyen "GeneralUser GS FluidSynth v1.44.sf2" (obviamente, el nombre puede cambiar en el futuro). Cambié el nombre de ese archivo y lo moví a /usr/local/share/fluidsynth/generaluser.v.1.44.sf2.

Una vez que el archivo SoundFont está colocado y fluidsynthestá instalado, puede reproducir un midi usando este comando:

fluidsynth -i /usr/local/share/fluidsynth/generaluser.v.1.44.sf2 ~/Music/example.mid 

nb Hay algunos mensajes de error (aparentemente inofensivos) que se muestran cuando haces eso. Si desea suprimirlos, use:

(fluidsynth -i /usr/local/share/fluidsynth/generaluser.v.1.44.sf2 ~/Music/example.mid 2>&1) >/dev/null

en lugar.

Obviamente, nunca voy a recordar todo eso, así que hice una zshfunción llamadaplaymidi

function playmidi {

    SOUNDFONT='/usr/local/share/fluidsynth/generaluser.v.1.44.sf2'

    if [ -e "$SOUNDFONT" ]
    then 

        for i in "$@"
        do 
            if [ -e "$i" ]
            then
                (fluidsynth -i "$SOUNDFONT" "$i"  2>&1) >/dev/null
            else
                echo "[playmidi]: cannot find file at $i"   
                return 1
            fi  
        done 
    else
            echo "[playmidi]: SOUNDFONT file not found at $SOUNDFONT"
            return 1
    fi  
}

(Eso también debería funcionar para bashmí).

Ahora todo lo que tengo que hacer es escribir:

playmidi example.mid 

y example.midjugaré

TJ Luoma
fuente
StackExchange en su máxima expresión! Si bien la opción fluidsynth es mucho más pirateo de lo que estaba dispuesto a aceptar (no todos han instalado brew ...) funciona realmente bien y se inicia más rápido en el script que VLC. Así que esperaré un día o dos si aparece una solución alternativa ridículamente simple, pero si no, la recompensa es suya. Por cierto, para mí el sintetizador de fluidos aparece en /usr/local/Cellar/fluid-synth/1.1.6. (No me gusta la versión anterior de la solución Quicktime, nunca se sabe cuánto tiempo va a funcionar).
DCS
Sí, estoy de acuerdo en que "usar Homebrew | MacPorts | Fink" no es un ideal, pero a) cualquiera que pase una cantidad de tiempo usando la línea de comandos se encontrará con ganas de más de lo que Apple puede proporcionar / proporciona yb) careciendo de una solución incorporada, parecía razonable aquí. En cuanto a QuickTime7, estoy de acuerdo, ha sobrevivido más de lo que imaginé, pero OTOH no puedo creer que "QuickTime X" todavía no pueda hacer cosas que QuickTime 7 podría hacer. (Me hace temer el futuro de iWork, pero esa es otra discusión para otro hilo en otro día :-)
TJ Luoma
El lanzamiento reciente de iWorks en realidad se ha paralizado en comparación con la última versión ... Solo estoy esperando que desaparezca Terminal. Pero suficiente, o seremos criticados por la charla.
DCS
@DCS No criticaremos las quejas informadas. En el peor de los casos, les pediremos que generen una sala de chat o que abran un nuevo hilo si está justificado. Además, edité algunos detalles de tu publicación. Introduzca esa información como respuesta o edite una de las respuestas si esa información se ajusta a ellas.
bmike
Intenté esto en Yosemite y no pude hacerlo funcionar. Incluso desinstalé y reinstalé los puertos mac. Error: sintetizador de fluidos: advertencia: no se ha encontrado ningún valor predeterminado en el canal 9 [banco = 128 prog = 56] no se pudo manejar la solicitud del cliente externo. Jack principal cogió la señal 31.
Robert Wasmann
35

Esto funcionó para mí:

$ brew instalar timidez
$ timidity file.midi
lyderic
fuente
También funcionó para mí, y es MUCHO menos problema que la respuesta que involucra fluidsynth.
glenra
1
La mejor respuesta aquí. La respuesta fluidsynth es realmente inteligente, pero es probable que se rompa en algún momento (si aún no lo ha hecho) porque es mucho más complicado que este.
Westcroft_to_Apse
Esto no funcionó para mí. Después de ejecutar el primer comando anterior, ejecuté el segundo y recibí este mensaje:file.midi: No such file or directory
user65526
5

Puede usar VLC con una interfaz CLI no interactiva con -I dummy:

/Applications/VLC.app/Contents/MacOS/VLC -I dummy file.mid vlc://quit

Para habilitar el soporte midi, vaya a Preferencias> Mostrar todo> Entrada / Códecs> Códecs de audio> Fluid Synth y configure la fuente de sonido en un archivo como FluidSynth soundfont de http://www.schristiancollins.com/generaluser.php .

Editar: el soporte midi se eliminó de la versión reciente de VLC. Todavía puede usar fluidsynth desde el shell como lo describe TJ Luoma:

brew install fluidsynth
wget http://www.schristiancollins.com/soundfonts/GeneralUser_GS_1.44-FluidSynth.zip
unzip GeneralUser_GS_1.44-FluidSynth.zip
mkdir -p /usr/local/share/fluidsynth
mv GeneralUser\ GS\ 1.44\ FluidSynth/GeneralUser\ GS\ FluidSynth\ v1.44.sf2 /usr/local/share/fluidsynth
fluidsynth -i /usr/local/share/fluidsynth/GeneralUser\ GS\ FluidSynth\ v1.44.sf2 file.mid
Lri
fuente
1
¡Trabajos! Sin embargo, VLC, siendo el súper reproductor completo, tiene un retraso de inicio muy notable antes de que comience la reproducción, lo que mi solución de Windows al problema, una aplicación súper pequeña llamada playsmf.exe no tenía. Eso no mata a VLC para mi propósito, pero tener algo más pequeño aún sería bueno. Esperaré unos días para ver si aparece otra respuesta; si no, aceptaré el tuyo. Por cierto: vlc: // quit debe agregarse a los argumentos para salir de VLC y permitir que mi script se reanude.
DCS
Vea mi actualización anterior: ¡maldición, esto solía funcionar bien!
DCS
¿Es posible usar una versión anterior de vlc?
wrossmck
@RossMcKinley: Aunque técnicamente es posible, esto no es lo que quiero hacer. El software se actualiza por una razón, y quiero que un programa pesado como VLC esté actualizado en mi sistema. Esto sería diferente si solo fuera una mini herramienta de 100 kb, pero VLC no es así.
DCS
1

Según esta publicación en los foros de VLC, Felix Paul Kuehne , el administrador del sitio, dijo

Hola, aparentemente, FluidSynth se perdió en el proceso de compilación de la última actualización. ¡Tenga la seguridad de que volverá en 2.1.2 muy pronto!

Entonces, por ahora, descienda a vlc 2.0.9 o espere vlc 2.1.2. De esta manera, su solución existente funcionará como solía hacerlo.

wrossmck
fuente
Desafortunadamente, esto no funciona a partir de VLC 2.2.1 (noviembre de 2015)
Jess Riedel el
1

No es exactamente la respuesta, pero hay una pequeña aplicación que puede enviar datos midi en la línea de comandos de Mac OS X. También puede controlar funciones básicas de GarageBand: http://www.bibiko.de/music/MIDImyAPP/

usuario72160
fuente
oye, gracias, eso es exactamente lo que estaba buscando, por qué estaba escaneando publicaciones en midi en stackexchange
olvidéstackxpassword
0

Para hacer las cosas más convenientes, puede resumir la respuesta de TJ Luoma en una aplicación AppleScript:

on open inputFile
    tell application "Terminal"
        do script "fluidsynth -i /usr/local/share/fluidsynth/generaluser.v.1.44.sf2 " & (quoted form of POSIX path of inputFile as string)
        activate
    end tell
end open

Luego puede seleccionar Obtener información en un archivo .mid aleatorio, cambiar "Abrir con:" a la aplicación AppleScript y presionar "Cambiar todo ..." para que sea la forma predeterminada de abrir archivos .mid. Ahora, cuando hace doble clic en un archivo MIDI, se abrirá la ventana Terminal y se reproducirá automáticamente.

usuario3932000
fuente
Por supuesto, esto es útil para algunas personas puede que en general, pero el op estaba preguntando por un soution de línea de comandos;)
forgotstackxpassword
¡Uy, lo siento, leí mal la pregunta!
user3932000