; Trigger-Types Enumeration #Trigger_Tick ; Tick #Trigger_Rectangle ; Rechteck #Trigger_Sawtooth ; Sägezahn #Trigger_Slope ; Steigung #Trigger_Triangle ; Dreick #Trigger_Wave ; Welle #Trigger_Noise ; Rauschen #Trigger_Custom ; Benutzerdefiniert EndEnumeration ; Trigger-States Enumeration #Trigger_Waiting = -1 ; Warten (auf den Vorläufer-Trigger) #Trigger_Silence = 0 ; Ruhe ((Wiederholungs-)Verzögerung ) #Trigger_Signal = 1 ; Signalausgabe (Werte über 1 sind Wiederholungen) EndEnumeration ; Trigger-Unterstruktur Structure TriggerIteration Delay.i Count.i EndStructure ; Trigger-Struktur Structure Trigger Trigger.i Type.i Start.i Delay.i Length.i ParentTrigger.i Time.i Value.f State.i Tick.i Pause.i Iteration.TriggerIteration *Function EndStructure #MaxTriggerNumber = $FFFF #NotTriggerNumber = ~#MaxTriggerNumber Global Dim *Trigger.Trigger(0) Global NewList Trigger.Trigger() Procedure.i TriggerID(Trigger.i) If Trigger & #NotTriggerNumber ProcedureReturn Trigger Else ProcedureReturn *Trigger(Trigger) EndIf EndProcedure Procedure FreeTrigger(Trigger.i) Protected *Trigger.Trigger = TriggerID(Trigger) If Not *Trigger\Trigger & #NotTriggerNumber *Trigger(*Trigger\Trigger) = 0 EndIf ChangeCurrentElement(Trigger(), *Trigger) EndProcedure Procedure CreateTrigger(Trigger.i, Type.i, Delay.i=0, Length.i=-1) Protected *Trigger.Trigger = AddElement(Trigger()) If Trigger = #PB_Any Trigger = *Trigger ElseIf Trigger & #NotTriggerNumber ProcedureReturn #False Else If ArraySize(*Trigger()) < Trigger ReDim *Trigger(Trigger) ElseIf *Trigger(Trigger) FreeTrigger(*Trigger(Trigger)) EndIf *Trigger(Trigger) = *Trigger EndIf With *Trigger \Trigger = Trigger \Type = Type \Start = ElapsedMilliseconds() \Delay = Delay \Length = Length If \Type <> #Trigger_Tick And Length = -1 \Length = $7FFFFFFF EndIf EndWith ProcedureReturn *Trigger EndProcedure Prototype.f TriggerCallback(Time.f) Procedure CreateCustomTrigger(Trigger.i, *Function, Delay.i=0, Length.i=-1) Protected *Trigger.Trigger = CreateTrigger(Trigger, #Trigger_Custom, Delay, Length) *Trigger\Function = *Function ProcedureReturn *Trigger EndProcedure Procedure TriggerIteration(Trigger.i, Delay.i, Count.i=0) Protected *Trigger.Trigger = TriggerID(Trigger) With *Trigger\Iteration \Delay = Delay \Count = Count EndWith EndProcedure Procedure ParentTrigger(Trigger.i, ParentTrigger.i) Protected *Trigger.Trigger = TriggerID(Trigger) With *Trigger \ParentTrigger = ParentTrigger EndWith EndProcedure Procedure CurrentParrentTriggerTime(Trigger.i, Time) Protected *Trigger.Trigger = TriggerID(Trigger) With *Trigger If \ParentTrigger CurrentTriggerTime = CurrentParrentTriggerTime(\ParentTrigger, Time) Else If \Pause CurrentTriggerTime = \Pause-\Start Else CurrentTriggerTime = Time-\Start EndIf EndIf ProcedureReturn CurrentTriggerTime-\Delay EndWith EndProcedure Procedure ExamineTriggers() Protected Difference, Tick, CurrentTriggerTime, Time = ElapsedMilliseconds() ForEach Trigger() : With Trigger() Tick = 0 If \Pause CurrentTriggerTime = \Pause-\Start Else CurrentTriggerTime = Time-\Start EndIf If \ParentTrigger CurrentTriggerTime = CurrentParrentTriggerTime(\ParentTrigger, Time) EndIf If CurrentTriggerTime < 0 \State = #Trigger_Waiting Else \State = #Trigger_Silence EndIf \Time = CurrentTriggerTime \Value = 0 Difference = \Time - \Delay If \Iteration\Delay > 0 If \Iteration\Count = 0 Or Int( Difference / \Iteration\Delay ) <= \Iteration\Count If Difference >= 0 Tick = Int( Difference / \Iteration\Delay ) Difference = Difference % \Iteration\Delay EndIf EndIf EndIf Select \Type Case #Trigger_Tick If Difference >= 0 And \Length < Tick \Value = 1.0 \Length + 1 \State = Tick+1 EndIf Case #Trigger_Rectangle If Difference >= 0 And Difference <= \Length \Value = 1.0 \State = Tick+1 EndIf Case #Trigger_Sawtooth If Difference >= 0 And Difference <= \Length \Value = Difference / \Length \State = Tick+1 EndIf Case #Trigger_Slope If Difference >= 0 And Difference <= \Length \Value = Difference / \Length \State = Tick+1 ElseIf Difference > \Length \Value = 1.0 EndIf Case #Trigger_Triangle If Difference >= 0 And Difference <= \Length/2 \Value = Difference / \Length * 2 \State = Tick+1 ElseIf Difference > \Length/2 And Difference <= \Length \Value = (\Length-Difference) / \Length * 2 \State = Tick+1 EndIf Case #Trigger_Wave If Difference >= 0 And Difference <= \Length \Value = 0.5-Cos(#PI*2*Difference/\Length)*0.5 \State = Tick+1 EndIf Case #Trigger_Noise If Difference >= 0 And Difference <= \Length \Value = Random(2147483647)/2147483647.0 \State = Tick+1 EndIf Case #Trigger_Custom If Difference >= 0 And Difference <= \Length TriggerCallback.TriggerCallback = \Function \Value = TriggerCallback(Difference/\Length) \State = Tick+1 EndIf EndSelect EndWith : Next EndProcedure Procedure RestartTrigger(Trigger.i) Protected *Trigger.Trigger = TriggerID(Trigger) With *Trigger \Start = ElapsedMilliseconds() EndWith EndProcedure Procedure.f TriggerValue(Trigger.i) Protected *Trigger.Trigger = TriggerID(Trigger) ProcedureReturn *Trigger\Value EndProcedure Procedure.i TriggerTime(Trigger.i) Protected *Trigger.Trigger = TriggerID(Trigger) ProcedureReturn *Trigger\Time EndProcedure Procedure.i TriggerState(Trigger.i) Protected *Trigger.Trigger = TriggerID(Trigger) ProcedureReturn *Trigger\State EndProcedure Procedure PauseTrigger(Trigger.i) Protected *Trigger.Trigger = TriggerID(Trigger) With *Trigger If Not \Pause \Pause = ElapsedMilliseconds() EndIf EndWith EndProcedure Procedure ResumeTrigger(Trigger.i) Protected *Trigger.Trigger = TriggerID(Trigger) With *Trigger If \Pause \Start + (ElapsedMilliseconds()-\Pause) \Pause = 0 EndIf EndWith EndProcedure ; IDE Options = PureBasic 4.51 RC 1 (Windows - x86) ; CursorPosition = 17 ; EnableXP