Deutschsprachiges LilyPond-Forum

LilyPond und andere Programme => MIDI => Thema gestartet von: Phonon am Mittwoch, 29. Dezember 2021, 11:57

Titel: Midi Mapping
Beitrag von: Phonon am Mittwoch, 29. Dezember 2021, 11:57
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
Titel: Antw:Midi Mapping
Beitrag von: Arnold am Freitag, 3. März 2023, 14:23
Hallo Stephan,

ich sehe zwei »einfache« Möglichkeiten:

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

Arnold
Titel: Antw:Midi Mapping
Beitrag von: Arnold am Sonntag, 5. März 2023, 13:09
So, jetzt die Details in Lilypond.


Ich habe hier zwei SCHEME-Prozeduren definiert:
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 midi-drumpitch_midi.pdf.
\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.