Autor Thema: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?  (Gelesen 7773 mal)

Webfox

  • Member
Hallo,

ich lasse bei der Generierung meiner Noten eine MIDI Datei erzeugen. Diese enthält dann natürlich immer alle Noten. Ist es möglich, dass Lilypond pro Takt jeweils eine MIDI Datei erzeugt?

Ich habe leider keinen Beispielcode, da ich gar keinen Ansatz habe, ob das geht und auch nichts dazu finden konnte.

fugenkomponist

  • Member
Du könntest evtl. irgendwie mit clip-regions arbeiten, siehe NR 3.4.1.

Meine Idee dazu wäre, eine Schleife zu bauen, die pro Takt einen \score mit entsprechendem \midi-Block baut.

Ok, getestet, das geht schon mal nicht. Nicht mit midi. Irgendwas mit \set Score.skipTypesetting könnte gehen, laut Dokumentation (NR 3.4.2) wirkt das auch auf midi. Das mit der Schleife könnte auch weiterhin gehen, man kann ja eine Extrastimme haben, die nur diese skipTypesetting-Befehle enthält.

Wie das aber genau aussehen könnte, dazu fehlen mir die nötigen scheme-Kenntnisse.

mgd

  • Member
Lieber Webfox,

ich habe mal in meiner Sammlung von MIDI Utilities nachgeschaut, ob es so etwas nicht fertig gibt und bin dabei darüber gestolpert, dass dein Ansinnen nicht ganz trivial ist.

Konkret stellt sich mir die Frage, wie soll mit Noten (oder besser Ereignissen) verfahren werden, die über eine "Schnittgrenze" hinausragen ?

