Einzelnen Beitrag anzeigen

FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#16

AW: Debugger Krise

  Alt 10. Mai 2011, 08:06
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.
  Mit Zitat antworten Zitat