![]() |
AW: Debugger Krise
Ohne zu wissen, wie ReadMIDIFile die Struktur füllt ... mit ist aufgefallen, dass in guter alter Delphi-Manier
Delphi-Quellcode:
durchlaufen wird, aber
for IntA := 0 to FileInfo.NoteCounter[IntI] -1 do
begin
Delphi-Quellcode:
. Wenn das
for IntI := 1 to FileInfo.Tracks do
begin
Delphi-Quellcode:
heissen sollte, dann schaust Du immer auf die falsche Note. Bzw beim letzten Schleifendurchlauf kracht's dann.
for IntI := 0 to FileInfo.Tracks-1 do
begin Aber wie auch immer ... Zitat:
Was, wenn Du den Code sicherst und dann wegwirfst und langsam nochmal alles von vorne machst? |
AW: Debugger Krise
Hallo EWeiss,
ich kann natürlich nicht die Semantik Deines Codes kennen - also das wie und warum soll es funktionieren. Da bin ich nicht im Code und vor allem im Problem drinne. Ich würde aber mal Tippen, dass du eher schreiben müßtest
Delphi-Quellcode:
o übergeben. Aber wie gesagt, ich kenne die Logik nicht, bzw. das Ziel nicht.
FileInfo.MIDINotes[IntA].NoteN
Es kann ja genauso gut sein, dass du nur IntA brauchst, da du ja durch alle Tracks durch gehst (IntI) und in jedem Track durch alle Noten (IntA). Passend zu dem Aufbau des Records ist bei
Delphi-Quellcode:
die erste Stelle der Track / Channel und die zweite Stelle die Note ->
MIDINotes
Delphi-Quellcode:
liefert dir
FileInfo.MIDINotes[IntI, IntA]
Delphi-Quellcode:
Nummer IntA von Track / Channel IntI.
TMIDINote
Davon betrachtest du ja meist die NoteNo :-) Gruß, Chris |
AW: Debugger Krise
Aber die Meldung sagt doch schon das da was falsch ist!
Der Typ ist ein dynamisches Array aber ein Integer wird wohl erwartet? Also hast du es dir einfach gemacht und das dynamische Array auf ein Byte gecastet. Aber wäre es nicht richtiger auf die Werte des dynamischen Arrays zu zugreifen als das Array selbst (welches ja nur ein Pointer ist) auf ein Byte zu casten? |
AW: Debugger Krise
Delphi-Quellcode:
Die Schleife ist schon richtig ;)
for IntI := 1 to FileInfo.Tracks do
begin
Delphi-Quellcode:
Channels sind die tracks..
array[1..MaxChannels]
gruss |
AW: Debugger Krise
Zitat:
Es ist aber doch seltsam das der Tooltip mir andere werte anzeigt die exakt stimmen nur nicht richtig ausgewertet werden. Ich habe es auch schon als Integer versucht ist das selbe problem bzw.. auch hier stürzt die Anwendung ab. gruss |
AW: Debugger Krise
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:
Du solltest dich mit den Grundlagen robuster Programmierung befassen (DRY, KISS, Refactoring).
midiNote := byte(FileInfo.MIDINotes[IntA]); // falsch
midiNote := FileInfo.MIDINotes[EinIndex,NocheinIndex].NoteNo; // bessser 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; |
AW: Debugger Krise
Danke für deine Hilfe werde mir das mal genau anschauen.
gruss |
AW: Debugger Krise
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.
|
AW: Debugger Krise
Zitat:
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:
gruss
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz