Hallo!
Ich möchte eine MIDI-Datei in Delphi per FileStream einlesen und danach analysieren: So möchte ich die einzelnen Stimmen/Instrumente rausfiltern und die MIDI-Kommandos (Taste drücken, Taste loslassen, welche Taste usw.) den Instrumenten zuordnen.
Alle wichtigen MIDI-Behlfe und der Aufbau einer MIDI-Datei sind hier beschrieben.
Mein Ansatz ist bisher so:
Delphi-Quellcode:
function SwapInt(value:Integer):Integer;
type Tswaprec=packed
record
case boolean
of
True:(int:Integer);
False:(b:
array[1..4]
of byte);
end;
var swaprec,swaprecRes:TSwapRec;
i:integer;
begin
swaprec.int:=value;
for i:=1
to 4
do
swaprecRes.b[i]:=swaprec.b[5-i];
result:=swaprecRes.int;
end;
function SwapWord(Value:Word):Word;
type Tswaprec=packed
record
case boolean
of
True:(w:word);
False:(b:
array[1..2]
of byte);
end;
var swaprec,swaprecRes:TSwapRec;
i:integer;
begin
swaprec.w:=value;
for i:=1
to 2
do
swaprecRes.b[i]:=swaprec.b[3-i];
result:=swaprecRes.w;
end;
procedure TForm1.Button1Click(Sender: TObject);
var midi:TFileStream;
s:
string;
i:Integer;
w:word;
begin
midi:=tFilestream.create('
d:\mission.mid',fmopenread);
try
setlength(s,4);
midi.
Read(s[1],4);
if s<>'
MThd'
then raise Exception.create('
MThd-Fehler');
midi.
Read(i,4);
i:=swapInt(i);
if i<>6
then raise Exception.create('
Headersize -Fehler');
midi.
Read(w,2);
w:=swapWord(w);
case w
of
0:showmessage('
eine Spur');
1:showmessage('
mehrere Spuren, synchron');
2:showmessage('
mehrere Spuren, nicht synchron');
else raise Exception.create('
MIDI-Format unbekannt');
end;
midi.
Read(w, 2);
w := swapWord(w);
if (w > 0)
AND (w < 26)
then begin
showmessage(IntToStr(w)+'
Tracks');
end;
midi.
Read(w, 2);
w := swapWord(w);
showmessage(IntToStr(w)+'
Delta-time ticks pro Viertelnote');
finally
midi.free;
end;
end;
So lese ich aber bisher nur den Header-Chunk aus. Für die Track-Chunks fehlt mir der Ansatz. Soll ich da mit einer while-Schleife durchgehen? Muss ich da immer 2 Bytes oder 4 Bytes zusammen auslesen? Oder muss ich es als
ASCII interpretieren?
Ich hoffe, ihr könnt mir helfen. Danke im Voraus für eure Antworten!
Gruß
DelNoo