Es gibt offensichtlich mind. 2 Lösungen:
  • Alle Ereignisse werden unverändert belassen und es wird nach Startzeitpunkt getrennt. In der Folge lassen sich die so erzeugten Schnippsel mit einer entsprechenden Mergefunktion wieder zum Original zusammenbauen. Allerdings wären so erzeugte Schnippsel u.U. zeitlich überlappend.
  • Überhängede Ereignisse werden entsprechend verkürzt und ggf. in den nachfolgenden Schnippsel entsprechend verkürzt repliziert (solange, bis das Ereignis komplett vrearbeitet ist. Diese Schnippsel wären zeitlich disjunkt, aber eine Rückführung in das Original wäre nicht simpel machbar, weil z.B. eine lang ausgehaltene Note in mehrere kürzere Noten mit gleicher Gesamtlänge zerlegt worden wäre.

Ich hoffe, obiger Text ist verständlich; ev. gibt es auch noch weitere Dinge zu beachten, die mir gerade nicht einfallen.

Was von dem (oder ggf. ganz anderes) versuchst du zu erreichen ?

Liebe Grüße,
Michael

Webfox

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #3 am: Mittwoch, 10. Juni 2015, 15:15 »
Hallo,

es geht konkret um Schlagzeugnoten. Ich habe immer max. 4 Takte pro System (Zeile) und 12 Systeme pro Seite.

Es wird eine komplette MIDI Datei geschrieben. Ich möchte erreichen, das pro Takt oder zumindest pro System eine gesonderte MIDI Datei geschrieben wird.

Hier mal ein Beispielcode:

\version "2.18.2"

%% Schlagzeugvorlage

%%#(set-default-paper-size "a4" 'landscape)

\header { tagline = ##f }

\layout {
indent = #0
line-width = #160

}

\paper {
 
fonts = #
(make-pango-font-tree
  "Calibri"
  "Calibri"
  "sans"
  (/ (* staff-height pt) 2.5))

print-page-number = ##f

%% Definition von Rändern und Abständen

#(define left-margin (* 3.5 cm))
#(define top-margin (* 1.5 cm))
#(define bottom-margin (* 1.5 cm))

  %% Abstände zwischen den Systemen & Verhindern eines weißen Randes am Seitenende
  system-system-spacing = #'((padding . 0.4) (basic-distance . 12))
  %%page-count = #10 (Seitenzahl kann erzwungen werden - optional)
  systems-per-page = #12 %% (Systeme pro Seite können erzwungen werden - optional)
  ragged-last-bottom = ##f
  ragged-bottom = ##f
 
}

\score {

\new DrumStaff
  \with {
    \consists "Parenthesis_engraver"
    instrumentName = #"1"
    \numericTimeSignature   
  }
 
  <<
  \new DrumVoice
    \with {
      \stemUp
      \override Script.direction = #UP
      \override Script.outside-staff-priority = #451
      \override TextScript.padding = 2
    }
 
    \drummode {
      \time 4/4
%---------------Hier beginnt der eigentliche Noten Code------------%

\repeat unfold 1 { sn4^"R" sn4^"L" sn4^"L" sn4^"L" }
\repeat unfold 1 { tomh4^"R" tomh4^"L" tomh4^"R" tomh4^"L" }
\repeat unfold 1 { tommh4^"R" tommh4^"L" tommh4^"L" tommh4^"L" }
\repeat unfold 1 { tomml4^"L" tomml4^"L" tomml4^"R" tomml4^"R" }

\break

\repeat unfold 4 { <hh> 8 <bd hh> 8 <hh> 8 <hh> 8 <bd hh> 8 <hh> 8 <sn hh> 8 <sn hh> 8 }
\repeat unfold 4 { <hh> 8 <hh> 8 <hh> 8 <bd hh> 8 <sn hh> 8 <sn hh> 8 <bd hh> 8 <hh> 8 }
\repeat unfold 4 { <hh> 8 <bd hh> 8 <hh> 8 <sn hh> 8 <bd hh> 8 <sn hh> 8 <hh> 8 <hh> 8 }
\repeat unfold 4 { <hh> 8 <sn hh> 8 <hh> 8 <bd hh> 8 <hh> 8 <hh> 8 <sn hh> 8 <bd hh> 8 }

\break

    }
%---------------Hier endet der eigentliche Noten Code------------%
>>

% Notendruck

\layout {}

% MIDI Erzeugung

\midi {
 
  \tempo 4 = 120
   
}
}

In diesem Muster sind meine Noten geschrieben. Optimal wäre eine MIDI Datei pro Zeile.

Gibt es dafür eine Lösung?

mgd

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #4 am: Mittwoch, 10. Juni 2015, 19:19 »
Zitat
Gibt es dafür eine Lösung?

Ich kenne keine out-of-the-box, aber man kann ev. mit geringem Aufwand eine basteln. Ich wüßte nicht, wie ich das in Lilypond mache, dafür kenne ich mich da mit den Internas zu schlecht aus. Aber ich habe eine Vorstellung, wie man die von Lilypond erzeugte MIDI Datei weiter verarbeiten könnte.

Unter Linux wäre das relativ einfach und mit Bordmitteln möglich. Unter Windows gibt es die ganzen notwendigen Tools nicht von Haus aus. Unter OSX ist die Situation diesbezüglich dazwischen - einige der Tools gibt es, andere nicht. Du bist nicht zufällig unter Linux ?

Und falls Windows oder OSX:
Hast du einen C-Compiler installiert und kannst auch damit umgehen ?
(die Frage zielt darauf ab, ein Programm in Source oder als Binary zu verteilen).

Liebe Grüße,
Michael


Webfox

  • Member
Hallo,

ich bin unter Windows unterwegs und reiner Anwender. Ich habe keinen C-Compiler installiert.

ingmar

  • Member
so ganz verstehe ich nicht, was hier dahinter steckt! Ich würde in einem solchen Fall einfach die einzelnen Takte in Variablen ablegen und zum Ausdrucken aneinander kleben, statt mir soviel Arbeit zu machen. Also:
barA =\relative c {...}
barB =\relative c {...}
...
barZ =\relative c {...}

music = { \barA \barB .. \barZ }
Ist sowas keine Lösung?

--ingmar

mgd

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #7 am: Dienstag, 16. Juni 2015, 09:42 »
Hallo ingmar,

das zu lösende Problem ist, für alle barA...barZ je eine eigene MIDI Datei zu erzeugen. Eine umständliche aber funktionierende Lösung wäre, alle barA...barZ in eigene lilypond Sourcen zu includieren. Dann hätte man z.B. 30 lilypond Dateien, die 30 MIDI Dateien (und entsprechende Layoutschnippsel) erzeugen.

Die Frage ist jetzt, gibt es innerhalb einer einzigen lilypond Datei eine Möglichkeit wie folgt skizziert:
barA =\relative c {...}
barB =\relative c {...}
...
barZ =\relative c {...}

music = { \barA \barB .. \barZ }

#(define allBars '(barA barB ... barZ))

%% define-markup-command ist als Platzhalter gemeint
#(define-markup-command (midiOut layout props l)
"Gebe jedes Element von l in eine eigene MIDI Datei aus"
  (if (null? ls)
    '()
      (let (createMIDI (car l))
       (midiOut (cdr l)))))

\midiOut allBars


So in der Art.

createMIDI erzeugt jeweils einen neuen Dateinamen und schreibt den Inhalt. Keine Ahnung, wie das zu bewerkstelligen wäre.

Liebe Grüße,
Michael

Webfox

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #8 am: Dienstag, 16. Juni 2015, 15:31 »
Hallo

vielen Dank für die neue Anregung!

Ich kann als reiner Anwender hier leider keinen hilfreichen Hinweis geben. Sinnvoll ist eine solche Variablen Lösung in der Tat nur für mich, wenn pro definierter Variable eine MIDI Datei erzeugt wird. So wie bereits von mgd beschrieben.

ingmar

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #9 am: Dienstag, 16. Juni 2015, 23:06 »
...worauf ich hinauswollte: Die MIDI-Files müssen doch nicht unbedingt alle automatisch erzeugt werden! Mach ein File wie oben beschrieben mit den Einzeltakten, die du dort auch zu einer Partitur zusammenbosselst. Diese File importierst du in 100 andere (fast) identische Minimalfiles, die alle nur ungefähr so aussehen wie unten und unter den Namen MeinMidifileA.ly bis MeinMidifileZ.ly gespeichert werden und entsprechend MeinMidifileA.mid bis MeinMidifileZ.mid erzeugen. Ja, das ist natürlich ne Viertelstunde mechanische Arbeit, aber anschließend hast du doch, was du brauchst, oder?

--ingmar

\import...
\score {
  \barA
  \midi {}
}

\import...
\score {
  \barB
  \midi {}
}

\import...
\score {
  \barZ
  \midi {}
}

harm6

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #10 am: Mittwoch, 17. Juni 2015, 00:02 »
Hallo zusammen,

1)
das Problem für einen fertigen score ein jeweils neues midi pro Takt auszugeben, halte ich von LilyPond aus für nicht durchführbar. (zumindest nicht mit vertretbarem Aufwand.)
Man kann zwar einzelne Abschnitte extrahieren, z.B. mit
http://lsr.di.unimi.it/LSR/Item?id=542
aber immer genau einen Takt auszuwählen scheitert auch hier viel zu oft.

