diff --git a/README.md b/README.md index 4b40cf6d..f84264bd 100644 --- a/README.md +++ b/README.md @@ -123,17 +123,18 @@ Update apt: apt-get update ```` -Prepare the environment according to [https://github.com/RPi-distro/pi-gen] (e.g. install the required dependencies) +Prepare the environment according to [https://github.com/RPi-distro/pi-gen](pi-gen Readme) (e.g. install the required dependencies) Run the following script (might take about 45 minutes) ```shell cd /opt +rm -rf build mkdir build cd build git clone https://github.com/RPi-distro/pi-gen.git cd pi-gen -git checkout tags/2023-05-03-raspios-bullseye +git checkout tags/2024-03-15-raspios-bookworm-arm64 echo "IMG_NAME='RocketShow'" > config diff --git a/dist/currentversion2.xml b/dist/currentversion2.xml index 0f1cd741..501811ca 100644 --- a/dist/currentversion2.xml +++ b/dist/currentversion2.xml @@ -1,8 +1,12 @@ 2.3.5 - 2023-07-31 + 2024-05-13 + + 2.3.6 + Support Raspberry Pi 5, bugfix with WLAN AP disable, minor fixes + 2.3.5 Fix logging diff --git a/dist/install/raspbian.sh b/dist/install/raspbian.sh index 7691f889..15b970f9 100644 --- a/dist/install/raspbian.sh +++ b/dist/install/raspbian.sh @@ -8,7 +8,7 @@ apt-get update apt-get upgrade -y -apt-get -y install unzip openjdk-17-jdk dnsmasq hostapd fbi ola libnss-mdns iptables alsa-base libasound2 alsa-utils openssh-sftp-server libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-alsa gstreamer1.0-gl +apt-get -y install unzip openjdk-17-jdk dnsmasq hostapd fbi ola libnss-mdns iptables libasound2 alsa-utils openssh-sftp-server libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-alsa gstreamer1.0-gl # Add the rocketshow user adduser \ @@ -172,18 +172,18 @@ chown -R rocketshow:rocketshow /home/rocketshow # Apply a patch to make seeking videos work on the Raspberry Pi 4 # https://github.com/moritzvieli/rocketshow/issues/7 # See: https://github.com/raspberrypi/linux/issues/3325#issuecomment-684040830 -firmware=$(zgrep "firmware as of" \ - "/usr/share/doc/raspberrypi-kernel/changelog.Debian.gz" | \ - head -n1 | sed -n 's|.* \([^ ]*\)$|\1|p') -uname="$(curl -k -s -L "https://github.com/raspberrypi/firmware/raw/$firmware/extra/uname_string7l")" -KVER="$(echo ${uname} | grep -Po '\b(Linux version )\K(?[^\ ]+)' | cat)" - -cd /lib/modules/${KVER}/kernel/drivers/staging/vc04_services/bcm2835-codec -rm -rf bcm2835-codec.ko -wget https://rocketshow.net/install/patches/bcm2835-codec.ko -mkdir -p /lib/modules/${KVER}/extra -cp bcm2835-codec.ko /lib/modules/${KVER}/extra/bcm2835-codec.ko +#firmware=$(zgrep "firmware as of" \ +# "/usr/share/doc/raspberrypi-kernel/changelog.Debian.gz" | \ +# head -n1 | sed -n 's|.* \([^ ]*\)$|\1|p') +#uname="$(curl -k -s -L "https://github.com/raspberrypi/firmware/raw/$firmware/extra/uname_string7l")" +#KVER="$(echo ${uname} | grep -Po '\b(Linux version )\K(?[^\ ]+)' | cat)" +# +#cd /lib/modules/${KVER}/kernel/drivers/staging/vc04_services/bcm2835-codec +#rm -rf bcm2835-codec.ko +#wget https://rocketshow.net/install/patches/bcm2835-codec.ko +#mkdir -p /lib/modules/${KVER}/extra +#cp bcm2835-codec.ko /lib/modules/${KVER}/extra/bcm2835-codec.ko # Give the setup some time, because umount won't work afterwards if called too fast ("umount: device is busy") -echo "Wait 30 seconds..." -sleep 30s \ No newline at end of file +echo "Wait 5 seconds..." +sleep 5s \ No newline at end of file diff --git a/ola-java-client-src/src/main/java/ola/OlaClient.java b/ola-java-client-src/src/main/java/ola/OlaClient.java index 2f83e88b..1a28f26b 100644 --- a/ola-java-client-src/src/main/java/ola/OlaClient.java +++ b/ola-java-client-src/src/main/java/ola/OlaClient.java @@ -82,7 +82,6 @@ public OlaClient() throws Exception { * @return Message result message or null if the call failed. */ private Message callRpcMethod(String method, Message inputMessage) { - final Message[] outputMessage = new Message[1]; controller.reset(); diff --git a/pom.xml b/pom.xml index 69383022..ff0e565b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.ascargon rocketshow - 2.3.5 + 2.3.6 jar Rocket Show @@ -38,53 +38,53 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + com.github.eirslett + frontend-maven-plugin + 1.11.0 + + src/main/webapp + + target/npm + + + + exec-npm-install + + install-node-and-npm + + generate-sources + + v10.13.0 + 6.4.1 + + + + npm install + + npm + + + + install + + generate-sources + + + prod + + npm + + + + run prod -- --output-hashing=all + + generate-sources + + + @@ -129,12 +129,6 @@ jakarta.activation-api 2.1.0 - - - - - - diff --git a/src/main/java/com/ascargon/rocketshow/DefaultSettingsService.java b/src/main/java/com/ascargon/rocketshow/DefaultSettingsService.java index 3d9bf976..9d71cc3d 100644 --- a/src/main/java/com/ascargon/rocketshow/DefaultSettingsService.java +++ b/src/main/java/com/ascargon/rocketshow/DefaultSettingsService.java @@ -173,9 +173,7 @@ private void initDefaultSettings() { } if (settings.getAudioOutput() == null) { - if (OperatingSystemInformation.SubType.RASPBIAN.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { - settings.setAudioOutput(Settings.AudioOutput.DEVICE); - } else if (OperatingSystemInformation.Type.OS_X.equals(operatingSystemInformationService.getOperatingSystemInformation().getType())) { + if (OperatingSystemInformation.Type.OS_X.equals(operatingSystemInformationService.getOperatingSystemInformation().getType())) { settings.setAudioOutput(Settings.AudioOutput.DEFAULT); } else if (OperatingSystemInformation.Type.LINUX.equals(operatingSystemInformationService.getOperatingSystemInformation().getType())) { settings.setAudioOutput(Settings.AudioOutput.DEVICE); @@ -198,7 +196,7 @@ private void initDefaultSettings() { settings.setLoggingLevel(Settings.LoggingLevel.INFO); } - if (OperatingSystemInformation.SubType.RASPBIAN.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { + if (OperatingSystemInformation.SubType.RASPBERRYOS.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { // Raspbian-specific settings if (settings.isEnableRaspberryGpio() == null) { @@ -296,10 +294,6 @@ public RemoteDevice getRemoteDeviceByName(String name) { } private void setSystemAudioOutput(int id) throws Exception { - if (!OperatingSystemInformation.SubType.RASPBIAN.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { - return; - } - // TODO Not supported currently //ShellManager shellManager = new ShellManager(new String[]{"amixer", "cset", "numid=3", String.valueOf(id)}); //shellManager.getProcess().waitFor(); @@ -404,9 +398,10 @@ private String getAlsaSettings() { } private void updateAudioSystem() throws Exception { - if (settings.getAudioOutput() == Settings.AudioOutput.HEADPHONES && OperatingSystemInformation.SubType.RASPBIAN.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { + // not supported currently + if (settings.getAudioOutput() == Settings.AudioOutput.HEADPHONES && OperatingSystemInformation.SubType.RASPBERRYOS.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { setSystemAudioOutput(1); - } else if (settings.getAudioOutput() == Settings.AudioOutput.HDMI && OperatingSystemInformation.SubType.RASPBIAN.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { + } else if (settings.getAudioOutput() == Settings.AudioOutput.HDMI && OperatingSystemInformation.SubType.RASPBERRYOS.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { setSystemAudioOutput(2); } else if (settings.getAudioOutput() == Settings.AudioOutput.DEVICE) { // Write the audio settings to /home/.asoundrc and use ALSA to @@ -487,10 +482,6 @@ private void updateWlanAp() { String apConfig = ""; String statusCommand; - if (!settings.isWlanApEnable()) { - return; - } - // Update the access point configuration apConfig += "interface=wlan0\n"; apConfig += "driver=nl80211\n"; @@ -557,7 +548,7 @@ private void updateSystem() { logger.error("Could not update the logging level system settings", e); } - if (OperatingSystemInformation.SubType.RASPBIAN.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { + if (OperatingSystemInformation.SubType.RASPBERRYOS.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { try { updateWlanAp(); } catch (Exception e) { diff --git a/src/main/java/com/ascargon/rocketshow/Settings.java b/src/main/java/com/ascargon/rocketshow/Settings.java index 9227e595..12aaa8c5 100644 --- a/src/main/java/com/ascargon/rocketshow/Settings.java +++ b/src/main/java/com/ascargon/rocketshow/Settings.java @@ -57,6 +57,10 @@ public void setMediaPath(String mediaPath) { private List raspberryGpioControlList = new ArrayList<>(); + // Used to collect all lighting events within a certain amount of time and send them alltogether, not + // one by one as soon as they occur, for performance reasons. The higher, the more events will be "merged", + // the lower, the more CPU it needs. + // To set a delay on lighting events coming from MIDI, use offsetMillisMidi (or the offset on the composition file). private Integer lightingSendDelayMillis; // Global play offset on file types diff --git a/src/main/java/com/ascargon/rocketshow/composition/CompositionPlayer.java b/src/main/java/com/ascargon/rocketshow/composition/CompositionPlayer.java index 93611feb..efd497c0 100644 --- a/src/main/java/com/ascargon/rocketshow/composition/CompositionPlayer.java +++ b/src/main/java/com/ascargon/rocketshow/composition/CompositionPlayer.java @@ -209,7 +209,7 @@ private void addVideoToPipelineRaspberry3(CompositionFile compositionFile, int i pipeline.add(playBin); } - private void addVideoToPipelineRaspberry4(CompositionFile compositionFile, int index) { + private void addVideoToPipeline(CompositionFile compositionFile, int index) { URIDecodeBin videoSource = (URIDecodeBin) ElementFactory.make("uridecodebin", "videouridecodebin"); videoSource.set("uri", "file://" + settingsService.getSettings().getBasePath() + settingsService.getSettings().getMediaPath() + File.separator + settingsService.getSettings().getVideoPath() + File.separator + compositionFile.getName()); @@ -469,12 +469,12 @@ private void createGstreamerPipeline(boolean hasAudioFile) { // See http://gstreamer-devel.966125.n4.nabble.com/OpenGL-renderer-window-td4686092.html if (OperatingSystemInformation.Type.LINUX.equals(operatingSystemInformationService.getOperatingSystemInformation().getType())) { - if (OperatingSystemInformation.SubType.RASPBIAN.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { - if (OperatingSystemInformation.RaspberryVersion.MODEL_3.equals(operatingSystemInformationService.getOperatingSystemInformation().getRaspberryVersion())) { - addVideoToPipelineRaspberry3(compositionFile, i); - } else if (OperatingSystemInformation.RaspberryVersion.MODEL_4.equals(operatingSystemInformationService.getOperatingSystemInformation().getRaspberryVersion())) { - addVideoToPipelineRaspberry4(compositionFile, i); - } + if (OperatingSystemInformation.SubType.RASPBERRYOS.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType()) + && OperatingSystemInformation.RaspberryVersion.MODEL_3.equals(operatingSystemInformationService.getOperatingSystemInformation().getRaspberryVersion())) { + + addVideoToPipelineRaspberry3(compositionFile, i); + } else { + addVideoToPipeline(compositionFile, i); } } } diff --git a/src/main/java/com/ascargon/rocketshow/image/DefaultImageDisplayingService.java b/src/main/java/com/ascargon/rocketshow/image/DefaultImageDisplayingService.java index 821f776b..b04ce060 100644 --- a/src/main/java/com/ascargon/rocketshow/image/DefaultImageDisplayingService.java +++ b/src/main/java/com/ascargon/rocketshow/image/DefaultImageDisplayingService.java @@ -17,7 +17,7 @@ public DefaultImageDisplayingService(SettingsService settingsService, OperatingS shellManager = new ShellManager(new String[]{"sh"}); // Display a default black screen on Raspbian - if (OperatingSystemInformation.SubType.RASPBIAN.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { + if (OperatingSystemInformation.SubType.RASPBERRYOS.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { display(settingsService.getSettings().getBasePath() + "black.jpg"); } } diff --git a/src/main/java/com/ascargon/rocketshow/lighting/DefaultLightingService.java b/src/main/java/com/ascargon/rocketshow/lighting/DefaultLightingService.java index 899485ce..b41cd50d 100644 --- a/src/main/java/com/ascargon/rocketshow/lighting/DefaultLightingService.java +++ b/src/main/java/com/ascargon/rocketshow/lighting/DefaultLightingService.java @@ -56,6 +56,9 @@ public class DefaultLightingService implements LightingService { private boolean externalSync = false; + // is OLA initialized and at least one universe prepared? + private boolean olaReady = false; + public DefaultLightingService(SettingsService settingsService, CapabilitiesService capabilitiesService, ActivityNotificationLightingService activityNotificationLightingService) { this.settingsService = settingsService; this.capabilitiesService = capabilitiesService; @@ -129,7 +132,7 @@ private void sendUniverse() { mixedUniverse[i] = (short) highestValue; } - if (olaClient != null) { + if (olaReady) { olaClient.sendDmx(1, mixedUniverse); } @@ -274,6 +277,7 @@ private void initializeUniverse() { if (universeInfoReply != null) { if (universeInfoReply.getUniverseCount() > 0) { // At least one universe is already initialized + olaReady = true; return; } } @@ -285,7 +289,7 @@ private void initializeUniverse() { try { portId = getConnectedPort(); } catch (Exception e) { - logger.error("Could not get a output port", e); + logger.error("Could not get an output port", e); } if (portId == null || portId.length() == 0) { @@ -299,6 +303,7 @@ private void initializeUniverse() { // Create the port with the device-id, "O" for output and the port // ID createOlaUniverse(portId); + olaReady = true; } catch (Exception e) { logger.error("Could not create a new universe on OLA", e); } diff --git a/src/main/java/com/ascargon/rocketshow/util/DefaultFactoryResetService.java b/src/main/java/com/ascargon/rocketshow/util/DefaultFactoryResetService.java index c90f2595..f5fdbae9 100644 --- a/src/main/java/com/ascargon/rocketshow/util/DefaultFactoryResetService.java +++ b/src/main/java/com/ascargon/rocketshow/util/DefaultFactoryResetService.java @@ -18,7 +18,7 @@ public DefaultFactoryResetService(OperatingSystemInformationService operatingSys @Override public void reset() throws Exception { - if (!OperatingSystemInformation.SubType.RASPBIAN.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { + if (!OperatingSystemInformation.SubType.RASPBERRYOS.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { return; } diff --git a/src/main/java/com/ascargon/rocketshow/util/DefaultOperatingSystemInformationService.java b/src/main/java/com/ascargon/rocketshow/util/DefaultOperatingSystemInformationService.java index 4c1575d9..16ac1735 100644 --- a/src/main/java/com/ascargon/rocketshow/util/DefaultOperatingSystemInformationService.java +++ b/src/main/java/com/ascargon/rocketshow/util/DefaultOperatingSystemInformationService.java @@ -63,9 +63,22 @@ public DefaultOperatingSystemInformationService() { logger.error("Could not read details about the linux operating system", e); } - if ("debian".equals(idLike)) { + if (idLike.isEmpty()) { + // id_like could not be parsed. this might happen on some distros. try the id. + if ("debian".equals(id)) { + operatingSystemInformation.setSubType(OperatingSystemInformation.SubType.DEBIAN); + + // check a file generated by pi-gen + // https://forums.raspberrypi.com/viewtopic.php?t=331920 + File fileRpiIssue = new File("/etc", "rpi-issue"); + if (fileRpiIssue.exists()) { + operatingSystemInformation.setSubType(OperatingSystemInformation.SubType.RASPBERRYOS); + determineRaspberryModel(operatingSystemInformation); + } + } + } else if ("debian".equals(idLike)) { if ("raspbian".equals(id)) { - operatingSystemInformation.setSubType(OperatingSystemInformation.SubType.RASPBIAN); + operatingSystemInformation.setSubType(OperatingSystemInformation.SubType.RASPBERRYOS); determineRaspberryModel(operatingSystemInformation); } else { operatingSystemInformation.setSubType(OperatingSystemInformation.SubType.DEBIAN); @@ -89,6 +102,8 @@ private void determineRaspberryModel(OperatingSystemInformation operatingSystemI operatingSystemInformation.setRaspberryVersion(OperatingSystemInformation.RaspberryVersion.MODEL_3); } else if (line.startsWith("Raspberry Pi 4")) { operatingSystemInformation.setRaspberryVersion(OperatingSystemInformation.RaspberryVersion.MODEL_4); + } else if (line.startsWith("Raspberry Pi 5")) { + operatingSystemInformation.setRaspberryVersion(OperatingSystemInformation.RaspberryVersion.MODEL_5); } } catch (final Exception e) { logger.error("Could not read details about the Raspberry model", e); diff --git a/src/main/java/com/ascargon/rocketshow/util/DefaultRebootService.java b/src/main/java/com/ascargon/rocketshow/util/DefaultRebootService.java index 98e133dd..ebf54a66 100644 --- a/src/main/java/com/ascargon/rocketshow/util/DefaultRebootService.java +++ b/src/main/java/com/ascargon/rocketshow/util/DefaultRebootService.java @@ -26,7 +26,7 @@ public void reboot() throws InterruptedException, IOException { } } - if (!OperatingSystemInformation.SubType.RASPBIAN.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { + if (!OperatingSystemInformation.SubType.RASPBERRYOS.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { // Restart the app instead of a complete system reboot. Restarting // the app should be enough, because all the additional settings // (access point, etc.) do not work anyway on systems other than diff --git a/src/main/java/com/ascargon/rocketshow/util/DefaultShutdownService.java b/src/main/java/com/ascargon/rocketshow/util/DefaultShutdownService.java index 98cb9104..9d09bd08 100644 --- a/src/main/java/com/ascargon/rocketshow/util/DefaultShutdownService.java +++ b/src/main/java/com/ascargon/rocketshow/util/DefaultShutdownService.java @@ -26,7 +26,7 @@ public void shutdown() throws InterruptedException, IOException { } } - if (!OperatingSystemInformation.SubType.RASPBIAN.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { + if (!OperatingSystemInformation.SubType.RASPBERRYOS.equals(operatingSystemInformationService.getOperatingSystemInformation().getSubType())) { // Don't shutdown the system if we're not running on Raspbian return; } diff --git a/src/main/java/com/ascargon/rocketshow/util/OperatingSystemInformation.java b/src/main/java/com/ascargon/rocketshow/util/OperatingSystemInformation.java index 35ccafb0..df511426 100644 --- a/src/main/java/com/ascargon/rocketshow/util/OperatingSystemInformation.java +++ b/src/main/java/com/ascargon/rocketshow/util/OperatingSystemInformation.java @@ -9,8 +9,11 @@ public enum Type { UNKNOWN, WINDOWS, OS_X, LINUX, HP_UNIX, SOLARIs, SUN_OS } + // raspbian is not used anymore for 64 bit Raspberries + // https://forums.raspberrypi.com/viewtopic.php?t=331920 + // that's why we're grouping all raspberry OS generated by pi-gen into the subType "RASPBERRY" public enum SubType { - UNKNOWN, RASPBIAN, DEBIAN, UBUNTU + UNKNOWN, RASPBERRYOS, DEBIAN, UBUNTU } public enum ArchitectureType { @@ -18,13 +21,14 @@ public enum ArchitectureType { } public enum RaspberryVersion { - UNKNOWN, MODEL_3, MODEL_4 + UNKNOWN, MODEL_3, MODEL_4, MODEL_5 } private Type type = Type.UNKNOWN; private SubType subType = SubType.UNKNOWN; private ArchitectureType architectureType = ArchitectureType.UNKNOWN; private RaspberryVersion raspberryVersion = RaspberryVersion.UNKNOWN; + private Boolean isRaspberryPi = false; public Type getType() { return type; @@ -57,4 +61,12 @@ public RaspberryVersion getRaspberryVersion() { public void setRaspberryVersion(RaspberryVersion raspberryVersion) { this.raspberryVersion = raspberryVersion; } + + public Boolean getRaspberryPi() { + return isRaspberryPi; + } + + public void setRaspberryPi(Boolean raspberryPi) { + isRaspberryPi = raspberryPi; + } } diff --git a/src/main/webapp/src/app/settings/settings-midi/settings-midi.component.html b/src/main/webapp/src/app/settings/settings-midi/settings-midi.component.html index 736c64f7..8c06541e 100644 --- a/src/main/webapp/src/app/settings/settings-midi/settings-midi.component.html +++ b/src/main/webapp/src/app/settings/settings-midi/settings-midi.component.html @@ -2,24 +2,24 @@ {{ 'settings.restart-required' | translate }} -
+
- {{ 'settings.no-midi-devices' | translate }} -
- +
-
+
- {{ 'settings.no-midi-devices' | translate }} -
- +
@@ -27,7 +27,8 @@
- +
@@ -72,7 +73,8 @@
-
@@ -80,8 +82,10 @@
- +
@@ -91,16 +95,20 @@
-
+
- - +
@@ -108,8 +116,9 @@
- +
-
\ No newline at end of file +
diff --git a/src/main/webapp/src/app/settings/settings-midi/settings-midi.component.ts b/src/main/webapp/src/app/settings/settings-midi/settings-midi.component.ts index 18af6cf8..5bc54c90 100644 --- a/src/main/webapp/src/app/settings/settings-midi/settings-midi.component.ts +++ b/src/main/webapp/src/app/settings/settings-midi/settings-midi.component.ts @@ -245,4 +245,8 @@ export class SettingsMidiComponent implements OnInit, OnDestroy { }); } + midiDeviceEqual(device1: MidiDevice, device2: MidiDevice): boolean { + return device1 && device2 ? device1.id === device2.id : false; + } + } diff --git a/src/main/webapp/src/assets/i18n/de.json b/src/main/webapp/src/assets/i18n/de.json index 6b1cbb7a..1e5e7bce 100644 --- a/src/main/webapp/src/assets/i18n/de.json +++ b/src/main/webapp/src/assets/i18n/de.json @@ -23,7 +23,7 @@ }, "loading": { "title": "Laden...", - "description": "Bitte warte, bis die App geladen ist." + "description": "Bitte warte, bis die App geladen ist." }, "intro": { "welcome": "Whoop, whoop!", @@ -37,7 +37,7 @@ "start": "Start", "compositions": "Kompositionen", "designer": "Designer", - "settings": "Einstellungen" + "settings": "Einstellungen" }, "editor": { "compositions": "Kompositionen", @@ -99,7 +99,7 @@ "title": "Ausgabe", "description": "Stelle ein, wo und wie diese MIDI Datei ausgegeben werden soll.", "type": "Ausgabe", - "midi-transformation": "MIDI Transformation", + "midi-transformation": "MIDI Transformation", "channel-offset": "Kanal Versatz", "note-offset": "Noten Versatz", "lighting-mapping": "Lichtsteuerungs-Mapping", @@ -206,7 +206,7 @@ "no-audio-device": "Keines", "no-audio-devices": "Keine Audio Geräte verfügbar", "logging-level": "Logging Level", - "lighting-send-delay": "Sendeverzögerung in Millisekunden", + "lighting-send-delay": "Gruppierungs-Verzögerung in Millisekunden", "global-play-offset": "Globale Abspiel-Verzögerung in Millisekunden", "device-in-midi-routing": "MIDI Gerät Ausgabe", "remote-midi-routing": "Netzwerk MIDI Ausgang", @@ -260,4 +260,4 @@ "TRACE": "Trace" } } -} \ No newline at end of file +} diff --git a/src/main/webapp/src/assets/i18n/en.json b/src/main/webapp/src/assets/i18n/en.json index 805ae55a..6f955c77 100644 --- a/src/main/webapp/src/assets/i18n/en.json +++ b/src/main/webapp/src/assets/i18n/en.json @@ -23,7 +23,7 @@ }, "loading": { "title": "Loading...", - "description": "Please wait while the application is being loaded." + "description": "Please wait while the application is being loaded." }, "intro": { "welcome": "Whoop, whoop!", @@ -37,7 +37,7 @@ "start": "Start", "compositions": "Compositions", "designer": "Designer", - "settings": "Settings" + "settings": "Settings" }, "editor": { "compositions": "Compositions", @@ -206,7 +206,7 @@ "no-audio-device": "None", "no-audio-devices": "No audio devices available", "logging-level": "Logging level", - "lighting-send-delay": "Send delay in milliseconds", + "lighting-send-delay": "Grouping delay in milliseconds", "global-play-offset": "Global play offset in milliseconds", "device-in-midi-routing": "MIDI device routing", "remote-midi-routing": "Remote MIDI routing", @@ -260,4 +260,4 @@ "TRACE": "Trace" } } -} \ No newline at end of file +}