Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: rJazz am Sonntag, 6. September 2015, 21:28
-
Hallo,
ich möchte gern Bigband-Arrangements mit Lilypond schreiben.
Es wäre dafür nützlich, Midi-Channels für Voices festzulegen.
Gefunden habe ich dies als Midi-Konfiguration:
\midi {
\context {
\Staff
\remove "Staff_performer"
}
\context {
\Voice
\consists "Staff_performer"
}
\tempo 4 = 115
}
für Voices, die z.B. so definiert sind:
trumpet = \new Voice \relative c' {
\key bes \major
\set midiInstrument = #"Trumpet"
\voiceOne
r1 -"trumpet"
r2~r4.
<c c c' c>8
}
Das funktionerit, es werden aber nur Midi-Instrumente gesetzt,
und manchmal (so mein Eindruck) nicht
auf die richtigen GM-Instrumente, auch wenn
der GM-Modus am externen MIDI-Gerät aktiviert ist.
Ich würde daher gern mit Lilypond einfach verschiedene (feste)Midi-Kanäle für die Voices
vergeben, statt Midi-Instrumente.
Ist das irgendwie möglich?
Danke für jede Hilfe!
Ralf
-
Ich habe so gut wie überhaupt keine Ahnung von MIDI und LilyPonds Umgang damit (und weiß z. B. schon nicht, was GM ist …). Aber da ich nicht weiß, wo du deine Information her hast und ob du die Dokumentation so weit kennst, verweise ich mal auf das Snippet am Ende dieses Abschnittes (http://www.lilypond.org/doc/v2.19/Documentation/notation/creating-midi-files#creating-midi-files), vielleicht hilft dir das ja schon weiter.
Das einzige Problem, was ich mal mit MIDI hatte (was auch zu falschen Instrumentenzuordnungen geführt hat): Es gibt ja nur 16 Kanäle (bzw. LilyPond kann nur 16); wenn man jetzt mehr Stimmen hat, werden die Noten vom 17. Kanal in den 1. mit reingestopft, ohne das Instrument zu ändern, die vom 18. in den 2. usw. Wenn du also jetzt von einer Standard-Bigband-Besetzung redest, gehts ja schon um 13 Bläser + Klavier + Gitarre + Drumset + Bass, du bist also schon knapp über 16 und der Bass würde nen Alt-Sax-Sound kriegen. Und größere Besetzungen gibts ja auch noch.
Falls das wirklich das Problem ist, würde ich zwei \score-Blöcke anlegen: Einer für die Partitur und einer nur mit einem \midi-Block, da kannst du dann Sachen schreiben wie\new Staff \with { midiInstrument = "trumpet " } <<
\trumpetI \trumpetII \trumpetIII \trumpetIV
>>Damit wird für alle Trompeten zusammen nur ein einziger Kanal verbraucht.
Vielleicht weißt du das alles schon, aber vielleicht ist ja auch was hilfreiches dabei ;)
Edit: Willkommen im Forum! Bitte gib bei deinen Beiträgen nach Möglichkeit immer deine LilyPond-Version an und zeig mit einem kompilierbaren (Minimal-/möglichst kleinen)Beispielcode dein Problem. Dann müssen potenzielle Helfer weniger raten/selber Code zusammenbauen. In diesem Fall ist das noch nicht so tragisch, aber vielleicht würde ein Beispiel ja schon die Vermutung mit den >16 Kanälen bestätigen oder irgendwas anderes würde Leuten auffallen, die sich mit MIDI besser auskennen als ich ;)
-
Danke. Du hast das schön beschreiben: die Zuordnung der Midi-Kanäle ist genau der Punkt!
Lass mich Dein Beispiel mal erweitern:
staffI = \new Staff \with { midiInstrument = "trumpet " } <<
\trumpetI \trumpetII \trumpetIII \trumpetIV
>>
staffII = \new Staff \with { midiInstrument = "altosax " } <<
\altoI \altoII
>>
staffIII = \new Staff \with { midiInstrument = "trombone" } <<
\tromboneI \tromboneII
>>
Dann möchte ich das einmal so abspielen:
\score {
<<
\staffI
\staffII
\staffIII
>>
Das würde funktionieren, wenn ich an meinem MIDI-Synth.
die Program-Change-Befehle ausstelle und
Trompeten auf Kanal 1, Alt-Sax auf Kanal 2
und Posaunen auf Kanal 3 fest einstelle.
Wenn ich mir das jetzt aber mal ohne
Saxophone anhören will:
\score {
<<
\staffI
\staffIII
>>
gibt es aber ein Problem, weil nun StaffIII
auf Kanal 2 landet und damit statt Posaunen
wieder Saxophone zu hören sind.
Es wäre also wünschenswert, die Midi-Kanäle
den Staffs (oder noch besser den Voices) fest
zuzuordnen.
Die Frage wäre also, wie das geht.
-
Ok, das erklärt dein Problem schon etwas besser ;)
Es gab mal einen feature request (https://code.google.com/p/lilypond/issues/detail?id=2278), sieht aber nicht so aus, als wär was draus geworden (ich hab allerdings jetzt nicht die ganze Diskussion durchgelesen). Vor ein paar Jahren hat jemand eine Lösung gefunden und auf der englischen Liste gepostet (http://lists.gnu.org/archive/html/lilypond-devel/2011-06/msg00809.html). Dafür muss allerdings der C++-Code bearbeitet und LilyPond neu kompiliert werden. Gleichzeitig sieht aber der Code so aus, als wäre eine Lösung in Scheme nicht möglich, für den Otto-Normal-Verbraucher (d. h. per Scheme) ist die Channelverteilung anscheinend nicht zugänglich.
Ich bin jetzt weg für eine Woche, aber im Contributors Guide (http://lilypond.org/doc/v2.19/Documentation/contributor-big-page.html) findest du eine Anleitung zum Kompilieren von LilyPond und hier und auf der englischen Mailingliste (https://lists.gnu.org/mailman/listinfo/lilypond-user) gibt es auch andere Leute, die dir damit garantiert helfen können.
-
Oh, das ist klasse!
Ich werde das in jedem Fall ausprobieren, lilypond selbst zu kompilieren,
wenn das damit klappt, wäre es toll.
Danke für die Hilfe!
-
hallo,
wenn ich richtig verstehe, kannst du nicht
\score {<<
\staffI
% \staffII
\staffIII
>>}..das zweite System einfach auskommentieren, weil dann das darauffolgende System den MIDI-Channel der zweiten erhalten würde. Offenbar zählt Lilypond die Staffs und vergibt die MIDI-Channels der Reihe nach.
Abgesehen davon, dass es Lilypond sicher besser zu Gesicht stände, wenn man Kanal (und Programmwechsel) ausdrücklich codieren könnte (beispielsweise sowas wie \new Staff \with { \midichannel = 1}), kannst du dir doch vielleicht einfach so helfen, dass du dir einen Staff namens \MUTE anlegst, der nur einen einzigen superkurzen, superleisen Ton und supertiefen Ton in Takt 10000 enthält. Und statt oben \staffII auszukommentieren, ersetzt du ihn durch diesen \MUTE. Würde so ein Workaround nicht funktionieren?
--ingmar
-
Das habe ich auch schon mal probiert.
Das Problem ist aber anscheinend, dass die Kanäle doch nicht einfach nur aufsteigend vergeben werden.
Es scheint auch was damit zu tun zu haben, ob midiInstrument für voices gesetzt ist
und vielleicht auch noch von weiteren Faktoren.
Ich probiere das alles mit Frescobaldi, vielleicht überlagert das auch nochmal die Midi-Outputs.
Bei Recherchieren habe ich gesehen, dass es auch Variablen
midichannel und midiChannelMapping gibt:
http://www.lilypond.org/doc/v2.19/Documentation/notation/midi-channel-mapping
Wie die allerdings zu verwenden sind, habe ich noch nicht verstanden.
-
Hallo rJazz,
auch von mir ein willkommen im Forum :)
Ich habe gerade deine Frage gelesen und sehe, du bist dank der hilfreichen Kommentare von fugenkomponist und ingmar ziemlich dicht am Ziel.
Was ich noch nicht verstanden habe ist, wieso du meinst, du müsstest Program-Change-Befehle ausstellen. Wenn du einem Staff ein midiInstrument = "trumpet" mit gibst, dann erzeugt LP die notwendigen Program-Change-Befehle und gibt sie in die Ausgabedatei aus (habe es jetzt aktuell nicht überprüft, hatte es aber vor einigen Monaten im Rahmen eines damals aufgekommenen MIDI Schnipsel Problems gesehen).
Im übrigen kennt LP kein GM und schon gar nicht irgendwelche Erweiterungen von GM. Auch SYSEX Befehle kannst du getrost vergessen.
Und ja, MIDI erlaubt exakt 16 Kanäle und keinen mehr. Alle Setups, die mehr Kanäle verwenden, verwenden mehrere MIDI Geräte (von denen jedes max. 16 Kanäle hat; SYSEX Spielereien mal außen vor gelassen). M.W existiert in LP keine Infrastruktur zur Verwaltung mehrerer MIDI Geräte.
Wenn die Verwaltung von vielen MIDI Kanälen für dich relevant ist, dann empfehle ich unter Linux Rosegarden. Auf dem Mac ist IMO Logic die erste Wahl. Unter Windows habe ich seit Ewigkeiten nicht mehr mit MIDI gearbeitet, aber Cubase (einschließlich der diversen Light Versionen, die quasi überall dazu gepackt werden) sollte hier alles können, was du brauchst. Es gibt sicher noch diverse andere Programme, die ich aber nie (ernsthaft) verwendet habe.
Der Partitur Assistent von Frescobaldi erzeugt eine recht clevere Infrastruktur, um für alle Einzelstimmen separate Übedateien zu generieren. Seit ich den kenne, rufe ich zu diesem Zweck nur noch in seltenen komplexen Fällen Logic auf.
Ich bin nicht sicher, ob dir meine Kommentare wirklich weiterhelfen, aber vllt erhellen sie die eine oder andere bisher unklare Ecke ;)
Liebe Grüße,
Michael
-
LP erzeugt zwar PC-Befehle. ich habe aber im externen Synthesizer keine GM-Instrumente eingestellt, sondern eigene,
feste Sounds (z.B. Kanal 1 = Alto, Kanal 2 = Tenor-Sax, Kanal 3 = Trumpets).
Die entsprechen nicht de GM-Sounds und reagieren auch nicht korrekt auf die Program-Change-Befehle.
Deshalb habe ich an dem Keyboard auch den MIDI-Filter auf Ignorieren der Program-Change-Befehle gesetzt.
Ideal wäre daher, wenn ich für jede Staff den Kanal fest vorgeben könnte. Dann wäre es egal,
welche Staffs ich gearde aktivert habe, sie würde über den festen Kanal imemr auf dem richtigen Instrument landen.
Dann bräuchte ich nicht mehr in ein anderes Sequenzer-Programm beim Komponieren
(ich will ja auch nicht immer MIDI-Dateien hin-und her importieren/exportieren, sondern gleich
abhören können, was ich in lilypond schreibe: ich finde das schreiben in lilypond sehr angenehm,
deswegen will icn nicht unbedingt erst in einem anderen Sequenzer anfangen).
-
Habe heute auch probiert, lilypond vom source zu übersetzen.
Das ist allerdings alles andere als einfach.
Am Ende (nach 10 Minuten Übersetzung) kommt eine Fehlermeldung:
No rule to make target `../flower/./out/library.a', needed by `out/lilypond'. Stop.
make[1]: Leaving directory `/home/lxuser/Dokumente/lilypond/lilypond-2.18.2/build/lily'
make: *** [install] Fehler 2
-
Habe es nochmal probiert.
Eigentlich gibt es schon im ersten Schritt Probleme:
./autogen.sh --noconfigure
gibt eine Fehlemeldung:
processing .
Running autoconf ...
./autogen.sh: 17: ./autogen.sh: autoconf: not found
-
Beim dritten Versuch hat das Compilieren anscheinend geklappt
(das Zauberwort unter ubuntu ist ja "sudo" vor jedem Befehl, das
hat erst gefehlt).
Das :
http://lists.gnu.org/archive/html/lilypond-devel/2011-06/msg00809.html
klappt aber noch nicht.
Wenn ich das eingebe:
staffBass = \new Staff {
\set midiChannel = 3
\clef "bass"
<<
\cbass
>>
}
kriege ich eine Fehlermeldung:
warning: cannot find property type-check for `midiChannel' (translation-type?). perhaps a typing error?
warning: skipping assignment
Insofern wird der code aus dem Link wohl gar nicht ausgeführt.
-
Noch eine gute Nachricht:
nachdem ich die Variable in
define-context-properties.scm
auch noch definiert habe,
wird sie erkannt und vewendet!
WOW!!!
Allerdings sollten alle midiInstrument-Definitionen
entfernt werden, sonst gibt es Durcheinanender.
-
Hallo rJazz,
sudo als Zauberwort zu bezeichnen und es dann vor jeden Befehl zu setzen ist ein krasser Missbrauch der diversen Schutzmechanismen. Zum Bilden eines Programms gehört es definitiv überhaupt gar nicht verwendet. Wenn es nötig sein sollte, dann wäre dein System völlig misskonfiguriert. Davon abgesehen bezweifle ich stark, dass sudo deine Buildprobleme ursächlich lösen kann. Aber es ist dein System und damit nicht meine Baustelle.
Ich baue mein LP regelmäßig aus der git Version selbst. Der Befehl lautet entweder./autogen.sh oder ./autogen.sh --noconfigure
./configureDu kannst auch die folgende Befehlsfolge erwägen:mkdir build
cd build
../autogen.sh --noconfigure
../configure [liste aller ev. benötigten optionen]
Speziell im ausgecheckten git bevorzuge ich die letzte Variante, aber grundsätzlich funktionieren sollten alle genannten.
Wenn das bei dir nicht der Fall ist, dann hast du vermutlich einige notwendige Packete nicht installiert oder sie heißen anders.
Davon abgesehen ist mir nicht klar, warum du LP selbst übersetzen willst...
Aber zurück zu deinem Problem:
Ich habe verstanden, du hast deinen Synth umprogrammiert. Du kannst dann sehr einfach LP dazu bringen, deine umprogrammierten Sounds so zu verwenden, wie du das möchtest. Vorab eine Klarstellung (falls dir das sowieso klar ist, ignoriere es einfach, aber ich möchte sicher sein, dass wir von den gleichen Dingen reden).
Die Angabe midiInstrument = "trumpet " bedeutet übersetzt:
"Erzeuge ein Programchange 57" (das ist trumpet in GM). Es bedeutet jedoch nicht "Stelle am Synth den Sound für Trompete ein".
Wenn du nun deinen Synth so programmiert hast, dass der gewünschte Trompetensound auf Programm 17 liegt, dann müsstest du midiInstrument = "Drawbar Organ" angeben und LP würde ein entsprechendes Programchange 17 erzeugen.
Mit anderen Worten:
Wenn dein Synth nicht GM Sounds hat, dann brauchst du lediglich "händisch" ein Mapping der GM Soundnamen auf deine Sounds vorzunehmen (bzw. umgekehrt) und die von LP erzeugten MIDI Dateien klingen auf deinem Synth so, wie du das möchtest.
Ich hoffe, ich habe mich verständlich ausgedrückt.
Der MIDI Support in LP lässt zwar sicher einige Wünsche offen, aber er ist sehr weit davon weg, nicht brauchbar zu sein.
HTH,
Michael
-
Ich hatte ja diesen Befehl eingegeben:
./autogen.sh --noconfigure
und dabei wie beschrieben gleich diese Fehlermeldung bekommen:
processing .
Running autoconf ...
./autogen.sh: 17: ./autogen.sh: autoconf: not found
Verstehe nicht, warum du die nicht kriegst (ich nehme
mal nicht an, das es was mit Rechten zu tun hat, dass er die
Datei nicht findet).
Ich habe das Archiv lilypond-2.18.2.tar.gz
von http://lilypond.org/source.de.html verwendet.
Tatsächlich ist dies das erste Programm, dass ich mit Ubuntu selbst
compiliere und bin auch kein definitiv kein Experte für die Sicherheitstechnologie.
Mir ist nicht klar, warum es ein Problem sein sollte, dieses Programm
als sudo zu übersetzen. Ich dachte eher, wenn ich ein Programm
systemweit laufen lassen will, müsste ich es ohnehin als sudo
installieren (?).
Wenn es also so problematisch ist, bin ich dankbar für einen
Hinweis, wo die Risiken liegen (sollte der Lilypond.Code potenziell
gefährlich sein?).
Ein mapping am Synth wäre prinzipielleine Alternative, allerdings habe ich bei
meinem Synth keine Möglichkeit gefunden, ein Mapping einzustellen.
Es bleibt die Feststellung, das ich lilypond als sudo compiliert
bekomme, als admin-user nicht. Die Fehlermeldung hatte ich
ja schon geschrieben.
Wenn Du weißt, was die Fehlermeldung bedeutet und wie
ich sie anders wegkriege, ohne sudo zu verwenden,
dann bin ich sehr dankbar für Hife und probiere
das gern aus.
Bezüglich fehldner Pakete habe ich mich an
dies gehalten
http://lilypond.org/doc/v2.18/Documentation/topdocs/INSTALL.html#requirements-for-compiling-lilypond
und
Ich hatte ja diesen Befehl eingegeben:
./autogen.sh --noconfigure
und dabei wie beschrieben gleich diese Fehlermeldung bekommen:
processing .
Running autoconf ...
./autogen.sh: 17: ./autogen.sh: autoconf: not found
Verstehe nicht, warum du die nicht kriegst (ich nehme
mal nicht an, das es was mit Rechten zu tun hat, dass er die
Datei nicht findet).
Tatsächlich ist dies eins der ersten Programme, dass ich mit Ubuntu
selbst compiliere und bin auch kein definitiv kein Experte für die
Linux-Sicherheitstechnologie.
Mir ist nicht klar, warum es ein Problem sein sollte, Programme
als sudo zu übersetzen. Ich dachte eher, wenn ich ein Programm
systemweit laufen lassen will, müsste ich es ohnehin als sudo
installieren.
Wenn es also so problematisch ist, bin ich dankbar für einen
Hinweis, wo die Risiken liegen (sollte der Lilypond-Code potenziell
gefährlich sein?).
Ein mapping wäre eine Alternative, allerdings habe ich bei
meinem Synth noch keine Möglichkeit dafür gefunden.
Es bleibt die Feststellung, das ich lilypond als sudo compiliert
bekomme, als admin-user nicht. Die Fehlermeldung hatte ich
ja schon geschrieben.
Wenn Du weißt, was die Fehlermeldung bedeutet und wie
ich sie anders wegkriege, ohne sudo zu mißbrauchen,
dann bin ich sehr dankbar für Hife und probiere
das gern aus.
Bezüglich fehlender Pakete habe ich mich an
dies gehalten
http://lilypond.org/doc/v2.18/Documentation/topdocs/INSTALL.html#requirements-for-compiling-lilypond
und
sudo apt-get build-dep lilypond
ausgeführt.
ich habe auch
../configure
ausgeführt wie beschrieben (um auf evtl. fehlende
Pakete zu testen), da gabe es keine Fehler,
am Fehlen von Paketen sollte es also eigentlich nicht liegen
(ich habe es ja auch fertig übersetzt bekommen, es läuft auch
problemlos daher sollten alle notwendigen Pakete vorhanden sein).
Nochmal die Fehlermeldung (beim comilieren ohne sudo):
No rule to make target `../flower/./out/library.a', needed by `out/lilypond'. Stop.
make[1]: Leaving directory `/home/lxuser/Dokumente/lilypond/lilypond-2.18.2/build/lily'
make: *** [install] Fehler 2
-
Hallo rJazz,
deine Probleme mit autogen.sh haben nicht wirklich mit LP zu tun (will sagen: das ist OT), aber hier eine kurze Einführung. Für umfangreichere Erläuterungen schlage ich ansonsten vor, das ganze mit direkten emails zu klären.
Die Fehlermeldung ./autogen.sh: 17: ./autogen.sh: autoconf: not foundist ein starkes Indiz dafür, dass auf deinem Syytem das Packet autoconf nicht installiert ist. Unter Ubuntu gibt es meines Wissens einen Packetmanager mit GUI. Einfach nach autoconf suchen und installieren, dann sollte dieses Problem verschwinden. Alle weiteren aktuellen Probleme sind ggf. Folgefehler.
Warum nicht jeder Anwender dieses Problem hat ?
Es gibt für Linux dermaßen viele mögliche SW zu installieren, dass nicht auf jedem System jede SW installiert wird. Das ist nicht zuletzt auch deshalb sinnvoll, weil mache SW sich gegenseitig behindert und deshalb nicht trivial parallel installiert werden kann. Ferner gibt es eine Vielzahl von Packeten, die für eine "normale" Nutzung nicht notwendig sind. Dazu gehören traditionell u.A. auch die Tools zur Programmentwicklung, von denen autoconf eines ist. Wer sie braucht, kann sie trivial nach installieren. Und wer nicht weiß, wie das geht, braucht diese Packete mit großer Wahrscheinlichkeit nicht ;)
Warum nicht generell jedes Programm mit sudo ausführen ?
Der Grund ist, mit sudo wird ein Programm mit root Rechten (unter Windows wäre das Administrator) ausgeführt, d.h. der Buildprozess hat vollständigen Zugriff auf alles, was es im System gibt. Wenn irgendetwas schief geht, warum auch immer, gibt es keinerlei Beschränkungen bzgl. dessen, was kaputt gemacht werden kann. Genau, wie man unter Windows nicht ständig als Administrator arbeiten sollte, sollte man das unter Linux als root tun. Alle Befehle mit sudo einzuleiten täte aber genau das.
Daher wiederhole ich hier nochmals:
Wenn es notwendig sein sollte, routinemäßige Befehle, die nicht der Administration des Systems dienen mit sudo auszuführen, dann ist das System schlecht (um nicht zu sagen falsch) konfiguriert. Das Kompilieren von Programmen ist definitiv nichts für sudo. Für weitere Details hierzu empfehle ich die Suchmaschine deiner Wahl und "sudo Sicherheit" oder auch "sudo Risiko" oder "root Risiko" o.Ä.
Ein mapping am Synth wäre prinzipielleine Alternative, allerdings habe ich bei
meinem Synth keine Möglichkeit gefunden, ein Mapping einzustellen.
Du hast mich missverstanden. Es geht nicht um ein Mapping im Synth. Es geht darum, dass du das Mapping in deiner Lilypond Source selbst vornehmen sollst. So wie du ja auch nach einer Möglichkeit suchst, feste MIDI Kanäle zuzuweisen.
Ich weiß nicht, wie ich es klarer ausdrücken soll und wiederhole daher mein Beispiel aus meinem letzten Post.
midiInstrument = "trumpet" heißt Programchange 57Wenn du für den an deinem Synth programmierten Trompetensound ein anderes Programm brauchst, dann musst du ein anderes midiInstrument auswählen. Wenn also beispielsweise dein Synth den Trompetensound auf Programm 17 hat, dann schaust du in einer GM Tabelle nach, welchen Namen Programm 17 hat und findest "Drawbar Organ". Also gibst du den BefehlmidiInstrument = "Drawbar Organ"und bekommst, wenn du das von LP erzeugte MIDI File auf deinem Synth abspiest den Trompetensound (oder was auch immer du als Programm 17 eingestellt hast).
Analog verfährst du mit allen anderen Sounds, die in deinem Synth programmiert sind und die du verwenden möchtest.
Ach ja, was deine Aussage angeht, mit sudo könntest du LP erfolgreich kompilieren:
Ohne Zugriff auf dein System kann ich das nicht prüfen. Hast du das so erzeugt lilypond binary mal laufen gelassen?
Letztlich gilt jedoch, wenn du für dich mit der Anwendung von sudo zufrieden bist, dann will ich dich nicht davon abhalten oder gar missionieren. Letztlich ist das gut, was für dich funktioniert.
Ach ja, was bisher nicht genannt wurde:
Nachdem ./configure erfolgreich durchgelaufen ist, musst du noch einmake ausführen, damit lilypond gebildet wird.
Dann folgt optional noch einsudo make install(dies ist eine der wenigen notwendigen Anwendungen von sudo), damit das selbst gebaute LP auf deinem System installiert wird.
Ich nehme an, daß das offensichtlich ist, wollte aber wieder sicher sein, daß wir vom gleichen Prozess reden.
HTH,
Michael
-
Volltreffer. Das Paket autoconf fehlte!
Damit compilert es jetzt auch ohne sudo.
Vielen Dank!