diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/act/Act1.kt b/src/main/kotlin/de/moritzruth/dracula_musical/act/Act1.kt index 362a5da..87c4163 100644 --- a/src/main/kotlin/de/moritzruth/dracula_musical/act/Act1.kt +++ b/src/main/kotlin/de/moritzruth/dracula_musical/act/Act1.kt @@ -13,17 +13,6 @@ import kotlin.time.Duration.Companion.seconds fun ShowBuilderContext.act1() = act("Erster Akt") { scene("Ouvertüre") { - lightStep(StepCue.Custom("1%")) { - backlightBar.color.static(Color.WHITE) - backlightBar.brightness.static(1.percent) - } - - for (i in 10.rangeTo(100) step 10) { - lightStep(StepCue.Custom("$i%")) { - backlightBar.brightness.static(i.percent) - } - } - step(StepCue.MusicStart("Ouvertüre", 10.seconds)) { curtainState = CurtainState.CLOSED diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/act/Act2.kt b/src/main/kotlin/de/moritzruth/dracula_musical/act/Act2.kt index d5a595a..c7833c9 100644 --- a/src/main/kotlin/de/moritzruth/dracula_musical/act/Act2.kt +++ b/src/main/kotlin/de/moritzruth/dracula_musical/act/Act2.kt @@ -1,11 +1,13 @@ package de.moritzruth.dracula_musical.act import de.moritzruth.dracula_musical.device.* -import de.moritzruth.dracula_musical.song.songDuettDraculaMina -import de.moritzruth.dracula_musical.song.songMaskenball -import de.moritzruth.dracula_musical.song.songRepriseMaskenball +import de.moritzruth.dracula_musical.song.* +import de.moritzruth.theaterdsl.show.CurtainState +import de.moritzruth.theaterdsl.show.PropPosition import de.moritzruth.theaterdsl.show.ShowBuilderContext import de.moritzruth.theaterdsl.show.StepCue +import de.moritzruth.theaterdsl.value.Color +import de.moritzruth.theaterdsl.value.degrees import de.moritzruth.theaterdsl.value.percent import kotlin.time.Duration.Companion.seconds @@ -56,6 +58,8 @@ fun ShowBuilderContext.act2() = act("Zweiter Akt") { } } + step(StepCue.Text("Ascot", "Oberschwester!")) {} + step(StepCue.Text("Ascot", "Oberschwester!")) { actors { -"Ascot / durch Mitte" @@ -93,14 +97,290 @@ fun ShowBuilderContext.act2() = act("Zweiter Akt") { -"Kaffeetanten / durch Mitte" -"Hawkins / durch Mitte" } + + onRun { + FrontLights.all { it.brightness.fade(75.percent, 10.seconds) } + backlightBar.brightness.fade(25.percent, 10.seconds) + + Tops.both { + it.startRoomMovement(2.0) + it.colorWheelMode.static(FuturelightDmh160.ColorWheelMode.White) + } + } } - lightStep(StepCue.Custom("Lucy bedroht Dr. Sewart (mit Musik)")) { + lightStep(StepCue.Custom("Van Helsing zückt das Kreuz (mit Musik)")) { + BlinderBars.all { + it.brightness.fade(100.percent, 2.seconds) + it.preset.static(StairvilleSplb.Preset.STUB) // switching, hectic + it.presetSpeed.static(100.percent) + } + + Tops.both { + it.pointAtStageMiddleSingleCenterMarking() + it.strobeSpeed.rampDown(4.seconds) + it.brightness.static(100.percent) + } + + FrontLights.all { it.brightness.fade(100.percent, 2.seconds) } + } + + step(StepCue.Custom("Lucy ist geflüchtet")) { + actors { + -"Lucy" + } + + onRun { + Tops.both { it.brightness.off() } + BlinderBars.all { it.brightness.off(1.seconds) } + FrontLights.all { it.brightness.fade(75.percent, 1.seconds) } + } + } + + songVanHelsing() + + step(StepCue.Text("Van Helsing", "… stirbt sie einen qualvollen Tod.")) { + actors { + +"Hawkins" + } + } + + step(StepCue.Text("Van Helsing", "Dann schnell!")) { + actors { + -"Van Helsing" + -"Dr. Sewart" + } + } + + step(StepCue.Text("Hawkins", "… ein Bad nehmen – vorher!")) { + actors { + -"Hawkins" + } + } + + step(StepCue.MusicStart("Umbau (Adel ist geil)", 10.seconds)) { + curtainState = CurtainState.CLOSED + + props { + it[PropPosition.BACKDROP] = "Irrenanstalt" + it[PropPosition.CENTER] = "Medikamenten-Schrank" + } + + onRun { + FrontLights.center { it.brightness.off(10.seconds) } + backlightBar.brightness.off(15.seconds) + } + } + } + + scene("Wiederholungstäter") { + step(StepCue.MusicEnd) { + actors { + +"Mina / von rechts, 2. Tür" + +"Ascot / von rechts, 2. Tür" + } + + curtainState = CurtainState.OPEN + + onRun { + FrontLights.center { it.brightness.fade(40.percent, 8.seconds) } + + sidelight.color1.fadeRandomAround(230.degrees, 30.degrees, 2.seconds) + sidelight.color2.fadeRandomAround(230.degrees, 35.degrees, 4.seconds) + sidelight.color3.static(Color(hue = 230.degrees, saturation = 20.percent)) + sidelight.color4.static(Color(hue = 230.degrees, saturation = 20.percent)) + sidelight.brightness.fade(50.percent, 8.seconds) + } + } + + step(StepCue.Text("Ascot", "… an der Nase herumführen!")) { + actors { + -"Mina / nach links" + -"Ascot / nach links" + +"Backe / durch Mitte" + +"Timmy / durch Mitte" + } + + onRun { + FrontLights.center { it.brightness.off(8.seconds) } + } + } + + step(StepCue.Text("Backe", "Nein, dir, du Pfeife!")) { + actors { + +"Ascot / von links" + } + + onRun { + FrontLights.center { it.brightness.fade(40.percent, 5.seconds) } + } + } + + step(StepCue.Text("Backe", "… und ruckzuck sind alle glücklich.")) { + actors { + -"Ascot / nach rechts, 1. Tür" + -"Backe / nach rechts, 1. Tür" + -"Timmy / nach rechts, 1. Tür" + +"Dracula / von rechts" + +"Renfield / hinter Fenster" + } + + rightSpotTarget = "Dracula (rechts)" + } + + lightStep(StepCue.Custom("Dracula erscheint")) { + Spots.right.brightness.fade(100.percent, 2.seconds) + } + + step(StepCue.Text("Dracula", "Still wie eine Leiche. Idiot.")) { + actors { + -"Renfield / tot" + -"Dracula / nach rechts, 2. Tür" + +"Jonathan / von rechts, 1. Tür" + } + + rightSpotTarget = null + + onRun { + Spots.right.brightness.off(2.seconds) + } + } + } + + scene("So viele Vampire!") { + step(StepCue.Text("Jonathan", "Ich bin’s! Jonathan!")) { + actors { + +"Eloïse / durch Mitte" + +"Françoise / durch Mitte" + +"Bernadette / durch Mitte" + +"Lucy / von links" + } + } + + songQuartett() + + step(StepCue.Custom("Die Vampire nähern sich Jonathan")) { + actors { + +"Van Helsing / durch Mitte" + +"Dr. Sewart / von rechts" + } + + onRun { + Tops.both { + it.startRoomMovement(2.0) + it.colorWheelMode.static(FuturelightDmh160.ColorWheelMode.White) + } + } + } + + lightStep(StepCue.Custom("Van Helsing zückt das Kreuz (mit Musik)")) { + Tops.both { + it.pointAtStageMiddleSingleCenterMarking() + it.strobeSpeed.rampDown(4.seconds) + it.brightness.static(100.percent) + } + + FrontLights.all { it.brightness.fade(100.percent, 2.seconds) } + + backlightBar.brightness.pulseOnce(1.seconds, 3.seconds) + BlinderBars.all { it.brightness.fade(100.percent, 2.seconds) it.preset.static(StairvilleSplb.Preset.STUB) // switching, hectic it.presetSpeed.static(100.percent) } } + + step(StepCue.Custom("Die Vampire sind geflüchtet")) { + actors { + -"Bernadette / nach links" + -"Eloïse / durch Mitte" + -"Françoise / nach rechts" + -"Lucy / nach rechts" + } + + onRun { + BlinderBars.all { it.brightness.off(1.seconds) } + Tops.both { it.brightness.off() } + FrontLights.all { it.brightness.fade(75.percent, 1.seconds) } + } + } + + step(StepCue.Custom("Van Helsing öffnet die Tür")) { + actors { + +"Dracula / hinter 2. Tür von rechts" + +"Mina / in Draculas Armen" + } + + rightSpotTarget = "Dracula & Mina (2. Tür von rechts)" + + onRun { + Spots.right.brightness.static(100.percent) + Tops.both { it.startRoomMovement(2.0) } + Washs.both { + it.pointAtCeiling() + it.colorWheelMode.static(CoemarProWash.ColorWheelMode.WarmWhite) + } + } + } + + lightStep(StepCue.Custom("Van Helsing zückt das Kreuz (mit Musik)")) { + BlinderBars.all { + it.brightness.fade(100.percent, 2.seconds) + it.preset.static(StairvilleSplb.Preset.STUB) // switching, hectic + it.presetSpeed.static(100.percent) + } + + Tops.both { + it.pointAtStageMiddleSingleCenterMarking() + it.strobeSpeed.rampDown(4.seconds) + it.brightness.static(100.percent) + } + + FrontLights.all { it.brightness.fade(100.percent, 2.seconds) } + + Washs.both { + it.pointAtAudience(2.seconds) + it.brightness.rampUp(1.seconds) + } + } + + step(StepCue.Custom("Dracula ist geflüchtet")) { + actors { + -"Dracula" + -"Mina" + } + + onRun { + BlinderBars.all { it.brightness.off(1.seconds) } + Tops.both { it.brightness.off() } + Washs.both { it.brightness.off() } + FrontLights.all { it.brightness.fade(75.percent, 1.seconds) } + } + } + + lightStep(StepCue.Custom("Musik: Einsetzen der Drums")) { + BlinderBars.all { + it.preset.static(StairvilleSplb.Preset.STUB) // chase, back-and-forth, hectic + it.presetSpeed.static(40.percent) + it.brightness.fade(40.percent, 0.5.seconds) + } + } + + step(StepCue.Text("Van Helsing", "Wir müssen sie finden! Schnell!")) { + actors { + -"Van Helsing / nach rechts, 1. Tür" + -"Dr. Sewart / nach rechts, 1. Tür" + -"Jonathan / nach rechts, 1. Tür" + } + + curtainState = CurtainState.CLOSED // fast + + onRun { + FrontLights.all { it.brightness.off(3.seconds) } + sidelight.brightness.off(3.seconds) + BlinderBars.all { it.brightness.off(2.seconds) } + } + } } } \ No newline at end of file diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/device/CoemarProWash.kt b/src/main/kotlin/de/moritzruth/dracula_musical/device/CoemarProWash.kt index 5f0661d..99c4b89 100644 --- a/src/main/kotlin/de/moritzruth/dracula_musical/device/CoemarProWash.kt +++ b/src/main/kotlin/de/moritzruth/dracula_musical/device/CoemarProWash.kt @@ -62,13 +62,13 @@ class CoemarProWash(override val firstChannel: DmxAddress, private val invertAng } fun pointAtCeiling(fadeDuration: Duration = Duration.ZERO) { - pan.fade(if (invertAngles) 300.degrees else 400.degrees, fadeDuration) // TODO: Fade von guests aus testen, soll über die Wand gehen + pan.fade(360.degrees, fadeDuration) tilt.fade(120.degrees, fadeDuration) } - fun pointAtAudience() { - pan.static(360.degrees) - tilt.static(240.degrees) + fun pointAtAudience(fadeDuration: Duration = Duration.ZERO) { + pan.fade(360.degrees, fadeDuration) + tilt.fade(240.degrees, fadeDuration) } override val dvs = persistentSetOf( diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/device/Devices.kt b/src/main/kotlin/de/moritzruth/dracula_musical/device/Devices.kt index bb56068..d2f1e0a 100644 --- a/src/main/kotlin/de/moritzruth/dracula_musical/device/Devices.kt +++ b/src/main/kotlin/de/moritzruth/dracula_musical/device/Devices.kt @@ -2,18 +2,23 @@ package de.moritzruth.dracula_musical.device import de.moritzruth.theaterdsl.device.DeviceGroup import de.moritzruth.theaterdsl.dmx.DmxAddress +import de.moritzruth.theaterdsl.dmx.DmxValue import kotlinx.collections.immutable.persistentSetOf object FrontLights { - val left = DeviceGroup(SimpleDimmer(DmxAddress(1u)), SimpleDimmer(DmxAddress(2u))) - val center = DeviceGroup(SimpleDimmer(DmxAddress(4u)), SimpleDimmer(DmxAddress(5u))) - val right = DeviceGroup(SimpleDimmer(DmxAddress(7u)), SimpleDimmer(DmxAddress(8u))) + private const val GAMMA = 4.0 + private val MINIMUM_VISIBLE_VALUE = DmxValue(40u) + val left = DeviceGroup(SimpleDimmer(DmxAddress(1u), GAMMA, MINIMUM_VISIBLE_VALUE), SimpleDimmer(DmxAddress(2u), GAMMA, MINIMUM_VISIBLE_VALUE)) + val center = DeviceGroup(SimpleDimmer(DmxAddress(4u), GAMMA, MINIMUM_VISIBLE_VALUE), SimpleDimmer(DmxAddress(5u), GAMMA, MINIMUM_VISIBLE_VALUE)) + val right = DeviceGroup(SimpleDimmer(DmxAddress(7u), GAMMA, MINIMUM_VISIBLE_VALUE), SimpleDimmer(DmxAddress(8u), GAMMA, MINIMUM_VISIBLE_VALUE)) val all = left + center + right } object Spots { - val left = SimpleDimmer(DmxAddress(10u)) - val right = SimpleDimmer(DmxAddress(11u)) + private const val GAMMA = 2.0 + private val MINIMUM_VISIBLE_VALUE = DmxValue(40u) + val left = SimpleDimmer(DmxAddress(10u), GAMMA, MINIMUM_VISIBLE_VALUE) + val right = SimpleDimmer(DmxAddress(11u), GAMMA, MINIMUM_VISIBLE_VALUE) } object Tops { diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/device/SimpleDimmer.kt b/src/main/kotlin/de/moritzruth/dracula_musical/device/SimpleDimmer.kt index a9d27d0..c49c2c1 100644 --- a/src/main/kotlin/de/moritzruth/dracula_musical/device/SimpleDimmer.kt +++ b/src/main/kotlin/de/moritzruth/dracula_musical/device/SimpleDimmer.kt @@ -4,14 +4,24 @@ import de.moritzruth.theaterdsl.device.Device import de.moritzruth.theaterdsl.device.PercentageDV import de.moritzruth.theaterdsl.dmx.DmxAddress import de.moritzruth.theaterdsl.dmx.DmxDataWriter +import de.moritzruth.theaterdsl.dmx.DmxValue +import de.moritzruth.theaterdsl.value.Percentage import kotlinx.collections.immutable.persistentSetOf +import kotlin.math.pow +import kotlin.math.roundToInt -class SimpleDimmer(channel: DmxAddress) : Device { +class SimpleDimmer(channel: DmxAddress, private val gamma: Double = 1.0, private val minimumVisibleValue: DmxValue = DmxValue(0u)) : Device { override val firstChannel = channel override val numberOfChannels: UInt = 1u override fun writeDmxData(writer: DmxDataWriter, isLightBehindCurtainOn: Boolean) { - writer.writePercentage(brightness.getCurrentValue()) + val adjustedBrightness = Percentage(brightness.getCurrentValue().value.pow(gamma)) + if (adjustedBrightness.value == 0.0) writer.writeRaw(DmxValue(0u)) + else writer.writeRaw( + DmxValue( + adjustedBrightness.ofRange(minimumVisibleValue.value.toDouble()..DmxValue.VALUE_RANGE.endInclusive.toDouble()).roundToInt().toUByte() + ) + ) } val brightness = PercentageDV() diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/song/DraculasZorn.kt b/src/main/kotlin/de/moritzruth/dracula_musical/song/DraculasZorn.kt index aed9172..351961b 100644 --- a/src/main/kotlin/de/moritzruth/dracula_musical/song/DraculasZorn.kt +++ b/src/main/kotlin/de/moritzruth/dracula_musical/song/DraculasZorn.kt @@ -43,7 +43,7 @@ fun SceneBuilderContext.songDraculasZorn() { } } - step(StepCue.Custom("Musik: Takt nach »Macht«")) { + step(StepCue.Custom("Musik: Breakdown")) { rightSpotTarget = "Dracula" onRun { @@ -58,7 +58,7 @@ fun SceneBuilderContext.songDraculasZorn() { } lightStep(StepCue.Text("Eloïse", "Was?")) { - sidelight.brightness.fade(40.percent, 10.seconds) + sidelight.brightness.fade(100.percent, 10.seconds) FrontLights.all { it.brightness.fade(75.percent, 10.seconds) } Washs.both { it.brightness.pulse(1.5.seconds, 0.1.seconds, 0.4.seconds) } } @@ -90,7 +90,7 @@ fun SceneBuilderContext.songDraculasZorn() { } lightStep(StepCue.Text("Bernadette", "Er ist bei uns eingebrochen", "Anfang")) { - sidelight.brightness.fade(40.percent, 10.seconds) + sidelight.brightness.fade(100.percent, 10.seconds) backlightBar.pulseSlow() FrontLights.all { it.brightness.fade(75.percent, 10.seconds) } Washs.both { it.brightness.pulse(1.5.seconds, 0.1.seconds, 0.4.seconds) } @@ -139,8 +139,8 @@ fun SceneBuilderContext.songDraculasZorn() { } lightStep(StepCue.Custom("Musik: Fill-in")) { - backlightBar.color.fade(Color.WARM_WHITE, 2.seconds) - backlightBar.brightness.fade(50.percent, 2.seconds) + backlightBar.color.static(Color.WARM_WHITE) + backlightBar.brightness.fade(50.percent, 4.seconds) Washs.both { it.colorWheelMode.static(CoemarProWash.ColorWheelMode.Rotate(20.percent)) @@ -166,7 +166,7 @@ fun SceneBuilderContext.songDraculasZorn() { backlightBar.color.fade(Color(hue = 0.degrees, saturation = 100.percent), 2.seconds) backlightBar.brightness.fade(75.percent, 2.seconds) - sidelight.brightness.fade(50.percent, 10.seconds) + sidelight.brightness.fade(100.percent, 10.seconds) Tops.both { it.brightness.fade(100.percent, 1.5.seconds) } FrontLights.all { it.brightness.off(2.seconds) } BlinderBars.all { it.brightness.off(1.5.seconds) } @@ -284,7 +284,7 @@ fun SceneBuilderContext.songDraculasZorn() { lightStep(StepCue.Text("Alle", "Du bist unser…", "Anfang")) { backlightBar.strobeSpeed.fade(10.percent, 2.seconds) - sidelight.brightness.fade(30.percent, 1.seconds) + sidelight.brightness.fade(40.percent, 1.seconds) Washs.both { it.brightness.ramp(1.seconds, 100.percent, 50.percent) } } diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/song/DuettDraculaMina.kt b/src/main/kotlin/de/moritzruth/dracula_musical/song/DuettDraculaMina.kt index cb24824..163725a 100644 --- a/src/main/kotlin/de/moritzruth/dracula_musical/song/DuettDraculaMina.kt +++ b/src/main/kotlin/de/moritzruth/dracula_musical/song/DuettDraculaMina.kt @@ -23,9 +23,9 @@ fun SceneBuilderContext.songDuettDraculaMina() { sidelight.brightness.fade(50.percent, 50.seconds) sidelight.color1.fadeRandomAround(25.degrees, 30.degrees, 10.seconds) - sidelight.color2.fadeRandomAround(230.degrees, 30.degrees, 10.seconds) + sidelight.color2.fadeRandomAround(230.degrees, 40.degrees, 10.seconds) sidelight.color3.fadeRandomAround(25.degrees, 30.degrees, 10.seconds) - sidelight.color4.fadeRandomAround(230.degrees, 30.degrees, 10.seconds) + sidelight.color4.fadeRandomAround(230.degrees, 40.degrees, 10.seconds) } } @@ -80,14 +80,13 @@ fun SceneBuilderContext.songDuettDraculaMina() { sidelight.brightness.off(6.seconds) backlightBar.color.static(Color.RED) - backlightBar.brightness.fade(100.percent, 6.seconds) + backlightBar.brightness.pulseOnce(8.seconds, 6.seconds) } lightStep(StepCue.MusicEnd) { Spots.left.brightness.off(3.seconds) - backlightBar.brightness.pulse(1.8.seconds, 0.15.seconds, 0.2.seconds, startDelay = 0.seconds) - sidelight.brightness.pulse(1.8.seconds, 0.15.seconds, 0.3.seconds, startDelay = 0.4.seconds) + backlightBar.brightness.pulse(1.8.seconds, 0.15.seconds, 0.2.seconds, peak = 40.percent, startDelay = 0.seconds) Washs.both { it.brightness.pulse(1.8.seconds, 0.15.seconds, 0.3.seconds, startDelay = 0.4.seconds) } } } \ No newline at end of file diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/song/EsIstAngerichtet.kt b/src/main/kotlin/de/moritzruth/dracula_musical/song/EsIstAngerichtet.kt index 0380646..593a829 100644 --- a/src/main/kotlin/de/moritzruth/dracula_musical/song/EsIstAngerichtet.kt +++ b/src/main/kotlin/de/moritzruth/dracula_musical/song/EsIstAngerichtet.kt @@ -18,7 +18,7 @@ fun SceneBuilderContext.songEsIstAngerichtet() { onRun { backlightBar.color.static(Color(hue = 0.degrees, saturation = 80.percent)) - backlightBar.brightness.pulse(1.8.seconds, 0.15.seconds, 0.2.seconds, startDelay = 0.seconds, peak = 20.percent) + backlightBar.brightness.pulse(1.8.seconds, 0.15.seconds, 0.2.seconds, startDelay = 0.seconds, peak = 50.percent) Washs.both { it.pointAtStageCenter() @@ -49,8 +49,8 @@ fun SceneBuilderContext.songEsIstAngerichtet() { repeat(2) { lightStep(StepCue.Text("Vampire", "Aaah")) { - sidelight.brightness.fade(80.percent, 3.seconds) - backlightBar.brightness.pulse(0.5.seconds, 0.1.seconds, 0.2.seconds, startDelay = 0.seconds, peak = 20.percent) + sidelight.brightness.fade(60.percent, 3.seconds) + backlightBar.brightness.pulse(0.5.seconds, 0.1.seconds, 0.2.seconds, startDelay = 0.seconds, peak = 40.percent) } lightStep(StepCue.Text("Vampire", "…angerichtet!", "erste Silbe")) { @@ -83,7 +83,7 @@ fun SceneBuilderContext.songEsIstAngerichtet() { repeat(2) { lightStep(StepCue.Text("Vampire", "Aaah")) { sidelight.brightness.fade(80.percent, 3.seconds) - backlightBar.brightness.pulse(0.5.seconds, 0.1.seconds, 0.2.seconds, startDelay = 0.seconds, peak = 20.percent) + backlightBar.brightness.pulse(0.5.seconds, 0.1.seconds, 0.2.seconds, startDelay = 0.seconds, peak = 40.percent) } lightStep(StepCue.Text("Vampire", "…angerichtet!", "erste Silbe")) { diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/song/Quartett.kt b/src/main/kotlin/de/moritzruth/dracula_musical/song/Quartett.kt new file mode 100644 index 0000000..1be2cd6 --- /dev/null +++ b/src/main/kotlin/de/moritzruth/dracula_musical/song/Quartett.kt @@ -0,0 +1,59 @@ +package de.moritzruth.dracula_musical.song + +import de.moritzruth.dracula_musical.device.CoemarProWash +import de.moritzruth.dracula_musical.device.Spots +import de.moritzruth.dracula_musical.device.Washs +import de.moritzruth.dracula_musical.device.backlightBar +import de.moritzruth.theaterdsl.show.SceneBuilderContext +import de.moritzruth.theaterdsl.show.StepCue +import de.moritzruth.theaterdsl.value.Color +import de.moritzruth.theaterdsl.value.degrees +import de.moritzruth.theaterdsl.value.percent +import kotlin.time.Duration.Companion.minutes +import kotlin.time.Duration.Companion.seconds + +fun SceneBuilderContext.songQuartett() { + step(StepCue.MusicStart("Quartett", 3.minutes)) { + onRun { + Washs.both { + it.pointAtStageCenter() + it.colorWheelMode.static(CoemarProWash.ColorWheelMode.Violet) + } + } + + leftSpotTarget = "Vampire (Ziel wechseln, wenn aus)" + rightSpotTarget = "Vampire (Ziel wechseln, wenn aus)" + } + + lightStep(StepCue.Custom("Musik: Einsetzen des Klaviers")) { + backlightBar.color.fadeRandomAround(270.degrees, 50.degrees, 10.seconds) + backlightBar.brightness.fade(50.percent, 6.seconds) + + Washs.both { it.brightness.fade(100.percent, 5.seconds) } + + Spots.left.brightness.sine(16.seconds) + Spots.right.brightness.sine(12.seconds) + } + + lightStep(StepCue.Text("Eloïse", "Findest du nur bei mir.")) { + Washs.both { it.brightness.off(3.seconds) } + } + + lightStep(StepCue.Custom("Musik: Hoher Ton von Violine")) { + Spots.left.brightness.off(3.seconds) + Spots.right.brightness.off(3.seconds) + + backlightBar.color.static(Color.RED) + backlightBar.brightness.pulse(1.8.seconds, 0.15.seconds, 0.2.seconds, peak = 40.percent, startDelay = 0.seconds) + + Washs.both { + it.colorWheelMode.static(CoemarProWash.ColorWheelMode.Red) + it.brightness.pulse(1.8.seconds, 0.15.seconds, 0.3.seconds, startDelay = 0.4.seconds) + } + } + + step(StepCue.MusicEnd) { + leftSpotTarget = null + rightSpotTarget = null + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/song/RepriseMaskenball.kt b/src/main/kotlin/de/moritzruth/dracula_musical/song/RepriseMaskenball.kt index 7e2cdb5..31565b7 100644 --- a/src/main/kotlin/de/moritzruth/dracula_musical/song/RepriseMaskenball.kt +++ b/src/main/kotlin/de/moritzruth/dracula_musical/song/RepriseMaskenball.kt @@ -52,7 +52,7 @@ fun SceneBuilderContext.songRepriseMaskenball() { } backlightBar.color.fade(Color.WARM_WHITE, 0.5.seconds) - backlightBar.brightness.pulseOnce(2.seconds, 6.seconds, end = 30.percent) + backlightBar.brightness.pulseOnce(2.seconds, 6.seconds, end = 50.percent) BlinderBars.all { it.presetSpeed.fade(0.percent, 2.seconds) diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/song/VanHelsing.kt b/src/main/kotlin/de/moritzruth/dracula_musical/song/VanHelsing.kt new file mode 100644 index 0000000..ca1770a --- /dev/null +++ b/src/main/kotlin/de/moritzruth/dracula_musical/song/VanHelsing.kt @@ -0,0 +1,153 @@ +package de.moritzruth.dracula_musical.song + +import de.moritzruth.dracula_musical.device.* +import de.moritzruth.theaterdsl.show.SceneBuilderContext +import de.moritzruth.theaterdsl.show.StepCue +import de.moritzruth.theaterdsl.value.Color +import de.moritzruth.theaterdsl.value.degrees +import de.moritzruth.theaterdsl.value.percent +import kotlin.time.Duration.Companion.minutes +import kotlin.time.Duration.Companion.seconds + +fun SceneBuilderContext.songVanHelsing() { + step(StepCue.MusicStart("Van Helsing", 2.minutes + 30.seconds)) { + rightSpotTarget = "Van Helsing" + + onRun { + Spots.right.brightness.fade(100.percent, 20.seconds) + } + } + + lightStep(StepCue.Text("Van Helsing", "Dann werde ich es Ihnen sagen.")) { + backlightBar.brightness.off(10.seconds) + FrontLights.left { it.brightness.off(10.seconds) } + FrontLights.center { it.brightness.fade(25.percent, 10.seconds) } + FrontLights.right { it.brightness.off(10.seconds) } + } + + lightStep(StepCue.Text("Van Helsing", "Menschenblut…", "Anfang")) { + backlightBar.brightness.sine(0.75.seconds, minimum = 50.percent, maximum = 100.percent) + backlightBar.color.static(Color(hue = 200.degrees, saturation = 40.percent)) + + Tops.both { + it.startRoomMovement(5.0) + it.colorWheelMode.static(FuturelightDmh160.ColorWheelMode.DarkBlue) + it.prismMode.static(FuturelightDmh160.PrismMode.OPEN) + } + + Washs.both { + it.pointAtCeiling() + it.colorWheelMode.static(CoemarProWash.ColorWheelMode.DarkBlue) + it.beamAngle.static(100.percent) + } + } + + lightStep(StepCue.Custom("Musik: Beat nach »Kreatur des Bösen«")) { + BlinderBars.all { + it.preset.static(null) + it.color.reset() + it.white.static(100.percent) + it.brightness.pulseOnce(0.1.seconds, 0.3.seconds) + } + + Tops.both { it.brightness.pulseOnce(0.1.seconds, 0.3.seconds) } + } + + lightStep(StepCue.Text("Van Helsing", "Ein höllischer Dämon ist hier!", "letzte Silbe")) { + BlinderBars.all { it.brightness.pulseOnce(2.seconds, 0.3.seconds, peak = 50.percent) } + Washs.both { + it.pointAtAudience(3.seconds) + it.brightness.pulseOnce(2.seconds, 0.3.seconds, peak = 60.percent) + } + } + + lightStep(StepCue.Text("Van Helsing", "Ein Vampir!", "Anfang")) { + Washs.both { it.colorWheelMode.static(CoemarProWash.ColorWheelMode.Red) } + } + + lightStep(StepCue.Text("Van Helsing", "Ein Vampir!", "letzte Silbe")) { + BlinderBars.all { it.brightness.pulseOnce(0.1.seconds, 1.seconds, peak = 50.percent) } + Washs.both { it.brightness.pulseOnce(0.1.seconds, 1.seconds, peak = 100.percent) } + } + + lightStep(StepCue.Custom("Musik: Beat nach »Meute«")) { + BlinderBars.all { + it.preset.static(null) + it.color.reset() + it.white.static(100.percent) + it.brightness.pulseOnce(0.1.seconds, 0.3.seconds) + } + + Tops.both { it.brightness.pulseOnce(0.1.seconds, 0.3.seconds) } + + Washs.both { + it.pointAtCeiling() + it.colorWheelMode.static(CoemarProWash.ColorWheelMode.DarkBlue) + } + } + + lightStep(StepCue.Text("Van Helsing", "Ein höllischer Dämon ist hier!", "letzte Silbe")) { + BlinderBars.all { it.brightness.pulseOnce(2.seconds, 0.3.seconds, peak = 50.percent) } + Washs.both { + it.pointAtAudience(3.seconds) + it.brightness.pulseOnce(2.seconds, 0.3.seconds, peak = 60.percent) + } + } + + lightStep(StepCue.Text("Van Helsing", "Ein Vampir!", "Anfang")) { + Washs.both { it.colorWheelMode.static(CoemarProWash.ColorWheelMode.Red) } + } + + lightStep(StepCue.Custom("Musik: Nächster Beat")) { + backlightBar.brightness.off(0.1.seconds) + BlinderBars.all { it.brightness.pulseOnce(0.1.seconds, 0.6.seconds, peak = 50.percent) } + Washs.both { it.brightness.pulseOnce(0.1.seconds, 0.6.seconds, peak = 100.percent) } + } + + lightStep(StepCue.Custom("Musik: Nächster Beat")) { + backlightBar.brightness.pulseOnce(0.1.seconds, 0.6.seconds) + } + + lightStep(StepCue.Custom("Musik: Nächster Beat")) { + BlinderBars.all { it.brightness.pulseOnce(0.1.seconds, 0.6.seconds, peak = 50.percent) } + Washs.both { it.brightness.pulseOnce(0.1.seconds, 0.6.seconds, peak = 100.percent) } + } + + lightStep(StepCue.Custom("Musik: Nächster Beat")) { + backlightBar.brightness.pulseOnce(0.1.seconds, 0.6.seconds) + Tops.both { it.brightness.pulseOnce(0.1.seconds, 0.3.seconds) } + } + + lightStep(StepCue.Custom("Musik: Nächster Beat")) { + BlinderBars.all { it.brightness.pulseOnce(0.1.seconds, 0.6.seconds, peak = 50.percent) } + Washs.both { it.brightness.pulseOnce(0.1.seconds, 0.6.seconds, peak = 100.percent) } + } + + lightStep(StepCue.Custom("Musik: Nächster Beat")) { + backlightBar.brightness.pulseOnce(0.1.seconds, 0.6.seconds) + Tops.both { it.brightness.pulseOnce(0.1.seconds, 0.3.seconds) } + } + + lightStep(StepCue.Custom("Musik: Nächster Beat")) { + BlinderBars.all { it.brightness.pulseOnce(0.1.seconds, 0.6.seconds, peak = 50.percent) } + Washs.both { it.brightness.pulseOnce(0.1.seconds, 0.6.seconds, peak = 100.percent) } + Tops.both { it.pointAtStageMiddleSingleCenterMarking() } + } + + lightStep(StepCue.Custom("Musik: Nächster Beat")) { + backlightBar.brightness.fade(100.percent, 0.1.seconds) + Tops.both { it.brightness.fade(100.percent, 0.1.seconds) } + Spots.right.brightness.off(2.seconds) + } + + step(StepCue.MusicEnd) { + rightSpotTarget = null + + onRun { + Tops.both { it.brightness.off(4.seconds) } + FrontLights.center { it.brightness.fade(75.percent, 10.seconds) } + backlightBar.brightness.fade(40.percent, 10.seconds) + backlightBar.color.fade(Color.WARM_WHITE, 10.seconds) + } + } +} \ No newline at end of file