Wie funktioniert die Delta-Zeit für verschiedene Spuren in einer Midi-Datei?

Ich schreibe derzeit einen Midi-Generator mit bereits vorhandenen Midi-Dateien. Ich bin verwirrt, da jede Midi-Datei, die ich herunterlade, in einem etwas anderen Format gespeichert zu sein scheint. Ich bin besonders verwirrt darüber, was Spuren sind und wie sie die Zeit beeinflussen. In den Midi-Dateien steht:

File Types
There are three types of MIDI files:

type 0 (single track): all messages are saved in one track
type 1 (synchronous): all tracks start at the same time
type 2 (asynchronous): each track is independent of the others
When creating a new file, you can select type by passing the type keyword argument, or by setting the type attribute:

mid = MidiFile(type=2)
mid.type = 1
Type 0 files must have exactly one track. A ValueError is raised if you attempt to save a file with no tracks or with more than one track.

Meine Fragen sind
1. Wenn zwischen synchronen und asynchronen Tracks unterschieden wird, bedeutet dies, dass synchron bedeutet, dass die Deltazeit für jeden neuen Track "neu von 0 beginnt", während asynchron in Bezug auf das Timing aufeinanderfolgend ist? Wenn nicht, was bedeutet das?
2. Wenn meine obige Annahme richtig ist, in welcher Situation würden Sie asynchrone Dateien verwenden?
3. Wie teilt man Tracks auf, wenn Typ 2?

Im Wesentlichen versuche ich, all die verschiedenen Arten der Formatierung von Midi-Dateien zu regulieren, damit ich die Daten zwischen den Typen leichter manipulieren kann. Jede Hilfe dabei wäre willkommen.

Beifall

Wenn Sie an algorithmischer Komposition interessiert sind, ist es möglicherweise besser, mit einer vorhandenen Bibliothek und einem vorhandenen Framework zu beginnen. Wenn Sie an Low-Level-Sachen wie dem Parsen von MIDI-Dateien herumbasteln, wird es lange dauern, bis Sie weit genug kommen, um den Wald von den Bäumen aus zu sehen, und Sie müssen sich um eine Menge zusätzlichen Codes kümmern. Jede geschriebene Codezeile enthält einen gewissen Prozentsatz an zu lösenden Fehlern und Problemen, daher sollten Sie versuchen, so wenige Codezeilen wie möglich zu schreiben, um konzentriert zu bleiben. Vielleicht so etwas wie Python und music21? web.mit.edu/music21/doc/moduleReference/…
Ich verwende Mido mit Python
Ok, ich dachte, Sie erstellen Ihre eigene MIDI-Importbibliothek von Grund auf neu. :D

Antworten (1)

  1. asynchron bei Typ 2 bedeutet, dass jeder Track eine unabhängige Sequenz ist: Tracks vom Typ 2 sollen nicht gleichzeitig abgespielt werden. Dies unterscheidet sich von Typ 1, wo Tracks gleichzeitig abgespielt werden sollen. Beim Typ 1 beginnt die Zeitmessung jeder Spur zum Zeitpunkt Null. Typ 1 hat oft eine "Tempospur" als erste Spur, die alle Tempoinformationen enthält.

  2. Ich habe nicht gesehen, dass Typ 2 sehr oft verwendet wird. Es ist nur eine Möglichkeit, mehrere Sequenzen in einem einzigen Midifile zu speichern. Betrachten Sie es als Archiv-Midifile.

  3. Nicht dafür gedacht.

Ich denke also, Typ 0 ist das, was Sie brauchen, da Sie Ihre Split-Join-Operation nur für eine einzelne Spur durchführen müssen.

In einer alten MIDI-Dateibeschreibung wurde gesagt, dass Typ 2 „Patterns“ enthält, also könnte das Intro des Songs ein Pattern sein, die Strophe ein anderes Pattern, Refrain, Bridge usw., jeder Teil in seinem eigenen Pattern. Und diese würden bei der Wiedergabe in einer nicht festgelegten Reihenfolge ausgelöst. Ich glaube, es gab früher Hardware-Sequenzer, die solche Muster verwendeten. Vielleicht sogar Arranger-Keyboards. Ich könnte falsch liegen. Auf jeden Fall ist es keine sehr häufig verwendete Sache.
Kleine Anmerkung: Dateien vom Typ 2 sind super super selten. Viele Bibliotheken und Programme arbeiten aus diesem Grund gar nicht mit solchen Dateien.