From e5ca3324a242c5055d8be2015b1e4fe3700d931f Mon Sep 17 00:00:00 2001
From: tobias <tobias.ullerich@icloud.com>
Date: Tue, 13 Sep 2016 09:20:33 +0200
Subject: [PATCH] Start on color mode

---
 .../playpad/action/mapper/MidiMapper.java     |   4 +-
 .../design/modern/ModernCartDesign.java       |  17 ++--
 .../design/modern/ModernGlobalDesign.java     |  13 ++-
 .../desktop/DesktopColorPickerView.java       |  42 +++++++++
 .../desktop/DesktopMainLayoutConnect.java     |  13 ++-
 .../DesktopMenuToolbarViewController.java     |  69 ++++++++++----
 .../{ => pad}/DesktopPadDragListener.java     |   4 +-
 .../desktop/{ => pad}/DesktopPadView.java     |   3 +-
 .../{ => pad}/DesktopPadViewController.java   |  39 ++++----
 .../{ColorView.java => ColorPickerView.java}  |  16 +++-
 .../ModernCartDesignViewController.java       |   4 +-
 .../ModernGlobalDesignViewController.java     |   4 +-
 .../main/MainViewController.java              |   2 +-
 .../DoubleFeedbackViewController.java         |   4 +-
 .../SingleFeedbackViewController.java         |   4 +-
 .../action/feedback/ColorAdjustable.java      |  21 ++++-
 .../action/feedback/ColorAdjuster.java        |   8 +-
 .../action/feedback/ColorAssociator.java      |  38 +++++++-
 .../playpad/design/DesignColorAssociator.java |  17 ++++
 .../playpad/design/IColorPickerView.java      |  18 ++++
 .../NativeAudio$NativeAudioDelegate.class     | Bin 0 -> 322 bytes
 .../bin/de/tobias/playpad/NativeAudio.class   | Bin 0 -> 1321 bytes
 .../playpad/NativeAudioMacHandler.class       | Bin 0 -> 5572 bytes
 .../NativeAudioMacHandlerConnect.class        | Bin 0 -> 3366 bytes
 .../de/tobias/playpad/NativeAudioTest.class   | Bin 0 -> 1146 bytes
 .../bin/de_tobias_playpad_NativeAudio.h       |  85 ++++++++++++++++++
 26 files changed, 357 insertions(+), 68 deletions(-)
 create mode 100644 PlayWall/src/de/tobias/playpad/layout/desktop/DesktopColorPickerView.java
 rename PlayWall/src/de/tobias/playpad/layout/desktop/{ => pad}/DesktopPadDragListener.java (97%)
 rename PlayWall/src/de/tobias/playpad/layout/desktop/{ => pad}/DesktopPadView.java (99%)
 rename PlayWall/src/de/tobias/playpad/layout/desktop/{ => pad}/DesktopPadViewController.java (94%)
 rename PlayWall/src/de/tobias/playpad/view/{ColorView.java => ColorPickerView.java} (65%)
 create mode 100644 PlayWallCore/src/de/tobias/playpad/design/IColorPickerView.java
 create mode 100644 PlayWallNative/bin/de/tobias/playpad/NativeAudio$NativeAudioDelegate.class
 create mode 100644 PlayWallNative/bin/de/tobias/playpad/NativeAudio.class
 create mode 100644 PlayWallNative/bin/de/tobias/playpad/NativeAudioMacHandler.class
 create mode 100644 PlayWallNative/bin/de/tobias/playpad/NativeAudioMacHandlerConnect.class
 create mode 100644 PlayWallNative/bin/de/tobias/playpad/NativeAudioTest.class
 create mode 100644 PlayWallNative/bin/de_tobias_playpad_NativeAudio.h

diff --git a/PlayWall/src/de/tobias/playpad/action/mapper/MidiMapper.java b/PlayWall/src/de/tobias/playpad/action/mapper/MidiMapper.java
index f6f60e39..f4073ed5 100644
--- a/PlayWall/src/de/tobias/playpad/action/mapper/MidiMapper.java
+++ b/PlayWall/src/de/tobias/playpad/action/mapper/MidiMapper.java
@@ -104,9 +104,9 @@ public class MidiMapper extends Mapper implements ColorAssociator, MapperFeedbac
 	}
 
 	@Override
-	public void setColor(FeedbackMessage feedbackMessage, int value) {
+	public void setColor(FeedbackMessage feedbackMessage, DisplayableFeedbackColor color) {
 		if (feedbackMessage == FeedbackMessage.STANDARD || feedbackMessage == FeedbackMessage.EVENT) {
-			feedback.setFeedback(feedbackMessage, value);
+			feedback.setFeedback(feedbackMessage, color.mapperFeedbackValue());
 		} else {
 			throw new IllegalArgumentException("Unexpected Message Type.");
 		}
diff --git a/PlayWall/src/de/tobias/playpad/design/modern/ModernCartDesign.java b/PlayWall/src/de/tobias/playpad/design/modern/ModernCartDesign.java
index 86fde080..1e7a2880 100644
--- a/PlayWall/src/de/tobias/playpad/design/modern/ModernCartDesign.java
+++ b/PlayWall/src/de/tobias/playpad/design/modern/ModernCartDesign.java
@@ -166,6 +166,15 @@ public class ModernCartDesign extends Design implements CartDesign, DesignColorA
 		endStyleClass(builder);
 	}
 
+	@Override
+	public void copyGlobalLayout(GlobalDesign globalLayout) {
+		if (globalLayout instanceof ModernGlobalDesign) {
+			ModernGlobalDesign modernLayoutGlobal = (ModernGlobalDesign) globalLayout;
+			backgroundColor = modernLayoutGlobal.getBackgroundColor();
+			playColor = modernLayoutGlobal.getPlayColor();
+		}
+	}
+
 	// Color Associator
 	@Override
 	public Color getAssociatedEventColor() {
@@ -177,12 +186,4 @@ public class ModernCartDesign extends Design implements CartDesign, DesignColorA
 		return Color.web(backgroundColor.getColorHi());
 	}
 
-	@Override
-	public void copyGlobalLayout(GlobalDesign globalLayout) {
-		if (globalLayout instanceof ModernGlobalDesign) {
-			ModernGlobalDesign modernLayoutGlobal = (ModernGlobalDesign) globalLayout;
-			backgroundColor = modernLayoutGlobal.getBackgroundColor();
-			playColor = modernLayoutGlobal.getPlayColor();
-		}
-	}
 }
