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

Webfox

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #15 am: Freitag, 14. August 2015, 17:05 »
Hallo,

mir ist bei dieser Lösung noch etwas aufgefallen. Die MIDI Dateien sind unterschiedlich lang. Beispielsweise bei Zeilen mit zwei Takten. Einige MIDI Dateien geben ganz genau die zwei Takte aus, andere sind aber doppelt so lang und am Ende einfach nur leer - also zwei Takte mit Noten, zwei Takte leer in einer Datei.

Diese längeren Dateien muss ich immer manuell kürzen.

Habt Ihr eine Idee, warum die generierten MIDI Dateien nicht genau die zwei Takte einer Zeile wiedergeben?

mgd

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #16 am: Freitag, 14. August 2015, 21:20 »
Kannst du ein Beispiel liefern ?

Webfox

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #17 am: Samstag, 15. August 2015, 16:45 »
Hallo,

ja, hier ein Beispiel mit Deinem Code und jeweils einem Takt pro Zeile. Bei den dabei erzeugten MIDI Files sind Part 1,2 und 4 zu lang (letzter Teil leer). Part 3 hat die richtige Länge, nämlich genau einen Takt.
Ich verstehe nicht, warum einige MIDI Files länger sind.

Ich habe auch versucht, mit dem articulate Script bessere Ergebnisse zu erzielen (Dokumentation 3.5.7 Artikuliere-Script). Leider ohne Erfolg.

\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

}

vewqyPUP= {  \drummode { <sn hh> 16 bd16 <hh> 16 bd16 <bd hh> 8 <hh> 16 bd16 <hh> 16 r16  <hh> 16 bd16 <hh> 16 r16  <sn hh> 8}}
vPrwUgJG= {  \drummode { <bd hh> 8 <hh> 16 r16  <bd hh> 8 <bd hh> 8 <hh> 16 sn16 <sn hh> 16 sn16 <bd hh> 8 <bd hh> 8}}
ZYqzHclH= {  \drummode { <hh> 16 r16  <sn hh> 16 sn16 <hh> 16 bd16 <sn hh> 8 <bd hh> 16 sn16 <sn hh> 16 sn16 <hh> 16 r16  <hh> 16 r16}}
eMvoyDQt= {  \drummode { <hh> 16 r16  <bd hh> 8 <bd hh> 8 <bd hh> 16 bd16 <hh> 16 sn16 <hh> 16 r16  <sn hh> 8 <sn hh> 8}}
pxhCnBGx= {  \drummode { <bd hh> 16 bd16 <hh> 16 r16  <hh> 16 r16  <sn hh> 16 sn16 <sn hh> 16 bd16 <hh> 16 r16  <sn hh> 8 <hh> 16 sn16}}


partI = { \repeat unfold 1 { \vewqyPUP } \break }
partII = { \repeat unfold 1 { \vPrwUgJG } \break }
partIII = { \repeat unfold 1 { \ZYqzHclH } \break }
partIV = { \repeat unfold 1 { \pxhCnBGx } \break }

drumnotes = {


  \partI
  \partII
  \partIII
  \partIV

}


\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



harm6

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #18 am: Sonntag, 16. August 2015, 02:11 »
Kannst Du mal testen, ob folgendes bei Dir auch zu lang ist?

\score {
  { c''1 }
  \midi {}
}

Mir ist nämlich aufgefallen, daß Dein drittes Beispiel als einziges eine Pause am Ende hat. Wenn ich das via Rosegarden öffne dann sehe ich gar keinen vollen Takt und die Rückumwandlung in Noten läßt diese Pause dann auch aus.
Allerdings sind alle anderen Beispiele bei mir exakt einen Takt lang, 4 Sekunden.

Ich hege den Verdacht, daß ein leerer Takt angehängt wird falls keine Pause am Ende da ist, von wem auch immer.
LilyPond selbst scheint aber auszuscheiden.

Gruß,
  Harm

Webfox

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #19 am: Sonntag, 16. August 2015, 15:44 »
Hallo!

es lag tatsächlich an meiner DAW Presonus Studio One 2. Offenbar wird dort ein leerer Takt angehängt! Warum konnte ich allerdings nicht herausfinden...

