![]() |
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). |
AW: Notenlängen berechnung
Ich habe die Werte anhand einer Tabelle vorher festgelegt.
Delphi-Quellcode:
Wenn ich jetzt ein midifile importiere bekomme ich die Geschwindigkeit mitgeliefert.
BeatProMaes[0].Name := '2/2';
BeatProMaes[0].Value := 4; BeatProMaes[1].Name := '3/2'; BeatProMaes[1].Value := 6; BeatProMaes[2].Name := '4/2'; BeatProMaes[2].Value := 8; BeatProMaes[3].Name := '2/4'; BeatProMaes[3].Value := 2; BeatProMaes[4].Name := '3/4'; BeatProMaes[4].Value := 3; BeatProMaes[5].Name := '4/4'; BeatProMaes[5].Value := 4; BeatProMaes[6].Name := '5/4'; BeatProMaes[6].Value := 5; BeatProMaes[7].Name := '6/4'; BeatProMaes[7].Value := 6; BeatProMaes[8].Name := '7/4'; BeatProMaes[8].Value := 7; BeatProMaes[9].Name := '9/4'; BeatProMaes[9].Value := 9; Wenn ich es eingeladen habe möchte ich nicht in den Takten rumklicken müssen um die passende Taktart zu dem Stück passend zur Geschwindigkeit einstellen. Wenn ich vorher den 4/4 Takt eingestellt habe und die Geschwindigkeit passt nicht dann schalte ich runter auf 2/4 usw.. bis es halt passt. Und das möchte ich vermeiden. Es ist also abhängig von BeatProMaes[BeatPMSelected].Value Bei 2/4 würde die Geschwindigkeit quasi um 2 heruntergesetzt. Wenn der Index = 3 Nur um das zu berechnen finde ich keinen Anhaltspunkt. EDIT: Es geht um den Takt nicht um die Note. ;) Vorher war die Geschwindigkeit MidiTracker.Tempo = 120 Nun liefert das MidiFile eine von 100 also MidiTracker.Tempo = 100 Und damit muss ich jetzt auf den Takt schließen. Das ist mein Problem gruss |
AW: Notenlängen berechnung
Zitat:
![]() |
AW: Notenlängen berechnung
so wie ich gelesen habe ist BPM abhängig bzw.. mit dem Takt verbunden.
Wenn ich die länge der Note verändere von 1/4 auf 1/8 spielt das stück nicht langsamer oder schneller. Es ändert sich lediglich die Notenlänge wobei die Geschwindigkeit gleich bleibt. Teste das mal mit Anvil Studio 2011 Dann weist was ich meine. gruss |
AW: Notenlängen berechnung
Und ja vergessen!
Wenn ich einen 4/4 Takt spiele ist dieser immer Schneller als ein 2/4 Takt Da dieser nur die Hälfte von 4/4 ist Oder? Das hat nichts damit zu tun ob ich einen 4/4 Takt langsam oder schneller spielen kann. Spiel mal dein Johnny B. Good im 2/4 Takt ;) gruss |
AW: Notenlängen berechnung
Zitat:
Okay, wusste nicht, dass BPM immer die Viertelnoten angibt. Dachte es bezieht sich auf Takte. Bin halt nur Laie... |
AW: Notenlängen berechnung
Die BPM geben ja nur die Schläge pro Minute ein.
60 BPM -> 1 Schlag pro Sekunde. Angenommen jeweils ein Takt: 1/4 - 1 Sekunde Dauer 2/4 - 2 Sekunden Dauer 3/4 - 3 Sekunden Dauer 4/4 - 4 Sekunden Dauer 5/4 - 5 Sekunden Dauer 7/4 - 7 Sekunden Dauer 1/2 - 0,5 Sekunden Dauer 2/2 - 1 Sekunde Dauer 3/2 - 1,5 Sekunden Dauer 4/2 - 2 Sekunden Dauer Beim X/4-Takt ist die Viertelnote einen Schlag lang, beim X/2-Takt ist die halbe Note 1 Schlag lang, usw. |
AW: Notenlängen berechnung
Zitat:
Also wenn ich nun 2/4 takt spiele ändert sich meine Geschwindigkeit. Mein problem ist nun zu erkennen bzw. zu errechnen wann ich den richtigen takt zuweise da ansonsten das importierte MidiFile in der falschen Geschwindigkeit spielt. kann das von Hand zuweisen aber das will ich eben nicht. gruss |
AW: Notenlängen berechnung
Der Takt steht im Midi-File selbst drin.
|
AW: Notenlängen berechnung
Zitat:
Dann wäre es ja kein problem. gruss |
AW: Notenlängen berechnung
Moment, kann ich dir raussuchen.
|
AW: Notenlängen berechnung
Tempo :
Code:
Berechnung Tempo: 60 000 000 / AA BB CC
FF 51 03 AA BB CC
Takt :
Code:
AA Zähler
FF 58 04 AA BB CC DD
BB Nenner (2=4, 3=8, 4=16 usw.) CC : Anzahl der Midi-Clocks DD : Anzahl vom Zweiunddreißigstelnoten in einer Viertelnote |
AW: Notenlängen berechnung
Zitat:
Danke. gruss |
AW: Notenlängen berechnung
Emil, das hat er schon, schau mal einen Post höher ;)
|
AW: Notenlängen berechnung
Zitat:
Ich denke er spricht vom Block "Zeit Signatur" kann nur hiermit dienen..
Delphi-Quellcode:
Aber das ist mein Schreiber muss mal sehn wo ich die bytes im Reader abrufen kann.
// Zeit Signatur
Bytes[30] := 0; // delta Zeit Bytes[31] := 255; // FF (Meta Befehl) Bytes[32] := 88; // Zeit Signatur Befehl Bytes[33] := 4; // 4 bytes Bytes[34] := 4; // Zähler // Nenner (2 = 1/4, 3 = 1/8, 4 = 1/16, etc.) Bytes[35] := SmallNoteData[SmallNDSelected].Nenner; Bytes[36] := 24; // ? // 8 = 32 Note in 1/4 Note; Bytes[37] := SmallNoteData[SmallNDSelected].Value; müßten dann die ersten 4 bytes sein. Werd ich dann in meinem Writer auch noch addieren müssen. War ja vorher alles fest auf 4/4 ausgelegt. gruss |
AW: Notenlängen berechnung
Ich spreche vom MIDI-Event FF51 (Set Tempo) und FF58 (Time Signature).
|
AW: Notenlängen berechnung
Zitat:
|
AW: Notenlängen berechnung
Zitat:
Delphi-Quellcode:
Die werte sind Dezimal ;)
Bytes[31] := 255; // FF (Meta Befehl)
Bytes[32] := 88; // Zeit Signatur Befehl Bytes[33] := 4; // 4 bytes EDIT: Du warst mal wieder schneller... Kein problem beim umrechnen der writer ist in HEX ausgelegt. gruss |
AW: Notenlängen berechnung
Zitat:
Kann man deine Projekt schon mal antesten? Klingt irgendwie interessant. |
AW: Notenlängen berechnung
Zitat:
Beim lesen weiss ich noch nicht wie ich da dran komme da den Reader mein Freund Silhwan geschrieben hat. Müßte ihn erstmal anschreiben deswegen. Jo hab es doch hochgeladen Das Virtual Piano.. Bin mittlerweile aber schon ein stück weiter. gruss |
AW: Notenlängen berechnung
Vieleicht mal hier schaun:
![]() |
AW: Notenlängen berechnung
Zitat:
Muss auf Sihwan warten da ich ihm nicht ins Handwerk pfuschen will. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:21 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