Hast du in der StageView oder in der DMX Ausgabe geschaut?
1 frame hat ca 40ms...
Das kann weder die StageView, noch die Cuelist richtig anzeigen. Wie JP schon gesagt hat ist alles unter 100ms am PC etwas schwierig...
Gruß
Nutzer99
Ich habe in das Licht in echt beobachtet. Also die DMX Ausgabe.
Mein DMX Controller kann nichts unter ~40FPS darstellen also heißt ein abstand von 25ms +-10ms sollten machbar sein
Folgende Tests habe ich gemacht
Abstand von 30ms
- Funktioniert in 90% der fällen ohne Probleme. Hier und da wird mal eine cue verschluckt alle 5 Versuche

Abstand von 50ms (sichtbarer unterschied zum vorherigem)
- Funktioniert ohne Probleme

Abstand von 100ms (sichtbarer unterschied zum vorherigem)
- Funktioniert ohne Probleme

Genau so wie ich es haben mit dem "workarround" über ein Wait
- Funktioniert ohne Probleme
- Genau so wie ich es haben will ohne auch nur eine einzige Verzögerung

Genau das gleiche nur mit Timecodes
- Funktioniert wie mehrfach gesagt nicht richtig.
Trifft jedenfalls nicht den Timecode

Nur beim Timecode ist es nicht möglich was für mich ein eindeutiges zeichnen ist das irgendwo ein Fehler sein muss.
Ich habe schon genug Software unter Windows benutz benutzt welche einigermaßen zeitkritisch sind (FL Studio, Abelton Live, Premiere Pro, After Effects, Unity, Unreal Engine 5).
Jede dieser Software kann Frame Perfekt im loop etwas abspielen mit nur wenigen ms abstand ohne auch nur ein einzigen Delay.
Möglich ist es also nach eigenen Erfahrungswerten. Nur der Timecode in DMXC3 kann das nicht..
Ein Echtzeitbetriebssystem wäre komplett overkill. Es geht sich ja nicht um tausenstel nanosekunden Genauigkeit sondern um einige ms (40ms ist garnichts wobei es in dem beispiel ja um gerade mal 100ms - 200ms geht) und das ist komplett im rahmen des machbaren in Windows.
Ich hab mir mal die Zeit genommen um etwas zu analysieren 
- Tick = Der akuelle Tick der alle 40ms geupdated wird
- CurrentTime = blockAlignedStream.CurrentTime.TotalMilliseconds
- WavePosition = Die aktuell abgespielten millisekunden berechnet durch geschriebene bytes
- Stopwatch = Eine Stopwatch welche beim ersten tickevent getriggert wird (also fast (+-5ms) zeitgleich mit dem abspielen der datei)
Die Audiodatei war eine 300 BPM Metronom (4 Sekunden)
| Tick
| CurrentTime ms | WavePosition ms | Stopwatch ms |
| 1
| 300
| 0
| 0,7955
|
| 2
| 300
| 43,89583333
| 51,8418
|
| 3
| 300
| 88,89583333
| 96,8444
|
| 4
| 300
| 129,4583333
| 137,417
|
| 5
| 450
| 176,4791667
| 186,4052
|
| 6
| 450
| 223,4375
| 231,3759
|
| 7
| 450
| 270,4791667
| 280,4115
|
| 8
| 600
| 317,1041667
| 327,0722
|
| 9
| 600
| 365,0416667
| 372,9844
|
| 10
| 600
| 412,1041667
| 422,0394
|
| 11
| 750
| 460,125
| 468,0674
|
| 12
| 750
| 511,1041667
| 519,0593
|
| 13
| 750
| 550,125
| 560,0567
|
| 14
| 900
| 601,125
| 609,1253
|
| 15
| 900
| 646,1041667
| 654,1301
|
| 16
| 900
| 693,1666667
| 703,1301
|
| 17
| 900
| 741,1458333
| 749,1668
|
| 18
| 1050
| 787,1041667
| 795,0572
|
| 19
| 1050
| 836,1041667
| 846,0595
|
| 20
| 1050
| 892,1875
| 902,1885
|
| 21
| 1200
| 933,2916667
| 943,3638
|
| 22
| 1200
| 982,2916667
| 990,4593
|
| 23
| 1200
| 1037,1875
| 1047,1289
|
| 24
| 1350
| 1085,145833
| 1093,1586
|
| 25
| 1350
| 1134,708333
| 1144,6394
|
| 26
| 1350
| 1175,6875
| 1185,6123
|
| 27
| 1500
| 1224,75
| 1232,7388
|
| 28
| 1500
| 1271,729167
| 1281,709
|
| 29
| 1500
| 1323,104167
| 1331,1335
|
| 30
| 1650
| 1364,041667
| 1372,0754
|
| 31
| 1650
| 1411,604167
| 1421,6046
|
| 32
| 1650
| 1457,5
| 1467,4906
|
| 33
| 1800
| 1510,458333
| 1518,4261
|
| 34
| 1800
| 1551,479167
| 1559,4537
|
| 35
| 1800
| 1596,520833
| 1606,4907
|
| 36
| 1800
| 1645,604167
| 1653,5956
|
| 37
| 1950
| 1686,666667
| 1694,8007
|
| 38
| 1950
| 1737,729167
| 1747,8194
|
| 39
| 1950
| 1790,5625
| 1798,5032
|
| 40
| 2100
| 1830,583333
| 1840,518
|
| 41
| 2100
| 1883,645833
| 1891,7263
|
| 42
| 2100
| 1929,75
| 1937,8448
|
| 43
| 2250
| 1980,729167
| 1988,6952
|
| 44
| 2250
| 20:30:00
| 2028,8338
|
| 45
| 2250
| 2060,895833
| 2068,8445
|
| 46
| 2400
| 2106,5
| 2114,4801
|
| 47
| 2400
| 2147,458333
| 2155,3962
|
| 48
| 2400
| 2192,5
| 2202,4136
|
| 49
| 2400
| 2240,5
| 2248,4656
|
| 50
| 2550
| 2289,3125
| 2297,2823
|
| 51
| 2550
| 2333,4375
| 2343,4593
|
| 52
| 2550
| 2386,291667
| 2394,2362
|
| 53
| 2700
| 2427,833333
| 2435,7625
|
| 54
| 2700
| 2471,875
| 2481,7906
|
| 55
| 2700
| 2524,833333
| 2532,7514
|
| 56
| 2850
| 2571,833333
| 2579,7739
|
| 57
| 2850
| 2615,875
| 2625,8139
|
| 58
| 2850
| 2667,854167
| 2675,7824
|
| 59
| 3000
| 2708,833333
| 2716,8225
|
| 60
| 3000
| 2755,833333
| 2765,7653
|
| 61
| 3000
| 2803,833333
| 2811,7633
|
| 62
| 3150
| 2851,4375
| 2861,3976
|
| 63
| 3150
| 2896,604167
| 2906,6434
|
| 64
| 3150
| 2950,5
| 2958,6264
|
| 65
| 3150
| 2992,604167
| 3002,648
|
| 66
| 3300
| 3050,395833
| 3058,314
|
| 67
| 3300
| 3091,354167
| 3099,2869
|
| 68
| 3300
| 3137,916667
| 3147,8286
|
| 69
| 3450
| 3180,895833
| 3188,8205
|
| 70
| 3450
| 3224,875
| 3232,8145
|
| 71
| 3450
| 3273,104167
| 3283,0937
|
| 72
| 3600
| 3317,333333
| 3327,3989
|
| 73
| 3600
| 3371,270833
| 3379,1912
|
| 74
| 3600
| 3416,75
| 3426,7078
|
| 75
| 3750
| 3460,083333
| 3468,1819
|
| 76
| 3750
| 3504,6875
| 3512,6289
|
| 77
| 3750
| 3551,729167
| 3561,6292
|
| 78
| 3750
| 3596,770833
| 3606,7086
|
| 79
| 3900
| 3647,854167
| 3655,8567
|
| 80
| 3900
| 3696,729167
| 3706,641
|
| 81
| 3900
| 3737,729167
| 3747,6335
|
| 82
| 4000
| 3786,708333
| 3794,6446
|
| 83
| 4000
| 3830,791667
| 3840,7645
|
| 84
| 4000
| 3880,8125
| 3888,8916
|
| 85
| 4000
| 3926,854167
| 3934,9296
|
| 86
| 4000
| 3974,75
| 3984,6784
|
| 87
| 4000
| 4022,791667
| 4030,7311
|

Meine Empfehlung wäre
statt
SceneTriggerManager.getInstance().getSceneTriggers<TimecodeSceneTrigger>().ForEach<TimecodeSceneTrigger>((Action<TimecodeSceneTrigger>) (t => t.Timecode = (long) blockAlignedStream.CurrentTime.TotalMilliseconds));
lieber
double wavePositionMs = WaveOut.GetPosition() * 1000.0 / WaveFormat.BitsPerSample / WaveFormat.Channels * 8 / WaveFormat.SampleRate;
SceneTriggerManager.getInstance().getSceneTriggers<TimecodeSceneTrigger>().ForEach<TimecodeSceneTrigger>((Action<TimecodeSceneTrigger>) (t => t.Timecode = (long) wavePositionMs));
Dann ist der Timestamp perfekt ohne Abweichung vom abspielen.
Fazit:
Mit dem aktuellen Code wird eine Genauigkeit von ~8 FPS (~120ms) erzielt wobei es eigentlich ja 40ms mit einem TImecode von 25 FPS wäre
Wenn ihr mir jetzt immer noch nicht glaubt dann weiß ich auch nicht mehr 
Bitte überzeugt euch selbst im Anhang