Webfox

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #20 am: Samstag, 16. April 2016, 17:12 »
Hallo,

ich arbeite noch immer sehr gut mit dieser Lösung, möchte jetzt aber zusätzlich die MIDI Erzeugung nun nicht nur pro Takt, sondern pro Zeile ausgeben.
Das geht sozusagen in die Richtung, die Takte definieren zu können. So wie ich es im Titel dieses Posts ursprünglich erwähnte. Bisher war das nicht nötig. Jetzt erstelle ich Übungen, bei denen es sinnvoll wäre, auch die gesamte Zeile als eine MIDI Datei auszugeben, da eine Zeile einer vollständigen Übung entspricht.

Hier ein Beispielcode für diese Übungen:

\version "2.18.2"

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 {\tempo 4 = 120} } #})
                  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 "~a-test" name))))
              scores
              (iota (length elts) 1 1))))))

#(define counter 1)

my-staff-count-mod =
\with {
  instrumentName = "1"
  shortInstrumentName = ""
  \override InstrumentName.after-line-breaking =
    #(lambda (grob)
      (ly:grob-set-property! grob 'text
        (format #f "~5a" (number->string counter)))
      (set! counter (1+ counter)))
   
     %% Ausrichten und Positionieren der Handsatz Markierung
     
     \override TextScript.padding = 4
     %%\once \textLengthOn
     %%\once \override TextScript.X-offset = #-0.4
}


%% Schlagzeugvorlage

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

\header { tagline = ##f }

\layout {
indent = #0
line-width = #160
%%\set Score.currentBarNumber = #

}

\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 = #2 %% (Systeme pro Seite können erzwungen werden - optional)
  %%ragged-last-bottom = ##f
  %%ragged-bottom = ##f

}

AoBtvPdN= {\drummode { <tomh bd> 8^"L" tommh8^"R" <tomml bd hhp> 8^"R" tomh8^"L" <tomh bd> 8^"L" tomh8^"L" <sn bd hhp> 8^"L" tommh8^"R" } }
wmYmsIVY= {\drummode { <sn bd> 8^"L" tomml8^"R" <tomml bd hhp> 8^"R" tomh8^"L" <sn bd> 8^"L" tomh8^"L" <tomh bd hhp> 8^"L" tomml8^"R" } }
PIIqmtbv= {\drummode { <sn bd> 8^"L" tommh8^"R" <tomml bd hhp> 8^"R" sn8^"L" <sn bd> 8^"L" sn8^"L" <sn bd hhp> 8^"L" tommh8^"R" } }
xfOnhjHj= {\drummode { <tomh bd> 8^"L" tommh8^"R" <tommh bd hhp> 8^"R" tomh8^"L" <tomh bd> 8^"L" tomh8^"L" <tomh bd hhp> 8^"L" tommh8^"R" } }
PMYqyUVM= {\drummode { <tomml bd> 8^"R" tomml8^"R" <tomml bd hhp> 8^"R" tomml8^"R" <sn bd> 8^"L" tomml8^"R" <sn bd hhp> 8^"L" tomml8^"R" } }
sDfKRgPb= {\drummode { <tommh bd> 8^"R" tomml8^"R" <tomml bd hhp> 8^"R" tomml8^"R" <tomh bd> 8^"L" tomml8^"R" <sn bd hhp> 8^"L" tomml8^"R" } }
iRwcFQLr= {\drummode { <tommh bd> 8^"R" tommh8^"R" <tomml bd hhp> 8^"R" tommh8^"R" <tomh bd> 8^"L" tommh8^"R" <tomh bd hhp> 8^"L" tommh8^"R" } }
kKHhLMPF= {\drummode { <tomml bd> 8^"R" tomml8^"R" <tommh bd hhp> 8^"R" tomml8^"R" <sn bd> 8^"L" tomml8^"R" <tomh bd hhp> 8^"L" tomml8^"R" } }

AoBtvPdN= { \repeat unfold 1 { \AoBtvPdN } }
wmYmsIVY= { \repeat unfold 1 { \wmYmsIVY } }
PIIqmtbv= { \repeat unfold 1 { \PIIqmtbv } }
xfOnhjHj= { \repeat unfold 1 { \xfOnhjHj } \break }
PMYqyUVM= { \repeat unfold 1 { \PMYqyUVM } }
sDfKRgPb= { \repeat unfold 1 { \sDfKRgPb } }
iRwcFQLr= { \repeat unfold 1 { \iRwcFQLr } }
kKHhLMPF= { \repeat unfold 1 { \kKHhLMPF } \break }


drumnotes = {
 
\AoBtvPdN
\wmYmsIVY
\PIIqmtbv
\xfOnhjHj
\PMYqyUVM
\sDfKRgPb
\iRwcFQLr
\kKHhLMPF

}



\score {

  \new DrumStaff
   \with {
      \consists "Parenthesis_engraver"
      instrumentName = #"1"
      \numericTimeSignature
      \stemUp
      \my-staff-count-mod
  }
   
%% Hier werden die eigentlichen Noten eingefügt. Also die oben definierten Drumnotes.
    <<

      \time 4/4
      \drumnotes

>>

% Notendruck
  \layout {}

  % MIDI Erzeugung
  \midi {\tempo 4 = 120}

}

%% midis
\midiOut \drumnotes

Wie gewünscht werden dabei die Takte 1 bis 8 als MIDI generiert. Ist es auch möglich, zwei MIDI Dateien zu erzeugen? Also in dem Beispiel pro Zeile eine MIDI Datei  Nr. 1 mit den Takten 1 bis 4 und Nr. 2 mit den Takten 5 bis 8?

harm6

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #21 am: Montag, 18. April 2016, 22:02 »
Unter der Voraussetzung, daß Du immer komplette Takte vordefinierst sollte folgendes funktionieren.

\version "2.18.2"

#(define (split-list-in-n-sized-sublists nmbr lst)
  (define (helper n l1 l2)
    (if (> n (length l1))
        (remove null? (reverse (cons l1 l2)))
        (helper
          n
          (drop l1 n)
          (cons (take l1 n) l2))))
  (helper nmbr lst '()))

midiOut =
#(define-void-function (parser location number-of-elts m)(number? 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 $(make-sequential-music e)
                        \midi {\tempo 4 = 120}
                      }
                    #})
                  (split-list-in-n-sized-sublists number-of-elts 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 "~a-test" name))))
              scores
              (iota (length elts) 1 1))))))

