Autor Beitrag
NightHawk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: So 27.10.02 13:05 
Salve,

Ich programmiere zur Zeit einen Sequencer mit Sampler. Das Problem daran ist, dass ich fast fertig bin, aber immer noch ein kleines Problem habe.

Es geht um das Timing meiner Noten, die ich an Midi-Endgeräte, die interne Midi-Karte oder an meinen Software-Sampler sende. Ich habe eine Routie, die jede Millisekunde aufgerufen wird, den Timecode um einen Schritt erhöht und schaut, ob der Timecode einer Note identisch ist....falls ja, wird diese oder mehrere Noten dann ausgegeben.

Leider gibt es durch irgendwelche unerklärbaren Rhytmusstörungen ein Problem mit dem Takt meiner Sequencen. Ich habe bereits folgende Arten von Timern probiert:


    Ein externer Thread, der jedesmal mit Sleep(1) ne ms gewartet und dann die Routine aufgerufen hat. War aber nix. Die Rechenzeit, die er gebraucht hat, konnte ich leider auch nicht von Sleep(1) abziehen. Hätte eh nicht geklappt. :?



    TTimer-Componente. Nette Komponente. Einfach zu bedienen, reicht aber nur aus, um nen Wecker zu stellen, der bescheid sagt, wenn die Brötchen fertig sind.... :wink:



    Multimedia-Timer. Diese netten Dinger sind zwar sehr schnell....aber es reicht nicht....auch wenn MS behauptet, die Dinger wären 10ms genau...mein Problem lösen sie nicht wirklich. Habe auch Probiert beim Laufen der Songs die aktuelle Prozess-Priorität auf "REALTIME_PRIORITY_CLASS" zu setzen. War auch schon ein wenig besser, aber immer noch fehlt mir das Tüpfelchen auf dem i.


Insbesondere bei schnellen Songs hört man die Timing-Unterschiede, vor allem wenn schnelle Beckenspiele (nicht an Sex denken....) gefordert werden....

PS. Bevor mir jetzt irgendwelche Super-Gurus (Bitte nicht böse sein, nur spass.... :wink: ) schreiben, dass das bei Windows nicht geht, weil Windows dafür nicht ausgelegt ist, sollten diese Herren sich mal Programme wie Winamp, Mediaplayer, Steinberg-Cubase, Emagic-Logic, Music-Maker usw. anschauen, wo jeweils ein exakter Millisekunden-Timer arbeitet. Scheinbar geht es doch....

Ich habe diese Software bereits auf dem Commodore-Amiga entwickelt, wo Sie ein Timing hatte, das bis jetzt immer noch seine Konkurrenz sucht 8) . Beim Amiga hatte ich allerdings auch zwei frei programmierbare Hardware-Timer!!!! zur Verfügung. Diese konnte ich auf ein Intervall einstellen und auf eine Routine setzen...fertig......

Bitte bitte bitte um Hilfe. Vielleicht liese diesen Text ja jemand, der bei einer der o.a. Softwares mit programmiert hat......

Euer

NightHawk

_________________
Delphi - Die Sprache der Engel
aogwaba
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109



BeitragVerfasst: So 27.10.02 13:42 
Hi!
probier's doch mit 'QueryPerformanceCounter'

Info: www.neobrothers.de (bei den Tutorials).

cu
waba
Raphael82
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Do 31.10.02 11:46 
Schau auch in der Hilfe mal nach GetTickCount!
Bin mir über die genauigkeit nicht sicher, weil ich noch nie so eine exakte Genauigkeit benötigt habe, jedoch ist eins sicher: Mit 99% aller TimerKomponenten, also solchen wie TTimer oder auch dem von DelphiX wirst du nie eine Genauigkeit auf 1ms bekommen. Bei TTimer wirst du keinen Unterschied zwischen 50ms und 1ms merken, weil es ihn dort nicht wirklich gibt. Raphael

