diff --git a/intervalmusiccompositor.app/src/main/java/ch/retorte/intervalmusiccompositor/MainControl.java b/intervalmusiccompositor.app/src/main/java/ch/retorte/intervalmusiccompositor/MainControl.java index 7ace7d4d..6644a220 100644 --- a/intervalmusiccompositor.app/src/main/java/ch/retorte/intervalmusiccompositor/MainControl.java +++ b/intervalmusiccompositor.app/src/main/java/ch/retorte/intervalmusiccompositor/MainControl.java @@ -15,6 +15,7 @@ import ch.retorte.intervalmusiccompositor.model.audiofile.AudioFileComparator; import ch.retorte.intervalmusiccompositor.model.audiofile.IAudioFile; import ch.retorte.intervalmusiccompositor.model.compilation.CompilationParameters; +import ch.retorte.intervalmusiccompositor.model.list.BlendMode; import ch.retorte.intervalmusiccompositor.model.list.ListSortMode; import ch.retorte.intervalmusiccompositor.model.list.ObservableList; import ch.retorte.intervalmusiccompositor.model.messagebus.DebugMessage; @@ -41,8 +42,6 @@ import static ch.retorte.intervalmusiccompositor.model.list.ListSortMode.*; import static java.util.stream.Collectors.joining; -//import javafx.collections.ObservableList; - /** * Main controller of the software; collects data and reacts to ui events. Implements a lot of control interfaces. */ @@ -166,8 +165,69 @@ public void startCompilation(CompilationParameters compilationParameters) { } } - private boolean hasUsableTracksWith(CompilationParameters compilationParameters) { - return 0 < getUsableTracks(compilationParameters.getMusicPattern()); + @Override + public void markUsableTracksWith(CompilationParameters compilationParameters) { + // Music + for (IAudioFile musicFile : musicList) { + musicFile.setLongEnough(compilationParameters.getMusicPattern().stream().allMatch(p -> musicFile.isLongEnoughFor(p + effectiveBlendDuration(compilationParameters)))); + } + + // Break + for (IAudioFile breakFile : breakList) { + breakFile.setLongEnough(hasUsableBreakTracksWith(compilationParameters.getBreakPattern(), effectiveBlendDuration(compilationParameters))); + } + } + + @Override + public boolean hasUsableTracksWith(CompilationParameters compilationParameters) { + return hasUsableMusicTracksWith(compilationParameters) && hasUsableBreakTracksWith(compilationParameters); + } + + private boolean hasUsableMusicTracksWith(CompilationParameters compilationParameters) { + int usableTracks = 0; + int i = 0; + for (IAudioFile audioFile : musicList) { + if (audioFile.isOK() && audioFile.isLongEnoughFor(getIthPatternOf(compilationParameters.getMusicPattern(), i) + effectiveBlendDuration(compilationParameters))) { + usableTracks++; + } + i++; + } + + return 0 < usableTracks; + } + + private int getIthPatternOf(List pattern, int i) { + if (pattern == null || pattern.isEmpty()) { + return 0; + } + return pattern.get(i % pattern.size()); + } + + private boolean hasUsableBreakTracksWith(CompilationParameters compilationParameters) { + return hasNoBreakTrack() || hasUsableBreakTracksWith(compilationParameters.getBreakPattern(), effectiveBlendDuration(compilationParameters)); + } + + private boolean hasUsableBreakTracksWith(List pattern, int blendDuration) { + for (IAudioFile audioFile : breakList) { + if (!audioFile.isOK()) { + return false; + } + + for (int p : pattern) { + if (!audioFile.isLongEnoughFor(p + blendDuration)) { + return false; + } + } + } + return true; + } + + private boolean hasNoBreakTrack() { + return breakList.isEmpty(); + } + + private int effectiveBlendDuration(CompilationParameters compilationParameters) { + return compilationParameters.getBlendMode() == BlendMode.CROSS ? compilationParameters.getBlendDuration().intValue() : 0; } @Override @@ -338,32 +398,9 @@ void tidyOldTemporaryFiles() { } } - /** - * Returns the number of tracks which are to be used for the compilation with the currently selected compilation properties. - */ - public int getUsableTracks(List pattern) { - int usableTracks = 0; - int i = 0; - for (IAudioFile audioFile : musicList) { - if (audioFile.isOK() && audioFile.isLongEnoughFor(getIthPatternOf(pattern, i))) { - usableTracks++; - } - i++; - } - - return usableTracks; - } - - private int getIthPatternOf(List pattern, int i) { - if (pattern == null || pattern.isEmpty()) { - return 0; - } - return pattern.get(i % pattern.size()); - } - @Override - public int getOkTracks() { - return (int) musicList.stream().filter(IAudioFile::isOK).count(); + public long getOkTracks() { + return musicList.stream().filter(IAudioFile::isOK).count(); } /** diff --git a/intervalmusiccompositor.app/src/main/resources/CHANGELOG.txt b/intervalmusiccompositor.app/src/main/resources/CHANGELOG.txt index af5faf25..70a7d413 100644 --- a/intervalmusiccompositor.app/src/main/resources/CHANGELOG.txt +++ b/intervalmusiccompositor.app/src/main/resources/CHANGELOG.txt @@ -7,6 +7,7 @@ retorte laboratories (retorte.ch) IntervalMusicCompositor change log IMP #59 Inactivates process button if no compilation is possible. FIX #61 Fixes encoding tests in some environment by explicitly states encoding. FIX #58 Fixes crash with wrong Java version by bundling Java with the application. +FIX #60 Fixes that in advanced pattern too long breaks with break track were swallowed. 2019-03-05 2.9.2 diff --git a/intervalmusiccompositor.core/src/main/java/ch/retorte/intervalmusiccompositor/audiofile/AudioFile.java b/intervalmusiccompositor.core/src/main/java/ch/retorte/intervalmusiccompositor/audiofile/AudioFile.java index bb4b9e6f..daff227d 100644 --- a/intervalmusiccompositor.core/src/main/java/ch/retorte/intervalmusiccompositor/audiofile/AudioFile.java +++ b/intervalmusiccompositor.core/src/main/java/ch/retorte/intervalmusiccompositor/audiofile/AudioFile.java @@ -40,8 +40,6 @@ public class AudioFile extends File implements IAudioFile { private final Long startCutOffInMilliseconds = Long.parseLong(bundle.getString("imc.audio.cutoff.start")); private final Long endCutOffInMilliseconds = Long.parseLong(bundle.getString("imc.audio.cutoff.end")); - private static final long serialVersionUID = 6154514892883792308L; - private Long duration = 0L; private Float volume; @@ -69,6 +67,7 @@ public class AudioFile extends File implements IAudioFile { private final MessageProducer messageProducer; private final Collection> changeListeners = new LinkedList<>(); + private boolean longEnough = true; public AudioFile(String pathname, SoundHelper soundHelper, List audioFileDecoders, BPMReaderWriter bpmReaderWriter, BPMCalculator bpmCalculator, AudioStandardizer audioStandardizer, MessageProducer messageProducer) { super(pathname); @@ -408,6 +407,16 @@ public boolean isLongEnoughFor(int extractInSeconds) { return extractInSeconds <= ((getDuration() - startCutOffInMilliseconds - endCutOffInMilliseconds) / 1000); } + @Override + public void setLongEnough(boolean longEnough) { + this.longEnough = longEnough; + } + + @Override + public boolean isLongEnough() { + return longEnough; + } + @Override public boolean equals(Object obj) { if (obj instanceof AudioFile) { diff --git a/intervalmusiccompositor.core/src/main/java/ch/retorte/intervalmusiccompositor/playlist/Playlist.java b/intervalmusiccompositor.core/src/main/java/ch/retorte/intervalmusiccompositor/playlist/Playlist.java index 0c0ff126..f859d7bf 100644 --- a/intervalmusiccompositor.core/src/main/java/ch/retorte/intervalmusiccompositor/playlist/Playlist.java +++ b/intervalmusiccompositor.core/src/main/java/ch/retorte/intervalmusiccompositor/playlist/Playlist.java @@ -134,7 +134,7 @@ private List createMusicPlaylist(List musicFil IAudioFile currentAudioFile = musicFiles.get((musicTrackCounter) % musicFiles.size()); int currentSoundPattern = musicPattern.get(musicPatternCounter % musicPattern.size()); - PlaylistItemFragment newMusicTrack = createPlaylistItemFrom(currentAudioFile, 1, currentSoundPattern * 1000L); + PlaylistItemFragment newMusicTrack = createPlaylistItemFrom(currentAudioFile, 1, currentSoundPattern * 1000L, false); if (newMusicTrack != null) { musicPlaylist.add(newMusicTrack); musicPatternCounter++; @@ -155,7 +155,6 @@ private List createMusicPlaylist(List musicFil } if (musicFiles.size() < skippedTracks) { - messageProducer.send(new ErrorMessage("Too few usable tracks.")); throw new IllegalStateException("Too few usable tracks."); } } @@ -176,37 +175,30 @@ private List createBreakPlaylist(List breakFil int desiredBreakListSize = musicPatternSize * iterations; int breakTrackCounter = 0; - int skippedTracks = 0; while (breakPlaylist.size() < desiredBreakListSize) { - long currentBreakPatternMs = breakPattern.get((breakTrackCounter % musicPatternSize) % breakPattern.size()) * 1000; + int currentBreakPattern = breakPattern.get((breakTrackCounter % musicPatternSize) % breakPattern.size()); if (!breakFiles.isEmpty()) { IAudioFile currentBreakFile = breakFiles.get((breakTrackCounter % musicPatternSize) % breakFiles.size()); - PlaylistItemFragment newBreakTrack = createPlaylistItemFrom(currentBreakFile, volume, currentBreakPatternMs); + PlaylistItemFragment newBreakTrack = createPlaylistItemFrom(currentBreakFile, volume, currentBreakPattern * 1000L, true); if (newBreakTrack != null) { breakPlaylist.add(new BreakPlaylistItemFragment(newBreakTrack)); - skippedTracks = 0; } else { - skippedTracks++; + throw new IllegalStateException("Break track too short for desired break pattern: " + currentBreakPattern + "s."); } } else { if (isCrossFadingMode()) { - currentBreakPatternMs += (long) (blendTime * 1000); + currentBreakPattern += blendTime; } - breakPlaylist.add(new BreakPlaylistItemFragment(createPlaylistItem(null, volume, 0L, currentBreakPatternMs))); + breakPlaylist.add(new BreakPlaylistItemFragment(createPlaylistItem(null, volume, 0L, currentBreakPattern * 1000L))); } breakTrackCounter++; - - if (breakFiles.size() < skippedTracks) { - messageProducer.send(new ErrorMessage("Too few usable tracks.")); - throw new IllegalStateException("Too few usable tracks."); - } } return breakPlaylist; @@ -216,7 +208,7 @@ private boolean hasSingleZero(List breakPattern) { return breakPattern.size() == 1 && breakPattern.iterator().next() == 0; } - private PlaylistItemFragment createPlaylistItemFrom(IAudioFile audioFile, double volume, long extractLengthInMilliseconds) { + private PlaylistItemFragment createPlaylistItemFrom(IAudioFile audioFile, double volume, long extractLengthInMilliseconds, boolean isBreak) { long maximalRangeForDuration; long trackStart = startCutOffInMilliseconds; @@ -225,7 +217,7 @@ private PlaylistItemFragment createPlaylistItemFrom(IAudioFile audioFile, double extractLengthInMilliseconds += (long) (blendTime * 1000); } - if (isContinuousExtractEnumerator()) { + if (isContinuousExtractEnumerator() && !isBreak) { if (!currentProgress.containsKey(audioFile)) { currentProgress.put(audioFile, startCutOffInMilliseconds); } @@ -242,13 +234,13 @@ private PlaylistItemFragment createPlaylistItemFrom(IAudioFile audioFile, double } if (maximalRangeForDuration < 0) { - if (isContinuousExtractEnumerator()) { + if (isContinuousExtractEnumerator() && !isBreak) { currentProgress.remove(audioFile); } return null; } - if (isContinuousExtractEnumerator()) { + if (isContinuousExtractEnumerator() && !isBreak) { currentProgress.put(audioFile, trackStart + extractLengthInMilliseconds); } diff --git a/intervalmusiccompositor.core/src/test/java/ch/retorte/intervalmusiccompositor/playlist/PlaylistTest.java b/intervalmusiccompositor.core/src/test/java/ch/retorte/intervalmusiccompositor/playlist/PlaylistTest.java index ef393f18..63f2671c 100644 --- a/intervalmusiccompositor.core/src/test/java/ch/retorte/intervalmusiccompositor/playlist/PlaylistTest.java +++ b/intervalmusiccompositor.core/src/test/java/ch/retorte/intervalmusiccompositor/playlist/PlaylistTest.java @@ -248,6 +248,47 @@ public void shouldSkipTooShortTracksButNeverthelessCompletelyFillPattern() { assertThat(tracks.get(2).getMusicFragment().getAudioFile(), is(musicTrack60s)); } + @Test + public void shouldSkipTooShortTracksButNeverthelessCompletelyFillPatternInAdvancedMode() { + // given + Playlist playlist = new Playlist(SEPARATE, 0d, SINGLE_EXTRACT, SORT, msgPrd); + playlist.setCutOff(sec(5), sec(5)); + + musicList.add(musicTrack60s); + musicList.add(musicTrack20s); + musicList.add(musicTrack40s); + + musicPattern = pattern(10, 11); + breakPattern = pattern(1, 2); + + // when + List tracks = playlist.generatePlaylistFrom(musicList, musicPattern, breakList, breakPattern, 1, 2, soundEffectOccurrences); + + // then + assertThat(tracks.size(), is(4)); + assertTrackLength(tracks, 10, 1, 11, 2, 10, 1, 11, 2); + assertTotalLength(playlist, tracks, 48); + assertThat(tracks.get(0).getMusicFragment().getAudioFile(), is(musicTrack60s)); + assertThat(tracks.get(1).getMusicFragment().getAudioFile(), is(musicTrack40s)); + assertThat(tracks.get(2).getMusicFragment().getAudioFile(), is(musicTrack60s)); + assertThat(tracks.get(3).getMusicFragment().getAudioFile(), is(musicTrack40s)); + } + + @Test(expected = IllegalStateException.class) + public void shouldNotAllowNotSufficientBreakTrack() { + // given + Playlist playlist = new Playlist(SEPARATE, 0d, SINGLE_EXTRACT, SORT, msgPrd); + playlist.setCutOff(sec(5), sec(5)); + + musicList.add(musicTrack20s); + breakList.add(breakTrack20s); + + musicPattern = pattern(8, 8, 8); + breakPattern = pattern(8, 12, 8); + + // when this, then throw exception + playlist.generatePlaylistFrom(musicList, musicPattern, breakList, breakPattern, 1, 1, soundEffectOccurrences); + } @Test public void shouldTakeTheSameTrackInContinuousMode() { diff --git a/intervalmusiccompositor.model/src/main/java/ch/retorte/intervalmusiccompositor/model/audiofile/IAudioFile.java b/intervalmusiccompositor.model/src/main/java/ch/retorte/intervalmusiccompositor/model/audiofile/IAudioFile.java index 87e105ba..36967420 100644 --- a/intervalmusiccompositor.model/src/main/java/ch/retorte/intervalmusiccompositor/model/audiofile/IAudioFile.java +++ b/intervalmusiccompositor.model/src/main/java/ch/retorte/intervalmusiccompositor/model/audiofile/IAudioFile.java @@ -138,4 +138,18 @@ public interface IAudioFile extends Comparable { */ boolean isLongEnoughFor(int extractInSeconds); + /** + * Sets the long enough marker to either true ('long enough'), or false ('too short'). + * + * @param longEnough true if the track is long enough. + */ + void setLongEnough(boolean longEnough); + + /** + * Whether this file was marked long enough. + * + * @return true if this file is considered long enough for the compilation. + */ + boolean isLongEnough(); + } diff --git a/intervalmusiccompositor.spi/src/main/java/ch/retorte/intervalmusiccompositor/spi/MusicListControl.java b/intervalmusiccompositor.spi/src/main/java/ch/retorte/intervalmusiccompositor/spi/MusicListControl.java index 1d8970d1..e6bc1852 100644 --- a/intervalmusiccompositor.spi/src/main/java/ch/retorte/intervalmusiccompositor/spi/MusicListControl.java +++ b/intervalmusiccompositor.spi/src/main/java/ch/retorte/intervalmusiccompositor/spi/MusicListControl.java @@ -4,6 +4,8 @@ import java.util.List; import ch.retorte.intervalmusiccompositor.model.audiofile.IAudioFile; +import ch.retorte.intervalmusiccompositor.model.compilation.CompilationParameters; +import ch.retorte.intervalmusiccompositor.model.list.BlendMode; import ch.retorte.intervalmusiccompositor.model.list.ListSortMode; import ch.retorte.intervalmusiccompositor.model.list.ObservableList; import ch.retorte.intervalmusiccompositor.model.soundeffect.SoundEffect; @@ -51,9 +53,11 @@ public interface MusicListControl { void setBreakBpm(int index, int bpm); - int getUsableTracks(List pattern); + void markUsableTracksWith(CompilationParameters compilationParameters); - int getOkTracks(); + boolean hasUsableTracksWith(CompilationParameters compilationParameters); + + long getOkTracks(); void moveTrack(int sourceIndex, int destinationIndex); diff --git a/intervalmusiccompositor.ui.fx/src/main/java/ch/retorte/intervalmusiccompositor/ui/audiofilelist/AudioFileListCell.java b/intervalmusiccompositor.ui.fx/src/main/java/ch/retorte/intervalmusiccompositor/ui/audiofilelist/AudioFileListCell.java index 7750fa1c..4775d89b 100644 --- a/intervalmusiccompositor.ui.fx/src/main/java/ch/retorte/intervalmusiccompositor/ui/audiofilelist/AudioFileListCell.java +++ b/intervalmusiccompositor.ui.fx/src/main/java/ch/retorte/intervalmusiccompositor/ui/audiofilelist/AudioFileListCell.java @@ -197,22 +197,27 @@ private void setStatusWith(IAudioFile audioFile) { case IN_PROGRESS: imageView.setImage(processing); status.setText(resourceBundle.getString("ui.form.music_list.loading_text")); - return; + break; case ERROR: imageView.setImage(error); status.setText(audioFile.getErrorMessage()); - return; + break; case OK: imageView.setImage(ok); status.setText(audioFile.getSource().getParentFile().getAbsolutePath()); - return; + break; case QUEUED: imageView.setImage(queued); status.setText(resourceBundle.getString("ui.form.music_list.queuing_text")); - return; + break; default: imageView.setImage(warning); } + + if (!audioFile.isLongEnough()) { + imageView.setImage(warning); + status.setText(resourceBundle.getString("ui.form.music_list.tooshort_error")); + } } private void setContextMenuWith(IAudioFile audioFile) { diff --git a/intervalmusiccompositor.ui.fx/src/main/java/ch/retorte/intervalmusiccompositor/ui/mainscreen/MainScreenController.java b/intervalmusiccompositor.ui.fx/src/main/java/ch/retorte/intervalmusiccompositor/ui/mainscreen/MainScreenController.java index 8179f4f3..4ba3f26b 100644 --- a/intervalmusiccompositor.ui.fx/src/main/java/ch/retorte/intervalmusiccompositor/ui/mainscreen/MainScreenController.java +++ b/intervalmusiccompositor.ui.fx/src/main/java/ch/retorte/intervalmusiccompositor/ui/mainscreen/MainScreenController.java @@ -227,6 +227,7 @@ public class MainScreenController implements Initializable { // Bindings private final BooleanProperty hasUsableData = new SimpleBooleanProperty(false); + private final BooleanProperty hasUsableTracks = new SimpleBooleanProperty(false); // Fields @@ -343,7 +344,7 @@ private void openDebugLog() { } private void initializeMusicTrackList() { - musicTrackListView.initializeWith(musicListControl.getMusicList(), bundle, messageProducer, musicListControl, e -> Platform.runLater(this::updateTrackCount)); + musicTrackListView.initializeWith(musicListControl.getMusicList(), bundle, messageProducer, musicListControl, e -> Platform.runLater(this::updateUiDataWidgets)); musicTrackListView.addListChangeListener(newValue -> updateUiDataWidgets()); addMusicTrackButton.setOnAction(event -> openFileChooserFor(musicTrackListView)); addMusicTrackButton.graphicProperty().set(imageFrom("/images/add_icon_small.png")); @@ -377,7 +378,7 @@ private void initializeTrackEnumeration() { } private void initializeBreakTrackList() { - breakTrackListView.initializeWith(musicListControl.getBreakList(), bundle, messageProducer, musicListControl, e -> Platform.runLater(this::updateTrackCount)); + breakTrackListView.initializeWith(musicListControl.getBreakList(), bundle, messageProducer, musicListControl, e -> Platform.runLater(this::updateUiDataWidgets)); addBreakTrackButton.setOnAction(event -> openFileChooserFor(breakTrackListView)); addBreakTrackButton.graphicProperty().set(imageFrom("/images/add_icon_small.png")); @@ -468,7 +469,7 @@ private void resetOutputDirectory() { } private void initializeControlButtons() { - process.disableProperty().bind(hasUsableData.not()); + process.disableProperty().bind(hasUsableData.not().or(hasUsableTracks.not())); process.setOnAction(event -> musicCompilationControl.startCompilation(compilationParameters)); } @@ -483,7 +484,9 @@ private void initializeControlButtonsActivation() { soundPattern.textProperty().addListener(l); breakPattern.textProperty().addListener(l); iterations.valueProperty().addListener(l); - hasUsableData.setValue(compilationParameters.hasUsableData()); + + updateUsableData(); + markUsableTracks(); } private void initializePreferenceStorage() { @@ -647,9 +650,7 @@ private boolean isSimpleTab(Tab tab) { return tab.equals(simpleTab); } - private void updateDurationEstimation() { - setDurationTo(getDurationEstimation()); - } + private int getDurationEstimation() { return compilationParameters.getDurationEstimationSeconds(); @@ -674,19 +675,9 @@ private void setMenusDisabled(boolean disabled) { menuLoadBreakFile.setDisable(disabled); } - private void updateEnvelopeImage() { - if (compilationParameters.hasUsableData()) { - BarChart bar = new BarChart(720, 162); - bar.generate(compilationParameters.getMusicPattern(), compilationParameters.getBreakPattern(), compilationParameters.getIterations(), compilationParameters.getSoundEffectOccurrences(), false); - imageView.setImage(bar.getWritableImage()); - } else { - imageView.setImage(starterBackgroundImage); - } - } - private void updateSortModeLabel() { - trackListSortOrderIndicator.setText(getLabelFor(compilationParameters.getListSortMode())); - } + + private String getLabelFor(ListSortMode listSortMode) { switch (listSortMode) { @@ -783,14 +774,30 @@ private void updateUiDataWidgets() { updateSortModeLabel(); updateTrackCount(); updateSoundEffectPane(); + updateUsableData(); + markUsableTracks(); } - private void updateSoundEffectPane() { - musicAndBreakPatternChangeListener.changed(null, null, null); + private void updateDurationEstimation() { + setDurationTo(getDurationEstimation()); + } + + private void updateEnvelopeImage() { + if (compilationParameters.hasUsableData()) { + BarChart bar = new BarChart(720, 162); + bar.generate(compilationParameters.getMusicPattern(), compilationParameters.getBreakPattern(), compilationParameters.getIterations(), compilationParameters.getSoundEffectOccurrences(), false); + imageView.setImage(bar.getWritableImage()); + } else { + imageView.setImage(starterBackgroundImage); + } + } + + private void updateSortModeLabel() { + trackListSortOrderIndicator.setText(getLabelFor(compilationParameters.getListSortMode())); } private void updateTrackCount() { - int tracks = musicListControl.getOkTracks(); + long tracks = musicListControl.getOkTracks(); String labelText = bundle.getString("ui.form.music_list.tracks_label_pl", tracks); if (tracks == 1) { labelText = bundle.getString("ui.form.music_list.tracks_label_sg", tracks); @@ -798,6 +805,21 @@ private void updateTrackCount() { trackCount.setText(labelText); } + private void updateSoundEffectPane() { + musicAndBreakPatternChangeListener.changed(null, null, null); + } + + private void updateUsableData() { + hasUsableData.setValue(compilationParameters.hasUsableData()); + hasUsableTracks.setValue(musicListControl.hasUsableTracksWith(compilationParameters)); + } + + private void markUsableTracks() { + musicListControl.markUsableTracksWith(compilationParameters); + musicTrackListView.refresh(); + breakTrackListView.refresh(); + } + private void addDebugMessage(String message) { messageProducer.send(new DebugMessage(MainScreenController.this, message)); } @@ -814,7 +836,7 @@ public void changed(ObservableValue observable, Object oldValue, Object newVa private class UsableDataChangeListener implements ChangeListener { @Override public void changed(ObservableValue observable, Object oldValue, Object newValue) { - hasUsableData.setValue(compilationParameters.hasUsableData()); + updateUsableData(); } } diff --git a/intervalmusiccompositor.ui.fx/src/main/resources/ui_imc_de.properties b/intervalmusiccompositor.ui.fx/src/main/resources/ui_imc_de.properties index c35dfde3..33846fba 100644 --- a/intervalmusiccompositor.ui.fx/src/main/resources/ui_imc_de.properties +++ b/intervalmusiccompositor.ui.fx/src/main/resources/ui_imc_de.properties @@ -50,7 +50,7 @@ ui.form.music_list.list_mode.sort = Sortiert ui.form.music_list.list_mode.sort_rev = Rückw. Sortiert ui.form.music_list.list_mode.shuffle = Zufällig ui.form.music_list.list_mode.manual = Manuell -ui.form.music_list.tooshort_error = Stück ist zu kurz für Intervalle +ui.form.music_list.tooshort_error = Stück ev. zu kurz für Intervalle. ui.form.music_list.loading_text = Lade ... ui.form.music_list.queuing_text = In Warteschlange ui.form.break_list.label = Pausenmusik diff --git a/intervalmusiccompositor.ui.fx/src/main/resources/ui_imc_en.properties b/intervalmusiccompositor.ui.fx/src/main/resources/ui_imc_en.properties index 8df05a0c..c4ef9b40 100644 --- a/intervalmusiccompositor.ui.fx/src/main/resources/ui_imc_en.properties +++ b/intervalmusiccompositor.ui.fx/src/main/resources/ui_imc_en.properties @@ -48,7 +48,7 @@ ui.form.music_list.list_mode.sort = Sort ui.form.music_list.list_mode.sort_rev = Reverse Sort ui.form.music_list.list_mode.shuffle = Shuffle ui.form.music_list.list_mode.manual = Manual -ui.form.music_list.tooshort_error = Track is too short for chosen values! +ui.form.music_list.tooshort_error = Track might be too short for chosen values. ui.form.music_list.loading_text = Loading ... ui.form.music_list.queuing_text = Waiting in queue ui.form.break_list.label = Break Track