#(define counter 1)

my-staff-count-mod =
\with {
  instrumentName = "1"
  shortInstrumentName = ""
  \override InstrumentName.after-line-breaking =
    #(lambda (grob)
      (ly:grob-set-property! grob 'text
        (format #f "~5a" (number->string counter)))
      (set! counter (1+ counter)))
   
     %% Ausrichten und Positionieren der Handsatz Markierung
     
     \override TextScript.padding = 4
     %%\once \textLengthOn
     %%\once \override TextScript.X-offset = #-0.4
}


%% Schlagzeugvorlage

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

\header { tagline = ##f }

\layout {
indent = #0
line-width = #160
%%\set Score.currentBarNumber = #

}

\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 = #2 %% (Systeme pro Seite können erzwungen werden - optional)
  %%ragged-last-bottom = ##f
  %%ragged-bottom = ##f

}

AoBtvPdN= {\drummode { <tomh bd> 8^"L" tommh8^"R" <tomml bd hhp> 8^"R" tomh8^"L" <tomh bd> 8^"L" tomh8^"L" <sn bd hhp> 8^"L" tommh8^"R" } }
wmYmsIVY= {\drummode { <sn bd> 8^"L" tomml8^"R" <tomml bd hhp> 8^"R" tomh8^"L" <sn bd> 8^"L" tomh8^"L" <tomh bd hhp> 8^"L" tomml8^"R" } }
PIIqmtbv= {\drummode { <sn bd> 8^"L" tommh8^"R" <tomml bd hhp> 8^"R" sn8^"L" <sn bd> 8^"L" sn8^"L" <sn bd hhp> 8^"L" tommh8^"R" } }
xfOnhjHj= {\drummode { <tomh bd> 8^"L" tommh8^"R" <tommh bd hhp> 8^"R" tomh8^"L" <tomh bd> 8^"L" tomh8^"L" <tomh bd hhp> 8^"L" tommh8^"R" } }
PMYqyUVM= {\drummode { <tomml bd> 8^"R" tomml8^"R" <tomml bd hhp> 8^"R" tomml8^"R" <sn bd> 8^"L" tomml8^"R" <sn bd hhp> 8^"L" tomml8^"R" } }
sDfKRgPb= {\drummode { <tommh bd> 8^"R" tomml8^"R" <tomml bd hhp> 8^"R" tomml8^"R" <tomh bd> 8^"L" tomml8^"R" <sn bd hhp> 8^"L" tomml8^"R" } }
iRwcFQLr= {\drummode { <tommh bd> 8^"R" tommh8^"R" <tomml bd hhp> 8^"R" tommh8^"R" <tomh bd> 8^"L" tommh8^"R" <tomh bd hhp> 8^"L" tommh8^"R" } }
kKHhLMPF= {\drummode { <tomml bd> 8^"R" tomml8^"R" <tommh bd hhp> 8^"R" tomml8^"R" <sn bd> 8^"L" tomml8^"R" <tomh bd hhp> 8^"L" tomml8^"R" } }

AoBtvPdN= { \repeat unfold 1 { \AoBtvPdN } }
wmYmsIVY= { \repeat unfold 1 { \wmYmsIVY } }
PIIqmtbv= { \repeat unfold 1 { \PIIqmtbv } }
xfOnhjHj= { \repeat unfold 1 { \xfOnhjHj } \break }
PMYqyUVM= { \repeat unfold 1 { \PMYqyUVM } }
sDfKRgPb= { \repeat unfold 1 { \sDfKRgPb } }
iRwcFQLr= { \repeat unfold 1 { \iRwcFQLr } }
kKHhLMPF= { \repeat unfold 1 { \kKHhLMPF } \break }


drumnotes = {
 
\AoBtvPdN
\wmYmsIVY
\PIIqmtbv
\xfOnhjHj
\PMYqyUVM
\sDfKRgPb
\iRwcFQLr
\kKHhLMPF

}



\score {

  \new DrumStaff
   \with {
      \consists "Parenthesis_engraver"
      instrumentName = #"1"
      \numericTimeSignature
      \stemUp
      \my-staff-count-mod
  }
   
%% Hier werden die eigentlichen Noten eingefügt. Also die oben definierten Drumnotes.
    <<

      \time 4/4
      \drumnotes

>>

% Notendruck
  \layout {}

  % MIDI Erzeugung
  \midi {\tempo 4 = 120}

}

%% midis
\midiOut #4 \drumnotes

HTH,
  Harm

P.S.
Du nennst Deine Variablen:
AoBtvPdN
wmYmsIVY
PIIqmtbv
xfOnhjHj
PMYqyUVM
sDfKRgPb
iRwcFQLr
kKHhLMPF

... wirklich?


P.P.S.
Ein minimal-example ist das jetzt nicht gewesen

fugenkomponist

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #22 am: Dienstag, 19. April 2016, 08:16 »
P.S.
Du nennst Deine Variablen:
AoBtvPdN
wmYmsIVY
PIIqmtbv
xfOnhjHj
PMYqyUVM
sDfKRgPb
iRwcFQLr
kKHhLMPF

... wirklich?
Sieht aus wie der Output von pwgen -s -0. Man könnte die Option -s weglassen, dann wären die wenigstens aussprechbar :D

Webfox

  • Member
Re: Geht es, pro Takt (Anzahl soll definierbar sein) eine MIDI Datei zu erzeugen?
« Antwort #23 am: Mittwoch, 27. April 2016, 13:40 »
Vielen Dank für diese Lösung. Das funktioniert sehr gut  :)

Ja, ich nenne die Variablen so - genauer gesagt, meine Zufallsliste aus Excel...ist eben schon viel automatisiert bei mir. Für mich war das durchaus ein minimal Beispiel. Ich habe den Drumcode für die üblichen 20 bis 30 A4 Seiten in diesem Beispiel mal weggelassen  ;)