Ich bezweifle jedoch ein wenig ob du wirklich jede Millisekunde eine Abfrage starten musst, denn damit könntest du wenn nötig 1000 Noten pro Sekunde spielen lassen, was dich vor ein paar Probleme stellen dürfte: 1. 1000 Noten in einer Sekunde hören sich an wie eine einzelne
2. Schafft es keine Soundkarte 1000 differenzierte Töne pro Sekunde auszugeben und 3. wird es einen sehr schnellen Rechner benötigen um 1000 mla pro Sekunde eine Überprüfung durchzuführen, wenn nötig eine "Note zu senden" und trotzdem nie ungenau durch Rechenzeit zu werden. Mein Tipp: Lass deinen Code nicht ganz so oft ausführen oder finde einen anderen Ansatz. Verstehst du, selbst wenn du 100 Stimmen gleichzeitig spielen lässt und jede irgendwie versetzt ist, benötigt dies keiner Überprüfung in diesem doch sehr geringen Zeitabstand. Der Fehler liegt wo anders.

Mit freundlichen Grüssen, Raphael

_________________
Share your knowledge to receive perfection!
wwerner
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 185



BeitragVerfasst: Do 31.10.02 14:38 
Mein Tip: Rechne doch die Zeit bis zur nächsten Note aus und setzte einen Timer entsprechend.

_________________
Gruß

Wolfgang

----------
zu hause ist es doch am schönsten
NightHawk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Do 31.10.02 19:58 
Hi,

Vielen Dank für die Tips. Werde alles ausprobieren und schreiben, was es gebracht oder was nicht.

Es ist richtig, dass ich nicht jede ms nachfragen muss, ob die nächste Note gespielt werden muss. Eigentlich würde es auch alle 3-8 ms reichen.

Meine Vermutung z.Z. ist jedoch, das der Timer nicht das Problem hat, ungenau zu sein. So etwas gibt es nicht. Jeder Timer is eigentlich ms-Genau. Die Abweichung der Takte liegt wahrscheinlich daran, wie stark sich ein Timer von anderen Prozessen unterbrechen lässt. Ich denke, dass ich eher an den Prioritäten von Threads, Timern oder Prozessen arbeiten muss, sodass sich diese nicht mehr unterbrechen lassen und immer bei einem Timer-Event SOFORT loslegen....

Habe aber keine Ahnung, wie komplex das Windows-Betriebssystem hierbei ist. Da muss ich den guten und alten Amiga mal loben. Das war noch richtiges Multimedia....Dort gab es Interrupt-Handler, wo man einen Code auf RICHTIGE System-Interrupts legen konnte. Diese Interrupts sind das genaueste, was es z.Z. gibt. Wenn die nicht genau wären, dann würde nichts im System funktionieren.

Ich glaube schon, dass es da eine Möglichkeit gibt, genau zu sein. Wahrscheinlich können gewisse "findige" Programmierer die System-Interrupts verwenden.....man weiss ja nie....die verraten keine Tricks....Habe schon mal nachgefragt..

NightHawk

_________________
Delphi - Die Sprache der Engel
georgfischerx
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 37



BeitragVerfasst: Fr 01.11.02 15:28 
:idea: Wie wär's mit einem Hertz - schrittmacher ? Soll bei Rhytmustörungen sehr empfehlenswert sein und helfen ... ... :idea:

