From 84cc9ea2bcc78e7bfed576390e334d8b54c1f47d Mon Sep 17 00:00:00 2001 From: Moritz Ruth Date: Sat, 8 Mar 2025 17:48:34 +0100 Subject: [PATCH] commit 61 --- .gitignore | 1 + .../de/moritzruth/dracula_musical/act/Act1.kt | 161 +++++++--- .../dracula_musical/device/Devices.kt | 10 +- .../dracula_musical/device/StairvilleClb4.kt | 47 --- .../dracula_musical/song/AdelIstGeil.kt | 25 ++ .../dracula_musical/song/Irrenhaus.kt | 207 +++++++++++++ .../moritzruth/dracula_musical/song/Lucy.kt | 7 + .../dracula_musical/song/Mittsommernacht.kt | 291 ++++++++++++++++++ .../theaterdsl/device/DynamicValue.kt | 8 +- ui/src/pages/kiosk/stage.vue | 2 +- 10 files changed, 666 insertions(+), 93 deletions(-) create mode 100644 src/main/kotlin/de/moritzruth/dracula_musical/song/AdelIstGeil.kt create mode 100644 src/main/kotlin/de/moritzruth/dracula_musical/song/Irrenhaus.kt create mode 100644 src/main/kotlin/de/moritzruth/dracula_musical/song/Lucy.kt create mode 100644 src/main/kotlin/de/moritzruth/dracula_musical/song/Mittsommernacht.kt diff --git a/.gitignore b/.gitignore index 0dbf9bd..74ea4f1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,6 @@ build/ /.gradle/ /run/ +/.kotlin/ /.idea/ /src/main/resources/ui/* 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 a9fce5f..55a05a3 100644 --- a/src/main/kotlin/de/moritzruth/dracula_musical/act/Act1.kt +++ b/src/main/kotlin/de/moritzruth/dracula_musical/act/Act1.kt @@ -1,9 +1,16 @@ package de.moritzruth.dracula_musical.act import de.moritzruth.dracula_musical.device.* +import de.moritzruth.dracula_musical.song.songAdelIstGeil +import de.moritzruth.dracula_musical.song.songIrrenhaus +import de.moritzruth.dracula_musical.song.songLucy +import de.moritzruth.dracula_musical.song.songMittsommernacht 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 @@ -15,7 +22,7 @@ fun ShowBuilderContext.act1() = act("Erster Akt") { Washs.both { it.pointAtAudience() it.colorWheelMode.static(CoemarProWash.ColorWheelMode.WarmWhite) - it.beamAngle.static(0.percent) + it.beamAngle.static(100.percent) } } @@ -27,64 +34,146 @@ fun ShowBuilderContext.act1() = act("Erster Akt") { rightSpotTarget = "Erzähler / Mitte der Vorbühne" onRun { - spotRight.brightness.fade(100.percent, 2.seconds) + Spots.right.brightness.fade(100.percent, 2.seconds) } } step(StepCue.Text("Erzähler", "Der Mittsommernacht.")) { + actors { + -"Erzähler" + } + rightSpotTarget = null onRun { - spotRight.brightness.off(1.seconds) + Spots.right.brightness.off(1.seconds) + } + } + } + + scene("Mittsommernacht") { + songMittsommernacht() + } + + scene("Ankunft in Huntington") { + step(StepCue.Text("Mina", "Das ist also Huntington!")) { + sidelight.brightness.fade(75.percent, 15.seconds) + sidelight.color1.fadeRandomAround(130.degrees, 5.degrees, 10.seconds) + sidelight.color2.fadeRandomAround(60.degrees, 5.degrees, 9.seconds) + sidelight.color3.fadeRandomAround(130.degrees, 5.degrees, 12.seconds) + sidelight.color4.fadeRandomAround(60.degrees, 5.degrees, 11.seconds) + } + } + + scene("Mrs. Hawkins’ Feierabend") { + step(StepCue.Text("Lucy", "Heute gehört Mister Harker uns.", "Ende")) { + actors { + -"Mina" + -"Lucy" + -"Jonathan" + +"Mrs. Hawkins" + // TODO: Expand + +"Sekretärinnen" + } + + props { + it[PropPosition.CENTER] = "Mrs. Hawkins’ Stuhl" } } - step(StepCue.MusicStart("Mittsommernacht", 10.seconds)) { + step(StepCue.Text("Sekretärin 1", "Ashton und Ashton 6 Pfund glatt…")) { actors { - // TODO: Expand - +"Einwohner von Huntington" + +"Renfield" + } + } + + songAdelIstGeil() + + step(StepCue.Text("Renfield", "Ich bin schon weg.")) { + actors { + -"Renfield" + } + } + + step(StepCue.MusicStart("Umbau (Adel ist geil)", 10.seconds)) { + actors { + -"Mrs. Hawkins" + -"Sekretärinnen" + } + + curtainState = CurtainState.CLOSED + + props { + it[PropPosition.CENTER] = null + } + + onRun { + FrontLights.all { it.brightness.off(6.seconds) } + sidelight.brightness.off(6.seconds) + } + } + } + + scene("Die Irrenanstalt") { + step(StepCue.MusicEnd) { + actors { + +"Mrs. Ascot" + +"Mina" } curtainState = CurtainState.OPEN onRun { - Tops.both { - it.startRoomMovement(3.0) - it.brightness.fade(100.percent, 2.seconds) - it.colorWheelMode.static(FuturelightDmh160.ColorWheelMode.Rotate(10.percent)) - it.prismMode.static(FuturelightDmh160.PrismMode.FACETS_8) - it.prismRotationSpeed.static(20.percent) - } - - backlightBar.brightness.fade(100.percent, 2.seconds) - backlightBar.color.cycle(12.seconds) - - Washs.both { - it.brightness.fade(100.percent, 2.seconds) - it.beamAngle.fade(100.percent, 2.seconds) - it.pointAtCeiling(6.seconds) - } - - BlinderBars.all { - it.white.static(100.percent) - it.brightness.pulseOnce(3.seconds, 5.seconds, 75.percent) - } + FrontLights.all { it.brightness.fade(40.percent, 6.seconds) } + sidelight.brightness.fade(100.percent, 6.seconds) + sidelight.colors.forEach { it.static(Color(hue = 180.degrees, saturation = 10.percent)) } + backlightBar.brightness.fade(50.percent, 6.seconds) + backlightBar.color.static(Color(hue = 280.degrees, saturation = 50.percent)) } } - lightStep(StepCue.Custom("Schlagzeug-Pattern wechselt")) { - BlinderBars.all { - it.white.static(0.percent) - it.presetSpeed.static(20.percent) - it.preset.static(StairvilleSplb.Preset.STUB) + step(StepCue.Text("Mrs. Ascot", "Da kommt der Rest der Familie!")) { + actors { + +"Oberschwester" + // TODO: Expand + +"Pflegeteam" } } - lightStep(StepCue.Custom("Strophe beginnt")) { - BlinderBars.all { - it.presetSpeed.static(50.percent) - it.preset.static(StairvilleSplb.Preset.STUB) + songIrrenhaus() + + step(StepCue.Text("Oberschwester", "Sonst kriegst du sie als Zäpfchen!")) { + actors { + -"Oberschwester" + -"Die Irren" + +"Renfield" + +"Vermieterin" + +"Wärter 1" + +"Wärter 2" + } + } + + step(StepCue.Text("Dr. Sewart", "Ich liebe meinen Job!")) { + actors { + -"Renfield" + -"Vermieterin" + -"Wärter 1" + -"Wärter 2" + -"Dr. Sewart" + -"Mrs. Ascot" + } + } + + step(StepCue.Custom("Mina öffnet die Tür")) { + actors { + +"Mr. Nickelby" + +"Mrs. Nickelby" + +"Tochter Nickelby" } } } + + scene("Blockflötenkreis") { + songLucy() + } } \ No newline at end of file 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 7463b52..0ad77f3 100644 --- a/src/main/kotlin/de/moritzruth/dracula_musical/device/Devices.kt +++ b/src/main/kotlin/de/moritzruth/dracula_musical/device/Devices.kt @@ -11,8 +11,10 @@ object FrontLights { val all = left + center + right } -val spotLeft = SimpleDimmer(DmxAddress(10u)) -val spotRight = SimpleDimmer(DmxAddress(11u)) +object Spots { + val left = SimpleDimmer(DmxAddress(10u)) + val right = SimpleDimmer(DmxAddress(11u)) +} object Tops { val left = FuturelightDmh160(DmxAddress(37u), false) @@ -39,8 +41,8 @@ val fogMachine = AdjFogFury3000(DmxAddress(117u)) val devices = persistentSetOf( *FrontLights.all.toTypedArray(), - spotLeft, - spotRight, + Spots.left, + Spots.right, *Tops.both.toTypedArray(), *Washs.both.toTypedArray(), *BlinderBars.all.toTypedArray(), diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/device/StairvilleClb4.kt b/src/main/kotlin/de/moritzruth/dracula_musical/device/StairvilleClb4.kt index c8b3479..44506ca 100644 --- a/src/main/kotlin/de/moritzruth/dracula_musical/device/StairvilleClb4.kt +++ b/src/main/kotlin/de/moritzruth/dracula_musical/device/StairvilleClb4.kt @@ -11,13 +11,6 @@ import de.moritzruth.theaterdsl.value.degrees import de.moritzruth.theaterdsl.value.percent import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentSetOf -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.delay -import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch -import kotlin.random.Random -import kotlin.time.Duration -import kotlin.time.Duration.Companion.milliseconds class StairvilleClb4(override val firstChannel: DmxAddress) : Device { override val numberOfChannels: UInt = 14u @@ -65,44 +58,4 @@ class StairvilleClb4(override val firstChannel: DmxAddress) : Device { strobeSpeed, *colors.toTypedArray() ) - - private val classroomColor = Color(40.degrees, saturation = 90.percent, brightness = 100.percent) - - fun fadeColorsToClassroomFromDarkness(duration: Duration) { - sidelight.colors.forEach { it.static(classroomColor.copy(brightness = 0.percent)) } - fadeColorsToClassroom(duration) - } - - fun fadeColorsToClassroom(duration: Duration) { - sidelight.color1.fade(color1.getCurrentValue().copy(brightness = 0.percent), duration) - - sidelight.color2.fade(classroomColor, duration = duration) - sidelight.color3.fade(classroomColor, duration = duration) - sidelight.color4.fade(classroomColor, duration = duration) - } - - fun CoroutineScope.moveColorsPinkAndBlue() { - val pink = Color(320.degrees) - val blue = Color(220.degrees) - - colors.forEachIndexed { index, color -> - launch { - if (index % 2 == 0) { - val duration = Random.nextInt(500, 3000).milliseconds - color.fade(blue, duration) - delay(duration) - } - - while (isActive) { - val firstDuration = Random.nextInt(500, 3000).milliseconds - color.fade(pink, firstDuration) - delay(firstDuration) - - val secondDuration = Random.nextInt(500, 3000).milliseconds - color.fade(blue, secondDuration) - delay(secondDuration) - } - } - } - } } \ No newline at end of file diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/song/AdelIstGeil.kt b/src/main/kotlin/de/moritzruth/dracula_musical/song/AdelIstGeil.kt new file mode 100644 index 0000000..6a68206 --- /dev/null +++ b/src/main/kotlin/de/moritzruth/dracula_musical/song/AdelIstGeil.kt @@ -0,0 +1,25 @@ +package de.moritzruth.dracula_musical.song + +import de.moritzruth.dracula_musical.device.BlinderBars +import de.moritzruth.dracula_musical.device.StairvilleSplb +import de.moritzruth.theaterdsl.show.SceneBuilderContext +import de.moritzruth.theaterdsl.show.StepCue +import de.moritzruth.theaterdsl.value.percent +import kotlin.time.Duration.Companion.minutes +import kotlin.time.Duration.Companion.seconds + +fun SceneBuilderContext.songAdelIstGeil() { + // TODO + + lightStep(StepCue.MusicStart("Adel ist geil", 2.minutes + 15.seconds)) { + BlinderBars.all { + it.brightness.fade(25.percent, 5.seconds) + it.preset.static(StairvilleSplb.Preset.STUB) // jumpy, green + it.presetSpeed.static(40.percent) + } + } + + step(StepCue.MusicEnd) { + BlinderBars.all { it.brightness.off(1.seconds) } + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/song/Irrenhaus.kt b/src/main/kotlin/de/moritzruth/dracula_musical/song/Irrenhaus.kt new file mode 100644 index 0000000..2042141 --- /dev/null +++ b/src/main/kotlin/de/moritzruth/dracula_musical/song/Irrenhaus.kt @@ -0,0 +1,207 @@ +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.percent +import kotlin.time.Duration.Companion.minutes +import kotlin.time.Duration.Companion.seconds + +fun SceneBuilderContext.songIrrenhaus() { + step(StepCue.MusicStart("Irrenhaus", 3.minutes)) { + actors { + +"Dr. Sewart" + // TODO: Expand + +"Die Irren" + } + + rightSpotTarget = "Dr. Sewart" + + onRun { + Spots.right.brightness.fade(100.percent, 5.seconds) + Washs.both { it.colorWheelMode.static(CoemarProWash.ColorWheelMode.Rotate(30.percent)) } + } + } + + lightStep(StepCue.Custom("Musik: Fill-in")) { + Washs.both { it.brightness.fade(100.percent, 2.seconds) } + BlinderBars.all { + it.preset.static(StairvilleSplb.Preset.STUB) // jumpy, chaotic + it.brightness.fade(30.percent, 2.seconds) + } + + Tops.both { + it.startRoomMovement(8.0) + it.prismRotationSpeed.static(0.percent) + it.prismMode.static(FuturelightDmh160.PrismMode.FROST) + it.colorWheelMode.static(FuturelightDmh160.ColorWheelMode.Yellow) + } + } + + lightStep(StepCue.Text("Dr. Sewart", "Bei uns ist alles scheißegal", "während letzter Silbe")) { + FrontLights.all { it.brightness.fade(100.percent, 2.seconds) } + Washs.both { it.brightness.off(3.seconds) } + BlinderBars.all { it.brightness.off(3.seconds) } + backlightBar.brightness.fade(100.percent, 2.seconds) + } + + lightStep(StepCue.Text("Alle", "Hurra", "letzte Silbe")) { + FrontLights.all { it.brightness.off() } + Spots.right.brightness.off() + } + + lightStep(StepCue.Custom("Nächster Beat")) { + FrontLights.all { it.brightness.pulseOnce(0.seconds, 0.5.seconds, peak = 100.percent, end = 60.percent) } + Tops.both { it.brightness.pulseOnce(0.1.seconds, 0.5.seconds, 100.percent) } + Washs.both { it.brightness.pulseOnce(0.1.seconds, 0.5.seconds, 100.percent) } + BlinderBars.all { + it.preset.static(null) + it.white.static(100.percent) + it.brightness.pulseOnce(0.1.seconds, 0.5.seconds, 100.percent) + } + } + + lightStep(StepCue.Text("Alle", "Wir sind bescheuert!", "Ende")) { + BlinderBars.all { + it.preset.static(StairvilleSplb.Preset.STUB) // jumpy, chaotic + it.brightness.fade(40.percent, 1.seconds) + } + + Washs.both { it.brightness.fade(100.percent, 1.seconds) } + backlightBar.brightness.fade(50.percent, 1.seconds) + } + + lightStep(StepCue.Custom("Strophe")) { + Spots.right.brightness.fade(100.percent, 1.seconds) + + BlinderBars.all { + it.preset.static(StairvilleSplb.Preset.STUB) // flowy, chaotic + it.brightness.fade(25.percent, 1.seconds) + } + } + + lightStep(StepCue.Text("Dr. Sewart", "Wir wissen, wie das geht", "während letzter Silbe")) { + FrontLights.all { it.brightness.fade(100.percent, 2.seconds) } + + Washs.both { + it.strobeSpeed.static(60.percent) + it.brightness.off(3.seconds) + } + + backlightBar.strobeSpeed.static(60.percent) + backlightBar.brightness.fade(100.percent, 2.seconds) + + BlinderBars.all { + it.presetSpeed.static(80.percent) + it.brightness.off(3.seconds) + } + } + + lightStep(StepCue.Text("Alle", "Hurra", "letzte Silbe")) { + FrontLights.all { it.brightness.off() } + } + + lightStep(StepCue.Custom("Nächster Beat")) { + FrontLights.all { it.brightness.pulseOnce(0.seconds, 0.5.seconds, peak = 100.percent, end = 60.percent) } + Tops.both { it.brightness.pulseOnce(0.1.seconds, 0.5.seconds, 100.percent) } + Washs.both { it.brightness.pulseOnce(0.1.seconds, 0.5.seconds, 100.percent) } + BlinderBars.all { + it.preset.static(null) + it.brightness.pulseOnce(0.1.seconds, 0.5.seconds, 100.percent) + } + } + + lightStep(StepCue.Text("Alle", "Wir sind bescheuert!", "Ende")) { + BlinderBars.all { + it.preset.static(StairvilleSplb.Preset.STUB) // jumpy, chaotic + it.brightness.fade(40.percent, 1.seconds) + } + + Washs.both { it.brightness.fade(100.percent, 1.seconds) } + backlightBar.brightness.fade(50.percent, 1.seconds) + } + + lightStep(StepCue.Custom("Strophe")) { + Spots.right.brightness.fade(100.percent, 1.seconds) + + BlinderBars.all { + it.preset.static(StairvilleSplb.Preset.STUB) // flowy, chaotic + it.brightness.fade(25.percent, 1.seconds) + } + } + + lightStep(StepCue.Text("Dr. Sewart", "Wir warten schon auf dich!", "während letzter Silbe")) { + FrontLights.all { it.brightness.fade(100.percent, 2.seconds) } + + Washs.both { + it.strobeSpeed.static(60.percent) + it.brightness.off(3.seconds) + } + + backlightBar.strobeSpeed.static(60.percent) + backlightBar.brightness.fade(100.percent, 2.seconds) + + BlinderBars.all { + it.presetSpeed.static(80.percent) + it.brightness.off(3.seconds) + } + } + + lightStep(StepCue.Text("Alle", "Hurra", "letzte Silbe")) { + FrontLights.all { it.brightness.off() } + backlightBar.strobeSpeed.off() + } + + lightStep(StepCue.Custom("Nächster Beat")) { + FrontLights.all { it.brightness.pulseOnce(0.seconds, 0.5.seconds, peak = 100.percent, end = 60.percent) } + Tops.both { it.brightness.pulseOnce(0.1.seconds, 0.5.seconds, 100.percent) } + Washs.both { it.brightness.pulseOnce(0.1.seconds, 0.5.seconds, 100.percent) } + BlinderBars.all { + it.preset.static(null) + it.brightness.pulseOnce(0.1.seconds, 0.5.seconds, 100.percent) + } + } + + lightStep(StepCue.Text("Alle", "Wir sind bescheuert!", "Ende")) { + BlinderBars.all { + it.preset.static(StairvilleSplb.Preset.STUB) // jumpy, chaotic + it.brightness.fade(40.percent, 1.seconds) + } + + Washs.both { it.brightness.fade(100.percent, 1.seconds) } + backlightBar.brightness.fade(50.percent, 1.seconds) + + Tops.both { + it.pointAtStageMiddleSingleCenterMarking() + } + } + + lightStep(StepCue.Text("Alle", "Gott sei Dank!")) { + Washs.both { + it.brightness.off(0.5.seconds) + it.pointAtAudience() + it.colorWheelMode.static(CoemarProWash.ColorWheelMode.WarmWhite) + } + } + + lightStep(StepCue.Custom("Schlussschlag")) { + FrontLights.all { it.brightness.static(100.percent) } + Tops.both { it.brightness.pulseOnce(0.1.seconds, 2.seconds, 100.percent) } + Washs.both { it.brightness.pulseOnce(0.1.seconds, 2.seconds, 100.percent) } + BlinderBars.all { + it.preset.static(null) + it.color.static(Color.WHITE) + it.brightness.pulseOnce(0.1.seconds, 2.seconds, 100.percent) + } + } + + step(StepCue.MusicEnd) { + rightSpotTarget = null + + onRun { + FrontLights.all { it.brightness.fade(40.percent, 5.seconds) } + Spots.right.brightness.off(5.seconds) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/song/Lucy.kt b/src/main/kotlin/de/moritzruth/dracula_musical/song/Lucy.kt new file mode 100644 index 0000000..6ca5a8c --- /dev/null +++ b/src/main/kotlin/de/moritzruth/dracula_musical/song/Lucy.kt @@ -0,0 +1,7 @@ +package de.moritzruth.dracula_musical.song + +import de.moritzruth.theaterdsl.show.SceneBuilderContext + +fun SceneBuilderContext.songLucy() { + +} \ No newline at end of file diff --git a/src/main/kotlin/de/moritzruth/dracula_musical/song/Mittsommernacht.kt b/src/main/kotlin/de/moritzruth/dracula_musical/song/Mittsommernacht.kt new file mode 100644 index 0000000..f239a41 --- /dev/null +++ b/src/main/kotlin/de/moritzruth/dracula_musical/song/Mittsommernacht.kt @@ -0,0 +1,291 @@ +package de.moritzruth.dracula_musical.song + +import de.moritzruth.dracula_musical.device.* +import de.moritzruth.theaterdsl.show.CurtainState +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.songMittsommernacht() { + step(StepCue.MusicStart("Mittsommernacht", 4.minutes + 30.seconds)) { + actors { + +"Mina" + +"Lucy" + +"Jonathan" + // TODO: Expand + +"Einwohner von Huntington" + } + + curtainState = CurtainState.OPEN + + onRun { + FrontLights.all { + it.brightness.fade(100.percent, 6.seconds) + } + + Tops.both { + it.startRoomMovement(3.0) + it.brightness.fade(100.percent, 2.seconds) + it.colorWheelMode.static(FuturelightDmh160.ColorWheelMode.Rotate(10.percent)) + it.prismMode.static(FuturelightDmh160.PrismMode.FACETS_8) + it.prismRotationSpeed.static(20.percent) + } + + backlightBar.brightness.fade(75.percent, 2.seconds) + backlightBar.color.cycle(12.seconds) + + Washs.both { + it.brightness.pulseOnce(2.seconds, 5.seconds, 100.percent) + it.beamAngle.fade(0.percent, 2.seconds) + it.pointAtCeiling(6.seconds) + } + + BlinderBars.all { + it.white.static(100.percent) + it.brightness.pulseOnce(3.seconds, 5.seconds, 75.percent) + } + } + } + + lightStep(StepCue.Custom("Schlagzeug-Pattern wechselt")) { + BlinderBars.all { + it.brightness.fade(25.percent, 1.seconds) + it.white.static(0.percent) + it.presetSpeed.static(20.percent) + it.preset.static(StairvilleSplb.Preset.STUB) // flowy, warm + } + } + + lightStep(StepCue.Custom("Strophe beginnt")) { + Tops.both { + it.brightness.off(2.seconds) + } + + BlinderBars.all { + it.presetSpeed.static(50.percent) + it.preset.static(StairvilleSplb.Preset.STUB) // jumpy, warm + } + } + + // TODO: Fix speaker + step(StepCue.Text("Girl 1", "Hilfe, das Kuschel-Monster!", "Anfang")) { + rightSpotTarget = "verängstigte Mädchen (Mitte der Bühne)" + + onRun { + Spots.right.brightness.static(100.percent) + + FrontLights.all { + it.brightness.static(25.percent) + } + + backlightBar.color.fadeRandomAround(0.degrees, 5.degrees, 2.seconds) + backlightBar.brightness.fade(50.percent, 1.seconds) + + BlinderBars.all { + it.brightness.off(1.seconds) + it.presetSpeed.static(5.percent) + it.preset.static(StairvilleSplb.Preset.STUB) // back-and-forth + } + } + } + + // TODO: Fix speaker + step(StepCue.Text("Girls", "Bitte tut uns nichts!", "Ende")) { + rightSpotTarget = null + + onRun { + Spots.right.brightness.off(2.seconds) + + FrontLights.all { + it.brightness.fade(100.percent, 8.seconds) + } + + backlightBar.brightness.off(6.seconds) + } + } + + lightStep(StepCue.Custom("Refrain beginnt")) { + BlinderBars.all { + it.brightness.fade(25.percent, 1.seconds) + it.presetSpeed.static(50.percent) + it.preset.static(StairvilleSplb.Preset.STUB) // jumpy, warm + } + + backlightBar.brightness.fade(75.percent, 2.seconds) + backlightBar.color.cycle(12.seconds) + + Washs.both { + it.pointAtStageCenter() + it.beamAngle.static(100.percent) + } + } + + lightStep(StepCue.Text("Alle", "Heute ist die Mittsommer…", "letzte Silbe")) { + BlinderBars.all { + it.brightness.fade(start = 40.percent, end = 0.percent, duration = 5.seconds) + it.white.static(100.percent) + it.preset.static(null) + } + + backlightBar.color.static(Color(hue = 40.degrees, saturation = 50.percent)) + + Washs.both { it.brightness.static(100.percent) } + } + + step(StepCue.Custom("Musik: 1. Hit")) { + actors { + +"Dracula" + // TODO: Expand + +"Vampirgirls" + } + + onRun { + FrontLights.all { it.brightness.off() } + } + } + + lightStep(StepCue.Custom("Musik: 2. Hit")) { + backlightBar.brightness.off(0.5.seconds) + } + + lightStep(StepCue.Custom("Musik: 3. Hit")) { + Washs.both { it.brightness.off(0.5.seconds) } + } + + lightStep(StepCue.Custom("Musik: 4. Hit")) { + BlinderBars.all { it.brightness.pulseOnce(0.1.seconds, 0.3.seconds, 100.percent) } + + Washs.both { + it.colorWheelMode.static(CoemarProWash.ColorWheelMode.Red) + } + } + + lightStep(StepCue.Custom("Musik: 5. Hit")) { + BlinderBars.all { + it.white.off() + it.color.static(Color(hue = 345.degrees)) + it.brightness.pulseOnce(0.1.seconds, 2.seconds, 100.percent) + } + + backlightBar.color.static(Color(hue = 240.degrees)) + backlightBar.brightness.fade(75.percent, 3.seconds) + + Washs.both { it.brightness.fade(100.percent, 3.seconds) } + } + + step(StepCue.Text("Vampirgirls", "Süße Damen")) { + leftSpotTarget = "Vampirgirls (sprunghaft hin und her)" + rightSpotTarget = "Vampirgirls (sprunghaft hin und her)" + + onRun { + Spots.left.brightness.static(50.percent) + Spots.right.brightness.static(50.percent) + + BlinderBars.all { + it.color.reset() + it.brightness.fade(25.percent, 1.seconds) + it.preset.static(StairvilleSplb.Preset.STUB) // chase, red + it.presetSpeed.static(80.percent) + } + } + } + + step(StepCue.Text("Vampirgirls", "Wir warten auf euch", "Anfang")) { + rightSpotTarget = null + + onRun { + Spots.right.brightness.off(3.seconds) + Washs.both { it.brightness.off(2.seconds) } + + BlinderBars.all { + it.presetSpeed.fade(5.percent, 2.seconds) + it.brightness.fade(60.percent, 10.seconds) + } + } + } + + step(StepCue.Text("Vampirgirls", "Schloss Dracula", "Anfang")) { + onRun { + Spots.left.brightness.fade(100.percent, 3.seconds) + backlightBar.brightness.fade(100.percent, 3.seconds) + + Washs.both { + it.pointAtAudience() + it.colorWheelMode.static(CoemarProWash.ColorWheelMode.WarmWhite) + } + } + } + + step(StepCue.Text("Vampirgirls", "Schloss Dracula", "Ende")) { + actors { + -"Dracula" + -"Vampirgirls" + } + + leftSpotTarget = null + + onRun { + Spots.left.brightness.off() + backlightBar.brightness.off(1.seconds) + BlinderBars.all { it.brightness.off(1.seconds) } + } + } + + lightStep(StepCue.Custom("Die Bewohner entfreezen")) { + FrontLights.all { it.brightness.fade(100.percent, 1.seconds) } + Tops.both { it.brightness.fade(100.percent, 2.seconds) } + + backlightBar.brightness.fade(75.percent, 2.seconds) + backlightBar.color.cycle(12.seconds) + + Washs.both { + it.brightness.pulseOnce(2.seconds, 5.seconds, 100.percent) + it.beamAngle.fade(0.percent, 2.seconds) + it.pointAtCeiling(6.seconds) + } + + BlinderBars.all { + it.brightness.fade(30.percent, 3.seconds) + it.presetSpeed.static(20.percent) + it.preset.static(StairvilleSplb.Preset.STUB) // flowy, warm + } + } + + lightStep(StepCue.Text("Alle", "In der Mittsommernacht!", "Anfang")) { + Tops.both { it.brightness.off(3.seconds) } + backlightBar.brightness.off(3.seconds) + BlinderBars.all { it.brightness.off(3.seconds) } + } + + lightStep(StepCue.Custom("Musik: 1. Hit")) { + backlightBar.color.static(Color(hue = 40.degrees)) + backlightBar.brightness.fade(100.percent, 0.2.seconds) + Washs.both { it.brightness.fade(100.percent, 0.2.seconds) } + } + + lightStep(StepCue.Custom("Musik: 2. Hit")) { + BlinderBars.all { + it.white.static(100.percent) + it.preset.static(null) + it.brightness.pulseOnce(0.2.seconds, 2.seconds, 100.percent) + } + + backlightBar.brightness.off(3.seconds) + Washs.both { it.brightness.off(3.seconds) } + } + + step(StepCue.MusicEnd) { + actors { + -"Einwohner von Huntington" + } + + onRun { + FrontLights.all { it.brightness.fade(50.percent, 3.seconds) } + + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/moritzruth/theaterdsl/device/DynamicValue.kt b/src/main/kotlin/de/moritzruth/theaterdsl/device/DynamicValue.kt index 893c34c..8f9b505 100644 --- a/src/main/kotlin/de/moritzruth/theaterdsl/device/DynamicValue.kt +++ b/src/main/kotlin/de/moritzruth/theaterdsl/device/DynamicValue.kt @@ -150,8 +150,8 @@ abstract class DoubleDV(private val initialStaticValue: Double) : DynamicValu steps(persistentListOf(a, b), interval, startIndex) } - fun pulseOnce(rampUpDuration: Duration, rampDownDuration: Duration, peakValue: T = maximumValue, end: T = minimumValue, start: T = getCurrentValue()) { - state = State.PulseOnce(rampUpDuration, rampDownDuration, fromDomain(peakValue), fromDomain(start), fromDomain(end)) + fun pulseOnce(rampUpDuration: Duration, rampDownDuration: Duration, peak: T = maximumValue, end: T = minimumValue, start: T = getCurrentValue()) { + state = State.PulseOnce(rampUpDuration, rampDownDuration, fromDomain(peak), fromDomain(start), fromDomain(end)) } } @@ -198,9 +198,7 @@ class ColorDV(private val initialStaticValue: Color = Color.WHITE) : DynamicValu val deltaBrightness = end.brightness.value - start.brightness.value } - data class Cycle(val start: Color, val interval: Duration) : State { - - } + data class Cycle(val start: Color, val interval: Duration) : State data class FadeRandomAround(val hue: Angle, val deviation: Angle, val interval: Duration) : State } diff --git a/ui/src/pages/kiosk/stage.vue b/ui/src/pages/kiosk/stage.vue index e56e226..537a62f 100755 --- a/ui/src/pages/kiosk/stage.vue +++ b/ui/src/pages/kiosk/stage.vue @@ -8,7 +8,7 @@
-
vue +