diff --git a/PlayWall/src/de/tobias/playpad/design/modern/ModernGlobalDesign.java b/PlayWall/src/de/tobias/playpad/design/modern/ModernGlobalDesign.java
index 08f9fa17..7d2b6c00 100644
--- a/PlayWall/src/de/tobias/playpad/design/modern/ModernGlobalDesign.java
+++ b/PlayWall/src/de/tobias/playpad/design/modern/ModernGlobalDesign.java
@@ -3,15 +3,18 @@ package de.tobias.playpad.design.modern;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.function.Consumer;
 
 import org.dom4j.Element;
 
+import de.tobias.playpad.DisplayableColor;
 import de.tobias.playpad.PseudoClasses;
 import de.tobias.playpad.design.CartDesign;
 import de.tobias.playpad.design.Design;
 import de.tobias.playpad.design.DesignColorAssociator;
 import de.tobias.playpad.design.FadeableColor;
 import de.tobias.playpad.design.GlobalDesign;
+import de.tobias.playpad.design.IColorPickerView;
 import de.tobias.playpad.pad.Pad;
 import de.tobias.playpad.pad.PadSettings;
 import de.tobias.playpad.pad.conntent.play.Durationable;
@@ -19,14 +22,16 @@ import de.tobias.playpad.pad.viewcontroller.IPadViewController;
 import de.tobias.playpad.project.Project;
 import de.tobias.playpad.settings.Profile;
 import de.tobias.playpad.settings.Warning;
+import de.tobias.playpad.view.ColorPickerView;
 import de.tobias.playpad.viewcontroller.main.IMainViewController;
 import de.tobias.utils.application.ApplicationUtils;
 import de.tobias.utils.application.container.PathType;
+import javafx.scene.Node;
 import javafx.scene.paint.Color;
 import javafx.stage.Stage;
 import javafx.util.Duration;
 
