Midi Mapping

Begonnen von Phonon, Mittwoch, 29. Dezember 2021, 11:57

« vorheriges - nächstes »

Phonon

Liebe mates,

ich bin ein totaler rookie was lilypond betrifft und hab das folgende Problem:

ich nutze hydrogen unter Linux als midi server und nutze diesen dann unter lilypond um
Schlagzeug Noten abzuspielen -- was rein technisch auch schon klappt. Ich hab aber das
Problem, dass gewisse Drums nicht richtig gemapped sind (heisst z.B. ein high tom nicht
auch auf high tom mapped sondern zu snare). Hat einer Erfahrung in dieser Kombination
(Hydrogen/Lilypond) und kann mir sagen, wie ich Instrumente richtig mappe. Ich will die
standard notationen fuer snare etc einfach weiterverwenden, wenn moeglich.

Vielen herzlichen Dank fuer die Hilfe und liebe Gruesse,
Stephan

Arnold

Hallo Stephan,

ich sehe zwei »einfache« Möglichkeiten:
  • Einen »Nachbrenner« über die erstellte MIDI-Datei laufen lassen. Habe ich für einen anderen Zweck (und eine andere Aufgabenstellung) mir in C programmiert. Der stellt bei der Wahl von bestimmten MIDI-Instrumenten (die Namensliste im Lilypond habe ich erweitert) eine alternative Tonbank-Auswahl voran - und bei einem Instrument mußte ich die Töne um eine Oktave nach unten transponieren. Bei Dir wäre es dann ein »unregelmäßiges 'Transponieren' (gemäß einer Tabelle) für den Kanal 9 (ab 0 gezählt)«
  • Die zugeordneten Percussion-Pseudo-Pitches im Lilypond umdefinieren. Da muß ich aber erst noch nachsehen, ob das einfach mit SCHEME als benutzerspezifisches Zubehör zu realisieren ist, oder ob da eine LY- oder SCM-Datei der Lilypond-Installation abgeändert werden muß, oder ob da sogar eine CC-Datei geändert werden muß und dann das ganze Lilypond neu übersetzt werden muß.

Du nutzt Linux? Da sollte das Übersetzen eines C-Programms kein Problem sein.

Arnold

Arnold

So, jetzt die Details in Lilypond.

  • In »ly/drumpitch-init.ly« (Installationpfad) ist die 'alist' »midiDrumPitches« definiert.
  • Dort im Installationspfad abgeändert kommt das in der MIDI-Datei an. Damit hat man seine Lilypond-Installation abgeändert und muß dies bei jeder neuen Version wieder anpassen.
  • In der LY-Datei direkt abgeändert, muß aber erst noch der »Hash« im StaffPerformer (also normalerweise im Staff) erneuert werden. Wie das geht, steht in »ly/performer-init.ly«.

Ich habe hier zwei SCHEME-Prozeduren definiert:
  • mit \showMidiDrumpitches wird die Tabelle »midiDrumPitches« in der Konsole (Kommandozeilen-Kompilierung) aufgelistet.
  • mit \setMidiDrumpitch kann die dem Schlagzeugeffekt zugeordnete Tonhöhe abgeändert werden.

Im folgenden Beispiel (mit zwei Lilypond-Versionen getestet) werden drei MIDI-Tracks erzeugt. Nur im mittleren (Track # 2) werden die Pitch-Änderungen auch in die MIDI-Datei übernommen - siehe angehängte PDF-Datei Du darfst diesen Dateianhang nicht ansehen..
\version "2.22.0"
%auch version "2.25.1" % mit Guile 2.2 auf Raspberry PI

% postprocessing on a Raspberry PI:
%POSTPROCESS: midi2html -o ${BASENAME}.html ${BASENAME}.midi
%POSTPROCESS: wkhtmltopdf ${BASENAME}.html ${BASENAME}_midi.pdf
%POSTPROCESS: qpdfview --unique ${BASENAME}_midi.pdf &
%POSTPROCESS: sleep 3

showMidiDrumpitches =
#(define-void-function
   () ()
   (for-each (lambda (x)
     (for-each display (list "\n" (car x) " = " (cdr x) " = MIDI-PitchNr. "
       (+ (ly:pitch-semitones (cdr x)) 60) " "))
    ) midiDrumPitches))

setMidiDrumpitch =
#(define-void-function
   (name p) (string-or-symbol? ly:pitch?)
   (_i "Add or modify a the MIDI pitch for a single drum.")
   (assoc-set! midiDrumPitches (if (symbol? name) name (string->symbol name)) p))

\setMidiDrumpitch bassdrum bes,,
\setMidiDrumpitch snare    d'
\setMidiDrumpitch triangle bes''
\showMidiDrumpitches

Dr = \drummode { bd4 hh bd tri bd sn bd2 }

\score {
  <<
    \new DrumStaff = "Ursprung" \Dr
   
    \new DrumStaff = "re-Hash" \with {
      drumPitchTable = #(alist->hash-table midiDrumPitches)  %%% ohne dem klappt's nicht!
    } \Dr
   
    \new DrumStaff = "no re-Hash" \Dr
  >>
  \layout {}
  \midi {}
  \header { title = "midiDrumPitches" }
}

Viel Erfolg damit,

Arnold


P.S. Das Progrämmchen midi2html ist von mir (recht neu erstellt) und listet den Inhalt der MIDI-Datei in einer Tabelle mit allen MIDI-Tracks in je einer eigenen Spalte, und die MIDI-Events zeitlich synchronisiert in den Zeilen auf.