From 33db877cbaf828463fb52c59df45866f2c0f15cd Mon Sep 17 00:00:00 2001 From: overflowerror Date: Wed, 14 Dec 2016 17:38:36 +0100 Subject: [PATCH] update --- src/main/java/net/persei/dionysus/Logger.java | 47 ++ src/main/java/net/persei/dionysus/Main.java | 592 +++++++++++++++++- .../dionysus/commands/DelayCommand.java | 36 ++ .../dionysus/commands/MultiCommand.java | 41 ++ .../dionysus/commands/MusicCommand.java | 8 +- .../dionysus/commands/MusicPlayCommand.java | 8 +- .../dionysus/commands/ProvokeCommand.java | 28 + .../dionysus/commands/SoundFXCommand.java | 4 +- .../dionysus/commands/VideoCommand.java | 8 +- .../dionysus/commands/VideoPlayCommand.java | 4 +- .../net/persei/dionysus/managers/Command.java | 6 - .../dionysus/managers/CommandManager.java | 50 +- .../net/persei/dionysus/managers/Context.java | 7 + .../net/persei/dionysus/managers/Event.java | 55 -- .../persei/dionysus/managers/MidiManager.java | 69 +- .../dionysus/managers/MusicManager.java | 56 +- .../dionysus/managers/SoundFXManager.java | 2 + .../dionysus/managers/VideoManager.java | 1 + .../persei/dionysus/players/AudioPlayer.java | 2 + .../persei/dionysus/players/VideoPlayer.java | 2 +- 20 files changed, 905 insertions(+), 121 deletions(-) create mode 100644 src/main/java/net/persei/dionysus/Logger.java create mode 100644 src/main/java/net/persei/dionysus/commands/DelayCommand.java create mode 100644 src/main/java/net/persei/dionysus/commands/MultiCommand.java create mode 100644 src/main/java/net/persei/dionysus/commands/ProvokeCommand.java delete mode 100644 src/main/java/net/persei/dionysus/managers/Command.java delete mode 100644 src/main/java/net/persei/dionysus/managers/Event.java diff --git a/src/main/java/net/persei/dionysus/Logger.java b/src/main/java/net/persei/dionysus/Logger.java new file mode 100644 index 0000000..d410eca --- /dev/null +++ b/src/main/java/net/persei/dionysus/Logger.java @@ -0,0 +1,47 @@ +/** + * + */ +package net.persei.dionysus; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +/** + * @author overflow + * + */ +public class Logger { + + private static final String MUSIC_LOGFILE_NAME = "music.log"; + private static File musicLogFile; + private static FileWriter musicLogFileWriter; + + static { + try { + musicLogFile = new File(MUSIC_LOGFILE_NAME); + musicLogFile.mkdirs(); + musicLogFile.delete(); + musicLogFile.createNewFile(); + musicLogFileWriter = new FileWriter(musicLogFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void logMusic(String file) { + try { + musicLogFileWriter.append(new File(file).toPath().toRealPath().toString() + "\n"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void close() { + try { + musicLogFileWriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/net/persei/dionysus/Main.java b/src/main/java/net/persei/dionysus/Main.java index 7800dcd..0cef31c 100644 --- a/src/main/java/net/persei/dionysus/Main.java +++ b/src/main/java/net/persei/dionysus/Main.java @@ -1,11 +1,23 @@ package net.persei.dionysus; +import java.io.FileNotFoundException; +import java.util.Scanner; + import javax.sound.midi.MidiUnavailableException; import net.persei.dionysus.commands.Command; +import net.persei.dionysus.commands.DelayCommand; +import net.persei.dionysus.commands.MultiCommand; +import net.persei.dionysus.commands.MusicCommand; +import net.persei.dionysus.commands.MusicCommandType; import net.persei.dionysus.commands.MusicPlayCommand; +import net.persei.dionysus.commands.ProvokeCommand; import net.persei.dionysus.commands.ResetContextCommand; import net.persei.dionysus.commands.SetContextCommand; +import net.persei.dionysus.commands.SoundFXComanndType; +import net.persei.dionysus.commands.SoundFXCommand; +import net.persei.dionysus.commands.VideoCommand; +import net.persei.dionysus.commands.VideoCommandType; import net.persei.dionysus.commands.VideoPlayCommand; import net.persei.dionysus.events.Event; import net.persei.dionysus.exceptions.LibrariesNotFoundException; @@ -16,6 +28,7 @@ import net.persei.dionysus.managers.MidiSource; import net.persei.dionysus.managers.MusicManager; import net.persei.dionysus.managers.PlayerManager; import net.persei.dionysus.managers.Sequence; +import net.persei.dionysus.managers.SoundFXManager; import net.persei.dionysus.managers.VideoManager; import net.persei.dionysus.players.PlayerType; import uk.co.caprica.vlcj.binding.LibVlc; @@ -24,34 +37,52 @@ import uk.co.caprica.vlcj.discovery.NativeDiscovery; public class Main { public static final String TITLE = "Dionysus"; + private static VideoManager videoManager; + private static CommandManager commandManager; + private static MidiManager midiManager; + private static Sequence contextSequence; + private static Context musicContext; + private static Context fxContext; + private static Context videoContext; + private static Context sceneContext; + private static MusicManager musicManager; + private static Context fightContext; + private static SoundFXManager soundManager; + public static boolean test = false; + private static Scanner scanner; public static void main(String[] args) - throws LibrariesNotFoundException, MidiUnavailableException, InterruptedException { + throws LibrariesNotFoundException, MidiUnavailableException, InterruptedException, FileNotFoundException { if (!findLibs()) throw new LibrariesNotFoundException(); System.out.println(LibVlc.INSTANCE.libvlc_get_version()); System.out.println("Instancing video manager..."); - VideoManager videoManager = new VideoManager("MainVideoManager"); + videoManager = new VideoManager("MainVideoManager"); PlayerManager.getInstance().create(PlayerType.Video, "primary", true); - + PlayerManager.getInstance().create(PlayerType.Video, "secondary", true); + System.out.println("Instancing music manager..."); - MusicManager musicManager = new MusicManager("MainMusicManager"); - + musicManager = new MusicManager("MainMusicManager"); + + System.out.println("Instancing sound fx manager..."); + soundManager = new SoundFXManager("MainSoundFXManager"); + System.out.println("Instancing command manager..."); - CommandManager commandManager = new CommandManager(); + commandManager = new CommandManager(); System.out.println("Instancing midi manager..."); - MidiManager midiManager = new MidiManager(commandManager); - + midiManager = new MidiManager(commandManager); + System.out.println("Adding commands..."); - Sequence contextSequence = new Sequence().append(new Event(MidiSource.LAUNCHPAD, true, 0, 8, 7, 0)); + contextSequence = new Sequence().append(new Event(MidiSource.LAUNCHPAD, true, 0, 8, 7, 0)); Sequence resetContext = new Sequence().append(new Event(MidiSource.LAUNCHPAD, true, 0, 8, 6, 0)); - Context musicContext = new Context().append(new Event(MidiSource.LAUNCHPAD, true, 0, 8, 0, 0)); - Context fxContext = new Context().append(new Event(MidiSource.LAUNCHPAD, true, 0, 8, 1, 0)); - Context videoContext = new Context().append(new Event(MidiSource.LAUNCHPAD, true, 0, 8, 2, 0)); - Context unusedContext = new Context().append(new Event(MidiSource.LAUNCHPAD, true, 0, 8, 3, 0)); + musicContext = new Context().append(new Event(MidiSource.LAUNCHPAD, true, 0, 8, 0, 0)); + fxContext = new Context().append(new Event(MidiSource.LAUNCHPAD, true, 0, 8, 1, 0)); + videoContext = new Context().append(new Event(MidiSource.LAUNCHPAD, true, 0, 8, 2, 0)); + sceneContext = new Context().append(new Event(MidiSource.LAUNCHPAD, true, 0, 8, 3, 0)); + fightContext = new Context().append(new Event(MidiSource.LAUNCHPAD, true, 0, 8, 4, 0)); commandManager.addCommand(resetContext, new ResetContextCommand("ResetContext", commandManager)); @@ -61,30 +92,543 @@ public class Main { new SetContextCommand("FXContext", commandManager, fxContext)); commandManager.addCommand(new Sequence(contextSequence).append(videoContext), new SetContextCommand("VideoContext", commandManager, videoContext)); - commandManager.addCommand(new Sequence(contextSequence).append(unusedContext), - new SetContextCommand("UnusedContext", commandManager, unusedContext)); + commandManager.addCommand(new Sequence(contextSequence).append(sceneContext), + new SetContextCommand("SceneContext", commandManager, sceneContext)); + commandManager.addCommand(new Sequence(contextSequence).append(fightContext), + new SetContextCommand("FightContext", commandManager, fightContext)); - commandManager.addCommand(new Sequence(musicContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 7, 0)), - new MusicPlayCommand("Play_Merlins's_Study", musicManager, - "resources/audio/camelot/Merlin's Study.mp3")); + commandManager.addCommand(new Sequence().append(new Event(MidiSource.LAUNCHPAD, true, 0, 8, 5, 0)), + new MultiCommand("kill-everybody", + new MusicCommand("stop-music", musicManager, MusicCommandType.stop, null, 0, false), + new SoundFXCommand("stop-sound", soundManager, SoundFXComanndType.stop, null), + new VideoCommand("stop-video-primary", VideoCommandType.stop, videoManager, "primary", null, + false), + new VideoCommand("stop-video-secondary", VideoCommandType.stop, videoManager, "secondary", null, + false))); + + // Real Commands + /* + * ******************************************** NATURE + * ******************************************** + */ + + Context natureContext = new Context(sceneContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 0, 0)); + commandManager.addCommand(new Sequence(contextSequence).append(natureContext), + new SetContextCommand("NutureSceneContext", commandManager, natureContext)); + + /* + * FOREST + */ + + Sequence forestNoWaterSequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 1, 0)); + commandManager.addCommand(forestNoWaterSequence, basicScene("forest", "forest.mp4", "environment/peace.mp3")); + + Sequence forestWaterSequenceNoRain = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 1, 0)); + commandManager.addCommand(forestWaterSequenceNoRain, + basicScene("forestWater2", "water2.mp4", "environment/peace2.mp3")); + + Sequence forestWaterSequenceNoRain2 = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 1, 0)); + commandManager.addCommand(forestWaterSequenceNoRain2, + basicScene("forestWater", "water.mp4", "environment/quiet.mp3")); + + Sequence forestWaterSequenceRain = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 3, 1, 0)); + commandManager.addCommand(forestWaterSequenceRain, + basicScene("forestRain", "lake-storm.mp4", "environment/scene-specific/elves-woods.mp3")); + + Sequence forestNoWaterChaseSequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 4, 1, 0)); + commandManager.addCommand(forestNoWaterChaseSequence, + basicScene("forestChase", "forest.mp4", "environment/chase.mp3")); + + Sequence forestNoWaterChase2Sequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 5, 1, 0)); + commandManager.addCommand(forestNoWaterChase2Sequence, + basicScene("forestChase2", "forest.mp4", "environment/scene-specific/running-woods.mp3")); + + Sequence forestWater2Sequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 6, 1, 0)); + commandManager.addCommand(forestWater2Sequence, + basicScene("forestWater2", "river.mp4", "environment/scene-specific/river.mp3")); + + Sequence forestWater3Sequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 7, 1, 0)); + commandManager.addCommand(forestWater3Sequence, + basicScene("forestWater3", "forest2.mp4", "environment/beginning.mp3")); + + // TODO forest night + + Sequence forestNightSequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 2, 0)); + commandManager.addCommand(forestNightSequence, + basicScene("forestNight1", "forest-night.mp4", "environment/night.mp3")); + + Sequence forestNight2Sequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 2, 0)); + commandManager.addCommand(forestNight2Sequence, + basicScene("forestNight2", "forest-night.mp4", "environment/mystic.mp3")); + + Sequence forestNight3Sequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 2, 0)); + commandManager.addCommand(forestNight3Sequence, + basicScene("forestNight3", "forest-night.mp4", "environment/something-walk.mp3")); + + /* + * FIELD + */ + + Sequence fieldSunSequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 3, 0)); + commandManager.addCommand(fieldSunSequence, basicScene("field", "field.mp4", "environment/land.mp3")); + + Sequence fieldNoSunSequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 3, 0)); + commandManager.addCommand(fieldNoSunSequence, basicScene("fieldNoSun", "field2.mp4", "environment/joyful.mp3")); + + Sequence fieldSun2Sequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 3, 0)); + commandManager.addCommand(fieldSun2Sequence, basicScene("field2", "field.mp4", "environment/life.mp3")); + + Sequence fieldNoSun3Sequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 3, 3, 0)); + commandManager.addCommand(fieldNoSun3Sequence, + basicScene("fieldNoSun3", "field2.mp4", "environment/evening.ogg")); + + Sequence fieldSun3Sequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 4, 3, 0)); + commandManager.addCommand(fieldSun3Sequence, basicScene("fieldNoSun", "field.mp4", "environment/journey.mp3")); + + /* + * MOUNTAIN + */ + + Sequence mountainSeaSequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 4, 0)); + commandManager.addCommand(mountainSeaSequence, + basicScene("mountains", "mountains.mp4", "environment/equinox.mp3")); + + Sequence mountainSnowSequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 4, 0)); + commandManager.addCommand(mountainSnowSequence, basicScene("snow", "snow-storm.mp4", "environment/now.mp3")); + + Sequence mountainSea2Sequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 4, 0)); + commandManager.addCommand(mountainSea2Sequence, + basicScene("mountains", "mountains.mp4", "environment/glory.mp3")); + + Sequence mountainSnow2Sequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 3, 4, 0)); + commandManager.addCommand(mountainSnow2Sequence, + basicScene("snow", "snow-storm.mp4", "environment/dynamic.mp3")); + + /* + * DESERT + */ + + Sequence dessertSequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 5, 0)); + commandManager.addCommand(dessertSequence, + basicScene("dessert", "dessert3.mp4", "environment/scene-specific/dessert.mp3")); + + Sequence dessert2Sequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 5, 0)); + commandManager.addCommand(dessert2Sequence, + basicScene("dessert2", "dessert.mp4", "environment/wind-journey.mp3")); + + Sequence dessert3Sequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 5, 0)); + commandManager.addCommand(dessert3Sequence, basicScene("dessert3", "dessert2.mp4", "environment/try.mp3")); + + /* + * OCEAN + */ + + Sequence oceanSequence = new Sequence(natureContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 6, 0)); + commandManager.addCommand(oceanSequence, basicScene("ocean", "ocean2.mp4", "environment/ocean.mp3")); + + Sequence ocean2Sequence = new Sequence(natureContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 6, 0)); + commandManager.addCommand(ocean2Sequence, basicScene("ocean2", "ocean.mp4", "environment/quiet.mp3")); + + /* + * NIGHT + */ + + Sequence nightSequence = new Sequence(natureContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 7, 0)); + commandManager.addCommand(nightSequence, basicScene("night", "night.mp4", "environment/night.mp3")); + + Sequence night2Sequence = new Sequence(natureContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 7, 0)); + commandManager.addCommand(night2Sequence, basicScene("night2", "night.mp4", "environment/mystic2.mp3")); + + Sequence nightmareSequence = new Sequence(natureContext) + .append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 7, 0)); + commandManager.addCommand(nightmareSequence, basicScene("nightmare", "night.mp4", "environment/nightmare.mp3")); + + /* + * GARDEN + */ + Sequence gardenSequence = new Sequence(natureContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 7, 7, 0)); + commandManager.addCommand(gardenSequence, basicScene("garden", "garden.mp4", "environment/friendly.mp3")); + + /* + * ******************************************** CITIES + * ******************************************** + */ + + Context cityContext = new Context(sceneContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 0, 0)); + commandManager.addCommand(new Sequence(contextSequence).append(cityContext), + new SetContextCommand("CitySceneContext", commandManager, cityContext)); + + Sequence elmaratu = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 6, 1, 0)); + commandManager.addCommand(elmaratu, + basicScene("elmaratu", "images/city/elmaratu.jpg", "environment/city-specific/elmaratu.mp3")); + + Sequence silvas = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 5, 1, 0)); + commandManager.addCommand(silvas, + basicScene("silvas", "images/city/silvas.jpg", "environment/city-specific/silvas.mp3")); + + Sequence feras = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 4, 1, 0)); + commandManager.addCommand(feras, + basicScene("feras", "images/city/feras.jpg", "environment/city-specific/feras.mp3")); + + Sequence finas = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 3, 2, 0)); + commandManager.addCommand(finas, + basicScene("finas", "images/city/finas.jpg", "environment/city-specific/finas.ogg")); + + Sequence novis = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 2, 0)); + commandManager.addCommand(novis, + basicScene("novis", "images/city/novis.jpg", "environment/city-specific/novis.mp3")); + + Sequence arata = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 3, 0)); + commandManager.addCommand(arata, + basicScene("arata", "images/city/arata.jpg", "environment/city-specific/arata.ogg")); + + Sequence mariat = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 3, 0)); + commandManager.addCommand(mariat, + basicScene("mariat", "images/city/mariat.jpg", "environment/city-specific/mariat2.mp3")); + + Sequence urbas = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 4, 0)); + commandManager.addCommand(urbas, + basicScene("urbas", "images/city/urbas.jpg", "environment/city-specific/urbas.mp3")); + + Sequence flumas = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 5, 0)); + commandManager.addCommand(flumas, + basicScene("flumas", "images/city/flumas.jpg", "environment/city-specific/flumas.ogg")); + + Sequence litera = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 5, 0)); + commandManager.addCommand(litera, + basicScene("litera", "images/city/litera.jpg", "environment/city-specific/litera.ogg")); + + Sequence versura = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 3, 6, 0)); + commandManager.addCommand(versura, + basicScene("versura", "images/city/versura.jpg", "environment/city-specific/versura.mp3")); + + Sequence arem = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 4, 3, 0)); + commandManager.addCommand(arem, + basicScene("arem", "images/city/arem2.jpg", "environment/city-specific/arem.mp3")); + + Sequence pesa = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 4, 4, 0)); + commandManager.addCommand(pesa, + basicScene("pesa", "images/city/pesa.jpg", "environment/city-specific/pesa.ogg")); + + Sequence mansas = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 5, 5, 0)); + commandManager.addCommand(mansas, + basicScene("mansas", "images/city/mansas.jpg", "environment/city-specific/mansas2.ogg")); + + Sequence lamata = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 7, 4, 0)); + commandManager.addCommand(lamata, + basicScene("lamata", "images/city/lamata.jpg", "environment/city-specific/lamata.mp3")); + + Sequence porta = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 6, 6, 0)); + commandManager.addCommand(porta, + basicScene("porta", "images/city/porta.jpg", "environment/city-specific/porta.mp3")); + + Sequence inlua = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 6, 7, 0)); + commandManager.addCommand(inlua, + basicScene("inlua", "images/city/inlua.jpg", "environment/city-specific/inlua.mp3")); + + Sequence medala = new Sequence(cityContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 7, 7, 0)); + commandManager.addCommand(medala, + basicScene("medala", "images/city/medala.jpg", "environment/city-specific/medala.mp3")); + + Context cityContext2 = new Context(sceneContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 0, 0)); + commandManager.addCommand(new Sequence(contextSequence).append(cityContext2), + new SetContextCommand("CitySceneContext2", commandManager, cityContext2)); + + Sequence mansas2 = new Sequence(cityContext2).append(new Event(MidiSource.LAUNCHPAD, true, 0, 5, 5, 0)); + commandManager.addCommand(mansas2, + basicScene("mansas2", "images/city/mansas.jpg", "environment/city-specific/mansas.ogg")); + + Sequence urbas2 = new Sequence(cityContext2).append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 4, 0)); + commandManager.addCommand(urbas2, + basicScene("urbas2", "images/city/urbas.jpg", "environment/city-specific/urbas2.ogg")); + + Sequence flumas2 = new Sequence(cityContext2).append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 5, 0)); + commandManager.addCommand(flumas2, + basicScene("flumas2", "images/city/flumas.jpg", "environment/city-specific/flumas2.mp3")); + + Sequence elmaratu2 = new Sequence(cityContext2).append(new Event(MidiSource.LAUNCHPAD, true, 0, 6, 1, 0)); + commandManager.addCommand(elmaratu2, + basicScene("elmaratu2", "images/city/elmaratu.jpg", "environment/city-specific/elmaratu3.mp3")); + + /* + * CULTURE + */ + + Context cultureContext = new Context(sceneContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 4, 0, 0)); + commandManager.addCommand(new Sequence(contextSequence).append(cultureContext), + new SetContextCommand("CultureSceneContext", commandManager, cultureContext)); + + Sequence church = new Sequence(cultureContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 1, 0)); + commandManager.addCommand(church, + new MultiCommand("church", + new SoundFXCommand("playChurchDoor", soundManager, SoundFXComanndType.play, + "resources/audio/sfx/door4.wav"), + new DelayCommand("delayedChurchSounds", + new SoundFXCommand("playChurchSounds", soundManager, SoundFXComanndType.play, + "resources/audio/sfx/church2.wav"), + 500), + basicScene("churchScene", "images/church.jpg", "gaudete.mp3"))); + + Sequence church2 = new Sequence(cultureContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 2, 0)); + commandManager.addCommand(church2, + new MultiCommand("church2", + new SoundFXCommand("playChurchDoor", soundManager, SoundFXComanndType.play, + "resources/audio/sfx/door4.wav"), + new DelayCommand("delayedChurch2Sounds", + new SoundFXCommand("playChurch2Sounds", soundManager, SoundFXComanndType.play, + "resources/audio/sfx/church2.wav"), + 500), + basicScene("church2Scene", "images/church2.jpg", "shchedryk.mp3"))); + + Sequence castle = new Sequence(cultureContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 4, 1, 0)); + commandManager.addCommand(castle, basicScene("castleScene", "images/castle.jpg", "environment/castle.mp3")); + + Sequence castle2 = new Sequence(cultureContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 4, 2, 0)); + commandManager.addCommand(castle2, basicScene("castleScene", "images/castle.jpg", "environment/king-.ogg")); + + Sequence heaven = new Sequence(cultureContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 7, 0)); + commandManager.addCommand(heaven, basicScene("heavenScene", "images/heaven.jpg", "angels.mp3")); + + /* + * FIREPLACE + */ + Context firePlaceContext = new Context(sceneContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 7, 0, 0)); + commandManager.addCommand(new Sequence(contextSequence).append(firePlaceContext), + new SetContextCommand("FireplaceSceneContext", commandManager, firePlaceContext)); + // TODO + + // TODO + + /* + * FIGHTS + */ + + Sequence before = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 6, 0, 0)); + commandManager.addCommand(before, new MusicPlayCommand("beforeMusic", musicManager, + "resources/audio/environment/fights/before-fight.mp3", 1000, true)); + + Sequence roundBasedIntro = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 7, 0, 0)); + commandManager.addCommand(roundBasedIntro, + new MultiCommand("roundBasedSplitter", + new MusicCommand("stopMusic", musicManager, MusicCommandType.stop, null, 200, false), + new SoundFXCommand("playDrop", soundManager, SoundFXComanndType.play, + "resources/audio/sfx/subfrequ2.wav"))); + + Sequence roundBased1 = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 7, 1, 0)); + commandManager.addCommand(roundBased1, new MusicPlayCommand("round-based", musicManager, + "resources/audio/environment/fights/fight-round-based.mp3", 200)); + + Sequence facing = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 0, 0)); + commandManager.addCommand(facing, + new MultiCommand("facing1", + new MusicPlayCommand("facingMusic", musicManager, + "resources/audio/environment/fights/alive.mp3", 200, false), + new DelayCommand("facing2Delay", + new ProvokeCommand("facing2Command", + new Sequence().append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 1, 0)), + commandManager), + (2 * 60) * 1000))); + + Sequence black = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 1, 0)); + commandManager.addCommand(black, new MusicPlayCommand("blackMusic", musicManager, + "resources/audio/environment/fights/black.mp3", 1000, true)); + + Sequence confrontation = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 0, 0)); + commandManager.addCommand(confrontation, new MusicPlayCommand("confrontationMusic", musicManager, + "resources/audio/environment/fights/confrontation.mp3", 1000, true)); + + Sequence sorrow = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 7, 7, 0)); + commandManager.addCommand(sorrow, new MusicPlayCommand("sorrowMusic", musicManager, + "resources/audio/environment/fights/death-sorrow.ogg", 1000, true)); + + Sequence devil = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 4, 7, 0)); + commandManager.addCommand(devil, new MusicPlayCommand("devilMusic", musicManager, + "resources/audio/environment/fights/devil.mp3", 1000, true)); + + Sequence empire = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 7, 0)); + commandManager.addCommand(empire, new MusicPlayCommand("empireMusic", musicManager, + "resources/audio/environment/fights/empire.mp3", 1000, true)); + + Sequence empire2 = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 6, 0)); + commandManager.addCommand(empire2, new MusicPlayCommand("empire2Music", musicManager, + "resources/audio/environment/fights/empire2.mp3", 1000, true)); + + Sequence first = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 2, 0)); + commandManager.addCommand(first, new MusicPlayCommand("firstMusic", musicManager, + "resources/audio/environment/fights/first.mp3", 1000, true)); + + Sequence fleeing = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 7, 5, 0)); + commandManager.addCommand(fleeing, new MusicPlayCommand("fleeingMusic", musicManager, + "resources/audio/environment/fights/fleeing.mp3", 1000, true)); + + Sequence fun = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 5, 7, 0)); + commandManager.addCommand(fun, new MusicPlayCommand("funMusic", musicManager, + "resources/audio/environment/fights/fun.ogg", 1000, true)); + + Sequence gate = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 1, 0)); + commandManager.addCommand(gate, new MusicPlayCommand("gateMusic", musicManager, + "resources/audio/environment/fights/gate.mp3", 1000, true)); + + Sequence hell = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 4, 6, 0)); + commandManager.addCommand(hell, new MusicPlayCommand("hellMusic", musicManager, + "resources/audio/environment/fights/hell.mp3", 1000, true)); + + Sequence mountains = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 7, 0)); + commandManager.addCommand(mountains, new MusicPlayCommand("mountainsMusic", musicManager, + "resources/audio/environment/fights/mountains-battle.ogg", 1000, true)); + + Sequence power = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 5, 0, 0)); + commandManager.addCommand(power, new MusicPlayCommand("powerMusic", musicManager, + "resources/audio/environment/fights/power.mp3", 1000, true)); + + Sequence redemption = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 7, 0)); + commandManager.addCommand(redemption, new MusicPlayCommand("redemptionMusic", musicManager, + "resources/audio/environment/fights/redemption.mp3", 1000, true)); + + Sequence secondary = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 3, 0)); + commandManager.addCommand(secondary, new MusicPlayCommand("secondaryMusic", musicManager, + "resources/audio/environment/fights/secondary.mp3", 1000, true)); + + Sequence slow = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 0, 0)); + commandManager.addCommand(slow, new MusicPlayCommand("slowMusic", musicManager, + "resources/audio/environment/fights/slow.ogg", 1000, true)); + + Sequence steel = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 2, 0)); + commandManager.addCommand(steel, new MusicPlayCommand("steelMusic", musicManager, + "resources/audio/environment/fights/steel.mp3", 1000, true)); + + Sequence time = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 7, 4, 0)); + commandManager.addCommand(time, new MusicPlayCommand("timeMusic", musicManager, + "resources/audio/environment/fights/time.mp3", 1000, true)); + + Sequence trap = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 6, 4, 0)); + commandManager.addCommand(trap, new MusicPlayCommand("trapMusic", musicManager, + "resources/audio/environment/fights/trap.mp3", 1000, true)); + + Sequence veniVediVeci = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 2, 0)); + commandManager.addCommand(veniVediVeci, new MusicPlayCommand("veniVediVeciMusic", musicManager, + "resources/audio/environment/fights/veni-vedi-veci.mp3", 1000, true)); + + Sequence victory = new Sequence(fightContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 6, 7, 0)); + commandManager.addCommand(victory, new MusicPlayCommand("victoryusic", musicManager, + "resources/audio/environment/fights/victory.mp3", 1000, true)); + + /* + * MUSIC + */ + + Sequence army = new Sequence(musicContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 0, 0)); + commandManager.addCommand(army, + new MusicPlayCommand("armyMusic", musicManager, "resources/audio/environment/army.ogg", 1000, true)); + + Sequence badTruth = new Sequence(musicContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 2, 0)); + commandManager.addCommand(badTruth, new MusicPlayCommand("badTruthMusic", musicManager, + "resources/audio/environment/bad-truth.mp3", 1000, true)); + + Sequence blood = new Sequence(musicContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 0, 0)); + commandManager.addCommand(blood, + new MusicPlayCommand("bloodMusic", musicManager, "resources/audio/environment/blood.mp3", 1000, true)); + + Sequence chance = new Sequence(musicContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 7, 0, 0)); + commandManager.addCommand(chance, new MusicPlayCommand("chanceMusic", musicManager, + "resources/audio/environment/chance.mp3", 1000, true)); + + Sequence change = new Sequence(musicContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 7, 2, 0)); + commandManager.addCommand(change, new MusicPlayCommand("changeMusic", musicManager, + "resources/audio/environment/change.mp3", 1000, true)); + + Sequence chase = new Sequence(musicContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 3, 0)); + commandManager.addCommand(chase, + new MusicPlayCommand("chaseMusic", musicManager, "resources/audio/environment/chase.mp3", 1000, true)); + + Sequence danger = new Sequence(musicContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 1, 1, 0)); + commandManager.addCommand(danger, new MusicPlayCommand("dangerMusic", musicManager, + "resources/audio/environment/danger.ogg", 1000, true)); + + Sequence druidic = new Sequence(musicContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 7, 5, 0)); + commandManager.addCommand(druidic, new MusicPlayCommand("druidicMusic", musicManager, + "resources/audio/environment/druidic.mp3", 1000, true)); + + Sequence dwarfs = new Sequence(musicContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 5, 7, 0)); + commandManager.addCommand(dwarfs, new MusicPlayCommand("dwarfsMusic", musicManager, + "resources/audio/environment/dwarfs.mp3", 1000, true)); + + Sequence dwarfs2 = new Sequence(musicContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 5, 6, 0)); + commandManager.addCommand(dwarfs2, new MusicPlayCommand("dwarfs2Music", musicManager, + "resources/audio/environment/dwarfs2.mp3", 1000, true)); + + Sequence lightDark = new Sequence(musicContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 2, 7, 0)); + commandManager.addCommand(lightDark, new MusicPlayCommand("lightDarkMusic", musicManager, + "resources/audio/environment/light-dark.mp3", 1000, true)); + + Sequence race = new Sequence(musicContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 3, 5, 0)); + commandManager.addCommand(race, + new MusicPlayCommand("raceMusic", musicManager, "resources/audio/environment/race.mp3", 1000, true)); + + Sequence woundedLand = new Sequence(musicContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 7, 7, 0)); + commandManager.addCommand(woundedLand, new MusicPlayCommand("woundedLandMusic", musicManager, + "resources/audio/environment/wounded-land.ogg", 1000, true)); - commandManager.addCommand(new Sequence(videoContext).append(new Event(MidiSource.LAUNCHPAD, true, 0, 0, 6, 0)), - new VideoPlayCommand("Show_Mountains", videoManager, "primary", - "resources/video/mountains.mp4", true)); - System.out.println("Adding shutdown hook..."); Runtime.getRuntime().addShutdownHook(new Thread() { + @Override public void run() { midiManager.close(); + Logger.close(); + scanner.close(); } }); - while (true) - Thread.sleep(Long.MAX_VALUE); + + scanner = new Scanner(System.in); + + while (true) { + if (scanner.nextLine().contains("t")) { + if (test) { + System.out.println("Disabling test mode."); + test = false; + } else { + System.out.println("Enabling test mode."); + test = true; + } + } + } + +// while (true) +// Thread.sleep(Long.MAX_VALUE); } private static boolean findLibs() { return new NativeDiscovery().discover(); } + private static Command basicScene(String scene, String videoFile, String musicFile) throws FileNotFoundException { + Command video = new VideoPlayCommand("show " + scene, videoManager, "primary", "resources/video/" + videoFile, + true); + Command audio = new MusicPlayCommand("play " + scene, musicManager, "resources/audio/" + musicFile, 1000, true); + return new MultiCommand("scene " + scene, video, audio); + } } diff --git a/src/main/java/net/persei/dionysus/commands/DelayCommand.java b/src/main/java/net/persei/dionysus/commands/DelayCommand.java new file mode 100644 index 0000000..207095e --- /dev/null +++ b/src/main/java/net/persei/dionysus/commands/DelayCommand.java @@ -0,0 +1,36 @@ +package net.persei.dionysus.commands; + +public class DelayCommand extends Command { + + private Command command; + private long time; + private String name; + + public DelayCommand(String name, Command command, long time) { + this.command = command; + this.time = time; + this.name = name; + } + + @Override + public void execute() { + new Thread() { + @Override + public void run() { + try { + Thread.sleep(time); + System.out.println(name + ": Executing " + command.getName()); + command.execute(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }.start(); + } + + @Override + public String getName() { + return name; + } + +} diff --git a/src/main/java/net/persei/dionysus/commands/MultiCommand.java b/src/main/java/net/persei/dionysus/commands/MultiCommand.java new file mode 100644 index 0000000..788b111 --- /dev/null +++ b/src/main/java/net/persei/dionysus/commands/MultiCommand.java @@ -0,0 +1,41 @@ +package net.persei.dionysus.commands; + +import java.util.Arrays; +import java.util.List; + +public class MultiCommand extends Command { + private String name; + private List commands; + + public MultiCommand(String name, Command... commands) { + this.name = name; + this.commands = Arrays.asList(commands); + } + + @Override + public void execute() { + for (Command command : commands) { + System.out.println(name + ": Executing " + command.getName()); + command.execute(); + } + } + + @Override + public String getName() { + return name; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) + return false; + if (!obj.getClass().equals(this.getClass())) + return false; + MultiCommand command = (MultiCommand) obj; + if (!command.getName().equals(this.getName())) + return false; + if (!command.commands.equals(commands)) + return false; + return true; + } +} diff --git a/src/main/java/net/persei/dionysus/commands/MusicCommand.java b/src/main/java/net/persei/dionysus/commands/MusicCommand.java index 954420e..e641fa8 100644 --- a/src/main/java/net/persei/dionysus/commands/MusicCommand.java +++ b/src/main/java/net/persei/dionysus/commands/MusicCommand.java @@ -1,5 +1,8 @@ package net.persei.dionysus.commands; +import java.io.File; +import java.io.FileNotFoundException; + import net.persei.dionysus.managers.MusicManager; public class MusicCommand extends Command { @@ -10,11 +13,14 @@ public class MusicCommand extends Command { private long duration; private boolean loop; - public MusicCommand(String name, MusicManager musicManager, MusicCommandType type, String file, long duration, boolean loop) { + public MusicCommand(String name, MusicManager musicManager, MusicCommandType type, String file, long duration, boolean loop) throws FileNotFoundException { this.name = name; this.musicManager = musicManager; this.type = type; this.file = file; + if (file != null) + if (!new File(file).exists()) + throw new FileNotFoundException(file); this.duration = duration; this.loop = loop; } diff --git a/src/main/java/net/persei/dionysus/commands/MusicPlayCommand.java b/src/main/java/net/persei/dionysus/commands/MusicPlayCommand.java index 29bff03..60461fc 100644 --- a/src/main/java/net/persei/dionysus/commands/MusicPlayCommand.java +++ b/src/main/java/net/persei/dionysus/commands/MusicPlayCommand.java @@ -1,18 +1,20 @@ package net.persei.dionysus.commands; +import java.io.FileNotFoundException; + import net.persei.dionysus.managers.MusicManager; public class MusicPlayCommand extends MusicCommand { - public MusicPlayCommand(String name, MusicManager musicManager, String file) { + public MusicPlayCommand(String name, MusicManager musicManager, String file) throws FileNotFoundException { this(name, musicManager, file, 0); } - public MusicPlayCommand(String name, MusicManager musicManager, String file, long duration) { + public MusicPlayCommand(String name, MusicManager musicManager, String file, long duration) throws FileNotFoundException { this(name, musicManager, file, duration, true); } public MusicPlayCommand(String name, MusicManager musicManager, String file, long duration, - boolean loop) { + boolean loop) throws FileNotFoundException { super(name, musicManager, MusicCommandType.play, file, duration, loop); } } diff --git a/src/main/java/net/persei/dionysus/commands/ProvokeCommand.java b/src/main/java/net/persei/dionysus/commands/ProvokeCommand.java new file mode 100644 index 0000000..dd3bd80 --- /dev/null +++ b/src/main/java/net/persei/dionysus/commands/ProvokeCommand.java @@ -0,0 +1,28 @@ +package net.persei.dionysus.commands; + +import net.persei.dionysus.managers.CommandManager; +import net.persei.dionysus.managers.Sequence; + +public class ProvokeCommand extends Command { + + private Sequence sequence; + private String name; + private CommandManager commandManager; + + public ProvokeCommand(String name, Sequence sequence, CommandManager commandManager) { + this.sequence = sequence; + this.name = name; + this.commandManager = commandManager; + } + + @Override + public void execute() { + commandManager.registerSequence(sequence); + } + + @Override + public String getName() { + return name; + } + +} diff --git a/src/main/java/net/persei/dionysus/commands/SoundFXCommand.java b/src/main/java/net/persei/dionysus/commands/SoundFXCommand.java index 7841ee2..6e6e004 100644 --- a/src/main/java/net/persei/dionysus/commands/SoundFXCommand.java +++ b/src/main/java/net/persei/dionysus/commands/SoundFXCommand.java @@ -1,6 +1,5 @@ package net.persei.dionysus.commands; -import net.persei.dionysus.managers.MusicManager; import net.persei.dionysus.managers.SoundFXManager; public class SoundFXCommand extends Command { @@ -9,10 +8,11 @@ public class SoundFXCommand extends Command { private SoundFXManager soundManager; private String file; - public SoundFXCommand(String name, SoundFXManager soundManager, MusicCommandType type, String file) { + public SoundFXCommand(String name, SoundFXManager soundManager, SoundFXComanndType type, String file) { this.name = name; this.soundManager = soundManager; this.file = file; + this.type = type; } public SoundFXCommand(String name) { diff --git a/src/main/java/net/persei/dionysus/commands/VideoCommand.java b/src/main/java/net/persei/dionysus/commands/VideoCommand.java index 6957bcc..a486ad5 100644 --- a/src/main/java/net/persei/dionysus/commands/VideoCommand.java +++ b/src/main/java/net/persei/dionysus/commands/VideoCommand.java @@ -1,5 +1,8 @@ package net.persei.dionysus.commands; +import java.io.File; +import java.io.FileNotFoundException; + import net.persei.dionysus.managers.VideoManager; public class VideoCommand extends Command { @@ -11,10 +14,13 @@ public class VideoCommand extends Command { private boolean loop; public VideoCommand(String name, VideoCommandType type, VideoManager videoManager, String playerName, String file, - boolean loop) { + boolean loop) throws FileNotFoundException { this.name = name; this.type = type; this.videoManager = videoManager; + if (file != null) + if (!new File(file).exists()) + throw new FileNotFoundException(file); this.file = file; this.playerName = playerName; this.loop = loop; diff --git a/src/main/java/net/persei/dionysus/commands/VideoPlayCommand.java b/src/main/java/net/persei/dionysus/commands/VideoPlayCommand.java index 840c99d..51aa6da 100644 --- a/src/main/java/net/persei/dionysus/commands/VideoPlayCommand.java +++ b/src/main/java/net/persei/dionysus/commands/VideoPlayCommand.java @@ -1,10 +1,12 @@ package net.persei.dionysus.commands; +import java.io.FileNotFoundException; + import net.persei.dionysus.managers.VideoManager; public class VideoPlayCommand extends VideoCommand { public VideoPlayCommand(String name, VideoManager videoManager, String playerName, - String file, boolean loop) { + String file, boolean loop) throws FileNotFoundException { super(name, VideoCommandType.play, videoManager, playerName, file, loop); } diff --git a/src/main/java/net/persei/dionysus/managers/Command.java b/src/main/java/net/persei/dionysus/managers/Command.java deleted file mode 100644 index b0d5590..0000000 --- a/src/main/java/net/persei/dionysus/managers/Command.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.persei.dionysus.managers; - -public interface Command { - void execute(); - String getName(); -} diff --git a/src/main/java/net/persei/dionysus/managers/CommandManager.java b/src/main/java/net/persei/dionysus/managers/CommandManager.java index 4cb7d76..4336db7 100644 --- a/src/main/java/net/persei/dionysus/managers/CommandManager.java +++ b/src/main/java/net/persei/dionysus/managers/CommandManager.java @@ -3,6 +3,7 @@ package net.persei.dionysus.managers; import java.util.LinkedList; import java.util.List; +import net.persei.dionysus.Main; import net.persei.dionysus.commands.Command; import net.persei.dionysus.events.Event; @@ -54,6 +55,20 @@ public class CommandManager { static public long maxInterval = 1 * 1000; + public boolean registerSequence(Sequence sequence) { + checkTimeout(); + this.sequence.addAll(sequence); + lastChange = System.currentTimeMillis(); + return checkForCommand(); + } + + private void checkTimeout() { + if (System.currentTimeMillis() - lastChange > maxInterval) { + this.sequence = new Sequence(context); + executedCommands = new LinkedList<>(); + } + } + public boolean registerEvent(Event event) { if (System.currentTimeMillis() - lastChange > maxInterval) { sequence = new Sequence(context); @@ -77,7 +92,8 @@ public class CommandManager { if (executedCommands.contains(ct)) continue; System.out.println("Executing " + ct.command.getName() + "..."); - ct.command.execute(); + if (!Main.test) + ct.command.execute(); executedCommands.add(ct); result = true; } @@ -91,6 +107,38 @@ public class CommandManager { public void addCommand(Sequence sequence, Command command) { System.out.println("Adding command " + command.getName() + " on " + sequence); + if (containsSequence(sequence)) { + System.err.println("#########\nDuplicated sequence!\n#########"); + return; + } commands.add(new CommandTuple(sequence, command)); } + + private boolean containsSequence(Sequence sequence) { + for (CommandTuple tuple : commands) { + if (tuple.sequence.equals(sequence)) + return true; + } + return false; + } + + public List getEventsOfCommandsInSequence() { + checkTimeout(); + List events = new LinkedList(); + for (CommandTuple tuple : commands) { + int miss = 0; + Event missedEvent = null; + for (Event event : tuple.sequence) { + if (sequence.contains(event)) + continue; + if (++miss > 1) + break; + missedEvent = event; + } + if (miss != 1) + continue; + events.add(missedEvent); + } + return events; + } } diff --git a/src/main/java/net/persei/dionysus/managers/Context.java b/src/main/java/net/persei/dionysus/managers/Context.java index ab798f7..821a18b 100644 --- a/src/main/java/net/persei/dionysus/managers/Context.java +++ b/src/main/java/net/persei/dionysus/managers/Context.java @@ -3,6 +3,13 @@ package net.persei.dionysus.managers; import net.persei.dionysus.events.Event; public class Context extends Sequence { + public Context(Context context) { + super(); + addAll(context); + } + public Context() { + super(); + } public Context append(Event event) { add(event); return this; diff --git a/src/main/java/net/persei/dionysus/managers/Event.java b/src/main/java/net/persei/dionysus/managers/Event.java deleted file mode 100644 index a9beb3c..0000000 --- a/src/main/java/net/persei/dionysus/managers/Event.java +++ /dev/null @@ -1,55 +0,0 @@ -package net.persei.dionysus.managers; - -public class Event { - static private boolean velocitySensitive = false; - - private MidiSource source; - private boolean press; - private int channel; - private int x; - private int y; - private int v; - - public Event(MidiSource source, boolean press, int channel, int x, int y, int v) { - this.source = source; - this.press = press; - this.channel = channel; - this.x = x; - this.y = y; - this.v = v; - } - - public static boolean isVelocitySensitive() { - return velocitySensitive; - } - - public static void setVelocitySensitive(boolean velocitySensitive) { - Event.velocitySensitive = velocitySensitive; - } - - public boolean equals(Object obj) { - if (obj == null) - return false; - if (!(obj instanceof Event)) - return false; - Event event = (Event) obj; - if (event.source != source) - return false; - if (event.press != press) - return false; - if (event.channel != channel) - return false; - if (event.x != x) - return false; - if (event.y != y) - return false; - if (velocitySensitive) - if (event.v != v) - return false; - return true; - } - - public String toString() { - return (press ? "press" : "release") + " on " + source + " x:" + x + ", y:" + y + ", v:" + v; - } -} \ No newline at end of file diff --git a/src/main/java/net/persei/dionysus/managers/MidiManager.java b/src/main/java/net/persei/dionysus/managers/MidiManager.java index 69041fd..5dc76a9 100644 --- a/src/main/java/net/persei/dionysus/managers/MidiManager.java +++ b/src/main/java/net/persei/dionysus/managers/MidiManager.java @@ -15,6 +15,7 @@ import javax.sound.midi.MidiDevice; import javax.sound.midi.MidiMessage; import javax.sound.midi.MidiDevice.Info; +import net.persei.dionysus.commands.Command; import net.persei.dionysus.events.Event; public class MidiManager { @@ -28,6 +29,8 @@ public class MidiManager { System.out.println("Searching for midi devices..."); for (Info info : infos) { + if (info.getName().contains("[default]")) + continue; MidiDevice device = MidiSystem.getMidiDevice(info); if (info.getName().contains("MPD18")) { System.out.println("Found MPD18: " + info.getName()); @@ -110,8 +113,10 @@ public class MidiManager { } private void handle(boolean press, MidiSource source, int channel, int x, int y, int v) { - System.out.println(press + " on " + source + ": " + x + ", " + y + " - " + v); - commandManager.registerEvent(new Event(source, press, channel, x, y, v)); +// System.out.println(press + " on " + source + ": " + x + ", " + y + " - " + v); + if (commandManager.registerEvent(new Event(source, press, channel, x, y, v))) { +// System.out.println("no command on " + source + ": " + x + ", " + y + " - " + v); + } } public void feedbackSequence() { @@ -138,29 +143,63 @@ public class MidiManager { return; } new Thread() { + @Override public void run() { try { while (true) { List events = new Sequence(commandManager.getSequence()); List context = commandManager.getContext(); + List available = commandManager.getEventsOfCommandsInSequence(); + for (Event event : context) { if (events.contains(event)) events.remove(event); } - + + for (Event event : available) { + if (events.contains(event)) + events.remove(event); + } + int intensity = 0x03 - (int) ((3.0 * (System.currentTimeMillis() - commandManager.getLastChange()) / CommandManager.maxInterval)); - clearLaunchpad(launchpad); - for (Event event : context) { - setLaunchpad(launchpad, event.getX(), event.getY(), 0x00, 0x03); - } - if (intensity > 0) { - for (Event event : events) { - setLaunchpad(launchpad, event.getX(), event.getY(), intensity, 0x00); + for (int x = 0; x < 9; x++) { + for (int y = 0; y < 8; y++) { + if (coordinateIsInEventList(context, x, y)) + setLaunchpad(launchpad, x, y, 0x00, 0x03); + else if (intensity > 0 && coordinateIsInEventList(events, x, y)) + setLaunchpad(launchpad, x, y, intensity, 0x00); + else if (coordinateIsInEventList(available, x, y)) + setLaunchpad(launchpad, x, y, 0x01, 0x01); + else + setLaunchpad(launchpad, x, y, 0, 0); } } + + +// clearLaunchpad(launchpad); +// +// for (Event event : context) { +// if (event.getSource() != MidiSource.LAUNCHPAD) +// continue; +// setLaunchpad(launchpad, event.getX(), event.getY(), 0x00, 0x03); +// } +// +// for (Event event : available) { +// if (event.getSource() != MidiSource.LAUNCHPAD) +// continue; +// setLaunchpad(launchpad, event.getX(), event.getY(), 0x01, 0x01); +// } +// +// if (intensity > 0) { +// for (Event event : events) { +// if (event.getSource() != MidiSource.LAUNCHPAD) +// continue; +// setLaunchpad(launchpad, event.getX(), event.getY(), intensity, 0x00); +// } +// } Thread.sleep(100); } } catch (InterruptedException e) { @@ -190,4 +229,14 @@ public class MidiManager { e.printStackTrace(); } } + + private boolean coordinateIsInEventList(List events, int x, int y) { + for (Event event : events) { + if (event.getSource() != MidiSource.LAUNCHPAD) + continue; + if (event.getX() == x && event.getY() == y) + return true; + } + return false; + } } \ No newline at end of file diff --git a/src/main/java/net/persei/dionysus/managers/MusicManager.java b/src/main/java/net/persei/dionysus/managers/MusicManager.java index a559fdb..20874f5 100644 --- a/src/main/java/net/persei/dionysus/managers/MusicManager.java +++ b/src/main/java/net/persei/dionysus/managers/MusicManager.java @@ -1,5 +1,7 @@ package net.persei.dionysus.managers; +import java.io.File; + import net.persei.dionysus.players.AudioPlayer; import net.persei.dionysus.players.PlayerType; import uk.co.caprica.vlcj.player.MediaPlayer; @@ -26,13 +28,18 @@ public class MusicManager { public void change(String file, long fadeduration, boolean loop) { if (!isPlaying[0]) { // use 0 + System.out.println("Using crossfade player 0."); stopPlayer(1, fadeduration); startPlayer(0, file, fadeduration, loop); + System.out.println("Done."); } else if (!isPlaying[1]) { - // use 2 + // use 1 + System.out.println("Using crossfade player 1."); stopPlayer(0, fadeduration); startPlayer(1, file, fadeduration, loop); + System.out.println("Done."); } else { + System.err.println("No player applicable for " + file + "."); // no player is applicable } } @@ -53,26 +60,36 @@ public class MusicManager { public void run() { setPlaying(playerId, true); MediaPlayer player = crossfadePlayers[playerId].getMediaPlayer(); - + crossfadePlayers[playerId].playFile(file); crossfadePlayers[playerId].setLoop(loop); - if (fadeduration == 0) { - player.setVolume(BASE_VOLUME); - return; - } - player.setVolume(0); - - int targetVolume = BASE_VOLUME; - int sourceVolume = 0; - int stepsPerSecond = 10; - int numberOfSteps = (int) ((fadeduration * stepsPerSecond) / 1000); - int msPerStep = (int) (fadeduration / numberOfSteps); - int incrementPerStep = (sourceVolume - targetVolume) / numberOfSteps; try { + + if (fadeduration < 0.1) { + player.setVolume(BASE_VOLUME); + return; + } + + Thread.sleep(50); + player.setVolume(0); + Thread.sleep(50); + + int targetVolume = BASE_VOLUME; + int sourceVolume = player.getVolume(); + int stepsPerSecond = 20; + int numberOfSteps = (int) ((fadeduration * stepsPerSecond) / 1000); + int msPerStep = (int) (fadeduration / numberOfSteps); + int incrementPerStep = -(sourceVolume - targetVolume) / numberOfSteps; + +// System.out.println(targetVolume + ", " + sourceVolume + ", " + stepsPerSecond + ", " + numberOfSteps +// + ", " + msPerStep + ", " + incrementPerStep); + for (int i = 0; i < numberOfSteps; i++) { - player.setVolume(player.getVolume() + incrementPerStep); Thread.sleep(msPerStep); + int val = player.getVolume() + incrementPerStep; +// System.out.println(val); + player.setVolume(val); } } catch (InterruptedException e) { e.printStackTrace(); @@ -88,8 +105,15 @@ public class MusicManager { private void stopPlayer(int playerId, long fadeduration) { new Thread() { public void run() { - if (!crossfadePlayers[playerId].isPlaying()) + if (!crossfadePlayers[playerId].isPlaying()) { + setPlaying(playerId, false); return; + } + if (fadeduration < 0.1) { + crossfadePlayers[playerId].stop(); + setPlaying(playerId, false); + return; + } MediaPlayer player = crossfadePlayers[playerId].getMediaPlayer(); int targetVolume = 0; int sourceVolume = player.getVolume(); diff --git a/src/main/java/net/persei/dionysus/managers/SoundFXManager.java b/src/main/java/net/persei/dionysus/managers/SoundFXManager.java index 3175d57..2401896 100644 --- a/src/main/java/net/persei/dionysus/managers/SoundFXManager.java +++ b/src/main/java/net/persei/dionysus/managers/SoundFXManager.java @@ -18,12 +18,14 @@ public class SoundFXManager { for (AudioPlayer player : players) { if (player.isPlaying()) continue; + player.getMediaPlayer().setVolume(100); player.playFile(file); return; } AudioPlayer player = (AudioPlayer) PlayerManager.getInstance().create(PlayerType.Audio, "FXPlayer_" + name + "_" + players.size()); players.add(player); + player.getMediaPlayer().setVolume(100); player.playFile(file); } diff --git a/src/main/java/net/persei/dionysus/managers/VideoManager.java b/src/main/java/net/persei/dionysus/managers/VideoManager.java index eff310c..478caf0 100644 --- a/src/main/java/net/persei/dionysus/managers/VideoManager.java +++ b/src/main/java/net/persei/dionysus/managers/VideoManager.java @@ -21,6 +21,7 @@ public class VideoManager { public void play(String name, String file, boolean loop) { getVideoPlayer(name).playFile(file); getVideoPlayer(name).setLoop(loop); + getVideoPlayer(name).getMediaPlayer().setVolume(70); } public void play(String name) { diff --git a/src/main/java/net/persei/dionysus/players/AudioPlayer.java b/src/main/java/net/persei/dionysus/players/AudioPlayer.java index d96d9d3..cf2ef8c 100644 --- a/src/main/java/net/persei/dionysus/players/AudioPlayer.java +++ b/src/main/java/net/persei/dionysus/players/AudioPlayer.java @@ -1,5 +1,6 @@ package net.persei.dionysus.players; +import net.persei.dionysus.Logger; import uk.co.caprica.vlcj.component.AudioMediaPlayerComponent; import uk.co.caprica.vlcj.player.MediaPlayer; @@ -19,6 +20,7 @@ public class AudioPlayer implements Player { } public void playFile(String file) { + Logger.logMusic(file); getMediaPlayer().playMedia(file); } diff --git a/src/main/java/net/persei/dionysus/players/VideoPlayer.java b/src/main/java/net/persei/dionysus/players/VideoPlayer.java index 621f9e0..47451b2 100644 --- a/src/main/java/net/persei/dionysus/players/VideoPlayer.java +++ b/src/main/java/net/persei/dionysus/players/VideoPlayer.java @@ -38,7 +38,7 @@ public class VideoPlayer extends JFrame implements Player { setVisible(true); } public VideoPlayer(String name) throws HeadlessException { - super(Main.TITLE); + super(Main.TITLE + " - " + name); this.name = name; setBounds(100, 100, 600, 400);