-public class ModernGlobalDesign extends Design implements GlobalDesign, DesignColorAssociator {
+public class ModernGlobalDesign extends Design implements GlobalDesign, DesignColorAssociator, IColorPickerView {
 
 	public static final String TYPE = "modern";
 
@@ -313,4 +318,10 @@ public class ModernGlobalDesign extends Design implements GlobalDesign, DesignCo
 	public Color getAssociatedStandardColor() {
 		return Color.web(backgroundColor.getColorHi());
 	}
+	
+	// Color View
+	@Override
+	public Node getColorInterface(Consumer<DisplayableColor> onSelection) {
+		return new ColorPickerView(null, ModernColor.values(), onSelection);
+	}
 }
diff --git a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopColorPickerView.java b/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopColorPickerView.java
new file mode 100644
index 00000000..aa00ed73
--- /dev/null
+++ b/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopColorPickerView.java
@@ -0,0 +1,42 @@
+package de.tobias.playpad.layout.desktop;
+
+import java.util.function.Consumer;
+
+import de.tobias.playpad.DisplayableColor;
+import de.tobias.playpad.design.IColorPickerView;
+import de.tobias.playpad.settings.Profile;
+import javafx.scene.Node;
+import javafx.scene.Scene;
+import javafx.scene.layout.VBox;
+import javafx.stage.Stage;
+
+public class DesktopColorPickerView implements Consumer<DisplayableColor> {
+
+	private Stage stage;
+
+	public DesktopColorPickerView(IColorPickerView baseView) {
+		Node node = baseView.getColorInterface(this);
+		VBox root = new VBox(node);
+
+		stage = new Stage();
+		stage.setScene(new Scene(root));
+		
+		// Init Stage
+		Profile.currentProfile().currentLayout().applyCss(stage);
+		stage.setResizable(false);
+	}
+	
+	public void show() {
+		stage.show();
+	}
+	
+	public void hide() {
+		stage.close();
+	}
+
+	// Handle Selected Color from View.
+	@Override
+	public void accept(DisplayableColor t) {
+		
+	}
+}
diff --git a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMainLayoutConnect.java b/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMainLayoutConnect.java
index 0d1c754d..30c0241a 100644
--- a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMainLayoutConnect.java
+++ b/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMainLayoutConnect.java
@@ -3,11 +3,14 @@ package de.tobias.playpad.layout.desktop;
 import java.util.Stack;
 
 import de.tobias.playpad.Strings;
+import de.tobias.playpad.layout.desktop.pad.DesktopPadView;
 import de.tobias.playpad.pad.view.IPadView;
 import de.tobias.playpad.view.main.MainLayoutConnect;
 import de.tobias.playpad.viewcontroller.main.IMainViewController;
 import de.tobias.playpad.viewcontroller.main.MenuToolbarViewController;
 import de.tobias.utils.util.Localization;
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
 
 /**
  * Desktop Implmentierung des Main Layouts.
@@ -21,7 +24,7 @@ public class DesktopMainLayoutConnect implements MainLayoutConnect {
 	private static final String TYPE = "Desktop";
 
 	private DesktopMenuToolbarViewController desktopMenuToolbarViewController;
-	private DesktopEditMode editMode = DesktopEditMode.PLAY;
+	private ObjectProperty<DesktopEditMode> editMode = new SimpleObjectProperty<>(DesktopEditMode.PLAY);
 
 	private Stack<IPadView> recyclingStack;
 
@@ -66,10 +69,14 @@ public class DesktopMainLayoutConnect implements MainLayoutConnect {
 	}
 
 	public DesktopEditMode getEditMode() {
-		return editMode;
+		return editMode.get();
 	}
 
 	public void setEditMode(DesktopEditMode editMode) {
-		this.editMode = editMode;
+		this.editMode.set(editMode);
+	}
+	
+	public ObjectProperty<DesktopEditMode> editModeProperty() {
+		return editMode;
 	}
 }
diff --git a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java b/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
index 34ee58d9..1ada3988 100644
--- a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
+++ b/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
@@ -15,6 +15,8 @@ import de.tobias.playpad.AppUserInfoStrings;
 import de.tobias.playpad.PlayPadMain;
 import de.tobias.playpad.PlayPadPlugin;
 import de.tobias.playpad.Strings;
+import de.tobias.playpad.design.GlobalDesign;
+import de.tobias.playpad.design.IColorPickerView;
 import de.tobias.playpad.midi.Midi;
 import de.tobias.playpad.pad.Pad;
 import de.tobias.playpad.pad.PadStatus;
@@ -56,6 +58,8 @@ import de.tobias.utils.util.Worker;
 import de.tobias.utils.util.net.FileUpload;
 import javafx.application.Platform;
 import javafx.beans.binding.Bindings;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
 import javafx.event.ActionEvent;
 import javafx.event.EventHandler;
 import javafx.fxml.FXML;
@@ -77,7 +81,8 @@ import javafx.scene.layout.HBox;
 import javafx.stage.Modality;
 import javafx.stage.Stage;
 
-public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewController implements EventHandler<ActionEvent> {
+public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewController
+		implements EventHandler<ActionEvent>, ChangeListener<DesktopEditMode> {
 
 	// meuBar
 	@FXML protected MenuBar menuBar;
@@ -107,11 +112,17 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 
 	@FXML protected Label liveLabel;
 
+	protected SegmentedButton editButtons;
+	protected ToggleButton playButton;
+	protected ToggleButton dragButton;
+	protected ToggleButton colorButton;
+
 	private IMainViewController mainViewController;
 
 	private transient ProjectSettingsViewController projectSettingsViewController;
 	private transient ProfileSettingsViewController profileSettingsViewController;
 	private transient GlobalSettingsViewController globalSettingsViewController;
+	private transient DesktopColorPickerView colorPickerView;
 
 	private DesktopMainLayoutConnect connect;
 
@@ -119,6 +130,10 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 		super("header", "de/tobias/playpad/assets/view/main/desktop/", PlayPadMain.getUiResourceBundle());
 		this.mainViewController = controller;
 		this.connect = connect;
+		this.connect.editModeProperty().addListener(this);
+
+		// Ist Zustand herstellen, indem Listener mit dem Initialen Wert bekannt gemacht wird.
+		changed(connect.editModeProperty(), null, connect.getEditMode());
 
 		initLayoutMenu();
 	}
@@ -137,30 +152,20 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 		helpMenu.getItems().add(new HelpMenuItem(helpMenu));
 
 		// Edit Mode Buttons
-		SegmentedButton editButtons = new SegmentedButton();
-		ToggleButton playButton = new ToggleButton("", new FontIcon(FontAwesomeType.HAND_ALT_LEFT));
+		editButtons = new SegmentedButton();
+		playButton = new ToggleButton("", new FontIcon(FontAwesomeType.PLAY));
 		playButton.setFocusTraversable(false);
-		ToggleButton dragButton = new ToggleButton("", new FontIcon(FontAwesomeType.ARROWS));
+		dragButton = new ToggleButton("", new FontIcon(FontAwesomeType.ARROWS));
 		dragButton.setFocusTraversable(false);
-		ToggleButton colorButton = new ToggleButton("", new FontIcon(FontAwesomeType.PENCIL));
+		colorButton = new ToggleButton("", new FontIcon(FontAwesomeType.PENCIL));
 		colorButton.setFocusTraversable(false);
 		editButtons.getButtons().addAll(playButton, dragButton, colorButton);
 		editButtons.getToggleGroup().selectedToggleProperty().addListener((a, b, c) ->
 		{
-			if (b == dragButton) {
-				for (IPadView view : mainViewController.getPadViews()) {
-					view.enableDragAndDropDesignMode(false);
-				}
-			}
-
 			if (c == playButton) {
 				connect.setEditMode(DesktopEditMode.PLAY);
 			} else if (c == dragButton) {
 				connect.setEditMode(DesktopEditMode.DRAG);
-				System.out.println("Drag");
-				for (IPadView view : mainViewController.getPadViews()) {
-					view.enableDragAndDropDesignMode(true);
-				}
 			} else if (c == colorButton) {
 				connect.setEditMode(DesktopEditMode.COLOR);
 			}
@@ -168,6 +173,40 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 		iconHbox.getChildren().add(editButtons);
 	}
 
+	// Desktop Edit Mode Change Listener --> Update Button
+	@Override
+	public void changed(ObservableValue<? extends DesktopEditMode> observable, DesktopEditMode oldValue, DesktopEditMode newValue) {
+		// handle old mode
+		if (oldValue == DesktopEditMode.DRAG) {
+			for (IPadView view : mainViewController.getPadViews()) {
+				view.enableDragAndDropDesignMode(false);
+			}
+		} else if (oldValue == DesktopEditMode.COLOR) {
+			if (colorPickerView != null) {
+				colorPickerView.hide();
+				colorPickerView = null;
+			}
+		}
+
+		// handle new mode
+		if (newValue == DesktopEditMode.PLAY) {
+			playButton.setSelected(true);
+		} else if (newValue == DesktopEditMode.DRAG) {
+			dragButton.setSelected(true);
+			for (IPadView view : mainViewController.getPadViews()) {
+				view.enableDragAndDropDesignMode(true);
+			}
+		} else if (newValue == DesktopEditMode.COLOR) {
+			colorButton.setSelected(true);
+
+			GlobalDesign design = Profile.currentProfile().currentLayout();
+			if (design instanceof IColorPickerView) {
+				colorPickerView = new DesktopColorPickerView((IColorPickerView) design);
+				colorPickerView.show();
+			}
+		}
+	}
+
 	private void initLayoutMenu() {
 		ProfileSettings profileSettings = Profile.currentProfile().getProfileSettings();
 		Registry<MainLayoutConnect> mainLayouts = PlayPadPlugin.getRegistryCollection().getMainLayouts();
diff --git a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopPadDragListener.java b/PlayWall/src/de/tobias/playpad/layout/desktop/pad/DesktopPadDragListener.java
similarity index 97%
rename from PlayWall/src/de/tobias/playpad/layout/desktop/DesktopPadDragListener.java
rename to PlayWall/src/de/tobias/playpad/layout/desktop/pad/DesktopPadDragListener.java
index de4d05aa..d7d6eb92 100644
--- a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopPadDragListener.java
+++ b/PlayWall/src/de/tobias/playpad/layout/desktop/pad/DesktopPadDragListener.java
@@ -1,4 +1,4 @@
-package de.tobias.playpad.layout.desktop;
+package de.tobias.playpad.layout.desktop.pad;
 
 import java.io.File;
 import java.io.IOException;
@@ -6,6 +6,8 @@ import java.util.Collection;
 import java.util.Set;
 
 import de.tobias.playpad.PlayPadPlugin;
+import de.tobias.playpad.layout.desktop.DesktopEditMode;
+import de.tobias.playpad.layout.desktop.DesktopMainLayoutConnect;
 import de.tobias.playpad.pad.Pad;
 import de.tobias.playpad.pad.PadContentRegistry;
 import de.tobias.playpad.pad.conntent.PadContent;
diff --git a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopPadView.java b/PlayWall/src/de/tobias/playpad/layout/desktop/pad/DesktopPadView.java
similarity index 99%
rename from PlayWall/src/de/tobias/playpad/layout/desktop/DesktopPadView.java
rename to PlayWall/src/de/tobias/playpad/layout/desktop/pad/DesktopPadView.java
index 70203abd..7902868b 100644
--- a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopPadView.java
+++ b/PlayWall/src/de/tobias/playpad/layout/desktop/pad/DesktopPadView.java
@@ -1,7 +1,8 @@
-package de.tobias.playpad.layout.desktop;
+package de.tobias.playpad.layout.desktop.pad;
 
 import de.tobias.playpad.PlayPadPlugin;
 import de.tobias.playpad.PseudoClasses;
+import de.tobias.playpad.layout.desktop.DesktopMainLayoutConnect;
 import de.tobias.playpad.pad.Pad;
 import de.tobias.playpad.pad.PadContentRegistry;
 import de.tobias.playpad.pad.conntent.PadContent;
diff --git a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopPadViewController.java b/PlayWall/src/de/tobias/playpad/layout/desktop/pad/DesktopPadViewController.java
similarity index 94%
rename from PlayWall/src/de/tobias/playpad/layout/desktop/DesktopPadViewController.java
rename to PlayWall/src/de/tobias/playpad/layout/desktop/pad/DesktopPadViewController.java
index f22e6f26..ff3de94a 100644
--- a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopPadViewController.java
+++ b/PlayWall/src/de/tobias/playpad/layout/desktop/pad/DesktopPadViewController.java
@@ -1,4 +1,4 @@
-package de.tobias.playpad.layout.desktop;
+package de.tobias.playpad.layout.desktop.pad;
 
 import java.io.File;
 import java.io.IOException;
@@ -7,6 +7,8 @@ import java.util.Set;
 
 import de.tobias.playpad.PlayPadPlugin;
 import de.tobias.playpad.Strings;
+import de.tobias.playpad.layout.desktop.DesktopEditMode;
+import de.tobias.playpad.layout.desktop.DesktopMainLayoutConnect;
 import de.tobias.playpad.pad.Pad;
 import de.tobias.playpad.pad.PadContentRegistry;
 import de.tobias.playpad.pad.PadStatus;
@@ -43,7 +45,6 @@ import javafx.util.Duration;
 
 public class DesktopPadViewController implements IPadViewController, EventHandler<ActionEvent> {
 
-	protected static final String CURRENT_PAGE_BUTTON = "current-page-button";
 	private static final String OPEN_FOLDER = "openFolder";
 	private static final String DURATION_FORMAT = "%d:%02d";
 
@@ -59,7 +60,7 @@ public class DesktopPadViewController implements IPadViewController, EventHandle
 	private DesktopPadDragListener padDragListener;
 
 	private DesktopMainLayoutConnect connect;
-	
+
 	public DesktopPadViewController(DesktopPadView padView, DesktopMainLayoutConnect connect) {
 		this.padView = padView;
 		this.connect = connect;
@@ -159,21 +160,23 @@ public class DesktopPadViewController implements IPadViewController, EventHandle
 
 	@Override
 	public void handle(ActionEvent event) {
-		if (event.getSource() == padView.getPlayButton()) {
-			onPlay();
-		} else if (event.getSource() == padView.getPauseButton()) {
-			onPause();
-		} else if (event.getSource() == padView.getStopButton()) {
-			onStop();
-		} else if (event.getSource() == padView.getNewButton()) {
-			try {
-				onNew(event);
-			} catch (NoSuchComponentException e) {
-				// TODO Error Handling
-				e.printStackTrace();
+		if (connect.getEditMode() == DesktopEditMode.PLAY) {
+			if (event.getSource() == padView.getPlayButton()) {
+				onPlay();
+			} else if (event.getSource() == padView.getPauseButton()) {
+				onPause();
+			} else if (event.getSource() == padView.getStopButton()) {
+				onStop();
+			} else if (event.getSource() == padView.getNewButton()) {
+				try {
+					onNew(event);
+				} catch (NoSuchComponentException e) {
+					// TODO Error Handling
+					e.printStackTrace();
+				}
+			} else if (event.getSource() == padView.getSettingsButton()) {
+				onSettings();
 			}
-		} else if (event.getSource() == padView.getSettingsButton()) {
-			onSettings();
 		}
 	}
 
@@ -271,7 +274,7 @@ public class DesktopPadViewController implements IPadViewController, EventHandle
 			}
 
 			Stage owner = mvc.getStage();
-			
+
 			PadSettingsViewController padSettingsViewController = new PadSettingsViewController(pad, owner);
 			padSettingsViewController.getStage().setOnHiding(ev ->
 			{
diff --git a/PlayWall/src/de/tobias/playpad/view/ColorView.java b/PlayWall/src/de/tobias/playpad/view/ColorPickerView.java
similarity index 65%
rename from PlayWall/src/de/tobias/playpad/view/ColorView.java
rename to PlayWall/src/de/tobias/playpad/view/ColorPickerView.java
index ff09b680..06718f47 100644
--- a/PlayWall/src/de/tobias/playpad/view/ColorView.java
+++ b/PlayWall/src/de/tobias/playpad/view/ColorPickerView.java
@@ -7,9 +7,11 @@ import javafx.geometry.Insets;
 import javafx.scene.layout.GridPane;
 import javafx.scene.shape.Rectangle;
 
-public class ColorView extends GridPane {
+public class ColorPickerView extends GridPane {
 
-	public ColorView(DisplayableColor startColor, DisplayableColor[] colors, Consumer<DisplayableColor> finish) {
+	private Rectangle currentSelected;
+	
+	public ColorPickerView(DisplayableColor startColor, DisplayableColor[] colors, Consumer<DisplayableColor> finish) {
 		double size = Math.sqrt(colors.length);
 		int iSize = (int) size;
 		if (size != iSize) {
@@ -39,7 +41,15 @@ public class ColorView extends GridPane {
 					}
 
 					// EventHandler
-					rectangle.setOnMouseReleased(event -> finish.accept(color));
+					rectangle.setOnMouseReleased(event ->
+					{
+						if (currentSelected != null) {
+							currentSelected.getStrokeDashArray().clear();
+						}
+						rectangle.getStrokeDashArray().addAll(3.0);
+						currentSelected = rectangle;
+						finish.accept(color);
+					});
 					add(rectangle, x, y);
 				}
 			}
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/design/ModernCartDesignViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/design/ModernCartDesignViewController.java
index fbda591a..99644a91 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/design/ModernCartDesignViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/design/ModernCartDesignViewController.java
@@ -10,7 +10,7 @@ import de.tobias.playpad.PlayPadMain;
 import de.tobias.playpad.design.CartDesign;
 import de.tobias.playpad.design.modern.ModernCartDesign;
 import de.tobias.playpad.design.modern.ModernColor;
-import de.tobias.playpad.view.ColorView;
+import de.tobias.playpad.view.ColorPickerView;
 import de.tobias.playpad.viewcontroller.CartDesignViewController;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
@@ -65,7 +65,7 @@ public class ModernCartDesignViewController extends CartDesignViewController {
 	}
 
 	private void colorChooser(Button anchorNode, ModernColor startColor, Consumer<ModernColor> onFinish) {
-		ColorView view = new ColorView(startColor, ModernColor.values(), (DisplayableColor t) ->
+		ColorPickerView view = new ColorPickerView(startColor, ModernColor.values(), (DisplayableColor t) ->
 		{
 			colorChooser.hide();
 
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/design/ModernGlobalDesignViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/design/ModernGlobalDesignViewController.java
index 19811e5c..d90331f5 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/design/ModernGlobalDesignViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/design/ModernGlobalDesignViewController.java
@@ -10,7 +10,7 @@ import de.tobias.playpad.PlayPadMain;
 import de.tobias.playpad.design.GlobalDesign;
 import de.tobias.playpad.design.modern.ModernColor;
 import de.tobias.playpad.design.modern.ModernGlobalDesign;
-import de.tobias.playpad.view.ColorView;
+import de.tobias.playpad.view.ColorPickerView;
 import de.tobias.playpad.viewcontroller.GlobalDesignViewController;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
@@ -94,7 +94,7 @@ public class ModernGlobalDesignViewController extends GlobalDesignViewController
 	}
 
 	private void colorChooser(Button anchorNode, ModernColor startColor, Consumer<ModernColor> onFinish) {
-		ColorView view = new ColorView(startColor, ModernColor.values(), (DisplayableColor t) ->
+		ColorPickerView view = new ColorPickerView(startColor, ModernColor.values(), (DisplayableColor t) ->
 		{
 			colorChooser.hide();
 
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewController.java
index ccbc3fe9..e7e59ff4 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewController.java
@@ -15,7 +15,7 @@ import de.tobias.playpad.action.mapper.listener.KeyboardHandler;
 import de.tobias.playpad.action.mapper.listener.MidiHandler;
 import de.tobias.playpad.design.GlobalDesign;
 import de.tobias.playpad.layout.desktop.DesktopMainLayoutConnect;
-import de.tobias.playpad.layout.desktop.DesktopPadDragListener;
+import de.tobias.playpad.layout.desktop.pad.DesktopPadDragListener;
 import de.tobias.playpad.midi.Midi;
 import de.tobias.playpad.midi.MidiListener;
 import de.tobias.playpad.pad.Pad;
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/feedback/DoubleFeedbackViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/feedback/DoubleFeedbackViewController.java
index 81b5e199..8a9fbce0 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/feedback/DoubleFeedbackViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/feedback/DoubleFeedbackViewController.java
@@ -11,7 +11,7 @@ import de.tobias.playpad.action.feedback.FeedbackMessage;
 import de.tobias.playpad.action.mapper.feedback.DoubleMidiFeedback;
 import de.tobias.playpad.action.mididevice.Device;
 import de.tobias.playpad.midi.Midi;
-import de.tobias.playpad.view.ColorView;
+import de.tobias.playpad.view.ColorPickerView;
 import de.tobias.utils.ui.ContentViewController;
 import de.tobias.utils.ui.icon.FontAwesomeType;
 import de.tobias.utils.ui.icon.FontIcon;
@@ -84,7 +84,7 @@ public class DoubleFeedbackViewController extends ContentViewController {
 					color = device.getColor(feedback.getValueForFeedbackMessage(FeedbackMessage.EVENT));
 				}
 				
-				ColorView colorView = new ColorView(color, device.getColors(), item ->
+				ColorPickerView colorView = new ColorPickerView(color, device.getColors(), item ->
 				{
 					colorChooser.hide();
 					if (item instanceof DisplayableFeedbackColor) {
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/feedback/SingleFeedbackViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/feedback/SingleFeedbackViewController.java
index 94cfd8b3..b29ff571 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/feedback/SingleFeedbackViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/feedback/SingleFeedbackViewController.java
@@ -11,7 +11,7 @@ import de.tobias.playpad.action.feedback.FeedbackMessage;
 import de.tobias.playpad.action.mapper.feedback.SingleMidiFeedback;
 import de.tobias.playpad.action.mididevice.Device;
 import de.tobias.playpad.midi.Midi;
-import de.tobias.playpad.view.ColorView;
+import de.tobias.playpad.view.ColorPickerView;
 import de.tobias.utils.ui.ContentViewController;
 import de.tobias.utils.ui.icon.FontAwesomeType;
 import de.tobias.utils.ui.icon.FontIcon;
@@ -65,7 +65,7 @@ public class SingleFeedbackViewController extends ContentViewController {
 			{
 				DisplayableFeedbackColor color = device.getColor(feedback.getValueForFeedbackMessage(FeedbackMessage.STANDARD));
 
-				ColorView colorView = new ColorView(color, device.getColors(), item ->
+				ColorPickerView colorView = new ColorPickerView(color, device.getColors(), item ->
 				{
 					colorChooser.hide();
 					if (item instanceof DisplayableFeedbackColor) {
diff --git a/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjustable.java b/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjustable.java
index 01df8244..5e03b647 100644
--- a/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjustable.java
+++ b/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjustable.java
@@ -2,10 +2,27 @@ package de.tobias.playpad.action.feedback;
 
 import de.tobias.playpad.pad.Pad;
 
+/**
+ * Eine Action implementiert dieses Interface, falls die Feedbackfarbe automatisch an die Farbe der Kachel angepasst werden soll.
+ * 
+ * @author tobias
+ * @since 5.0.0
+ *
+ */
 public interface ColorAdjustable {
 
+	/**
+	 * Ist dieses Feature ative.
+	 * 
+	 * @return <code>true</code> Active
+	 */
 	public boolean isAutoFeedbackColors();
-	
+
+	/**
+	 * Kachel, die mit dieser Action verkünpft ist.
+	 * 
+	 * @return Pad
+	 */
 	public Pad getPad();
-	
+
 }
diff --git a/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjuster.java b/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjuster.java
index 301578f1..79711822 100644
--- a/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjuster.java
+++ b/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjuster.java
@@ -75,13 +75,13 @@ public class ColorAdjuster {
 			}
 
 			if (layoutStdColor != null) {
-				DisplayableFeedbackColor associator = searchColor(colorAssociator, FeedbackMessage.STANDARD, layoutStdColor);
-				colorAssociator.setColor(FeedbackMessage.STANDARD, associator.mapperFeedbackValue());
+				DisplayableFeedbackColor matchedColor = searchColor(colorAssociator, FeedbackMessage.STANDARD, layoutStdColor);
+				colorAssociator.setColor(FeedbackMessage.STANDARD, matchedColor);
 			}
 
 			if (layoutEvColor != null) {
-				DisplayableFeedbackColor associator = searchColor(colorAssociator, FeedbackMessage.EVENT, layoutEvColor);
-				colorAssociator.setColor(FeedbackMessage.EVENT, associator.mapperFeedbackValue());
+				DisplayableFeedbackColor matchedColor = searchColor(colorAssociator, FeedbackMessage.EVENT, layoutEvColor);
+				colorAssociator.setColor(FeedbackMessage.EVENT, matchedColor);
 			}
 		}
 	}
