AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Virtual Piano
Thema durchsuchen
Ansicht
Themen-Optionen

Virtual Piano

Ein Thema von EWeiss · begonnen am 8. Mär 2011 · letzter Beitrag vom 13. Apr 2019
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Virtual Piano

  Alt 2. Jul 2011, 19:40
Kein ahnung was du machst.
Ich kann die reihenfolge setzen wie ich will da kracht nix.

Edit:
kann drehen wie ich will

Delphi-Quellcode:
    NotenNamen: array[0..127] of string;
    HalbTon: array[0..100] of Bool;
    DieNoten: TSplitStrArray;
gruss

Geändert von EWeiss ( 3. Jul 2011 um 00:21 Uhr)
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Virtual Piano

  Alt 2. Jul 2011, 19:52
Delphi-Quellcode:
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!??
und peng! siehe Photo:
Das passiert ja währen der initialisierung!
Gruss
Miniaturansicht angehängter Grafiken
bereichpruefung.png  
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Virtual Piano

  Alt 2. Jul 2011, 19:57
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

Geändert von EWeiss ( 2. Jul 2011 um 20:00 Uhr)
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Virtual Piano

  Alt 2. Jul 2011, 21:29
Und kein Peng

Siehe oben angehängtes Foto.
Dann mach mal //HalbTon: array[0..100] of Bool; und dokumentiere mal halbton in Dragrid und PrintSidbar aus.
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

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

Problem bei der ganzen Sache ist, das ich fast nichts nutzen kann von Dir, bis auf die Graphicroutinen und die muss ich auch anpassen

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:
 
{----------------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;
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

Original:
HalbTon: array[0..100] of Bool;
DieNoten: TSplitStrArray;
NotenNamen: array[0..127] of string;

geändert: peng
DieNoten: TSplitStrArray;
HalbTon: array[0..100] of Bool;
NotenNamen: array[0..127] of string;

Gruss alfold

Geändert von alfold ( 2. Jul 2011 um 21:31 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Virtual Piano

  Alt 2. Jul 2011, 21:51
Hmm, seh da jetzt nichts, was eine AV auslösen könnte. Ich hab mal ein kleines Testprojekt gebastelt:
Delphi-Quellcode:
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.
Egal, wie man die Variablen anordnet, es kommt zu keiner AV. Das Problem muss woanders liegen.

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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Virtual Piano

  Alt 2. Jul 2011, 21:53
Zitat:
Ich habe schon einiges vereinfachen können! Du hast manchmal unötiges gemacht.
Meine Routinen sind auf Fixed Noten 1/4 4/4 ausgelegt incl Grid.
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:
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.
Das war ja meine Vermutung da TSplitStrArray static bzw.. Global definiert ist.

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

Geändert von EWeiss ( 3. Jul 2011 um 00:22 Uhr)
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Virtual Piano

  Alt 2. Jul 2011, 22:28
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

Und wenn ich sage es gibt Dinge die man nicht brauch, wie ebend
HalbTon: array[0..100] of Bool; oder im Resize
Delphi-Quellcode:
// 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;
und schon flackert es auf XP nicht mehr.
Warum wirst Du also sauer? Das ist doch kein schlecht machen
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

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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Virtual Piano

  Alt 2. Jul 2011, 22:50
Du weist schon wofür LockWindowUpdate verwendet wird
Zitat:
The LockWindowUpdate function disables or enables drawing in the specified window.
Only one window can be locked at a time.
Delphi-Quellcode:
  ' Fenster sperren:
LockWindowUpdate(WinHandle)

' ... mehrere Zeichenoperationen ...
  
  ' Fenster entsperren und neu zeichnen
LockWindowUpdate(0)
Genau deshalb habe ich es verwendet damit es nicht flackert
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.

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.

FVisible := False;

Sorgt dafür das kein neuzeichen stattfindet wenn das Flag gesetzt ist
Delphi-Quellcode:
      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
tssss.. verstehe ich nicht was du da machst.

Zitat:
Also sooooory @EWeiss falls es falsch rübergekommen ist!
Kein Beinbruch
Wollte nur meinen Standpunkt darlegen

boahh warum ist die schrift jetzt blau?

Ps:
Ach so vergessen!

Delphi-Quellcode:
    WM_SIZE:
    begin
      if assigned(MidiTracker) then
        if MidiTracker.FVisible then
          MidiTracker.ResizeWindow(WinHandle);
    end;
Wird ein Resitz ausgeführt und das flag FVisible ist true
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

Geändert von EWeiss ( 3. Jul 2011 um 00:20 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

(?)

LinkBack to this Thread

Erstellt von For Type Datum
Delphi-Forum.de - Array statisch/dynamisch oder TList fr Midi-Events This thread Refback 20. Sep 2011 15:59

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 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 by Thomas Breitkreuz