diff --git a/src/main/kotlin/de/moritzruth/lampenfieber/Main.kt b/src/main/kotlin/de/moritzruth/lampenfieber/Main.kt index 06a1dae..b0d539c 100644 --- a/src/main/kotlin/de/moritzruth/lampenfieber/Main.kt +++ b/src/main/kotlin/de/moritzruth/lampenfieber/Main.kt @@ -603,49 +603,10 @@ val show = createShow { } lightStep(StepCue.Text("Maria", "Hallo, Ingo", "beim ersten Laut")) { - Tops.left.brightness.fade(20.percent, 3.seconds) Tops.right.brightness.fade(100.percent, 3.seconds) } - lightStep(StepCue.Text("Kathi", "Tag, Christine", "beim ersten Laut")) { - Tops.right.brightness.fade(20.percent, 3.seconds) - Tops.left.brightness.fade(100.percent, 3.seconds) - } - - lightStep(StepCue.Text("Maria", "Hallo, Jakob", "beim ersten Laut")) { - Tops.left.brightness.fade(20.percent, 3.seconds) - Tops.right.brightness.fade(100.percent, 3.seconds) - } - - lightStep(StepCue.Text("Kathi", "Tag, Gudrun", "beim ersten Laut")) { - Tops.right.brightness.fade(20.percent, 3.seconds) - Tops.left.brightness.fade(100.percent, 3.seconds) - } - - lightStep(StepCue.Text("Maria", "Hallo, Achim", "beim ersten Laut")) { - Tops.left.brightness.fade(20.percent, 3.seconds) - Tops.right.brightness.fade(100.percent, 3.seconds) - } - - lightStep(StepCue.Text("Kathi", "Hallo, Moni", "beim ersten Laut")) { - Tops.right.brightness.fade(50.percent, 3.seconds) - Tops.left.brightness.fade(100.percent, 3.seconds) - } - - lightStep(StepCue.Text("Kathi", "in dem Musical?", "beim letzten Wort")) { - Tops.left.brightness.fade(50.percent, 3.seconds) - } - } - - scene("3.7") { - step(StepCue.MusicStart("Terminhektik", 1.minutes + 30.seconds)) { - actors { - // TODO: Woher? - +"Sven" - +"Tina" - +"Eva" - } - + step(StepCue.MusicStart("Rope-Skipping-Tanz", 3.minutes)) { onRun { Washs.both.forEach { it.colorWheelMode.static(CoemarProWash.ColorWheelMode.WarmWhite) @@ -682,10 +643,8 @@ val show = createShow { } lightStep(StepCue.Custom("Nächster Klavier-Ton")) { - Washs.both.forEach { it.brightness.fade(100.percent, 200.milliseconds) } Washs.left.beamAngle.sine(2.seconds, start = 0.percent) Washs.right.beamAngle.sine(2.seconds, start = 100.percent) - FrontLights.all.forEach { it.brightness.fade(50.percent, 30.seconds) } } lightStep(StepCue.Custom("5× gleicher Klavier-Ton")) { @@ -713,18 +672,97 @@ val show = createShow { Washs.left.colorWheelMode.static(CoemarProWash.ColorWheelMode.Rotate(30.percent, false)) Washs.right.colorWheelMode.static(CoemarProWash.ColorWheelMode.Rotate(30.percent, true)) } + + lightStep(StepCue.Custom("Crash-Becken, Klavier-Solo")) { + Washs.both.forEach { it.brightness.off(200.milliseconds) } + } + + lightStep(StepCue.Custom("+2 Takte")) { + FrontLights.all.forEach { it.brightness.fade(50.percent, 30.seconds) } + bar.brightness.sine(4.seconds, 20.percent, 50.percent) + bar.color.static(Color(40.degrees, 25.percent)) + + Washs.both.forEach { + it.brightness.fade(100.percent, 200.milliseconds) + it.beamAngle.sine(4.seconds, start = 100.percent) + } + } + + lightStep(StepCue.Custom("Crash-Becken, Klavier-Solo")) { + Washs.both.forEach { it.brightness.fade(0.percent, 200.seconds) } + } + + lightStep(StepCue.Custom("+1 Takt")) { + Washs.both.forEach { + it.tilt.static(270.degrees) + it.beamAngle.fade(100.percent, 500.milliseconds) + it.colorWheelMode.static(CoemarProWash.ColorWheelMode.WarmWhite) + } + } + + lightStep(StepCue.Custom("Schlagzeug-Einsatz")) { + Washs.both.forEach { + it.brightness.static(100.percent) + it.strobeSpeed.static(50.percent) // TODO: Mit dem Schlagzeug matchen + } + } + + lightStep(StepCue.Custom("Nächster Takt-Anfang")) { + Washs.both.forEach { + it.brightness.static(100.percent) + it.strobeSpeed.static(0.percent) + it.tilt.static(180.degrees) + } + + Washs.left.colorWheelMode.static(CoemarProWash.ColorWheelMode.Rotate(30.percent, false)) + Washs.right.colorWheelMode.static(CoemarProWash.ColorWheelMode.Rotate(30.percent, true)) + } + + lightStep(StepCue.Custom("Hi-Hat-Kuppe wird malträtiert")) { + bar.brightness.sine(2.seconds, 20.percent, 50.percent) + } + + lightStep(StepCue.Custom("Breakdown am Ende")) { + bar.brightness.fade(25.percent, 200.milliseconds) + FrontLights.all.forEach { it.brightness.off() } + Washs.both.forEach { it.brightness.off(200.milliseconds) } + + launch { + delay(200) + Washs.both.forEach { it.colorWheelMode.static(CoemarProWash.ColorWheelMode.WarmWhite) } + } + } + + lightStep(StepCue.Custom("Schlussschlag")) { + bar.brightness.pulseOnce(200.milliseconds, 1.seconds) + FrontLights.all.forEach { it.brightness.pulseOnce(0.milliseconds, 1.seconds) } + Washs.both.forEach { it.brightness.pulseOnce(0.milliseconds, 1.seconds) } + } + } + + scene("3.7") { + step(StepCue.MusicEnd) { + } + + step(StepCue.MusicStart("Terminhektik", 1.minutes + 30.seconds)) { + actors { + // TODO: Woher? + +"Sven" + +"Tina" + +"Eva" + } + + onRun { + FrontLights.all.forEach { it.brightness.fade(50.percent, 8.seconds) } + } + } } scene("3.8") { step(StepCue.MusicEnd) { - onRun { - FrontLights.all.forEach { it.brightness.static(50.percent) } - } } - step { - trigger = StepCue.Custom("Auftritt Paula") - + step(StepCue.Custom("Auftritt Paula")) { onRun { (FrontLights.right + FrontLights.left).forEach { it.brightness.fade(0.percent, 5.seconds) } // kühle Farben @@ -751,8 +789,12 @@ val show = createShow { } // RnR entfällt + } - scene("4.1") { + // Pause + + act("Vierter Akt") { + scene("1") { step { trigger = StepCue.MusicStart("Pause", 69.seconds) } diff --git a/src/main/kotlin/de/moritzruth/theaterdsl/device/DynamicValue.kt b/src/main/kotlin/de/moritzruth/theaterdsl/device/DynamicValue.kt index c1ebe5f..754fa38 100644 --- a/src/main/kotlin/de/moritzruth/theaterdsl/device/DynamicValue.kt +++ b/src/main/kotlin/de/moritzruth/theaterdsl/device/DynamicValue.kt @@ -108,7 +108,8 @@ abstract class FloatDV(private val initialStaticValue: Float) : DynamicValue< } fun sine(period: Duration, minimum: T = minimumValue, maximum: T = maximumValue, start: T = getCurrentValue()) { - val offset = asin((fromDomain(start) - State.Sine.calculateD(fromDomain(minimum))) / State.Sine.calculateA(fromDomain(minimum), fromDomain(maximum))) + val coercedStart = fromDomain(start).coerceIn(fromDomain(minimum), fromDomain(maximum)) + val offset = asin((coercedStart - State.Sine.calculateD(fromDomain(minimum))) / State.Sine.calculateA(fromDomain(minimum), fromDomain(maximum))) state = State.Sine(offset, fromDomain(minimum), fromDomain(maximum), period) }