War nur ein Witz von Georg
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: Fr 01.11.02 19:08 
GetTickCount(), Timer etc. sind genau genug für die meisten Anwendungen. Für exaktere Anwendungen stellt Windows die Funktionen QueryPerformanceFrequency() und QueryPerformanceCounter() zur Verfügung. Ich habe gerade mal geguckt, wenn ich zweimal direkt hintereinander QueryPerformanceCounter() aufrufe (im Debug-Modus, damit's nicht ganz so schnell läuft (c; ) unterscheiden sich die Zeiten um 0.000001 Sekunden, also eine Mikrosekunde, manchmal um 0, manchmal um zwei Mikrosekunden. Das sollte an Präzision ausreichen ;c)

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
NightHawk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Sa 02.11.02 16:53 
Hi,

Vielen vielen Dank für die Inspirationen. Vor allem die Ideen, mit GetTickCound und QueryPerformanceCounter waren super. Als ich dann auch noch die Frage gelesen habe, warum ich jede ms abfragen muss, ob die Note gespielt werden muss, kam dann ganz die Erleuchtung...

ICH WAR SOOOOO DOOOOF !!!!!

Beim Amiga war das vielleicht möglich. Jedoch habe ich versucht, den Code eins-zu-eins zu konvertieren. Ich habe beim Amiga jede ms die Song-Position um eine bestimmte Position hochgezählt und die Noten abgefragt, ob ihre Zeit gekommen und sie gespielt werden müssen. Beim PC ist dies jedoch fatal, da es keine ms-genauen Timer zur Verfügung stellt, wie damals der Amiga.

Mein Fehler war, dass ich jede ms ca. 5-15ms verloren habe. Zwischen 2 Takten liegen bei 120BPM genau 500ms. Genug Zeit, um hörbare Störungen zu verursachen.

Ich habe jetzt eure Tips befolgt und verwende den MM-Timer nur noch dazu, um die Zeit abzufragen (GetTickCount). Die Entscheidung, wann eine Note fällt, wird durch die ms berechnet ([VergangeneMS] * [TicksProMS]). Konnte sogar die System-Performance leicht schonen, indem ich mit SetTimer() die Resolution auf 2 (statt 0) eingestellt habe. Obwohl der Intervall der Abfrage nur noch bei 4ms liegt und die genauigkeit nun bei 2ms, spielt der Song wunderbar glatt!!!!!

ES LÄUFT SUUUUUPER !!! DANKE !

Hat sich wirklich gelohnt, hier vorbeizuschauen.....

NightHawk

_________________
Delphi - Die Sprache der Engel
Raphael82
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: So 03.11.02 12:46 
Freut mich, finde ich immer gut, wenn sich einer nicht gleich einen ganzen Code posten lassen will sondern mit anregungen, etwas Ehrgeiz, Zeit, Bemühungen und ein paar Denkanstößen selber ans Ziel kommt. So lernt man viel mehr, lernt neue Dinge kennen und weiß beim nächsten mal wenn ein ähnliches Problem auftritt gleich wie die früheren Gedankengänge waren. Soll heißen: Man hat wirklich was gelernt und darf nebenbei und ganz im stillen auch noch ein wenig Stolz auf sich sein! 8)

MfG, Raphael

_________________
Share your knowledge to receive perfection!
damadmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 60



BeitragVerfasst: Mi 06.11.02 21:26 
hi

ist zwar ein wenig zu spät aber ich würd gerne noch was dazu loslassen:
ich bin mir nämlich nicht sicher ob evtl. durch das (vorsichtig ausgedrückt) 'möchtegern' multitasking von windows dabei noch weitere probleme auftreten könnten.

nur noch mal ne anregung. bin mir nicht sicher ob das wirklich einfluss nehmen kann.


gruss

damadmax

_________________
Alle Rechtschreibfehler sind gewollt und sollen meine Individualität verstärkt zum Ausdruck bringen.
NightHawk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Mo 11.11.02 01:14 
Hi,

Nööö. Der Player läuft jetzt seit ner Woche und ist kein bisschen ungenauer als die kommerziellen Versionen.

mfg

NightHawk

_________________
Delphi - Die Sprache der Engel
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Do 28.10.04 15:18 
NightHawk hat folgendes geschrieben:

Multimedia-Timer. Diese netten Dinger sind zwar sehr schnell....aber es reicht nicht....auch wenn MS behauptet, die Dinger wären 10ms genau...mein Problem lösen sie nicht wirklich. Habe auch Probiert beim Laufen der Songs die aktuelle Prozess-Priorität auf "REALTIME_PRIORITY_CLASS" zu setzen. War auch schon ein wenig besser, aber immer noch fehlt mir das Tüpfelchen auf dem i.


Da muss ich dir alerdings rechtgeben. Teilweise ist der Delphi-Timer!!!!!!!!!!!!!!!! genauer. Wenn mein Bruder z.B. vor mir ein Delphi-Programm mit einem Teimer verwendet hatte, läuft mein Multimedia-Timer schneller(schätze mal bis zu dem 4-fachen Tempo)