Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Notenlängen berechnung (https://www.delphipraxis.net/160464-notenlaengen-berechnung.html)

EWeiss 14. Mai 2011 15:29


Notenlängen berechnung
 
Die neue Notenlänge übergebe ich so.
Delphi-Quellcode:
MidiTracker.SetNewNoteLength(SmallNoteData[SmallNDSelected].Value);


Und werte sie auf dieser art aus.
Delphi-Quellcode:
Value := NewLenght div 2;


Nehme ich jetzt ein Lied gespielt in 1/8 Noten und incrementiere die Noten
Delphi-Quellcode:
SmallNoteData[SmallNDSelected].Value


abhängig von SmallNDSelected also 1,2,4,8,16

funktioniert auch soweit alles die noten werden dann langsamer gespielt bei gleichbleibender geschwindigkeit
und abhängig von der Value länger oder kürzer gezeichnet.
Mein Problem ist nun das bei der Übergebenen Value von 16 die Anwendung abstürzt.

bis 1/32 Noten geht noch alles.
Danach kommt die Meldung EaccessViolation Schreiben von adresse FFFFFF

Was ist hier falsch ?
Die anderen übergaben funktionieren doch einwandfrei.

gruss

rollstuhlfahrer 14. Mai 2011 15:42

AW: Notenlängen berechnung
 
Schalte mal die Bereichsprüfung an. Eventuell kann es sein, dass du einen versteckten Integer-Überlauf hast.

Bernhard

EWeiss 14. Mai 2011 15:48

AW: Notenlängen berechnung
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1100782)
Schalte mal die Bereichsprüfung an. Eventuell kann es sein, dass du einen versteckten Integer-Überlauf hast.

Bernhard

Habe es eingeschaltet kommt gleiche meldung ohne das ich mir eine debugger möglichkeit angeboten wird.
Die Berechnung müßte doch eigentlich OK sein oder?

gruss

rollstuhlfahrer 14. Mai 2011 16:01

AW: Notenlängen berechnung
 
Zitat:

Zitat von EWeiss (Beitrag 1100783)
Die Berechnung müßte doch eigentlich OK sein oder?

Nun ja. Hmm... Ich denke mal...

Ich bin dann doch zu dem Schluss gekommen, dass ich jetzt nicht denken werde, weil einfach kein Quelltext existiert, über den man mal drüber schauen könnte. Und genau deshalb wäre es sinnvoll vielleicht mal 1-2 Zeilen mehr zu zeigen, wenn du verstehst, was ich meine.

Bernhard

EWeiss 14. Mai 2011 16:11

AW: Notenlängen berechnung
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1100785)
Zitat:

Zitat von EWeiss (Beitrag 1100783)
Die Berechnung müßte doch eigentlich OK sein oder?

Nun ja. Hmm... Ich denke mal...

Ich bin dann doch zu dem Schluss gekommen, dass ich jetzt nicht denken werde, weil einfach kein Quelltext existiert, über den man mal drüber schauen könnte. Und genau deshalb wäre es sinnvoll vielleicht mal 1-2 Zeilen mehr zu zeigen, wenn du verstehst, was ich meine.

Bernhard

Du hattest recht.
Bereichsprüfung wurde erst ausgeführt nach dem NEustart des Projekt warum auch immer.

gruss

Medium 16. Mai 2011 00:41

AW: Notenlängen berechnung
 
Warum? Weil diese Debug-Infos und Prüfungen natürlich in die EXE einkompiliert werden müssen. Zur Runtime mal eben ab- und zuschalten ist etwas viel verlangt ;)

EWeiss 16. Mai 2011 09:49

AW: Notenlängen berechnung
 
Wie kann ich denn jetzt berechnen anhand dieser Formel

Delphi-Quellcode:
  // Bei einem Tempo von 120 BPM ist die Länge einer 1/4 Note 500ms.
  // Bei 130 BPM (120/130 BPM =) 0.92 * 500ms = 461ms.
  TempoWait := ((120  / MidiTracker.Tempo) * 500) / (BeatProMaes[BeatPMSelected].Value) / SmallNoteData[SmallNDSelected].Value;
