Come posso riprodurre un file MIDI dal terminale?


29

Sto cercando un'app a riga di comando molto semplice (o uno strumento integrato su Mavericks di cui non sono a conoscenza) per riprodurre un file midi dal terminale. Il più semplice possibile, qualcosa del genere play myfile.mid.

Contesto: sto giocando con Midi in Python e ho bisogno di qualcosa che posso lanciare da una sceneggiatura. Nessuna interfaccia grafica, nessuna finestra, solo riproduzione. Deve essere richiamabile dallo script Python per essere accettato, ma dovrebbe essere qualsiasi cosa funzioni nel terminale.

Risposte:


36

Questo si è rivelato essere un problema più complicato di quanto mi aspettassi inizialmente.

QuickTime X non può riprodurre file MIDI, anche se QuickTime 7 potrebbe farlo.

Per quanto ne so, ciò significa che non esiste una soluzione "integrata" per la riproduzione di file MIDI su Mac OS X (ad esempio, afplaynon funziona). Pertanto, credo che qualsiasi soluzione comporterà il download e l'installazione di altri programmi.

Opzione n. 1: scarica e installa QuickTime 7 che funziona ancora bene su Mavericks, quindi puoi riprodurre file midi:

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

tuttavia, questo verrà riprodotto automaticamente solo se l'utente ha abilitato quella preferenza, che credo sia disattivata per impostazione predefinita.

Opzione 2: utilizzare FluidSynth

Per installarlo, devi utilizzare Fink, MacPorts o (il mio consiglio) Homebrew. Una volta installato Homebrew, digita questo nel Terminale:

brew install fluidsynth

(Il comando di MacPorts sarebbe sudo port install fluidsynthe quello di Fink sarebbe fink install fluidsynth.)

Tuttavia, il download fluidsynthti porta solo parzialmente. Quindi hai bisogno di un file "SoundFont", di cui non avevo mai sentito parlare prima. Ci sono informazioni su di loro qui

Ne ho scaricato uno da S. Christian Collins chiamato "GeneralUser" che è gratuito. La versione corrente (dal 27-11-2013) è la versione 1.44 di FluidSynth . {Se il collegamento diretto si interrompe in futuro, utilizza il collegamento precedente che ti porterà alla normale pagina Web per GeneralUser.}

Una volta scaricato e decompresso, avrai una serie di file tra cui "GeneralUser GS FluidSynth v1.44.sf2" (ovviamente il nome potrebbe cambiare in futuro). Ho rinominato quel file e lo ho spostato in /usr/local/share/fluidsynth/generaluser.v.1.44.sf2.

Una volta che il file SoundFont è posizionato e fluidsynthinstallato, è possibile riprodurre un midi utilizzando questo comando:

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

nb Ci sono alcuni messaggi di errore (apparentemente innocui) che vengono visualizzati quando lo fai. Se vuoi sopprimerli usa:

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

anziché.

Ovviamente non lo ricorderò mai, quindi ho zshchiamato una funzioneplaymidi

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  
}

( Credo che dovrebbe funzionare bashanche per quello.)

Ora tutto ciò che devo fare è digitare:

playmidi example.mid 

e example.midgiocherà.


StackExchange al suo meglio! Mentre l'opzione fluidsynth è molto più hacking di quanto volessi accettare (non tutti hanno installato ...) funziona davvero bene e si avvia più velocemente nello script rispetto a VLC. Quindi aspetterò un giorno o due se si presenta una soluzione alternativa ridicolmente semplice, ma in caso contrario la generosità è tua. A proposito, per me fluid-synth si presenta in /usr/local/Cellar/fluid-synth/1.1.6. (Non mi piace la vecchia versione della soluzione Quicktime, non sai mai per quanto tempo funzionerà).
DCS,

