Stelle dir unsere Vorschläge etwa so vor:
(Jede Zeile stellt ein OnTimer-Event dar, sagen wir mal 250ms pro Zeile.)
Code:
DMX-Szenenanweisung Kanal1 Kanal2 Kanal3 ... Kanal479
- 250 0
- 250 0
- 250 0
- 250 0
Fade to 90 Ch1 2sec 230 0
- 210 0
Fade to 100 Ch2 1sec 190 25
- 170 50
- 150 75
- 130 100
- 110 100
- 90 100
- 90 100
- 90 100
Die DMX-Szenenanweisungen sind das, was du bereits hast. Diese sorgen dafür, dass in die Liste für den betreffenden Kanal ab Auftreten die nächsten N Zwischenwerte geschrieben werden. Dies passiert bei jedem Timer-Tick, je für eine Zeiteinheit weiter als vorher, aber eine Anweisung schreibt alle daraus resultierenden zukünftigen Werte bereits in einem Rutsch vorab in ihren Kanal. Nachdem die Szenenanweisungen fertig sind, gibst du nur noch die Werte der Kanäle aus und weiter geht's mit dem nächsten Tick. Das Geraffel mit diesem Pseudo-Delay ist ja noch viel schlimmer als mehrere Timer!
Bei meiner kleinen DMX-Dimmer Software habe ich es allerdings noch anders gemacht. Dort habe ich alle Funktionen (im Wesentlichen Fades, aber mit unterschiedlichen Interpolationsarten) in nette kleine Klassen verpackt, die je eine Fade-Sequenz auf einem Kanal darstellen. Jede der Instanzen kennt ihren Anfangszeitpunkt relativ zum Abspielstart der Gesamtszene, und ihre Länge sowie Start- und Endwert. Ich habe es nun so gemacht, dass ich diese Klasse fragen kann: Welchen Wert hast du denn zum Zeitpunkt X? Die Klasse gibt mir einen Wert zurück, und somit brauche ich in meinem Play-Thread nur noch Aktuelle Uhrzeit minus Startuhrzeit nehmen, habe ein exaktes Delta, und frage einfach alle gerade aktiven Sequenzen, welchen Wert sie mir den geben möchten für dieses Delta. Das hübsch in ein Array, und weg damit über DMX.
Der riesen Vorteil: Ich bin komplett unabhängig vom konkreten Intervall, mit dem ich eine Szene abspiele. (Manche DMX-Konverter sind da etwas niggelich, deswegen habe ich ein SpinEdit mit dem man zwischen 5ms und 1000ms Intervallen verstellen kann - on the fly.)
Weiterer Vorteil: Man kann beliebig in einer Szene hin und her springen und bekommt die für den Zeitpunkt aktuellen Werte. In dem angehängten Bild habe ich z.B. die Trackbar direkt an die Position gezogen, und die kleinen Quadrate rechts der Kanäle zeigen den korrekten Wert (die sind direkt aus dem Output-Array gefärbt).
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)