![]() |
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 |
AW: Notenlängen berechnung
Schalte mal die Bereichsprüfung an. Eventuell kann es sein, dass du einen versteckten Integer-Überlauf hast.
Bernhard |
AW: Notenlängen berechnung
Zitat:
Die Berechnung müßte doch eigentlich OK sein oder? gruss |
AW: Notenlängen berechnung
Zitat:
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 |
AW: Notenlängen berechnung
Zitat:
Bereichsprüfung wurde erst ausgeführt nach dem NEustart des Projekt warum auch immer. gruss |
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 ;)
|
AW: Notenlängen berechnung
Wie kann ich denn jetzt berechnen anhand dieser Formel
Delphi-Quellcode:
Abhängig vom MidiTracker.Tempo ob das eingeladenen MidiFile auf dem Takt 2/4 oder 4/4 gesetzt werden muss?
// 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; 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... |
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; |
AW: Notenlängen berechnung
Zitat:
Eine Procedure hab ich schon. Und die Funktion zu durchlaufen bei möglichen 4000 Noten ? Jede einzelne Note abfragen?
Delphi-Quellcode:
EDIT:
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; Wobei die Note dabei eigentlich keine Rolle spielt oder? Es geht ja um den Takt nicht um die Note. Danke gruss |
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:
Das so zu berechnen finde ich wesentlich einfacher.
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 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. |
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