Delphi-PRAXiS

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).

EWeiss 16. Mai 2011 11:37

AW: Notenlängen berechnung
 
Ich habe die Werte anhand einer Tabelle vorher festgelegt.

Delphi-Quellcode:
    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 jetzt ein midifile importiere bekomme ich die Geschwindigkeit mitgeliefert.
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

Luckie 16. Mai 2011 12:14

AW: Notenlängen berechnung
 
Zitat:

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.
Was hat denn der Takt mit der Geschwindigkeit und der tatsächlichen Notenlänge zu tun? Ich kann einen Walzer im 3/4 Takt schnell oder langsam spielen. Ich kann einen Rocksong im 4/4 Takt auch langsam oder schnell spielen (Johnny B. Good ist genauso im 4/4 Takt, wie Wonderful Tonight.) Und damit variiert natürlich die Notenlänge. Nicht umsonst gibt es in der Musik Bezeichnungen für das Spieltempo [http://de.wikipedia.org/wiki/Tempo_%..._Tempoangaben] bzw. die Angabe der BPM für das Metronom.

EWeiss 16. Mai 2011 12:21

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

EWeiss 16. Mai 2011 12:49

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

Namenloser 16. Mai 2011 12:58

AW: Notenlängen berechnung
 
Zitat:

Zitat von EWeiss (Beitrag 1101085)
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?

Wenn die BPM-Zahl gleich bleibt, dann müsste das gleiche Stück im 4/4-Takt doppelt so schnell sein wie im 2/4-Takt, da ja pro Takt doppelt so viele Noten gespielt werden wie beim 2/4.
Okay, wusste nicht, dass BPM immer die Viertelnoten angibt. Dachte es bezieht sich auf Takte. Bin halt nur Laie...

divBy0 16. Mai 2011 13:08

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.

EWeiss 16. Mai 2011 13:23

AW: Notenlängen berechnung
 
Zitat:

Zitat von divBy0 (Beitrag 1101088)
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.

Korrekt(Auch wenn deine Zuweisungen nicht stimmen) opps.. nee stimmen schon.

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

divBy0 16. Mai 2011 13:32

AW: Notenlängen berechnung
 
Der Takt steht im Midi-File selbst drin.

EWeiss 16. Mai 2011 13:48

AW: Notenlängen berechnung
 
Zitat:

Zitat von divBy0 (Beitrag 1101099)
Der Takt steht im Midi-File selbst drin.

Die Frage nur wo ?
Dann wäre es ja kein problem.

gruss

divBy0 16. Mai 2011 13:49

AW: Notenlängen berechnung
 
Moment, kann ich dir raussuchen.

divBy0 16. Mai 2011 13:59

AW: Notenlängen berechnung
 
Tempo :
Code:
FF 51 03 AA BB CC
Berechnung Tempo: 60 000 000 / AA BB CC


Takt :

Code:
FF 58 04 AA BB CC DD
AA Zähler

BB Nenner (2=4, 3=8, 4=16 usw.)

CC : Anzahl der Midi-Clocks

DD : Anzahl vom Zweiunddreißigstelnoten in einer Viertelnote

EWeiss 16. Mai 2011 14:20

AW: Notenlängen berechnung
 
Zitat:

Zitat von divBy0 (Beitrag 1101105)
Moment, kann ich dir raussuchen.

Das wäre nett ..
Danke.

gruss

DeddyH 16. Mai 2011 14:21

AW: Notenlängen berechnung
 
Emil, das hat er schon, schau mal einen Post höher ;)

EWeiss 16. Mai 2011 14:25

AW: Notenlängen berechnung
 
Zitat:

Zitat von DeddyH (Beitrag 1101119)
Emil, das hat er schon, schau mal einen Post höher ;)

Jup war schneller als ich schreiben konnte.
Ich denke er spricht vom Block "Zeit Signatur"

kann nur hiermit dienen..
Delphi-Quellcode:
  // 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;
Aber das ist mein Schreiber muss mal sehn wo ich die bytes im Reader abrufen kann.
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

divBy0 16. Mai 2011 14:28

AW: Notenlängen berechnung
 
Ich spreche vom MIDI-Event FF51 (Set Tempo) und FF58 (Time Signature).

divBy0 16. Mai 2011 14:30

AW: Notenlängen berechnung
 
Zitat:

Zitat von EWeiss (Beitrag 1101121)
Delphi-Quellcode:
  // 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;

Du hast das ja alles dezimal... Das kann aber ganz schön fies werden, mit der ganzen Umrechnerei. :wink:

EWeiss 16. Mai 2011 14:31

AW: Notenlängen berechnung
 
Zitat:

Zitat von divBy0 (Beitrag 1101123)
Ich spreche vom MIDI-Event FF51 (Set Tempo) und FF58 (Time Signature).

Jo Danke dann ist es das Bytes[33]..

Delphi-Quellcode:
  Bytes[31] := 255; // FF (Meta Befehl)
  Bytes[32] := 88; // Zeit Signatur Befehl
  Bytes[33] := 4; // 4 bytes
Die werte sind Dezimal ;)

EDIT:
Du warst mal wieder schneller...
Kein problem beim umrechnen der writer ist in HEX ausgelegt.

gruss

divBy0 16. Mai 2011 14:37

AW: Notenlängen berechnung
 
Zitat:

Zitat von EWeiss (Beitrag 1101127)
Jo Danke dann ist es das Bytes[33]..

Bist du sicher, dass es immer das Byte[33] ist?

Kann man deine Projekt schon mal antesten? Klingt irgendwie interessant.

EWeiss 16. Mai 2011 14:42

AW: Notenlängen berechnung
 
Zitat:

Zitat von divBy0 (Beitrag 1101130)
Zitat:

Zitat von EWeiss (Beitrag 1101127)
Jo Danke dann ist es das Bytes[33]..

Bist du sicher, dass es immer das Byte[33] ist?
Kann man deine Projekt schon mal antesten? Klingt irgendwie interessant.

Beim schreiben ja ..
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

Blup 16. Mai 2011 15:19

AW: Notenlängen berechnung
 
Vieleicht mal hier schaun: http://www.sonicspot.com/guide/midifiles.html

EWeiss 16. Mai 2011 15:44

AW: Notenlängen berechnung
 
Zitat:

Zitat von Blup (Beitrag 1101145)

Danke den kannte ich schon ;)
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