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=542aber 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