Der Code unleserlich und kaum wartbar, weil u.a das DRY-Prinzip verletzt wurde.
Der 2.Index wird wiederholt kompliziert ermittelt und ist, wie Du ja weißt, falsch
Delphi-Quellcode:
midiNote := byte(FileInfo.MIDINotes[IntA]); // falsch
midiNote := FileInfo.MIDINotes[EinIndex,NocheinIndex].NoteNo; // bessser
Du solltest dich mit den Grundlagen robuster Programmierung befassen (DRY, KISS, Refactoring).
PS: Natürlich zeigt dir Delphi etwas an. Du "errechnest" ja einen Index (eigentlich beschneidest Du einen Pointer) und dann ist der Index eben irgendwas zwischen 0 und 255. Da steht dann irgendwo etwas...
Wenn dein Grid die Midinoten 1:1 anzeigen soll, dann funktioniert vielleicht das hier (falls ich den Code richtig verstanden habe).
Delphi-Quellcode:
Function TMidiTracker.EncodeMidiNote (midiNote : TMIDINote) : Integer;
begin
Result := -1;
if midiNote.NoteNo > 0 then
if midiNote.Length = 12 then
Result := (127 - midiNote.NoteNo) + basenote
else if midiNote.Length > 12 then
Result := 1000 + (127 - midiNote.NoteNo + basenote)
else
Result := midiNote.NoteNo
else
Result := -1;
end;
procedure TMidiTracker.ImpMidiFile(MidiFile: Widestring);
var
FileInfo: TMIDIFileInfo;
IntI: Integer;
IntA: Integer;
midiNote : TMIDINote;
begin
if not ReadMIDIFile(MidiFile, FileInfo) then
begin
MessageBox(Self.Handle, 'Not a valid MIDI file.', 'Confirm', MB_OK);
exit;
end;
for IntI := 1 to FileInfo.Tracks do
begin
for IntA := 0 to FileInfo.NoteCounter[IntI] -1 do
begin
midiNote := FileInfo.MIDINotes[IntI,IntA];
Grid[IntI - 1, IntA] := EncodeMidiNote(midiNote);
InstGrid[IntI - 1, IntA] := midiNote.Instrument;
end;
end;
DrawGrid(self.Handle);
end;
Das Bild hängt schief.