Einzelnen Beitrag anzeigen

DelNoo

Registriert seit: 22. Jan 2009
7 Beiträge
 
#1

MIDI-Datei einlesen und analysieren

  Alt 23. Jan 2009, 16:13
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<>'MThdthen 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
  Mit Zitat antworten Zitat