Noch ein Tipp: um Arrays komplett zu durchlaufen empfiehlt es sich, die Funktionen Low() und High() zu verwenden, da man damit niemals über die Arraygrenzen hinaus zugreift. Dabei spielt es keine Rolle, ob es sich um ein dynamisches, statisches oder offenes Array handelt und ob es 0-indiziert ist oder nicht.
Mache ich eigentlich auch nicht anders.
Aber in dem Beispiel hat es fortwährend gekracht.
Warum weiss ich ja jetzt.
Da ich nicht gern kopiere hier meine version die läuft jetzt.
Danke nochmal.
Delphi-Quellcode:
procedure TMidiTracker.ImpMidiFile(MidiFile: Widestring);
var
FileInfo: TMIDIFileInfo;
MidiNote: TMIDINote;
IntI: Integer;
IntA: Integer;
Tempo: byte;
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.Channels do
begin
for IntA := 0 to FileInfo.NoteCounter[IntI] -1 do
begin
MidiNote := FileInfo.MIDINotes[IntI, IntA];
if MidiNote.NoteNo = 0 then
Grid[IntI - 1, IntA] := -1;
if MidiNote.NoteNo > 0 then
begin
if MidiNote.Length = 12 then
Grid[(IntI - 1), IntA] := (127 - MidiNote.NoteNo) + basenote;
if MidiNote.Length > 12 then
Grid[(IntI - 1), IntA] := 1000 + (127 - MidiNote.NoteNo + basenote);
end;
InstGrid[(IntI - 1), IntA] := MidiNote.Instrument;
end;
end;
DrawGrid(self.Handle);
// Spielgeschwindigkeit auf default wert setzen
Tempo := MidiNote.Velocity;
SKAERO_SetKnobValue(SKAERO_GetMainItem(MainHandle, ID_KNOB_SPEED),
Tempo);
SKAERO_SetCTLText(SKAERO_GetMainItem(MainHandle, ID_SPEEDVALLABEL),
WideString(IntToStr(Tempo)));
end;
gruss