diff --git a/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAssociator.java b/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAssociator.java
index abdda9d2..339f72a9 100644
--- a/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAssociator.java
+++ b/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAssociator.java
@@ -2,15 +2,51 @@ package de.tobias.playpad.action.feedback;
 
 import javafx.scene.paint.Color;
 
+/**
+ * Dieses Interface wird in einem Mapper implementiert. Dabei handelt er die Anfragen für das Mapping von Farben.
+ * 
+ * @author tobias
+ * @since 5.0.0
+ */
 public interface ColorAssociator {
 
+	/**
+	 * Gibt die Gerätefarben zurück. Dabei enthalten diese ein Int Value und ein Paint.
+	 * 
+	 * @return Liste an Farben
+	 */
 	public DisplayableFeedbackColor[] getColors();
 
+	/**
+	 * Standardfarbe, falls nichts passendes gefunden wurde.
+	 * 
+	 * @return Standardfarbe
+	 */
 	public DisplayableFeedbackColor getDefaultStandardColor();
 
+	/**
+	 * Eventfarbe, falls nichts passendes gefunden wurde.
+	 * 
+	 * @return Eventfarbe
+	 */
 	public DisplayableFeedbackColor getDefaultEventColor();
 
-	public void setColor(FeedbackMessage feedbackMessage, int value);
+	/**
+	 * Setzt die Feedback Farbe für die Instanz des Mappers.
+	 * 
+	 * @param feedbackMessage
+	 *            Art der Feedbacknachricht
+	 * @param color
+	 *            Matched Color
+	 */
+	public void setColor(FeedbackMessage feedbackMessage, DisplayableFeedbackColor color);
 
+	/**
+	 * Sucht zu einer {@link Color} die passende FeedbackColor, falls vorhanden.
+	 * 
+	 * @param color
+	 *            Kachel Farbe
+	 * @return Feedback Farbe oder null.
+	 */
 	public DisplayableFeedbackColor map(Color color);
 }