Siehe folgendes Beispiel:
\version "2.19.21"

{
  \shiftDurations #1 #0 \times 2/3 { c'\breve \< d'1~ d' e'\breve \! }
}

Stattdessen brauch man ein tool welches midis "schneiden" kann wie einen Film.

Gibts bestimmt. Auch wenn ich keine Ahnung habe, wo sowas zu finden wäre (eigentlich interessiere ich mich nicht die Bohne für midi)

2)
ingmars rein manuelle Methode funktioniert natürlich.
Aber hier wird auch nicht ein fertiger score in Takte zerlegt, sondern die einzelnen Teile werden separat geschrieben.

3)
Wenn man aber schon einzelne Teile vordefiniert um sie erst später zusammen zu setzen, dann kann man die Sache auch etwas automatisieren.

\version "2.19.21"

%% each part in a seperate variable
mI = { c''1 }
mII = { d''1 }
mIII = { <c' e' g'>1 }

%% collected in a single expression
ml = { \mI \mII \mIII }

%% initially written as a single expression will work as well
%% note the additional {}-brackets
%ml = { { c''1 } { d''1 } { <c' e' g'>1 } }


foo =
#(define-void-function (parser location m)(ly:music?)
  (let* ((elts (ly:music-property m 'elements)))
    (if (null? elts)
        ;; do nothing if elts are empty
        #f
        (let (;; make a midi from every entry of elts
              (scores (map (lambda (e) #{ \score { $e \midi {} } #}) elts)))
          ;; return them, each as a new book
          (for-each
            (lambda (score name)
              (let* ((my-new-book
                       (ly:make-book
                         $defaultpaper
                         $defaultheader
                         score)))
                (ly:book-process
                   my-new-book
                   $defaultpaper
                   $defaultmidi
                   ;; add increasing numbers to the name
                   (format #f "part-~a" name))))
              scores
              (iota (length elts) 1 1))))))

%%%%%%%%%%%%%%%%%%%
%% EXAMPLE
%%%%%%%%%%%%%%%%%%%

\header { title = "My Title" }

%% default score
\score { \ml }

%% midis
\foo \ml


Gruß,
  Harm
« Letzte Änderung: Mittwoch, 17. Juni 2015, 01:32 von harm6 »

mgd

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #11 am: Mittwoch, 17. Juni 2015, 12:50 »
Nächste Iteration.

Ich habe versucht Harm's Funktion auf das originale Beispiel von Webfox anzuwenden. Dabei ist der folgende Code entstanden:
\version "2.19.21"

foo =
#(define-void-function (parser location m)(ly:music?)
  (let* ((elts (ly:music-property m 'elements)))
    (if (null? elts)
        ;; do nothing if elts are empty
        #f
        (let (;; make a midi from every entry of elts
              (scores (map (lambda (e) #{ \score { $e \midi {} } #}) elts)))
          ;; return them, each as a new book
          (for-each
            (lambda (score name)
              (let* ((my-new-book
                       (ly:make-book
                         $defaultpaper
                         $defaultheader
                         score)))
                (ly:book-process
                   my-new-book
                   $defaultpaper
                   $defaultmidi
                   ;; add increasing numbers to the name
                   (format #f "part-~a" name))))
              scores
              (iota (length elts) 1 1))))))


snare = { \drummode { sn4^"R" sn4^"L" sn4^"L" sn4^"L" } }
tomI = { \drummode { tomh4^"R" tomh4^"L" tomh4^"R" tomh4^"L" } }
tomII = { \drummode { tommh4^"R" tommh4^"L" tommh4^"L" tommh4^"L" } }
tomIII = { \drummode { tomml4^"L" tomml4^"L" tomml4^"R" tomml4^"R" } }

hhI = { \drummode { <hh> 8 <bd hh> 8 <hh> 8 <hh> 8 <bd hh> 8 <hh> 8 <sn hh> 8 <sn hh> 8 } }
hhII = { \drummode { <hh> 8 <hh> 8 <hh> 8 <bd hh> 8 <sn hh> 8 <sn hh> 8 <bd hh> 8 <hh> 8 } }
hhIII = { \drummode { <hh> 8 <bd hh> 8 <hh> 8 <sn hh> 8 <bd hh> 8 <sn hh> 8 <hh> 8 <hh> 8 } }
hhIV = { \drummode { <hh> 8 <sn hh> 8 <hh> 8 <bd hh> 8 <hh> 8 <hh> 8 <sn hh> 8 <bd hh> 8 } }

%partI = { \repeat unfold 1 { \snare } }
%partII = { \repeat unfold 1 { \tomI } }
%partIII = { \repeat unfold 1 { \tomII } }
%partIV = { \repeat unfold 1 { \tomIII } \break }
partI = { \snare }
partII = { \tomI }
partIII = { \tomII }
partIV = { \tomIII \break }

partV = { \repeat unfold 4 { \hhI } }
partVI = { \repeat unfold 4 { \hhII } }
partVII = { \repeat unfold 4 { \hhIII } }
partVIII = { \repeat unfold 4 { \hhIV } \break }

drumnotes = {
  \snare
  \tomI
  \tomII
  \tomIII
  \partI
  \partII
  \partIII
  \partIV

  \partV
  \partVI
  \partVII
  \partVIII
}

\score {
  \new DrumStaff <<
    \new DrumVoice
    \time 4/4
    \drumnotes
  >>

  % Notendruck
  \layout {}

  % MIDI Erzeugung
  \midi {
    \tempo 4 = 120
  }
}
%% midis
\foo \drumnotes

Es werden insgesamt 12 MIDI Dateien part-1.midi ... part-12,midi erzeugt (was ich auch erwarte, denn drumnotes enthält 12 Blöcke). Leider enthalten die ausschließlich die Header Information aber keinerlei Noten Events.

Die von Harm's Code erzeugten MIDI Dateien enthalten jedoch die erwarteten Noten Events, will sagen, i.P. funktioniert das.

Ich verstehe noch zu wenig von der internen Datenrepräsentation von Lilypond um zu wissen, ob vllt. das\drummode { ... } eine andere (clevere) Behandlung innerhalb der Funktion foo erfordert.

Irgendwelche Ideen ?

Liebe Grüße,
Michael

harm6

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #12 am: Mittwoch, 17. Juni 2015, 22:09 »
Das Problem liegt hier:

              (scores (map (lambda (e) #{ \score { $e \midi {} } #}) elts)))

Der score wird gebaut indem ich mich auf default-Setzungen verlasse.

Jedoch gibt folgendes kein sinnvolles midi:

\score {
\drummode { sn4 }
\midi {}
}

Der Context für Drums muß explizit angegeben werden sonst klappt es nicht:

foo =
#(define-void-function (parser location m)(ly:music?)

  (let* ((elts (ly:music-property m 'elements)))
;  (display-scheme-music elts)
    (if (null? elts)
        ;; do nothing if elts are empty
        #f
        (let (;; make a midi from every entry of elts
              (scores
                (map
                  (lambda (e) #{ \score { \new DrumStaff $e \midi {} } #})
                  elts)))
          ;; return them, each as a new book
          (for-each
            (lambda (score name)
              (let* ((my-new-book
                       (ly:make-book
                         $defaultpaper
                         $defaultheader
                         score)))
                (ly:book-process
                   my-new-book
                   $defaultpaper
                   $defaultmidi
                   ;; add increasing numbers to the name
                   (format #f "part-test-~a" name))))
              scores
              (iota (length elts) 1 1))))))

Diese Funktion ist so wie sie ist aber noch (stark) verbesserungsfähig ;)

Jedoch habe ich meine Zweifel, ob das jemals wirklich praktikabel wird.
Schon wenn man keine single-Staff-Musik, sondern Klaviernotation per Takt ausgeben will, wird die Eingabe doch sehr mühsam. Von einer ganzen Orchesterpartitur ganz zu schweigen.


Gruß,
  Harm

mgd

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #13 am: Freitag, 19. Juni 2015, 23:26 »
Klasse Harm :)

Du hast vollkommen recht, für eine allgemeine MIDI "Schneide-Funktion" ist noch einiges zu tun und vermutlich ist das besser extern direkt auf der MIDI Datei erledigt (auch da ist es im allgemeinen Fall nicht trivial, aber vermutlich einfacher).

Für das ursprünglich von Webfox gepostete Problem, stellt deine Funktion zusammen mit dem Vorschlag von ingmar aber schon eine Lösung da.

Ich habe die Funktion mal in midiOut umbenannt und in das modifizierte originale Beispiel eingefügt:
\version "2.19.21"

midiOut =
#(define-void-function (parser location m)(ly:music?)

  (let* ((elts (ly:music-property m 'elements)))
;  (display-scheme-music elts)
    (if (null? elts)
        ;; do nothing if elts are empty
        #f
        (let (;; make a midi from every entry of elts
              (scores
                (map
                  (lambda (e) #{ \score { \new DrumStaff $e \midi {} } #})
                  elts)))
          ;; return them, each as a new book
          (for-each
            (lambda (score name)
              (let* ((my-new-book
                       (ly:make-book
                         $defaultpaper
                         $defaultheader
                         score)))
                (ly:book-process
                   my-new-book
                   $defaultpaper
                   $defaultmidi
                   ;; add increasing numbers to the name
                   (format #f "part-test-~a" name))))
              scores
              (iota (length elts) 1 1))))))

%% Schlagzeugvorlage

%%#(set-default-paper-size "a4" 'landscape)

\header { tagline = ##f }

\layout {
indent = #0
line-width = #160

}

\paper {

fonts = #
(make-pango-font-tree
  "Calibri"
  "Calibri"
  "sans"
  (/ (* staff-height pt) 2.5))

print-page-number = ##f

%% Definition von Rändern und Abständen

#(define left-margin (* 3.5 cm))
#(define top-margin (* 1.5 cm))
#(define bottom-margin (* 1.5 cm))

  %% Abstände zwischen den Systemen & Verhindern eines weißen Randes am Seitenende
  system-system-spacing = #'((padding . 0.4) (basic-distance . 12))
  %%page-count = #10 (Seitenzahl kann erzwungen werden - optional)
  systems-per-page = #12 %% (Systeme pro Seite können erzwungen werden - optional)
  ragged-last-bottom = ##f
  ragged-bottom = ##f

}

snare = { \drummode { sn4^"R" sn4^"L" sn4^"L" sn4^"L" } }
tomI = { \drummode { tomh4^"R" tomh4^"L" tomh4^"R" tomh4^"L" } }
tomII = { \drummode { tommh4^"R" tommh4^"L" tommh4^"L" tommh4^"L" } }
tomIII = { \drummode { tomml4^"L" tomml4^"L" tomml4^"R" tomml4^"R" } }

hhI = { \drummode { <hh> 8 <bd hh> 8 <hh> 8 <hh> 8 <bd hh> 8 <hh> 8 <sn hh> 8 <sn hh> 8 } }
hhII = { \drummode { <hh> 8 <hh> 8 <hh> 8 <bd hh> 8 <sn hh> 8 <sn hh> 8 <bd hh> 8 <hh> 8 } }
hhIII = { \drummode { <hh> 8 <bd hh> 8 <hh> 8 <sn hh> 8 <bd hh> 8 <sn hh> 8 <hh> 8 <hh> 8 } }
hhIV = { \drummode { <hh> 8 <sn hh> 8 <hh> 8 <bd hh> 8 <hh> 8 <hh> 8 <sn hh> 8 <bd hh> 8 } }

partI = { \repeat unfold 1 { \snare } }
partII = { \repeat unfold 1 { \tomI } }
partIII = { \repeat unfold 1 { \tomII } }
partIV = { \repeat unfold 1 { \tomIII } \break }

partV = { \repeat unfold 4 { \hhI } }
partVI = { \repeat unfold 4 { \hhII } }
partVII = { \repeat unfold 4 { \hhIII } }
partVIII = { \repeat unfold 4 { \hhIV } \break }

drumnotes = {
  \snare
  \tomI
  \tomII
  \tomIII

  \partI
  \partII
  \partIII
  \partIV

  \partV
  \partVI
  \partVII
  \partVIII
}


\score {

  \new DrumStaff
    \with {
      \consists "Parenthesis_engraver"
      instrumentName = #"1"
      \numericTimeSignature
    }

    <<
    \new DrumVoice
      \with {
        \stemUp
        \override Script.direction = #UP
        \override Script.outside-staff-priority = #451
        \override TextScript.padding = 2
      }
      \time 4/4
      \drumnotes

>>

  % Notendruck
  \layout {}

  % MIDI Erzeugung
  \midi {
    \tempo 4 = 120
  }
}
%% midis
\midiOut \drumnotes

Der Name der erzeugten Ausgabedateien ist part-test-#.midi - das kann vorn in der Funktion individuell angepasst werden.

Webfox

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #14 am: Sonntag, 21. Juni 2015, 15:43 »
Vielen Dank!

Diese Lösung funktioniert für meine Ziele wunderbar.
Ich denke, für die Erzeugung separater MIDI Dateien für Schlagzeugnoten ist das eine sehr gute Lösung.