Abhängig vom MidiTracker.Tempo ob das eingeladenen MidiFile auf dem Takt 2/4 oder 4/4 gesetzt werden muss?

Bei einem MidiTracker.Tempo = 120 habe ich einen wert von 125 = 4/4 Takt
wie wäre der bei 100? .. jo 75

Aber wie berechne ich das korrekt?


Hmmm...

shmia 16. Mai 2011 11:01

AW: Notenlängen berechnung
 
Wieso hast du eigentlich keine Funktion, die aus BPM und Notendauer die Länge in Sekunden berechnet??
Meine Vermutung: je komplexer ein Sourcecode, umso "besser" findest du ihn.
Delphi-Quellcode:
function NotenDauer(BPM,note:double):double;
const
  SECONDS_PER_MINUTE = 60;
begin
  result := note * 4.0 / (BPM / SECONDS_PER_MINUTE);
end;

EWeiss 16. Mai 2011 11:19

AW: Notenlängen berechnung
 
Zitat:

Zitat von shmia (Beitrag 1101045)
Wieso hast du eigentlich keine Funktion, die aus BPM und Notendauer die Länge in Sekunden berechnet??
Meine Vermutung: je komplexer ein Sourcecode, umso "besser" findest du ihn.
Delphi-Quellcode:
function NotenDauer(BPM,note:double):double;
const
  SECONDS_PER_MINUTE = 60;
begin
  result := note * 4.0 / (BPM / SECONDS_PER_MINUTE);
end;

Weil ich annahm das es nicht notwendig ist.
Eine Procedure hab ich schon.
Und die Funktion zu durchlaufen bei möglichen 4000 Noten ? Jede einzelne Note abfragen?

Delphi-Quellcode:
procedure TMidiTracker.ChangeVelocity;
begin
  if PlayingSong then
    PlayingSong := False;
  // Bei einem Tempo von 120 BPM ist die Länge einer 1/4 Note 500ms.
  // Bei 130 BPM (120/130 BPM =) 0.92 * 500ms = 461ms.
  TempoWait := ((120  / MidiTracker.Tempo) * 500) / (BeatProMaes[BeatPMSelected].Value) / SmallNoteData[SmallNDSelected].Value;

end;
EDIT:
Wobei die Note dabei eigentlich keine Rolle spielt oder?
Es geht ja um den Takt nicht um die Note.

Danke

gruss

rollstuhlfahrer 16. Mai 2011 11:22

AW: Notenlängen berechnung
 
Irgendwie habe ich das Gefühl, dass die gesamte Berechnung viel zu kompliziert ist. Bei 130 BPM hat 1 Schlag eine Dater von 60/130 = 0,461... s, bei 120 BPM sind das 60/120 = 0,5 s. Jetzt musst du nur noch deiner Zeit pro Schlag eine Notenlänge zuordnen und alle anderen Längen (Zeit) ergeben sich daraus.

Sagen wir: du hast 120 BPM bei 1/4-Note, dann hast du folgende Tabelle:
Code:
120 BPM = 2 Schläge/s => 1 Schlag auf 0,5 s

1/1-Note: 2000ms
1/2-Note: 1000ms
1/4-Note: 500ms
1/8-Note: 250ms
1/16-Note: 125ms
Das so zu berechnen finde ich wesentlich einfacher.

Bernhard

PS: Eine Tabelle/Liste/Array abzufragen ist auch wesentlich einfacher, als immer wieder eine Funktion zum neu berechnen durchlaufen zu lassen. Außerdem musst du das Array nur dann neu berechnen, wenn sich das Tempo oder die Zuordnung ändert (da das in normalen Stücken kaum der Fall ist, würde ich die durchschnittliche Anzahl, wo man sowas braucht mit ~0 angeben).


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 Uhr.
Seite 1 von 4  1 23     Letzte »    

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