diff --git a/PlayWallCore/src/de/tobias/playpad/design/DesignColorAssociator.java b/PlayWallCore/src/de/tobias/playpad/design/DesignColorAssociator.java
index 1fc348f6..958a5e33 100644
--- a/PlayWallCore/src/de/tobias/playpad/design/DesignColorAssociator.java
+++ b/PlayWallCore/src/de/tobias/playpad/design/DesignColorAssociator.java
@@ -2,10 +2,27 @@ package de.tobias.playpad.design;
 
 import javafx.scene.paint.Color;
 
+/**
+ * Methoden für die Verwaltung der Farben, die an einer Kachel eingestellt sind. Das ist wichtig, falls Kachel eine andere Farbverwaltung
+ * verwendet (beispiel Lineare Gradient).
+ * 
+ * @author tobias
+ * @since 5.0.0
+ */
 public interface DesignColorAssociator {
 
+	/**
+	 * Gibt die Standardfarbe (Kacheln ohne Aktion) zurück.
+	 * 
+	 * @return Farbe der Kachel
+	 */
 	public Color getAssociatedStandardColor();
 
+	/**
+	 * Gibt die Eventfarbe (Kacheln mit Aktion) zurück.
+	 * 
+	 * @return Farbe der Kachel
+	 */
 	public Color getAssociatedEventColor();
 
 }
diff --git a/PlayWallCore/src/de/tobias/playpad/design/IColorPickerView.java b/PlayWallCore/src/de/tobias/playpad/design/IColorPickerView.java
new file mode 100644
index 00000000..cfeeae79
--- /dev/null
+++ b/PlayWallCore/src/de/tobias/playpad/design/IColorPickerView.java
@@ -0,0 +1,18 @@
+package de.tobias.playpad.design;
+
+import java.util.function.Consumer;
+
+import de.tobias.playpad.DisplayableColor;
+import javafx.scene.Node;
+
+/**
+ * Wenn vom Design unterstützt, wird hier die GUI für Farbeinstellungen erstellt.
+ * 
+ * @author tobias
+ *
+ */
+public interface IColorPickerView {
+
+	public Node getColorInterface(Consumer<DisplayableColor> onSelection);
+
+}
diff --git a/PlayWallNative/bin/de/tobias/playpad/NativeAudio$NativeAudioDelegate.class b/PlayWallNative/bin/de/tobias/playpad/NativeAudio$NativeAudioDelegate.class
new file mode 100644
index 0000000000000000000000000000000000000000..94add9016c45847affc7a8504c1f1c7098ba07d7
GIT binary patch
literal 322
zcmX^0Z`VEs1_l!bL3RcvMh3%_RQ;0tq|C%({eqmt%7VlceZRz#%(7I+(v-}66(qJx
zYEEi;Vo54H0}CUAKvrT|qJB<dUb?=2QdVkm2_pkXex6%qUS@FyBLj<ur)C%<19yI2
zKx$&PZ)!<u5hDYehNqhwNLVmGFCf1-vm`S=&p9J8FFiGdk%3ji(*-2Q6`WsMl$`38
znUl)MAb@1M9>_vQ1|HA6ywoD+oW$bd)M9o9entjaydGd=5JoZt<^?uJ21W*E1`uFo
rVPs%sU}FGzik*Q2Omi}DF)%PNF>r%P9tK_p1_mw$kRCn;0X9wmHiS`V

literal 0
HcmV?d00001

diff --git a/PlayWallNative/bin/de/tobias/playpad/NativeAudio.class b/PlayWallNative/bin/de/tobias/playpad/NativeAudio.class
new file mode 100644
index 0000000000000000000000000000000000000000..c5f0439f799d55d65ce9dee93b08243b9b005557
GIT binary patch
literal 1321
zcmX^0Z`VEs1_l!b8+HaJMh4lGRQ;0tq|C%({eqmt%7VlceZRz#%(7I+(v-}6b_Nzk
z27#=^vPAuy#JqHU|D>$c<Pt^(j+E4#)bzxXR7M74AG{{0AerU@)nv`cz-E(~msw)R
z$iS?j8OF%K;+&t7%EiFUz|F(J&cMOQ!0(fpm+DuVo0M7<l9-f}%E%z(lb@WJ6P8$%
z3F1QqSxPc8iy0Z@@w>sAk%0?jU1nlVW>qR90}IHfj0`Lqo*=tf3ld9<L88Sa`2~y&
z?8T`iKKURPtA=M3NC9VhYDrjrPH8Skk%p(H3nK$(F+zw{!_x(%j3p;OF@=#qOvBR$
z5n#b3MVWc&)|yd_4D2bH#Rd5wo4C_cOI%8e5=%1k^B5UGyny`TOeiluFCaBB+c&i&
zwTO{{O~cd8O*4#>fssL(hk=!WjhjK0L7kmJjgi5S<Y4DvP+(AGWMIlnVPs(RWMp8;
zNlhzZWMFh-WMD1IOwTA`WZ(@hNlec6O)P+huV8*2%xTUUiFxU%DIf<J@G$5xNHH>S
z6u_O$=)%ark)P+5nU`6d0a9bi!(hxH#K^#1oLT~lcSZ&?4g4{MHMM{Omn%5Gv?w{%
zEfbU!1d!5{9w@9C8F)PN@=}YOa}tY-Q;QiHgppLhY-dnpU}RusU|?Wm-~t6D0|SEq
z10yK8F)%W4GB7acGcYnRGB7Z(YHerW+Q`7bz{J4Az`(!;7G!4NWnf_70kc^d_!#&Z
z7#KMj1Q<BLv><~Jm==c8B2ZeCK@2P|&L9D%B^ji^v^0YZn3jdAlY`33gJ=d$P((o;
zmB_#XcC^qY2Bl*Re47}Qq?A>5GN`aHfLzE7b|D{Fg$x55gDis}gFM)!3ScoI1`P&H
z1`rTp&|=UAyIzPvhe4Zxi9wfvfq|KUQILTX6q``%!l2d(g015PS*N~}K_AmLB?dMI
zWd;ETRj_Sh3``6R41#dm1Q`q&j2IYUb_g(Vf>Hz24sQk~utNmEcJP4g*vVkRgyA6#
z1~vvw27U%@uoaM?7l2v;bv!=<CxaP-In-cdcm!@{Pyz)HBm%j>jx%6jVK788i4~d#
bm>4X;QEka!#lXP8#lXm*%D~8A&Bh4;I92(a

literal 0
HcmV?d00001

diff --git a/PlayWallNative/bin/de/tobias/playpad/NativeAudioMacHandler.class b/PlayWallNative/bin/de/tobias/playpad/NativeAudioMacHandler.class
new file mode 100644
index 0000000000000000000000000000000000000000..e65fdb615d0905222d4e5ac3e7e17bc396deaeb6
GIT binary patch
literal 5572
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

literal 0
HcmV?d00001

diff --git a/PlayWallNative/bin/de/tobias/playpad/NativeAudioMacHandlerConnect.class b/PlayWallNative/bin/de/tobias/playpad/NativeAudioMacHandlerConnect.class
new file mode 100644
index 0000000000000000000000000000000000000000..bd8edabc909d978389efd81ed7a6e477b245fdcd
GIT binary patch
literal 3366
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
JFidig1OUGNT2cT2

literal 0
HcmV?d00001

diff --git a/PlayWallNative/bin/de/tobias/playpad/NativeAudioTest.class b/PlayWallNative/bin/de/tobias/playpad/NativeAudioTest.class
new file mode 100644
index 0000000000000000000000000000000000000000..3228cfd18da92c2aab164674a4ea0aaf208e1cf8
GIT binary patch
literal 1146
zcmX^0Z`VEs1_l!bS9S&_Mh3-{RQ;0tq|C%({eqmt%7VlceZRz#%(7I+(v-~nkksN5
zb_Nzk27#=^vPAuy#JqHU|D>$c<Pt^(Hk-`6%o00B24)S-Fh&Lz=lqmZE(T@>P96qU
z1~x_pexJ;|RKL>Pq|~C2#H5^5Mg}3D{N%)(u*9NF5FaYYQj(Eb%*deZL(n1Cj0`Nf
ziJ5tf3}PD5J_rW|mlS2@rCV!;aWDunGDPc#7N-^!!#w4ZpIn-onpaY+A5fH^UX+-d
zo0(dany2pt@=tnZiGDy%Vr6(@P7a&_@xFdeW)g%24hX%J%ACw3E(T!+QFaCql<)|y
zEG|jS<zWzG5NBjy$;nSlVPp{1!0tXtMh1Iy_m$^?^c3qG7^@l?cvR-*sTvu$<rk?M
z8H8k{su~%Dr>177=B4Q678vW5Czf$BNHfT?GsrM9$l?t#kb~qvLFI|XDN&pZ!VC&L
z42ld&j10{Ar6r6Eq7Y@7`T7AxnRz9_B}J);xz-@tRCpLv8PpgVxYJWhTuO@)OEUBG
z7#UbJJT+ao7&I8P*cmh#8HB;{fvTH_L7PE`k%7GcWMB?hkBep)$VfdN27LwtMg|s8
znuC}X#>xNzDO?OD3});MrYNBtl2MeJn8L$g&S1gFz*?M>npyzT=LIs)iou4R!J3gl
z4(tYSBK6EGNi8ZWEhtG%aji&BEdaThhrt${F2T+TE=f$z4k=1ZPGw|ZNi0e)W@He?
zlBgIN7*iP;6d+-P(`0K#241j%zKI3UWX%<vUs{x$>Xr#g_##Lt36!PuKn`V4WME`q
z2K$+bff1Bv7#JDY85kJ!85kKD85kH?wYD>GY-C_yU}E56U|?Va3o<isGcYjlfZ41J
zJPf=H3=EtMd<^_h%@Y`y8JHLt7_@~1b}$Gr3rXx?kP6?#AkVymL3ta4I`a+&T@ePu
z9Sp|H|NrvQ-o{|L{QoBgMg}Pc1qNjXD+Xq;RZ0vTU<+9pI2d>sI2ptkxEQ1u_!txz
z_!(3f1Q;|Jc)-pOgIL92$6(LEz@Wmw!r;K*$iT?p#K6G7&cGz)!OmdCz{ubX_Ja!m
D^%oWx

literal 0
HcmV?d00001

diff --git a/PlayWallNative/bin/de_tobias_playpad_NativeAudio.h b/PlayWallNative/bin/de_tobias_playpad_NativeAudio.h
new file mode 100644
index 00000000..4bd71030
--- /dev/null
+++ b/PlayWallNative/bin/de_tobias_playpad_NativeAudio.h
@@ -0,0 +1,85 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class de_tobias_playpad_NativeAudio */
+
+#ifndef _Included_de_tobias_playpad_NativeAudio
+#define _Included_de_tobias_playpad_NativeAudio
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     de_tobias_playpad_NativeAudio
+ * Method:    play
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_de_tobias_playpad_NativeAudio_play
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     de_tobias_playpad_NativeAudio
+ * Method:    pause
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_de_tobias_playpad_NativeAudio_pause
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     de_tobias_playpad_NativeAudio
+ * Method:    stop
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_de_tobias_playpad_NativeAudio_stop
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     de_tobias_playpad_NativeAudio
+ * Method:    getVolume
+ * Signature: (I)D
+ */
+JNIEXPORT jdouble JNICALL Java_de_tobias_playpad_NativeAudio_getVolume
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     de_tobias_playpad_NativeAudio
+ * Method:    setVolume
+ * Signature: (ID)V
+ */
+JNIEXPORT void JNICALL Java_de_tobias_playpad_NativeAudio_setVolume
+  (JNIEnv *, jclass, jint, jdouble);
+
+/*
+ * Class:     de_tobias_playpad_NativeAudio
+ * Method:    load
+ * Signature: (ILjava/lang/String;)Z
+ */
+JNIEXPORT jboolean JNICALL Java_de_tobias_playpad_NativeAudio_load
+  (JNIEnv *, jclass, jint, jstring);
+
+/*
+ * Class:     de_tobias_playpad_NativeAudio
+ * Method:    dispose
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_de_tobias_playpad_NativeAudio_dispose
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     de_tobias_playpad_NativeAudio
+ * Method:    getDuration
+ * Signature: (I)D
+ */
+JNIEXPORT jdouble JNICALL Java_de_tobias_playpad_NativeAudio_getDuration
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     de_tobias_playpad_NativeAudio
+ * Method:    getPosition
+ * Signature: (I)D
+ */
+JNIEXPORT jdouble JNICALL Java_de_tobias_playpad_NativeAudio_getPosition
+  (JNIEnv *, jclass, jint);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
-- 
GitLab