Sì, sono d'accordo sul fatto che "usa Homebrew | MacPorts | Fink" non è l'ideale, ma a) chiunque spenda un po 'di tempo usando la riga di comando si troverà a desiderare più di ciò che Apple può / fa fornire eb) mancando di una soluzione integrata, qui sembrava ragionevole. Per quanto riguarda QuickTime7, sono d'accordo, è sopravvissuto più a lungo di quanto pensassi, ma OTOH non riesco a credere che "QuickTime X" non riesca ancora a fare le cose che QuickTime 7 potrebbe fare. (Mi fa paura del futuro di iWork, ma questa è un'altra discussione per un altro thread in un altro giorno :-)
TJ Luoma,

La recente versione di iWorks in realtà è stata paralizzata rispetto all'ultima versione ... Sto solo aspettando che Terminal scompaia. Ma abbastanza, o saremo colpiti per chiacchiere.
DCS

@DCS Non risponderemo a reclami informati. Nel peggiore dei casi, chiederemo loro di spawnare in una chat room o aprire una nuova discussione se garantito. Inoltre, ho modificato alcuni dettagli dal tuo post. Inserisci tali informazioni come risposta o modifica una delle risposte se tali informazioni si adattano a esse.
bmike

Ho provato questo su Yosemite e non sono riuscito a farlo funzionare. Ho anche disinstallato e reinstallato le porte mac. Errore: fluidsynth: avviso: nessuna preimpostazione trovata sul canale 9 [bank = 128 prog = 56] non è stata in grado di gestire la richiesta del client esterno. jack main catturato segnale 31.
Robert Wasmann

35

Questo ha funzionato per me:

$ brew installa la timidezza
$ timidity file.midi

Ha funzionato anche per me - ed è MOLTO meno disturbo della risposta che coinvolge fluidsynth.
glenra,

1
La migliore risposta qui. La risposta alla fluidsynth è davvero intelligente, ma potrebbe rompersi ad un certo punto (se non lo ha già fatto) perché è molto più complicata di questa.
Westcroft_to_Apse

Questo non ha funzionato per me. Dopo aver eseguito il primo comando sopra, ho eseguito il secondo e ho ricevuto questo messaggio:file.midi: No such file or directory
user65526

5

È possibile utilizzare VLC con un'interfaccia CLI non interattiva con -I dummy:

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

Per abilitare il supporto midi, vai su Preferenze> Mostra tutto> Input / Codec> Codec audio> Fluid Synth e imposta il soundfont su un file come FluidSynth soundfont da http://www.schristiancollins.com/generaluser.php .

Modifica: il supporto midi è stato rimosso dalla versione recente di VLC. Puoi ancora usare la fluidsynth dalla shell come descritto da 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

1
Lavori! Tuttavia, VLC, essendo il super player vero e proprio, ha un notevole ritardo di avvio prima dell'inizio della riproduzione, cosa che la mia soluzione Windows al problema, un'app super piccola di nome playsmf.exe non aveva. Ciò non uccide VLC per il mio scopo, ma avere qualcosa di più piccolo sarebbe comunque bello. Aspetterò qualche giorno per vedere se compare un'altra risposta; in caso contrario, accetterò la tua. BTW: vlc: // quit deve essere aggiunto agli argomenti per uscire da VLC e consentire la ripresa del mio script.
DCS,

Vedi il mio aggiornamento sopra - dannazione, funzionava bene!
DCS,

è possibile utilizzare una vecchia versione di vlc?
wrossmck,

@RossMcKinley: anche se tecnicamente possibile, questo non è certamente quello che voglio fare. Il software viene aggiornato per un motivo e desidero che un programma pesante come VLC sia aggiornato sul mio sistema. Questo sarebbe diverso se fosse solo un mini tool da 100kb, ma VLC non è così.
DCS,

1

Secondo questo post sui forum di VLC, Felix Paul Kuehne , l'amministratore del sito, ha dichiarato

Ciao, apparentemente, FluidSynth si è perso nel processo di compilazione per l'ultimo aggiornamento. Siate certi che tornerà presto in 2.1.2!

Quindi, per ora, eseguire il downgrade a vlc 2.0.9 o attendere vlc 2.1.2. In questo modo, la soluzione esistente funzionerà come una volta.


Sfortunatamente, questo non funziona a partire dal VLC 2.2.1 (novembre 2015)
Jess Riedel,

1

Non esattamente la risposta, ma esiste una piccola app in grado di inviare dati midi dalla riga di comando di Mac OS X. Può anche controllare le funzioni di base di GarageBand: http://www.bibiko.de/music/MIDImyAPP/


ehi grazie che è esattamente quello che stavo cercando, perché stavo scremando post su midi su stackexchange
forgotstackxpassword

0

Per rendere le cose più convenienti, puoi racchiudere la risposta di TJ Luoma in un'app 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

È quindi possibile selezionare Ottieni informazioni su un file .mid casuale, cambiare "Apri con:" nell'app AppleScript e premere "Cambia tutto ..." per renderlo il modo predefinito di aprire i file .mid. Ora quando fai doppio clic su un file MIDI, si aprirà la finestra Terminale e la riprodurrà automaticamente.


ovviamente, questo è utile forse per alcune persone in generale, ma l'operazione stava chiedendo una soluzione da riga di comando;)
forgotstackxpassword

Spiacenti, ho letto male la domanda!
user3932000,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.