AW: Virtual Piano
Zitat:
Zitat:
Zitat:
gruss |
AW: Virtual Piano
Ach sorry, mein Fehler. Ich habe völlig übersehen, dass in dem Archiv nur die geänderten Dateien enthalten waren. Deshalb ging es nicht. Ich habe jetzt dieses Dateien über eine ältere Version drüberkopiert, und siehe da: Es funktioniert :-D Cool!
Glückwunsch, du hast den Fehler wohl doch behoben! :wink: |
AW: Virtual Piano
Zitat:
OK das mit dem Selektieren aslo einen Rahmen um den Selektierten eintrag wird wohl nicht gehen da hier ein *png für benötigt wird.. Das nur mal so am Rande! Dann danke nochmal für das Testen. gruss |
AW: Virtual Piano
Wer's braucht!
Im Quelltext enthalten.. deshalb hier gelöscht! Noch ein kleiner Fix für die Winproc uMiditracker. SB_PAGEUP, SB_PAGEDOWN addiert und unnötige doppelte deklarationen entfernt. gruss |
AW: Virtual Piano
Zitat:
Noch nicht ganz fertig aber sieht schon fein aus :) Erst mal ne VScrollBar (für die Instrumentenliste) die kann aber nachher auch im Grid verwendet werden. gruss |
AW: Virtual Piano
Neue Version Oben .. siehe changelog.
gruss |
AW: Virtual Piano
Sorry noch ein kleines Update.. Quelltext
Flickern und Down Status der Page(ScrollBar) gefixt. gruss |
AW: Virtual Piano
hi, ich mal wieder:wink:
Brauche Erklärung für folgenden Fall! Original Miditracker:
Code:
alles OK, aber wenn es so geändert wird
HalbTon: array[0..100] of Bool;
DieNoten: TSplitStrArray;
Delphi-Quellcode:
kracht es mit exception beim Schreiben auf DieNoten[0]
DieNoten: TSplitStrArray;
HalbTon: array[0..100] of Bool; Was hat die Reihenfolge damit zu tun:shock: Oder sollte ich diese Frage mal ins Forum stellen? Gruss alfold |
AW: Virtual Piano
Kann es sein, dass
Delphi-Quellcode:
die Länge 0 hat? Im ersten Fall wird der Zugriff noch durch das 100 Bytes lange Boolean-Array
DieNoten
Delphi-Quellcode:
„aufgefangen“, im zweiten Fall kommt jedoch nach
HalbTon
Delphi-Quellcode:
keine Deklaration mehr, und der Zugriff geht ins Nirwana (nicht alloziierter Speicher) → Zugriffsverletzung.
DieNoten
Edit: Schalte mal in den Compiler-Optionen die Bereichsprüfung ein. |
AW: Virtual Piano
Ok Fehler gefunden sehr merkwürdig.
Egal ob es Halbton, DieNoten oder NotenName ist Es kann nicht kommplett auf die Variable/Array zugegeriffen werden. Nur wenn davor genügend Speicher reserviert wurde, sei es durch eine Hilfsvariable, die keiner brauch. Ansonsten fehlt immer 'eine Adresse' vorsichtig Formuliert! Keine Ahnung warum dies so passiert!!! Dies ist mir nur aufgefallen, weil man das Array 'HalbTon' gar nicht benötigt! und ich entfernen wollte:shock: EDIT: Sobald 'DieNoten' in SplitNotes auftauchen kracht es! nimmt man dies weg, muss mann auch NotenNamen wo anders hinsetzten! ALLES MERKWÜRDIG! hänge schon 3 Tage an diesem Phänomen. Gruss alfold |
AW: Virtual Piano
Zitat:
Deklariere die
Delphi-Quellcode:
DieNoten: TSplitStrArray;
mal public dann dürfte die Reihenfolge keine Rolle mehr spielen. Zitat:
Das scheint sich nicht zu vertragen. Zitat:
gruss |
AW: Virtual Piano
So habe DieNote entfernt und in Splitnotes ne local Variable dafür genommen.
Darauf hin musst ich NotenName noch wo anders hinsetzten sonst hat es da plötzlich geknallt. Bereichsprüfung ist an hält ja auch an, an der Pos wo es knallt:wink: Fehlerhafte initialisierung! Warum auch immer!? Zitat:
@NamenLozer: Es kann immer nur auf das 1(0) array Element nicht zugegriffen werden bei Schreiben/lesen. Wenn alles in der Reihenfolge bleibt
Delphi-Quellcode:
auch der Versuch Public zu setzten je nach reihenfolge peng?
TMidiTracker = class
private FHGrid: HWND; FWidth: integer; FHeight: integer; FTop: integer; FLeft: integer; Img: cardinal; dwStyle: DWORD; dwClass: PWideChar; IsInitialized: BOOL; FOffsetX: integer; FOffsetY: integer; //HalbTon: array[0..100] of Bool; <--das zuerst weggenommen knalls bei DIENOTEN //DieNoten: TSplitStrArray; <---das weggenommen peng bei NOTENNAME //NotenNamen: array[0..127] of string; DimmedCol: array[0..15] of COLORREF; IsDrum: array[0..15] of Bool; DrumNum: array[0..15] of integer; NotenNamen: array[0..127] of string;// jetzt hier hin gesetzt funct!?? NORMAL IST DIES ABER NICHT:? Gruss |
AW: Virtual Piano
Kein ahnung was du machst.
Ich kann die reihenfolge setzen wie ich will da kracht nix. :wink: Edit: kann drehen wie ich will
Delphi-Quellcode:
gruss
NotenNamen: array[0..127] of string;
HalbTon: array[0..100] of Bool; DieNoten: TSplitStrArray; |
AW: Virtual Piano
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
und peng! siehe Photo:
TMidiTracker = class
private FHGrid: HWND; FWidth: integer; FHeight: integer; FTop: integer; FLeft: integer; Img: cardinal; dwStyle: DWORD; dwClass: PWideChar; IsInitialized: BOOL; FOffsetX: integer; FOffsetY: integer; //HalbTon: array[0..100] of Bool; <--das zuerst weggenommen knalls bei DIENOTEN //DieNoten: TSplitStrArray; <---das weggenommen peng bei NOTENNAME NotenNamen: array[0..127] of string;//<--wieder gesetzt!!!!!! DimmedCol: array[0..15] of COLORREF; IsDrum: array[0..15] of Bool; DrumNum: array[0..15] of integer; //NotenNamen: array[0..127] of string;// jetzt hier hin gesetzt funct!?? Das passiert ja währen der initialisierung! Gruss |
AW: Virtual Piano
Und kein Peng ;)
Siehe oben angehängtes Foto. PS: Warum veränderst du jetzt alle Variablen Namen? Wenn ich später da weiter Arbeiten will (möchte) finde ich keine mir bekannte Function mehr.:( gruss |
AW: Virtual Piano
Zitat:
Wie ist
Delphi-Quellcode:
definiert? Und wie sieht
TSplitStrArray
Delphi-Quellcode:
aus?
Split()
|
AW: Virtual Piano
Zitat:
Soll ja nur zum Test sein, ob Du dann etwa in zeile 290 eine Fehlermeldung bekommst. Obendrein sollst Du ja nicht von Deinem Rechner ausgehen. Bei mir funct auch immer alles - aber wehe ich komm auf ein anderen Rechner. Sei es mit dem fertigen Prog oder mit den Quellcode, der mal überarbeitet werden soll:shock: Egal, solange ich die original Reienfolge einhalte funct alles, aber wehe -siehe oben- . Dies gibt mir zu denken!!!! Anbei: Ich habe schon einiges vereinfachen können! Du hast manchmal unötiges gemacht. Ich muss sowie so neue Proceduren schreiben. Die alten mach ich {} so 1. Grid[] wird dynamisch 2. werden die Daten so im Grid abgelegt wie die original MIDIFile $0;$90;$76;$42;$97;$80,$00 als Beispiel Somit kann man auch Akkorde in einem Track spielen, lautstärke für jede Note festlegen usw:wink: Problem bei der ganzen Sache ist, das ich fast nichts nutzen kann von Dir, bis auf die Graphicroutinen und die muss ich auch anpassen:cry: Wahrscheinlich ist es besser den MIDITRACKER gleich neu zu schreiben. Denn zur Zeit Doktore ich an zu vielen Stellen im jetztigen MidiTracker und dann kommt sowas raus siehe oben und such den Fehler. Der hat mir 3 Tage gekostet. Und bleibt ein RÄÄÄÄTsel. @NamenLozer:
Delphi-Quellcode:
Problem ist solange alles in der Reihenfolge wie er es hat, funct es ja, aber wie oben beschrieben, sobald etwas nicht mehr in der Reihenfolge ist{----------------in uGlobal.pas--------------} type TSplitStrArray = array of string; .... .... function Split(const Source, Delimiter: string): TSplitStrArray; ... ... function Split(const Source, Delimiter: string): TSplitStrArray; var spCount: integer; spPos: integer; spLength: integer; sTemp: string; aSplit: TSplitStrArray; begin sTemp := Source; spCount := 0; spLength := Length(Delimiter) - 1; repeat spPos := Pos(Delimiter, sTemp); if spPos = 0 then break else begin Inc(spCount); SetLength(aSplit, spCount); aSplit[spCount - 1] := Copy(sTemp, 1, spPos - 1); Delete(sTemp, 1, spPos + spLength); end; until False; if Length(sTemp) > 0 then begin Inc(spCount); SetLength(aSplit, spCount); aSplit[spCount - 1] := sTemp; end; Result := aSplit; end; {--------in uMidiTraker------------------------} private DieNoten: TSplitStrArray; ... ... procedure TMidiTracker.SplitNotes; var IntA: integer; IntB: integer; IntC: integer; //mynoten: TSplitStrArray; <--war als test von mir begin DieNoten := Split('C,C#,D,D#,E,F,F#,G,G#,A,A#,B', ','); for IntA := 0 to 11 do begin for IntB := 0 to 11 do begin IntC := IntA * 12 + IntB; if IntC < 128 then NotenNamen[127 - IntC] := IntToStr(IntA) + DieNoten[IntB]; end; end; end; Original: HalbTon: array[0..100] of Bool; DieNoten: TSplitStrArray; NotenNamen: array[0..127] of string; geändert: peng :shock: DieNoten: TSplitStrArray; HalbTon: array[0..100] of Bool; NotenNamen: array[0..127] of string; Gruss alfold |
AW: Virtual Piano
Hmm, seh da jetzt nichts, was eine AV auslösen könnte. Ich hab mal ein kleines Testprojekt gebastelt:
Delphi-Quellcode:
Egal, wie man die Variablen anordnet, es kommt zu keiner AV. Das Problem muss woanders liegen.
program miditrackerav;
{$APPTYPE CONSOLE} uses SysUtils; type TSplitStrArray = array of string; function Split(const Source, Delimiter: string): TSplitStrArray; var spCount: integer; spPos: integer; spLength: integer; sTemp: string; aSplit: TSplitStrArray; begin sTemp := Source; spCount := 0; spLength := Length(Delimiter) - 1; repeat spPos := Pos(Delimiter, sTemp); if spPos = 0 then break else begin Inc(spCount); SetLength(aSplit, spCount); aSplit[spCount - 1] := Copy(sTemp, 1, spPos - 1); Delete(sTemp, 1, spPos + spLength); end; until False; if Length(sTemp) > 0 then begin Inc(spCount); SetLength(aSplit, spCount); aSplit[spCount - 1] := sTemp; end; Result := aSplit; end; type TMidiTracker = class private procedure SplitNotes; public procedure TestSplitNotes; end; var // Original: // HalbTon: array[0..100] of Boolean; // DieNoten: TSplitStrArray; // NotenNamen: array[0..127] of string; // Geändert (bei dir AV, bei mir nicht): DieNoten: TSplitStrArray; HalbTon: array[0..100] of Boolean; NotenNamen: array[0..127] of string; procedure TMidiTracker.SplitNotes; var IntA: integer; IntB: integer; IntC: integer; i: integer; begin DieNoten := Split('C,C#,D,D#,E,F,F#,G,G#,A,A#,B', ','); for IntA := 0 to 11 do begin for IntB := 0 to 11 do begin IntC := IntA * 12 + IntB; if IntC < 128 then NotenNamen[127 - IntC] := IntToStr(IntA) + DieNoten[IntB]; end; end; // Zum Test ausgeben, um zu gucken, ob auch alles ok ist for i := low(DieNoten) to high(DieNoten) do writeln(DieNoten[i]); end; procedure TMidiTracker.TestSplitNotes; begin SplitNotes; end; var MidiTracker: TMidiTracker; begin MidiTracker := TMidiTracker.Create; MidiTracker.TestSplitNotes; HalbTon[3] := True; // Verhindern, dass Compiler die Variable wegoptimiert readln; end. Kann es eventuell sein, dass das Objekt zu dem Zeitpunkt, wo die private Methode aufgerufen wird, bereits zerstört wurde? Ich würde mal einen Haltepunkt auf den Destructor setzen. |
AW: Virtual Piano
Zitat:
Und alles was da verwendet wird hat einen bezug dazu. Das was du manchmal unnötig nennst (von dir entfernt bzw. gelöscht wurde) habe ich in dem Update von dir gesehen ;) Leider auch wenn es noch nicht fertig war .. hat danach so gut wie nichts mehr funktioniert. Wenn ich die Maus nach links gezogen habe hatte ich plötzlich an irgendeiner stelle im Grid 20 und mehr Noten hintereinander gezeichnet. Du siehst also da kann man nicht einfach mal so irgendetwas löschen wenn man den bezug nicht dazu kennt(unötiges gemacht). Wenn du den ganzen kram mit im und export von Midi zur seite schiebst war das alles Korrekt geschrieben. Schließlich habe ich mir etwas dabei gedacht. Mal abgesehen das alle button auch keine Funktion mehr hatten. Also stelle mich hier nicht als ein NOB hin das ich schreiben kann habe ich schon genug bewiesen hier denke ich mal! Ich kann Kritik vertragen sehr gut sogar aber nur dann wenn Sie berechtigt und im bezug steht zu meinem Konzept feste Noten fester Takt. Durch die änderung auf das jetzige importieren und Exportieren von Hexadezimalen Midi Daten (war nicht mein konzept) kann das alles nicht mehr korrekt funktionieren und dann, und nur dann wird einiges unnötig und nicht mehr von belang sein! Ich habe dir von anfang an gesagt das es nicht einfach ist mein konzept zu verwerfen da ich mit Fixen Daten arbeite und dir gesagt das ich in dem fall den Miditracker komplett neu schreiben muss. Mache meine Arbeit jetzt also nicht schlecht nur weil du den Tracker auf dein Konzept umlegen willst (was ja kein Problem für mich darstellt). Aber was soll's. :) @NamenLozer Zitat:
Allerdings tritt das problem bei mir nicht auf MidiPiano startet immer egal in welcher Reihenfolge. PS: Auch wenn ich Notenname ganz entferne gibt es kein AV und alles Daten werden korrekt gesplittet.. Siehe Bild! Bild gelöscht sonst zuviel Müll im Forum! gruss Emil |
AW: Virtual Piano
Na na na, was denn jetzt!
Ich mache Dein Prog nicht schlecht. Im Gegenteil möchte ich es ja noch besser machen, weil es so schick ist:wink: Und wenn ich sage es gibt Dinge die man nicht brauch, wie ebend HalbTon: array[0..100] of Bool; oder im Resize
Delphi-Quellcode:
und schon flackert es auf XP nicht mehr.
// Neuzeichnen sperren
//LockWindowUpdate(WinHandle); SendMessage(WinHandle, WM_SETREDRAW, 0, 0); //FVisible := False; //SKAERO_AnchorEnum(WinHandle); .... .... // Aktualisiere die Seiten und TopBars //PrintSideBar; //PrintTopBar; //FVisible := True; // Neuzeichnen wieder erlauben SendMessage(WinHandle, WM_SETREDRAW, 1, 0); //LockWindowUpdate(0); //Resizing := False; Warum wirst Du also sauer? Das ist doch kein schlecht machen:cry: So gibt es noch andere Stellen um Originalen, wo man sagen kann, ja kann man machen, muss nicht. Und wenn mein Beispiel bei Dir nicht gefunct hat, bei mir funct es:wink: Wobei wir wieder beim Thema sind. Also nmh.... RÄAAAATSEL. Hab das jetzt so: //HalbTon: array[0..100] of Bool; //DieNoten: TSplitStrArray; DimmedCol: array[0..15] of COLORREF; IsDrum: array[0..15] of Bool; DrumNum: array[0..15] of integer; NotenNamen: array[0..127] of string;//<--- hier hingesetzt und es funct ..... Also sooooory @EWeiss falls es falsch rübergekommen ist! Gruss alfold |
AW: Virtual Piano
Du weist schon wofür LockWindowUpdate verwendet wird ;)
Zitat:
Delphi-Quellcode:
Genau deshalb habe ich es verwendet damit es nicht flackert :)
' Fenster sperren:
LockWindowUpdate(WinHandle) ' ... mehrere Zeichenoperationen ... ' Fenster entsperren und neu zeichnen LockWindowUpdate(0) bzw. Solange nicht mehr resitz bis die sperrung aufgehoben ist. Theoretisch würde ein WM_SETREDRAW ausreichen da es fast das gleiche tut nur es sperrt nicht das Window vor dem Resitzen. !! Und darum geht es mir. Was da auf XP passiert ist eine sache was hier auf Win7 geschieht eine andere.
Delphi-Quellcode:
SKAERO_AnchorEnum(WinHandle);
Repositioniert die Controls wenn ein Resitz statt findet Und zwar in diesen speziellen Fall wo das Fenster gesperrt ist damit die Controls nicht erst nachher resizen nachdem das Fenster wieder gezeichnet werden kann.
Delphi-Quellcode:
FVisible := False;
Sorgt dafür das kein neuzeichen stattfindet wenn das Flag gesetzt ist
Delphi-Quellcode:
tssss.. verstehe ich nicht was du da machst.
MidiTracker.FVisible := bool(LoWord(WP));
if MidiTracker.FVisible then begin MidiTracker.GetLastSize(WinHandle); MidiTracker.DrawGrid(WinHandle); ShowWindow(SideBarFrame.Handle, SW_HIDE); ShowWindow(TopBarFrame.Handle, SW_HIDE); MidiTracker.PrintSideBar; MidiTracker.PrintTopBar; end Zitat:
Wollte nur meinen Standpunkt darlegen boahh warum ist die schrift jetzt blau? Ps: Ach so vergessen!
Delphi-Quellcode:
Wird ein Resitz ausgeführt und das flag FVisible ist true
WM_SIZE:
begin if assigned(MidiTracker) then if MidiTracker.FVisible then MidiTracker.ResizeWindow(WinHandle); end; dann wird im ResizeWindow das Flag direkt wieder auf false gesetzt. Das hängt damit zusammen damit die ToolButton, SideBar, TopBar und das grid gleichzeitig sichtbar werden und nicht nacheinander gezeichnet werden. Wie gesagt das hat alles einen Sinn! Deaktiviere ich alles das was du deaktiviert hast.. flackert mein Grid und sieht so aus. gruss |
AW: Virtual Piano
Will ja nicht unken, selbst auf Win7 läuft es ohne die anderen Einträge besser:zwinker:
Delphi-Quellcode:
Wenn ich die also weglasse, müsste es ja schlimmer werden, dem ist aber nicht so. Im Genteil Windows selber bleibt ruhiger.
Resizing := True;<--nicht notwendig
// Neuzeichnen sperren LockWindowUpdate(WinHandle);<---überflüssig SendMessage(WinHandle, WM_SETREDRAW, 0, 0);<--- reicht vollkommen FVisible := False; <--nicht notwendig SKAERO_AnchorEnum(WinHandle);<---nicht notwedig wird auch ohne neu positioniert .... .... .... FVisible := True;<-- nicht notwendig // Aktualisiere die Seiten und TopBars PrintSideBar;<---nicht notwendig da grid eh noch nicht zusehen und flackert PrintTopBar;;<---nicht notwendig da grid eh noch nicht zusehen und flackert ..... ..... // Neuzeichnen wieder erlauben SendMessage(WinHandle, WM_SETREDRAW, 1, 0); LockWindowUpdate(0);<--nicht notwendig Resizing := False;<---nicht notwendig Glaub doch einfach auch anderen mal was. Oder siehst Du dies als persöhnlichen Angriff an, wenn man feststellt das dies oder jenes doppeltgemoppelt ist oder sogar einfacher ist. kommt mir jedenfalls so vor:roll: Ps: Grid ist beim Resize weder auf Win7 noch auf XP bei mir zu sehen auch im originalem.:gruebel: Gruss alfdold |
AW: Virtual Piano
Zitat:
Ich hab ein Bild angehängt und dir gesagt das es bei mir Flackert und das resultat bei deaktivierten einträgen siehst du auf meinen Anhang. Es geht hier um Fakten so wie sie bei mir auftreten das hat nicht's mit 'Persönlich' zu tun Freut mich ja das du da weitermachst.. Zitat:
Welche Version? Die letzte? PS: Brrr... Resizing := False;<---nicht notwendig Zitat:
gruss |
AW: Virtual Piano
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
und so sieht es, beim ändern der grösse, bei mir auf win7 und xp aus. Original nichts geändert!! Und windows flackert! die anderen geöffneten Fenster! Ändere ich das in meiner version passiert das nicht! Gruss alf |
AW: Virtual Piano
Bei mir so nichts geändert.
Abgesehen von der Uhr ;) Nach dem resitz natürlich. PS: Gerade nochmal letzte version geladen und keine probleme Wird alles richtig angezeigt. Zitat:
Dann mach es halt weg ;) Zitat:
gruss |
AW: Virtual Piano
Mein Photo ist während ich die grösse ändere also reszize. Sämtlich Desktop icons und fenster im hintergrund flackern. Manchmal kommt sogar ein Fenster durch Deine Oberfläche.
Nach dem ich dies deaktiviert habe, in meiner Version, ist alles ruhiger! Egal ich mach trotzdem weiter:P Will ja fertig werden:-D Gruss alfold |
AW: Virtual Piano
Zitat:
Du kannst es ruhig entfernen Deaktivieren. PS: Das problem mit dem grid kann daran liegen das du verschiedene Versionen mit ein und der gleichen INI ausführst das führt zum problem und kann nur behoben werden in dem du den Skin vorher änderst. Hatte das gleiche problem mit der alten Version hier aus dem Forum bedenke das die Bilder in deiner Version anders abgelegt sind! gruss |
AW: Virtual Piano
Zitat:
Nee ist schon recht ;) Wo du recht hast da haste recht. Wichtig ist das nachher alles noch funktioniert. Na kleinigkeiten kann man immer noch korrigieren :) Ich bin dabei das alles noch etwas zu optimieren besonders InvalidateRect. Da muss man sehr mit Aufpassen. PS: Zitat:
Wenn ja dann liegt es daran das du dinge raus geworfen hast die das verhindern. Ich habe das Resitz verhalten so programmiert das du während des Resitz keine Zeichnungs operationen durchführen kannst (darfst) Was du beim Resitz sehen sollst ist lediglich der Rahmen der Anwendung nicht mehr nicht weniger. Erst beim loslassen soll das Fenster vollständig neu gezeichnet werden. Anders ist es mit dem ganzen Design, skins, Aero usw.. nicht möglich. gruss |
AW: Virtual Piano
Neue Version Oben..
Es könnte sein das beim ersten start das Fenster nicht richtig angezeigt wird. Wenn das auftreten sollte bitte einfach einen anderen Skin im Menü auswählen. dann gibt sich das von selbst. Liegt daran das die Bilder nun in anderen Ordern liegen alte INI könnte da ärger machen. gruss |
AW: Virtual Piano
Startet nicht, fehler in der GDIPlus.DLL lesen von Adresse 00000013
gruss |
AW: Virtual Piano
Zitat:
Alte INI gelöscht? So gut wie jetzt war das noch nie :) Dann schau mal was ich alles am laufen habe und keinen Crash.. Meinen Mediaplayer(VB) mit TV Meine Soundmachine Virtual Piano usw... PS: Das ist so was von langsam das XP das GDIPlus funktionen in ResizeWindow aufgerufen werden bevor die Skins geladen werden konnten. Ich mache da am besten noch eine Funktion welche prüft ob der benötigte Skin geladen wurde. Sonst habe ich jedesmal das gleiche problem sobald ich da was ändere. Es geht auf jedenfall... muss halt nachher das Archiv nochmal hochladen mit der änderung. gruss |
AW: Virtual Piano
Ich habe den letzten DL gestartet. Dein Original, nicht das was ich bearbeite!
Schliesslich brauche ich ja das Originale , wenn ich an meinem was versaue und nichts mehr geht:wink: Ini natürlich gelöscht! Gruss alfold |
AW: Virtual Piano
Zitat:
Wenn es fertig ist dann vergleiche ich die Seiten und ändere ab was du verändert hast. Silhwan hat den Midiplayer fertig gestellt denke damit können wir was anfangen. Ich habe es Heute mit seiner Erlaubniss von der komponente nach einfachen Units abgeändert. gruss und danke für deine Arbeit. |
AW: Virtual Piano
Neue Version oben.
gruss |
AW: Virtual Piano
Ich bin jedes Mal aufs Neue von Deiner Grafik beeindruckt! :thumb:
|
AW: Virtual Piano
Zitat:
Aber davon ab habe da bis auf die Listbox Schrift nichts geändert ;) Es gibt ein Popup Menu wo man die Skins wählen kann. Oben im Caption gruss |
AW: Virtual Piano
Zitat:
|
AW: Virtual Piano
ein kleiner OT-Tipp...
damit es auch für all jene gut klingt, die keinen Hardwarewavetable auf/in der Soundkarte haben: Installiert euch folgendes: Den Bassmidi Treiber von: https://github.com/mudlord/bassmididrv Jetzt braucht ihr noch einen passenden Soundfont (SF2-Format). Da gibts zum Beispiel den Crisis General Midi 3.01 Letzterer hat einen wunderschönen Applaus ;-) Viele weitere gibts bei der HammerSound SoundFont Library viel Spaß damit |
AW: Virtual Piano
Neue Version online 1.1.5
Auf MidiFile2 umgestellt.. Testen wie folgt! MidiTracker öffnen.. nichts in das Grid zeichen ansonsten wird das MidiFile nicht gestartet sondern das was im grid steht. Das Grid werde ich später noch befüllen.. (im moment nur eine Temporäre Lösung) Den Button Import Midi File klicken Datei aus dem Ordner Songs einladen (oder ne andere Datei wie ihr wollt) Danach nur noch auf den Play button klicken. (letzte Icon in der Toolbar :) ) Lautstärke über MasterVolumen Regeln Geschwindigkeit mit dem Speed Knob.. gruss |
AW: Virtual Piano
Hey Emil,
hab mir gerade mal deinen Code angesehen, wie du einige Sachen so machst, um mich bisschen weiter zu entwickeln 8-) Kein Plan, ob du noch an dem Programm was veränderst und ob du das schon weisst, aber mir ist da was kleines aufgefallen: Du vergleichst oft auf True/False (was man ja bekanntlich nicht machen sollte) zb:
Delphi-Quellcode:
IsInitialized := GetClassInfoEx(SkinEngine.skInstance, zClass, wc);
if IsInitialized = False then begin Vllt. änderst du das ja noch irgendwann ein mal! BTW. Cooles Prog und thx vor OS :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz