Wie kann ich eine Midi-Datei vom Terminal abspielen?

29

Ich suche eine sehr einfache Befehlszeilen-App (oder ein On-Board-Tool für Mavericks, das mir nicht bekannt ist), um eine MIDI-Datei vom Terminal abzuspielen. So einfach wie möglich play myfile.mid.

Kontext: Ich spiele mit Midi in Python herum und brauche etwas, das ich aus einem Skript heraus starten kann. Keine GUI, keine Fenster, nur Wiedergabe. Es muss vom Python-Skript aus aufrufbar sein, um akzeptiert zu werden, aber alles, was im Terminal funktioniert, sollte möglich sein.

DCS
quelle

Antworten:

36

Dies stellte sich als ein komplizierteres Problem heraus, als ich ursprünglich erwartet hatte.

QuickTime X kann keine MIDI-Dateien abspielen, QuickTime 7 jedoch.

Soweit ich das beurteilen kann, gibt es keine "eingebaute" Lösung, um MIDI-Dateien unter Mac OS X abzuspielen ( afplayfunktioniert beispielsweise nicht). Daher glaube ich, dass jede Lösung das Herunterladen und Installieren eines anderen Programms beinhalten wird.

Option Nr. 1: Laden Sie QuickTime 7 herunter und installieren Sie es, das auf Mavericks weiterhin einwandfrei funktioniert. Anschließend können Sie Midi-Dateien wie folgt abspielen:

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

jedoch wird , dass nur automatisch abgespielt , wenn der Benutzer diese Einstellung aktiviert ist, was ich glaube , ist aus der Standardeinstellung.

Option 2: Verwenden Sie FluidSynth

Um es zu installieren, müssen Sie entweder Fink, MacPorts oder (meine Empfehlung) Homebrew verwenden. Sobald Homebrew installiert ist, geben Sie dies im Terminal ein:

brew install fluidsynth

(Der Befehl von MacPorts wäre sudo port install fluidsynthund der von Fink wäre fink install fluidsynth.)

Durch das Herunterladen fluidsynthgelangen Sie jedoch nur teilweise dorthin. Dann brauchen Sie eine "SoundFont" -Datei, von der ich noch nie gehört hatte. Es gibt Informationen über sie hier

Ich habe einen kostenlosen "GeneralUser" von S. Christian Collins heruntergeladen . Die aktuelle Version (Stand 27.11.2013) ist FluidSynth Version 1.44 . {Wenn dieser direkte Link in Zukunft nicht mehr funktioniert, verwenden Sie den vorherigen Link, der Sie zur regulären Webseite für GeneralUser führt.}

Sobald Sie das heruntergeladen und entpackt haben, werden Sie eine Reihe von Dateien haben, einschließlich "GeneralUser GS FluidSynth v1.44.sf2" (offensichtlich kann sich der Name in Zukunft ändern). Ich habe diese Datei umbenannt und in verschoben /usr/local/share/fluidsynth/generaluser.v.1.44.sf2.

Sobald die SoundFont-Datei gespeichert und fluidsynthinstalliert ist, können Sie mit dem folgenden Befehl ein Midi abspielen:

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

nb Es gibt einige (scheinbar harmlose) Fehlermeldungen, die angezeigt werden, wenn Sie das tun. Wenn Sie sie unterdrücken möchten, verwenden Sie:

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

stattdessen.

Offensichtlich werde ich mich nie an all das erinnern, also habe ich eine zshFunktion namens erstelltplaymidi

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  
}

(Das sollte auch funktionieren, bashglaube ich.)

Jetzt muss ich nur noch Folgendes eingeben:

playmidi example.mid 

und example.midwird spielen.

TJ Luoma
quelle
StackExchange von seiner besten Seite! Obwohl die fluidsynth-Option weitaus hackender ist, als ich annehmen wollte (nicht jeder hat Brew installiert ...), funktioniert sie wirklich gut und wird schneller im Skript gestartet als VLC. Also werde ich ein oder zwei Tage warten, wenn eine lächerlich einfache Alternativlösung auftaucht, aber wenn nicht, liegt das Kopfgeld bei Ihnen. Übrigens taucht Fluid-Synth für mich in /usr/local/Cellar/fluid-synth/1.1.6 auf. (Ich mag die alte Version der Quicktime-Lösung nicht, man weiß nie, wie lange es funktionieren wird).
DCS
Ja, ich bin damit einverstanden, dass "Homebrew | MacPorts | Fink verwenden" kein Ideal ist, aber a) jeder, der viel Zeit mit der Befehlszeile verbringt, wird sich mehr wünschen als das, was Apple bieten kann / kann und b) Da es keine integrierte Lösung gab, schien es hier eine vernünftige zu sein. Ich stimme zu, dass QuickTime7 länger überlebt hat, als ich erwartet hatte, aber OTOH Ich kann nicht glauben, dass "QuickTime X" immer noch nichts kann, was QuickTime 7 könnte. (Macht mir Angst vor der Zukunft von iWork, aber das ist eine weitere Diskussion für einen anderen Thread an einem anderen Tag :-)
TJ Luoma
Die jüngste Version von iWorks ist im Vergleich zur letzten Version verkrüppelt ... Ich warte nur darauf, dass Terminal verschwindet. Aber genug, sonst werden wir zum Geschwätz verprügelt.
DCS
@DCS Wir werden keine informierten Beschwerden einreichen. Im schlimmsten Fall bitten wir sie, in einem Chatroom zu laichen oder einen neuen Thread zu eröffnen, wenn dies gerechtfertigt ist. Außerdem habe ich einige Details aus Ihrem Beitrag bearbeitet. Bitte geben Sie diese Informationen als Antwort ein oder bearbeiten Sie eine der Antworten, wenn diese Informationen mit ihnen übereinstimmen.
bmike
Ich habe es mit Yosemite versucht und konnte es nicht zum Laufen bringen. Ich habe sogar Mac-Ports deinstalliert und neu installiert. Fehler: fluidsynth: Warnung: Keine Voreinstellung auf Kanal 9 gefunden [bank = 128 prog = 56] konnte externe Client-Anforderungen nicht verarbeiten. Jack Main fing Signal 31.
Robert Wasmann
35

Das hat bei mir funktioniert:

$ Brew installieren Schüchternheit
$ timidity file.midi
lyderisch
quelle
Arbeitete auch für mich - und es ist eine Menge weniger Ärger als die Antwort mit Fluidsynth.
Glenra
1
Beste Antwort hier. Die fluidsynth-Antwort ist wirklich clever, aber sie kann irgendwann kaputt gehen (falls noch nicht geschehen), weil sie so viel komplizierter ist als diese.
Westcroft_to_Apse
Das hat bei mir nicht funktioniert. Nachdem ich den ersten Befehl oben ausgeführt habe, habe ich den zweiten ausgeführt und die folgende Meldung erhalten:file.midi: No such file or directory
user65526
5

Sie können VLC mit einer nicht interaktiven CLI-Schnittstelle verwenden mit -I dummy:

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

Um die MIDI-Unterstützung zu aktivieren, gehen Sie zu Preferences> Show All> Input / Codecs> Audio-Codecs> Fluid Synth und stellen Sie den Soundfont auf eine Datei wie den FluidSynth-Soundfont unter http://www.schristiancollins.com/generaluser.php ein .

Edit: MIDI-Unterstützung wurde aus der aktuellen Version von VLC entfernt. Sie können immer noch Fluidsynth aus der Shell verwenden, wie von TJ Luoma beschrieben:

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
quelle
1
Funktioniert! Da es sich bei VLC jedoch um einen ausgewachsenen Superplayer handelt, ist eine gewisse Startverzögerung zu verzeichnen, bevor die Wiedergabe startet. Dies hat meine Windows-Lösung für das Problem, eine superkleine App namens playsmf.exe, nicht. Das tötet VLC nicht für meinen Zweck, aber etwas Kleineres zu haben wäre trotzdem schön. Ich werde ein paar Tage warten, um zu sehen, ob eine andere Antwort auftaucht. wenn nicht, nehme ich deins an. BTW: vlc: // quit muss zu den Argumenten hinzugefügt werden, damit VLC beendet und mein Skript fortgesetzt werden kann.
DCS
Siehe mein Update oben - verdammt, das hat früher gut funktioniert!
DCS
ist es möglich eine alte version von vlc zu benutzen?
Wrossmck
@ RossMcKinley: Obwohl technisch möglich, ist dies sicherlich nicht das, was ich tun möchte. Die Software wird aus einem bestimmten Grund aktualisiert, und ich möchte, dass ein schweres Programm wie VLC auf meinem System auf dem neuesten Stand ist. Dies wäre anders, wenn es nur ein 100-KB-Mini-Tool wäre, aber VLC ist nicht so.
DCS
1

Laut diesem Beitrag in den VLC-eigenen Foren sagte Felix Paul Kühne , der Site-Administrator

Hallo, anscheinend ist FluidSynth beim Kompilieren des letzten Updates verloren gegangen. Seien Sie versichert, dass es sehr bald wieder in 2.1.2 sein wird!

Also erstmal entweder auf vlc 2.0.9 downgraden oder auf vlc 2.1.2 warten. Auf diese Weise funktioniert Ihre vorhandene Lösung wie früher.

Wrossmck
quelle
Leider funktioniert dies nicht ab VLC 2.2.1 (Nov 2015)
Jess Riedel
1

Nicht genau die Antwort, aber es gibt eine kleine App, die MIDI-Daten über die Mac OS X-Befehlszeile senden kann. Es kann auch grundlegende GarageBand-Funktionen steuern: http://www.bibiko.de/music/MIDImyAPP/

user72160
quelle
Hey, danke, das ist genau das, wonach ich gesucht habe, warum ich Beiträge auf Midi bei StackExchange
überflogen
0

Zur Vereinfachung können Sie die Antwort von TJ Luoma in einer AppleScript-App zusammenfassen:

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

Sie können dann Informationen zu einer zufälligen .mid-Datei abrufen auswählen, "Öffnen mit:" in die AppleScript-App ändern und "Alle ändern ..." drücken, um diese als Standardmethode zum Öffnen von .mid-Dateien festzulegen. Wenn Sie nun auf eine MIDI-Datei doppelklicken, wird das Terminal-Fenster geöffnet und automatisch wiedergegeben.

user3932000
quelle
Natürlich ist das vielleicht für einige Leute im Allgemeinen hilfreich, aber der OP fragte nach einer Kommandozeilen-Lösung;)
forgotstackxpassword
Ups tut mir leid, die Frage falsch verstanden!
user3932000